markdown-codec 6.4.3 → 6.5.1

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 (54) hide show
  1. package/README.md +20 -7
  2. package/dist/block/block.cjs +1 -1
  3. package/dist/block/block.d.cts +1 -1
  4. package/dist/block/block.d.ts +1 -1
  5. package/dist/block/block.js +1 -1
  6. package/dist/block/definitions.d.cts +1 -1
  7. package/dist/block/definitions.d.ts +1 -1
  8. package/dist/codec.d.cts +170 -0
  9. package/dist/codec.d.ts +170 -0
  10. package/dist/diagnostics/diagnostics.cjs +2 -1
  11. package/dist/diagnostics/diagnostics.d.cts +1 -1
  12. package/dist/diagnostics/diagnostics.d.ts +1 -1
  13. package/dist/diagnostics/diagnostics.js +2 -1
  14. package/dist/{diagnostics-eL5c8OWm.d.cts → diagnostics-DLum7kY6.d.cts} +1 -0
  15. package/dist/{diagnostics-eL5c8OWm.d.ts → diagnostics-DLum7kY6.d.ts} +1 -0
  16. package/dist/emit/emit.cjs +28 -5
  17. package/dist/emit/emit.js +28 -5
  18. package/dist/emit/front-matter.cjs +22 -5
  19. package/dist/emit/front-matter.js +22 -5
  20. package/dist/emit/html-table.cjs +104 -0
  21. package/dist/emit/html-table.d.cts +7 -0
  22. package/dist/emit/html-table.d.ts +7 -0
  23. package/dist/emit/html-table.js +102 -0
  24. package/dist/emit/inline.cjs +30 -6
  25. package/dist/emit/inline.d.cts +1 -13
  26. package/dist/emit/inline.d.ts +1 -13
  27. package/dist/emit/inline.js +30 -6
  28. package/dist/emit/table.cjs +10 -13
  29. package/dist/emit/table.d.cts +2 -2
  30. package/dist/emit/table.d.ts +2 -2
  31. package/dist/emit/table.js +10 -13
  32. package/dist/html/html-table.cjs +243 -0
  33. package/dist/html/html-table.d.cts +5 -0
  34. package/dist/html/html-table.d.ts +5 -0
  35. package/dist/html/html-table.js +242 -0
  36. package/dist/index.cjs +1 -1
  37. package/dist/index.d.cts +1 -1
  38. package/dist/index.d.ts +1 -1
  39. package/dist/index.js +1 -1
  40. package/dist/inline-2-lUb0vo.d.ts +14 -0
  41. package/dist/inline-514HW3Pi.d.cts +14 -0
  42. package/dist/lower/front-matter.cjs +64 -20
  43. package/dist/lower/front-matter.d.cts +1 -1
  44. package/dist/lower/front-matter.d.ts +1 -1
  45. package/dist/lower/front-matter.js +64 -20
  46. package/dist/lower/inline.d.cts +1 -1
  47. package/dist/lower/inline.d.ts +1 -1
  48. package/dist/lower/lower.cjs +16 -5
  49. package/dist/lower/lower.js +16 -5
  50. package/dist/options/options.d.cts +1 -1
  51. package/dist/options/options.d.ts +1 -1
  52. package/dist/read.d.cts +1 -1
  53. package/dist/read.d.ts +1 -1
  54. package/package.json +2 -2
