@fuzdev/mdz 0.3.0 → 0.4.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 (68) hide show
  1. package/README.md +4 -0
  2. package/dist/Mdz.svelte +8 -7
  3. package/dist/Mdz.svelte.d.ts.map +1 -1
  4. package/dist/MdzNodeView.svelte +20 -12
  5. package/dist/MdzNodeView.svelte.d.ts +1 -2
  6. package/dist/MdzNodeView.svelte.d.ts.map +1 -1
  7. package/dist/MdzPrecompiled.svelte +3 -3
  8. package/dist/MdzPrecompiled.svelte.d.ts.map +1 -1
  9. package/dist/MdzRoot.svelte +3 -3
  10. package/dist/MdzRoot.svelte.d.ts.map +1 -1
  11. package/dist/MdzStream.svelte +3 -3
  12. package/dist/MdzStream.svelte.d.ts.map +1 -1
  13. package/dist/MdzStreamNodeView.svelte +21 -13
  14. package/dist/MdzStreamNodeView.svelte.d.ts +1 -2
  15. package/dist/MdzStreamNodeView.svelte.d.ts.map +1 -1
  16. package/dist/context_helpers.js +1 -1
  17. package/dist/mdz_contexts.d.ts.map +1 -1
  18. package/dist/mdz_debug_work.d.ts.map +1 -1
  19. package/dist/mdz_helpers.d.ts.map +1 -1
  20. package/dist/mdz_helpers.js +2 -2
  21. package/dist/mdz_lexer.d.ts.map +1 -1
  22. package/dist/mdz_lexer.js +27 -17
  23. package/dist/mdz_opcodes.d.ts.map +1 -1
  24. package/dist/mdz_opcodes_to_nodes.d.ts.map +1 -1
  25. package/dist/mdz_opcodes_to_nodes.js +22 -17
  26. package/dist/mdz_stream_parser.d.ts.map +1 -1
  27. package/dist/mdz_stream_parser.js +8 -8
  28. package/dist/mdz_stream_parser_block.js +5 -5
  29. package/dist/mdz_stream_parser_inline.js +4 -4
  30. package/dist/mdz_stream_parser_link.js +3 -3
  31. package/dist/mdz_stream_parser_list.d.ts.map +1 -1
  32. package/dist/mdz_stream_parser_list.js +13 -7
  33. package/dist/mdz_stream_parser_state.d.ts.map +1 -1
  34. package/dist/mdz_stream_parser_state.js +7 -7
  35. package/dist/mdz_stream_parser_table.d.ts.map +1 -1
  36. package/dist/mdz_stream_parser_table.js +8 -8
  37. package/dist/mdz_stream_parser_text.js +2 -2
  38. package/dist/mdz_stream_parser_url.js +7 -7
  39. package/dist/mdz_stream_state.svelte.d.ts.map +1 -1
  40. package/dist/mdz_to_svelte.d.ts +1 -1
  41. package/dist/mdz_to_svelte.d.ts.map +1 -1
  42. package/dist/mdz_token_parser.js +9 -9
  43. package/dist/svelte_preprocess_mdz.d.ts +2 -2
  44. package/dist/svelte_preprocess_mdz.d.ts.map +1 -1
  45. package/dist/svelte_preprocess_mdz.js +11 -11
  46. package/package.json +24 -39
  47. package/src/lib/context_helpers.ts +2 -2
  48. package/src/lib/mdz.ts +2 -2
  49. package/src/lib/mdz_contexts.ts +5 -5
  50. package/src/lib/mdz_debug_work.ts +1 -1
  51. package/src/lib/mdz_helpers.ts +39 -33
  52. package/src/lib/mdz_lexer.ts +77 -67
  53. package/src/lib/mdz_opcodes.ts +1 -1
  54. package/src/lib/mdz_opcodes_to_nodes.ts +35 -30
  55. package/src/lib/mdz_stream_parser.ts +17 -17
  56. package/src/lib/mdz_stream_parser_block.ts +14 -14
  57. package/src/lib/mdz_stream_parser_inline.ts +18 -18
  58. package/src/lib/mdz_stream_parser_link.ts +13 -13
  59. package/src/lib/mdz_stream_parser_list.ts +31 -25
  60. package/src/lib/mdz_stream_parser_state.ts +27 -27
  61. package/src/lib/mdz_stream_parser_table.ts +31 -31
  62. package/src/lib/mdz_stream_parser_text.ts +3 -3
  63. package/src/lib/mdz_stream_parser_url.ts +11 -11
  64. package/src/lib/mdz_stream_state.svelte.ts +8 -8
  65. package/src/lib/mdz_to_svelte.ts +16 -16
  66. package/src/lib/mdz_token_parser.ts +38 -38
  67. package/src/lib/svelte_preprocess_mdz.ts +62 -58
  68. package/src/lib/tsdoc_mdz.ts +1 -1
