@fuzdev/mdz 0.3.0 → 0.5.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.
Files changed (81) hide show
  1. package/LICENSE +10 -17
  2. package/README.md +6 -3
  3. package/dist/Mdz.svelte +8 -7
  4. package/dist/Mdz.svelte.d.ts.map +1 -1
  5. package/dist/MdzNodeView.svelte +74 -30
  6. package/dist/MdzNodeView.svelte.d.ts +1 -2
  7. package/dist/MdzNodeView.svelte.d.ts.map +1 -1
  8. package/dist/MdzPrecompiled.svelte +3 -3
  9. package/dist/MdzPrecompiled.svelte.d.ts.map +1 -1
  10. package/dist/MdzRoot.svelte +3 -3
  11. package/dist/MdzRoot.svelte.d.ts.map +1 -1
  12. package/dist/MdzStream.svelte +3 -3
  13. package/dist/MdzStream.svelte.d.ts.map +1 -1
  14. package/dist/MdzStreamNodeView.svelte +79 -31
  15. package/dist/MdzStreamNodeView.svelte.d.ts +1 -2
  16. package/dist/MdzStreamNodeView.svelte.d.ts.map +1 -1
  17. package/dist/context_helpers.js +1 -1
  18. package/dist/mdz.d.ts +12 -1
  19. package/dist/mdz.d.ts.map +1 -1
  20. package/dist/mdz.js +1 -1
  21. package/dist/mdz_contexts.d.ts +33 -6
  22. package/dist/mdz_contexts.d.ts.map +1 -1
  23. package/dist/mdz_debug_work.d.ts.map +1 -1
  24. package/dist/mdz_helpers.d.ts +31 -3
  25. package/dist/mdz_helpers.d.ts.map +1 -1
  26. package/dist/mdz_helpers.js +104 -12
  27. package/dist/mdz_lexer.d.ts +3 -1
  28. package/dist/mdz_lexer.d.ts.map +1 -1
  29. package/dist/mdz_lexer.js +115 -31
  30. package/dist/mdz_opcodes.d.ts +3 -1
  31. package/dist/mdz_opcodes.d.ts.map +1 -1
  32. package/dist/mdz_opcodes_to_nodes.d.ts.map +1 -1
  33. package/dist/mdz_opcodes_to_nodes.js +25 -17
  34. package/dist/mdz_stream_parser.d.ts.map +1 -1
  35. package/dist/mdz_stream_parser.js +8 -8
  36. package/dist/mdz_stream_parser_block.js +5 -5
  37. package/dist/mdz_stream_parser_inline.js +4 -4
  38. package/dist/mdz_stream_parser_link.d.ts.map +1 -1
  39. package/dist/mdz_stream_parser_link.js +83 -11
  40. package/dist/mdz_stream_parser_list.d.ts.map +1 -1
  41. package/dist/mdz_stream_parser_list.js +13 -7
  42. package/dist/mdz_stream_parser_state.d.ts.map +1 -1
  43. package/dist/mdz_stream_parser_state.js +7 -7
  44. package/dist/mdz_stream_parser_table.d.ts.map +1 -1
  45. package/dist/mdz_stream_parser_table.js +16 -9
  46. package/dist/mdz_stream_parser_text.js +2 -2
  47. package/dist/mdz_stream_parser_url.js +7 -7
  48. package/dist/mdz_stream_state.svelte.d.ts +3 -1
  49. package/dist/mdz_stream_state.svelte.d.ts.map +1 -1
  50. package/dist/mdz_stream_state.svelte.js +4 -0
  51. package/dist/mdz_to_svelte.d.ts +17 -4
  52. package/dist/mdz_to_svelte.d.ts.map +1 -1
  53. package/dist/mdz_to_svelte.js +22 -9
  54. package/dist/mdz_token_parser.d.ts.map +1 -1
  55. package/dist/mdz_token_parser.js +25 -11
  56. package/dist/svelte_preprocess_mdz.d.ts +6 -3
  57. package/dist/svelte_preprocess_mdz.d.ts.map +1 -1
  58. package/dist/svelte_preprocess_mdz.js +11 -11
  59. package/package.json +25 -40
  60. package/src/lib/context_helpers.ts +2 -2
  61. package/src/lib/mdz.ts +15 -3
  62. package/src/lib/mdz_contexts.ts +41 -11
  63. package/src/lib/mdz_debug_work.ts +1 -1
  64. package/src/lib/mdz_helpers.ts +164 -43
  65. package/src/lib/mdz_lexer.ts +173 -80
  66. package/src/lib/mdz_opcodes.ts +3 -1
  67. package/src/lib/mdz_opcodes_to_nodes.ts +40 -30
  68. package/src/lib/mdz_stream_parser.ts +17 -17
  69. package/src/lib/mdz_stream_parser_block.ts +14 -14
  70. package/src/lib/mdz_stream_parser_inline.ts +18 -18
  71. package/src/lib/mdz_stream_parser_link.ts +88 -18
  72. package/src/lib/mdz_stream_parser_list.ts +31 -25
  73. package/src/lib/mdz_stream_parser_state.ts +27 -27
  74. package/src/lib/mdz_stream_parser_table.ts +38 -31
  75. package/src/lib/mdz_stream_parser_text.ts +3 -3
  76. package/src/lib/mdz_stream_parser_url.ts +11 -11
  77. package/src/lib/mdz_stream_state.svelte.ts +11 -8
  78. package/src/lib/mdz_to_svelte.ts +71 -27
  79. package/src/lib/mdz_token_parser.ts +52 -38
  80. package/src/lib/svelte_preprocess_mdz.ts +66 -60
  81. package/src/lib/tsdoc_mdz.ts +1 -1
