@the_dissidents/libemmm 0.0.3 → 0.0.5

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 (125) hide show
  1. package/README.md +6 -3
  2. package/dist/index.d.mts +23 -2
  3. package/dist/index.d.ts +23 -2
  4. package/dist/index.js +157 -33
  5. package/dist/index.js.map +1 -1
  6. package/dist/index.mjs +157 -33
  7. package/dist/index.mjs.map +1 -1
  8. package/dist/src/builtin/builtin.d.ts +2 -0
  9. package/dist/src/builtin/builtin.js +18 -0
  10. package/dist/src/builtin/builtin.js.map +1 -0
  11. package/dist/src/builtin/define-modifier.d.ts +12 -0
  12. package/dist/src/builtin/define-modifier.js +129 -0
  13. package/dist/src/builtin/define-modifier.js.map +1 -0
  14. package/dist/src/builtin/define-shorthand.d.ts +14 -0
  15. package/dist/src/builtin/define-shorthand.js +178 -0
  16. package/dist/src/builtin/define-shorthand.js.map +1 -0
  17. package/dist/src/builtin/internal.d.ts +41 -0
  18. package/dist/src/builtin/internal.js +106 -0
  19. package/dist/src/builtin/internal.js.map +1 -0
  20. package/dist/src/builtin/module.d.ts +16 -0
  21. package/dist/src/builtin/module.js +156 -0
  22. package/dist/src/builtin/module.js.map +1 -0
  23. package/dist/src/builtin/slot.d.ts +7 -0
  24. package/dist/src/builtin/slot.js +136 -0
  25. package/dist/src/builtin/slot.js.map +1 -0
  26. package/dist/src/builtin/var.d.ts +12 -0
  27. package/dist/src/builtin/var.js +103 -0
  28. package/dist/src/builtin/var.js.map +1 -0
  29. package/dist/src/debug-print.d.ts +14 -0
  30. package/dist/src/debug-print.js +113 -0
  31. package/dist/src/debug-print.js.map +1 -0
  32. package/dist/src/debug.d.ts +15 -0
  33. package/dist/src/debug.js +47 -0
  34. package/dist/src/debug.js.map +1 -0
  35. package/dist/src/default/bullets.d.ts +4 -0
  36. package/dist/src/default/bullets.js +39 -0
  37. package/dist/src/default/bullets.js.map +1 -0
  38. package/dist/src/default/code.d.ts +6 -0
  39. package/dist/src/default/code.js +13 -0
  40. package/dist/src/default/code.js.map +1 -0
  41. package/dist/src/default/default.d.ts +2 -0
  42. package/dist/src/default/default.js +20 -0
  43. package/dist/src/default/default.js.map +1 -0
  44. package/dist/src/default/headings.d.ts +20 -0
  45. package/dist/src/default/headings.js +125 -0
  46. package/dist/src/default/headings.js.map +1 -0
  47. package/dist/src/default/html-renderer.d.ts +26 -0
  48. package/dist/src/default/html-renderer.js +108 -0
  49. package/dist/src/default/html-renderer.js.map +1 -0
  50. package/dist/src/default/inline-styles.d.ts +4 -0
  51. package/dist/src/default/inline-styles.js +24 -0
  52. package/dist/src/default/inline-styles.js.map +1 -0
  53. package/dist/src/default/misc.d.ts +6 -0
  54. package/dist/src/default/misc.js +112 -0
  55. package/dist/src/default/misc.js.map +1 -0
  56. package/dist/src/default/notes.d.ts +28 -0
  57. package/dist/src/default/notes.js +109 -0
  58. package/dist/src/default/notes.js.map +1 -0
  59. package/dist/src/default/quotes.d.ts +4 -0
  60. package/dist/src/default/quotes.js +36 -0
  61. package/dist/src/default/quotes.js.map +1 -0
  62. package/dist/src/default/vars.d.ts +2 -0
  63. package/dist/src/default/vars.js +39 -0
  64. package/dist/src/default/vars.js.map +1 -0
  65. package/dist/src/index.d.ts +13 -0
  66. package/dist/src/index.js +58 -0
  67. package/dist/src/index.js.map +1 -0
  68. package/dist/src/interface.d.ts +174 -0
  69. package/dist/src/interface.js +93 -0
  70. package/dist/src/interface.js.map +1 -0
  71. package/dist/src/messages.d.ts +165 -0
  72. package/dist/src/messages.js +279 -0
  73. package/dist/src/messages.js.map +1 -0
  74. package/dist/src/modifier-helper.d.ts +6 -0
  75. package/dist/src/modifier-helper.js +113 -0
  76. package/dist/src/modifier-helper.js.map +1 -0
  77. package/dist/src/parser-config.d.ts +44 -0
  78. package/dist/src/parser-config.js +67 -0
  79. package/dist/src/parser-config.js.map +1 -0
  80. package/dist/src/parser.d.ts +3 -0
  81. package/dist/src/parser.js +652 -0
  82. package/dist/src/parser.js.map +1 -0
  83. package/dist/src/renderer.d.ts +49 -0
  84. package/dist/src/renderer.js +81 -0
  85. package/dist/src/renderer.js.map +1 -0
  86. package/dist/src/scanner.d.ts +22 -0
  87. package/dist/src/scanner.js +50 -0
  88. package/dist/src/scanner.js.map +1 -0
  89. package/dist/src/temp.d.ts +1 -0
  90. package/dist/src/temp.js +108 -0
  91. package/dist/src/temp.js.map +1 -0
  92. package/dist/src/typing-helper.d.ts +7 -0
  93. package/dist/src/typing-helper.js +3 -0
  94. package/dist/src/typing-helper.js.map +1 -0
  95. package/dist/src/util.d.ts +29 -0
  96. package/dist/src/util.js +177 -0
  97. package/dist/src/util.js.map +1 -0
  98. package/dist/tests/advanced_syntax.test.d.ts +1 -0
  99. package/dist/tests/advanced_syntax.test.js +180 -0
  100. package/dist/tests/advanced_syntax.test.js.map +1 -0
  101. package/dist/tests/basic_syntax.test.d.ts +1 -0
  102. package/dist/tests/basic_syntax.test.js +431 -0
  103. package/dist/tests/basic_syntax.test.js.map +1 -0
  104. package/dist/tests/default/headings.test.d.ts +1 -0
  105. package/dist/tests/default/headings.test.js +90 -0
  106. package/dist/tests/default/headings.test.js.map +1 -0
  107. package/dist/tests/define_block.test.d.ts +1 -0
  108. package/dist/tests/define_block.test.js +209 -0
  109. package/dist/tests/define_block.test.js.map +1 -0
  110. package/dist/tests/define_inline.test.d.ts +1 -0
  111. package/dist/tests/define_inline.test.js +289 -0
  112. package/dist/tests/define_inline.test.js.map +1 -0
  113. package/dist/tests/modules.test.d.ts +1 -0
  114. package/dist/tests/modules.test.js +137 -0
  115. package/dist/tests/modules.test.js.map +1 -0
  116. package/dist/tests/shorthands.test.d.ts +1 -0
  117. package/dist/tests/shorthands.test.js +79 -0
  118. package/dist/tests/shorthands.test.js.map +1 -0
  119. package/dist/tsup.config.d.ts +2 -0
  120. package/dist/tsup.config.js +12 -0
  121. package/dist/tsup.config.js.map +1 -0
  122. package/dist/vitest.config.d.ts +2 -0
  123. package/dist/vitest.config.js +17 -0
  124. package/dist/vitest.config.js.map +1 -0
  125. package/package.json +1 -1
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # libemmm
2
2
 
