import { describe, expect, it } from "vitest";
import {
WORD_NAMESPACE,
appendElement,
parseXmlPart,
serializeXmlPart,
validateWordprocessingElementOrder
} from "../src/ooxml.js";
const encoder = new TextEncoder();
const decoder = new TextDecoder();
function paragraphPropertiesDocument(children = "") {
return parseXmlPart(
encoder.encode(
`` +
`${children}` +
""
),
"word/document.xml"
);
}
describe("OOXML 子节点顺序", () => {
it("按 WordprocessingML 顺序插入新增属性", () => {
const document = paragraphPropertiesDocument(
""
);
const properties = document.getElementsByTagNameNS(
WORD_NAMESPACE,
"pPr"
)[0]!;
appendElement(properties, WORD_NAMESPACE, "w:pBdr");
appendElement(properties, WORD_NAMESPACE, "w:keepNext");
appendElement(properties, WORD_NAMESPACE, "w:spacing");
const xml = decoder.decode(serializeXmlPart(document));
expect(xml.indexOf("
validateWordprocessingElementOrder(
document,
"word/document.xml"
)
).not.toThrow();
});
it("在序列化时规范化已有乱序属性", () => {
const document = paragraphPropertiesDocument(
"" +
""
);
const serialized = serializeXmlPart(document);
const reparsed = parseXmlPart(
serialized,
"word/document.xml"
);
expect(() =>
validateWordprocessingElementOrder(
reparsed,
"word/document.xml"
)
).not.toThrow();
const xml = decoder.decode(serialized);
expect(xml.indexOf(" {
const document = paragraphPropertiesDocument(
"" +
""
);
expect(() =>
validateWordprocessingElementOrder(
document,
"word/document.xml"
)
).toThrow(
"word/document.xml 的 w:pPr 子节点顺序无效"
);
});
it("规范化表格、单元格和边框顺序", () => {
const document = parseXmlPart(
encoder.encode(
`` +
"" +
"" +
"" +
"" +
"" +
"" +
""
),
"word/document.xml"
);
const serialized = serializeXmlPart(document);
const reparsed = parseXmlPart(
serialized,
"word/document.xml"
);
expect(() =>
validateWordprocessingElementOrder(
reparsed,
"word/document.xml"
)
).not.toThrow();
});
it("规范化表格条件样式的属性顺序", () => {
const document = parseXmlPart(
encoder.encode(
`` +
'' +
'' +
"" +
""
),
"word/styles.xml"
);
const xml = decoder.decode(serializeXmlPart(document));
expect(xml.indexOf("