xls-codec 4.14.0 → 4.15.1

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 (58) hide show
  1. package/README.md +37 -19
  2. package/dist/biff/record-writer.cjs +18 -0
  3. package/dist/biff/record-writer.d.cts +7 -1
  4. package/dist/biff/record-writer.d.ts +7 -1
  5. package/dist/biff/record-writer.js +18 -1
  6. package/dist/container.cjs +9 -1
  7. package/dist/container.d.cts +2 -0
  8. package/dist/container.d.ts +2 -0
  9. package/dist/container.js +9 -1
  10. package/dist/content.cjs +6 -5
  11. package/dist/content.js +6 -5
  12. package/dist/drawing/escher-constants.cjs +6 -0
  13. package/dist/drawing/escher-constants.d.cts +5 -1
  14. package/dist/drawing/escher-constants.d.ts +5 -1
  15. package/dist/drawing/escher-constants.js +5 -1
  16. package/dist/drawing/escher-writer.cjs +107 -0
  17. package/dist/drawing/escher-writer.d.cts +32 -0
  18. package/dist/drawing/escher-writer.d.ts +32 -0
  19. package/dist/drawing/escher-writer.js +105 -0
  20. package/dist/drawing/md4.cjs +146 -0
  21. package/dist/drawing/md4.d.cts +7 -0
  22. package/dist/drawing/md4.d.ts +7 -0
  23. package/dist/drawing/md4.js +145 -0
  24. package/dist/drawing-writer-Blm_NUSZ.d.cts +19 -0
  25. package/dist/drawing-writer-Blm_NUSZ.d.ts +19 -0
  26. package/dist/index.cjs +1 -0
  27. package/dist/index.d.cts +2 -2
  28. package/dist/index.d.ts +2 -2
  29. package/dist/index.js +2 -2
  30. package/dist/workbook/comments.cjs +26 -0
  31. package/dist/workbook/comments.d.cts +7 -1
  32. package/dist/workbook/comments.d.ts +7 -1
  33. package/dist/workbook/comments.js +26 -1
  34. package/dist/workbook/conditional-format-write.cjs +307 -18
  35. package/dist/workbook/conditional-format-write.js +307 -18
  36. package/dist/workbook/drawing-writer.cjs +253 -0
  37. package/dist/workbook/drawing-writer.d.cts +2 -0
  38. package/dist/workbook/drawing-writer.d.ts +2 -0
  39. package/dist/workbook/drawing-writer.js +252 -0
  40. package/dist/workbook/drawing.cjs +24 -3
  41. package/dist/workbook/drawing.d.cts +2 -0
  42. package/dist/workbook/drawing.d.ts +2 -0
  43. package/dist/workbook/drawing.js +25 -4
  44. package/dist/workbook/embedded-object.cjs +43 -0
  45. package/dist/workbook/embedded-object.d.cts +8 -0
  46. package/dist/workbook/embedded-object.d.ts +8 -0
  47. package/dist/workbook/embedded-object.js +41 -0
  48. package/dist/workbook/globals-writer.cjs +1 -0
  49. package/dist/workbook/globals-writer.d.cts +2 -0
  50. package/dist/workbook/globals-writer.d.ts +2 -0
  51. package/dist/workbook/globals-writer.js +2 -1
  52. package/dist/workbook/sheet-writer.cjs +4 -3
  53. package/dist/workbook/sheet-writer.d.cts +3 -2
  54. package/dist/workbook/sheet-writer.d.ts +3 -2
  55. package/dist/workbook/sheet-writer.js +4 -3
  56. package/dist/write.cjs +17 -7
  57. package/dist/write.js +17 -7
  58. package/package.json +5 -5
package/dist/index.d.cts CHANGED
@@ -5,7 +5,7 @@ import { errorCodeOf, errorTextOf } from "./biff/errors.cjs";
5
5
  import { i as readRecords, n as BiffRecord, r as HEADER_SIZE, t as BiffFormatError } from "./records-G82UEVq8.cjs";
6
6
  import { a as splitSubstreams, i as recordByteLength, n as Substream, r as groupRecords, t as RecordGroup } from "./substreams-XDNgDvRJ.cjs";
7
7
  import { BIFF8_VERSION, BOF_TYPE_CHART, BOF_TYPE_MACRO, BOF_TYPE_WORKBOOK, BOF_TYPE_WORKSHEET, MAX_RECORD_DATA_SIZE, RECORD_AI, RECORD_ARRAY, RECORD_BLANK, RECORD_BOF, RECORD_BOOLERR, RECORD_BOTTOMMARGIN, RECORD_BOUNDSHEET8, RECORD_CALCCOUNT, RECORD_CALCDELTA, RECORD_CALCITER, RECORD_CALCREFMODE, RECORD_CALCSAVERECALC, RECORD_CF, RECORD_CF12, RECORD_CFEX, RECORD_COLINFO, RECORD_CONDFMT, RECORD_CONDFMT12, RECORD_CONTINUE, RECORD_CONTINUEFRT12, RECORD_DATE1904, RECORD_DEFAULTROWHEIGHT, RECORD_DEFCOLWIDTH, RECORD_DIMENSIONS, RECORD_DV, RECORD_DVAL, RECORD_EOF, RECORD_EXTERNSHEET, RECORD_FILELOCK, RECORD_FILEPASS, RECORD_FONT, RECORD_FORMAT, RECORD_FORMULA, RECORD_HORIZONTALPAGEBREAKS, RECORD_INTERFACEHDR, RECORD_LABEL, RECORD_LABELSST, RECORD_LBL, RECORD_LEFTMARGIN, RECORD_MERGECELLS, RECORD_MSODRAWING, RECORD_MSODRAWINGGROUP, RECORD_MSODRAWINGSELECTION, RECORD_MULBLANK, RECORD_MULRK, RECORD_NOTE, RECORD_NUMBER, RECORD_OBJ, RECORD_PALETTE, RECORD_PRINTGRID, RECORD_PRINTROWCOL, RECORD_RIGHTMARGIN, RECORD_RK, RECORD_ROW, RECORD_RRDHEAD, RECORD_RRDINFO, RECORD_SERIES, RECORD_SERIESTEXT, RECORD_SETUP, RECORD_SHRFMLA, RECORD_SIINDEX, RECORD_SST, RECORD_STRING, RECORD_STYLE, RECORD_SUPBOOK, RECORD_TABLE, RECORD_TOPMARGIN, RECORD_TXO, RECORD_USREXCL, RECORD_VERTICALPAGEBREAKS, RECORD_WSBOOL, RECORD_XF } from "./biff/record-types.cjs";
8
- import { concatRecords, writeRecord } from "./biff/record-writer.cjs";
8
+ import { concatRecords, writeRecord, writeRecordChain } from "./biff/record-writer.cjs";
9
9
  import { decodeRkNumber } from "./biff/rk.cjs";
10
10
  import { writeRichExtendedString, writeShortXLUnicodeString, writeXLUnicodeString, writeXLUnicodeStringNoCch } from "./biff/string-writer.cjs";
11
11
  import { readRichExtendedString, readShortXLUnicodeString, readXLUnicodeString, readXLUnicodeStringNoCch } from "./biff/strings.cjs";