@@ -17,9 +17,10 @@
17
17
  * @module
18
18
  */
19
19
 
20
- import {DEV} from 'esm-env';
20
+ import { DEV } from 'esm-env';
21
21
 
22
22
  import type {
23
+ MdzAttribute,
23
24
  MdzNode,
24
25
  MdzNodeText,
25
26
  MdzNodeLink,
@@ -28,10 +29,10 @@ import type {
28
29
  MdzNodeListItem,
29
30
  MdzNodeTableRow,
30
31
  MdzNodeTableCell,
31
- MdzTableAlign,
32
+ MdzTableAlign
32
33
  } from './mdz.ts';
33
- import type {MdzOpcode, MdzNodeId} from './mdz_opcodes.ts';
34
- import {mdz_extract_single_tag, mdz_heading_id, mdz_merge_adjacent_text} from './mdz_helpers.ts';
34
+ import type { MdzOpcode, MdzNodeId } from './mdz_opcodes.ts';
35
+ import { mdz_extract_single_tag, mdz_heading_id, mdz_merge_adjacent_text } from './mdz_helpers.ts';
35
36
 
36
37
  interface StackFrame {
37
38
  id: MdzNodeId;
@@ -42,6 +43,7 @@ interface StackFrame {
42
43
  // metadata from open opcode
43
44
  level?: number;
44
45
  name?: string;
46
+ attributes?: Array<MdzAttribute>;
45
47
  lang?: string | null;
46
48
  ordered?: boolean;
47
49
  start_number?: number;
@@ -77,12 +79,13 @@ export const mdz_opcodes_to_nodes = (opcodes: Array<MdzOpcode>): Array<MdzNode>
77
79
  start: op.start,
78
80
  level: op.level,
79
81
  name: op.name,
82
+ attributes: op.attributes,
80
83
  lang: op.lang,
81
84
  ordered: op.ordered,
82
85
  start_number: op.start_number,
83
86
  number: op.number,
84
87
  align: op.align,
85
- header: op.header,
88
+ header: op.header
86
89
  });
87
90
  break;
88
91
  }
@@ -115,8 +118,8 @@ export const mdz_opcodes_to_nodes = (opcodes: Array<MdzOpcode>): Array<MdzNode>
115
118
  case 'text': {
116
119
  const node: MdzNodeText | MdzNodeCode =
117
120
  op.text_type === 'Code'
118
- ? {type: 'Code', content: op.content, start: op.start, end: op.end}
119
- : {type: 'Text', content: op.content, start: op.start, end: op.end};
121
+ ? { type: 'Code', content: op.content, start: op.start, end: op.end }
122
+ : { type: 'Text', content: op.content, start: op.start, end: op.end };
120
123
  text_nodes.set(op.id, node);
121
124
  children.push(node);
122
125
  break;
@@ -160,7 +163,7 @@ export const mdz_opcodes_to_nodes = (opcodes: Array<MdzOpcode>): Array<MdzNode>
160
163
  }
161
164
 
