remark-speech 0.0.1 → 0.10.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 (49) hide show
  1. package/README.md +104 -0
  2. package/dist/block/from-markdown.d.ts +4 -0
  3. package/dist/block/from-markdown.d.ts.map +1 -0
  4. package/dist/block/from-markdown.js +39 -0
  5. package/dist/block/from-markdown.js.map +1 -0
  6. package/dist/block/syntax.d.ts +4 -0
  7. package/dist/block/syntax.d.ts.map +1 -0
  8. package/dist/block/syntax.js +144 -0
  9. package/dist/block/syntax.js.map +1 -0
  10. package/dist/block/to-markdown.d.ts +4 -0
  11. package/dist/block/to-markdown.d.ts.map +1 -0
  12. package/dist/block/to-markdown.js +56 -0
  13. package/dist/block/to-markdown.js.map +1 -0
  14. package/dist/block/types.d.ts +74 -0
  15. package/dist/block/types.d.ts.map +1 -0
  16. package/dist/{logic → block}/types.js.map +1 -1
  17. package/dist/index.d.ts +16 -5
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +75 -7
  20. package/dist/index.js.map +1 -1
  21. package/dist/inline/from-markdown.d.ts +4 -0
  22. package/dist/inline/from-markdown.d.ts.map +1 -0
  23. package/dist/inline/from-markdown.js +40 -0
  24. package/dist/inline/from-markdown.js.map +1 -0
  25. package/dist/inline/syntax.d.ts +4 -0
  26. package/dist/inline/syntax.d.ts.map +1 -0
  27. package/dist/{logic → inline}/syntax.js +61 -13
  28. package/dist/inline/syntax.js.map +1 -0
  29. package/dist/inline/to-markdown.d.ts +4 -0
  30. package/dist/inline/to-markdown.d.ts.map +1 -0
  31. package/dist/{logic → inline}/to-markdown.js +12 -8
  32. package/dist/inline/to-markdown.js.map +1 -0
  33. package/dist/{logic → inline}/types.d.ts +25 -16
  34. package/dist/inline/types.d.ts.map +1 -0
  35. package/dist/inline/types.js +2 -0
  36. package/dist/inline/types.js.map +1 -0
  37. package/package.json +2 -2
  38. package/dist/logic/from-markdown.d.ts +0 -3
  39. package/dist/logic/from-markdown.d.ts.map +0 -1
  40. package/dist/logic/from-markdown.js +0 -30
  41. package/dist/logic/from-markdown.js.map +0 -1
  42. package/dist/logic/syntax.d.ts +0 -4
  43. package/dist/logic/syntax.d.ts.map +0 -1
  44. package/dist/logic/syntax.js.map +0 -1
  45. package/dist/logic/to-markdown.d.ts +0 -4
  46. package/dist/logic/to-markdown.d.ts.map +0 -1
  47. package/dist/logic/to-markdown.js.map +0 -1
  48. package/dist/logic/types.d.ts.map +0 -1
  49. /package/dist/{logic → block}/types.js +0 -0
