@el-j/google-sheet-translations 3.0.0-beta.14 → 3.0.0-beta.15

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.
package/dist/esm/index.js CHANGED
@@ -7522,16 +7522,55 @@ function parseOnlyOfficeChanges(rtMessages) {
7522
7522
  if (buf[offsetAfterSheet] === 1) {
7523
7523
  const c1 = buf.readUInt32LE(offsetAfterSheet + 1);
7524
7524
  const r1 = buf.readUInt32LE(offsetAfterSheet + 5);
7525
- for (let k = offsetAfterSheet + 17; k < buf.length - 5; k++) if (buf[k] === 8) {
7526
- const strLen = buf.readUInt32LE(k + 1);
7527
- if (strLen >= 0 && strLen < 1e5 && k + 5 + strLen <= buf.length) {
7528
- const val = buf.subarray(k + 5, k + 5 + strLen).toString("utf16le");
7529
- const colLetter = colIndexToLetter(c1);
7530
- const tabName = sheetNames.get(sheetIdStr) && sheetNames.get(sheetIdStr) !== "Sheet1" ? sheetNames.get(sheetIdStr) : "";
7531
- const cellRef = `${tabName ? `${tabName}!` : ""}${colLetter}${r1 + 1}`;
7532
- cells[cellRef] = val;
7525
+ const colLetter = colIndexToLetter(c1);
7526
+ const tabName = sheetNames.get(sheetIdStr) && sheetNames.get(sheetIdStr) !== "Sheet1" ? sheetNames.get(sheetIdStr) : "";
7527
+ const cellRef = `${tabName ? `${tabName}!` : ""}${colLetter}${r1 + 1}`;
7528
+ let extracted = false;
7529
+ if (offsetAfterSheet + 50 <= buf.length && buf[offsetAfterSheet + 45] === 8) {
7530
+ const len = buf.readUInt32LE(offsetAfterSheet + 46);
7531
+ if (len >= 0 && len % 2 === 0 && offsetAfterSheet + 50 + len <= buf.length) {
7532
+ cells[cellRef] = buf.subarray(offsetAfterSheet + 50, offsetAfterSheet + 50 + len).toString("utf16le");
7533
+ extracted = true;
7534
+ }
7535
+ }
7536
+ if (!extracted && offsetAfterSheet + 40 <= buf.length && buf[offsetAfterSheet + 35] === 8) {
7537
+ const len = buf.readUInt32LE(offsetAfterSheet + 36);
7538
+ if (len >= 0 && len % 2 === 0 && offsetAfterSheet + 40 + len <= buf.length) {
7539
+ cells[cellRef] = buf.subarray(offsetAfterSheet + 40, offsetAfterSheet + 40 + len).toString("utf16le");
7540
+ extracted = true;
7541
+ }
7542
+ }
7543
+ if (!extracted) {
7544
+ for (let k = offsetAfterSheet + 17; k < buf.length - 5; k++) if (buf[k] === 8 && (k === offsetAfterSheet + 17 || buf[k - 1] <= 5)) {
7545
+ const strLen = buf.readUInt32LE(k + 1);
7546
+ if (strLen >= 0 && strLen % 2 === 0 && strLen < 1e5 && k + 5 + strLen <= buf.length) {
7547
+ cells[cellRef] = buf.subarray(k + 5, k + 5 + strLen).toString("utf16le");
7548
+ break;
7549
+ }
7550
+ }
7551
+ }
7552
+ }
7553
+ }
7554
+ }
7555
+ if (magic === 19529985) {
7556
+ const sheetIdLen = buf.readUInt32LE(8);
7557
+ if (sheetIdLen > 0 && sheetIdLen < 200 && 12 + sheetIdLen + 17 <= buf.length) {
7558
+ const sheetIdStr = buf.subarray(12, 12 + sheetIdLen).toString("utf16le");
7559
+ const offsetAfterSheet = 12 + sheetIdLen;
7560
+ if (buf[offsetAfterSheet] === 1) {
7561
+ const c1 = buf.readUInt32LE(offsetAfterSheet + 1);
7562
+ const r1 = buf.readUInt32LE(offsetAfterSheet + 5);
7563
+ const c2 = buf.readUInt32LE(offsetAfterSheet + 9);
7564
+ const r2 = buf.readUInt32LE(offsetAfterSheet + 13);
7565
+ const tabName = sheetNames.get(sheetIdStr) && sheetNames.get(sheetIdStr) !== "Sheet1" ? sheetNames.get(sheetIdStr) : "";
7566
+ const sheetPrefix = tabName ? `${tabName}!` : "";
7567
+ for (let c = c1; c <= c2; c++) {
7568
+ const colLetter = colIndexToLetter(c);
7569
+ for (let r = r1; r <= r2; r++) {
7570
+ const cellRef = `${sheetPrefix}${colLetter}${r + 1}`;
7571
+ delete cells[cellRef];
7572
+ if (!tabName) delete cells[`Sheet1!${colLetter}${r + 1}`];
7533
7573
  }
7534
- break;
7535
7574
  }
7536
7575
  }
7537
7576
  }
@@ -8617,23 +8656,20 @@ var CryptPadClient = class {
8617
8656
  value: name
8618
8657
  });
8619
8658
  });
