securemark 0.300.1 → 0.300.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,9 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.300.2
4
+
5
+ - Refactoring.
6
+
3
7
  ## 0.300.1
4
8
 
5
9
  - Refactoring.
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- /*! securemark v0.300.1 https://github.com/falsandtru/securemark | (c) 2017, falsandtru | UNLICENSED License */
1
+ /*! securemark v0.300.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("Prism"), require("DOMPurify"));
@@ -2463,7 +2463,8 @@ function bind(target, settings) {
2463
2463
  options.segment = sourceSegmentAttrs[index] | 1 /* Segment.write */;
2464
2464
  for (const _ of (0, parser_1.run)(block_1.block, new context_1.Input(options, seg), output)) {
2465
2465
  yield {
2466
- type: 'break'
2466
+ type: 'break',
2467
+ value: 'block'
2467
2468
  };
2468
2469
  }
2469
2470
  const es = output.pop().foldl((acc, {
@@ -2519,7 +2520,8 @@ function bind(target, settings) {
2519
2520
  };
2520
2521
  }
2521
2522
  yield {
2522
- type: 'break'
2523
+ type: 'break',
2524
+ value: 'parser'
2523
2525
  };
2524
2526
  if (rev !== revision) return yield {
2525
2527
  type: 'cancel'
@@ -2529,7 +2531,8 @@ function bind(target, settings) {
2529
2531
  type: 'figure',
2530
2532
  value: el
2531
2533
  } : yield {
2532
- type: 'break'
2534
+ type: 'break',
2535
+ value: 'figure'
2533
2536
  };
2534
2537
  if (rev !== revision) return yield {
2535
2538
  type: 'cancel'
@@ -2540,7 +2543,8 @@ function bind(target, settings) {
2540
2543
  type: 'note',
2541
2544
  value: el
2542
2545
  } : yield {
2543
- type: 'break'
2546
+ type: 'break',
2547
+ value: 'note'
2544
2548
  };
2545
2549
  if (rev !== revision) return yield {
2546
2550
  type: 'cancel'
@@ -4256,11 +4260,10 @@ const line_1 = __webpack_require__(1599);
4256
4260
  function fence(opener, write, separation = true) {
4257
4261
  return (input, output) => {
4258
4262
  const {
4259
- source,
4260
- position
4263
+ source
4261
4264
  } = input;
4262
- if (position === source.length) return;
4263
- opener.lastIndex = position;
4265
+ if (input.position === source.length) return;
4266
+ opener.lastIndex = input.position;
4264
4267
  const matches = opener.exec(source);
4265
4268
  if (!matches) return;
4266
4269
  (0, clock_1.spend)(input, output, matches[0].length);
@@ -4273,34 +4276,26 @@ function fence(opener, write, separation = true) {
4273
4276
  input.position -= matches[0].length;
4274
4277
  return;
4275
4278
  }
4279
+ const {
4280
+ position
4281
+ } = input;
4276
4282
  let body = '';
4277
4283
  let closer = '';
4278
- let overflow = '';
4279
- for (let count = 1;; ++count) {
4280
- if (input.position === source.length) break;
4281
- const line = (0, line_1.firstline)(source, input.position);
4282
- if (closer && (0, line_1.isEmptyline)(line, 0)) break;
4283
- if (closer) {
4284
- overflow += line;
4285
- }
4286
- if (!closer && line.startsWith(delim) && line.trimEnd() === delim) {
4287
- closer = line;
4288
- if ((0, line_1.isEmptyline)(source, input.position + line.length)) {
4289
- input.position += line.length;
4290
- break;
4291
- }
4292
- if (!separation) {
4293
- input.position += line.length;
4294
- break;
4295
- }
4296
- overflow = line;
4297
- }
4298
- if (!overflow) {
4299
- body += line;
4300
- }
4301
- input.position += line.length;
4284
+ for (input.position -= 1;;) {
4285
+ input.position = source.indexOf(`\n${delim}`, input.position) + 1 || source.length;
4286
+ if (!(0, line_1.isEmptyline)(source, input.position + delim.length)) continue;
4287
+ body = source.slice(position, input.position);
4288
+ closer = (0, line_1.firstline)(source, input.position);
4289
+ input.position += closer.length;
4290
+ break;
4291
+ }
4292
+ if (separation) for (; !(0, line_1.isEmptyline)(source, input.position);) {
4293
+ input.position = source.indexOf('\n', input.position) + 1 || source.length;
4294
+ }
4295
+ if (write) {
4296
+ const overflow = source.slice(position + body.length + closer.length, input.position);
4297
+ output.push(new parser_1.List([body, overflow, closer].map(str => new parser_1.Node(str))).import(new parser_1.List(matches.map(str => new parser_1.Node(str)))));
4302
4298
  }
4303
- write && output.push(new parser_1.List([body, overflow, closer].map(str => new parser_1.Node(str))).import(new parser_1.List(matches.map(str => new parser_1.Node(str)))));
4304
4299
  return output.context;
4305
4300
  };
4306
4301
  }
@@ -4445,7 +4440,7 @@ exports.firstline = firstline;
4445
4440
  const emptyline = /[^\S\r\n]*(?:$|\r?\n)/y;
4446
4441
  function isEmptyline(source, position) {
4447
4442
  emptyline.lastIndex = position;
4448
- return source.length === position || source[position] === '\n' || emptyline.test(source);
4443
+ return position >= source.length || source[position] === '\n' || emptyline.test(source);
4449
4444
  }
4450
4445
  exports.isEmptyline = isEmptyline;
4451
4446
 
@@ -5014,7 +5009,7 @@ exports.codeblock = (0, combinator_1.block)((0, combinator_1.inits)([(0, combina
5014
5009
  class: 'invalid',
5015
5010
  translate: 'no',
5016
5011
  ...(0, util_1.invalid)('codeblock', !closer || overflow ? 'fence' : 'argument', !closer ? `Missing the closing delimiter "${delim}"` : overflow ? `Invalid trailing line after the closing delimiter "${delim}"` : params.invalid)
5017
- }, `${opener}${body}${overflow || closer}`)));
5012
+ }, `${opener}${body}${closer}${overflow}`)));
5018
5013
  return;
5019
5014
  }
5020
5015
  const src = body.slice(0, body.at(-2) === '\r' ? -2 : -1);
@@ -5085,7 +5080,7 @@ const message_1 = __webpack_require__(3949);
5085
5080
  const aside_1 = __webpack_require__(6150);
5086
5081
  const example_1 = __webpack_require__(6624);
5087
5082
  const placeholder_1 = __webpack_require__(4091);
5088
- exports.segment = (0, combinator_1.union)([fig_1.segment, figure_1.segment, table_1.segment, placeholder_1.segment]);
5083
+ exports.segment = (0, combinator_1.union)([fig_1.segment, figure_1.segment, placeholder_1.segment]);
5089
5084
  exports.extension = (0, combinator_1.lazy)(() => (0, combinator_1.union)([
5090
5085
  //figbase,
5091
5086
  //fig,
@@ -5116,7 +5111,7 @@ exports.aside = (0, combinator_1.block)((0, combinator_1.recursion)(1 /* Recursi
5116
5111
  class: 'invalid',
5117
5112
  translate: 'no',
5118
5113
  ...(0, util_1.invalid)('aside', !closer || overflow ? 'fence' : 'argument', !closer ? `Missing the closing delimiter "${delim}"` : overflow ? `Invalid trailing line after the closing delimiter "${delim}"` : 'Invalid argument')
5119
- }, `${opener}${body}${overflow || closer}`)));
5114
+ }, `${opener}${body}${closer}${overflow}`)));
5120
5115
  return;
5121
5116
  }
5122
5117
  input.memory = {
@@ -5185,7 +5180,7 @@ exports.example = (0, combinator_1.block)((0, combinator_1.recursion)(1 /* Recur
5185
5180
  class: 'invalid',
5186
5181
  translate: 'no',
5187
5182
  ...(0, util_1.invalid)('example', !closer || overflow ? 'fence' : 'argument', !closer ? `Missing the closing delimiter "${delim}"` : overflow ? `Invalid trailing line after the closing delimiter "${delim}"` : 'Invalid argument')
5188
- }, `${opener}${body}${overflow || closer}`)));
5183
+ }, `${opener}${body}${closer}${overflow}`)));
5189
5184
  switch (type) {
5190
5185
  case 'markdown':
5191
5186
  {
@@ -5263,10 +5258,9 @@ const figure_1 = __webpack_require__(4248);
5263
5258
  const label_1 = __webpack_require__(2178);
5264
5259
  const codeblock_1 = __webpack_require__(9194);
5265
5260
  const mathblock_1 = __webpack_require__(4903);
5266
- const table_1 = __webpack_require__(3646);
5267
- const blockquote_1 = __webpack_require__(5885);
5268
5261
  const placeholder_1 = __webpack_require__(4091);
5269
- exports.segment = (0, combinator_1.backtrack)((0, combinator_1.block)((0, combinator_1.sequence)([(0, combinator_1.line)((0, combinator_1.close)(label_1.segment, /(?!\S)[^\r\n]*\r?\n/y), false), (0, combinator_1.union)([codeblock_1.segment, mathblock_1.segment, table_1.segment, blockquote_1.segment, placeholder_1.segment, (0, combinator_1.some)(source_1.contentline)])]), true, 6 /* Segment.fig */));
5262
+ const blockquote_1 = __webpack_require__(5885);
5263
+ exports.segment = (0, combinator_1.block)((0, combinator_1.sequence)([(0, combinator_1.line)((0, combinator_1.close)(label_1.segment, /(?!\S)[^\r\n]*\r?\n/y), false), (0, combinator_1.union)([codeblock_1.segment, mathblock_1.segment, placeholder_1.segment, blockquote_1.segment, (0, combinator_1.some)(source_1.contentline)])]), true, 6 /* Segment.fig */);
5270
5264
  exports.fig = (0, combinator_1.block)((0, combinator_1.rewrite)(exports.segment, (0, combinator_1.always)([(input, output) => {
5271
5265
  const {
5272
5266
  source
@@ -5333,8 +5327,8 @@ const codeblock_1 = __webpack_require__(9194);
5333
5327
  const mathblock_1 = __webpack_require__(4903);
5334
5328
  const example_1 = __webpack_require__(6624);
5335
5329
  const table_2 = __webpack_require__(3646);
5336
- const blockquote_1 = __webpack_require__(5885);
5337
5330
  const placeholder_1 = __webpack_require__(4091);
5331
+ const blockquote_1 = __webpack_require__(5885);
5338
5332
  const inline_1 = __webpack_require__(7973);
5339
5333
  const visibility_1 = __webpack_require__(6364);
5340
5334
  const util_1 = __webpack_require__(4992);
@@ -5342,10 +5336,10 @@ const memoize_1 = __webpack_require__(6925);
5342
5336
  const dom_1 = __webpack_require__(394);
5343
5337
  exports.segment = (0, combinator_1.block)((0, combinator_1.match)(/(~{3,})(?:figure )?(?=\[?\$)/y, (0, memoize_1.memoize)(([, fence], closer = new RegExp(String.raw`${fence}[^\S\r\n]*(?:$|\r?\n)`, 'y')) => (0, combinator_1.close)((0, combinator_1.sequence)([source_1.contentline, (0, combinator_1.inits)([
5344
5338
  // All parsers which can include closing terms.
5345
- (0, combinator_1.union)([codeblock_1.segment_, mathblock_1.segment_, table_2.segment_, blockquote_1.segment, placeholder_1.segment_, (0, combinator_1.some)(source_1.contentline, closer)]), source_1.emptyline, (0, combinator_1.union)([source_1.emptyline, (0, combinator_1.some)(source_1.contentline, closer)])])]), closer), ([, fence]) => fence.length - 1, [], 2 ** 4 - 1)), true, 8 /* Segment.figure */);
5339
+ (0, combinator_1.union)([codeblock_1.segment_, mathblock_1.segment_, placeholder_1.segment_, blockquote_1.segment, (0, combinator_1.some)(source_1.contentline, closer)]), source_1.emptyline, (0, combinator_1.union)([source_1.emptyline, (0, combinator_1.some)(source_1.contentline, closer)])])]), closer), ([, fence]) => fence.length - 1, [], 2 ** 4 - 1)), true, 8 /* Segment.figure */);
5346
5340
  exports.figure = (0, combinator_1.block)((0, combinator_1.fallback)((0, combinator_1.rewrite)(exports.segment, (0, combinator_1.fmap)((0, combinator_1.scope)(({
5347
5341
  source
5348
- }) => source.slice(source.match(/^~+(?:\w+\s+)?/)[0].length, source.trimEnd().lastIndexOf('\n')), (0, combinator_1.sequence)([(0, combinator_1.line)((0, combinator_1.sequence)([label_1.label, (0, source_1.str)(/(?!\S)[^\r\n]*\r?\n/y)]), false), (0, combinator_1.inits)([(0, combinator_1.block)((0, combinator_1.union)([ulist_1.ulist, olist_1.olist, table_1.table, codeblock_1.codeblock, mathblock_1.mathblock, example_1.example, table_2.table, blockquote_1.blockquote, placeholder_1.placeholder, (0, combinator_1.line)(inline_1.media, false), (0, combinator_1.line)(inline_1.lineshortmedia, false)])), source_1.emptyline, (0, combinator_1.block)((0, visibility_1.visualize)((0, visibility_1.trimBlank)((0, combinator_1.some)(inline_1.inline))))])]), false), nodes => {
5342
+ }) => source.slice(source.match(/^~+(?:\w+\s+)?/)[0].length, source.trimEnd().lastIndexOf('\n')), (0, combinator_1.sequence)([(0, combinator_1.line)((0, combinator_1.sequence)([label_1.label, (0, source_1.str)(/(?!\S)[^\r\n]*\r?\n/y)]), false), (0, combinator_1.inits)([(0, combinator_1.block)((0, combinator_1.union)([ulist_1.ulist, olist_1.olist, table_1.table, codeblock_1.codeblock, mathblock_1.mathblock, example_1.example, table_2.table, placeholder_1.placeholder, blockquote_1.blockquote, (0, combinator_1.line)(inline_1.media, false), (0, combinator_1.line)(inline_1.lineshortmedia, false)])), source_1.emptyline, (0, combinator_1.block)((0, visibility_1.visualize)((0, visibility_1.trimBlank)((0, combinator_1.some)(inline_1.inline))))])]), false), nodes => {
5349
5343
  const [label, param, content, ...caption] = (0, util_1.unwrap)(nodes);
5350
5344
  return new parser_1.List([new parser_1.Node((0, dom_1.html)('figure', attributes(label.getAttribute('data-label'), param, content, caption), [(0, dom_1.html)('figcaption', [(0, dom_1.html)('span', {
5351
5345
  class: 'figindex'
@@ -5359,7 +5353,7 @@ exports.figure = (0, combinator_1.block)((0, combinator_1.fallback)((0, combinat
5359
5353
  class: 'invalid',
5360
5354
  translate: 'no',
5361
5355
  ...(0, util_1.invalid)('figure', violation[0], violation[1])
5362
- }, `${opener}${body}${overflow || closer}`)));
5356
+ }, `${opener}${body}${closer}${overflow}`)));
5363
5357
  }])));
5364
5358
  function attributes(label, param, content, caption) {
5365
5359
  const group = label.split('-', 1)[0];
@@ -5435,7 +5429,7 @@ exports.message = (0, combinator_1.block)((0, combinator_1.inits)([(0, combinato
5435
5429
  class: 'invalid',
5436
5430
  translate: 'no',
5437
5431
  ...(0, util_1.invalid)('message', !closer || overflow ? 'fence' : 'argument', !closer ? `Missing the closing delimiter "${delim}"` : overflow ? `Invalid trailing line after the closing delimiter "${delim}"` : 'Invalid argument')
5438
- }, `${opener}${body}${overflow || closer}`)));
5432
+ }, `${opener}${body}${closer}${overflow}`)));
5439
5433
  return;
5440
5434
  }
5441
5435
  switch (type) {
@@ -5503,7 +5497,7 @@ exports.placeholder = (0, combinator_1.block)((0, combinator_1.inits)([(0, combi
5503
5497
  class: 'invalid',
5504
5498
  translate: 'no',
5505
5499
  ...(0, util_1.invalid)('extension', 'fence', !closer ? `Missing the closing delimiter "${delim}"` : overflow ? `Invalid trailing line after the closing delimiter "${delim}"` : 'Invalid argument')
5506
- }, `${opener}${body}${overflow || closer}`)));
5500
+ }, `${opener}${body}${closer}${overflow}`)));
5507
5501
  }]));
