@office-kit/pptx 0.26.0 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # @office-kit/pptx
2
2
 
3
+ ## 0.27.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 4eb151c: Added: `loadPresentation` and `loadPresentationFile` take an optional `limits` option for opening untrusted decks, such as uploads on a server: `{ maxEntries, maxTotalUncompressedBytes, maxXmlPartBytes, maxTotalXmlBytes }`. The limits are checked against the sizes the archive declares before anything is decompressed, and an entry that decompresses past its declared size still stops mid-way. With `limits` set, archives that use ZIP64 records are rejected too. A deck that breaks a limit throws an `Error` whose message starts with `invalid ZIP:` and names the limit. Without `limits`, loading is unchanged.
8
+ - 8cf577e: Add `getPresentationTextReview(pres, { mode, full })`, which returns the deck review the skill's `deck-text.mjs` prints: the headline track, `[要確認]` markers left on slides and in notes, Japanese wording flags, and with `mode: 'talk' | 'document'` the matching headline checks. Servers and workers can now produce that review from a loaded presentation without running the script. The script now calls this function, so it needs `@office-kit/pptx` 0.27.0 or later in the slide project and says so when the installed copy is older.
9
+
10
+ ### Patch Changes
11
+
12
+ - 659a1ce: Numbered lists now count 1. 2. 3. in LibreOffice too
13
+
14
+ `bullets: 'number'` wrote `startAt="1"` on every paragraph. LibreOffice reads each one as a fresh start and numbers the list 1. 1. 1. The attribute is now left out; 1 is its default, so the reference desktop app numbers the list the same as before.
15
+
16
+ - ad79d4c: Fixed a newline inside a run's text (`setShapeParagraphs`, `setTableCellParagraphs`, and the DSL `<Text paragraphs>`) being written as a raw newline inside `<a:t>`. LibreOffice read it as a paragraph break, so a bulleted item that wrapped onto two lines got a second bullet and the text overflowed its box. A `\n` or `\r\n` in a run is now written as a line break (`<a:br>`) between runs with the same format, which presentation apps and the preview all show as a line break inside the paragraph. Reading the text back still returns `\n` at each break; a `\r\n` reads back as `\n`.
17
+
3
18
  ## 0.26.0
4
19
 
5
20
  ### Minor Changes
package/README.md CHANGED
@@ -749,6 +749,7 @@ shown together.
749
749
  | Document properties | `getCoreProperties` / `setCoreProperties`, `touchModified`, `getThumbnail` / `setThumbnail` / `removeThumbnail` |
750
750
  | Package inspection | `listPackageParts`, `readPackagePart`, `getMediaParts`, `getOrphanMediaPartNames`, `getPackageSize`, `compactPackage` |
751
751
  | Validation | `validatePresentation(pres)` — invariant checks, returns `ValidationIssue[]` |