8620
- const keyToRowIdx = /* @__PURE__ */ new Map();
8621
- existingRows.forEach((r, idx) => {
8622
- const rowKey = r.var ?? r.key ?? r[keyColName];
8623
- if (rowKey) keyToRowIdx.set(rowKey, idx + 2);
8624
- });
8625
- let nextAvailableRow = existingRows.length + 2;
8626
- for (const row of rows) {
8627
- const rowKey = row.var ?? row.key ?? row[keyColName];
8628
- if (!rowKey) continue;
8629
- const targetRow = keyToRowIdx.get(rowKey) ?? nextAvailableRow++;
8630
- keyToRowIdx.set(rowKey, targetRow);
8631
- for (const [colName, val] of Object.entries(row)) {
8632
- const colIdx = findColIdx(colName === "key" || colName === "var" ? keyColName : colName);
8633
- if (colIdx >= 0 && val !== void 0) {
8634
- const matchedHeader = colNames[colIdx];
8635
- const existingVal = existingRows[targetRow - 2]?.[matchedHeader];
8636
- if (options.override || !existingVal || existingVal.trim().length === 0) updates.push({
8659
+ const keyColIdx = findColIdx(keyColName);
8660
+ const keyColLetter = colIndexToLetter(keyColIdx >= 0 ? keyColIdx : 0);
8661
+ const sheetCells = data.sheets[sheetName]?.cells ?? {};
8662
+ let maxPhysicalRow = 1;
8663
+ for (const cellRef of Object.keys(sheetCells)) {
8664
+ const parsed = parseCellRef(cellRef);
8665
+ if (parsed && parsed.row > maxPhysicalRow) maxPhysicalRow = parsed.row;
8666
+ }
8667
+ if (options.override) {
8668
+ rows.forEach((row, i) => {
8669
+ const targetRow = i + 2;
8670
+ for (const [colName, val] of Object.entries(row)) {
8671
+ const colIdx = findColIdx(colName === "key" || colName === "var" ? keyColName : colName);
8672
+ if (colIdx >= 0 && val !== void 0) updates.push({
8637
8673
  sheet: sheetName,
8638
8674
  sheetId: targetSheetId,
8639
8675
  col: colIndexToLetter(colIdx),
@@ -8641,6 +8677,48 @@ var CryptPadClient = class {
8641
8677
  value: String(val)
8642
8678
  });
8643
8679
  }
8680
+ });
8681
+ const lastIncomingRow = rows.length + 1;
8682
+ if (maxPhysicalRow > lastIncomingRow) for (let r = lastIncomingRow + 1; r <= maxPhysicalRow; r++) for (let c = 0; c < colNames.length; c++) {
8683
+ const colLet = colIndexToLetter(c);
8684
+ if (sheetCells[`${colLet}${r}`] || sheetCells[`${sheetName}!${colLet}${r}`]) updates.push({
8685
+ sheet: sheetName,
8686
+ sheetId: targetSheetId,
8687
+ col: colLet,
8688
+ row: r,
8689
+ value: ""
8690
+ });
8691
+ }
8692
+ } else {
8693
+ const keyToRowIdx = /* @__PURE__ */ new Map();
8694
+ for (const [cellRef, val] of Object.entries(sheetCells)) {
8695
+ const parsed = parseCellRef(cellRef);
8696
+ if (!parsed) continue;
8697
+ if (parsed.col.toUpperCase() === keyColLetter && parsed.row > 1) {
8698
+ const trimmedVal = val.trim();
8699
+ if (trimmedVal.length > 0) keyToRowIdx.set(trimmedVal, parsed.row);
8700
+ }
8701
+ }
8702
+ let nextAvailableRow = Math.max(maxPhysicalRow + 1, 2);
8703
+ for (const row of rows) {
8704
+ const rowKey = row.var ?? row.key ?? row[keyColName];
8705
+ if (!rowKey) continue;
8706
+ const targetRow = keyToRowIdx.get(rowKey) ?? nextAvailableRow++;
8707
+ keyToRowIdx.set(rowKey, targetRow);
8708
+ for (const [colName, val] of Object.entries(row)) {
8709
+ const colIdx = findColIdx(colName === "key" || colName === "var" ? keyColName : colName);
8710
+ if (colIdx >= 0 && val !== void 0) {
8711
+ const colLetter = colIndexToLetter(colIdx);
8712
+ const existingCellVal = sheetCells[`${colLetter}${targetRow}`] ?? sheetCells[`${sheetName}!${colLetter}${targetRow}`];
8713
+ if (!existingCellVal || existingCellVal.trim().length === 0) updates.push({
8714
+ sheet: sheetName,
8715
+ sheetId: targetSheetId,
8716
+ col: colLetter,
8717
+ row: targetRow,
8718
+ value: String(val)
8719
+ });
8720
+ }
8721
+ }
8644
8722
  }
8645
8723
  }
8646
8724
  await this.sendCellUpdates(updates, options.signal, rtChannel);
@@ -8730,12 +8808,13 @@ const CRYPTPAD_SHEET_OUTPUT_CAPABILITIES = createCapabilitySet({ writeTables: tr
8730
8808
  * Converts nested TranslationData `[locale][sheet][key] = value` into
8731
8809
  * tabular rows `Record<sheetName, SheetRow[]>`.
8732
8810
  */
8733
- function convertTranslationsToSheetRows(translations, localeMapping = {}, keyColumnName = "key", includeI18nSheet = false) {
8811
+ function convertTranslationsToSheetRows(translations, localeMapping = {}, keyColumnName = "key", includeI18nSheet = false, sheetTitles) {
8734
8812
  const sheetRowsMap = {};
8735
8813
  for (const [locale, sheets] of Object.entries(translations)) {
8736
8814
  const colHeader = localeMapping[locale] ?? locale;
8737
8815
  for (const [sheetName, keys] of Object.entries(sheets)) {
8738
8816
  if (!includeI18nSheet && sheetName === "i18n") continue;
8817
+ if (sheetTitles && sheetTitles.length > 0 && !sheetTitles.includes(sheetName)) continue;
8739
8818
  if (!sheetRowsMap[sheetName]) sheetRowsMap[sheetName] = /* @__PURE__ */ new Map();
8740
8819
  for (const [key, value] of Object.entries(keys)) {
8741
8820
  if (!sheetRowsMap[sheetName].has(key)) sheetRowsMap[sheetName].set(key, { [keyColumnName]: key });
@@ -8768,7 +8847,7 @@ function createCryptPadSheetOutputProvider(options = {}) {
8768
8847
  timeoutMs: options.timeoutMs
8769
8848
  });
8770
8849
  const effectiveMapping = options.localeMapping ?? payload.localeMapping ?? {};
8771
- const sheetRowsMap = convertTranslationsToSheetRows(payload.translations, effectiveMapping, options.keyColumnName ?? "key", options.includeI18nSheet ?? false);
8850
+ const sheetRowsMap = convertTranslationsToSheetRows(payload.translations, effectiveMapping, options.keyColumnName ?? "key", options.includeI18nSheet ?? false, options.sheetTitles);
8772
8851
  const updatedSheets = [];
8773
8852
  let totalUpdatedCells = 0;
8774
8853
  const sheetEntries = Object.entries(sheetRowsMap).sort(([a], [b]) => {
package/dist/index.js CHANGED
@@ -7531,16 +7531,55 @@ function parseOnlyOfficeChanges(rtMessages) {
7531
7531
  if (buf[offsetAfterSheet] === 1) {
7532
7532
  const c1 = buf.readUInt32LE(offsetAfterSheet + 1);
7533
7533
  const r1 = buf.readUInt32LE(offsetAfterSheet + 5);
7534
- for (let k = offsetAfterSheet + 17; k < buf.length - 5; k++) if (buf[k] === 8) {
7535
- const strLen = buf.readUInt32LE(k + 1);
7536
- if (strLen >= 0 && strLen < 1e5 && k + 5 + strLen <= buf.length) {
7537
- const val = buf.subarray(k + 5, k + 5 + strLen).toString("utf16le");
7538
- const colLetter = colIndexToLetter(c1);
7539
- const tabName = sheetNames.get(sheetIdStr) && sheetNames.get(sheetIdStr) !== "Sheet1" ? sheetNames.get(sheetIdStr) : "";
7540
- const cellRef = `${tabName ? `${tabName}!` : ""}${colLetter}${r1 + 1}`;
7541
- cells[cellRef] = val;
7534
+ const colLetter = colIndexToLetter(c1);
7535
+ const tabName = sheetNames.get(sheetIdStr) && sheetNames.get(sheetIdStr) !== "Sheet1" ? sheetNames.get(sheetIdStr) : "";
7536
+ const cellRef = `${tabName ? `${tabName}!` : ""}${colLetter}${r1 + 1}`;
7537
+ let extracted = false;
7538
+ if (offsetAfterSheet + 50 <= buf.length && buf[offsetAfterSheet + 45] === 8) {
7539
+ const len = buf.readUInt32LE(offsetAfterSheet + 46);
7540
+ if (len >= 0 && len % 2 === 0 && offsetAfterSheet + 50 + len <= buf.length) {
7541
+ cells[cellRef] = buf.subarray(offsetAfterSheet + 50, offsetAfterSheet + 50 + len).toString("utf16le");
7542
+ extracted = true;
7543
+ }
7544
+ }
7545
+ if (!extracted && offsetAfterSheet + 40 <= buf.length && buf[offsetAfterSheet + 35] === 8) {
7546
+ const len = buf.readUInt32LE(offsetAfterSheet + 36);
7547
+ if (len >= 0 && len % 2 === 0 && offsetAfterSheet + 40 + len <= buf.length) {
7548
+ cells[cellRef] = buf.subarray(offsetAfterSheet + 40, offsetAfterSheet + 40 + len).toString("utf16le");
7549
+ extracted = true;
7550
+ }
7551
+ }
7552
+ if (!extracted) {
7553
+ for (let k = offsetAfterSheet + 17; k < buf.length - 5; k++) if (buf[k] === 8 && (k === offsetAfterSheet + 17 || buf[k - 1] <= 5)) {
7554
+ const strLen = buf.readUInt32LE(k + 1);
7555
+ if (strLen >= 0 && strLen % 2 === 0 && strLen < 1e5 && k + 5 + strLen <= buf.length) {
7556
+ cells[cellRef] = buf.subarray(k + 5, k + 5 + strLen).toString("utf16le");
7557
+ break;
7558
+ }
7559
+ }
7560
+ }
7561
+ }
7562
+ }
7563
+ }
7564
+ if (magic === 19529985) {
7565
+ const sheetIdLen = buf.readUInt32LE(8);
7566
+ if (sheetIdLen > 0 && sheetIdLen < 200 && 12 + sheetIdLen + 17 <= buf.length) {
7567
+ const sheetIdStr = buf.subarray(12, 12 + sheetIdLen).toString("utf16le");
7568
+ const offsetAfterSheet = 12 + sheetIdLen;
7569
+ if (buf[offsetAfterSheet] === 1) {
7570
+ const c1 = buf.readUInt32LE(offsetAfterSheet + 1);
7571
+ const r1 = buf.readUInt32LE(offsetAfterSheet + 5);
7572
+ const c2 = buf.readUInt32LE(offsetAfterSheet + 9);
7573
+ const r2 = buf.readUInt32LE(offsetAfterSheet + 13);
7574
+ const tabName = sheetNames.get(sheetIdStr) && sheetNames.get(sheetIdStr) !== "Sheet1" ? sheetNames.get(sheetIdStr) : "";
7575
+ const sheetPrefix = tabName ? `${tabName}!` : "";
7576
+ for (let c = c1; c <= c2; c++) {
7577
+ const colLetter = colIndexToLetter(c);
7578
+ for (let r = r1; r <= r2; r++) {
7579
+ const cellRef = `${sheetPrefix}${colLetter}${r + 1}`;
7580
+ delete cells[cellRef];
7581
+ if (!tabName) delete cells[`Sheet1!${colLetter}${r + 1}`];
7542
7582
  }
7543
- break;
7544
7583
  }
7545
7584
  }
7546
7585
  }
@@ -8626,23 +8665,20 @@ var CryptPadClient = class {
8626
8665
  value: name
8627
8666
  });
8628
8667
  });
8629
- const keyToRowIdx = /* @__PURE__ */ new Map();
8630
- existingRows.forEach((r, idx) => {
8631
- const rowKey = r.var ?? r.key ?? r[keyColName];
8632
- if (rowKey) keyToRowIdx.set(rowKey, idx + 2);
8633
- });
8634
- let nextAvailableRow = existingRows.length + 2;
8635
- for (const row of rows) {
8636
- const rowKey = row.var ?? row.key ?? row[keyColName];
8637
- if (!rowKey) continue;
8638
- const targetRow = keyToRowIdx.get(rowKey) ?? nextAvailableRow++;
8639
- keyToRowIdx.set(rowKey, targetRow);
8640
- for (const [colName, val] of Object.entries(row)) {
8641
- const colIdx = findColIdx(colName === "key" || colName === "var" ? keyColName : colName);
8642
- if (colIdx >= 0 && val !== void 0) {
8643
- const matchedHeader = colNames[colIdx];
8644
- const existingVal = existingRows[targetRow - 2]?.[matchedHeader];
8645
- if (options.override || !existingVal || existingVal.trim().length === 0) updates.push({
8668
+ const keyColIdx = findColIdx(keyColName);
8669
+ const keyColLetter = colIndexToLetter(keyColIdx >= 0 ? keyColIdx : 0);
8670
+ const sheetCells = data.sheets[sheetName]?.cells ?? {};
8671
+ let maxPhysicalRow = 1;
8672
+ for (const cellRef of Object.keys(sheetCells)) {
8673
+ const parsed = parseCellRef(cellRef);
8674
+ if (parsed && parsed.row > maxPhysicalRow) maxPhysicalRow = parsed.row;
8675
+ }
8676
+ if (options.override) {
8677
+ rows.forEach((row, i) => {
8678
+ const targetRow = i + 2;
8679
+ for (const [colName, val] of Object.entries(row)) {
8680
+ const colIdx = findColIdx(colName === "key" || colName === "var" ? keyColName : colName);
8681
+ if (colIdx >= 0 && val !== void 0) updates.push({
8646
8682
  sheet: sheetName,
8647
8683
  sheetId: targetSheetId,
8648
8684
  col: colIndexToLetter(colIdx),
@@ -8650,6 +8686,48 @@ var CryptPadClient = class {
8650
8686
  value: String(val)
8651
8687
  });
8652
8688
  }
8689
+ });
8690
+ const lastIncomingRow = rows.length + 1;
8691
+ if (maxPhysicalRow > lastIncomingRow) for (let r = lastIncomingRow + 1; r <= maxPhysicalRow; r++) for (let c = 0; c < colNames.length; c++) {
8692
+ const colLet = colIndexToLetter(c);
8693
+ if (sheetCells[`${colLet}${r}`] || sheetCells[`${sheetName}!${colLet}${r}`]) updates.push({
8694
+ sheet: sheetName,
8695
+ sheetId: targetSheetId,
8696
+ col: colLet,
8697
+ row: r,
8698
+ value: ""
8699
+ });
8700
+ }
8701
+ } else {
8702
+ const keyToRowIdx = /* @__PURE__ */ new Map();
8703
+ for (const [cellRef, val] of Object.entries(sheetCells)) {
8704
+ const parsed = parseCellRef(cellRef);
8705
+ if (!parsed) continue;
8706
+ if (parsed.col.toUpperCase() === keyColLetter && parsed.row > 1) {
8707
+ const trimmedVal = val.trim();
8708
+ if (trimmedVal.length > 0) keyToRowIdx.set(trimmedVal, parsed.row);
8709
+ }
8710
+ }
8711
+ let nextAvailableRow = Math.max(maxPhysicalRow + 1, 2);
8712
+ for (const row of rows) {
8713
+ const rowKey = row.var ?? row.key ?? row[keyColName];
8714
+ if (!rowKey) continue;
8715
+ const targetRow = keyToRowIdx.get(rowKey) ?? nextAvailableRow++;
8716
+ keyToRowIdx.set(rowKey, targetRow);
8717
+ for (const [colName, val] of Object.entries(row)) {
8718
+ const colIdx = findColIdx(colName === "key" || colName === "var" ? keyColName : colName);
8719
+ if (colIdx >= 0 && val !== void 0) {
8720
+ const colLetter = colIndexToLetter(colIdx);
8721
+ const existingCellVal = sheetCells[`${colLetter}${targetRow}`] ?? sheetCells[`${sheetName}!${colLetter}${targetRow}`];
8722
+ if (!existingCellVal || existingCellVal.trim().length === 0) updates.push({
8723
+ sheet: sheetName,
8724
+ sheetId: targetSheetId,
8725
+ col: colLetter,
8726
+ row: targetRow,
8727
+ value: String(val)
8728
+ });
8729
+ }
8730
+ }
8653
8731
  }
8654
8732
  }
8655
8733
  await this.sendCellUpdates(updates, options.signal, rtChannel);
@@ -8739,12 +8817,13 @@ const CRYPTPAD_SHEET_OUTPUT_CAPABILITIES = createCapabilitySet({ writeTables: tr
8739
8817
  * Converts nested TranslationData `[locale][sheet][key] = value` into
8740
8818
  * tabular rows `Record<sheetName, SheetRow[]>`.
8741
8819
  */
8742
- function convertTranslationsToSheetRows(translations, localeMapping = {}, keyColumnName = "key", includeI18nSheet = false) {
8820
+ function convertTranslationsToSheetRows(translations, localeMapping = {}, keyColumnName = "key", includeI18nSheet = false, sheetTitles) {
8743
8821
  const sheetRowsMap = {};
8744
8822
  for (const [locale, sheets] of Object.entries(translations)) {
8745
8823
  const colHeader = localeMapping[locale] ?? locale;
8746
8824
  for (const [sheetName, keys] of Object.entries(sheets)) {
8747
8825
  if (!includeI18nSheet && sheetName === "i18n") continue;
8826
+ if (sheetTitles && sheetTitles.length > 0 && !sheetTitles.includes(sheetName)) continue;
8748
8827
  if (!sheetRowsMap[sheetName]) sheetRowsMap[sheetName] = /* @__PURE__ */ new Map();
8749
8828
  for (const [key, value] of Object.entries(keys)) {
8750
8829
  if (!sheetRowsMap[sheetName].has(key)) sheetRowsMap[sheetName].set(key, { [keyColumnName]: key });
@@ -8777,7 +8856,7 @@ function createCryptPadSheetOutputProvider(options = {}) {
8777
8856
  timeoutMs: options.timeoutMs
8778
8857
  });
8779
8858
  const effectiveMapping = options.localeMapping ?? payload.localeMapping ?? {};
8780
- const sheetRowsMap = convertTranslationsToSheetRows(payload.translations, effectiveMapping, options.keyColumnName ?? "key", options.includeI18nSheet ?? false);
8859
+ const sheetRowsMap = convertTranslationsToSheetRows(payload.translations, effectiveMapping, options.keyColumnName ?? "key", options.includeI18nSheet ?? false, options.sheetTitles);
8781
8860
  const updatedSheets = [];
8782
8861
  let totalUpdatedCells = 0;
8783
8862
  const sheetEntries = Object.entries(sheetRowsMap).sort(([a], [b]) => {
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/providers/cryptpad/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/providers/cryptpad/client.ts"],"names":[],"mappings":"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"}
@@ -33,13 +33,15 @@ export interface CryptPadSheetOutputProviderOptions {
33
33
  includeI18nSheet?: boolean;
34
34
  /** Optional timeout in milliseconds for WebSocket operations. */
35
35
  timeoutMs?: number;
36
+ /** Optional list of sheet titles to push. When specified, only these sheets are pushed. */
37
+ sheetTitles?: string[];
36
38
  }
37
39
  export declare const CRYPTPAD_SHEET_OUTPUT_CAPABILITIES: ProviderCapabilitySet;
38
40
  /**
39
41
  * Converts nested TranslationData `[locale][sheet][key] = value` into
40
42
  * tabular rows `Record<sheetName, SheetRow[]>`.
41
43
  */
42
- export declare function convertTranslationsToSheetRows(translations: TranslationData, localeMapping?: Record<string, string>, keyColumnName?: string, includeI18nSheet?: boolean): Record<string, SheetRow[]>;
44
+ export declare function convertTranslationsToSheetRows(translations: TranslationData, localeMapping?: Record<string, string>, keyColumnName?: string, includeI18nSheet?: boolean, sheetTitles?: string[]): Record<string, SheetRow[]>;
43
45
  /**
44
46
  * Creates a {@link TranslationOutputProvider} that writes translation data directly
45
47
  * into password-protected or public CryptPad spreadsheets (multi-tab OnlyOffice workbooks)
@@ -1 +1 @@
1
- {"version":3,"file":"sheetOutputProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/cryptpad/sheetOutputProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,yBAAyB,EAE1B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAuB,KAAK,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAElF,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG7D,MAAM,WAAW,kCAAkC;IACjD,iFAAiF;IACjF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uDAAuD;IACvD,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;yEAIqE;IACrE,aAAa,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IACvC;;;;;;gBAMY;IACZ,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC;gFAC4E;IAC5E,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,kCAAkC,EAAE,qBAE/C,CAAC;AAEH;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,YAAY,EAAE,eAAe,EAC7B,aAAa,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,EAC1C,aAAa,GAAE,MAAc,EAC7B,gBAAgB,GAAE,OAAe,GAChC,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAqC5B;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAC/C,OAAO,GAAE,kCAAuC,GAC/C,yBAAyB,CA8D3B"}
1
+ {"version":3,"file":"sheetOutputProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/cryptpad/sheetOutputProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,yBAAyB,EAE1B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAuB,KAAK,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAElF,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG7D,MAAM,WAAW,kCAAkC;IACjD,iFAAiF;IACjF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uDAAuD;IACvD,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;yEAIqE;IACrE,aAAa,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IACvC;;;;;;gBAMY;IACZ,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC;gFAC4E;IAC5E,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2FAA2F;IAC3F,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,eAAO,MAAM,kCAAkC,EAAE,qBAE/C,CAAC;AAEH;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,YAAY,EAAE,eAAe,EAC7B,aAAa,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,EAC1C,aAAa,GAAE,MAAc,EAC7B,gBAAgB,GAAE,OAAe,EACjC,WAAW,CAAC,EAAE,MAAM,EAAE,GACrB,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CA+B5B;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAC/C,OAAO,GAAE,kCAAuC,GAC/C,yBAAyB,CA+D3B"}
@@ -1 +1 @@
1
- {"version":3,"file":"sheetParser.d.ts","sourceRoot":"","sources":["../../../src/providers/cryptpad/sheetParser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sheetParser.d.ts","sourceRoot":"","sources":["../../../src/providers/cryptpad/sheetParser.ts"],"names":[],"mappings":"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"}
@@ -4517,16 +4517,55 @@ function parseOnlyOfficeChanges(rtMessages) {
4517
4517
  if (buf[offsetAfterSheet] === 1) {
4518
4518
  const c1 = buf.readUInt32LE(offsetAfterSheet + 1);
4519
4519
  const r1 = buf.readUInt32LE(offsetAfterSheet + 5);
4520
- for (let k = offsetAfterSheet + 17; k < buf.length - 5; k++) if (buf[k] === 8) {
4521
- const strLen = buf.readUInt32LE(k + 1);
4522
- if (strLen >= 0 && strLen < 1e5 && k + 5 + strLen <= buf.length) {
4523
- const val = buf.subarray(k + 5, k + 5 + strLen).toString("utf16le");
4524
- const colLetter = colIndexToLetter(c1);
4525
- const tabName = sheetNames.get(sheetIdStr) && sheetNames.get(sheetIdStr) !== "Sheet1" ? sheetNames.get(sheetIdStr) : "";
4526
- const cellRef = `${tabName ? `${tabName}!` : ""}${colLetter}${r1 + 1}`;
4527
- cells[cellRef] = val;
4520
+ const colLetter = colIndexToLetter(c1);
4521
+ const tabName = sheetNames.get(sheetIdStr) && sheetNames.get(sheetIdStr) !== "Sheet1" ? sheetNames.get(sheetIdStr) : "";
4522
+ const cellRef = `${tabName ? `${tabName}!` : ""}${colLetter}${r1 + 1}`;
4523
+ let extracted = false;
4524
+ if (offsetAfterSheet + 50 <= buf.length && buf[offsetAfterSheet + 45] === 8) {
4525
+ const len = buf.readUInt32LE(offsetAfterSheet + 46);
4526
+ if (len >= 0 && len % 2 === 0 && offsetAfterSheet + 50 + len <= buf.length) {
4527
+ cells[cellRef] = buf.subarray(offsetAfterSheet + 50, offsetAfterSheet + 50 + len).toString("utf16le");
4528
+ extracted = true;
4529
+ }
4530
+ }
4531
+ if (!extracted && offsetAfterSheet + 40 <= buf.length && buf[offsetAfterSheet + 35] === 8) {
4532
+ const len = buf.readUInt32LE(offsetAfterSheet + 36);
4533
+ if (len >= 0 && len % 2 === 0 && offsetAfterSheet + 40 + len <= buf.length) {
4534
+ cells[cellRef] = buf.subarray(offsetAfterSheet + 40, offsetAfterSheet + 40 + len).toString("utf16le");
4535
+ extracted = true;
4536
+ }
4537
+ }
4538
+ if (!extracted) {
4539
+ for (let k = offsetAfterSheet + 17; k < buf.length - 5; k++) if (buf[k] === 8 && (k === offsetAfterSheet + 17 || buf[k - 1] <= 5)) {
4540
+ const strLen = buf.readUInt32LE(k + 1);
4541
+ if (strLen >= 0 && strLen % 2 === 0 && strLen < 1e5 && k + 5 + strLen <= buf.length) {
4542
+ cells[cellRef] = buf.subarray(k + 5, k + 5 + strLen).toString("utf16le");
4543
+ break;
4544
+ }
4545
+ }
4546
+ }
4547
+ }
4548
+ }
4549
+ }
4550
+ if (magic === 19529985) {
4551
+ const sheetIdLen = buf.readUInt32LE(8);
4552
+ if (sheetIdLen > 0 && sheetIdLen < 200 && 12 + sheetIdLen + 17 <= buf.length) {
4553
+ const sheetIdStr = buf.subarray(12, 12 + sheetIdLen).toString("utf16le");
4554
+ const offsetAfterSheet = 12 + sheetIdLen;
4555
+ if (buf[offsetAfterSheet] === 1) {
4556
+ const c1 = buf.readUInt32LE(offsetAfterSheet + 1);
4557
+ const r1 = buf.readUInt32LE(offsetAfterSheet + 5);
4558
+ const c2 = buf.readUInt32LE(offsetAfterSheet + 9);
4559
+ const r2 = buf.readUInt32LE(offsetAfterSheet + 13);
4560
+ const tabName = sheetNames.get(sheetIdStr) && sheetNames.get(sheetIdStr) !== "Sheet1" ? sheetNames.get(sheetIdStr) : "";
4561
+ const sheetPrefix = tabName ? `${tabName}!` : "";
4562
+ for (let c = c1; c <= c2; c++) {
4563
+ const colLetter = colIndexToLetter(c);
4564
+ for (let r = r1; r <= r2; r++) {
4565
+ const cellRef = `${sheetPrefix}${colLetter}${r + 1}`;
4566
+ delete cells[cellRef];
4567
+ if (!tabName) delete cells[`Sheet1!${colLetter}${r + 1}`];
4528
4568
  }
4529
- break;
4530
4569
  }
4531
4570
  }
4532
4571
  }
@@ -5612,23 +5651,20 @@ var CryptPadClient = class {
5612
5651
  value: name
5613
5652
  });
5614
5653
  });
5615
- const keyToRowIdx = /* @__PURE__ */ new Map();
5616
- existingRows.forEach((r, idx) => {
5617
- const rowKey = r.var ?? r.key ?? r[keyColName];
5618
- if (rowKey) keyToRowIdx.set(rowKey, idx + 2);
5619
- });
5620
- let nextAvailableRow = existingRows.length + 2;
5621
- for (const row of rows) {
5622
- const rowKey = row.var ?? row.key ?? row[keyColName];
5623
- if (!rowKey) continue;
5624
- const targetRow = keyToRowIdx.get(rowKey) ?? nextAvailableRow++;
5625
- keyToRowIdx.set(rowKey, targetRow);
5626
- for (const [colName, val] of Object.entries(row)) {
5627
- const colIdx = findColIdx(colName === "key" || colName === "var" ? keyColName : colName);
5628
- if (colIdx >= 0 && val !== void 0) {
5629
- const matchedHeader = colNames[colIdx];
5630
- const existingVal = existingRows[targetRow - 2]?.[matchedHeader];
5631
- if (options.override || !existingVal || existingVal.trim().length === 0) updates.push({
5654
+ const keyColIdx = findColIdx(keyColName);
5655
+ const keyColLetter = colIndexToLetter(keyColIdx >= 0 ? keyColIdx : 0);
5656
+ const sheetCells = data.sheets[sheetName]?.cells ?? {};
5657
+ let maxPhysicalRow = 1;
5658
+ for (const cellRef of Object.keys(sheetCells)) {
5659
+ const parsed = parseCellRef(cellRef);
5660
+ if (parsed && parsed.row > maxPhysicalRow) maxPhysicalRow = parsed.row;
5661
+ }
5662
+ if (options.override) {
5663
+ rows.forEach((row, i) => {
5664
+ const targetRow = i + 2;
5665
+ for (const [colName, val] of Object.entries(row)) {
5666
+ const colIdx = findColIdx(colName === "key" || colName === "var" ? keyColName : colName);
5667
+ if (colIdx >= 0 && val !== void 0) updates.push({
5632
5668
  sheet: sheetName,
5633
5669
  sheetId: targetSheetId,
5634
5670
  col: colIndexToLetter(colIdx),
@@ -5636,6 +5672,48 @@ var CryptPadClient = class {
5636
5672
  value: String(val)
5637
5673
  });
5638
5674
  }
5675
+ });
5676
+ const lastIncomingRow = rows.length + 1;
5677
+ if (maxPhysicalRow > lastIncomingRow) for (let r = lastIncomingRow + 1; r <= maxPhysicalRow; r++) for (let c = 0; c < colNames.length; c++) {
5678
+ const colLet = colIndexToLetter(c);
5679
+ if (sheetCells[`${colLet}${r}`] || sheetCells[`${sheetName}!${colLet}${r}`]) updates.push({
5680
+ sheet: sheetName,
5681
+ sheetId: targetSheetId,
5682
+ col: colLet,
5683
+ row: r,
5684
+ value: ""
5685
+ });
5686
+ }
5687
+ } else {
5688
+ const keyToRowIdx = /* @__PURE__ */ new Map();
5689
+ for (const [cellRef, val] of Object.entries(sheetCells)) {
5690
+ const parsed = parseCellRef(cellRef);
5691
+ if (!parsed) continue;
5692
+ if (parsed.col.toUpperCase() === keyColLetter && parsed.row > 1) {
5693
+ const trimmedVal = val.trim();
5694
+ if (trimmedVal.length > 0) keyToRowIdx.set(trimmedVal, parsed.row);
5695
+ }
5696
+ }
5697
+ let nextAvailableRow = Math.max(maxPhysicalRow + 1, 2);
5698
+ for (const row of rows) {
5699
+ const rowKey = row.var ?? row.key ?? row[keyColName];
5700
+ if (!rowKey) continue;
5701
+ const targetRow = keyToRowIdx.get(rowKey) ?? nextAvailableRow++;
5702
+ keyToRowIdx.set(rowKey, targetRow);
5703
+ for (const [colName, val] of Object.entries(row)) {
5704
+ const colIdx = findColIdx(colName === "key" || colName === "var" ? keyColName : colName);
5705
+ if (colIdx >= 0 && val !== void 0) {
5706
+ const colLetter = colIndexToLetter(colIdx);
5707
+ const existingCellVal = sheetCells[`${colLetter}${targetRow}`] ?? sheetCells[`${sheetName}!${colLetter}${targetRow}`];
5708
+ if (!existingCellVal || existingCellVal.trim().length === 0) updates.push({
5709
+ sheet: sheetName,
5710
+ sheetId: targetSheetId,
5711
+ col: colLetter,
5712
+ row: targetRow,
5713
+ value: String(val)
5714
+ });
5715
+ }
5716
+ }
5639
5717
  }
5640
5718
  }
5641
5719
  await this.sendCellUpdates(updates, options.signal, rtChannel);
@@ -5725,12 +5803,13 @@ const CRYPTPAD_SHEET_OUTPUT_CAPABILITIES = createCapabilitySet({ writeTables: tr
5725
5803
  * Converts nested TranslationData `[locale][sheet][key] = value` into
5726
5804
  * tabular rows `Record<sheetName, SheetRow[]>`.
5727
5805
  */
5728
- function convertTranslationsToSheetRows(translations, localeMapping = {}, keyColumnName = "key", includeI18nSheet = false) {
5806
+ function convertTranslationsToSheetRows(translations, localeMapping = {}, keyColumnName = "key", includeI18nSheet = false, sheetTitles) {
5729
5807
  const sheetRowsMap = {};
5730
5808
  for (const [locale, sheets] of Object.entries(translations)) {
5731
5809
  const colHeader = localeMapping[locale] ?? locale;
5732
5810
  for (const [sheetName, keys] of Object.entries(sheets)) {
5733
5811
  if (!includeI18nSheet && sheetName === "i18n") continue;
5812
+ if (sheetTitles && sheetTitles.length > 0 && !sheetTitles.includes(sheetName)) continue;
5734
5813
  if (!sheetRowsMap[sheetName]) sheetRowsMap[sheetName] = /* @__PURE__ */ new Map();
5735
5814
  for (const [key, value] of Object.entries(keys)) {
5736
5815
  if (!sheetRowsMap[sheetName].has(key)) sheetRowsMap[sheetName].set(key, { [keyColumnName]: key });
@@ -5763,7 +5842,7 @@ function createCryptPadSheetOutputProvider(options = {}) {
5763
5842
  timeoutMs: options.timeoutMs
5764
5843
  });
5765
5844
  const effectiveMapping = options.localeMapping ?? payload.localeMapping ?? {};
5766
- const sheetRowsMap = convertTranslationsToSheetRows(payload.translations, effectiveMapping, options.keyColumnName ?? "key", options.includeI18nSheet ?? false);
5845
+ const sheetRowsMap = convertTranslationsToSheetRows(payload.translations, effectiveMapping, options.keyColumnName ?? "key", options.includeI18nSheet ?? false, options.sheetTitles);
5767
5846
  const updatedSheets = [];
5768
5847
  let totalUpdatedCells = 0;
5769
5848
  const sheetEntries = Object.entries(sheetRowsMap).sort(([a], [b]) => {
@@ -6694,14 +6773,17 @@ async function main() {
6694
6773
  console.error(`Error: Could not read local data file at ${dataJsonPath}. Run pull first or check path.`);
6695
6774
  process.exit(1);
6696
6775
  }
6776
+ const inferredLocalSheetTitles = !sheetTitles && localData ? Array.from(new Set(Object.values(localData).flatMap((localeSheets) => Object.keys(localeSheets ?? {})).filter((name) => name && name.trim().length > 0))) : void 0;
6777
+ const effectiveSheetTitles = sheetTitles && sheetTitles.length > 0 ? sheetTitles : inferredLocalSheetTitles && inferredLocalSheetTitles.length > 0 ? inferredLocalSheetTitles : void 0;
6697
6778
  const localeMapping = tryReadLocaleMapping(localesOutputPath);
6698
- const includeI18nSheet = Boolean(options["include-i18n"] === "true" || sheetTitles?.includes("i18n") || localData && Object.values(localData).some((loc) => loc && loc["i18n"]));
6779
+ const includeI18nSheet = Boolean(options["include-i18n"] === "true" || effectiveSheetTitles?.includes("i18n") || localData && Object.values(localData).some((loc) => loc && loc["i18n"]));
6699
6780
  const outputProvider = createCryptPadSheetOutputProvider({
6700
6781
  url,
6701
6782
  password,
6702
6783
  override: options.override === "true",
6703
6784
  localeMapping,
6704
- includeI18nSheet
6785
+ includeI18nSheet,
6786
+ sheetTitles: effectiveSheetTitles
6705
6787
  });
6706
6788
  const locales = Object.keys(localData);
6707
6789
  const res = await outputProvider.writeTranslations({
@@ -5253,16 +5253,55 @@ function parseOnlyOfficeChanges(rtMessages) {
5253
5253
  if (buf[offsetAfterSheet] === 1) {
5254
5254
  const c1 = buf.readUInt32LE(offsetAfterSheet + 1);
5255
5255
  const r1 = buf.readUInt32LE(offsetAfterSheet + 5);
5256
- for (let k = offsetAfterSheet + 17; k < buf.length - 5; k++) if (buf[k] === 8) {
5257
- const strLen = buf.readUInt32LE(k + 1);
5258
- if (strLen >= 0 && strLen < 1e5 && k + 5 + strLen <= buf.length) {
5259
- const val = buf.subarray(k + 5, k + 5 + strLen).toString("utf16le");
5260
- const colLetter = colIndexToLetter(c1);
5261
- const tabName = sheetNames.get(sheetIdStr) && sheetNames.get(sheetIdStr) !== "Sheet1" ? sheetNames.get(sheetIdStr) : "";
5262
- const cellRef = `${tabName ? `${tabName}!` : ""}${colLetter}${r1 + 1}`;
5263
- cells[cellRef] = val;
5256
+ const colLetter = colIndexToLetter(c1);
5257
+ const tabName = sheetNames.get(sheetIdStr) && sheetNames.get(sheetIdStr) !== "Sheet1" ? sheetNames.get(sheetIdStr) : "";
5258
+ const cellRef = `${tabName ? `${tabName}!` : ""}${colLetter}${r1 + 1}`;
5259
+ let extracted = false;
5260
+ if (offsetAfterSheet + 50 <= buf.length && buf[offsetAfterSheet + 45] === 8) {
5261
+ const len = buf.readUInt32LE(offsetAfterSheet + 46);
5262
+ if (len >= 0 && len % 2 === 0 && offsetAfterSheet + 50 + len <= buf.length) {
5263
+ cells[cellRef] = buf.subarray(offsetAfterSheet + 50, offsetAfterSheet + 50 + len).toString("utf16le");
5264
+ extracted = true;
5265
+ }
5266
+ }
5267
+ if (!extracted && offsetAfterSheet + 40 <= buf.length && buf[offsetAfterSheet + 35] === 8) {
5268
+ const len = buf.readUInt32LE(offsetAfterSheet + 36);
5269
+ if (len >= 0 && len % 2 === 0 && offsetAfterSheet + 40 + len <= buf.length) {
5270
+ cells[cellRef] = buf.subarray(offsetAfterSheet + 40, offsetAfterSheet + 40 + len).toString("utf16le");
5271
+ extracted = true;
5272
+ }
5273
+ }
5274
+ if (!extracted) {
5275
+ for (let k = offsetAfterSheet + 17; k < buf.length - 5; k++) if (buf[k] === 8 && (k === offsetAfterSheet + 17 || buf[k - 1] <= 5)) {
5276
+ const strLen = buf.readUInt32LE(k + 1);
5277
+ if (strLen >= 0 && strLen % 2 === 0 && strLen < 1e5 && k + 5 + strLen <= buf.length) {
5278
+ cells[cellRef] = buf.subarray(k + 5, k + 5 + strLen).toString("utf16le");
5279
+ break;
5280
+ }
5281
+ }
5282
+ }
5283
+ }
5284
+ }
5285
+ }
5286
+ if (magic === 19529985) {
5287
+ const sheetIdLen = buf.readUInt32LE(8);
5288
+ if (sheetIdLen > 0 && sheetIdLen < 200 && 12 + sheetIdLen + 17 <= buf.length) {
5289
+ const sheetIdStr = buf.subarray(12, 12 + sheetIdLen).toString("utf16le");
5290
+ const offsetAfterSheet = 12 + sheetIdLen;
5291
+ if (buf[offsetAfterSheet] === 1) {
5292
+ const c1 = buf.readUInt32LE(offsetAfterSheet + 1);
5293
+ const r1 = buf.readUInt32LE(offsetAfterSheet + 5);
5294
+ const c2 = buf.readUInt32LE(offsetAfterSheet + 9);
5295
+ const r2 = buf.readUInt32LE(offsetAfterSheet + 13);
5296
+ const tabName = sheetNames.get(sheetIdStr) && sheetNames.get(sheetIdStr) !== "Sheet1" ? sheetNames.get(sheetIdStr) : "";
5297
+ const sheetPrefix = tabName ? `${tabName}!` : "";
5298
+ for (let c = c1; c <= c2; c++) {
5299
+ const colLetter = colIndexToLetter(c);
5300
+ for (let r = r1; r <= r2; r++) {
5301
+ const cellRef = `${sheetPrefix}${colLetter}${r + 1}`;
5302
+ delete cells[cellRef];
5303
+ if (!tabName) delete cells[`Sheet1!${colLetter}${r + 1}`];
5264
5304
  }
5265
- break;
5266
5305
  }
5267
5306
  }
5268
5307
  }
@@ -6348,23 +6387,20 @@ var CryptPadClient = class {
6348
6387
  value: name
6349
6388
  });
6350
6389
  });
6351
- const keyToRowIdx = /* @__PURE__ */ new Map();
6352
- existingRows.forEach((r, idx) => {
6353
- const rowKey = r.var ?? r.key ?? r[keyColName];
6354
- if (rowKey) keyToRowIdx.set(rowKey, idx + 2);
6355
- });
6356
- let nextAvailableRow = existingRows.length + 2;
6357
- for (const row of rows) {
6358
- const rowKey = row.var ?? row.key ?? row[keyColName];
6359
- if (!rowKey) continue;
6360
- const targetRow = keyToRowIdx.get(rowKey) ?? nextAvailableRow++;
6361
- keyToRowIdx.set(rowKey, targetRow);
6362
- for (const [colName, val] of Object.entries(row)) {
6363
- const colIdx = findColIdx(colName === "key" || colName === "var" ? keyColName : colName);
6364
- if (colIdx >= 0 && val !== void 0) {
6365
- const matchedHeader = colNames[colIdx];
6366
- const existingVal = existingRows[targetRow - 2]?.[matchedHeader];
6367
- if (options.override || !existingVal || existingVal.trim().length === 0) updates.push({
6390
+ const keyColIdx = findColIdx(keyColName);
6391
+ const keyColLetter = colIndexToLetter(keyColIdx >= 0 ? keyColIdx : 0);
6392
+ const sheetCells = data.sheets[sheetName]?.cells ?? {};
6393
+ let maxPhysicalRow = 1;
6394
+ for (const cellRef of Object.keys(sheetCells)) {
6395
+ const parsed = parseCellRef(cellRef);
6396
+ if (parsed && parsed.row > maxPhysicalRow) maxPhysicalRow = parsed.row;
6397
+ }
6398
+ if (options.override) {
6399
+ rows.forEach((row, i) => {
6400
+ const targetRow = i + 2;
6401
+ for (const [colName, val] of Object.entries(row)) {
6402
+ const colIdx = findColIdx(colName === "key" || colName === "var" ? keyColName : colName);
6403
+ if (colIdx >= 0 && val !== void 0) updates.push({
6368
6404
  sheet: sheetName,
6369
6405
  sheetId: targetSheetId,
6370
6406
  col: colIndexToLetter(colIdx),
@@ -6372,6 +6408,48 @@ var CryptPadClient = class {
6372
6408
  value: String(val)
6373
6409
  });
6374
6410
  }
6411
+ });
6412
+ const lastIncomingRow = rows.length + 1;
6413
+ if (maxPhysicalRow > lastIncomingRow) for (let r = lastIncomingRow + 1; r <= maxPhysicalRow; r++) for (let c = 0; c < colNames.length; c++) {
6414
+ const colLet = colIndexToLetter(c);
6415
+ if (sheetCells[`${colLet}${r}`] || sheetCells[`${sheetName}!${colLet}${r}`]) updates.push({
6416
+ sheet: sheetName,
6417
+ sheetId: targetSheetId,
6418
+ col: colLet,
6419
+ row: r,
6420
+ value: ""
6421
+ });
6422
+ }
6423
+ } else {
6424
+ const keyToRowIdx = /* @__PURE__ */ new Map();
6425
+ for (const [cellRef, val] of Object.entries(sheetCells)) {
6426
+ const parsed = parseCellRef(cellRef);
6427
+ if (!parsed) continue;
6428
+ if (parsed.col.toUpperCase() === keyColLetter && parsed.row > 1) {
6429
+ const trimmedVal = val.trim();
6430
+ if (trimmedVal.length > 0) keyToRowIdx.set(trimmedVal, parsed.row);
6431
+ }
6432
+ }
6433
+ let nextAvailableRow = Math.max(maxPhysicalRow + 1, 2);
6434
+ for (const row of rows) {
6435
+ const rowKey = row.var ?? row.key ?? row[keyColName];
6436
+ if (!rowKey) continue;
6437
+ const targetRow = keyToRowIdx.get(rowKey) ?? nextAvailableRow++;
6438
+ keyToRowIdx.set(rowKey, targetRow);
6439
+ for (const [colName, val] of Object.entries(row)) {
6440
+ const colIdx = findColIdx(colName === "key" || colName === "var" ? keyColName : colName);
6441
+ if (colIdx >= 0 && val !== void 0) {
6442
+ const colLetter = colIndexToLetter(colIdx);
6443
+ const existingCellVal = sheetCells[`${colLetter}${targetRow}`] ?? sheetCells[`${sheetName}!${colLetter}${targetRow}`];
6444
+ if (!existingCellVal || existingCellVal.trim().length === 0) updates.push({
6445
+ sheet: sheetName,
6446
+ sheetId: targetSheetId,
6447
+ col: colLetter,
6448
+ row: targetRow,
6449
+ value: String(val)
6450
+ });
6451
+ }
6452
+ }
6375
6453
  }
6376
6454
  }
6377
6455
  await this.sendCellUpdates(updates, options.signal, rtChannel);
@@ -6461,12 +6539,13 @@ const CRYPTPAD_SHEET_OUTPUT_CAPABILITIES = createCapabilitySet({ writeTables: tr
6461
6539
  * Converts nested TranslationData `[locale][sheet][key] = value` into
6462
6540
  * tabular rows `Record<sheetName, SheetRow[]>`.
6463
6541
  */
6464
- function convertTranslationsToSheetRows(translations, localeMapping = {}, keyColumnName = "key", includeI18nSheet = false) {
6542
+ function convertTranslationsToSheetRows(translations, localeMapping = {}, keyColumnName = "key", includeI18nSheet = false, sheetTitles) {
6465
6543
  const sheetRowsMap = {};
6466
6544
  for (const [locale, sheets] of Object.entries(translations)) {
6467
6545
  const colHeader = localeMapping[locale] ?? locale;
6468
6546
  for (const [sheetName, keys] of Object.entries(sheets)) {
6469
6547
  if (!includeI18nSheet && sheetName === "i18n") continue;
6548
+ if (sheetTitles && sheetTitles.length > 0 && !sheetTitles.includes(sheetName)) continue;
6470
6549
  if (!sheetRowsMap[sheetName]) sheetRowsMap[sheetName] = /* @__PURE__ */ new Map();
6471
6550
  for (const [key, value] of Object.entries(keys)) {
6472
6551
  if (!sheetRowsMap[sheetName].has(key)) sheetRowsMap[sheetName].set(key, { [keyColumnName]: key });
@@ -6499,7 +6578,7 @@ function createCryptPadSheetOutputProvider(options = {}) {
6499
6578
  timeoutMs: options.timeoutMs
6500
6579
  });
6501
6580
  const effectiveMapping = options.localeMapping ?? payload.localeMapping ?? {};
6502
- const sheetRowsMap = convertTranslationsToSheetRows(payload.translations, effectiveMapping, options.keyColumnName ?? "key", options.includeI18nSheet ?? false);
6581
+ const sheetRowsMap = convertTranslationsToSheetRows(payload.translations, effectiveMapping, options.keyColumnName ?? "key", options.includeI18nSheet ?? false, options.sheetTitles);
6503
6582
  const updatedSheets = [];
6504
6583
  let totalUpdatedCells = 0;
6505
6584
  const sheetEntries = Object.entries(sheetRowsMap).sort(([a], [b]) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@el-j/google-sheet-translations",
3
- "version": "3.0.0-beta.14",
3
+ "version": "3.0.0-beta.15",
4
4
  "description": "A package to manage translations stored in Google Spreadsheets",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/esm/index.js",