5508
5502
 
5509
5503
  /***/ },
@@ -5517,7 +5511,7 @@ exports.placeholder = (0, combinator_1.block)((0, combinator_1.inits)([(0, combi
5517
5511
  Object.defineProperty(exports, "__esModule", ({
5518
5512
  value: true
5519
5513
  }));
5520
- exports.table = exports.segment_ = exports.segment = void 0;
5514
+ exports.table = void 0;
5521
5515
  const parser_1 = __webpack_require__(3360);
5522
5516
  const combinator_1 = __webpack_require__(3484);
5523
5517
  const inline_1 = __webpack_require__(7973);
@@ -5528,15 +5522,13 @@ const alias_1 = __webpack_require__(5413);
5528
5522
  const array_1 = __webpack_require__(6876);
5529
5523
  const dom_1 = __webpack_require__(394);
5530
5524
  const opener = /(~{3,})table(?:\/(\S+))?(?!\S)([^\r\n]*)(?:$|\r?\n)/y;
5531
- exports.segment = (0, combinator_1.block)((0, combinator_1.fence)(opener, false));
5532
- exports.segment_ = (0, combinator_1.block)((0, combinator_1.fence)(opener, false, false), false);
5533
5525
  exports.table = (0, combinator_1.block)((0, combinator_1.inits)([(0, combinator_1.fence)(opener, true), (_, output) => {
5534
5526
  const [body, overflow, closer, opener, delim, type, param] = (0, util_1.unwrap)(output.pop());
5535
5527
  if (!closer || overflow || param.trimStart()) return output.append(new parser_1.Node((0, dom_1.html)('pre', {
5536
5528
  class: 'invalid',
5537
5529
  translate: 'no',
5538
5530
  ...(0, util_1.invalid)('table', !closer || overflow ? 'fence' : 'argument', !closer ? `Missing the closing delimiter "${delim}"` : overflow ? `Invalid trailing line after the closing delimiter "${delim}"` : 'Invalid argument')
5539
- }, `${opener}${body}${overflow || closer}`)));
5531
+ }, `${opener}${body}${closer}${overflow}`)));
5540
5532
  switch (type) {
5541
5533
  case undefined:
5542
5534
  case 'grid':
@@ -5888,7 +5880,7 @@ exports.mathblock = (0, combinator_1.block)((0, combinator_1.inits)([(0, combina
5888
5880
  class: 'invalid',
5889
5881
  translate: 'no',
5890
5882
  ...(0, util_1.invalid)('mathblock', delim.length > 2 ? 'syntax' : !closer || overflow ? 'fence' : 'argument', delim.length > 2 ? 'Invalid syntax' : !closer ? `Missing the closing delimiter "${delim}"` : overflow ? `Invalid trailing line after the closing delimiter "${delim}"` : 'Invalid argument')
5891
- }, `${opener}${body}${overflow || closer}`)));
5883
+ }, `${opener}${body}${closer}${overflow}`)));
5892
5884
  }]));
