reamkit 1.10.0 → 1.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +3 -3
  2. package/dist/esm/core/converter/facade.js +1 -1
  3. package/dist/esm/core/converter/project.js +1 -0
  4. package/dist/esm/core/document-model/index.d.ts +1 -1
  5. package/dist/esm/core/document-model/types.d.ts +23 -0
  6. package/dist/esm/core/font/measure.d.ts +1 -1
  7. package/dist/esm/core/font/measure.js +5 -3
  8. package/dist/esm/core/font/ttf-parser.d.ts +9 -0
  9. package/dist/esm/core/font/ttf-parser.js +27 -2
  10. package/dist/esm/core/fonts/provider.d.ts +2 -1
  11. package/dist/esm/core/fonts/provider.js +2 -1
  12. package/dist/esm/core/fonts/remote-fonts.d.ts +1 -1
  13. package/dist/esm/core/fonts/remote-fonts.js +32 -11
  14. package/dist/esm/core/ir/features.d.ts +1 -0
  15. package/dist/esm/core/ir/features.js +1 -0
  16. package/dist/esm/core/ir/flow.d.ts +3 -1
  17. package/dist/esm/core/line-breaker/greedy.d.ts +2 -0
  18. package/dist/esm/core/line-breaker/greedy.js +67 -0
  19. package/dist/esm/core/line-breaker/index.d.ts +1 -0
  20. package/dist/esm/core/line-breaker/knuth-plass.d.ts +1 -0
  21. package/dist/esm/core/line-breaker/knuth-plass.js +3 -3
  22. package/dist/esm/core/po-helpers.d.ts +2 -0
  23. package/dist/esm/core/po-helpers.js +14 -1
  24. package/dist/esm/core/spreadsheet-model/index.d.ts +1 -1
  25. package/dist/esm/core/spreadsheet-model/types.d.ts +16 -0
  26. package/dist/esm/excel/pivot-table-parser.d.ts +2 -0
  27. package/dist/esm/excel/pivot-table-parser.js +68 -0
  28. package/dist/esm/excel/print-model.js +28 -6
  29. package/dist/esm/excel/xlsx-reader.js +33 -2
  30. package/dist/esm/excel/xlsx-to-pdf.js +1 -1
  31. package/dist/esm/html/html-writer.js +52 -2
  32. package/dist/esm/layout/page-doc.d.ts +3 -0
  33. package/dist/esm/layout/styled-layout.d.ts +10 -1
  34. package/dist/esm/layout/styled-layout.js +156 -15
  35. package/dist/esm/pdf/styled-page-emitter.js +38 -0
  36. package/dist/esm/pptx/pptx-reader.d.ts +2 -0
  37. package/dist/esm/pptx/pptx-reader.js +30 -3
  38. package/dist/esm/pptx/slide-parser.d.ts +8 -2
  39. package/dist/esm/pptx/slide-parser.js +80 -12
  40. package/dist/esm/word/document-parser.d.ts +17 -2
  41. package/dist/esm/word/document-parser.js +178 -18
  42. package/dist/esm/word/docx-reader.js +54 -4
  43. package/dist/esm/word/docx-to-pdf.js +2 -2
  44. package/dist/esm/word/docx-writer.js +84 -1
  45. package/dist/esm/word/drawing-parser.d.ts +7 -0
  46. package/dist/esm/word/drawing-parser.js +13 -0
  47. package/dist/esm/word/index.d.ts +2 -1
  48. package/package.json +1 -1
@@ -23,6 +23,14 @@ var FOOTNOTES_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.word
23
23
  var ENDNOTES_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml";
24
24
  var FOOTNOTES_PART = "word/footnotes.xml";
25
25
  var ENDNOTES_PART = "word/endnotes.xml";