@@ -0,0 +1,14 @@
1
+ import { i as MarkdownDiagnosticSink } from "./diagnostics-DLum7kY6.cjs";
2
+ import { ContentRun, RunConstructExtent } from "document-schema.js";
3
+ //#region src/emit/inline.d.ts
4
+ interface InlineEmitContext {
5
+ readonly sink: MarkdownDiagnosticSink;
6
+ readonly emphasisMarker: string;
7
+ }
8
+ declare function escapeMarkdownText(text: string): string;
9
+ declare function escapeLinkDestination(destination: string): string;
10
+ declare function renderLinkTitle(title: string): string;
11
+ declare function emitRuns(runs: readonly ContentRun[], context: InlineEmitContext, constructs?: readonly RunConstructExtent[]): string;
12
+ declare function emitRunsSingleLine(runs: readonly ContentRun[], context: InlineEmitContext, constructs?: readonly RunConstructExtent[]): string;
13
+ //#endregion
14
+ export { escapeMarkdownText as a, escapeLinkDestination as i, emitRuns as n, renderLinkTitle as o, emitRunsSingleLine as r, InlineEmitContext as t };
@@ -5,6 +5,56 @@ const require_shared_line_ending = require("../shared/line-ending.cjs");
5
5
  const LEADING_DELIMITER_PATTERN = /^---[ \t]*$/;
6
6
  const CLOSING_DELIMITER_PATTERN = /^(?:---|\.\.\.)[ \t]*$/;
7
7
  const KEY_VALUE_LINE_PATTERN = /^([A-Za-z_][A-Za-z0-9_-]*):[ \t]*(.*)$/;
