@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 +107 -28
- package/dist/index.js +107 -28
- package/dist/providers/cryptpad/client.d.ts.map +1 -1
- package/dist/providers/cryptpad/sheetOutputProvider.d.ts +3 -1
- package/dist/providers/cryptpad/sheetOutputProvider.d.ts.map +1 -1
- package/dist/providers/cryptpad/sheetParser.d.ts.map +1 -1
- package/dist-cli/cryptpad.mjs +112 -30
- package/dist-cli/run-provider.mjs +107 -28
- package/package.json +1 -1
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
|
-
|
|
7526
|
-
|
|
7527
|
-
|
|
7528
|
-
|
|
7529
|
-
|
|
7530
|
-
|
|
7531
|
-
|
|
7532
|
-
cells[cellRef] =
|
|
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
|
|
8621
|
-
|
|
8622
|
-
|
|
8623
|
-
|
|
8624
|
-
|
|
8625
|
-
|
|
8626
|
-
|
|
8627
|
-
|
|
8628
|
-
|
|
8629
|
-
|
|
8630
|
-
|
|
8631
|
-
|
|
8632
|
-
|
|
8633
|
-
|
|
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
|
-
|
|
7535
|
-
|
|
7536
|
-
|
|
7537
|
-
|
|
7538
|
-
|
|
7539
|
-
|
|
7540
|
-
|
|
7541
|
-
cells[cellRef] =
|
|
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
|
|
8630
|
-
|
|
8631
|
-
|
|
8632
|
-
|
|
8633
|
-
|
|
8634
|
-
|
|
8635
|
-
|
|
8636
|
-
|
|
8637
|
-
|
|
8638
|
-
|
|
8639
|
-
|
|
8640
|
-
|
|
8641
|
-
|
|
8642
|
-
|
|
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;
|
|
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":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C,MAAM,WAAW,iBAAiB;IAChC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,iBAAiB,CAAC;IACzB,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQzD;AAED,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMvD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAQjG;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,gBAAgB,EAAE,MAAM,EAAE,GAAG,kBAAkB,CA8GxF;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,gBAAgB,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAEpF;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,iBAAiB,
|
|
1
|
+
{"version":3,"file":"sheetParser.d.ts","sourceRoot":"","sources":["../../../src/providers/cryptpad/sheetParser.ts"],"names":[],"mappings":"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"}
|
package/dist-cli/cryptpad.mjs
CHANGED
|
@@ -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
|
-
|
|
4521
|
-
|
|
4522
|
-
|
|
4523
|
-
|
|
4524
|
-
|
|
4525
|
-
|
|
4526
|
-
|
|
4527
|
-
cells[cellRef] =
|
|
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
|
|
5616
|
-
|
|
5617
|
-
|
|
5618
|
-
|
|
5619
|
-
|
|
5620
|
-
|
|
5621
|
-
|
|
5622
|
-
|
|
5623
|
-
|
|
5624
|
-
|
|
5625
|
-
|
|
5626
|
-
|
|
5627
|
-
|
|
5628
|
-
|
|
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" ||
|
|
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
|
-
|
|
5257
|
-
|
|
5258
|
-
|
|
5259
|
-
|
|
5260
|
-
|
|
5261
|
-
|
|
5262
|
-
|
|
5263
|
-
cells[cellRef] =
|
|
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
|
|
6352
|
-
|
|
6353
|
-
|
|
6354
|
-
|
|
6355
|
-
|
|
6356
|
-
|
|
6357
|
-
|
|
6358
|
-
|
|
6359
|
-
|
|
6360
|
-
|
|
6361
|
-
|
|
6362
|
-
|
|
6363
|
-
|
|
6364
|
-
|
|
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