import type { HtmlConvertAttributesConfig } from "@iimm/shared";
/** 根据html转化成的js节点获取xml节点参数的配置项 */
export interface HtmlJsonNodeParserOptions extends HtmlConvertAttributesConfig {
/** 仅保留中文字体?
* @default true
*/
onlyHans?: boolean;
/** style的属性名为驼峰式?
* @default false
*/
styleCamelCase?: boolean;
/** 其他属性名为驼峰式?
* @default false
*/
attributesCamelCase?: boolean;
/** 列表属性的生成函数 */
listExtraStyleGenerateFn?: (lvl: number, nodeName?: string, nextLvl?: boolean, index?: number) => {
[key: string]: string | number;
};
/** 自闭合标签 */
selfCloseTags?: string[];
}
/** 转化后的xml生成参数节点生成xml对象的配置项 */
export interface XmlElementGenerationConfig {
/** 缺省字号? (word的xml文件里的一般为2倍的pt值)
* @default 24(即小四)
*/
defaultFontSize?: number;
/** 默认字体
* @default 宋体
*/
defaultFontFamily?: string;
/** 表格的最大宽度值(word解压后的xml文件里的,A4竖版一般可以在10000+)
* @default undefined
*/
tableMaxWidth?: number;
/** 图片的最大cx/cy值(word解压后的xml文件里的,A4一般可以在5500000+)
* @default undefined
*/
imageMaxC?: number;
/** 图片的最大cx值(不设置的话会尝试使用imageMaxC)
* @default undefined
*/
imageMaxCx?: number;
/** 图片的最大cy值(不设置的话会尝试使用imageMaxC)
* @default undefined
*/
imageMaxCy?: number;
}
/** 经过处理的待转化为xml对象的段落节点 */
export interface HtmlXmlParamsParagrapNode extends WordXmlLang {
type: "p";
/** 行距/行高(style中对应 line-height单位是%时是多倍行距,是pt时为固定行距) */
line?: number;
/** 是否时固定行距,如果固定时,style里会有line-height-rule:exactly */
lineRuleExact?: boolean;
/** 段前距 - xx行时会有此属性 */
beforeLines?: number;
/** 段前距 - 只要有段前距都会有该属性*/
before?: number;
/** 段后距 - 为xx行时会有此属性 */
afterLines?: number;
/** 段后距 - 只要有段前距都会有该属性*/
after?: number;
/** 段落整体的左缩进 - 只要段落有左缩进就会有该属性*/
left?: number;
/** 段落整体的左缩进 - 为xxx字符时会有该属性 */
leftChars?: number;
/** 段落整体的右缩进 - 只要段落有左缩进就会有该属性*/
right?: number;
/** 段落整体的右缩进 - 为xxx字符时会有该属性 */
rightChars?: number;
/** 段落的首行缩进 - 只要有首行缩进时就会有该属性 */
firstLine?: number;
/** 段落的首行缩进 - 为xxx字符时会有该属性 */
firstLineChars?: number;
/** 段落的悬挂缩进 - 只要有悬挂缩进时就会有该属性 */
hanging?: number;
/** 段落的悬挂缩进 - 为xxx字符时会有该属性 */
hangingChars?: number;
/** 对齐方式: left/center/right/justify/distribute,对用style为text-align,word默认是两端对齐justify,此时不需要插入内容 */
align?: "left" | "center" | "right" | "justify" | "distribute";
/** 如果有此属性则强制采用此字体
* @default '宋体''
*/
fontFamily?: string;
fonts?: WordXmlFonts;
fontSize?: number;
/** 如果没有其他字体定义则全部采用此字体
* @default '宋体''
*/
/** 段落预定义样式,如标题等级 */
pStyle?: string;
/** 有序 */
listNumId?: number | string;
listLvl?: number | string;
items?: (HtmlXmlParamsImageNode | HtmlXmlParamsTextNode | HtmlXmlParamsTableNode)[];
color?: string;
kern?: string | number;
}
export interface HtmlXmlParamsImageNodeStepOne {
type: "image";
step: 0;
cx?: number;
cy?: number;
src: string;
}
/** 对应wordXml里的wr:Fonts */
export interface WordXmlFonts {
/** style中对应 mso-ascii-font-family wr:Fonts对应属性w:ascii */
asciiFont?: string;
/** style中对应 mso-ascii-font-family wr:Fonts对应属性w:hAnsi */
hAnsiFont?: string;
/** style中对应 mso-ascii-font-family wr:Fonts对应属性w:eastAsia */
eastAsiaFont?: string;
/** style中对应 mso-ascii-font-family wr:Fonts对应属性w:cs */
csFont?: string;
}
/** 对应wordXml里的 w:lang */
export interface WordXmlLang {
lang?: string;
/** style中对应 mso-bidi-language w:lang对应属性w:bidi */
bidiLang?: string;
}
/** 经过处理的待转化为xml对象的图片节点 */
export interface HtmlXmlParamsImageNode {
type: "image";
step?: number;
/**生成图片json对象里的cx值 */
cx?: number;
/**生成图片json对象里的cx值 */
cy?: number;
/**html中图片地址,仅在解析html过程中会使用 */
src: string;
/**docx中relationship中该图片的rid */
rId: number;
/**图片名称(可选),不要扩展名 */
name?: string;
}
/** 经过处理的待转化为xml对象的文字属性 */
export interface HtmlXmlParamsTextNode extends SpanSpecialStyles, WordXmlLang {
type?: "text";
/** 如果有此属性则强制采用此字体
* @default '宋体''
*/
fontFamily?: string;
/** 对应wordXml里的wr:Fonts */
fonts?: WordXmlFonts;
fontSize?: number | string;
color?: string;
/** 文本 */
text?: string;
/** 文字高亮的背景颜色 */
backgroundColor?: string;
/** 字符间距单位是pt */
kern?: string | number;
}
/** 经过处理待生成xml的单个框线的属性值 */
export interface XmlTableBorder {
/** 框线宽度,单位是pt */
sz?: number;
/** 框线颜色 */
color?: string;
/** 框线类型 */
val?: string;
space?: number;
}
/** 单元格的4个边框属性 */
export interface XmlTableCellBorders {
top?: XmlTableBorder;
right?: XmlTableBorder;
left?: XmlTableBorder;
bottom?: XmlTableBorder;
}
/** 表格的行属性 */
export interface HtmlXmlParamsTableRow {
type: "tr";
isFooter?: boolean;
/** 是否是标题行, 标题行的上层是下层为| */
isHeader?: boolean;
/** 是否将允许跨页断行关掉(word默认是允许跨页断行的), | 的style里有page-break-inside:avoid时为true */
cantSplit?: boolean;
height?: number;
cells: HtmlXmlParamsTableCell[];
widths?: number[];
}
/** 解析后并转换成xml参数的节点类型(图片/段落/表格) */
export type HtmlXmlParamsNode = HtmlXmlParamsImageNode | HtmlXmlParamsTableNode | HtmlXmlParamsParagrapNode;
/** 表格的单元格属性 */
export interface HtmlXmlParamsTableCell {
type?: "tc";
width?: number;
borders?: XmlTableCellBorders;
vMergeRestart?: boolean;
/** 水平单元格合并(仅合并时有此参数) */
colspan?: number;
/** 单元格的垂直对齐方式, word里默认是top,html里默认是center,对应th,tc属性的vertical-align:bottom/top,center时style里没有。水平对齐由下面的段落控制 */
vAlign?: "center" | "bottom";
vMerge?: boolean;
content?: HtmlXmlParamsNode[];
}
/** 经过处理的待转化为xml对象的表格节点 */
export interface HtmlXmlParamsTableNode {
type: "table";
cols: number;
width?: number;
height?: number;
colWidths?: number[];
layout?: "fixed";
align?: "left" | "center" | "right";
ind?: string | number;
borders?: XmlTableCellBorders & {
insideH?: XmlTableBorder;
insideV?: XmlTableBorder;
};
rows?: HtmlXmlParamsTableRow[];
}
/** 经过处理的待转化为xml对象的节点 */
export type HtmlXmlParamsNodeItem = HtmlXmlParamsImageNode | HtmlXmlParamsParagrapNode | HtmlXmlParamsTableNode;
/** 传递给htmlJs对象抓换为xml参数过程,用来处理图片的rId和存储问题
* @example
* ```
* // 允许的最大图片cx/cy值:
* const maxImgC= 123455
* const getImageStepTwoParamsFnExample = async (imgStepOneParams) => {
const { cx, cy, step, src } = imgStepOneParams;
if (!src) return;
let stepTwoParams = {};
if (cx && cy) {
stepTwoParams = { cx, cy };
if (maxImgC) {
stepTwoParams = ensureImageCxCy(cx, cy, maxImgC);
}
}
if (step === 0) {
if (isBase64Image) {
// 生成blob
} else {
//
}
// 这里处理图片文件、rels等
}
return stepTwoParams;
};
return stepTwoParams;
};
* ```
*/
export type GetImageStepTwoParamsFn = ((params: HtmlXmlParamsImageNodeStepOne) => HtmlXmlParamsImageNode) | ((params: HtmlXmlParamsImageNodeStepOne) => Promise);
/** 解析span时传递给下层的特殊格式,如加粗/倾斜等 */
export interface SpanSpecialStyles {
/** 加粗? */
bold?: boolean;
/** 斜体? */
italic?: boolean;
/** 下划线颜色 */
underlineColor?: string;
/** 下划线的样式 */
underline?: string;
/** 删除线? */
strike?: boolean;
/** 下标? */
sub?: boolean;
/** 上标? */
sup?: boolean;
/** 文本外框? */
border?: boolean | string;
borderColor?: string;
}
export interface XmlTextNode {
type: "text";
text?: string;
attributes?: {
[key: string]: string;
};
elements?: (XmlNode | XmlTextNode)[];
}
/** 本包中配置的xml-js解析的Xml节点 */
export interface XmlNode {
type: "element";
name: string;
attributes?: {
[key: string]: string;
};
elements?: (XmlNode | XmlTextNode)[];
}