162
165
  case 'void': {
163
- children.push({type: 'Hr', start: op.start, end: op.end});
166
+ children.push({ type: 'Hr', start: op.start, end: op.end });
164
167
  break;
165
168
  }
166
169
 
@@ -224,7 +227,7 @@ export const mdz_opcodes_to_nodes = (opcodes: Array<MdzOpcode>): Array<MdzNode>
224
227
  type: 'Text',
225
228
  content: trimmed_content,
226
229
  start: text_node.end,
227
- end: text_node.end + trimmed_content.length,
230
+ end: text_node.end + trimmed_content.length
228
231
  };
229
232
  text_nodes.set(op.trim_id, trimmed_node);
230
233
  }
@@ -236,7 +239,7 @@ export const mdz_opcodes_to_nodes = (opcodes: Array<MdzOpcode>): Array<MdzNode>
236
239
  children: [text_node],
237
240
  link_type: op.link_type,
238
241
  start: op.start,
239
- end: op.end,
242
+ end: op.end
240
243
  };
241
244
 
242
245
  // replace text node with [Link, trimmed?] in the buffer
@@ -278,7 +281,7 @@ const insert_replacement = (
278
281
  stack: Array<StackFrame>,
279
282
  reverted_idx: number,
280
283
  at: number,
281
- op: {replacement_text?: string; start: number},
284
+ op: { replacement_text?: string; start: number }
282
285
  ): void => {
283
286
  const text = op.replacement_text!;
284
287
  const parent_start = reverted_idx > 0 ? stack[reverted_idx - 1]!.children_start : 0;
@@ -303,7 +306,12 @@ const insert_replacement = (
303
306
  }
304
307
  }
305
308
  // 3. standalone Text node
306
- const node: MdzNode = {type: 'Text', content: text, start: op.start, end: op.start + text.length};
309
+ const node: MdzNode = {
310
+ type: 'Text',
311
+ content: text,
312
+ start: op.start,
313
+ end: op.start + text.length
314
+ };
307
315
  if (at >= children.length) {
308
316
  children.push(node);
309
317
  } else {
@@ -337,7 +345,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
337
345
  type: 'Paragraph',
338
346
  children,
339
347
  start: children[0]!.start,
340
- end: children[children.length - 1]!.end,
348
+ end: children[children.length - 1]!.end
341
349
  };
342
350
  }
343
351
 
@@ -350,7 +358,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
350
358
  id,
351
359
  children,
352
360
  start: frame.start,
353
- end: frame.end!,
361
+ end: frame.end!
354
362
  } as MdzNodeHeading;
355
363
  }
356
364
 
@@ -359,7 +367,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
359
367
  type: 'Bold',
360
368
  children: mdz_merge_adjacent_text(frame_children),
361
369
  start: frame.start,
362
- end: frame.end!,
370
+ end: frame.end!
363
371
  };
364
372
 
365
373
  case 'Italic':
@@ -367,7 +375,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
367
375
  type: 'Italic',
368
376
  children: mdz_merge_adjacent_text(frame_children),
369
377
  start: frame.start,
370
- end: frame.end!,
378
+ end: frame.end!
371
379
  };
372
380
 
373
381
  case 'Strikethrough':
@@ -375,7 +383,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
375
383
  type: 'Strikethrough',
376
384
  children: mdz_merge_adjacent_text(frame_children),
377
385
  start: frame.start,
378
- end: frame.end!,
386
+ end: frame.end!
379
387
  };
380
388
 
381
389
  case 'Link':
@@ -385,7 +393,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
385
393
  children: mdz_merge_adjacent_text(frame_children),
386
394
  link_type: frame.link_type ?? 'internal',
387
395
  start: frame.start,
388
- end: frame.end!,
396
+ end: frame.end!
389
397
  };
390
398
 
391
399
  case 'List': {
@@ -400,10 +408,10 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
400
408
  start_number: frame.start_number ?? 1,
401
409
  children,
402
410
  start: frame.start,
403
- end,
411
+ end
404
412
  };
405
413
  }
406
- return {type: 'List', ordered: false, children, start: frame.start, end};
414
+ return { type: 'List', ordered: false, children, start: frame.start, end };
407
415
  }
408
416
 
