remark-docx 0.3.5 → 0.3.7

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.
package/README.md CHANGED
@@ -29,8 +29,8 @@ Currently, some of the default styles may not be nice. If you have feature reque
29
29
  - [x] image / imageReference ([remark-docx/plugins/image](#image) is required)
30
30
  - [x] footnote / footnoteReference / footnoteDefinition
31
31
  - [x] html ([remark-docx/plugins/html](#html) is required)
32
- - [ ] code
33
- - [x] math / inlineMath ([remark-math](https://github.com/remarkjs/remark-math) and [remark-docx/plugins/math](#latex) are required)
32
+ - [x] code ([remark-docx/plugins/code](#code) is required)
33
+ - [x] math / inlineMath ([remark-math](https://github.com/remarkjs/remark-math) and [remark-docx/plugins/math](#math) are required)
34
34
 
35
35
  ## Demo
36
36
 
@@ -86,6 +86,8 @@ const text = "# hello world";
86
86
 
87
87
  ### Image
88
88
 
89
+ Fetch image data and embed into docx.
90
+
89
91
  ```javascript
90
92
  import { unified } from "unified";
91
93
  import markdown from "remark-parse";
@@ -97,8 +99,25 @@ const processor = unified()
97
99
  .use(docx, { plugins: [imagePlugin()] });
98
100
  ```
99
101
 
102
+ ### Code
103
+
104
+ Syntax highlighting with [shiki](https://github.com/shikijs/shiki).
105
+
106
+ ```javascript
107
+ import { unified } from "unified";
108
+ import markdown from "remark-parse";
109
+ import docx from "remark-docx";
110
+ import { shikiPlugin } from "remark-docx/plugins/code";
111
+
112
+ const processor = unified()
113
+ .use(markdown)
114
+ .use(docx, { plugins: [shikiPlugin({ theme: "dark-plus" })] });
115
+ ```
116
+
100
117
  ### HTML
101
118
 
119
+ Transform HTML to markdown.
120
+
102
121
  ```javascript
103
122
  import { unified } from "unified";
104
123
  import markdown from "remark-parse";
@@ -110,7 +129,9 @@ const processor = unified()
110
129
  .use(docx, { plugins: [htmlPlugin()] });
111
130
  ```
112
131
 
113
- ### LaTeX
132
+ ### Math
133
+
134
+ Render LaTeX with [unified-latex](https://github.com/siefkenj/unified-latex).
114
135
 
115
136
  ```javascript
116
137
  import { unified } from "unified";
package/lib/index.cjs CHANGED
@@ -134,7 +134,7 @@ const mdastToDocx = async (node, { plugins = [], title, subject, creator, keywor
134
134
  const numbering = createNumberingRegistry();
135
135
  const pluginCtx = { root: node, definition };
136
136
  const nodes = convertNodes(node.children, {
137
- overrides: (await Promise.all(plugins.map((p) => p(pluginCtx)))).reduceRight((acc, p) => ({ acc, ...p }), {}),
137
+ overrides: (await Promise.all(plugins.map((p) => p(pluginCtx)))).reduceRight((acc, p) => ({ ...acc, ...p }), {}),
138
138
  deco: {},
139
139
  indent: 0,
140
140
  definition: definition,
@@ -206,7 +206,7 @@ const convertNodes = (nodes, ctx) => {
206
206
  warnOnce(`${node.type} node is not rendered since remark-docx/plugins/html is not provided.`);
207
207
  break;
208
208
  case "code":
209
- results.push(buildCode(node));
209
+ warnOnce(`${node.type} node is not rendered since remark-docx/plugins/code is not provided.`);
210
210
  break;
211
211
  // case "yaml":
212
212
  // // unimplemented
@@ -399,12 +399,6 @@ const buildTable = ({ children, align }, ctx) => {
399
399
  }),
400
400
  });
401
401
  };
402
- const buildCode = ({ value, lang: _lang, meta: _meta, }) => {
403
- // FIXME: transform to text for now
404
- return new docx.Paragraph({
405
- children: [buildText(value, {})],
406
- });
407
- };
408
402
  const buildText = (text, deco) => {
409
403
  return new docx.TextRun({
410
404
  text,
package/lib/index.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/src/utils.ts","../src/src/mdast-to-docx.ts","../src/src/plugin.ts"],"sourcesContent":["/**\n * @internal\n */\nexport function invariant(cond: any, message: string): asserts cond {\n if (!cond) throw new Error(message);\n}\n\nconst alreadyWarned: { [message: string]: boolean } = {};\n\n/**\n * @internal\n */\nexport function warnOnce(message: string, cond: boolean = false): void {\n if (!cond && !alreadyWarned[message]) {\n alreadyWarned[message] = true;\n console.warn(message);\n }\n}\n","import {\n convertInchesToTwip,\n Packer,\n Document,\n Paragraph,\n Table,\n TableRow,\n TableCell,\n TextRun,\n ExternalHyperlink,\n HeadingLevel,\n LevelFormat,\n AlignmentType,\n type ILevelsOptions,\n FootnoteReferenceRun,\n CheckBox,\n type IPropertiesOptions,\n sectionPageSizeDefaults,\n sectionMarginDefaults,\n} from \"docx\";\nimport type * as mdast from \"./mdast\";\nimport { invariant, warnOnce } from \"./utils\";\nimport { definitions, type GetDefinition } from \"mdast-util-definitions\";\nimport type {\n DocxChild,\n DocxContent,\n NodeOverrides,\n RemarkDocxPlugin,\n} from \"./types\";\n\nconst CONTENT_WIDTH =\n sectionPageSizeDefaults.WIDTH -\n sectionMarginDefaults.LEFT -\n sectionMarginDefaults.RIGHT;\nconst ORDERED_LIST_REF = \"ordered\";\nconst INDENT = 0.5;\n\ntype Decoration = Readonly<{\n [key in (mdast.Emphasis | mdast.Strong | mdast.Delete)[\"type\"]]?: true;\n}>;\n\ntype ListInfo = Readonly<{\n level: number;\n ordered: boolean;\n reference: string;\n checked?: boolean;\n}>;\n\ntype FootnoteDefinition = Readonly<{ children: Paragraph[] }>;\ntype FootnoteRegistry = {\n ref: (id: string) => number;\n def: (id: string, def: FootnoteDefinition) => void;\n toConfig: () => {\n [key: string]: FootnoteDefinition;\n };\n};\n\nconst createFootnoteRegistry = (): FootnoteRegistry => {\n const idToInternalId = new Map<string, number>();\n const defs = new Map<number, FootnoteDefinition>();\n\n const getId = (id: string): number => {\n let internalId = idToInternalId.get(id);\n if (internalId == null) {\n idToInternalId.set(id, (internalId = idToInternalId.size + 1));\n }\n return internalId;\n };\n\n return {\n ref: (id) => {\n return getId(id);\n },\n def: (id, def) => {\n const internalId = getId(id);\n defs.set(internalId, def);\n },\n toConfig: () => {\n return defs.entries().reduce(\n (acc, [key, def]) => {\n acc[key] = def;\n return acc;\n },\n {} as {\n [key: string]: FootnoteDefinition;\n },\n );\n },\n };\n};\n\ntype NumberingRegistry = {\n create: () => string;\n toConfig: () => Array<{ reference: string; levels: ILevelsOptions[] }>;\n};\n\nconst createNumberingRegistry = (): NumberingRegistry => {\n let counter = 1;\n\n const DEFAULT_NUMBERINGS: ILevelsOptions[] = [\n {\n level: 0,\n format: LevelFormat.DECIMAL,\n text: \"%1.\",\n alignment: AlignmentType.START,\n },\n {\n level: 1,\n format: LevelFormat.DECIMAL,\n text: \"%2.\",\n alignment: AlignmentType.START,\n style: {\n paragraph: {\n indent: { start: convertInchesToTwip(INDENT * 1) },\n },\n },\n },\n {\n level: 2,\n format: LevelFormat.DECIMAL,\n text: \"%3.\",\n alignment: AlignmentType.START,\n style: {\n paragraph: {\n indent: { start: convertInchesToTwip(INDENT * 2) },\n },\n },\n },\n {\n level: 3,\n format: LevelFormat.DECIMAL,\n text: \"%4.\",\n alignment: AlignmentType.START,\n style: {\n paragraph: {\n indent: { start: convertInchesToTwip(INDENT * 3) },\n },\n },\n },\n {\n level: 4,\n format: LevelFormat.DECIMAL,\n text: \"%5.\",\n alignment: AlignmentType.START,\n style: {\n paragraph: {\n indent: { start: convertInchesToTwip(INDENT * 4) },\n },\n },\n },\n {\n level: 5,\n format: LevelFormat.DECIMAL,\n text: \"%6.\",\n alignment: AlignmentType.START,\n style: {\n paragraph: {\n indent: { start: convertInchesToTwip(INDENT * 5) },\n },\n },\n },\n ];\n\n return {\n create: () => {\n return `${ORDERED_LIST_REF}-${counter++}`;\n },\n toConfig: () => {\n return Array.from({ length: counter }, (_, i) => ({\n reference: `${ORDERED_LIST_REF}-${i}`,\n levels: DEFAULT_NUMBERINGS,\n }));\n },\n };\n};\n\ntype Context = Readonly<{\n overrides: NodeOverrides;\n deco: Decoration;\n indent: number;\n list?: ListInfo;\n definition: GetDefinition;\n footnote: FootnoteRegistry;\n numbering: NumberingRegistry;\n}>;\n\nexport interface DocxOptions extends Pick<\n IPropertiesOptions,\n | \"title\"\n | \"subject\"\n | \"creator\"\n | \"keywords\"\n | \"description\"\n | \"lastModifiedBy\"\n | \"revision\"\n | \"styles\"\n | \"background\"\n> {\n /**\n * Plugins to customize how mdast nodes are transformed.\n */\n plugins?: RemarkDocxPlugin[];\n}\n\nexport const mdastToDocx = async (\n node: mdast.Root,\n {\n plugins = [],\n title,\n subject,\n creator,\n keywords,\n description,\n lastModifiedBy,\n revision,\n styles,\n background,\n }: DocxOptions,\n): Promise<ArrayBuffer> => {\n const definition = definitions(node);\n\n const footnote = createFootnoteRegistry();\n const numbering = createNumberingRegistry();\n\n const pluginCtx = { root: node, definition };\n const nodes = convertNodes(node.children, {\n overrides: (\n await Promise.all(plugins.map((p) => p(pluginCtx)))\n ).reduceRight((acc, p) => ({ acc, ...p }), {}),\n deco: {},\n indent: 0,\n definition: definition,\n footnote,\n numbering,\n });\n\n const doc = new Document({\n title,\n subject,\n creator,\n keywords,\n description,\n lastModifiedBy,\n revision,\n styles,\n background,\n footnotes: footnote.toConfig(),\n sections: [{ children: nodes as DocxChild[] }],\n numbering: {\n config: numbering.toConfig(),\n },\n });\n\n return Packer.toArrayBuffer(doc);\n};\n\nconst convertNodes = (\n nodes: mdast.RootContent[],\n ctx: Context,\n): DocxContent[] => {\n const results: DocxContent[] = [];\n for (const node of nodes) {\n const customNodes = ctx.overrides[node.type]?.(node as any, (children) =>\n convertNodes(children, ctx),\n );\n if (customNodes != null) {\n if (Array.isArray(customNodes)) {\n results.push(...customNodes);\n } else {\n results.push(customNodes);\n }\n continue;\n }\n\n switch (node.type) {\n case \"paragraph\": {\n results.push(buildParagraph(node, ctx));\n break;\n }\n case \"heading\": {\n results.push(buildHeading(node, ctx));\n break;\n }\n case \"thematicBreak\":\n results.push(buildThematicBreak(node));\n break;\n case \"blockquote\": {\n results.push(...buildBlockquote(node, ctx));\n break;\n }\n case \"list\": {\n results.push(...buildList(node, ctx));\n break;\n }\n case \"listItem\":\n invariant(false, \"unreachable\");\n case \"table\":\n results.push(buildTable(node, ctx));\n break;\n case \"tableRow\":\n invariant(false, \"unreachable\");\n case \"tableCell\":\n invariant(false, \"unreachable\");\n case \"html\":\n warnOnce(\n `${node.type} node is not rendered since remark-docx/plugins/html is not provided.`,\n );\n break;\n case \"code\":\n results.push(buildCode(node));\n break;\n // case \"yaml\":\n // // unimplemented\n // break;\n // case \"toml\":\n // // unimplemented\n // break;\n case \"definition\":\n // noop\n break;\n case \"footnoteDefinition\": {\n registerFootnoteDefinition(node, ctx);\n break;\n }\n case \"text\":\n results.push(buildText(node.value, ctx.deco));\n break;\n case \"emphasis\":\n case \"strong\":\n case \"delete\": {\n const { type, children } = node;\n const nodes = convertNodes(children, {\n ...ctx,\n deco: { ...ctx.deco, [type]: true },\n });\n results.push(...nodes);\n break;\n }\n case \"inlineCode\":\n results.push(buildInlineCode(node));\n break;\n case \"break\":\n results.push(buildBreak(node));\n break;\n case \"link\": {\n results.push(buildLink(node, ctx));\n break;\n }\n case \"linkReference\":\n results.push(...buildLinkReference(node, ctx));\n break;\n case \"image\":\n case \"imageReference\": {\n warnOnce(\n `${node.type} node is not rendered since remark-docx/plugins/image is not provided.`,\n );\n break;\n }\n // case \"footnote\": {\n // // inline footnote was removed in mdast v5\n // break;\n // }\n case \"footnoteReference\":\n results.push(buildFootnoteReference(node, ctx));\n break;\n case \"math\":\n case \"inlineMath\":\n warnOnce(\n `${node.type} node is not rendered since remark-docx/plugins/math is not provided.`,\n );\n break;\n default:\n warnOnce(`${node.type} node is not officially supported.`);\n break;\n }\n }\n return results;\n};\n\nconst buildParagraph = (\n { children }: mdast.Paragraph,\n ctx: Context,\n): DocxContent => {\n const list = ctx.list;\n const nodes = convertNodes(children, ctx);\n\n if (list && list.checked != null) {\n nodes.unshift(\n new CheckBox({\n checked: list.checked,\n checkedState: { value: \"2611\" },\n uncheckedState: { value: \"2610\" },\n }),\n );\n }\n return new Paragraph({\n children: nodes,\n indent:\n ctx.indent > 0\n ? {\n start: convertInchesToTwip(INDENT * ctx.indent),\n }\n : undefined,\n ...(list &&\n (list.ordered\n ? {\n numbering: {\n reference: list.reference,\n level: list.level,\n },\n }\n : {\n bullet: {\n level: list.level,\n },\n })),\n });\n};\n\nconst buildHeading = (\n { children, depth }: mdast.Heading,\n ctx: Context,\n): DocxContent => {\n let headingLevel: (typeof HeadingLevel)[keyof typeof HeadingLevel];\n switch (depth) {\n case 1:\n headingLevel = HeadingLevel.TITLE;\n break;\n case 2:\n headingLevel = HeadingLevel.HEADING_1;\n break;\n case 3:\n headingLevel = HeadingLevel.HEADING_2;\n break;\n case 4:\n headingLevel = HeadingLevel.HEADING_3;\n break;\n case 5:\n headingLevel = HeadingLevel.HEADING_4;\n break;\n case 6:\n headingLevel = HeadingLevel.HEADING_5;\n break;\n }\n const nodes = convertNodes(children, ctx);\n return new Paragraph({\n heading: headingLevel,\n children: nodes,\n });\n};\n\nconst buildThematicBreak = (_: mdast.ThematicBreak): DocxContent => {\n return new Paragraph({\n thematicBreak: true,\n });\n};\n\nconst buildBlockquote = (\n { children }: mdast.Blockquote,\n ctx: Context,\n): DocxContent[] => {\n return convertNodes(children, {\n ...ctx,\n indent: ctx.indent + 1,\n });\n};\n\nconst buildList = (\n { children, ordered }: mdast.List,\n ctx: Context,\n): DocxContent[] => {\n const isTopLevel = !ctx.list;\n const list: ListInfo = {\n level: ctx.list ? ctx.list.level + 1 : 0,\n ordered: !!ordered,\n reference:\n isTopLevel && ordered\n ? ctx.numbering.create()\n : ctx.list?.reference || ORDERED_LIST_REF,\n };\n return children.flatMap((item) => {\n return buildListItem(item, {\n ...ctx,\n list,\n });\n });\n};\n\nconst buildListItem = (\n { children, checked }: mdast.ListItem,\n ctx: Context,\n): DocxContent[] => {\n return convertNodes(children, {\n ...ctx,\n ...(ctx.list && { list: { ...ctx.list, checked: checked ?? undefined } }),\n });\n};\n\nconst buildTable = (\n { children, align }: mdast.Table,\n ctx: Context,\n): DocxContent => {\n const cellAligns:\n | (typeof AlignmentType)[keyof typeof AlignmentType][]\n | undefined = align?.map((a) => {\n switch (a) {\n case \"left\":\n return AlignmentType.LEFT;\n case \"right\":\n return AlignmentType.RIGHT;\n case \"center\":\n return AlignmentType.CENTER;\n default:\n return AlignmentType.LEFT;\n }\n });\n\n const columnLength = children[0]!.children.length;\n const columnWidth = CONTENT_WIDTH / columnLength;\n\n return new Table({\n columnWidths: Array.from({ length: columnLength }).map(() => columnWidth),\n rows: children.map((r) => {\n return new TableRow({\n children: r.children.map((c, i) => {\n return new TableCell({\n width: { size: columnWidth, type: \"dxa\" },\n children: [\n new Paragraph({\n alignment: cellAligns?.[i],\n children: convertNodes(c.children, ctx),\n }),\n ],\n });\n }),\n });\n }),\n });\n};\n\nconst buildCode = ({\n value,\n lang: _lang,\n meta: _meta,\n}: mdast.Code): DocxContent => {\n // FIXME: transform to text for now\n return new Paragraph({\n children: [buildText(value, {})],\n });\n};\n\nconst buildText = (text: string, deco: Decoration): DocxContent => {\n return new TextRun({\n text,\n bold: deco.strong,\n italics: deco.emphasis,\n strike: deco.delete,\n });\n};\n\nconst buildInlineCode = ({ value }: mdast.InlineCode): DocxContent => {\n return new TextRun({\n text: value,\n highlight: \"lightGray\",\n });\n};\n\nconst buildBreak = (_: mdast.Break): DocxContent => {\n return new TextRun({ text: \"\", break: 1 });\n};\n\nconst buildLink = (\n { children, url }: Pick<mdast.Link, \"children\" | \"url\">,\n ctx: Context,\n): DocxContent => {\n const nodes = convertNodes(children, ctx);\n return new ExternalHyperlink({\n link: url,\n children: nodes,\n });\n};\n\nconst buildLinkReference = (\n { children, identifier }: mdast.LinkReference,\n ctx: Context,\n): DocxContent[] => {\n const def = ctx.definition(identifier);\n if (def == null) {\n return convertNodes(children, ctx);\n }\n return [buildLink({ children, url: def.url }, ctx)];\n};\n\nconst registerFootnoteDefinition = (\n { children, identifier }: mdast.FootnoteDefinition,\n ctx: Context,\n): void => {\n const definition: FootnoteDefinition = {\n children: children.map((node) => {\n // Convert each node and extract the first result as a paragraph\n const nodes = convertNodes([node], ctx);\n if (nodes[0] instanceof Paragraph) {\n return nodes[0] as Paragraph;\n }\n // For non-paragraph content, wrap in a paragraph\n return new Paragraph({ children: nodes });\n }),\n };\n ctx.footnote.def(identifier, definition);\n};\n\nconst buildFootnoteReference = (\n { identifier }: mdast.FootnoteReference,\n ctx: Context,\n): DocxContent => {\n return new FootnoteReferenceRun(ctx.footnote.ref(identifier));\n};\n","import type { Plugin } from \"unified\";\nimport type { Root } from \"mdast\";\nimport { mdastToDocx, type DocxOptions } from \"./mdast-to-docx\";\n\nexport type { DocxOptions };\n\ndeclare module \"unified\" {\n interface CompileResultMap {\n docx: Promise<ArrayBuffer>;\n }\n}\n\nconst plugin: Plugin<[DocxOptions?], Root, Promise<ArrayBuffer>> = function (\n opts = {},\n) {\n this.compiler = (node) => {\n return mdastToDocx(node as Root, opts);\n };\n};\nexport default plugin;\n"],"names":["sectionPageSizeDefaults","sectionMarginDefaults","LevelFormat","AlignmentType","convertInchesToTwip","definitions","Document","Packer","CheckBox","Paragraph","HeadingLevel","Table","TableRow","TableCell","TextRun","ExternalHyperlink","FootnoteReferenceRun"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/src/utils.ts","../src/src/mdast-to-docx.ts","../src/src/plugin.ts"],"sourcesContent":["/**\n * @internal\n */\nexport function invariant(cond: any, message: string): asserts cond {\n if (!cond) throw new Error(message);\n}\n\nconst alreadyWarned: { [message: string]: boolean } = {};\n\n/**\n * @internal\n */\nexport function warnOnce(message: string, cond: boolean = false): void {\n if (!cond && !alreadyWarned[message]) {\n alreadyWarned[message] = true;\n console.warn(message);\n }\n}\n","import {\n convertInchesToTwip,\n Packer,\n Document,\n Paragraph,\n Table,\n TableRow,\n TableCell,\n TextRun,\n ExternalHyperlink,\n HeadingLevel,\n LevelFormat,\n AlignmentType,\n type ILevelsOptions,\n FootnoteReferenceRun,\n CheckBox,\n type IPropertiesOptions,\n sectionPageSizeDefaults,\n sectionMarginDefaults,\n} from \"docx\";\nimport type * as mdast from \"./mdast\";\nimport { invariant, warnOnce } from \"./utils\";\nimport { definitions, type GetDefinition } from \"mdast-util-definitions\";\nimport type {\n DocxChild,\n DocxContent,\n NodeOverrides,\n RemarkDocxPlugin,\n} from \"./types\";\n\nconst CONTENT_WIDTH =\n sectionPageSizeDefaults.WIDTH -\n sectionMarginDefaults.LEFT -\n sectionMarginDefaults.RIGHT;\nconst ORDERED_LIST_REF = \"ordered\";\nconst INDENT = 0.5;\n\ntype Decoration = Readonly<{\n [key in (mdast.Emphasis | mdast.Strong | mdast.Delete)[\"type\"]]?: true;\n}>;\n\ntype ListInfo = Readonly<{\n level: number;\n ordered: boolean;\n reference: string;\n checked?: boolean;\n}>;\n\ntype FootnoteDefinition = Readonly<{ children: Paragraph[] }>;\ntype FootnoteRegistry = {\n ref: (id: string) => number;\n def: (id: string, def: FootnoteDefinition) => void;\n toConfig: () => {\n [key: string]: FootnoteDefinition;\n };\n};\n\nconst createFootnoteRegistry = (): FootnoteRegistry => {\n const idToInternalId = new Map<string, number>();\n const defs = new Map<number, FootnoteDefinition>();\n\n const getId = (id: string): number => {\n let internalId = idToInternalId.get(id);\n if (internalId == null) {\n idToInternalId.set(id, (internalId = idToInternalId.size + 1));\n }\n return internalId;\n };\n\n return {\n ref: (id) => {\n return getId(id);\n },\n def: (id, def) => {\n const internalId = getId(id);\n defs.set(internalId, def);\n },\n toConfig: () => {\n return defs.entries().reduce(\n (acc, [key, def]) => {\n acc[key] = def;\n return acc;\n },\n {} as {\n [key: string]: FootnoteDefinition;\n },\n );\n },\n };\n};\n\ntype NumberingRegistry = {\n create: () => string;\n toConfig: () => Array<{ reference: string; levels: ILevelsOptions[] }>;\n};\n\nconst createNumberingRegistry = (): NumberingRegistry => {\n let counter = 1;\n\n const DEFAULT_NUMBERINGS: ILevelsOptions[] = [\n {\n level: 0,\n format: LevelFormat.DECIMAL,\n text: \"%1.\",\n alignment: AlignmentType.START,\n },\n {\n level: 1,\n format: LevelFormat.DECIMAL,\n text: \"%2.\",\n alignment: AlignmentType.START,\n style: {\n paragraph: {\n indent: { start: convertInchesToTwip(INDENT * 1) },\n },\n },\n },\n {\n level: 2,\n format: LevelFormat.DECIMAL,\n text: \"%3.\",\n alignment: AlignmentType.START,\n style: {\n paragraph: {\n indent: { start: convertInchesToTwip(INDENT * 2) },\n },\n },\n },\n {\n level: 3,\n format: LevelFormat.DECIMAL,\n text: \"%4.\",\n alignment: AlignmentType.START,\n style: {\n paragraph: {\n indent: { start: convertInchesToTwip(INDENT * 3) },\n },\n },\n },\n {\n level: 4,\n format: LevelFormat.DECIMAL,\n text: \"%5.\",\n alignment: AlignmentType.START,\n style: {\n paragraph: {\n indent: { start: convertInchesToTwip(INDENT * 4) },\n },\n },\n },\n {\n level: 5,\n format: LevelFormat.DECIMAL,\n text: \"%6.\",\n alignment: AlignmentType.START,\n style: {\n paragraph: {\n indent: { start: convertInchesToTwip(INDENT * 5) },\n },\n },\n },\n ];\n\n return {\n create: () => {\n return `${ORDERED_LIST_REF}-${counter++}`;\n },\n toConfig: () => {\n return Array.from({ length: counter }, (_, i) => ({\n reference: `${ORDERED_LIST_REF}-${i}`,\n levels: DEFAULT_NUMBERINGS,\n }));\n },\n };\n};\n\ntype Context = Readonly<{\n overrides: NodeOverrides;\n deco: Decoration;\n indent: number;\n list?: ListInfo;\n definition: GetDefinition;\n footnote: FootnoteRegistry;\n numbering: NumberingRegistry;\n}>;\n\nexport interface DocxOptions extends Pick<\n IPropertiesOptions,\n | \"title\"\n | \"subject\"\n | \"creator\"\n | \"keywords\"\n | \"description\"\n | \"lastModifiedBy\"\n | \"revision\"\n | \"styles\"\n | \"background\"\n> {\n /**\n * Plugins to customize how mdast nodes are transformed.\n */\n plugins?: RemarkDocxPlugin[];\n}\n\nexport const mdastToDocx = async (\n node: mdast.Root,\n {\n plugins = [],\n title,\n subject,\n creator,\n keywords,\n description,\n lastModifiedBy,\n revision,\n styles,\n background,\n }: DocxOptions,\n): Promise<ArrayBuffer> => {\n const definition = definitions(node);\n\n const footnote = createFootnoteRegistry();\n const numbering = createNumberingRegistry();\n\n const pluginCtx = { root: node, definition };\n const nodes = convertNodes(node.children, {\n overrides: (\n await Promise.all(plugins.map((p) => p(pluginCtx)))\n ).reduceRight((acc, p) => ({ ...acc, ...p }), {}),\n deco: {},\n indent: 0,\n definition: definition,\n footnote,\n numbering,\n });\n\n const doc = new Document({\n title,\n subject,\n creator,\n keywords,\n description,\n lastModifiedBy,\n revision,\n styles,\n background,\n footnotes: footnote.toConfig(),\n sections: [{ children: nodes as DocxChild[] }],\n numbering: {\n config: numbering.toConfig(),\n },\n });\n\n return Packer.toArrayBuffer(doc);\n};\n\nconst convertNodes = (\n nodes: mdast.RootContent[],\n ctx: Context,\n): DocxContent[] => {\n const results: DocxContent[] = [];\n for (const node of nodes) {\n const customNodes = ctx.overrides[node.type]?.(node as any, (children) =>\n convertNodes(children, ctx),\n );\n if (customNodes != null) {\n if (Array.isArray(customNodes)) {\n results.push(...customNodes);\n } else {\n results.push(customNodes);\n }\n continue;\n }\n\n switch (node.type) {\n case \"paragraph\": {\n results.push(buildParagraph(node, ctx));\n break;\n }\n case \"heading\": {\n results.push(buildHeading(node, ctx));\n break;\n }\n case \"thematicBreak\":\n results.push(buildThematicBreak(node));\n break;\n case \"blockquote\": {\n results.push(...buildBlockquote(node, ctx));\n break;\n }\n case \"list\": {\n results.push(...buildList(node, ctx));\n break;\n }\n case \"listItem\":\n invariant(false, \"unreachable\");\n case \"table\":\n results.push(buildTable(node, ctx));\n break;\n case \"tableRow\":\n invariant(false, \"unreachable\");\n case \"tableCell\":\n invariant(false, \"unreachable\");\n case \"html\":\n warnOnce(\n `${node.type} node is not rendered since remark-docx/plugins/html is not provided.`,\n );\n break;\n case \"code\":\n warnOnce(\n `${node.type} node is not rendered since remark-docx/plugins/code is not provided.`,\n );\n break;\n // case \"yaml\":\n // // unimplemented\n // break;\n // case \"toml\":\n // // unimplemented\n // break;\n case \"definition\":\n // noop\n break;\n case \"footnoteDefinition\": {\n registerFootnoteDefinition(node, ctx);\n break;\n }\n case \"text\":\n results.push(buildText(node.value, ctx.deco));\n break;\n case \"emphasis\":\n case \"strong\":\n case \"delete\": {\n const { type, children } = node;\n const nodes = convertNodes(children, {\n ...ctx,\n deco: { ...ctx.deco, [type]: true },\n });\n results.push(...nodes);\n break;\n }\n case \"inlineCode\":\n results.push(buildInlineCode(node));\n break;\n case \"break\":\n results.push(buildBreak(node));\n break;\n case \"link\": {\n results.push(buildLink(node, ctx));\n break;\n }\n case \"linkReference\":\n results.push(...buildLinkReference(node, ctx));\n break;\n case \"image\":\n case \"imageReference\": {\n warnOnce(\n `${node.type} node is not rendered since remark-docx/plugins/image is not provided.`,\n );\n break;\n }\n // case \"footnote\": {\n // // inline footnote was removed in mdast v5\n // break;\n // }\n case \"footnoteReference\":\n results.push(buildFootnoteReference(node, ctx));\n break;\n case \"math\":\n case \"inlineMath\":\n warnOnce(\n `${node.type} node is not rendered since remark-docx/plugins/math is not provided.`,\n );\n break;\n default:\n warnOnce(`${node.type} node is not officially supported.`);\n break;\n }\n }\n return results;\n};\n\nconst buildParagraph = (\n { children }: mdast.Paragraph,\n ctx: Context,\n): DocxContent => {\n const list = ctx.list;\n const nodes = convertNodes(children, ctx);\n\n if (list && list.checked != null) {\n nodes.unshift(\n new CheckBox({\n checked: list.checked,\n checkedState: { value: \"2611\" },\n uncheckedState: { value: \"2610\" },\n }),\n );\n }\n return new Paragraph({\n children: nodes,\n indent:\n ctx.indent > 0\n ? {\n start: convertInchesToTwip(INDENT * ctx.indent),\n }\n : undefined,\n ...(list &&\n (list.ordered\n ? {\n numbering: {\n reference: list.reference,\n level: list.level,\n },\n }\n : {\n bullet: {\n level: list.level,\n },\n })),\n });\n};\n\nconst buildHeading = (\n { children, depth }: mdast.Heading,\n ctx: Context,\n): DocxContent => {\n let headingLevel: (typeof HeadingLevel)[keyof typeof HeadingLevel];\n switch (depth) {\n case 1:\n headingLevel = HeadingLevel.TITLE;\n break;\n case 2:\n headingLevel = HeadingLevel.HEADING_1;\n break;\n case 3:\n headingLevel = HeadingLevel.HEADING_2;\n break;\n case 4:\n headingLevel = HeadingLevel.HEADING_3;\n break;\n case 5:\n headingLevel = HeadingLevel.HEADING_4;\n break;\n case 6:\n headingLevel = HeadingLevel.HEADING_5;\n break;\n }\n const nodes = convertNodes(children, ctx);\n return new Paragraph({\n heading: headingLevel,\n children: nodes,\n });\n};\n\nconst buildThematicBreak = (_: mdast.ThematicBreak): DocxContent => {\n return new Paragraph({\n thematicBreak: true,\n });\n};\n\nconst buildBlockquote = (\n { children }: mdast.Blockquote,\n ctx: Context,\n): DocxContent[] => {\n return convertNodes(children, {\n ...ctx,\n indent: ctx.indent + 1,\n });\n};\n\nconst buildList = (\n { children, ordered }: mdast.List,\n ctx: Context,\n): DocxContent[] => {\n const isTopLevel = !ctx.list;\n const list: ListInfo = {\n level: ctx.list ? ctx.list.level + 1 : 0,\n ordered: !!ordered,\n reference:\n isTopLevel && ordered\n ? ctx.numbering.create()\n : ctx.list?.reference || ORDERED_LIST_REF,\n };\n return children.flatMap((item) => {\n return buildListItem(item, {\n ...ctx,\n list,\n });\n });\n};\n\nconst buildListItem = (\n { children, checked }: mdast.ListItem,\n ctx: Context,\n): DocxContent[] => {\n return convertNodes(children, {\n ...ctx,\n ...(ctx.list && { list: { ...ctx.list, checked: checked ?? undefined } }),\n });\n};\n\nconst buildTable = (\n { children, align }: mdast.Table,\n ctx: Context,\n): DocxContent => {\n const cellAligns:\n | (typeof AlignmentType)[keyof typeof AlignmentType][]\n | undefined = align?.map((a) => {\n switch (a) {\n case \"left\":\n return AlignmentType.LEFT;\n case \"right\":\n return AlignmentType.RIGHT;\n case \"center\":\n return AlignmentType.CENTER;\n default:\n return AlignmentType.LEFT;\n }\n });\n\n const columnLength = children[0]!.children.length;\n const columnWidth = CONTENT_WIDTH / columnLength;\n\n return new Table({\n columnWidths: Array.from({ length: columnLength }).map(() => columnWidth),\n rows: children.map((r) => {\n return new TableRow({\n children: r.children.map((c, i) => {\n return new TableCell({\n width: { size: columnWidth, type: \"dxa\" },\n children: [\n new Paragraph({\n alignment: cellAligns?.[i],\n children: convertNodes(c.children, ctx),\n }),\n ],\n });\n }),\n });\n }),\n });\n};\n\nconst buildText = (text: string, deco: Decoration): DocxContent => {\n return new TextRun({\n text,\n bold: deco.strong,\n italics: deco.emphasis,\n strike: deco.delete,\n });\n};\n\nconst buildInlineCode = ({ value }: mdast.InlineCode): DocxContent => {\n return new TextRun({\n text: value,\n highlight: \"lightGray\",\n });\n};\n\nconst buildBreak = (_: mdast.Break): DocxContent => {\n return new TextRun({ text: \"\", break: 1 });\n};\n\nconst buildLink = (\n { children, url }: Pick<mdast.Link, \"children\" | \"url\">,\n ctx: Context,\n): DocxContent => {\n const nodes = convertNodes(children, ctx);\n return new ExternalHyperlink({\n link: url,\n children: nodes,\n });\n};\n\nconst buildLinkReference = (\n { children, identifier }: mdast.LinkReference,\n ctx: Context,\n): DocxContent[] => {\n const def = ctx.definition(identifier);\n if (def == null) {\n return convertNodes(children, ctx);\n }\n return [buildLink({ children, url: def.url }, ctx)];\n};\n\nconst registerFootnoteDefinition = (\n { children, identifier }: mdast.FootnoteDefinition,\n ctx: Context,\n): void => {\n const definition: FootnoteDefinition = {\n children: children.map((node) => {\n // Convert each node and extract the first result as a paragraph\n const nodes = convertNodes([node], ctx);\n if (nodes[0] instanceof Paragraph) {\n return nodes[0] as Paragraph;\n }\n // For non-paragraph content, wrap in a paragraph\n return new Paragraph({ children: nodes });\n }),\n };\n ctx.footnote.def(identifier, definition);\n};\n\nconst buildFootnoteReference = (\n { identifier }: mdast.FootnoteReference,\n ctx: Context,\n): DocxContent => {\n return new FootnoteReferenceRun(ctx.footnote.ref(identifier));\n};\n","import type { Plugin } from \"unified\";\nimport type { Root } from \"mdast\";\nimport { mdastToDocx, type DocxOptions } from \"./mdast-to-docx\";\n\nexport type { DocxOptions };\n\ndeclare module \"unified\" {\n interface CompileResultMap {\n docx: Promise<ArrayBuffer>;\n }\n}\n\nconst plugin: Plugin<[DocxOptions?], Root, Promise<ArrayBuffer>> = function (\n opts = {},\n) {\n this.compiler = (node) => {\n return mdastToDocx(node as Root, opts);\n };\n};\nexport default plugin;\n"],"names":["sectionPageSizeDefaults","sectionMarginDefaults","LevelFormat","AlignmentType","convertInchesToTwip","definitions","Document","Packer","CheckBox","Paragraph","HeadingLevel","Table","TableRow","TableCell","TextRun","ExternalHyperlink","FootnoteReferenceRun"],"mappings":"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"}
package/lib/index.js CHANGED
@@ -132,7 +132,7 @@ const mdastToDocx = async (node, { plugins = [], title, subject, creator, keywor
132
132
  const numbering = createNumberingRegistry();
133
133
  const pluginCtx = { root: node, definition };
134
134
  const nodes = convertNodes(node.children, {
135
- overrides: (await Promise.all(plugins.map((p) => p(pluginCtx)))).reduceRight((acc, p) => ({ acc, ...p }), {}),
135
+ overrides: (await Promise.all(plugins.map((p) => p(pluginCtx)))).reduceRight((acc, p) => ({ ...acc, ...p }), {}),
136
136
  deco: {},
137
137
  indent: 0,
138
138
  definition: definition,
@@ -204,7 +204,7 @@ const convertNodes = (nodes, ctx) => {
204
204
  warnOnce(`${node.type} node is not rendered since remark-docx/plugins/html is not provided.`);
205
205
  break;
206
206
  case "code":
207
- results.push(buildCode(node));
207
+ warnOnce(`${node.type} node is not rendered since remark-docx/plugins/code is not provided.`);
208
208
  break;
209
209
  // case "yaml":
210
210
  // // unimplemented
@@ -397,12 +397,6 @@ const buildTable = ({ children, align }, ctx) => {
397
397
  }),
398
398
  });
399
399
  };
400
- const buildCode = ({ value, lang: _lang, meta: _meta, }) => {
401
- // FIXME: transform to text for now
402
- return new Paragraph({
403
- children: [buildText(value, {})],
404
- });
405
- };
406
400
  const buildText = (text, deco) => {
407
401
  return new TextRun({
408
402
  text,
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/src/utils.ts","../src/src/mdast-to-docx.ts","../src/src/plugin.ts"],"sourcesContent":["/**\n * @internal\n */\nexport function invariant(cond: any, message: string): asserts cond {\n if (!cond) throw new Error(message);\n}\n\nconst alreadyWarned: { [message: string]: boolean } = {};\n\n/**\n * @internal\n */\nexport function warnOnce(message: string, cond: boolean = false): void {\n if (!cond && !alreadyWarned[message]) {\n alreadyWarned[message] = true;\n console.warn(message);\n }\n}\n","import {\n convertInchesToTwip,\n Packer,\n Document,\n Paragraph,\n Table,\n TableRow,\n TableCell,\n TextRun,\n ExternalHyperlink,\n HeadingLevel,\n LevelFormat,\n AlignmentType,\n type ILevelsOptions,\n FootnoteReferenceRun,\n CheckBox,\n type IPropertiesOptions,\n sectionPageSizeDefaults,\n sectionMarginDefaults,\n} from \"docx\";\nimport type * as mdast from \"./mdast\";\nimport { invariant, warnOnce } from \"./utils\";\nimport { definitions, type GetDefinition } from \"mdast-util-definitions\";\nimport type {\n DocxChild,\n DocxContent,\n NodeOverrides,\n RemarkDocxPlugin,\n} from \"./types\";\n\nconst CONTENT_WIDTH =\n sectionPageSizeDefaults.WIDTH -\n sectionMarginDefaults.LEFT -\n sectionMarginDefaults.RIGHT;\nconst ORDERED_LIST_REF = \"ordered\";\nconst INDENT = 0.5;\n\ntype Decoration = Readonly<{\n [key in (mdast.Emphasis | mdast.Strong | mdast.Delete)[\"type\"]]?: true;\n}>;\n\ntype ListInfo = Readonly<{\n level: number;\n ordered: boolean;\n reference: string;\n checked?: boolean;\n}>;\n\ntype FootnoteDefinition = Readonly<{ children: Paragraph[] }>;\ntype FootnoteRegistry = {\n ref: (id: string) => number;\n def: (id: string, def: FootnoteDefinition) => void;\n toConfig: () => {\n [key: string]: FootnoteDefinition;\n };\n};\n\nconst createFootnoteRegistry = (): FootnoteRegistry => {\n const idToInternalId = new Map<string, number>();\n const defs = new Map<number, FootnoteDefinition>();\n\n const getId = (id: string): number => {\n let internalId = idToInternalId.get(id);\n if (internalId == null) {\n idToInternalId.set(id, (internalId = idToInternalId.size + 1));\n }\n return internalId;\n };\n\n return {\n ref: (id) => {\n return getId(id);\n },\n def: (id, def) => {\n const internalId = getId(id);\n defs.set(internalId, def);\n },\n toConfig: () => {\n return defs.entries().reduce(\n (acc, [key, def]) => {\n acc[key] = def;\n return acc;\n },\n {} as {\n [key: string]: FootnoteDefinition;\n },\n );\n },\n };\n};\n\ntype NumberingRegistry = {\n create: () => string;\n toConfig: () => Array<{ reference: string; levels: ILevelsOptions[] }>;\n};\n\nconst createNumberingRegistry = (): NumberingRegistry => {\n let counter = 1;\n\n const DEFAULT_NUMBERINGS: ILevelsOptions[] = [\n {\n level: 0,\n format: LevelFormat.DECIMAL,\n text: \"%1.\",\n alignment: AlignmentType.START,\n },\n {\n level: 1,\n format: LevelFormat.DECIMAL,\n text: \"%2.\",\n alignment: AlignmentType.START,\n style: {\n paragraph: {\n indent: { start: convertInchesToTwip(INDENT * 1) },\n },\n },\n },\n {\n level: 2,\n format: LevelFormat.DECIMAL,\n text: \"%3.\",\n alignment: AlignmentType.START,\n style: {\n paragraph: {\n indent: { start: convertInchesToTwip(INDENT * 2) },\n },\n },\n },\n {\n level: 3,\n format: LevelFormat.DECIMAL,\n text: \"%4.\",\n alignment: AlignmentType.START,\n style: {\n paragraph: {\n indent: { start: convertInchesToTwip(INDENT * 3) },\n },\n },\n },\n {\n level: 4,\n format: LevelFormat.DECIMAL,\n text: \"%5.\",\n alignment: AlignmentType.START,\n style: {\n paragraph: {\n indent: { start: convertInchesToTwip(INDENT * 4) },\n },\n },\n },\n {\n level: 5,\n format: LevelFormat.DECIMAL,\n text: \"%6.\",\n alignment: AlignmentType.START,\n style: {\n paragraph: {\n indent: { start: convertInchesToTwip(INDENT * 5) },\n },\n },\n },\n ];\n\n return {\n create: () => {\n return `${ORDERED_LIST_REF}-${counter++}`;\n },\n toConfig: () => {\n return Array.from({ length: counter }, (_, i) => ({\n reference: `${ORDERED_LIST_REF}-${i}`,\n levels: DEFAULT_NUMBERINGS,\n }));\n },\n };\n};\n\ntype Context = Readonly<{\n overrides: NodeOverrides;\n deco: Decoration;\n indent: number;\n list?: ListInfo;\n definition: GetDefinition;\n footnote: FootnoteRegistry;\n numbering: NumberingRegistry;\n}>;\n\nexport interface DocxOptions extends Pick<\n IPropertiesOptions,\n | \"title\"\n | \"subject\"\n | \"creator\"\n | \"keywords\"\n | \"description\"\n | \"lastModifiedBy\"\n | \"revision\"\n | \"styles\"\n | \"background\"\n> {\n /**\n * Plugins to customize how mdast nodes are transformed.\n */\n plugins?: RemarkDocxPlugin[];\n}\n\nexport const mdastToDocx = async (\n node: mdast.Root,\n {\n plugins = [],\n title,\n subject,\n creator,\n keywords,\n description,\n lastModifiedBy,\n revision,\n styles,\n background,\n }: DocxOptions,\n): Promise<ArrayBuffer> => {\n const definition = definitions(node);\n\n const footnote = createFootnoteRegistry();\n const numbering = createNumberingRegistry();\n\n const pluginCtx = { root: node, definition };\n const nodes = convertNodes(node.children, {\n overrides: (\n await Promise.all(plugins.map((p) => p(pluginCtx)))\n ).reduceRight((acc, p) => ({ acc, ...p }), {}),\n deco: {},\n indent: 0,\n definition: definition,\n footnote,\n numbering,\n });\n\n const doc = new Document({\n title,\n subject,\n creator,\n keywords,\n description,\n lastModifiedBy,\n revision,\n styles,\n background,\n footnotes: footnote.toConfig(),\n sections: [{ children: nodes as DocxChild[] }],\n numbering: {\n config: numbering.toConfig(),\n },\n });\n\n return Packer.toArrayBuffer(doc);\n};\n\nconst convertNodes = (\n nodes: mdast.RootContent[],\n ctx: Context,\n): DocxContent[] => {\n const results: DocxContent[] = [];\n for (const node of nodes) {\n const customNodes = ctx.overrides[node.type]?.(node as any, (children) =>\n convertNodes(children, ctx),\n );\n if (customNodes != null) {\n if (Array.isArray(customNodes)) {\n results.push(...customNodes);\n } else {\n results.push(customNodes);\n }\n continue;\n }\n\n switch (node.type) {\n case \"paragraph\": {\n results.push(buildParagraph(node, ctx));\n break;\n }\n case \"heading\": {\n results.push(buildHeading(node, ctx));\n break;\n }\n case \"thematicBreak\":\n results.push(buildThematicBreak(node));\n break;\n case \"blockquote\": {\n results.push(...buildBlockquote(node, ctx));\n break;\n }\n case \"list\": {\n results.push(...buildList(node, ctx));\n break;\n }\n case \"listItem\":\n invariant(false, \"unreachable\");\n case \"table\":\n results.push(buildTable(node, ctx));\n break;\n case \"tableRow\":\n invariant(false, \"unreachable\");\n case \"tableCell\":\n invariant(false, \"unreachable\");\n case \"html\":\n warnOnce(\n `${node.type} node is not rendered since remark-docx/plugins/html is not provided.`,\n );\n break;\n case \"code\":\n results.push(buildCode(node));\n break;\n // case \"yaml\":\n // // unimplemented\n // break;\n // case \"toml\":\n // // unimplemented\n // break;\n case \"definition\":\n // noop\n break;\n case \"footnoteDefinition\": {\n registerFootnoteDefinition(node, ctx);\n break;\n }\n case \"text\":\n results.push(buildText(node.value, ctx.deco));\n break;\n case \"emphasis\":\n case \"strong\":\n case \"delete\": {\n const { type, children } = node;\n const nodes = convertNodes(children, {\n ...ctx,\n deco: { ...ctx.deco, [type]: true },\n });\n results.push(...nodes);\n break;\n }\n case \"inlineCode\":\n results.push(buildInlineCode(node));\n break;\n case \"break\":\n results.push(buildBreak(node));\n break;\n case \"link\": {\n results.push(buildLink(node, ctx));\n break;\n }\n case \"linkReference\":\n results.push(...buildLinkReference(node, ctx));\n break;\n case \"image\":\n case \"imageReference\": {\n warnOnce(\n `${node.type} node is not rendered since remark-docx/plugins/image is not provided.`,\n );\n break;\n }\n // case \"footnote\": {\n // // inline footnote was removed in mdast v5\n // break;\n // }\n case \"footnoteReference\":\n results.push(buildFootnoteReference(node, ctx));\n break;\n case \"math\":\n case \"inlineMath\":\n warnOnce(\n `${node.type} node is not rendered since remark-docx/plugins/math is not provided.`,\n );\n break;\n default:\n warnOnce(`${node.type} node is not officially supported.`);\n break;\n }\n }\n return results;\n};\n\nconst buildParagraph = (\n { children }: mdast.Paragraph,\n ctx: Context,\n): DocxContent => {\n const list = ctx.list;\n const nodes = convertNodes(children, ctx);\n\n if (list && list.checked != null) {\n nodes.unshift(\n new CheckBox({\n checked: list.checked,\n checkedState: { value: \"2611\" },\n uncheckedState: { value: \"2610\" },\n }),\n );\n }\n return new Paragraph({\n children: nodes,\n indent:\n ctx.indent > 0\n ? {\n start: convertInchesToTwip(INDENT * ctx.indent),\n }\n : undefined,\n ...(list &&\n (list.ordered\n ? {\n numbering: {\n reference: list.reference,\n level: list.level,\n },\n }\n : {\n bullet: {\n level: list.level,\n },\n })),\n });\n};\n\nconst buildHeading = (\n { children, depth }: mdast.Heading,\n ctx: Context,\n): DocxContent => {\n let headingLevel: (typeof HeadingLevel)[keyof typeof HeadingLevel];\n switch (depth) {\n case 1:\n headingLevel = HeadingLevel.TITLE;\n break;\n case 2:\n headingLevel = HeadingLevel.HEADING_1;\n break;\n case 3:\n headingLevel = HeadingLevel.HEADING_2;\n break;\n case 4:\n headingLevel = HeadingLevel.HEADING_3;\n break;\n case 5:\n headingLevel = HeadingLevel.HEADING_4;\n break;\n case 6:\n headingLevel = HeadingLevel.HEADING_5;\n break;\n }\n const nodes = convertNodes(children, ctx);\n return new Paragraph({\n heading: headingLevel,\n children: nodes,\n });\n};\n\nconst buildThematicBreak = (_: mdast.ThematicBreak): DocxContent => {\n return new Paragraph({\n thematicBreak: true,\n });\n};\n\nconst buildBlockquote = (\n { children }: mdast.Blockquote,\n ctx: Context,\n): DocxContent[] => {\n return convertNodes(children, {\n ...ctx,\n indent: ctx.indent + 1,\n });\n};\n\nconst buildList = (\n { children, ordered }: mdast.List,\n ctx: Context,\n): DocxContent[] => {\n const isTopLevel = !ctx.list;\n const list: ListInfo = {\n level: ctx.list ? ctx.list.level + 1 : 0,\n ordered: !!ordered,\n reference:\n isTopLevel && ordered\n ? ctx.numbering.create()\n : ctx.list?.reference || ORDERED_LIST_REF,\n };\n return children.flatMap((item) => {\n return buildListItem(item, {\n ...ctx,\n list,\n });\n });\n};\n\nconst buildListItem = (\n { children, checked }: mdast.ListItem,\n ctx: Context,\n): DocxContent[] => {\n return convertNodes(children, {\n ...ctx,\n ...(ctx.list && { list: { ...ctx.list, checked: checked ?? undefined } }),\n });\n};\n\nconst buildTable = (\n { children, align }: mdast.Table,\n ctx: Context,\n): DocxContent => {\n const cellAligns:\n | (typeof AlignmentType)[keyof typeof AlignmentType][]\n | undefined = align?.map((a) => {\n switch (a) {\n case \"left\":\n return AlignmentType.LEFT;\n case \"right\":\n return AlignmentType.RIGHT;\n case \"center\":\n return AlignmentType.CENTER;\n default:\n return AlignmentType.LEFT;\n }\n });\n\n const columnLength = children[0]!.children.length;\n const columnWidth = CONTENT_WIDTH / columnLength;\n\n return new Table({\n columnWidths: Array.from({ length: columnLength }).map(() => columnWidth),\n rows: children.map((r) => {\n return new TableRow({\n children: r.children.map((c, i) => {\n return new TableCell({\n width: { size: columnWidth, type: \"dxa\" },\n children: [\n new Paragraph({\n alignment: cellAligns?.[i],\n children: convertNodes(c.children, ctx),\n }),\n ],\n });\n }),\n });\n }),\n });\n};\n\nconst buildCode = ({\n value,\n lang: _lang,\n meta: _meta,\n}: mdast.Code): DocxContent => {\n // FIXME: transform to text for now\n return new Paragraph({\n children: [buildText(value, {})],\n });\n};\n\nconst buildText = (text: string, deco: Decoration): DocxContent => {\n return new TextRun({\n text,\n bold: deco.strong,\n italics: deco.emphasis,\n strike: deco.delete,\n });\n};\n\nconst buildInlineCode = ({ value }: mdast.InlineCode): DocxContent => {\n return new TextRun({\n text: value,\n highlight: \"lightGray\",\n });\n};\n\nconst buildBreak = (_: mdast.Break): DocxContent => {\n return new TextRun({ text: \"\", break: 1 });\n};\n\nconst buildLink = (\n { children, url }: Pick<mdast.Link, \"children\" | \"url\">,\n ctx: Context,\n): DocxContent => {\n const nodes = convertNodes(children, ctx);\n return new ExternalHyperlink({\n link: url,\n children: nodes,\n });\n};\n\nconst buildLinkReference = (\n { children, identifier }: mdast.LinkReference,\n ctx: Context,\n): DocxContent[] => {\n const def = ctx.definition(identifier);\n if (def == null) {\n return convertNodes(children, ctx);\n }\n return [buildLink({ children, url: def.url }, ctx)];\n};\n\nconst registerFootnoteDefinition = (\n { children, identifier }: mdast.FootnoteDefinition,\n ctx: Context,\n): void => {\n const definition: FootnoteDefinition = {\n children: children.map((node) => {\n // Convert each node and extract the first result as a paragraph\n const nodes = convertNodes([node], ctx);\n if (nodes[0] instanceof Paragraph) {\n return nodes[0] as Paragraph;\n }\n // For non-paragraph content, wrap in a paragraph\n return new Paragraph({ children: nodes });\n }),\n };\n ctx.footnote.def(identifier, definition);\n};\n\nconst buildFootnoteReference = (\n { identifier }: mdast.FootnoteReference,\n ctx: Context,\n): DocxContent => {\n return new FootnoteReferenceRun(ctx.footnote.ref(identifier));\n};\n","import type { Plugin } from \"unified\";\nimport type { Root } from \"mdast\";\nimport { mdastToDocx, type DocxOptions } from \"./mdast-to-docx\";\n\nexport type { DocxOptions };\n\ndeclare module \"unified\" {\n interface CompileResultMap {\n docx: Promise<ArrayBuffer>;\n }\n}\n\nconst plugin: Plugin<[DocxOptions?], Root, Promise<ArrayBuffer>> = function (\n opts = {},\n) {\n this.compiler = (node) => {\n return mdastToDocx(node as Root, opts);\n };\n};\nexport default plugin;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/src/utils.ts","../src/src/mdast-to-docx.ts","../src/src/plugin.ts"],"sourcesContent":["/**\n * @internal\n */\nexport function invariant(cond: any, message: string): asserts cond {\n if (!cond) throw new Error(message);\n}\n\nconst alreadyWarned: { [message: string]: boolean } = {};\n\n/**\n * @internal\n */\nexport function warnOnce(message: string, cond: boolean = false): void {\n if (!cond && !alreadyWarned[message]) {\n alreadyWarned[message] = true;\n console.warn(message);\n }\n}\n","import {\n convertInchesToTwip,\n Packer,\n Document,\n Paragraph,\n Table,\n TableRow,\n TableCell,\n TextRun,\n ExternalHyperlink,\n HeadingLevel,\n LevelFormat,\n AlignmentType,\n type ILevelsOptions,\n FootnoteReferenceRun,\n CheckBox,\n type IPropertiesOptions,\n sectionPageSizeDefaults,\n sectionMarginDefaults,\n} from \"docx\";\nimport type * as mdast from \"./mdast\";\nimport { invariant, warnOnce } from \"./utils\";\nimport { definitions, type GetDefinition } from \"mdast-util-definitions\";\nimport type {\n DocxChild,\n DocxContent,\n NodeOverrides,\n RemarkDocxPlugin,\n} from \"./types\";\n\nconst CONTENT_WIDTH =\n sectionPageSizeDefaults.WIDTH -\n sectionMarginDefaults.LEFT -\n sectionMarginDefaults.RIGHT;\nconst ORDERED_LIST_REF = \"ordered\";\nconst INDENT = 0.5;\n\ntype Decoration = Readonly<{\n [key in (mdast.Emphasis | mdast.Strong | mdast.Delete)[\"type\"]]?: true;\n}>;\n\ntype ListInfo = Readonly<{\n level: number;\n ordered: boolean;\n reference: string;\n checked?: boolean;\n}>;\n\ntype FootnoteDefinition = Readonly<{ children: Paragraph[] }>;\ntype FootnoteRegistry = {\n ref: (id: string) => number;\n def: (id: string, def: FootnoteDefinition) => void;\n toConfig: () => {\n [key: string]: FootnoteDefinition;\n };\n};\n\nconst createFootnoteRegistry = (): FootnoteRegistry => {\n const idToInternalId = new Map<string, number>();\n const defs = new Map<number, FootnoteDefinition>();\n\n const getId = (id: string): number => {\n let internalId = idToInternalId.get(id);\n if (internalId == null) {\n idToInternalId.set(id, (internalId = idToInternalId.size + 1));\n }\n return internalId;\n };\n\n return {\n ref: (id) => {\n return getId(id);\n },\n def: (id, def) => {\n const internalId = getId(id);\n defs.set(internalId, def);\n },\n toConfig: () => {\n return defs.entries().reduce(\n (acc, [key, def]) => {\n acc[key] = def;\n return acc;\n },\n {} as {\n [key: string]: FootnoteDefinition;\n },\n );\n },\n };\n};\n\ntype NumberingRegistry = {\n create: () => string;\n toConfig: () => Array<{ reference: string; levels: ILevelsOptions[] }>;\n};\n\nconst createNumberingRegistry = (): NumberingRegistry => {\n let counter = 1;\n\n const DEFAULT_NUMBERINGS: ILevelsOptions[] = [\n {\n level: 0,\n format: LevelFormat.DECIMAL,\n text: \"%1.\",\n alignment: AlignmentType.START,\n },\n {\n level: 1,\n format: LevelFormat.DECIMAL,\n text: \"%2.\",\n alignment: AlignmentType.START,\n style: {\n paragraph: {\n indent: { start: convertInchesToTwip(INDENT * 1) },\n },\n },\n },\n {\n level: 2,\n format: LevelFormat.DECIMAL,\n text: \"%3.\",\n alignment: AlignmentType.START,\n style: {\n paragraph: {\n indent: { start: convertInchesToTwip(INDENT * 2) },\n },\n },\n },\n {\n level: 3,\n format: LevelFormat.DECIMAL,\n text: \"%4.\",\n alignment: AlignmentType.START,\n style: {\n paragraph: {\n indent: { start: convertInchesToTwip(INDENT * 3) },\n },\n },\n },\n {\n level: 4,\n format: LevelFormat.DECIMAL,\n text: \"%5.\",\n alignment: AlignmentType.START,\n style: {\n paragraph: {\n indent: { start: convertInchesToTwip(INDENT * 4) },\n },\n },\n },\n {\n level: 5,\n format: LevelFormat.DECIMAL,\n text: \"%6.\",\n alignment: AlignmentType.START,\n style: {\n paragraph: {\n indent: { start: convertInchesToTwip(INDENT * 5) },\n },\n },\n },\n ];\n\n return {\n create: () => {\n return `${ORDERED_LIST_REF}-${counter++}`;\n },\n toConfig: () => {\n return Array.from({ length: counter }, (_, i) => ({\n reference: `${ORDERED_LIST_REF}-${i}`,\n levels: DEFAULT_NUMBERINGS,\n }));\n },\n };\n};\n\ntype Context = Readonly<{\n overrides: NodeOverrides;\n deco: Decoration;\n indent: number;\n list?: ListInfo;\n definition: GetDefinition;\n footnote: FootnoteRegistry;\n numbering: NumberingRegistry;\n}>;\n\nexport interface DocxOptions extends Pick<\n IPropertiesOptions,\n | \"title\"\n | \"subject\"\n | \"creator\"\n | \"keywords\"\n | \"description\"\n | \"lastModifiedBy\"\n | \"revision\"\n | \"styles\"\n | \"background\"\n> {\n /**\n * Plugins to customize how mdast nodes are transformed.\n */\n plugins?: RemarkDocxPlugin[];\n}\n\nexport const mdastToDocx = async (\n node: mdast.Root,\n {\n plugins = [],\n title,\n subject,\n creator,\n keywords,\n description,\n lastModifiedBy,\n revision,\n styles,\n background,\n }: DocxOptions,\n): Promise<ArrayBuffer> => {\n const definition = definitions(node);\n\n const footnote = createFootnoteRegistry();\n const numbering = createNumberingRegistry();\n\n const pluginCtx = { root: node, definition };\n const nodes = convertNodes(node.children, {\n overrides: (\n await Promise.all(plugins.map((p) => p(pluginCtx)))\n ).reduceRight((acc, p) => ({ ...acc, ...p }), {}),\n deco: {},\n indent: 0,\n definition: definition,\n footnote,\n numbering,\n });\n\n const doc = new Document({\n title,\n subject,\n creator,\n keywords,\n description,\n lastModifiedBy,\n revision,\n styles,\n background,\n footnotes: footnote.toConfig(),\n sections: [{ children: nodes as DocxChild[] }],\n numbering: {\n config: numbering.toConfig(),\n },\n });\n\n return Packer.toArrayBuffer(doc);\n};\n\nconst convertNodes = (\n nodes: mdast.RootContent[],\n ctx: Context,\n): DocxContent[] => {\n const results: DocxContent[] = [];\n for (const node of nodes) {\n const customNodes = ctx.overrides[node.type]?.(node as any, (children) =>\n convertNodes(children, ctx),\n );\n if (customNodes != null) {\n if (Array.isArray(customNodes)) {\n results.push(...customNodes);\n } else {\n results.push(customNodes);\n }\n continue;\n }\n\n switch (node.type) {\n case \"paragraph\": {\n results.push(buildParagraph(node, ctx));\n break;\n }\n case \"heading\": {\n results.push(buildHeading(node, ctx));\n break;\n }\n case \"thematicBreak\":\n results.push(buildThematicBreak(node));\n break;\n case \"blockquote\": {\n results.push(...buildBlockquote(node, ctx));\n break;\n }\n case \"list\": {\n results.push(...buildList(node, ctx));\n break;\n }\n case \"listItem\":\n invariant(false, \"unreachable\");\n case \"table\":\n results.push(buildTable(node, ctx));\n break;\n case \"tableRow\":\n invariant(false, \"unreachable\");\n case \"tableCell\":\n invariant(false, \"unreachable\");\n case \"html\":\n warnOnce(\n `${node.type} node is not rendered since remark-docx/plugins/html is not provided.`,\n );\n break;\n case \"code\":\n warnOnce(\n `${node.type} node is not rendered since remark-docx/plugins/code is not provided.`,\n );\n break;\n // case \"yaml\":\n // // unimplemented\n // break;\n // case \"toml\":\n // // unimplemented\n // break;\n case \"definition\":\n // noop\n break;\n case \"footnoteDefinition\": {\n registerFootnoteDefinition(node, ctx);\n break;\n }\n case \"text\":\n results.push(buildText(node.value, ctx.deco));\n break;\n case \"emphasis\":\n case \"strong\":\n case \"delete\": {\n const { type, children } = node;\n const nodes = convertNodes(children, {\n ...ctx,\n deco: { ...ctx.deco, [type]: true },\n });\n results.push(...nodes);\n break;\n }\n case \"inlineCode\":\n results.push(buildInlineCode(node));\n break;\n case \"break\":\n results.push(buildBreak(node));\n break;\n case \"link\": {\n results.push(buildLink(node, ctx));\n break;\n }\n case \"linkReference\":\n results.push(...buildLinkReference(node, ctx));\n break;\n case \"image\":\n case \"imageReference\": {\n warnOnce(\n `${node.type} node is not rendered since remark-docx/plugins/image is not provided.`,\n );\n break;\n }\n // case \"footnote\": {\n // // inline footnote was removed in mdast v5\n // break;\n // }\n case \"footnoteReference\":\n results.push(buildFootnoteReference(node, ctx));\n break;\n case \"math\":\n case \"inlineMath\":\n warnOnce(\n `${node.type} node is not rendered since remark-docx/plugins/math is not provided.`,\n );\n break;\n default:\n warnOnce(`${node.type} node is not officially supported.`);\n break;\n }\n }\n return results;\n};\n\nconst buildParagraph = (\n { children }: mdast.Paragraph,\n ctx: Context,\n): DocxContent => {\n const list = ctx.list;\n const nodes = convertNodes(children, ctx);\n\n if (list && list.checked != null) {\n nodes.unshift(\n new CheckBox({\n checked: list.checked,\n checkedState: { value: \"2611\" },\n uncheckedState: { value: \"2610\" },\n }),\n );\n }\n return new Paragraph({\n children: nodes,\n indent:\n ctx.indent > 0\n ? {\n start: convertInchesToTwip(INDENT * ctx.indent),\n }\n : undefined,\n ...(list &&\n (list.ordered\n ? {\n numbering: {\n reference: list.reference,\n level: list.level,\n },\n }\n : {\n bullet: {\n level: list.level,\n },\n })),\n });\n};\n\nconst buildHeading = (\n { children, depth }: mdast.Heading,\n ctx: Context,\n): DocxContent => {\n let headingLevel: (typeof HeadingLevel)[keyof typeof HeadingLevel];\n switch (depth) {\n case 1:\n headingLevel = HeadingLevel.TITLE;\n break;\n case 2:\n headingLevel = HeadingLevel.HEADING_1;\n break;\n case 3:\n headingLevel = HeadingLevel.HEADING_2;\n break;\n case 4:\n headingLevel = HeadingLevel.HEADING_3;\n break;\n case 5:\n headingLevel = HeadingLevel.HEADING_4;\n break;\n case 6:\n headingLevel = HeadingLevel.HEADING_5;\n break;\n }\n const nodes = convertNodes(children, ctx);\n return new Paragraph({\n heading: headingLevel,\n children: nodes,\n });\n};\n\nconst buildThematicBreak = (_: mdast.ThematicBreak): DocxContent => {\n return new Paragraph({\n thematicBreak: true,\n });\n};\n\nconst buildBlockquote = (\n { children }: mdast.Blockquote,\n ctx: Context,\n): DocxContent[] => {\n return convertNodes(children, {\n ...ctx,\n indent: ctx.indent + 1,\n });\n};\n\nconst buildList = (\n { children, ordered }: mdast.List,\n ctx: Context,\n): DocxContent[] => {\n const isTopLevel = !ctx.list;\n const list: ListInfo = {\n level: ctx.list ? ctx.list.level + 1 : 0,\n ordered: !!ordered,\n reference:\n isTopLevel && ordered\n ? ctx.numbering.create()\n : ctx.list?.reference || ORDERED_LIST_REF,\n };\n return children.flatMap((item) => {\n return buildListItem(item, {\n ...ctx,\n list,\n });\n });\n};\n\nconst buildListItem = (\n { children, checked }: mdast.ListItem,\n ctx: Context,\n): DocxContent[] => {\n return convertNodes(children, {\n ...ctx,\n ...(ctx.list && { list: { ...ctx.list, checked: checked ?? undefined } }),\n });\n};\n\nconst buildTable = (\n { children, align }: mdast.Table,\n ctx: Context,\n): DocxContent => {\n const cellAligns:\n | (typeof AlignmentType)[keyof typeof AlignmentType][]\n | undefined = align?.map((a) => {\n switch (a) {\n case \"left\":\n return AlignmentType.LEFT;\n case \"right\":\n return AlignmentType.RIGHT;\n case \"center\":\n return AlignmentType.CENTER;\n default:\n return AlignmentType.LEFT;\n }\n });\n\n const columnLength = children[0]!.children.length;\n const columnWidth = CONTENT_WIDTH / columnLength;\n\n return new Table({\n columnWidths: Array.from({ length: columnLength }).map(() => columnWidth),\n rows: children.map((r) => {\n return new TableRow({\n children: r.children.map((c, i) => {\n return new TableCell({\n width: { size: columnWidth, type: \"dxa\" },\n children: [\n new Paragraph({\n alignment: cellAligns?.[i],\n children: convertNodes(c.children, ctx),\n }),\n ],\n });\n }),\n });\n }),\n });\n};\n\nconst buildText = (text: string, deco: Decoration): DocxContent => {\n return new TextRun({\n text,\n bold: deco.strong,\n italics: deco.emphasis,\n strike: deco.delete,\n });\n};\n\nconst buildInlineCode = ({ value }: mdast.InlineCode): DocxContent => {\n return new TextRun({\n text: value,\n highlight: \"lightGray\",\n });\n};\n\nconst buildBreak = (_: mdast.Break): DocxContent => {\n return new TextRun({ text: \"\", break: 1 });\n};\n\nconst buildLink = (\n { children, url }: Pick<mdast.Link, \"children\" | \"url\">,\n ctx: Context,\n): DocxContent => {\n const nodes = convertNodes(children, ctx);\n return new ExternalHyperlink({\n link: url,\n children: nodes,\n });\n};\n\nconst buildLinkReference = (\n { children, identifier }: mdast.LinkReference,\n ctx: Context,\n): DocxContent[] => {\n const def = ctx.definition(identifier);\n if (def == null) {\n return convertNodes(children, ctx);\n }\n return [buildLink({ children, url: def.url }, ctx)];\n};\n\nconst registerFootnoteDefinition = (\n { children, identifier }: mdast.FootnoteDefinition,\n ctx: Context,\n): void => {\n const definition: FootnoteDefinition = {\n children: children.map((node) => {\n // Convert each node and extract the first result as a paragraph\n const nodes = convertNodes([node], ctx);\n if (nodes[0] instanceof Paragraph) {\n return nodes[0] as Paragraph;\n }\n // For non-paragraph content, wrap in a paragraph\n return new Paragraph({ children: nodes });\n }),\n };\n ctx.footnote.def(identifier, definition);\n};\n\nconst buildFootnoteReference = (\n { identifier }: mdast.FootnoteReference,\n ctx: Context,\n): DocxContent => {\n return new FootnoteReferenceRun(ctx.footnote.ref(identifier));\n};\n","import type { Plugin } from \"unified\";\nimport type { Root } from \"mdast\";\nimport { mdastToDocx, type DocxOptions } from \"./mdast-to-docx\";\n\nexport type { DocxOptions };\n\ndeclare module \"unified\" {\n interface CompileResultMap {\n docx: Promise<ArrayBuffer>;\n }\n}\n\nconst plugin: Plugin<[DocxOptions?], Root, Promise<ArrayBuffer>> = function (\n opts = {},\n) {\n this.compiler = (node) => {\n return mdastToDocx(node as Root, opts);\n };\n};\nexport default plugin;\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ 'use strict';
2
+
3
+ var docx = require('docx');
4
+ var shiki = require('shiki');
5
+ var unistUtilVisit = require('unist-util-visit');
6
+
7
+ /**
8
+ * A plugin to render "code" nodes, with syntax highlighting powered by shiki.
9
+ */
10
+ const shikiPlugin = ({ theme, }) => {
11
+ let highlighter;
12
+ const langs = new Set();
13
+ return async ({ root }) => {
14
+ const newLangs = [];
15
+ unistUtilVisit.visit(root, "code", ({ lang }) => {
16
+ if (lang) {
17
+ if (!langs.has(lang)) {
18
+ langs.add(lang);
19
+ newLangs.push(lang);
20
+ }
21
+ }
22
+ });
23
+ if (!highlighter) {
24
+ highlighter = await shiki.createHighlighter({
25
+ themes: [theme],
26
+ langs: [...langs],
27
+ });
28
+ }
29
+ else {
30
+ await Promise.all(newLangs.map((l) => highlighter.loadLanguage(l)));
31
+ }
32
+ return {
33
+ code: ({ value, lang }) => {
34
+ if (!lang) {
35
+ return null;
36
+ }
37
+ const res = highlighter.codeToTokens(value, {
38
+ lang: lang,
39
+ theme,
40
+ });
41
+ return res.tokens.map((r) => {
42
+ return new docx.Paragraph({
43
+ shading: {
44
+ type: "clear",
45
+ color: "auto",
46
+ fill: res.bg,
47
+ },
48
+ children: r.map(({ content, bgColor, color, fontStyle }) => {
49
+ return new docx.TextRun({
50
+ text: content,
51
+ color: color !== null && color !== void 0 ? color : res.fg,
52
+ shading: bgColor
53
+ ? {
54
+ type: "clear",
55
+ color: "auto",
56
+ fill: bgColor,
57
+ }
58
+ : undefined,
59
+ bold: fontStyle === 2,
60
+ italics: fontStyle === 1,
61
+ underline: fontStyle === 4
62
+ ? { type: "single", color: res.fg }
63
+ : undefined,
64
+ strike: fontStyle === 8,
65
+ });
66
+ }),
67
+ });
68
+ });
69
+ },
70
+ };
71
+ };
72
+ };
73
+
74
+ exports.shikiPlugin = shikiPlugin;
75
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../../../src/plugins/code/index.ts"],"sourcesContent":["import { Paragraph, TextRun } from \"docx\";\nimport type { RemarkDocxPlugin } from \"../../types\";\nimport {\n createHighlighter,\n type BundledLanguage,\n type BundledTheme,\n} from \"shiki\";\nimport { visit } from \"unist-util-visit\";\nimport type { FontStyle } from \"shiki/textmate\";\n\nexport interface ShikiPluginOptions {\n /**\n * https://shiki.style/themes\n */\n theme: BundledTheme;\n}\n\n/**\n * A plugin to render \"code\" nodes, with syntax highlighting powered by shiki.\n */\nexport const shikiPlugin = ({\n theme,\n}: ShikiPluginOptions): RemarkDocxPlugin => {\n let highlighter: Awaited<ReturnType<typeof createHighlighter>> | undefined;\n const langs = new Set<string>();\n\n return async ({ root }) => {\n const newLangs: string[] = [];\n\n visit(root, \"code\", ({ lang }) => {\n if (lang) {\n if (!langs.has(lang)) {\n langs.add(lang);\n newLangs.push(lang);\n }\n }\n });\n\n if (!highlighter) {\n highlighter = await createHighlighter({\n themes: [theme],\n langs: [...langs],\n });\n } else {\n await Promise.all(\n newLangs.map((l) => highlighter!.loadLanguage(l as BundledLanguage)),\n );\n }\n\n return {\n code: ({ value, lang }) => {\n if (!lang) {\n return null;\n }\n const res = highlighter!.codeToTokens(value, {\n lang: lang as BundledLanguage,\n theme,\n });\n\n return res.tokens.map((r) => {\n return new Paragraph({\n shading: {\n type: \"clear\",\n color: \"auto\",\n fill: res.bg,\n },\n children: r.map(({ content, bgColor, color, fontStyle }) => {\n return new TextRun({\n text: content,\n color: color ?? res.fg,\n shading: bgColor\n ? {\n type: \"clear\",\n color: \"auto\",\n fill: bgColor,\n }\n : undefined,\n bold: fontStyle === (2 satisfies FontStyle.Bold),\n italics: fontStyle === (1 satisfies FontStyle.Italic),\n underline:\n fontStyle === (4 satisfies FontStyle.Underline)\n ? { type: \"single\", color: res.fg }\n : undefined,\n strike: fontStyle === (8 satisfies FontStyle.Strikethrough),\n });\n }),\n });\n });\n },\n };\n };\n};\n"],"names":["visit","createHighlighter","Paragraph","TextRun"],"mappings":";;;;;;AAiBA;;AAEG;MACU,WAAW,GAAG,CAAC,EAC1B,KAAK,GACc,KAAsB;AACzC,IAAA,IAAI,WAAsE;AAC1E,IAAA,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU;AAE/B,IAAA,OAAO,OAAO,EAAE,IAAI,EAAE,KAAI;QACxB,MAAM,QAAQ,GAAa,EAAE;QAE7BA,oBAAK,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,KAAI;YAC/B,IAAI,IAAI,EAAE;gBACR,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AACpB,oBAAA,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACf,oBAAA,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;gBACrB;YACF;AACF,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,WAAW,EAAE;YAChB,WAAW,GAAG,MAAMC,uBAAiB,CAAC;gBACpC,MAAM,EAAE,CAAC,KAAK,CAAC;AACf,gBAAA,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC;AAClB,aAAA,CAAC;QACJ;aAAO;YACL,MAAM,OAAO,CAAC,GAAG,CACf,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,WAAY,CAAC,YAAY,CAAC,CAAoB,CAAC,CAAC,CACrE;QACH;QAEA,OAAO;YACL,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAI;gBACxB,IAAI,CAAC,IAAI,EAAE;AACT,oBAAA,OAAO,IAAI;gBACb;AACA,gBAAA,MAAM,GAAG,GAAG,WAAY,CAAC,YAAY,CAAC,KAAK,EAAE;AAC3C,oBAAA,IAAI,EAAE,IAAuB;oBAC7B,KAAK;AACN,iBAAA,CAAC;gBAEF,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;oBAC1B,OAAO,IAAIC,cAAS,CAAC;AACnB,wBAAA,OAAO,EAAE;AACP,4BAAA,IAAI,EAAE,OAAO;AACb,4BAAA,KAAK,EAAE,MAAM;4BACb,IAAI,EAAE,GAAG,CAAC,EAAE;AACb,yBAAA;AACD,wBAAA,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAI;4BACzD,OAAO,IAAIC,YAAO,CAAC;AACjB,gCAAA,IAAI,EAAE,OAAO;gCACb,KAAK,EAAE,KAAK,KAAA,IAAA,IAAL,KAAK,cAAL,KAAK,GAAI,GAAG,CAAC,EAAE;AACtB,gCAAA,OAAO,EAAE;AACP,sCAAE;AACE,wCAAA,IAAI,EAAE,OAAO;AACb,wCAAA,KAAK,EAAE,MAAM;AACb,wCAAA,IAAI,EAAE,OAAO;AACd;AACH,sCAAE,SAAS;gCACb,IAAI,EAAE,SAAS,KAAM,CAA2B;gCAChD,OAAO,EAAE,SAAS,KAAM,CAA6B;gCACrD,SAAS,EACP,SAAS,KAAM;sCACX,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE;AACjC,sCAAE,SAAS;gCACf,MAAM,EAAE,SAAS,KAAM,CAAoC;AAC5D,6BAAA,CAAC;AACJ,wBAAA,CAAC,CAAC;AACH,qBAAA,CAAC;AACJ,gBAAA,CAAC,CAAC;YACJ,CAAC;SACF;AACH,IAAA,CAAC;AACH;;;;"}
@@ -0,0 +1,12 @@
1
+ import type { RemarkDocxPlugin } from "../../types";
2
+ import { type BundledTheme } from "shiki";
3
+ export interface ShikiPluginOptions {
4
+ /**
5
+ * https://shiki.style/themes
6
+ */
7
+ theme: BundledTheme;
8
+ }
9
+ /**
10
+ * A plugin to render "code" nodes, with syntax highlighting powered by shiki.
11
+ */
12
+ export declare const shikiPlugin: ({ theme, }: ShikiPluginOptions) => RemarkDocxPlugin;
@@ -0,0 +1,73 @@
1
+ import { Paragraph, TextRun } from 'docx';
2
+ import { createHighlighter } from 'shiki';
3
+ import { visit } from 'unist-util-visit';
4
+
5
+ /**
6
+ * A plugin to render "code" nodes, with syntax highlighting powered by shiki.
7
+ */
8
+ const shikiPlugin = ({ theme, }) => {
9
+ let highlighter;
10
+ const langs = new Set();
11
+ return async ({ root }) => {
12
+ const newLangs = [];
13
+ visit(root, "code", ({ lang }) => {
14
+ if (lang) {
15
+ if (!langs.has(lang)) {
16
+ langs.add(lang);
17
+ newLangs.push(lang);
18
+ }
19
+ }
20
+ });
21
+ if (!highlighter) {
22
+ highlighter = await createHighlighter({
23
+ themes: [theme],
24
+ langs: [...langs],
25
+ });
26
+ }
27
+ else {
28
+ await Promise.all(newLangs.map((l) => highlighter.loadLanguage(l)));
29
+ }
30
+ return {
31
+ code: ({ value, lang }) => {
32
+ if (!lang) {
33
+ return null;
34
+ }
35
+ const res = highlighter.codeToTokens(value, {
36
+ lang: lang,
37
+ theme,
38
+ });
39
+ return res.tokens.map((r) => {
40
+ return new Paragraph({
41
+ shading: {
42
+ type: "clear",
43
+ color: "auto",
44
+ fill: res.bg,
45
+ },
46
+ children: r.map(({ content, bgColor, color, fontStyle }) => {
47
+ return new TextRun({
48
+ text: content,
49
+ color: color !== null && color !== void 0 ? color : res.fg,
50
+ shading: bgColor
51
+ ? {
52
+ type: "clear",
53
+ color: "auto",
54
+ fill: bgColor,
55
+ }
56
+ : undefined,
57
+ bold: fontStyle === 2,
58
+ italics: fontStyle === 1,
59
+ underline: fontStyle === 4
60
+ ? { type: "single", color: res.fg }
61
+ : undefined,
62
+ strike: fontStyle === 8,
63
+ });
64
+ }),
65
+ });
66
+ });
67
+ },
68
+ };
69
+ };
70
+ };
71
+
72
+ export { shikiPlugin };
73
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../src/plugins/code/index.ts"],"sourcesContent":["import { Paragraph, TextRun } from \"docx\";\nimport type { RemarkDocxPlugin } from \"../../types\";\nimport {\n createHighlighter,\n type BundledLanguage,\n type BundledTheme,\n} from \"shiki\";\nimport { visit } from \"unist-util-visit\";\nimport type { FontStyle } from \"shiki/textmate\";\n\nexport interface ShikiPluginOptions {\n /**\n * https://shiki.style/themes\n */\n theme: BundledTheme;\n}\n\n/**\n * A plugin to render \"code\" nodes, with syntax highlighting powered by shiki.\n */\nexport const shikiPlugin = ({\n theme,\n}: ShikiPluginOptions): RemarkDocxPlugin => {\n let highlighter: Awaited<ReturnType<typeof createHighlighter>> | undefined;\n const langs = new Set<string>();\n\n return async ({ root }) => {\n const newLangs: string[] = [];\n\n visit(root, \"code\", ({ lang }) => {\n if (lang) {\n if (!langs.has(lang)) {\n langs.add(lang);\n newLangs.push(lang);\n }\n }\n });\n\n if (!highlighter) {\n highlighter = await createHighlighter({\n themes: [theme],\n langs: [...langs],\n });\n } else {\n await Promise.all(\n newLangs.map((l) => highlighter!.loadLanguage(l as BundledLanguage)),\n );\n }\n\n return {\n code: ({ value, lang }) => {\n if (!lang) {\n return null;\n }\n const res = highlighter!.codeToTokens(value, {\n lang: lang as BundledLanguage,\n theme,\n });\n\n return res.tokens.map((r) => {\n return new Paragraph({\n shading: {\n type: \"clear\",\n color: \"auto\",\n fill: res.bg,\n },\n children: r.map(({ content, bgColor, color, fontStyle }) => {\n return new TextRun({\n text: content,\n color: color ?? res.fg,\n shading: bgColor\n ? {\n type: \"clear\",\n color: \"auto\",\n fill: bgColor,\n }\n : undefined,\n bold: fontStyle === (2 satisfies FontStyle.Bold),\n italics: fontStyle === (1 satisfies FontStyle.Italic),\n underline:\n fontStyle === (4 satisfies FontStyle.Underline)\n ? { type: \"single\", color: res.fg }\n : undefined,\n strike: fontStyle === (8 satisfies FontStyle.Strikethrough),\n });\n }),\n });\n });\n },\n };\n };\n};\n"],"names":[],"mappings":";;;;AAiBA;;AAEG;MACU,WAAW,GAAG,CAAC,EAC1B,KAAK,GACc,KAAsB;AACzC,IAAA,IAAI,WAAsE;AAC1E,IAAA,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU;AAE/B,IAAA,OAAO,OAAO,EAAE,IAAI,EAAE,KAAI;QACxB,MAAM,QAAQ,GAAa,EAAE;QAE7B,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,KAAI;YAC/B,IAAI,IAAI,EAAE;gBACR,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AACpB,oBAAA,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACf,oBAAA,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;gBACrB;YACF;AACF,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,WAAW,EAAE;YAChB,WAAW,GAAG,MAAM,iBAAiB,CAAC;gBACpC,MAAM,EAAE,CAAC,KAAK,CAAC;AACf,gBAAA,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC;AAClB,aAAA,CAAC;QACJ;aAAO;YACL,MAAM,OAAO,CAAC,GAAG,CACf,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,WAAY,CAAC,YAAY,CAAC,CAAoB,CAAC,CAAC,CACrE;QACH;QAEA,OAAO;YACL,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAI;gBACxB,IAAI,CAAC,IAAI,EAAE;AACT,oBAAA,OAAO,IAAI;gBACb;AACA,gBAAA,MAAM,GAAG,GAAG,WAAY,CAAC,YAAY,CAAC,KAAK,EAAE;AAC3C,oBAAA,IAAI,EAAE,IAAuB;oBAC7B,KAAK;AACN,iBAAA,CAAC;gBAEF,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;oBAC1B,OAAO,IAAI,SAAS,CAAC;AACnB,wBAAA,OAAO,EAAE;AACP,4BAAA,IAAI,EAAE,OAAO;AACb,4BAAA,KAAK,EAAE,MAAM;4BACb,IAAI,EAAE,GAAG,CAAC,EAAE;AACb,yBAAA;AACD,wBAAA,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAI;4BACzD,OAAO,IAAI,OAAO,CAAC;AACjB,gCAAA,IAAI,EAAE,OAAO;gCACb,KAAK,EAAE,KAAK,KAAA,IAAA,IAAL,KAAK,cAAL,KAAK,GAAI,GAAG,CAAC,EAAE;AACtB,gCAAA,OAAO,EAAE;AACP,sCAAE;AACE,wCAAA,IAAI,EAAE,OAAO;AACb,wCAAA,KAAK,EAAE,MAAM;AACb,wCAAA,IAAI,EAAE,OAAO;AACd;AACH,sCAAE,SAAS;gCACb,IAAI,EAAE,SAAS,KAAM,CAA2B;gCAChD,OAAO,EAAE,SAAS,KAAM,CAA6B;gCACrD,SAAS,EACP,SAAS,KAAM;sCACX,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE;AACjC,sCAAE,SAAS;gCACf,MAAM,EAAE,SAAS,KAAM,CAAoC;AAC5D,6BAAA,CAAC;AACJ,wBAAA,CAAC,CAAC;AACH,qBAAA,CAAC;AACJ,gBAAA,CAAC,CAAC;YACJ,CAAC;SACF;AACH,IAAA,CAAC;AACH;;;;"}
@@ -5,7 +5,24 @@ var docx = require('docx');
5
5
  var unistUtilVisit = require('unist-util-visit');
6
6
  var imageSize = require('image-size');
7
7
 
8
- const buildImage = ({ data, width, height, type }) => {
8
+ const supportedTypes = ["png", "jpg", "gif", "bmp", "svg"];
9
+ const buildImage = (image, node) => {
10
+ const altText = node.alt ? { name: node.alt } : undefined;
11
+ if (image.type === "svg") {
12
+ const { type, data, width, height, fallback } = image;
13
+ return new docx.ImageRun({
14
+ type: type,
15
+ data: data,
16
+ transformation: {
17
+ width,
18
+ height,
19
+ },
20
+ // https://github.com/dolanmiu/docx/issues/1162#issuecomment-3228368003
21
+ fallback: { type: "png", data: fallback },
22
+ altText,
23
+ });
24
+ }
25
+ const { type, data, width, height } = image;
9
26
  return new docx.ImageRun({
10
27
  type: type,
11
28
  data: data,
@@ -13,9 +30,9 @@ const buildImage = ({ data, width, height, type }) => {
13
30
  width,
14
31
  height,
15
32
  },
33
+ altText,
16
34
  });
17
35
  };
18
- const supportedTypes = ["png", "jpg", "gif", "bmp", "svg"];
19
36
  const isSupportedType = (type) => {
20
37
  if (!type)
21
38
  return false;
@@ -24,23 +41,36 @@ const isSupportedType = (type) => {
24
41
  }
25
42
  return false;
26
43
  };
44
+ const loadWithFetch = async (url) => {
45
+ const res = await fetch(url);
46
+ return res.arrayBuffer();
47
+ };
48
+ const browserSvgToPng = async ({ buffer, width, height }) => {
49
+ const svgBlob = new Blob([buffer], { type: "image/svg+xml" });
50
+ const url = URL.createObjectURL(svgBlob);
51
+ try {
52
+ const img = new Image();
53
+ img.src = url;
54
+ await img.decode();
55
+ const canvas = document.createElement("canvas");
56
+ canvas.width = width;
57
+ canvas.height = height;
58
+ const ctx = canvas.getContext("2d");
59
+ ctx.drawImage(img, 0, 0, width, height);
60
+ return new Promise((resolve) => {
61
+ canvas.toBlob((blob) => {
62
+ blob.arrayBuffer().then(resolve);
63
+ }, "image/png");
64
+ });
65
+ }
66
+ finally {
67
+ URL.revokeObjectURL(url);
68
+ }
69
+ };
27
70
  /**
28
71
  * A plugin to render "image" nodes
29
72
  */
30
- const imagePlugin = ({ load = async (url) => {
31
- const res = await fetch(url);
32
- return res.arrayBuffer();
33
- }, } = {}) => {
34
- const resolver = async (url) => {
35
- const buf = await load(url);
36
- const { width, height, type } = imageSize.imageSize(new Uint8Array(buf));
37
- if (!isSupportedType(type)) {
38
- const err = `Not supported image type: ${type}`;
39
- utils.warnOnce(err);
40
- throw new Error(err);
41
- }
42
- return { data: buf, width, height, type };
43
- };
73
+ const imagePlugin = ({ load = loadWithFetch, fallbackSvg = browserSvgToPng, } = {}) => {
44
74
  const images = new Map();
45
75
  return async ({ root, definition }) => {
46
76
  const imageList = [];
@@ -58,12 +88,41 @@ const imagePlugin = ({ load = async (url) => {
58
88
  imageList.forEach(({ url }) => {
59
89
  if (!images.has(url) && !promises.has(url)) {
60
90
  promises.set(url, (async () => {
91
+ let data;
61
92
  try {
62
- const img = await resolver(url);
63
- images.set(url, img);
93
+ data = await load(url);
64
94
  }
65
95
  catch (e) {
66
- utils.warnOnce(`Failed to fetch image: ${url}`);
96
+ utils.warnOnce(`Failed to load image: ${url} ${e}`);
97
+ return;
98
+ }
99
+ const { width, height, type } = imageSize.imageSize(new Uint8Array(data));
100
+ if (!isSupportedType(type)) {
101
+ utils.warnOnce(`Not supported image type: ${type}`);
102
+ return;
103
+ }
104
+ if (type === "svg") {
105
+ try {
106
+ const fallback = await fallbackSvg({
107
+ buffer: data,
108
+ width,
109
+ height,
110
+ });
111
+ images.set(url, {
112
+ type,
113
+ width,
114
+ height,
115
+ data,
116
+ fallback: fallback,
117
+ });
118
+ }
119
+ catch (e) {
120
+ utils.warnOnce(`Failed to create fallback image: ${url} ${e}`);
121
+ return;
122
+ }
123
+ }
124
+ else {
125
+ images.set(url, { type, width, height, data });
67
126
  }
68
127
  })());
69
128
  }
@@ -76,10 +135,10 @@ const imagePlugin = ({ load = async (url) => {
76
135
  if (!data) {
77
136
  return [];
78
137
  }
79
- return buildImage(data);
138
+ return buildImage(data, node);
80
139
  },
81
- imageReference: ({ identifier }) => {
82
- const def = definition(identifier);
140
+ imageReference: (node) => {
141
+ const def = definition(node.identifier);
83
142
  if (def == null) {
84
143
  return [];
85
144
  }
@@ -87,7 +146,7 @@ const imagePlugin = ({ load = async (url) => {
87
146
  if (!data) {
88
147
  return [];
89
148
  }
90
- return buildImage(data);
149
+ return buildImage(data, node);
91
150
  },
92
151
  };
93
152
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../src/plugins/image/index.ts"],"sourcesContent":["import { warnOnce } from \"../../utils\";\nimport type { RemarkDocxPlugin } from \"../../types\";\nimport type * as mdast from \"../../mdast\";\nimport { ImageRun, type IImageOptions } from \"docx\";\nimport { visit } from \"unist-util-visit\";\nimport { imageSize } from \"image-size\";\n\ntype ImageData = Readonly<{\n data: IImageOptions[\"data\"];\n width: number;\n height: number;\n type: IImageOptions[\"type\"];\n}>;\n\nconst buildImage = ({ data, width, height, type }: ImageData) => {\n return new ImageRun({\n type: type,\n data: data,\n transformation: {\n width,\n height,\n },\n } as IImageOptions);\n};\n\nconst supportedTypes = [\"png\", \"jpg\", \"gif\", \"bmp\", \"svg\"] as const;\n\nconst isSupportedType = (\n type: string | undefined,\n): type is (typeof supportedTypes)[number] => {\n if (!type) return false;\n if ((supportedTypes as readonly string[]).includes(type)) {\n return true;\n }\n return false;\n};\n\ninterface ImagePluginOptions {\n /**\n * A function to resolve image data from url.\n * @default fetch\n */\n load?: (url: string) => Promise<ArrayBuffer>;\n}\n\n/**\n * A plugin to render \"image\" nodes\n */\nexport const imagePlugin = ({\n load = async (url) => {\n const res = await fetch(url);\n return res.arrayBuffer();\n },\n}: ImagePluginOptions = {}): RemarkDocxPlugin => {\n const resolver = async (url: string): Promise<ImageData> => {\n const buf = await load(url);\n\n const { width, height, type } = imageSize(new Uint8Array(buf));\n if (!isSupportedType(type)) {\n const err = `Not supported image type: ${type}`;\n warnOnce(err);\n throw new Error(err);\n }\n return { data: buf, width, height, type };\n };\n\n const images = new Map<string, ImageData>();\n\n return async ({ root, definition }) => {\n const imageList: (mdast.Image | mdast.Definition)[] = [];\n visit(root, \"image\", (node) => {\n imageList.push(node);\n });\n visit(root, \"imageReference\", (node) => {\n const maybeImage = definition(node.identifier)!;\n if (maybeImage) {\n imageList.push(maybeImage);\n }\n });\n\n if (imageList.length !== 0) {\n const promises = new Map<string, Promise<void>>();\n imageList.forEach(({ url }) => {\n if (!images.has(url) && !promises.has(url)) {\n promises.set(\n url,\n (async () => {\n try {\n const img = await resolver(url);\n images.set(url, img);\n } catch (e) {\n warnOnce(`Failed to fetch image: ${url}`);\n }\n })(),\n );\n }\n });\n\n await Promise.all(promises.values());\n }\n\n return {\n image: (node) => {\n const data = images.get(node.url);\n if (!data) {\n return [];\n }\n return buildImage(data);\n },\n imageReference: ({ identifier }) => {\n const def = definition(identifier);\n if (def == null) {\n return [];\n }\n const data = images.get(def.url);\n if (!data) {\n return [];\n }\n return buildImage(data);\n },\n };\n };\n};\n"],"names":["ImageRun","imageSize","warnOnce","visit"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../src/plugins/image/index.ts"],"sourcesContent":["import { warnOnce } from \"../../utils\";\nimport type { RemarkDocxPlugin } from \"../../types\";\nimport type * as mdast from \"../../mdast\";\nimport { ImageRun } from \"docx\";\nimport { visit } from \"unist-util-visit\";\nimport { imageSize } from \"image-size\";\n\nconst supportedTypes = [\"png\", \"jpg\", \"gif\", \"bmp\", \"svg\"] as const;\n\ntype SupportedImageType = (typeof supportedTypes)[number];\n\ntype ImageData = Readonly<\n {\n data: ArrayBuffer;\n width: number;\n height: number;\n } & (\n | { type: Exclude<SupportedImageType, \"svg\"> }\n | {\n type: Extract<SupportedImageType, \"svg\">;\n fallback: ArrayBuffer;\n }\n )\n>;\n\nconst buildImage = (image: ImageData, node: { alt?: string | null }) => {\n const altText = node.alt ? { name: node.alt } : undefined;\n\n if (image.type === \"svg\") {\n const { type, data, width, height, fallback } = image;\n return new ImageRun({\n type: type,\n data: data,\n transformation: {\n width,\n height,\n },\n // https://github.com/dolanmiu/docx/issues/1162#issuecomment-3228368003\n fallback: { type: \"png\", data: fallback },\n altText,\n });\n }\n\n const { type, data, width, height } = image;\n return new ImageRun({\n type: type,\n data: data,\n transformation: {\n width,\n height,\n },\n altText,\n });\n};\n\nconst isSupportedType = (\n type: string | undefined,\n): type is SupportedImageType => {\n if (!type) return false;\n if ((supportedTypes as readonly string[]).includes(type)) {\n return true;\n }\n return false;\n};\n\ntype LoadFn = (url: string) => Promise<ArrayBuffer>;\n\ntype SvgToPngFn = (options: {\n buffer: ArrayBuffer;\n width: number;\n height: number;\n}) => Promise<ArrayBuffer>;\n\nconst loadWithFetch: LoadFn = async (url) => {\n const res = await fetch(url);\n return res.arrayBuffer();\n};\n\nconst browserSvgToPng: SvgToPngFn = async ({ buffer, width, height }) => {\n const svgBlob = new Blob([buffer], { type: \"image/svg+xml\" });\n const url = URL.createObjectURL(svgBlob);\n\n try {\n const img = new Image();\n img.src = url;\n await img.decode();\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext(\"2d\")!;\n ctx.drawImage(img, 0, 0, width, height);\n\n return new Promise<ArrayBuffer>((resolve) => {\n canvas.toBlob((blob) => {\n blob!.arrayBuffer().then(resolve);\n }, \"image/png\");\n });\n } finally {\n URL.revokeObjectURL(url);\n }\n};\n\nexport interface ImagePluginOptions {\n /**\n * A function to resolve image data from url.\n * @default {@link loadWithFetch}\n */\n load?: LoadFn;\n /**\n * A function to convert SVG to PNG. According to the docx specifications, embedding SVG images also requires including PNG.\n * @default {@link browserSvgToPng}, which handles conversion only on browser\n */\n fallbackSvg?: SvgToPngFn;\n}\n\n/**\n * A plugin to render \"image\" nodes\n */\nexport const imagePlugin = ({\n load = loadWithFetch,\n fallbackSvg = browserSvgToPng,\n}: ImagePluginOptions = {}): RemarkDocxPlugin => {\n const images = new Map<string, ImageData>();\n\n return async ({ root, definition }) => {\n const imageList: (mdast.Image | mdast.Definition)[] = [];\n visit(root, \"image\", (node) => {\n imageList.push(node);\n });\n visit(root, \"imageReference\", (node) => {\n const maybeImage = definition(node.identifier)!;\n if (maybeImage) {\n imageList.push(maybeImage);\n }\n });\n\n if (imageList.length !== 0) {\n const promises = new Map<string, Promise<void>>();\n imageList.forEach(({ url }) => {\n if (!images.has(url) && !promises.has(url)) {\n promises.set(\n url,\n (async () => {\n let data: ArrayBuffer;\n try {\n data = await load(url);\n } catch (e) {\n warnOnce(`Failed to load image: ${url} ${e}`);\n return;\n }\n\n const { width, height, type } = imageSize(new Uint8Array(data));\n if (!isSupportedType(type)) {\n warnOnce(`Not supported image type: ${type}`);\n return;\n }\n\n if (type === \"svg\") {\n try {\n const fallback = await fallbackSvg({\n buffer: data,\n width,\n height,\n });\n images.set(url, {\n type,\n width,\n height,\n data,\n fallback: fallback,\n });\n } catch (e) {\n warnOnce(`Failed to create fallback image: ${url} ${e}`);\n return;\n }\n } else {\n images.set(url, { type, width, height, data });\n }\n })(),\n );\n }\n });\n\n await Promise.all(promises.values());\n }\n\n return {\n image: (node) => {\n const data = images.get(node.url);\n if (!data) {\n return [];\n }\n return buildImage(data, node);\n },\n imageReference: (node) => {\n const def = definition(node.identifier);\n if (def == null) {\n return [];\n }\n const data = images.get(def.url);\n if (!data) {\n return [];\n }\n return buildImage(data, node);\n },\n };\n };\n};\n"],"names":["ImageRun","visit","warnOnce","imageSize"],"mappings":"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"}
@@ -1,13 +1,24 @@
1
1
  import type { RemarkDocxPlugin } from "../../types";
2
- interface ImagePluginOptions {
2
+ type LoadFn = (url: string) => Promise<ArrayBuffer>;
3
+ type SvgToPngFn = (options: {
4
+ buffer: ArrayBuffer;
5
+ width: number;
6
+ height: number;
7
+ }) => Promise<ArrayBuffer>;
8
+ export interface ImagePluginOptions {
3
9
  /**
4
10
  * A function to resolve image data from url.
5
- * @default fetch
11
+ * @default {@link loadWithFetch}
6
12
  */
7
- load?: (url: string) => Promise<ArrayBuffer>;
13
+ load?: LoadFn;
14
+ /**
15
+ * A function to convert SVG to PNG. According to the docx specifications, embedding SVG images also requires including PNG.
16
+ * @default {@link browserSvgToPng}, which handles conversion only on browser
17
+ */
18
+ fallbackSvg?: SvgToPngFn;
8
19
  }
9
20
  /**
10
21
  * A plugin to render "image" nodes
11
22
  */
12
- export declare const imagePlugin: ({ load, }?: ImagePluginOptions) => RemarkDocxPlugin;
23
+ export declare const imagePlugin: ({ load, fallbackSvg, }?: ImagePluginOptions) => RemarkDocxPlugin;
13
24
  export {};
@@ -3,7 +3,24 @@ import { ImageRun } from 'docx';
3
3
  import { visit } from 'unist-util-visit';
4
4
  import { imageSize } from 'image-size';
5
5
 
6
- const buildImage = ({ data, width, height, type }) => {
6
+ const supportedTypes = ["png", "jpg", "gif", "bmp", "svg"];
7
+ const buildImage = (image, node) => {
8
+ const altText = node.alt ? { name: node.alt } : undefined;
9
+ if (image.type === "svg") {
10
+ const { type, data, width, height, fallback } = image;
11
+ return new ImageRun({
12
+ type: type,
13
+ data: data,
14
+ transformation: {
15
+ width,
16
+ height,
17
+ },
18
+ // https://github.com/dolanmiu/docx/issues/1162#issuecomment-3228368003
19
+ fallback: { type: "png", data: fallback },
20
+ altText,
21
+ });
22
+ }
23
+ const { type, data, width, height } = image;
7
24
  return new ImageRun({
8
25
  type: type,
9
26
  data: data,
@@ -11,9 +28,9 @@ const buildImage = ({ data, width, height, type }) => {
11
28
  width,
12
29
  height,
13
30
  },
31
+ altText,
14
32
  });
15
33
  };
16
- const supportedTypes = ["png", "jpg", "gif", "bmp", "svg"];
17
34
  const isSupportedType = (type) => {
18
35
  if (!type)
19
36
  return false;
@@ -22,23 +39,36 @@ const isSupportedType = (type) => {
22
39
  }
23
40
  return false;
24
41
  };
42
+ const loadWithFetch = async (url) => {
43
+ const res = await fetch(url);
44
+ return res.arrayBuffer();
45
+ };
46
+ const browserSvgToPng = async ({ buffer, width, height }) => {
47
+ const svgBlob = new Blob([buffer], { type: "image/svg+xml" });
48
+ const url = URL.createObjectURL(svgBlob);
49
+ try {
50
+ const img = new Image();
51
+ img.src = url;
52
+ await img.decode();
53
+ const canvas = document.createElement("canvas");
54
+ canvas.width = width;
55
+ canvas.height = height;
56
+ const ctx = canvas.getContext("2d");
57
+ ctx.drawImage(img, 0, 0, width, height);
58
+ return new Promise((resolve) => {
59
+ canvas.toBlob((blob) => {
60
+ blob.arrayBuffer().then(resolve);
61
+ }, "image/png");
62
+ });
63
+ }
64
+ finally {
65
+ URL.revokeObjectURL(url);
66
+ }
67
+ };
25
68
  /**
26
69
  * A plugin to render "image" nodes
27
70
  */
28
- const imagePlugin = ({ load = async (url) => {
29
- const res = await fetch(url);
30
- return res.arrayBuffer();
31
- }, } = {}) => {
32
- const resolver = async (url) => {
33
- const buf = await load(url);
34
- const { width, height, type } = imageSize(new Uint8Array(buf));
35
- if (!isSupportedType(type)) {
36
- const err = `Not supported image type: ${type}`;
37
- warnOnce(err);
38
- throw new Error(err);
39
- }
40
- return { data: buf, width, height, type };
41
- };
71
+ const imagePlugin = ({ load = loadWithFetch, fallbackSvg = browserSvgToPng, } = {}) => {
42
72
  const images = new Map();
43
73
  return async ({ root, definition }) => {
44
74
  const imageList = [];
@@ -56,12 +86,41 @@ const imagePlugin = ({ load = async (url) => {
56
86
  imageList.forEach(({ url }) => {
57
87
  if (!images.has(url) && !promises.has(url)) {
58
88
  promises.set(url, (async () => {
89
+ let data;
59
90
  try {
60
- const img = await resolver(url);
61
- images.set(url, img);
91
+ data = await load(url);
62
92
  }
63
93
  catch (e) {
64
- warnOnce(`Failed to fetch image: ${url}`);
94
+ warnOnce(`Failed to load image: ${url} ${e}`);
95
+ return;
96
+ }
97
+ const { width, height, type } = imageSize(new Uint8Array(data));
98
+ if (!isSupportedType(type)) {
99
+ warnOnce(`Not supported image type: ${type}`);
100
+ return;
101
+ }
102
+ if (type === "svg") {
103
+ try {
104
+ const fallback = await fallbackSvg({
105
+ buffer: data,
106
+ width,
107
+ height,
108
+ });
109
+ images.set(url, {
110
+ type,
111
+ width,
112
+ height,
113
+ data,
114
+ fallback: fallback,
115
+ });
116
+ }
117
+ catch (e) {
118
+ warnOnce(`Failed to create fallback image: ${url} ${e}`);
119
+ return;
120
+ }
121
+ }
122
+ else {
123
+ images.set(url, { type, width, height, data });
65
124
  }
66
125
  })());
67
126
  }
@@ -74,10 +133,10 @@ const imagePlugin = ({ load = async (url) => {
74
133
  if (!data) {
75
134
  return [];
76
135
  }
77
- return buildImage(data);
136
+ return buildImage(data, node);
78
137
  },
79
- imageReference: ({ identifier }) => {
80
- const def = definition(identifier);
138
+ imageReference: (node) => {
139
+ const def = definition(node.identifier);
81
140
  if (def == null) {
82
141
  return [];
83
142
  }
@@ -85,7 +144,7 @@ const imagePlugin = ({ load = async (url) => {
85
144
  if (!data) {
86
145
  return [];
87
146
  }
88
- return buildImage(data);
147
+ return buildImage(data, node);
89
148
  },
90
149
  };
91
150
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/plugins/image/index.ts"],"sourcesContent":["import { warnOnce } from \"../../utils\";\nimport type { RemarkDocxPlugin } from \"../../types\";\nimport type * as mdast from \"../../mdast\";\nimport { ImageRun, type IImageOptions } from \"docx\";\nimport { visit } from \"unist-util-visit\";\nimport { imageSize } from \"image-size\";\n\ntype ImageData = Readonly<{\n data: IImageOptions[\"data\"];\n width: number;\n height: number;\n type: IImageOptions[\"type\"];\n}>;\n\nconst buildImage = ({ data, width, height, type }: ImageData) => {\n return new ImageRun({\n type: type,\n data: data,\n transformation: {\n width,\n height,\n },\n } as IImageOptions);\n};\n\nconst supportedTypes = [\"png\", \"jpg\", \"gif\", \"bmp\", \"svg\"] as const;\n\nconst isSupportedType = (\n type: string | undefined,\n): type is (typeof supportedTypes)[number] => {\n if (!type) return false;\n if ((supportedTypes as readonly string[]).includes(type)) {\n return true;\n }\n return false;\n};\n\ninterface ImagePluginOptions {\n /**\n * A function to resolve image data from url.\n * @default fetch\n */\n load?: (url: string) => Promise<ArrayBuffer>;\n}\n\n/**\n * A plugin to render \"image\" nodes\n */\nexport const imagePlugin = ({\n load = async (url) => {\n const res = await fetch(url);\n return res.arrayBuffer();\n },\n}: ImagePluginOptions = {}): RemarkDocxPlugin => {\n const resolver = async (url: string): Promise<ImageData> => {\n const buf = await load(url);\n\n const { width, height, type } = imageSize(new Uint8Array(buf));\n if (!isSupportedType(type)) {\n const err = `Not supported image type: ${type}`;\n warnOnce(err);\n throw new Error(err);\n }\n return { data: buf, width, height, type };\n };\n\n const images = new Map<string, ImageData>();\n\n return async ({ root, definition }) => {\n const imageList: (mdast.Image | mdast.Definition)[] = [];\n visit(root, \"image\", (node) => {\n imageList.push(node);\n });\n visit(root, \"imageReference\", (node) => {\n const maybeImage = definition(node.identifier)!;\n if (maybeImage) {\n imageList.push(maybeImage);\n }\n });\n\n if (imageList.length !== 0) {\n const promises = new Map<string, Promise<void>>();\n imageList.forEach(({ url }) => {\n if (!images.has(url) && !promises.has(url)) {\n promises.set(\n url,\n (async () => {\n try {\n const img = await resolver(url);\n images.set(url, img);\n } catch (e) {\n warnOnce(`Failed to fetch image: ${url}`);\n }\n })(),\n );\n }\n });\n\n await Promise.all(promises.values());\n }\n\n return {\n image: (node) => {\n const data = images.get(node.url);\n if (!data) {\n return [];\n }\n return buildImage(data);\n },\n imageReference: ({ identifier }) => {\n const def = definition(identifier);\n if (def == null) {\n return [];\n }\n const data = images.get(def.url);\n if (!data) {\n return [];\n }\n return buildImage(data);\n },\n };\n };\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/plugins/image/index.ts"],"sourcesContent":["import { warnOnce } from \"../../utils\";\nimport type { RemarkDocxPlugin } from \"../../types\";\nimport type * as mdast from \"../../mdast\";\nimport { ImageRun } from \"docx\";\nimport { visit } from \"unist-util-visit\";\nimport { imageSize } from \"image-size\";\n\nconst supportedTypes = [\"png\", \"jpg\", \"gif\", \"bmp\", \"svg\"] as const;\n\ntype SupportedImageType = (typeof supportedTypes)[number];\n\ntype ImageData = Readonly<\n {\n data: ArrayBuffer;\n width: number;\n height: number;\n } & (\n | { type: Exclude<SupportedImageType, \"svg\"> }\n | {\n type: Extract<SupportedImageType, \"svg\">;\n fallback: ArrayBuffer;\n }\n )\n>;\n\nconst buildImage = (image: ImageData, node: { alt?: string | null }) => {\n const altText = node.alt ? { name: node.alt } : undefined;\n\n if (image.type === \"svg\") {\n const { type, data, width, height, fallback } = image;\n return new ImageRun({\n type: type,\n data: data,\n transformation: {\n width,\n height,\n },\n // https://github.com/dolanmiu/docx/issues/1162#issuecomment-3228368003\n fallback: { type: \"png\", data: fallback },\n altText,\n });\n }\n\n const { type, data, width, height } = image;\n return new ImageRun({\n type: type,\n data: data,\n transformation: {\n width,\n height,\n },\n altText,\n });\n};\n\nconst isSupportedType = (\n type: string | undefined,\n): type is SupportedImageType => {\n if (!type) return false;\n if ((supportedTypes as readonly string[]).includes(type)) {\n return true;\n }\n return false;\n};\n\ntype LoadFn = (url: string) => Promise<ArrayBuffer>;\n\ntype SvgToPngFn = (options: {\n buffer: ArrayBuffer;\n width: number;\n height: number;\n}) => Promise<ArrayBuffer>;\n\nconst loadWithFetch: LoadFn = async (url) => {\n const res = await fetch(url);\n return res.arrayBuffer();\n};\n\nconst browserSvgToPng: SvgToPngFn = async ({ buffer, width, height }) => {\n const svgBlob = new Blob([buffer], { type: \"image/svg+xml\" });\n const url = URL.createObjectURL(svgBlob);\n\n try {\n const img = new Image();\n img.src = url;\n await img.decode();\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext(\"2d\")!;\n ctx.drawImage(img, 0, 0, width, height);\n\n return new Promise<ArrayBuffer>((resolve) => {\n canvas.toBlob((blob) => {\n blob!.arrayBuffer().then(resolve);\n }, \"image/png\");\n });\n } finally {\n URL.revokeObjectURL(url);\n }\n};\n\nexport interface ImagePluginOptions {\n /**\n * A function to resolve image data from url.\n * @default {@link loadWithFetch}\n */\n load?: LoadFn;\n /**\n * A function to convert SVG to PNG. According to the docx specifications, embedding SVG images also requires including PNG.\n * @default {@link browserSvgToPng}, which handles conversion only on browser\n */\n fallbackSvg?: SvgToPngFn;\n}\n\n/**\n * A plugin to render \"image\" nodes\n */\nexport const imagePlugin = ({\n load = loadWithFetch,\n fallbackSvg = browserSvgToPng,\n}: ImagePluginOptions = {}): RemarkDocxPlugin => {\n const images = new Map<string, ImageData>();\n\n return async ({ root, definition }) => {\n const imageList: (mdast.Image | mdast.Definition)[] = [];\n visit(root, \"image\", (node) => {\n imageList.push(node);\n });\n visit(root, \"imageReference\", (node) => {\n const maybeImage = definition(node.identifier)!;\n if (maybeImage) {\n imageList.push(maybeImage);\n }\n });\n\n if (imageList.length !== 0) {\n const promises = new Map<string, Promise<void>>();\n imageList.forEach(({ url }) => {\n if (!images.has(url) && !promises.has(url)) {\n promises.set(\n url,\n (async () => {\n let data: ArrayBuffer;\n try {\n data = await load(url);\n } catch (e) {\n warnOnce(`Failed to load image: ${url} ${e}`);\n return;\n }\n\n const { width, height, type } = imageSize(new Uint8Array(data));\n if (!isSupportedType(type)) {\n warnOnce(`Not supported image type: ${type}`);\n return;\n }\n\n if (type === \"svg\") {\n try {\n const fallback = await fallbackSvg({\n buffer: data,\n width,\n height,\n });\n images.set(url, {\n type,\n width,\n height,\n data,\n fallback: fallback,\n });\n } catch (e) {\n warnOnce(`Failed to create fallback image: ${url} ${e}`);\n return;\n }\n } else {\n images.set(url, { type, width, height, data });\n }\n })(),\n );\n }\n });\n\n await Promise.all(promises.values());\n }\n\n return {\n image: (node) => {\n const data = images.get(node.url);\n if (!data) {\n return [];\n }\n return buildImage(data, node);\n },\n imageReference: (node) => {\n const def = definition(node.identifier);\n if (def == null) {\n return [];\n }\n const data = images.get(def.url);\n if (!data) {\n return [];\n }\n return buildImage(data, node);\n },\n };\n };\n};\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "remark-docx",
3
- "version": "0.3.5",
3
+ "version": "0.3.7",
4
4
  "description": "remark plugin to compile markdown to docx (Microsoft Word, Office Open XML).",
5
5
  "main": "lib/index.cjs",
6
6
  "module": "lib/index.js",
@@ -39,6 +39,7 @@
39
39
  "hast-util-to-mdast": "^10.1.2",
40
40
  "image-size": "^2.0.2",
41
41
  "mdast-util-definitions": "^6.0.0",
42
+ "shiki": "^3.19.0",
42
43
  "unist-util-visit": "^5.0.0"
43
44
  },
44
45
  "devDependencies": {
@@ -91,6 +92,7 @@
91
92
  "word",
92
93
  "office",
93
94
  "openxml",
95
+ "highlight",
94
96
  "latex",
95
97
  "math"
96
98
  ],