Skip to content

Commit 1067b0a

Browse files
committed
issue#28 encoding mode support (Numeric, Alphanumeric, Kanji).
1 parent db5dfc3 commit 1067b0a

File tree

6 files changed

+222
-11
lines changed

6 files changed

+222
-11
lines changed

js/README.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,13 @@ Overwrite this function to encode using a multibyte charset.
4444

4545
###QRCode
4646

47-
####addData(data) => <code>void</code>
47+
####addData(data, mode) => <code>void</code>
4848
Add a data to encode.
4949

50-
| Param | Type | Description |
51-
| -------| ------------------- | ---------------- |
52-
| data | <code>string</code> | string to encode |
50+
| Param | Type | Description |
51+
| -------| ------------------- | ---------------------------------------------------------- |
52+
| data | <code>string</code> | string to encode |
53+
| mode | <code>string</code> | Mode ('Numeric', 'Alphanumeric', 'Byte'(default), 'Kanji') |
5354

5455
####make() => <code>void</code>
5556
Make a QR Code.

js/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "qrcode-generator",
3-
"version": "1.0.7",
3+
"version": "1.1.0",
44
"description": "QR Code Generator implementation in JavaScript.",
55
"author": "Kazuhiko Arase",
66
"main": "qrcode.js",

js/qrcode.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ interface QRCodeFactory {
2323
}
2424

