office-viewer 0.3.15 → 0.3.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/tsconfig.tsbuildinfo +1 -0
  2. package/esm/Word.d.ts +12 -0
  3. package/esm/Word.js +38 -0
  4. package/esm/openxml/word/Note.d.ts +1 -0
  5. package/esm/openxml/word/Note.js +3 -0
  6. package/esm/openxml/word/Paragraph.d.ts +2 -0
  7. package/esm/openxml/word/Paragraph.js +28 -5
  8. package/esm/openxml/word/Run.d.ts +6 -1
  9. package/esm/openxml/word/Run.js +14 -1
  10. package/esm/word/render/renderBody.js +140 -6
  11. package/esm/word/render/renderInstrText.js +4 -0
  12. package/esm/word/render/renderNotes.js +19 -0
  13. package/esm/word/render/renderParagraph.js +23 -5
  14. package/esm/word/render/renderRun.js +17 -1
  15. package/esm/word/render/renderTOC.d.ts +5 -0
  16. package/esm/word/render/renderTOC.js +34 -0
  17. package/lib/Word.d.ts +12 -0
  18. package/lib/Word.js +38 -0
  19. package/lib/createOfficeViewer.d.ts +1 -1
  20. package/lib/excel/formula/builtinFunctions.d.ts +1 -1
  21. package/lib/excel/lang/lang.d.ts +1 -1
  22. package/lib/excel/render/dnd/mousedownColHeader.d.ts +1 -1
  23. package/lib/excel/render/dnd/mousedownRowHeader.d.ts +1 -1
  24. package/lib/openxml/word/Note.d.ts +1 -0
  25. package/lib/openxml/word/Note.js +3 -0
  26. package/lib/openxml/word/Paragraph.d.ts +2 -0
  27. package/lib/openxml/word/Paragraph.js +28 -5
  28. package/lib/openxml/word/Run.d.ts +6 -1
  29. package/lib/openxml/word/Run.js +14 -0
  30. package/lib/package/XMLPackageParser.d.ts +1 -1
  31. package/lib/package/ZipPackageParser.d.ts +1 -1
  32. package/lib/word/parse/jcToTextAlign.d.ts +1 -1
  33. package/lib/word/render/renderBody.js +140 -6
  34. package/lib/word/render/renderInstrText.js +4 -0
  35. package/lib/word/render/renderNotes.js +19 -0
  36. package/lib/word/render/renderParagraph.js +23 -5
  37. package/lib/word/render/renderRun.js +16 -0
  38. package/lib/word/render/renderTOC.d.ts +5 -0
  39. package/lib/word/render/renderTOC.js +38 -0
  40. package/package.json +6 -1