409
417
  case 'ListItem': {
@@ -411,9 +419,9 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
411
419
  // childless means an empty item — its close carried the marker end
412
420
  const end = children.length > 0 ? children[children.length - 1]!.end : frame.end!;
413
421
  if (frame.number !== undefined) {
414
- return {type: 'ListItem', number: frame.number, children, start: frame.start, end};
422
+ return { type: 'ListItem', number: frame.number, children, start: frame.start, end };
415
423
  }
416
- return {type: 'ListItem', children, start: frame.start, end};
424
+ return { type: 'ListItem', children, start: frame.start, end };
417
425
  }
418
426
 
419
427
  case 'Blockquote': {
@@ -421,7 +429,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
421
429
  // sync token parser (the close offset is cosmetic)
422
430
  const end =
423
431
  frame_children.length > 0 ? frame_children[frame_children.length - 1]!.end : frame.end!;
424
- return {type: 'Blockquote', children: frame_children, start: frame.start, end};
432
+ return { type: 'Blockquote', children: frame_children, start: frame.start, end };
425
433
  }
426
434
 
427
435
  case 'Table': {
@@ -429,7 +437,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
429
437
  // the sync token parser
430
438
  const children = frame_children as Array<MdzNodeTableRow>;
431
439
  const end = children.length > 0 ? children[children.length - 1]!.end : frame.end!;
432
- return {type: 'Table', align: frame.align ?? [], children, start: frame.start, end};
440
+ return { type: 'Table', align: frame.align ?? [], children, start: frame.start, end };
433
441
  }
434
442
 
435
443
  case 'TableRow': {
@@ -439,7 +447,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
439
447
  header: frame.header ?? false,
440
448
  children,
441
449
  start: frame.start,
442
- end: frame.end!,
450
+ end: frame.end!
443
451
  };
444
452
  }
445
453
 
@@ -448,7 +456,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
448
456
  type: 'TableCell',
449
457
  children: mdz_merge_adjacent_text(frame_children),
450
458
  start: frame.start,
451
- end: frame.end!,
459
+ end: frame.end!
452
460
  };
453
461
 
454
462
  case 'Code': {
@@ -461,7 +469,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
461
469
  type: 'Code',
462
470
  content,
463
471
  start: frame.start,
464
- end: frame.end!,
472
+ end: frame.end!
465
473
  };
466
474
  }
467
475
 
@@ -476,7 +484,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
476
484
  lang: frame.lang ?? null,
477
485
  content,
478
486
  start: frame.start,
479
- end: frame.end!,
487
+ end: frame.end!
480
488
  };
481
489
  }
482
490
 
@@ -484,18 +492,20 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
484
492
  return {
485
493
  type: 'Element',
486
494
  name: frame.name ?? '',
495
+ attributes: frame.attributes ?? [],
487
496
  children: mdz_merge_adjacent_text(frame_children),
488
497
  start: frame.start,
489
- end: frame.end!,
498
+ end: frame.end!
490
499
  };
491
500
 
492
501
  case 'Component':
493
502
  return {
494
503
  type: 'Component',
495
504
  name: frame.name ?? '',
505
+ attributes: frame.attributes ?? [],
496
506
  children: mdz_merge_adjacent_text(frame_children),
497
507
  start: frame.start,
498
- end: frame.end!,
508
+ end: frame.end!
499
509
  };
500
510
 
501
511
  default:
@@ -35,7 +35,7 @@
35
35
  * @module
36
36
  */
37
37
 
