diff options
Diffstat (limited to 'src/data/composite/things/content/withSourceText.js')
-rw-r--r-- | src/data/composite/things/content/withSourceText.js | 166 |
1 files changed, 18 insertions, 148 deletions
diff --git a/src/data/composite/things/content/withSourceText.js b/src/data/composite/things/content/withSourceText.js index 7f03f97d..487b3763 100644 --- a/src/data/composite/things/content/withSourceText.js +++ b/src/data/composite/things/content/withSourceText.js @@ -3,67 +3,7 @@ import {parseInput} from '#replacer'; import {raiseOutputWithoutDependency} from '#composite/control-flow'; -import { - withLengthOfList, - withMappedList, - withNearbyItemFromList, - withPropertyFromObject, -} from '#composite/data'; - -function* splitTextNodeAroundCommas(node) { - let textNode = { - i: node.i, - iEnd: null, - type: 'text', - data: '', - }; - - let parseFrom = 0; - for (const match of node.data.matchAll(/, */g)) { - const {index} = match, [{length}] = match; - - textNode.data += node.data.slice(parseFrom, index); - - if (textNode.data) { - textNode.iEnd = textNode.i + textNode.data.length; - yield textNode; - - textNode = { - i: node.i + index + length, - iEnd: null, - type: 'text', - data: '', - }; - } - - yield { - i: node.i + index, - iEnd: node.i + index + length, - type: 'comma-separator', - }; - - parseFrom = index + length; - } - - if (parseFrom !== node.data.length) { - textNode.data += node.data.slice(parseFrom); - textNode.iEnd = node.iEnd; - } - - if (textNode.data) { - yield textNode; - } -} - -function* splitTextNodesAroundCommas(nodes) { - for (const node of nodes) { - if (node.type === 'text' && node.data.includes(',')) { - yield* splitTextNodeAroundCommas(node); - } else { - yield node; - } - } -} +import withAnnotationParts from './withAnnotationParts.js'; export default templateCompositeFrom({ annotation: `withSourceText`, @@ -71,112 +11,42 @@ export default templateCompositeFrom({ outputs: ['#sourceText'], steps: () => [ - raiseOutputWithoutDependency({ - dependency: 'annotation', - output: input.value({'#sourceText': null}), + withAnnotationParts({ + mode: input.value('nodes'), }), - // Get the list of notes including custom comma-separator nodes, - // and do some basic processing to make details about this list - // available later. - - { - dependencies: ['annotation'], - compute: (continuation, { - ['annotation']: annotation, - }) => continuation({ - ['#nodes']: - Array.from( - splitTextNodesAroundCommas( - parseInput(annotation))), - }), - }, - - withLengthOfList({ - list: '#nodes', - }), - - withMappedList({ - list: '#nodes', - map: input.value(node => node.type === 'comma-separator'), - }).outputs({ - '#mappedList': '#commaSeparatorFilter', - }), - - // Identify the first and last nodes in the range running from - // the first external link, up til (not including) the following - // comma separator. - - { - dependencies: ['#nodes'], - compute: (continuation, { - ['#nodes']: nodes, - }) => continuation({ - ['#firstExternalLink']: - nodes.find(node => node.type === 'external-link'), - }), - }, - raiseOutputWithoutDependency({ - dependency: '#firstExternalLink', + dependency: '#annotationParts', output: input.value({'#sourceText': null}), }), - withNearbyItemFromList({ - item: '#firstExternalLink', - list: '#nodes', - offset: input.value(+1), - - filter: '#commaSeparatorFilter', - }).outputs({ - '#nearbyItem': '#nextCommaSeparator', - }), - { - dependencies: [ - '#firstExternalLink', - '#nextCommaSeparator', - '#nodes', - ], - + dependencies: ['#annotationParts'], compute: (continuation, { - ['#firstExternalLink']: firstExternalLink, - ['#nextCommaSeparator']: nextCommaSeparator, - ['#nodes']: nodes, + ['#annotationParts']: annotationParts, }) => continuation({ - ['#lastNodeInRange']: - (nextCommaSeparator - ? nodes.at(nodes.indexOf(nextCommaSeparator) - 1) - : nodes.at(-1)), + ['#firstPartWithExternalLink']: + annotationParts + .find(nodes => nodes + .some(node => node.type === 'external-link')), }), }, - // Extract the content text covered by that range. - - withPropertyFromObject({ - object: '#firstExternalLink', - property: input.value('i'), - }), - - withPropertyFromObject({ - object: '#lastNodeInRange', - property: input.value('iEnd'), + raiseOutputWithoutDependency({ + dependency: '#firstPartWithExternalLink', + output: input.value({'#sourceText': null}), }), { - dependencies: [ - '#firstExternalLink.i', - '#lastNodeInRange.iEnd', - 'annotation', - ], - + dependencies: ['annotation', '#firstPartWithExternalLink'], compute: (continuation, { - ['#firstExternalLink.i']: i, - ['#lastNodeInRange.iEnd']: iEnd, ['annotation']: annotation, + ['#firstPartWithExternalLink']: nodes, }) => continuation({ ['#sourceText']: - annotation.slice(i, iEnd), + annotation.slice( + nodes.at(0).i, + nodes.at(-1).iEnd), }), }, ], |