5893
5885
 
5894
5886
  /***/ },
package/index.d.ts CHANGED
@@ -44,7 +44,7 @@ export type Progress =
44
44
  | { readonly type: 'block'; readonly value: HTMLElement; }
45
45
  | { readonly type: 'figure'; readonly value: HTMLAnchorElement; }
46
46
  | { readonly type: 'note'; readonly value: HTMLLIElement | HTMLElement; }
47
- | { readonly type: 'break'; }
47
+ | { readonly type: 'break'; readonly value: 'segment' | 'block' | 'parser' | 'figure' | 'note'; }
48
48
  | { readonly type: 'cancel'; };
49
49
 
50
50
  export interface RenderingOptions {
package/markdown.d.ts CHANGED
@@ -325,7 +325,6 @@ export namespace MarkdownParser {
325
325
  Parser<string, Input, [
326
326
  FigParser.SegmentParser,
327
327
  FigureParser.SegmentParser,
328
- TableParser.SegmentParser,
329
328
  PlaceholderParser.SegmentParser,
330
329
  ]> {
331
330
  }
@@ -350,8 +349,8 @@ export namespace MarkdownParser {
350
349
  MathBlockParser,
351
350
  ExampleParser,
352
351
  TableParser,
353
- BlockquoteParser,
354
352
  PlaceholderParser,
353
+ BlockquoteParser,
355
354
  InlineParser.MediaParser,
356
355
  InlineParser.ShortMediaParser.LineShortMediaParser,
357
356
  ]>,
@@ -369,9 +368,8 @@ export namespace MarkdownParser {
369
368
  Parser<never, Input, [
370
369
  CodeBlockParser.SegmentParser,
371
370
  MathBlockParser.SegmentParser,
372
- TableParser.SegmentParser,
373
- BlockquoteParser.SegmentParser,
374
371
  PlaceholderParser.SegmentParser,
372
+ BlockquoteParser.SegmentParser,
375
373
  SourceParser.ContentLineParser,
376
374
  ]>,
377
375
  SourceParser.EmptyLineParser,
@@ -399,9 +397,8 @@ export namespace MarkdownParser {
399
397
  Parser<never, Input, [
400
398
  CodeBlockParser.SegmentParser,
401
399
  MathBlockParser.SegmentParser,
402
- TableParser.SegmentParser,
403
- BlockquoteParser.SegmentParser,
404
400
  PlaceholderParser.SegmentParser,
401
+ BlockquoteParser.SegmentParser,
405
402
  SourceParser.ContentLineParser,
406
403
  ]>,
407
404
  ]> {
@@ -427,10 +424,6 @@ export namespace MarkdownParser {
427
424
  ]> {
428
425
  }
429
426
  export namespace TableParser {
430
- export interface SegmentParser extends
431
- Block<'extension/table/segment'>,
432
- Parser<never, Input, []> {
433
- }
434
427
  export interface GridTableParser extends
435
428
  Block<'extension/table/gridtable'>,
436
429
  Parser<HTMLElement, Input, [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "securemark",
3
- "version": "0.300.1",
3
+ "version": "0.300.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",
package/src/api/bind.ts CHANGED
@@ -75,7 +75,7 @@ export function bind(target: DocumentFragment | HTMLElement | ShadowRoot, settin
75
75
  const seg = sourceSegments[index];
76
76
  options.segment = sourceSegmentAttrs[index] | Segment.write;
77
77
  for (const _ of run(block, new Input(options, seg), output)) {
78
- yield { type: 'break' };
78
+ yield { type: 'break', value: 'block' };
79
79
  }
80
80
  assert(output.data.length === 1);
81
81
  const es = output.pop()
@@ -124,20 +124,20 @@ export function bind(target: DocumentFragment | HTMLElement | ShadowRoot, settin
124
124
  yield { type: 'block', value: el };
125
125
  if (rev !== revision) return yield { type: 'cancel' };
126
126
  }
127
- yield { type: 'break' };
127
+ yield { type: 'break', value: 'parser' };
128
128
  if (rev !== revision) return yield { type: 'cancel' };
129
129
  for (const el of figure(next(0)?.parentNode ?? target, settings.notes, options)) {
130
130
  assert(rev === revision);
131
131
  el
132
132
  ? yield { type: 'figure', value: el }
133
- : yield { type: 'break' };
133
+ : yield { type: 'break', value: 'figure' };
134
134
  if (rev !== revision) return yield { type: 'cancel' };
135
135
  }
136
136
  for (const el of note(next(0)?.parentNode ?? target, settings.notes, options, bottom)) {
137
137
  assert(rev === revision);
138
138
  el
139
139
  ? yield { type: 'note', value: el }
140
- : yield { type: 'break' };
140
+ : yield { type: 'break', value: 'note' };
141
141
  if (rev !== revision) return yield { type: 'cancel' };
142
142
  }
143
143
  }
@@ -5,12 +5,12 @@ import { firstline, isEmptyline } from './line';
5
5
  export function fence<I extends Input, S extends SubParsers<never, I>>(opener: RegExp, write: boolean, separation = true): Parser<string, I, S> {
6
6
  assert(!opener.flags.match(/[gm]/) && opener.sticky && !opener.source.startsWith('^'));
7
7
  return (input, output) => {
8
- const { source, position } = input;
9
- if (position === source.length) return;
10
- opener.lastIndex = position;
8
+ const { source } = input;
9
+ if (input.position === source.length) return;
10
+ opener.lastIndex = input.position;
11
11
  const matches = opener.exec(source);
12
12
  if (!matches) return;
13
- assert(matches[0] === firstline(source, position));
13
+ assert(matches[0] === firstline(source, input.position));
14
14
  spend(input, output, matches[0].length);
15
15
  const delim = matches[1];
16
16
  assert(delim && delim === delim.trim());
@@ -23,37 +23,27 @@ export function fence<I extends Input, S extends SubParsers<never, I>>(opener: R
23
23
  input.position -= matches[0].length;
24
24
  return;
25
25
  }
26
+ const { position } = input;
26
27
  let body = '';
27
28
  let closer = '';
28
- let overflow = '';
29
- for (let count = 1; ; ++count) {
30
- if (input.position === source.length) break;
31
- const line = firstline(source, input.position);
32
- if (closer && isEmptyline(line, 0)) break;
33
- if(closer) {
34
- overflow += line;
35
- }
36
- if (!closer && line.startsWith(delim) && line.trimEnd() === delim) {
37
- closer = line;
38
- if (isEmptyline(source, input.position + line.length)) {
39
- input.position += line.length;
40
- break;
41
- }
42
- if (!separation) {
43
- input.position += line.length;
44
- break;
45
- }
46
- assert(!overflow);
47
- overflow = line;
48
- }
49
- if (!overflow) {
50
- body += line;
51
- }
52
- input.position += line.length;
29
+ assert(matches[0].endsWith('\n'));
30
+ for (input.position -= 1; ;) {
31
+ input.position = source.indexOf(`\n${delim}`, input.position) + 1 || source.length;
32
+ if (!isEmptyline(source, input.position + delim.length)) continue;
33
+ body = source.slice(position, input.position);
34
+ closer = firstline(source, input.position);
35
+ input.position += closer.length;
36
+ break;
37
+ }
38
+ if (separation) for (; !isEmptyline(source, input.position);) {
39
+ input.position = source.indexOf('\n', input.position) + 1 || source.length;
40
+ }
41
+ if (write) {
42
+ const overflow = source.slice(position + body.length + closer.length, input.position);
43
+ output.push(
44
+ new List([body, overflow, closer].map(str => new Node(str)))
45
+ .import(new List(matches.map(str => new Node(str)))));
53
46
  }
54
- write && output.push(
55
- new List([body, overflow, closer].map(str => new Node(str)))
56
- .import(new List(matches.map(str => new Node(str)))));
57
47
  return output.context;
58
48
  };
59
49
  }
@@ -49,7 +49,7 @@ export function firstline(source: string, position: number): string {
49
49
  const emptyline = /[^\S\r\n]*(?:$|\r?\n)/y;
50
50
  export function isEmptyline(source: string, position: number): boolean {
51
51
  emptyline.lastIndex = position;
52
- return source.length === position
52
+ return position >= source.length
53
53
  || source[position] === '\n'
54
54
  || emptyline.test(source);
55
55
  }
@@ -64,7 +64,7 @@ export const codeblock: CodeBlockParser = block(inits([
64
64
  ? `Invalid trailing line after the closing delimiter "${delim}"`
65
65
  : params.invalid!),
66
66
  },
67
- `${opener}${body}${overflow || closer}`)));
67
+ `${opener}${body}${closer}${overflow}`)));
68
68
  return;
69
69
  }
70
70
  const src = body.slice(0, body.at(-2) === '\r' ? -2 : -1);
@@ -30,7 +30,7 @@ export const aside: ExtensionParser.AsideParser = block(recursion(Recursion.bloc
30
30
  overflow ? `Invalid trailing line after the closing delimiter "${delim}"` :
31
31
  'Invalid argument'),
32
32
  },
33
- `${opener}${body}${overflow || closer}`)));
33
+ `${opener}${body}${closer}${overflow}`)));
34
34
  return;