package/README.md CHANGED
@@ -30,3 +30,107 @@ console.log(String(file));
30
30
  ```
31
31
 
32
32
  Input and output keep the same direct-speech block syntax, while the plugin adds AST support for working with speaker metadata.
33
+
34
+ ## Block speech
35
+
36
+ The above is used for _"normal"_ direct speech that is used in most texts. The plugin also supports block speech, which is used for longer speeches or monologues. These
37
+ can contain multiple paragraphs and generally all block elements. The syntax for block speech is similar to the block quote syntax and is as follows:
38
+
39
+ ```
40
+ Dann holte er aus und begann zu sprechen:
41
+ | [[Johnathan]]
42
+ | Veränderung ist wie der Wind: Manchmal spürt man sie kaum, und doch bewegt sie ganze
43
+ | Bäume. Sie kommt leise, aber ihre Wirkung ist unaufhaltsam. Wer sich ihr widersetzt,
44
+ | wird irgendwann gebrochen. Wer sie annimmt, lernt zu fliegen. Die Frage ist nicht, ob
45
+ | wir uns ändern können, sondern ob wir den Mut haben, uns zu ändern – bevor das Leben es
46
+ | für uns tut.
47
+ |
48
+ | Ein einzelnes Licht kann die Dunkelheit erhellen, aber viele Lichter zusammen schaffen
49
+ | eine Sonne. Gemeinschaft bedeutet nicht, dass wir alle gleich sind, sondern dass
50
+ | wir uns gegenseitig stärken – in Schwäche, in Zweifel, in Freude. Denn niemand von
51
+ | uns ist so stark wie wir alle zusammen.
52
+ |
53
+ | …
54
+
55
+ Sein Redefluss sollte noch viele Stunden ungebrochen weitergehen,
56
+ und doch war es nur ein Anfang.
57
+ ```
58
+
59
+ The marker is configurable, depending on the context it may be more appropriate
60
+ to use a different marker than `|` for block speech.
61
+ The default is `|`, but if your markdown formatter complains you could go to `>`.
62
+
63
+ ## Configuration
64
+
65
+ Both inline and block speech support a `requireSpeaker` option.
66
+
67
+ ### Inline options
68
+
69
+ ```ts
70
+ import { remarkDirectSpeech } from "remark-speech";
71
+
72
+ unified().use(remarkDirectSpeech, {
73
+ spoken: {
74
+ quote: '"',
75
+ closingQuote: '"',
76
+ requireSpeaker: "optional", // "always" | "never" | "optional"
77
+ },
78
+ });
79
+ ```
80
+
81
+ ### Block options
82
+
83
+ ```ts
84
+ import { remarkDirectSpeechBlock } from "remark-speech";
85
+
86
+ unified().use(remarkDirectSpeechBlock, {
87
+ spoken: {
88
+ marker: "|",
89
+ requireSpeaker: "optional", // "always" | "never" | "optional"
90
+ },
91
+ });
92
+ ```
93
+
94
+ ### requireSpeaker behavior
95
+
96
+ - `always`: a speaker in `[[...]]` is required.
97
+ - `never`: a speaker in `[[...]]` is not allowed.
98
+ - `optional`: both forms are allowed.
99
+
100
+ If `requireSpeaker` is omitted, the default is `optional`.
101
+
102
+ When a node has an empty speaker, serialization omits `[[...]]`.
103
+
104
+ ## Error Reporting
105
+
106
+ The plugin validates speaker rules during processing and emits parser-visible diagnostics on the VFile.
107
+
108
+ - Violations are added to `file.messages`.
109
+ - Messages are marked as fatal (`message.fatal = true`) so consuming programs can treat them as errors.
110
+ - This is structured diagnostics, not log-only warnings.
111
+
112
+ Example:
113
+
114
+ ```ts
115
+ import { unified } from "unified";
116
+ import remarkParse from "remark-parse";
117
+ import remarkStringify from "remark-stringify";
118
+ import { remarkDirectSpeech } from "remark-speech";
119
+
120
+ const file = unified()
121
+ .use(remarkParse)
122
+ .use(remarkDirectSpeech, {
123
+ spoken: {
124
+ quote: '"',
125
+ requireSpeaker: "always",
126
+ },
127
+ })
128
+ .use(remarkStringify)
129
+ .processSync('"No speaker"');
130
+
131
+ if (file.messages.length > 0) {
132
+ for (const message of file.messages) {
133
+ console.error(String(message));
134
+ }
135
+ }
136
+ ```
@@ -0,0 +1,4 @@
1
+ import type { Extension as FromMarkdownExtension } from "mdast-util-from-markdown";
2
+ import type { DirectSpeechBlockOptions } from "./types.js";
3
+ export declare function directSpeechBlockFromMarkdown(options: DirectSpeechBlockOptions): FromMarkdownExtension;
4
+ //# sourceMappingURL=from-markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"from-markdown.d.ts","sourceRoot":"","sources":["../../src/block/from-markdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,IAAI,qBAAqB,EAEnC,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAqB,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE9E,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,wBAAwB,GAChC,qBAAqB,CAqDvB"}
@@ -0,0 +1,39 @@
1
+ export function directSpeechBlockFromMarkdown(options) {
2
+ const enterDirectSpeechBlock = function enterDirectSpeechBlock(token) {
3
+ this.enter({
4
+ type: "directSpeechBlock",
5
+ speaker: "",
6
+ speechType: "",
7
+ children: [],
8
+ }, token);
9
+ };
10
+ const enterQuoteMarker = function enterQuoteMarker(token) {
11
+ const quoteMarker = this.sliceSerialize(token);
12
+ const speechType = Object.entries(options ?? {}).find(([_, { marker }]) => marker === quoteMarker)?.[0] ?? "spoken";
13
+ const node = this.stack[this.stack.length - 1];
14
+ if (node.type === "directSpeechBlock") {
15
+ node.speechType = speechType;
16
+ }
17
+ };
18
+ const exitDirectSpeechBlock = function exitDirectSpeechBlock(token) {
19
+ this.exit(token);
20
+ };
21
+ const exitDirectSpeechBlockSpeaker = function exitDirectSpeechBlockSpeaker(token) {
22
+ const speaker = this.sliceSerialize(token);
23
+ const node = this.stack[this.stack.length - 1];
24
+ if (node.type === "directSpeechBlock") {
25
+ node.speaker = speaker;
26
+ }
27
+ };
28
+ return {
29
+ enter: {
30
+ directSpeechBlock: enterDirectSpeechBlock,
31
+ directSpeechBlockQuoteMarker: enterQuoteMarker,
32
+ },
33
+ exit: {
34
+ directSpeechBlock: exitDirectSpeechBlock,
35
+ directSpeechBlockSpeaker: exitDirectSpeechBlockSpeaker,
36
+ },
37
+ };
38
+ }
39
+ //# sourceMappingURL=from-markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"from-markdown.js","sourceRoot":"","sources":["../../src/block/from-markdown.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,6BAA6B,CAC3C,OAAiC;IAEjC,MAAM,sBAAsB,GAC1B,SAAS,sBAAsB,CAAC,KAAK;QACnC,IAAI,CAAC,KAAK,CACR;YACE,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE,EAAE;YACX,UAAU,EAAE,EAAE;YACd,QAAQ,EAAE,EAAE;SACQ,EACtB,KAAK,CACN,CAAC;IACJ,CAAC,CAAC;IAEJ,MAAM,gBAAgB,GAAuB,SAAS,gBAAgB,CACpE,KAAK;QAEL,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,UAAU,GACd,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,CAChC,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,KAAK,WAAW,CAC5C,EAAE,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC/C,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;YACtC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC/B,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,qBAAqB,GACzB,SAAS,qBAAqB,CAAC,KAAK;QAClC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC,CAAC;IAEJ,MAAM,4BAA4B,GAChC,SAAS,4BAA4B,CAAC,KAAK;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAE/C,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;YACtC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACzB,CAAC;IACH,CAAC,CAAC;IAEJ,OAAO;QACL,KAAK,EAAE;YACL,iBAAiB,EAAE,sBAAsB;YACzC,4BAA4B,EAAE,gBAAgB;SAC/C;QACD,IAAI,EAAE;YACJ,iBAAiB,EAAE,qBAAqB;YACxC,wBAAwB,EAAE,4BAA4B;SACvD;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Extension } from "micromark-util-types";
2
+ import type { DirectSpeechBlockOptions } from "./types.js";
3
+ export declare function directSpeechBlock(options: DirectSpeechBlockOptions): Extension;
4
+ //# sourceMappingURL=syntax.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syntax.d.ts","sourceRoot":"","sources":["../../src/block/syntax.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,SAAS,EAGV,MAAM,sBAAsB,CAAC;AAG9B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,wBAAwB,GAChC,SAAS,CAyBX"}
@@ -0,0 +1,144 @@
1
+ import { markdownLineEnding, markdownSpace } from "micromark-util-character";
2
+ export function directSpeechBlock(options) {
3
+ const document = Object.fromEntries(Object.entries(options).map(([speechType, { marker }]) => {
4
+ const markerCode = marker.charCodeAt(0);
5
+ const construct = {
6
+ name: "directSpeechBlock",
7
+ tokenize: createDirectSpeechBlockTokenizer(markerCode),
8
+ continuation: {
9
+ tokenize: createDirectSpeechBlockContinuationTokenizer(markerCode),
10
+ },
11
+ exit: exitDirectSpeechBlock,
12
+ };
13
+ return [
14
+ markerCode,
15
+ {
16
+ add: "before",
17
+ ...construct,
18
+ },
19
+ ];
20
+ }));
21
+ return {
22
+ document: document,
23
+ };
24
+ }
25
+ const exitDirectSpeechBlock = function (effects) {
26
+ effects.exit("directSpeechBlock");
27
+ };
28
+ function createDirectSpeechBlockTokenizer(markerCode) {
29
+ return function tokenizeDirectSpeechBlock(effects, ok, nok) {
30
+ const state = this.containerState ?? {};
31
+ this.containerState = state;
32
+ let hasSpeakerContent = false;
33
+ return start;
34
+ function start(code) {
35
+ if (code !== markerCode) {
36
+ return nok(code);
37
+ }
38
+ effects.enter("directSpeechBlock", { _container: true });
39
+ state["open"] = true;
40
+ effects.enter("directSpeechBlockQuoteMarker");
41
+ effects.consume(code);
42
+ effects.exit("directSpeechBlockQuoteMarker");
43
+ return afterMarker;
44
+ }
45
+ function afterMarker(code) {
46
+ if (markdownSpace(code)) {
47
+ effects.enter("directSpeechBlockPrefixWhitespace");
48
+ effects.consume(code);
49
+ effects.exit("directSpeechBlockPrefixWhitespace");
50
+ return afterMarker;
51
+ }
52
+ if (code === null || markdownLineEnding(code)) {
53
+ return ok(code);
54
+ }
55
+ if (code === 91) {
56
+ // [
57
+ effects.enter("directSpeechBlockMarkerStart");
58
+ effects.consume(code);
59
+ return openSpeakerMarker;
60
+ }
61
+ return nok(code);
62
+ }
63
+ function openSpeakerMarker(code) {
64
+ if (code !== 91) {
65
+ // [
66
+ return nok(code);
67
+ }
68
+ effects.consume(code);
69
+ effects.exit("directSpeechBlockMarkerStart");
70
+ effects.enter("directSpeechBlockSpeaker");
71
+ return speaker;
72
+ }
73
+ function speaker(code) {
74
+ if (code === null || markdownLineEnding(code)) {
75
+ return nok(code);
76
+ }
77
+ if (code === 93) {
78
+ // ]
79
+ if (!hasSpeakerContent) {
80
+ return nok(code);
81
+ }
82
+ effects.exit("directSpeechBlockSpeaker");
83
+ effects.enter("directSpeechBlockMarkerEnd");
84
+ effects.consume(code);
85
+ return closeSpeakerMarker;
86
+ }
87
+ hasSpeakerContent = true;
88
+ effects.consume(code);
89
+ return speaker;
90
+ }
91
+ function closeSpeakerMarker(code) {
92
+ if (code !== 93) {
93
+ // ]
94
+ return nok(code);
95
+ }
96
+ effects.consume(code);
97
+ effects.exit("directSpeechBlockMarkerEnd");
98
+ return afterSpeaker;
99
+ }
100
+ function afterSpeaker(code) {
101
+ // Consume anything else on the first line (trailing whitespace, etc.)
102
+ if (code === null || markdownLineEnding(code)) {
103
+ // End of first line — do NOT exit directSpeechBlock here.
104
+ // micromark calls the `exit` exiter when the block ends.
105
+ return ok(code);
106
+ }
107
+ effects.consume(code);
108
+ return afterSpeaker;
109
+ }
110
+ };
111
+ }
112
+ function createDirectSpeechBlockContinuationTokenizer(markerCode) {
113
+ return function tokenizeDirectSpeechBlockContinuation(effects, ok, nok) {
114
+ return contStart;
115
+ function contStart(code) {
116
+ if (code !== markerCode) {
117
+ return nok(code);
118
+ }
119
+ effects.enter("directSpeechBlockQuoteMarker");
120
+ effects.consume(code);
121
+ effects.exit("directSpeechBlockQuoteMarker");
122
+ return afterMarker;
123
+ }
124
+ function afterMarker(code) {
125
+ // Consume optional single space after the marker
126
+ if (markdownSpace(code)) {
127
+ effects.enter("directSpeechBlockPrefixWhitespace");
128
+ effects.consume(code);
129
+ effects.exit("directSpeechBlockPrefixWhitespace");
130
+ return ok;
131
+ }
132
+ return ok(code);
133
+ }
134
+ };
135
+ }
136
+ function getMarker(value, fallback) {
137
+ const resolved = value ?? fallback;
138
+ const symbols = Array.from(resolved);
139
+ if (symbols.length !== 1) {
140
+ throw new Error(`Direct speech block marker must be a single character, received ${JSON.stringify(resolved)}.`);
141
+ }
142
+ return resolved;
143
+ }
144
+ //# sourceMappingURL=syntax.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syntax.js","sourceRoot":"","sources":["../../src/block/syntax.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Options as ToMarkdownExtension } from "mdast-util-to-markdown";
2
+ import type { DirectSpeechBlockOptions } from "./types.js";
3
+ export declare function directSpeechBlockToMarkdown(options: DirectSpeechBlockOptions): ToMarkdownExtension;
4
+ //# sourceMappingURL=to-markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-markdown.d.ts","sourceRoot":"","sources":["../../src/block/to-markdown.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,OAAO,IAAI,mBAAmB,EAG/B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAqB,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE9E,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,wBAAwB,GAChC,mBAAmB,CA6BrB"}
@@ -0,0 +1,56 @@
1
+ export function directSpeechBlockToMarkdown(options) {
2
+ const marker_to_type = {};
3
+ const type_to_marker = {};
4
+ for (const [speechType, { marker }] of Object.entries(options)) {
5
+ marker_to_type[marker] = speechType;
6
+ type_to_marker[speechType] = marker;
7
+ }
8
+ return {
9
+ handlers: {
10
+ directSpeechBlock: ((node, parent, state, info) => {
11
+ return handleDirectSpeechBlock(node, parent, state, info, {
12
+ marker_to_type,
13
+ type_to_marker,
14
+ });
15
+ }),
16
+ },
17
+ };
18
+ }
19
+ function handleDirectSpeechBlock(node, _parent, state, info, marker_mapping) {
20
+ const tracker = state.createTracker(info);
21
+ const marker = marker_mapping.type_to_marker[node.speechType];
22
+ const markerStr = `${marker} `;
23
+ const speakerPrefix = node.speaker.length > 0 ? ` [[${node.speaker}]]` : "";
24
+ // Start with marker and speaker
25
+ let value = tracker.move(`${marker}${speakerPrefix}`);
26
+ // If there are children, render them with marker prefix on each line
27
+ if (node.children && node.children.length > 0) {
28
+ value += "\n";
29
+ // Render block content
30
+ const flowInfo = {
31
+ ...tracker.current(),
32
+ before: value,
33
+ after: "\n",
34
+ };
35
+ const content = state.containerFlow(node, flowInfo);
36
+ // Prefix each line of content with marker
37
+ const lines = content.split("\n");
38
+ const prefixedLines = lines.map((line) => {
39
+ if (line.length === 0) {
40
+ // Empty lines (paragraph separators) get just the marker, no trailing space
41
+ return marker;
42
+ }
43
+ return markerStr + line;
44
+ });
45
+ value += prefixedLines.join("\n");
46
+ }
47
+ return value;
48
+ }
49
+ function getSingleCharacter(value, fallback) {
50
+ const resolved = value ?? fallback;
51
+ if (Array.from(resolved).length !== 1) {
52
+ throw new Error(`Direct speech block marker must be a single character, received ${JSON.stringify(resolved)}.`);
53
+ }
54
+ return resolved;
55
+ }
56
+ //# sourceMappingURL=to-markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-markdown.js","sourceRoot":"","sources":["../../src/block/to-markdown.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,2BAA2B,CACzC,OAAiC;IAEjC,MAAM,cAAc,GAA2B,EAAE,CAAC;IAClD,MAAM,cAAc,GAA2B,EAAE,CAAC;IAClD,KAAK,MAAM,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/D,cAAc,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC;QACpC,cAAc,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC;IACtC,CAAC;IAED,OAAO;QACL,QAAQ,EAAE;YACR,iBAAiB,EAAE,CAAC,CAClB,IAAa,EACb,MAAe,EACf,KAAY,EACZ,IAAU,EACV,EAAE;gBACF,OAAO,uBAAuB,CAC5B,IAAyB,EACzB,MAA6B,EAC7B,KAAK,EACL,IAAI,EACJ;oBACE,cAAc;oBACd,cAAc;iBACf,CACF,CAAC;YACJ,CAAC,CAAW;SACb;KACF,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAC9B,IAAuB,EACvB,OAA4B,EAC5B,KAAY,EACZ,IAAU,EACV,cAGC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,cAAc,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,GAAG,MAAM,GAAG,CAAC;IAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAE5E,gCAAgC;IAChC,IAAI,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,aAAa,EAAE,CAAC,CAAC;IAEtD,qEAAqE;IACrE,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,KAAK,IAAI,IAAI,CAAC;QAEd,uBAAuB;QACvB,MAAM,QAAQ,GAAG;YACf,GAAG,OAAO,CAAC,OAAO,EAAE;YACpB,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,IAAI;SACZ,CAAC;QAEF,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAEpD,0CAA0C;QAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACvC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,4EAA4E;gBAC5E,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,OAAO,SAAS,GAAG,IAAI,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,KAAK,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CACzB,KAAyB,EACzB,QAAgB;IAEhB,MAAM,QAAQ,GAAG,KAAK,IAAI,QAAQ,CAAC;IAEnC,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CACb,mEAAmE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAC/F,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,74 @@
1
+ import type { BlockContent, DefinitionContent, Parent } from "mdast";
2
+ /**
3
+ * mdast node
4
+ *
5
+ * | [[Fay]]
6
+ * | Hallo **Welt**
7
+ */
8
+ export interface DirectSpeechBlock extends Parent {
9
+ type: "directSpeechBlock";
10
+ /**
11
+ * Name of the speaker within [[...]]
12
+ */
13
+ speaker: string;
14
+ /**
15
+ * Type of the direct speech, might be thought, spoken, or other.
16
+ */
17
+ speechType: string;
18
+ children: Array<BlockContent | DefinitionContent>;
19
+ }
20
+ declare module "mdast" {
21
+ interface FlowContentMap {
22
+ directSpeechBlock: DirectSpeechBlock;
23
+ }
24
+ interface RootContentMap {
25
+ directSpeechBlock: DirectSpeechBlock;
26
+ }
27
+ }
28
+ /**
29
+ * Options of the micromark Extension
30
+ */
31
+ export type DirectSpeechBlockOptions = {
32
+ [speechType: string]: {
33
+ /**
34
+ * Character that is prepended to the speech, similar to blockquotes.
35
+ *
36
+ * Example:
37
+ *
38
+ * | [[Fay]]
39
+ * | Hello
40
+ * ^
41
+ */
42
+ marker: string;
43
+ /**
44
+ * Whether the speaker is required or not. If true, the speaker must be provided in the [[...]] syntax.
45
+ */
46
+ requireSpeaker?: "always" | "never" | "optional";
47
+ };
48
+ };
49
+ declare module "micromark-util-types" {
50
+ interface TokenTypeMap {
51
+ directSpeechBlock: "directSpeechBlock";
52
+ /**
53
+ * [[Fay]]
54
+ */
55
+ directSpeechBlockSpeaker: "directSpeechBlockSpeaker";
56
+ /**
57
+ * [[
58
+ */
59
+ directSpeechBlockMarkerStart: "directSpeechBlockMarkerStart";
60
+ /**
61
+ * ]]
62
+ */
63
+ directSpeechBlockMarkerEnd: "directSpeechBlockMarkerEnd";
64
+ /**
65
+ * default blockquote marker, e.g. |
66
+ */
67
+ directSpeechBlockQuoteMarker: "directSpeechBlockQuoteMarker";
68
+ /**
69
+ * Optional space after the marker
70
+ */
71
+ directSpeechBlockPrefixWhitespace: "directSpeechBlockPrefixWhitespace";
72
+ }
73
+ }
74
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/block/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAErE;;;;;GAKG;AACH,MAAM,WAAW,iBAAkB,SAAQ,MAAM;IAC/C,IAAI,EAAE,mBAAmB,CAAC;IAE1B;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,KAAK,CAAC,YAAY,GAAG,iBAAiB,CAAC,CAAC;CACnD;AAED,OAAO,QAAQ,OAAO,CAAC;IACrB,UAAU,cAAc;QACtB,iBAAiB,EAAE,iBAAiB,CAAC;KACtC;IAED,UAAU,cAAc;QACtB,iBAAiB,EAAE,iBAAiB,CAAC;KACtC;CACF;AAED;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,CAAC,UAAU,EAAE,MAAM,GAAG;QACpB;;;;;;;;WAQG;QACH,MAAM,EAAE,MAAM,CAAC;QAEf;;WAEG;QACH,cAAc,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAC;KAClD,CAAC;CACH,CAAC;AAEF,OAAO,QAAQ,sBAAsB,CAAC;IACpC,UAAU,YAAY;QACpB,iBAAiB,EAAE,mBAAmB,CAAC;QAEvC;;WAEG;QACH,wBAAwB,EAAE,0BAA0B,CAAC;QAErD;;WAEG;QACH,4BAA4B,EAAE,8BAA8B,CAAC;QAE7D;;WAEG;QACH,0BAA0B,EAAE,4BAA4B,CAAC;QAEzD;;WAEG;QACH,4BAA4B,EAAE,8BAA8B,CAAC;QAE7D;;WAEG;QACH,iCAAiC,EAAE,mCAAmC,CAAC;KACxE;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/logic/types.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/block/types.ts"],"names":[],"mappings":""}
package/dist/index.d.ts CHANGED
@@ -1,15 +1,26 @@
1
1
  import type { Plugin } from "unified";
2
2
  import "remark-stringify";
3
3
  import "remark-parse";
4
- import { directSpeechFromMarkdown } from "./logic/from-markdown.js";
5
- import { directSpeech } from "./logic/syntax.js";
6
- import { directSpeechToMarkdown } from "./logic/to-markdown.js";
7
- import type { DirectSpeechOptions } from "./logic/types.js";
4
+ import { directSpeechFromMarkdown } from "./inline/from-markdown.js";
5
+ import { directSpeech } from "./inline/syntax.js";
6
+ import { directSpeechToMarkdown } from "./inline/to-markdown.js";
7
+ import type { DirectSpeechOptions } from "./inline/types.js";
8
+ import { directSpeechBlockFromMarkdown } from "./block/from-markdown.js";
9
+ import { directSpeechBlock } from "./block/syntax.js";
10
+ import { directSpeechBlockToMarkdown } from "./block/to-markdown.js";
11
+ import type { DirectSpeechBlockOptions } from "./block/types.js";
8
12
  export declare const remarkDirectSpeech: Plugin<[
9
13
  (DirectSpeechOptions | null | undefined)?
10
14
  ]>;
15
+ export declare const remarkDirectSpeechBlock: Plugin<[
16
+ (DirectSpeechBlockOptions | null | undefined)?
17
+ ]>;
11
18
  export { directSpeechFromMarkdown };
12
19
  export { directSpeech };
13
20
  export { directSpeechToMarkdown };
14
- export type { DirectSpeechInline, DirectSpeechOptions } from "./logic/types.js";
21
+ export { directSpeechBlockFromMarkdown };
22
+ export { directSpeechBlock };
23
+ export { directSpeechBlockToMarkdown };
24
+ export type { DirectSpeechInline, DirectSpeechOptions, } from "./inline/types.js";
25
+ export type { DirectSpeechBlock, DirectSpeechBlockOptions, } from "./block/types.js";
15
26
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEtC,OAAO,kBAAkB,CAAC;AAC1B,OAAO,cAAc,CAAC;AAEtB,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,eAAO,MAAM,kBAAkB,EAAE,MAAM,CACrC;IAAC,CAAC,mBAAmB,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;CAAC,CAU5C,CAAC;AAEF,OAAO,EAAE,wBAAwB,EAAE,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,CAAC;AACxB,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAElC,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAItC,OAAO,kBAAkB,CAAC;AAC1B,OAAO,cAAc,CAAC;AAEtB,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAEV,mBAAmB,EACpB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,KAAK,EAEV,wBAAwB,EACzB,MAAM,kBAAkB,CAAC;AAwB1B,eAAO,MAAM,kBAAkB,EAAE,MAAM,CACrC;IAAC,CAAC,mBAAmB,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;CAAC,CA8C5C,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAC1C;IAAC,CAAC,wBAAwB,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;CAAC,CAiDjD,CAAC;AAEF,OAAO,EAAE,wBAAwB,EAAE,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,CAAC;AACxB,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAElC,OAAO,EAAE,6BAA6B,EAAE,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAC7B,OAAO,EAAE,2BAA2B,EAAE,CAAC;AAEvC,YAAY,EACV,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EACV,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,kBAAkB,CAAC"}
package/dist/index.js CHANGED
@@ -1,18 +1,86 @@
1
+ import { visit } from "unist-util-visit";
1
2
  import "remark-stringify";
2
3
  import "remark-parse";
3
- import { directSpeechFromMarkdown } from "./logic/from-markdown.js";
4
- import { directSpeech } from "./logic/syntax.js";
5
- import { directSpeechToMarkdown } from "./logic/to-markdown.js";
6
- export const remarkDirectSpeech = function remarkDirectSpeech(options = {}) {
4
+ import { directSpeechFromMarkdown } from "./inline/from-markdown.js";
5
+ import { directSpeech } from "./inline/syntax.js";
6
+ import { directSpeechToMarkdown } from "./inline/to-markdown.js";
7
+ import { directSpeechBlockFromMarkdown } from "./block/from-markdown.js";
8
+ import { directSpeechBlock } from "./block/syntax.js";
9
+ import { directSpeechBlockToMarkdown } from "./block/to-markdown.js";
10
+ function normalizeRequireSpeaker(mode) {
11
+ return mode ?? "optional";
12
+ }
13
+ function reportValidationIssue(file, reason, place) {
14
+ if (typeof file.message === "function") {
15
+ const message = file.message(reason, place, "remark-speech");
16
+ message.fatal = true;
17
+ return;
18
+ }
19
+ throw new Error(reason);
20
+ }
21
+ export const remarkDirectSpeech = function remarkDirectSpeech(options) {
22
+ const resolvedOptions = options ?? {
23
+ spoken: {
24
+ quote: '"',
25
+ closingQuote: '"',
26
+ },
27
+ };
7
28
  const data = this.data();
8
29
  data.micromarkExtensions = data.micromarkExtensions ?? [];
9
30
  data.fromMarkdownExtensions = data.fromMarkdownExtensions ?? [];
10
31
  data.toMarkdownExtensions = data.toMarkdownExtensions ?? [];
11
- data.micromarkExtensions.push(directSpeech(options ?? {}));
12
- data.fromMarkdownExtensions.push(directSpeechFromMarkdown());
13
- data.toMarkdownExtensions.push(directSpeechToMarkdown(options ?? {}));
32
+ data.micromarkExtensions.push(directSpeech(resolvedOptions));
33
+ data.fromMarkdownExtensions.push(directSpeechFromMarkdown(resolvedOptions));
34
+ data.toMarkdownExtensions.push(directSpeechToMarkdown(resolvedOptions));
35
+ return (tree, file) => {
36
+ visit(tree, "directSpeechInline", (node) => {
37
+ const directSpeechNode = node;
38
+ const speechType = directSpeechNode.speechType;
39
+ const speechOptions = resolvedOptions[speechType];
40
+ const requireSpeaker = normalizeRequireSpeaker(speechOptions?.requireSpeaker);
41
+ if (requireSpeaker === "always" &&
42
+ directSpeechNode.speaker.length === 0) {
43
+ reportValidationIssue(file, `Direct speech of type "${speechType}" requires a speaker in [[...]].`, directSpeechNode.position);
44
+ }
45
+ if (requireSpeaker === "never" && directSpeechNode.speaker.length > 0) {
46
+ reportValidationIssue(file, `Direct speech of type "${speechType}" does not allow a speaker in [[...]].`, directSpeechNode.position);
47
+ }
48
+ });
49
+ };
50
+ };
51
+ export const remarkDirectSpeechBlock = function remarkDirectSpeechBlock(options) {
52
+ const resolvedOptions = options ?? {
53
+ spoken: {
54
+ marker: "|",
55
+ },
56
+ };
57
+ const data = this.data();
58
+ data.micromarkExtensions = data.micromarkExtensions ?? [];
59
+ data.fromMarkdownExtensions = data.fromMarkdownExtensions ?? [];
60
+ data.toMarkdownExtensions = data.toMarkdownExtensions ?? [];
61
+ data.micromarkExtensions.push(directSpeechBlock(resolvedOptions));
62
+ data.fromMarkdownExtensions.push(directSpeechBlockFromMarkdown(resolvedOptions));
63
+ data.toMarkdownExtensions.push(directSpeechBlockToMarkdown(resolvedOptions));
64
+ return (tree, file) => {
65
+ visit(tree, "directSpeechBlock", (node) => {
66
+ const directSpeechNode = node;
67
+ const speechType = directSpeechNode.speechType;
68
+ const speechOptions = resolvedOptions[speechType];
69
+ const requireSpeaker = normalizeRequireSpeaker(speechOptions?.requireSpeaker);
70
+ if (requireSpeaker === "always" &&
71
+ directSpeechNode.speaker.length === 0) {
72
+ reportValidationIssue(file, `Direct speech block of type "${speechType}" requires a speaker in [[...]].`, directSpeechNode.position);
73
+ }
74
+ if (requireSpeaker === "never" && directSpeechNode.speaker.length > 0) {
75
+ reportValidationIssue(file, `Direct speech block of type "${speechType}" does not allow a speaker in [[...]].`, directSpeechNode.position);
76
+ }
77
+ });
78
+ };
14
79
  };
15
80
  export { directSpeechFromMarkdown };
16
81
  export { directSpeech };
17
82
  export { directSpeechToMarkdown };
83
+ export { directSpeechBlockFromMarkdown };
84
+ export { directSpeechBlock };
85
+ export { directSpeechBlockToMarkdown };
18
86
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,cAAc,CAAC;AAEtB,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAGhE,MAAM,CAAC,MAAM,kBAAkB,GAE3B,SAAS,kBAAkB,CAAC,OAAO,GAAG,EAAE;IAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACzB,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,IAAI,EAAE,CAAC;IAC1D,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,IAAI,EAAE,CAAC;IAChE,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,IAAI,EAAE,CAAC;IAE5D,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3D,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,wBAAwB,EAAE,CAAC,CAAC;IAC7D,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,sBAAsB,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;AACxE,CAAC,CAAC;AAEF,OAAO,EAAE,wBAAwB,EAAE,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,CAAC;AACxB,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Extension as FromMarkdownExtension } from "mdast-util-from-markdown";
2
+ import type { DirectSpeechOptions } from "./types.js";
3
+ export declare function directSpeechFromMarkdown(options: DirectSpeechOptions): FromMarkdownExtension;
4
+ //# sourceMappingURL=from-markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"from-markdown.d.ts","sourceRoot":"","sources":["../../src/inline/from-markdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,IAAI,qBAAqB,EAEnC,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAsB,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAE1E,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,mBAAmB,GAC3B,qBAAqB,CAsDvB"}
@@ -0,0 +1,40 @@
1
+ export function directSpeechFromMarkdown(options) {
2
+ const enterDirectSpeech = function enterDirectSpeech(token) {
3
+ this.enter({
4
+ type: "directSpeechInline",
5
+ speaker: "",
6
+ speechType: "",
7
+ children: [],
8
+ }, token);
9
+ };
10
+ const enterQuoteMarkerStart = function enterQuoteMarkerStart(token) {
11
+ const qutoeMarker = this.sliceSerialize(token);
12
+ const speechType = Object.entries(options ?? {}).find(([_, { quote }]) => quote === qutoeMarker)?.[0] ?? "spoken";
13
+ const node = this.stack[this.stack.length - 1];
14
+ if (node.type === "directSpeechInline") {
15
+ node.speechType = speechType;
16
+ }
17
+ };
18
+ const exitDirectSpeech = function exitDirectSpeech(token) {
19
+ this.exit(token);
20
+ };
21
+ const exitDirectSpeechSpeaker = function exitDirectSpeechSpeaker(token) {
22
+ const speaker = this.sliceSerialize(token);
23
+ const node = this.stack[this.stack.length - 1];
24
+ if (node.type === "directSpeechInline") {
25
+ node.speaker = speaker;
26
+ }
27
+ };
28
+ return {
29
+ canContainEols: ["directSpeechInline"],
30
+ enter: {
31
+ directSpeech: enterDirectSpeech,
32
+ directSpeechQuoteMarkerStart: enterQuoteMarkerStart,
33
+ },
34
+ exit: {
35
+ directSpeech: exitDirectSpeech,
36
+ directSpeechSpeaker: exitDirectSpeechSpeaker,
37
+ },
38
+ };
39
+ }
40
+ //# sourceMappingURL=from-markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"from-markdown.js","sourceRoot":"","sources":["../../src/inline/from-markdown.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,wBAAwB,CACtC,OAA4B;IAE5B,MAAM,iBAAiB,GAAuB,SAAS,iBAAiB,CACtE,KAAK;QAEL,IAAI,CAAC,KAAK,CACR;YACE,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,EAAE;YACX,UAAU,EAAE,EAAE;YACd,QAAQ,EAAE,EAAE;SACS,EACvB,KAAK,CACN,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,qBAAqB,GACzB,SAAS,qBAAqB,CAAC,KAAK;QAClC,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,UAAU,GACd,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,CAChC,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,WAAW,CAC1C,EAAE,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC/C,IAAI,IAAI,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;YACvC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC/B,CAAC;IACH,CAAC,CAAC;IAEJ,MAAM,gBAAgB,GAAuB,SAAS,gBAAgB,CACpE,KAAK;QAEL,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC,CAAC;IAEF,MAAM,uBAAuB,GAC3B,SAAS,uBAAuB,CAAC,KAAK;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAE/C,IAAI,IAAI,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;YACvC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACzB,CAAC;IACH,CAAC,CAAC;IACJ,OAAO;QACL,cAAc,EAAE,CAAC,oBAAoB,CAAC;QACtC,KAAK,EAAE;YACL,YAAY,EAAE,iBAAiB;YAC/B,4BAA4B,EAAE,qBAAqB;SACpD;QACD,IAAI,EAAE;YACJ,YAAY,EAAE,gBAAgB;YAC9B,mBAAmB,EAAE,uBAAuB;SAC7C;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Extension } from "micromark-util-types";
2
+ import type { DirectSpeechOptions } from "./types.js";
3
+ export declare function directSpeech(options: DirectSpeechOptions): Extension;
4
+ //# sourceMappingURL=syntax.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syntax.d.ts","sourceRoot":"","sources":["../../src/inline/syntax.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAQ,SAAS,EAAoB,MAAM,sBAAsB,CAAC;AAE9E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAMtD,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,SAAS,CAkBpE"}
@@ -2,24 +2,54 @@ import { markdownLineEndingOrSpace } from "micromark-util-character";
2
2
  const leftSquareBracket = 91;
3
3
  const rightSquareBracket = 93;
4
4
  const doubleQuote = 34;
5
- export function directSpeech(options = {}) {
6
- const quote = getSingleCodePoint(options.quote, '"');
7
- const closingQuote = getSingleCodePoint(options.closingQuote, String.fromCodePoint(quote));
5
+ export function directSpeech(options) {
6
+ const tokenizer = createDirectSpeechTokenizer(options);
7
+ const openingQuoteCodePoints = new Set(Object.values(options).map(({ quote }) => getSingleCodePoint(quote, '"')));
8
+ const textConstructs = {};
9
+ for (const codePoint of [leftSquareBracket, ...openingQuoteCodePoints]) {
10
+ textConstructs[codePoint] = {
11
+ add: "before",
12
+ name: "directSpeech",
13
+ tokenize: tokenizer,
14
+ };
15
+ }
8
16
  return {
9
- text: {
10
- [leftSquareBracket]: {
11
- add: "before",
12
- name: "directSpeech",
13
- tokenize: createDirectSpeechTokenizer(quote, closingQuote),
14
- },
15
- },
17
+ text: textConstructs,
16
18
  };
17
19
  }
18
- function createDirectSpeechTokenizer(quote, closingQuote) {
20
+ function createDirectSpeechTokenizer(options) {
21
+ const type_to_opening_quote_code_point = Object.fromEntries(Object.entries(options).map(([speechType, { quote }]) => [
22
+ speechType,
23
+ getSingleCodePoint(quote, '"'),
24
+ ]));
25
+ const type_to_closing_quote_code_point = Object.fromEntries(Object.entries(options).map(([speechType, { closingQuote, quote }]) => [
26
+ speechType,
27
+ getSingleCodePoint(closingQuote, quote ?? '"'),
28
+ ]));
29
+ const opening_quote_code_points = new Set(Object.values(type_to_opening_quote_code_point));
30
+ const closing_quote_code_point_to_speech_type = Object.fromEntries(Object.entries(type_to_closing_quote_code_point).map(([speechType, closingQuoteCodePoint]) => [
31
+ closingQuoteCodePoint,
32
+ speechType,
33
+ ]));
34
+ const opening_quote_code_point_to_speech_type = Object.fromEntries(Object.entries(type_to_opening_quote_code_point).map(([speechType, openingQuoteCodePoint]) => [
35
+ openingQuoteCodePoint,
36
+ speechType,
37
+ ]));
38
+ const type_to_require_speaker = Object.fromEntries(Object.entries(options).map(([speechType, { requireSpeaker }]) => [
39
+ speechType,
40
+ requireSpeaker ?? "optional",
41
+ ]));
19
42
  return function tokenizeDirectSpeech(effects, ok, nok) {
20
43
  let hasSpeakerContent = false;
44
+ let speechType;
45
+ const previous = this.previous;
21
46
  return start;
22
47
  function start(code) {
48
+ if (code !== null &&
49
+ opening_quote_code_points.has(code) &&
50
+ (previous === null || markdownLineEndingOrSpace(previous))) {
51
+ return quoteStart(code);
52
+ }
23
53
  if (code !== leftSquareBracket) {
24
54
  /* v8 ignore next */
25
55
  return nok(code);
@@ -63,6 +93,23 @@ function createDirectSpeechTokenizer(quote, closingQuote) {
63
93
  effects.exit("directSpeechSpeakerMarkerEnd");
64
94
  return beforeQuote;
65
95
  }
96
+ function quoteStart(code) {
97
+ if (code === null || !opening_quote_code_points.has(code)) {
98
+ return nok(code);
99
+ }
100
+ speechType = opening_quote_code_point_to_speech_type[code];
101
+ if (!speechType) {
102
+ return nok(code);
103
+ }
104
+ effects.enter("directSpeech");
105
+ effects.enter("directSpeechQuoteMarkerStart");
106
+ effects.consume(code);
107
+ effects.exit("directSpeechQuoteMarkerStart");
108
+ effects.enter("directSpeechContent", {
109
+ contentType: "text",
110
+ });
111
+ return content;
112
+ }
66
113
  function beforeQuote(code) {
67
114
  if (code === null) {
68
115
  /* v8 ignore next */
@@ -74,9 +121,10 @@ function createDirectSpeechTokenizer(quote, closingQuote) {
74
121
  effects.exit("whitespace");
75
122
  return beforeQuote;
76
123
  }
77
- if (code !== quote) {
124
+ if (!opening_quote_code_points.has(code)) {
78
125
  return nok(code);
79
126
  }
127
+ speechType = opening_quote_code_point_to_speech_type[code];
80
128
  effects.enter("directSpeechQuoteMarkerStart");
81
129
  effects.consume(code);
82
130
  effects.exit("directSpeechQuoteMarkerStart");
@@ -89,7 +137,7 @@ function createDirectSpeechTokenizer(quote, closingQuote) {
89
137
  if (code === null) {
90
138
  return nok(code);
91
139
  }
92
- if (code === closingQuote) {
140
+ if (code === type_to_closing_quote_code_point[speechType]) {
93
141
  effects.exit("directSpeechContent");
94
142
  effects.enter("directSpeechQuoteMarkerEnd");
95
143
  effects.consume(code);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syntax.js","sourceRoot":"","sources":["../../src/inline/syntax.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Options as ToMarkdownExtension } from "mdast-util-to-markdown";
2
+ import type { DirectSpeechOptions } from "./types.js";
3
+ export declare function directSpeechToMarkdown(options: DirectSpeechOptions): ToMarkdownExtension;
4
+ //# sourceMappingURL=to-markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-markdown.d.ts","sourceRoot":"","sources":["../../src/inline/to-markdown.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,OAAO,IAAI,mBAAmB,EAG/B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,mBAAmB,EAAsB,MAAM,YAAY,CAAC;AAE1E,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,mBAAmB,GAC3B,mBAAmB,CAyBrB"}
@@ -1,6 +1,4 @@
1
- export function directSpeechToMarkdown(options = {}) {
2
- const quote = getSingleCharacter(options.quote, '"');
3
- const closingQuote = getSingleCharacter(options.closingQuote, quote);
1
+ export function directSpeechToMarkdown(options) {
4
2
  return {
5
3
  unsafe: [
6
4
  {
@@ -9,15 +7,21 @@ export function directSpeechToMarkdown(options = {}) {
9
7
  },
10
8
  ],
11
9
  handlers: {
12
- directSpeechInline(node, parent, state, info) {
13
- return handleDirectSpeechInline(node, parent, state, info, quote, closingQuote);
14
- },
10
+ directSpeechInline: ((node, parent, state, info) => {
11
+ return handleDirectSpeechInline(node, parent, state, info, options);
12
+ }),
15
13
  },
16
14
  };
17
15
  }
18
- function handleDirectSpeechInline(node, _parent, state, info, quote, closingQuote) {
16
+ function handleDirectSpeechInline(node, _parent, state, info, options) {
17
+ if (options[node.speechType] === undefined) {
18
+ throw new Error(`Direct speech type "${node.speechType}" is not defined in the options ${JSON.stringify(options)}.`);
19
+ }
20
+ const quote = getSingleCharacter(options[node.speechType].quote, '"');
21
+ const closingQuote = getSingleCharacter(options[node.speechType].closingQuote, quote);
19
22
  const tracker = state.createTracker(info);
20
- let value = tracker.move(`[[${node.speaker}]]${quote}`);
23
+ const speakerPrefix = node.speaker.length > 0 ? `[[${node.speaker}]]` : "";
24
+ let value = tracker.move(`${speakerPrefix}${quote}`);
21
25
  value += state.containerPhrasing(node, {
22
26
  ...tracker.current(),
23
27
  before: value,
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-markdown.js","sourceRoot":"","sources":["../../src/inline/to-markdown.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,sBAAsB,CACpC,OAA4B;IAE5B,OAAO;QACL,MAAM,EAAE;YACN;gBACE,SAAS,EAAE,GAAG;gBACd,WAAW,EAAE,UAAU;aACxB;SACF;QACD,QAAQ,EAAE;YACR,kBAAkB,EAAE,CAAC,CACnB,IAAa,EACb,MAAe,EACf,KAAY,EACZ,IAAU,EACV,EAAE;gBACF,OAAO,wBAAwB,CAC7B,IAA0B,EAC1B,MAA6B,EAC7B,KAAK,EACL,IAAI,EACJ,OAAO,CACR,CAAC;YACJ,CAAC,CAAW;SACb;KACF,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAC/B,IAAwB,EACxB,OAA4B,EAC5B,KAAY,EACZ,IAAU,EACV,OAA4B;IAE5B,IAAI,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,SAAS,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,uBAAuB,IAAI,CAAC,UAAU,mCAAmC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CACpG,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACtE,MAAM,YAAY,GAAG,kBAAkB,CACrC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,YAAY,EACrC,KAAK,CACN,CAAC;IAEF,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3E,IAAI,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,aAAa,GAAG,KAAK,EAAE,CAAC,CAAC;IAErD,KAAK,IAAI,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE;QACrC,GAAG,OAAO,CAAC,OAAO,EAAE;QACpB,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,YAAY;KACpB,CAAC,CAAC;IAEH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAEpC,OAAO,KAAK,CAAC;AACf,CAAC;AACD,SAAS,kBAAkB,CACzB,KAAyB,EACzB,QAAgB;IAEhB,MAAM,QAAQ,GAAG,KAAK,IAAI,QAAQ,CAAC;IAEnC,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,oBAAoB;QACpB,MAAM,IAAI,KAAK,CACb,6DAA6D,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CACzF,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -10,6 +10,10 @@ export interface DirectSpeechInline extends Parent {
10
10
  * Name of the speaker within [[...]]
11
11
  */
12
12
  speaker: string;
13
+ /**
14
+ * Type of the direct speech, might be thought, spoken, or other.
15
+ */
16
+ speechType: string;
13
17
  children: PhrasingContent[];
14
18
  }
15
19
  declare module "mdast" {
@@ -23,25 +27,30 @@ declare module "mdast" {
23
27
  /**
24
28
  * Options of the micromark Extension
25
29
  */
26
- export interface DirectSpeechOptions {
27
- /**
28
- * Character that opens the speech.
29
- *
30
- * Example:
31
- *
32
- * [[Fay]]"Hello"
33
- * ^
34
- */
35
- quote?: string;
36
- /**
37
- * Character that closes the speech. If not provided, the opening quote will be used.
38
- */
39
- closingQuote?: string;
30
+ export type DirectSpeechOptions = {
40
31
  /**
41
32
  * The type of DirectSpeech, might be thought, spoken, or other.
42
33
  */
43
- type?: string;
44
- }
34
+ [speechType: string]: {
35
+ /**
36
+ * Character that opens the speech.
37
+ *
38
+ * Example:
39
+ *
40
+ * [[Fay]]"Hello"
41
+ * ^
42
+ */
43
+ quote?: string;
44
+ /**
45
+ * Character that closes the speech. If not provided, the opening quote will be used.
46
+ */
47
+ closingQuote?: string;
48
+ /**
49
+ * Whether the speaker is required or not. If true, the speaker must be provided in the [[...]] syntax.
50
+ */
51
+ requireSpeaker?: "always" | "never" | "optional";
52
+ };
53
+ };
45
54
  declare module "micromark-util-types" {
46
55
  interface TokenTypeMap {
47
56
  directSpeech: "directSpeech";
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/inline/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAErD;;;;GAIG;AACH,MAAM,WAAW,kBAAmB,SAAQ,MAAM;IAChD,IAAI,EAAE,oBAAoB,CAAC;IAE3B;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED,OAAO,QAAQ,OAAO,CAAC;IACrB,UAAU,kBAAkB;QAC1B,kBAAkB,EAAE,kBAAkB,CAAC;KACxC;IAED,UAAU,cAAc;QACtB,kBAAkB,EAAE,kBAAkB,CAAC;KACxC;CACF;AAED;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC;;OAEG;IACH,CAAC,UAAU,EAAE,MAAM,GAAG;QACpB;;;;;;;WAOG;QACH,KAAK,CAAC,EAAE,MAAM,CAAC;QAEf;;WAEG;QACH,YAAY,CAAC,EAAE,MAAM,CAAC;QAEtB;;WAEG;QACH,cAAc,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAC;KAClD,CAAC;CACH,CAAC;AAEF,OAAO,QAAQ,sBAAsB,CAAC;IACpC,UAAU,YAAY;QACpB,YAAY,EAAE,cAAc,CAAC;QAE7B;;WAEG;QACH,mBAAmB,EAAE,qBAAqB,CAAC;QAE3C;;WAEG;QACH,mBAAmB,EAAE,qBAAqB,CAAC;QAE3C;;WAEG;QACH,8BAA8B,EAAE,gCAAgC,CAAC;QAEjE;;WAEG;QACH,4BAA4B,EAAE,8BAA8B,CAAC;QAE7D;;WAEG;QACH,4BAA4B,EAAE,8BAA8B,CAAC;QAE7D;;WAEG;QACH,0BAA0B,EAAE,4BAA4B,CAAC;KAC1D;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/inline/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "remark-speech",
3
- "version": "0.0.1",
3
+ "version": "0.10.0",
4
4
  "description": "Remark plugin to add direct speech with metadata for speaker element in markdown",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -87,7 +87,7 @@
87
87
  },
88
88
  "sideEffects": false,
89
89
  "typeCoverage": {
90
- "atLeast": 99,
90
+ "atLeast": 100,
91
91
  "detail": true,
92
92
  "ignoreAsAssertion": true,
93
93
  "ignoreNonNullAssertion": true,
@@ -1,3 +0,0 @@
1
- import type { Extension as FromMarkdownExtension } from "mdast-util-from-markdown";
2
- export declare function directSpeechFromMarkdown(): FromMarkdownExtension;
3
- //# sourceMappingURL=from-markdown.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"from-markdown.d.ts","sourceRoot":"","sources":["../../src/logic/from-markdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,IAAI,qBAAqB,EAEnC,MAAM,0BAA0B,CAAC;AAIlC,wBAAgB,wBAAwB,IAAI,qBAAqB,CAWhE"}
@@ -1,30 +0,0 @@
1
- export function directSpeechFromMarkdown() {
2
- return {
3
- canContainEols: ["directSpeechInline"],
4
- enter: {
5
- directSpeech: enterDirectSpeech,
6
- },
7
- exit: {
8
- directSpeech: exitDirectSpeech,
9
- directSpeechSpeaker: exitDirectSpeechSpeaker,
10
- },
11
- };
12
- }
13
- const enterDirectSpeech = function enterDirectSpeech(token) {
14
- this.enter({
15
- type: "directSpeechInline",
16
- speaker: "",
17
- children: [],
18
- }, token);
19
- };
20
- const exitDirectSpeech = function exitDirectSpeech(token) {
21
- this.exit(token);
22
- };
23
- const exitDirectSpeechSpeaker = function exitDirectSpeechSpeaker(token) {
24
- const speaker = this.sliceSerialize(token);
25
- const node = this.stack[this.stack.length - 1];
26
- if (node.type === "directSpeechInline") {
27
- node.speaker = speaker;
28
- }
29
- };
30
- //# sourceMappingURL=from-markdown.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"from-markdown.js","sourceRoot":"","sources":["../../src/logic/from-markdown.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,wBAAwB;IACtC,OAAO;QACL,cAAc,EAAE,CAAC,oBAAoB,CAAC;QACtC,KAAK,EAAE;YACL,YAAY,EAAE,iBAAiB;SAChC;QACD,IAAI,EAAE;YACJ,YAAY,EAAE,gBAAgB;YAC9B,mBAAmB,EAAE,uBAAuB;SAC7C;KACF,CAAC;AACJ,CAAC;AAED,MAAM,iBAAiB,GAAuB,SAAS,iBAAiB,CACtE,KAAK;IAEL,IAAI,CAAC,KAAK,CACR;QACE,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EAAE,EAAE;QACX,QAAQ,EAAE,EAAE;KACS,EACvB,KAAK,CACN,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAuB,SAAS,gBAAgB,CAAC,KAAK;IAC1E,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAC3B,SAAS,uBAAuB,CAAC,KAAK;IACpC,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE/C,IAAI,IAAI,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;QACvC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;AACH,CAAC,CAAC"}
@@ -1,4 +0,0 @@
1
- import type { Extension } from "micromark-util-types";
2
- import type { DirectSpeechOptions } from "./types.js";
3
- export declare function directSpeech(options?: DirectSpeechOptions): Extension;
4
- //# sourceMappingURL=syntax.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"syntax.d.ts","sourceRoot":"","sources":["../../src/logic/syntax.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAQ,SAAS,EAAoB,MAAM,sBAAsB,CAAC;AAE9E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAMtD,wBAAgB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,SAAS,CAgBzE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"syntax.js","sourceRoot":"","sources":["../../src/logic/syntax.ts"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- import type { Options as ToMarkdownExtension } from "mdast-util-to-markdown";
2
- import type { DirectSpeechOptions } from "./types.js";
3
- export declare function directSpeechToMarkdown(options?: DirectSpeechOptions): ToMarkdownExtension;
4
- //# sourceMappingURL=to-markdown.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"to-markdown.d.ts","sourceRoot":"","sources":["../../src/logic/to-markdown.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,OAAO,IAAI,mBAAmB,EAE/B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,mBAAmB,EAAsB,MAAM,YAAY,CAAC;AAE1E,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,mBAAwB,GAChC,mBAAmB,CAwBrB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"to-markdown.js","sourceRoot":"","sources":["../../src/logic/to-markdown.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,sBAAsB,CACpC,UAA+B,EAAE;IAEjC,MAAM,KAAK,GAAG,kBAAkB,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,kBAAkB,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAErE,OAAO;QACL,MAAM,EAAE;YACN;gBACE,SAAS,EAAE,GAAG;gBACd,WAAW,EAAE,UAAU;aACxB;SACF;QACD,QAAQ,EAAE;YACR,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI;gBAC1C,OAAO,wBAAwB,CAC7B,IAA0B,EAC1B,MAAM,EACN,KAAK,EACL,IAAI,EACJ,KAAK,EACL,YAAY,CACb,CAAC;YACJ,CAAC;SACF;KACF,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAC/B,IAAwB,EACxB,OAA4B,EAC5B,KAAY,EACZ,IAAU,EACV,KAAa,EACb,YAAoB;IAEpB,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC;IAExD,KAAK,IAAI,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE;QACrC,GAAG,OAAO,CAAC,OAAO,EAAE;QACpB,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,YAAY;KACpB,CAAC,CAAC;IAEH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAEpC,OAAO,KAAK,CAAC;AACf,CAAC;AACD,SAAS,kBAAkB,CACzB,KAAyB,EACzB,QAAgB;IAEhB,MAAM,QAAQ,GAAG,KAAK,IAAI,QAAQ,CAAC;IAEnC,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,oBAAoB;QACpB,MAAM,IAAI,KAAK,CACb,6DAA6D,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CACzF,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/logic/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAErD;;;;GAIG;AACH,MAAM,WAAW,kBAAmB,SAAQ,MAAM;IAChD,IAAI,EAAE,oBAAoB,CAAC;IAE3B;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED,OAAO,QAAQ,OAAO,CAAC;IACrB,UAAU,kBAAkB;QAC1B,kBAAkB,EAAE,kBAAkB,CAAC;KACxC;IAED,UAAU,cAAc;QACtB,kBAAkB,EAAE,kBAAkB,CAAC;KACxC;CACF;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,OAAO,QAAQ,sBAAsB,CAAC;IACpC,UAAU,YAAY;QACpB,YAAY,EAAE,cAAc,CAAC;QAE7B;;WAEG;QACH,mBAAmB,EAAE,qBAAqB,CAAC;QAE3C;;WAEG;QACH,mBAAmB,EAAE,qBAAqB,CAAC;QAE3C;;WAEG;QACH,8BAA8B,EAAE,gCAAgC,CAAC;QAEjE;;WAEG;QACH,4BAA4B,EAAE,8BAA8B,CAAC;QAE7D;;WAEG;QACH,4BAA4B,EAAE,8BAA8B,CAAC;QAE7D;;WAEG;QACH,0BAA0B,EAAE,4BAA4B,CAAC;KAC1D;CACF"}
File without changes