38
- import type {MdzOpcode} from './mdz_opcodes.ts';
38
+ import type { MdzOpcode } from './mdz_opcodes.ts';
39
39
  import {
40
40
  BACKTICK,
41
41
  ASTERISK,
@@ -61,7 +61,7 @@ import {
61
61
  mdz_match_blockquote_prefix,
62
62
  mdz_blockquote_line_has_content,
63
63
  mdz_blockquote_strip_width,
64
- mdz_remap_segments,
64
+ mdz_remap_segments
65
65
  } from './mdz_helpers.ts';
66
66
  import {
67
67
  type MdzStreamParserState,
@@ -80,7 +80,7 @@ import {
80
80
  offset,
81
81
  pop_stack_entry,
82
82
  push_stack_entry,
83
- revert_failed_close,
83
+ revert_failed_close
84
84
  } from './mdz_stream_parser_state.ts';
85
85
  import {
86
86
  process_codeblock,
@@ -88,23 +88,23 @@ import {
88
88
  process_codeblock_in_item,
89
89
  try_codeblock_open,
90
90
  try_heading,
91
- try_hr,
91
+ try_hr
92
92
  } from './mdz_stream_parser_block.ts';
93
- import {process_list_line, try_list_start} from './mdz_stream_parser_list.ts';
94
- import {close_table, process_table_line, try_table_start} from './mdz_stream_parser_table.ts';
93
+ import { process_list_line, try_list_start } from './mdz_stream_parser_list.ts';
94
+ import { close_table, process_table_line, try_table_start } from './mdz_stream_parser_table.ts';
95
95
  import {
96
96
  check_close_word_boundary,
97
97
  close_delimiter,
98
98
  process_code_content,
99
99
  try_code,
100
100
  try_double_delimiter,
101
- try_italic,
101
+ try_italic
102
102
  } from './mdz_stream_parser_inline.ts';
103
103
  import {
104
104
  try_close_tag,
105
105
  try_complete_link,
106
106
  try_link_open,
107
- try_tag_open,
107
+ try_tag_open
108
108
  } from './mdz_stream_parser_link.ts';
109
109
  import {
110
110
  complete_pending_url,
@@ -112,9 +112,9 @@ import {
112
112
  start_speculative_url,
113
113
  try_auto_path_absolute,
114
114
  try_auto_path_relative,
115
- try_auto_url_forced,
115
+ try_auto_url_forced
116
116
  } from './mdz_stream_parser_url.ts';
117
- import {consume_delimiter_as_text, consume_text_run} from './mdz_stream_parser_text.ts';
117
+ import { consume_delimiter_as_text, consume_text_run } from './mdz_stream_parser_text.ts';
118
118
 
119
119
  /**
120
120
  * Streaming opcode parser for mdz content.
@@ -277,7 +277,7 @@ const finish_state = (state: MdzStreamParserState): void => {
277
277
  const open_blockquote = (state: MdzStreamParserState, item_indent: number): void => {
278
278
  const id = alloc_id(state);
279
279
  const start = offset(state);
280
- emit(state, {type: 'open', id, node_type: 'Blockquote', start});
280
+ emit(state, { type: 'open', id, node_type: 'Blockquote', start });
281
281
  push_stack_entry(state, id, 'Blockquote', start);
282
282
  const inner = create_state();
283
283
  inner.next_id = state.next_id;
@@ -285,10 +285,10 @@ const open_blockquote = (state: MdzStreamParserState, item_indent: number): void
285
285
  state.blockquote = {
286
286
  id,
287
287
  inner,
288
- segments: [{inner_start: 0, source_start: offset(state, strip)}],
288
+ segments: [{ inner_start: 0, source_start: offset(state, strip) }],
289
289
  inner_len: 0,
290
290
  text_inner_ends: new Map(),
291
- item_indent,
291
+ item_indent
292
292
  };
293
293
  state.pos = strip;
294
294
  state.prev_char = SPACE;
@@ -315,7 +315,7 @@ const forward_inner_opcodes = (state: MdzStreamParserState): void => {
315
315
  const ops = blockquote.inner.opcodes;
316
316
  if (ops.length === 0) return;
317
317
  blockquote.inner.opcodes = [];
318
- const {segments, text_inner_ends} = blockquote;
318
+ const { segments, text_inner_ends } = blockquote;
319
319
  for (const op of ops) {
320
320
  switch (op.type) {
321
321
  case 'open':
@@ -367,7 +367,7 @@ const finish_blockquote = (state: MdzStreamParserState): void => {
367
367
  state.next_id = blockquote.inner.next_id;
368
368
  state.blockquote = null;
369
369
  const entry = pop_stack_entry(state);
370
- emit(state, {type: 'close', id: entry.id, end: offset(state)});
370
+ emit(state, { type: 'close', id: entry.id, end: offset(state) });
371
371
  state.active_text_id = null;
372
372
  };
373
373
 
@@ -400,7 +400,7 @@ const try_blockquote_start = (state: MdzStreamParserState, forced: boolean): Try
400
400
  */
401
401
  const process_blockquote = (state: MdzStreamParserState, forced: boolean): boolean => {
402
402
  const blockquote = state.blockquote!;
403
- const {buffer} = state;
403
+ const { buffer } = state;
404
404
  // mid-line: feed content through to the line's newline (or buffer end —
405
405
  // content streams as it arrives; `pos` is the fed watermark)
406
406
  if (state.pos < buffer.length && buffer.charCodeAt(state.pos) !== NEWLINE) {
@@ -441,7 +441,7 @@ const process_blockquote = (state: MdzStreamParserState, forced: boolean): boole
441
441
  const strip = first + mdz_blockquote_strip_width(buffer, first);
442
442
  blockquote.segments.push({
443
443
  inner_start: blockquote.inner_len,
444
- source_start: offset(state, strip),
444
+ source_start: offset(state, strip)
445
445
  });
446
446
  state.pos = strip;
447
447
  state.column = strip - line_start;
@@ -16,7 +16,7 @@ import {
16
16
  MIN_CODEBLOCK_BACKTICKS,
17
17
  NEWLINE,
18
18
  SPACE,
19
- is_line_whitespace,
19
+ is_line_whitespace
20
20
  } from './mdz_helpers.ts';
21
21
  import {
22
22
  type CodeblockState,
@@ -27,7 +27,7 @@ import {
27
27
  emit,
28
28
  flush_text,
29
29
  offset,
30
- push_stack_entry,
30
+ push_stack_entry
31
31
  } from './mdz_stream_parser_state.ts';
32
32
 
33
33
  /**
@@ -81,7 +81,7 @@ export const try_heading = (state: MdzStreamParserState): TryResult => {
81
81
  id,
82
82
  node_type: 'Heading',
83
83
  start: heading_start,
84
- level: hash_count as 1 | 2 | 3 | 4 | 5 | 6,
84
+ level: hash_count as 1 | 2 | 3 | 4 | 5 | 6
85
85
  });
86
86
  push_stack_entry(state, id, 'Heading', heading_start);
87
87
  state.in_heading = true;
@@ -131,7 +131,7 @@ export const try_hr = (state: MdzStreamParserState, forced = false): TryResult =
131
131
  id,
132
132
  node_type: 'Hr',
133
133
  start: offset(state, start),
134
- end: offset(state, i),
134
+ end: offset(state, i)
135
135
  });
136
136
  // `i` sits at the line's newline, or at the buffer end — in forced mode
137
137
  // always the buffer end (a newline would have resolved this line during
@@ -197,8 +197,8 @@ export const try_codeblock_open = (state: MdzStreamParserState): TryResult => {
197
197
 
198
198
  const id = alloc_id(state);
199
199
  const cb_start = offset(state, start);
200
- emit(state, {type: 'open', id, node_type: 'Codeblock', start: cb_start, lang});
201
- state.codeblock = {id, backtick_count, text_id: null, fence_indent: 0, start: cb_start};
200
+ emit(state, { type: 'open', id, node_type: 'Codeblock', start: cb_start, lang });
201
+ state.codeblock = { id, backtick_count, text_id: null, fence_indent: 0, start: cb_start };
202
202
  state.pos = i;
203
203
  state.column = 0;
204
204
  state.prev_char = NEWLINE;
@@ -217,10 +217,10 @@ export const emit_codeblock_text = (
217
217
  state: MdzStreamParserState,
218
218
  cb: CodeblockState,
219
219
  content: string,
220
- content_start: number,
220
+ content_start: number
221
221
  ): void => {
222
222
  if (cb.text_id !== null) {
223
- emit(state, {type: 'append_text', id: cb.text_id, content});
223
+ emit(state, { type: 'append_text', id: cb.text_id, content });
224
224
  } else {
225
225
  const id = alloc_id(state);
226
226
  const text_start = offset(state, content_start);
@@ -230,7 +230,7 @@ export const emit_codeblock_text = (
230
230
  content,
231
231
  text_type: 'Text',
232
232
  start: text_start,
233
- end: text_start + content.length,
233
+ end: text_start + content.length
234
234
  });
235
235
  cb.text_id = id;
236
236
  }
@@ -271,7 +271,7 @@ export const process_codeblock_forced = (state: MdzStreamParserState): void => {
271
271
  // whose hold retains at most a trailing newline plus a partial
272
272
  // fence line. So — like the non-forced path's `fence_match - 1` —
273
273
  // the close `end` excludes any line terminator
274
- emit(state, {type: 'close', id: cb.id, end: offset(state, fence_match)});
274
+ emit(state, { type: 'close', id: cb.id, end: offset(state, fence_match) });
275
275
  state.pos = fence_match;
276
276
  state.codeblock = null;
277
277
  return;
@@ -325,7 +325,7 @@ export const process_codeblock = (state: MdzStreamParserState): boolean => {
325
325
  }
326
326
 
327
327
  // codeblock end = position of newline after closing fence (exclusive)
328
- emit(state, {type: 'close', id: cb.id, end: offset(state, fence_match - 1)});
328
+ emit(state, { type: 'close', id: cb.id, end: offset(state, fence_match - 1) });
329
329
  state.pos = fence_match;
330
330
  state.codeblock = null;
331
331
  state.column = 0;
@@ -385,7 +385,7 @@ export const process_codeblock = (state: MdzStreamParserState): boolean => {
385
385
  */
386
386
  export const process_codeblock_in_item = (
387
387
  state: MdzStreamParserState,
388
- forced: boolean,
388
+ forced: boolean
389
389
  ): boolean => {
390
390
  const cb = state.codeblock!;
391
391
  while (state.pos < state.buffer.length) {
@@ -416,7 +416,7 @@ export const process_codeblock_in_item = (
416
416
  }
417
417
  if (m >= state.buffer.length && !forced) return false; // trailing content could disqualify
418
418
  if (m >= state.buffer.length || state.buffer.charCodeAt(m) === NEWLINE) {
419
- emit(state, {type: 'close', id: cb.id, end: offset(state, m)});
419
+ emit(state, { type: 'close', id: cb.id, end: offset(state, m) });
420
420
  state.codeblock = null;
421
421
  state.pos = m; // at the closer's newline (or EOF)
422
422
  state.column = m - line_start;
@@ -454,7 +454,7 @@ export const process_codeblock_in_item = (
454
454
  export const match_codeblock_close = (
455
455
  state: MdzStreamParserState,
456
456
  backtick_count: number,
457
- forced: boolean = false,
457
+ forced: boolean = false
458
458
  ): number => {
459
459
  let i = state.pos;
460
460
 
@@ -13,7 +13,7 @@ import {
13
13
  is_line_whitespace,
14
14
  is_word_char,
15
15
  mdz_blockquote_line_has_content,
16
- mdz_match_blockquote_prefix,
16
+ mdz_match_blockquote_prefix
17
17
  } from './mdz_helpers.ts';
18
18
  import {
19
19
  type MdzStreamParserState,
@@ -27,10 +27,10 @@ import {
27
27
  offset,
28
28
  pop_stack_entry,
29
29
  push_stack_entry,
30
- revert_above,
30
+ revert_above
31
31
  } from './mdz_stream_parser_state.ts';
32
- import {match_fence_opener, match_list_marker} from './mdz_stream_parser_list.ts';
33
- import {consume_delimiter_as_text} from './mdz_stream_parser_text.ts';
32
+ import { match_fence_opener, match_list_marker } from './mdz_stream_parser_list.ts';
33
+ import { consume_delimiter_as_text } from './mdz_stream_parser_text.ts';
34
34
 
35
35
  /**
36
36
  * Whether `buffer` contains a paragraph break — a newline followed (across
@@ -78,9 +78,9 @@ const has_run_boundary_between = (
78
78
  state: MdzStreamParserState,
79
79
  from: number,
80
80
  to: number,
81
- forced: boolean,
81
+ forced: boolean
82
82
  ): boolean => {
83
- const {buffer} = state;
83
+ const { buffer } = state;
84
84
  if (state.list_levels.length === 0) {
85
85
  return has_paragraph_break_between(buffer, from, to);
86
86
  }
@@ -149,7 +149,7 @@ export const try_double_delimiter = (
149
149
  state: MdzStreamParserState,
150
150
  delimiter: '**' | '~~',
151
151
  node_type: 'Bold' | 'Strikethrough',
152
- forced = false,
152
+ forced = false
153
153
  ): boolean => {
154
154
  // we know we're at the doubled delimiter (the caller checked both chars)
155
155
  // and there's no matching open container
@@ -170,7 +170,7 @@ export const try_double_delimiter = (
170
170
 
171
171
  const id = alloc_id(state);
172
172
  const start = offset(state);
173
- emit(state, {type: 'open', id, node_type, start});
173
+ emit(state, { type: 'open', id, node_type, start });
174
174
  push_stack_entry(state, id, node_type, start, delimiter);
175
175
  state.active_text_id = null;
176
176
  state.pos += 2;
@@ -221,7 +221,7 @@ export const try_italic = (state: MdzStreamParserState, forced = false): boolean
221
221
 
222
222
  const id = alloc_id(state);
223
223
  const start = offset(state);
224
- emit(state, {type: 'open', id, node_type: 'Italic', start});
224
+ emit(state, { type: 'open', id, node_type: 'Italic', start });
225
225
  push_stack_entry(state, id, 'Italic', start, '_');
226
226
  state.active_text_id = null;
227
227
  state.pos++;
@@ -267,18 +267,18 @@ export const close_delimiter = (state: MdzStreamParserState, stack_idx: number):
267
267
  // revert anything between the container and the top of the stack
268
268
  revert_above(state, stack_idx);
269
269
  const entry = pop_stack_entry(state);
270
- const {delimiter} = entry;
270
+ const { delimiter } = entry;
271
271
  // check for empty container — revert to literal text instead of closing
272
272
  if (!entry.has_children) {
273
273
  emit(state, {
274
274
  type: 'revert',
275
275
  id: entry.id,
276
276
  replacement_text: delimiter,
277
- start: entry.start,
277
+ start: entry.start
278
278
  });
279
279
  accumulate_text(state, delimiter, offset(state));
280
280
  } else {
281
- emit(state, {type: 'close', id: entry.id, end: offset(state) + delimiter.length});
281
+ emit(state, { type: 'close', id: entry.id, end: offset(state) + delimiter.length });
282
282
  }
283
283
  state.active_text_id = null;
284
284
  state.pos += delimiter.length;
@@ -312,7 +312,7 @@ export const close_delimiter = (state: MdzStreamParserState, stack_idx: number):
312
312
  */
313
313
  export const scan_closer_boundary = (
314
314
  state: MdzStreamParserState,
315
- forced = false,
315
+ forced = false
316
316
  ): 'confirmed' | 'rejected' | 'pending' => {
317
317
  const search_start = state.pos + 1;
318
318
  const buffer = state.buffer;
@@ -371,7 +371,7 @@ export const try_code = (state: MdzStreamParserState, forced = false): boolean =
371
371
  content,
372
372
  text_type: 'Code',
373
373
  start: offset(state, start),
374
- end: offset(state, terminator + 1),
374
+ end: offset(state, terminator + 1)
375
375
  });
376
376
  state.active_text_id = null;
377
377
  state.pos = terminator + 1;
@@ -417,7 +417,7 @@ export const try_code = (state: MdzStreamParserState, forced = false): boolean =
417
417
  ensure_paragraph(state);
418
418
  const id = alloc_id(state);
419
419
  const code_start = offset(state, start);
420
- emit(state, {type: 'open', id, node_type: 'Code', start: code_start});
420
+ emit(state, { type: 'open', id, node_type: 'Code', start: code_start });
421
421
  push_stack_entry(state, id, 'Code', code_start, '`');
422
422
  state.in_code = true;
423
423
  state.active_text_id = null;
@@ -493,10 +493,10 @@ export const process_code_content = (state: MdzStreamParserState): void => {
493
493
  const entry = pop_stack_entry(state);
494
494
  if (!entry.has_children) {
495
495
  // empty code `` — revert opener, accumulate closer as text
496
- emit(state, {type: 'revert', id: entry.id, replacement_text: '`', start: entry.start});
496
+ emit(state, { type: 'revert', id: entry.id, replacement_text: '`', start: entry.start });
497
497
  accumulate_text(state, '`', offset(state));
498
498
  } else {
499
- emit(state, {type: 'close', id: entry.id, end: offset(state) + 1});
499
+ emit(state, { type: 'close', id: entry.id, end: offset(state) + 1 });
500
500
  }
501
501
  state.in_code = false;
502
502
  state.active_text_id = null;
@@ -510,7 +510,7 @@ export const process_code_content = (state: MdzStreamParserState): void => {
510
510
  // code spans can't cross lines — revert
511
511
  flush_text(state);
512
512
  const entry = pop_stack_entry(state);
513
- emit(state, {type: 'revert', id: entry.id, replacement_text: '`', start: entry.start});
513
+ emit(state, { type: 'revert', id: entry.id, replacement_text: '`', start: entry.start });
514
514
  state.in_code = false;
515
515
  state.active_text_id = null;
516
516
  // don't consume newline — outer loop handles it