35
35
  }
36
36
  input.memory = {
@@ -27,7 +27,7 @@ export const example: ExtensionParser.ExampleParser = block(recursion(Recursion.
27
27
  overflow ? `Invalid trailing line after the closing delimiter "${delim}"` :
28
28
  'Invalid argument'),
29
29
  },
30
- `${opener}${body}${overflow || closer}`)));
30
+ `${opener}${body}${closer}${overflow}`)));
31
31
  switch (type) {
32
32
  case 'markdown': {
33
33
  input.memory = {
@@ -1,30 +1,28 @@
1
1
  import { ExtensionParser } from '../../block';
2
2
  import { Segment } from '../../context';
3
3
  import { Result } from '../../../combinator/parser';
4
- import { union, sequence, some, always, backtrack, block, line, rewrite, close } from '../../../combinator';
4
+ import { union, sequence, some, always, block, line, rewrite, close } from '../../../combinator';
5
5
  import { contentline } from '../../source';
6
6
  import { figure } from './figure';
7
7
  import { segment as seg_label } from '../../inline/extension/label';
8
8
  import { segment as seg_code } from '../codeblock';
9
9
  import { segment as seg_math } from '../mathblock';
10
- import { segment as seg_table } from './table';
11
- import { segment as seg_blockquote } from '../blockquote';
12
10
  import { segment as seg_placeholder } from './placeholder';
11
+ import { segment as seg_blockquote } from '../blockquote';
13
12
 
14
13
  import FigParser = ExtensionParser.FigParser;
15
14
 
16
- export const segment: FigParser.SegmentParser = backtrack(block(
15
+ export const segment: FigParser.SegmentParser = block(
17
16
  sequence([
18
17
  line(close(seg_label, /(?!\S)[^\r\n]*\r?\n/y), false),
19
18
  union([
20
19
  seg_code,
21
20
  seg_math,
22
- seg_table,
23
- seg_blockquote,
24
21
  seg_placeholder,
22
+ seg_blockquote,
25
23
  some(contentline),
26
24
  ]),
27
- ]), true, Segment.fig));
25
+ ]), true, Segment.fig);
28
26
 
29
27
  export const fig: FigParser = block(rewrite(segment, always([
30
28
  (input, output) => {
@@ -10,9 +10,9 @@ import { table as styled_table } from '../table';
10
10
  import { codeblock, segment_ as seg_code } from '../codeblock';
11
11
  import { mathblock, segment_ as seg_math } from '../mathblock';
12
12
  import { example } from './example';
13
- import { table, segment_ as seg_table } from './table';
14
- import { blockquote, segment as seg_blockquote } from '../blockquote';
13
+ import { table } from './table';
15
14
  import { placeholder, segment_ as seg_placeholder } from './placeholder';
15
+ import { blockquote, segment as seg_blockquote } from '../blockquote';
16
16
  import { inline, media, lineshortmedia } from '../../inline';
17
17
  import { visualize, trimBlank } from '../../visibility';
18
18
  import { unwrap, invalid } from '../../util';
@@ -32,9 +32,8 @@ export const segment: FigureParser.SegmentParser = block(match(
32
32
  union([
33
33
  seg_code,
34
34
  seg_math,
35
- seg_table,
36
- seg_blockquote,
37
35
  seg_placeholder,
36
+ seg_blockquote,
38
37
  some(contentline, closer),
39
38
  ]),
40
39
  emptyline,
@@ -60,8 +59,8 @@ export const figure: FigureParser = block(fallback(rewrite(segment, fmap(
60
59
  mathblock,
61
60
  example,
62
61
  table,
63
- blockquote,
64
62
  placeholder,
63
+ blockquote,
65
64
  line(media, false),
66
65
  line(lineshortmedia, false),
67
66
  ])),
@@ -115,7 +114,7 @@ export const figure: FigureParser = block(fallback(rewrite(segment, fmap(
115
114
  translate: 'no',
116
115
  ...invalid('figure', violation[0], violation[1]),
117
116
  },
118
- `${opener}${body}${overflow || closer}`)));
117
+ `${opener}${body}${closer}${overflow}`)));
119
118
  },
120
119
  ])));
121
120
 
@@ -36,7 +36,7 @@ export const message: MessageParser = block(inits([
36
36
  overflow ? `Invalid trailing line after the closing delimiter "${delim}"` :
37
37
  'Invalid argument'),
38
38
  },
39
- `${opener}${body}${overflow || closer}`)));
39
+ `${opener}${body}${closer}${overflow}`)));
40
40
  return;