@@ -17,7 +17,7 @@
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
23
  MdzNode,
@@ -28,10 +28,10 @@ import type {
28
28
  MdzNodeListItem,
29
29
  MdzNodeTableRow,
30
30
  MdzNodeTableCell,
31
- MdzTableAlign,
31
+ MdzTableAlign
32
32
  } 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';
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';
35
35
 
36
36
  interface StackFrame {
37
37
  id: MdzNodeId;
@@ -82,7 +82,7 @@ export const mdz_opcodes_to_nodes = (opcodes: Array<MdzOpcode>): Array<MdzNode>
82
82
  start_number: op.start_number,
83
83
  number: op.number,
84
84
  align: op.align,
85
- header: op.header,
85
+ header: op.header
86
86
  });
87
87
  break;
88
88
  }
@@ -115,8 +115,8 @@ export const mdz_opcodes_to_nodes = (opcodes: Array<MdzOpcode>): Array<MdzNode>
115
115
  case 'text': {
116
116
  const node: MdzNodeText | MdzNodeCode =
117
117
  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};
118
+ ? { type: 'Code', content: op.content, start: op.start, end: op.end }
119
+ : { type: 'Text', content: op.content, start: op.start, end: op.end };
120
120
  text_nodes.set(op.id, node);
121
121
  children.push(node);
122
122
  break;
@@ -160,7 +160,7 @@ export const mdz_opcodes_to_nodes = (opcodes: Array<MdzOpcode>): Array<MdzNode>
160
160
  }
161
161
 
162
162
  case 'void': {
163
- children.push({type: 'Hr', start: op.start, end: op.end});
163
+ children.push({ type: 'Hr', start: op.start, end: op.end });
164
164
  break;
165
165
  }
166
166
 
@@ -224,7 +224,7 @@ export const mdz_opcodes_to_nodes = (opcodes: Array<MdzOpcode>): Array<MdzNode>
224
224
  type: 'Text',
225
225
  content: trimmed_content,
226
226
  start: text_node.end,
227
- end: text_node.end + trimmed_content.length,
227
+ end: text_node.end + trimmed_content.length
228
228
  };
229
229
  text_nodes.set(op.trim_id, trimmed_node);
230
230
  }
@@ -236,7 +236,7 @@ export const mdz_opcodes_to_nodes = (opcodes: Array<MdzOpcode>): Array<MdzNode>
236
236
  children: [text_node],
237
237
  link_type: op.link_type,
238
238
  start: op.start,
239
- end: op.end,
239
+ end: op.end
240
240
  };
241
241
 
242
242
  // replace text node with [Link, trimmed?] in the buffer
@@ -278,7 +278,7 @@ const insert_replacement = (
278
278
  stack: Array<StackFrame>,
279
279
  reverted_idx: number,
280
280
  at: number,
281
- op: {replacement_text?: string; start: number},
281
+ op: { replacement_text?: string; start: number }
282
282
  ): void => {
283
283
  const text = op.replacement_text!;
284
284
  const parent_start = reverted_idx > 0 ? stack[reverted_idx - 1]!.children_start : 0;
@@ -303,7 +303,12 @@ const insert_replacement = (
303
303
  }
304
304
  }
305
305
  // 3. standalone Text node
306
- const node: MdzNode = {type: 'Text', content: text, start: op.start, end: op.start + text.length};
306
+ const node: MdzNode = {
307
+ type: 'Text',
308
+ content: text,
309
+ start: op.start,
310
+ end: op.start + text.length
311
+ };
307
312
  if (at >= children.length) {
308
313
  children.push(node);
309
314
  } else {
@@ -337,7 +342,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
337
342
  type: 'Paragraph',
338
343
  children,
339
344
  start: children[0]!.start,
340
- end: children[children.length - 1]!.end,
345
+ end: children[children.length - 1]!.end
341
346
  };
342
347
  }
343
348
 
@@ -350,7 +355,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
350
355
  id,
351
356
  children,
352
357
  start: frame.start,
353
- end: frame.end!,
358
+ end: frame.end!
354
359
  } as MdzNodeHeading;
355
360
  }
356
361
 
@@ -359,7 +364,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
359
364
  type: 'Bold',
360
365
  children: mdz_merge_adjacent_text(frame_children),
361
366
  start: frame.start,
362
- end: frame.end!,
367
+ end: frame.end!
363
368
  };
364
369
 
