UNPKG

@20minutes/draft-convert

Version:

Extensibly serialize & deserialize Draft.js ContentState

65 lines (64 loc) 2.9 kB
import getElementHTML from './util/getElementHTML.mjs'; import getElementTagLength from './util/getElementTagLength.mjs'; import rangeSort from './util/rangeSort.mjs'; import updateMutation from './util/updateMutation.mjs'; const converter = (_entity = {}, originalText = '')=>originalText; export default ((block, entityMap, entityConverter = converter)=>{ let resultText = [ ...block.text ]; let getEntityHTML = entityConverter; if (entityConverter.__isMiddleware) { getEntityHTML = entityConverter(converter); } if (Object.hasOwn(block, 'entityRanges') && block.entityRanges.length > 0) { let entities = block.entityRanges.sort(rangeSort); let styles = block.inlineStyleRanges; for(let index = 0; index < entities.length; index += 1){ const entityRange = entities[index]; const entity = entityMap[entityRange.key]; const originalText = resultText.slice(entityRange.offset, entityRange.offset + entityRange.length).join(''); const entityHTML = getEntityHTML(entity, originalText); const elementHTML = getElementHTML(entityHTML, originalText); let converted; if (elementHTML || elementHTML === '') { converted = [ ...elementHTML ]; } else { converted = originalText; } const prefixLength = getElementTagLength(entityHTML, 'start'); const suffixLength = getElementTagLength(entityHTML, 'end'); const updateLaterMutation = (mutation, mutationIndex)=>{ if (mutationIndex > index || Object.hasOwn(mutation, 'style')) { return updateMutation(mutation, entityRange.offset, entityRange.length, converted.length, prefixLength, suffixLength); } return mutation; }; const updateLaterMutations = (mutationList)=>mutationList.reduce((acc, mutation, mutationIndex)=>{ const updatedMutation = updateLaterMutation(mutation, mutationIndex); if (Array.isArray(updatedMutation)) { return acc.concat(updatedMutation); } return acc.concat([ updatedMutation ]); }, []); entities = updateLaterMutations(entities); styles = updateLaterMutations(styles); resultText = [ ...resultText.slice(0, entityRange.offset), ...converted, ...resultText.slice(entityRange.offset + entityRange.length) ]; } return { ...block, text: resultText.join(''), inlineStyleRanges: styles, entityRanges: entities }; } return block; });