paper-burner/js/history/exporter/docx_styles.js

224 lines
5.6 KiB
JavaScript

/**
* DOCX 样式模块
* 提供 Word 文档的样式定义和页脚模板
*/
(function(window) {
'use strict';
/**
* 标题大纲级别映射
*/
const HEADING_OUTLINE_LEVELS = {
Heading1: 0,
Heading2: 1,
Heading3: 2,
Heading4: 3,
Heading5: 4,
Heading6: 5
};
/**
* 构建 Word 样式 XML
* @returns {string} styles.xml 内容
*/
function buildStylesXml() {
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:styles xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:docDefaults>
<w:rPrDefault>
<w:rPr>
<w:rFonts w:ascii="Calibri" w:hAnsi="Calibri" w:eastAsia="DengXian" w:cs="Calibri"/>
<w:sz w:val="21"/>
<w:szCs w:val="21"/>
</w:rPr>
</w:rPrDefault>
<w:pPrDefault>
<w:pPr>
<w:spacing w:after="160"/>
</w:pPr>
</w:pPrDefault>
</w:docDefaults>
<w:style w:type="paragraph" w:default="1" w:styleId="Normal">
<w:name w:val="Normal"/>
<w:qFormat/>
<w:pPr>
<w:spacing w:after="160"/>
</w:pPr>
<w:rPr>
<w:rFonts w:ascii="Calibri" w:hAnsi="Calibri" w:eastAsia="DengXian" w:cs="Calibri"/>
<w:sz w:val="21"/>
<w:szCs w:val="21"/>
</w:rPr>
</w:style>
<w:style w:type="paragraph" w:styleId="Title">
<w:name w:val="Title"/>
<w:basedOn w:val="Normal"/>
<w:next w:val="Normal"/>
<w:uiPriority w:val="1"/>
<w:qFormat/>
<w:pPr>
<w:keepNext/>
<w:keepLines/>
<w:spacing w:before="240" w:after="160"/>
<w:jc w:val="center"/>
</w:pPr>
<w:rPr>
<w:b/>
<w:sz w:val="40"/>
<w:szCs w:val="40"/>
</w:rPr>
</w:style>
<w:style w:type="paragraph" w:styleId="Heading1">
<w:name w:val="heading 1"/>
<w:basedOn w:val="Normal"/>
<w:next w:val="Normal"/>
<w:uiPriority w:val="9"/>
<w:qFormat/>
<w:pPr>
<w:keepNext/>
<w:keepLines/>
<w:spacing w:before="240" w:after="0"/>
<w:outlineLvl w:val="0"/>
</w:pPr>
<w:rPr>
<w:b/>
<w:sz w:val="32"/>
<w:szCs w:val="32"/>
</w:rPr>
</w:style>
<w:style w:type="paragraph" w:styleId="Heading2">
<w:name w:val="heading 2"/>
<w:basedOn w:val="Normal"/>
<w:next w:val="Normal"/>
<w:uiPriority w:val="9"/>
<w:qFormat/>
<w:pPr>
<w:keepNext/>
<w:keepLines/>
<w:spacing w:before="200" w:after="0"/>
<w:outlineLvl w:val="1"/>
</w:pPr>
<w:rPr>
<w:b/>
<w:sz w:val="28"/>
<w:szCs w:val="28"/>
</w:rPr>
</w:style>
<w:style w:type="paragraph" w:styleId="Heading3">
<w:name w:val="heading 3"/>
<w:basedOn w:val="Normal"/>
<w:next w:val="Normal"/>
<w:uiPriority w:val="9"/>
<w:qFormat/>
<w:pPr>
<w:keepNext/>
<w:keepLines/>
<w:spacing w:before="160" w:after="0"/>
<w:outlineLvl w:val="2"/>
</w:pPr>
<w:rPr>
<w:b/>
<w:sz w:val="26"/>
<w:szCs w:val="26"/>
</w:rPr>
</w:style>
<w:style w:type="paragraph" w:styleId="Heading4">
<w:name w:val="heading 4"/>
<w:basedOn w:val="Normal"/>
<w:next w:val="Normal"/>
<w:uiPriority w:val="9"/>
<w:qFormat/>
<w:pPr>
<w:keepNext/>
<w:keepLines/>
<w:spacing w:before="160" w:after="0"/>
<w:outlineLvl w:val="3"/>
</w:pPr>
<w:rPr>
<w:b/>
<w:sz w:val="24"/>
<w:szCs w:val="24"/>
</w:rPr>
</w:style>
<w:style w:type="paragraph" w:styleId="Heading5">
<w:name w:val="heading 5"/>
<w:basedOn w:val="Normal"/>
<w:next w:val="Normal"/>
<w:uiPriority w:val="9"/>
<w:qFormat/>
<w:pPr>
<w:keepNext/>
<w:keepLines/>
<w:spacing w:before="120" w:after="0"/>
<w:outlineLvl w:val="4"/>
</w:pPr>
<w:rPr>
<w:b/>
<w:sz w:val="22"/>
<w:szCs w:val="22"/>
</w:rPr>
</w:style>
<w:style w:type="paragraph" w:styleId="Heading6">
<w:name w:val="heading 6"/>
<w:basedOn w:val="Normal"/>
<w:next w:val="Normal"/>
<w:uiPriority w:val="9"/>
<w:qFormat/>
<w:pPr>
<w:keepNext/>
<w:keepLines/>
<w:spacing w:before="120" w:after="0"/>
<w:outlineLvl w:val="5"/>
</w:pPr>
<w:rPr>
<w:b/>
<w:sz w:val="20"/>
<w:szCs w:val="20"/>
</w:rPr>
</w:style>
</w:styles>`;
}
/**
* 构建页脚 XML
* @param {string} footerText - 页脚文本
* @param {Object} options - 格式选项
* @returns {string} footer.xml 内容
*/
function buildFooterXml(footerText = 'by Paper Burner X', options = {}) {
const italic = options.italic !== false;
const fontSize = options.fontSize || 18;
const align = options.align || 'center';
const italicTag = italic ? '<w:i/>' : '';
const sizeVal = fontSize * 2; // Word 使用半磅为单位
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:ftr xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
<w:p>
<w:pPr>
<w:jc w:val="${align}"/>
<w:spacing w:after="0"/>
</w:pPr>
<w:r>
<w:rPr>
${italicTag}
<w:sz w:val="${sizeVal}"/>
<w:szCs w:val="${sizeVal}"/>
</w:rPr>
<w:t xml:space="preserve">${footerText}</w:t>
</w:r>
</w:p>
</w:ftr>`;
}
// 导出到全局
window.PBXDocxStyles = {
HEADING_OUTLINE_LEVELS,
buildStylesXml,
buildFooterXml
};
})(window);