54 lines
1.5 KiB
TypeScript
54 lines
1.5 KiB
TypeScript
/**
|
|
* Internal dependencies
|
|
*/
|
|
|
|
import { create } from './create';
|
|
import { normaliseFormats } from './normalise-formats';
|
|
import { RichTextValue } from './types';
|
|
|
|
/**
|
|
* Insert a Rich Text value, an HTML string, or a plain text string, into a
|
|
* Rich Text value at the given `startIndex`. Any content between `startIndex`
|
|
* and `endIndex` will be removed. Indices are retrieved from the selection if
|
|
* none are provided.
|
|
*
|
|
* @param {RichTextValue} value Value to modify.
|
|
* @param {RichTextValue|string} valueToInsert Value to insert.
|
|
* @param {number} [startIndex] Start index.
|
|
* @param {number} [endIndex] End index.
|
|
*
|
|
* @return {RichTextValue} A new value with the value inserted.
|
|
*/
|
|
export function insert(
|
|
value: RichTextValue,
|
|
valueToInsert: RichTextValue|string,
|
|
startIndex: number = value.start || 0,
|
|
endIndex: number = value.end || 0,
|
|
) {
|
|
const { formats, replacements, text } = value;
|
|
|
|
if ( typeof valueToInsert === 'string' ) {
|
|
valueToInsert = create( { text: valueToInsert } );
|
|
}
|
|
|
|
const index = startIndex + valueToInsert.text.length;
|
|
|
|
return normaliseFormats( {
|
|
formats: formats
|
|
.slice( 0, startIndex )
|
|
.concat( valueToInsert.formats, formats.slice( endIndex ) ),
|
|
replacements: replacements
|
|
.slice( 0, startIndex )
|
|
.concat(
|
|
valueToInsert.replacements,
|
|
replacements.slice( endIndex )
|
|
),
|
|
text:
|
|
text.slice( 0, startIndex ) +
|
|
valueToInsert.text +
|
|
text.slice( endIndex ),
|
|
start: index,
|
|
end: index,
|
|
} );
|
|
}
|