365
370
  case 'Italic':
@@ -367,7 +372,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
367
372
  type: 'Italic',
368
373
  children: mdz_merge_adjacent_text(frame_children),
369
374
  start: frame.start,
370
- end: frame.end!,
375
+ end: frame.end!
371
376
  };
372
377
 
373
378
  case 'Strikethrough':
@@ -375,7 +380,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
375
380
  type: 'Strikethrough',
376
381
  children: mdz_merge_adjacent_text(frame_children),
377
382
  start: frame.start,
378
- end: frame.end!,
383
+ end: frame.end!
379
384
  };
380
385
 
381
386
  case 'Link':
@@ -385,7 +390,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
385
390
  children: mdz_merge_adjacent_text(frame_children),
386
391
  link_type: frame.link_type ?? 'internal',
387
392
  start: frame.start,
388
- end: frame.end!,
393
+ end: frame.end!
389
394
  };
390
395
 
391
396
  case 'List': {
@@ -400,10 +405,10 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
400
405
  start_number: frame.start_number ?? 1,
401
406
  children,
402
407
  start: frame.start,
403
- end,
408
+ end
404
409
  };
405
410
  }
406
- return {type: 'List', ordered: false, children, start: frame.start, end};
411
+ return { type: 'List', ordered: false, children, start: frame.start, end };
407
412
  }
408
413
 
409
414
  case 'ListItem': {
@@ -411,9 +416,9 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
411
416
  // childless means an empty item — its close carried the marker end
412
417
  const end = children.length > 0 ? children[children.length - 1]!.end : frame.end!;
413
418
  if (frame.number !== undefined) {
414
- return {type: 'ListItem', number: frame.number, children, start: frame.start, end};
419
+ return { type: 'ListItem', number: frame.number, children, start: frame.start, end };
415
420
  }
416
- return {type: 'ListItem', children, start: frame.start, end};
421
+ return { type: 'ListItem', children, start: frame.start, end };
417
422
  }
418
423
 
419
424
  case 'Blockquote': {
@@ -421,7 +426,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
421
426
  // sync token parser (the close offset is cosmetic)
422
427
  const end =
423
428
  frame_children.length > 0 ? frame_children[frame_children.length - 1]!.end : frame.end!;
424
- return {type: 'Blockquote', children: frame_children, start: frame.start, end};
429
+ return { type: 'Blockquote', children: frame_children, start: frame.start, end };
425
430
  }
426
431
 
427
432
  case 'Table': {
@@ -429,7 +434,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
429
434
  // the sync token parser
430
435
  const children = frame_children as Array<MdzNodeTableRow>;
431
436
  const end = children.length > 0 ? children[children.length - 1]!.end : frame.end!;
432
- return {type: 'Table', align: frame.align ?? [], children, start: frame.start, end};
437
+ return { type: 'Table', align: frame.align ?? [], children, start: frame.start, end };
433
438
  }
434
439
 
435
440
  case 'TableRow': {
@@ -439,7 +444,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
439
444
  header: frame.header ?? false,
440
445
  children,
441
446
  start: frame.start,
442
- end: frame.end!,
447
+ end: frame.end!
443
448
  };
444
449
  }
445
450
 
@@ -448,7 +453,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
448
453
  type: 'TableCell',
449
454
  children: mdz_merge_adjacent_text(frame_children),
450
455
  start: frame.start,
451
- end: frame.end!,
456
+ end: frame.end!
452
457
  };
453
458
 
454
459
  case 'Code': {
@@ -461,7 +466,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
461
466
  type: 'Code',
462
467
  content,
463
468
  start: frame.start,
464
- end: frame.end!,
469
+ end: frame.end!
465
470
  };
466
471
  }
467
472
 
@@ -476,7 +481,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
476
481
  lang: frame.lang ?? null,
477
482
  content,
478
483
  start: frame.start,
479
- end: frame.end!,
484
+ end: frame.end!
480
485
  };
481
486
  }
482
487
 
@@ -486,7 +491,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
486
491
  name: frame.name ?? '',
487
492
  children: mdz_merge_adjacent_text(frame_children),
488
493
  start: frame.start,
489
- end: frame.end!,
494
+ end: frame.end!
490
495
  };
491
496
 
492
497
  case 'Component':
@@ -495,7 +500,7 @@ const build_node = (frame: StackFrame, frame_children: Array<MdzNode>): MdzNode
495
500
  name: frame.name ?? '',
496
501
  children: mdz_merge_adjacent_text(frame_children),
497
502
  start: frame.start,
498
- end: frame.end!,
503
+ end: frame.end!
499
504
  };
500
505
 
501
506
  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