diff --git a/experiments/text-nodes-dispatch.mjs b/experiments/text-nodes-dispatch.mjs index f5ba849..da6ce67 100644 --- a/experiments/text-nodes-dispatch.mjs +++ b/experiments/text-nodes-dispatch.mjs @@ -3,6 +3,9 @@ import * as CF from '@efforting.tech/data/field-configuration-factories'; import { inspect } from 'node:util'; import { Text_Tree_Node, Text_Tree_Settings } from '@efforting.tech/text/basic-tree'; import { RegExp_Resolver } from '@efforting.tech/rule-processing/resolvers'; +import { parse_csv } from '@efforting.tech/data/string-utilities'; + + @@ -26,11 +29,11 @@ const root = Text_Tree_Node.from_string(ts, example_string); const d = new RegExp_Resolver([ [/^animals:\s*(.*)$/, (c) => console.log("ANIMAL", c)], - [/^trees:\s*(.*)$/, () => console.log("TREE")], + [/^trees:\s*(.*)$/, ({node, predicate_result}) => console.log(`TREE of node at line ${node.line_no}:`, parse_csv(predicate_result[1]))], ]); for (const child of root.children) { if (child.has_line) { - console.log(child.line, d.resolve(child.line)); + console.log(child.line, d.resolve(child.line, { node: child })); } } diff --git a/source/data/string-utilities.mjs b/source/data/string-utilities.mjs index f424585..9c59717 100644 --- a/source/data/string-utilities.mjs +++ b/source/data/string-utilities.mjs @@ -20,6 +20,11 @@ export function string_has_contents(str) { return /\S/.test(str); } +export function parse_csv(str) { + // NOTE: This is for simple comma separated values, a future RFC-4180 compatible version would have to be in a different module in this library (or be a third party thing) + return str.split(',').map(element => element.trim()); +} + export function *indented_line_iterator(settings, text) { let line_no = settings.first_line; diff --git a/source/rule-processing/resolvers.mjs b/source/rule-processing/resolvers.mjs index 2d9addd..c098757 100644 --- a/source/rule-processing/resolvers.mjs +++ b/source/rule-processing/resolvers.mjs @@ -1,13 +1,13 @@ import { Item_Unresolvable } from '@efforting.tech/errors'; export class Abstract_Resolver { - resolve(item) { + resolve(item, extra_info={}) { const result = this.resolve_handler(item); if (!result?.handler) { throw new Item_Unresolvable({ resolver: this, item }); } // TO DOC: Spreading result into the resulting context means there are some reserved keys we need to be mindful of to avoid clobbering them - return result.handler({ resolver: this, item, ...result }); + return result.handler({ resolver: this, item, ...extra_info, ...result }); } } @@ -39,7 +39,8 @@ export class Predicate_Resolver extends Abstract_Resolver { const { rules } = this; for (const [predicate, handler] of rules) { const predicate_result = predicate(item); - if (predicate_result !== undefined) { + // NOTE: to return a falsy predicate_result as a positive hit you must wrap it in something + if (predicate_result) { return { handler, predicate_result }; } } @@ -50,13 +51,9 @@ export class RegExp_Resolver extends Predicate_Resolver { constructor(rules=[]) { // NOTE: Rules should be iterable as [predicate, handler] pairs super(); - Object.assign(this, { rules: rules.map(([pattern, handler]) => { - - const wrapped_handler = handler; //TODO - const predicate = ((str) => str.match(pattern)); - - return [predicate, wrapped_handler]; - })}); + Object.assign(this, { + rules: rules.map(([pattern, handler]) => [(str) => str.match(pattern), handler]) + }); }