securemark 0.246.0 → 0.247.2

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/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.247.2
4
+
5
+ - Fix math parser.
6
+
7
+ ## 0.247.1
8
+
9
+ - Fix math parser.
10
+
11
+ ## 0.247.0
12
+
13
+ - Refine math parser.
14
+
3
15
  ## 0.246.0
4
16
 
5
17
  - Extend table syntax to add grid type.
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- /*! securemark v0.246.0 https://github.com/falsandtru/securemark | (c) 2017, falsandtru | UNLICENSED License */
1
+ /*! securemark v0.247.2 https://github.com/falsandtru/securemark | (c) 2017, falsandtru | UNLICENSED License */
2
2
  (function webpackUniversalModuleDefinition(root, factory) {
3
3
  if(typeof exports === 'object' && typeof module === 'object')
4
4
  module.exports = factory(require("DOMPurify"), require("Prism"));
@@ -8,7 +8,7 @@
8
8
  exports["securemark"] = factory(require("DOMPurify"), require("Prism"));
9
9
  else
10
10
  root["securemark"] = factory(root["DOMPurify"], root["Prism"]);
11
- })(globalThis, (__WEBPACK_EXTERNAL_MODULE__6231__, __WEBPACK_EXTERNAL_MODULE__9450__) => {
11
+ })(this, (__WEBPACK_EXTERNAL_MODULE__6231__, __WEBPACK_EXTERNAL_MODULE__9450__) => {
12
12
  return /******/ (() => { // webpackBootstrap
13
13
  /******/ var __webpack_modules__ = ({
14
14
 
@@ -5256,6 +5256,8 @@ const template_1 = __webpack_require__(4695);
5256
5256
 
5257
5257
  const comment_1 = __webpack_require__(8657);
5258
5258
 
5259
+ const math_1 = __webpack_require__(8946);
5260
+
5259
5261
  const extension_1 = __webpack_require__(8053);
5260
5262
 
5261
5263
  const ruby_1 = __webpack_require__(6705);
@@ -5278,8 +5280,6 @@ const strong_1 = __webpack_require__(8072);
5278
5280
 
5279
5281
  const code_1 = __webpack_require__(5771);
5280
5282
 
5281
- const math_1 = __webpack_require__(8946);
5282
-
5283
5283
  const media_1 = __webpack_require__(1303);
5284
5284
 
5285
5285
  const htmlentity_1 = __webpack_require__(1562);
@@ -5292,7 +5292,7 @@ const bracket_1 = __webpack_require__(5196);
5292
5292
 
5293
5293
  const source_1 = __webpack_require__(6743);
5294
5294
 
5295
- exports.inline = (0, combinator_1.union)([escape_1.escape, annotation_1.annotation, reference_1.reference, template_1.template, comment_1.comment, extension_1.extension, ruby_1.ruby, link_1.link, media_1.media, html_1.html, insertion_1.insertion, deletion_1.deletion, mark_1.mark, emstrong_1.emstrong, strong_1.strong, emphasis_1.emphasis, code_1.code, math_1.math, htmlentity_1.htmlentity, shortmedia_1.shortmedia, autolink_1.autolink, bracket_1.bracket, source_1.text]);
5295
+ exports.inline = (0, combinator_1.union)([escape_1.escape, annotation_1.annotation, reference_1.reference, template_1.template, comment_1.comment, math_1.math, extension_1.extension, ruby_1.ruby, link_1.link, media_1.media, html_1.html, insertion_1.insertion, deletion_1.deletion, mark_1.mark, emstrong_1.emstrong, strong_1.strong, emphasis_1.emphasis, code_1.code, htmlentity_1.htmlentity, shortmedia_1.shortmedia, autolink_1.autolink, bracket_1.bracket, source_1.text]);
5296
5296
 
5297
5297
  var indexee_1 = __webpack_require__(1269);
5298
5298
 
@@ -6544,18 +6544,13 @@ const source_1 = __webpack_require__(6743);
6544
6544
 
6545
6545
  const dom_1 = __webpack_require__(3252);
6546
6546
 
6547
- const disallowedCommand = /\\(?:begin|tiny|huge|large)(?![0-9a-z])/i;
6548
- exports.math = (0, combinator_1.lazy)(() => (0, combinator_1.creator)((0, combinator_1.validate)('$', (0, combinator_1.rewrite)((0, combinator_1.union)([(0, combinator_1.surround)('$', // Latex's reserved characters: # $ % ^ & _ { } ~ \
6549
- // $[0-9]+ : Dollar
6550
- // $[A-z]*- : Label
6551
- // $[A-z]*(?!-) : Math
6552
- // $[\^_[({|] : Math
6553
- // $[#$%&] : Invalid first character in Latex syntax
6554
- (0, source_1.str)(/^(?![\s{}#$%&]|\d+(?:[,.]\d+)*[^-+*/=<>^_~\\$]|-[\da-z]|[a-z]+-)(?:\\\$|\x20(?!\$)|[\x21-\x23\x25-\x7E])+/i), /^\$(?![0-9a-z])/i), (0, combinator_1.surround)('$', bracket, '$')]), (source, {
6547
+ const syntax = /^(?:[ "([](?!\$)|\\{(?!\$)|\\[\\}$]?|^`|`(?!`)|[!#%&')\x2A-\x5A\]^_\x61-\x7A|~])+/;
6548
+ const forbiddenCommand = /\\(?:begin|tiny|huge|large)(?![a-z])/i;
6549
+ exports.math = (0, combinator_1.lazy)(() => (0, combinator_1.creator)((0, combinator_1.validate)('$', (0, combinator_1.rewrite)((0, combinator_1.union)([(0, combinator_1.surround)('$', bracket, '$'), (0, combinator_1.surround)(/^\$(?![\s{}])/, (0, combinator_1.some)((0, combinator_1.union)([bracket, quote, (0, source_1.str)(syntax)])), /^\$(?![0-9A-Za-z])/)]), (source, {
6555
6550
  caches: {
6556
6551
  math: cache
6557
6552
  } = {}
6558
- }) => [[cache?.get(source)?.cloneNode(true) || (0, dom_1.html)('span', !disallowedCommand.test(source) ? {
6553
+ }) => [[cache?.get(source)?.cloneNode(true) || (0, dom_1.html)('span', !forbiddenCommand.test(source) ? {
6559
6554
  class: 'math',
6560
6555
  translate: 'no',
6561
6556
  'data-src': source
@@ -6564,9 +6559,10 @@ exports.math = (0, combinator_1.lazy)(() => (0, combinator_1.creator)((0, combin
6564
6559
  translate: 'no',
6565
6560
  'data-invalid-syntax': 'math',
6566
6561
  'data-invalid-type': 'content',
6567
- 'data-invalid-message': `"${source.match(disallowedCommand)[0]}" command is disallowed`
6562
+ 'data-invalid-message': `"${source.match(forbiddenCommand)[0]}" command is forbidden`
6568
6563
  }, source)], '']))));
6569
- const bracket = (0, combinator_1.lazy)(() => (0, combinator_1.creator)((0, combinator_1.surround)('{', (0, combinator_1.some)((0, combinator_1.union)([bracket, (0, combinator_1.some)(source_1.escsource, /^(?:[{}]|\\?\n)/)])), '}', true)));
6564
+ const bracket = (0, combinator_1.lazy)(() => (0, combinator_1.creator)((0, combinator_1.surround)('{', (0, combinator_1.some)((0, combinator_1.union)([bracket, (0, combinator_1.some)(source_1.escsource, /^(?:[{}$]|\\?\n)/)])), '}', true)));
6565
+ const quote = (0, combinator_1.lazy)(() => (0, combinator_1.creator)((0, combinator_1.surround)('``', (0, combinator_1.some)((0, combinator_1.union)([quote, bracket, (0, combinator_1.focus)(/^(?:\\[\\{}$]|`(?!`)|[^`{}"$\n\P{ASCII}])*/u, (0, source_1.str)(syntax))])), /^"?/, true)));
6570
6566
 
6571
6567
  /***/ }),
6572
6568
 
@@ -8734,14 +8730,14 @@ function fix(h) {
8734
8730
  /***/ }),
8735
8731
 
8736
8732
  /***/ 3252:
8737
- /***/ ((module) => {
8733
+ /***/ (function(module) {
8738
8734
 
8739
- /*! typed-dom v0.0.292 https://github.com/falsandtru/typed-dom | (c) 2016, falsandtru | (Apache-2.0 AND MPL-2.0) License */
8735
+ /*! typed-dom v0.0.295 https://github.com/falsandtru/typed-dom | (c) 2016, falsandtru | (Apache-2.0 AND MPL-2.0) License */
8740
8736
  (function webpackUniversalModuleDefinition(root, factory) {
8741
8737
  if(true)
8742
8738
  module.exports = factory();
8743
8739
  else {}
8744
- })(globalThis, () => {
8740
+ })(this, () => {
8745
8741
  return /******/ (() => { // webpackBootstrap
8746
8742
  /******/ "use strict";
8747
8743
  /******/ var __webpack_modules__ = ({
@@ -8820,11 +8816,11 @@ exports.equal = equal;
8820
8816
  /***/ }),
8821
8817
 
8822
8818
  /***/ 128:
8823
- /***/ ((module, __unused_webpack_exports, __nested_webpack_require_4961__) => {
8819
+ /***/ ((module, __unused_webpack_exports, __nested_webpack_require_4955__) => {
8824
8820
 
8825
8821
 
8826
8822
 
8827
- __nested_webpack_require_4961__(921);
8823
+ __nested_webpack_require_4955__(921);
8828
8824
 
8829
8825
  const global = void 0 || typeof globalThis !== 'undefined' && globalThis // @ts-ignore
8830
8826
  || typeof self !== 'undefined' && self || Function('return this')();
@@ -8845,7 +8841,7 @@ var global = (/* unused pure expression or super */ null && (0));
8845
8841
  /***/ }),
8846
8842
 
8847
8843
  /***/ 808:
8848
- /***/ ((__unused_webpack_module, exports, __nested_webpack_require_5448__) => {
8844
+ /***/ ((__unused_webpack_module, exports, __nested_webpack_require_5442__) => {
8849
8845
 
8850
8846
 
8851
8847
 
@@ -8854,11 +8850,11 @@ Object.defineProperty(exports, "__esModule", ({
8854
8850
  }));
8855
8851
  exports.reduce = exports.memoize = void 0;
8856
8852
 
8857
- const global_1 = __nested_webpack_require_5448__(128);
8853
+ const global_1 = __nested_webpack_require_5442__(128);
8858
8854
 
8859
- const alias_1 = __nested_webpack_require_5448__(406);
8855
+ const alias_1 = __nested_webpack_require_5442__(406);
8860
8856
 
8861
- const compare_1 = __nested_webpack_require_5448__(529);
8857
+ const compare_1 = __nested_webpack_require_5442__(529);
8862
8858
 
8863
8859
  function memoize(f, identify = (...as) => as[0], memory) {
8864
8860
  if (typeof identify === 'object') return memoize(f, void 0, identify);
@@ -8916,7 +8912,7 @@ exports.reduce = reduce;
8916
8912
  /***/ }),
8917
8913
 
8918
8914
  /***/ 521:
8919
- /***/ ((__unused_webpack_module, exports, __nested_webpack_require_6838__) => {
8915
+ /***/ ((__unused_webpack_module, exports, __nested_webpack_require_6832__) => {
8920
8916
 
8921
8917
 
8922
8918
 
@@ -8925,11 +8921,11 @@ Object.defineProperty(exports, "__esModule", ({
8925
8921
  }));
8926
8922
  exports.defrag = exports.prepend = exports.append = exports.isChildren = exports.define = exports.element = exports.text = exports.svg = exports.html = exports.frag = exports.shadow = void 0;
8927
8923
 
8928
- const global_1 = __nested_webpack_require_6838__(128);
8924
+ const global_1 = __nested_webpack_require_6832__(128);
8929
8925
 
8930
- const alias_1 = __nested_webpack_require_6838__(406);
8926
+ const alias_1 = __nested_webpack_require_6832__(406);
8931
8927
 
8932
- const memoize_1 = __nested_webpack_require_6838__(808);
8928
+ const memoize_1 = __nested_webpack_require_6832__(808);
8933
8929
 
8934
8930
  var caches;
8935
8931
 
@@ -9034,7 +9030,7 @@ function defineAttrs(el, attrs) {
9034
9030
  configurable: true,
9035
9031
  enumerable: false,
9036
9032
  writable: true,
9037
- value: prop in el ? ev => ev.returnValue : ''
9033
+ value: prop in el && !(0, alias_1.hasOwnProperty)(el, prop) ? ev => ev.returnValue : ''
9038
9034
  });
9039
9035
  }
9040
9036
  }
@@ -9061,7 +9057,7 @@ function defineAttrs(el, attrs) {
9061
9057
  configurable: true,
9062
9058
  enumerable: false,
9063
9059
  writable: true,
9064
- value: prop in el ? ev => ev.returnValue : ''
9060
+ value: prop in el && !(0, alias_1.hasOwnProperty)(el, prop) ? ev => ev.returnValue : ''
9065
9061
  });
9066
9062
  }
9067
9063
  }
@@ -9165,7 +9161,7 @@ exports.defrag = defrag;
9165
9161
  /******/ var __webpack_module_cache__ = {};
9166
9162
  /******/
9167
9163
  /******/ // The require function
9168
- /******/ function __nested_webpack_require_13838__(moduleId) {
9164
+ /******/ function __nested_webpack_require_13916__(moduleId) {
9169
9165
  /******/ // Check if module is in cache
9170
9166
  /******/ var cachedModule = __webpack_module_cache__[moduleId];
9171
9167
  /******/ if (cachedModule !== undefined) {
@@ -9179,7 +9175,7 @@ exports.defrag = defrag;
9179
9175
  /******/ };
9180
9176
  /******/
9181
9177
  /******/ // Execute the module function
9182
- /******/ __webpack_modules__[moduleId](module, module.exports, __nested_webpack_require_13838__);
9178
+ /******/ __webpack_modules__[moduleId](module, module.exports, __nested_webpack_require_13916__);
9183
9179
  /******/
9184
9180
  /******/ // Return the exports of the module
9185
9181
  /******/ return module.exports;
@@ -9190,7 +9186,7 @@ exports.defrag = defrag;
9190
9186
  /******/ // startup
9191
9187
  /******/ // Load entry module and return exports
9192
9188
  /******/ // This entry module is referenced by other modules so it can't be inlined
9193
- /******/ var __webpack_exports__ = __nested_webpack_require_13838__(521);
9189
+ /******/ var __webpack_exports__ = __nested_webpack_require_13916__(521);
9194
9190
  /******/
9195
9191
  /******/ return __webpack_exports__;
9196
9192
  /******/ })()
@@ -9200,14 +9196,14 @@ exports.defrag = defrag;
9200
9196
  /***/ }),
9201
9197
 
9202
9198
  /***/ 6120:
9203
- /***/ ((module) => {
9199
+ /***/ (function(module) {
9204
9200
 
9205
- /*! typed-dom v0.0.292 https://github.com/falsandtru/typed-dom | (c) 2016, falsandtru | (Apache-2.0 AND MPL-2.0) License */
9201
+ /*! typed-dom v0.0.295 https://github.com/falsandtru/typed-dom | (c) 2016, falsandtru | (Apache-2.0 AND MPL-2.0) License */
9206
9202
  (function webpackUniversalModuleDefinition(root, factory) {
9207
9203
  if(true)
9208
9204
  module.exports = factory();
9209
9205
  else {}
9210
- })(globalThis, () => {
9206
+ })(this, () => {
9211
9207
  return /******/ (() => { // webpackBootstrap
9212
9208
  /******/ "use strict";
9213
9209
  var __webpack_exports__ = {};
package/karma.conf.js CHANGED
@@ -1,9 +1,8 @@
1
1
  module.exports = function (config) {
2
2
  config.set({
3
3
  browsers: ['Chrome', 'Firefox'],
4
- frameworks: ['mocha'],
4
+ frameworks: ['mocha', 'power-assert'],
5
5
  files: [
6
- { pattern: 'https://cdn.jsdelivr.net/npm/power-assert@1.6.1/build/power-assert.js', watched: false, served: false, included: true, integrity: 'sha256-MuDC5CQFh3oWtiG0YE000HlkK08xAilD2v0ndZR+Kds=' },
7
6
  { pattern: 'https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.js', watched: false, served: false, included: true, integrity: 'sha512-2iwCHjuj+PmdCyvb88rMOch0UcKQxVHi/gsAml1fN3eg82IDaO/cdzzeXX4iF2VzIIes7pODE1/G0ts3QBwslA==' },
8
7
  { pattern: 'https://cdnjs.cloudflare.com/ajax/libs/benchmark/2.1.4/benchmark.js', watched: false, served: false, included: true, integrity: 'sha512-XnVGk21Ij51MbU8XezQpkwZ1/GA8b5qmoVGIOdJLBYycutjkaeemipzRJP7P6mEJl99OfnweA7M3e4WLfuG7Aw==' },
9
8
  { pattern: 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.js', watched: false, served: false, included: true, integrity: 'sha512-n/4gHW3atM3QqRcbCn6ewmpxcLAHGaDjpEBu4xZd47N0W2oQ+6q7oc3PXstrJYXcbNU1OHdQ1T7pAP+gi5Yu8g==' },
package/markdown.d.ts CHANGED
@@ -652,6 +652,7 @@ export namespace MarkdownParser {
652
652
  InlineParser.ReferenceParser,
653
653
  InlineParser.TemplateParser,
654
654
  InlineParser.CommentParser,
655
+ InlineParser.MathParser,
655
656
  InlineParser.ExtensionParser,
656
657
  InlineParser.RubyParser,
657
658
  InlineParser.LinkParser,
@@ -664,7 +665,6 @@ export namespace MarkdownParser {
664
665
  InlineParser.StrongParser,
665
666
  InlineParser.EmphasisParser,
666
667
  InlineParser.CodeParser,
667
- InlineParser.MathParser,
668
668
  InlineParser.HTMLEntityParser,
669
669
  InlineParser.ShortmediaParser,
670
670
  InlineParser.AutolinkParser,
@@ -748,6 +748,36 @@ export namespace MarkdownParser {
748
748
  InlineParser,
749
749
  ]> {
750
750
  }
751
+ export interface MathParser extends
752
+ // $expr$
753
+ // ${expr}$
754
+ Inline<'math'>,
755
+ Parser<HTMLElement, Context, [
756
+ MathParser.BracketParser,
757
+ Parser<string, Context, [
758
+ MathParser.BracketParser,
759
+ MathParser.QuoteParser,
760
+ SourceParser.StrParser,
761
+ ]>,
762
+ ]> {
763
+ }
764
+ export namespace MathParser {
765
+ export interface BracketParser extends
766
+ Inline<'math/bracket'>,
767
+ Parser<HTMLElement, Context, [
768
+ BracketParser,
769
+ SourceParser.EscapableSourceParser,
770
+ ]> {
771
+ }
772
+ export interface QuoteParser extends
773
+ Inline<'math/quote'>,
774
+ Parser<HTMLElement, Context, [
775
+ QuoteParser,
776
+ BracketParser,
777
+ SourceParser.StrParser,
778
+ ]> {
779
+ }
780
+ }
751
781
  export interface ExtensionParser extends
752
782
  // [#abc]
753
783
  Inline<'extension'>,
@@ -1039,24 +1069,6 @@ export namespace MarkdownParser {
1039
1069
  SourceParser.StrParser,
1040
1070
  ]> {
1041
1071
  }
1042
- export interface MathParser extends
1043
- // $expr$
1044
- // ${expr}$
1045
- Inline<'math'>,
1046
- Parser<HTMLElement, Context, [
1047
- SourceParser.StrParser,
1048
- MathParser.BracketParser,
1049
- ]> {
1050
- }
1051
- export namespace MathParser {
1052
- export interface BracketParser extends
1053
- Inline<'math/bracket'>,
1054
- Parser<HTMLElement, Context, [
1055
- BracketParser,
1056
- SourceParser.EscapableSourceParser,
1057
- ]> {
1058
- }
1059
- }
1060
1072
  export interface HTMLEntityParser extends
1061
1073
  // &copy;
1062
1074
  Inline<'htmlentity'>,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "securemark",
3
- "version": "0.246.0",
3
+ "version": "0.247.2",
4
4
  "description": "Secure markdown renderer working on browsers for user input data.",
5
5
  "private": false,
6
6
  "homepage": "https://github.com/falsandtru/securemark",
@@ -38,7 +38,7 @@
38
38
  "babel-loader": "^8.2.5",
39
39
  "babel-plugin-unassert": "^3.2.0",
40
40
  "concurrently": "^7.2.0",
41
- "eslint": "^8.15.0",
41
+ "eslint": "^8.16.0",
42
42
  "eslint-plugin-redos": "^4.4.0",
43
43
  "eslint-webpack-plugin": "^3.1.1",
44
44
  "glob": "^8.0.3",
@@ -47,12 +47,13 @@
47
47
  "karma-coverage": "^2.2.0",
48
48
  "karma-firefox-launcher": "^2.1.2",
49
49
  "karma-mocha": "^2.0.1",
50
+ "karma-power-assert": "^1.0.0",
50
51
  "mocha": "^10.0.0",
51
- "npm-check-updates": "^13.0.1",
52
+ "npm-check-updates": "^13.0.3",
52
53
  "semver": "^7.3.7",
53
- "spica": "0.0.550",
54
+ "spica": "0.0.551",
54
55
  "ts-loader": "^9.3.0",
55
- "typed-dom": "^0.0.292",
56
+ "typed-dom": "^0.0.295",
56
57
  "typescript": "4.6.4",
57
58
  "webpack": "^5.72.1",
58
59
  "webpack-cli": "^4.9.2",
@@ -52,7 +52,7 @@ describe('Unit: parser/block/reply/quote', () => {
52
52
  assert.deepStrictEqual(inspect(parser('> > a\n> > b\n> > c')), [['<span class="quote">&gt; &gt; a<br>&gt; &gt; b<br>&gt; &gt; c</span>', '<br>'], '']);
53
53
  assert.deepStrictEqual(inspect(parser('> > > a\n> > > b')), [['<span class="quote">&gt; &gt; &gt; a<br>&gt; &gt; &gt; b</span>', '<br>'], '']);
54
54
  assert.deepStrictEqual(inspect(parser('> #a')), [['<span class="quote">&gt; <a href="/hashtags/a" class="hashtag">#a</a></span>', '<br>'], '']);
55
- assert.deepStrictEqual(inspect(parser('> $a-b$')), [['<span class="quote">&gt; $a-b$</span>', '<br>'], '']);
55
+ assert.deepStrictEqual(inspect(parser('> $-a, $-b')), [['<span class="quote">&gt; $-a, $-b</span>', '<br>'], '']);
56
56
  assert.deepStrictEqual(inspect(parser('> $a=b$')), [['<span class="quote">&gt; <span class="math" translate="no" data-src="$a=b$">$a=b$</span></span>', '<br>'], '']);
57
57
  assert.deepStrictEqual(inspect(parser('> ${a}$')), [['<span class="quote">&gt; <span class="math" translate="no" data-src="${a}$">${a}$</span></span>', '<br>'], '']);
58
58
  });
@@ -12,21 +12,24 @@ describe('Unit: parser/inline/math', () => {
12
12
  assert.deepStrictEqual(inspect(parser('$$')), undefined);
13
13
  assert.deepStrictEqual(inspect(parser('$$$')), undefined);
14
14
  assert.deepStrictEqual(inspect(parser('$0 $')), undefined);
15
- assert.deepStrictEqual(inspect(parser('$0.$')), undefined);
16
- assert.deepStrictEqual(inspect(parser('$1,000.99.$')), undefined);
17
- assert.deepStrictEqual(inspect(parser('$0(a)$')), undefined);
18
- assert.deepStrictEqual(inspect(parser('$0[a]$')), undefined);
19
- assert.deepStrictEqual(inspect(parser('$0{a}$')), undefined);
20
- assert.deepStrictEqual(inspect(parser('$0 -$')), undefined);
21
- assert.deepStrictEqual(inspect(parser('$0 - $')), undefined);
22
- assert.deepStrictEqual(inspect(parser('$0 + $')), undefined);
23
- assert.deepStrictEqual(inspect(parser('$-0$')), undefined);
24
- assert.deepStrictEqual(inspect(parser('$-0$-1')), undefined);
25
- assert.deepStrictEqual(inspect(parser('$-a$')), undefined);
26
- assert.deepStrictEqual(inspect(parser('$-a$-b')), undefined);
15
+ assert.deepStrictEqual(inspect(parser('$-0, $-1')), undefined);
16
+ assert.deepStrictEqual(inspect(parser('$-0 and $-1')), undefined);
17
+ assert.deepStrictEqual(inspect(parser('$-0と$-1')), undefined);
18
+ assert.deepStrictEqual(inspect(parser('$-a $-b')), undefined);
19
+ assert.deepStrictEqual(inspect(parser('$-a\\ $-b')), undefined);
27
20
  assert.deepStrictEqual(inspect(parser('$a $')), undefined);
28
- assert.deepStrictEqual(inspect(parser('$a-b$')), undefined);
29
- assert.deepStrictEqual(inspect(parser('$a-b$c-d')), undefined);
21
+ assert.deepStrictEqual(inspect(parser('$-a"$-b"')), undefined);
22
+ assert.deepStrictEqual(inspect(parser('$-a\\"$-b\\"')), undefined);
23
+ assert.deepStrictEqual(inspect(parser('$a"$')), undefined);
24
+ assert.deepStrictEqual(inspect(parser('$-a($-b)')), undefined);
25
+ assert.deepStrictEqual(inspect(parser('$-a\\($-b\\)')), undefined);
26
+ assert.deepStrictEqual(inspect(parser('$a($')), undefined);
27
+ assert.deepStrictEqual(inspect(parser('$-a[$-b]')), undefined);
28
+ assert.deepStrictEqual(inspect(parser('$-a\\[$-b\\]')), undefined);
29
+ assert.deepStrictEqual(inspect(parser('$a[$')), undefined);
30
+ assert.deepStrictEqual(inspect(parser('$-a{$-b}')), undefined);
31
+ assert.deepStrictEqual(inspect(parser('$-a\\{$-b\\}')), undefined);
32
+ assert.deepStrictEqual(inspect(parser('$a{$')), undefined);
30
33
  assert.deepStrictEqual(inspect(parser('$a$b')), undefined);
31
34
  assert.deepStrictEqual(inspect(parser('$a$b$')), undefined);
32
35
  assert.deepStrictEqual(inspect(parser('$ $')), undefined);
@@ -35,35 +38,49 @@ describe('Unit: parser/inline/math', () => {
35
38
  assert.deepStrictEqual(inspect(parser('$\n$')), undefined);
36
39
  assert.deepStrictEqual(inspect(parser('$a\\$\nb$')), undefined);
37
40
  assert.deepStrictEqual(inspect(parser('$a\\$\\\nb$')), undefined);
41
+ assert.deepStrictEqual(inspect(parser('$`"$')), undefined);
42
+ assert.deepStrictEqual(inspect(parser('$``a"$0')), undefined);
43
+ assert.deepStrictEqual(inspect(parser('$``a""$')), undefined);
44
+ assert.deepStrictEqual(inspect(parser('$```a""$')), undefined);
45
+ assert.deepStrictEqual(inspect(parser('$``\n"$')), undefined);
46
+ assert.deepStrictEqual(inspect(parser('$``a\\$\nb"$')), undefined);
47
+ assert.deepStrictEqual(inspect(parser('$``a\\$\\\nb"$')), undefined);
48
+ assert.deepStrictEqual(inspect(parser('$"$')), undefined);
49
+ assert.deepStrictEqual(inspect(parser('$}$')), undefined);
38
50
  assert.deepStrictEqual(inspect(parser('${')), undefined);
39
51
  assert.deepStrictEqual(inspect(parser('${a')), undefined);
40
52
  assert.deepStrictEqual(inspect(parser('${$')), undefined);
41
53
  assert.deepStrictEqual(inspect(parser('${}')), undefined);
42
54
  assert.deepStrictEqual(inspect(parser('${a} $')), undefined);
43
- assert.deepStrictEqual(inspect(parser('${a}b$')), undefined);
44
- assert.deepStrictEqual(inspect(parser('${a}{b}$')), undefined);
45
55
  assert.deepStrictEqual(inspect(parser('${a{b}$')), undefined);
46
56
  assert.deepStrictEqual(inspect(parser('${a}b}$')), undefined);
57
+ assert.deepStrictEqual(inspect(parser('${a}b$')), undefined);
58
+ assert.deepStrictEqual(inspect(parser('${a}b{c}$')), undefined);
59
+ assert.deepStrictEqual(inspect(parser('${a}{b}$')), undefined);
60
+ assert.deepStrictEqual(inspect(parser('${$}$')), undefined);
47
61
  assert.deepStrictEqual(inspect(parser('${\\}$')), undefined);
48
62
  assert.deepStrictEqual(inspect(parser('${\n}$')), undefined);
49
63
  assert.deepStrictEqual(inspect(parser('${a\\$\nb}$')), undefined);
50
64
  assert.deepStrictEqual(inspect(parser('${a\\$\\\nb}$')), undefined);
65
+ assert.deepStrictEqual(inspect(parser('$\\begin{}$')), [['<span class="invalid" translate="no">$\\begin{}$</span>'], '']);
66
+ assert.deepStrictEqual(inspect(parser('$\\huge0$')), [['<span class="invalid" translate="no">$\\huge0$</span>'], '']);
67
+ assert.deepStrictEqual(inspect(parser('$\\Begin{}$')), [['<span class="invalid" translate="no">$\\Begin{}$</span>'], '']);
51
68
  assert.deepStrictEqual(inspect(parser('${\\begin}$')), [['<span class="invalid" translate="no">${\\begin}$</span>'], '']);
52
- assert.deepStrictEqual(inspect(parser('${\\Huge}$')), [['<span class="invalid" translate="no">${\\Huge}$</span>'], '']);
53
- assert.deepStrictEqual(inspect(parser('${a}b$')), undefined);
54
69
  assert.deepStrictEqual(inspect(parser(' ${a}$')), undefined);
55
70
  });
56
71
 
57
72
  it('basic', () => {
58
73
  assert.deepStrictEqual(inspect(parser('$0$')), [['<span class="math" translate="no" data-src="$0$">$0$</span>'], '']);
59
74
  assert.deepStrictEqual(inspect(parser('$0$$')), [['<span class="math" translate="no" data-src="$0$">$0$</span>'], '$']);
75
+ assert.deepStrictEqual(inspect(parser('$00$')), [['<span class="math" translate="no" data-src="$00$">$00$</span>'], '']);
76
+ assert.deepStrictEqual(inspect(parser('$-0$')), [['<span class="math" translate="no" data-src="$-0$">$-0$</span>'], '']);
60
77
  assert.deepStrictEqual(inspect(parser('$0-1$')), [['<span class="math" translate="no" data-src="$0-1$">$0-1$</span>'], '']);
61
78
  assert.deepStrictEqual(inspect(parser('$0+1$')), [['<span class="math" translate="no" data-src="$0+1$">$0+1$</span>'], '']);
62
79
  assert.deepStrictEqual(inspect(parser('$0*1$')), [['<span class="math" translate="no" data-src="$0*1$">$0*1$</span>'], '']);
63
80
  assert.deepStrictEqual(inspect(parser('$0/1$')), [['<span class="math" translate="no" data-src="$0/1$">$0/1$</span>'], '']);
64
81
  assert.deepStrictEqual(inspect(parser('$a$')), [['<span class="math" translate="no" data-src="$a$">$a$</span>'], '']);
65
82
  assert.deepStrictEqual(inspect(parser('$a$$')), [['<span class="math" translate="no" data-src="$a$">$a$</span>'], '$']);
66
- assert.deepStrictEqual(inspect(parser('$a -b$')), [['<span class="math" translate="no" data-src="$a -b$">$a -b$</span>'], '']);
83
+ assert.deepStrictEqual(inspect(parser('$a-b$')), [['<span class="math" translate="no" data-src="$a-b$">$a-b$</span>'], '']);
67
84
  assert.deepStrictEqual(inspect(parser('$a+b$')), [['<span class="math" translate="no" data-src="$a+b$">$a+b$</span>'], '']);
68
85
  assert.deepStrictEqual(inspect(parser('$a*b$')), [['<span class="math" translate="no" data-src="$a*b$">$a*b$</span>'], '']);
69
86
  assert.deepStrictEqual(inspect(parser('$a/b$')), [['<span class="math" translate="no" data-src="$a/b$">$a/b$</span>'], '']);
@@ -71,6 +88,7 @@ describe('Unit: parser/inline/math', () => {
71
88
  assert.deepStrictEqual(inspect(parser(`$a''$`)), [[`<span class="math" translate="no" data-src="$a''$">$a''$</span>`], '']);
72
89
  assert.deepStrictEqual(inspect(parser('$a$[A](a)')), [['<span class="math" translate="no" data-src="$a$">$a$</span>'], '[A](a)']);
73
90
  assert.deepStrictEqual(inspect(parser('$A$')), [['<span class="math" translate="no" data-src="$A$">$A$</span>'], '']);
91
+ assert.deepStrictEqual(inspect(parser('$-a$')), [['<span class="math" translate="no" data-src="$-a$">$-a$</span>'], '']);
74
92
  assert.deepStrictEqual(inspect(parser('$\\$$')), [['<span class="math" translate="no" data-src="$\\$$">$\\$$</span>'], '']);
75
93
  assert.deepStrictEqual(inspect(parser('$\\Pi$')), [['<span class="math" translate="no" data-src="$\\Pi$">$\\Pi$</span>'], '']);
76
94
  assert.deepStrictEqual(inspect(parser('$\\ 0$')), [['<span class="math" translate="no" data-src="$\\ 0$">$\\ 0$</span>'], '']);
@@ -86,6 +104,18 @@ describe('Unit: parser/inline/math', () => {
86
104
  assert.deepStrictEqual(inspect(parser('$f(x)$')), [['<span class="math" translate="no" data-src="$f(x)$">$f(x)$</span>'], '']);
87
105
  assert.deepStrictEqual(inspect(parser('$f: x \\to y$')), [['<span class="math" translate="no" data-src="$f: x \\to y$">$f: x \\to y$</span>'], '']);
88
106
  assert.deepStrictEqual(inspect(parser('$k$-space')), [['<span class="math" translate="no" data-src="$k$">$k$</span>'], '-space']);
107
+ assert.deepStrictEqual(inspect(parser('$`$')), [['<span class="math" translate="no" data-src="$`$">$`$</span>'], '']);
108
+ assert.deepStrictEqual(inspect(parser('$`"a$')), [['<span class="math" translate="no" data-src="$`&quot;a$">$`"a$</span>'], '']);
109
+ assert.deepStrictEqual(inspect(parser('$``$')), [['<span class="math" translate="no" data-src="$``$">$``$</span>'], '']);
110
+ assert.deepStrictEqual(inspect(parser('$``"$')), [['<span class="math" translate="no" data-src="$``&quot;$">$``"$</span>'], '']);
111
+ assert.deepStrictEqual(inspect(parser('$``""a$')), [['<span class="math" translate="no" data-src="$``&quot;&quot;a$">$``""a$</span>'], '']);
112
+ assert.deepStrictEqual(inspect(parser('$``a"$')), [['<span class="math" translate="no" data-src="$``a&quot;$">$``a"$</span>'], '']);
113
+ assert.deepStrictEqual(inspect(parser('$``$"$')), [['<span class="math" translate="no" data-src="$``$">$``$</span>'], '"$']);
114
+ assert.deepStrictEqual(inspect(parser('$``\\"$')), [['<span class="math" translate="no" data-src="$``\\&quot;$">$``\\"$</span>'], '']);
115
+ assert.deepStrictEqual(inspect(parser('$``a``b"c"$')), [['<span class="math" translate="no" data-src="$``a``b&quot;c&quot;$">$``a``b"c"$</span>'], '']);
116
+ assert.deepStrictEqual(inspect(parser('$```"$')), [['<span class="math" translate="no" data-src="$```&quot;$">$```"$</span>'], '']);
117
+ assert.deepStrictEqual(inspect(parser('$````""$')), [['<span class="math" translate="no" data-src="$````&quot;&quot;$">$````""$</span>'], '']);
118
+ assert.deepStrictEqual(inspect(parser('$a{b}$')), [['<span class="math" translate="no" data-src="$a{b}$">$a{b}$</span>'], '']);
89
119
  assert.deepStrictEqual(inspect(parser('${}$')), [['<span class="math" translate="no" data-src="${}$">${}$</span>'], '']);
90
120
  assert.deepStrictEqual(inspect(parser('${ }$')), [['<span class="math" translate="no" data-src="${ }$">${ }$</span>'], '']);
91
121
  assert.deepStrictEqual(inspect(parser('${a}$')), [['<span class="math" translate="no" data-src="${a}$">${a}$</span>'], '']);
@@ -97,10 +127,11 @@ describe('Unit: parser/inline/math', () => {
97
127
  assert.deepStrictEqual(inspect(parser('${a }$')), [['<span class="math" translate="no" data-src="${a }$">${a }$</span>'], '']);
98
128
  assert.deepStrictEqual(inspect(parser('${ a}$')), [['<span class="math" translate="no" data-src="${ a}$">${ a}$</span>'], '']);
99
129
  assert.deepStrictEqual(inspect(parser('${ a }$')), [['<span class="math" translate="no" data-src="${ a }$">${ a }$</span>'], '']);
100
- assert.deepStrictEqual(inspect(parser('${$}$')), [['<span class="math" translate="no" data-src="${$}$">${$}$</span>'], '']);
130
+ assert.deepStrictEqual(inspect(parser('${``a"}$')), [['<span class="math" translate="no" data-src="${``a&quot;}$">${``a"}$</span>'], '']);
101
131
  assert.deepStrictEqual(inspect(parser('${\\a}$')), [['<span class="math" translate="no" data-src="${\\a}$">${\\a}$</span>'], '']);
102
132
  assert.deepStrictEqual(inspect(parser('${\\$}$')), [['<span class="math" translate="no" data-src="${\\$}$">${\\$}$</span>'], '']);
103
133
  assert.deepStrictEqual(inspect(parser('${\\\\}$')), [['<span class="math" translate="no" data-src="${\\\\}$">${\\\\}$</span>'], '']);
134
+ assert.deepStrictEqual(inspect(parser('${あ}$')), [['<span class="math" translate="no" data-src="${あ}$">${あ}$</span>'], '']);
104
135
  });
105
136
 
106
137
  it('nest', () => {
@@ -1,35 +1,34 @@
1
1
  import { MathParser } from '../inline';
2
- import { union, some, validate, rewrite, creator, surround, lazy } from '../../combinator';
2
+ import { union, some, validate, focus, rewrite, creator, surround, lazy } from '../../combinator';
3
3
  import { escsource, str } from '../source';
4
4
  import { html } from 'typed-dom/dom';
5
5
 
6
- const disallowedCommand = /\\(?:begin|tiny|huge|large)(?![0-9a-z])/i;
6
+ const syntax = /^(?:[ "([](?!\$)|\\{(?!\$)|\\[\\}$]?|^`|`(?!`)|[!#%&')\x2A-\x5A\]^_\x61-\x7A|~])+/;
7
+ const forbiddenCommand = /\\(?:begin|tiny|huge|large)(?![a-z])/i;
7
8
 
8
9
  export const math: MathParser = lazy(() => creator(validate('$', rewrite(
9
10
  union([
10
- surround(
11
- '$',
12
- // Latex's reserved characters: # $ % ^ & _ { } ~ \
13
- // $[0-9]+ : Dollar
14
- // $[A-z]*- : Label
15
- // $[A-z]*(?!-) : Math
16
- // $[\^_[({|] : Math
17
- // $[#$%&] : Invalid first character in Latex syntax
18
- str(/^(?![\s{}#$%&]|\d+(?:[,.]\d+)*[^-+*/=<>^_~\\$]|-[\da-z]|[a-z]+-)(?:\\\$|\x20(?!\$)|[\x21-\x23\x25-\x7E])+/i),
19
- /^\$(?![0-9a-z])/i),
20
11
  surround('$', bracket, '$'),
12
+ surround(
13
+ /^\$(?![\s{}])/,
14
+ some(union([
15
+ bracket,
16
+ quote,
17
+ str(syntax),
18
+ ])),
19
+ /^\$(?![0-9A-Za-z])/),
21
20
  ]),
22
21
  (source, { caches: { math: cache } = {} }) => [[
23
22
  cache?.get(source)?.cloneNode(true) ||
24
23
  html('span',
25
- !disallowedCommand.test(source)
24
+ !forbiddenCommand.test(source)
26
25
  ? { class: 'math', translate: 'no', 'data-src': source }
27
26
  : {
28
27
  class: 'invalid',
29
28
  translate: 'no',
30
29
  'data-invalid-syntax': 'math',
31
30
  'data-invalid-type': 'content',
32
- 'data-invalid-message': `"${source.match(disallowedCommand)![0]}" command is disallowed`,
31
+ 'data-invalid-message': `"${source.match(forbiddenCommand)![0]}" command is forbidden`,
33
32
  },
34
33
  source)
35
34
  ], '']))));
@@ -38,7 +37,17 @@ const bracket: MathParser.BracketParser = lazy(() => creator(surround(
38
37
  '{',
39
38
  some(union([
40
39
  bracket,
41
- some(escsource, /^(?:[{}]|\\?\n)/),
40
+ some(escsource, /^(?:[{}$]|\\?\n)/),
42
41
  ])),
43
42
  '}',
44
43
  true)));
44
+
45
+ const quote: MathParser.QuoteParser = lazy(() => creator(surround(
46
+ '``',
47
+ some(union([
48
+ quote,
49
+ bracket,
50
+ focus(/^(?:\\[\\{}$]|`(?!`)|[^`{}"$\n\P{ASCII}])*/u, str(syntax)),
51
+ ])),
52
+ /^"?/,
53
+ true)));
@@ -112,7 +112,8 @@ describe('Unit: parser/inline', () => {
112
112
  assert.deepStrictEqual(inspect(parser('[$1]')), [['[', '$', '1', ']'], '']);
113
113
  assert.deepStrictEqual(inspect(parser('[$1-2]')), [['[', '$', '1', '-', '2', ']'], '']);
114
114
  assert.deepStrictEqual(inspect(parser('[$-1][$-2]')), [['<a class="label" data-label="$-1">$-1</a>', '<a class="label" data-label="$-2">$-2</a>'], '']);
115
- assert.deepStrictEqual(inspect(parser('$-1$-2')), [['<a class="label" data-label="$-1">$-1</a>', '<a class="label" data-label="$-2">$-2</a>'], '']);
115
+ assert.deepStrictEqual(inspect(parser('$-1, $-2')), [['<a class="label" data-label="$-1">$-1</a>', ',', ' ', '<a class="label" data-label="$-2">$-2</a>'], '']);
116
+ assert.deepStrictEqual(inspect(parser('$-1 and $-2')), [['<a class="label" data-label="$-1">$-1</a>', ' ', 'and', ' ', '<a class="label" data-label="$-2">$-2</a>'], '']);
116
117
  assert.deepStrictEqual(inspect(parser('$$-1')), [['$', '<a class="label" data-label="$-1">$-1</a>'], '']);
117
118
  assert.deepStrictEqual(inspect(parser('[[#a]]')), [['<sup class="reference"><a href="/hashtags/a" class="hashtag">#a</a></sup>'], '']);
118
119
  assert.deepStrictEqual(inspect(parser('[[$-1]]')), [['<sup class="reference"><a class="label" data-label="$-1">$-1</a></sup>'], '']);
@@ -5,6 +5,7 @@ import { annotation } from './inline/annotation';
5
5
  import { reference } from './inline/reference';
6
6
  import { template } from './inline/template';
7
7
  import { comment } from './inline/comment';
8
+ import { math } from './inline/math';
8
9
  import { extension } from './inline/extension';
9
10
  import { ruby } from './inline/ruby';
10
11
  import { link } from './inline/link';
@@ -16,7 +17,6 @@ import { emstrong } from './inline/emstrong';
16
17
  import { emphasis } from './inline/emphasis';
17
18
  import { strong } from './inline/strong';
18
19
  import { code } from './inline/code';
19
- import { math } from './inline/math';
20
20
  import { media } from './inline/media';
21
21
  import { htmlentity } from './inline/htmlentity';
22
22
  import { shortmedia } from './inline/shortmedia';
@@ -30,6 +30,7 @@ export import AnnotationParser = InlineParser.AnnotationParser;
30
30
  export import ReferenceParser = InlineParser.ReferenceParser;
31
31
  export import TemplateParser = InlineParser.TemplateParser;
32
32
  export import CommentParser = InlineParser.CommentParser;
33
+ export import MathParser = InlineParser.MathParser;
33
34
  export import ExtensionParser = InlineParser.ExtensionParser;
34
35
  export import RubyParser = InlineParser.RubyParser;
35
36
  export import LinkParser = InlineParser.LinkParser;
@@ -41,7 +42,6 @@ export import EmStrongParser = InlineParser.EmStrongParser;
41
42
  export import EmphasisParser = InlineParser.EmphasisParser;
42
43
  export import StrongParser = InlineParser.StrongParser;
43
44
  export import CodeParser = InlineParser.CodeParser;
44
- export import MathParser = InlineParser.MathParser;
45
45
  export import MediaParser = InlineParser.MediaParser;
46
46
  export import HTMLEntityParser = InlineParser.HTMLEntityParser;
47
47
  export import UnsafeHTMLEntityParser = InlineParser.UnsafeHTMLEntityParser;
@@ -55,6 +55,7 @@ export const inline: InlineParser = union([
55
55
  reference,
56
56
  template,
57
57
  comment,
58
+ math,
58
59
  extension,
59
60
  ruby,
60
61
  link,
@@ -67,7 +68,6 @@ export const inline: InlineParser = union([
67
68
  strong,
68
69
  emphasis,
69
70
  code,
70
- math,
71
71
  htmlentity,
72
72
  shortmedia,
73
73
  autolink,
package/webpack.config.js CHANGED
@@ -6,7 +6,7 @@ const { mergeWithRules } = require('webpack-merge');
6
6
  const ESLintPlugin = require('eslint-webpack-plugin');
7
7
  const pkg = require('./package.json');
8
8
 
9
- shell('rm -rf dist coverage');
9
+ shell('rm -rf coverage');
10
10
 
11
11
  module.exports = env => {
12
12
  const merge = mergeWithRules({
@@ -39,7 +39,7 @@ module.exports = env => {
39
39
  path: path.resolve(__dirname, 'dist'),
40
40
  library: pkg.name,
41
41
  libraryTarget: 'umd',
42
- globalObject: 'globalThis',
42
+ globalObject: 'this',
43
43
  clean: true,
44
44
  },
45
45
  module: {