@@ -22,4 +22,4 @@ import { RawCell, RawCellValue, RawColumn, RawPrintSettings, RawRange, RawRow, R
22
22
  import { SheetWriteContext, buildWorksheetSubstream } from "./workbook/sheet-writer.cjs";
23
23
  import { writeXls, writeXlsContent } from "./write.cjs";
24
24
  export * from "excel-number-format";
25
- export { BIFF8_VERSION, BOF_TYPE_CHART, BOF_TYPE_MACRO, BOF_TYPE_WORKBOOK, BOF_TYPE_WORKSHEET, BiffFormatError, BiffRecord, BiffWriteError, BlockCursor, CellFormat, CellXfPlanEntry, DEFAULT_COLUMN_WIDTH_CHARS, DEFAULT_ROW_HEIGHT_PT, GENERAL_CELL_XF_INDEX, HEADER_SIZE, MAX_RECORD_DATA_SIZE, RECORD_AI, RECORD_ARRAY, RECORD_BLANK, RECORD_BOF, RECORD_BOOLERR, RECORD_BOTTOMMARGIN, RECORD_BOUNDSHEET8, RECORD_CALCCOUNT, RECORD_CALCDELTA, RECORD_CALCITER, RECORD_CALCREFMODE, RECORD_CALCSAVERECALC, RECORD_CF, RECORD_CF12, RECORD_CFEX, RECORD_COLINFO, RECORD_CONDFMT, RECORD_CONDFMT12, RECORD_CONTINUE, RECORD_CONTINUEFRT12, RECORD_DATE1904, RECORD_DEFAULTROWHEIGHT, RECORD_DEFCOLWIDTH, RECORD_DIMENSIONS, RECORD_DV, RECORD_DVAL, RECORD_EOF, RECORD_EXTERNSHEET, RECORD_FILELOCK, RECORD_FILEPASS, RECORD_FONT, RECORD_FORMAT, RECORD_FORMULA, RECORD_HORIZONTALPAGEBREAKS, RECORD_INTERFACEHDR, RECORD_LABEL, RECORD_LABELSST, RECORD_LBL, RECORD_LEFTMARGIN, RECORD_MERGECELLS, RECORD_MSODRAWING, RECORD_MSODRAWINGGROUP, RECORD_MSODRAWINGSELECTION, RECORD_MULBLANK, RECORD_MULRK, RECORD_NOTE, RECORD_NUMBER, RECORD_OBJ, RECORD_PALETTE, RECORD_PRINTGRID, RECORD_PRINTROWCOL, RECORD_RIGHTMARGIN, RECORD_RK, RECORD_ROW, RECORD_RRDHEAD, RECORD_RRDINFO, RECORD_SERIES, RECORD_SERIESTEXT, RECORD_SETUP, RECORD_SHRFMLA, RECORD_SIINDEX, RECORD_SST, RECORD_STRING, RECORD_STYLE, RECORD_SUPBOOK, RECORD_TABLE, RECORD_TOPMARGIN, RECORD_TXO, RECORD_USREXCL, RECORD_VERTICALPAGEBREAKS, RECORD_WSBOOL, RECORD_XF, RawCell, RawCellValue, RawColumn, RawPrintSettings, RawRange, RawRow, RawSheet, RecordBuilder, RecordGroup, SUMMARY_INFORMATION_STREAM, SheetEntry, SheetWriteContext, Substream, WorkbookGlobals, WorkbookGlobalsBuild, WorkbookGlobalsPlan, WorkbookStreams, XlsContentDocument, buildWorkbookGlobals, buildWorksheetSubstream, columnWidthToPoints, concatRecords, decodeRkNumber, errorCodeOf, errorTextOf, formatCodeOf, groupRecords, inchesToPoints, isXlsFile, isoDateTimeToSerial, isoDateToSerial, isoTimeToSerial, layoutMetadataToSummaryInformation, millimetresToPoints, pointsToColumnWidth, pointsToInches, pointsToTwips, readRecords, readRichExtendedString, readSheetRecords, readShortXLUnicodeString, readWorkbookGlobals, readWorkbookStreams, readXLUnicodeString, readXLUnicodeStringNoCch, readXls, readXlsContent, recordByteLength, serialToIsoDate, serialToIsoDateTime, serialToIsoTime, splitSubstreams, twipsToPoints, writeBofData, writeCellXfRecord, writeFormatRecord, writePaletteRecord, writeRecord, writeRichExtendedString, writeShortXLUnicodeString, writeStyleRecord, writeStyleXfRecord, writeXLUnicodeString, writeXLUnicodeStringNoCch, writeXls, writeXlsContent };
25
+ export { BIFF8_VERSION, BOF_TYPE_CHART, BOF_TYPE_MACRO, BOF_TYPE_WORKBOOK, BOF_TYPE_WORKSHEET, BiffFormatError, BiffRecord, BiffWriteError, BlockCursor, CellFormat, CellXfPlanEntry, DEFAULT_COLUMN_WIDTH_CHARS, DEFAULT_ROW_HEIGHT_PT, GENERAL_CELL_XF_INDEX, HEADER_SIZE, MAX_RECORD_DATA_SIZE, RECORD_AI, RECORD_ARRAY, RECORD_BLANK, RECORD_BOF, RECORD_BOOLERR, RECORD_BOTTOMMARGIN, RECORD_BOUNDSHEET8, RECORD_CALCCOUNT, RECORD_CALCDELTA, RECORD_CALCITER, RECORD_CALCREFMODE, RECORD_CALCSAVERECALC, RECORD_CF, RECORD_CF12, RECORD_CFEX, RECORD_COLINFO, RECORD_CONDFMT, RECORD_CONDFMT12, RECORD_CONTINUE, RECORD_CONTINUEFRT12, RECORD_DATE1904, RECORD_DEFAULTROWHEIGHT, RECORD_DEFCOLWIDTH, RECORD_DIMENSIONS, RECORD_DV, RECORD_DVAL, RECORD_EOF, RECORD_EXTERNSHEET, RECORD_FILELOCK, RECORD_FILEPASS, RECORD_FONT, RECORD_FORMAT, RECORD_FORMULA, RECORD_HORIZONTALPAGEBREAKS, RECORD_INTERFACEHDR, RECORD_LABEL, RECORD_LABELSST, RECORD_LBL, RECORD_LEFTMARGIN, RECORD_MERGECELLS, RECORD_MSODRAWING, RECORD_MSODRAWINGGROUP, RECORD_MSODRAWINGSELECTION, RECORD_MULBLANK, RECORD_MULRK, RECORD_NOTE, RECORD_NUMBER, RECORD_OBJ, RECORD_PALETTE, RECORD_PRINTGRID, RECORD_PRINTROWCOL, RECORD_RIGHTMARGIN, RECORD_RK, RECORD_ROW, RECORD_RRDHEAD, RECORD_RRDINFO, RECORD_SERIES, RECORD_SERIESTEXT, RECORD_SETUP, RECORD_SHRFMLA, RECORD_SIINDEX, RECORD_SST, RECORD_STRING, RECORD_STYLE, RECORD_SUPBOOK, RECORD_TABLE, RECORD_TOPMARGIN, RECORD_TXO, RECORD_USREXCL, RECORD_VERTICALPAGEBREAKS, RECORD_WSBOOL, RECORD_XF, RawCell, RawCellValue, RawColumn, RawPrintSettings, RawRange, RawRow, RawSheet, RecordBuilder, RecordGroup, SUMMARY_INFORMATION_STREAM, SheetEntry, SheetWriteContext, Substream, WorkbookGlobals, WorkbookGlobalsBuild, WorkbookGlobalsPlan, WorkbookStreams, XlsContentDocument, buildWorkbookGlobals, buildWorksheetSubstream, columnWidthToPoints, concatRecords, decodeRkNumber, errorCodeOf, errorTextOf, formatCodeOf, groupRecords, inchesToPoints, isXlsFile, isoDateTimeToSerial, isoDateToSerial, isoTimeToSerial, layoutMetadataToSummaryInformation, millimetresToPoints, pointsToColumnWidth, pointsToInches, pointsToTwips, readRecords, readRichExtendedString, readSheetRecords, readShortXLUnicodeString, readWorkbookGlobals, readWorkbookStreams, readXLUnicodeString, readXLUnicodeStringNoCch, readXls, readXlsContent, recordByteLength, serialToIsoDate, serialToIsoDateTime, serialToIsoTime, splitSubstreams, twipsToPoints, writeBofData, writeCellXfRecord, writeFormatRecord, writePaletteRecord, writeRecord, writeRecordChain, writeRichExtendedString, writeShortXLUnicodeString, writeStyleRecord, writeStyleXfRecord, writeXLUnicodeString, writeXLUnicodeStringNoCch, writeXls, writeXlsContent };
package/dist/index.d.ts CHANGED
@@ -5,7 +5,7 @@ import { errorCodeOf, errorTextOf } from "./biff/errors.js";
5
5
  import { i as readRecords, n as BiffRecord, r as HEADER_SIZE, t as BiffFormatError } from "./records-G82UEVq8.js";
6
6
  import { a as splitSubstreams, i as recordByteLength, n as Substream, r as groupRecords, t as RecordGroup } from "./substreams-CgTHx5kX.js";
7
7
  import { BIFF8_VERSION, BOF_TYPE_CHART, BOF_TYPE_MACRO, BOF_TYPE_WORKBOOK, BOF_TYPE_WORKSHEET, MAX_RECORD_DATA_SIZE, RECORD_AI, RECORD_ARRAY, RECORD_BLANK, RECORD_BOF, RECORD_BOOLERR, RECORD_BOTTOMMARGIN, RECORD_BOUNDSHEET8, RECORD_CALCCOUNT, RECORD_CALCDELTA, RECORD_CALCITER, RECORD_CALCREFMODE, RECORD_CALCSAVERECALC, RECORD_CF, RECORD_CF12, RECORD_CFEX, RECORD_COLINFO, RECORD_CONDFMT, RECORD_CONDFMT12, RECORD_CONTINUE, RECORD_CONTINUEFRT12, RECORD_DATE1904, RECORD_DEFAULTROWHEIGHT, RECORD_DEFCOLWIDTH, RECORD_DIMENSIONS, RECORD_DV, RECORD_DVAL, RECORD_EOF, RECORD_EXTERNSHEET, RECORD_FILELOCK, RECORD_FILEPASS, RECORD_FONT, RECORD_FORMAT, RECORD_FORMULA, RECORD_HORIZONTALPAGEBREAKS, RECORD_INTERFACEHDR, RECORD_LABEL, RECORD_LABELSST, RECORD_LBL, RECORD_LEFTMARGIN, RECORD_MERGECELLS, RECORD_MSODRAWING, RECORD_MSODRAWINGGROUP, RECORD_MSODRAWINGSELECTION, RECORD_MULBLANK, RECORD_MULRK, RECORD_NOTE, RECORD_NUMBER, RECORD_OBJ, RECORD_PALETTE, RECORD_PRINTGRID, RECORD_PRINTROWCOL, RECORD_RIGHTMARGIN, RECORD_RK, RECORD_ROW, RECORD_RRDHEAD, RECORD_RRDINFO, RECORD_SERIES, RECORD_SERIESTEXT, RECORD_SETUP, RECORD_SHRFMLA, RECORD_SIINDEX, RECORD_SST, RECORD_STRING, RECORD_STYLE, RECORD_SUPBOOK, RECORD_TABLE, RECORD_TOPMARGIN, RECORD_TXO, RECORD_USREXCL, RECORD_VERTICALPAGEBREAKS, RECORD_WSBOOL, RECORD_XF } from "./biff/record-types.js";
8
- import { concatRecords, writeRecord } from "./biff/record-writer.js";
8
+ import { concatRecords, writeRecord, writeRecordChain } from "./biff/record-writer.js";
9
9
  import { decodeRkNumber } from "./biff/rk.js";
10
10
  import { writeRichExtendedString, writeShortXLUnicodeString, writeXLUnicodeString, writeXLUnicodeStringNoCch } from "./biff/string-writer.js";
11
11
  import { readRichExtendedString, readShortXLUnicodeString, readXLUnicodeString, readXLUnicodeStringNoCch } from "./biff/strings.js";
@@ -22,4 +22,4 @@ import { RawCell, RawCellValue, RawColumn, RawPrintSettings, RawRange, RawRow, R
22
22
  import { SheetWriteContext, buildWorksheetSubstream } from "./workbook/sheet-writer.js";
23
23
  import { writeXls, writeXlsContent } from "./write.js";
24
24
  export * from "excel-number-format";
25
- export { BIFF8_VERSION, BOF_TYPE_CHART, BOF_TYPE_MACRO, BOF_TYPE_WORKBOOK, BOF_TYPE_WORKSHEET, BiffFormatError, BiffRecord, BiffWriteError, BlockCursor, CellFormat, CellXfPlanEntry, DEFAULT_COLUMN_WIDTH_CHARS, DEFAULT_ROW_HEIGHT_PT, GENERAL_CELL_XF_INDEX, HEADER_SIZE, MAX_RECORD_DATA_SIZE, RECORD_AI, RECORD_ARRAY, RECORD_BLANK, RECORD_BOF, RECORD_BOOLERR, RECORD_BOTTOMMARGIN, RECORD_BOUNDSHEET8, RECORD_CALCCOUNT, RECORD_CALCDELTA, RECORD_CALCITER, RECORD_CALCREFMODE, RECORD_CALCSAVERECALC, RECORD_CF, RECORD_CF12, RECORD_CFEX, RECORD_COLINFO, RECORD_CONDFMT, RECORD_CONDFMT12, RECORD_CONTINUE, RECORD_CONTINUEFRT12, RECORD_DATE1904, RECORD_DEFAULTROWHEIGHT, RECORD_DEFCOLWIDTH, RECORD_DIMENSIONS, RECORD_DV, RECORD_DVAL, RECORD_EOF, RECORD_EXTERNSHEET, RECORD_FILELOCK, RECORD_FILEPASS, RECORD_FONT, RECORD_FORMAT, RECORD_FORMULA, RECORD_HORIZONTALPAGEBREAKS, RECORD_INTERFACEHDR, RECORD_LABEL, RECORD_LABELSST, RECORD_LBL, RECORD_LEFTMARGIN, RECORD_MERGECELLS, RECORD_MSODRAWING, RECORD_MSODRAWINGGROUP, RECORD_MSODRAWINGSELECTION, RECORD_MULBLANK, RECORD_MULRK, RECORD_NOTE, RECORD_NUMBER, RECORD_OBJ, RECORD_PALETTE, RECORD_PRINTGRID, RECORD_PRINTROWCOL, RECORD_RIGHTMARGIN, RECORD_RK, RECORD_ROW, RECORD_RRDHEAD, RECORD_RRDINFO, RECORD_SERIES, RECORD_SERIESTEXT, RECORD_SETUP, RECORD_SHRFMLA, RECORD_SIINDEX, RECORD_SST, RECORD_STRING, RECORD_STYLE, RECORD_SUPBOOK, RECORD_TABLE, RECORD_TOPMARGIN, RECORD_TXO, RECORD_USREXCL, RECORD_VERTICALPAGEBREAKS, RECORD_WSBOOL, RECORD_XF, RawCell, RawCellValue, RawColumn, RawPrintSettings, RawRange, RawRow, RawSheet, RecordBuilder, RecordGroup, SUMMARY_INFORMATION_STREAM, SheetEntry, SheetWriteContext, Substream, WorkbookGlobals, WorkbookGlobalsBuild, WorkbookGlobalsPlan, WorkbookStreams, XlsContentDocument, buildWorkbookGlobals, buildWorksheetSubstream, columnWidthToPoints, concatRecords, decodeRkNumber, errorCodeOf, errorTextOf, formatCodeOf, groupRecords, inchesToPoints, isXlsFile, isoDateTimeToSerial, isoDateToSerial, isoTimeToSerial, layoutMetadataToSummaryInformation, millimetresToPoints, pointsToColumnWidth, pointsToInches, pointsToTwips, readRecords, readRichExtendedString, readSheetRecords, readShortXLUnicodeString, readWorkbookGlobals, readWorkbookStreams, readXLUnicodeString, readXLUnicodeStringNoCch, readXls, readXlsContent, recordByteLength, serialToIsoDate, serialToIsoDateTime, serialToIsoTime, splitSubstreams, twipsToPoints, writeBofData, writeCellXfRecord, writeFormatRecord, writePaletteRecord, writeRecord, writeRichExtendedString, writeShortXLUnicodeString, writeStyleRecord, writeStyleXfRecord, writeXLUnicodeString, writeXLUnicodeStringNoCch, writeXls, writeXlsContent };
25
+ export { BIFF8_VERSION, BOF_TYPE_CHART, BOF_TYPE_MACRO, BOF_TYPE_WORKBOOK, BOF_TYPE_WORKSHEET, BiffFormatError, BiffRecord, BiffWriteError, BlockCursor, CellFormat, CellXfPlanEntry, DEFAULT_COLUMN_WIDTH_CHARS, DEFAULT_ROW_HEIGHT_PT, GENERAL_CELL_XF_INDEX, HEADER_SIZE, MAX_RECORD_DATA_SIZE, RECORD_AI, RECORD_ARRAY, RECORD_BLANK, RECORD_BOF, RECORD_BOOLERR, RECORD_BOTTOMMARGIN, RECORD_BOUNDSHEET8, RECORD_CALCCOUNT, RECORD_CALCDELTA, RECORD_CALCITER, RECORD_CALCREFMODE, RECORD_CALCSAVERECALC, RECORD_CF, RECORD_CF12, RECORD_CFEX, RECORD_COLINFO, RECORD_CONDFMT, RECORD_CONDFMT12, RECORD_CONTINUE, RECORD_CONTINUEFRT12, RECORD_DATE1904, RECORD_DEFAULTROWHEIGHT, RECORD_DEFCOLWIDTH, RECORD_DIMENSIONS, RECORD_DV, RECORD_DVAL, RECORD_EOF, RECORD_EXTERNSHEET, RECORD_FILELOCK, RECORD_FILEPASS, RECORD_FONT, RECORD_FORMAT, RECORD_FORMULA, RECORD_HORIZONTALPAGEBREAKS, RECORD_INTERFACEHDR, RECORD_LABEL, RECORD_LABELSST, RECORD_LBL, RECORD_LEFTMARGIN, RECORD_MERGECELLS, RECORD_MSODRAWING, RECORD_MSODRAWINGGROUP, RECORD_MSODRAWINGSELECTION, RECORD_MULBLANK, RECORD_MULRK, RECORD_NOTE, RECORD_NUMBER, RECORD_OBJ, RECORD_PALETTE, RECORD_PRINTGRID, RECORD_PRINTROWCOL, RECORD_RIGHTMARGIN, RECORD_RK, RECORD_ROW, RECORD_RRDHEAD, RECORD_RRDINFO, RECORD_SERIES, RECORD_SERIESTEXT, RECORD_SETUP, RECORD_SHRFMLA, RECORD_SIINDEX, RECORD_SST, RECORD_STRING, RECORD_STYLE, RECORD_SUPBOOK, RECORD_TABLE, RECORD_TOPMARGIN, RECORD_TXO, RECORD_USREXCL, RECORD_VERTICALPAGEBREAKS, RECORD_WSBOOL, RECORD_XF, RawCell, RawCellValue, RawColumn, RawPrintSettings, RawRange, RawRow, RawSheet, RecordBuilder, RecordGroup, SUMMARY_INFORMATION_STREAM, SheetEntry, SheetWriteContext, Substream, WorkbookGlobals, WorkbookGlobalsBuild, WorkbookGlobalsPlan, WorkbookStreams, XlsContentDocument, buildWorkbookGlobals, buildWorksheetSubstream, columnWidthToPoints, concatRecords, decodeRkNumber, errorCodeOf, errorTextOf, formatCodeOf, groupRecords, inchesToPoints, isXlsFile, isoDateTimeToSerial, isoDateToSerial, isoTimeToSerial, layoutMetadataToSummaryInformation, millimetresToPoints, pointsToColumnWidth, pointsToInches, pointsToTwips, readRecords, readRichExtendedString, readSheetRecords, readShortXLUnicodeString, readWorkbookGlobals, readWorkbookStreams, readXLUnicodeString, readXLUnicodeStringNoCch, readXls, readXlsContent, recordByteLength, serialToIsoDate, serialToIsoDateTime, serialToIsoTime, splitSubstreams, twipsToPoints, writeBofData, writeCellXfRecord, writeFormatRecord, writePaletteRecord, writeRecord, writeRecordChain, writeRichExtendedString, writeShortXLUnicodeString, writeStyleRecord, writeStyleXfRecord, writeXLUnicodeString, writeXLUnicodeStringNoCch, writeXls, writeXlsContent };
package/dist/index.js CHANGED
@@ -5,7 +5,7 @@ import { DEFAULT_COLUMN_WIDTH_CHARS, DEFAULT_ROW_HEIGHT_PT, columnWidthToPoints,
5
5
  import { RecordBuilder } from "./biff/builder.js";
6
6
  import { BlockCursor } from "./biff/cursor.js";
7
7
  import { BiffWriteError } from "./biff/write-errors.js";
8
- import { concatRecords, writeRecord } from "./biff/record-writer.js";
8
+ import { concatRecords, writeRecord, writeRecordChain } from "./biff/record-writer.js";
9
9
  import { readRichExtendedString, readShortXLUnicodeString, readXLUnicodeString, readXLUnicodeStringNoCch } from "./biff/strings.js";
10
10
  import { groupRecords, recordByteLength, splitSubstreams } from "./biff/substreams.js";
11
11
  import { errorCodeOf, errorTextOf } from "./biff/errors.js";
@@ -22,4 +22,4 @@ import { GENERAL_CELL_XF_INDEX, buildWorkbookGlobals } from "./workbook/globals-
22
22
  import { buildWorksheetSubstream } from "./workbook/sheet-writer.js";
23
23
  import { writeXls, writeXlsContent } from "./write.js";
24
24
  export * from "excel-number-format";
25
- export { BIFF8_VERSION, BOF_TYPE_CHART, BOF_TYPE_MACRO, BOF_TYPE_WORKBOOK, BOF_TYPE_WORKSHEET, BiffFormatError, BiffWriteError, BlockCursor, DEFAULT_COLUMN_WIDTH_CHARS, DEFAULT_ROW_HEIGHT_PT, GENERAL_CELL_XF_INDEX, HEADER_SIZE, MAX_RECORD_DATA_SIZE, RECORD_AI, RECORD_ARRAY, RECORD_BLANK, RECORD_BOF, RECORD_BOOLERR, RECORD_BOTTOMMARGIN, RECORD_BOUNDSHEET8, RECORD_CALCCOUNT, RECORD_CALCDELTA, RECORD_CALCITER, RECORD_CALCREFMODE, RECORD_CALCSAVERECALC, RECORD_CF, RECORD_CF12, RECORD_CFEX, RECORD_COLINFO, RECORD_CONDFMT, RECORD_CONDFMT12, RECORD_CONTINUE, RECORD_CONTINUEFRT12, RECORD_DATE1904, RECORD_DEFAULTROWHEIGHT, RECORD_DEFCOLWIDTH, RECORD_DIMENSIONS, RECORD_DV, RECORD_DVAL, RECORD_EOF, RECORD_EXTERNSHEET, RECORD_FILELOCK, RECORD_FILEPASS, RECORD_FONT, RECORD_FORMAT, RECORD_FORMULA, RECORD_HORIZONTALPAGEBREAKS, RECORD_INTERFACEHDR, RECORD_LABEL, RECORD_LABELSST, RECORD_LBL, RECORD_LEFTMARGIN, RECORD_MERGECELLS, RECORD_MSODRAWING, RECORD_MSODRAWINGGROUP, RECORD_MSODRAWINGSELECTION, RECORD_MULBLANK, RECORD_MULRK, RECORD_NOTE, RECORD_NUMBER, RECORD_OBJ, RECORD_PALETTE, RECORD_PRINTGRID, RECORD_PRINTROWCOL, RECORD_RIGHTMARGIN, RECORD_RK, RECORD_ROW, RECORD_RRDHEAD, RECORD_RRDINFO, RECORD_SERIES, RECORD_SERIESTEXT, RECORD_SETUP, RECORD_SHRFMLA, RECORD_SIINDEX, RECORD_SST, RECORD_STRING, RECORD_STYLE, RECORD_SUPBOOK, RECORD_TABLE, RECORD_TOPMARGIN, RECORD_TXO, RECORD_USREXCL, RECORD_VERTICALPAGEBREAKS, RECORD_WSBOOL, RECORD_XF, RecordBuilder, SUMMARY_INFORMATION_STREAM, buildWorkbookGlobals, buildWorksheetSubstream, columnWidthToPoints, concatRecords, decodeRkNumber, errorCodeOf, errorTextOf, formatCodeOf, groupRecords, inchesToPoints, isXlsFile, isoDateTimeToSerial, isoDateToSerial, isoTimeToSerial, layoutMetadataToSummaryInformation, millimetresToPoints, pointsToColumnWidth, pointsToInches, pointsToTwips, readRecords, readRichExtendedString, readSheetRecords, readShortXLUnicodeString, readWorkbookGlobals, readWorkbookStreams, readXLUnicodeString, readXLUnicodeStringNoCch, readXls, readXlsContent, recordByteLength, serialToIsoDate, serialToIsoDateTime, serialToIsoTime, splitSubstreams, twipsToPoints, writeBofData, writeCellXfRecord, writeFormatRecord, writePaletteRecord, writeRecord, writeRichExtendedString, writeShortXLUnicodeString, writeStyleRecord, writeStyleXfRecord, writeXLUnicodeString, writeXLUnicodeStringNoCch, writeXls, writeXlsContent };
25
+ export { BIFF8_VERSION, BOF_TYPE_CHART, BOF_TYPE_MACRO, BOF_TYPE_WORKBOOK, BOF_TYPE_WORKSHEET, BiffFormatError, BiffWriteError, BlockCursor, DEFAULT_COLUMN_WIDTH_CHARS, DEFAULT_ROW_HEIGHT_PT, GENERAL_CELL_XF_INDEX, HEADER_SIZE, MAX_RECORD_DATA_SIZE, RECORD_AI, RECORD_ARRAY, RECORD_BLANK, RECORD_BOF, RECORD_BOOLERR, RECORD_BOTTOMMARGIN, RECORD_BOUNDSHEET8, RECORD_CALCCOUNT, RECORD_CALCDELTA, RECORD_CALCITER, RECORD_CALCREFMODE, RECORD_CALCSAVERECALC, RECORD_CF, RECORD_CF12, RECORD_CFEX, RECORD_COLINFO, RECORD_CONDFMT, RECORD_CONDFMT12, RECORD_CONTINUE, RECORD_CONTINUEFRT12, RECORD_DATE1904, RECORD_DEFAULTROWHEIGHT, RECORD_DEFCOLWIDTH, RECORD_DIMENSIONS, RECORD_DV, RECORD_DVAL, RECORD_EOF, RECORD_EXTERNSHEET, RECORD_FILELOCK, RECORD_FILEPASS, RECORD_FONT, RECORD_FORMAT, RECORD_FORMULA, RECORD_HORIZONTALPAGEBREAKS, RECORD_INTERFACEHDR, RECORD_LABEL, RECORD_LABELSST, RECORD_LBL, RECORD_LEFTMARGIN, RECORD_MERGECELLS, RECORD_MSODRAWING, RECORD_MSODRAWINGGROUP, RECORD_MSODRAWINGSELECTION, RECORD_MULBLANK, RECORD_MULRK, RECORD_NOTE, RECORD_NUMBER, RECORD_OBJ, RECORD_PALETTE, RECORD_PRINTGRID, RECORD_PRINTROWCOL, RECORD_RIGHTMARGIN, RECORD_RK, RECORD_ROW, RECORD_RRDHEAD, RECORD_RRDINFO, RECORD_SERIES, RECORD_SERIESTEXT, RECORD_SETUP, RECORD_SHRFMLA, RECORD_SIINDEX, RECORD_SST, RECORD_STRING, RECORD_STYLE, RECORD_SUPBOOK, RECORD_TABLE, RECORD_TOPMARGIN, RECORD_TXO, RECORD_USREXCL, RECORD_VERTICALPAGEBREAKS, RECORD_WSBOOL, RECORD_XF, RecordBuilder, SUMMARY_INFORMATION_STREAM, buildWorkbookGlobals, buildWorksheetSubstream, columnWidthToPoints, concatRecords, decodeRkNumber, errorCodeOf, errorTextOf, formatCodeOf, groupRecords, inchesToPoints, isXlsFile, isoDateTimeToSerial, isoDateToSerial, isoTimeToSerial, layoutMetadataToSummaryInformation, millimetresToPoints, pointsToColumnWidth, pointsToInches, pointsToTwips, readRecords, readRichExtendedString, readSheetRecords, readShortXLUnicodeString, readWorkbookGlobals, readWorkbookStreams, readXLUnicodeString, readXLUnicodeStringNoCch, readXls, readXlsContent, recordByteLength, serialToIsoDate, serialToIsoDateTime, serialToIsoTime, splitSubstreams, twipsToPoints, writeBofData, writeCellXfRecord, writeFormatRecord, writePaletteRecord, writeRecord, writeRecordChain, writeRichExtendedString, writeShortXLUnicodeString, writeStyleRecord, writeStyleXfRecord, writeXLUnicodeString, writeXLUnicodeStringNoCch, writeXls, writeXlsContent };
@@ -33,6 +33,31 @@ function readObjTypeAndId(group) {
33
33
  id: cursor.u16()
34
34
  };
35
35
  }
36
+ /** [MS-XLS] 2.5.92 FtCmo's own fixed 22-byte length (ft/cb, ot, id, grbit, three unused dwords -- workbook/drawing-writer.ts's own writeFtCmo names the identical fields, in the identical order). */
37
+ const FT_CMO_SIZE = 22;
38
+ /** [MS-XLS] 2.5.150 FtPictFmla's own ft value: the one sub-record naming the Embedding Storage an OLE-embedded picture's data actually lives in, as opposed to the workbook-wide Blip Store a plain image references through its Escher shape's own pib property instead. */
39
+ const FT_PICT_FMLA = 9;
40
+ /**
41
+ * The Embedding Storage id an Obj record's own FtPictFmla names, for a Picture-type object hosting an embedded OLE object rather than a plain image -- workbook/drawing-writer.ts's own writeFtPictFmla is this function's exact inverse. Undefined for a plain picture (whose Obj record carries no FtPictFmla at all, since its data lives in the workbook's Blip Store instead) or for any other object kind.
42
+ *
43
+ * Walks every sub-record after FtCmo -- FtCf, FtPioGrbit, and whichever others a real producer's own Obj record carries -- by its own generic ft/cb framing ([MS-XLS] 2.4.181's own "OBJECTPARSEDFORMULA = ft cb NAME" - shaped `1*ft` production), stopping the moment FtPictFmla itself is found; a zero ft value is the record's own trailing reserved marker (four zero bytes, [MS-XLS] 2.4.181's own "reserved" field) rather than a genuine sub-record, so it ends the walk with no storage id found.
44
+ */
45
+ function readObjPictFmlaStorageId(group) {
46
+ const cursor = new require_biff_cursor.BlockCursor(group.blocks);
47
+ cursor.skip(FT_CMO_SIZE);
48
+ while (cursor.hasMore()) {
49
+ const ft = cursor.u16();
50
+ if (ft === 0) return;
51
+ const cb = cursor.u16();
52
+ if (ft !== FT_PICT_FMLA) {
53
+ cursor.skip(cb);
54
+ continue;
55
+ }
56
+ const cbFmla = cursor.u16();
57
+ cursor.skip(cbFmla);
58
+ return cursor.u32();
59
+ }
60
+ }
36
61
  /** [MS-XLS] 2.4.329 TxO: the fixed fields up to and including ObjFmla are read in full (even the ones this reader discards) purely to advance the cursor correctly onto the Continue-carried text that follows -- reserved4+reserved5 and controlInfo are mutually exclusive per cmo.ot but identical in total size (6 bytes), so which one applies never needs deciding here. Only the plain text is kept: rich per-character formatting runs (cbRuns bytes, TxORuns) are skipped rather than modelled, the same scope limit readRichExtendedString already applies to the SST's own rich strings, for the same reason -- ContentSheetCellComment.text is a plain string with nowhere to carry them. */
37
62
  function readTxoText(group) {
38
63
  const cursor = new require_biff_cursor.BlockCursor(group.blocks);
@@ -82,5 +107,6 @@ function readSheetComments(records) {
82
107
  return comments;
83
108
  }
84
109
  //#endregion
110
+ exports.readObjPictFmlaStorageId = readObjPictFmlaStorageId;
85
111
  exports.readObjTypeAndId = readObjTypeAndId;
86
112
  exports.readSheetComments = readSheetComments;
@@ -12,7 +12,13 @@ declare function readObjTypeAndId(group: RecordGroup): {
12
12
  readonly ot: number;
13
13
  readonly id: number;
14
14
  };
15
+ /**
16
+ * The Embedding Storage id an Obj record's own FtPictFmla names, for a Picture-type object hosting an embedded OLE object rather than a plain image -- workbook/drawing-writer.ts's own writeFtPictFmla is this function's exact inverse. Undefined for a plain picture (whose Obj record carries no FtPictFmla at all, since its data lives in the workbook's Blip Store instead) or for any other object kind.
17
+ *
18
+ * Walks every sub-record after FtCmo -- FtCf, FtPioGrbit, and whichever others a real producer's own Obj record carries -- by its own generic ft/cb framing ([MS-XLS] 2.4.181's own "OBJECTPARSEDFORMULA = ft cb NAME" - shaped `1*ft` production), stopping the moment FtPictFmla itself is found; a zero ft value is the record's own trailing reserved marker (four zero bytes, [MS-XLS] 2.4.181's own "reserved" field) rather than a genuine sub-record, so it ends the walk with no storage id found.
19
+ */
20
+ declare function readObjPictFmlaStorageId(group: RecordGroup): number | undefined;
15
21
  /** Every cell comment a worksheet substream's records carry, keyed `${row}:${column}` to match ooxml.js's own readSheetCellComments convention. A Note record whose idObj resolves to no Obj+TxO pair (a malformed or unusually ordered file) is skipped rather than materialised with fabricated or missing text -- this reader is tolerant of unusual record ordering elsewhere in the substream (see workbook/sheet.ts's own top comment) but a comment with no recoverable text is not real content worth keeping. */
16
22
  declare function readSheetComments(records: readonly RecordGroup[]): ReadonlyMap<string, SheetCellComment>;
17
23
  //#endregion
18
- export { SheetCellComment, readObjTypeAndId, readSheetComments };
24
+ export { SheetCellComment, readObjPictFmlaStorageId, readObjTypeAndId, readSheetComments };
@@ -12,7 +12,13 @@ declare function readObjTypeAndId(group: RecordGroup): {
12
12
  readonly ot: number;
13
13
  readonly id: number;
14
14
  };
15
+ /**
16
+ * The Embedding Storage id an Obj record's own FtPictFmla names, for a Picture-type object hosting an embedded OLE object rather than a plain image -- workbook/drawing-writer.ts's own writeFtPictFmla is this function's exact inverse. Undefined for a plain picture (whose Obj record carries no FtPictFmla at all, since its data lives in the workbook's Blip Store instead) or for any other object kind.
17
+ *
18
+ * Walks every sub-record after FtCmo -- FtCf, FtPioGrbit, and whichever others a real producer's own Obj record carries -- by its own generic ft/cb framing ([MS-XLS] 2.4.181's own "OBJECTPARSEDFORMULA = ft cb NAME" - shaped `1*ft` production), stopping the moment FtPictFmla itself is found; a zero ft value is the record's own trailing reserved marker (four zero bytes, [MS-XLS] 2.4.181's own "reserved" field) rather than a genuine sub-record, so it ends the walk with no storage id found.
19
+ */
20
+ declare function readObjPictFmlaStorageId(group: RecordGroup): number | undefined;
15
21
  /** Every cell comment a worksheet substream's records carry, keyed `${row}:${column}` to match ooxml.js's own readSheetCellComments convention. A Note record whose idObj resolves to no Obj+TxO pair (a malformed or unusually ordered file) is skipped rather than materialised with fabricated or missing text -- this reader is tolerant of unusual record ordering elsewhere in the substream (see workbook/sheet.ts's own top comment) but a comment with no recoverable text is not real content worth keeping. */
16
22
  declare function readSheetComments(records: readonly RecordGroup[]): ReadonlyMap<string, SheetCellComment>;
17
23
  //#endregion
18
- export { SheetCellComment, readObjTypeAndId, readSheetComments };
24
+ export { SheetCellComment, readObjPictFmlaStorageId, readObjTypeAndId, readSheetComments };
@@ -32,6 +32,31 @@ function readObjTypeAndId(group) {
32
32
  id: cursor.u16()
33
33
  };
34
34
  }
35
+ /** [MS-XLS] 2.5.92 FtCmo's own fixed 22-byte length (ft/cb, ot, id, grbit, three unused dwords -- workbook/drawing-writer.ts's own writeFtCmo names the identical fields, in the identical order). */
36
+ const FT_CMO_SIZE = 22;
37
+ /** [MS-XLS] 2.5.150 FtPictFmla's own ft value: the one sub-record naming the Embedding Storage an OLE-embedded picture's data actually lives in, as opposed to the workbook-wide Blip Store a plain image references through its Escher shape's own pib property instead. */
38
+ const FT_PICT_FMLA = 9;
39
+ /**
40
+ * The Embedding Storage id an Obj record's own FtPictFmla names, for a Picture-type object hosting an embedded OLE object rather than a plain image -- workbook/drawing-writer.ts's own writeFtPictFmla is this function's exact inverse. Undefined for a plain picture (whose Obj record carries no FtPictFmla at all, since its data lives in the workbook's Blip Store instead) or for any other object kind.
41
+ *
42
+ * Walks every sub-record after FtCmo -- FtCf, FtPioGrbit, and whichever others a real producer's own Obj record carries -- by its own generic ft/cb framing ([MS-XLS] 2.4.181's own "OBJECTPARSEDFORMULA = ft cb NAME" - shaped `1*ft` production), stopping the moment FtPictFmla itself is found; a zero ft value is the record's own trailing reserved marker (four zero bytes, [MS-XLS] 2.4.181's own "reserved" field) rather than a genuine sub-record, so it ends the walk with no storage id found.
43
+ */
44
+ function readObjPictFmlaStorageId(group) {
45
+ const cursor = new BlockCursor(group.blocks);
46
+ cursor.skip(FT_CMO_SIZE);
47
+ while (cursor.hasMore()) {
48
+ const ft = cursor.u16();
49
+ if (ft === 0) return;
50
+ const cb = cursor.u16();
51
+ if (ft !== FT_PICT_FMLA) {
52
+ cursor.skip(cb);
53
+ continue;
54
+ }
55
+ const cbFmla = cursor.u16();
56
+ cursor.skip(cbFmla);
57
+ return cursor.u32();
58
+ }
59
+ }
35
60
  /** [MS-XLS] 2.4.329 TxO: the fixed fields up to and including ObjFmla are read in full (even the ones this reader discards) purely to advance the cursor correctly onto the Continue-carried text that follows -- reserved4+reserved5 and controlInfo are mutually exclusive per cmo.ot but identical in total size (6 bytes), so which one applies never needs deciding here. Only the plain text is kept: rich per-character formatting runs (cbRuns bytes, TxORuns) are skipped rather than modelled, the same scope limit readRichExtendedString already applies to the SST's own rich strings, for the same reason -- ContentSheetCellComment.text is a plain string with nowhere to carry them. */
36
61
  function readTxoText(group) {
37
62
  const cursor = new BlockCursor(group.blocks);
@@ -81,4 +106,4 @@ function readSheetComments(records) {
81
106
  return comments;
82
107
  }
83
108
  //#endregion
84
- export { readObjTypeAndId, readSheetComments };
109
+ export { readObjPictFmlaStorageId, readObjTypeAndId, readSheetComments };
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- require("../biff/record-types.cjs");
2
+ const require_biff_record_types = require("../biff/record-types.cjs");
3
3
  const require_biff_builder = require("../biff/builder.cjs");
4
4
  const require_biff_write_errors = require("../biff/write-errors.cjs");
5
5
  const require_biff_record_writer = require("../biff/record-writer.cjs");
@@ -66,28 +66,317 @@ function boundingBoxOf(rule) {
66
66
  endColumn
67
67
  };
68
68
  }
69
+ const CT_FORMULA = 2;
70
+ const CT_COLOR_SCALE = 3;
71
+ const CT_DATA_BAR = 4;
72
+ const CT_FILTER = 5;
73
+ const CT_ICON_SET = 6;
74
+ const ICF_TEMPLATE_COLOR_SCALE = 2;
75
+ const ICF_TEMPLATE_DATA_BAR = 3;
76
+ const ICF_TEMPLATE_ICON_SET = 4;
77
+ const ICF_TEMPLATE_FILTER = 5;
78
+ const ICF_TEMPLATE_UNIQUE_VALUES = 7;
79
+ const ICF_TEMPLATE_CONTAINS_TEXT = 8;
80
+ const ICF_TEMPLATE_CONTAINS_BLANKS = 9;
81
+ const ICF_TEMPLATE_CONTAINS_NO_BLANKS = 10;
82
+ const ICF_TEMPLATE_CONTAINS_ERRORS = 11;
83
+ const ICF_TEMPLATE_CONTAINS_NO_ERRORS = 12;
84
+ const ICF_TEMPLATE_ABOVE_AVERAGE = 25;
85
+ const ICF_TEMPLATE_BELOW_AVERAGE = 26;
86
+ const ICF_TEMPLATE_DUPLICATE_VALUES = 27;
87
+ const ICF_TEMPLATE_ABOVE_OR_EQUAL_AVERAGE = 29;
88
+ const ICF_TEMPLATE_BELOW_OR_EQUAL_AVERAGE = 30;
89
+ const TEMPLATE_PARAMS_SIZE = 16;
90
+ function cfvoTypeCodeOf(value) {
91
+ switch (value.type) {
92
+ case "num": return 1;
93
+ case "min": return 2;
94
+ case "max": return 3;
95
+ case "percent": return 4;
96
+ case "percentile": return 5;
97
+ case "formula": return 7;
98
+ default: return;
99
+ }
100
+ }
101
+ function writeCfvo(value) {
102
+ const cfvoType = cfvoTypeCodeOf(value);
103
+ if (cfvoType === void 0) throw new require_biff_write_errors.BiffWriteError(`internal error: ContentSheetConditionalFormatValue carries type "${value.type}", which cfvoTypeCodeOf has no [MS-XLS] 2.5.40 cfvoType code for`);
104
+ if (value.type === "min" || value.type === "max") return new require_biff_builder.RecordBuilder().u8(cfvoType).u16(0).build();
105
+ if (value.value === void 0) throw new require_biff_write_errors.BiffWriteError(`a conditional-format threshold of type "${value.type}" carries no value; the shared schema states a value for every type but "min" and "max", and a CFVO has no spelling for a valueless threshold of any other kind`);
106
+ const rgce = require_biff_ptg_writer.compileFormulaText(value.value);
107
+ return new require_biff_builder.RecordBuilder().u8(cfvoType).u16(rgce.length).bytes(rgce).build();
108
+ }
109
+ function writeCfColor(color) {
110
+ return new require_biff_builder.RecordBuilder().u32(2).u8(Math.round(color.r * 255)).u8(Math.round(color.g * 255)).u8(Math.round(color.b * 255)).u8(0).f64(0).build();
111
+ }
112
+ function writeCfGradient(rule) {
113
+ const count = rule.stops.length;
114
+ const interpFractions = count === 3 ? [
115
+ 0,
116
+ .5,
117
+ 1
118
+ ] : [0, 1];
119
+ const out = new require_biff_builder.RecordBuilder().u16(0).u8(0).u8(count).u8(count).u8(3);
120
+ rule.stops.forEach((stop, index) => {
121
+ out.bytes(writeCfvo(stop.value)).f64(interpFractions[index] ?? 1);
122
+ });
123
+ rule.stops.forEach((stop, index) => {
124
+ out.f64(interpFractions[index] ?? 1).bytes(writeCfColor(stop.color));
125
+ });
126
+ return out.build();
127
+ }
128
+ function writeCfDatabar(rule) {
129
+ return new require_biff_builder.RecordBuilder().u16(0).u8(0).u8(rule.showValue === false ? 0 : 2).u8(0).u8(100).bytes(writeCfColor(rule.color)).bytes(writeCfvo(rule.min)).bytes(writeCfvo(rule.max)).build();
130
+ }
131
+ function iconSetThresholdCount(iIconSet) {
132
+ if (iIconSet <= 7) return 3;
133
+ if (iIconSet <= 12) return 4;
134
+ return 5;
135
+ }
136
+ const ICON_SET_TYPE_NAMES = [
137
+ "3Arrows",
138
+ "3ArrowsGray",
139
+ "3Flags",
140
+ "3TrafficLights1",
141
+ "3TrafficLights2",
142
+ "3Signs",
143
+ "3Symbols",
144
+ "3Symbols2",
145
+ "4Arrows",
146
+ "4ArrowsGray",
147
+ "4RedToBlack",
148
+ "4Rating",
149
+ "4TrafficLights",
150
+ "5Arrows",
151
+ "5ArrowsGray",
152
+ "5Rating",
153
+ "5Quarters"
154
+ ];
155
+ function writeCfMultistate(rule) {
156
+ const iIconSet = ICON_SET_TYPE_NAMES.indexOf(rule.iconSetType);
157
+ if (iIconSet < 0) throw new require_biff_write_errors.BiffWriteError(`xls-codec cannot write an icon-set rule naming the icon set "${rule.iconSetType}": [MS-XLS] 2.5.36's own iIconSet table names exactly the seventeen built-in sets, and a custom set has no BIFF8 byte to be written as`);
158
+ const expectedThresholds = iconSetThresholdCount(iIconSet);
159
+ if (rule.thresholds.length !== expectedThresholds) throw new require_biff_write_errors.BiffWriteError(`an icon-set rule naming the icon set "${rule.iconSetType}" carries ${rule.thresholds.length} thresholds where [MS-XLS] 2.5.36's own cStates table fixes the set at ${expectedThresholds}; the threshold count and the set cannot disagree in one CFMultistate`);
160
+ const out = new require_biff_builder.RecordBuilder().u16(0).u8(0).u8(expectedThresholds).u8(iIconSet).u8((rule.showValue === false ? 1 : 0) | (rule.reverse === true ? 4 : 0));
161
+ for (const threshold of rule.thresholds) {
162
+ out.bytes(writeCfvo(threshold)).u8(0);
163
+ out.u32(0);
164
+ }
165
+ return out.build();
166
+ }
167
+ function writeCfFilter(top10) {
168
+ const flags = top10 === void 0 ? 0 : (top10.bottom === true ? 0 : 1) | (top10.percent === true ? 2 : 0);
169
+ return new require_biff_builder.RecordBuilder().u16(4).u8(0).u8(flags).u16(top10?.rank ?? 0).build();
170
+ }
171
+ const TIME_PERIOD_TO_ICF_TEMPLATE = /* @__PURE__ */ new Map([
172
+ ["today", 15],
173
+ ["tomorrow", 16],
174
+ ["yesterday", 17],
175
+ ["last7Days", 18],
176
+ ["lastMonth", 19],
177
+ ["nextMonth", 20],
178
+ ["thisWeek", 21],
179
+ ["nextWeek", 22],
180
+ ["lastWeek", 23],
181
+ ["thisMonth", 24]
182
+ ]);
183
+ const SIMPLE_KIND_TO_ICF_TEMPLATE = /* @__PURE__ */ new Map([
184
+ ["containsBlanks", ICF_TEMPLATE_CONTAINS_BLANKS],
185
+ ["notContainsBlanks", ICF_TEMPLATE_CONTAINS_NO_BLANKS],
186
+ ["containsErrors", ICF_TEMPLATE_CONTAINS_ERRORS],
187
+ ["notContainsErrors", ICF_TEMPLATE_CONTAINS_NO_ERRORS],
188
+ ["uniqueValues", ICF_TEMPLATE_UNIQUE_VALUES],
189
+ ["duplicateValues", ICF_TEMPLATE_DUPLICATE_VALUES]
190
+ ]);
191
+ const CTP_BY_TEXT_TYPE = /* @__PURE__ */ new Map([
192
+ ["containsText", 0],
193
+ ["notContainsText", 1],
194
+ ["beginsWith", 2],
195
+ ["endsWith", 3]
196
+ ]);
197
+ function textRuleFormula(rule) {
198
+ const anchor = rule.ranges[0];
199
+ if (anchor === void 0) throw new require_biff_write_errors.BiffWriteError("internal error: textRuleFormula was called for a rule whose ranges were never validated");
200
+ const cell = relativeCellRef(anchor.startRow, anchor.startColumn);
201
+ const text = `"${rule.text.replaceAll("\"", "\"\"")}"`;
202
+ switch (rule.type) {
203
+ case "containsText": return `NOT(ISERROR(SEARCH(${text},${cell})))`;
204
+ case "notContainsText": return `ISERROR(SEARCH(${text},${cell}))`;
205
+ case "beginsWith": return `LEFT(${cell},LEN(${text}))=${text}`;
206
+ case "endsWith": return `RIGHT(${cell},LEN(${text}))=${text}`;
207
+ }
208
+ }
209
+ function relativeCellRef(row, column) {
210
+ let letters = "";
211
+ let index = column;
212
+ do {
213
+ letters = String.fromCharCode(65 + index % 26) + letters;
214
+ index = Math.floor(index / 26) - 1;
215
+ } while (index >= 0);
216
+ return `${letters}${row + 1}`;
217
+ }
218
+ function writeCf12Record(rule, ipriority, icvOf) {
219
+ let ct;
220
+ let icfTemplate;
221
+ let templateParams;
222
+ let rgbCt;
223
+ let rgce1;
224
+ let dxf;
225
+ switch (rule.type) {
226
+ case "colorScale":
227
+ ct = CT_COLOR_SCALE;
228
+ icfTemplate = ICF_TEMPLATE_COLOR_SCALE;
229
+ templateParams = new Uint8Array(TEMPLATE_PARAMS_SIZE);
230
+ rgbCt = writeCfGradient(rule);
231
+ dxf = /* @__PURE__ */ new Uint8Array(0);
232
+ break;
233
+ case "dataBar":
234
+ ct = CT_DATA_BAR;
235
+ icfTemplate = ICF_TEMPLATE_DATA_BAR;
236
+ templateParams = new Uint8Array(TEMPLATE_PARAMS_SIZE);
237
+ rgbCt = writeCfDatabar(rule);
238
+ dxf = /* @__PURE__ */ new Uint8Array(0);
239
+ break;
240
+ case "iconSet":
241
+ ct = CT_ICON_SET;
242
+ icfTemplate = ICF_TEMPLATE_ICON_SET;
243
+ templateParams = new Uint8Array(TEMPLATE_PARAMS_SIZE);
244
+ rgbCt = writeCfMultistate(rule);
245
+ dxf = /* @__PURE__ */ new Uint8Array(0);
246
+ break;
247
+ case "top10":
248
+ ct = CT_FILTER;
249
+ icfTemplate = ICF_TEMPLATE_FILTER;
250
+ templateParams = new require_biff_builder.RecordBuilder().u8((rule.bottom === true ? 0 : 1) | (rule.percent === true ? 2 : 0)).u16(rule.rank).bytes(/* @__PURE__ */ new Uint8Array(13)).build();
251
+ rgbCt = writeCfFilter(rule);
252
+ dxf = writeDxfn(rule.style, icvOf);
253
+ break;
254
+ case "aboveAverage": {
255
+ ct = CT_FILTER;
256
+ icfTemplate = !(rule.aboveAverage ?? true) ? rule.equalAverage === true ? ICF_TEMPLATE_BELOW_OR_EQUAL_AVERAGE : ICF_TEMPLATE_BELOW_AVERAGE : rule.equalAverage === true ? ICF_TEMPLATE_ABOVE_OR_EQUAL_AVERAGE : ICF_TEMPLATE_ABOVE_AVERAGE;
257
+ const stdDev = rule.stdDev ?? 0;
258
+ if (stdDev > 2) throw new require_biff_write_errors.BiffWriteError(`an aboveAverage rule declaring ${stdDev} standard deviations cannot be written: [MS-XLS] 2.5.23's own iParam table admits only 0, 1, or 2`);
259
+ templateParams = new require_biff_builder.RecordBuilder().u16(stdDev).bytes(/* @__PURE__ */ new Uint8Array(14)).build();
260
+ rgbCt = writeCfFilter(void 0);
261
+ dxf = writeDxfn(rule.style, icvOf);
262
+ break;
263
+ }
264
+ case "timePeriod": {
265
+ ct = CT_FILTER;
266
+ const template = TIME_PERIOD_TO_ICF_TEMPLATE.get(rule.timePeriod);
267
+ if (template === void 0) throw new require_biff_write_errors.BiffWriteError(`a timePeriod rule naming "${rule.timePeriod}" cannot be written: that member exists only in LibreOffice's calcext extension vocabulary ([MS-XLS] 2.4.43's own icfTemplate table has no year-scoped period), so no BIFF8 rule names it`);
268
+ icfTemplate = template;
269
+ templateParams = new require_biff_builder.RecordBuilder().u16(template).bytes(/* @__PURE__ */ new Uint8Array(14)).build();
270
+ rgbCt = writeCfFilter(void 0);
271
+ dxf = writeDxfn(rule.style, icvOf);
272
+ break;
273
+ }
274
+ case "containsBlanks":
275
+ case "notContainsBlanks":
276
+ case "containsErrors":
277
+ case "notContainsErrors":
278
+ case "uniqueValues":
279
+ case "duplicateValues": {
280
+ ct = CT_FILTER;
281
+ const template = SIMPLE_KIND_TO_ICF_TEMPLATE.get(rule.type);
282
+ if (template === void 0) throw new require_biff_write_errors.BiffWriteError(`internal error: SIMPLE_KIND_TO_ICF_TEMPLATE has no icfTemplate for rule type "${rule.type}"`);
283
+ icfTemplate = template;
284
+ templateParams = new Uint8Array(TEMPLATE_PARAMS_SIZE);
285
+ rgbCt = writeCfFilter(void 0);
286
+ dxf = writeDxfn(rule.style, icvOf);
287
+ break;
288
+ }
289
+ case "containsText":
290
+ case "notContainsText":
291
+ case "beginsWith":
292
+ case "endsWith": {
293
+ ct = CT_FORMULA;
294
+ icfTemplate = ICF_TEMPLATE_CONTAINS_TEXT;
295
+ const ctp = CTP_BY_TEXT_TYPE.get(rule.type);
296
+ if (ctp === void 0) throw new require_biff_write_errors.BiffWriteError(`internal error: CTP_BY_TEXT_TYPE has no ctp for rule type "${rule.type}"`);
297
+ templateParams = new require_biff_builder.RecordBuilder().u16(ctp).bytes(/* @__PURE__ */ new Uint8Array(14)).build();
298
+ rgce1 = require_biff_ptg_writer.compileFormulaText(textRuleFormula(rule));
299
+ dxf = writeDxfn(rule.style, icvOf);
300
+ break;
301
+ }
302
+ default: throw new require_biff_write_errors.BiffWriteError("internal error: writeCf12Record was called for a rule type its own dispatch never names");
303
+ }
304
+ const writer = new require_biff_builder.RecordBuilder().u16(require_biff_record_types.RECORD_CF12).u16(0).bytes(/* @__PURE__ */ new Uint8Array(8)).u8(ct).u8(0).u16(rgce1?.length ?? 0).u16(0).u32(dxf.length).bytes(dxf);
305
+ if (rgce1 !== void 0) writer.bytes(rgce1);
306
+ writer.u16(0).u8(rule.stopIfTrue === true ? 2 : 0).u16(ipriority).u16(icfTemplate).u8(TEMPLATE_PARAMS_SIZE).bytes(templateParams);
307
+ if (rgbCt !== void 0) writer.bytes(rgbCt);
308
+ return require_biff_record_writer.writeRecord(require_biff_record_types.RECORD_CF12, writer.build());
309
+ }
310
+ function assignPriorities(rules) {
311
+ const used = /* @__PURE__ */ new Set();
312
+ for (const rule of rules) {
313
+ if (rule.priority === void 0) continue;
314
+ if (used.has(rule.priority)) throw new require_biff_write_errors.BiffWriteError(`two conditional-format rules declare priority ${rule.priority}; [MS-XLS] 2.4.43 requires ipriority to be unique across a sheet's CF12 records, so a document repeating one is contradictory rather than orderable`);
315
+ used.add(rule.priority);
316
+ }
317
+ return rules.map((rule) => {
318
+ if (rule.priority !== void 0) return rule.priority;
319
+ let candidate = 1;
320
+ while (used.has(candidate)) candidate += 1;
321
+ used.add(candidate);
322
+ return candidate;
323
+ });
324
+ }
325
+ function writeCondFmt12Record(rule, nID) {
326
+ const box = boundingBoxOf(rule);
327
+ const header = new require_biff_builder.RecordBuilder().u16(require_biff_record_types.RECORD_CONDFMT12).u16(1).u16(box.startRow).u16(box.endRow).u16(box.startColumn).u16(box.endColumn).u16(1).u16(nID << 1).u16(box.startRow).u16(box.endRow).u16(box.startColumn).u16(box.endColumn).u16(rule.ranges.length);
328
+ for (const range of rule.ranges) {
329
+ header.u16(range.startRow);
330
+ header.u16(range.endRow);
331
+ header.u16(range.startColumn);
332
+ header.u16(range.endColumn);
333
+ }
334
+ return require_biff_record_writer.writeRecord(require_biff_record_types.RECORD_CONDFMT12, header.build());
335
+ }
336
+ function validateRuleGrid(rule) {
337
+ if (rule.ranges.length === 0) throw new require_biff_write_errors.BiffWriteError("a conditional-format rule carrying no range states nothing; the schema requires at least one");
338
+ for (const range of rule.ranges) if (range.startRow > 65535 || range.endRow > 65535 || range.startColumn > 255 || range.endColumn > 255) throw new require_biff_write_errors.BiffWriteError(`a conditional-format range (rows ${range.startRow}-${range.endRow}, columns ${range.startColumn}-${range.endColumn}) is outside BIFF8's own grid; a .xls workbook cannot address it`);
339
+ }
340
+ function validateStopIfTrue(rule) {
341
+ if (rule.stopIfTrue === true && (rule.type === "colorScale" || rule.type === "dataBar" || rule.type === "iconSet")) throw new require_biff_write_errors.BiffWriteError(`a conditional-format rule of type "${rule.type}" declaring stopIfTrue cannot be written: [MS-XLS] 2.4.43 pins CF12's own fStopIfTrue bit to zero for the visual-scale rule types`);
342
+ }
69
343
  function writeSheetConditionalFormats(sheet, icvOf) {
70
344
  const rules = sheet.conditionalFormats ?? [];
71
345
  if (rules.length === 0) return [];
72
- const pieces = [];
73
- for (const [index, rule] of rules.entries()) {
74
- if (rule.type !== "cellIs") throw new require_biff_write_errors.BiffWriteError(`a conditional-format rule of type "${rule.type}" has no base BIFF8 CF spelling; this writer states cellIs comparisons only (CF12 writing is out of scope), so the rule cannot be written rather than silently dropped`);
75
- if (rule.ranges.length === 0) throw new require_biff_write_errors.BiffWriteError("a conditional-format rule carrying no range states nothing; the schema requires at least one");
76
- for (const range of rule.ranges) if (range.startRow > 65535 || range.endRow > 65535 || range.startColumn > 255 || range.endColumn > 255) throw new require_biff_write_errors.BiffWriteError(`a conditional-format range (rows ${range.startRow}-${range.endRow}, columns ${range.startColumn}-${range.endColumn}) is outside BIFF8's own grid; a .xls workbook cannot address it`);
77
- const nID = index + 1;
78
- if (nID > 32767) throw new require_biff_write_errors.BiffWriteError(`this sheet's ${rules.length} conditional-format rules exceed CondFmt's own 15-bit nID field`);
79
- const box = boundingBoxOf(rule);
80
- const header = new require_biff_builder.RecordBuilder().u16(1).u16(nID << 1).u16(box.startRow).u16(box.endRow).u16(box.startColumn).u16(box.endColumn).u16(rule.ranges.length);
81
- for (const range of rule.ranges) {
82
- header.u16(range.startRow);
83
- header.u16(range.endRow);
84
- header.u16(range.startColumn);
85
- header.u16(range.endColumn);
346
+ const basePieces = [];
347
+ const cf12Pieces = [];
348
+ if (rules.length > 32767) throw new require_biff_write_errors.BiffWriteError(`this sheet's ${rules.length} conditional-format rules exceed CondFmt's own 15-bit nID field`);
349
+ const cf12Rules = [];
350
+ rules.forEach((rule, index) => {
351
+ validateRuleGrid(rule);
352
+ if (rule.type === "cellIs") {
353
+ basePieces.push(writeCondFmtRecord(rule, index + 1), writeCfRecord(rule, icvOf));
354
+ return;
86
355
  }
87
- pieces.push(require_biff_record_writer.writeRecord(432, header.build()));
88
- pieces.push(writeCfRecord(rule, icvOf));
356
+ validateStopIfTrue(rule);
357
+ cf12Rules.push({
358
+ rule,
359
+ nID: index + 1
360
+ });
361
+ });
362
+ const priorities = assignPriorities(cf12Rules.map(({ rule }) => rule));
363
+ cf12Rules.forEach(({ rule, nID }, index) => {
364
+ const ipriority = priorities[index];
365
+ if (ipriority === void 0) throw new require_biff_write_errors.BiffWriteError("internal error: assignPriorities returned fewer priorities than there are CF12 rules");
366
+ cf12Pieces.push(writeCondFmt12Record(rule, nID), writeCf12Record(rule, ipriority, icvOf));
367
+ });
368
+ return [...basePieces, ...cf12Pieces];
369
+ }
370
+ function writeCondFmtRecord(rule, nID) {
371
+ const box = boundingBoxOf(rule);
372
+ const header = new require_biff_builder.RecordBuilder().u16(1).u16(nID << 1).u16(box.startRow).u16(box.endRow).u16(box.startColumn).u16(box.endColumn).u16(rule.ranges.length);
373
+ for (const range of rule.ranges) {
374
+ header.u16(range.startRow);
375
+ header.u16(range.endRow);
376
+ header.u16(range.startColumn);
377
+ header.u16(range.endColumn);
89
378
  }
90
- return pieces;
379
+ return require_biff_record_writer.writeRecord(432, header.build());
91
380
  }
92
381
  //#endregion
93
382
  exports.writeSheetConditionalFormats = writeSheetConditionalFormats;