752
+ | Text review | `getPresentationTextReview(pres, { mode?: 'talk' \| 'document', full? })` — headline track, `[要確認]` markers and Japanese wording flags as plain text (the skill's `deck-text.mjs` output) |
752
753
  | Units | `inches(n)`, `cm(n)`, `mm(n)`, `pt(n)`, `emu(n)` — return branded `Emu` numbers |
753
754
 
754
755
  `setParagraphLevel` also accepts a UTF-16 text range and a relative level change,
@@ -2789,7 +2789,6 @@ const NAME_BU_NONE$1 = qname("a", "buNone", NS.dml);
2789
2789
  const NAME_BU_FONT = qname("a", "buFont", NS.dml);
2790
2790
  const ATTR_CHAR = qname("", "char", "");
2791
2791
  const ATTR_BU_TYPE = qname("", "type", "");
2792
- const ATTR_START_AT = qname("", "startAt", "");
2793
2792
  const ATTR_TYPEFACE$2 = qname("", "typeface", "");
2794
2793
  const NAME_P$5 = qname("a", "p", NS.dml);
2795
2794
  const NAME_R$4 = qname("a", "r", NS.dml);
@@ -2797,6 +2796,8 @@ const NAME_T$5 = qname("a", "t", NS.dml);
2797
2796
  const NAME_RPR$6 = qname("a", "rPr", NS.dml);
2798
2797
  const NAME_PPR$1 = qname("a", "pPr", NS.dml);
2799
2798
  const NAME_END_PARA_RPR = qname("a", "endParaRPr", NS.dml);
2799
+ const NAME_BR = qname("a", "br", NS.dml);
2800
+ const RUN_LINE_BREAK = /\r?\n/;
2800
2801
  NS.xml;
2801
2802
  const cloneAttrs = (attrs) => attrs.map((a) => attr(a.name, a.value));
2802
2803
  const cloneElement = (e) => elem(e.name, {
@@ -3003,7 +3004,7 @@ const normalizeBulletStyle = (s, caller) => {
3003
3004
  const buildBulletElement = (n) => {
3004
3005
  switch (n.kind) {
3005
3006
  case "char": return elem(NAME_BU_CHAR, { attrs: [attr(ATTR_CHAR, n.char)] });
3006
- case "autoNum": return elem(NAME_BU_AUTO_NUM, { attrs: [attr(ATTR_START_AT, "1"), attr(ATTR_BU_TYPE, n.type)] });
3007
+ case "autoNum": return elem(NAME_BU_AUTO_NUM, { attrs: [attr(ATTR_BU_TYPE, n.type)] });
3007
3008
  case "none": return elem(NAME_BU_NONE$1);
3008
3009
  }
3009
3010
  };
@@ -3171,8 +3172,14 @@ const buildTextBodyParagraphs = (paragraphs, caller = "setShapeParagraphs", imag
3171
3172
  for (const run of para.runs) {
3172
3173
  const rPr = elem(NAME_RPR$6);
3173
3174
  if (run.format !== void 0) applyRunFormat(rPr, run.format, caller, embedder);
3174
- const t = elem(NAME_T$5, { children: run.text.length > 0 ? [text(run.text)] : [] });
3175
- children.push(elem(NAME_R$4, { children: [rPr, t] }));
3175
+ const lines = run.text.split(RUN_LINE_BREAK);
3176
+ lines.forEach((line, index) => {
3177
+ if (index > 0) children.push(elem(NAME_BR, { children: [cloneElement(rPr)] }));
3178
+ if (line.length > 0 || lines.length === 1) {
3179
+ const t = elem(NAME_T$5, { children: line.length > 0 ? [text(line)] : [] });
3180
+ children.push(elem(NAME_R$4, { children: [cloneElement(rPr), t] }));
3181
+ }
3182
+ });
3176
3183
  }
3177
3184
  if (para.endFormat !== void 0) {
3178
3185
  const endParaRPr = elem(NAME_END_PARA_RPR);
@@ -30546,6 +30553,7 @@ const extensionOf = (name) => {
30546
30553
  const dot = name.lastIndexOf(".");
30547
30554
  return dot < 0 ? "" : name.slice(dot + 1).toLowerCase();
30548
30555
  };
30556
+ const XML_EXTENSIONS = new Set(["xml", "rels"]);
30549
30557
  /**
30550
30558
  * Returns true if the entry should be stored uncompressed. PPTX writers
30551
30559
  * conventionally STORE already-compressed payloads to avoid wasting CPU on
@@ -30587,10 +30595,11 @@ const findEocd = (d) => {
30587
30595
  for (let at = d.length - EOCD_SIZE; at >= lowest; at--) if (u32(d, at) === SIG_EOCD) return at;
30588
30596
  throw invalid("end of central directory not found");
30589
30597
  };
30590
- const readCentralDirectoryLocation = (d) => {
30598
+ const readCentralDirectoryLocation = (d, rejectZip64) => {
30591
30599
  const eocd = findEocd(d);
30592
30600
  const locator = eocd - ZIP64_LOCATOR_SIZE;
30593
30601
  if (locator >= 0 && u32(d, locator) === SIG_ZIP64_LOCATOR) {
30602
+ if (rejectZip64) throw invalid("ZIP64 end of central directory locator is not accepted under load limits");
30594
30603
  const zip64Eocd = u32(d, locator + 8) + u32(d, locator + 12) * 2 ** 32;
30595
30604
  if (zip64Eocd + ZIP64_EOCD_MIN_SIZE <= d.length && u32(d, zip64Eocd) === SIG_ZIP64_EOCD) return {
30596
30605
  count: u64(d, zip64Eocd + 32),
@@ -30602,11 +30611,12 @@ const readCentralDirectoryLocation = (d) => {
30602
30611
  offset: u32(d, eocd + 16)
30603
30612
  };
30604
30613
  };
30614
+ const usesZip64 = (sizes) => sizes.uncompressedSize === ZIP64_SENTINEL_32 || sizes.compressedSize === ZIP64_SENTINEL_32 || sizes.localHeaderOffset === ZIP64_SENTINEL_32;
30605
30615
  const resolveZip64Sizes = (d, extraStart, extraEnd, sizes) => {
30616
+ if (!usesZip64(sizes)) return sizes;
30606
30617
  const needUncompressed = sizes.uncompressedSize === ZIP64_SENTINEL_32;
30607
30618
  const needCompressed = sizes.compressedSize === ZIP64_SENTINEL_32;
30608
30619
  const needOffset = sizes.localHeaderOffset === ZIP64_SENTINEL_32;
30609
- if (!needUncompressed && !needCompressed && !needOffset) return sizes;
30610
30620
  for (let at = extraStart; at + 4 <= extraEnd; at += 4 + u16(d, at + 2)) {
30611
30621
  if (u16(d, at) !== ZIP64_EXTRA_ID) continue;
30612
30622
  const fieldEnd = at + 4 + u16(d, at + 2);
@@ -30671,16 +30681,17 @@ const inflateEntry = (compressed, declaredSize, name) => {
30671
30681
  if (out.length !== declaredSize) throw invalid(`entry "${name}" inflates to ${out.length} bytes, not its declared ${declaredSize}`);
30672
30682
  return out;
30673
30683
  };
30674
- /**
30675
- * Reads a ZIP archive (a `.pptx` file is a ZIP) and returns entries in
30676
- * central-directory order. Throws if `input` is not a valid ZIP, if two
30677
- * entries share a name, or if an entry's data does not match the size its
30678
- * central-directory record declares.
30679
- */
30680
- const readZip = (input) => {
30681
- const { offset, count } = readCentralDirectoryLocation(input);
30682
- const entries = [];
30684
+ const limitError = (subject, limit, max) => invalid(`${subject}, over the ${limit} limit of ${max}`);
30685
+ const requireLimits = (limits) => {
30686
+ for (const [key, value] of Object.entries(limits)) if (!(value >= 0)) throw new RangeError(`load limit ${key} must be a non-negative number`);
30687
+ };
30688
+ const readCentralDirectory = (input, limits) => {
30689
+ const { offset, count } = readCentralDirectoryLocation(input, limits !== void 0);
30690
+ if (limits !== void 0 && count > limits.maxEntries) throw limitError(`archive lists ${count} entries`, "maxEntries", limits.maxEntries);
30691
+ const records = [];
30683
30692
  const seen = /* @__PURE__ */ new Set();
30693
+ let totalBytes = 0;
30694
+ let totalXmlBytes = 0;
30684
30695
  let cursor = offset;
30685
30696
  for (let i = 0; i < count; i++) {
30686
30697
  requireRange(input, cursor, CENTRAL_HEADER_SIZE, "central directory");
@@ -30695,14 +30706,52 @@ const readZip = (input) => {
30695
30706
  const recordEnd = extraStart + extraLength + commentLength;
30696
30707
  requireRange(input, cursor, recordEnd - cursor, "central directory");
30697
30708
  const name = strFromU8(input.subarray(nameStart, extraStart), (flags & FLAG_UTF8) === 0);
30698
- const { compressedSize, uncompressedSize, localHeaderOffset } = resolveZip64Sizes(input, extraStart, extraStart + extraLength, {
30709
+ const declared = {
30699
30710
  compressedSize: u32(input, cursor + 20),
30700
30711
  uncompressedSize: u32(input, cursor + 24),
30701
30712
  localHeaderOffset: u32(input, cursor + 42)
30702
- });
30713
+ };
30703
30714
  cursor = recordEnd;
30704
30715
  if (seen.has(name)) throw invalid(`duplicate entry "${name}"`);
30705
30716
  seen.add(name);
30717
+ if (limits === void 0) {
30718
+ records.push({
30719
+ name,
30720
+ method,
30721
+ ...resolveZip64Sizes(input, extraStart, extraStart + extraLength, declared)
30722
+ });
30723
+ continue;
30724
+ }
30725
+ if (usesZip64(declared)) throw invalid(`entry "${name}" uses ZIP64 sizes, which are not accepted under load limits`);
30726
+ const size = declared.uncompressedSize;
30727
+ totalBytes += size;
30728
+ if (totalBytes > limits.maxTotalUncompressedBytes) throw limitError(`entries declare ${totalBytes} uncompressed bytes`, "maxTotalUncompressedBytes", limits.maxTotalUncompressedBytes);
30729
+ if (XML_EXTENSIONS.has(extensionOf(name))) {
30730
+ if (size > limits.maxXmlPartBytes) throw limitError(`entry "${name}" declares ${size} bytes`, "maxXmlPartBytes", limits.maxXmlPartBytes);
30731
+ totalXmlBytes += size;
30732
+ if (totalXmlBytes > limits.maxTotalXmlBytes) throw limitError(`XML parts declare ${totalXmlBytes} bytes`, "maxTotalXmlBytes", limits.maxTotalXmlBytes);
30733
+ }
30734
+ records.push({
30735
+ name,
30736
+ method,
30737
+ ...declared
30738
+ });
30739
+ }
30740
+ return records;
30741
+ };
30742
+ /**
30743
+ * Reads a ZIP archive (a `.pptx` file is a ZIP) and returns entries in
30744
+ * central-directory order. Throws if `input` is not a valid ZIP, if two
30745
+ * entries share a name, if an entry's data does not match the size its
30746
+ * central-directory record declares, or if the archive breaks
30747
+ * `options.limits`. The whole central directory is read before any entry is
30748
+ * inflated.
30749
+ */
30750
+ const readZip = (input, options = {}) => {
30751
+ if (options.limits !== void 0) requireLimits(options.limits);
30752
+ const entries = [];
30753
+ for (const record of readCentralDirectory(input, options.limits)) {
30754
+ const { name, method, compressedSize, uncompressedSize, localHeaderOffset } = record;
30706
30755
  requireRange(input, localHeaderOffset, LOCAL_HEADER_SIZE, `local header of "${name}"`);
30707
30756
  if (u32(input, localHeaderOffset) !== SIG_LOCAL_HEADER) throw invalid(`bad local header signature for "${name}"`);
30708
30757
  const dataStart = localHeaderOffset + LOCAL_HEADER_SIZE + u16(input, localHeaderOffset + 26) + u16(input, localHeaderOffset + 28);
@@ -31356,11 +31405,11 @@ var OpcPackage = class OpcPackage {
31356
31405
  * eagerly; leaves part bodies as raw `Uint8Array`s for higher layers to
31357
31406
  * interpret.
31358
31407
  *
31359
- * Throws if the archive is not a valid ZIP, or if `[Content_Types].xml` is
31360
- * missing or malformed.
31408
+ * Throws if the archive is not a valid ZIP, if it breaks `options.limits`,
31409
+ * or if `[Content_Types].xml` is missing or malformed.
31361
31410
  */
31362
- static load(bytes) {
31363
- const zip = readZip(bytes);
31411
+ static load(bytes, options = {}) {
31412
+ const zip = readZip(bytes, options);
31364
31413
  let contentTypes = null;
31365
31414
  const parts = [];
31366
31415
  for (const entry of zip.entries) {
@@ -31625,10 +31674,13 @@ const normalize = async (input) => {
31625
31674
  };
31626
31675
  /**
31627
31676
  * Loads an existing `.pptx` and returns a `PresentationData` value.
31677
+ *
31678
+ * Throws an `Error` whose message starts with `invalid ZIP:` when the archive
31679
+ * is malformed or breaks `options.limits`; the message names the limit.
31628
31680
  */
31629
- const loadPresentation = async (input) => {
31681
+ const loadPresentation = async (input, options = {}) => {
31630
31682
  const bytes = await normalize(input);
31631
- const pkg = OpcPackage.load(bytes);
31683
+ const pkg = OpcPackage.load(bytes, options);
31632
31684
  return {
31633
31685
  [INTERNAL_PACKAGE]: pkg,
31634
31686
  _slidesCache: null
@@ -55883,6 +55935,265 @@ const setSlideOutlineCollapsed = (slide, collapsed) => {
55883
55935
  pkg.setRels(view.part.name, rels);
55884
55936
  };
55885
55937
  //#endregion
55938
+ //#region src/api/fn/text-review.ts
55939
+ const HEADLINE_NAME = "Headline";
55940
+ const GUESS_MAX_LENGTH = 80;
55941
+ const MONOSPACE = /mono|courier|consolas|menlo|code|等幅/i;
55942
+ /**
55943
+ * Returns a plain-text review of the deck: the headline track (one line per
55944
+ * slide, read from the shape named `Headline`, else the title placeholder, else
55945
+ * the largest short text), `[要確認]` markers left on slides and in notes, and
55946
+ * Japanese wording flags. `mode` adds talk or document headline checks; `full`
55947
+ * adds every slide's text. This is the output of the skill's `deck-text.mjs`.
55948
+ */
55949
+ const getPresentationTextReview = (pres, options = {}) => {
55950
+ const slides = getSlides(pres).map((slide, index) => readSlide(pres, slide, index));
55951
+ const lines = headlineLines(slides);
55952
+ if (options.full) lines.push(...fullTextLines(slides));
55953
+ if (options.mode === "talk") lines.push(...talkMetricLines(slides));
55954
+ if (options.mode === "document") lines.push(...documentCheckLines(slides));
55955
+ lines.push(...openQuestionLines(slides), ...wordingFlagLines(slides));
55956
+ return lines.join("\n");
55957
+ };
55958
+ const readSlide = (pres, slide, index) => {
55959
+ const shapes = [];
55960
+ const chart = [];
55961
+ for (const shape of getSlideShapes(slide)) {
55962
+ if (isChartShape(shape)) {
55963
+ chart.push(...chartTexts(getShapeChartSpec(shape)));
55964
+ continue;
55965
+ }
55966
+ if (isTableShape(shape)) {
55967
+ for (const row of getTableCells(shape)) shapes.push({
55968
+ shape: null,
55969
+ text: row.map((cell) => getTableCellText(cell)).join(" | "),
55970
+ code: false,
55971
+ guessed: false
55972
+ });
55973
+ continue;
55974
+ }
55975
+ const text = getShapeText(shape).trim();
55976
+ if (text) shapes.push({
55977
+ shape,
55978
+ text,
55979
+ code: isCode(pres, shape),
55980
+ guessed: false
55981
+ });
55982
+ }
55983
+ const headline = shapes.find(({ shape }) => shape !== null && getShapeName(shape) === HEADLINE_NAME) ?? placeholderTitle(slide, shapes) ?? largestText(pres, shapes);
55984
+ return {
55985
+ number: index + 1,
55986
+ headline: headline ? oneLine(headline.text) : null,
55987
+ guessed: headline?.guessed ?? false,
55988
+ headlineRaw: headline?.text ?? null,
55989
+ texts: shapes.filter((entry) => entry !== headline && !entry.code).map(({ text }) => text),
55990
+ code: shapes.filter((entry) => entry.code).map(({ text }) => text),
55991
+ chart,
55992
+ notes: getSlideNotes(slide) ?? ""
55993
+ };
55994
+ };
55995
+ const chartTexts = (spec) => {
55996
+ if (spec === null) return [];
55997
+ return [
55998
+ spec.title,
55999
+ spec.categoryAxisTitle,
56000
+ spec.valueAxisTitle,
56001
+ spec.secondaryValueAxis?.title,
56002
+ ...spec.categories,
56003
+ ...(spec.categoryGroupLevels ?? []).flat(),
56004
+ ...spec.series.flatMap((series) => [series.name, ...(series.pointDataLabels ?? []).map((labels) => labels?.text)])
56005
+ ].filter((text) => typeof text === "string" && text.trim() !== "");
56006
+ };
56007
+ const isCode = (pres, shape) => {
56008
+ const format = getShapeRunFormatEffective(pres, shape, 0, 0);
56009
+ return MONOSPACE.test(`${format.font ?? ""} ${format.fontEastAsian ?? ""}`);
56010
+ };
56011
+ const placeholderTitle = (slide, shapes) => {
56012
+ const title = getSlideTitle(slide)?.trim();
56013
+ return title ? shapes.find((entry) => entry.text === title) : void 0;
56014
+ };
56015
+ const largestText = (pres, shapes) => {
56016
+ let best;
56017
+ let bestSize = 0;
56018
+ for (const entry of shapes) {
56019
+ if (entry.shape === null || entry.text.length > GUESS_MAX_LENGTH) continue;
56020
+ const size = getShapeRunFormatEffective(pres, entry.shape, 0, 0).size ?? 0;
56021
+ if (size > bestSize) [best, bestSize] = [entry, size];
56022
+ }
56023
+ if (best) best.guessed = true;
56024
+ return best;
56025
+ };
56026
+ const oneLine = (text) => text.replace(/\s*[\n\v]\s*/g, " ");
56027
+ const label = (slide) => `p${String(slide.number).padStart(2, "0")}`;
56028
+ const hasHeadline = (slide) => slide.headline !== null;
56029
+ const headlineLines = (all) => {
56030
+ const lines = ["# Headline track"];
56031
+ const missing = all.filter((slide) => slide.headline === null).length;
56032
+ for (const slide of all) lines.push(`${label(slide)}${slide.guessed ? "?" : " "} ${slide.headline ?? "(no headline)"}`);
56033
+ if (all.some((slide) => slide.guessed)) lines.push(`\n"?" marks a guessed headline (largest text). Name the headline Text "${HEADLINE_NAME}".`);
56034
+ if (missing > 0) lines.push(`\n${missing} slide(s) have no headline. Name the headline Text "${HEADLINE_NAME}" (or use a title placeholder).`);
56035
+ return lines;
56036
+ };
56037
+ const fullTextLines = (all) => {
56038
+ const lines = ["\n# Slide text"];
56039
+ for (const slide of all) {
56040
+ lines.push(`\n## ${label(slide)} ${slide.headline ?? ""}`);
56041
+ for (const text of slide.texts) lines.push(`- ${oneLine(text)}`);
56042
+ for (const text of slide.code) lines.push(`- [code] ${oneLine(text)}`);
56043
+ for (const text of slide.chart) lines.push(`- [chart] ${oneLine(text)}`);
56044
+ if (slide.notes) lines.push(` notes: ${oneLine(slide.notes)}`);
56045
+ }
56046
+ return lines;
56047
+ };
56048
+ const TALK_RANGES = {
56049
+ exclamation: [7, 20],
56050
+ question: [10, 15],
56051
+ polite: [10, 12]
56052
+ };
56053
+ const POLITE_END = /(です|ます|ました|ません|でした|でしょう|ください)か?[。!?!?…]*$/;
56054
+ const COLLOQUIAL_END = /(てる|ばいい|んです)[。!?!?]*$/;
56055
+ const LEADING_CONNECTIVE = /^(しかも|実は|ちなみに|ただし|例えば|まずは|最後に|そして|さらに)/;
56056
+ const COLON_HEADLINE = /[::]/;
56057
+ const MIN_RUN = 3;
56058
+ const talkMetricLines = (all) => {
56059
+ const headlines = all.filter(hasHeadline);
56060
+ if (headlines.length === 0) return [];
56061
+ const share = (test) => Math.round(headlines.filter((slide) => test(slide.headline)).length / headlines.length * 100);
56062
+ const shortest = headlines.reduce((a, b) => a.headline.length <= b.headline.length ? a : b);
56063
+ const lines = [
56064
+ "\n# Talk headline mix (hand-made reference range in brackets)",
56065
+ `! ${share((h) => /[!!]/.test(h))}% [${TALK_RANGES.exclamation.join("-")}%]`,
56066
+ `? ${share((h) => /[??]/.test(h))}% [${TALK_RANGES.question.join("-")}%]`,
56067
+ `polite form ${share((h) => POLITE_END.test(h))}% [${TALK_RANGES.polite.join("-")}%]`,
56068
+ `shortest ${shortest.headline.length} chars (${label(shortest)}) [3-6]; median ${median(headlines.map((s) => s.headline.length))}`
56069
+ ];
56070
+ for (const slide of headlines) if (COLLOQUIAL_END.test(slide.headline)) lines.push(`${label(slide)} colloquial ending: ${slide.headline}`);
56071
+ lines.push(...runLines(headlines, "colon headline", (h) => COLON_HEADLINE.test(h)), ...runLines(headlines, "same leading connective", (h) => LEADING_CONNECTIVE.test(h)), ...runLines(headlines, "comma-pause two-part headline", (h) => /^[^、]{2,14}、[^、]{1,10}$/.test(h)));
56072
+ return lines;
56073
+ };
56074
+ const runLines = (slides, name, test) => {
56075
+ const lines = [];
56076
+ let run = [];
56077
+ const flush = () => {
56078
+ if (run.length >= MIN_RUN) lines.push(`${name} x${run.length}: ${run.map(label).join(", ")}`);
56079
+ run = [];
56080
+ };
56081
+ for (const slide of slides) if (test(slide.headline)) run.push(slide);
56082
+ else flush();
56083
+ flush();
56084
+ return lines;
56085
+ };
56086
+ const LATIN_1_END = 255;
56087
+ const HALF_WIDTH_KANA = [65377, 65439];
56088
+ const displayWidth = (text) => {
56089
+ let width = 0;
56090
+ for (const character of text) {
56091
+ const code = character.codePointAt(0);
56092
+ width += code <= LATIN_1_END || code >= HALF_WIDTH_KANA[0] && code <= HALF_WIDTH_KANA[1] ? .5 : 1;
56093
+ }
56094
+ return width;
56095
+ };
56096
+ const median = (values) => {
56097
+ const sorted = [...values].sort((a, b) => a - b);
56098
+ return sorted[Math.floor(sorted.length / 2)];
56099
+ };
56100
+ const DOCUMENT_TITLE_LINE = 40;
56101
+ const DOCUMENT_TITLE_MAX_LINES = 2;
56102
+ const ELEMENT_COUNT = /[0-90-9一二三四五六七八九十]+ ?(つ|個|種類|点|段階?|ステップ|フェーズ|論点|柱)(の|で|が|を|に|$)/;
56103
+ const documentCheckLines = (all) => {
56104
+ const lines = ["\n# Document headline checks"];
56105
+ for (const slide of all.slice(1).filter(hasHeadline)) {
56106
+ const headline = slide.headline;
56107
+ const issues = [];
56108
+ if (POLITE_END.test(headline)) issues.push("polite ending (use plain form)");
56109
+ const rawLines = slide.headlineRaw.split(/[\n\v]/);
56110
+ const widest = Math.max(...rawLines.map(displayWidth));
56111
+ if (rawLines.length > DOCUMENT_TITLE_MAX_LINES) issues.push(`${rawLines.length} lines (keep headlines to two)`);
56112
+ else if (widest > DOCUMENT_TITLE_LINE * DOCUMENT_TITLE_MAX_LINES) issues.push("longer than two lines");
56113
+ else if (widest > DOCUMENT_TITLE_LINE) issues.push("wraps without an explicit break (put one at a meaning boundary)");
56114
+ if (/^[^、。]{1,12}[::]/.test(headline)) issues.push("label prefix before a colon");
56115
+ if (/^(この|その|ここまで|これら)/.test(headline)) issues.push("refers to another slide");
56116
+ if (ELEMENT_COUNT.test(headline)) issues.push("element count in headline (state the content, or check it matches the body)");
56117
+ if (issues.length) lines.push(`${label(slide)} ${issues.join("; ")}: ${headline}`);
56118
+ }
56119
+ return lines;
56120
+ };
56121
+ const WORDING_PATTERNS = [
56122
+ ["効く", /(?<![有無奏特即実発失])効(?:[くきけかこ]|いて|いた)/],
56123
+ ["dash", /[—―─]/],
56124
+ ["することができる", /することが(でき|可能)/],
56125
+ ["empty emphasis", /非常に|極めて|画期的|革新的|圧倒的|と言っても過言では|に他なら/],
56126
+ ["katakana padding", /ソリューション|シナジー|シームレス|エンドツーエンド|付加価値/],
56127
+ ["nominalized business verb", /(を|の)(活用|推進|実現|創出|担保|最適化|効率化|強化)(する|し|を|が|に)?/],
56128
+ ["stock opener", /昨今|近年|変化の激しい|結論から(言う|申し上げ)|以下の通り/],
56129
+ ["hedged conclusion", /と言えるでしょう|と言えます|のではないでしょうか|と考えられます/],
56130
+ ["announced count", /(理由|ポイント|軸|論点)は[0-90-9一二三四五]+つ|見ていきましょう|深掘り|掘り下げ|言語化する|正面から/],
56131
+ ["empty adjective", /不可欠|核心的|鍵となる|多角的|包括的|肝となる/],
56132
+ ["translationese", /という観点から|にとって(重要|不可欠)|することによって|を持つ(こと|ため|。|$)/],
56133
+ ["stagy closer", /に尽き(る|ます)|これが.{1,12}の(形|正体)|そのもの(だ|です)|こそが/],
56134
+ ["showy metaphor verb", /届かない|拾ってくれ|地続き|一撃で|仕込[みむ]|たちが悪い|腑に落ち/],
56135
+ ["overclaimed effect", /これだけで|一気に|劇的に|驚くほど|目に見えて/],
56136
+ ["intensifying 切る", /(守り|止め|閉じ|抑え|塞ぎ|押し|言い)切[らりるれろっ]/],
56137
+ ["direction metaphor", /(側|方|向き)に倒|に倒(す|し|して|れる)(?![産])/],
56138
+ ["permission phrasing", /で構いません|でも構わない/],
56139
+ ["slide as 枚", /(次|前|この|全)の?枚|[0-90-9]+枚目/]
56140
+ ];
56141
+ const LABEL_COLON = /^\s*(?!出典|注)(?=[^\s::、。[[]*[ぁ-んァ-ヶ一-龠])[^\s::、。[[]{1,12}[::]\s*\S/;
56142
+ const FOREIGN_SCRIPT = /[가-힣Ѐ-ӿ]/;
56143
+ const FLAG_EXCERPT_LENGTH = 80;
56144
+ const wordingFlagLines = (all) => {
56145
+ const lines = ["\n# Wording flags (judge each against references/writing-ja.md)"];
56146
+ for (const slide of all) {
56147
+ const onSlide = [slide.headline ?? "", ...[...slide.texts, ...slide.chart].flatMap((text) => text.split(/\n/))];
56148
+ const notes = slide.notes.split(/\n/);
56149
+ for (const [where, line] of [...onSlide.map((line) => ["", line]), ...notes.map((line) => ["notes ", line])]) {
56150
+ const hits = flagsFor(line, where === "");
56151
+ if (hits.length === 0) continue;
56152
+ lines.push(`${label(slide)} ${where}[${hits.join(", ")}] ${oneLine(line).slice(0, FLAG_EXCERPT_LENGTH)}`);
56153
+ }
56154
+ }
56155
+ if (lines.length === 1) lines.push("none");
56156
+ return lines;
56157
+ };
56158
+ const flagsFor = (line, onSlide) => {
56159
+ if (!line.trim()) return [];
56160
+ const hits = WORDING_PATTERNS.filter(([, pattern]) => pattern.test(line)).map(([name]) => name);
56161
+ if (onSlide && LABEL_COLON.test(line)) hits.push("label: description");
56162
+ if (FOREIGN_SCRIPT.test(line)) hits.push("foreign script");
56163
+ return hits;
56164
+ };
56165
+ const OPEN_QUESTION = /[[[]要確認/;
56166
+ const EXCERPT_LENGTH = 80;
56167
+ const EXCERPT_LEAD = 20;
56168
+ const openQuestionLines = (all) => {
56169
+ return [
56170
+ "\n# [要確認] left on slides (fill each or move it to the notes before delivery)",
56171
+ ...matchLines(all.flatMap((slide) => [
56172
+ slide.headlineRaw ?? "",
56173
+ ...slide.texts,
56174
+ ...slide.code,
56175
+ ...slide.chart
56176
+ ].map((text) => [slide, text])), ""),
56177
+ "\n# [要確認] in notes (report each to the user)",
56178
+ ...matchLines(all.map((slide) => [slide, slide.notes]), "notes ")
56179
+ ];
56180
+ };
56181
+ const matchLines = (entries, where) => {
56182
+ const lines = [];
56183
+ for (const [slide, text] of entries) for (const line of text.split(/\n/).map(oneLine)) {
56184
+ const at = line.search(OPEN_QUESTION);
56185
+ if (at === -1) continue;
56186
+ lines.push(`${label(slide)} ${where}${excerpt(line, at)}`);
56187
+ }
56188
+ if (lines.length === 0) lines.push("none");
56189
+ return lines;
56190
+ };
56191
+ const excerpt = (line, at) => {
56192
+ if (line.length <= EXCERPT_LENGTH) return line;
56193
+ const start = Math.max(0, Math.min(at - EXCERPT_LEAD, line.length - EXCERPT_LENGTH));
56194
+ return `${start > 0 ? "…" : ""}${line.slice(start, start + EXCERPT_LENGTH)}${start + EXCERPT_LENGTH < line.length ? "…" : ""}`;
56195
+ };
56196
+ //#endregion
55886
56197
  //#region src/api/fn/shape-image-fill-layout.ts
55887
56198
  const fillElement = (shape) => {
55888
56199
  const element = shape[SHAPE_ELEMENT];
@@ -55916,8 +56227,8 @@ const getShapeImageIntrinsicSize = (shape) => {
55916
56227
  };
55917
56228
  //#endregion
55918
56229
  //#region src/api/index.ts
55919
- const VERSION = "0.26.0";
56230
+ const VERSION = "0.27.0";
55920
56231
  //#endregion
55921
- export { getHandoutMasterPlaceholders as $, findSlidesByLayoutPartName as $a, getShapeChartCategories as $c, getShapeStrokeCap as $i, getSlideLayoutUsageCountsByType as $l, findShapesByEffect as $n, getSlideNotesTextFormats as $o, getShapePlaceholderIdx as $r, getTableCellText3D as $s, replaceTextInNotes as $t, isShapeLocked as A, setParagraphBullet as Aa, getThumbnail as Ac, setShapeGradientFill as Ai, getSlideMasterBackgroundPatternFill as Al, getShapeTextAutoFitParams as An, clearAllHyperlinks as Ao, getSlidesWithEmptyPlaceholders as Ar, getPresentationSummary as As, findSlidesByText as At, getSlideCommentAuthors as Au, addSectionHeaderSlide as B, getSlideTitle as Ba, touchModified as Bc, setShapeStroke as Bi, clearSlideLayoutBackground as Bl, setShapeText as Bn, getAllNotes as Bo, getMaxShapeIdInPresentation as Br, getTableBackgroundEffective as Bs, getSlideIndex as Bt, loadPresentation as Bu, ungroupShapes as C, getShapeRunClickAction as Ca, setTableCellTextDirection as Cc, getShapePatternFill as Ci, getSlideLayoutBackgroundImageBytes as Cl, removeSlideAnimation as Cn, SLIDE_SIZE_16_10 as Co, findSlidePlaceholders as Cr, getShapeMediaPlayback as Cs, setSlideMasterPreserved as Ct, getCommentSlide as Cu, setShapeTextLanguage as D, getShapeRunText as Da, setTableStyleFlags as Dc, setShapeAdjustValues as Di, getSlideMasterBackground as Dl, getShapeText3D as Dn, getSlideSize as Do, getShapesBounds as Dr, getMediaParts as Ds, findSlideByText as Dt, getPresentationCommentCountsByAuthor as Du, getShapeTextLanguage as E, getShapeRunHyperlinkTooltip as Ea, setTableRowHeight as Ec, getShapeStrokeSketch as Ei, getSlideLayoutShapes as El, getShapeBodyPrEffective as En, getPresentationFirstSlideNumber as Eo, getShapeXmlString as Er, compactPackage as Es, findSlideByPartName as Et, getCommentsSortedByDate as Eu, resetSlideLayout as F, setParagraphTabs as Fa, getPresentationCreated as Fc, setShapePosition as Fi, setSlideBackgroundImageFillLayout as Fl, getShapeTextMargins as Fn, findSlidesWithChartTrendlines as Fo, findShapesAtPoint as Fr, slidesUsingMediaPart as Fs, getPresentationTextLength as Ft, getPresentationFonts as Fu, duplicateSlideAt as G, findShapesWithAnimation as Ga, setShapeRunFormat as Gc, setShapeStrokeJoin as Gi, findSlideLayout as Gl, setShapeTextColumns as Gn, getPresentationHyperlinkCountsBySlide as Go, getShapeBoundsResolved as Gr, getTableCellBorders as Gs, getSlideText as Gt, toWritableTextFormat as Gu, addSlideAt as H, setSlidePlaceholders as Ha, getShapeHyperlink as Hc, setShapeStrokeCap as Hi, setSlideLayoutName as Hl, setShapeTextAnchor as Hn, getDistinctHyperlinkUrls as Ho, getShapeAdjustValues as Hr, getTableCellAlignment as Hs, getSlideLayoutCount as Ht, COMMENT_STATUSES as Hu, resetSlidePlaceholderGeometry as I, setParagraphTypography as Ia, getPresentationModified as Ic, setShapePreset as Ii, setSlideBackgroundImageOpacity as Il, getShapeTextWrap as In, getAllCharts as Io, findShapesInRect as Ir, validatePresentation as Is, getPresentationTextLengthsBySlide as It, getPresentationTheme as Iu, moveSlide as J, setShapeAnimation as Ja, findChartsBySeriesName as Jc, getShapeFillColor as Ji, getSlideLayoutName as Jl, setShapeTextFlat as Jn, getPresentationNotesText as Jo, getShapeDescription as Jr, getTableCellParagraphs as Js, getSlides as Jt, emu as Ju, importSlide as K, getShapeAnimation as Ka, addSlideChart as Kc, setShapeStrokeSketch as Ki, findSlideLayoutByPartName as Kl, setShapeTextDirection as Kn, getPresentationNotesLength as Ko, getShapeCenter as Kr, getTableCellFill as Ks, getSlideTextLength as Kt, asColor as Ku, resetSlidePlaceholderTextFormatting as L, setShapeRunHyperlink as La, incrementRevision as Lc, setShapeRotation as Li, setSlideBackgroundPatternFill as Ll, setShapeAlignment as Ln, getAllComments as Lo, getGroupChildren as Lr, clearTableCellFill as Ls, getShapeAt as Lt, setPresentationFonts as Lu, setShapeLocked as M, setParagraphLevel as Ma, setThumbnail as Mc, setShapeNoFill as Mi, setSlideBackground as Ml, getShapeTextColumns as Mn, clearSlideHyperlinks as Mo, setSlideLayout as Mr, listPackageParts as Ms, getOutlineText as Mt, removeSlideComment as Mu, addMissingSlidePlaceholders as N, setParagraphLineSpacing as Na, getCoreProperties as Nc, setShapeNoStroke as Ni, setSlideBackgroundGradientFill as Nl, getShapeTextDirection as Nn, findSlidesByHyperlink as No, translateShapes as Nr, readPackagePart as Ns, getPresentationShapeCountsBySlide as Nt, setCommentStatus as Nu, setShapeCustomGeometry as O, isParagraphBulletPicture as Oa, setTableStyleId as Oc, setShapeFill as Oi, getSlideMasterBackgroundGradientFill as Ol, getShapeTextAnchor as On, setSlideSize as Oo, getSlideLayout as Or, getOrphanMediaPartNames as Os, findSlideByTitle as Ot, getPresentationCommentCountsBySlide as Ou, addSlidePlaceholder as P, setParagraphSpacing as Pa, getExtendedProperties as Pc, setShapePatternFill as Pi, setSlideBackgroundImage as Pl, getShapeTextFlat as Pn, findSlidesWithChartKind as Po, centerShapeOnSlide as Pr, setMediaPartBytes as Ps, getPresentationText as Pt, setCommentText as Pu, swapSlides as Q, findSlidesByLayoutName as Qa, getPresentationChartKindCounts as Qc, getShapeStroke as Qi, getSlideLayoutUsageCounts as Ql, clearShapeEffects as Qn, getSlideNotesParagraphEndFormat as Qo, getShapeName as Qr, getTableCellText as Qs, isSlideLayoutBackgroundGraphicsHidden as Qt, addBlankSlide as R, setShapeRunText as Ra, setCoreProperties as Rc, setShapeSize as Ri, getShapeGradientFill as Rl, setShapeBulletStyle as Rn, getAllHyperlinks as Ro, getGroupTransform as Rr, getPresentationTableCountsBySlide as Rs, getSlideAt as Rt, setPresentationTheme as Ru, groupShapes as S, getShapeParagraphElements as Sa, setTableCellText as Sc, clearShapeStroke as Si, getSlideLayoutBackgroundGradientFill as Sl, moveSlideAnimation as Sn, setShapeImageRecolor as So, findSlidePlaceholderByIdx as Sr, getShapeMedia as Ss, setSlideMasterPlaceholderIncluded as St, getCommentPosition as Su, getParagraphElementLanguages as T, getShapeRunHyperlink as Ta, setTableColumnWidth as Tc, getShapeStrokeDash as Ti, getSlideLayoutBackgroundShapes as Tl, appendShapeText as Tn, SLIDE_SIZE_4_3 as To, getShapeSlide as Tr, _internalPackageOf as Ts, setSlideSections as Tt, getCommentText as Tu, addTitleSlide as U, setSlideTitle as Ua, getShapeRunFormatEffective as Uc, setShapeStrokeCompound as Ui, setSlideLayoutPlaceholderBounds as Ul, setShapeTextAutoFit as Un, getEmptySlides as Uo, getShapeAltTitle as Ur, getTableCellAnchor as Us, getSlideOutline as Ut, BUILTIN_TABLE_STYLES as Uu, addSlide as V, setSlideBody as Va, getParagraphPropertiesEffective as Vc, setShapeStrokeArrow as Vi, setSlideLayoutBackground as Vl, setShapeText3D as Vn, getAllTables as Vo, getPresetGeometry as Vr, getTableCell as Vs, getSlideInfo as Vt, savePresentation as Vu, duplicateSlide as W, clearSlideAnimations as Wa, setShapeHyperlink as Wc, setShapeStrokeDash as Wi, findLayoutsWithPlaceholderType as Wl, setShapeTextBodyRotationDeg as Wn, getHiddenSlides as Wo, getShapeBounds as Wr, getTableCellAppearanceEffective as Ws, getSlidePartName as Wt, BUILTIN_PICTURE_STYLES as Wu, reverseSlides as X, findOverlappingShapePairs as Xa, findChartsWithTrendlines as Xc, getShapeFillEffective as Xi, getSlideLayoutPlaceholders as Xl, setShapeTextMargins as Xn, getSlideNotesLength as Xo, getShapeId as Xr, getTableCellRunFormatEffective as Xs, isSlideBackgroundGraphicsHidden as Xt, mm as Xu, removeSlide as Y, findFlippedShapes as Ya, findChartsWithDataLabels as Yc, getShapeFillColorResolved as Yi, getSlideLayoutPartName$1 as Yl, setShapeTextFormat as Yn, getSlideNotes as Yo, getShapeFlip as Yr, getTableCellPosition as Ys, getSlidesByLayout as Yt, inches as Yu, sortSlides as Z, findShapesOutsideCanvas as Za, getPresentationChartCountsBySlide as Zc, getShapeFillOpacity as Zi, getSlideLayoutType as Zl, setShapeTextWrap as Zn, getSlideNotesLineBreaks as Zo, getShapeKind as Zr, getTableCellSpan as Zs, isSlideHidden as Zt, pt as Zu, resetShapeVideoFormatting as _, getParagraphLevel as _a, setTableCellBorders as _c, setShapeBounds as _i, getSlideBackgroundImageIntrinsicSize as _l, getShapeZIndex as _n, resetShapeImageColorEffects as _o, findShapesByName as _r, getSlideTransitionSound as _s, removeSlideMaster as _t, getCommentAuthor as _u, getCollapsedOutlineSlides as a, getShapeStrokeJoin as aa, getTableSize as ac, getShapeText as ai, setChartData as al, setSlideBackgroundGraphicsHidden as an, getShapeImageBytes as ao, setShapeGlow as ar, getSlidesWithOverlap as as, setNotesMasterPlaceholderIncluded as at, getCustomShows as au, setShapeImageCompressionState as b, getShapeHyperlinkTooltip as ba, setTableCellMargins as bc, shapesOverlap as bi, getSlideColorMapOverride as bl, sendShapeToBack as bn, setShapeImageCrop as bo, findShapesWithHyperlinks as br, addSlideMedia as bs, setSlideLayoutTitleIncluded as bt, getCommentFormat as bu, getGridSpacing as c, getShapeRunFormat as ca, insertTableColumn as cc, getSlideMasterPartNames as ci, resolveDeckBodyTextColor as cl, addSlideImage as cn, getShapeImageDuotone as co, setShapeShadow as cr, hasSlideNotes as cs, setSlideShowProperties as ct, addSlideComment as cu, setDrawingGuidesVisible as d, getParagraphAlignment as da, isTableShape as dc, isShapeHidden as di, copySlideBackground as dl, addSlideTable as dn, getShapeImageLinkUrl as do, findShapeById as dr, resolveSlideNotesTextColor as ds, addSlideMaster as dt, findCommentAuthorByName as du, getShapeStrokeColor as ea, getTableCellTextDirection as ec, getShapePlaceholderType as ei, getShapeChartKind as el, replaceTextInPresentation as en, findSlidesByLayoutType as eo, getShape3D as er, getSlidesWithCharts as es, getHandoutSlidesPerPage as et, getSlideLayouts as eu, setGridSpacing as f, getParagraphBullet as fa, mergeTableCells as fc, isShapePlaceholder as fi, getSlideBackground as fl, addSlideTextBox as fn, getShapeImageOpacity as fo, findShapeByName as fr, setSlideNotes as fs, getSlideMasterLayouts as ft, findCommentsAfter as fu, setSlideMasterBackgroundStyle as g, getParagraphIndent as ga, setTableCellAnchor as gc, setShapeAltTitle as gi, getSlideBackgroundImageFillLayout as gl, copyShape as gn, isShapeImageGrayscale as go, findShapesByKind as gr, getSlideTransition as gs, removeSlideLayout as gt, findSlidesWithCommentsByAuthor as gu, getSlideMasterBackgroundStyles as h, getParagraphEndFormat as ha, setTableCellAlignment as hc, renameShape as hi, getSlideBackgroundImageCrop as hl, clearSlideShapes as hn, hasShapeText as ho, findShapesByHyperlink as hr, clearSlideTransition as hs, isSlideMasterPreserved as ht, findCommentsByText as hu, setShapeImageFillLayout as i, getShapeStrokeGradient as ia, getTableRowHeights as ic, getShapeSize as ii, getSlideCharts as il, searchSlides as in, getShapeImageBrightness as io, setShape3D as ir, getSlidesWithNotes as is, setHandoutSlidesPerPage as it, setShapeClickAction as iu, setShapeAspectRatioLocked as j, setParagraphIndent as ja, removeThumbnail as jc, setShapeImageFill as ji, getSlideMasterShapes as jl, getShapeTextBodyRotationDeg as jn, clearAllSlideNotes as jo, replaceTokensInSlide as jr, getSlideMediaPartNames as js, getAllShapes as jt, getSlideComments as ju, isShapeAspectRatioLocked as k, setParagraphAlignment as ka, splitTableCell as kc, setShapeFlip as ki, getSlideMasterBackgroundImageBytes as kl, getShapeTextAutoFit as kn, appendSlideNotes as ko, getSlideShapes as kr, getPackageSize as ks, findSlidesByNotes as kt, getPresentationCommenters as ku, getSnapToGrid as l, resolveDrawingColor as la, insertTableRow as lc, getSlideMasterUsageCounts as li, applySlideBackgroundToAll as ll, addSlideLine as ln, getShapeImageFillBytes as lo, setShapeSoftEdge as lr, removeSlideNotes as ls, addSlideLayout as lt, clearAllSlideComments as lu, setSnapToGrid as m, getParagraphBulletStyle as ma, removeTableRow as mc, pointInShape as mi, getSlideBackgroundImageBytes as ml, bringShapeToFront as mn, hasShapeImage as mo, findShapeInPresentation as mr, transformSlideNotesCase as ms, getSlideMasterPlaceholders as mt, findCommentsByAuthor as mu, getShapeImageFillLayout as n, getShapeStrokeCompound as na, getTableColumnWidths as nc, getShapePreset as ni, getShapeChartSeriesValues as nl, replaceTextInSlideNotes as nn, getShapeImageArtisticEffect as no, getShapeEffects as nr, getSlidesWithHyperlinks as ns, getNotesPageSize as nt, isChartSpec as nu, getDrawingGuides as o, getShapeStrokeOpacity as oa, getTableStyleFlags as oc, getSlideMasterCount as oi, setChartSpec as ol, setSlideHidden as on, getShapeImageContrast as oo, setShapeInnerShadow as or, getSlidesWithTables as os, setNotesPageOrientation as ot, setCustomShows as ou, setSlideOutlineCollapsed as p, getParagraphBulletImageBytes as pa, removeTableColumn as pc, isShapeTextBox as pi, getSlideBackgroundGradientFill as pl, bringShapeForward as pn, getShapeImagePartName as po, findShapeByText as pr, setSlideNotesFormat as ps, getSlideMasterName as pt, findCommentsBefore as pu, mergePresentations as q, getSlideAnimations as qa, findChartByKind as qc, getShapeFill as qi, findSlideLayoutByType as ql, setShapeTextField as qn, getPresentationNotesLengthsBySlide as qo, getShapeCustomGeometry as qr, getTableCellMargins as qs, getSlideXmlString as qt, cm as qu, getShapeImageIntrinsicSize as r, getShapeStrokeEffective as ra, getTableDimensions as rc, getShapeRotation as ri, getShapeChartSpec as rl, replaceTokensInPresentation as rn, getShapeImageBiLevelThreshold as ro, getShapeEffectsEffective as rr, getSlidesWithImages as rs, setHandoutMasterPlaceholderIncluded as rt, getShapeClickAction as ru, getDrawingGuidesVisible as s, getShapeStrokeWidth as sa, getTableStyleId as sc, getSlideMasterPartName as si, getEffectiveColorMap as sl, slideHasAnimations as sn, getShapeImageCrop as so, setShapeReflection as sr, getVisibleSlides as ss, getSlideShowProperties as st, setShapeImage as su, VERSION as t, getShapeStrokeColorResolved as ta, getTableCells as tc, getShapePosition as ti, getShapeChartSeriesNames as tl, replaceTextInSlide as tn, getPresentationImageCountsBySlide as to, getShapeEffect as tr, getSlidesWithComments as ts, getNotesMasterPlaceholders as tt, getUnusedSlideLayouts as tu, setDrawingGuides as u, resolveDrawingColorOpacity as ua, isChartShape as uc, getUnusedSlideMasters as ui, clearSlideBackground as ul, addSlideShape as un, getShapeImageFormat as uo, findEmptyPlaceholders as ur, replaceHyperlink as us, addSlideLayoutPlaceholder as ut, clearSlideComments as uu, getShapeImageCompressionState as v, getParagraphLineSpacing as va, setTableCellClickAction as vc, setShapeDescription as vi, getSlideBackgroundImageOpacity as vl, removeShape as vn, setShapeImageBrightness as vo, findShapesByPreset as vr, setSlideTransition as vs, setSlideLayoutBackgroundGraphicsHidden as vt, getCommentAuthors as vu, setShapeStyle as w, getShapeRunCount as wa, setTableCellTextFormat as wc, getShapeStrokeArrow as wi, getSlideLayoutBackgroundPatternFill as wl, updateSlideAnimation as wn, SLIDE_SIZE_16_9 as wo, getShapeIndex as wr, setShapeMediaPlayback as ws, getSlideSections as wt, getCommentStatus as wu, setShapePictureStyle as x, getShapeParagraphCount as xa, setTableCellParagraphs as xc, clearShapeFill as xi, getSlideLayoutBackground as xl, setShapeZIndex as xn, setShapeImageOpacity as xo, findSlidePlaceholder as xr, findShapesWithMedia as xs, setSlideMasterName as xt, getCommentParent as xu, getShapePictureStyle as y, getParagraphSpacing as ya, setTableCellFill as yc, setShapeHidden as yi, getSlideBackgroundPatternFill as yl, sendShapeBackward as yn, setShapeImageContrast as yo, findShapesByText as yr, setSlideTransitionSound as ys, setSlideLayoutFootersIncluded as yt, getCommentDate as yu, addContentSlide as z, getSlideBody as za, setExtendedProperties as zc, setShapeSlideBackgroundFill as zi, getShapeGradientFillEffective as zl, setShapeParagraphs as zn, getAllImages as zo, getMaxShapeId as zr, getSlideTables as zs, getSlideCount as zt, createPresentation as zu };
56232
+ export { swapSlides as $, findSlidesByLayoutName as $a, getPresentationChartKindCounts as $c, getShapeStroke as $i, getSlideLayoutUsageCounts as $l, clearShapeEffects as $n, getSlideNotesParagraphEndFormat as $o, getShapeName as $r, getTableCellText as $s, isSlideLayoutBackgroundGraphicsHidden as $t, isShapeAspectRatioLocked as A, setParagraphAlignment as Aa, splitTableCell as Ac, setShapeFlip as Ai, getSlideMasterBackgroundImageBytes as Al, getShapeTextAutoFit as An, appendSlideNotes as Ao, getSlideShapes as Ar, getPackageSize as As, findSlidesByNotes as At, getPresentationCommenters as Au, addContentSlide as B, getSlideBody as Ba, setExtendedProperties as Bc, setShapeSlideBackgroundFill as Bi, getShapeGradientFillEffective as Bl, setShapeParagraphs as Bn, getAllImages as Bo, getMaxShapeId as Br, getSlideTables as Bs, getSlideCount as Bt, createPresentation as Bu, groupShapes as C, getShapeParagraphElements as Ca, setTableCellText as Cc, clearShapeStroke as Ci, getSlideLayoutBackgroundGradientFill as Cl, moveSlideAnimation as Cn, setShapeImageRecolor as Co, findSlidePlaceholderByIdx as Cr, getShapeMedia as Cs, setSlideMasterPlaceholderIncluded as Ct, getCommentPosition as Cu, getShapeTextLanguage as D, getShapeRunHyperlinkTooltip as Da, setTableRowHeight as Dc, getShapeStrokeSketch as Di, getSlideLayoutShapes as Dl, getShapeBodyPrEffective as Dn, getPresentationFirstSlideNumber as Do, getShapeXmlString as Dr, compactPackage as Ds, findSlideByPartName as Dt, getCommentsSortedByDate as Du, getParagraphElementLanguages as E, getShapeRunHyperlink as Ea, setTableColumnWidth as Ec, getShapeStrokeDash as Ei, getSlideLayoutBackgroundShapes as El, appendShapeText as En, SLIDE_SIZE_4_3 as Eo, getShapeSlide as Er, _internalPackageOf as Es, setSlideSections as Et, getCommentText as Eu, addSlidePlaceholder as F, setParagraphSpacing as Fa, getExtendedProperties as Fc, setShapePatternFill as Fi, setSlideBackgroundImage as Fl, getShapeTextFlat as Fn, findSlidesWithChartKind as Fo, centerShapeOnSlide as Fr, setMediaPartBytes as Fs, getPresentationText as Ft, setCommentText as Fu, duplicateSlide as G, clearSlideAnimations as Ga, setShapeHyperlink as Gc, setShapeStrokeDash as Gi, findLayoutsWithPlaceholderType as Gl, setShapeTextBodyRotationDeg as Gn, getHiddenSlides as Go, getShapeBounds as Gr, getTableCellAppearanceEffective as Gs, getSlidePartName as Gt, BUILTIN_PICTURE_STYLES as Gu, addSlide as H, setSlideBody as Ha, getParagraphPropertiesEffective as Hc, setShapeStrokeArrow as Hi, setSlideLayoutBackground as Hl, setShapeText3D as Hn, getAllTables as Ho, getPresetGeometry as Hr, getTableCell as Hs, getSlideInfo as Ht, savePresentation as Hu, resetSlideLayout as I, setParagraphTabs as Ia, getPresentationCreated as Ic, setShapePosition as Ii, setSlideBackgroundImageFillLayout as Il, getShapeTextMargins as In, findSlidesWithChartTrendlines as Io, findShapesAtPoint as Ir, slidesUsingMediaPart as Is, getPresentationTextLength as It, getPresentationFonts as Iu, mergePresentations as J, getSlideAnimations as Ja, findChartByKind as Jc, getShapeFill as Ji, findSlideLayoutByType as Jl, setShapeTextField as Jn, getPresentationNotesLengthsBySlide as Jo, getShapeCustomGeometry as Jr, getTableCellMargins as Js, getSlideXmlString as Jt, cm as Ju, duplicateSlideAt as K, findShapesWithAnimation as Ka, setShapeRunFormat as Kc, setShapeStrokeJoin as Ki, findSlideLayout as Kl, setShapeTextColumns as Kn, getPresentationHyperlinkCountsBySlide as Ko, getShapeBoundsResolved as Kr, getTableCellBorders as Ks, getSlideText as Kt, toWritableTextFormat as Ku, resetSlidePlaceholderGeometry as L, setParagraphTypography as La, getPresentationModified as Lc, setShapePreset as Li, setSlideBackgroundImageOpacity as Ll, getShapeTextWrap as Ln, getAllCharts as Lo, findShapesInRect as Lr, validatePresentation as Ls, getPresentationTextLengthsBySlide as Lt, getPresentationTheme as Lu, setShapeAspectRatioLocked as M, setParagraphIndent as Ma, removeThumbnail as Mc, setShapeImageFill as Mi, getSlideMasterShapes as Ml, getShapeTextBodyRotationDeg as Mn, clearAllSlideNotes as Mo, replaceTokensInSlide as Mr, getSlideMediaPartNames as Ms, getAllShapes as Mt, getSlideComments as Mu, setShapeLocked as N, setParagraphLevel as Na, setThumbnail as Nc, setShapeNoFill as Ni, setSlideBackground as Nl, getShapeTextColumns as Nn, clearSlideHyperlinks as No, setSlideLayout as Nr, listPackageParts as Ns, getOutlineText as Nt, removeSlideComment as Nu, setShapeTextLanguage as O, getShapeRunText as Oa, setTableStyleFlags as Oc, setShapeAdjustValues as Oi, getSlideMasterBackground as Ol, getShapeText3D as On, getSlideSize as Oo, getShapesBounds as Or, getMediaParts as Os, findSlideByText as Ot, getPresentationCommentCountsByAuthor as Ou, addMissingSlidePlaceholders as P, setParagraphLineSpacing as Pa, getCoreProperties as Pc, setShapeNoStroke as Pi, setSlideBackgroundGradientFill as Pl, getShapeTextDirection as Pn, findSlidesByHyperlink as Po, translateShapes as Pr, readPackagePart as Ps, getPresentationShapeCountsBySlide as Pt, setCommentStatus as Pu, sortSlides as Q, findShapesOutsideCanvas as Qa, getPresentationChartCountsBySlide as Qc, getShapeFillOpacity as Qi, getSlideLayoutType as Ql, setShapeTextWrap as Qn, getSlideNotesLineBreaks as Qo, getShapeKind as Qr, getTableCellSpan as Qs, isSlideHidden as Qt, pt as Qu, resetSlidePlaceholderTextFormatting as R, setShapeRunHyperlink as Ra, incrementRevision as Rc, setShapeRotation as Ri, setSlideBackgroundPatternFill as Rl, setShapeAlignment as Rn, getAllComments as Ro, getGroupChildren as Rr, clearTableCellFill as Rs, getShapeAt as Rt, setPresentationFonts as Ru, setShapePictureStyle as S, getShapeParagraphCount as Sa, setTableCellParagraphs as Sc, clearShapeFill as Si, getSlideLayoutBackground as Sl, setShapeZIndex as Sn, setShapeImageOpacity as So, findSlidePlaceholder as Sr, findShapesWithMedia as Ss, setSlideMasterName as St, getCommentParent as Su, setShapeStyle as T, getShapeRunCount as Ta, setTableCellTextFormat as Tc, getShapeStrokeArrow as Ti, getSlideLayoutBackgroundPatternFill as Tl, updateSlideAnimation as Tn, SLIDE_SIZE_16_9 as To, getShapeIndex as Tr, setShapeMediaPlayback as Ts, getSlideSections as Tt, getCommentStatus as Tu, addSlideAt as U, setSlidePlaceholders as Ua, getShapeHyperlink as Uc, setShapeStrokeCap as Ui, setSlideLayoutName as Ul, setShapeTextAnchor as Un, getDistinctHyperlinkUrls as Uo, getShapeAdjustValues as Ur, getTableCellAlignment as Us, getSlideLayoutCount as Ut, COMMENT_STATUSES as Uu, addSectionHeaderSlide as V, getSlideTitle as Va, touchModified as Vc, setShapeStroke as Vi, clearSlideLayoutBackground as Vl, setShapeText as Vn, getAllNotes as Vo, getMaxShapeIdInPresentation as Vr, getTableBackgroundEffective as Vs, getSlideIndex as Vt, loadPresentation as Vu, addTitleSlide as W, setSlideTitle as Wa, getShapeRunFormatEffective as Wc, setShapeStrokeCompound as Wi, setSlideLayoutPlaceholderBounds as Wl, setShapeTextAutoFit as Wn, getEmptySlides as Wo, getShapeAltTitle as Wr, getTableCellAnchor as Ws, getSlideOutline as Wt, BUILTIN_TABLE_STYLES as Wu, removeSlide as X, findFlippedShapes as Xa, findChartsWithDataLabels as Xc, getShapeFillColorResolved as Xi, getSlideLayoutPartName$1 as Xl, setShapeTextFormat as Xn, getSlideNotes as Xo, getShapeFlip as Xr, getTableCellPosition as Xs, getSlidesByLayout as Xt, inches as Xu, moveSlide as Y, setShapeAnimation as Ya, findChartsBySeriesName as Yc, getShapeFillColor as Yi, getSlideLayoutName as Yl, setShapeTextFlat as Yn, getPresentationNotesText as Yo, getShapeDescription as Yr, getTableCellParagraphs as Ys, getSlides as Yt, emu as Yu, reverseSlides as Z, findOverlappingShapePairs as Za, findChartsWithTrendlines as Zc, getShapeFillEffective as Zi, getSlideLayoutPlaceholders as Zl, setShapeTextMargins as Zn, getSlideNotesLength as Zo, getShapeId as Zr, getTableCellRunFormatEffective as Zs, isSlideBackgroundGraphicsHidden as Zt, mm as Zu, setSlideMasterBackgroundStyle as _, getParagraphIndent as _a, setTableCellAnchor as _c, setShapeAltTitle as _i, getSlideBackgroundImageFillLayout as _l, copyShape as _n, isShapeImageGrayscale as _o, findShapesByKind as _r, getSlideTransition as _s, removeSlideLayout as _t, findSlidesWithCommentsByAuthor as _u, getPresentationTextReview as a, getShapeStrokeGradient as aa, getTableRowHeights as ac, getShapeSize as ai, getSlideCharts as al, searchSlides as an, getShapeImageBrightness as ao, setShape3D as ar, getSlidesWithNotes as as, setHandoutSlidesPerPage as at, setShapeClickAction as au, getShapePictureStyle as b, getParagraphSpacing as ba, setTableCellFill as bc, setShapeHidden as bi, getSlideBackgroundPatternFill as bl, sendShapeBackward as bn, setShapeImageContrast as bo, findShapesByText as br, setSlideTransitionSound as bs, setSlideLayoutFootersIncluded as bt, getCommentDate as bu, getDrawingGuidesVisible as c, getShapeStrokeWidth as ca, getTableStyleId as cc, getSlideMasterPartName as ci, getEffectiveColorMap as cl, slideHasAnimations as cn, getShapeImageCrop as co, setShapeReflection as cr, getVisibleSlides as cs, getSlideShowProperties as ct, setShapeImage as cu, setDrawingGuides as d, resolveDrawingColorOpacity as da, isChartShape as dc, getUnusedSlideMasters as di, clearSlideBackground as dl, addSlideShape as dn, getShapeImageFormat as do, findEmptyPlaceholders as dr, replaceHyperlink as ds, addSlideLayoutPlaceholder as dt, clearSlideComments as du, getShapeStrokeCap as ea, getTableCellText3D as ec, getShapePlaceholderIdx as ei, getShapeChartCategories as el, replaceTextInNotes as en, findSlidesByLayoutPartName as eo, findShapesByEffect as er, getSlideNotesTextFormats as es, getHandoutMasterPlaceholders as et, getSlideLayoutUsageCountsByType as eu, setDrawingGuidesVisible as f, getParagraphAlignment as fa, isTableShape as fc, isShapeHidden as fi, copySlideBackground as fl, addSlideTable as fn, getShapeImageLinkUrl as fo, findShapeById as fr, resolveSlideNotesTextColor as fs, addSlideMaster as ft, findCommentAuthorByName as fu, getSlideMasterBackgroundStyles as g, getParagraphEndFormat as ga, setTableCellAlignment as gc, renameShape as gi, getSlideBackgroundImageCrop as gl, clearSlideShapes as gn, hasShapeText as go, findShapesByHyperlink as gr, clearSlideTransition as gs, isSlideMasterPreserved as gt, findCommentsByText as gu, setSnapToGrid as h, getParagraphBulletStyle as ha, removeTableRow as hc, pointInShape as hi, getSlideBackgroundImageBytes as hl, bringShapeToFront as hn, hasShapeImage as ho, findShapeInPresentation as hr, transformSlideNotesCase as hs, getSlideMasterPlaceholders as ht, findCommentsByAuthor as hu, setShapeImageFillLayout as i, getShapeStrokeEffective as ia, getTableDimensions as ic, getShapeRotation as ii, getShapeChartSpec as il, replaceTokensInPresentation as in, getShapeImageBiLevelThreshold as io, getShapeEffectsEffective as ir, getSlidesWithImages as is, setHandoutMasterPlaceholderIncluded as it, getShapeClickAction as iu, isShapeLocked as j, setParagraphBullet as ja, getThumbnail as jc, setShapeGradientFill as ji, getSlideMasterBackgroundPatternFill as jl, getShapeTextAutoFitParams as jn, clearAllHyperlinks as jo, getSlidesWithEmptyPlaceholders as jr, getPresentationSummary as js, findSlidesByText as jt, getSlideCommentAuthors as ju, setShapeCustomGeometry as k, isParagraphBulletPicture as ka, setTableStyleId as kc, setShapeFill as ki, getSlideMasterBackgroundGradientFill as kl, getShapeTextAnchor as kn, setSlideSize as ko, getSlideLayout as kr, getOrphanMediaPartNames as ks, findSlideByTitle as kt, getPresentationCommentCountsBySlide as ku, getGridSpacing as l, getShapeRunFormat as la, insertTableColumn as lc, getSlideMasterPartNames as li, resolveDeckBodyTextColor as ll, addSlideImage as ln, getShapeImageDuotone as lo, setShapeShadow as lr, hasSlideNotes as ls, setSlideShowProperties as lt, addSlideComment as lu, setSlideOutlineCollapsed as m, getParagraphBulletImageBytes as ma, removeTableColumn as mc, isShapeTextBox as mi, getSlideBackgroundGradientFill as ml, bringShapeForward as mn, getShapeImagePartName as mo, findShapeByText as mr, setSlideNotesFormat as ms, getSlideMasterName as mt, findCommentsBefore as mu, getShapeImageFillLayout as n, getShapeStrokeColorResolved as na, getTableCells as nc, getShapePosition as ni, getShapeChartSeriesNames as nl, replaceTextInSlide as nn, getPresentationImageCountsBySlide as no, getShapeEffect as nr, getSlidesWithComments as ns, getNotesMasterPlaceholders as nt, getUnusedSlideLayouts as nu, getCollapsedOutlineSlides as o, getShapeStrokeJoin as oa, getTableSize as oc, getShapeText as oi, setChartData as ol, setSlideBackgroundGraphicsHidden as on, getShapeImageBytes as oo, setShapeGlow as or, getSlidesWithOverlap as os, setNotesMasterPlaceholderIncluded as ot, getCustomShows as ou, setGridSpacing as p, getParagraphBullet as pa, mergeTableCells as pc, isShapePlaceholder as pi, getSlideBackground as pl, addSlideTextBox as pn, getShapeImageOpacity as po, findShapeByName as pr, setSlideNotes as ps, getSlideMasterLayouts as pt, findCommentsAfter as pu, importSlide as q, getShapeAnimation as qa, addSlideChart as qc, setShapeStrokeSketch as qi, findSlideLayoutByPartName as ql, setShapeTextDirection as qn, getPresentationNotesLength as qo, getShapeCenter as qr, getTableCellFill as qs, getSlideTextLength as qt, asColor as qu, getShapeImageIntrinsicSize as r, getShapeStrokeCompound as ra, getTableColumnWidths as rc, getShapePreset as ri, getShapeChartSeriesValues as rl, replaceTextInSlideNotes as rn, getShapeImageArtisticEffect as ro, getShapeEffects as rr, getSlidesWithHyperlinks as rs, getNotesPageSize as rt, isChartSpec as ru, getDrawingGuides as s, getShapeStrokeOpacity as sa, getTableStyleFlags as sc, getSlideMasterCount as si, setChartSpec as sl, setSlideHidden as sn, getShapeImageContrast as so, setShapeInnerShadow as sr, getSlidesWithTables as ss, setNotesPageOrientation as st, setCustomShows as su, VERSION as t, getShapeStrokeColor as ta, getTableCellTextDirection as tc, getShapePlaceholderType as ti, getShapeChartKind as tl, replaceTextInPresentation as tn, findSlidesByLayoutType as to, getShape3D as tr, getSlidesWithCharts as ts, getHandoutSlidesPerPage as tt, getSlideLayouts as tu, getSnapToGrid as u, resolveDrawingColor as ua, insertTableRow as uc, getSlideMasterUsageCounts as ui, applySlideBackgroundToAll as ul, addSlideLine as un, getShapeImageFillBytes as uo, setShapeSoftEdge as ur, removeSlideNotes as us, addSlideLayout as ut, clearAllSlideComments as uu, resetShapeVideoFormatting as v, getParagraphLevel as va, setTableCellBorders as vc, setShapeBounds as vi, getSlideBackgroundImageIntrinsicSize as vl, getShapeZIndex as vn, resetShapeImageColorEffects as vo, findShapesByName as vr, getSlideTransitionSound as vs, removeSlideMaster as vt, getCommentAuthor as vu, ungroupShapes as w, getShapeRunClickAction as wa, setTableCellTextDirection as wc, getShapePatternFill as wi, getSlideLayoutBackgroundImageBytes as wl, removeSlideAnimation as wn, SLIDE_SIZE_16_10 as wo, findSlidePlaceholders as wr, getShapeMediaPlayback as ws, setSlideMasterPreserved as wt, getCommentSlide as wu, setShapeImageCompressionState as x, getShapeHyperlinkTooltip as xa, setTableCellMargins as xc, shapesOverlap as xi, getSlideColorMapOverride as xl, sendShapeToBack as xn, setShapeImageCrop as xo, findShapesWithHyperlinks as xr, addSlideMedia as xs, setSlideLayoutTitleIncluded as xt, getCommentFormat as xu, getShapeImageCompressionState as y, getParagraphLineSpacing as ya, setTableCellClickAction as yc, setShapeDescription as yi, getSlideBackgroundImageOpacity as yl, removeShape as yn, setShapeImageBrightness as yo, findShapesByPreset as yr, setSlideTransition as ys, setSlideLayoutBackgroundGraphicsHidden as yt, getCommentAuthors as yu, addBlankSlide as z, setShapeRunText as za, setCoreProperties as zc, setShapeSize as zi, getShapeGradientFill as zl, setShapeBulletStyle as zn, getAllHyperlinks as zo, getGroupTransform as zr, getPresentationTableCountsBySlide as zs, getSlideAt as zt, setPresentationTheme as zu };
55922
56233
 
55923
- //# sourceMappingURL=api-CSDea_92.js.map
56234
+ //# sourceMappingURL=api-DmW9gw8r.js.map