pptx-glimpse 0.10.2 → 0.10.4

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/index.cjs CHANGED
@@ -1692,6 +1692,7 @@ var standardParser = new import_fast_xml_parser.XMLParser({
1692
1692
  attributeNamePrefix: "@_",
1693
1693
  removeNSPrefix: true,
1694
1694
  htmlEntities: true,
1695
+ trimValues: false,
1695
1696
  isArray: (_name, jpath, _isLeafNode, _isAttribute) => {
1696
1697
  const tag = String(jpath).split(".").pop() ?? "";
1697
1698
  return ARRAY_TAGS.has(tag);
@@ -8060,7 +8061,7 @@ function renderTextBody(textBody, transform) {
8060
8061
  const firstParaFontSizePt = getParagraphFontSize(paragraphs[0], defaultFontSize) * fontScale;
8061
8062
  const firstLineBaselineOffsetPt = firstParaFontSizePt * defaultAscenderRatio;
8062
8063
  yStart += firstLineBaselineOffsetPt * PX_PER_PT3;
8063
- const textElement = `<text x="0" y="${yStart}">${tspans.join("")}</text>`;
8064
+ const textElement = `<text x="0" y="${yStart}" xml:space="preserve">${tspans.join("")}</text>`;
8064
8065
  if (isVerticalText(bodyProperties.vert)) {
8065
8066
  return `<g transform="translate(${originalWidth}, 0) rotate(90)">${textElement}</g>`;
8066
8067
  }
@@ -9164,13 +9165,21 @@ async function convertPptxToPng(input, options) {
9164
9165
  return results;
9165
9166
  }
9166
9167
  function mergeElements(masterElements, layoutElements, slideElements) {
9167
- const filterPlaceholders = (elements) => elements.filter((el) => {
9168
+ const filterTemplatePlaceholders = (elements) => elements.filter((el) => {
9168
9169
  if (el.type !== "shape") return true;
9169
9170
  return !el.placeholderType;
9170
9171
  });
9171
- const filteredMaster = filterPlaceholders(masterElements);
9172
- const filteredLayout = filterPlaceholders(layoutElements);
9173
- return [...filteredMaster, ...filteredLayout, ...slideElements];
9172
+ const filterEmptySlidePlaceholders = (elements) => elements.filter((el) => !(el.type === "shape" && isEmptyPlaceholder(el)));
9173
+ const filteredMaster = filterTemplatePlaceholders(masterElements);
9174
+ const filteredLayout = filterTemplatePlaceholders(layoutElements);
9175
+ const filteredSlide = filterEmptySlidePlaceholders(slideElements);
9176
+ return [...filteredMaster, ...filteredLayout, ...filteredSlide];
9177
+ }
9178
+ function isEmptyPlaceholder(shape) {
9179
+ if (!shape.placeholderType) return false;
9180
+ const paragraphs = shape.textBody?.paragraphs;
9181
+ if (!paragraphs || paragraphs.length === 0) return true;
9182
+ return !paragraphs.some((p) => p.runs.some((r) => r.text.length > 0));
9174
9183
  }
9175
9184
 
9176
9185
  // src/font/font-collector.ts
package/dist/index.js CHANGED
@@ -1655,6 +1655,7 @@ var standardParser = new XMLParser({
1655
1655
  attributeNamePrefix: "@_",
1656
1656
  removeNSPrefix: true,
1657
1657
  htmlEntities: true,
1658
+ trimValues: false,
1658
1659
  isArray: (_name, jpath, _isLeafNode, _isAttribute) => {
1659
1660
  const tag = String(jpath).split(".").pop() ?? "";
1660
1661
  return ARRAY_TAGS.has(tag);
@@ -8022,7 +8023,7 @@ function renderTextBody(textBody, transform) {
8022
8023
  const firstParaFontSizePt = getParagraphFontSize(paragraphs[0], defaultFontSize) * fontScale;
8023
8024
  const firstLineBaselineOffsetPt = firstParaFontSizePt * defaultAscenderRatio;
8024
8025
  yStart += firstLineBaselineOffsetPt * PX_PER_PT3;
8025
- const textElement = `<text x="0" y="${yStart}">${tspans.join("")}</text>`;
8026
+ const textElement = `<text x="0" y="${yStart}" xml:space="preserve">${tspans.join("")}</text>`;
8026
8027
  if (isVerticalText(bodyProperties.vert)) {
8027
8028
  return `<g transform="translate(${originalWidth}, 0) rotate(90)">${textElement}</g>`;
8028
8029
  }
@@ -9126,13 +9127,21 @@ async function convertPptxToPng(input, options) {
9126
9127
  return results;
9127
9128
  }
9128
9129
  function mergeElements(masterElements, layoutElements, slideElements) {
9129
- const filterPlaceholders = (elements) => elements.filter((el) => {
9130
+ const filterTemplatePlaceholders = (elements) => elements.filter((el) => {
9130
9131
  if (el.type !== "shape") return true;
9131
9132
  return !el.placeholderType;
9132
9133
  });
9133
- const filteredMaster = filterPlaceholders(masterElements);
9134
- const filteredLayout = filterPlaceholders(layoutElements);
9135
- return [...filteredMaster, ...filteredLayout, ...slideElements];
9134
+ const filterEmptySlidePlaceholders = (elements) => elements.filter((el) => !(el.type === "shape" && isEmptyPlaceholder(el)));
9135
+ const filteredMaster = filterTemplatePlaceholders(masterElements);
9136
+ const filteredLayout = filterTemplatePlaceholders(layoutElements);
9137
+ const filteredSlide = filterEmptySlidePlaceholders(slideElements);
9138
+ return [...filteredMaster, ...filteredLayout, ...filteredSlide];
9139
+ }
9140
+ function isEmptyPlaceholder(shape) {
9141
+ if (!shape.placeholderType) return false;
9142
+ const paragraphs = shape.textBody?.paragraphs;
9143
+ if (!paragraphs || paragraphs.length === 0) return true;
9144
+ return !paragraphs.some((p) => p.runs.some((r) => r.text.length > 0));
9136
9145
  }
9137
9146
 
9138
9147
  // src/font/font-collector.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pptx-glimpse",
3
- "version": "0.10.2",
3
+ "version": "0.10.4",
4
4
  "description": "A lightweight JavaScript library for rendering PowerPoint (.pptx) files as SVG or PNG in Node.js. No LibreOffice required.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -65,7 +65,7 @@
65
65
  "license": "MIT",
66
66
  "dependencies": {
67
67
  "@resvg/resvg-wasm": "^2.6.2",
68
- "fast-xml-parser": "^5.3.6",
68
+ "fast-xml-parser": "^5.7.3",
69
69
  "fflate": "^0.8.2",
70
70
  "opentype.js": "^1.3.4"
71
71
  },