word-to-markdown 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,11 @@
1
1
  # Word to Markdown
2
2
 
3
- Convert Word documents to beautiful Markdown. Via command line or in your browser. An even better version of the original [`word-to-markdown`](https://github.com/benbalter/word-to-markdown).
3
+ [![npm version](https://img.shields.io/npm/v/word-to-markdown.svg)](https://www.npmjs.com/package/word-to-markdown)
4
+ [![npm downloads](https://img.shields.io/npm/dm/word-to-markdown.svg)](https://www.npmjs.com/package/word-to-markdown)
5
+ [![CI](https://github.com/benbalter/word-to-markdown-js/actions/workflows/ci.yml/badge.svg)](https://github.com/benbalter/word-to-markdown-js/actions/workflows/ci.yml)
6
+ [![License: ISC](https://img.shields.io/npm/l/word-to-markdown.svg)](https://github.com/benbalter/word-to-markdown-js/blob/main/LICENSE)
7
+
8
+ Convert Word documents to beautiful Markdown. Via command line, as a Node library, or in your browser. An even better version of the original [`word-to-markdown`](https://github.com/benbalter/word-to-markdown).
4
9
 
5
10
  Try it in your browser at [word2md.com](https://word2md.com), or use it from the command line — no clone required:
6
11
 
@@ -8,22 +13,38 @@ Try it in your browser at [word2md.com](https://word2md.com), or use it from the
8
13
  npx word-to-markdown input.docx > output.md
9
14
  ```
10
15
 
11
- ## Supports
16
+ ## What it converts
12
17
 
13
- - Paragraphs
14
- - Numbered lists
15
- - Bullet lists
16
- - Nested Lists
18
+ - Paragraphs and line breaks
17
19
  - Headings
18
- - Lists
20
+ - Bold, italic, and strikethrough
21
+ - Superscript and subscript — preserved as inline `<sup>`/`<sub>` tags
22
+ - Bullet lists, and numbered lists (kept as `1./2./3.` by default)
23
+ - Nested lists
19
24
  - Tables
20
- - Footnotes and endnotes
21
- - Images
22
- - Bold, italics, underlines, strikethrough, superscript and subscript.
23
25
  - Links
24
- - Line breaks
25
- - Text boxes
26
- - Comments
26
+ - Footnotes and endnotes
27
+ - Images — embedded inline as base64 data URIs, or extracted to files
28
+
29
+ ### Notes and limitations
30
+
31
+ - **Numbered lists** are kept as `1./2./3.` ordered lists. Pass
32
+ `{ numberedLists: 'bullets' }` (library) or `--bullet-lists` (CLI) to convert
33
+ them to bullet lists instead (matching the original word-to-markdown).
34
+ - **Images** are inlined as base64 data URIs by default. To extract them to
35
+ files with relative links instead, use `{ images: 'extract' }` (library — the
36
+ bytes come back on `ConvertResult.images`) or `--image-dir <dir>` (CLI). Drop
37
+ them entirely with `{ images: 'strip' }` / `--strip-images`. On the web,
38
+ documents with images offer a **Download .zip** (Markdown + an `images/`
39
+ folder). For full control, pass a custom [Mammoth image handler](https://github.com/mwilliamson/mammoth.js/#images)
40
+ via `options.mammoth`.
41
+ - **Underline** is dropped by default (Mammoth's default, since underlines are
42
+ easily confused with links). Pass `{ underline: 'preserve' }` (library) or
43
+ `--underline` (CLI) to keep it as an inline `<u>` tag.
44
+ - **Comments, text boxes, and equations are not converted** — Mammoth drops
45
+ them during the `.docx` → HTML step. When content is dropped this way,
46
+ `convertWithWarnings` surfaces a warning.
47
+ - Heading levels come from Word's paragraph styles, not from font size.
27
48
 
28
49
  ## How is this different from the original?
29
50
 
@@ -56,8 +77,21 @@ npm install -g word-to-markdown
56
77
  w2m path/to/your/file.docx > output.md
57
78
  ```
58
79
 
80
+ The converted Markdown is written to **stdout** and any document warnings (encryption, sensitivity labels, and the like) to **stderr**, so a redirect captures only the Markdown. The command exits with a non-zero status and a friendly message if the file is missing, unreadable, or not a valid `.docx`. Only `.docx` is supported — re-save older `.doc` files as `.docx` first.
81
+
82
+ Options:
83
+
84
+ - `--bullet-lists` — convert numbered lists to bullets instead of keeping `1./2./3.`.
85
+ - `--underline` — preserve underlined text as inline `<u>` tags (dropped by default).
86
+ - `--strip-images` — remove images instead of embedding them as base64 data URIs.
87
+ - `--image-dir <dir>` — extract images to `<dir>` and link them relatively, instead
88
+ of embedding base64. Links resolve relative to where you save the Markdown, e.g.
89
+ `w2m --image-dir images report.docx > report.md`.
90
+
59
91
  ## Use as a library
60
92
 
93
+ Published to npm as [`word-to-markdown`](https://www.npmjs.com/package/word-to-markdown). It ships as an ES module and requires Node 22.13 or later.
94
+
61
95
  ```console
62
96
  npm install word-to-markdown
63
97
  ```
@@ -74,7 +108,62 @@ const { markdown, warnings } = await convertWithWarnings(
74
108
  );
75
109
  ```
76
110
 
77
- In the browser, pass an `ArrayBuffer` instead of a file path.
111
+ Both functions accept either a file-path string (in Node) or an `ArrayBuffer` (in the browser), so the same code runs in either environment:
112
+
113
+ ```js
114
+ const { markdown } = await convertWithWarnings(arrayBuffer);
115
+ ```
116
+
117
+ ### API
118
+
119
+ - **`convert(input, options?): Promise<string>`** — resolves to the Markdown.
120
+ - **`convertWithWarnings(input, options?): Promise<{ markdown: string; warnings: string[]; images? }>`** — also returns human-readable warnings for encrypted, protected, or sensitivity-labeled documents, and (in `extract` mode) the extracted images.
121
+
122
+ `input` is a file-path `string` (Node) or an `ArrayBuffer` (browser). `options` is optional:
123
+
124
+ - **`images`** — `'inline'` (default) embeds images as base64 data URIs; `'strip'` removes them; `'extract'` replaces each with a relative `![](imageDir/imageN.ext)` link and returns the bytes on `ConvertResult.images` (use `convertWithWarnings` to retrieve them).
125
+ - **`imageDir`** — link/path prefix for extracted images (default `'images'`); only applies with `images: 'extract'`.
126
+ - **`numberedLists`** — `'ordered'` (default) keeps `1./2./3.`; `'bullets'` converts numbered lists to bullets.
127
+ - **`underline`** — `'ignore'` (default) drops underlines; `'preserve'` keeps them as inline `<u>` tags.
128
+ - **`mammoth`** / **`turndown`** — escape hatches forwarded to [Mammoth](https://github.com/mwilliamson/mammoth.js/) and [Turndown](https://github.com/mixmark-io/turndown) respectively.
129
+
130
+ ```js
131
+ // Extract images to files and write them out yourself:
132
+ const { markdown, images } = await convertWithWarnings('file.docx', {
133
+ images: 'extract',
134
+ });
135
+ // markdown → ![](images/image1.png); images → [{ path, contentType, bytes }]
136
+ ```
137
+
138
+ ### Error handling
139
+
140
+ Conversion throws typed errors so you can respond to each failure precisely:
141
+
142
+ ```js
143
+ import convert, {
144
+ UnsupportedFileError,
145
+ FileNotFoundError,
146
+ InvalidFileError,
147
+ FilePermissionError,
148
+ ConversionError,
149
+ } from 'word-to-markdown';
150
+
151
+ try {
152
+ const markdown = await convert('path/to/your/file.docx');
153
+ } catch (error) {
154
+ if (error instanceof UnsupportedFileError) {
155
+ // e.g. a .doc file — only .docx is supported
156
+ } else if (error instanceof FileNotFoundError) {
157
+ // the path doesn't exist
158
+ } else if (error instanceof InvalidFileError) {
159
+ // not a valid or parseable .docx
160
+ } else if (error instanceof FilePermissionError) {
161
+ // the file couldn't be read
162
+ } else if (error instanceof ConversionError) {
163
+ // something failed mid-conversion — see error.cause
164
+ }
165
+ }
166
+ ```
78
167
 
79
168
  ## Running Locally
80
169
 
@@ -98,7 +187,7 @@ To self-host the static site using Docker Compose:
98
187
 
99
188
  1. Clone the repository
100
189
  2. Run `npm install && npm run build`
101
- 3. Run `docker-compose up -d`
190
+ 3. Run `docker compose up -d`
102
191
  4. Access at http://localhost:3000
103
192
 
104
193
  ## More context
@@ -111,12 +200,12 @@ See the README of [the original Word to Markdown](https://github.com/benbalter/w
111
200
 
112
201
  1. Use [LibreOffice](https://www.libreoffice.org/) to convert the Word document to HTML.
113
202
  2. Use a bunch of RegEx to clean up the HTML
114
- 3. User [Premailer](https://github.com/premailer/premailer) to inline the CSS
203
+ 3. Use [Premailer](https://github.com/premailer/premailer) to inline the CSS
115
204
  4. Use [Nokogiri](https://nokogiri.org) to manipulate the HTML further
116
205
  5. Use [Reverse Markdown](https://github.com/xijo/reverse_markdown) to convert the HTML to Markdown
117
206
  6. Use a bunch of RegEx to clean up the Markdown
118
207
 
119
- Not only did this process require installing and shelling out to a huge binary (LibreOffice), but it was very fragile, and key projects like Reverse Markdown are no longer maintained. I tried experimenting with Pandoc, but it had many of the same limitation.
208
+ Not only did this process require installing and shelling out to a huge binary (LibreOffice), but it was very fragile, and key projects like Reverse Markdown are no longer maintained. I tried experimenting with Pandoc, but it had many of the same limitations.
120
209
 
121
210
  ### The new way
122
211
 
@@ -126,6 +215,6 @@ Not only did this process require installing and shelling out to a huge binary (
126
215
 
127
216
  All three of these projects are actively maintained and heavily used, and allows us to convert the document faster, and entirely in JavaScript. Heck, I think theoretically, this could run in the browser for added privacy.
128
217
 
129
- It's still in beta, but so far, I've found the output to be better, with much less manual cleanup required. Notice something is off? Please [open an issue](https://github.com/benbalter/word-to-markdown-js/issues/new).
218
+ It's still young, but so far, I've found the output to be better, with much less manual cleanup required. Notice something is off? Please [open an issue](https://github.com/benbalter/word-to-markdown-js/issues/new).
130
219
 
131
220
  One note: This project does not yet attempt to guess heading levels based on font size. It could, but it's not yet implemented.
package/build/cli.js CHANGED
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { __awaiter } from "tslib";
3
3
  import { Command } from 'commander';
4
+ import { mkdir, writeFile } from 'fs/promises';
4
5
  import { convertWithWarnings, UnsupportedFileError, FileNotFoundError, InvalidFileError, FilePermissionError, ConversionError, } from './main.js';
5
6
  const program = new Command();
6
7
  program.name('w2m');
@@ -8,9 +9,32 @@ program.description('Convert Word documents to beautiful Markdown');
8
9
  program
9
10
  .command('convert', { isDefault: true })
10
11
  .argument('<file>', 'The Word document to convert')
11
- .action((file) => __awaiter(void 0, void 0, void 0, function* () {
12
+ .option('--strip-images', 'Remove images instead of embedding them as base64 data URIs')
13
+ .option('--image-dir <dir>', 'Extract images to <dir> and link them relatively, instead of embedding ' +
14
+ 'them as base64. Links resolve relative to where you save the Markdown.')
15
+ .option('--bullet-lists', 'Convert numbered lists to bullets rather than keeping them as 1./2./3.')
16
+ .option('--underline', 'Preserve underlined text as inline <u> tags (dropped by default)')
17
+ .action((file, options) => __awaiter(void 0, void 0, void 0, function* () {
12
18
  try {
13
- const result = yield convertWithWarnings(file);
19
+ // --image-dir (extract) takes precedence over --strip-images.
20
+ const images = options.imageDir
21
+ ? 'extract'
22
+ : options.stripImages
23
+ ? 'strip'
24
+ : 'inline';
25
+ const result = yield convertWithWarnings(file, {
26
+ images,
27
+ imageDir: options.imageDir,
28
+ numberedLists: options.bulletLists ? 'bullets' : 'ordered',
29
+ underline: options.underline ? 'preserve' : 'ignore',
30
+ });
31
+ // Write extracted images to disk before emitting the Markdown that links
32
+ // them. Paths are already prefixed with the requested directory.
33
+ if (result.images && result.images.length > 0) {
34
+ yield mkdir(options.imageDir, { recursive: true });
35
+ yield Promise.all(result.images.map((image) => writeFile(image.path, image.bytes)));
36
+ console.error(`Wrote ${result.images.length} image(s) to ${options.imageDir}/`);
37
+ }
14
38
  // Display warnings to stderr if any
15
39
  if (result.warnings.length > 0) {
16
40
  result.warnings.forEach((warning) => {
package/build/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,GAChB,MAAM,WAAW,CAAC;AAEnB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAC9B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACpB,OAAO,CAAC,WAAW,CAAC,8CAA8C,CAAC,CAAC;AACpE,OAAO;KACJ,OAAO,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;KACvC,QAAQ,CAAC,QAAQ,EAAE,8BAA8B,CAAC;KAClD,MAAM,CAAC,CAAO,IAAI,EAAE,EAAE;IACrB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAE/C,oCAAoC;QACpC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAClC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACzB,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,4BAA4B;QACjD,CAAC;QAED,4BAA4B;QAC5B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,uDAAuD;QACvD,IACE,KAAK,YAAY,oBAAoB;YACrC,KAAK,YAAY,iBAAiB;YAClC,KAAK,YAAY,gBAAgB;YACjC,KAAK,YAAY,mBAAmB;YACpC,KAAK,YAAY,eAAe,EAChC,CAAC;YACD,OAAO,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,yDAAyD;QACzD,OAAO,CAAC,KAAK,CACX,QAAQ,EACR,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAA,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/build/main.js CHANGED
@@ -74,15 +74,14 @@ export function validateFileExtension(filePath) {
74
74
  }
75
75
  }
76
76
  // Validates that a file path is safe to use and returns the resolved path (Node.js only)
77
- // Prevents path traversal attacks by checking for parent directory references
78
77
  function validateFilePath(filePath) {
79
- // Check for path traversal attempts
80
- if (filePath.includes('..')) {
81
- throw new Error('Invalid file path: path traversal not allowed');
82
- }
83
- // Resolve to absolute path to check for traversal
84
- // Note: This uses the path module which is Node.js-only, but this function
85
- // is only called in Node.js contexts (CLI, server, direct API use with file paths)
78
+ // Resolve to an absolute path first. path.resolve normalizes any `..`
79
+ // segments, so we deliberately do NOT reject paths that merely contain `..`:
80
+ // a relative path like `../report.docx`, or a filename like `notes..docx`, is
81
+ // legitimate CLI/library usage. (There is no sandbox to escape here — a local
82
+ // caller already has full filesystem access.)
83
+ // Note: the path module is Node.js-only, but this function is only called in
84
+ // Node.js contexts (CLI, direct API use with file paths).
86
85
  const resolvedPath = path.resolve(filePath);
87
86
  // Check for absolute paths to dangerous system directories (Unix-like systems)
88
87
  const dangerousPaths = ['/etc/', '/sys/', '/proc/', '/root/', '/boot/'];
@@ -123,6 +122,17 @@ const decodeMap = {
123
122
  };
124
123
  // Maximum iterations for decoding nested HTML entities to prevent infinite loops
125
124
  const MAX_DECODE_ITERATIONS = 10;
125
+ // Convert a numeric code point to a string, returning the original entity text
126
+ // for out-of-range values (fromCodePoint throws a RangeError on those, unlike
127
+ // the legacy fromCharCode which silently wrapped).
128
+ function codePointToString(codePoint, original) {
129
+ try {
130
+ return String.fromCodePoint(codePoint);
131
+ }
132
+ catch (_a) {
133
+ return original;
134
+ }
135
+ }
126
136
  // Decode HTML entities in text content
127
137
  function decodeHtmlEntities(html) {
128
138
  function decodeOnce(text) {
@@ -137,15 +147,16 @@ function decodeHtmlEntities(html) {
137
147
  if (decodeMap[entity]) {
138
148
  return decodeMap[entity];
139
149
  }
140
- // Handle numeric entities &#123;
150
+ // Handle numeric entities &#123; (fromCodePoint handles astral-plane
151
+ // code points > U+FFFF, e.g. emoji, which fromCharCode would truncate)
141
152
  const numericMatch = entity.match(/^&#(\d+);$/);
142
153
  if (numericMatch) {
143
- return String.fromCharCode(parseInt(numericMatch[1], 10));
154
+ return codePointToString(parseInt(numericMatch[1], 10), entity);
144
155
  }
145
156
  // Handle hex entities &#x1A;
146
157
  const hexMatch = entity.match(/^&#x([0-9a-fA-F]+);$/i);
147
158
  if (hexMatch) {
148
- return String.fromCharCode(parseInt(hexMatch[1], 16));
159
+ return codePointToString(parseInt(hexMatch[1], 16), entity);
149
160
  }
150
161
  // Return original if not recognized
151
162
  return entity;
@@ -171,10 +182,16 @@ function decodeHtmlEntities(html) {
171
182
  // Common unicode bullets that might appear in Word documents - compiled once
172
183
  const unicodeBullets = ['•', '◦', '▪', '▫', '‣', '⁃', '∙', '·'];
173
184
  const bulletRegex = new RegExp(`^\\s*[${unicodeBullets.map((b) => b.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('')}]\\s*`);
174
- // Process HTML in a single pass: convert table headers and remove unicode bullets
175
- // This is more efficient than parsing the HTML twice
176
- function processHtml(html) {
185
+ // Process HTML in a single pass: optionally strip images, convert table
186
+ // headers, and remove unicode bullets. This is more efficient than parsing the
187
+ // HTML twice.
188
+ function processHtml(html, opts = {}) {
177
189
  const root = parse(html);
190
+ // Remove images (Mammoth inlines them as base64 data URIs by default, which
191
+ // can bloat the output for image-heavy documents).
192
+ if (opts.stripImages) {
193
+ root.querySelectorAll('img').forEach((img) => img.remove());
194
+ }
178
195
  // Process tables - convert first row to table headers
179
196
  root.querySelectorAll('table').forEach((table) => {
180
197
  const firstRow = table.querySelector('tr');
@@ -216,11 +233,16 @@ function processHtml(html) {
216
233
  }
217
234
  // Reusable TurndownService instance to avoid recreating it for each conversion
218
235
  let turndownServiceInstance = null;
219
- function getTurndownService(options = {}) {
220
- // Create a new instance if options are provided, otherwise reuse the singleton
221
- if (Object.keys(options).length > 0) {
222
- const service = new TurndownService(Object.assign(Object.assign({}, options), defaultTurndownOptions));
236
+ function getTurndownService(options = {}, keepTags = []) {
237
+ // Create a new instance if options or keep-tags are provided; otherwise reuse
238
+ // the singleton. `keep()` mutates the instance, so it must never touch the
239
+ // shared singleton — a fresh service is required whenever keepTags is set.
240
+ if (Object.keys(options).length > 0 || keepTags.length > 0) {
241
+ const service = new TurndownService(Object.assign(Object.assign({}, defaultTurndownOptions), options));
223
242
  service.use(turndownPluginGfm.gfm);
243
+ if (keepTags.length > 0) {
244
+ service.keep(keepTags);
245
+ }
224
246
  return service;
225
247
  }
226
248
  if (!turndownServiceInstance) {
@@ -229,11 +251,13 @@ function getTurndownService(options = {}) {
229
251
  }
230
252
  return turndownServiceInstance;
231
253
  }
232
- // Convert HTML to GitHub-flavored Markdown
233
- export function htmlToMd(html, options = {}) {
254
+ // Convert HTML to GitHub-flavored Markdown. `keepTags` lists HTML tags to
255
+ // preserve verbatim as inline HTML (e.g. `['u']` to keep underlines) rather
256
+ // than let Turndown strip them to plain text.
257
+ export function htmlToMd(html, options = {}, keepTags = []) {
234
258
  // Decode HTML entities before conversion
235
259
  const decodedHtml = decodeHtmlEntities(html);
236
- const turndownService = getTurndownService(options);
260
+ const turndownService = getTurndownService(options, keepTags);
237
261
  return turndownService.turndown(decodedHtml).trim();
238
262
  }
239
263
  // Pre-compiled regex patterns for better performance
@@ -295,20 +319,7 @@ export function extractDocumentProperties(input) {
295
319
  const safePath = validateFilePath(input);
296
320
  // Read file from path and convert to ArrayBuffer
297
321
  const fileBuffer = yield fs.readFile(safePath);
298
- const slicedBuffer = fileBuffer.buffer.slice(fileBuffer.byteOffset, fileBuffer.byteOffset + fileBuffer.byteLength);
299
- // Ensure we have an ArrayBuffer (not SharedArrayBuffer)
300
- // In practice, Node.js Buffer.buffer returns an ArrayBuffer, but TypeScript
301
- // can't guarantee this, so we handle both cases
302
- if (slicedBuffer instanceof ArrayBuffer) {
303
- arrayBuffer = slicedBuffer;
304
- }
305
- else {
306
- // Convert SharedArrayBuffer to ArrayBuffer by copying the data
307
- const uint8Array = new Uint8Array(slicedBuffer);
308
- const newArrayBuffer = new ArrayBuffer(uint8Array.byteLength);
309
- new Uint8Array(newArrayBuffer).set(uint8Array);
310
- arrayBuffer = newArrayBuffer;
311
- }
322
+ arrayBuffer = toArrayBuffer(fileBuffer.buffer.slice(fileBuffer.byteOffset, fileBuffer.byteOffset + fileBuffer.byteLength));
312
323
  }
313
324
  else {
314
325
  arrayBuffer = input;
@@ -392,6 +403,203 @@ export function generateWarnings(properties) {
392
403
  }
393
404
  return warnings;
394
405
  }
406
+ // Ensure we have an ArrayBuffer (not a SharedArrayBuffer) by copying if needed
407
+ function toArrayBuffer(buffer) {
408
+ if (buffer instanceof ArrayBuffer) {
409
+ return buffer;
410
+ }
411
+ const uint8Array = new Uint8Array(buffer);
412
+ const newArrayBuffer = new ArrayBuffer(uint8Array.byteLength);
413
+ new Uint8Array(newArrayBuffer).set(uint8Array);
414
+ return newArrayBuffer;
415
+ }
416
+ // Append the underline style-mapping to any caller-supplied Mammoth options.
417
+ // Mammoth ignores underlines unless the style map maps them; `u => u` emits a
418
+ // `<u>` element. The entry is appended (not replaced) so Mammoth's default
419
+ // mappings — including superscript/subscript — are preserved.
420
+ function withUnderlineStyleMap(mammothOptions) {
421
+ var _a;
422
+ const existing = (_a = mammothOptions === null || mammothOptions === void 0 ? void 0 : mammothOptions.styleMap) !== null && _a !== void 0 ? _a : [];
423
+ return Object.assign(Object.assign({}, mammothOptions), { styleMap: [...existing, 'u => u'] });
424
+ }
425
+ // Common image content types → file extension. Word most often embeds PNG and
426
+ // JPEG; the rest cover formats Mammoth may surface. EMF/WMF are extracted as
427
+ // bytes for completeness but browsers can't render them (Mammoth won't transcode).
428
+ const CONTENT_TYPE_EXTENSIONS = {
429
+ 'image/png': 'png',
430
+ 'image/jpeg': 'jpg',
431
+ 'image/jpg': 'jpg',
432
+ 'image/gif': 'gif',
433
+ 'image/tiff': 'tiff',
434
+ 'image/bmp': 'bmp',
435
+ 'image/webp': 'webp',
436
+ 'image/svg+xml': 'svg',
437
+ 'image/x-emf': 'emf',
438
+ 'image/x-wmf': 'wmf',
439
+ };
440
+ // Pick a file extension for an extracted image. Falls back to the content
441
+ // type's subtype when it's a clean alphanumeric token, else `bin`. Exported for
442
+ // unit testing since only a PNG fixture exists.
443
+ export function extensionForContentType(contentType) {
444
+ var _a;
445
+ const normalized = contentType.toLowerCase();
446
+ const known = CONTENT_TYPE_EXTENSIONS[normalized];
447
+ if (known)
448
+ return known;
449
+ const subtype = (_a = normalized.split('/')[1]) !== null && _a !== void 0 ? _a : '';
450
+ return /^[a-z0-9]+$/.test(subtype) ? subtype : 'bin';
451
+ }
452
+ // Decode a base64 string to bytes in both Node (Buffer) and the browser (atob).
453
+ // Mammoth's `image.read('base64')` is the one encoding available in every build.
454
+ function base64ToBytes(b64) {
455
+ if (typeof Buffer !== 'undefined') {
456
+ return new Uint8Array(Buffer.from(b64, 'base64'));
457
+ }
458
+ const binary = atob(b64);
459
+ const bytes = new Uint8Array(binary.length);
460
+ for (let i = 0; i < binary.length; i++)
461
+ bytes[i] = binary.charCodeAt(i);
462
+ return bytes;
463
+ }
464
+ // Build a Mammoth `convertImage` handler that pulls each image out into a byte
465
+ // array with a deterministic relative path (`imageDir/imageN.ext`) instead of
466
+ // inlining it as a base64 data URI. The collected images are exposed on the
467
+ // returned `images` array once conversion finishes.
468
+ function createImageExtractor(imageDir) {
469
+ const images = [];
470
+ const convertImage = mammoth.images.imgElement((image) => __awaiter(this, void 0, void 0, function* () {
471
+ const bytes = base64ToBytes(yield image.read('base64'));
472
+ const ext = extensionForContentType(image.contentType);
473
+ const path = `${imageDir}/image${images.length + 1}.${ext}`;
474
+ images.push({ path, contentType: image.contentType, bytes });
475
+ return { src: path };
476
+ }));
477
+ return { images, convertImage };
478
+ }
479
+ // The shared conversion pipeline: mammoth HTML -> cleaned, formatted Markdown.
480
+ // Returns mammoth's messages so callers can surface content-loss warnings, and
481
+ // (in extract mode) the extracted image assets.
482
+ function runConversionPipeline(mammothInput, options) {
483
+ return __awaiter(this, void 0, void 0, function* () {
484
+ var _a;
485
+ // Preserving underline requires cooperation at both ends of the pipeline:
486
+ // Mammoth must be told to emit `<u>` (it drops underlines by default), and
487
+ // Turndown must be told to keep that tag rather than flatten it to text.
488
+ const preserveUnderline = options.underline === 'preserve';
489
+ let mammothOptions = preserveUnderline
490
+ ? withUnderlineStyleMap(options.mammoth)
491
+ : options.mammoth;
492
+ // Extract mode swaps Mammoth's default base64 inliner for a collector that
493
+ // returns each image's bytes and rewrites the src to a relative path.
494
+ let extractor;
495
+ if (options.images === 'extract') {
496
+ extractor = createImageExtractor((_a = options.imageDir) !== null && _a !== void 0 ? _a : 'images');
497
+ mammothOptions = Object.assign(Object.assign({}, mammothOptions), { convertImage: extractor.convertImage });
498
+ }
499
+ const mammothResult = yield mammoth.convertToHtml(mammothInput, mammothOptions);
500
+ const processedHtml = processHtml(mammothResult.value, {
501
+ stripImages: options.images === 'strip',
502
+ });
503
+ const md = htmlToMd(processedHtml, options.turndown, preserveUnderline ? ['u'] : []);
504
+ // Numbered lists stay numbered by default; flatten to bullets on request.
505
+ const listMd = options.numberedLists === 'bullets'
506
+ ? convertNumberedListsToBullets(md)
507
+ : md;
508
+ const normalizedMd = normalizeText(listMd);
509
+ const cleanedMd = lint(normalizedMd);
510
+ const formattedMd = yield prettify(cleanedMd);
511
+ return {
512
+ markdown: formattedMd,
513
+ messages: mammothResult.messages,
514
+ images: extractor === null || extractor === void 0 ? void 0 : extractor.images,
515
+ };
516
+ });
517
+ }
518
+ // Substrings (lower-cased) that, in a thrown error's message, indicate the
519
+ // input isn't a readable .docx (invalid/corrupt/truncated ZIP, or a missing
520
+ // required part). Sourced from JSZip and mammoth, which throw untyped Errors.
521
+ const INVALID_DOCX_ERROR_PATTERNS = [
522
+ 'end of central directory', // JSZip: invalid ZIP structure
523
+ 'zip file', // JSZip: not a valid ZIP
524
+ 'corrupted zip', // JSZip: corrupted ZIP file
525
+ 'end of data reached', // JSZip: truncated file
526
+ 'could not find file', // mammoth: missing required file in .docx
527
+ ];
528
+ function isInvalidDocxError(message) {
529
+ const lower = message.toLowerCase();
530
+ return INVALID_DOCX_ERROR_PATTERNS.some((pattern) => lower.includes(pattern));
531
+ }
532
+ // Translate the errors thrown by the pipeline into our typed, user-facing
533
+ // error classes. Always throws (never returns normally).
534
+ function classifyConversionError(error, filePath) {
535
+ // Re-throw our custom errors as-is
536
+ if (error instanceof UnsupportedFileError ||
537
+ error instanceof FileNotFoundError ||
538
+ error instanceof InvalidFileError ||
539
+ error instanceof FilePermissionError ||
540
+ error instanceof ConversionError) {
541
+ throw error;
542
+ }
543
+ // Handle specific error types from underlying libraries
544
+ const errorMessage = error instanceof Error ? error.message : String(error);
545
+ const errorCode = error && typeof error === 'object' && 'code' in error
546
+ ? error.code
547
+ : undefined;
548
+ // File not found errors (only occur with file path inputs)
549
+ if (errorCode === 'ENOENT') {
550
+ throw new FileNotFoundError(filePath);
551
+ }
552
+ // Permission errors (only occur with file path inputs)
553
+ if (errorCode === 'EACCES' || errorCode === 'EPERM') {
554
+ throw new FilePermissionError(filePath);
555
+ }
556
+ // Invalid .docx file errors (from JSZip or mammoth during file parsing).
557
+ // JSZip/mammoth throw plain, untyped Errors with no error code, so message
558
+ // matching is the only signal available. Matching is case-insensitive so a
559
+ // minor wording/capitalization change upstream is less likely to slip through
560
+ // (see INVALID_DOCX_ERROR_PATTERNS). There is a small theoretical risk of
561
+ // matching document content, but these technical phrases are highly unlikely
562
+ // to appear in normal content.
563
+ if (isInvalidDocxError(errorMessage)) {
564
+ // Note: For ArrayBuffer inputs (e.g., web uploads), filePath will be
565
+ // undefined, so the message won't include the original filename.
566
+ throw new InvalidFileError(filePath);
567
+ }
568
+ // Wrap other errors with a general conversion error
569
+ throw new ConversionError('An error occurred while converting the document. Please ensure the file is a valid .docx file and try again.', error instanceof Error ? error : undefined);
570
+ }
571
+ // Turn mammoth's conversion messages into user-facing warnings. Mammoth is
572
+ // chatty and emits many cosmetic "unrecognised style" notices on ordinary
573
+ // documents; we surface only messages that indicate actual content loss
574
+ // (dropped/ignored elements or unconvertible images), de-duplicated.
575
+ export function extractMammothWarnings(messages) {
576
+ const seen = new Set();
577
+ const warnings = [];
578
+ for (const message of messages) {
579
+ if (message.type !== 'warning' && message.type !== 'error') {
580
+ continue;
581
+ }
582
+ const text = message.message.toLowerCase();
583
+ // Skip cosmetic style-mapping notices — they don't drop content
584
+ if (text.includes('style')) {
585
+ continue;
586
+ }
587
+ // Surface only messages that signal dropped or unconvertible content
588
+ const indicatesContentLoss = text.includes('ignored') ||
589
+ text.includes('unsupported') ||
590
+ text.includes('could not') ||
591
+ text.includes('image');
592
+ if (!indicatesContentLoss) {
593
+ continue;
594
+ }
595
+ const warning = `Warning: Some document content may not have converted cleanly (${message.message}).`;
596
+ if (!seen.has(warning)) {
597
+ seen.add(warning);
598
+ warnings.push(warning);
599
+ }
600
+ }
601
+ return warnings;
602
+ }
395
603
  // Converts a Word document to crisp, clean Markdown with warnings
396
604
  export function convertWithWarnings(input_1) {
397
605
  return __awaiter(this, arguments, void 0, function* (input, options = {}) {
@@ -406,24 +614,10 @@ export function convertWithWarnings(input_1) {
406
614
  validateFileExtension(input);
407
615
  // Validate the file path to prevent path traversal attacks
408
616
  const safePath = validateFilePath(input);
409
- // Read the file once and share the buffer between
410
- // property extraction and Mammoth conversion to avoid
411
- // redundant disk reads for large documents
617
+ // Read the file once and share the buffer between property extraction
618
+ // and Mammoth conversion to avoid redundant disk reads for large documents
412
619
  const fileBuffer = yield fs.readFile(safePath);
413
- const slicedBuffer = fileBuffer.buffer.slice(fileBuffer.byteOffset, fileBuffer.byteOffset + fileBuffer.byteLength);
414
- // Ensure we have an ArrayBuffer (not SharedArrayBuffer) for property extraction
415
- let arrayBuffer;
416
- if (slicedBuffer instanceof ArrayBuffer) {
417
- arrayBuffer = slicedBuffer;
418
- }
419
- else {
420
- // Convert SharedArrayBuffer to ArrayBuffer by copying the data
421
- const uint8Array = new Uint8Array(slicedBuffer);
422
- const newArrayBuffer = new ArrayBuffer(uint8Array.byteLength);
423
- new Uint8Array(newArrayBuffer).set(uint8Array);
424
- arrayBuffer = newArrayBuffer;
425
- }
426
- propertiesInput = arrayBuffer;
620
+ propertiesInput = toArrayBuffer(fileBuffer.buffer.slice(fileBuffer.byteOffset, fileBuffer.byteOffset + fileBuffer.byteLength));
427
621
  mammothInput = { buffer: fileBuffer };
428
622
  }
429
623
  else {
@@ -440,119 +634,39 @@ export function convertWithWarnings(input_1) {
440
634
  // Extract document properties to check for confidentiality flags
441
635
  const properties = yield extractDocumentProperties(propertiesInput);
442
636
  const warnings = generateWarnings(properties);
443
- const mammothResult = yield mammoth.convertToHtml(mammothInput, options.mammoth);
444
- const processedHtml = processHtml(mammothResult.value);
445
- const md = htmlToMd(processedHtml, options.turndown);
446
- const mdWithBullets = convertNumberedListsToBullets(md);
447
- const normalizedMd = normalizeText(mdWithBullets);
448
- const cleanedMd = lint(normalizedMd);
449
- const formattedMd = yield prettify(cleanedMd);
450
- return {
451
- markdown: formattedMd,
452
- warnings,
453
- };
637
+ const { markdown, messages, images } = yield runConversionPipeline(mammothInput, options);
638
+ warnings.push(...extractMammothWarnings(messages));
639
+ return images ? { markdown, warnings, images } : { markdown, warnings };
454
640
  }
455
641
  catch (error) {
456
- // Re-throw our custom errors as-is
457
- if (error instanceof UnsupportedFileError ||
458
- error instanceof FileNotFoundError ||
459
- error instanceof InvalidFileError ||
460
- error instanceof FilePermissionError ||
461
- error instanceof ConversionError) {
462
- throw error;
463
- }
464
- // Handle specific error types from underlying libraries
465
- const errorMessage = error instanceof Error ? error.message : String(error);
466
- const errorCode = error && typeof error === 'object' && 'code' in error
467
- ? error.code
468
- : undefined;
469
- // File not found errors (only occur with file path inputs)
470
- if (errorCode === 'ENOENT') {
471
- throw new FileNotFoundError(filePath);
472
- }
473
- // Permission errors (only occur with file path inputs)
474
- if (errorCode === 'EACCES' || errorCode === 'EPERM') {
475
- throw new FilePermissionError(filePath);
476
- }
477
- // Invalid .docx file errors (from JSZip or mammoth during file parsing)
478
- if (errorMessage.includes('end of central directory') ||
479
- errorMessage.includes('zip file') ||
480
- errorMessage.includes('Corrupted zip') ||
481
- errorMessage.includes('End of data reached') ||
482
- errorMessage.includes('Could not find file')) {
483
- throw new InvalidFileError(filePath);
484
- }
485
- // Wrap other errors with a general conversion error
486
- throw new ConversionError('An error occurred while converting the document. Please ensure the file is a valid .docx file and try again.', error instanceof Error ? error : undefined);
642
+ classifyConversionError(error, filePath);
487
643
  }
488
644
  });
489
645
  }
490
- // Converts a Word document to crisp, clean Markdown
646
+ // Converts a Word document to crisp, clean Markdown.
647
+ // Unlike convertWithWarnings, this skips document-property extraction (and its
648
+ // extra ZIP parse) so callers that only need the Markdown pay no overhead.
491
649
  export default function convert(input_1) {
492
650
  return __awaiter(this, arguments, void 0, function* (input, options = {}) {
493
- let inputObj;
494
651
  let filePath;
495
652
  try {
653
+ let mammothInput;
496
654
  if (typeof input === 'string') {
497
655
  filePath = input;
498
656
  // Validate file extension for file path inputs
499
657
  validateFileExtension(input);
500
658
  // Validate the file path to prevent path traversal attacks
501
659
  const safePath = validateFilePath(input);
502
- inputObj = { path: safePath };
660
+ mammothInput = { path: safePath };
503
661
  }
504
662
  else {
505
- inputObj = { arrayBuffer: input };
663
+ mammothInput = { arrayBuffer: input };
506
664
  }
507
- const mammothResult = yield mammoth.convertToHtml(inputObj, options.mammoth);
508
- const processedHtml = processHtml(mammothResult.value);
509
- const md = htmlToMd(processedHtml, options.turndown);
510
- const mdWithBullets = convertNumberedListsToBullets(md);
511
- const normalizedMd = normalizeText(mdWithBullets);
512
- const cleanedMd = lint(normalizedMd);
513
- const formattedMd = yield prettify(cleanedMd);
514
- return formattedMd;
665
+ const { markdown } = yield runConversionPipeline(mammothInput, options);
666
+ return markdown;
515
667
  }
516
668
  catch (error) {
517
- // Re-throw our custom errors as-is
518
- if (error instanceof UnsupportedFileError ||
519
- error instanceof FileNotFoundError ||
520
- error instanceof InvalidFileError ||
521
- error instanceof FilePermissionError ||
522
- error instanceof ConversionError) {
523
- throw error;
524
- }
525
- // Handle specific error types from underlying libraries
526
- const errorMessage = error instanceof Error ? error.message : String(error);
527
- const errorCode = error && typeof error === 'object' && 'code' in error
528
- ? error.code
529
- : undefined;
530
- // File not found errors (only occur with file path inputs)
531
- if (errorCode === 'ENOENT') {
532
- throw new FileNotFoundError(filePath);
533
- }
534
- // Permission errors (only occur with file path inputs)
535
- if (errorCode === 'EACCES' || errorCode === 'EPERM') {
536
- throw new FilePermissionError(filePath);
537
- }
538
- // Invalid .docx file errors (from JSZip or mammoth during file parsing)
539
- // These patterns typically come from JSZip/mammoth when parsing the file structure.
540
- // While there's a small theoretical risk of matching document content in unusual
541
- // scenarios (e.g., embedded error messages), these specific technical phrases are
542
- // highly unlikely to appear in normal document content.
543
- if (errorMessage.includes('end of central directory') || // JSZip: invalid ZIP structure
544
- errorMessage.includes('zip file') || // JSZip: not a valid ZIP
545
- errorMessage.includes('Corrupted zip') || // JSZip: corrupted ZIP file
546
- errorMessage.includes('End of data reached') || // JSZip: truncated file
547
- errorMessage.includes('Could not find file') // mammoth: missing required file in .docx
548
- ) {
549
- // Note: For ArrayBuffer inputs (e.g., web uploads), filePath will be undefined,
550
- // so the error message won't include the original filename. The web interface
551
- // could be enhanced to pass the filename separately if needed.
552
- throw new InvalidFileError(filePath);
553
- }
554
- // Wrap other errors with a general conversion error
555
- throw new ConversionError('An error occurred while converting the document. Please ensure the file is a valid .docx file and try again.', error instanceof Error ? error : undefined);
669
+ classifyConversionError(error, filePath);
556
670
  }
557
671
  });
558
672
  }
package/build/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "word-to-markdown",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Convert Word documents to beautiful Markdown.",
5
5
  "type": "module",
6
6
  "keywords": [
@@ -34,8 +34,8 @@
34
34
  "@tailwindcss/vite": "^4.3.3",
35
35
  "@types/jest": "~30.0",
36
36
  "@types/node": "~26",
37
- "@types/turndown": "^5.0.6",
38
37
  "astro": "^7.1.3",
38
+ "clipboard": "^2.0.11",
39
39
  "eslint": "^10.7.0",
40
40
  "eslint-config-prettier": "~10.1",
41
41
  "eslint-plugin-jest": "~29.15",
@@ -43,11 +43,17 @@
43
43
  "jest": "~30.4",
44
44
  "jest-util": "~30.4",
45
45
  "playwright": "^1.61.1",
46
+ "rehype-sanitize": "^6.0.0",
47
+ "rehype-stringify": "^10.0.1",
48
+ "remark-gfm": "^4.0.1",
49
+ "remark-parse": "^11.0.0",
50
+ "remark-rehype": "^11.1.2",
46
51
  "tailwindcss": "^4.3.3",
47
52
  "ts-api-utils": "~2.5",
48
53
  "ts-jest": "~29.4",
49
54
  "typescript": "^6.0.3",
50
- "typescript-eslint": "^8.65.0"
55
+ "typescript-eslint": "^8.65.0",
56
+ "unified": "^11.0.5"
51
57
  },
52
58
  "scripts": {
53
59
  "fix": "eslint --fix . && prettier --write .",
@@ -70,21 +76,13 @@
70
76
  "dependencies": {
71
77
  "@joplin/turndown": "^4.0.85",
72
78
  "@joplin/turndown-plugin-gfm": "^1.0.67",
73
- "clipboard": "^2.0.11",
74
79
  "commander": "^15.0.0",
75
80
  "jszip": "^3.10.1",
76
81
  "mammoth": "^1.12.0",
77
82
  "markdownlint": "^0.41.1",
78
83
  "node-html-parser": "^9.0.0",
79
84
  "prettier": "~3.9",
80
- "rehype-sanitize": "^6.0.0",
81
- "rehype-stringify": "^10.0.1",
82
- "remark-gfm": "^4.0.1",
83
- "remark-parse": "^11.0.0",
84
- "remark-rehype": "^11.1.2",
85
- "tslib": "~2.8",
86
- "unified": "^11.0.5",
87
- "url": "^0.11.4"
85
+ "tslib": "~2.8"
88
86
  },
89
87
  "volta": {
90
88
  "node": "22.13.0"