@ai-matrx/office 0.8.8 → 0.8.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/CHANGELOG.md +10 -1
  2. package/dist/{chunk-5JAZ32SX.js → chunk-2X3KR6Y4.js} +2 -2
  3. package/dist/{chunk-5T2M6LSI.js → chunk-455FSVQN.js} +1 -1
  4. package/dist/chunk-455FSVQN.js.map +1 -0
  5. package/dist/{chunk-47MIGBMH.js → chunk-DY5TGHBI.js} +2 -2
  6. package/dist/{chunk-47MIGBMH.js.map → chunk-DY5TGHBI.js.map} +1 -1
  7. package/dist/{chunk-556EUPET.cjs → chunk-HX5TXQIX.cjs} +7 -7
  8. package/dist/{chunk-556EUPET.cjs.map → chunk-HX5TXQIX.cjs.map} +1 -1
  9. package/dist/{chunk-MQB2ZK2F.cjs → chunk-NSU6EVJK.cjs} +6 -6
  10. package/dist/{chunk-MQB2ZK2F.cjs.map → chunk-NSU6EVJK.cjs.map} +1 -1
  11. package/dist/{chunk-QZE7HBZB.cjs → chunk-O6F2NGLW.cjs} +1 -1
  12. package/dist/{chunk-QZE7HBZB.cjs.map → chunk-O6F2NGLW.cjs.map} +1 -1
  13. package/dist/{chunk-UBLEFLES.cjs → chunk-XAIKXHHJ.cjs} +1 -1
  14. package/dist/{chunk-UBLEFLES.cjs.map → chunk-XAIKXHHJ.cjs.map} +1 -1
  15. package/dist/{chunk-Z247F527.js → chunk-Y24EYKSD.js} +1 -1
  16. package/dist/{chunk-Z247F527.js.map → chunk-Y24EYKSD.js.map} +1 -1
  17. package/dist/collab-sheets-transform.cjs.map +1 -1
  18. package/dist/collab-sheets-transform.d.cts +2 -2
  19. package/dist/collab-sheets-transform.d.ts +2 -2
  20. package/dist/collab-sheets-transform.js.map +1 -1
  21. package/dist/core-page-setup-apply.cjs.map +1 -1
  22. package/dist/core-page-setup-apply.d.cts +1 -1
  23. package/dist/core-page-setup-apply.d.ts +1 -1
  24. package/dist/core-page-setup-apply.js.map +1 -1
  25. package/dist/core.cjs.map +1 -1
  26. package/dist/core.d.cts +1 -1
  27. package/dist/core.d.ts +1 -1
  28. package/dist/core.js.map +1 -1
  29. package/dist/docs-io.cjs +9 -9
  30. package/dist/docs-io.js +2 -2
  31. package/dist/docs-tools.cjs +7 -7
  32. package/dist/docs-tools.cjs.map +1 -1
  33. package/dist/docs-tools.d.cts +2 -2
  34. package/dist/docs-tools.d.ts +2 -2
  35. package/dist/docs-tools.js +2 -2
  36. package/dist/docs-tools.js.map +1 -1
  37. package/dist/docs.cjs +5 -5
  38. package/dist/docs.cjs.map +1 -1
  39. package/dist/docs.d.cts +1 -1
  40. package/dist/docs.d.ts +1 -1
  41. package/dist/docs.js +3 -3
  42. package/dist/docs.js.map +1 -1
  43. package/dist/{document-page-style-BFLrgdLI.d.cts → document-page-style-6yKEDjHE.d.cts} +2 -2
  44. package/dist/{document-page-style-BFLrgdLI.d.ts → document-page-style-6yKEDjHE.d.ts} +2 -2
  45. package/dist/{matrxImagePorts-JDFYE4QI.cjs → matrxImagePorts-46SGQTLN.cjs} +1 -1
  46. package/dist/matrxImagePorts-46SGQTLN.cjs.map +1 -0
  47. package/dist/{matrxImagePorts-VPBBUADM.js → matrxImagePorts-P6SSF25Q.js} +1 -1
  48. package/dist/matrxImagePorts-P6SSF25Q.js.map +1 -0
  49. package/dist/sheets-xlsx.cjs +27 -27
  50. package/dist/sheets-xlsx.cjs.map +1 -1
  51. package/dist/sheets-xlsx.d.cts +3 -3
  52. package/dist/sheets-xlsx.d.ts +3 -3
  53. package/dist/sheets-xlsx.js +3 -3
  54. package/dist/sheets-xlsx.js.map +1 -1
  55. package/dist/sheets.cjs.map +1 -1
  56. package/dist/sheets.d.cts +1 -1
  57. package/dist/sheets.d.ts +1 -1
  58. package/dist/sheets.js.map +1 -1
  59. package/dist/univer-collab.cjs.map +1 -1
  60. package/dist/univer-collab.d.cts +2 -2
  61. package/dist/univer-collab.d.ts +2 -2
  62. package/dist/univer-collab.js.map +1 -1
  63. package/dist/univer-realtime.cjs.map +1 -1
  64. package/dist/univer-realtime.js.map +1 -1
  65. package/dist/univer.cjs.map +1 -1
  66. package/dist/univer.d.cts +6 -6
  67. package/dist/univer.d.ts +6 -6
  68. package/dist/univer.js.map +1 -1
  69. package/dist/xlsx-to-univer-NWCHAWJC.cjs +7 -0
  70. package/dist/{xlsx-to-univer-AQAXU3TC.cjs.map → xlsx-to-univer-NWCHAWJC.cjs.map} +1 -1
  71. package/dist/xlsx-to-univer-YEYX47EE.js +7 -0
  72. package/package.json +4 -4
  73. package/dist/chunk-5T2M6LSI.js.map +0 -1
  74. package/dist/matrxImagePorts-JDFYE4QI.cjs.map +0 -1
  75. package/dist/matrxImagePorts-VPBBUADM.js.map +0 -1
  76. package/dist/xlsx-to-univer-AQAXU3TC.cjs +0 -7
  77. package/dist/xlsx-to-univer-OPMMBWEW.js +0 -7
  78. /package/dist/{chunk-5JAZ32SX.js.map → chunk-2X3KR6Y4.js.map} +0 -0
  79. /package/dist/{xlsx-to-univer-OPMMBWEW.js.map → xlsx-to-univer-YEYX47EE.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/docs/markdown-to-univer-doc.ts","../src/core/document-page-style.ts"],"sourcesContent":["/**\n * markdown-to-univer-doc — convert a markdown string into a Univer\n * `IDocumentData` snapshot that the document editor (preset-docs-core) can\n * hydrate directly.\n *\n * Why this exists: the document system stores opaque Univer `IDocumentData`\n * (see `document-service.ts` + `components/DocumentEditor.tsx`). To send any\n * markdown surface (an assistant message, a note, a scraper result) into a\n * cloud document, we need markdown → IDocumentData. There was no converter, so\n * \"Add to docs\" was a stub. This is the missing primitive — reuse it for every\n * markdown → document export, never re-implement a one-off.\n *\n * The output is RENDERED content, not raw markdown text: `**bold**` becomes a\n * bold text run, `# Heading` becomes a larger bold paragraph, `- item` becomes\n * a bulleted line. The document never contains literal markdown syntax.\n *\n * Univer body model (the part we build):\n * - `dataStream` — the text. `\\r` terminates a paragraph; a trailing `\\n`\n * terminates the (single) section. Mirrors the empty doc\n * `\"\\r\\n\"` shape in DocumentEditor.defaultEmptyDocument().\n * - `paragraphs` — one entry per `\\r`, `startIndex` = the `\\r` offset.\n * - `textRuns` — `{ st, ed, ts }` style overlays on character ranges.\n * - `sectionBreaks` — the trailing `\\n`.\n *\n * Scope: headings, paragraphs, bold/italic/strikethrough/inline-code, links\n * (Univer hyperlink ranges keep the address), unordered/ordered lists, blockquotes, fenced code\n * blocks, horizontal rules, and GFM tables (real Univer tables). Nested\n * emphasis is supported. Anything exotic degrades to plain readable text rather\n * than leaking syntax.\n */\n\nimport { plainTitleFromMarkdown } from \"@ai-matrx/rich-content/utils/plain-title\";\nimport {\n BooleanNumber,\n CustomRangeType,\n ObjectRelativeFromH,\n ObjectRelativeFromV,\n TableAlignmentType,\n TableRowHeightRule,\n TableSizeType,\n TableTextWrapType,\n createParagraphId,\n createSectionId,\n} from \"@univerjs/core\";\nimport type {\n ICustomRange,\n IDocumentData,\n IParagraph,\n ISectionBreak,\n ITextRun,\n ITextStyle,\n} from \"@univerjs/core\";\nimport { LocaleType } from \"@univerjs/presets\";\n\nimport {\n DEFAULT_DOCUMENT_PAGE_STYLE,\n defaultDocumentPageStyle,\n} from \"../core\";\nimport {\n codeSpanText,\n fenceLineKinds,\n findTableEnd,\n mapCodeRanges,\n rowCells,\n tableStartsAt,\n unescapeCellPipes,\n} from \"@ai-matrx/content-ir/source\";\n\n// ─── inline parsing ──────────────────────────────────────────────────────────\n\ninterface InlineStyle {\n bold?: boolean;\n italic?: boolean;\n code?: boolean;\n strike?: boolean;\n /** Link address — becomes a Univer hyperlink range, never just its text. */\n link?: string;\n}\n\ninterface Segment extends InlineStyle {\n text: string;\n /** A picture (`![alt](src)`): `text` holds its alt. */\n image?: string;\n}\n\n// Order matters: `**`/`__` before `*`/`_` so bold wins over italic; code and\n// links are matched atomically. Link target excludes whitespace to avoid\n// swallowing trailing prose.\nconst INLINE_RE =\n /!\\[([^\\]]*)\\]\\(([^)\\s]+)\\)|(\\*\\*|__)([\\s\\S]+?)\\3|(\\*|_)([\\s\\S]+?)\\5|~~([\\s\\S]+?)~~|\\[([^\\]]+)\\]\\(([^)\\s]+)\\)/g;\n\nconst CODE_TOKEN = /\\uE400(\\d+)\\uE401/g;\n\n/**\n * Inline markdown → styled segments. Code spans come from THE one code-range\n * rule (@ai-matrx/content-ir/source) and are held behind placeholders, so the\n * emphasis pattern never reads inside code and code inside **bold** stays code.\n */\nfunction parseInline(text: string, base: InlineStyle = {}): Segment[] {\n const codes: string[] = [];\n const held = text.includes(\"`\")\n ? mapCodeRanges(text, (range, raw) => {\n if (range.kind !== \"span\") return raw;\n codes.push(codeSpanText(raw));\n return `\\uE400${codes.length - 1}\\uE401`;\n })\n : text;\n if (codes.length === 0) return parseStyled(held, base);\n return parseStyled(held, base).flatMap((seg) => {\n const out: Segment[] = [];\n let at = 0;\n for (const m of seg.text.matchAll(CODE_TOKEN)) {\n if ((m.index ?? 0) > at) out.push({ ...seg, text: seg.text.slice(at, m.index) });\n out.push({ ...seg, text: codes[Number(m[1])] ?? \"\", code: true });\n at = (m.index ?? 0) + m[0].length;\n }\n if (at < seg.text.length) out.push({ ...seg, text: seg.text.slice(at) });\n return out.filter((s) => s.text.length > 0);\n });\n}\n\nfunction parseStyled(text: string, base: InlineStyle = {}): Segment[] {\n const segs: Segment[] = [];\n let last = 0;\n let m: RegExpExecArray | null;\n const re = new RegExp(INLINE_RE.source, \"g\");\n while ((m = re.exec(text)) !== null) {\n if (m.index > last) segs.push({ text: text.slice(last, m.index), ...base });\n if (m[2] !== undefined) {\n // Picture → its own segment (alt as text); the builder decides how it lands.\n segs.push({ ...base, text: m[1] || \"image\", image: m[2] });\n } else if (m[3] !== undefined) {\n segs.push(...parseStyled(m[4]!, { ...base, bold: true }));\n } else if (m[5] !== undefined) {\n segs.push(...parseStyled(m[6]!, { ...base, italic: true }));\n } else if (m[7] !== undefined) {\n segs.push(...parseStyled(m[7], { ...base, strike: true }));\n } else if (m[8] !== undefined) {\n // Link → its text carries the address as a hyperlink range.\n segs.push(...parseStyled(m[8], { ...base, link: m[9]! }));\n }\n last = re.lastIndex;\n }\n if (last < text.length) segs.push({ text: text.slice(last), ...base });\n return segs.filter((s) => s.text.length > 0);\n}\n\n// ─── style helpers ───────────────────────────────────────────────────────────\n\nconst HEADING_FONT_SIZE: Record<number, number> = {\n 1: 26,\n 2: 22,\n 3: 18,\n 4: 16,\n 5: 14,\n 6: 13,\n};\n\ninterface ParagraphOpts {\n /** 1-6 → heading; undefined → body text. */\n heading?: number;\n /** Render the whole paragraph in a monospace font (code block lines). */\n mono?: boolean;\n}\n\nfunction buildTextStyle(\n seg: Segment,\n opts: ParagraphOpts,\n): ITextStyle | undefined {\n const ts: ITextStyle = {};\n if (seg.bold || opts.heading) ts.bl = BooleanNumber.TRUE;\n if (seg.italic) ts.it = BooleanNumber.TRUE;\n if (seg.strike) ts.st = { s: BooleanNumber.TRUE };\n if (seg.code || opts.mono) ts.ff = \"monospace\";\n if (opts.heading) ts.fs = HEADING_FONT_SIZE[opts.heading] ?? 16;\n else if (seg.code || opts.mono) ts.fs = 12;\n return Object.keys(ts).length > 0 ? ts : undefined;\n}\n\n// ─── document builder ────────────────────────────────────────────────────────\n\n/** Univer's numeric NamedStyleType.HEADING_1 (HEADING_2..5 follow). */\nconst NAMED_HEADING_1 = 4;\n\nclass DocBuilder {\n private parts: string[] = [];\n private cursor = 0;\n private paragraphs: IParagraph[] = [];\n private paragraphIds = new Set<string>();\n private textRuns: ITextRun[] = [];\n private sectionBreaks: ISectionBreak[] = [];\n private sectionIds = new Set<string>();\n private customRanges: ICustomRange[] = [];\n private tables: NonNullable<NonNullable<IDocumentData[\"body\"]>[\"tables\"]> = [];\n private tableSource: NonNullable<IDocumentData[\"tableSource\"]> = {};\n private customBlocks: { startIndex: number; blockId: string }[] = [];\n private drawings: Record<string, Record<string, unknown>> = {};\n /** Pictures that are not ours (e.g. Google's): kept as a visible link, counted. */\n linkedImages = 0;\n\n /**\n * One picture. Ours (`matrx-file:<id>[#WxH]`) becomes a real inline drawing;\n * any other address is a visible \"alt\" link to it, never dropped.\n */\n private addImage(seg: Segment, opts: ParagraphOpts): void {\n const src = seg.image ?? \"\";\n const own = src.match(/^(matrx-file:[0-9a-f-]+)(?:#(\\d+)x(\\d+))?$/i);\n if (!own) {\n this.linkedImages += 1;\n this.addInline([{ text: seg.text || \"image\", link: src }], opts);\n return;\n }\n const blockId = `img${Object.keys(this.drawings).length}${Math.random().toString(36).slice(2, 6)}`;\n const width = Number(own[2]) || 320;\n const height = Number(own[3]) || 240;\n this.customBlocks.push({ startIndex: this.cursor, blockId });\n this.parts.push(CUSTOM_BLOCK);\n this.cursor += 1;\n this.drawings[blockId] = {\n drawingId: blockId,\n drawingType: 0,\n imageSourceType: \"URL\",\n source: own[1],\n title: seg.text === \"image\" ? \"\" : seg.text,\n description: \"\",\n layoutType: 0,\n wrapText: 0,\n behindDoc: 0,\n distT: 0,\n distB: 0,\n distL: 0,\n distR: 0,\n transform: { left: 0, top: 0, width, height },\n docTransform: {\n size: { width, height },\n angle: 0,\n positionH: { relativeFrom: ObjectRelativeFromH.PAGE, posOffset: 0 },\n positionV: { relativeFrom: ObjectRelativeFromV.PARAGRAPH, posOffset: 0 },\n },\n };\n }\n\n /** Segment text + styles + hyperlink ranges, no paragraph terminator. */\n private addInline(segments: Segment[], opts: ParagraphOpts): void {\n let openLink: string | undefined;\n let linkStart = 0;\n const closeLink = () => {\n if (openLink === undefined) return;\n this.parts.push(LINK_END);\n this.customRanges.push({\n startIndex: linkStart,\n endIndex: this.cursor,\n rangeId: `link-${this.customRanges.length}-${linkStart}`,\n rangeType: CustomRangeType.HYPERLINK,\n properties: { url: openLink },\n });\n this.cursor += 1;\n openLink = undefined;\n };\n for (const seg of segments) {\n if (!seg.text) continue;\n if (seg.image !== undefined) {\n closeLink();\n this.addImage(seg, opts);\n continue;\n }\n if (seg.link !== openLink) {\n closeLink();\n if (seg.link !== undefined) {\n openLink = seg.link;\n linkStart = this.cursor;\n this.parts.push(LINK_START);\n this.cursor += 1;\n }\n }\n const st = this.cursor;\n this.parts.push(seg.text);\n this.cursor += seg.text.length;\n const ts = buildTextStyle(seg, opts);\n if (ts) this.textRuns.push({ st, ed: this.cursor, ts });\n }\n closeLink();\n }\n\n addParagraph(segments: Segment[], opts: ParagraphOpts = {}): void {\n this.addInline(segments, opts);\n // Paragraph terminator.\n this.parts.push(\"\\r\");\n this.paragraphs.push({\n startIndex: this.cursor,\n paragraphId: createParagraphId(this.paragraphIds),\n // A heading is a real heading paragraph (outline, Format > Paragraph styles), not only big bold text.\n ...(opts.heading ? { paragraphStyle: { namedStyleType: NAMED_HEADING_1 + Math.min(opts.heading, 5) - 1 } } : {}),\n });\n this.cursor += 1;\n }\n\n /**\n * A real Univer table (dataStream table tokens + `tables` + `tableSource`),\n * the same shape Insert > Table writes. `rows[r][c]` = that cell's segments.\n */\n addTable(rows: Segment[][][], headerBold: boolean): void {\n const colCount = Math.max(1, ...rows.map((r) => r.length));\n const pageWidth =\n (DEFAULT_DOCUMENT_PAGE_STYLE.pageSize?.width ?? 595) -\n (DEFAULT_DOCUMENT_PAGE_STYLE.marginLeft ?? 90) -\n (DEFAULT_DOCUMENT_PAGE_STYLE.marginRight ?? 90);\n const tableId = cryptoRandomId().replace(/-/g, \"\").slice(0, 6);\n const start = this.cursor;\n this.parts.push(TABLE_START);\n this.cursor += 1;\n rows.forEach((row, r) => {\n this.parts.push(TABLE_ROW_START);\n this.cursor += 1;\n for (let c = 0; c < colCount; c++) {\n this.parts.push(TABLE_CELL_START);\n this.cursor += 1;\n const cell = row[c] ?? [];\n const cellStart = this.cursor;\n this.addInline(cell, {});\n if (r === 0 && headerBold) this.boldRunsSince(cellStart);\n this.parts.push(\"\\r\");\n this.paragraphs.push({\n startIndex: this.cursor,\n paragraphId: createParagraphId(this.paragraphIds),\n paragraphStyle: {\n spaceAbove: { v: 3 },\n lineSpacing: 2,\n spaceBelow: { v: 0 },\n },\n });\n this.cursor += 1;\n this.parts.push(\"\\n\");\n this.sectionBreaks.push({\n startIndex: this.cursor,\n sectionId: createSectionId(this.sectionIds),\n });\n this.cursor += 1;\n this.parts.push(TABLE_CELL_END);\n this.cursor += 1;\n }\n this.parts.push(TABLE_ROW_END);\n this.cursor += 1;\n });\n this.parts.push(TABLE_END);\n this.cursor += 1;\n this.tables.push({ startIndex: start, endIndex: this.cursor, tableId });\n const margin = {\n start: { v: 10 },\n end: { v: 10 },\n top: { v: 5 },\n bottom: { v: 5 },\n };\n this.tableSource[tableId] = {\n tableRows: rows.map(() => ({\n tableCells: Array.from({ length: colCount }, () => ({ margin: { ...margin } })),\n trHeight: { val: { v: 30 }, hRule: TableRowHeightRule.AUTO },\n })),\n tableColumns: Array.from({ length: colCount }, () => ({\n size: { type: TableSizeType.SPECIFIED, width: { v: pageWidth / colCount } },\n })),\n tableId,\n align: TableAlignmentType.START,\n indent: { v: 0 },\n textWrap: TableTextWrapType.NONE,\n position: {\n positionH: { relativeFrom: ObjectRelativeFromH.PAGE, posOffset: 0 },\n positionV: { relativeFrom: ObjectRelativeFromV.PAGE, posOffset: 0 },\n },\n dist: { distB: 0, distL: 0, distR: 0, distT: 0 },\n cellMargin: { ...margin },\n size: { type: TableSizeType.UNSPECIFIED, width: { v: pageWidth } },\n } as NonNullable<IDocumentData[\"tableSource\"]>[string];\n // A table is always followed by a paragraph (Univer's own insert adds one).\n this.addParagraph([]);\n }\n\n /** Header cells: bold every run written since `from` (plain runs get one). */\n private boldRunsSince(from: number): void {\n const end = this.cursor;\n if (end <= from) return;\n const covered = this.textRuns.filter((t) => t.st >= from);\n for (const t of covered) t.ts = { ...t.ts, bl: BooleanNumber.TRUE };\n let at = from;\n const gaps: ITextRun[] = [];\n for (const t of [...covered].sort((a, b) => a.st - b.st)) {\n if (t.st > at) gaps.push({ st: at, ed: t.st, ts: { bl: BooleanNumber.TRUE } });\n at = Math.max(at, t.ed);\n }\n if (at < end) gaps.push({ st: at, ed: end, ts: { bl: BooleanNumber.TRUE } });\n this.textRuns.push(...gaps);\n }\n\n isEmpty(): boolean {\n return this.paragraphs.length === 0;\n }\n\n build(title: string): Partial<IDocumentData> {\n if (this.isEmpty()) {\n // Univer requires at least one paragraph + section break.\n this.parts.push(\"\\r\");\n this.paragraphs.push({\n startIndex: this.cursor,\n paragraphId: createParagraphId(this.paragraphIds),\n });\n this.cursor += 1;\n }\n this.parts.push(\"\\n\");\n const sectionBreaks: ISectionBreak[] = [\n ...this.sectionBreaks,\n {\n startIndex: this.cursor,\n sectionId: createSectionId(this.sectionIds),\n },\n ];\n this.cursor += 1;\n\n const id = cryptoRandomId();\n const drawingIds = Object.keys(this.drawings);\n for (const d of drawingIds) Object.assign(this.drawings[d]!, { unitId: id, subUnitId: id });\n return {\n id,\n locale: LocaleType.EN_US,\n title,\n body: {\n dataStream: this.parts.join(\"\"),\n paragraphs: this.paragraphs,\n textRuns: this.textRuns.sort((a, b) => a.st - b.st),\n sectionBreaks,\n ...(this.customRanges.length ? { customRanges: this.customRanges } : {}),\n ...(this.tables.length ? { tables: this.tables } : {}),\n ...(this.customBlocks.length ? { customBlocks: this.customBlocks } : {}),\n },\n ...(drawingIds.length\n ? { drawings: this.drawings as unknown as IDocumentData[\"drawings\"], drawingsOrder: drawingIds }\n : {}),\n ...(this.tables.length ? { tableSource: this.tableSource } : {}),\n documentStyle: defaultDocumentPageStyle(),\n } as Partial<IDocumentData>;\n }\n}\n\n// Univer's DataStreamTreeTokenType control characters (literals: this module is\n// also loaded where Univer's runtime is not).\nconst TABLE_START = \"\\x1A\";\nconst TABLE_ROW_START = \"\\x1B\";\nconst TABLE_CELL_START = \"\\x1C\";\nconst TABLE_CELL_END = \"\\x1D\";\nconst TABLE_ROW_END = \"\\x0E\";\nconst TABLE_END = \"\\x0F\";\nconst LINK_START = \"\\x1F\";\nconst LINK_END = \"\\x1E\";\nconst CUSTOM_BLOCK = \"\\b\";\n\n// ─── block helpers ───────────────────────────────────────────────────────────\n\n// THE GFM row rule (gfm-table-lines): an escaped `\\|` stays in its cell and\n// shows as `|` (the one cell-pipe rule), exactly as chat and Studio draw it.\nconst splitTableRow = (line: string): string[] => rowCells(line).map(unescapeCellPipes);\n\nfunction addTable(builder: DocBuilder, tableLines: string[]): void {\n const header = splitTableRow(tableLines[0]!);\n // tableLines[1] is the `---|---` separator — skip it.\n const body = tableLines\n .slice(2)\n .map(splitTableRow)\n .filter((r) => r.some((c) => c.length > 0));\n const toCells = (cells: string[]): Segment[][] => cells.map((cell) => parseInline(cell));\n builder.addTable([toCells(header), ...body.map(toCells)], true);\n}\n\n/**\n * Remove reasoning/thinking blocks so they never leak into the document.\n * Defensive — most callers pass already-flattened text, but a raw markdown\n * source could still carry `<think>` / `<thinking>` tags.\n */\nfunction stripThinking(markdown: string): string {\n return markdown\n .replace(/<think(?:ing)?>[\\s\\S]*?<\\/think(?:ing)?>/gi, \"\")\n .trim();\n}\n\nfunction cryptoRandomId(): string {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) {\n return crypto.randomUUID();\n }\n return `doc-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\n// ─── public API ──────────────────────────────────────────────────────────────\n\n/**\n * Convert markdown to a Univer `IDocumentData` snapshot. Pure — no I/O. Pass\n * the result straight to `saveDocumentSnapshot`.\n */\nexport function markdownToUniverDoc(\n markdown: string,\n title = \"Untitled document\",\n): Partial<IDocumentData> {\n const builder = new DocBuilder();\n const cleaned = stripThinking(markdown ?? \"\")\n .replace(/\\r\\n/g, \"\\n\")\n .replace(/\\r/g, \"\\n\");\n const lines = cleaned.split(\"\\n\");\n // Fenced code by THE one code-range rule (@ai-matrx/content-ir/source).\n const kinds = fenceLineKinds(cleaned);\n\n let i = 0;\n let paragraphBuf: string[] = [];\n\n const flushParagraph = () => {\n if (paragraphBuf.length === 0) return;\n const text = paragraphBuf.join(\" \").trim();\n if (text) builder.addParagraph(parseInline(text));\n paragraphBuf = [];\n };\n\n while (i < lines.length) {\n const line = lines[i]!;\n const trimmed = line.trim();\n\n // Blank line — paragraph boundary.\n if (!trimmed) {\n flushParagraph();\n i++;\n continue;\n }\n\n // Fenced code block.\n if (kinds[i] === \"open\") {\n flushParagraph();\n i++;\n const code: string[] = [];\n while (i < lines.length && kinds[i] === \"body\") {\n code.push(lines[i]!);\n i++;\n }\n if (kinds[i] === \"close\") i++; // consume the closing fence\n for (const c of code) {\n builder.addParagraph([{ text: c.length ? c : \" \", code: true }], {\n mono: true,\n });\n }\n continue;\n }\n\n // ATX heading.\n const heading = trimmed.match(/^(#{1,6})\\s+(.*)$/);\n if (heading) {\n flushParagraph();\n builder.addParagraph(parseInline(heading[2]!.trim()), {\n heading: heading[1]!.length,\n });\n i++;\n continue;\n }\n\n // Horizontal rule.\n if (/^(\\s*[-*_]\\s*){3,}$/.test(trimmed) && /^[\\s\\-*_]+$/.test(trimmed)) {\n flushParagraph();\n builder.addParagraph([{ text: \"\\u2014\".repeat(24) }]);\n i++;\n continue;\n }\n\n // GFM table (THE rule, gfm-table-lines): a header — with or without edge\n // pipes — immediately followed by its delimiter row.\n if (tableStartsAt(lines, i)) {\n flushParagraph();\n const tableLines: string[] = [];\n const tableEnd = findTableEnd(lines, i);\n while (i < tableEnd) {\n tableLines.push(lines[i]!.trim());\n i++;\n }\n addTable(builder, tableLines);\n continue;\n }\n\n // Blockquote.\n const quote = trimmed.match(/^>\\s?(.*)$/);\n if (quote) {\n flushParagraph();\n builder.addParagraph(parseInline(quote[1]!), {});\n i++;\n continue;\n }\n\n // List item (ordered or unordered, with nesting by indent).\n const list = line.match(/^(\\s*)([-*+]|\\d+[.)])\\s+(.*)$/);\n if (list) {\n flushParagraph();\n const indent = list[1]!.replace(/\\t/g, \" \").length;\n const level = Math.min(Math.floor(indent / 2), 5);\n const ordered = /\\d/.test(list[2]!);\n const marker = ordered ? `${list[2]!.replace(/[.)]$/, \"\")}.` : \"\\u2022\";\n const prefix = `${\" \".repeat(level)}${marker} `;\n builder.addParagraph([{ text: prefix }, ...parseInline(list[3]!)]);\n i++;\n continue;\n }\n\n // Default — accumulate into the current paragraph.\n paragraphBuf.push(trimmed);\n i++;\n }\n\n flushParagraph();\n return builder.build(title);\n}\n\n/**\n * Derive a sensible document name from markdown: first heading, else first\n * non-empty line, trimmed of markdown syntax. Falls back to a dated default.\n */\nexport function deriveDocumentName(markdown: string): string {\n const cleaned = stripThinking(markdown ?? \"\");\n // First heading, else the first line — through the ONE plain-text title\n // projection (components/markdown-core/plain-title.ts).\n const lines = cleaned.split(\"\\n\");\n const heading = lines.find((l) => /^\\s{0,3}#{1,6}\\s+/.test(l));\n const plain = plainTitleFromMarkdown(heading ?? cleaned);\n if (!plain) {\n return `Document ${new Date().toLocaleDateString()}`;\n }\n return plainTitleFromMarkdown(plain, { maxLength: 80 });\n}\n","/**\n * The ONE page geometry every Matrx cloud document is laid out with.\n *\n * Univer lays a document out inside `documentStyle.pageSize`. With no pageSize\n * the docs renderer has no page box at all: text never wraps (it runs off the\n * right edge) and the vertical extent is unbounded, so the docs viewport\n * reports nothing to scroll — the wheel is swallowed and the page sits frozen\n * at the top. Every writer of a Univer snapshot MUST stamp this style.\n *\n * Consumers: `DocumentEditor` (new empty doc), `markdown-to-univer-doc`\n * (markdown import), and `sanitizeUniverDocSnapshot` (recovery for snapshots\n * that reached storage without it — notably `origin='agent'` writes).\n */\nimport type { DocumentFlavor, IDocumentData, PageOrientType } from \"@univerjs/core\";\n\n// Univer's enum values, written out: this file is read by tests and the markdown importer, which must not\n// pull Univer's runtime in just for four numbers (guarded by the page-style test).\nconst TRADITIONAL = 1 as DocumentFlavor;\nconst MODERN = 2 as DocumentFlavor;\nconst PORTRAIT = 0 as PageOrientType;\nconst LANDSCAPE = 1 as PageOrientType;\n\ntype DocumentStyle = NonNullable<IDocumentData[\"documentStyle\"]>;\n\n/** Univer lays documents out in 96-dpi CSS pixels: one inch is 96 units. */\nexport const PX_PER_INCH = 96;\n\n/** Paper sizes the Page setup dialog offers, in 96-dpi pixels, portrait (width x height). */\nexport const PAPER_SIZES = {\n Letter: { width: 816, height: 1056, label: \"Letter (8.5 x 11 in)\" },\n Legal: { width: 816, height: 1344, label: \"Legal (8.5 x 14 in)\" },\n Tabloid: { width: 1056, height: 1632, label: \"Tabloid (11 x 17 in)\" },\n Executive: { width: 696, height: 1008, label: \"Executive (7.25 x 10.5 in)\" },\n Statement: { width: 528, height: 816, label: \"Statement (5.5 x 8.5 in)\" },\n A3: { width: 1123, height: 1587, label: \"A3 (11.69 x 16.54 in)\" },\n A4: { width: 794, height: 1124, label: \"A4 (8.27 x 11.69 in)\" },\n A5: { width: 559, height: 794, label: \"A5 (5.83 x 8.27 in)\" },\n} as const;\nexport type PaperSizeName = keyof typeof PAPER_SIZES;\n\n/** A real page, like Google Docs: Letter, one-inch margins (624px of text), paginated. */\nexport const DEFAULT_DOCUMENT_PAGE_STYLE: DocumentStyle = {\n pageSize: { width: 816, height: 1056 },\n documentFlavor: TRADITIONAL,\n pageOrient: PORTRAIT,\n marginTop: PX_PER_INCH,\n marginBottom: PX_PER_INCH,\n marginLeft: PX_PER_INCH,\n marginRight: PX_PER_INCH,\n // Univer applies no paragraph spacing to a paginated page by itself; without this every paragraph\n // runs into the next (Google Docs' own default: 1.15 lines, 10px after).\n defaultParagraphStyle: { spaceAbove: { v: 0 }, spaceBelow: { v: 10 }, lineSpacing: 1.15 },\n};\n\n/** Fresh copy — Univer mutates the style it is handed. */\nexport function defaultDocumentPageStyle(): DocumentStyle {\n return {\n ...DEFAULT_DOCUMENT_PAGE_STYLE,\n pageSize: { ...DEFAULT_DOCUMENT_PAGE_STYLE.pageSize! },\n defaultParagraphStyle: { ...DEFAULT_DOCUMENT_PAGE_STYLE.defaultParagraphStyle! },\n };\n}\n\n/**\n * The squeezed geometry every document was stamped with until 2026-10-15: A4 at 72 dpi (595 x 842)\n * with 90/72 margins, in Univer's pageless flavour, so the text column was ~415px with no paper.\n * Pageless was never offered then, so this exact shape is always the old default, never a choice.\n */\nexport function isLegacySqueezedPageStyle(style: DocumentStyle | undefined): boolean {\n const size = style?.pageSize;\n return (\n !!size &&\n size.width === 595 &&\n size.height === 842 &&\n style?.marginLeft === 90 &&\n style?.marginRight === 90 &&\n style?.marginTop === 72 &&\n style?.marginBottom === 72\n );\n}\n\n/** What the Page setup dialog edits. Margins are in inches, like Google's. */\nexport interface PageSetupValues {\n pageless: boolean;\n orientation: \"portrait\" | \"landscape\";\n paper: PaperSizeName;\n marginTop: number;\n marginBottom: number;\n marginLeft: number;\n marginRight: number;\n /** Paper colour, hex. Always a light colour so the black ink stays readable. */\n pageColor: string;\n}\n\nexport const PAGE_COLORS = [\"#ffffff\", \"#fff8e7\", \"#f3f3f3\", \"#e8f0fe\", \"#e6f4ea\", \"#fef7e0\"] as const;\nexport const DEFAULT_PAGE_COLOR = PAGE_COLORS[0];\n/** Key on `documentStyle` carrying the paper colour (Univer paints it from the host's surface theme). */\nexport const PAGE_COLOR_KEY = \"matrxPageColor\";\n\nconst round2 = (n: number) => Math.round(n * 100) / 100;\n\n/** The dialog's values, read from a document's style (missing parts fall back to the default page). */\nexport function pageSetupFromStyle(style: DocumentStyle | undefined): PageSetupValues {\n const landscape = style?.pageOrient === LANDSCAPE;\n const w = style?.pageSize?.width ?? DEFAULT_DOCUMENT_PAGE_STYLE.pageSize!.width!;\n const h = style?.pageSize?.height ?? DEFAULT_DOCUMENT_PAGE_STYLE.pageSize!.height!;\n const [pw, ph] = landscape ? [h, w] : [w, h];\n const paper =\n (Object.keys(PAPER_SIZES) as PaperSizeName[]).find(\n (k) => Math.abs(PAPER_SIZES[k].width - pw) <= 1 && Math.abs(PAPER_SIZES[k].height - ph) <= 1,\n ) ?? \"Letter\";\n const inch = (v: number | undefined) => round2((v ?? PX_PER_INCH) / PX_PER_INCH);\n const color = (style as Record<string, unknown> | undefined)?.[PAGE_COLOR_KEY];\n return {\n pageless: style?.documentFlavor === MODERN,\n orientation: landscape ? \"landscape\" : \"portrait\",\n paper,\n marginTop: inch(style?.marginTop),\n marginBottom: inch(style?.marginBottom),\n marginLeft: inch(style?.marginLeft),\n marginRight: inch(style?.marginRight),\n pageColor: typeof color === \"string\" && color ? color : DEFAULT_PAGE_COLOR,\n };\n}\n\n/** Params for Univer's `docs.command.page-setup` (pageSize is the as-printed size: swapped when landscape). */\nexport function pageSetupCommandParams(v: PageSetupValues) {\n const base = PAPER_SIZES[v.paper];\n const landscape = v.orientation === \"landscape\";\n return {\n documentFlavor: v.pageless ? MODERN : TRADITIONAL,\n pageOrient: landscape ? LANDSCAPE : PORTRAIT,\n pageSize: landscape ? { width: base.height, height: base.width } : { width: base.width, height: base.height },\n marginTop: Math.round(v.marginTop * PX_PER_INCH),\n marginBottom: Math.round(v.marginBottom * PX_PER_INCH),\n marginLeft: Math.round(v.marginLeft * PX_PER_INCH),\n marginRight: Math.round(v.marginRight * PX_PER_INCH),\n };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/docs/markdown-to-univer-doc.ts","../src/core/document-page-style.ts"],"sourcesContent":["/**\n * markdown-to-univer-doc — convert a markdown string into a Univer\n * `IDocumentData` snapshot that the document editor (preset-docs-core) can\n * hydrate directly.\n *\n * Why this exists: the document system stores opaque Univer `IDocumentData`\n * (see `document-service.ts` + `components/DocumentEditor.tsx`). To send any\n * markdown surface (an assistant message, a note, a scraper result) into a\n * cloud document, we need markdown → IDocumentData. There was no converter, so\n * \"Add to docs\" was a stub. This is the missing primitive — reuse it for every\n * markdown → document export, never re-implement a one-off.\n *\n * The output is RENDERED content, not raw markdown text: `**bold**` becomes a\n * bold text run, `# Heading` becomes a larger bold paragraph, `- item` becomes\n * a bulleted line. The document never contains literal markdown syntax.\n *\n * Univer body model (the part we build):\n * - `dataStream` — the text. `\\r` terminates a paragraph; a trailing `\\n`\n * terminates the (single) section. Mirrors the empty doc\n * `\"\\r\\n\"` shape in DocumentEditor.defaultEmptyDocument().\n * - `paragraphs` — one entry per `\\r`, `startIndex` = the `\\r` offset.\n * - `textRuns` — `{ st, ed, ts }` style overlays on character ranges.\n * - `sectionBreaks` — the trailing `\\n`.\n *\n * Scope: headings, paragraphs, bold/italic/strikethrough/inline-code, links\n * (Univer hyperlink ranges keep the address), unordered/ordered lists, blockquotes, fenced code\n * blocks, horizontal rules, and GFM tables (real Univer tables). Nested\n * emphasis is supported. Anything exotic degrades to plain readable text rather\n * than leaking syntax.\n */\n\nimport { plainTitleFromMarkdown } from \"@ai-matrx/rich-content/utils/plain-title\";\nimport {\n BooleanNumber,\n CustomRangeType,\n ObjectRelativeFromH,\n ObjectRelativeFromV,\n TableAlignmentType,\n TableRowHeightRule,\n TableSizeType,\n TableTextWrapType,\n createParagraphId,\n createSectionId,\n} from \"@univerjs/core\";\nimport type {\n ICustomRange,\n IDocumentData,\n IParagraph,\n ISectionBreak,\n ITextRun,\n ITextStyle,\n} from \"@univerjs/core\";\nimport { LocaleType } from \"@univerjs/presets\";\n\nimport {\n DEFAULT_DOCUMENT_PAGE_STYLE,\n defaultDocumentPageStyle,\n} from \"../core\";\nimport {\n codeSpanText,\n fenceLineKinds,\n findTableEnd,\n mapCodeRanges,\n rowCells,\n tableStartsAt,\n unescapeCellPipes,\n} from \"@ai-matrx/content-ir/source\";\n\n// ─── inline parsing ──────────────────────────────────────────────────────────\n\ninterface InlineStyle {\n bold?: boolean;\n italic?: boolean;\n code?: boolean;\n strike?: boolean;\n /** Link address — becomes a Univer hyperlink range, never just its text. */\n link?: string;\n}\n\ninterface Segment extends InlineStyle {\n text: string;\n /** A picture (`![alt](src)`): `text` holds its alt. */\n image?: string;\n}\n\n// Order matters: `**`/`__` before `*`/`_` so bold wins over italic; code and\n// links are matched atomically. Link target excludes whitespace to avoid\n// swallowing trailing prose.\nconst INLINE_RE =\n /!\\[([^\\]]*)\\]\\(([^)\\s]+)\\)|(\\*\\*|__)([\\s\\S]+?)\\3|(\\*|_)([\\s\\S]+?)\\5|~~([\\s\\S]+?)~~|\\[([^\\]]+)\\]\\(([^)\\s]+)\\)/g;\n\nconst CODE_TOKEN = /\\uE400(\\d+)\\uE401/g;\n\n/**\n * Inline markdown → styled segments. Code spans come from THE one code-range\n * rule (@ai-matrx/content-ir/source) and are held behind placeholders, so the\n * emphasis pattern never reads inside code and code inside **bold** stays code.\n */\nfunction parseInline(text: string, base: InlineStyle = {}): Segment[] {\n const codes: string[] = [];\n const held = text.includes(\"`\")\n ? mapCodeRanges(text, (range, raw) => {\n if (range.kind !== \"span\") return raw;\n codes.push(codeSpanText(raw));\n return `\\uE400${codes.length - 1}\\uE401`;\n })\n : text;\n if (codes.length === 0) return parseStyled(held, base);\n return parseStyled(held, base).flatMap((seg) => {\n const out: Segment[] = [];\n let at = 0;\n for (const m of seg.text.matchAll(CODE_TOKEN)) {\n if ((m.index ?? 0) > at) out.push({ ...seg, text: seg.text.slice(at, m.index) });\n out.push({ ...seg, text: codes[Number(m[1])] ?? \"\", code: true });\n at = (m.index ?? 0) + m[0].length;\n }\n if (at < seg.text.length) out.push({ ...seg, text: seg.text.slice(at) });\n return out.filter((s) => s.text.length > 0);\n });\n}\n\nfunction parseStyled(text: string, base: InlineStyle = {}): Segment[] {\n const segs: Segment[] = [];\n let last = 0;\n let m: RegExpExecArray | null;\n const re = new RegExp(INLINE_RE.source, \"g\");\n while ((m = re.exec(text)) !== null) {\n if (m.index > last) segs.push({ text: text.slice(last, m.index), ...base });\n if (m[2] !== undefined) {\n // Picture → its own segment (alt as text); the builder decides how it lands.\n segs.push({ ...base, text: m[1] || \"image\", image: m[2] });\n } else if (m[3] !== undefined) {\n segs.push(...parseStyled(m[4]!, { ...base, bold: true }));\n } else if (m[5] !== undefined) {\n segs.push(...parseStyled(m[6]!, { ...base, italic: true }));\n } else if (m[7] !== undefined) {\n segs.push(...parseStyled(m[7], { ...base, strike: true }));\n } else if (m[8] !== undefined) {\n // Link → its text carries the address as a hyperlink range.\n segs.push(...parseStyled(m[8], { ...base, link: m[9]! }));\n }\n last = re.lastIndex;\n }\n if (last < text.length) segs.push({ text: text.slice(last), ...base });\n return segs.filter((s) => s.text.length > 0);\n}\n\n// ─── style helpers ───────────────────────────────────────────────────────────\n\nconst HEADING_FONT_SIZE: Record<number, number> = {\n 1: 26,\n 2: 22,\n 3: 18,\n 4: 16,\n 5: 14,\n 6: 13,\n};\n\ninterface ParagraphOpts {\n /** 1-6 → heading; undefined → body text. */\n heading?: number;\n /** Render the whole paragraph in a monospace font (code block lines). */\n mono?: boolean;\n}\n\nfunction buildTextStyle(\n seg: Segment,\n opts: ParagraphOpts,\n): ITextStyle | undefined {\n const ts: ITextStyle = {};\n if (seg.bold || opts.heading) ts.bl = BooleanNumber.TRUE;\n if (seg.italic) ts.it = BooleanNumber.TRUE;\n if (seg.strike) ts.st = { s: BooleanNumber.TRUE };\n if (seg.code || opts.mono) ts.ff = \"monospace\";\n if (opts.heading) ts.fs = HEADING_FONT_SIZE[opts.heading] ?? 16;\n else if (seg.code || opts.mono) ts.fs = 12;\n return Object.keys(ts).length > 0 ? ts : undefined;\n}\n\n// ─── document builder ────────────────────────────────────────────────────────\n\n/** Univer's numeric NamedStyleType.HEADING_1 (HEADING_2..5 follow). */\nconst NAMED_HEADING_1 = 4;\n\nclass DocBuilder {\n private parts: string[] = [];\n private cursor = 0;\n private paragraphs: IParagraph[] = [];\n private paragraphIds = new Set<string>();\n private textRuns: ITextRun[] = [];\n private sectionBreaks: ISectionBreak[] = [];\n private sectionIds = new Set<string>();\n private customRanges: ICustomRange[] = [];\n private tables: NonNullable<NonNullable<IDocumentData[\"body\"]>[\"tables\"]> = [];\n private tableSource: NonNullable<IDocumentData[\"tableSource\"]> = {};\n private customBlocks: { startIndex: number; blockId: string }[] = [];\n private drawings: Record<string, Record<string, unknown>> = {};\n /** Pictures that are not ours (e.g. Google's): kept as a visible link, counted. */\n linkedImages = 0;\n\n /**\n * One picture. Ours (`matrx-file:<id>[#WxH]`) becomes a real inline drawing;\n * any other address is a visible \"alt\" link to it, never dropped.\n */\n private addImage(seg: Segment, opts: ParagraphOpts): void {\n const src = seg.image ?? \"\";\n const own = src.match(/^(matrx-file:[0-9a-f-]+)(?:#(\\d+)x(\\d+))?$/i);\n if (!own) {\n this.linkedImages += 1;\n this.addInline([{ text: seg.text || \"image\", link: src }], opts);\n return;\n }\n const blockId = `img${Object.keys(this.drawings).length}${Math.random().toString(36).slice(2, 6)}`;\n const width = Number(own[2]) || 320;\n const height = Number(own[3]) || 240;\n this.customBlocks.push({ startIndex: this.cursor, blockId });\n this.parts.push(CUSTOM_BLOCK);\n this.cursor += 1;\n this.drawings[blockId] = {\n drawingId: blockId,\n drawingType: 0,\n imageSourceType: \"URL\",\n source: own[1],\n title: seg.text === \"image\" ? \"\" : seg.text,\n description: \"\",\n layoutType: 0,\n wrapText: 0,\n behindDoc: 0,\n distT: 0,\n distB: 0,\n distL: 0,\n distR: 0,\n transform: { left: 0, top: 0, width, height },\n docTransform: {\n size: { width, height },\n angle: 0,\n positionH: { relativeFrom: ObjectRelativeFromH.PAGE, posOffset: 0 },\n positionV: { relativeFrom: ObjectRelativeFromV.PARAGRAPH, posOffset: 0 },\n },\n };\n }\n\n /** Segment text + styles + hyperlink ranges, no paragraph terminator. */\n private addInline(segments: Segment[], opts: ParagraphOpts): void {\n let openLink: string | undefined;\n let linkStart = 0;\n const closeLink = () => {\n if (openLink === undefined) return;\n this.parts.push(LINK_END);\n this.customRanges.push({\n startIndex: linkStart,\n endIndex: this.cursor,\n rangeId: `link-${this.customRanges.length}-${linkStart}`,\n rangeType: CustomRangeType.HYPERLINK,\n properties: { url: openLink },\n });\n this.cursor += 1;\n openLink = undefined;\n };\n for (const seg of segments) {\n if (!seg.text) continue;\n if (seg.image !== undefined) {\n closeLink();\n this.addImage(seg, opts);\n continue;\n }\n if (seg.link !== openLink) {\n closeLink();\n if (seg.link !== undefined) {\n openLink = seg.link;\n linkStart = this.cursor;\n this.parts.push(LINK_START);\n this.cursor += 1;\n }\n }\n const st = this.cursor;\n this.parts.push(seg.text);\n this.cursor += seg.text.length;\n const ts = buildTextStyle(seg, opts);\n if (ts) this.textRuns.push({ st, ed: this.cursor, ts });\n }\n closeLink();\n }\n\n addParagraph(segments: Segment[], opts: ParagraphOpts = {}): void {\n this.addInline(segments, opts);\n // Paragraph terminator.\n this.parts.push(\"\\r\");\n this.paragraphs.push({\n startIndex: this.cursor,\n paragraphId: createParagraphId(this.paragraphIds),\n // A heading is a real heading paragraph (outline, Format > Paragraph styles), not only big bold text.\n ...(opts.heading ? { paragraphStyle: { namedStyleType: NAMED_HEADING_1 + Math.min(opts.heading, 5) - 1 } } : {}),\n });\n this.cursor += 1;\n }\n\n /**\n * A real Univer table (dataStream table tokens + `tables` + `tableSource`),\n * the same shape Insert > Table writes. `rows[r][c]` = that cell's segments.\n */\n addTable(rows: Segment[][][], headerBold: boolean): void {\n const colCount = Math.max(1, ...rows.map((r) => r.length));\n const pageWidth =\n (DEFAULT_DOCUMENT_PAGE_STYLE.pageSize?.width ?? 595) -\n (DEFAULT_DOCUMENT_PAGE_STYLE.marginLeft ?? 90) -\n (DEFAULT_DOCUMENT_PAGE_STYLE.marginRight ?? 90);\n const tableId = cryptoRandomId().replace(/-/g, \"\").slice(0, 6);\n const start = this.cursor;\n this.parts.push(TABLE_START);\n this.cursor += 1;\n rows.forEach((row, r) => {\n this.parts.push(TABLE_ROW_START);\n this.cursor += 1;\n for (let c = 0; c < colCount; c++) {\n this.parts.push(TABLE_CELL_START);\n this.cursor += 1;\n const cell = row[c] ?? [];\n const cellStart = this.cursor;\n this.addInline(cell, {});\n if (r === 0 && headerBold) this.boldRunsSince(cellStart);\n this.parts.push(\"\\r\");\n this.paragraphs.push({\n startIndex: this.cursor,\n paragraphId: createParagraphId(this.paragraphIds),\n paragraphStyle: {\n spaceAbove: { v: 3 },\n lineSpacing: 2,\n spaceBelow: { v: 0 },\n },\n });\n this.cursor += 1;\n this.parts.push(\"\\n\");\n this.sectionBreaks.push({\n startIndex: this.cursor,\n sectionId: createSectionId(this.sectionIds),\n });\n this.cursor += 1;\n this.parts.push(TABLE_CELL_END);\n this.cursor += 1;\n }\n this.parts.push(TABLE_ROW_END);\n this.cursor += 1;\n });\n this.parts.push(TABLE_END);\n this.cursor += 1;\n this.tables.push({ startIndex: start, endIndex: this.cursor, tableId });\n const margin = {\n start: { v: 10 },\n end: { v: 10 },\n top: { v: 5 },\n bottom: { v: 5 },\n };\n this.tableSource[tableId] = {\n tableRows: rows.map(() => ({\n tableCells: Array.from({ length: colCount }, () => ({ margin: { ...margin } })),\n trHeight: { val: { v: 30 }, hRule: TableRowHeightRule.AUTO },\n })),\n tableColumns: Array.from({ length: colCount }, () => ({\n size: { type: TableSizeType.SPECIFIED, width: { v: pageWidth / colCount } },\n })),\n tableId,\n align: TableAlignmentType.START,\n indent: { v: 0 },\n textWrap: TableTextWrapType.NONE,\n position: {\n positionH: { relativeFrom: ObjectRelativeFromH.PAGE, posOffset: 0 },\n positionV: { relativeFrom: ObjectRelativeFromV.PAGE, posOffset: 0 },\n },\n dist: { distB: 0, distL: 0, distR: 0, distT: 0 },\n cellMargin: { ...margin },\n size: { type: TableSizeType.UNSPECIFIED, width: { v: pageWidth } },\n } as NonNullable<IDocumentData[\"tableSource\"]>[string];\n // A table is always followed by a paragraph (Univer's own insert adds one).\n this.addParagraph([]);\n }\n\n /** Header cells: bold every run written since `from` (plain runs get one). */\n private boldRunsSince(from: number): void {\n const end = this.cursor;\n if (end <= from) return;\n const covered = this.textRuns.filter((t) => t.st >= from);\n for (const t of covered) t.ts = { ...t.ts, bl: BooleanNumber.TRUE };\n let at = from;\n const gaps: ITextRun[] = [];\n for (const t of [...covered].sort((a, b) => a.st - b.st)) {\n if (t.st > at) gaps.push({ st: at, ed: t.st, ts: { bl: BooleanNumber.TRUE } });\n at = Math.max(at, t.ed);\n }\n if (at < end) gaps.push({ st: at, ed: end, ts: { bl: BooleanNumber.TRUE } });\n this.textRuns.push(...gaps);\n }\n\n isEmpty(): boolean {\n return this.paragraphs.length === 0;\n }\n\n build(title: string): Partial<IDocumentData> {\n if (this.isEmpty()) {\n // Univer requires at least one paragraph + section break.\n this.parts.push(\"\\r\");\n this.paragraphs.push({\n startIndex: this.cursor,\n paragraphId: createParagraphId(this.paragraphIds),\n });\n this.cursor += 1;\n }\n this.parts.push(\"\\n\");\n const sectionBreaks: ISectionBreak[] = [\n ...this.sectionBreaks,\n {\n startIndex: this.cursor,\n sectionId: createSectionId(this.sectionIds),\n },\n ];\n this.cursor += 1;\n\n const id = cryptoRandomId();\n const drawingIds = Object.keys(this.drawings);\n for (const d of drawingIds) Object.assign(this.drawings[d]!, { unitId: id, subUnitId: id });\n return {\n id,\n locale: LocaleType.EN_US,\n title,\n body: {\n dataStream: this.parts.join(\"\"),\n paragraphs: this.paragraphs,\n textRuns: this.textRuns.sort((a, b) => a.st - b.st),\n sectionBreaks,\n ...(this.customRanges.length ? { customRanges: this.customRanges } : {}),\n ...(this.tables.length ? { tables: this.tables } : {}),\n ...(this.customBlocks.length ? { customBlocks: this.customBlocks } : {}),\n },\n ...(drawingIds.length\n ? { drawings: this.drawings as unknown as IDocumentData[\"drawings\"], drawingsOrder: drawingIds }\n : {}),\n ...(this.tables.length ? { tableSource: this.tableSource } : {}),\n documentStyle: defaultDocumentPageStyle(),\n } as Partial<IDocumentData>;\n }\n}\n\n// Univer's DataStreamTreeTokenType control characters (literals: this module is\n// also loaded where Univer's runtime is not).\nconst TABLE_START = \"\\x1A\";\nconst TABLE_ROW_START = \"\\x1B\";\nconst TABLE_CELL_START = \"\\x1C\";\nconst TABLE_CELL_END = \"\\x1D\";\nconst TABLE_ROW_END = \"\\x0E\";\nconst TABLE_END = \"\\x0F\";\nconst LINK_START = \"\\x1F\";\nconst LINK_END = \"\\x1E\";\nconst CUSTOM_BLOCK = \"\\b\";\n\n// ─── block helpers ───────────────────────────────────────────────────────────\n\n// THE GFM row rule (gfm-table-lines): an escaped `\\|` stays in its cell and\n// shows as `|` (the one cell-pipe rule), exactly as chat and Studio draw it.\nconst splitTableRow = (line: string): string[] => rowCells(line).map(unescapeCellPipes);\n\nfunction addTable(builder: DocBuilder, tableLines: string[]): void {\n const header = splitTableRow(tableLines[0]!);\n // tableLines[1] is the `---|---` separator — skip it.\n const body = tableLines\n .slice(2)\n .map(splitTableRow)\n .filter((r) => r.some((c) => c.length > 0));\n const toCells = (cells: string[]): Segment[][] => cells.map((cell) => parseInline(cell));\n builder.addTable([toCells(header), ...body.map(toCells)], true);\n}\n\n/**\n * Remove reasoning/thinking blocks so they never leak into the document.\n * Defensive — most callers pass already-flattened text, but a raw markdown\n * source could still carry `<think>` / `<thinking>` tags.\n */\nfunction stripThinking(markdown: string): string {\n return markdown\n .replace(/<think(?:ing)?>[\\s\\S]*?<\\/think(?:ing)?>/gi, \"\")\n .trim();\n}\n\nfunction cryptoRandomId(): string {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) {\n return crypto.randomUUID();\n }\n return `doc-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\n// ─── public API ──────────────────────────────────────────────────────────────\n\n/**\n * Convert markdown to a Univer `IDocumentData` snapshot. Pure — no I/O. Pass\n * the result straight to `saveDocumentSnapshot`.\n */\nexport function markdownToUniverDoc(\n markdown: string,\n title = \"Untitled document\",\n): Partial<IDocumentData> {\n const builder = new DocBuilder();\n const cleaned = stripThinking(markdown ?? \"\")\n .replace(/\\r\\n/g, \"\\n\")\n .replace(/\\r/g, \"\\n\");\n const lines = cleaned.split(\"\\n\");\n // Fenced code by THE one code-range rule (@ai-matrx/content-ir/source).\n const kinds = fenceLineKinds(cleaned);\n\n let i = 0;\n let paragraphBuf: string[] = [];\n\n const flushParagraph = () => {\n if (paragraphBuf.length === 0) return;\n const text = paragraphBuf.join(\" \").trim();\n if (text) builder.addParagraph(parseInline(text));\n paragraphBuf = [];\n };\n\n while (i < lines.length) {\n const line = lines[i]!;\n const trimmed = line.trim();\n\n // Blank line — paragraph boundary.\n if (!trimmed) {\n flushParagraph();\n i++;\n continue;\n }\n\n // Fenced code block.\n if (kinds[i] === \"open\") {\n flushParagraph();\n i++;\n const code: string[] = [];\n while (i < lines.length && kinds[i] === \"body\") {\n code.push(lines[i]!);\n i++;\n }\n if (kinds[i] === \"close\") i++; // consume the closing fence\n for (const c of code) {\n builder.addParagraph([{ text: c.length ? c : \" \", code: true }], {\n mono: true,\n });\n }\n continue;\n }\n\n // ATX heading.\n const heading = trimmed.match(/^(#{1,6})\\s+(.*)$/);\n if (heading) {\n flushParagraph();\n builder.addParagraph(parseInline(heading[2]!.trim()), {\n heading: heading[1]!.length,\n });\n i++;\n continue;\n }\n\n // Horizontal rule.\n if (/^(\\s*[-*_]\\s*){3,}$/.test(trimmed) && /^[\\s\\-*_]+$/.test(trimmed)) {\n flushParagraph();\n builder.addParagraph([{ text: \"\\u2014\".repeat(24) }]);\n i++;\n continue;\n }\n\n // GFM table (THE rule, gfm-table-lines): a header — with or without edge\n // pipes — immediately followed by its delimiter row.\n if (tableStartsAt(lines, i)) {\n flushParagraph();\n const tableLines: string[] = [];\n const tableEnd = findTableEnd(lines, i);\n while (i < tableEnd) {\n tableLines.push(lines[i]!.trim());\n i++;\n }\n addTable(builder, tableLines);\n continue;\n }\n\n // Blockquote.\n const quote = trimmed.match(/^>\\s?(.*)$/);\n if (quote) {\n flushParagraph();\n builder.addParagraph(parseInline(quote[1]!), {});\n i++;\n continue;\n }\n\n // List item (ordered or unordered, with nesting by indent).\n const list = line.match(/^(\\s*)([-*+]|\\d+[.)])\\s+(.*)$/);\n if (list) {\n flushParagraph();\n const indent = list[1]!.replace(/\\t/g, \" \").length;\n const level = Math.min(Math.floor(indent / 2), 5);\n const ordered = /\\d/.test(list[2]!);\n const marker = ordered ? `${list[2]!.replace(/[.)]$/, \"\")}.` : \"\\u2022\";\n const prefix = `${\" \".repeat(level)}${marker} `;\n builder.addParagraph([{ text: prefix }, ...parseInline(list[3]!)]);\n i++;\n continue;\n }\n\n // Default — accumulate into the current paragraph.\n paragraphBuf.push(trimmed);\n i++;\n }\n\n flushParagraph();\n return builder.build(title);\n}\n\n/**\n * Derive a sensible document name from markdown: first heading, else first\n * non-empty line, trimmed of markdown syntax. Falls back to a dated default.\n */\nexport function deriveDocumentName(markdown: string): string {\n const cleaned = stripThinking(markdown ?? \"\");\n // First heading, else the first line — through the ONE plain-text title\n // projection (components/markdown-core/plain-title.ts).\n const lines = cleaned.split(\"\\n\");\n const heading = lines.find((l) => /^\\s{0,3}#{1,6}\\s+/.test(l));\n const plain = plainTitleFromMarkdown(heading ?? cleaned);\n if (!plain) {\n return `Document ${new Date().toLocaleDateString()}`;\n }\n return plainTitleFromMarkdown(plain, { maxLength: 80 });\n}\n","/**\n * The ONE page geometry every Matrx cloud document is laid out with.\n *\n * Univer lays a document out inside `documentStyle.pageSize`. With no pageSize\n * the docs renderer has no page box at all: text never wraps (it runs off the\n * right edge) and the vertical extent is unbounded, so the docs viewport\n * reports nothing to scroll — the wheel is swallowed and the page sits frozen\n * at the top. Every writer of a Univer snapshot MUST stamp this style.\n *\n * Consumers: `DocumentEditor` (new empty doc), `markdown-to-univer-doc`\n * (markdown import), and `sanitizeUniverDocSnapshot` (recovery for snapshots\n * that reached storage without it — notably `origin='agent'` writes).\n */\nimport type { DocumentFlavor, IDocumentData, PageOrientType } from \"@univerjs/core\";\n\n// Univer's enum values, written out: this file is read by tests and the markdown importer, which must not\n// pull Univer's runtime in just for four numbers (guarded by the page-style test).\nconst TRADITIONAL = 1 as DocumentFlavor;\nconst MODERN = 2 as DocumentFlavor;\nconst PORTRAIT = 0 as PageOrientType;\nconst LANDSCAPE = 1 as PageOrientType;\n\ntype DocumentStyle = NonNullable<IDocumentData[\"documentStyle\"]>;\n\n/** Univer lays documents out in 96-dpi CSS pixels: one inch is 96 units. */\nexport const PX_PER_INCH = 96;\n\n/** Paper sizes the Page setup dialog offers, in 96-dpi pixels, portrait (width x height). */\nexport const PAPER_SIZES = {\n Letter: { width: 816, height: 1056, label: \"Letter (8.5 x 11 in)\" },\n Legal: { width: 816, height: 1344, label: \"Legal (8.5 x 14 in)\" },\n Tabloid: { width: 1056, height: 1632, label: \"Tabloid (11 x 17 in)\" },\n Executive: { width: 696, height: 1008, label: \"Executive (7.25 x 10.5 in)\" },\n Statement: { width: 528, height: 816, label: \"Statement (5.5 x 8.5 in)\" },\n A3: { width: 1123, height: 1587, label: \"A3 (11.69 x 16.54 in)\" },\n A4: { width: 794, height: 1124, label: \"A4 (8.27 x 11.69 in)\" },\n A5: { width: 559, height: 794, label: \"A5 (5.83 x 8.27 in)\" },\n} as const;\nexport type PaperSizeName = keyof typeof PAPER_SIZES;\n\n/** A real page, like Google Docs: Letter, one-inch margins (624px of text), paginated. */\nexport const DEFAULT_DOCUMENT_PAGE_STYLE: DocumentStyle = {\n pageSize: { width: 816, height: 1056 },\n documentFlavor: TRADITIONAL,\n pageOrient: PORTRAIT,\n marginTop: PX_PER_INCH,\n marginBottom: PX_PER_INCH,\n marginLeft: PX_PER_INCH,\n marginRight: PX_PER_INCH,\n // Univer applies no paragraph spacing to a paginated page by itself; without this every paragraph\n // runs into the next (Google Docs' own default: 1.15 lines, 10px after).\n defaultParagraphStyle: { spaceAbove: { v: 0 }, spaceBelow: { v: 10 }, lineSpacing: 1.15 },\n};\n\n/** Fresh copy — Univer mutates the style it is handed. */\nexport function defaultDocumentPageStyle(): DocumentStyle {\n return {\n ...DEFAULT_DOCUMENT_PAGE_STYLE,\n pageSize: { ...DEFAULT_DOCUMENT_PAGE_STYLE.pageSize! },\n defaultParagraphStyle: { ...DEFAULT_DOCUMENT_PAGE_STYLE.defaultParagraphStyle! },\n };\n}\n\n/**\n * The squeezed geometry every document was stamped with until 2026-10-15: A4 at 72 dpi (595 x 842)\n * with 90/72 margins, in Univer's pageless flavour, so the text column was ~415px with no paper.\n * Pageless was never offered then, so this exact shape is always the old default, never a choice.\n */\nexport function isLegacySqueezedPageStyle(style: DocumentStyle | undefined): boolean {\n const size = style?.pageSize;\n return (\n !!size &&\n size.width === 595 &&\n size.height === 842 &&\n style?.marginLeft === 90 &&\n style?.marginRight === 90 &&\n style?.marginTop === 72 &&\n style?.marginBottom === 72\n );\n}\n\n/** What the Page setup dialog edits. Margins are in inches, like Google's. */\nexport interface PageSetupValues {\n pageless: boolean;\n orientation: \"portrait\" | \"landscape\";\n paper: PaperSizeName;\n marginTop: number;\n marginBottom: number;\n marginLeft: number;\n marginRight: number;\n /** Paper color, hex. Always a light color so the black ink stays readable. */\n pageColor: string;\n}\n\nexport const PAGE_COLORS = [\"#ffffff\", \"#fff8e7\", \"#f3f3f3\", \"#e8f0fe\", \"#e6f4ea\", \"#fef7e0\"] as const;\nexport const DEFAULT_PAGE_COLOR = PAGE_COLORS[0];\n/** Key on `documentStyle` carrying the paper color (Univer paints it from the host's surface theme). */\nexport const PAGE_COLOR_KEY = \"matrxPageColor\";\n\nconst round2 = (n: number) => Math.round(n * 100) / 100;\n\n/** The dialog's values, read from a document's style (missing parts fall back to the default page). */\nexport function pageSetupFromStyle(style: DocumentStyle | undefined): PageSetupValues {\n const landscape = style?.pageOrient === LANDSCAPE;\n const w = style?.pageSize?.width ?? DEFAULT_DOCUMENT_PAGE_STYLE.pageSize!.width!;\n const h = style?.pageSize?.height ?? DEFAULT_DOCUMENT_PAGE_STYLE.pageSize!.height!;\n const [pw, ph] = landscape ? [h, w] : [w, h];\n const paper =\n (Object.keys(PAPER_SIZES) as PaperSizeName[]).find(\n (k) => Math.abs(PAPER_SIZES[k].width - pw) <= 1 && Math.abs(PAPER_SIZES[k].height - ph) <= 1,\n ) ?? \"Letter\";\n const inch = (v: number | undefined) => round2((v ?? PX_PER_INCH) / PX_PER_INCH);\n const color = (style as Record<string, unknown> | undefined)?.[PAGE_COLOR_KEY];\n return {\n pageless: style?.documentFlavor === MODERN,\n orientation: landscape ? \"landscape\" : \"portrait\",\n paper,\n marginTop: inch(style?.marginTop),\n marginBottom: inch(style?.marginBottom),\n marginLeft: inch(style?.marginLeft),\n marginRight: inch(style?.marginRight),\n pageColor: typeof color === \"string\" && color ? color : DEFAULT_PAGE_COLOR,\n };\n}\n\n/** Params for Univer's `docs.command.page-setup` (pageSize is the as-printed size: swapped when landscape). */\nexport function pageSetupCommandParams(v: PageSetupValues) {\n const base = PAPER_SIZES[v.paper];\n const landscape = v.orientation === \"landscape\";\n return {\n documentFlavor: v.pageless ? MODERN : TRADITIONAL,\n pageOrient: landscape ? LANDSCAPE : PORTRAIT,\n pageSize: landscape ? { width: base.height, height: base.width } : { width: base.width, height: base.height },\n marginTop: Math.round(v.marginTop * PX_PER_INCH),\n marginBottom: Math.round(v.marginBottom * PX_PER_INCH),\n marginLeft: Math.round(v.marginLeft * PX_PER_INCH),\n marginRight: Math.round(v.marginRight * PX_PER_INCH),\n };\n}\n"],"mappings":"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","names":[]}