@@ -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 //
0 commit comments