@nuintun/qrcode
Advanced tools
Comparing version 0.10.2 to 0.11.0
@@ -44,4 +44,4 @@ "use strict"; | ||
var v = (b2 << 8) | b3; | ||
SJIS2UTFTable[k] = v; | ||
UTF2SJISTable[v] = k; | ||
UTF2SJISTable[k] = v; | ||
SJIS2UTFTable[v] = k; | ||
count++; | ||
@@ -71,3 +71,3 @@ } | ||
else { | ||
var byte = exports.SJIS2UTFTable[code]; | ||
var byte = exports.UTF2SJISTable[code]; | ||
if (byte != null) { | ||
@@ -80,3 +80,3 @@ if ((byte & 0xff) === byte) { | ||
// 2bytes | ||
bytes.push(byte >>> 8); | ||
bytes.push(byte >> 8); | ||
bytes.push(byte & 0xff); | ||
@@ -83,0 +83,0 @@ } |
@@ -13,3 +13,3 @@ "use strict"; | ||
function decodeNumeric(stream, size) { | ||
var text = ''; | ||
var data = ''; | ||
var bytes = []; | ||
@@ -28,3 +28,3 @@ var characterCountSize = [10, 12, 14][size]; | ||
bytes.push(48 + a, 48 + b, 48 + c); | ||
text += a.toString() + b.toString() + c.toString(); | ||
data += a.toString() + b.toString() + c.toString(); | ||
length -= 3; | ||
@@ -41,3 +41,3 @@ } | ||
bytes.push(48 + a, 48 + b); | ||
text += a.toString() + b.toString(); | ||
data += a.toString() + b.toString(); | ||
} | ||
@@ -50,5 +50,5 @@ else if (length === 1) { | ||
bytes.push(48 + num); | ||
text += num.toString(); | ||
data += num.toString(); | ||
} | ||
return { bytes: bytes, text: text }; | ||
return { bytes: bytes, data: data }; | ||
} | ||
@@ -64,3 +64,3 @@ // prettier-ignore | ||
function decodeAlphanumeric(stream, size) { | ||
var text = ''; | ||
var data = ''; | ||
var bytes = []; | ||
@@ -74,3 +74,3 @@ var characterCountSize = [9, 11, 13][size]; | ||
bytes.push(AlphanumericCharacterCodes[a].charCodeAt(0), AlphanumericCharacterCodes[b].charCodeAt(0)); | ||
text += AlphanumericCharacterCodes[a] + AlphanumericCharacterCodes[b]; | ||
data += AlphanumericCharacterCodes[a] + AlphanumericCharacterCodes[b]; | ||
length -= 2; | ||
@@ -81,53 +81,49 @@ } | ||
bytes.push(AlphanumericCharacterCodes[a].charCodeAt(0)); | ||
text += AlphanumericCharacterCodes[a]; | ||
data += AlphanumericCharacterCodes[a]; | ||
} | ||
return { bytes: bytes, text: text }; | ||
return { bytes: bytes, data: data }; | ||
} | ||
/** | ||
* @function bytesToUTF8 | ||
* @param {number[]} bytes | ||
* @returns {string} | ||
* @see https://github.com/google/closure-library/blob/master/closure/goog/crypt/crypt.js | ||
*/ | ||
function bytesToUTF8(bytes) { | ||
// TODO(user): Use native implementations if/when available | ||
var pos = 0; | ||
var output = ''; | ||
while (pos < bytes.length) { | ||
var c1 = bytes[pos++]; | ||
function decodeByte(stream, size) { | ||
var data = ''; | ||
var bytes = []; | ||
var characterCountSize = [8, 16, 16][size]; | ||
var length = stream.readBits(characterCountSize); | ||
for (var i = 0; i < length; i++) { | ||
var c1 = stream.readBits(8); | ||
bytes.push(c1); | ||
if (c1 < 128) { | ||
output += String.fromCharCode(c1); | ||
data += String.fromCharCode(c1); | ||
} | ||
else if (c1 > 191 && c1 < 224) { | ||
var c2 = bytes[pos++]; | ||
output += String.fromCharCode(((c1 & 31) << 6) | (c2 & 63)); | ||
var c2 = stream.readBits(8); | ||
bytes.push(c2); | ||
data += String.fromCharCode(((c1 & 31) << 6) | (c2 & 63)); | ||
i++; | ||
} | ||
else if (c1 > 239 && c1 < 365) { | ||
// Surrogate Pair | ||
var c2 = bytes[pos++]; | ||
var c3 = bytes[pos++]; | ||
var c4 = bytes[pos++]; | ||
var c2 = stream.readBits(8); | ||
var c3 = stream.readBits(8); | ||
var c4 = stream.readBits(8); | ||
var u = (((c1 & 7) << 18) | ((c2 & 63) << 12) | ((c3 & 63) << 6) | (c4 & 63)) - 0x10000; | ||
output += String.fromCharCode(0xd800 + (u >> 10)); | ||
output += String.fromCharCode(0xdc00 + (u & 1023)); | ||
bytes.push(c2, c3, c4); | ||
data += String.fromCharCode(0xd800 + (u >> 10)); | ||
data += String.fromCharCode(0xdc00 + (u & 1023)); | ||
i += 3; | ||
} | ||
else { | ||
var c2 = bytes[pos++]; | ||
var c3 = bytes[pos++]; | ||
output += String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); | ||
var c2 = stream.readBits(8); | ||
var c3 = stream.readBits(8); | ||
bytes.push(c2, c3); | ||
data += String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); | ||
i += 2; | ||
} | ||
} | ||
return output; | ||
return { bytes: bytes, data: data }; | ||
} | ||
function decodeByte(stream, size) { | ||
var bytes = []; | ||
var characterCountSize = [8, 16, 16][size]; | ||
var length = stream.readBits(characterCountSize); | ||
for (var i = 0; i < length; i++) { | ||
bytes.push(stream.readBits(8)); | ||
} | ||
return { bytes: bytes, text: bytesToUTF8(bytes) }; | ||
} | ||
function decodeKanji(stream, size) { | ||
var text = ''; | ||
var data = ''; | ||
var bytes = []; | ||
@@ -146,5 +142,6 @@ var characterCountSize = [8, 10, 12][size]; | ||
bytes.push(c >> 8, c & 0xff); | ||
text += String.fromCharCode(SJIS_1.UTF2SJISTable[c]); | ||
var b = SJIS_1.SJIS2UTFTable[c]; | ||
data += String.fromCharCode(b != null ? b : c); | ||
} | ||
return { bytes: bytes, text: text }; | ||
return { bytes: bytes, data: data }; | ||
} | ||
@@ -156,3 +153,3 @@ function decode(data, version, errorCorrectionLevel) { | ||
var size = version <= 9 ? 0 : version <= 26 ? 1 : 2; | ||
var result = { text: '', bytes: [], chunks: [], version: version, errorCorrectionLevel: errorCorrectionLevel }; | ||
var result = { data: '', bytes: [], chunks: [], version: version, errorCorrectionLevel: errorCorrectionLevel }; | ||
while (stream.available() >= 4) { | ||
@@ -166,3 +163,3 @@ var mode = stream.readBits(4); | ||
result.chunks.push({ | ||
type: Mode_1.default.ECI, | ||
mode: Mode_1.default.ECI, | ||
assignmentNumber: stream.readBits(7) | ||
@@ -173,3 +170,3 @@ }); | ||
result.chunks.push({ | ||
type: Mode_1.default.ECI, | ||
mode: Mode_1.default.ECI, | ||
assignmentNumber: stream.readBits(14) | ||
@@ -180,3 +177,3 @@ }); | ||
result.chunks.push({ | ||
type: Mode_1.default.ECI, | ||
mode: Mode_1.default.ECI, | ||
assignmentNumber: stream.readBits(21) | ||
@@ -188,3 +185,3 @@ }); | ||
result.chunks.push({ | ||
type: Mode_1.default.ECI, | ||
mode: Mode_1.default.ECI, | ||
assignmentNumber: -1 | ||
@@ -196,6 +193,6 @@ }); | ||
var numericResult = decodeNumeric(stream, size); | ||
result.text += numericResult.text; | ||
result.data += numericResult.data; | ||
result.chunks.push({ | ||
type: Mode_1.default.Numeric, | ||
text: numericResult.text, | ||
mode: Mode_1.default.Numeric, | ||
data: numericResult.data, | ||
bytes: numericResult.bytes | ||
@@ -207,6 +204,6 @@ }); | ||
var alphanumericResult = decodeAlphanumeric(stream, size); | ||
result.text += alphanumericResult.text; | ||
result.data += alphanumericResult.data; | ||
result.chunks.push({ | ||
type: Mode_1.default.Alphanumeric, | ||
text: alphanumericResult.text, | ||
mode: Mode_1.default.Alphanumeric, | ||
data: alphanumericResult.data, | ||
bytes: alphanumericResult.bytes | ||
@@ -224,10 +221,10 @@ }); | ||
}; | ||
result.chunks.push(tslib_1.__assign({ type: Mode_1.default.StructuredAppend }, structuredAppend)); | ||
result.chunks.push(tslib_1.__assign({ mode: Mode_1.default.StructuredAppend }, structuredAppend)); | ||
} | ||
else if (mode === Mode_1.default.Byte) { | ||
var byteResult = decodeByte(stream, size); | ||
result.text += byteResult.text; | ||
result.data += byteResult.data; | ||
result.chunks.push({ | ||
type: Mode_1.default.Byte, | ||
text: byteResult.text, | ||
mode: Mode_1.default.Byte, | ||
data: byteResult.data, | ||
bytes: byteResult.bytes | ||
@@ -239,6 +236,6 @@ }); | ||
var kanjiResult = decodeKanji(stream, size); | ||
result.text += kanjiResult.text; | ||
result.data += kanjiResult.data; | ||
result.chunks.push({ | ||
type: Mode_1.default.Kanji, | ||
text: kanjiResult.text, | ||
mode: Mode_1.default.Kanji, | ||
data: kanjiResult.data, | ||
bytes: kanjiResult.bytes | ||
@@ -245,0 +242,0 @@ }); |
@@ -11,2 +11,46 @@ "use strict"; | ||
var Mode_1 = require("../common/Mode"); | ||
var UTF16_1 = require("../../encoding/UTF16"); | ||
function getCode(byte) { | ||
if (0x30 <= byte && byte <= 0x39) { | ||
// 0 - 9 | ||
return byte - 0x30; | ||
} | ||
else if (0x41 <= byte && byte <= 0x5a) { | ||
// A - Z | ||
return byte - 0x41 + 10; | ||
} | ||
else { | ||
switch (byte) { | ||
// space | ||
case 0x20: | ||
return 36; | ||
// $ | ||
case 0x24: | ||
return 37; | ||
// % | ||
case 0x25: | ||
return 38; | ||
// * | ||
case 0x2a: | ||
return 39; | ||
// + | ||
case 0x2b: | ||
return 40; | ||
// - | ||
case 0x2d: | ||
return 41; | ||
// . | ||
case 0x2e: | ||
return 42; | ||
// / | ||
case 0x2f: | ||
return 43; | ||
// : | ||
case 0x3a: | ||
return 44; | ||
default: | ||
throw "illegal char: " + String.fromCharCode(byte); | ||
} | ||
} | ||
} | ||
var QRAlphanumeric = /** @class */ (function (_super) { | ||
@@ -19,3 +63,5 @@ tslib_1.__extends(QRAlphanumeric, _super); | ||
function QRAlphanumeric(data) { | ||
return _super.call(this, Mode_1.default.Alphanumeric, data) || this; | ||
var _this = _super.call(this, Mode_1.default.Alphanumeric, data) || this; | ||
_this.bytes = UTF16_1.default(data); | ||
return _this; | ||
} | ||
@@ -29,10 +75,10 @@ /** | ||
var i = 0; | ||
var data = this.getData(); | ||
var length = data.length; | ||
var bytes = this.bytes; | ||
var length = bytes.length; | ||
while (i + 1 < length) { | ||
buffer.put(QRAlphanumeric.getCode(data.charAt(i)) * 45 + QRAlphanumeric.getCode(data.charAt(i + 1)), 11); | ||
buffer.put(getCode(bytes[i]) * 45 + getCode(bytes[i + 1]), 11); | ||
i += 2; | ||
} | ||
if (i < data.length) { | ||
buffer.put(QRAlphanumeric.getCode(data.charAt(i)), 6); | ||
if (i < length) { | ||
buffer.put(getCode(bytes[i]), 6); | ||
} | ||
@@ -46,40 +92,6 @@ }; | ||
QRAlphanumeric.prototype.getLength = function () { | ||
return this.getData().length; | ||
return this.bytes.length; | ||
}; | ||
QRAlphanumeric.getCode = function (ch) { | ||
if ('0' <= ch && ch <= '9') { | ||
// 0 | ||
return ch.charCodeAt(0) - 0x30; | ||
} | ||
else if ('A' <= ch && ch <= 'Z') { | ||
// A | ||
return ch.charCodeAt(0) - 0x41 + 10; | ||
} | ||
else { | ||
switch (ch) { | ||
case ' ': | ||
return 36; | ||
case '$': | ||
return 37; | ||
case '%': | ||
return 38; | ||
case '*': | ||
return 39; | ||
case '+': | ||
return 40; | ||
case '-': | ||
return 41; | ||
case '.': | ||
return 42; | ||
case '/': | ||
return 43; | ||
case ':': | ||
return 44; | ||
default: | ||
throw "illegal char: " + ch; | ||
} | ||
} | ||
}; | ||
return QRAlphanumeric; | ||
}(QRData_1.default)); | ||
exports.default = QRAlphanumeric; |
@@ -19,3 +19,5 @@ "use strict"; | ||
function QRByte(data) { | ||
return _super.call(this, Mode_1.default.Byte, data) || this; | ||
var _this = _super.call(this, Mode_1.default.Byte, data) || this; | ||
_this.bytes = UTF8_1.default(data); | ||
return _this; | ||
} | ||
@@ -28,6 +30,6 @@ /** | ||
QRByte.prototype.write = function (buffer) { | ||
var data = UTF8_1.default(this.getData()); | ||
var length = data.length; | ||
var bytes = this.bytes; | ||
var length = bytes.length; | ||
for (var i = 0; i < length; i++) { | ||
buffer.put(data[i], 8); | ||
buffer.put(bytes[i], 8); | ||
} | ||
@@ -41,3 +43,3 @@ }; | ||
QRByte.prototype.getLength = function () { | ||
return UTF8_1.default(this.getData()).length; | ||
return this.bytes.length; | ||
}; | ||
@@ -44,0 +46,0 @@ return QRByte; |
@@ -17,5 +17,2 @@ "use strict"; | ||
}; | ||
QRData.prototype.getData = function () { | ||
return this.data; | ||
}; | ||
QRData.prototype.getLengthInBits = function (version) { | ||
@@ -22,0 +19,0 @@ var mode = this.mode; |
@@ -13,4 +13,8 @@ "use strict"; | ||
var SJIS_1 = require("../../encoding/SJIS"); | ||
function createCharError(index, data) { | ||
return "illegal char: " + String.fromCharCode(data[index]); | ||
function createCharError(bytes, index) { | ||
var byte = bytes[index]; | ||
if (0xa0 <= byte && byte <= 0xdf) { | ||
byte += 0xfec0; | ||
} | ||
return "illegal char: " + String.fromCharCode(byte); | ||
} | ||
@@ -24,3 +28,5 @@ var QRKanji = /** @class */ (function (_super) { | ||
function QRKanji(data) { | ||
return _super.call(this, Mode_1.default.Kanji, data) || this; | ||
var _this = _super.call(this, Mode_1.default.Kanji, data) || this; | ||
_this.bytes = SJIS_1.default(data); | ||
return _this; | ||
} | ||
@@ -34,6 +40,6 @@ /** | ||
var index = 0; | ||
var data = SJIS_1.default(this.getData()); | ||
var length = data.length; | ||
var bytes = this.bytes; | ||
var length = bytes.length; | ||
while (index + 1 < length) { | ||
var code = ((0xff & data[index]) << 8) | (0xff & data[index + 1]); | ||
var code = ((0xff & bytes[index]) << 8) | (0xff & bytes[index + 1]); | ||
if (0x8140 <= code && code <= 0x9ffc) { | ||
@@ -46,10 +52,10 @@ code -= 0x8140; | ||
else { | ||
throw createCharError(index, data); | ||
throw createCharError(bytes, index); | ||
} | ||
code = ((code >>> 8) & 0xff) * 0xc0 + (code & 0xff); | ||
code = ((code >> 8) & 0xff) * 0xc0 + (code & 0xff); | ||
buffer.put(code, 13); | ||
index += 2; | ||
} | ||
if (index < data.length) { | ||
throw createCharError(index, data); | ||
if (index < length) { | ||
throw createCharError(bytes, index); | ||
} | ||
@@ -63,3 +69,3 @@ }; | ||
QRKanji.prototype.getLength = function () { | ||
return SJIS_1.default(this.getData()).length / 2; | ||
return Math.floor(this.bytes.length / 2); | ||
}; | ||
@@ -66,0 +72,0 @@ return QRKanji; |
@@ -11,2 +11,18 @@ "use strict"; | ||
var Mode_1 = require("../common/Mode"); | ||
var UTF16_1 = require("../../encoding/UTF16"); | ||
function getCode(byte) { | ||
// 0 - 9 | ||
if (0x30 <= byte && byte <= 0x39) { | ||
return byte - 0x30; | ||
} | ||
throw "illegal char: " + String.fromCharCode(byte); | ||
} | ||
function getBatchCode(bytes) { | ||
var num = 0; | ||
var length = bytes.length; | ||
for (var i = 0; i < length; i++) { | ||
num = num * 10 + getCode(bytes[i]); | ||
} | ||
return num; | ||
} | ||
var QRNumeric = /** @class */ (function (_super) { | ||
@@ -19,3 +35,5 @@ tslib_1.__extends(QRNumeric, _super); | ||
function QRNumeric(data) { | ||
return _super.call(this, Mode_1.default.Numeric, data) || this; | ||
var _this = _super.call(this, Mode_1.default.Numeric, data) || this; | ||
_this.bytes = UTF16_1.default(data); | ||
return _this; | ||
} | ||
@@ -29,6 +47,6 @@ /** | ||
var i = 0; | ||
var data = this.getData(); | ||
var length = data.length; | ||
var bytes = this.bytes; | ||
var length = bytes.length; | ||
while (i + 2 < length) { | ||
buffer.put(QRNumeric.strToNum(data.substring(i, i + 3)), 10); | ||
buffer.put(getBatchCode([bytes[i], bytes[i + 1], bytes[i + 2]]), 10); | ||
i += 3; | ||
@@ -38,6 +56,6 @@ } | ||
if (length - i === 1) { | ||
buffer.put(QRNumeric.strToNum(data.substring(i, i + 1)), 4); | ||
buffer.put(getBatchCode([bytes[i]]), 4); | ||
} | ||
else if (length - i === 2) { | ||
buffer.put(QRNumeric.strToNum(data.substring(i, i + 2)), 7); | ||
buffer.put(getBatchCode([bytes[i], bytes[i + 1]]), 7); | ||
} | ||
@@ -52,21 +70,6 @@ } | ||
QRNumeric.prototype.getLength = function () { | ||
return this.getData().length; | ||
return this.bytes.length; | ||
}; | ||
QRNumeric.strToNum = function (str) { | ||
var num = 0; | ||
var length = str.length; | ||
for (var i = 0; i < length; i++) { | ||
num = num * 10 + QRNumeric.charToNum(str.charAt(i)); | ||
} | ||
return num; | ||
}; | ||
QRNumeric.charToNum = function (ch) { | ||
if ('0' <= ch && ch <= '9') { | ||
// 0 | ||
return ch.charCodeAt(0) - 0x30; | ||
} | ||
throw "illegal char: " + ch; | ||
}; | ||
return QRNumeric; | ||
}(QRData_1.default)); | ||
exports.default = QRNumeric; |
@@ -42,4 +42,4 @@ /** | ||
var v = (b2 << 8) | b3; | ||
SJIS2UTFTable[k] = v; | ||
UTF2SJISTable[v] = k; | ||
UTF2SJISTable[k] = v; | ||
SJIS2UTFTable[v] = k; | ||
count++; | ||
@@ -69,3 +69,3 @@ } | ||
else { | ||
var byte = SJIS2UTFTable[code]; | ||
var byte = UTF2SJISTable[code]; | ||
if (byte != null) { | ||
@@ -78,3 +78,3 @@ if ((byte & 0xff) === byte) { | ||
// 2bytes | ||
bytes.push(byte >>> 8); | ||
bytes.push(byte >> 8); | ||
bytes.push(byte & 0xff); | ||
@@ -81,0 +81,0 @@ } |
@@ -9,5 +9,5 @@ /** | ||
import Mode from '../../../common/Mode'; | ||
import { UTF2SJISTable } from '../../../../encoding/SJIS'; | ||
import { SJIS2UTFTable } from '../../../../encoding/SJIS'; | ||
function decodeNumeric(stream, size) { | ||
var text = ''; | ||
var data = ''; | ||
var bytes = []; | ||
@@ -26,3 +26,3 @@ var characterCountSize = [10, 12, 14][size]; | ||
bytes.push(48 + a, 48 + b, 48 + c); | ||
text += a.toString() + b.toString() + c.toString(); | ||
data += a.toString() + b.toString() + c.toString(); | ||
length -= 3; | ||
@@ -39,3 +39,3 @@ } | ||
bytes.push(48 + a, 48 + b); | ||
text += a.toString() + b.toString(); | ||
data += a.toString() + b.toString(); | ||
} | ||
@@ -48,5 +48,5 @@ else if (length === 1) { | ||
bytes.push(48 + num); | ||
text += num.toString(); | ||
data += num.toString(); | ||
} | ||
return { bytes: bytes, text: text }; | ||
return { bytes: bytes, data: data }; | ||
} | ||
@@ -62,3 +62,3 @@ // prettier-ignore | ||
function decodeAlphanumeric(stream, size) { | ||
var text = ''; | ||
var data = ''; | ||
var bytes = []; | ||
@@ -72,3 +72,3 @@ var characterCountSize = [9, 11, 13][size]; | ||
bytes.push(AlphanumericCharacterCodes[a].charCodeAt(0), AlphanumericCharacterCodes[b].charCodeAt(0)); | ||
text += AlphanumericCharacterCodes[a] + AlphanumericCharacterCodes[b]; | ||
data += AlphanumericCharacterCodes[a] + AlphanumericCharacterCodes[b]; | ||
length -= 2; | ||
@@ -79,53 +79,49 @@ } | ||
bytes.push(AlphanumericCharacterCodes[a].charCodeAt(0)); | ||
text += AlphanumericCharacterCodes[a]; | ||
data += AlphanumericCharacterCodes[a]; | ||
} | ||
return { bytes: bytes, text: text }; | ||
return { bytes: bytes, data: data }; | ||
} | ||
/** | ||
* @function bytesToUTF8 | ||
* @param {number[]} bytes | ||
* @returns {string} | ||
* @see https://github.com/google/closure-library/blob/master/closure/goog/crypt/crypt.js | ||
*/ | ||
function bytesToUTF8(bytes) { | ||
// TODO(user): Use native implementations if/when available | ||
var pos = 0; | ||
var output = ''; | ||
while (pos < bytes.length) { | ||
var c1 = bytes[pos++]; | ||
function decodeByte(stream, size) { | ||
var data = ''; | ||
var bytes = []; | ||
var characterCountSize = [8, 16, 16][size]; | ||
var length = stream.readBits(characterCountSize); | ||
for (var i = 0; i < length; i++) { | ||
var c1 = stream.readBits(8); | ||
bytes.push(c1); | ||
if (c1 < 128) { | ||
output += String.fromCharCode(c1); | ||
data += String.fromCharCode(c1); | ||
} | ||
else if (c1 > 191 && c1 < 224) { | ||
var c2 = bytes[pos++]; | ||
output += String.fromCharCode(((c1 & 31) << 6) | (c2 & 63)); | ||
var c2 = stream.readBits(8); | ||
bytes.push(c2); | ||
data += String.fromCharCode(((c1 & 31) << 6) | (c2 & 63)); | ||
i++; | ||
} | ||
else if (c1 > 239 && c1 < 365) { | ||
// Surrogate Pair | ||
var c2 = bytes[pos++]; | ||
var c3 = bytes[pos++]; | ||
var c4 = bytes[pos++]; | ||
var c2 = stream.readBits(8); | ||
var c3 = stream.readBits(8); | ||
var c4 = stream.readBits(8); | ||
var u = (((c1 & 7) << 18) | ((c2 & 63) << 12) | ((c3 & 63) << 6) | (c4 & 63)) - 0x10000; | ||
output += String.fromCharCode(0xd800 + (u >> 10)); | ||
output += String.fromCharCode(0xdc00 + (u & 1023)); | ||
bytes.push(c2, c3, c4); | ||
data += String.fromCharCode(0xd800 + (u >> 10)); | ||
data += String.fromCharCode(0xdc00 + (u & 1023)); | ||
i += 3; | ||
} | ||
else { | ||
var c2 = bytes[pos++]; | ||
var c3 = bytes[pos++]; | ||
output += String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); | ||
var c2 = stream.readBits(8); | ||
var c3 = stream.readBits(8); | ||
bytes.push(c2, c3); | ||
data += String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); | ||
i += 2; | ||
} | ||
} | ||
return output; | ||
return { bytes: bytes, data: data }; | ||
} | ||
function decodeByte(stream, size) { | ||
var bytes = []; | ||
var characterCountSize = [8, 16, 16][size]; | ||
var length = stream.readBits(characterCountSize); | ||
for (var i = 0; i < length; i++) { | ||
bytes.push(stream.readBits(8)); | ||
} | ||
return { bytes: bytes, text: bytesToUTF8(bytes) }; | ||
} | ||
function decodeKanji(stream, size) { | ||
var text = ''; | ||
var data = ''; | ||
var bytes = []; | ||
@@ -144,5 +140,6 @@ var characterCountSize = [8, 10, 12][size]; | ||
bytes.push(c >> 8, c & 0xff); | ||
text += String.fromCharCode(UTF2SJISTable[c]); | ||
var b = SJIS2UTFTable[c]; | ||
data += String.fromCharCode(b != null ? b : c); | ||
} | ||
return { bytes: bytes, text: text }; | ||
return { bytes: bytes, data: data }; | ||
} | ||
@@ -154,3 +151,3 @@ export function decode(data, version, errorCorrectionLevel) { | ||
var size = version <= 9 ? 0 : version <= 26 ? 1 : 2; | ||
var result = { text: '', bytes: [], chunks: [], version: version, errorCorrectionLevel: errorCorrectionLevel }; | ||
var result = { data: '', bytes: [], chunks: [], version: version, errorCorrectionLevel: errorCorrectionLevel }; | ||
while (stream.available() >= 4) { | ||
@@ -164,3 +161,3 @@ var mode = stream.readBits(4); | ||
result.chunks.push({ | ||
type: Mode.ECI, | ||
mode: Mode.ECI, | ||
assignmentNumber: stream.readBits(7) | ||
@@ -171,3 +168,3 @@ }); | ||
result.chunks.push({ | ||
type: Mode.ECI, | ||
mode: Mode.ECI, | ||
assignmentNumber: stream.readBits(14) | ||
@@ -178,3 +175,3 @@ }); | ||
result.chunks.push({ | ||
type: Mode.ECI, | ||
mode: Mode.ECI, | ||
assignmentNumber: stream.readBits(21) | ||
@@ -186,3 +183,3 @@ }); | ||
result.chunks.push({ | ||
type: Mode.ECI, | ||
mode: Mode.ECI, | ||
assignmentNumber: -1 | ||
@@ -194,6 +191,6 @@ }); | ||
var numericResult = decodeNumeric(stream, size); | ||
result.text += numericResult.text; | ||
result.data += numericResult.data; | ||
result.chunks.push({ | ||
type: Mode.Numeric, | ||
text: numericResult.text, | ||
mode: Mode.Numeric, | ||
data: numericResult.data, | ||
bytes: numericResult.bytes | ||
@@ -205,6 +202,6 @@ }); | ||
var alphanumericResult = decodeAlphanumeric(stream, size); | ||
result.text += alphanumericResult.text; | ||
result.data += alphanumericResult.data; | ||
result.chunks.push({ | ||
type: Mode.Alphanumeric, | ||
text: alphanumericResult.text, | ||
mode: Mode.Alphanumeric, | ||
data: alphanumericResult.data, | ||
bytes: alphanumericResult.bytes | ||
@@ -222,10 +219,10 @@ }); | ||
}; | ||
result.chunks.push(tslib_1.__assign({ type: Mode.StructuredAppend }, structuredAppend)); | ||
result.chunks.push(tslib_1.__assign({ mode: Mode.StructuredAppend }, structuredAppend)); | ||
} | ||
else if (mode === Mode.Byte) { | ||
var byteResult = decodeByte(stream, size); | ||
result.text += byteResult.text; | ||
result.data += byteResult.data; | ||
result.chunks.push({ | ||
type: Mode.Byte, | ||
text: byteResult.text, | ||
mode: Mode.Byte, | ||
data: byteResult.data, | ||
bytes: byteResult.bytes | ||
@@ -237,6 +234,6 @@ }); | ||
var kanjiResult = decodeKanji(stream, size); | ||
result.text += kanjiResult.text; | ||
result.data += kanjiResult.data; | ||
result.chunks.push({ | ||
type: Mode.Kanji, | ||
text: kanjiResult.text, | ||
mode: Mode.Kanji, | ||
data: kanjiResult.data, | ||
bytes: kanjiResult.bytes | ||
@@ -243,0 +240,0 @@ }); |
@@ -9,2 +9,46 @@ /** | ||
import Mode from '../common/Mode'; | ||
import { default as stringToBytes } from '../../encoding/UTF16'; | ||
function getCode(byte) { | ||
if (0x30 <= byte && byte <= 0x39) { | ||
// 0 - 9 | ||
return byte - 0x30; | ||
} | ||
else if (0x41 <= byte && byte <= 0x5a) { | ||
// A - Z | ||
return byte - 0x41 + 10; | ||
} | ||
else { | ||
switch (byte) { | ||
// space | ||
case 0x20: | ||
return 36; | ||
// $ | ||
case 0x24: | ||
return 37; | ||
// % | ||
case 0x25: | ||
return 38; | ||
// * | ||
case 0x2a: | ||
return 39; | ||
// + | ||
case 0x2b: | ||
return 40; | ||
// - | ||
case 0x2d: | ||
return 41; | ||
// . | ||
case 0x2e: | ||
return 42; | ||
// / | ||
case 0x2f: | ||
return 43; | ||
// : | ||
case 0x3a: | ||
return 44; | ||
default: | ||
throw "illegal char: " + String.fromCharCode(byte); | ||
} | ||
} | ||
} | ||
var QRAlphanumeric = /** @class */ (function (_super) { | ||
@@ -17,3 +61,5 @@ tslib_1.__extends(QRAlphanumeric, _super); | ||
function QRAlphanumeric(data) { | ||
return _super.call(this, Mode.Alphanumeric, data) || this; | ||
var _this = _super.call(this, Mode.Alphanumeric, data) || this; | ||
_this.bytes = stringToBytes(data); | ||
return _this; | ||
} | ||
@@ -27,10 +73,10 @@ /** | ||
var i = 0; | ||
var data = this.getData(); | ||
var length = data.length; | ||
var bytes = this.bytes; | ||
var length = bytes.length; | ||
while (i + 1 < length) { | ||
buffer.put(QRAlphanumeric.getCode(data.charAt(i)) * 45 + QRAlphanumeric.getCode(data.charAt(i + 1)), 11); | ||
buffer.put(getCode(bytes[i]) * 45 + getCode(bytes[i + 1]), 11); | ||
i += 2; | ||
} | ||
if (i < data.length) { | ||
buffer.put(QRAlphanumeric.getCode(data.charAt(i)), 6); | ||
if (i < length) { | ||
buffer.put(getCode(bytes[i]), 6); | ||
} | ||
@@ -44,40 +90,6 @@ }; | ||
QRAlphanumeric.prototype.getLength = function () { | ||
return this.getData().length; | ||
return this.bytes.length; | ||
}; | ||
QRAlphanumeric.getCode = function (ch) { | ||
if ('0' <= ch && ch <= '9') { | ||
// 0 | ||
return ch.charCodeAt(0) - 0x30; | ||
} | ||
else if ('A' <= ch && ch <= 'Z') { | ||
// A | ||
return ch.charCodeAt(0) - 0x41 + 10; | ||
} | ||
else { | ||
switch (ch) { | ||
case ' ': | ||
return 36; | ||
case '$': | ||
return 37; | ||
case '%': | ||
return 38; | ||
case '*': | ||
return 39; | ||
case '+': | ||
return 40; | ||
case '-': | ||
return 41; | ||
case '.': | ||
return 42; | ||
case '/': | ||
return 43; | ||
case ':': | ||
return 44; | ||
default: | ||
throw "illegal char: " + ch; | ||
} | ||
} | ||
}; | ||
return QRAlphanumeric; | ||
}(QRData)); | ||
export default QRAlphanumeric; |
@@ -17,3 +17,5 @@ /** | ||
function QRByte(data) { | ||
return _super.call(this, Mode.Byte, data) || this; | ||
var _this = _super.call(this, Mode.Byte, data) || this; | ||
_this.bytes = stringToBytes(data); | ||
return _this; | ||
} | ||
@@ -26,6 +28,6 @@ /** | ||
QRByte.prototype.write = function (buffer) { | ||
var data = stringToBytes(this.getData()); | ||
var length = data.length; | ||
var bytes = this.bytes; | ||
var length = bytes.length; | ||
for (var i = 0; i < length; i++) { | ||
buffer.put(data[i], 8); | ||
buffer.put(bytes[i], 8); | ||
} | ||
@@ -39,3 +41,3 @@ }; | ||
QRByte.prototype.getLength = function () { | ||
return stringToBytes(this.getData()).length; | ||
return this.bytes.length; | ||
}; | ||
@@ -42,0 +44,0 @@ return QRByte; |
@@ -15,5 +15,2 @@ /** | ||
}; | ||
QRData.prototype.getData = function () { | ||
return this.data; | ||
}; | ||
QRData.prototype.getLengthInBits = function (version) { | ||
@@ -20,0 +17,0 @@ var mode = this.mode; |
@@ -11,4 +11,8 @@ /** | ||
import stringToBytes from '../../encoding/SJIS'; | ||
function createCharError(index, data) { | ||
return "illegal char: " + String.fromCharCode(data[index]); | ||
function createCharError(bytes, index) { | ||
var byte = bytes[index]; | ||
if (0xa0 <= byte && byte <= 0xdf) { | ||
byte += 0xfec0; | ||
} | ||
return "illegal char: " + String.fromCharCode(byte); | ||
} | ||
@@ -22,3 +26,5 @@ var QRKanji = /** @class */ (function (_super) { | ||
function QRKanji(data) { | ||
return _super.call(this, Mode.Kanji, data) || this; | ||
var _this = _super.call(this, Mode.Kanji, data) || this; | ||
_this.bytes = stringToBytes(data); | ||
return _this; | ||
} | ||
@@ -32,6 +38,6 @@ /** | ||
var index = 0; | ||
var data = stringToBytes(this.getData()); | ||
var length = data.length; | ||
var bytes = this.bytes; | ||
var length = bytes.length; | ||
while (index + 1 < length) { | ||
var code = ((0xff & data[index]) << 8) | (0xff & data[index + 1]); | ||
var code = ((0xff & bytes[index]) << 8) | (0xff & bytes[index + 1]); | ||
if (0x8140 <= code && code <= 0x9ffc) { | ||
@@ -44,10 +50,10 @@ code -= 0x8140; | ||
else { | ||
throw createCharError(index, data); | ||
throw createCharError(bytes, index); | ||
} | ||
code = ((code >>> 8) & 0xff) * 0xc0 + (code & 0xff); | ||
code = ((code >> 8) & 0xff) * 0xc0 + (code & 0xff); | ||
buffer.put(code, 13); | ||
index += 2; | ||
} | ||
if (index < data.length) { | ||
throw createCharError(index, data); | ||
if (index < length) { | ||
throw createCharError(bytes, index); | ||
} | ||
@@ -61,3 +67,3 @@ }; | ||
QRKanji.prototype.getLength = function () { | ||
return stringToBytes(this.getData()).length / 2; | ||
return Math.floor(this.bytes.length / 2); | ||
}; | ||
@@ -64,0 +70,0 @@ return QRKanji; |
@@ -9,2 +9,18 @@ /** | ||
import Mode from '../common/Mode'; | ||
import { default as stringToBytes } from '../../encoding/UTF16'; | ||
function getCode(byte) { | ||
// 0 - 9 | ||
if (0x30 <= byte && byte <= 0x39) { | ||
return byte - 0x30; | ||
} | ||
throw "illegal char: " + String.fromCharCode(byte); | ||
} | ||
function getBatchCode(bytes) { | ||
var num = 0; | ||
var length = bytes.length; | ||
for (var i = 0; i < length; i++) { | ||
num = num * 10 + getCode(bytes[i]); | ||
} | ||
return num; | ||
} | ||
var QRNumeric = /** @class */ (function (_super) { | ||
@@ -17,3 +33,5 @@ tslib_1.__extends(QRNumeric, _super); | ||
function QRNumeric(data) { | ||
return _super.call(this, Mode.Numeric, data) || this; | ||
var _this = _super.call(this, Mode.Numeric, data) || this; | ||
_this.bytes = stringToBytes(data); | ||
return _this; | ||
} | ||
@@ -27,6 +45,6 @@ /** | ||
var i = 0; | ||
var data = this.getData(); | ||
var length = data.length; | ||
var bytes = this.bytes; | ||
var length = bytes.length; | ||
while (i + 2 < length) { | ||
buffer.put(QRNumeric.strToNum(data.substring(i, i + 3)), 10); | ||
buffer.put(getBatchCode([bytes[i], bytes[i + 1], bytes[i + 2]]), 10); | ||
i += 3; | ||
@@ -36,6 +54,6 @@ } | ||
if (length - i === 1) { | ||
buffer.put(QRNumeric.strToNum(data.substring(i, i + 1)), 4); | ||
buffer.put(getBatchCode([bytes[i]]), 4); | ||
} | ||
else if (length - i === 2) { | ||
buffer.put(QRNumeric.strToNum(data.substring(i, i + 2)), 7); | ||
buffer.put(getBatchCode([bytes[i], bytes[i + 1]]), 7); | ||
} | ||
@@ -50,21 +68,6 @@ } | ||
QRNumeric.prototype.getLength = function () { | ||
return this.getData().length; | ||
return this.bytes.length; | ||
}; | ||
QRNumeric.strToNum = function (str) { | ||
var num = 0; | ||
var length = str.length; | ||
for (var i = 0; i < length; i++) { | ||
num = num * 10 + QRNumeric.charToNum(str.charAt(i)); | ||
} | ||
return num; | ||
}; | ||
QRNumeric.charToNum = function (ch) { | ||
if ('0' <= ch && ch <= '9') { | ||
// 0 | ||
return ch.charCodeAt(0) - 0x30; | ||
} | ||
throw "illegal char: " + ch; | ||
}; | ||
return QRNumeric; | ||
}(QRData)); | ||
export default QRNumeric; |
{ | ||
"name": "@nuintun/qrcode", | ||
"version": "0.10.2", | ||
"version": "0.11.0", | ||
"description": "QRCode encode and decode library.", | ||
@@ -5,0 +5,0 @@ "main": "es5/index.js", |
@@ -9,8 +9,8 @@ /** | ||
interface ByteChunk { | ||
type: Mode.Numeric | Mode.Alphanumeric | Mode.Byte | Mode.Kanji; | ||
text: string; | ||
mode: Mode.Numeric | Mode.Alphanumeric | Mode.Byte | Mode.Kanji; | ||
data: string; | ||
bytes: number[]; | ||
} | ||
interface ECIChunk { | ||
type: Mode.ECI; | ||
mode: Mode.ECI; | ||
assignmentNumber: number; | ||
@@ -24,6 +24,6 @@ } | ||
interface StructuredAppendChunk extends StructuredAppend { | ||
type: Mode.StructuredAppend; | ||
mode: Mode.StructuredAppend; | ||
} | ||
interface DecodeData { | ||
text: string; | ||
data: string; | ||
bytes: number[]; | ||
@@ -30,0 +30,0 @@ } |
@@ -26,3 +26,2 @@ /** | ||
getLength(): number; | ||
private static getCode; | ||
} |
@@ -9,7 +9,7 @@ /** | ||
export default abstract class QRData { | ||
private mode; | ||
private data; | ||
protected mode: Mode; | ||
protected data: string; | ||
protected bytes: number[]; | ||
constructor(mode: Mode, data: string); | ||
getMode(): Mode; | ||
getData(): string; | ||
abstract getLength(): number; | ||
@@ -16,0 +16,0 @@ abstract write(buffer: BitBuffer): void; |
@@ -26,4 +26,2 @@ /** | ||
getLength(): number; | ||
private static strToNum; | ||
private static charToNum; | ||
} |
435752
122
10421