@comunica/actor-function-factory-term-replace 4.0.2 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -5,6 +5,13 @@
5
5
  A [function factory](https://github.com/comunica/comunica/tree/master/packages/bus-function-factory) actor
6
6
  that constructs a [term function](https://github.com/comunica/comunica/tree/master/packages/bus-function-factory/lib/ActorFunctionFactory.ts)
7
7
  capable of evaluating the [Replace](https://www.w3.org/TR/sparql11-query/#func-replace) function.
8
+ The regex evaluation uses the JavaScript regex engine in 'unicode-mode'
9
+ thereby eliminating [Annex B](https://262.ecma-international.org/6.0/#sec-regular-expressions-patterns) behavior.
10
+ The `x` and `q` flag not present in the JS engine are implemented by preprocessing of the pattern,
11
+ following the implementation provided by [actor-function-factory-term-regex](https://github.com/comunica/comunica/tree/master/packages/actor-function-factory-term-regex).
12
+ As a result of using the JS regex engine, the bundle size of this package is small,
13
+ but some non-spec compliant edge cases are present.
14
+ Examples are the skipped tests in [op.replace-test.ts](https://github.com/comunica/comunica/blob/master/packages/actor-function-factory-term-replace/test/op.replace-test.ts).
8
15
 
9
16
  This module is part of the [Comunica framework](https://github.com/comunica/comunica),
10
17
  and should only be used by [developers that want to build their own query engine](https://comunica.dev/docs/modify/).
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TermFunctionReplace = void 0;
4
+ const actor_function_factory_term_regex_1 = require("@comunica/actor-function-factory-term-regex");
4
5
  const bus_function_factory_1 = require("@comunica/bus-function-factory");
5
6
  const utils_expression_evaluator_1 = require("@comunica/utils-expression-evaluator");
6
7
  /**
@@ -25,15 +26,20 @@ class TermFunctionReplace extends bus_function_factory_1.TermFunctionBase {
25
26
  .collect(),
26
27
  });
27
28
  }
28
- // TODO: Fix flags
29
29
  // https://www.w3.org/TR/xpath-functions/#func-replace
30
- static replace(arg, pattern, replacement, flags) {
31
- let reg = new RegExp(pattern, flags);
32
- if (!reg.global) {
33
- const flags_ = flags ?? '';
34
- reg = new RegExp(pattern, `${flags_}g`);
30
+ static replace(arg, pattern, replacement, flags = '') {
31
+ flags = actor_function_factory_term_regex_1.TermFunctionRegex.cleanFlags(flags);
32
+ if (flags.includes('x')) {
33
+ pattern = actor_function_factory_term_regex_1.TermFunctionRegex.flagX(pattern);
35
34
  }
36
- return arg.replace(reg, replacement);
35
+ if (flags.includes('q')) {
36
+ pattern = actor_function_factory_term_regex_1.TermFunctionRegex.flagQ(pattern);
37
+ }
38
+ else {
39
+ replacement = replacement.replaceAll('$0', () => '$&');
40
+ }
41
+ flags = `${flags.replaceAll(/[qx]/gu, '')}g`;
42
+ return arg.replaceAll(new RegExp(pattern, flags), replacement);
37
43
  }
38
44
  }
39
45
  exports.TermFunctionReplace = TermFunctionReplace;
@@ -1 +1 @@
1
- {"version":3,"file":"TermFunctionReplace.js","sourceRoot":"","sources":["TermFunctionReplace.ts"],"names":[],"mappings":";;;AAAA,yEAAkE;AAMlE,qFAM8C;AAE9C;;GAEG;AACH,MAAa,mBAAoB,SAAQ,uCAAgB;IACvD;QACE,KAAK,CAAC;YACJ,KAAK,EAAE,CAAE,CAAC,EAAE,CAAC,CAAE;YACf,QAAQ,EAAE,2CAAc,CAAC,OAAO;YAChC,SAAS,EAAE,IAAA,oCAAO,EAAC,2CAAc,CAAC,OAAO,CAAC;iBACvC,cAAc,CACb,CAAE,oCAAO,CAAC,UAAU,EAAE,oCAAO,CAAC,UAAU,EAAE,oCAAO,CAAC,UAAU,CAAE,EAC9D,GAAG,EAAE,CAAC,CAAC,GAAW,EAAE,OAAe,EAAE,WAAmB,EAAE,EAAE,CAC1D,IAAA,mCAAM,EAAC,mBAAmB,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CACjE;iBACA,GAAG,CACF,CAAE,oCAAO,CAAC,eAAe,EAAE,oCAAO,CAAC,UAAU,EAAE,oCAAO,CAAC,UAAU,CAAE,EACnE,GAAG,EAAE,CAAC,CAAC,CAAE,GAAG,EAAE,OAAO,EAAE,WAAW,CAAqD,EAAE,EAAE;gBACzF,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;gBACvG,OAAO,IAAA,uCAAU,EAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC1C,CAAC,CACF;iBACA,iBAAiB,CAChB,CAAE,oCAAO,CAAC,UAAU,EAAE,oCAAO,CAAC,UAAU,EAAE,oCAAO,CAAC,UAAU,EAAE,oCAAO,CAAC,UAAU,CAAE,EAClF,GAAG,EAAE,CAAC,CAAC,GAAW,EAAE,OAAe,EAAE,WAAmB,EAAE,KAAa,EAAE,EAAE,CACzE,IAAA,mCAAM,EAAC,mBAAmB,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,CACxE;iBACA,GAAG,CACF,CAAE,oCAAO,CAAC,eAAe,EAAE,oCAAO,CAAC,UAAU,EAAE,oCAAO,CAAC,UAAU,EAAE,oCAAO,CAAC,UAAU,CAAE,EACvF,GAAG,EAAE,CAAC,CAAC,CAAE,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,CACuB,EAAE,EAAE;gBAClE,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CACxC,GAAG,CAAC,UAAU,EACd,OAAO,CAAC,UAAU,EAClB,WAAW,CAAC,UAAU,EACtB,KAAK,CAAC,UAAU,CACjB,CAAC;gBACF,OAAO,IAAA,uCAAU,EAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC1C,CAAC,CACF;iBACA,OAAO,EAAE;SACb,CAAC,CAAC;IACL,CAAC;IAED,kBAAkB;IAClB,sDAAsD;IAC9C,MAAM,CAAC,OAAO,CAAC,GAAW,EAAE,OAAe,EAAE,WAAmB,EAAE,KAAc;QACtF,IAAI,GAAG,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE,CAAC;YAC3B,GAAG,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACvC,CAAC;CACF;AAlDD,kDAkDC","sourcesContent":["import { TermFunctionBase } from '@comunica/bus-function-factory';\nimport type {\n StringLiteral,\n\n LangStringLiteral,\n} from '@comunica/utils-expression-evaluator';\nimport {\n declare,\n langString,\n SparqlOperator,\n string,\n TypeURL,\n} from '@comunica/utils-expression-evaluator';\n\n/**\n * https://www.w3.org/TR/sparql11-query/#func-replace\n */\nexport class TermFunctionReplace extends TermFunctionBase {\n public constructor() {\n super({\n arity: [ 3, 4 ],\n operator: SparqlOperator.REPLACE,\n overloads: declare(SparqlOperator.REPLACE)\n .onTernaryTyped(\n [ TypeURL.XSD_STRING, TypeURL.XSD_STRING, TypeURL.XSD_STRING ],\n () => (arg: string, pattern: string, replacement: string) =>\n string(TermFunctionReplace.replace(arg, pattern, replacement)),\n )\n .set(\n [ TypeURL.RDF_LANG_STRING, TypeURL.XSD_STRING, TypeURL.XSD_STRING ],\n () => ([ arg, pattern, replacement ]: [LangStringLiteral, StringLiteral, StringLiteral]) => {\n const result = TermFunctionReplace.replace(arg.typedValue, pattern.typedValue, replacement.typedValue);\n return langString(result, arg.language);\n },\n )\n .onQuaternaryTyped(\n [ TypeURL.XSD_STRING, TypeURL.XSD_STRING, TypeURL.XSD_STRING, TypeURL.XSD_STRING ],\n () => (arg: string, pattern: string, replacement: string, flags: string) =>\n string(TermFunctionReplace.replace(arg, pattern, replacement, flags)),\n )\n .set(\n [ TypeURL.RDF_LANG_STRING, TypeURL.XSD_STRING, TypeURL.XSD_STRING, TypeURL.XSD_STRING ],\n () => ([ arg, pattern, replacement, flags ]:\n [LangStringLiteral, StringLiteral, StringLiteral, StringLiteral]) => {\n const result = TermFunctionReplace.replace(\n arg.typedValue,\n pattern.typedValue,\n replacement.typedValue,\n flags.typedValue,\n );\n return langString(result, arg.language);\n },\n )\n .collect(),\n });\n }\n\n // TODO: Fix flags\n // https://www.w3.org/TR/xpath-functions/#func-replace\n private static replace(arg: string, pattern: string, replacement: string, flags?: string): string {\n let reg = new RegExp(pattern, flags);\n if (!reg.global) {\n const flags_ = flags ?? '';\n reg = new RegExp(pattern, `${flags_}g`);\n }\n return arg.replace(reg, replacement);\n }\n}\n"]}
1
+ {"version":3,"file":"TermFunctionReplace.js","sourceRoot":"","sources":["TermFunctionReplace.ts"],"names":[],"mappings":"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","sourcesContent":["import { TermFunctionRegex } from '@comunica/actor-function-factory-term-regex';\nimport { TermFunctionBase } from '@comunica/bus-function-factory';\nimport type {\n StringLiteral,\n\n LangStringLiteral,\n} from '@comunica/utils-expression-evaluator';\nimport {\n declare,\n langString,\n SparqlOperator,\n string,\n TypeURL,\n} from '@comunica/utils-expression-evaluator';\n\n/**\n * https://www.w3.org/TR/sparql11-query/#func-replace\n */\nexport class TermFunctionReplace extends TermFunctionBase {\n public constructor() {\n super({\n arity: [ 3, 4 ],\n operator: SparqlOperator.REPLACE,\n overloads: declare(SparqlOperator.REPLACE)\n .onTernaryTyped(\n [ TypeURL.XSD_STRING, TypeURL.XSD_STRING, TypeURL.XSD_STRING ],\n () => (arg: string, pattern: string, replacement: string) =>\n string(TermFunctionReplace.replace(arg, pattern, replacement)),\n )\n .set(\n [ TypeURL.RDF_LANG_STRING, TypeURL.XSD_STRING, TypeURL.XSD_STRING ],\n () => ([ arg, pattern, replacement ]: [LangStringLiteral, StringLiteral, StringLiteral]) => {\n const result = TermFunctionReplace.replace(arg.typedValue, pattern.typedValue, replacement.typedValue);\n return langString(result, arg.language);\n },\n )\n .onQuaternaryTyped(\n [ TypeURL.XSD_STRING, TypeURL.XSD_STRING, TypeURL.XSD_STRING, TypeURL.XSD_STRING ],\n () => (arg: string, pattern: string, replacement: string, flags: string) =>\n string(TermFunctionReplace.replace(arg, pattern, replacement, flags)),\n )\n .set(\n [ TypeURL.RDF_LANG_STRING, TypeURL.XSD_STRING, TypeURL.XSD_STRING, TypeURL.XSD_STRING ],\n () => ([ arg, pattern, replacement, flags ]:\n [LangStringLiteral, StringLiteral, StringLiteral, StringLiteral]) => {\n const result = TermFunctionReplace.replace(\n arg.typedValue,\n pattern.typedValue,\n replacement.typedValue,\n flags.typedValue,\n );\n return langString(result, arg.language);\n },\n )\n .collect(),\n });\n }\n\n // https://www.w3.org/TR/xpath-functions/#func-replace\n private static replace(arg: string, pattern: string, replacement: string, flags = ''): string {\n flags = TermFunctionRegex.cleanFlags(flags);\n if (flags.includes('x')) {\n pattern = TermFunctionRegex.flagX(pattern);\n }\n if (flags.includes('q')) {\n pattern = TermFunctionRegex.flagQ(pattern);\n } else {\n replacement = replacement.replaceAll('$0', () => '$&');\n }\n flags = `${flags.replaceAll(/[qx]/gu, '')}g`;\n return arg.replaceAll(new RegExp(pattern, flags), replacement);\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@comunica/actor-function-factory-term-replace",
3
- "version": "4.0.2",
3
+ "version": "4.1.0",
4
4
  "description": "A term-replace function-factory actor",
5
5
  "lsd:module": true,
6
6
  "license": "MIT",
@@ -37,8 +37,9 @@
37
37
  "build:components": "componentsjs-generator"
38
38
  },
39
39
  "dependencies": {
40
- "@comunica/bus-function-factory": "^4.0.2",
41
- "@comunica/utils-expression-evaluator": "^4.0.2"
40
+ "@comunica/actor-function-factory-term-regex": "^4.1.0",
41
+ "@comunica/bus-function-factory": "^4.1.0",
42
+ "@comunica/utils-expression-evaluator": "^4.1.0"
42
43
  },
43
- "gitHead": "b60deab76821557f8d027208ab743d3c66fc60ea"
44
+ "gitHead": "711446473d18f5fd47aa1a67e6c23582234221ec"
44
45
  }