Files
docx-js/src/patcher/paragraph-split-inject.ts

55 lines
1.9 KiB
TypeScript
Raw Normal View History

2023-02-24 01:05:43 +00:00
import { Element } from "xml-js";
2023-02-25 22:18:56 +00:00
import { createTextElementContents, patchSpaceAttribute } from "./util";
2023-02-24 01:05:43 +00:00
export const findRunElementIndexWithToken = (paragraphElement: Element, token: string): number => {
for (let i = 0; i < (paragraphElement.elements ?? []).length; i++) {
const element = paragraphElement.elements![i];
if (element.type === "element" && element.name === "w:r") {
const textElement = (element.elements ?? []).filter((e) => e.type === "element" && e.name === "w:t");
for (const text of textElement) {
if ((text.elements?.[0].text as string)?.includes(token)) {
return i;
}
}
}
}
2023-03-15 02:46:39 +00:00
2023-02-24 01:05:43 +00:00
throw new Error("Token not found");
};
export const splitRunElement = (runElement: Element, token: string): { readonly left: Element; readonly right: Element } => {
let splitIndex = 0;
const splitElements =
runElement.elements
?.map((e, i) => {
if (e.type === "element" && e.name === "w:t") {
2023-03-16 01:55:18 +00:00
const text = (e.elements?.[0].text as string) ?? "";
2023-02-24 01:05:43 +00:00
const splitText = text.split(token);
const newElements = splitText.map((t) => ({
...e,
2023-02-25 22:18:56 +00:00
...patchSpaceAttribute(e),
2023-02-24 01:05:43 +00:00
elements: createTextElementContents(t),
}));
splitIndex = i;
return newElements;
} else {
return e;
}
})
.flat() ?? [];
const leftRunElement: Element = {
...JSON.parse(JSON.stringify(runElement)),
elements: splitElements.slice(0, splitIndex + 1),
};
const rightRunElement: Element = {
...JSON.parse(JSON.stringify(runElement)),
elements: splitElements.slice(splitIndex + 1),
};
return { left: leftRunElement, right: rightRunElement };
};