package/lib/Word.js CHANGED
@@ -79,8 +79,16 @@ var Word = /** @class */ (function () {
79
79
  */
80
80
  this.styleIdNum = 0;
81
81
  this.wrapClassName = 'docx-viewer-wrapper';
82
+ /**
83
+ * 文档中所有标题段落(用于动态生成目录),在 renderBody 预扫描时填充
84
+ */
85
+ this.tocHeadings = [];
82
86
  this.footNotes = {};
83
87
  this.endNotes = {};
88
+ /**
89
+ * 脚注/尾注 id 到显示序号的映射,key 为 type+'-'+id,value 为从 1 开始的序号
90
+ */
91
+ this.noteIndexMap = {};
84
92
  this.inited = false;
85
93
  /**
86
94
  * 分页标记,如果为 true,那么在渲染的时候会强制分页
@@ -284,6 +292,29 @@ var Word = /** @class */ (function () {
284
292
  }
285
293
  finally { if (e_6) throw e_6.error; }
286
294
  }
295
+ // Fallback: some docx files declare footnotes/endnotes via relationships
296
+ // rather than ContentTypes overrides (e.g., Word-generated files)
297
+ if (Object.keys(this.footNotes).length === 0 &&
298
+ this.parser.fileExists('/word/footnotes.xml')) {
299
+ this.footNotes = Footnotes.parseFootnotes(this, this.parser.getXML('/word/footnotes.xml'));
300
+ }
301
+ if (Object.keys(this.endNotes).length === 0 &&
302
+ this.parser.fileExists('/word/endnotes.xml')) {
303
+ this.endNotes = parseEndnotes.parseEndnotes(this, this.parser.getXML('/word/endnotes.xml'));
304
+ }
305
+ // 建立序号映射,供正文引用渲染使用
306
+ var fnIndex = 1;
307
+ for (var id in this.footNotes) {
308
+ if (id !== '0' && id !== '-1' && !this.footNotes[id].isEmpty()) {
309
+ this.noteIndexMap['footnote-' + id] = fnIndex++;
310
+ }
311
+ }
312
+ var enIndex = 1;
313
+ for (var id in this.endNotes) {
314
+ if (id !== '0' && id !== '-1' && !this.endNotes[id].isEmpty()) {
315
+ this.noteIndexMap['endnote-' + id] = enIndex++;
316
+ }
317
+ }
287
318
  };
288
319
  /**
289
320
  * 获取全局关系
@@ -450,8 +481,14 @@ var Word = /** @class */ (function () {
450
481
  return [];
451
482
  }
452
483
  var classNames = [this.getStyleIdDisplayName(stylId)];
484
+ if (stylId.match(/^[a-zA-Z]+[a-zA-Z0-9\-\_]*$/)) {
485
+ classNames.push('docx-' + stylId);
486
+ }
453
487
  if (style.basedOn) {
454
488
  classNames.unshift(this.getStyleIdDisplayName(style.basedOn));
489
+ if (style.basedOn.match(/^[a-zA-Z]+[a-zA-Z0-9\-\_]*$/)) {
490
+ classNames.push('docx-' + style.basedOn);
491
+ }
455
492
  }
456
493
  return classNames;
457
494
  };
@@ -496,6 +533,7 @@ var Word = /** @class */ (function () {
496
533
  */
497
534
  Word.prototype.addClass = function (element, className) {
498
535
  element.classList.add("".concat(this.getClassPrefix(), "-").concat(className));
536
+ element.classList.add("docx-".concat(className));
499
537
  };
500
538
  /**
501
539
  * 更新页面中的变量,这个要在 render 后运行
@@ -13,4 +13,4 @@ import { PackageParser } from './package/PackageParser';
13
13
  * @param parser 文件解析器,支持 zip 和 xml 两种,也可以扩展
14
14
  * @returns OfficeViewer 实例
15
15
  */
16
- export declare function createOfficeViewer(docFile: ArrayBuffer, renderOptions?: Partial<RenderOptions>, fileName?: string, parser?: PackageParser): Promise<Word | UnSupport | Excel>;
16
+ export declare function createOfficeViewer(docFile: ArrayBuffer, renderOptions?: Partial<RenderOptions>, fileName?: string, parser?: PackageParser): Promise<Word | Excel | UnSupport>;
@@ -2,5 +2,5 @@
2
2
  * 内置函数列表
3
3
  */
4
4
  export declare const builtinFunctions: readonly ["ABS", "ACCRINT", "ACCRINTM", "ACOS", "ACOSH", "ACOT", "ACOTH", "ADDRESS", "AGGREGATE", "AMORDEGRC", "AMORLINC", "AND", "ARABIC", "AREAS", "ARRAYTOTEXT", "ASC", "ASIN", "ASINH", "ATAN", "ATAN2", "ATANH", "AVEDEV", "AVERAGE", "AVERAGEA", "AVERAGEIF", "AVERAGEIFS", "BAHTTEXT", "BASE", "BESSELI", "BESSELJ", "BESSELK", "BESSELY", "BETA.DIST", "BETA.INV", "BETADIST", "BETAINV", "BIN2DEC", "BIN2HEX", "BIN2OCT", "BINOM.DIST", "BINOM.DIST.RANGE", "BINOM.INV", "BINOMDIST", "BITAND", "BITLSHIFT", "BITOR", "BITRSHIFT", "BITXOR", "CALL", "CEILING", "CEILING.MATH", "CEILING.PRECISE", "CELL", "CHAR", "CHIDIST", "CHIINV", "CHISQ.DIST", "CHISQ.DIST.RT", "CHISQ.INV", "CHISQ.INV.RT", "CHISQ.TEST", "CHITEST", "CLEAN", "CODE", "COLUMN", "COLUMNS", "COMBIN", "COMBINA", "COMPLEX", "CONCAT", "CONCATENATE", "CONFIDENCE", "CONFIDENCE.NORM", "CONFIDENCE.T", "CONVERT", "CORREL", "COS", "COSH", "COT", "COTH", "COUNT", "COUNTA", "COUNTBLANK", "COUNTIF", "COUNTIFS", "COUPDAYBS", "COUPDAYS", "COUPDAYSNC", "COUPNCD", "COUPNUM", "COUPPCD", "COVAR", "COVARIANCE.P", "COVARIANCE.S", "CRITBINOM", "CSC", "CSCH", "CUBEKPIMEMBER", "CUBEMEMBER", "CUBEMEMBERPROPERTY", "CUBERANKEDMEMBER", "CUBESET", "CUBESETCOUNT", "CUBEVALUE", "CUMIPMT", "CUMPRINC", "DATE", "DATEDIF", "DATEVALUE", "DAVERAGE", "DAY", "DAYS", "DAYS360", "DB", "DBCS", "DCOUNT", "DCOUNTA", "DDB", "DEC2BIN", "DEC2HEX", "DEC2OCT", "DECIMAL", "DEGREES", "DELTA", "DEVSQ", "DGET", "DISC", "DMAX", "DMIN", "DOLLAR", "DOLLARDE", "DOLLARFR", "DPRODUCT", "DSTDEV", "DSTDEVP", "DSUM", "DURATION", "DVAR", "DVARP", "EDATE", "EFFECT", "ENCODEURL", "EOMONTH", "ERF", "ERF.PRECISE", "ERFC", "ERFC.PRECISE", "ERROR.TYPE", "EUROCONVERT", "EVEN", "EXACT", "EXP", "EXPON.DIST", "EXPONDIST", "F.DIST", "F.DIST.RT", "F.INV", "F.INV.RT", "F.TEST", "FACT", "FACTDOUBLE", "FALSE", "FDIST", "FILTER", "FILTERXML", "FIND", "FINDB", "FINV", "FISHER", "FISHERINV", "FIXED", "FLOOR", "FLOOR.MATH", "FLOOR.PRECISE", "FORECAST", "FORECAST.ETS", "FORECAST.ETS.CONFINT", "FORECAST.ETS.SEASONALITY", "FORECAST.ETS.STAT", "FORECAST.LINEAR", "FORMULATEXT", "FREQUENCY", "FTEST", "FV", "FVSCHEDULE", "GAMMA", "GAMMA.DIST", "GAMMA.INV", "GAMMADIST", "GAMMAINV", "GAMMALN", "GAMMALN.PRECISE", "GAUSS", "GCD", "GEOMEAN", "GESTEP", "GETPIVOTDATA", "GROWTH", "HARMEAN", "HEX2BIN", "HEX2DEC", "HEX2OCT", "HLOOKUP", "HOUR", "HYPERLINK", "HYPGEOM.DIST", "HYPGEOMDIST", "IF", "IFERROR", "IFNA", "IFS", "IMABS", "IMAGINARY", "IMARGUMENT", "IMCONJUGATE", "IMCOS", "IMCOSH", "IMCOT", "IMCSC", "IMCSCH", "IMDIV", "IMEXP", "IMLN", "IMLOG10", "IMLOG2", "IMPOWER", "IMPRODUCT", "IMREAL", "IMSEC", "IMSECH", "IMSIN", "IMSINH", "IMSQRT", "IMSUB", "IMSUM", "IMTAN", "INFO", "INT", "INTERCEPT", "INTRATE", "IPMT", "IRR", "ISBLANK", "ISERR", "ISERROR", "ISEVEN", "ISFORMULA", "ISLOGICAL", "ISNA", "ISNONTEXT", "ISNUMBER", "ISO.CEILING", "ISODD", "ISOWEEKNUM", "ISPMT", "ISREF", "ISTEXT", "JIS", "KURT", "LARGE", "LCM", "LEFT", "LEFTB", "LEN", "LENB", "LET", "LINEST", "LN", "LOG", "LOG10", "LOGEST", "LOGINV", "LOGNORM.DIST", "LOGNORM.INV", "LOGNORMDIST", "LOOKUP", "LOWER", "MATCH", "MAX", "MAXA", "MAXIFS", "MDETERM", "MDURATION", "MEDIAN", "MID", "MIDB", "MIN", "MINA", "MINIFS", "MINUTE", "MINVERSE", "MIRR", "MMULT", "MOD", "MODE", "MODE.MULT", "MODE.SNGL", "MONTH", "MROUND", "MULTINOMIAL", "MUNIT", "N", "NA", "NEGBINOM.DIST", "NEGBINOMDIST", "NETWORKDAYS", "NETWORKDAYS.INTL", "NOMINAL", "NORM.DIST", "NORM.INV", "NORM.S.DIST", "NORM.S.INV", "NORMDIST", "NORMINV", "NORMSDIST", "NORMSINV", "NOT", "NOW", "NPER", "NPV", "NUMBERVALUE", "OCT2BIN", "OCT2DEC", "OCT2HEX", "ODD", "ODDFPRICE", "ODDFYIELD", "ODDLPRICE", "ODDLYIELD", "OR", "PDURATION", "PEARSON", "PERCENTILE", "PERCENTILE.EXC", "PERCENTILE.INC", "PERCENTRANK", "PERCENTRANK.EXC", "PERCENTRANK.INC", "PERMUT", "PERMUTATIONA", "PHI", "PHONETIC", "PI", "PMT", "POISSON", "POISSON.DIST", "POWER", "PPMT", "PRICE", "PRICEDISC", "PRICEMAT", "PROB", "PRODUCT", "PROPER", "PV", "QUARTILE", "QUARTILE.EXC", "QUARTILE.INC", "QUOTIENT", "RADIANS", "RAND", "RANDARRAY", "RANDBETWEEN", "RANK", "RANK.AVG", "RANK.EQ", "RATE", "RECEIVED", "REGISTER.ID", "REPLACE", "REPLACEB", "REPT", "RIGHT", "RIGHTB", "ROMAN", "ROUND", "ROUNDDOWN", "ROUNDUP", "ROW", "ROWS", "RRI", "RSQ", "RTD", "SEARCH", "SEARCHB", "SEC", "SECH", "SECOND", "SEQUENCE", "SERIESSUM", "SHEET", "SHEETS", "SIGN", "SIN", "SINH", "SKEW", "SKEW.P", "SLN", "SLOPE", "SMALL", "SORT", "SORTBY", "SQRT", "SQRTPI", "STANDARDIZE", "STDEV", "STDEV.P", "STDEV.S", "STDEVA", "STDEVP", "STDEVPA", "STEYX", "SUBSTITUTE", "SUBTOTAL", "SUM", "SUMIF", "SUMIFS", "SUMPRODUCT", "SUMSQ", "SUMX2MY2", "SUMX2PY2", "SUMXMY2", "SWITCH", "SYD", "T", "T.DIST", "T.DIST.2T", "T.DIST.RT", "T.INV", "T.INV.2T", "T.TEST", "TAN", "TANH", "TBILLEQ", "TBILLPRICE", "TBILLYIELD", "TDIST", "TEXT", "TEXTJOIN", "TIME", "TIMEVALUE", "TINV", "TODAY", "TRANSPOSE", "TREND", "TRIM", "TRIMMEAN", "TRUE", "TRUNC", "TTEST", "TYPE", "UNICHAR", "UNICODE", "UNIQUE", "UPPER", "VALUE", "VALUETOTEXT", "VAR", "VAR.P", "VAR.S", "VARA", "VARP", "VARPA", "VDB", "VLOOKUP", "WEBSERVICE", "WEEKDAY", "WEEKNUM", "WEIBULL", "WEIBULL.DIST", "WORKDAY", "WORKDAY.INTL", "XIRR", "XLOOKUP", "XMATCH", "XNPV", "XOR", "YEAR", "YEARFRAC", "YIELD", "YIELDDISC", "YIELDMAT", "Z.TEST", "ZTEST"];
5
- export declare const builtinFunctionSet: Set<"NA" | "SUM" | "SHEET" | "CELL" | "CONCAT" | "ABS" | "ACCRINT" | "ACCRINTM" | "ACOS" | "ACOSH" | "ACOT" | "ACOTH" | "ADDRESS" | "AGGREGATE" | "AMORDEGRC" | "AMORLINC" | "AND" | "ARABIC" | "AREAS" | "ARRAYTOTEXT" | "ASC" | "ASIN" | "ASINH" | "ATAN" | "ATAN2" | "ATANH" | "AVEDEV" | "AVERAGE" | "AVERAGEA" | "AVERAGEIF" | "AVERAGEIFS" | "BAHTTEXT" | "BASE" | "BESSELI" | "BESSELJ" | "BESSELK" | "BESSELY" | "BETA.DIST" | "BETA.INV" | "BETADIST" | "BETAINV" | "BIN2DEC" | "BIN2HEX" | "BIN2OCT" | "BINOM.DIST" | "BINOM.DIST.RANGE" | "BINOM.INV" | "BINOMDIST" | "BITAND" | "BITLSHIFT" | "BITOR" | "BITRSHIFT" | "BITXOR" | "CALL" | "CEILING" | "CEILING.MATH" | "CEILING.PRECISE" | "CHAR" | "CHIDIST" | "CHIINV" | "CHISQ.DIST" | "CHISQ.DIST.RT" | "CHISQ.INV" | "CHISQ.INV.RT" | "CHISQ.TEST" | "CHITEST" | "CLEAN" | "CODE" | "COLUMN" | "COLUMNS" | "COMBIN" | "COMBINA" | "COMPLEX" | "CONCATENATE" | "CONFIDENCE" | "CONFIDENCE.NORM" | "CONFIDENCE.T" | "CONVERT" | "CORREL" | "COS" | "COSH" | "COT" | "COTH" | "COUNT" | "COUNTA" | "COUNTBLANK" | "COUNTIF" | "COUNTIFS" | "COUPDAYBS" | "COUPDAYS" | "COUPDAYSNC" | "COUPNCD" | "COUPNUM" | "COUPPCD" | "COVAR" | "COVARIANCE.P" | "COVARIANCE.S" | "CRITBINOM" | "CSC" | "CSCH" | "CUBEKPIMEMBER" | "CUBEMEMBER" | "CUBEMEMBERPROPERTY" | "CUBERANKEDMEMBER" | "CUBESET" | "CUBESETCOUNT" | "CUBEVALUE" | "CUMIPMT" | "CUMPRINC" | "DATE" | "DATEDIF" | "DATEVALUE" | "DAVERAGE" | "DAY" | "DAYS" | "DAYS360" | "DB" | "DBCS" | "DCOUNT" | "DCOUNTA" | "DDB" | "DEC2BIN" | "DEC2HEX" | "DEC2OCT" | "DECIMAL" | "DEGREES" | "DELTA" | "DEVSQ" | "DGET" | "DISC" | "DMAX" | "DMIN" | "DOLLAR" | "DOLLARDE" | "DOLLARFR" | "DPRODUCT" | "DSTDEV" | "DSTDEVP" | "DSUM" | "DURATION" | "DVAR" | "DVARP" | "EDATE" | "EFFECT" | "ENCODEURL" | "EOMONTH" | "ERF" | "ERF.PRECISE" | "ERFC" | "ERFC.PRECISE" | "ERROR.TYPE" | "EUROCONVERT" | "EVEN" | "EXACT" | "EXP" | "EXPON.DIST" | "EXPONDIST" | "F.DIST" | "F.DIST.RT" | "F.INV" | "F.INV.RT" | "F.TEST" | "FACT" | "FACTDOUBLE" | "FALSE" | "FDIST" | "FILTER" | "FILTERXML" | "FIND" | "FINDB" | "FINV" | "FISHER" | "FISHERINV" | "FIXED" | "FLOOR" | "FLOOR.MATH" | "FLOOR.PRECISE" | "FORECAST" | "FORECAST.ETS" | "FORECAST.ETS.CONFINT" | "FORECAST.ETS.SEASONALITY" | "FORECAST.ETS.STAT" | "FORECAST.LINEAR" | "FORMULATEXT" | "FREQUENCY" | "FTEST" | "FV" | "FVSCHEDULE" | "GAMMA" | "GAMMA.DIST" | "GAMMA.INV" | "GAMMADIST" | "GAMMAINV" | "GAMMALN" | "GAMMALN.PRECISE" | "GAUSS" | "GCD" | "GEOMEAN" | "GESTEP" | "GETPIVOTDATA" | "GROWTH" | "HARMEAN" | "HEX2BIN" | "HEX2DEC" | "HEX2OCT" | "HLOOKUP" | "HOUR" | "HYPERLINK" | "HYPGEOM.DIST" | "HYPGEOMDIST" | "IF" | "IFERROR" | "IFNA" | "IFS" | "IMABS" | "IMAGINARY" | "IMARGUMENT" | "IMCONJUGATE" | "IMCOS" | "IMCOSH" | "IMCOT" | "IMCSC" | "IMCSCH" | "IMDIV" | "IMEXP" | "IMLN" | "IMLOG10" | "IMLOG2" | "IMPOWER" | "IMPRODUCT" | "IMREAL" | "IMSEC" | "IMSECH" | "IMSIN" | "IMSINH" | "IMSQRT" | "IMSUB" | "IMSUM" | "IMTAN" | "INFO" | "INT" | "INTERCEPT" | "INTRATE" | "IPMT" | "IRR" | "ISBLANK" | "ISERR" | "ISERROR" | "ISEVEN" | "ISFORMULA" | "ISLOGICAL" | "ISNA" | "ISNONTEXT" | "ISNUMBER" | "ISO.CEILING" | "ISODD" | "ISOWEEKNUM" | "ISPMT" | "ISREF" | "ISTEXT" | "JIS" | "KURT" | "LARGE" | "LCM" | "LEFT" | "LEFTB" | "LEN" | "LENB" | "LET" | "LINEST" | "LN" | "LOG" | "LOG10" | "LOGEST" | "LOGINV" | "LOGNORM.DIST" | "LOGNORM.INV" | "LOGNORMDIST" | "LOOKUP" | "LOWER" | "MATCH" | "MAX" | "MAXA" | "MAXIFS" | "MDETERM" | "MDURATION" | "MEDIAN" | "MID" | "MIDB" | "MIN" | "MINA" | "MINIFS" | "MINUTE" | "MINVERSE" | "MIRR" | "MMULT" | "MOD" | "MODE" | "MODE.MULT" | "MODE.SNGL" | "MONTH" | "MROUND" | "MULTINOMIAL" | "MUNIT" | "N" | "NEGBINOM.DIST" | "NEGBINOMDIST" | "NETWORKDAYS" | "NETWORKDAYS.INTL" | "NOMINAL" | "NORM.DIST" | "NORM.INV" | "NORM.S.DIST" | "NORM.S.INV" | "NORMDIST" | "NORMINV" | "NORMSDIST" | "NORMSINV" | "NOT" | "NOW" | "NPER" | "NPV" | "NUMBERVALUE" | "OCT2BIN" | "OCT2DEC" | "OCT2HEX" | "ODD" | "ODDFPRICE" | "ODDFYIELD" | "ODDLPRICE" | "ODDLYIELD" | "OR" | "PDURATION" | "PEARSON" | "PERCENTILE" | "PERCENTILE.EXC" | "PERCENTILE.INC" | "PERCENTRANK" | "PERCENTRANK.EXC" | "PERCENTRANK.INC" | "PERMUT" | "PERMUTATIONA" | "PHI" | "PHONETIC" | "PI" | "PMT" | "POISSON" | "POISSON.DIST" | "POWER" | "PPMT" | "PRICE" | "PRICEDISC" | "PRICEMAT" | "PROB" | "PRODUCT" | "PROPER" | "PV" | "QUARTILE" | "QUARTILE.EXC" | "QUARTILE.INC" | "QUOTIENT" | "RADIANS" | "RAND" | "RANDARRAY" | "RANDBETWEEN" | "RANK" | "RANK.AVG" | "RANK.EQ" | "RATE" | "RECEIVED" | "REGISTER.ID" | "REPLACE" | "REPLACEB" | "REPT" | "RIGHT" | "RIGHTB" | "ROMAN" | "ROUND" | "ROUNDDOWN" | "ROUNDUP" | "ROW" | "ROWS" | "RRI" | "RSQ" | "RTD" | "SEARCH" | "SEARCHB" | "SEC" | "SECH" | "SECOND" | "SEQUENCE" | "SERIESSUM" | "SHEETS" | "SIGN" | "SIN" | "SINH" | "SKEW" | "SKEW.P" | "SLN" | "SLOPE" | "SMALL" | "SORT" | "SORTBY" | "SQRT" | "SQRTPI" | "STANDARDIZE" | "STDEV" | "STDEV.P" | "STDEV.S" | "STDEVA" | "STDEVP" | "STDEVPA" | "STEYX" | "SUBSTITUTE" | "SUBTOTAL" | "SUMIF" | "SUMIFS" | "SUMPRODUCT" | "SUMSQ" | "SUMX2MY2" | "SUMX2PY2" | "SUMXMY2" | "SWITCH" | "SYD" | "T" | "T.DIST" | "T.DIST.2T" | "T.DIST.RT" | "T.INV" | "T.INV.2T" | "T.TEST" | "TAN" | "TANH" | "TBILLEQ" | "TBILLPRICE" | "TBILLYIELD" | "TDIST" | "TEXT" | "TEXTJOIN" | "TIME" | "TIMEVALUE" | "TINV" | "TODAY" | "TRANSPOSE" | "TREND" | "TRIM" | "TRIMMEAN" | "TRUE" | "TRUNC" | "TTEST" | "TYPE" | "UNICHAR" | "UNICODE" | "UNIQUE" | "UPPER" | "VALUE" | "VALUETOTEXT" | "VAR" | "VAR.P" | "VAR.S" | "VARA" | "VARP" | "VARPA" | "VDB" | "VLOOKUP" | "WEBSERVICE" | "WEEKDAY" | "WEEKNUM" | "WEIBULL" | "WEIBULL.DIST" | "WORKDAY" | "WORKDAY.INTL" | "XIRR" | "XLOOKUP" | "XMATCH" | "XNPV" | "XOR" | "YEAR" | "YEARFRAC" | "YIELD" | "YIELDDISC" | "YIELDMAT" | "Z.TEST" | "ZTEST">;
5
+ export declare const builtinFunctionSet: Set<"SUM" | "NA" | "SHEET" | "CELL" | "CONCAT" | "ABS" | "ACCRINT" | "ACCRINTM" | "ACOS" | "ACOSH" | "ACOT" | "ACOTH" | "ADDRESS" | "AGGREGATE" | "AMORDEGRC" | "AMORLINC" | "AND" | "ARABIC" | "AREAS" | "ARRAYTOTEXT" | "ASC" | "ASIN" | "ASINH" | "ATAN" | "ATAN2" | "ATANH" | "AVEDEV" | "AVERAGE" | "AVERAGEA" | "AVERAGEIF" | "AVERAGEIFS" | "BAHTTEXT" | "BASE" | "BESSELI" | "BESSELJ" | "BESSELK" | "BESSELY" | "BETA.DIST" | "BETA.INV" | "BETADIST" | "BETAINV" | "BIN2DEC" | "BIN2HEX" | "BIN2OCT" | "BINOM.DIST" | "BINOM.DIST.RANGE" | "BINOM.INV" | "BINOMDIST" | "BITAND" | "BITLSHIFT" | "BITOR" | "BITRSHIFT" | "BITXOR" | "CALL" | "CEILING" | "CEILING.MATH" | "CEILING.PRECISE" | "CHAR" | "CHIDIST" | "CHIINV" | "CHISQ.DIST" | "CHISQ.DIST.RT" | "CHISQ.INV" | "CHISQ.INV.RT" | "CHISQ.TEST" | "CHITEST" | "CLEAN" | "CODE" | "COLUMN" | "COLUMNS" | "COMBIN" | "COMBINA" | "COMPLEX" | "CONCATENATE" | "CONFIDENCE" | "CONFIDENCE.NORM" | "CONFIDENCE.T" | "CONVERT" | "CORREL" | "COS" | "COSH" | "COT" | "COTH" | "COUNT" | "COUNTA" | "COUNTBLANK" | "COUNTIF" | "COUNTIFS" | "COUPDAYBS" | "COUPDAYS" | "COUPDAYSNC" | "COUPNCD" | "COUPNUM" | "COUPPCD" | "COVAR" | "COVARIANCE.P" | "COVARIANCE.S" | "CRITBINOM" | "CSC" | "CSCH" | "CUBEKPIMEMBER" | "CUBEMEMBER" | "CUBEMEMBERPROPERTY" | "CUBERANKEDMEMBER" | "CUBESET" | "CUBESETCOUNT" | "CUBEVALUE" | "CUMIPMT" | "CUMPRINC" | "DATE" | "DATEDIF" | "DATEVALUE" | "DAVERAGE" | "DAY" | "DAYS" | "DAYS360" | "DB" | "DBCS" | "DCOUNT" | "DCOUNTA" | "DDB" | "DEC2BIN" | "DEC2HEX" | "DEC2OCT" | "DECIMAL" | "DEGREES" | "DELTA" | "DEVSQ" | "DGET" | "DISC" | "DMAX" | "DMIN" | "DOLLAR" | "DOLLARDE" | "DOLLARFR" | "DPRODUCT" | "DSTDEV" | "DSTDEVP" | "DSUM" | "DURATION" | "DVAR" | "DVARP" | "EDATE" | "EFFECT" | "ENCODEURL" | "EOMONTH" | "ERF" | "ERF.PRECISE" | "ERFC" | "ERFC.PRECISE" | "ERROR.TYPE" | "EUROCONVERT" | "EVEN" | "EXACT" | "EXP" | "EXPON.DIST" | "EXPONDIST" | "F.DIST" | "F.DIST.RT" | "F.INV" | "F.INV.RT" | "F.TEST" | "FACT" | "FACTDOUBLE" | "FALSE" | "FDIST" | "FILTER" | "FILTERXML" | "FIND" | "FINDB" | "FINV" | "FISHER" | "FISHERINV" | "FIXED" | "FLOOR" | "FLOOR.MATH" | "FLOOR.PRECISE" | "FORECAST" | "FORECAST.ETS" | "FORECAST.ETS.CONFINT" | "FORECAST.ETS.SEASONALITY" | "FORECAST.ETS.STAT" | "FORECAST.LINEAR" | "FORMULATEXT" | "FREQUENCY" | "FTEST" | "FV" | "FVSCHEDULE" | "GAMMA" | "GAMMA.DIST" | "GAMMA.INV" | "GAMMADIST" | "GAMMAINV" | "GAMMALN" | "GAMMALN.PRECISE" | "GAUSS" | "GCD" | "GEOMEAN" | "GESTEP" | "GETPIVOTDATA" | "GROWTH" | "HARMEAN" | "HEX2BIN" | "HEX2DEC" | "HEX2OCT" | "HLOOKUP" | "HOUR" | "HYPERLINK" | "HYPGEOM.DIST" | "HYPGEOMDIST" | "IF" | "IFERROR" | "IFNA" | "IFS" | "IMABS" | "IMAGINARY" | "IMARGUMENT" | "IMCONJUGATE" | "IMCOS" | "IMCOSH" | "IMCOT" | "IMCSC" | "IMCSCH" | "IMDIV" | "IMEXP" | "IMLN" | "IMLOG10" | "IMLOG2" | "IMPOWER" | "IMPRODUCT" | "IMREAL" | "IMSEC" | "IMSECH" | "IMSIN" | "IMSINH" | "IMSQRT" | "IMSUB" | "IMSUM" | "IMTAN" | "INFO" | "INT" | "INTERCEPT" | "INTRATE" | "IPMT" | "IRR" | "ISBLANK" | "ISERR" | "ISERROR" | "ISEVEN" | "ISFORMULA" | "ISLOGICAL" | "ISNA" | "ISNONTEXT" | "ISNUMBER" | "ISO.CEILING" | "ISODD" | "ISOWEEKNUM" | "ISPMT" | "ISREF" | "ISTEXT" | "JIS" | "KURT" | "LARGE" | "LCM" | "LEFT" | "LEFTB" | "LEN" | "LENB" | "LET" | "LINEST" | "LN" | "LOG" | "LOG10" | "LOGEST" | "LOGINV" | "LOGNORM.DIST" | "LOGNORM.INV" | "LOGNORMDIST" | "LOOKUP" | "LOWER" | "MATCH" | "MAX" | "MAXA" | "MAXIFS" | "MDETERM" | "MDURATION" | "MEDIAN" | "MID" | "MIDB" | "MIN" | "MINA" | "MINIFS" | "MINUTE" | "MINVERSE" | "MIRR" | "MMULT" | "MOD" | "MODE" | "MODE.MULT" | "MODE.SNGL" | "MONTH" | "MROUND" | "MULTINOMIAL" | "MUNIT" | "N" | "NEGBINOM.DIST" | "NEGBINOMDIST" | "NETWORKDAYS" | "NETWORKDAYS.INTL" | "NOMINAL" | "NORM.DIST" | "NORM.INV" | "NORM.S.DIST" | "NORM.S.INV" | "NORMDIST" | "NORMINV" | "NORMSDIST" | "NORMSINV" | "NOT" | "NOW" | "NPER" | "NPV" | "NUMBERVALUE" | "OCT2BIN" | "OCT2DEC" | "OCT2HEX" | "ODD" | "ODDFPRICE" | "ODDFYIELD" | "ODDLPRICE" | "ODDLYIELD" | "OR" | "PDURATION" | "PEARSON" | "PERCENTILE" | "PERCENTILE.EXC" | "PERCENTILE.INC" | "PERCENTRANK" | "PERCENTRANK.EXC" | "PERCENTRANK.INC" | "PERMUT" | "PERMUTATIONA" | "PHI" | "PHONETIC" | "PI" | "PMT" | "POISSON" | "POISSON.DIST" | "POWER" | "PPMT" | "PRICE" | "PRICEDISC" | "PRICEMAT" | "PROB" | "PRODUCT" | "PROPER" | "PV" | "QUARTILE" | "QUARTILE.EXC" | "QUARTILE.INC" | "QUOTIENT" | "RADIANS" | "RAND" | "RANDARRAY" | "RANDBETWEEN" | "RANK" | "RANK.AVG" | "RANK.EQ" | "RATE" | "RECEIVED" | "REGISTER.ID" | "REPLACE" | "REPLACEB" | "REPT" | "RIGHT" | "RIGHTB" | "ROMAN" | "ROUND" | "ROUNDDOWN" | "ROUNDUP" | "ROW" | "ROWS" | "RRI" | "RSQ" | "RTD" | "SEARCH" | "SEARCHB" | "SEC" | "SECH" | "SECOND" | "SEQUENCE" | "SERIESSUM" | "SHEETS" | "SIGN" | "SIN" | "SINH" | "SKEW" | "SKEW.P" | "SLN" | "SLOPE" | "SMALL" | "SORT" | "SORTBY" | "SQRT" | "SQRTPI" | "STANDARDIZE" | "STDEV" | "STDEV.P" | "STDEV.S" | "STDEVA" | "STDEVP" | "STDEVPA" | "STEYX" | "SUBSTITUTE" | "SUBTOTAL" | "SUMIF" | "SUMIFS" | "SUMPRODUCT" | "SUMSQ" | "SUMX2MY2" | "SUMX2PY2" | "SUMXMY2" | "SWITCH" | "SYD" | "T" | "T.DIST" | "T.DIST.2T" | "T.DIST.RT" | "T.INV" | "T.INV.2T" | "T.TEST" | "TAN" | "TANH" | "TBILLEQ" | "TBILLPRICE" | "TBILLYIELD" | "TDIST" | "TEXT" | "TEXTJOIN" | "TIME" | "TIMEVALUE" | "TINV" | "TODAY" | "TRANSPOSE" | "TREND" | "TRIM" | "TRIMMEAN" | "TRUE" | "TRUNC" | "TTEST" | "TYPE" | "UNICHAR" | "UNICODE" | "UNIQUE" | "UPPER" | "VALUE" | "VALUETOTEXT" | "VAR" | "VAR.P" | "VAR.S" | "VARA" | "VARP" | "VARPA" | "VDB" | "VLOOKUP" | "WEBSERVICE" | "WEEKDAY" | "WEEKNUM" | "WEIBULL" | "WEIBULL.DIST" | "WORKDAY" | "WORKDAY.INTL" | "XIRR" | "XLOOKUP" | "XMATCH" | "XNPV" | "XOR" | "YEAR" | "YEARFRAC" | "YIELD" | "YIELDDISC" | "YIELDMAT" | "Z.TEST" | "ZTEST">;
6
6
  export type FunctionName = (typeof builtinFunctions)[number];
@@ -23,7 +23,7 @@ declare const languages: {
23
23
  count: string;
24
24
  sum: string;
25
25
  };
26
- zh_CN: Record<"count" | "sum" | "average" | "customFilter.equal" | "customFilter.notEqual" | "customFilter.beginsWith" | "customFilter.notBeginsWith" | "customFilter.endsWith" | "customFilter.notEndsWith" | "customFilter.contains" | "customFilter.notContains" | "customFilter.greaterThan" | "customFilter.greaterThanOrEqual" | "customFilter.lessThan" | "customFilter.lessThanOrEqual" | "autoFilter.sortAscending" | "autoFilter.sortDescending" | "checkBox.selectAll" | "checkBox.search" | "customFilter.and" | "customFilter.or", string>;
26
+ zh_CN: Record<"average" | "autoFilter.sortAscending" | "autoFilter.sortDescending" | "checkBox.selectAll" | "checkBox.search" | "customFilter.equal" | "customFilter.notEqual" | "customFilter.greaterThan" | "customFilter.greaterThanOrEqual" | "customFilter.lessThan" | "customFilter.lessThanOrEqual" | "customFilter.beginsWith" | "customFilter.notBeginsWith" | "customFilter.endsWith" | "customFilter.notEndsWith" | "customFilter.contains" | "customFilter.notContains" | "customFilter.and" | "customFilter.or" | "count" | "sum", string>;
27
27
  };
28
28
  export type Language = keyof typeof languages;
29
29
  export declare function getTranslate(language: string): (key: EnKeys) => string;
@@ -10,7 +10,7 @@ import { HitTestResult } from '../selection/hitTest';
10
10
  export declare function mousedownColHeader(workbook: Workbook, hitTestResult: HitTestResult): {
11
11
  user: string;
12
12
  region: import("../../sheet/ViewRange").Region;
13
- selectType: "cell" | "corner" | "drawing" | "row-header" | "col-header" | "row-grid" | "col-grid";
13
+ selectType: "corner" | "drawing" | "cell" | "row-header" | "col-header" | "row-grid" | "col-grid";
14
14
  activeCell: RangeRef;
15
15
  sheetIndex: number;
16
16
  cellRanges: {
@@ -10,7 +10,7 @@ import { HitTestResult } from '../selection/hitTest';
10
10
  export declare function mousedownRowHeader(workbook: Workbook, hitTestResult: HitTestResult): {
11
11
  user: string;
12
12
  region: import("../../sheet/ViewRange").Region;
13
- selectType: "cell" | "corner" | "drawing" | "row-header" | "col-header" | "row-grid" | "col-grid";
13
+ selectType: "corner" | "drawing" | "cell" | "row-header" | "col-header" | "row-grid" | "col-grid";
14
14
  activeCell: RangeRef;
15
15
  sheetIndex: number;
16
16
  cellRanges: {
@@ -8,5 +8,6 @@ export type NoteChild = Paragraph | Table;
8
8
  export declare class Note {
9
9
  children: NoteChild[];
10
10
  addChild(child: NoteChild): void;
11
+ isEmpty(): boolean;
11
12
  static fromXML(word: Word, element: Element): Note;
12
13
  }
@@ -16,6 +16,9 @@ var Note = /** @class */ (function () {
16
16
  Note.prototype.addChild = function (child) {
17
17
  this.children.push(child);
18
18
  };
19
+ Note.prototype.isEmpty = function () {
20
+ return this.children.length === 0;
21
+ };
19
22
  Note.fromXML = function (word, element) {
20
23
  var e_1, _a;
21
24
  var note = new Note();
@@ -28,6 +28,8 @@ export declare class Paragraph {
28
28
  properties: ParagraphPr;
29
29
  children: ParagraphChild[];
30
30
  fldSimples: FldSimple[];
31
+ isTOC: boolean;
32
+ tocHeadingId?: string;
31
33
  addChild(child: ParagraphChild): void;
32
34
  static parseParagraphPr(word: Word, element: Element): ParagraphPr;
33
35
  static fromXML(word: Word, element: Element): Paragraph;
@@ -11,6 +11,7 @@ var NumberProperties = require('./numbering/NumberProperties.js');
11
11
  var Run = require('./Run.js');
12
12
  var Tab = require('./Tab.js');
13
13
  var FldSimple = require('./FldSimple.js');
14
+ var InstrText = require('./InstrText.js');
14
15
  var OMath = require('../math/OMath.js');
15
16
  var mergeSdt = require('../../word/parse/mergeSdt.js');
16
17
 
@@ -42,6 +43,8 @@ var Paragraph = /** @class */ (function () {
42
43
  this.properties = {};
43
44
  this.children = [];
44
45
  this.fldSimples = [];
46
+ // 是否是 TOC 字段段落(包含 TOC 指令)
47
+ this.isTOC = false;
45
48
  }
46
49
  Paragraph.prototype.addChild = function (child) {
47
50
  this.children.push(child);
@@ -78,20 +81,40 @@ var Paragraph = /** @class */ (function () {
78
81
  return { cssStyle: cssStyle, pStyle: pStyle, numPr: numPr, tabs: tabs, autoSpace: autoSpace };
79
82
  };
80
83
  Paragraph.fromXML = function (word, element) {
81
- var e_2, _a;
84
+ var e_2, _a, e_3, _b;
82
85
  var paragraph = new Paragraph();
83
86
  paragraph.fldSimples = [];
84
87
  paragraph.paraId = element.getAttribute('w14:paraId') || '';
85
88
  try {
86
- for (var _b = tslib.__values(mergeSdt.mergeSdt(element)), _c = _b.next(); !_c.done; _c = _b.next()) {
87
- var child = _c.value;
89
+ for (var _c = tslib.__values(mergeSdt.mergeSdt(element)), _d = _c.next(); !_d.done; _d = _c.next()) {
90
+ var child = _d.value;
88
91
  var tagName = child.tagName;
89
92
  switch (tagName) {
90
93
  case 'w:pPr':
91
94
  paragraph.properties = Paragraph.parseParagraphPr(word, child);
92
95
  break;
93
96
  case 'w:r':
94
- paragraph.addChild(Run.Run.fromXML(word, child));
97
+ var run = Run.Run.fromXML(word, child);
98
+ paragraph.addChild(run);
99
+ // 检测 TOC 字段指令
100
+ if (!paragraph.isTOC) {
101
+ try {
102
+ for (var _e = (e_3 = void 0, tslib.__values(run.children)), _f = _e.next(); !_f.done; _f = _e.next()) {
103
+ var rc = _f.value;
104
+ if (rc instanceof InstrText.InstrText && rc.text.trim().startsWith('TOC')) {
105
+ paragraph.isTOC = true;
106
+ break;
107
+ }
108
+ }
109
+ }
110
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
111
+ finally {
112
+ try {
113
+ if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
114
+ }
115
+ finally { if (e_3) throw e_3.error; }
116
+ }
117
+ }
95
118
  break;
96
119
  case 'w:hyperlink':
97
120
  paragraph.addChild(Hyperlink.Hyperlink.fromXML(word, child));
@@ -126,7 +149,7 @@ var Paragraph = /** @class */ (function () {
126
149
  catch (e_2_1) { e_2 = { error: e_2_1 }; }
127
150
  finally {
128
151
  try {
129
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
152
+ if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
130
153
  }
131
154
  finally { if (e_2) throw e_2.error; }
132
155
  }
@@ -23,7 +23,12 @@ export declare class Text {
23
23
  text: string;
24
24
  constructor(text: string | number);
25
25
  }
26
- type RunChild = Break | Drawing | Text | Tab | Pict | Ruby | InstrText | Sym | SoftHyphen | Separator | NoBreakHyphen;
26
+ export declare class FootnoteRef {
27
+ id: string;
28
+ type: 'footnote' | 'endnote';
29
+ constructor(id: string, type: 'footnote' | 'endnote');
30
+ }
31
+ type RunChild = Break | Drawing | Text | Tab | Pict | Ruby | InstrText | Sym | SoftHyphen | Separator | NoBreakHyphen | FootnoteRef;
27
32
  export declare class Run {
28
33
  properties: RunPr;
29
34
  children: RunChild[];
@@ -23,6 +23,13 @@ var Text = /** @class */ (function () {
23
23
  }
24
24
  return Text;
25
25
  }());
26
+ var FootnoteRef = /** @class */ (function () {
27
+ function FootnoteRef(id, type) {
28
+ this.id = id;
29
+ this.type = type;
30
+ }
31
+ return FootnoteRef;
32
+ }());
26
33
  var Run = /** @class */ (function () {
27
34
  function Run() {
28
35
  this.properties = {};
@@ -100,6 +107,12 @@ var Run = /** @class */ (function () {
100
107
  case 'w:noBreakHyphen':
101
108
  run.addChild(new NoBreakHyphen.NoBreakHyphen());
102
109
  break;
110
+ case 'w:footnoteReference':
111
+ run.addChild(new FootnoteRef(child.getAttribute('w:id') || '', 'footnote'));
112
+ break;
113
+ case 'w:endnoteReference':
114
+ run.addChild(new FootnoteRef(child.getAttribute('w:id') || '', 'endnote'));
115
+ break;
103
116
  case 'w:separator':
104
117
  run.addChild(new Separator.Separator());
105
118
  break;
@@ -123,5 +136,6 @@ var Run = /** @class */ (function () {
123
136
  return Run;
124
137
  }());
125
138
 
139
+ exports.FootnoteRef = FootnoteRef;
126
140
  exports.Run = Run;
127
141
  exports.Text = Text;
@@ -20,7 +20,7 @@ export default class XMLPackageParser implements PackageParser {
20
20
  /**
21
21
  * 在 xml 下基本不用这个
22
22
  */
23
- getFileByType(filePath: string, type: 'string' | 'blob'): string | Uint8Array | Blob | null;
23
+ getFileByType(filePath: string, type: 'string' | 'blob'): string | Blob | Uint8Array | null;
24
24
  /**
25
25
  * 读取文本内容
26
26
  */
@@ -18,7 +18,7 @@ export default class ZipPackageParser implements PackageParser {
18
18
  /**
19
19
  * 根据类型读取文件
20
20
  */
21
- getFileByType(filePath: string, type?: 'string' | 'blob' | 'uint8array'): string | Uint8Array | Blob | null;
21
+ getFileByType(filePath: string, type?: 'string' | 'blob' | 'uint8array'): string | Blob | Uint8Array | null;
22
22
  /**
23
23
  * 读取文本内容
24
24
  */
@@ -2,4 +2,4 @@
2
2
  *
3
3
  * http://webapp.docx4java.org/OnlineDemo/ecma376/WordML/ST_Jc.html
4
4
  */
5
- export declare function jcToTextAlign(jc: string): "left" | "center" | "right" | "justify";
5
+ export declare function jcToTextAlign(jc: string): "center" | "left" | "right" | "justify";
@@ -9,6 +9,8 @@ var Table = require('../../openxml/word/Table.js');
9
9
  var renderParagraph = require('./renderParagraph.js');
10
10
  var renderSection = require('./renderSection.js');
11
11
  var renderTable = require('./renderTable.js');
12
+ var Run = require('../../openxml/word/Run.js');
13
+ var Hyperlink = require('../../openxml/word/Hyperlink.js');
12
14
 
13
15
  /**
14
16
  * 渲染 body 节点
@@ -129,11 +131,143 @@ function renderSectionInPage(word, wDocument, bodyEl, renderOptions, sectionEl,
129
131
  }
130
132
  }, 0);
131
133
  }
134
+ /**
135
+ * 获取段落纯文本(用于目录标题显示)
136
+ */
137
+ function getParagraphText(paragraph) {
138
+ var e_2, _a, e_3, _b, e_4, _c, e_5, _d;
139
+ var text = '';
140
+ try {
141
+ for (var _e = tslib.__values(paragraph.children), _f = _e.next(); !_f.done; _f = _e.next()) {
142
+ var child = _f.value;
143
+ if (child instanceof Run.Run) {
144
+ try {
145
+ for (var _g = (e_3 = void 0, tslib.__values(child.children)), _h = _g.next(); !_h.done; _h = _g.next()) {
146
+ var rc = _h.value;
147
+ if (rc instanceof Run.Text) {
148
+ text += rc.text;
149
+ }
150
+ }
151
+ }
152
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
153
+ finally {
154
+ try {
155
+ if (_h && !_h.done && (_b = _g.return)) _b.call(_g);
156
+ }
157
+ finally { if (e_3) throw e_3.error; }
158
+ }
159
+ }
160
+ else if (child instanceof Hyperlink.Hyperlink) {
161
+ try {
162
+ for (var _j = (e_4 = void 0, tslib.__values(child.children)), _k = _j.next(); !_k.done; _k = _j.next()) {
163
+ var run = _k.value;
164
+ try {
165
+ for (var _l = (e_5 = void 0, tslib.__values(run.children)), _m = _l.next(); !_m.done; _m = _l.next()) {
166
+ var rc = _m.value;
167
+ if (rc instanceof Run.Text) {
168
+ text += rc.text;
169
+ }
170
+ }
171
+ }
172
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
173
+ finally {
174
+ try {
175
+ if (_m && !_m.done && (_d = _l.return)) _d.call(_l);
176
+ }
177
+ finally { if (e_5) throw e_5.error; }
178
+ }
179
+ }
180
+ }
181
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
182
+ finally {
183
+ try {
184
+ if (_k && !_k.done && (_c = _j.return)) _c.call(_j);
185
+ }
186
+ finally { if (e_4) throw e_4.error; }
187
+ }
188
+ }
189
+ }
190
+ }
191
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
192
+ finally {
193
+ try {
194
+ if (_f && !_f.done && (_a = _e.return)) _a.call(_e);
195
+ }
196
+ finally { if (e_2) throw e_2.error; }
197
+ }
198
+ return text;
199
+ }
200
+ /**
201
+ * 判断段落是否是标题,返回标题级别(1-9),非标题返回 0
202
+ */
203
+ function getHeadingLevel(word, paragraph) {
204
+ var _a, _b;
205
+ var pStyle = paragraph.properties.pStyle;
206
+ if (!pStyle)
207
+ return 0;
208
+ // 匹配 Heading1~Heading9 或 1~9(中文 Word 直接用数字 styleId)
209
+ var m = pStyle.match(/^[Hh]eading(\d)$/) ||
210
+ (pStyle.match(/^(\d)$/) &&
211
+ ((_b = (_a = word.getStyle(pStyle)) === null || _a === void 0 ? void 0 : _a.name) === null || _b === void 0 ? void 0 : _b.match(/^heading\s*(\d)$/i)));
212
+ if (m)
213
+ return parseInt(m[1], 10);
214
+ // 通过样式 name 来识别
215
+ var style = word.getStyle(pStyle);
216
+ if (style === null || style === void 0 ? void 0 : style.name) {
217
+ var nm = style.name.match(/^heading\s*(\d)$/i);
218
+ if (nm)
219
+ return parseInt(nm[1], 10);
220
+ }
221
+ return 0;
222
+ }
223
+ var _tocHeadingCounter = 0;
224
+ /**
225
+ * 预扫描文档,收集标题并为 TOC 段落标记
226
+ */
227
+ function prescanHeadings(word, body) {
228
+ var e_6, _a, e_7, _b;
229
+ _tocHeadingCounter = 0;
230
+ word.tocHeadings = [];
231
+ try {
232
+ for (var _c = tslib.__values(body.sections), _d = _c.next(); !_d.done; _d = _c.next()) {
233
+ var section = _d.value;
234
+ try {
235
+ for (var _e = (e_7 = void 0, tslib.__values(section.children)), _f = _e.next(); !_f.done; _f = _e.next()) {
236
+ var child = _f.value;
237
+ if (!(child instanceof Paragraph.Paragraph))
238
+ continue;
239
+ var level = getHeadingLevel(word, child);
240
+ if (level > 0) {
241
+ var id = "toc-h-".concat(_tocHeadingCounter++);
242
+ child.tocHeadingId = id;
243
+ word.tocHeadings.push({ level: level, text: getParagraphText(child), id: id });
244
+ }
245
+ }
246
+ }
247
+ catch (e_7_1) { e_7 = { error: e_7_1 }; }
248
+ finally {
249
+ try {
250
+ if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
251
+ }
252
+ finally { if (e_7) throw e_7.error; }
253
+ }
254
+ }
255
+ }
256
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
257
+ finally {
258
+ try {
259
+ if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
260
+ }
261
+ finally { if (e_6) throw e_6.error; }
262
+ }
263
+ }
132
264
  /**
133
265
  * 渲染文档主体
134
266
  */
135
267
  function renderBody(root, word, bodyEl, wDocument, body, renderOptions) {
136
- var e_2, _a, e_3, _b;
268
+ var e_8, _a, e_9, _b;
269
+ // 预扫描标题,为动态目录生成准备数据
270
+ prescanHeadings(word, body);
137
271
  var page = renderOptions.page || false;
138
272
  var rootWidth = root.getBoundingClientRect().width -
139
273
  (renderOptions.pageWrapPadding || 0) * 2;
@@ -159,7 +293,7 @@ function renderBody(root, word, bodyEl, wDocument, body, renderOptions) {
159
293
  }
160
294
  else {
161
295
  try {
162
- for (var _c = (e_3 = void 0, tslib.__values(section.children)), _d = _c.next(); !_d.done; _d = _c.next()) {
296
+ for (var _c = (e_9 = void 0, tslib.__values(section.children)), _d = _c.next(); !_d.done; _d = _c.next()) {
163
297
  var child = _d.value;
164
298
  if (child instanceof Paragraph.Paragraph) {
165
299
  var p = renderParagraph["default"](word, child);
@@ -174,22 +308,22 @@ function renderBody(root, word, bodyEl, wDocument, body, renderOptions) {
174
308
  }
175
309
  }
176
310
  }
177
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
311
+ catch (e_9_1) { e_9 = { error: e_9_1 }; }
178
312
  finally {
179
313
  try {
180
314
  if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
181
315
  }
182
- finally { if (e_3) throw e_3.error; }
316
+ finally { if (e_9) throw e_9.error; }
183
317
  }
184
318
  }
185
319
  }
186
320
  }
187
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
321
+ catch (e_8_1) { e_8 = { error: e_8_1 }; }
188
322
  finally {
189
323
  try {
190
324
  if (sections_1_1 && !sections_1_1.done && (_a = sections_1.return)) _a.call(sections_1);
191
325
  }
192
- finally { if (e_2) throw e_2.error; }
326
+ finally { if (e_8) throw e_8.error; }
193
327
  }
194
328
  setTimeout(function () {
195
329
  if (renderOptions.zoom) {
@@ -16,6 +16,10 @@ function renderInstrText(word, instrText) {
16
16
  var _b;
17
17
  var text = instrText.text;
18
18
  var span = dom.createElement('span');
19
+ // TOC 字段指令不渲染原始指令文本,目录条目已作为普通段落存在于文档中
20
+ if (text.trim().startsWith('TOC')) {
21
+ return span;
22
+ }
19
23
  var fldSimples = (_b = word.currentParagraph) === null || _b === void 0 ? void 0 : _b.fldSimples;
20
24
  if (fldSimples) {
21
25
  try {
@@ -14,12 +14,23 @@ var renderTable = require('./renderTable.js');
14
14
  */
15
15
  function renderNote(word, noteRoot, type, id, note) {
16
16
  var e_1, _a;
17
+ var _b;
17
18
  var noteChild = note.children;
18
19
  var noteElement = dom.createElement('div');
20
+ noteElement.style.display = 'flex';
21
+ noteElement.style.alignItems = 'baseline';
19
22
  var mark = dom.createElement('a');
20
23
  var fName = type + '-' + id;
21
24
  mark.name = fName;
22
25
  mark.id = fName;
26
+ var index = (_b = word.noteIndexMap[fName]) !== null && _b !== void 0 ? _b : id;
27
+ var indexAnchor = dom.createElement('a');
28
+ indexAnchor.style.flexShrink = '0';
29
+ indexAnchor.style.marginRight = '0.3em';
30
+ indexAnchor.style.textDecoration = 'none';
31
+ indexAnchor.textContent = '[' + String(index) + ']';
32
+ noteElement.appendChild(mark);
33
+ noteElement.appendChild(indexAnchor);
23
34
  noteRoot.appendChild(noteElement);
24
35
  try {
25
36
  for (var noteChild_1 = tslib.__values(noteChild), noteChild_1_1 = noteChild_1.next(); !noteChild_1_1.done; noteChild_1_1 = noteChild_1.next()) {
@@ -62,11 +73,19 @@ function renderNotes(word) {
62
73
  var noteRoot = dom.createElement('div');
63
74
  if (hasNote(word.footNotes)) {
64
75
  for (var fId in word.footNotes) {
76
+ if (fId === '0' || fId === '-1')
77
+ continue;
78
+ if (word.footNotes[fId].isEmpty())
79
+ continue;
65
80
  renderNote(word, noteRoot, 'footnote', fId, word.footNotes[fId]);
66
81
  }
67
82
  }
68
83
  if (hasNote(word.endNotes)) {
69
84
  for (var fId in word.endNotes || {}) {
85
+ if (fId === '0' || fId === '-1')
86
+ continue;
87
+ if (word.endNotes[fId].isEmpty())
88
+ continue;
70
89
  renderNote(word, noteRoot, 'endnote', fId, word.endNotes[fId]);
71
90
  }
72
91
  }