26
+ var REL_COMMENTS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments";
27
+ var COMMENTS_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml";
28
+ var COMMENTS_PART = "word/comments.xml";
29
+ var REL_COMMENTS_EXTENDED = "http://schemas.microsoft.com/office/2011/relationships/commentsExtended";
30
+ var COMMENTS_EXTENDED_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.wordprocessingml.commentsExtended+xml";
31
+ var COMMENTS_EXTENDED_PART = "word/commentsExtended.xml";
32
+ var W14_NS = "http://schemas.microsoft.com/office/word/2010/wordml";
33
+ var W15_NS = "http://schemas.microsoft.com/office/word/2012/wordml";
26
34
  var REL_CHART = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart";
27
35
  var CHART_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.drawingml.chart+xml";
28
36
  var EMU_PER_PT = 12700;
@@ -143,6 +151,8 @@ function writeDocx(flow) {
143
151
  relType: REL_ENDNOTES,
144
152
  target: "endnotes.xml"
145
153
  }, state, losses, docScope, extraParts, extraPartRels);
154
+ const commentParaIds = emitComments(flow.comments, state, losses, docScope, extraParts, extraPartRels);
155
+ emitCommentsExtended(flow.comments, commentParaIds, docScope, extraParts);
146
156
  const partRelationships = [...docScope.rels.length > 0 ? [{
147
157
  sourcePart: "word/document.xml",
148
158
  relationships: docScope.rels
@@ -199,6 +209,78 @@ function emitNotes(notes, cfg, state, losses, docScope, extraParts, extraPartRel
199
209
  targetMode: "Internal"
200
210
  });
201
211
  }
212
+ function paraIdFor(commentId) {
213
+ let h = 2166136261;
214
+ for (let i = 0; i < commentId.length; i++) {
215
+ h ^= commentId.charCodeAt(i);
216
+ h = Math.imul(h, 16777619);
217
+ }
218
+ return (h >>> 0 || 1).toString(16).toUpperCase().padStart(8, "0");
219
+ }
220
+ var PARA_OPEN = "<w:p>";
221
+ function injectParaId(paragraphXmlString, paraId) {
222
+ return paragraphXmlString.startsWith(PARA_OPEN) ? `<w:p w14:paraId="${paraId}">` + paragraphXmlString.slice(5) : paragraphXmlString;
223
+ }
224
+ function emitComments(comments, state, losses, docScope, extraParts, extraPartRels) {
225
+ const paraIds = /* @__PURE__ */ new Map();
226
+ if (!comments || comments.size === 0) return paraIds;
227
+ const scope = newScope();
228
+ const commentXmls = [];
229
+ for (const [id, c] of comments) {
230
+ let lastParaIdx = -1;
231
+ for (let i = 0; i < c.content.length; i++) if (c.content[i].kind === "paragraph") lastParaIdx = i;
232
+ const paraId = lastParaIdx >= 0 ? paraIdFor(id) : void 0;
233
+ const inner = [];
234
+ for (let i = 0; i < c.content.length; i++) if (i === lastParaIdx && paraId !== void 0) {
235
+ const buf = [];
236
+ emitBlock(buf, c.content[i], losses, state, scope);
237
+ inner.push(injectParaId(buf.join(""), paraId));
238
+ } else emitBlock(inner, c.content[i], losses, state, scope);
239
+ if (paraId !== void 0) paraIds.set(id, paraId);
240
+ const attrs = `w:id="${escapeAttr(id)}"` + (c.author !== void 0 ? ` w:author="${escapeAttr(c.author)}"` : "") + (c.date !== void 0 ? ` w:date="${escapeAttr(c.date)}"` : "") + (c.initials !== void 0 ? ` w:initials="${escapeAttr(c.initials)}"` : "");
241
+ commentXmls.push(`<w:comment ${attrs}>${inner.join("") || "<w:p/>"}</w:comment>`);
242
+ }
243
+ const xml = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?><w:comments xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:w14="${W14_NS}">` + commentXmls.join("") + "</w:comments>";
244
+ extraParts.push({
245
+ path: COMMENTS_PART,
246
+ data: encoder.encode(xml),
247
+ contentType: COMMENTS_CONTENT_TYPE
248
+ });
249
+ if (scope.rels.length > 0) extraPartRels.push({
250
+ sourcePart: COMMENTS_PART,
251
+ relationships: scope.rels
252
+ });
253
+ docScope.rels.push({
254
+ id: `rId${++docScope.relSeq}`,
255
+ type: REL_COMMENTS,
256
+ target: "comments.xml",
257
+ targetMode: "Internal"
258
+ });
259
+ return paraIds;
260
+ }
261
+ function emitCommentsExtended(comments, paraIds, docScope, extraParts) {
262
+ if (!comments || paraIds.size === 0) return;
263
+ if (![...comments].some(([id, c]) => paraIds.has(id) && (c.parentId !== void 0 && paraIds.has(c.parentId) || c.done === true))) return;
264
+ const rows = [];
265
+ for (const [id, c] of comments) {
266
+ const pid = paraIds.get(id);
267
+ if (pid === void 0) continue;
268
+ const parentPid = c.parentId !== void 0 ? paraIds.get(c.parentId) : void 0;
269
+ rows.push(`<w15:commentEx w15:paraId="${pid}"` + (parentPid !== void 0 ? ` w15:paraIdParent="${parentPid}"` : "") + ` w15:done="${c.done === true ? "1" : "0"}"/>`);
270
+ }
271
+ const xml = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?><w15:commentsEx xmlns:w15="${W15_NS}">` + rows.join("") + "</w15:commentsEx>";
272
+ extraParts.push({
273
+ path: COMMENTS_EXTENDED_PART,
274
+ data: encoder.encode(xml),
275
+ contentType: COMMENTS_EXTENDED_CONTENT_TYPE
276
+ });
277
+ docScope.rels.push({
278
+ id: `rId${++docScope.relSeq}`,
279
+ type: REL_COMMENTS_EXTENDED,
280
+ target: "commentsExtended.xml",
281
+ targetMode: "Internal"
282
+ });
283
+ }
202
284
  function emitHeadersFooters(flow, section, state, docScope, extraParts, extraPartRels, hfCache, losses) {
203
285
  const refs = {
204
286
  headers: [],
@@ -494,7 +576,7 @@ function cellMarginsXml(tag, margins) {
494
576
  return inner ? `<${tag}>${inner}</${tag}>` : "";
495
577
  }
496
578
  function paragraphXml(p, state, scope, closingSectPr) {
497
- const visible = p.runs.filter((run) => !run.listMarker && (run.math !== void 0 || run.text !== "" || run.inlineImage !== void 0 || run.pageBreak || run.footnoteRef !== void 0 || run.endnoteRef !== void 0 || run.noteNumber === true || run.href !== void 0 || run.anchor !== void 0));
579
+ const visible = p.runs.filter((run) => !run.listMarker && (run.math !== void 0 || run.text !== "" || run.inlineImage !== void 0 || run.pageBreak || run.footnoteRef !== void 0 || run.endnoteRef !== void 0 || run.noteNumber === true || run.commentRef !== void 0 || run.href !== void 0 || run.anchor !== void 0));
498
580
  const inner = [];
499
581
  let i = 0;
500
582
  while (i < visible.length) {
@@ -543,6 +625,7 @@ function runXml(run, state, scope) {
543
625
  if (run.footnoteRef !== void 0) return `<w:r>${rPr}<w:footnoteReference w:id="${escapeAttr(run.footnoteRef)}"/></w:r>`;
544
626
  if (run.endnoteRef !== void 0) return `<w:r>${rPr}<w:endnoteReference w:id="${escapeAttr(run.endnoteRef)}"/></w:r>`;
545
627
  if (run.noteNumber) return `<w:r>${rPr}<${scope.noteKind === "endnote" ? "w:endnoteRef" : "w:footnoteRef"}/></w:r>`;
628
+ if (run.commentRef !== void 0) return `<w:r>${rPr}<w:commentReference w:id="${escapeAttr(run.commentRef)}"/></w:r>`;
546
629
  const brk = run.pageBreak ? "<w:br w:type=\"page\"/>" : "";
547
630
  if (run.text === "") return brk ? `<w:r>${rPr}${brk}</w:r>` : "";
548
631
  return `<w:r>${rPr}<w:t xml:space="preserve">${escapeXml(run.text)}</w:t>${brk}</w:r>`;
@@ -31,6 +31,13 @@ export type DrawingContent = {
31
31
  readonly height: Pt;
32
32
  readonly altText?: string;
33
33
  readonly float?: FloatAnchor;
34
+ } | {
35
+ readonly kind: 'diagram';
36
+ readonly dmRelId: string;
37
+ readonly widthEmu: number;
38
+ readonly heightEmu: number;
39
+ readonly altText?: string;
40
+ readonly float?: FloatAnchor;
34
41
  };
35
42
  export declare function resolveMc(altContent: PoNode): ReadonlyArray<PoNode>;
36
43
  export declare function expandMcChildren(children: ReadonlyArray<PoNode>): Array<PoNode>;
@@ -4,6 +4,7 @@ import { resolveColorNode } from "../core/drawingml/colors.js";
4
4
  //#region src/word/drawing-parser.ts
5
5
  var WPS_URI = "http://schemas.microsoft.com/office/word/2010/wordprocessingShape";
6
6
  var CHART_URI = "http://schemas.openxmlformats.org/drawingml/2006/chart";
7
+ var DIAGRAM_URI = "http://schemas.openxmlformats.org/drawingml/2006/diagram";
7
8
  var UNDERSTOOD_NS = new Set(["wps"]);
8
9
  function parseFloatAnchor(anchor) {
9
10
  if (!poIs(anchor, "wp:anchor")) return void 0;
@@ -104,6 +105,18 @@ function parseDrawing(drawing, resolveColor, parseBody) {
104
105
  };
105
106
  return null;
106
107
  }
108
+ if (graphicData && uri === DIAGRAM_URI) {
109
+ const relIds = poFindDescendant(graphicData, "dgm:relIds");
110
+ const dmRelId = relIds ? poAttr(relIds, "dm") : void 0;
111
+ if (dmRelId && extentCx !== void 0 && extentCy !== void 0) return {
112
+ kind: "diagram",
113
+ dmRelId,
114
+ widthEmu: extentCx,
115
+ heightEmu: extentCy,
116
+ ...alt
117
+ };
118
+ return null;
119
+ }
107
120
  const blip = poFindDescendant(anchor, "a:blip");
108
121
  const rId = blip ? poAttr(blip, "embed") : void 0;
109
122
  if (extentCx !== void 0 && extentCy !== void 0 && rId) return {
@@ -1,6 +1,7 @@
1
1
  export type { HyperlinkResolver, ImageResolver, ParseContext } from './document-parser.js';
2
+ export type { CommentExtension } from './document-parser.js';
2
3
  export { extractParagraphs } from './text-extractor.js';
3
- export { parseDocument, parseBodyElements, parseSection, parseSections, parseHeaderFooter, parseNotes, EMPTY_SECTION, } from './document-parser.js';
4
+ export { parseDocument, parseBodyElements, parseSection, parseSections, parseHeaderFooter, parseNotes, parseComments, parseCommentThreads, parseCommentsExtended, parsePeople, applyAuthorIds, EMPTY_SECTION, } from './document-parser.js';
4
5
  export { parseRunProperties } from './run-properties.js';
5
6
  export { parseParagraphProperties } from './paragraph-properties.js';
6
7
  export { parseStyles } from './styles-parser.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "reamkit",
3
- "version": "1.10.0",
3
+ "version": "1.12.0",
4
4
  "description": "Ream — convert DOCX, XLSX, PPTX and PDF to PDF, SVG, HTML, DOCX and XLSX, built from scratch on the ECMA-376 and ISO 32000 specifications. Parse once, convert anywhere.",
5
5
  "license": "MIT",
6
6
  "author": "Alex Krassavin <info@reamkit.dev>",