41
41
  }
42
42
  switch (type) {
@@ -28,6 +28,6 @@ export const placeholder: ExtensionParser.PlaceholderParser = block(inits([
28
28
  overflow ? `Invalid trailing line after the closing delimiter "${delim}"` :
29
29
  'Invalid argument'),
30
30
  },
31
- `${opener}${body}${overflow || closer}`)));
31
+ `${opener}${body}${closer}${overflow}`)));
32
32
  },
33
33
  ]));
@@ -17,12 +17,6 @@ import CellParser = TableParser.CellParser;
17
17
 
18
18
  const opener = /(~{3,})table(?:\/(\S+))?(?!\S)([^\r\n]*)(?:$|\r?\n)/y;
19
19
 
20
- export const segment: TableParser.SegmentParser = block(
21
- fence(opener, false));
22
-
23
- export const segment_: TableParser.SegmentParser = block(
24
- fence(opener, false, false), false);
25
-
26
20
  export const table: TableParser = block(inits([
27
21
  fence(opener, true),
28
22
  (_, output) => {
@@ -37,7 +31,7 @@ export const table: TableParser = block(inits([
37
31
  !closer ? `Missing the closing delimiter "${delim}"` :
38
32
  overflow ? `Invalid trailing line after the closing delimiter "${delim}"` :
39
33
  'Invalid argument'),
40
- }, `${opener}${body}${overflow || closer}`)));
34
+ }, `${opener}${body}${closer}${overflow}`)));
41
35
  switch (type) {
42
36
  case undefined:
43
37
  case 'grid':
@@ -2,7 +2,7 @@ import { ExtensionParser } from '../block';
2
2
  import { union, lazy } from '../../combinator';
3
3
  import { segment as seg_fig } from './extension/fig';
4
4
  import { figure, segment as seg_figure } from './extension/figure';
5
- import { table, segment as seg_table } from './extension/table';
5
+ import { table } from './extension/table';
6
6
  import { message } from './extension/message';
7
7
  import { aside } from './extension/aside';
8
8
  import { example } from './extension/example';
@@ -11,7 +11,6 @@ import { placeholder, segment as seg_placeholder } from './extension/placeholder
11
11
  export const segment: ExtensionParser.SegmentParser = union([
12
12
  seg_fig,
13
13
  seg_figure,
14
- seg_table,
15
14
  seg_placeholder,
16
15
  ]);
17
16
 
@@ -32,6 +32,6 @@ export const mathblock: MathBlockParser = block(inits([
32
32
  overflow ? `Invalid trailing line after the closing delimiter "${delim}"` :
33
33
  'Invalid argument'),
34
34
  },
35
- `${opener}${body}${overflow || closer}`)));
35
+ `${opener}${body}${closer}${overflow}`)));
36
36
  },
37
37
  ]));