@ryangarber/markitdown-ts 0.2.0 → 0.2.2
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/dist/cli.mjs +2 -2
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/markitdown.1 +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -275,7 +275,7 @@ var DocxConverter = class extends HtmlConverter {
|
|
|
275
275
|
async convert(source, options) {
|
|
276
276
|
if (options.extension !== "docx") return null;
|
|
277
277
|
let mammothInput = { arrayBuffer: toArrayBuffer(source) };
|
|
278
|
-
if (typeof process !== "undefined" && process.versions
|
|
278
|
+
if (typeof process !== "undefined" && process.versions && process.versions.node) mammothInput = { buffer: Buffer.from(source) };
|
|
279
279
|
const mammothOptions = Object.fromEntries(Object.entries(options.mammoth ?? {}).flatMap(([key, value]) => value !== void 0 ? [[key, value]] : []));
|
|
280
280
|
const html = await mammoth.convertToHtml(mammothInput, mammothOptions);
|
|
281
281
|
return this.convertHtml(html.value);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["escapeHtml","XmlElement","XmlDocument","XmlNode","converters.PlainTextConverter","converters.HtmlConverter","converters.ZipConverter","converters.RSSConverter","converters.WikipediaConverter","converters.YouTubeConverter","converters.BingSerpConverter","converters.DocxConverter","converters.XlsxConverter","converters.PptxConverter","converters.PdfConverter","converters.IpynbConverter"],"sources":["../src/utils/bytes.ts","../src/utils/turndown.ts","../src/utils/html.ts","../src/utils/mime.ts","../src/converters/bingserp.ts","../src/converters/html.ts","../src/converters/docx.ts","../src/converters/ipynb.ts","../src/converters/pdf.ts","../src/converters/plain-text.ts","../src/converters/pptx.ts","../src/converters/wikipedia.ts","../src/converters/xlsx.ts","../src/converters/xml-rss-atom.ts","../src/converters/youtube.ts","../src/converters/zip.ts","../src/markitdown.ts"],"sourcesContent":["import type { ByteSource } from \"../types.ts\";\n\nexport async function toUint8Array(source: ByteSource): Promise<Uint8Array> {\n if (source instanceof Uint8Array) {\n return source;\n }\n\n if (isBlob(source)) {\n return new Uint8Array(await source.arrayBuffer());\n }\n\n if (ArrayBuffer.isView(source)) {\n return new Uint8Array(source.buffer, source.byteOffset, source.byteLength);\n }\n\n return new Uint8Array(source);\n}\n\nexport function toArrayBuffer(source: Uint8Array): ArrayBuffer {\n return source.slice().buffer;\n}\n\nexport function decodeText(source: Uint8Array): string {\n return new TextDecoder().decode(source);\n}\n\nexport function isBlob(value: unknown): value is Blob {\n return typeof Blob !== \"undefined\" && value instanceof Blob;\n}\n","import TurndownPluginGfm from \"@truto/turndown-plugin-gfm\";\nimport TurndownService from \"turndown\";\n\nexport class Turndown {\n convertSoup(document: string | Node): string {\n const service = new TurndownService({ headingStyle: \"atx\" });\n service.use(TurndownPluginGfm);\n\n service.addRule(\"anchor tags\", {\n filter: [\"a\"],\n replacement(content, node) {\n if (!content) return \"\";\n\n const prefix = content.startsWith(\" \") ? \" \" : \"\";\n const suffix = content.endsWith(\" \") ? \" \" : \"\";\n const text = content.trim().replace(/\\n\\n.*/g, \"\");\n if (!text) return \"\";\n\n const element = node as unknown as Element;\n const href = element.getAttribute(\"href\");\n let title = element.getAttribute(\"title\") ?? \"\";\n if (!href) return `${prefix}${text}${suffix}`;\n\n try {\n const url = new URL(href);\n if (url.protocol !== \"https:\" && url.protocol !== \"http:\") {\n return `${prefix}${text}${suffix}`;\n }\n } catch {\n if (\n !href.startsWith(\"/\") &&\n !href.startsWith(\"#\") &&\n !href.startsWith(\"./\") &&\n !href.startsWith(\"../\")\n ) {\n return `${prefix}${text}${suffix}`;\n }\n }\n\n if (text.replace(/\\\\_/g, \"_\") === href && !title) {\n return `<${href}>`;\n }\n if (!title) title = href;\n return `${prefix}[${text}](${href}${title ? ` \"${title}\"` : \"\"})${suffix}`;\n }\n });\n\n service.addRule(\"img tags\", {\n filter: [\"img\"],\n replacement(_content, node) {\n const element = node as unknown as Element;\n const alt = element.getAttribute(\"alt\") ?? \"\";\n let source = element.getAttribute(\"src\") ?? \"\";\n const title = element.getAttribute(\"title\");\n if (source.startsWith(\"data:\")) {\n source = `${source.split(\",\", 1)[0]}...`;\n }\n return ``;\n }\n });\n\n return service.turndown(serializeNode(document));\n }\n}\n\n/**\n * Turndown and its GFM plugin rely on DOM APIs (e.g. `HTMLTableElement.rows`, `Element.closest`)\n * that linkedom does not implement, which silently drops content such as tables. Serializing\n * lets Turndown re-parse the markup with its own spec-compliant DOM.\n */\nfunction serializeNode(node: string | Node): string {\n if (typeof node === \"string\") {\n return node;\n }\n if (node.nodeType === node.DOCUMENT_NODE) {\n return (node as Document).documentElement?.outerHTML ?? \"\";\n }\n if (node.nodeType === node.ELEMENT_NODE) {\n return (node as Element).outerHTML;\n }\n if (node.nodeType === node.TEXT_NODE) {\n return escapeHtml(node.textContent ?? \"\");\n }\n // Document fragments and other containers.\n return [...node.childNodes].map(serializeNode).join(\"\");\n}\n\nfunction escapeHtml(value: string): string {\n return value.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\n}\n","import { parseHTML } from \"linkedom\";\nimport { Turndown } from \"./turndown.ts\";\n\nexport type DocumentInput<Keys extends string = string> = {\n [key in Keys]:\n | { type: \"node\"; value: (Node | string)[] | Node | string }\n | { type: \"metadata\"; value: unknown };\n};\n\nexport type DocumentOutput<Input extends DocumentInput> = {\n [key in keyof Input]: Input[key] extends { type: \"node\" }\n ? string\n : Input[key] extends { type: \"metadata\" }\n ? Input[key][\"value\"]\n : never;\n};\n\nexport function parseHtmlDocument<T extends DocumentInput>(\n html: string,\n transform: (document: Document) => T\n): DocumentOutput<T> {\n const document = parseHTML(wrapFragment(html)).document as unknown as Document;\n\n return Object.fromEntries(\n Object.entries(transform(document)).map(([key, value]) => {\n if (value.type === \"node\") {\n const nodes = Array.isArray(value.value) ? value.value : [value.value];\n\n const markdown = nodes\n .map((node) =>\n new Turndown()\n .convertSoup(node)\n .split(/\\n+/)\n .map((line) => line.trim())\n .filter(Boolean)\n .join(\"\\n\\n\")\n )\n .join(\"\\n\\n\");\n\n return [key, markdown];\n }\n\n return [key, value.value];\n })\n ) as DocumentOutput<T>;\n}\n\n/**\n * linkedom only parses complete documents: given a fragment (e.g. mammoth output or an RSS\n * description), it promotes the first element to `documentElement` and drops its siblings\n * from the tree, so wrap fragments in a full document first.\n */\nfunction wrapFragment(html: string): string {\n if (/<html[\\s>]/i.test(html)) {\n return html;\n }\n if (/<(head|body)[\\s>]/i.test(html)) {\n return `<html>${html}</html>`;\n }\n return `<html><head></head><body>${html}</body></html>`;\n}\n","import { fileTypeFromBuffer } from \"file-type\";\nimport { Mime } from \"mime\";\nimport otherTypes from \"mime/types/other.js\";\nimport standardTypes from \"mime/types/standard.js\";\n\nconst mime = new Mime(standardTypes, otherTypes);\n\nexport function extensionFromMime(contentType: string | null | undefined): string | null {\n if (!contentType) return null;\n return extensionNormalized(mime.getExtension(contentType));\n}\n\nexport async function extensionFromBuffer(buffer: Uint8Array): Promise<string | null> {\n const type = await fileTypeFromBuffer(buffer);\n if (!type) return null;\n return extensionNormalized(type.ext);\n}\n\n/**\n * Sniffs text formats that have no magic number. Returns null for binary content, and `txt`\n * for text that is not recognized as anything more specific.\n */\nexport function extensionFromText(buffer: Uint8Array): string | null {\n let text: string;\n try {\n text = new TextDecoder(\"utf-8\", { fatal: true }).decode(buffer);\n } catch {\n return null;\n }\n if (hasBinaryControlCharacters(text)) {\n return null;\n }\n\n const start = text.trimStart().slice(0, 1024).toLowerCase();\n if (start.startsWith(\"<\")) {\n if (/<rss[\\s>]/.test(start)) return \"rss\";\n if (/<feed[\\s>]/.test(start)) return \"atom\";\n if (/^<!doctype html|<(html|head|body)[\\s>]/.test(start)) return \"html\";\n if (start.startsWith(\"<?xml\")) return \"xml\";\n }\n if (start.startsWith(\"{\") && /\"nbformat\"\\s*:/.test(text) && /\"cells\"\\s*:/.test(text)) {\n return \"ipynb\";\n }\n return \"txt\";\n}\n\nfunction hasBinaryControlCharacters(text: string): boolean {\n for (let index = 0; index < text.length; index++) {\n const code = text.charCodeAt(index);\n // Whitespace (tab through carriage return) and escape (ANSI colors) still appear in text.\n if (code < 0x20 && (code < 0x09 || code > 0x0d) && code !== 0x1b) {\n return true;\n }\n }\n return false;\n}\n\nexport function extensionFromPathname(pathname: string): string | null {\n const filename = pathname.split(\"/\").pop() ?? \"\";\n const dot = filename.lastIndexOf(\".\");\n return dot > 0 ? extensionNormalized(filename.slice(dot)) : null;\n}\n\n/** Reads the filename from a Content-Disposition header, preferring the RFC 5987 form. */\nexport function filenameFromDisposition(disposition: string | null | undefined): string | null {\n if (!disposition) return null;\n\n const extended = disposition.match(/filename\\*\\s*=\\s*[\\w-]*'[^']*'([^;]+)/i)?.[1]?.trim();\n if (extended) {\n try {\n return decodeURIComponent(extended);\n } catch {\n return extended;\n }\n }\n\n const plain = disposition.match(/filename\\s*=\\s*(?:\"([^\"]*)\"|([^;]+))/i);\n return (plain?.[1] ?? plain?.[2])?.trim() || null;\n}\n\nexport type FileTypeHints = {\n /** Explicit extension, with or without a leading dot. */\n extension?: string | null;\n /** Filename, e.g. from a `File` or a Content-Disposition header. */\n filename?: string | null;\n /** URLs the content was loaded from, e.g. the requested and redirected URLs. */\n urls?: (string | null | undefined)[];\n /** MIME type, e.g. from a `Blob` or a Content-Type header. */\n contentType?: string | null;\n};\n\n/**\n * Lists candidate extensions for the content, most reliable first: explicit extensions, then\n * names, then declared MIME types, then the content itself.\n */\nexport async function detectExtensions(\n buffer: Uint8Array,\n { extension, filename, urls = [], contentType }: FileTypeHints = {}\n): Promise<string[]> {\n const candidates = [\n extensionNormalized(extension),\n filename ? extensionFromPathname(filename) : null,\n ...urls.map((url) => (url ? extensionFromUrl(url) : null)),\n extensionFromMime(contentType),\n // Content with a magic number is not sniffed as text, so a damaged binary isn't dumped as text.\n (await extensionFromBuffer(buffer)) ?? extensionFromText(buffer)\n ];\n return [...new Set(candidates.filter((candidate): candidate is string => !!candidate))];\n}\n\nfunction extensionFromUrl(url: string): string | null {\n try {\n return extensionFromPathname(decodeURIComponent(new URL(url).pathname));\n } catch {\n return null;\n }\n}\n\nexport function extensionNormalized(extension: string | null | undefined, withDot = false): string {\n if (!extension) {\n return \"\";\n }\n\n const normalized = extension\n .trim()\n .toLowerCase()\n .replace(/^[.-]+/, \"\");\n return withDot ? `.${normalized}` : normalized;\n}\n\nexport function isTextExtension(extension: string): boolean {\n const type = mime.getType(extension);\n if (!type) return false;\n return type.startsWith(\"text/\");\n}\n","import type { Converter, ConverterOptions, ConverterResult } from \"../types.ts\";\nimport { decodeText, parseHtmlDocument } from \"../utils/index.ts\";\n\nconst BING_SEARCH_URL = /^https:\\/\\/www\\.bing\\.com\\/search\\?q=/i;\nconst BASE64_ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\nexport class BingSerpConverter implements Converter {\n async convert(source: Uint8Array, options: ConverterOptions = {}): Promise<ConverterResult> {\n if (\n (options.extension !== \"html\" && options.extension !== \"htm\") ||\n !BING_SEARCH_URL.test(options.url ?? \"\")\n ) {\n return null;\n }\n\n let query = new URL(options.url ?? \"\").searchParams.get(\"q\") || null;\n if (query) query = `Search results for \"${query}\"`;\n\n return parseHtmlDocument(decodeText(source), (document) => {\n document.querySelectorAll(\".tptt\").forEach((element) => {\n if (element.textContent) {\n element.textContent += \" \";\n }\n });\n\n document.querySelectorAll(\".algoSlug_icon\").forEach((element) => {\n element.remove();\n });\n\n return {\n title: {\n type: \"metadata\",\n value: query || document.title || null\n },\n markdown: {\n type: \"node\",\n value: [...document.querySelectorAll(\".b_algo\")].map((result) => {\n result.querySelectorAll(\"a[href]\").forEach((anchor) => {\n const href = anchor.getAttribute(\"href\");\n if (!href) {\n return;\n }\n\n try {\n const encoded = new URL(href, options.url ?? \"\").searchParams.get(\"u\");\n if (encoded) {\n anchor.setAttribute(\"href\", decodeBingUrl(encoded));\n }\n } catch {\n // Preserve malformed links as they appeared in the source document.\n }\n });\n\n return result;\n })\n }\n };\n });\n }\n}\n\nfunction decodeBingUrl(encoded: string): string {\n const input = encoded.slice(2).replace(/-/g, \"+\").replace(/_/g, \"/\").replace(/=+$/, \"\");\n const bytes: number[] = [];\n let bits = 0;\n let bitCount = 0;\n\n for (const character of input) {\n const value = BASE64_ALPHABET.indexOf(character);\n if (value < 0) {\n return encoded;\n }\n bits = (bits << 6) | value;\n bitCount += 6;\n if (bitCount >= 8) {\n bitCount -= 8;\n bytes.push((bits >> bitCount) & 0xff);\n }\n }\n\n return new TextDecoder().decode(new Uint8Array(bytes));\n}\n","import type { Converter, ConverterOptions, ConverterResult } from \"../types.ts\";\nimport { decodeText, parseHtmlDocument } from \"../utils/index.ts\";\n\nexport class HtmlConverter<Options = unknown> implements Converter<Options> {\n async convert(source: Uint8Array, options: ConverterOptions<Options>): Promise<ConverterResult> {\n if (options.extension !== \"html\" && options.extension !== \"htm\") {\n return null;\n }\n\n return this.convertHtml(decodeText(source));\n }\n\n protected async convertHtml(html: string): Promise<ConverterResult> {\n return parseHtmlDocument(html, (document) => {\n const title = document.title || null;\n\n document.querySelectorAll(\"script, style, title\").forEach((element) => {\n element.remove();\n });\n\n return {\n title: { type: \"metadata\", value: title },\n // TODO\n markdown: { type: \"node\", value: document }\n };\n });\n }\n}\n","import mammoth from \"mammoth\";\nimport type { ConverterOptions, ConverterResult } from \"../types.ts\";\nimport { toArrayBuffer } from \"../utils/index.ts\";\nimport { HtmlConverter } from \"./html.ts\";\n\nexport interface MammothOptions {\n mammoth?: NonNullable<Parameters<typeof mammoth.convertToHtml>[1]>;\n}\n\nexport class DocxConverter extends HtmlConverter<MammothOptions> {\n override async convert(\n source: Uint8Array,\n options: ConverterOptions<MammothOptions>\n ): Promise<ConverterResult> {\n if (options.extension !== \"docx\") {\n return null;\n }\n\n let mammothInput: Parameters<typeof mammoth.convertToHtml>[0] = {\n arrayBuffer: toArrayBuffer(source)\n };\n\n if (\n typeof process !== \"undefined\" &&\n process.versions !== null &&\n process.versions.node !== null\n ) {\n mammothInput = { buffer: Buffer.from(source) };\n }\n\n const mammothOptions: NonNullable<MammothOptions[\"mammoth\"]> = Object.fromEntries(\n Object.entries(options.mammoth ?? {}).flatMap(([key, value]) =>\n value !== undefined ? [[key, value]] : []\n )\n );\n\n const html = await mammoth.convertToHtml(mammothInput, mammothOptions);\n\n return this.convertHtml(html.value);\n }\n}\n","import type { Converter, ConverterOptions, ConverterResult } from \"../types.ts\";\nimport { decodeText } from \"../utils/index.ts\";\n\ntype NotebookCell = {\n cell_type?: string;\n source?: string[];\n};\n\ntype Notebook = {\n cells?: NotebookCell[];\n metadata?: { title?: string };\n};\n\nexport class IpynbConverter implements Converter {\n async convert(source: Uint8Array, options: ConverterOptions = {}): Promise<ConverterResult> {\n if (options.extension !== \"ipynb\") {\n return null;\n }\n\n const notebook = JSON.parse(decodeText(source)) as Notebook;\n const output: string[] = [];\n let title: string | null = notebook.metadata?.title ?? null;\n\n for (const cell of notebook.cells ?? []) {\n const lines = cell.source ?? [];\n if (cell.cell_type === \"markdown\") {\n output.push(lines.join(\"\"));\n title ??=\n lines\n .find((line) => line.startsWith(\"# \"))\n ?.slice(2)\n .trim() ?? null;\n } else if (cell.cell_type === \"code\") {\n output.push(`\\`\\`\\`python\\n${lines.join(\"\")}\\n\\`\\`\\``);\n } else if (cell.cell_type === \"raw\") {\n output.push(`\\`\\`\\`\\n${lines.join(\"\")}\\n\\`\\`\\``);\n }\n }\n\n const markdown = output.join(\"\\n\\n\");\n return { title, markdown };\n }\n}\n","import { extractText, getDocumentProxy, getMeta } from \"unpdf\";\nimport type { Converter, ConverterOptions, ConverterResult } from \"../types.ts\";\n\nexport class PdfConverter implements Converter {\n async convert(source: Uint8Array, options: ConverterOptions): Promise<ConverterResult> {\n if (options.extension !== \"pdf\") {\n return null;\n }\n\n const pdf = await getDocumentProxy(source.slice());\n try {\n const [{ text }, { info }] = await Promise.all([\n extractText(pdf, { mergePages: true }),\n getMeta(pdf)\n ]);\n const title = typeof info.Title === \"string\" && info.Title.trim() ? info.Title : null;\n\n return { title, markdown: text };\n } finally {\n await pdf.loadingTask.destroy();\n }\n }\n}\n","import type { Converter, ConverterOptions, ConverterResult } from \"../types.ts\";\nimport { decodeText, isTextExtension } from \"../utils/index.ts\";\n\nexport class PlainTextConverter implements Converter {\n async convert(source: Uint8Array, options: ConverterOptions = {}): Promise<ConverterResult> {\n if (!isTextExtension(options.extension ?? \"\")) {\n return null;\n }\n\n const content = decodeText(source);\n return { title: null, markdown: content };\n }\n}\n","import { pptxToHtml } from \"@jvmr/pptx-to-html\";\nimport {\n DOMParser,\n Document as XmlDocument,\n Element as XmlElement,\n Node as XmlNode\n} from \"@xmldom/xmldom\";\nimport type { ConverterOptions, ConverterResult } from \"../types.ts\";\nimport { toArrayBuffer } from \"../utils/index.ts\";\nimport { HtmlConverter } from \"./html.ts\";\n\nexport class PptxConverter extends HtmlConverter {\n override async convert(source: Uint8Array, options: ConverterOptions): Promise<ConverterResult> {\n if (options.extension !== \"pptx\") {\n return null;\n }\n\n const slides = await pptxToHtml(toArrayBuffer(source), {\n domParserFactory: createPptxDomParser\n });\n const sections: string[] = [];\n\n for (const [index, html] of slides.entries()) {\n const result = await this.convertHtml(`<html><body>${html}</body></html>`);\n sections.push(`<!-- Slide number: ${index + 1} -->\\n${result?.markdown.trim() ?? \"\"}`);\n }\n\n const markdown = sections.join(\"\\n\\n\");\n return {\n title: null,\n markdown\n };\n }\n}\n\nfunction createPptxDomParser(): { parseFromString(xml: string, mime: string): Document } {\n if (typeof globalThis.DOMParser === \"function\") {\n return new globalThis.DOMParser();\n }\n\n patchXmlDom();\n return new DOMParser() as unknown as {\n parseFromString(xml: string, mime: string): Document;\n };\n}\n\nlet xmlDomPatched = false;\n\nfunction patchXmlDom(): void {\n if (xmlDomPatched) {\n return;\n }\n xmlDomPatched = true;\n\n defineMethod(XmlElement.prototype, \"querySelector\", querySelector);\n defineMethod(XmlElement.prototype, \"querySelectorAll\", querySelectorAll);\n defineMethod(XmlDocument.prototype, \"querySelector\", querySelector);\n defineMethod(XmlDocument.prototype, \"querySelectorAll\", querySelectorAll);\n\n defineGetter(XmlElement.prototype, \"children\", function (this: XmlElement) {\n return [...this.childNodes].filter((node) => node.nodeType === 1);\n });\n defineGetter(XmlNode.prototype, \"parentElement\", function (this: XmlNode) {\n const parent = this.parentNode;\n return parent?.nodeType === 1 ? parent : null;\n });\n}\n\nfunction querySelector(this: XmlElement | XmlDocument, selector: string): XmlElement | null {\n for (const group of selector.split(\",\")) {\n const match = queryByPath(this, group.trim());\n if (match) {\n return match;\n }\n }\n return null;\n}\n\nfunction querySelectorAll(): XmlElement[] {\n return [];\n}\n\nfunction queryByPath(root: XmlElement | XmlDocument, selector: string): XmlElement | null {\n const tokens = selector.split(/\\s+/).filter(Boolean);\n let current: Array<XmlElement | XmlDocument> = [root];\n\n for (const token of tokens) {\n const localName = selectorLocalName(token);\n const next: XmlElement[] = [];\n for (const node of current) {\n next.push(...Array.from(node.getElementsByTagNameNS(\"*\", localName)));\n }\n current = next;\n }\n\n return (current[0] as XmlElement | undefined) ?? null;\n}\n\nfunction selectorLocalName(token: string): string {\n if (token.includes(\"|\")) {\n return token.slice(token.lastIndexOf(\"|\") + 1);\n }\n return token.replace(/\\\\:/g, \":\").split(\":\").pop() ?? token;\n}\n\nfunction defineMethod(target: object, name: string, value: (...args: never[]) => unknown): void {\n Object.defineProperty(target, name, { configurable: true, writable: true, value });\n}\n\nfunction defineGetter(target: object, name: string, get: () => unknown): void {\n if (Object.getOwnPropertyDescriptor(target, name)) {\n return;\n }\n Object.defineProperty(target, name, { configurable: true, get });\n}\n","import type { Converter, ConverterOptions, ConverterResult } from \"../types.ts\";\nimport { decodeText, parseHtmlDocument } from \"../utils/index.ts\";\n\nconst WIKIPEDIA_URL = /^https?:\\/\\/[a-z]{2,3}\\.wikipedia\\.org\\//i;\n\nexport class WikipediaConverter implements Converter {\n async convert(source: Uint8Array, options: ConverterOptions = {}): Promise<ConverterResult> {\n if (\n (options.extension !== \"html\" && options.extension !== \"htm\") ||\n !WIKIPEDIA_URL.test(options.url ?? \"\")\n ) {\n return null;\n }\n\n return parseHtmlDocument(decodeText(source), (document) => {\n document.querySelectorAll(\"script, style\").forEach((element) => {\n element.remove();\n });\n\n const body = document.querySelector(\"div#mw-content-text\");\n const pageTitle = document.querySelector(\"span.mw-page-title-main\")?.textContent?.trim();\n\n const title = pageTitle || document.title || null;\n const node = body || document;\n\n return {\n title: { type: \"metadata\", value: title },\n markdown: { type: \"node\", value: node }\n };\n });\n }\n}\n","import readExcelFile, { type SheetData } from \"read-excel-file/universal\";\nimport type { ConverterOptions, ConverterResult } from \"../types.ts\";\nimport { toArrayBuffer } from \"../utils/index.ts\";\nimport { HtmlConverter } from \"./html.ts\";\n\nexport class XlsxConverter extends HtmlConverter {\n override async convert(source: Uint8Array, options: ConverterOptions): Promise<ConverterResult> {\n if (options.extension !== \"xlsx\") {\n return null;\n }\n\n const sheets = await readExcelFile(toArrayBuffer(source));\n const sections: string[] = [];\n\n for (const { sheet, data } of sheets) {\n const html = sheetToHtml(data);\n if (!html) {\n continue;\n }\n const result = await this.convertHtml(html);\n sections.push(`## ${sheet}\\n${result?.markdown.trim() ?? \"\"}`);\n }\n\n const markdown = sections.join(\"\\n\\n\");\n return {\n title: null,\n markdown\n };\n }\n}\n\nfunction sheetToHtml(rows: SheetData): string {\n const columnCount = rows.reduce((max, row) => Math.max(max, row.length), 0);\n if (!columnCount || rows.length === 0) {\n return \"\";\n }\n\n const htmlRows = rows.map((row) => {\n const cells: string[] = [];\n for (let column = 0; column < columnCount; column++) {\n cells.push(`<td>${escapeHtml(cellText(row[column]))}</td>`);\n }\n return `<tr>${cells.join(\"\")}</tr>`;\n });\n\n return `<html><body><table>${htmlRows.join(\"\")}</table></body></html>`;\n}\n\nfunction cellText(value: unknown): string {\n if (value == null) {\n return \"\";\n }\n if (value instanceof Date) {\n return value.toISOString();\n }\n return String(value);\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\");\n}\n","import type { Document, Element } from \"@xmldom/xmldom\";\nimport { DOMParser } from \"@xmldom/xmldom\";\nimport type { Converter, ConverterOptions, ConverterResult } from \"../types.ts\";\nimport { decodeText, parseHtmlDocument } from \"../utils/index.ts\";\n\nexport class RSSConverter implements Converter {\n async convert(source: Uint8Array, options: ConverterOptions = {}): Promise<ConverterResult> {\n if (\n options.extension !== \"xml\" &&\n options.extension !== \"rss\" &&\n options.extension !== \"atom\"\n ) {\n return null;\n }\n\n const document = new DOMParser().parseFromString(decodeText(source), \"text/xml\");\n if (document.getElementsByTagName(\"rss\").length > 0) {\n return parseRss(document);\n }\n if (document.getElementsByTagName(\"feed\")[0]?.getElementsByTagName(\"entry\").length) {\n return parseAtom(document);\n }\n return null;\n }\n}\n\nfunction parseAtom(document: Document): ConverterResult {\n const root = document.getElementsByTagName(\"feed\")[0];\n if (!root) return null;\n\n const title = getText(root, \"title\");\n const subtitle = getText(root, \"subtitle\");\n const sections = [`# ${title ?? \"Feed\"}`];\n if (subtitle) sections.push(subtitle);\n\n for (const entry of [...root.getElementsByTagName(\"entry\")]) {\n const entryTitle = getText(entry, \"title\");\n const updated = getText(entry, \"updated\");\n const summary = getText(entry, \"summary\");\n const content = getText(entry, \"content\");\n const lines: string[] = [];\n if (entryTitle) lines.push(`## ${entryTitle}`);\n if (updated) lines.push(`Updated on: ${updated}`);\n const node = summary || content;\n if (node) {\n lines.push(\n parseHtmlDocument(node, (document) => ({\n markdown: { type: \"node\", value: document.documentElement }\n })).markdown\n );\n }\n sections.push(lines.join(\"\\n\\n\"));\n }\n\n const markdown = sections.join(\"\\n\\n\");\n return { title, markdown };\n}\n\nfunction parseRss(document: Document): ConverterResult {\n const channel = document.getElementsByTagName(\"rss\")[0]?.getElementsByTagName(\"channel\")[0];\n if (!channel) return null;\n\n const title = getText(channel, \"title\");\n const description = getText(channel, \"description\");\n const sections: string[] = title ? [`# ${title}`] : [];\n if (description) sections.push(description);\n\n for (const item of [...channel.getElementsByTagName(\"item\")]) {\n const itemTitle = getText(item, \"title\");\n const published = getText(item, \"pubDate\");\n const itemDescription = getText(item, \"description\");\n const content = getText(item, \"content:encoded\");\n const lines: string[] = [];\n if (itemTitle) lines.push(`## ${itemTitle}`);\n if (published) lines.push(`Published on: ${published}`);\n const node = itemDescription || content;\n if (node) {\n lines.push(\n parseHtmlDocument(node, (document) => ({\n markdown: { type: \"node\", value: document.documentElement }\n })).markdown\n );\n }\n sections.push(lines.join(\"\\n\\n\"));\n }\n\n const markdown = sections.join(\"\\n\\n\");\n return { title, markdown };\n}\n\nfunction getText(element: Element, tagName: string): string | null {\n const node = element.getElementsByTagName(tagName)[0];\n return node?.textContent?.trim() || null;\n}\n","import type { Converter, ConverterOptions, ConverterResult } from \"../types.ts\";\nimport { decodeText, parseHtmlDocument } from \"../utils/index.ts\";\n\nconst YOUTUBE_URL =\n /^https?:\\/\\/(?:www\\.)?(?:youtube\\.com|youtu\\.be)\\/(?:watch\\?v=|shorts\\/)?([a-zA-Z0-9_-]+)/i;\n\nexport class YouTubeConverter implements Converter {\n async convert(source: Uint8Array, options: ConverterOptions = {}): Promise<ConverterResult> {\n if (\n (options.extension !== \"html\" && options.extension !== \"htm\") ||\n !YOUTUBE_URL.test(options.url ?? \"\")\n ) {\n return null;\n }\n\n return parseHtmlDocument(decodeText(source), (document) => {\n const metadata: Record<string, string> = {};\n\n document.querySelectorAll(\"meta\").forEach((meta) => {\n const content = meta.getAttribute(\"content\");\n const key =\n meta.getAttribute(\"itemprop\") ??\n meta.getAttribute(\"property\") ??\n meta.getAttribute(\"name\");\n if (key && content) {\n metadata[key] = content;\n }\n });\n\n try {\n for (const script of document.querySelectorAll(\"script\")) {\n const content = script.textContent ?? \"\";\n if (!content.includes(\"ytInitialData\")) {\n continue;\n }\n const start = content.indexOf(\"{\");\n const end = content.lastIndexOf(\"}\");\n if (start >= 0 && end > start) {\n const description = findKey(\n JSON.parse(content.slice(start, end + 1)),\n \"attributedDescriptionBodyText\"\n );\n if (isRecord(description) && typeof description.content === \"string\") {\n metadata.description = description.content;\n }\n }\n break;\n }\n } catch {\n // Meta description remains available when the page implementation changes.\n }\n\n const title = first(metadata, [\"title\", \"og:title\", \"name\"]) || document.title || null;\n const lines = [\"# YouTube\"];\n if (title) {\n lines.push(`## ${title}`);\n }\n\n const stats: string[] = [];\n const views = first(metadata, [\"interactionCount\"]);\n const keywords = first(metadata, [\"keywords\"]);\n const runtime = first(metadata, [\"duration\"]);\n if (views) stats.push(`- **Views:** ${views}`);\n if (keywords) stats.push(`- **Keywords:** ${keywords}`);\n if (runtime) stats.push(`- **Runtime:** ${runtime}`);\n if (stats.length > 0) {\n lines.push(`### Video Metadata\\n\\n${stats.join(\"\\n\")}`);\n }\n\n const description = first(metadata, [\"description\", \"og:description\"]);\n if (description) {\n lines.push(`### Description\\n\\n${description}`);\n }\n\n return {\n title: { type: \"metadata\", value: title },\n markdown: { type: \"metadata\", value: lines.join(\"\\n\\n\") }\n };\n });\n }\n}\n\nfunction first(metadata: Record<string, string>, keys: string[]): string | null {\n for (const key of keys) {\n if (metadata[key]) return metadata[key];\n }\n return null;\n}\n\nfunction findKey(value: unknown, key: string): unknown {\n if (Array.isArray(value)) {\n for (const item of value) {\n const match = findKey(item, key);\n if (match !== undefined) return match;\n }\n } else if (isRecord(value)) {\n if (key in value) return value[key];\n for (const item of Object.values(value)) {\n const match = findKey(item, key);\n if (match !== undefined) return match;\n }\n }\n return undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n","import { unzipSync } from \"fflate\";\nimport type { Converter, ConverterOptions, ConverterResult } from \"../types.ts\";\nimport { extensionFromPathname } from \"../utils/index.ts\";\n\nexport class ZipConverter implements Converter {\n async convert(source: Uint8Array, options: ConverterOptions = {}): Promise<ConverterResult> {\n if (options.extension !== \"zip\") {\n return null;\n }\n\n const files = unzipSync(source, { filter: (file) => !file.name.endsWith(\"/\") });\n const converters = options._converters ?? [];\n const zipName = options.url ?? \"archive.zip\";\n const sections = [`Content from the zip file \\`${zipName}\\`:`];\n\n for (const [name, bytes] of Object.entries(files)) {\n const result = await convertEntry(bytes, name, converters, options);\n if (result) {\n sections.push(`## File: ${name}\\n\\n${result.markdown}`);\n }\n }\n\n const markdown = sections.join(\"\\n\\n\");\n return { title: null, markdown };\n }\n}\n\nasync function convertEntry(\n source: Uint8Array,\n name: string,\n converters: Converter[],\n options: ConverterOptions\n): Promise<ConverterResult> {\n const extension = extensionFromPathname(name);\n if (!extension) {\n return null;\n }\n\n const entryOptions: ConverterOptions = {\n ...options,\n extension,\n url: undefined,\n _converters: converters\n };\n\n for (const converter of converters) {\n try {\n const result = await converter.convert(source, entryOptions);\n if (result) {\n return result;\n }\n } catch {\n // Match the original ZipConverter: skip entries that fail conversion.\n }\n }\n\n return null;\n}\n","import * as converters from \"./converters/index.ts\";\nimport type { Converter, ConverterOptions, ConverterResult, ConverterSource } from \"./types.ts\";\nimport { detectExtensions, filenameFromDisposition, isBlob, toUint8Array } from \"./utils/index.ts\";\n\nexport class MarkItDown {\n private readonly converters: Converter[] = [];\n\n constructor() {\n // Order matters: later registrations take precedence, so generic converters come first.\n const ordered = [\n converters.PlainTextConverter,\n converters.HtmlConverter,\n converters.ZipConverter,\n converters.RSSConverter,\n converters.WikipediaConverter,\n converters.YouTubeConverter,\n converters.BingSerpConverter,\n converters.DocxConverter,\n converters.XlsxConverter,\n converters.PptxConverter,\n converters.PdfConverter,\n converters.IpynbConverter\n ];\n for (const converter of ordered) {\n this.registerConverter(new converter());\n }\n }\n\n /** Convert a URL, response, blob, array buffer, data view, or typed array. */\n async convert(source: ConverterSource, options: ConverterOptions = {}): Promise<ConverterResult> {\n if (typeof source === \"string\" || source instanceof URL) {\n return this.convertUrl(source.toString(), options);\n }\n\n if (isResponse(source)) {\n return this.convertResponse(source, options);\n }\n\n const bytes = await toUint8Array(source);\n const extensions = await detectExtensions(bytes, {\n extension: options.extension,\n filename: isBlob(source) && \"name\" in source ? String(source.name) : null,\n urls: [options.url],\n contentType: isBlob(source) ? source.type : null\n });\n\n return this.convertBytes(bytes, extensions, options);\n }\n\n private async convertUrl(\n source: string,\n { fetch: fetchImplementation = globalThis.fetch, ...options }: ConverterOptions\n ): Promise<ConverterResult> {\n const url = new URL(source);\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n throw new Error(`Unsupported URL protocol: ${url.protocol}`);\n }\n if (!fetchImplementation) {\n throw new Error(\"No fetch implementation is available.\");\n }\n\n const response = await fetchImplementation(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch URL: ${url}, status: ${response.status}`);\n }\n\n return this.convertResponse(response, { ...options, url: url.toString() });\n }\n\n private async convertResponse(\n response: Response,\n options: ConverterOptions\n ): Promise<ConverterResult> {\n const bytes = new Uint8Array(await response.arrayBuffer());\n // The requested URL may lack an extension that the redirected one has, or vice versa.\n const extensions = await detectExtensions(bytes, {\n extension: options.extension,\n filename: filenameFromDisposition(response.headers.get(\"content-disposition\")),\n urls: [options.url, response.url],\n contentType: response.headers.get(\"content-type\")\n });\n\n return this.convertBytes(bytes, extensions, {\n ...options,\n url: options.url || response.url || undefined\n });\n }\n\n private async convertBytes(\n source: Uint8Array,\n extensions: string[],\n options: ConverterOptions\n ): Promise<ConverterResult> {\n if (extensions.length === 0) {\n throw new Error(\"Could not determine the file type. Provide `extension` for better results.\");\n }\n\n let lastError: unknown;\n\n for (const extension of extensions) {\n for (const converter of this.converters) {\n try {\n const result = await converter.convert(source, {\n ...options,\n extension,\n _converters: this.converters\n });\n if (result) {\n result.markdown = result.markdown\n .replace(/\\r\\n|\\r|\\n/g, \"\\n\")\n .trim()\n .replace(/\\n{3,}/g, \"\\n\\n\");\n return result;\n }\n } catch (error) {\n if (options.debug) {\n console.error(\"Converter threw error:\", error);\n }\n lastError = error;\n }\n }\n }\n\n const formats = extensions.join(\", \");\n\n if (lastError) {\n throw new Error(`Could not convert ${formats} to Markdown: ${String(lastError)}`);\n }\n\n throw new Error(`Unsupported file type: ${formats}.`);\n }\n\n private registerConverter(converter: Converter): void {\n this.converters.unshift(converter);\n }\n}\n\nfunction isResponse(value: unknown): value is Response {\n return typeof Response !== \"undefined\" && value instanceof Response;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["escapeHtml","XmlElement","XmlDocument","XmlNode","converters.PlainTextConverter","converters.HtmlConverter","converters.ZipConverter","converters.RSSConverter","converters.WikipediaConverter","converters.YouTubeConverter","converters.BingSerpConverter","converters.DocxConverter","converters.XlsxConverter","converters.PptxConverter","converters.PdfConverter","converters.IpynbConverter"],"sources":["../src/utils/bytes.ts","../src/utils/turndown.ts","../src/utils/html.ts","../src/utils/mime.ts","../src/converters/bingserp.ts","../src/converters/html.ts","../src/converters/docx.ts","../src/converters/ipynb.ts","../src/converters/pdf.ts","../src/converters/plain-text.ts","../src/converters/pptx.ts","../src/converters/wikipedia.ts","../src/converters/xlsx.ts","../src/converters/xml-rss-atom.ts","../src/converters/youtube.ts","../src/converters/zip.ts","../src/markitdown.ts"],"sourcesContent":["import type { ByteSource } from \"../types.ts\";\n\nexport async function toUint8Array(source: ByteSource): Promise<Uint8Array> {\n if (source instanceof Uint8Array) {\n return source;\n }\n\n if (isBlob(source)) {\n return new Uint8Array(await source.arrayBuffer());\n }\n\n if (ArrayBuffer.isView(source)) {\n return new Uint8Array(source.buffer, source.byteOffset, source.byteLength);\n }\n\n return new Uint8Array(source);\n}\n\nexport function toArrayBuffer(source: Uint8Array): ArrayBuffer {\n return source.slice().buffer;\n}\n\nexport function decodeText(source: Uint8Array): string {\n return new TextDecoder().decode(source);\n}\n\nexport function isBlob(value: unknown): value is Blob {\n return typeof Blob !== \"undefined\" && value instanceof Blob;\n}\n","import TurndownPluginGfm from \"@truto/turndown-plugin-gfm\";\nimport TurndownService from \"turndown\";\n\nexport class Turndown {\n convertSoup(document: string | Node): string {\n const service = new TurndownService({ headingStyle: \"atx\" });\n service.use(TurndownPluginGfm);\n\n service.addRule(\"anchor tags\", {\n filter: [\"a\"],\n replacement(content, node) {\n if (!content) return \"\";\n\n const prefix = content.startsWith(\" \") ? \" \" : \"\";\n const suffix = content.endsWith(\" \") ? \" \" : \"\";\n const text = content.trim().replace(/\\n\\n.*/g, \"\");\n if (!text) return \"\";\n\n const element = node as unknown as Element;\n const href = element.getAttribute(\"href\");\n let title = element.getAttribute(\"title\") ?? \"\";\n if (!href) return `${prefix}${text}${suffix}`;\n\n try {\n const url = new URL(href);\n if (url.protocol !== \"https:\" && url.protocol !== \"http:\") {\n return `${prefix}${text}${suffix}`;\n }\n } catch {\n if (\n !href.startsWith(\"/\") &&\n !href.startsWith(\"#\") &&\n !href.startsWith(\"./\") &&\n !href.startsWith(\"../\")\n ) {\n return `${prefix}${text}${suffix}`;\n }\n }\n\n if (text.replace(/\\\\_/g, \"_\") === href && !title) {\n return `<${href}>`;\n }\n if (!title) title = href;\n return `${prefix}[${text}](${href}${title ? ` \"${title}\"` : \"\"})${suffix}`;\n }\n });\n\n service.addRule(\"img tags\", {\n filter: [\"img\"],\n replacement(_content, node) {\n const element = node as unknown as Element;\n const alt = element.getAttribute(\"alt\") ?? \"\";\n let source = element.getAttribute(\"src\") ?? \"\";\n const title = element.getAttribute(\"title\");\n if (source.startsWith(\"data:\")) {\n source = `${source.split(\",\", 1)[0]}...`;\n }\n return ``;\n }\n });\n\n return service.turndown(serializeNode(document));\n }\n}\n\n/**\n * Turndown and its GFM plugin rely on DOM APIs (e.g. `HTMLTableElement.rows`, `Element.closest`)\n * that linkedom does not implement, which silently drops content such as tables. Serializing\n * lets Turndown re-parse the markup with its own spec-compliant DOM.\n */\nfunction serializeNode(node: string | Node): string {\n if (typeof node === \"string\") {\n return node;\n }\n if (node.nodeType === node.DOCUMENT_NODE) {\n return (node as Document).documentElement?.outerHTML ?? \"\";\n }\n if (node.nodeType === node.ELEMENT_NODE) {\n return (node as Element).outerHTML;\n }\n if (node.nodeType === node.TEXT_NODE) {\n return escapeHtml(node.textContent ?? \"\");\n }\n // Document fragments and other containers.\n return [...node.childNodes].map(serializeNode).join(\"\");\n}\n\nfunction escapeHtml(value: string): string {\n return value.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\n}\n","import { parseHTML } from \"linkedom\";\nimport { Turndown } from \"./turndown.ts\";\n\nexport type DocumentInput<Keys extends string = string> = {\n [key in Keys]:\n | { type: \"node\"; value: (Node | string)[] | Node | string }\n | { type: \"metadata\"; value: unknown };\n};\n\nexport type DocumentOutput<Input extends DocumentInput> = {\n [key in keyof Input]: Input[key] extends { type: \"node\" }\n ? string\n : Input[key] extends { type: \"metadata\" }\n ? Input[key][\"value\"]\n : never;\n};\n\nexport function parseHtmlDocument<T extends DocumentInput>(\n html: string,\n transform: (document: Document) => T\n): DocumentOutput<T> {\n const document = parseHTML(wrapFragment(html)).document as unknown as Document;\n\n return Object.fromEntries(\n Object.entries(transform(document)).map(([key, value]) => {\n if (value.type === \"node\") {\n const nodes = Array.isArray(value.value) ? value.value : [value.value];\n\n const markdown = nodes\n .map((node) =>\n new Turndown()\n .convertSoup(node)\n .split(/\\n+/)\n .map((line) => line.trim())\n .filter(Boolean)\n .join(\"\\n\\n\")\n )\n .join(\"\\n\\n\");\n\n return [key, markdown];\n }\n\n return [key, value.value];\n })\n ) as DocumentOutput<T>;\n}\n\n/**\n * linkedom only parses complete documents: given a fragment (e.g. mammoth output or an RSS\n * description), it promotes the first element to `documentElement` and drops its siblings\n * from the tree, so wrap fragments in a full document first.\n */\nfunction wrapFragment(html: string): string {\n if (/<html[\\s>]/i.test(html)) {\n return html;\n }\n if (/<(head|body)[\\s>]/i.test(html)) {\n return `<html>${html}</html>`;\n }\n return `<html><head></head><body>${html}</body></html>`;\n}\n","import { fileTypeFromBuffer } from \"file-type\";\nimport { Mime } from \"mime\";\nimport otherTypes from \"mime/types/other.js\";\nimport standardTypes from \"mime/types/standard.js\";\n\nconst mime = new Mime(standardTypes, otherTypes);\n\nexport function extensionFromMime(contentType: string | null | undefined): string | null {\n if (!contentType) return null;\n return extensionNormalized(mime.getExtension(contentType));\n}\n\nexport async function extensionFromBuffer(buffer: Uint8Array): Promise<string | null> {\n const type = await fileTypeFromBuffer(buffer);\n if (!type) return null;\n return extensionNormalized(type.ext);\n}\n\n/**\n * Sniffs text formats that have no magic number. Returns null for binary content, and `txt`\n * for text that is not recognized as anything more specific.\n */\nexport function extensionFromText(buffer: Uint8Array): string | null {\n let text: string;\n try {\n text = new TextDecoder(\"utf-8\", { fatal: true }).decode(buffer);\n } catch {\n return null;\n }\n if (hasBinaryControlCharacters(text)) {\n return null;\n }\n\n const start = text.trimStart().slice(0, 1024).toLowerCase();\n if (start.startsWith(\"<\")) {\n if (/<rss[\\s>]/.test(start)) return \"rss\";\n if (/<feed[\\s>]/.test(start)) return \"atom\";\n if (/^<!doctype html|<(html|head|body)[\\s>]/.test(start)) return \"html\";\n if (start.startsWith(\"<?xml\")) return \"xml\";\n }\n if (start.startsWith(\"{\") && /\"nbformat\"\\s*:/.test(text) && /\"cells\"\\s*:/.test(text)) {\n return \"ipynb\";\n }\n return \"txt\";\n}\n\nfunction hasBinaryControlCharacters(text: string): boolean {\n for (let index = 0; index < text.length; index++) {\n const code = text.charCodeAt(index);\n // Whitespace (tab through carriage return) and escape (ANSI colors) still appear in text.\n if (code < 0x20 && (code < 0x09 || code > 0x0d) && code !== 0x1b) {\n return true;\n }\n }\n return false;\n}\n\nexport function extensionFromPathname(pathname: string): string | null {\n const filename = pathname.split(\"/\").pop() ?? \"\";\n const dot = filename.lastIndexOf(\".\");\n return dot > 0 ? extensionNormalized(filename.slice(dot)) : null;\n}\n\n/** Reads the filename from a Content-Disposition header, preferring the RFC 5987 form. */\nexport function filenameFromDisposition(disposition: string | null | undefined): string | null {\n if (!disposition) return null;\n\n const extended = disposition.match(/filename\\*\\s*=\\s*[\\w-]*'[^']*'([^;]+)/i)?.[1]?.trim();\n if (extended) {\n try {\n return decodeURIComponent(extended);\n } catch {\n return extended;\n }\n }\n\n const plain = disposition.match(/filename\\s*=\\s*(?:\"([^\"]*)\"|([^;]+))/i);\n return (plain?.[1] ?? plain?.[2])?.trim() || null;\n}\n\nexport type FileTypeHints = {\n /** Explicit extension, with or without a leading dot. */\n extension?: string | null;\n /** Filename, e.g. from a `File` or a Content-Disposition header. */\n filename?: string | null;\n /** URLs the content was loaded from, e.g. the requested and redirected URLs. */\n urls?: (string | null | undefined)[];\n /** MIME type, e.g. from a `Blob` or a Content-Type header. */\n contentType?: string | null;\n};\n\n/**\n * Lists candidate extensions for the content, most reliable first: explicit extensions, then\n * names, then declared MIME types, then the content itself.\n */\nexport async function detectExtensions(\n buffer: Uint8Array,\n { extension, filename, urls = [], contentType }: FileTypeHints = {}\n): Promise<string[]> {\n const candidates = [\n extensionNormalized(extension),\n filename ? extensionFromPathname(filename) : null,\n ...urls.map((url) => (url ? extensionFromUrl(url) : null)),\n extensionFromMime(contentType),\n // Content with a magic number is not sniffed as text, so a damaged binary isn't dumped as text.\n (await extensionFromBuffer(buffer)) ?? extensionFromText(buffer)\n ];\n return [...new Set(candidates.filter((candidate): candidate is string => !!candidate))];\n}\n\nfunction extensionFromUrl(url: string): string | null {\n try {\n return extensionFromPathname(decodeURIComponent(new URL(url).pathname));\n } catch {\n return null;\n }\n}\n\nexport function extensionNormalized(extension: string | null | undefined, withDot = false): string {\n if (!extension) {\n return \"\";\n }\n\n const normalized = extension\n .trim()\n .toLowerCase()\n .replace(/^[.-]+/, \"\");\n return withDot ? `.${normalized}` : normalized;\n}\n\nexport function isTextExtension(extension: string): boolean {\n const type = mime.getType(extension);\n if (!type) return false;\n return type.startsWith(\"text/\");\n}\n","import type { Converter, ConverterOptions, ConverterResult } from \"../types.ts\";\nimport { decodeText, parseHtmlDocument } from \"../utils/index.ts\";\n\nconst BING_SEARCH_URL = /^https:\\/\\/www\\.bing\\.com\\/search\\?q=/i;\nconst BASE64_ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\nexport class BingSerpConverter implements Converter {\n async convert(source: Uint8Array, options: ConverterOptions = {}): Promise<ConverterResult> {\n if (\n (options.extension !== \"html\" && options.extension !== \"htm\") ||\n !BING_SEARCH_URL.test(options.url ?? \"\")\n ) {\n return null;\n }\n\n let query = new URL(options.url ?? \"\").searchParams.get(\"q\") || null;\n if (query) query = `Search results for \"${query}\"`;\n\n return parseHtmlDocument(decodeText(source), (document) => {\n document.querySelectorAll(\".tptt\").forEach((element) => {\n if (element.textContent) {\n element.textContent += \" \";\n }\n });\n\n document.querySelectorAll(\".algoSlug_icon\").forEach((element) => {\n element.remove();\n });\n\n return {\n title: {\n type: \"metadata\",\n value: query || document.title || null\n },\n markdown: {\n type: \"node\",\n value: [...document.querySelectorAll(\".b_algo\")].map((result) => {\n result.querySelectorAll(\"a[href]\").forEach((anchor) => {\n const href = anchor.getAttribute(\"href\");\n if (!href) {\n return;\n }\n\n try {\n const encoded = new URL(href, options.url ?? \"\").searchParams.get(\"u\");\n if (encoded) {\n anchor.setAttribute(\"href\", decodeBingUrl(encoded));\n }\n } catch {\n // Preserve malformed links as they appeared in the source document.\n }\n });\n\n return result;\n })\n }\n };\n });\n }\n}\n\nfunction decodeBingUrl(encoded: string): string {\n const input = encoded.slice(2).replace(/-/g, \"+\").replace(/_/g, \"/\").replace(/=+$/, \"\");\n const bytes: number[] = [];\n let bits = 0;\n let bitCount = 0;\n\n for (const character of input) {\n const value = BASE64_ALPHABET.indexOf(character);\n if (value < 0) {\n return encoded;\n }\n bits = (bits << 6) | value;\n bitCount += 6;\n if (bitCount >= 8) {\n bitCount -= 8;\n bytes.push((bits >> bitCount) & 0xff);\n }\n }\n\n return new TextDecoder().decode(new Uint8Array(bytes));\n}\n","import type { Converter, ConverterOptions, ConverterResult } from \"../types.ts\";\nimport { decodeText, parseHtmlDocument } from \"../utils/index.ts\";\n\nexport class HtmlConverter<Options = unknown> implements Converter<Options> {\n async convert(source: Uint8Array, options: ConverterOptions<Options>): Promise<ConverterResult> {\n if (options.extension !== \"html\" && options.extension !== \"htm\") {\n return null;\n }\n\n return this.convertHtml(decodeText(source));\n }\n\n protected async convertHtml(html: string): Promise<ConverterResult> {\n return parseHtmlDocument(html, (document) => {\n const title = document.title || null;\n\n document.querySelectorAll(\"script, style, title\").forEach((element) => {\n element.remove();\n });\n\n return {\n title: { type: \"metadata\", value: title },\n // TODO\n markdown: { type: \"node\", value: document }\n };\n });\n }\n}\n","import mammoth from \"mammoth\";\nimport type { ConverterOptions, ConverterResult } from \"../types.ts\";\nimport { toArrayBuffer } from \"../utils/index.ts\";\nimport { HtmlConverter } from \"./html.ts\";\n\nexport interface MammothOptions {\n mammoth?: NonNullable<Parameters<typeof mammoth.convertToHtml>[1]>;\n}\n\nexport class DocxConverter extends HtmlConverter<MammothOptions> {\n override async convert(\n source: Uint8Array,\n options: ConverterOptions<MammothOptions>\n ): Promise<ConverterResult> {\n if (options.extension !== \"docx\") {\n return null;\n }\n\n let mammothInput: Parameters<typeof mammoth.convertToHtml>[0] = {\n arrayBuffer: toArrayBuffer(source)\n };\n\n if (typeof process !== \"undefined\" && process.versions && process.versions.node) {\n mammothInput = { buffer: Buffer.from(source) };\n }\n\n const mammothOptions: NonNullable<MammothOptions[\"mammoth\"]> = Object.fromEntries(\n Object.entries(options.mammoth ?? {}).flatMap(([key, value]) =>\n value !== undefined ? [[key, value]] : []\n )\n );\n\n const html = await mammoth.convertToHtml(mammothInput, mammothOptions);\n\n return this.convertHtml(html.value);\n }\n}\n","import type { Converter, ConverterOptions, ConverterResult } from \"../types.ts\";\nimport { decodeText } from \"../utils/index.ts\";\n\ntype NotebookCell = {\n cell_type?: string;\n source?: string[];\n};\n\ntype Notebook = {\n cells?: NotebookCell[];\n metadata?: { title?: string };\n};\n\nexport class IpynbConverter implements Converter {\n async convert(source: Uint8Array, options: ConverterOptions = {}): Promise<ConverterResult> {\n if (options.extension !== \"ipynb\") {\n return null;\n }\n\n const notebook = JSON.parse(decodeText(source)) as Notebook;\n const output: string[] = [];\n let title: string | null = notebook.metadata?.title ?? null;\n\n for (const cell of notebook.cells ?? []) {\n const lines = cell.source ?? [];\n if (cell.cell_type === \"markdown\") {\n output.push(lines.join(\"\"));\n title ??=\n lines\n .find((line) => line.startsWith(\"# \"))\n ?.slice(2)\n .trim() ?? null;\n } else if (cell.cell_type === \"code\") {\n output.push(`\\`\\`\\`python\\n${lines.join(\"\")}\\n\\`\\`\\``);\n } else if (cell.cell_type === \"raw\") {\n output.push(`\\`\\`\\`\\n${lines.join(\"\")}\\n\\`\\`\\``);\n }\n }\n\n const markdown = output.join(\"\\n\\n\");\n return { title, markdown };\n }\n}\n","import { extractText, getDocumentProxy, getMeta } from \"unpdf\";\nimport type { Converter, ConverterOptions, ConverterResult } from \"../types.ts\";\n\nexport class PdfConverter implements Converter {\n async convert(source: Uint8Array, options: ConverterOptions): Promise<ConverterResult> {\n if (options.extension !== \"pdf\") {\n return null;\n }\n\n const pdf = await getDocumentProxy(source.slice());\n try {\n const [{ text }, { info }] = await Promise.all([\n extractText(pdf, { mergePages: true }),\n getMeta(pdf)\n ]);\n const title = typeof info.Title === \"string\" && info.Title.trim() ? info.Title : null;\n\n return { title, markdown: text };\n } finally {\n await pdf.loadingTask.destroy();\n }\n }\n}\n","import type { Converter, ConverterOptions, ConverterResult } from \"../types.ts\";\nimport { decodeText, isTextExtension } from \"../utils/index.ts\";\n\nexport class PlainTextConverter implements Converter {\n async convert(source: Uint8Array, options: ConverterOptions = {}): Promise<ConverterResult> {\n if (!isTextExtension(options.extension ?? \"\")) {\n return null;\n }\n\n const content = decodeText(source);\n return { title: null, markdown: content };\n }\n}\n","import { pptxToHtml } from \"@jvmr/pptx-to-html\";\nimport {\n DOMParser,\n Document as XmlDocument,\n Element as XmlElement,\n Node as XmlNode\n} from \"@xmldom/xmldom\";\nimport type { ConverterOptions, ConverterResult } from \"../types.ts\";\nimport { toArrayBuffer } from \"../utils/index.ts\";\nimport { HtmlConverter } from \"./html.ts\";\n\nexport class PptxConverter extends HtmlConverter {\n override async convert(source: Uint8Array, options: ConverterOptions): Promise<ConverterResult> {\n if (options.extension !== \"pptx\") {\n return null;\n }\n\n const slides = await pptxToHtml(toArrayBuffer(source), {\n domParserFactory: createPptxDomParser\n });\n const sections: string[] = [];\n\n for (const [index, html] of slides.entries()) {\n const result = await this.convertHtml(`<html><body>${html}</body></html>`);\n sections.push(`<!-- Slide number: ${index + 1} -->\\n${result?.markdown.trim() ?? \"\"}`);\n }\n\n const markdown = sections.join(\"\\n\\n\");\n return {\n title: null,\n markdown\n };\n }\n}\n\nfunction createPptxDomParser(): { parseFromString(xml: string, mime: string): Document } {\n if (typeof globalThis.DOMParser === \"function\") {\n return new globalThis.DOMParser();\n }\n\n patchXmlDom();\n return new DOMParser() as unknown as {\n parseFromString(xml: string, mime: string): Document;\n };\n}\n\nlet xmlDomPatched = false;\n\nfunction patchXmlDom(): void {\n if (xmlDomPatched) {\n return;\n }\n xmlDomPatched = true;\n\n defineMethod(XmlElement.prototype, \"querySelector\", querySelector);\n defineMethod(XmlElement.prototype, \"querySelectorAll\", querySelectorAll);\n defineMethod(XmlDocument.prototype, \"querySelector\", querySelector);\n defineMethod(XmlDocument.prototype, \"querySelectorAll\", querySelectorAll);\n\n defineGetter(XmlElement.prototype, \"children\", function (this: XmlElement) {\n return [...this.childNodes].filter((node) => node.nodeType === 1);\n });\n defineGetter(XmlNode.prototype, \"parentElement\", function (this: XmlNode) {\n const parent = this.parentNode;\n return parent?.nodeType === 1 ? parent : null;\n });\n}\n\nfunction querySelector(this: XmlElement | XmlDocument, selector: string): XmlElement | null {\n for (const group of selector.split(\",\")) {\n const match = queryByPath(this, group.trim());\n if (match) {\n return match;\n }\n }\n return null;\n}\n\nfunction querySelectorAll(): XmlElement[] {\n return [];\n}\n\nfunction queryByPath(root: XmlElement | XmlDocument, selector: string): XmlElement | null {\n const tokens = selector.split(/\\s+/).filter(Boolean);\n let current: Array<XmlElement | XmlDocument> = [root];\n\n for (const token of tokens) {\n const localName = selectorLocalName(token);\n const next: XmlElement[] = [];\n for (const node of current) {\n next.push(...Array.from(node.getElementsByTagNameNS(\"*\", localName)));\n }\n current = next;\n }\n\n return (current[0] as XmlElement | undefined) ?? null;\n}\n\nfunction selectorLocalName(token: string): string {\n if (token.includes(\"|\")) {\n return token.slice(token.lastIndexOf(\"|\") + 1);\n }\n return token.replace(/\\\\:/g, \":\").split(\":\").pop() ?? token;\n}\n\nfunction defineMethod(target: object, name: string, value: (...args: never[]) => unknown): void {\n Object.defineProperty(target, name, { configurable: true, writable: true, value });\n}\n\nfunction defineGetter(target: object, name: string, get: () => unknown): void {\n if (Object.getOwnPropertyDescriptor(target, name)) {\n return;\n }\n Object.defineProperty(target, name, { configurable: true, get });\n}\n","import type { Converter, ConverterOptions, ConverterResult } from \"../types.ts\";\nimport { decodeText, parseHtmlDocument } from \"../utils/index.ts\";\n\nconst WIKIPEDIA_URL = /^https?:\\/\\/[a-z]{2,3}\\.wikipedia\\.org\\//i;\n\nexport class WikipediaConverter implements Converter {\n async convert(source: Uint8Array, options: ConverterOptions = {}): Promise<ConverterResult> {\n if (\n (options.extension !== \"html\" && options.extension !== \"htm\") ||\n !WIKIPEDIA_URL.test(options.url ?? \"\")\n ) {\n return null;\n }\n\n return parseHtmlDocument(decodeText(source), (document) => {\n document.querySelectorAll(\"script, style\").forEach((element) => {\n element.remove();\n });\n\n const body = document.querySelector(\"div#mw-content-text\");\n const pageTitle = document.querySelector(\"span.mw-page-title-main\")?.textContent?.trim();\n\n const title = pageTitle || document.title || null;\n const node = body || document;\n\n return {\n title: { type: \"metadata\", value: title },\n markdown: { type: \"node\", value: node }\n };\n });\n }\n}\n","import readExcelFile, { type SheetData } from \"read-excel-file/universal\";\nimport type { ConverterOptions, ConverterResult } from \"../types.ts\";\nimport { toArrayBuffer } from \"../utils/index.ts\";\nimport { HtmlConverter } from \"./html.ts\";\n\nexport class XlsxConverter extends HtmlConverter {\n override async convert(source: Uint8Array, options: ConverterOptions): Promise<ConverterResult> {\n if (options.extension !== \"xlsx\") {\n return null;\n }\n\n const sheets = await readExcelFile(toArrayBuffer(source));\n const sections: string[] = [];\n\n for (const { sheet, data } of sheets) {\n const html = sheetToHtml(data);\n if (!html) {\n continue;\n }\n const result = await this.convertHtml(html);\n sections.push(`## ${sheet}\\n${result?.markdown.trim() ?? \"\"}`);\n }\n\n const markdown = sections.join(\"\\n\\n\");\n return {\n title: null,\n markdown\n };\n }\n}\n\nfunction sheetToHtml(rows: SheetData): string {\n const columnCount = rows.reduce((max, row) => Math.max(max, row.length), 0);\n if (!columnCount || rows.length === 0) {\n return \"\";\n }\n\n const htmlRows = rows.map((row) => {\n const cells: string[] = [];\n for (let column = 0; column < columnCount; column++) {\n cells.push(`<td>${escapeHtml(cellText(row[column]))}</td>`);\n }\n return `<tr>${cells.join(\"\")}</tr>`;\n });\n\n return `<html><body><table>${htmlRows.join(\"\")}</table></body></html>`;\n}\n\nfunction cellText(value: unknown): string {\n if (value == null) {\n return \"\";\n }\n if (value instanceof Date) {\n return value.toISOString();\n }\n return String(value);\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\");\n}\n","import type { Document, Element } from \"@xmldom/xmldom\";\nimport { DOMParser } from \"@xmldom/xmldom\";\nimport type { Converter, ConverterOptions, ConverterResult } from \"../types.ts\";\nimport { decodeText, parseHtmlDocument } from \"../utils/index.ts\";\n\nexport class RSSConverter implements Converter {\n async convert(source: Uint8Array, options: ConverterOptions = {}): Promise<ConverterResult> {\n if (\n options.extension !== \"xml\" &&\n options.extension !== \"rss\" &&\n options.extension !== \"atom\"\n ) {\n return null;\n }\n\n const document = new DOMParser().parseFromString(decodeText(source), \"text/xml\");\n if (document.getElementsByTagName(\"rss\").length > 0) {\n return parseRss(document);\n }\n if (document.getElementsByTagName(\"feed\")[0]?.getElementsByTagName(\"entry\").length) {\n return parseAtom(document);\n }\n return null;\n }\n}\n\nfunction parseAtom(document: Document): ConverterResult {\n const root = document.getElementsByTagName(\"feed\")[0];\n if (!root) return null;\n\n const title = getText(root, \"title\");\n const subtitle = getText(root, \"subtitle\");\n const sections = [`# ${title ?? \"Feed\"}`];\n if (subtitle) sections.push(subtitle);\n\n for (const entry of [...root.getElementsByTagName(\"entry\")]) {\n const entryTitle = getText(entry, \"title\");\n const updated = getText(entry, \"updated\");\n const summary = getText(entry, \"summary\");\n const content = getText(entry, \"content\");\n const lines: string[] = [];\n if (entryTitle) lines.push(`## ${entryTitle}`);\n if (updated) lines.push(`Updated on: ${updated}`);\n const node = summary || content;\n if (node) {\n lines.push(\n parseHtmlDocument(node, (document) => ({\n markdown: { type: \"node\", value: document.documentElement }\n })).markdown\n );\n }\n sections.push(lines.join(\"\\n\\n\"));\n }\n\n const markdown = sections.join(\"\\n\\n\");\n return { title, markdown };\n}\n\nfunction parseRss(document: Document): ConverterResult {\n const channel = document.getElementsByTagName(\"rss\")[0]?.getElementsByTagName(\"channel\")[0];\n if (!channel) return null;\n\n const title = getText(channel, \"title\");\n const description = getText(channel, \"description\");\n const sections: string[] = title ? [`# ${title}`] : [];\n if (description) sections.push(description);\n\n for (const item of [...channel.getElementsByTagName(\"item\")]) {\n const itemTitle = getText(item, \"title\");\n const published = getText(item, \"pubDate\");\n const itemDescription = getText(item, \"description\");\n const content = getText(item, \"content:encoded\");\n const lines: string[] = [];\n if (itemTitle) lines.push(`## ${itemTitle}`);\n if (published) lines.push(`Published on: ${published}`);\n const node = itemDescription || content;\n if (node) {\n lines.push(\n parseHtmlDocument(node, (document) => ({\n markdown: { type: \"node\", value: document.documentElement }\n })).markdown\n );\n }\n sections.push(lines.join(\"\\n\\n\"));\n }\n\n const markdown = sections.join(\"\\n\\n\");\n return { title, markdown };\n}\n\nfunction getText(element: Element, tagName: string): string | null {\n const node = element.getElementsByTagName(tagName)[0];\n return node?.textContent?.trim() || null;\n}\n","import type { Converter, ConverterOptions, ConverterResult } from \"../types.ts\";\nimport { decodeText, parseHtmlDocument } from \"../utils/index.ts\";\n\nconst YOUTUBE_URL =\n /^https?:\\/\\/(?:www\\.)?(?:youtube\\.com|youtu\\.be)\\/(?:watch\\?v=|shorts\\/)?([a-zA-Z0-9_-]+)/i;\n\nexport class YouTubeConverter implements Converter {\n async convert(source: Uint8Array, options: ConverterOptions = {}): Promise<ConverterResult> {\n if (\n (options.extension !== \"html\" && options.extension !== \"htm\") ||\n !YOUTUBE_URL.test(options.url ?? \"\")\n ) {\n return null;\n }\n\n return parseHtmlDocument(decodeText(source), (document) => {\n const metadata: Record<string, string> = {};\n\n document.querySelectorAll(\"meta\").forEach((meta) => {\n const content = meta.getAttribute(\"content\");\n const key =\n meta.getAttribute(\"itemprop\") ??\n meta.getAttribute(\"property\") ??\n meta.getAttribute(\"name\");\n if (key && content) {\n metadata[key] = content;\n }\n });\n\n try {\n for (const script of document.querySelectorAll(\"script\")) {\n const content = script.textContent ?? \"\";\n if (!content.includes(\"ytInitialData\")) {\n continue;\n }\n const start = content.indexOf(\"{\");\n const end = content.lastIndexOf(\"}\");\n if (start >= 0 && end > start) {\n const description = findKey(\n JSON.parse(content.slice(start, end + 1)),\n \"attributedDescriptionBodyText\"\n );\n if (isRecord(description) && typeof description.content === \"string\") {\n metadata.description = description.content;\n }\n }\n break;\n }\n } catch {\n // Meta description remains available when the page implementation changes.\n }\n\n const title = first(metadata, [\"title\", \"og:title\", \"name\"]) || document.title || null;\n const lines = [\"# YouTube\"];\n if (title) {\n lines.push(`## ${title}`);\n }\n\n const stats: string[] = [];\n const views = first(metadata, [\"interactionCount\"]);\n const keywords = first(metadata, [\"keywords\"]);\n const runtime = first(metadata, [\"duration\"]);\n if (views) stats.push(`- **Views:** ${views}`);\n if (keywords) stats.push(`- **Keywords:** ${keywords}`);\n if (runtime) stats.push(`- **Runtime:** ${runtime}`);\n if (stats.length > 0) {\n lines.push(`### Video Metadata\\n\\n${stats.join(\"\\n\")}`);\n }\n\n const description = first(metadata, [\"description\", \"og:description\"]);\n if (description) {\n lines.push(`### Description\\n\\n${description}`);\n }\n\n return {\n title: { type: \"metadata\", value: title },\n markdown: { type: \"metadata\", value: lines.join(\"\\n\\n\") }\n };\n });\n }\n}\n\nfunction first(metadata: Record<string, string>, keys: string[]): string | null {\n for (const key of keys) {\n if (metadata[key]) return metadata[key];\n }\n return null;\n}\n\nfunction findKey(value: unknown, key: string): unknown {\n if (Array.isArray(value)) {\n for (const item of value) {\n const match = findKey(item, key);\n if (match !== undefined) return match;\n }\n } else if (isRecord(value)) {\n if (key in value) return value[key];\n for (const item of Object.values(value)) {\n const match = findKey(item, key);\n if (match !== undefined) return match;\n }\n }\n return undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n","import { unzipSync } from \"fflate\";\nimport type { Converter, ConverterOptions, ConverterResult } from \"../types.ts\";\nimport { extensionFromPathname } from \"../utils/index.ts\";\n\nexport class ZipConverter implements Converter {\n async convert(source: Uint8Array, options: ConverterOptions = {}): Promise<ConverterResult> {\n if (options.extension !== \"zip\") {\n return null;\n }\n\n const files = unzipSync(source, { filter: (file) => !file.name.endsWith(\"/\") });\n const converters = options._converters ?? [];\n const zipName = options.url ?? \"archive.zip\";\n const sections = [`Content from the zip file \\`${zipName}\\`:`];\n\n for (const [name, bytes] of Object.entries(files)) {\n const result = await convertEntry(bytes, name, converters, options);\n if (result) {\n sections.push(`## File: ${name}\\n\\n${result.markdown}`);\n }\n }\n\n const markdown = sections.join(\"\\n\\n\");\n return { title: null, markdown };\n }\n}\n\nasync function convertEntry(\n source: Uint8Array,\n name: string,\n converters: Converter[],\n options: ConverterOptions\n): Promise<ConverterResult> {\n const extension = extensionFromPathname(name);\n if (!extension) {\n return null;\n }\n\n const entryOptions: ConverterOptions = {\n ...options,\n extension,\n url: undefined,\n _converters: converters\n };\n\n for (const converter of converters) {\n try {\n const result = await converter.convert(source, entryOptions);\n if (result) {\n return result;\n }\n } catch {\n // Match the original ZipConverter: skip entries that fail conversion.\n }\n }\n\n return null;\n}\n","import * as converters from \"./converters/index.ts\";\nimport type { Converter, ConverterOptions, ConverterResult, ConverterSource } from \"./types.ts\";\nimport { detectExtensions, filenameFromDisposition, isBlob, toUint8Array } from \"./utils/index.ts\";\n\nexport class MarkItDown {\n private readonly converters: Converter[] = [];\n\n constructor() {\n // Order matters: later registrations take precedence, so generic converters come first.\n const ordered = [\n converters.PlainTextConverter,\n converters.HtmlConverter,\n converters.ZipConverter,\n converters.RSSConverter,\n converters.WikipediaConverter,\n converters.YouTubeConverter,\n converters.BingSerpConverter,\n converters.DocxConverter,\n converters.XlsxConverter,\n converters.PptxConverter,\n converters.PdfConverter,\n converters.IpynbConverter\n ];\n for (const converter of ordered) {\n this.registerConverter(new converter());\n }\n }\n\n /** Convert a URL, response, blob, array buffer, data view, or typed array. */\n async convert(source: ConverterSource, options: ConverterOptions = {}): Promise<ConverterResult> {\n if (typeof source === \"string\" || source instanceof URL) {\n return this.convertUrl(source.toString(), options);\n }\n\n if (isResponse(source)) {\n return this.convertResponse(source, options);\n }\n\n const bytes = await toUint8Array(source);\n const extensions = await detectExtensions(bytes, {\n extension: options.extension,\n filename: isBlob(source) && \"name\" in source ? String(source.name) : null,\n urls: [options.url],\n contentType: isBlob(source) ? source.type : null\n });\n\n return this.convertBytes(bytes, extensions, options);\n }\n\n private async convertUrl(\n source: string,\n { fetch: fetchImplementation = globalThis.fetch, ...options }: ConverterOptions\n ): Promise<ConverterResult> {\n const url = new URL(source);\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n throw new Error(`Unsupported URL protocol: ${url.protocol}`);\n }\n if (!fetchImplementation) {\n throw new Error(\"No fetch implementation is available.\");\n }\n\n const response = await fetchImplementation(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch URL: ${url}, status: ${response.status}`);\n }\n\n return this.convertResponse(response, { ...options, url: url.toString() });\n }\n\n private async convertResponse(\n response: Response,\n options: ConverterOptions\n ): Promise<ConverterResult> {\n const bytes = new Uint8Array(await response.arrayBuffer());\n // The requested URL may lack an extension that the redirected one has, or vice versa.\n const extensions = await detectExtensions(bytes, {\n extension: options.extension,\n filename: filenameFromDisposition(response.headers.get(\"content-disposition\")),\n urls: [options.url, response.url],\n contentType: response.headers.get(\"content-type\")\n });\n\n return this.convertBytes(bytes, extensions, {\n ...options,\n url: options.url || response.url || undefined\n });\n }\n\n private async convertBytes(\n source: Uint8Array,\n extensions: string[],\n options: ConverterOptions\n ): Promise<ConverterResult> {\n if (extensions.length === 0) {\n throw new Error(\"Could not determine the file type. Provide `extension` for better results.\");\n }\n\n let lastError: unknown;\n\n for (const extension of extensions) {\n for (const converter of this.converters) {\n try {\n const result = await converter.convert(source, {\n ...options,\n extension,\n _converters: this.converters\n });\n if (result) {\n result.markdown = result.markdown\n .replace(/\\r\\n|\\r|\\n/g, \"\\n\")\n .trim()\n .replace(/\\n{3,}/g, \"\\n\\n\");\n return result;\n }\n } catch (error) {\n if (options.debug) {\n console.error(\"Converter threw error:\", error);\n }\n lastError = error;\n }\n }\n }\n\n const formats = extensions.join(\", \");\n\n if (lastError) {\n throw new Error(`Could not convert ${formats} to Markdown: ${String(lastError)}`);\n }\n\n throw new Error(`Unsupported file type: ${formats}.`);\n }\n\n private registerConverter(converter: Converter): void {\n this.converters.unshift(converter);\n }\n}\n\nfunction isResponse(value: unknown): value is Response {\n return typeof Response !== \"undefined\" && value instanceof Response;\n}\n"],"mappings":"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"}
|
package/dist/markitdown.1
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ryangarber/markitdown-ts",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "Convert various file formats to Markdown for indexing, text analysis, and other applications that benefit from structured text. Node-free fork of the TypeScript fork of the original Python library.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"markdown",
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
"@xmldom/xmldom": "^0.9.12",
|
|
64
64
|
"fflate": "^0.8.3",
|
|
65
65
|
"file-type": "^22.2.0",
|
|
66
|
-
"linkedom": "
|
|
66
|
+
"linkedom": "0.18.13",
|
|
67
67
|
"mammoth": "^1.13.0",
|
|
68
68
|
"mime": "^4.1.1",
|
|
69
69
|
"read-excel-file": "^9.3.12",
|