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 };
|
|
|
|
};
|