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("