3
- This package contains the parser and language server for the `emmm` markup language. Will include renderers in the future.
3
+ This package contains the parser and language server for the `emmm` markup language.
4
4
 
5
5
  ```sh
6
6
  npm install @the_dissidents/libemmm
@@ -164,7 +164,7 @@ A colon before the first argument states explicitly the beginning of that argume
164
164
  [**-define-inline** *name*:*args...*]
165
165
  [**-define-inline** *name*:*args...*:(*slot*)]
166
166
 
167
- > Define a new modifier. The first argument is the name. If more than one argument exist, and the last is enclosed in `()`, it is taken as the **slot name** (more on that later). The rest in the middle are names for the arguments.
167
+ > Define a new modifier. The first argument is the name. If one or more arguments exist, and the last is enclosed in `()`, it is taken as the **slot name** (more on that later). The rest in the middle are names for the arguments.
168
168
  >
169
169
  > Take content as the definition of the new modifier.
170
170
 
@@ -261,6 +261,8 @@ For strange edge cases of the basic syntax and the built-in configuration, see t
261
261
 
262
262
  ## Diagnostic Messages
263
263
 
264
+ > Note: 'suggestions' are currently not being implemented
265
+
264
266
  |Code|Error|Suggestions|
265
267
  |---:|-----|-|
266
268
  | 1 | Syntax error: expecting <...>
@@ -284,4 +286,5 @@ For strange edge cases of the basic syntax and the built-in configuration, see t
284
286
  | 3 | Content should begin in a new line to avoid confusion | *add a line break*
285
287
  | 4 | Modifier already defined, overwriting
286
288
  | 5 | Undefined variable, will expand to empty string
287
- | 6 | Using this module will overwrite: <...>
289
+ | 6 | Using this module will overwrite: <...>
290
+ | 7 | <...> is already defined (as <...>), will be overwritten
package/dist/index.d.mts CHANGED
@@ -186,11 +186,21 @@ declare class ModifierBase<TNode, TEntity> {
186
186
  readonly slotType: ModifierSlotType;
187
187
  constructor(name: string, slotType?: ModifierSlotType, args?: Partial<ModifierBase<TNode, TEntity>>);
188
188
  roleHint?: string;
189
+ /**
190
+ * If true, any modifier encountered in the content of it will *not* be expanded, *unless* that modifier is `alwaysTryExpand`.
191
+ */
189
192
  delayContentExpansion: boolean;
193
+ /**
194
+ * If true, such a modifier will always be expanded whenever it is encountered, *even if* contained in a modifier with `delayContentExpansion`.
195
+ */
190
196
  alwaysTryExpand: boolean;
197
+ /** Called before the modifier's content is parsed. */
191
198
  beforeParseContent?: (node: TNode, cxt: ParseContext, immediate: boolean) => Message[];
199
+ /** Called after the modifier's content is parsed. */
192
200
  afterParseContent?: (node: TNode, cxt: ParseContext, immediate: boolean) => Message[];
201
+ /** Called before reparsing of the expansion. */
193
202
  beforeProcessExpansion?: (node: TNode, cxt: ParseContext, immediate: boolean) => Message[];
203
+ /** Called before reparsing of the expansion. */
194
204
  afterProcessExpansion?: (node: TNode, cxt: ParseContext, immediate: boolean) => Message[];
195
205
  prepareExpand?: (node: TNode, cxt: ParseContext, immediate: boolean) => Message[];
196
206
  expand?: (node: TNode, cxt: ParseContext, immediate: boolean) => TEntity[] | undefined;
@@ -442,6 +452,15 @@ declare class OverwriteDefinitionsMessage implements Message {
442
452
  readonly severity = MessageSeverity.Warning;
443
453
  get info(): string;
444
454
  }
455
+ declare class OverwriteSpecialVariableMessage implements Message {
456
+ readonly location: LocationRange;
457
+ private varname;
458
+ private previous;
459
+ constructor(location: LocationRange, varname: string, previous: string);
460
+ readonly code = 6;
461
+ readonly severity = MessageSeverity.Warning;
462
+ get info(): string;
463
+ }
445
464
 
446
465
  type messages_ArgumentCountMismatchMessage = ArgumentCountMismatchMessage;
447
466
  declare const messages_ArgumentCountMismatchMessage: typeof ArgumentCountMismatchMessage;
@@ -471,6 +490,8 @@ type messages_OnlySimpleParagraphsPermittedMessage = OnlySimpleParagraphsPermitt
471
490
  declare const messages_OnlySimpleParagraphsPermittedMessage: typeof OnlySimpleParagraphsPermittedMessage;
472
491
  type messages_OverwriteDefinitionsMessage = OverwriteDefinitionsMessage;
473
492
  declare const messages_OverwriteDefinitionsMessage: typeof OverwriteDefinitionsMessage;
493
+ type messages_OverwriteSpecialVariableMessage = OverwriteSpecialVariableMessage;
494
+ declare const messages_OverwriteSpecialVariableMessage: typeof OverwriteSpecialVariableMessage;
474
495
  type messages_ReachedRecursionLimitMessage = ReachedRecursionLimitMessage;
475
496
  declare const messages_ReachedRecursionLimitMessage: typeof ReachedRecursionLimitMessage;
476
497
  type messages_SlotUsedOutsideDefinitionMessage = SlotUsedOutsideDefinitionMessage;
@@ -484,7 +505,7 @@ declare const messages_UnknownModifierMessage: typeof UnknownModifierMessage;
484
505
  type messages_UnnecessaryNewlineMessage = UnnecessaryNewlineMessage;
485
506
  declare const messages_UnnecessaryNewlineMessage: typeof UnnecessaryNewlineMessage;
486
507
  declare namespace messages {
487
- export { messages_ArgumentCountMismatchMessage as ArgumentCountMismatchMessage, messages_CannotExpandArgumentMessage as CannotExpandArgumentMessage, messages_CannotUseModuleInSelfMessage as CannotUseModuleInSelfMessage, messages_ContentShouldBeOnNewlineMessage as ContentShouldBeOnNewlineMessage, messages_EitherNormalOrPreMessage as EitherNormalOrPreMessage, messages_EntityNotAllowedMessage as EntityNotAllowedMessage, messages_ExpectedMessage as ExpectedMessage, messages_InvalidArgumentMessage as InvalidArgumentMessage, messages_MultipleBlocksNotPermittedMessage as MultipleBlocksNotPermittedMessage, messages_NameAlreadyDefinedMessage as NameAlreadyDefinedMessage, messages_NewBlockShouldBeOnNewlineMessage as NewBlockShouldBeOnNewlineMessage, messages_NoNestedModuleMessage as NoNestedModuleMessage, messages_OnlySimpleParagraphsPermittedMessage as OnlySimpleParagraphsPermittedMessage, messages_OverwriteDefinitionsMessage as OverwriteDefinitionsMessage, messages_ReachedRecursionLimitMessage as ReachedRecursionLimitMessage, messages_SlotUsedOutsideDefinitionMessage as SlotUsedOutsideDefinitionMessage, messages_UnclosedInlineModifierMessage as UnclosedInlineModifierMessage, messages_UndefinedVariableMessage as UndefinedVariableMessage, messages_UnknownModifierMessage as UnknownModifierMessage, messages_UnnecessaryNewlineMessage as UnnecessaryNewlineMessage };
508
+ export { messages_ArgumentCountMismatchMessage as ArgumentCountMismatchMessage, messages_CannotExpandArgumentMessage as CannotExpandArgumentMessage, messages_CannotUseModuleInSelfMessage as CannotUseModuleInSelfMessage, messages_ContentShouldBeOnNewlineMessage as ContentShouldBeOnNewlineMessage, messages_EitherNormalOrPreMessage as EitherNormalOrPreMessage, messages_EntityNotAllowedMessage as EntityNotAllowedMessage, messages_ExpectedMessage as ExpectedMessage, messages_InvalidArgumentMessage as InvalidArgumentMessage, messages_MultipleBlocksNotPermittedMessage as MultipleBlocksNotPermittedMessage, messages_NameAlreadyDefinedMessage as NameAlreadyDefinedMessage, messages_NewBlockShouldBeOnNewlineMessage as NewBlockShouldBeOnNewlineMessage, messages_NoNestedModuleMessage as NoNestedModuleMessage, messages_OnlySimpleParagraphsPermittedMessage as OnlySimpleParagraphsPermittedMessage, messages_OverwriteDefinitionsMessage as OverwriteDefinitionsMessage, messages_OverwriteSpecialVariableMessage as OverwriteSpecialVariableMessage, messages_ReachedRecursionLimitMessage as ReachedRecursionLimitMessage, messages_SlotUsedOutsideDefinitionMessage as SlotUsedOutsideDefinitionMessage, messages_UnclosedInlineModifierMessage as UnclosedInlineModifierMessage, messages_UndefinedVariableMessage as UndefinedVariableMessage, messages_UnknownModifierMessage as UnknownModifierMessage, messages_UnnecessaryNewlineMessage as UnnecessaryNewlineMessage };
488
509
  }
489
510
 
490
511
  declare const BuiltinConfiguration: ReadonlyConfiguration;
@@ -495,7 +516,7 @@ type HTMLRendererOptions = {
495
516
  headPlugins: HTMLComponentPlugin[];
496
517
  headerPlugins: HTMLComponentPlugin[];
497
518
  footerPlugins: HTMLComponentPlugin[];
498
- transformAsset: (url: URL) => string | undefined;
519
+ transformAsset: (id: string) => string | undefined;
499
520
  };
500
521
  type HTMLRenderType = {
501
522
  state: HTMLRenderState;
package/dist/index.d.ts CHANGED
@@ -186,11 +186,21 @@ declare class ModifierBase<TNode, TEntity> {
186
186
  readonly slotType: ModifierSlotType;
187
187
  constructor(name: string, slotType?: ModifierSlotType, args?: Partial<ModifierBase<TNode, TEntity>>);
188
188
  roleHint?: string;
189
+ /**
190
+ * If true, any modifier encountered in the content of it will *not* be expanded, *unless* that modifier is `alwaysTryExpand`.
191
+ */
189
192
  delayContentExpansion: boolean;
193
+ /**
194
+ * If true, such a modifier will always be expanded whenever it is encountered, *even if* contained in a modifier with `delayContentExpansion`.
195
+ */
190
196
  alwaysTryExpand: boolean;
197
+ /** Called before the modifier's content is parsed. */
191
198
  beforeParseContent?: (node: TNode, cxt: ParseContext, immediate: boolean) => Message[];
199
+ /** Called after the modifier's content is parsed. */
192
200
  afterParseContent?: (node: TNode, cxt: ParseContext, immediate: boolean) => Message[];
201
+ /** Called before reparsing of the expansion. */
193
202
  beforeProcessExpansion?: (node: TNode, cxt: ParseContext, immediate: boolean) => Message[];
203
+ /** Called before reparsing of the expansion. */
194
204
  afterProcessExpansion?: (node: TNode, cxt: ParseContext, immediate: boolean) => Message[];
195
205
  prepareExpand?: (node: TNode, cxt: ParseContext, immediate: boolean) => Message[];
196
206
  expand?: (node: TNode, cxt: ParseContext, immediate: boolean) => TEntity[] | undefined;
@@ -442,6 +452,15 @@ declare class OverwriteDefinitionsMessage implements Message {
442
452
  readonly severity = MessageSeverity.Warning;
443
453
  get info(): string;
444
454
  }
455
+ declare class OverwriteSpecialVariableMessage implements Message {
456
+ readonly location: LocationRange;
457
+ private varname;
458
+ private previous;
459
+ constructor(location: LocationRange, varname: string, previous: string);
460
+ readonly code = 6;
461
+ readonly severity = MessageSeverity.Warning;
462
+ get info(): string;
463
+ }
445
464
 
446
465
  type messages_ArgumentCountMismatchMessage = ArgumentCountMismatchMessage;
447
466
  declare const messages_ArgumentCountMismatchMessage: typeof ArgumentCountMismatchMessage;
@@ -471,6 +490,8 @@ type messages_OnlySimpleParagraphsPermittedMessage = OnlySimpleParagraphsPermitt
471
490
  declare const messages_OnlySimpleParagraphsPermittedMessage: typeof OnlySimpleParagraphsPermittedMessage;
472
491
  type messages_OverwriteDefinitionsMessage = OverwriteDefinitionsMessage;
473
492
  declare const messages_OverwriteDefinitionsMessage: typeof OverwriteDefinitionsMessage;
493
+ type messages_OverwriteSpecialVariableMessage = OverwriteSpecialVariableMessage;
494
+ declare const messages_OverwriteSpecialVariableMessage: typeof OverwriteSpecialVariableMessage;
474
495
  type messages_ReachedRecursionLimitMessage = ReachedRecursionLimitMessage;
475
496
  declare const messages_ReachedRecursionLimitMessage: typeof ReachedRecursionLimitMessage;
476
497
  type messages_SlotUsedOutsideDefinitionMessage = SlotUsedOutsideDefinitionMessage;
@@ -484,7 +505,7 @@ declare const messages_UnknownModifierMessage: typeof UnknownModifierMessage;
484
505
  type messages_UnnecessaryNewlineMessage = UnnecessaryNewlineMessage;
485
506
  declare const messages_UnnecessaryNewlineMessage: typeof UnnecessaryNewlineMessage;
486
507
  declare namespace messages {
487
- export { messages_ArgumentCountMismatchMessage as ArgumentCountMismatchMessage, messages_CannotExpandArgumentMessage as CannotExpandArgumentMessage, messages_CannotUseModuleInSelfMessage as CannotUseModuleInSelfMessage, messages_ContentShouldBeOnNewlineMessage as ContentShouldBeOnNewlineMessage, messages_EitherNormalOrPreMessage as EitherNormalOrPreMessage, messages_EntityNotAllowedMessage as EntityNotAllowedMessage, messages_ExpectedMessage as ExpectedMessage, messages_InvalidArgumentMessage as InvalidArgumentMessage, messages_MultipleBlocksNotPermittedMessage as MultipleBlocksNotPermittedMessage, messages_NameAlreadyDefinedMessage as NameAlreadyDefinedMessage, messages_NewBlockShouldBeOnNewlineMessage as NewBlockShouldBeOnNewlineMessage, messages_NoNestedModuleMessage as NoNestedModuleMessage, messages_OnlySimpleParagraphsPermittedMessage as OnlySimpleParagraphsPermittedMessage, messages_OverwriteDefinitionsMessage as OverwriteDefinitionsMessage, messages_ReachedRecursionLimitMessage as ReachedRecursionLimitMessage, messages_SlotUsedOutsideDefinitionMessage as SlotUsedOutsideDefinitionMessage, messages_UnclosedInlineModifierMessage as UnclosedInlineModifierMessage, messages_UndefinedVariableMessage as UndefinedVariableMessage, messages_UnknownModifierMessage as UnknownModifierMessage, messages_UnnecessaryNewlineMessage as UnnecessaryNewlineMessage };
508
+ export { messages_ArgumentCountMismatchMessage as ArgumentCountMismatchMessage, messages_CannotExpandArgumentMessage as CannotExpandArgumentMessage, messages_CannotUseModuleInSelfMessage as CannotUseModuleInSelfMessage, messages_ContentShouldBeOnNewlineMessage as ContentShouldBeOnNewlineMessage, messages_EitherNormalOrPreMessage as EitherNormalOrPreMessage, messages_EntityNotAllowedMessage as EntityNotAllowedMessage, messages_ExpectedMessage as ExpectedMessage, messages_InvalidArgumentMessage as InvalidArgumentMessage, messages_MultipleBlocksNotPermittedMessage as MultipleBlocksNotPermittedMessage, messages_NameAlreadyDefinedMessage as NameAlreadyDefinedMessage, messages_NewBlockShouldBeOnNewlineMessage as NewBlockShouldBeOnNewlineMessage, messages_NoNestedModuleMessage as NoNestedModuleMessage, messages_OnlySimpleParagraphsPermittedMessage as OnlySimpleParagraphsPermittedMessage, messages_OverwriteDefinitionsMessage as OverwriteDefinitionsMessage, messages_OverwriteSpecialVariableMessage as OverwriteSpecialVariableMessage, messages_ReachedRecursionLimitMessage as ReachedRecursionLimitMessage, messages_SlotUsedOutsideDefinitionMessage as SlotUsedOutsideDefinitionMessage, messages_UnclosedInlineModifierMessage as UnclosedInlineModifierMessage, messages_UndefinedVariableMessage as UndefinedVariableMessage, messages_UnknownModifierMessage as UnknownModifierMessage, messages_UnnecessaryNewlineMessage as UnnecessaryNewlineMessage };
488
509
  }
489
510
 
490
511
  declare const BuiltinConfiguration: ReadonlyConfiguration;
@@ -495,7 +516,7 @@ type HTMLRendererOptions = {
495
516
  headPlugins: HTMLComponentPlugin[];
496
517
  headerPlugins: HTMLComponentPlugin[];
497
518
  footerPlugins: HTMLComponentPlugin[];
498
- transformAsset: (url: URL) => string | undefined;
519
+ transformAsset: (id: string) => string | undefined;
499
520
  };
500
521
  type HTMLRenderType = {
501
522
  state: HTMLRenderState;
package/dist/index.js CHANGED
@@ -77,11 +77,21 @@ var ModifierBase = class {
77
77
  if (args) Object.assign(this, args);
78
78
  }
79
79
  roleHint;
80
+ /**
81
+ * If true, any modifier encountered in the content of it will *not* be expanded, *unless* that modifier is `alwaysTryExpand`.
82
+ */
80
83
  delayContentExpansion = false;
84
+ /**
85
+ * If true, such a modifier will always be expanded whenever it is encountered, *even if* contained in a modifier with `delayContentExpansion`.
86
+ */
81
87
  alwaysTryExpand = false;
88
+ /** Called before the modifier's content is parsed. */
82
89
  beforeParseContent;
90
+ /** Called after the modifier's content is parsed. */
83
91
  afterParseContent;
92
+ /** Called before reparsing of the expansion. */
84
93
  beforeProcessExpansion;
94
+ /** Called before reparsing of the expansion. */
85
95
  afterProcessExpansion;
86
96
  prepareExpand;
87
97
  expand;
@@ -466,6 +476,7 @@ __export(messages_exports, {
466
476
  NoNestedModuleMessage: () => NoNestedModuleMessage,
467
477
  OnlySimpleParagraphsPermittedMessage: () => OnlySimpleParagraphsPermittedMessage,
468
478
  OverwriteDefinitionsMessage: () => OverwriteDefinitionsMessage,
479
+ OverwriteSpecialVariableMessage: () => OverwriteSpecialVariableMessage,
469
480
  ReachedRecursionLimitMessage: () => ReachedRecursionLimitMessage,
470
481
  SlotUsedOutsideDefinitionMessage: () => SlotUsedOutsideDefinitionMessage,
471
482
  UnclosedInlineModifierMessage: () => UnclosedInlineModifierMessage,
@@ -746,6 +757,18 @@ var OverwriteDefinitionsMessage = class {
746
757
  return `using this module will overwrite: ${this.what}`;
747
758
  }
748
759
  };
760
+ var OverwriteSpecialVariableMessage = class {
761
+ constructor(location, varname, previous) {
762
+ this.location = location;
763
+ this.varname = varname;
764
+ this.previous = previous;
765
+ }
766
+ code = 6;
767
+ severity = 1 /* Warning */;
768
+ get info() {
769
+ return `${this.varname} is already defined (as "${this.previous}"), will be overwritten`;
770
+ }
771
+ };
749
772
 
750
773
  // src/parser-config.ts
751
774
  var ParseContext = class {
@@ -2436,30 +2459,79 @@ var BulletBlockRenderersHTML = [
2436
2459
  ];
2437
2460
 
2438
2461
  // src/default/headings.ts
2462
+ var headings = Symbol();
2463
+ function initHeadings(cxt) {
2464
+ cxt.init(headings, {
2465
+ path: []
2466
+ });
2467
+ }
2468
+ function setHeading(cxt, data) {
2469
+ const path = cxt.get(headings).path;
2470
+ while (path.length > 0 && path.at(-1).level >= data.level)
2471
+ path.pop();
2472
+ path.push(data);
2473
+ return [];
2474
+ }
2475
+ function currentHeadingLevel(cxt) {
2476
+ return cxt.get(headings).path.at(-1)?.level;
2477
+ }
2478
+ function currentExplicitHeadingLevel(cxt) {
2479
+ return cxt.get(headings).path.findLast((x) => !x.implicit)?.level;
2480
+ }
2439
2481
  var headingBlock = new BlockModifierDefinition(
2440
2482
  "heading",
2441
2483
  0 /* Normal */,
2442
2484
  {
2443
2485
  delayContentExpansion: true,
2444
2486
  roleHint: "heading",
2445
- prepareExpand(node) {
2487
+ beforeParseContent(node, cxt) {
2446
2488
  let msgs = checkArguments(node, 0, 1);
2447
2489
  if (msgs) return msgs;
2448
2490
  msgs = onlyPermitSingleBlock(node);
2449
2491
  if (msgs) return msgs;
2450
2492
  msgs = onlyPermitSimpleParagraphs(node);
2451
2493
  if (msgs) return msgs;
2494
+ node.state = { name: void 0, level: currentHeadingLevel(cxt) ?? 1 };
2452
2495
  if (node.arguments.length == 1) {
2453
- let arg = node.arguments[0];
2454
- let num = Number.parseInt(arg.expansion);
2455
- if (isNaN(num)) return [
2456
- new InvalidArgumentMessage(arg.location, "should be a number between 1 and 6")
2457
- ];
2458
- node.state = num;
2459
- } else {
2460
- node.state = 1;
2496
+ const arg = node.arguments[0];
2497
+ const level = Number.parseInt(arg.expansion);
2498
+ if (isNaN(level) || level < 1 || level > 6)
2499
+ msgs = [new InvalidArgumentMessage(
2500
+ arg.location,
2501
+ "should be a number between 1 and 6"
2502
+ )];
2503
+ else node.state.level = level;
2461
2504
  }
2462
- return [];
2505
+ setHeading(cxt, node.state);
2506
+ return msgs ?? [];
2507
+ }
2508
+ }
2509
+ );
2510
+ var implicitHeadingBlock = new BlockModifierDefinition(
2511
+ "implicit-heading",
2512
+ 2 /* None */,
2513
+ {
2514
+ roleHint: "heading",
2515
+ beforeParseContent(node, cxt) {
2516
+ let msgs = checkArguments(node, 0, 1);
2517
+ if (msgs) return msgs;
2518
+ node.state = {
2519
+ name: void 0,
2520
+ implicit: true,
2521
+ level: (currentExplicitHeadingLevel(cxt) ?? 0) + 1
2522
+ };
2523
+ if (node.arguments.length == 1) {
2524
+ const arg = node.arguments[0];
2525
+ const level = Number.parseInt(arg.expansion);
2526
+ if (isNaN(level) || level < 1 || level > 6)
2527
+ msgs = [new InvalidArgumentMessage(
2528
+ arg.location,
2529
+ "should be a number between 1 and 6"
2530
+ )];
2531
+ else node.state.level = level;
2532
+ }
2533
+ setHeading(cxt, node.state);
2534
+ return msgs ?? [];
2463
2535
  }
2464
2536
  }
2465
2537
  );
@@ -2469,41 +2541,49 @@ var numberedHeadingBlock = new BlockModifierDefinition(
2469
2541
  {
2470
2542
  delayContentExpansion: true,
2471
2543
  roleHint: "heading",
2472
- prepareExpand(node) {
2544
+ beforeParseContent(node, cxt) {
2473
2545
  let msgs = checkArguments(node, 1);
2474
2546
  if (msgs) return msgs;
2475
2547
  msgs = onlyPermitSingleBlock(node);
2476
2548
  if (msgs) return msgs;
2477
2549
  msgs = onlyPermitSimpleParagraphs(node);
2478
2550
  if (msgs) return msgs;
2479
- let arg = node.arguments[0];
2480
- let split = arg.expansion.trim().split(".").filter((x) => x.length > 0);
2481
- if (split.length == 0 || split.length > 6) return [
2482
- new InvalidArgumentMessage(arg.location, "heading level must be between 1 and 6")
2483
- ];
2484
- node.state = split;
2485
- debug.trace("numbered-heading", node.state);
2486
- return [];
2551
+ node.state = { name: void 0, level: currentHeadingLevel(cxt) ?? 1 };
2552
+ const arg = node.arguments[0];
2553
+ const split = arg.expansion.trim().split(".").filter((x) => x.length > 0);
2554
+ if (split.length == 0 || split.length > 6)
2555
+ msgs = [new InvalidArgumentMessage(
2556
+ arg.location,
2557
+ "should be a number between 1 and 6"
2558
+ )];
2559
+ else node.state = { name: split.join("."), level: split.length };
2560
+ setHeading(cxt, node.state);
2561
+ return msgs ?? [];
2487
2562
  }
2488
2563
  }
2489
2564
  );
2490
- var HeadingBlocks = [headingBlock, numberedHeadingBlock];
2565
+ var HeadingBlocks = [headingBlock, implicitHeadingBlock, numberedHeadingBlock];
2491
2566
  var HeadingBlockRenderersHTML = [
2492
2567
  [headingBlock, (node, cxt) => {
2493
2568
  if (node.state !== void 0) {
2494
- assert(node.state >= 1 && node.state <= 6);
2495
- let tag = "h" + node.state;
2569
+ let tag = "h" + node.state.level;
2496
2570
  let para = node.content[0];
2497
2571
  return `<${tag}>${cxt.state.render(para.content, cxt)}</${tag}>`;
2498
2572
  }
2499
2573
  return cxt.state.invalidBlock(node, "Bad format");
2500
2574
  }],
2575
+ [implicitHeadingBlock, (node, cxt) => {
2576
+ if (node.state !== void 0) {
2577
+ let tag = "h" + node.state.level;
2578
+ return `<${tag} class='implicit'></${tag}>`;
2579
+ }
2580
+ return cxt.state.invalidBlock(node, "Bad format");
2581
+ }],
2501
2582
  [numberedHeadingBlock, (node, cxt) => {
2502
2583
  if (node.state !== void 0) {
2503
- assert(node.state.length >= 1 && node.state.length <= 6);
2504
- let tag = "h" + node.state.length;
2584
+ let tag = "h" + node.state.level;
2505
2585
  let para = node.content[0];
2506
- return `<${tag}><span class='heading-number'>${node.state.join(".")}</span>${cxt.state.render(para.content, cxt)}</${tag}>`;
2586
+ return `<${tag}><span class='heading-number'>${node.state.name}</span>${cxt.state.render(para.content, cxt)}</${tag}>`;
2507
2587
  }
2508
2588
  return cxt.state.invalidBlock(node, "Bad format");
2509
2589
  }]
@@ -2742,6 +2822,35 @@ var linkInline = new InlineModifierDefinition(
2742
2822
  }
2743
2823
  }
2744
2824
  );
2825
+ var styleBlock = new BlockModifierDefinition(
2826
+ "style",
2827
+ 0 /* Normal */,
2828
+ {
2829
+ prepareExpand(node) {
2830
+ let msgs = checkArguments(node, 1);
2831
+ if (msgs) return msgs;
2832
+ node.state = node.arguments[0].expansion;
2833
+ return [];
2834
+ }
2835
+ }
2836
+ );
2837
+ var breakBlock = new BlockModifierDefinition(
2838
+ "break",
2839
+ 2 /* None */
2840
+ );
2841
+ var linkBlock = new BlockModifierDefinition(
2842
+ "link",
2843
+ 0 /* Normal */,
2844
+ {
2845
+ roleHint: "link",
2846
+ prepareExpand(node) {
2847
+ let msgs = checkArguments(node, 1);
2848
+ if (msgs) return msgs;
2849
+ node.state = node.arguments[0].expansion;
2850
+ return [];
2851
+ }
2852
+ }
2853
+ );
2745
2854
  var imageBlock = new BlockModifierDefinition(
2746
2855
  "image",
2747
2856
  0 /* Normal */,
@@ -2754,14 +2863,13 @@ var imageBlock = new BlockModifierDefinition(
2754
2863
  if (msgs) return msgs;
2755
2864
  msgs = onlyPermitSimpleParagraphs(node);
2756
2865
  if (msgs) return msgs;
2757
- let url = URL.parse(node.arguments.map((x) => x.expansion).join(":"));
2758
- if (url) node.state = url;
2866
+ node.state = node.arguments.map((x) => x.expansion).join(":");
2759
2867
  return [];
2760
2868
  }
2761
2869
  }
2762
2870
  );
2763
2871
  var MiscInlines = [rubyInline, linkInline];
2764
- var MiscBlocks = [imageBlock];
2872
+ var MiscBlocks = [styleBlock, breakBlock, linkBlock, imageBlock];
2765
2873
  var MiscInlineRenderersHTML = [
2766
2874
  [rubyInline, (node, cxt) => {
2767
2875
  if (node.state === void 0)
@@ -2775,6 +2883,19 @@ var MiscInlineRenderersHTML = [
2775
2883
  }]
2776
2884
  ];
2777
2885
  var MiscBlockRenderersHTML = [
2886
+ [styleBlock, (node, cxt) => {
2887
+ if (node.state === void 0)
2888
+ return cxt.state.invalidBlock(node, "bad format");
2889
+ return `<div class="${node.state}" style="display:contents">${cxt.state.render(node.content, cxt)}</div>`;
2890
+ }],
2891
+ [breakBlock, () => {
2892
+ return `<hr>`;
2893
+ }],
2894
+ [linkBlock, (node, cxt) => {
2895
+ if (node.state === void 0)
2896
+ return cxt.state.invalidBlock(node, "bad format");
2897
+ return `<a href="${encodeURI(node.state)}">${cxt.state.render(node.content, cxt)}</a>`;
2898
+ }],
2778
2899
  [imageBlock, (node, cxt) => {
2779
2900
  let transformed;
2780
2901
  if (node.state === void 0)
@@ -2782,9 +2903,9 @@ var MiscBlockRenderersHTML = [
2782
2903
  try {
2783
2904
  transformed = cxt.config.options.transformAsset(node.state);
2784
2905
  } catch {
2785
- return cxt.state.invalidBlock(node, "bad format");
2906
+ return cxt.state.invalidBlock(node, "unable to transform asset");
2786
2907
  }
2787
- const img = transformed ? `<img src="${transformed}" data-original-src="${node.state.href}"/>` : `<img src="${node.state.href}"/>`;
2908
+ const img = transformed ? `<img src="${transformed}" data-original-src="${node.state}"/>` : `<img src="${node.state}"/>`;
2788
2909
  const para = node.content.length == 0 ? "" : "\n<figcaption>" + cxt.state.render(node.content[0].content, cxt) + "</figcaption>";
2789
2910
  return `<figure>${img}${para}</figure>`;
2790
2911
  }]
@@ -2798,10 +2919,13 @@ function createWrapper(name, varname) {
2798
2919
  afterProcessExpansion(node, cxt) {
2799
2920
  let msgs = checkArguments(node, 0);
2800
2921
  if (msgs) return msgs;
2801
- let result = onlyPermitPlaintextParagraph(node);
2922
+ const result = onlyPermitPlaintextParagraph(node);
2802
2923
  if (typeof result !== "string") return result;
2924
+ const previous = cxt.variables.get(varname);
2925
+ if (previous)
2926
+ msgs = [new OverwriteSpecialVariableMessage(node.head, varname, previous)];
2803
2927
  cxt.variables.set(varname, result);
2804
- return [];
2928
+ return msgs ?? [];
2805
2929
  }
2806
2930
  });
2807
2931
  }
@@ -2821,7 +2945,7 @@ var VarWrappers = [
2821
2945
 
2822
2946
  // src/default/default.ts
2823
2947
  var config = Configuration.from(BuiltinConfiguration);
2824
- config.initializers.push(initNotes);
2948
+ config.initializers.push(initNotes, initHeadings);
2825
2949
  config.blockModifiers.add(
2826
2950
  ...HeadingBlocks,
2827
2951
  ...BulletBlocks,