101 lines
2.7 KiB
TypeScript
101 lines
2.7 KiB
TypeScript
/**
|
|
* External dependencies
|
|
*/
|
|
import { autop } from '@wordpress/autop';
|
|
|
|
/**
|
|
* Remove HTML tags from a string.
|
|
*
|
|
* @param {string} htmlString String to remove tags from.
|
|
* @return {string} Plain text string.
|
|
*/
|
|
export const removeTags = ( htmlString: string ) => {
|
|
const tagsRegExp = /<\/?[a-z][^>]*?>/gi;
|
|
return htmlString.replace( tagsRegExp, '' );
|
|
};
|
|
|
|
/**
|
|
* Remove trailing punctuation and append some characters to a string.
|
|
*
|
|
* @param {string} text Text to append to.
|
|
* @param {string} moreText Text to append.
|
|
* @return {string} String with appended characters.
|
|
*/
|
|
export const appendMoreText = ( text: string, moreText: string ) => {
|
|
return text.replace( /[\s|\.\,]+$/i, '' ) + moreText;
|
|
};
|
|
|
|
/**
|
|
* Limit words in string and returned trimmed version.
|
|
*
|
|
* @param {string} text Text to trim.
|
|
* @param {number} maxLength Number of countType to limit to.
|
|
* @param {string} moreText Appended to the trimmed string.
|
|
* @param {string} useAutop Whether to format with autop before returning.
|
|
* @return {string} Trimmed string.
|
|
*/
|
|
export const trimWords = (
|
|
text: string,
|
|
maxLength: number,
|
|
moreText = '…',
|
|
useAutop = true
|
|
) => {
|
|
const textToTrim = removeTags( text );
|
|
const trimmedText = textToTrim
|
|
.split( ' ' )
|
|
.splice( 0, maxLength )
|
|
.join( ' ' );
|
|
|
|
if ( trimmedText === textToTrim ) {
|
|
return useAutop ? autop( textToTrim ) : textToTrim;
|
|
}
|
|
|
|
if ( ! useAutop ) {
|
|
return appendMoreText( trimmedText, moreText );
|
|
}
|
|
|
|
return autop( appendMoreText( trimmedText, moreText ) );
|
|
};
|
|
|
|
/**
|
|
* Limit characters in string and returned trimmed version.
|
|
*
|
|
* @param {string} text Text to trim.
|
|
* @param {number} maxLength Number of countType to limit to.
|
|
* @param {boolean} includeSpaces Should spaces be included in the count.
|
|
* @param {string} moreText Appended to the trimmed string.
|
|
* @param {string} useAutop Whether to format with autop before returning.
|
|
* @return {string} Trimmed string.
|
|
*/
|
|
export const trimCharacters = (
|
|
text: string,
|
|
maxLength: number,
|
|
includeSpaces = true,
|
|
moreText = '…',
|
|
useAutop = true
|
|
) => {
|
|
const textToTrim = removeTags( text );
|
|
const trimmedText = textToTrim.slice( 0, maxLength );
|
|
|
|
if ( trimmedText === textToTrim ) {
|
|
return useAutop ? autop( textToTrim ) : textToTrim;
|
|
}
|
|
|
|
if ( includeSpaces ) {
|
|
return autop( appendMoreText( trimmedText, moreText ) );
|
|
}
|
|
|
|
const matchSpaces = trimmedText.match( /([\s]+)/g );
|
|
const spaceCount = matchSpaces ? matchSpaces.length : 0;
|
|
const trimmedTextExcludingSpaces = textToTrim.slice(
|
|
0,
|
|
maxLength + spaceCount
|
|
);
|
|
|
|
if ( ! useAutop ) {
|
|
return appendMoreText( trimmedTextExcludingSpaces, moreText );
|
|
}
|
|
|
|
return autop( appendMoreText( trimmedTextExcludingSpaces, moreText ) );
|
|
};
|