diff --git a/bits/23_binutils.js b/bits/23_binutils.js index 3307191..62509d4 100644 --- a/bits/23_binutils.js +++ b/bits/23_binutils.js @@ -181,21 +181,29 @@ function WriteShift(t/*:number*/, val/*:string|number*/, f/*:?string*/)/*:any*/ /*:: if(typeof val !== 'string') throw new Error("unreachable"); */ for(i = 0; i != val.length; ++i) __writeUInt16LE(this, val.charCodeAt(i), this.l + 2 * i); size = 2 * val.length; - } else if(f === 'sbcs') { + } else if(f === 'sbcs' || f == 'cpstr') { if(typeof $cptable !== 'undefined' && current_ansi == 874) { /* TODO: use tables directly, don't encode */ /*:: if(typeof val !== "string") throw new Error("unreachable"); */ for(i = 0; i != val.length; ++i) { - var cppayload = $cptable.utils.encode(current_ansi, val.charAt(i)); - this[this.l + i] = cppayload[0]; + var cpp = $cptable.utils.encode(current_ansi, val.charAt(i)); + this[this.l + i] = cpp[0]; } + size = val.length; + } else if(typeof $cptable !== 'undefined' && f == 'cpstr') { + var cpp = $cptable.utils.encode(current_ansi, val); + /* replace null bytes with _ when relevant */ + if(cpp.length == val.length) for(i = 0; i < val.length; ++i) if(cpp[i] == 0 && val.charCodeAt(i) != 0) cpp[i] = 0x5F; + if(cpp.length == 2 * val.length) for(i = 0; i < val.length; ++i) if(cpp[2*i] == 0 && cpp[2*i+1] == 0 && val.charCodeAt(i) != 0) cpp[2*i] = 0x5F; + for(i = 0; i < cpp.length; ++i) this[this.l + i] = cpp[i]; + size = cpp.length; } else { /*:: if(typeof val !== 'string') throw new Error("unreachable"); */ val = val.replace(/[^\x00-\x7F]/g, "_"); /*:: if(typeof val !== 'string') throw new Error("unreachable"); */ for(i = 0; i != val.length; ++i) this[this.l + i] = (val.charCodeAt(i) & 0xFF); + size = val.length; } - size = val.length; } else if(f === 'hex') { for(; i < t; ++i) { /*:: if(typeof val !== "string") throw new Error("unreachable"); */ diff --git a/bits/40_harb.js b/bits/40_harb.js index 45a5b05..7ed7b6e 100644 --- a/bits/40_harb.js +++ b/bits/40_harb.js @@ -282,7 +282,8 @@ function sheet_to_dbf(ws/*:Worksheet*/, opts/*:WriteOpts*/) { case 'object': _guess = col[j] instanceof Date ? 'D' : 'C'; break; default: _guess = 'C'; } - maxlen = Math.max(maxlen, String(col[j]).length); + /* TODO: cache the values instead of encoding twice */ + maxlen = Math.max(maxlen, (typeof $cptable !== "undefined" && typeof col[j] == "string" ? $cptable.utils.encode(current_ansi, col[j]): String(col[j])).length); guess = guess && guess != _guess ? 'C' : _guess; //if(guess == 'C') break; } @@ -352,9 +353,11 @@ function sheet_to_dbf(ws/*:Worksheet*/, opts/*:WriteOpts*/) { rout.write_shift(2, ("00"+data[i][j].getDate()).slice(-2), "sbcs"); } break; case 'C': + var _l = rout.l; var _s = String(data[i][j] != null ? data[i][j] : "").slice(0, colwidths[j]); - rout.write_shift(1, _s, "sbcs"); - for(hcnt=0; hcnt < colwidths[j]-_s.length; ++hcnt) rout.write_shift(1, 0x20); break; + rout.write_shift(1, _s, "cpstr"); + _l += colwidths[j] - rout.l; + for(hcnt=0; hcnt < _l; ++hcnt) rout.write_shift(1, 0x20); break; } } // data @@ -598,6 +601,7 @@ var SYLK = /*#__PURE__*/(function() { } function sheet_to_sylk(ws/*:Worksheet*/, opts/*:?any*/, wb/*:?WorkBook*/)/*:string*/ { + /* TODO: codepage */ var preamble/*:Array*/ = ["ID;PSheetJS;N;E"], o/*:Array*/ = []; var r = safe_decode_range(ws['!ref']), cell/*:Cell*/; var dense = Array.isArray(ws); diff --git a/bits/57_cmntxml.js b/bits/57_cmntxml.js index a55e411..45c3bcf 100644 --- a/bits/57_cmntxml.js +++ b/bits/57_cmntxml.js @@ -55,7 +55,7 @@ function write_comments_xml(data/*::, opts*/) { d[1].forEach(function(c) { if(c.a) lastauthor = iauthor.indexOf(escapexml(c.a)); if(c.T) ++tcnt; - ts.push(writetag("t", c.t == null ? "" : escapexml(c.t))); + ts.push(c.t == null ? "" : escapexml(c.t)); }); if(tcnt === 0) { d[1].forEach(function(c) {