« get me outta code hell

hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/data/composite/things/content/withSourceText.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/data/composite/things/content/withSourceText.js')
-rw-r--r--src/data/composite/things/content/withSourceText.js166
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),
       }),
     },
   ],