2525
interface QRCode {
26-
addData(data: string) : void;
26+
addData(data: string, mode?: string) : void;
2727
make() : void;
2828
getModuleCount() : number;
2929
isDark(row: number, col: number) : boolean;

js/qrcode.js

Lines changed: 204 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -383,8 +383,29 @@ var qrcode = function() {
383383
return createBytes(buffer, rsBlocks);
384384
};
385385

386-
_this.addData = function(data) {
387-
var newData = qr8BitByte(data);
386+
_this.addData = function(data, mode) {
387+
388+
mode = mode || 'Byte';
389+
390+
var newData = null;
391+
392+
switch(mode) {
393+
case 'Numeric' :
394+
newData = qrNumber(data);
395+
break;
396+
case 'Alphanumeric' :
397+
newData = qrAlphaNum(data);
398+
break;
399+
case 'Byte' :
400+
newData = qr8BitByte(data);
401+
break;
402+
case 'Kanji' :
403+
newData = qrKanji(data);
404+
break;
405+
default :
406+
throw 'mode:' + mode;
407+
}
408+
388409
_dataList.push(newData);
389410
_dataCache = null;
390411
};
@@ -1366,6 +1387,126 @@ var qrcode = function() {
13661387
return _this;
13671388
};
13681389

1390+
//---------------------------------------------------------------------
1391+
// qrNumber
1392+
//---------------------------------------------------------------------
1393+
1394+
var qrNumber = function(data) {
1395+
1396+
var _mode = QRMode.MODE_NUMBER;
1397+
var _data = data;
1398+
1399+
var _this = {};
1400+
1401+
_this.getMode = function() {
1402+
return _mode;
1403+
};
1404+
1405+
_this.getLength = function(buffer) {
1406+
return _data.length;
1407+
};
1408+
1409+
_this.write = function(buffer) {
1410+
1411+
var data = _data;
1412+
1413+
var i = 0;
1414+
1415+
while (i + 2 < data.length) {
1416+
buffer.put(strToNum(data.substring(i, i + 3) ), 10);
1417+
i += 3;
1418+
}
1419+
1420+
if (i < data.length) {
1421+
if (data.length - i == 1) {
1422+
buffer.put(strToNum(data.substring(i, i + 1) ), 4);
1423+
} else if (data.length - i == 2) {
1424+
buffer.put(strToNum(data.substring(i, i + 2) ), 7);
1425+
}
1426+
}
1427+
};
1428+
1429+
var strToNum = function(s) {
1430+
var num = 0;
1431+
for (var i = 0; i < s.length; i += 1) {
1432+
num = num * 10 + chatToNum(s.charAt(i) );
1433+
}
1434+
return num;
1435+
};
1436+
1437+
var chatToNum = function(c) {
1438+
if ('0' <= c && c <= '9') {
1439+
return c.charCodeAt(0) - '0'.charCodeAt(0);
1440+
}
1441+
throw 'illegal char :' + c;
1442+
};
1443+
1444+
return _this;
1445+
};
1446+
1447+
//---------------------------------------------------------------------
1448+
// qrAlphaNum
1449+
//---------------------------------------------------------------------
1450+
1451+
var qrAlphaNum = function(data) {
1452+
1453+
var _mode = QRMode.MODE_ALPHA_NUM;
1454+
var _data = data;
1455+
1456+
var _this = {};
1457+
1458+
_this.getMode = function() {
1459+
return _mode;
1460+
};
1461+
1462+
_this.getLength = function(buffer) {
1463+
return _data.length;
1464+
};
1465+
1466+
_this.write = function(buffer) {
1467+
1468+
var s = _data;
1469+
1470+
var i = 0;
1471+
1472+
while (i + 1 < s.length) {
1473+
buffer.put(
1474+
getCode(s.charAt(i) ) * 45 +
1475+
getCode(s.charAt(i + 1) ), 11);
1476+
i += 2;
1477+
}
1478+
1479+
if (i < s.length) {
1480+
buffer.put(getCode(s.charAt(i) ), 6);
1481+
}
1482+
};
1483+
1484+
var getCode = function(c) {
1485+
1486+
if ('0' <= c && c <= '9') {
1487+
return c.charCodeAt(0) - '0'.charCodeAt(0);
1488+
} else if ('A' <= c && c <= 'Z') {
1489+
return c.charCodeAt(0) - 'A'.charCodeAt(0) + 10;
1490+
} else {
1491+
switch (c) {
1492+
case ' ' : return 36;
1493+
case '$' : return 37;
1494+
case '%' : return 38;
1495+
case '*' : return 39;
1496+
case '+' : return 40;
1497+
case '-' : return 41;
1498+
case '.' : return 42;
1499+
case '/' : return 43;
1500+
case ':' : return 44;
1501+
default :
1502+
throw 'illegal char :' + c;
1503+
}
1504+
}
1505+
};
1506+
1507+
return _this;
1508+
};
1509+
13691510
//---------------------------------------------------------------------
13701511
// qr8BitByte
13711512
//---------------------------------------------------------------------
@@ -1395,6 +1536,67 @@ var qrcode = function() {
13951536
return _this;
13961537
};
13971538

1539+
//---------------------------------------------------------------------
1540+
// qrKanji
1541+
//---------------------------------------------------------------------
1542+
1543+
var qrKanji = function(data) {
1544+
1545+
var _mode = QRMode.MODE_KANJI;
1546+
var _data = data;
1547+
var _bytes = qrcode.stringToBytes(data);
1548+
1549+
!function(c, code) {
1550+
// self test for sjis support.
1551+
var test = qrcode.stringToBytes(c);
1552+
if (test.length != 2 || ( (test[0] << 8) | test[1]) != code) {
1553+
throw 'sjis not supported.';
1554+
}
1555+
}('\u53cb', 0x9746);
1556+
1557+
var _this = {};
1558+
1559+
_this.getMode = function() {
1560+
return _mode;
1561+
};
1562+
1563+
_this.getLength = function(buffer) {
1564+
return ~~(_bytes.length / 2);
1565+
};
1566+
1567+
_this.write = function(buffer) {
1568+
1569+
var data = _bytes;
1570+
1571+
var i = 0;
1572+
1573+
while (i + 1 < data.length) {
1574+
1575+
var c = ( (0xff & data[i]) << 8) | (0xff & data[i + 1]);
1576+
1577+
if (0x8140 <= c && c <= 0x9FFC) {
1578+
c -= 0x8140;
1579+
} else if (0xE040 <= c && c <= 0xEBBF) {
1580+
c -= 0xC140;
1581+
} else {
1582+
throw 'illegal char at ' + (i + 1) + '/' + c;
1583+
}
1584+
1585+
c = ( (c >>> 8) & 0xff) * 0xC0 + (c & 0xff);
1586+
1587+
buffer.put(c, 13);
1588+
1589+
i += 2;
1590+
}
1591+
1592+
if (i < data.length) {
1593+
throw 'illegal char at ' + (i + 1);
1594+
}
1595+
};
1596+
1597+
return _this;
1598+
};
1599+
13981600
//=====================================================================
13991601
// GIF Support etc.
14001602
//

js/sample.html

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,13 @@
2525
<option value="Q">Q(25%)</option>
2626
<option value="H">H(30%)</option>
2727
</select>
28+
<span>Mode:</span>
29+
<select name="m">
30+
<option value="Numeric">Numeric</option>
31+
<option value="Alphanumeric">Alphanumeric</option>
32+
<option value="Byte" selected>Byte</option>
33+
<option value="Kanji">Kanji</option>
34+
</select>
2835
<br/>
2936
<textarea name="msg" rows="10" cols="40">here comes qr!</textarea>
3037
<br/>

js/sample.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ var draw_qrcode = function(text, typeNumber, errorCorrectionLevel) {
33
document.write(create_qrcode(text, typeNumber, errorCorrectionLevel) );
44
};
55

6-
var create_qrcode = function(text, typeNumber, errorCorrectionLevel, table) {
6+
var create_qrcode = function(text, typeNumber, errorCorrectionLevel, mode) {
77

88
var qr = qrcode(typeNumber || 4, errorCorrectionLevel || 'M');
9-
qr.addData(text);
9+
qr.addData(text, mode);
1010
qr.make();
1111

1212
// return qr.createTableTag();
@@ -20,5 +20,6 @@ var update_qrcode = function() {
2020
replace(/^[\s\u3000]+|[\s\u3000]+$/g, '');
2121
var t = form.elements['t'].value;
2222
var e = form.elements['e'].value;
23-
document.getElementById('qr').innerHTML = create_qrcode(text, t, e);
23+
var m = form.elements['m'].value;
24+
document.getElementById('qr').innerHTML = create_qrcode(text, t, e, m);
2425
};

0 commit comments

Comments
 (0)