8
+ const STRING_FIELD_SETTERS = {
9
+ title: (metadata, value) => {
10
+ metadata.title = value;
11
+ },
12
+ author: (metadata, value) => {
13
+ metadata.author = value;
14
+ },
15
+ subject: (metadata, value) => {
16
+ metadata.subject = value;
17
+ },
18
+ creator: (metadata, value) => {
19
+ metadata.creator = value;
20
+ },
21
+ date: (metadata, value) => {
22
+ metadata.createdIso = value;
23
+ },
24
+ modified: (metadata, value) => {
25
+ metadata.modifiedIso = value;
26
+ },
27
+ lastPrinted: (metadata, value) => {
28
+ metadata.lastPrintedIso = value;
29
+ },
30
+ language: (metadata, value) => {
31
+ metadata.language = value;
32
+ },
33
+ publisher: (metadata, value) => {
34
+ metadata.publisher = value;
35
+ },
36
+ contributor: (metadata, value) => {
37
+ metadata.contributor = value;
38
+ },
39
+ rights: (metadata, value) => {
40
+ metadata.rights = value;
41
+ },
42
+ identifier: (metadata, value) => {
43
+ metadata.identifier = value;
44
+ },
45
+ comments: (metadata, value) => {
46
+ metadata.comments = value;
47
+ },
48
+ company: (metadata, value) => {
49
+ metadata.company = value;
50
+ },
51
+ manager: (metadata, value) => {
52
+ metadata.manager = value;
53
+ }
54
+ };
55
+ function isTextDirection(value) {
56
+ return value === "ltr" || value === "rtl";
57
+ }
8
58
  function parseScalar(raw) {
9
59
  const trimmed = raw.trim();
10
60
  const isDoubleQuoted = trimmed.length >= 2 && trimmed.startsWith("\"") && trimmed.endsWith("\"");
@@ -41,32 +91,26 @@ function extractFrontMatter(source, sink = require_diagnostics_diagnostics.NOOP_
41
91
  const key = match?.[1];
42
92
  const value = match?.[2];
43
93
  if (key === void 0 || value === void 0) continue;
44
- switch (key) {
45
- case "title":
46
- metadata.title = parseScalar(value);
47
- break;
48
- case "author":
49
- metadata.author = parseScalar(value);
50
- break;
51
- case "subject":
52
- metadata.subject = parseScalar(value);
53
- break;
54
- case "creator":
55
- metadata.creator = parseScalar(value);
56
- break;
57
- case "date":
58
- metadata.createdIso = parseScalar(value);
59
- break;
60
- case "keywords":
61
- metadata.keywords = [...parseKeywordList(value)];
62
- break;
63
- default: sink({
94
+ if (key === "keywords") {
95
+ metadata.keywords = [...parseKeywordList(value)];
96
+ continue;
97
+ }
98
+ if (key === "direction") {
99
+ const scalar = parseScalar(value);
100
+ if (isTextDirection(scalar)) metadata.direction = scalar;
101
+ continue;
102
+ }
103
+ const setter = STRING_FIELD_SETTERS[key];
104
+ if (setter === void 0) {
105
+ sink({
64
106
  code: require_diagnostics_diagnostics.MarkdownDiagnosticCodes.FRONT_MATTER_KEY_UNMAPPED,
65
107
  severity: "info",
66
108
  message: `front matter key "${key}" has no LayoutMetadata equivalent and was dropped from the metadata; its original spelling survives in the verbatim front-matter block this package's own writer can re-emit`,
67
109
  line: index + 1
68
110
  });
111
+ continue;
69
112
  }
113
+ setter(metadata, parseScalar(value));
70
114
  }
71
115
  return {
72
116
  metadata,
@@ -1,4 +1,4 @@
1
- import { i as MarkdownDiagnosticSink } from "../diagnostics-eL5c8OWm.cjs";
1
+ import { i as MarkdownDiagnosticSink } from "../diagnostics-DLum7kY6.cjs";
2
2
  import { LayoutMetadata } from "document-schema.js";
3
3
  //#region src/lower/front-matter.d.ts
4
4
  interface FrontMatterResult {
@@ -1,4 +1,4 @@
1
- import { i as MarkdownDiagnosticSink } from "../diagnostics-eL5c8OWm.js";
1
+ import { i as MarkdownDiagnosticSink } from "../diagnostics-DLum7kY6.js";
2
2
  import { LayoutMetadata } from "document-schema.js";
3
3
  //#region src/lower/front-matter.d.ts
4
4
  interface FrontMatterResult {
@@ -4,6 +4,56 @@ import { LINE_ENDING_PATTERN } from "../shared/line-ending.js";
4
4
  const LEADING_DELIMITER_PATTERN = /^---[ \t]*$/;
5
5
  const CLOSING_DELIMITER_PATTERN = /^(?:---|\.\.\.)[ \t]*$/;
6
6
  const KEY_VALUE_LINE_PATTERN = /^([A-Za-z_][A-Za-z0-9_-]*):[ \t]*(.*)$/;
7
+ const STRING_FIELD_SETTERS = {
8
+ title: (metadata, value) => {
9
+ metadata.title = value;
10
+ },
11
+ author: (metadata, value) => {
12
+ metadata.author = value;
13
+ },
14
+ subject: (metadata, value) => {
15
+ metadata.subject = value;
16
+ },
17
+ creator: (metadata, value) => {
18
+ metadata.creator = value;
19
+ },
20
+ date: (metadata, value) => {
21
+ metadata.createdIso = value;
22
+ },
23
+ modified: (metadata, value) => {
24
+ metadata.modifiedIso = value;
25
+ },
26
+ lastPrinted: (metadata, value) => {
27
+ metadata.lastPrintedIso = value;
28
+ },
29
+ language: (metadata, value) => {
30
+ metadata.language = value;
31
+ },
32
+ publisher: (metadata, value) => {
33
+ metadata.publisher = value;
34
+ },
35
+ contributor: (metadata, value) => {
36
+ metadata.contributor = value;
37
+ },
38
+ rights: (metadata, value) => {
39
+ metadata.rights = value;
40
+ },
41
+ identifier: (metadata, value) => {
42
+ metadata.identifier = value;
43
+ },
44
+ comments: (metadata, value) => {
45
+ metadata.comments = value;
46
+ },
47
+ company: (metadata, value) => {
48
+ metadata.company = value;
49
+ },
50
+ manager: (metadata, value) => {
51
+ metadata.manager = value;
52
+ }
53
+ };
54
+ function isTextDirection(value) {
55
+ return value === "ltr" || value === "rtl";
56
+ }
7
57
  function parseScalar(raw) {
8
58
  const trimmed = raw.trim();
9
59
  const isDoubleQuoted = trimmed.length >= 2 && trimmed.startsWith("\"") && trimmed.endsWith("\"");
@@ -40,32 +90,26 @@ function extractFrontMatter(source, sink = NOOP_MARKDOWN_DIAGNOSTIC_SINK) {
40
90
  const key = match?.[1];
41
91
  const value = match?.[2];
42
92
  if (key === void 0 || value === void 0) continue;
43
- switch (key) {
44
- case "title":
45
- metadata.title = parseScalar(value);
46
- break;
47
- case "author":
48
- metadata.author = parseScalar(value);
49
- break;
50
- case "subject":
51
- metadata.subject = parseScalar(value);
52
- break;
53
- case "creator":
54
- metadata.creator = parseScalar(value);
55
- break;
56
- case "date":
57
- metadata.createdIso = parseScalar(value);
58
- break;
59
- case "keywords":
60
- metadata.keywords = [...parseKeywordList(value)];
61
- break;
62
- default: sink({
93
+ if (key === "keywords") {
94
+ metadata.keywords = [...parseKeywordList(value)];
95
+ continue;
96
+ }
97
+ if (key === "direction") {
98
+ const scalar = parseScalar(value);
99
+ if (isTextDirection(scalar)) metadata.direction = scalar;
100
+ continue;
101
+ }
102
+ const setter = STRING_FIELD_SETTERS[key];
103
+ if (setter === void 0) {
104
+ sink({
63
105
  code: MarkdownDiagnosticCodes.FRONT_MATTER_KEY_UNMAPPED,
64
106
  severity: "info",
65
107
  message: `front matter key "${key}" has no LayoutMetadata equivalent and was dropped from the metadata; its original spelling survives in the verbatim front-matter block this package's own writer can re-emit`,
66
108
  line: index + 1
67
109
  });
110
+ continue;
68
111
  }
112
+ setter(metadata, parseScalar(value));
69
113
  }
70
114
  return {
71
115
  metadata,
@@ -1,5 +1,5 @@
1
1
  import { v as MarkdownInlineNode } from "../ast-CNfTgS0N.cjs";
2
- import { i as MarkdownDiagnosticSink } from "../diagnostics-eL5c8OWm.cjs";
2
+ import { i as MarkdownDiagnosticSink } from "../diagnostics-DLum7kY6.cjs";
3
3
  import { ContentRun, RunConstructExtent } from "document-schema.js";
4
4
  //#region src/lower/inline.d.ts
5
5
  interface InlineLowerContext {
@@ -1,5 +1,5 @@
1
1
  import { v as MarkdownInlineNode } from "../ast-CNfTgS0N.js";
2
- import { i as MarkdownDiagnosticSink } from "../diagnostics-eL5c8OWm.js";
2
+ import { i as MarkdownDiagnosticSink } from "../diagnostics-DLum7kY6.js";
3
3
  import { ContentRun, RunConstructExtent } from "document-schema.js";
4
4
  //#region src/lower/inline.d.ts
5
5
  interface InlineLowerContext {
@@ -2,10 +2,11 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_defaults_defaults = require("../defaults/defaults.cjs");
3
3
  const require_diagnostics_diagnostics = require("../diagnostics/diagnostics.cjs");
4
4
  const require_block_block = require("../block/block.cjs");
5
- const require_shared_list_id = require("../shared/list-id.cjs");
5
+ const require_lower_image = require("./image.cjs");
6
6
  const require_shared_style_constants = require("../shared/style-constants.cjs");
7
+ const require_html_html_table = require("../html/html-table.cjs");
8
+ const require_shared_list_id = require("../shared/list-id.cjs");
7
9
  const require_lower_front_matter = require("./front-matter.cjs");
8
- const require_lower_image = require("./image.cjs");
9
10
  const require_lower_inline = require("./inline.cjs");
10
11
  const require_lower_table = require("./table.cjs");
11
12
  let document_schema_js = require("document-schema.js");
@@ -152,7 +153,16 @@ function lowerThematicBreak(context) {
152
153
  styleId: require_shared_style_constants.HORIZONTAL_RULE_STYLE_ID
153
154
  }, context)];
154
155
  }
155
- function lowerHtmlBlock(node, context) {
156
+ function lowerHtmlBlock(node, context, contentWidthPt) {
157
+ const table = context.gfmTables ? require_html_html_table.parseHtmlTable(node.literal, contentWidthPt) : void 0;
158
+ if (table !== void 0) {
159
+ if (context.list !== void 0) context.sink({
160
+ code: require_diagnostics_diagnostics.MarkdownDiagnosticCodes.LIST_ITEM_BLOCK_UNLISTED,
161
+ severity: "info",
162
+ message: "an HTML-table block directly inside a list item has no ContentListMembership field of its own -- only ContentParagraph carries .list -- so its association with the enclosing list item is lost"
163
+ });
164
+ return [table];
165
+ }
156
166
  if (context.rawHtmlMode === "drop") {
157
167
  context.sink({
158
168
  code: require_diagnostics_diagnostics.MarkdownDiagnosticCodes.RAW_HTML_DROPPED,
@@ -350,7 +360,7 @@ function lowerBlock(node, context, contentWidthPt) {
350
360
  case "list": return lowerList(node, void 0, 0, context, contentWidthPt);
351
361
  case "codeBlock": return lowerCodeBlock(node, context);
352
362
  case "thematicBreak": return lowerThematicBreak(context);
353
- case "htmlBlock": return lowerHtmlBlock(node, context);
363
+ case "htmlBlock": return lowerHtmlBlock(node, context, contentWidthPt);
354
364
  case "mathBlock": return lowerMathBlock(node, context);
355
365
  case "footnoteDefinition": return lowerFootnoteDefinition(node, context, contentWidthPt);
356
366
  case "table":
@@ -382,7 +392,8 @@ function lowerParsedMarkdown(parsed, options = {}, metadata = {}) {
382
392
  rawHtmlMode: options.rawHtml ?? "preserve",
383
393
  numIdState: require_shared_list_id.createNumIdMintState(),
384
394
  quoteDepth: 0,
385
- list: void 0
395
+ list: void 0,
396
+ gfmTables: options.gfmTables ?? true
386
397
  };
387
398
  return {
388
399
  kind: "wordprocessing",
@@ -1,10 +1,11 @@
1
1
  import { DEFAULT_MARGINS } from "../defaults/defaults.js";
2
2
  import { MarkdownDiagnosticCodes, MarkdownInputTooLargeError, NOOP_MARKDOWN_DIAGNOSTIC_SINK } from "../diagnostics/diagnostics.js";
3
3
  import { parseMarkdown } from "../block/block.js";
4
- import { createNumIdMintState, mintListItemId, mintListNumId, mintedListType } from "../shared/list-id.js";
4
+ import { resolveMarkdownImage } from "./image.js";
5
5
  import { CODE_BLOCK_STYLE_ID, HORIZONTAL_RULE_STYLE_ID, HTML_PREFORMATTED_STYLE_ID, QUOTE_STYLE_ID, headingStyleId } from "../shared/style-constants.js";
6
+ import { parseHtmlTable } from "../html/html-table.js";
7
+ import { createNumIdMintState, mintListItemId, mintListNumId, mintedListType } from "../shared/list-id.js";
6
8
  import { extractFrontMatter } from "./front-matter.js";
7
- import { resolveMarkdownImage } from "./image.js";
8
9
  import { lowerCodeBlockRun, lowerInlineNodes } from "./inline.js";
9
10
  import { lowerTable } from "./table.js";
10
11
  import { PAGE_SIZE_A4 } from "document-schema.js";
@@ -151,7 +152,16 @@ function lowerThematicBreak(context) {
151
152
  styleId: HORIZONTAL_RULE_STYLE_ID
152
153
  }, context)];
153
154
  }
154
- function lowerHtmlBlock(node, context) {
155
+ function lowerHtmlBlock(node, context, contentWidthPt) {
156
+ const table = context.gfmTables ? parseHtmlTable(node.literal, contentWidthPt) : void 0;
157
+ if (table !== void 0) {
158
+ if (context.list !== void 0) context.sink({
159
+ code: MarkdownDiagnosticCodes.LIST_ITEM_BLOCK_UNLISTED,
160
+ severity: "info",
161
+ message: "an HTML-table block directly inside a list item has no ContentListMembership field of its own -- only ContentParagraph carries .list -- so its association with the enclosing list item is lost"
162
+ });
163
+ return [table];
164
+ }
155
165
  if (context.rawHtmlMode === "drop") {
156
166
  context.sink({
157
167
  code: MarkdownDiagnosticCodes.RAW_HTML_DROPPED,
@@ -349,7 +359,7 @@ function lowerBlock(node, context, contentWidthPt) {
349
359
  case "list": return lowerList(node, void 0, 0, context, contentWidthPt);
350
360
  case "codeBlock": return lowerCodeBlock(node, context);
351
361
  case "thematicBreak": return lowerThematicBreak(context);
352
- case "htmlBlock": return lowerHtmlBlock(node, context);
362
+ case "htmlBlock": return lowerHtmlBlock(node, context, contentWidthPt);
353
363
  case "mathBlock": return lowerMathBlock(node, context);
354
364
  case "footnoteDefinition": return lowerFootnoteDefinition(node, context, contentWidthPt);
355
365
  case "table":
@@ -381,7 +391,8 @@ function lowerParsedMarkdown(parsed, options = {}, metadata = {}) {
381
391
  rawHtmlMode: options.rawHtml ?? "preserve",
382
392
  numIdState: createNumIdMintState(),
383
393
  quoteDepth: 0,
384
- list: void 0
394
+ list: void 0,
395
+ gfmTables: options.gfmTables ?? true
385
396
  };
386
397
  return {
387
398
  kind: "wordprocessing",
@@ -1,4 +1,4 @@
1
- import { i as MarkdownDiagnosticSink } from "../diagnostics-eL5c8OWm.cjs";
1
+ import { i as MarkdownDiagnosticSink } from "../diagnostics-DLum7kY6.cjs";
2
2
  import { n as MarkdownImageResolver } from "../image-B5L0HpAJ.cjs";
3
3
  import { Margins, PageSize } from "document-schema.js";
4
4
  //#region src/options/options.d.ts
@@ -1,4 +1,4 @@
1
- import { i as MarkdownDiagnosticSink } from "../diagnostics-eL5c8OWm.js";
1
+ import { i as MarkdownDiagnosticSink } from "../diagnostics-DLum7kY6.js";
2
2
  import { n as MarkdownImageResolver } from "../image-C390OIB3.js";
3
3
  import { Margins, PageSize } from "document-schema.js";
4
4
  //#region src/options/options.d.ts
package/dist/read.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { t as MarkdownDiagnostic } from "./diagnostics-eL5c8OWm.cjs";
1
+ import { t as MarkdownDiagnostic } from "./diagnostics-DLum7kY6.cjs";
2
2
  import { ReadMarkdownOptions } from "./options/options.cjs";
3
3
  import { ContentDocument, DocumentTree } from "document-schema.js";
4
4
  //#region src/read.d.ts
package/dist/read.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { t as MarkdownDiagnostic } from "./diagnostics-eL5c8OWm.js";
1
+ import { t as MarkdownDiagnostic } from "./diagnostics-DLum7kY6.js";
2
2
  import { ReadMarkdownOptions } from "./options/options.js";
3
3
  import { ContentDocument, DocumentTree } from "document-schema.js";
4
4
  //#region src/read.d.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "markdown-codec",
3
- "version": "6.4.3",
3
+ "version": "6.5.1",
4
4
  "description": "Hand-written CommonMark+GFM <-> DocumentTree codec, built on document-schema.js",
5
5
  "type": "module",
6
6
  "repository": {
@@ -83,7 +83,7 @@
83
83
  "license": "MIT",
84
84
  "packageManager": "pnpm@11.6.0",
85
85
  "dependencies": {
86
- "document-schema.js": "7.3.1",
86
+ "document-schema.js": "7.4.0",
87
87
  "zod": "4.4.3"
88
88
  },
89
89
  "devDependencies": {