yh-hiprint 2.4.1 → 2.5.0
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/HiprintDesigner.vue +3 -0
- package/designer.vue +54 -55
- package/libs/hiprint.bundle.js +46 -30
- package/libs/plugins/qrcode.js +86 -617
- package/package.json +6 -4
package/HiprintDesigner.vue
CHANGED
|
@@ -842,8 +842,11 @@ function init() {
|
|
|
842
842
|
fontList: [
|
|
843
843
|
{title: '微软雅黑', value: 'Microsoft YaHei'},
|
|
844
844
|
{title: '黑体', value: 'STHeitiSC-Light'},
|
|
845
|
+
{title: '思源黑体', value: 'SourceHanSansCN-Normal'},
|
|
845
846
|
{title: '宋体', value: 'SimSun'},
|
|
847
|
+
{title: '华为楷体', value: 'STKaiti'},
|
|
846
848
|
{title: 'cursive', value: 'cursive'},
|
|
849
|
+
{title: 'Times New Roman', value: 'Times New Roman'},
|
|
847
850
|
],
|
|
848
851
|
dataMode: 1,
|
|
849
852
|
history: true,
|
package/designer.vue
CHANGED
|
@@ -265,14 +265,14 @@
|
|
|
265
265
|
</el-dialog>
|
|
266
266
|
</template>
|
|
267
267
|
<script setup>
|
|
268
|
-
import {
|
|
269
|
-
import {
|
|
270
|
-
import {
|
|
271
|
-
import {
|
|
272
|
-
import axios from
|
|
268
|
+
import {onMounted, ref, onActivated, onDeactivated, computed, watch, nextTick} from 'vue';
|
|
269
|
+
import {hiprint, defaultElementTypeProvider, fontSize, scale, zIndex, panel, usePaper, useScale, useDataSource} from 'yh-hiprint';
|
|
270
|
+
import {useRoute, onBeforeRouteUpdate} from 'vue-router/dist/vue-router';
|
|
271
|
+
import {ElMessageBox} from 'element-plus';
|
|
272
|
+
import axios from '@/libs/api.request';
|
|
273
273
|
|
|
274
274
|
const route = useRoute();
|
|
275
|
-
const {
|
|
275
|
+
const {paperType, paperWidth, paperHeight, setPaper} = usePaper();
|
|
276
276
|
function setPaperHandler(type) {
|
|
277
277
|
setPaper(type, () => {
|
|
278
278
|
hiprintTemplate.value.setPaper(paperWidth.value, paperHeight.value);
|
|
@@ -281,23 +281,23 @@ function setPaperHandler(type) {
|
|
|
281
281
|
|
|
282
282
|
const hiprintTemplate = ref(null);
|
|
283
283
|
const canvasRef = ref();
|
|
284
|
-
const {
|
|
284
|
+
const {scaleValue, scalePercentage, canZoomIn, canZoomOut, zoomIn, zoomOut} = useScale(() => {
|
|
285
285
|
hiprintTemplate.value.zoom(scaleValue.value);
|
|
286
286
|
canvasRef?.value.update();
|
|
287
287
|
});
|
|
288
288
|
|
|
289
289
|
const previewShow = ref(false);
|
|
290
|
-
const previewHtml = ref(
|
|
290
|
+
const previewHtml = ref('');
|
|
291
291
|
async function previewPrint() {
|
|
292
292
|
let {
|
|
293
|
-
data: {
|
|
293
|
+
data: {list, json},
|
|
294
294
|
} = await axios.request({
|
|
295
295
|
url: `/printTemplate/data/${detailData.value.code}`,
|
|
296
|
-
method:
|
|
297
|
-
type:
|
|
296
|
+
method: 'post',
|
|
297
|
+
type: 'json',
|
|
298
298
|
data: [
|
|
299
299
|
{
|
|
300
|
-
code:
|
|
300
|
+
code: '50101820',
|
|
301
301
|
},
|
|
302
302
|
],
|
|
303
303
|
});
|
|
@@ -323,12 +323,12 @@ async function previewPrint() {
|
|
|
323
323
|
} else {
|
|
324
324
|
list = [];
|
|
325
325
|
}
|
|
326
|
-
previewHtml.value = new hiprint.PrintTemplate({
|
|
326
|
+
previewHtml.value = new hiprint.PrintTemplate({template: JSON.parse(json)}).getHtml(list)[0].innerHTML;
|
|
327
327
|
previewShow.value = true;
|
|
328
328
|
} else {
|
|
329
329
|
ElMessage.warning({
|
|
330
|
-
title:
|
|
331
|
-
message:
|
|
330
|
+
title: '警告',
|
|
331
|
+
message: '模板配置不存在,请检查',
|
|
332
332
|
});
|
|
333
333
|
}
|
|
334
334
|
}
|
|
@@ -337,25 +337,25 @@ function saveConfig() {
|
|
|
337
337
|
let arr = [].concat(formCode.value);
|
|
338
338
|
let json = hiprintTemplate.value.getJson();
|
|
339
339
|
json.panels[0].printElements.forEach((item) => {
|
|
340
|
-
if (item.printElementType.type ===
|
|
340
|
+
if (item.printElementType.type === 'table') {
|
|
341
341
|
arr.push(item.options.field);
|
|
342
342
|
}
|
|
343
343
|
});
|
|
344
344
|
|
|
345
345
|
axios
|
|
346
346
|
.request({
|
|
347
|
-
url:
|
|
348
|
-
method:
|
|
349
|
-
type:
|
|
347
|
+
url: '/printTemplate/save',
|
|
348
|
+
method: 'post',
|
|
349
|
+
type: 'json',
|
|
350
350
|
data: {
|
|
351
351
|
id: detailData.value.id,
|
|
352
352
|
json: JSON.stringify(json),
|
|
353
|
-
dsIds: arr.join(
|
|
353
|
+
dsIds: arr.join(','),
|
|
354
354
|
},
|
|
355
355
|
})
|
|
356
356
|
.then((res) => {
|
|
357
357
|
ElMessage.success({
|
|
358
|
-
message:
|
|
358
|
+
message: '恭喜模板保存成功',
|
|
359
359
|
});
|
|
360
360
|
});
|
|
361
361
|
}
|
|
@@ -364,7 +364,7 @@ function clearPrint() {
|
|
|
364
364
|
hiprintTemplate.value?.clear();
|
|
365
365
|
}
|
|
366
366
|
|
|
367
|
-
const {
|
|
367
|
+
const {detailData, getDetail, listCode, dataSourceList, listColumns, formCode, formColumns, dataSourceForm, getDataSourceList} = useDataSource(axios);
|
|
368
368
|
|
|
369
369
|
watch(
|
|
370
370
|
() => formColumns.value,
|
|
@@ -387,15 +387,15 @@ watch(
|
|
|
387
387
|
);
|
|
388
388
|
let currentElementObj = ref(null);
|
|
389
389
|
let currentElementObjColumns = computed(() => {
|
|
390
|
-
if (currentElementObj.value?.printElementType.type ===
|
|
391
|
-
return currentElementObj.value.options.columns[0][
|
|
390
|
+
if (currentElementObj.value?.printElementType.type === 'table') {
|
|
391
|
+
return currentElementObj.value.options.columns[0]['columns'] || [];
|
|
392
392
|
} else {
|
|
393
393
|
return [];
|
|
394
394
|
}
|
|
395
395
|
});
|
|
396
396
|
|
|
397
397
|
function tableFieldChange(val) {
|
|
398
|
-
currentElementObj.value.updateOption(
|
|
398
|
+
currentElementObj.value.updateOption('field', val);
|
|
399
399
|
}
|
|
400
400
|
|
|
401
401
|
function tableColumnCancel() {
|
|
@@ -417,11 +417,11 @@ function init() {
|
|
|
417
417
|
options: [],
|
|
418
418
|
},
|
|
419
419
|
{
|
|
420
|
-
name:
|
|
420
|
+
name: '样式',
|
|
421
421
|
options: [
|
|
422
422
|
{
|
|
423
|
-
name:
|
|
424
|
-
after:
|
|
423
|
+
name: 'scale',
|
|
424
|
+
after: 'transform',
|
|
425
425
|
hidden: false,
|
|
426
426
|
},
|
|
427
427
|
],
|
|
@@ -429,16 +429,16 @@ function init() {
|
|
|
429
429
|
],
|
|
430
430
|
supportOptions: [
|
|
431
431
|
{
|
|
432
|
-
name:
|
|
432
|
+
name: 'styler',
|
|
433
433
|
hidden: true,
|
|
434
434
|
},
|
|
435
435
|
{
|
|
436
|
-
name:
|
|
437
|
-
after:
|
|
436
|
+
name: 'scale',
|
|
437
|
+
after: 'transform',
|
|
438
438
|
hidden: false,
|
|
439
439
|
},
|
|
440
440
|
{
|
|
441
|
-
name:
|
|
441
|
+
name: 'formatter',
|
|
442
442
|
hidden: true,
|
|
443
443
|
},
|
|
444
444
|
],
|
|
@@ -447,18 +447,18 @@ function init() {
|
|
|
447
447
|
tabs: [
|
|
448
448
|
{
|
|
449
449
|
replace: true,
|
|
450
|
-
name:
|
|
450
|
+
name: '基本',
|
|
451
451
|
options: [
|
|
452
452
|
{
|
|
453
|
-
name:
|
|
453
|
+
name: 'field',
|
|
454
454
|
hidden: false,
|
|
455
455
|
},
|
|
456
456
|
{
|
|
457
|
-
name:
|
|
457
|
+
name: 'src',
|
|
458
458
|
hidden: false,
|
|
459
459
|
},
|
|
460
460
|
{
|
|
461
|
-
name:
|
|
461
|
+
name: 'fit',
|
|
462
462
|
hidden: false,
|
|
463
463
|
},
|
|
464
464
|
],
|
|
@@ -466,31 +466,30 @@ function init() {
|
|
|
466
466
|
],
|
|
467
467
|
},
|
|
468
468
|
table: {
|
|
469
|
-
tabs: [{
|
|
469
|
+
tabs: [{options: [{name: 'field', hidden: true}]}],
|
|
470
470
|
},
|
|
471
471
|
});
|
|
472
472
|
|
|
473
|
-
hiprint.PrintElementTypeManager.buildByHtml(hiprintJQuery(
|
|
474
|
-
hiprintJQuery(
|
|
473
|
+
hiprint.PrintElementTypeManager.buildByHtml(hiprintJQuery('.ep-draggable-item'));
|
|
474
|
+
hiprintJQuery('#hiprint-printTemplate').empty();
|
|
475
475
|
let template = JSON.parse(detailData.value.json) || panel;
|
|
476
476
|
hiprintTemplate.value = new hiprint.PrintTemplate({
|
|
477
477
|
template,
|
|
478
478
|
onImageChooseClick: (target) => {
|
|
479
479
|
// 测试 3秒后修改图片地址值
|
|
480
480
|
setTimeout(() => {
|
|
481
|
-
target.refresh(
|
|
481
|
+
target.refresh('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtAAAAIIAQMAAAB99EudAAAABlBMVEUmf8vG2O41LStnAAABD0lEQVR42u3XQQqCQBSAYcWFS4/QUTpaHa2jdISWLUJjjMpclJoPGvq+1WsYfiJCZ4oCAAAAAAAAAAAAAAAAAHin6pL9c6H/fOzHbRrP0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0u/SY9LS0tLS0tLS0tLS0n+edm+UlpaWlpaWlpaWlpaW/tl0Ndyzbno7/+tPTJdd1wal69dNa6abx+Lq6TSeYtK7BX/Diek0XULSZZrakPRtV0i6Hu/KIt30q4fM0pvBqvR9mvsQkZaW9gyJT+f5lsnzjR54xAk8mAUeJyMPwYFH98ALx5Jr0kRLLndT7b64UX9QR/0eAAAAAAAAAAAAAAAAAAD/4gpryzr/bja4QgAAAABJRU5ErkJggg==', {
|
|
482
482
|
real: true,
|
|
483
483
|
});
|
|
484
484
|
}, 3000);
|
|
485
485
|
},
|
|
486
486
|
fontList: [
|
|
487
|
-
{
|
|
488
|
-
{
|
|
489
|
-
{
|
|
490
|
-
{
|
|
491
|
-
{
|
|
492
|
-
{
|
|
493
|
-
{ title: "cursive", value: "cursive" },
|
|
487
|
+
{title: '微软雅黑', value: 'Microsoft YaHei'},
|
|
488
|
+
{title: '黑体', value: 'STHeitiSC-Light'},
|
|
489
|
+
{title: '思源黑体', value: 'SourceHanSansCN-Normal'},
|
|
490
|
+
{title: '宋体', value: 'SimSun'},
|
|
491
|
+
{title: 'cursive', value: 'cursive'},
|
|
492
|
+
{title: 'Times New Roman', value: 'Times New Roman'},
|
|
494
493
|
],
|
|
495
494
|
dataMode: 1,
|
|
496
495
|
history: true,
|
|
@@ -501,11 +500,11 @@ function init() {
|
|
|
501
500
|
onUpdateError: (e) => {
|
|
502
501
|
// console.error(e);
|
|
503
502
|
},
|
|
504
|
-
settingContainer:
|
|
505
|
-
paginationContainer:
|
|
503
|
+
settingContainer: '#PrintElementOptionSetting',
|
|
504
|
+
paginationContainer: '.hiprint-printPagination',
|
|
506
505
|
});
|
|
507
506
|
|
|
508
|
-
hiprintTemplate.value.design(
|
|
507
|
+
hiprintTemplate.value.design('#hiprint-printTemplate', {grid: true});
|
|
509
508
|
scaleValue.value = hiprintTemplate.value.editingPanel.scale || 1;
|
|
510
509
|
window.ht = hiprintTemplate.value;
|
|
511
510
|
|
|
@@ -519,7 +518,7 @@ function init() {
|
|
|
519
518
|
})
|
|
520
519
|
);
|
|
521
520
|
}
|
|
522
|
-
hiprintJQuery(
|
|
521
|
+
hiprintJQuery('.hiprint-designer').on('mousedown', '.hiprint-printElement', (e) => {
|
|
523
522
|
let t = e.currentTarget;
|
|
524
523
|
let pes = hiprintTemplate.value.editingPanel.printElements;
|
|
525
524
|
let index = pes.map((item) => item.designTarget[0]).indexOf(t);
|
|
@@ -533,8 +532,8 @@ function init() {
|
|
|
533
532
|
console.log(error.message);
|
|
534
533
|
clearPrint();
|
|
535
534
|
hiprintTemplate.value = null;
|
|
536
|
-
if (error.message.indexOf(
|
|
537
|
-
ElMessageBox.alert(
|
|
535
|
+
if (error.message.indexOf('setTemplateId') > -1) {
|
|
536
|
+
ElMessageBox.alert('模板有错误,请返回列表手动修改或这清空模板!');
|
|
538
537
|
}
|
|
539
538
|
}
|
|
540
539
|
}
|
|
@@ -550,7 +549,7 @@ async function updateTemplate() {
|
|
|
550
549
|
if (detailData.value && detailData.value.json) {
|
|
551
550
|
let jsonObj = JSON.parse(detailData.value.json);
|
|
552
551
|
hiprintTemplate.value.update(jsonObj);
|
|
553
|
-
let {
|
|
552
|
+
let {width, height} = jsonObj.panels[0];
|
|
554
553
|
paperWidth.value = width;
|
|
555
554
|
paperHeight.value = height;
|
|
556
555
|
hiprintTemplate.value.setPaper(width, height);
|
|
@@ -567,7 +566,7 @@ async function updateTemplate() {
|
|
|
567
566
|
paperNumberLeft: 430,
|
|
568
567
|
paperNumberTop: 5,
|
|
569
568
|
printElements: [],
|
|
570
|
-
watermarkOptions: {
|
|
569
|
+
watermarkOptions: {content: '', rotate: 25, timestamp: false, format: 'YYYY-MM-DD HH:mm'},
|
|
571
570
|
},
|
|
572
571
|
],
|
|
573
572
|
});
|
package/libs/hiprint.bundle.js
CHANGED
|
@@ -11,27 +11,6 @@
|
|
|
11
11
|
|
|
12
12
|
"use strict";
|
|
13
13
|
|
|
14
|
-
function _instanceof (left, right) {
|
|
15
|
-
if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
|
|
16
|
-
return !!right[Symbol.hasInstance](left);
|
|
17
|
-
} else {
|
|
18
|
-
return left instanceof right;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
function _typeof (obj) {
|
|
23
|
-
if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
|
|
24
|
-
_typeof = function _typeof (obj) {
|
|
25
|
-
return typeof obj;
|
|
26
|
-
};
|
|
27
|
-
} else {
|
|
28
|
-
_typeof = function _typeof (obj) {
|
|
29
|
-
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
return _typeof(obj);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
14
|
/**
|
|
36
15
|
* import 相关资源
|
|
37
16
|
*/
|
|
@@ -40,7 +19,7 @@ import "./plugins/jquery.minicolors.js";
|
|
|
40
19
|
// 条形码
|
|
41
20
|
import JsBarcode from "./jsbarcode/JsBarcode.js";
|
|
42
21
|
// 二维码
|
|
43
|
-
import "./plugins/qrcode.js";
|
|
22
|
+
import QRCode from "./plugins/qrcode.js";
|
|
44
23
|
// 水印
|
|
45
24
|
import watermark from "./plugins/watermark.js";
|
|
46
25
|
// 直接打印需要
|
|
@@ -56,6 +35,27 @@ import { Canvg } from "canvg";
|
|
|
56
35
|
// 默认自定义拖拽列表
|
|
57
36
|
import defaultTypeProvider from "./etypes/default-etyps-provider";
|
|
58
37
|
|
|
38
|
+
function _instanceof (left, right) {
|
|
39
|
+
if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
|
|
40
|
+
return !!right[Symbol.hasInstance](left);
|
|
41
|
+
} else {
|
|
42
|
+
return left instanceof right;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function _typeof (obj) {
|
|
47
|
+
if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
|
|
48
|
+
_typeof = function _typeof (obj) {
|
|
49
|
+
return typeof obj;
|
|
50
|
+
};
|
|
51
|
+
} else {
|
|
52
|
+
_typeof = function _typeof (obj) {
|
|
53
|
+
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
return _typeof(obj);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
59
|
window.autoConnect = true;
|
|
60
60
|
|
|
61
61
|
var hiprint = (function (t) {
|
|
@@ -2290,6 +2290,7 @@ var hiprint = (function (t) {
|
|
|
2290
2290
|
colorDark: "#000000",
|
|
2291
2291
|
useSVG: !0,
|
|
2292
2292
|
correctLevel: t.tableQRCodeLevel || 0,
|
|
2293
|
+
typeNumber
|
|
2293
2294
|
}).makeCode(p);
|
|
2294
2295
|
r.html(qrcodebox);
|
|
2295
2296
|
}
|
|
@@ -10047,7 +10048,13 @@ var hiprint = (function (t) {
|
|
|
10047
10048
|
return (null == this.barcodeMode ? this.defaultOptions.barcodeMode : this.barcodeMode) || "CODE128";
|
|
10048
10049
|
}),
|
|
10049
10050
|
(e.prototype.getQRcodeLevel = function () {
|
|
10050
|
-
|
|
10051
|
+
let levelMap = {
|
|
10052
|
+
1: "L",
|
|
10053
|
+
0: "M",
|
|
10054
|
+
3: "Q",
|
|
10055
|
+
2: "H",
|
|
10056
|
+
};
|
|
10057
|
+
return (null == this.qrCodeLevel ? 'L' : levelMap[this.qrCodeLevel]) || 'L';
|
|
10051
10058
|
}),
|
|
10052
10059
|
e
|
|
10053
10060
|
);
|
|
@@ -10172,14 +10179,23 @@ var hiprint = (function (t) {
|
|
|
10172
10179
|
width: (lpt > upt ? upt : lpt) + "pt",
|
|
10173
10180
|
height: (lpt > upt ? upt : lpt) + "pt",
|
|
10174
10181
|
display: "inline-block",
|
|
10182
|
+
backgroundSize: "100% 100%",
|
|
10183
|
+
backgroundRepeat: "no-repeat",
|
|
10184
|
+
backgroundPosition: "center center",
|
|
10185
|
+
backgroundImage: "url(" + QRCode({
|
|
10186
|
+
level: this.options.getQRcodeLevel(),
|
|
10187
|
+
fnc1: 'None',
|
|
10188
|
+
mode: 'Auto',
|
|
10189
|
+
moduleSize: 8,
|
|
10190
|
+
quietZone: 0,
|
|
10191
|
+
aimIndicator: 0,
|
|
10192
|
+
version: 'Auto',
|
|
10193
|
+
charset: 'UTF_8',
|
|
10194
|
+
background: '#ffffff',
|
|
10195
|
+
foreground: this.options.color || "#000000",
|
|
10196
|
+
content: n
|
|
10197
|
+
}) + ")",
|
|
10175
10198
|
});
|
|
10176
|
-
new QRCode(box[0], {
|
|
10177
|
-
width: "100%",
|
|
10178
|
-
height: "100%",
|
|
10179
|
-
colorDark: this.options.color || "#000000",
|
|
10180
|
-
useSVG: !0,
|
|
10181
|
-
correctLevel: this.options.getQRcodeLevel(),
|
|
10182
|
-
}).makeCode(n);
|
|
10183
10199
|
a.html(box);
|
|
10184
10200
|
}
|
|
10185
10201
|
} catch (t) {
|
package/libs/plugins/qrcode.js
CHANGED
|
@@ -1,617 +1,86 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
QRCodeModel.prototype={addData:function(data){var newData=new QR8bitByte(data);this.dataList.push(newData);this.dataCache=null;},isDark:function(row,col){if(row<0||this.moduleCount<=row||col<0||this.moduleCount<=col){throw new Error(row+","+col);}
|
|
89
|
-
return this.modules[row][col];},getModuleCount:function(){return this.moduleCount;},make:function(){this.makeImpl(false,this.getBestMaskPattern());},makeImpl:function(test,maskPattern){this.moduleCount=this.typeNumber*4+17;this.modules=new Array(this.moduleCount);for(var row=0;row<this.moduleCount;row++){this.modules[row]=new Array(this.moduleCount);for(var col=0;col<this.moduleCount;col++){this.modules[row][col]=null;}}
|
|
90
|
-
this.setupPositionProbePattern(0,0);this.setupPositionProbePattern(this.moduleCount-7,0);this.setupPositionProbePattern(0,this.moduleCount-7);this.setupPositionAdjustPattern();this.setupTimingPattern();this.setupTypeInfo(test,maskPattern);if(this.typeNumber>=7){this.setupTypeNumber(test);}
|
|
91
|
-
if(this.dataCache==null){this.dataCache=QRCodeModel.createData(this.typeNumber,this.errorCorrectLevel,this.dataList);}
|
|
92
|
-
this.mapData(this.dataCache,maskPattern);},setupPositionProbePattern:function(row,col){for(var r=-1;r<=7;r++){if(row+r<=-1||this.moduleCount<=row+r)continue;for(var c=-1;c<=7;c++){if(col+c<=-1||this.moduleCount<=col+c)continue;if((0<=r&&r<=6&&(c==0||c==6))||(0<=c&&c<=6&&(r==0||r==6))||(2<=r&&r<=4&&2<=c&&c<=4)){this.modules[row+r][col+c]=true;}else{this.modules[row+r][col+c]=false;}}}},getBestMaskPattern:function(){var minLostPoint=0;var pattern=0;for(var i=0;i<8;i++){this.makeImpl(true,i);var lostPoint=QRUtil.getLostPoint(this);if(i==0||minLostPoint>lostPoint){minLostPoint=lostPoint;pattern=i;}}
|
|
93
|
-
return pattern;},createMovieClip:function(target_mc,instance_name,depth){var qr_mc=target_mc.createEmptyMovieClip(instance_name,depth);var cs=1;this.make();for(var row=0;row<this.modules.length;row++){var y=row*cs;for(var col=0;col<this.modules[row].length;col++){var x=col*cs;var dark=this.modules[row][col];if(dark){qr_mc.beginFill(0,100);qr_mc.moveTo(x,y);qr_mc.lineTo(x+cs,y);qr_mc.lineTo(x+cs,y+cs);qr_mc.lineTo(x,y+cs);qr_mc.endFill();}}}
|
|
94
|
-
return qr_mc;},setupTimingPattern:function(){for(var r=8;r<this.moduleCount-8;r++){if(this.modules[r][6]!=null){continue;}
|
|
95
|
-
this.modules[r][6]=(r%2==0);}
|
|
96
|
-
for(var c=8;c<this.moduleCount-8;c++){if(this.modules[6][c]!=null){continue;}
|
|
97
|
-
this.modules[6][c]=(c%2==0);}},setupPositionAdjustPattern:function(){var pos=QRUtil.getPatternPosition(this.typeNumber);for(var i=0;i<pos.length;i++){for(var j=0;j<pos.length;j++){var row=pos[i];var col=pos[j];if(this.modules[row][col]!=null){continue;}
|
|
98
|
-
for(var r=-2;r<=2;r++){for(var c=-2;c<=2;c++){if(r==-2||r==2||c==-2||c==2||(r==0&&c==0)){this.modules[row+r][col+c]=true;}else{this.modules[row+r][col+c]=false;}}}}}},setupTypeNumber:function(test){var bits=QRUtil.getBCHTypeNumber(this.typeNumber);for(var i=0;i<18;i++){var mod=(!test&&((bits>>i)&1)==1);this.modules[Math.floor(i/3)][i%3+this.moduleCount-8-3]=mod;}
|
|
99
|
-
for(var i=0;i<18;i++){var mod=(!test&&((bits>>i)&1)==1);this.modules[i%3+this.moduleCount-8-3][Math.floor(i/3)]=mod;}},setupTypeInfo:function(test,maskPattern){var data=(this.errorCorrectLevel<<3)|maskPattern;var bits=QRUtil.getBCHTypeInfo(data);for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<6){this.modules[i][8]=mod;}else if(i<8){this.modules[i+1][8]=mod;}else{this.modules[this.moduleCount-15+i][8]=mod;}}
|
|
100
|
-
for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<8){this.modules[8][this.moduleCount-i-1]=mod;}else if(i<9){this.modules[8][15-i-1+1]=mod;}else{this.modules[8][15-i-1]=mod;}}
|
|
101
|
-
this.modules[this.moduleCount-8][8]=(!test);},mapData:function(data,maskPattern){var inc=-1;var row=this.moduleCount-1;var bitIndex=7;var byteIndex=0;for(var col=this.moduleCount-1;col>0;col-=2){if(col==6)col--;while(true){for(var c=0;c<2;c++){if(this.modules[row][col-c]==null){var dark=false;if(byteIndex<data.length){dark=(((data[byteIndex]>>>bitIndex)&1)==1);}
|
|
102
|
-
var mask=QRUtil.getMask(maskPattern,row,col-c);if(mask){dark=!dark;}
|
|
103
|
-
this.modules[row][col-c]=dark;bitIndex--;if(bitIndex==-1){byteIndex++;bitIndex=7;}}}
|
|
104
|
-
row+=inc;if(row<0||this.moduleCount<=row){row-=inc;inc=-inc;break;}}}}};QRCodeModel.PAD0=0xEC;QRCodeModel.PAD1=0x11;QRCodeModel.createData=function(typeNumber,errorCorrectLevel,dataList){var rsBlocks=QRRSBlock.getRSBlocks(typeNumber,errorCorrectLevel);var buffer=new QRBitBuffer();for(var i=0;i<dataList.length;i++){var data=dataList[i];buffer.put(data.mode,4);buffer.put(data.getLength(),QRUtil.getLengthInBits(data.mode,typeNumber));data.write(buffer);}
|
|
105
|
-
var totalDataCount=0;for(var i=0;i<rsBlocks.length;i++){totalDataCount+=rsBlocks[i].dataCount;}
|
|
106
|
-
if(buffer.getLengthInBits()>totalDataCount*8){throw new Error("code length overflow. ("
|
|
107
|
-
+buffer.getLengthInBits()
|
|
108
|
-
+">"
|
|
109
|
-
+totalDataCount*8
|
|
110
|
-
+")");}
|
|
111
|
-
if(buffer.getLengthInBits()+4<=totalDataCount*8){buffer.put(0,4);}
|
|
112
|
-
while(buffer.getLengthInBits()%8!=0){buffer.putBit(false);}
|
|
113
|
-
while(true){if(buffer.getLengthInBits()>=totalDataCount*8){break;}
|
|
114
|
-
buffer.put(QRCodeModel.PAD0,8);if(buffer.getLengthInBits()>=totalDataCount*8){break;}
|
|
115
|
-
buffer.put(QRCodeModel.PAD1,8);}
|
|
116
|
-
return QRCodeModel.createBytes(buffer,rsBlocks);};QRCodeModel.createBytes=function(buffer,rsBlocks){var offset=0;var maxDcCount=0;var maxEcCount=0;var dcdata=new Array(rsBlocks.length);var ecdata=new Array(rsBlocks.length);for(var r=0;r<rsBlocks.length;r++){var dcCount=rsBlocks[r].dataCount;var ecCount=rsBlocks[r].totalCount-dcCount;maxDcCount=Math.max(maxDcCount,dcCount);maxEcCount=Math.max(maxEcCount,ecCount);dcdata[r]=new Array(dcCount);for(var i=0;i<dcdata[r].length;i++){dcdata[r][i]=0xff&buffer.buffer[i+offset];}
|
|
117
|
-
offset+=dcCount;var rsPoly=QRUtil.getErrorCorrectPolynomial(ecCount);var rawPoly=new QRPolynomial(dcdata[r],rsPoly.getLength()-1);var modPoly=rawPoly.mod(rsPoly);ecdata[r]=new Array(rsPoly.getLength()-1);for(var i=0;i<ecdata[r].length;i++){var modIndex=i+modPoly.getLength()-ecdata[r].length;ecdata[r][i]=(modIndex>=0)?modPoly.get(modIndex):0;}}
|
|
118
|
-
var totalCodeCount=0;for(var i=0;i<rsBlocks.length;i++){totalCodeCount+=rsBlocks[i].totalCount;}
|
|
119
|
-
var data=new Array(totalCodeCount);var index=0;for(var i=0;i<maxDcCount;i++){for(var r=0;r<rsBlocks.length;r++){if(i<dcdata[r].length){data[index++]=dcdata[r][i];}}}
|
|
120
|
-
for(var i=0;i<maxEcCount;i++){for(var r=0;r<rsBlocks.length;r++){if(i<ecdata[r].length){data[index++]=ecdata[r][i];}}}
|
|
121
|
-
return data;};var QRMode={MODE_NUMBER:1<<0,MODE_ALPHA_NUM:1<<1,MODE_8BIT_BYTE:1<<2,MODE_KANJI:1<<3};var QRErrorCorrectLevel={L:1,M:0,Q:3,H:2};var QRMaskPattern={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7};var QRUtil={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:(1<<10)|(1<<8)|(1<<5)|(1<<4)|(1<<2)|(1<<1)|(1<<0),G18:(1<<12)|(1<<11)|(1<<10)|(1<<9)|(1<<8)|(1<<5)|(1<<2)|(1<<0),G15_MASK:(1<<14)|(1<<12)|(1<<10)|(1<<4)|(1<<1),getBCHTypeInfo:function(data){var d=data<<10;while(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G15)>=0){d^=(QRUtil.G15<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G15)));}
|
|
122
|
-
return((data<<10)|d)^QRUtil.G15_MASK;},getBCHTypeNumber:function(data){var d=data<<12;while(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)>=0){d^=(QRUtil.G18<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)));}
|
|
123
|
-
return(data<<12)|d;},getBCHDigit:function(data){var digit=0;while(data!=0){digit++;data>>>=1;}
|
|
124
|
-
return digit;},getPatternPosition:function(typeNumber){return QRUtil.PATTERN_POSITION_TABLE[typeNumber-1];},getMask:function(maskPattern,i,j){switch(maskPattern){case QRMaskPattern.PATTERN000:return(i+j)%2==0;case QRMaskPattern.PATTERN001:return i%2==0;case QRMaskPattern.PATTERN010:return j%3==0;case QRMaskPattern.PATTERN011:return(i+j)%3==0;case QRMaskPattern.PATTERN100:return(Math.floor(i/2)+Math.floor(j/3))%2==0;case QRMaskPattern.PATTERN101:return(i*j)%2+(i*j)%3==0;case QRMaskPattern.PATTERN110:return((i*j)%2+(i*j)%3)%2==0;case QRMaskPattern.PATTERN111:return((i*j)%3+(i+j)%2)%2==0;default:throw new Error("bad maskPattern:"+maskPattern);}},getErrorCorrectPolynomial:function(errorCorrectLength){var a=new QRPolynomial([1],0);for(var i=0;i<errorCorrectLength;i++){a=a.multiply(new QRPolynomial([1,QRMath.gexp(i)],0));}
|
|
125
|
-
return a;},getLengthInBits:function(mode,type){if(1<=type&&type<10){switch(mode){case QRMode.MODE_NUMBER:return 10;case QRMode.MODE_ALPHA_NUM:return 9;case QRMode.MODE_8BIT_BYTE:return 8;case QRMode.MODE_KANJI:return 8;default:throw new Error("mode:"+mode);}}else if(type<27){switch(mode){case QRMode.MODE_NUMBER:return 12;case QRMode.MODE_ALPHA_NUM:return 11;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 10;default:throw new Error("mode:"+mode);}}else if(type<41){switch(mode){case QRMode.MODE_NUMBER:return 14;case QRMode.MODE_ALPHA_NUM:return 13;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 12;default:throw new Error("mode:"+mode);}}else{throw new Error("type:"+type);}},getLostPoint:function(qrCode){var moduleCount=qrCode.getModuleCount();var lostPoint=0;for(var row=0;row<moduleCount;row++){for(var col=0;col<moduleCount;col++){var sameCount=0;var dark=qrCode.isDark(row,col);for(var r=-1;r<=1;r++){if(row+r<0||moduleCount<=row+r){continue;}
|
|
126
|
-
for(var c=-1;c<=1;c++){if(col+c<0||moduleCount<=col+c){continue;}
|
|
127
|
-
if(r==0&&c==0){continue;}
|
|
128
|
-
if(dark==qrCode.isDark(row+r,col+c)){sameCount++;}}}
|
|
129
|
-
if(sameCount>5){lostPoint+=(3+sameCount-5);}}}
|
|
130
|
-
for(var row=0;row<moduleCount-1;row++){for(var col=0;col<moduleCount-1;col++){var count=0;if(qrCode.isDark(row,col))count++;if(qrCode.isDark(row+1,col))count++;if(qrCode.isDark(row,col+1))count++;if(qrCode.isDark(row+1,col+1))count++;if(count==0||count==4){lostPoint+=3;}}}
|
|
131
|
-
for(var row=0;row<moduleCount;row++){for(var col=0;col<moduleCount-6;col++){if(qrCode.isDark(row,col)&&!qrCode.isDark(row,col+1)&&qrCode.isDark(row,col+2)&&qrCode.isDark(row,col+3)&&qrCode.isDark(row,col+4)&&!qrCode.isDark(row,col+5)&&qrCode.isDark(row,col+6)){lostPoint+=40;}}}
|
|
132
|
-
for(var col=0;col<moduleCount;col++){for(var row=0;row<moduleCount-6;row++){if(qrCode.isDark(row,col)&&!qrCode.isDark(row+1,col)&&qrCode.isDark(row+2,col)&&qrCode.isDark(row+3,col)&&qrCode.isDark(row+4,col)&&!qrCode.isDark(row+5,col)&&qrCode.isDark(row+6,col)){lostPoint+=40;}}}
|
|
133
|
-
var darkCount=0;for(var col=0;col<moduleCount;col++){for(var row=0;row<moduleCount;row++){if(qrCode.isDark(row,col)){darkCount++;}}}
|
|
134
|
-
var ratio=Math.abs(100*darkCount/moduleCount/moduleCount-50)/5;lostPoint+=ratio*10;return lostPoint;}};var QRMath={glog:function(n){if(n<1){throw new Error("glog("+n+")");}
|
|
135
|
-
return QRMath.LOG_TABLE[n];},gexp:function(n){while(n<0){n+=255;}
|
|
136
|
-
while(n>=256){n-=255;}
|
|
137
|
-
return QRMath.EXP_TABLE[n];},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)};for(var i=0;i<8;i++){QRMath.EXP_TABLE[i]=1<<i;}
|
|
138
|
-
for(var i=8;i<256;i++){QRMath.EXP_TABLE[i]=QRMath.EXP_TABLE[i-4]^QRMath.EXP_TABLE[i-5]^QRMath.EXP_TABLE[i-6]^QRMath.EXP_TABLE[i-8];}
|
|
139
|
-
for(var i=0;i<255;i++){QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]]=i;}
|
|
140
|
-
function QRPolynomial(num,shift){if(num.length==undefined){throw new Error(num.length+"/"+shift);}
|
|
141
|
-
var offset=0;while(offset<num.length&&num[offset]==0){offset++;}
|
|
142
|
-
this.num=new Array(num.length-offset+shift);for(var i=0;i<num.length-offset;i++){this.num[i]=num[i+offset];}}
|
|
143
|
-
QRPolynomial.prototype={get:function(index){return this.num[index];},getLength:function(){return this.num.length;},multiply:function(e){var num=new Array(this.getLength()+e.getLength()-1);for(var i=0;i<this.getLength();i++){for(var j=0;j<e.getLength();j++){num[i+j]^=QRMath.gexp(QRMath.glog(this.get(i))+QRMath.glog(e.get(j)));}}
|
|
144
|
-
return new QRPolynomial(num,0);},mod:function(e){if(this.getLength()-e.getLength()<0){return this;}
|
|
145
|
-
var ratio=QRMath.glog(this.get(0))-QRMath.glog(e.get(0));var num=new Array(this.getLength());for(var i=0;i<this.getLength();i++){num[i]=this.get(i);}
|
|
146
|
-
for(var i=0;i<e.getLength();i++){num[i]^=QRMath.gexp(QRMath.glog(e.get(i))+ratio);}
|
|
147
|
-
return new QRPolynomial(num,0).mod(e);}};function QRRSBlock(totalCount,dataCount){this.totalCount=totalCount;this.dataCount=dataCount;}
|
|
148
|
-
QRRSBlock.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]];QRRSBlock.getRSBlocks=function(typeNumber,errorCorrectLevel){var rsBlock=QRRSBlock.getRsBlockTable(typeNumber,errorCorrectLevel);if(rsBlock==undefined){throw new Error("bad rs block @ typeNumber:"+typeNumber+"/errorCorrectLevel:"+errorCorrectLevel);}
|
|
149
|
-
var length=rsBlock.length/3;var list=[];for(var i=0;i<length;i++){var count=rsBlock[i*3+0];var totalCount=rsBlock[i*3+1];var dataCount=rsBlock[i*3+2];for(var j=0;j<count;j++){list.push(new QRRSBlock(totalCount,dataCount));}}
|
|
150
|
-
return list;};QRRSBlock.getRsBlockTable=function(typeNumber,errorCorrectLevel){switch(errorCorrectLevel){case QRErrorCorrectLevel.L:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+0];case QRErrorCorrectLevel.M:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+1];case QRErrorCorrectLevel.Q:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+2];case QRErrorCorrectLevel.H:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+3];default:return undefined;}};function QRBitBuffer(){this.buffer=[];this.length=0;}
|
|
151
|
-
QRBitBuffer.prototype={get:function(index){var bufIndex=Math.floor(index/8);return((this.buffer[bufIndex]>>>(7-index%8))&1)==1;},put:function(num,length){for(var i=0;i<length;i++){this.putBit(((num>>>(length-i-1))&1)==1);}},getLengthInBits:function(){return this.length;},putBit:function(bit){var bufIndex=Math.floor(this.length/8);if(this.buffer.length<=bufIndex){this.buffer.push(0);}
|
|
152
|
-
if(bit){this.buffer[bufIndex]|=(0x80>>>(this.length%8));}
|
|
153
|
-
this.length++;}};var QRCodeLimitLength=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]];
|
|
154
|
-
|
|
155
|
-
function _isSupportCanvas() {
|
|
156
|
-
return typeof CanvasRenderingContext2D != "undefined";
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
// android 2.x doesn't support Data-URI spec
|
|
160
|
-
function _getAndroid() {
|
|
161
|
-
var android = false;
|
|
162
|
-
var sAgent = navigator.userAgent;
|
|
163
|
-
|
|
164
|
-
if (/android/i.test(sAgent)) { // android
|
|
165
|
-
android = true;
|
|
166
|
-
var aMat = sAgent.toString().match(/android ([0-9]\.[0-9])/i);
|
|
167
|
-
|
|
168
|
-
if (aMat && aMat[1]) {
|
|
169
|
-
android = parseFloat(aMat[1]);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
return android;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
var svgDrawer = (function() {
|
|
177
|
-
|
|
178
|
-
var Drawing = function (el, htOption) {
|
|
179
|
-
this._el = el;
|
|
180
|
-
this._htOption = htOption;
|
|
181
|
-
};
|
|
182
|
-
|
|
183
|
-
Drawing.prototype.draw = function (oQRCode) {
|
|
184
|
-
var _htOption = this._htOption;
|
|
185
|
-
var _el = this._el;
|
|
186
|
-
var nCount = oQRCode.getModuleCount();
|
|
187
|
-
var nWidth = Math.floor(_htOption.width / nCount);
|
|
188
|
-
var nHeight = Math.floor(_htOption.height / nCount);
|
|
189
|
-
|
|
190
|
-
this.clear();
|
|
191
|
-
|
|
192
|
-
function makeSVG(tag, attrs) {
|
|
193
|
-
var el = document.createElementNS('http://www.w3.org/2000/svg', tag);
|
|
194
|
-
for (var k in attrs)
|
|
195
|
-
if (attrs.hasOwnProperty(k)) el.setAttribute(k, attrs[k]);
|
|
196
|
-
return el;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
var svg = makeSVG("svg" , {'viewBox': '0 0 ' + String(nCount) + " " + String(nCount), 'width': '100%', 'height': '100%', 'fill': _htOption.colorLight});
|
|
200
|
-
svg.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xlink", "http://www.w3.org/1999/xlink");
|
|
201
|
-
_el.appendChild(svg);
|
|
202
|
-
|
|
203
|
-
svg.appendChild(makeSVG("rect", {"fill": _htOption.colorLight, "width": "100%", "height": "100%"}));
|
|
204
|
-
svg.appendChild(makeSVG("rect", {"fill": _htOption.colorDark, "width": "1", "height": "1", "id": "template"}));
|
|
205
|
-
|
|
206
|
-
for (var row = 0; row < nCount; row++) {
|
|
207
|
-
for (var col = 0; col < nCount; col++) {
|
|
208
|
-
if (oQRCode.isDark(row, col)) {
|
|
209
|
-
var child = makeSVG("use", {"x": String(col), "y": String(row)});
|
|
210
|
-
child.setAttributeNS("http://www.w3.org/1999/xlink", "href", "#template")
|
|
211
|
-
svg.appendChild(child);
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
};
|
|
216
|
-
Drawing.prototype.clear = function () {
|
|
217
|
-
while (this._el.hasChildNodes())
|
|
218
|
-
this._el.removeChild(this._el.lastChild);
|
|
219
|
-
};
|
|
220
|
-
return Drawing;
|
|
221
|
-
})(window);
|
|
222
|
-
|
|
223
|
-
var useSVG = document.documentElement.tagName.toLowerCase() === "svg";
|
|
224
|
-
|
|
225
|
-
// Drawing in DOM by using Table tag
|
|
226
|
-
var Drawing = useSVG ? svgDrawer : !_isSupportCanvas() ? (function () {
|
|
227
|
-
var Drawing = function (el, htOption) {
|
|
228
|
-
this._el = el;
|
|
229
|
-
this._htOption = htOption;
|
|
230
|
-
};
|
|
231
|
-
|
|
232
|
-
/**
|
|
233
|
-
* Draw the QRCode
|
|
234
|
-
*
|
|
235
|
-
* @param {QRCode} oQRCode
|
|
236
|
-
*/
|
|
237
|
-
Drawing.prototype.draw = function (oQRCode) {
|
|
238
|
-
var _htOption = this._htOption;
|
|
239
|
-
var _el = this._el;
|
|
240
|
-
var nCount = oQRCode.getModuleCount();
|
|
241
|
-
var nWidth = Math.floor(_htOption.width / nCount);
|
|
242
|
-
var nHeight = Math.floor(_htOption.height / nCount);
|
|
243
|
-
var aHTML = ['<table style="border:0;border-collapse:collapse;">'];
|
|
244
|
-
|
|
245
|
-
for (var row = 0; row < nCount; row++) {
|
|
246
|
-
aHTML.push('<tr>');
|
|
247
|
-
|
|
248
|
-
for (var col = 0; col < nCount; col++) {
|
|
249
|
-
aHTML.push('<td style="border:0;border-collapse:collapse;padding:0;margin:0;width:' + nWidth + 'px;height:' + nHeight + 'px;background-color:' + (oQRCode.isDark(row, col) ? _htOption.colorDark : _htOption.colorLight) + ';"></td>');
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
aHTML.push('</tr>');
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
aHTML.push('</table>');
|
|
256
|
-
_el.innerHTML = aHTML.join('');
|
|
257
|
-
|
|
258
|
-
// Fix the margin values as real size.
|
|
259
|
-
var elTable = _el.childNodes[0];
|
|
260
|
-
var nLeftMarginTable = (_htOption.width - elTable.offsetWidth) / 2;
|
|
261
|
-
var nTopMarginTable = (_htOption.height - elTable.offsetHeight) / 2;
|
|
262
|
-
|
|
263
|
-
if (nLeftMarginTable > 0 && nTopMarginTable > 0) {
|
|
264
|
-
elTable.style.margin = nTopMarginTable + "px " + nLeftMarginTable + "px";
|
|
265
|
-
}
|
|
266
|
-
};
|
|
267
|
-
|
|
268
|
-
/**
|
|
269
|
-
* Clear the QRCode
|
|
270
|
-
*/
|
|
271
|
-
Drawing.prototype.clear = function () {
|
|
272
|
-
this._el.innerHTML = '';
|
|
273
|
-
};
|
|
274
|
-
|
|
275
|
-
return Drawing;
|
|
276
|
-
})(window) : (function () { // Drawing in Canvas
|
|
277
|
-
function _onMakeImage() {
|
|
278
|
-
this._elImage.src = this._elCanvas.toDataURL("image/png");
|
|
279
|
-
this._elImage.style.display = "block";
|
|
280
|
-
this._elCanvas.style.display = "none";
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
// Android 2.1 bug workaround
|
|
284
|
-
// http://code.google.com/p/android/issues/detail?id=5141
|
|
285
|
-
if (this && this._android && this._android <= 2.1) {
|
|
286
|
-
var factor = 1 / window.devicePixelRatio;
|
|
287
|
-
var drawImage = CanvasRenderingContext2D.prototype.drawImage;
|
|
288
|
-
CanvasRenderingContext2D.prototype.drawImage = function (image, sx, sy, sw, sh, dx, dy, dw, dh) {
|
|
289
|
-
if (("nodeName" in image) && /img/i.test(image.nodeName)) {
|
|
290
|
-
for (var i = arguments.length - 1; i >= 1; i--) {
|
|
291
|
-
arguments[i] = arguments[i] * factor;
|
|
292
|
-
}
|
|
293
|
-
} else if (typeof dw == "undefined") {
|
|
294
|
-
arguments[1] *= factor;
|
|
295
|
-
arguments[2] *= factor;
|
|
296
|
-
arguments[3] *= factor;
|
|
297
|
-
arguments[4] *= factor;
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
drawImage.apply(this, arguments);
|
|
301
|
-
};
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
/**
|
|
305
|
-
* Check whether the user's browser supports Data URI or not
|
|
306
|
-
*
|
|
307
|
-
* @private
|
|
308
|
-
* @param {Function} fSuccess Occurs if it supports Data URI
|
|
309
|
-
* @param {Function} fFail Occurs if it doesn't support Data URI
|
|
310
|
-
*/
|
|
311
|
-
function _safeSetDataURI(fSuccess, fFail) {
|
|
312
|
-
var self = this;
|
|
313
|
-
self._fFail = fFail;
|
|
314
|
-
self._fSuccess = fSuccess;
|
|
315
|
-
|
|
316
|
-
// Check it just once
|
|
317
|
-
if (self._bSupportDataURI === null) {
|
|
318
|
-
var el = document.createElement("img");
|
|
319
|
-
var fOnError = function() {
|
|
320
|
-
self._bSupportDataURI = false;
|
|
321
|
-
|
|
322
|
-
if (self._fFail) {
|
|
323
|
-
self._fFail.call(self);
|
|
324
|
-
}
|
|
325
|
-
};
|
|
326
|
-
var fOnSuccess = function() {
|
|
327
|
-
self._bSupportDataURI = true;
|
|
328
|
-
|
|
329
|
-
if (self._fSuccess) {
|
|
330
|
-
self._fSuccess.call(self);
|
|
331
|
-
}
|
|
332
|
-
};
|
|
333
|
-
|
|
334
|
-
el.onabort = fOnError;
|
|
335
|
-
el.onerror = fOnError;
|
|
336
|
-
el.onload = fOnSuccess;
|
|
337
|
-
el.src = "data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="; // the Image contains 1px data.
|
|
338
|
-
return;
|
|
339
|
-
} else if (self._bSupportDataURI === true && self._fSuccess) {
|
|
340
|
-
self._fSuccess.call(self);
|
|
341
|
-
} else if (self._bSupportDataURI === false && self._fFail) {
|
|
342
|
-
self._fFail.call(self);
|
|
343
|
-
}
|
|
344
|
-
};
|
|
345
|
-
|
|
346
|
-
/**
|
|
347
|
-
* Drawing QRCode by using canvas
|
|
348
|
-
*
|
|
349
|
-
* @constructor
|
|
350
|
-
* @param {HTMLElement} el
|
|
351
|
-
* @param {Object} htOption QRCode Options
|
|
352
|
-
*/
|
|
353
|
-
var Drawing = function (el, htOption) {
|
|
354
|
-
this._bIsPainted = false;
|
|
355
|
-
this._android = _getAndroid();
|
|
356
|
-
|
|
357
|
-
this._htOption = htOption;
|
|
358
|
-
this._elCanvas = document.createElement("canvas");
|
|
359
|
-
this._elCanvas.width = htOption.width;
|
|
360
|
-
this._elCanvas.height = htOption.height;
|
|
361
|
-
el.appendChild(this._elCanvas);
|
|
362
|
-
this._el = el;
|
|
363
|
-
this._oContext = this._elCanvas.getContext("2d");
|
|
364
|
-
this._bIsPainted = false;
|
|
365
|
-
this._elImage = document.createElement("img");
|
|
366
|
-
this._elImage.alt = "Scan me!";
|
|
367
|
-
this._elImage.style.display = "none";
|
|
368
|
-
this._el.appendChild(this._elImage);
|
|
369
|
-
this._bSupportDataURI = null;
|
|
370
|
-
};
|
|
371
|
-
|
|
372
|
-
/**
|
|
373
|
-
* Draw the QRCode
|
|
374
|
-
*
|
|
375
|
-
* @param {QRCode} oQRCode
|
|
376
|
-
*/
|
|
377
|
-
Drawing.prototype.draw = function (oQRCode) {
|
|
378
|
-
var _elImage = this._elImage;
|
|
379
|
-
var _oContext = this._oContext;
|
|
380
|
-
var _htOption = this._htOption;
|
|
381
|
-
|
|
382
|
-
var nCount = oQRCode.getModuleCount();
|
|
383
|
-
var nWidth = _htOption.width / nCount;
|
|
384
|
-
var nHeight = _htOption.height / nCount;
|
|
385
|
-
var nRoundedWidth = Math.round(nWidth);
|
|
386
|
-
var nRoundedHeight = Math.round(nHeight);
|
|
387
|
-
|
|
388
|
-
_elImage.style.display = "none";
|
|
389
|
-
this.clear();
|
|
390
|
-
|
|
391
|
-
for (var row = 0; row < nCount; row++) {
|
|
392
|
-
for (var col = 0; col < nCount; col++) {
|
|
393
|
-
var bIsDark = oQRCode.isDark(row, col);
|
|
394
|
-
var nLeft = col * nWidth;
|
|
395
|
-
var nTop = row * nHeight;
|
|
396
|
-
_oContext.strokeStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight;
|
|
397
|
-
_oContext.lineWidth = 1;
|
|
398
|
-
_oContext.fillStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight;
|
|
399
|
-
_oContext.fillRect(nLeft, nTop, nWidth, nHeight);
|
|
400
|
-
|
|
401
|
-
// 안티 앨리어싱 방지 처리
|
|
402
|
-
_oContext.strokeRect(
|
|
403
|
-
Math.floor(nLeft) + 0.5,
|
|
404
|
-
Math.floor(nTop) + 0.5,
|
|
405
|
-
nRoundedWidth,
|
|
406
|
-
nRoundedHeight
|
|
407
|
-
);
|
|
408
|
-
|
|
409
|
-
_oContext.strokeRect(
|
|
410
|
-
Math.ceil(nLeft) - 0.5,
|
|
411
|
-
Math.ceil(nTop) - 0.5,
|
|
412
|
-
nRoundedWidth,
|
|
413
|
-
nRoundedHeight
|
|
414
|
-
);
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
this._bIsPainted = true;
|
|
419
|
-
};
|
|
420
|
-
|
|
421
|
-
/**
|
|
422
|
-
* Make the image from Canvas if the browser supports Data URI.
|
|
423
|
-
*/
|
|
424
|
-
Drawing.prototype.makeImage = function () {
|
|
425
|
-
if (this._bIsPainted) {
|
|
426
|
-
_safeSetDataURI.call(this, _onMakeImage);
|
|
427
|
-
}
|
|
428
|
-
};
|
|
429
|
-
|
|
430
|
-
/**
|
|
431
|
-
* Return whether the QRCode is painted or not
|
|
432
|
-
*
|
|
433
|
-
* @return {Boolean}
|
|
434
|
-
*/
|
|
435
|
-
Drawing.prototype.isPainted = function () {
|
|
436
|
-
return this._bIsPainted;
|
|
437
|
-
};
|
|
438
|
-
|
|
439
|
-
/**
|
|
440
|
-
* Clear the QRCode
|
|
441
|
-
*/
|
|
442
|
-
Drawing.prototype.clear = function () {
|
|
443
|
-
this._oContext.clearRect(0, 0, this._elCanvas.width, this._elCanvas.height);
|
|
444
|
-
this._bIsPainted = false;
|
|
445
|
-
};
|
|
446
|
-
|
|
447
|
-
/**
|
|
448
|
-
* @private
|
|
449
|
-
* @param {Number} nNumber
|
|
450
|
-
*/
|
|
451
|
-
Drawing.prototype.round = function (nNumber) {
|
|
452
|
-
if (!nNumber) {
|
|
453
|
-
return nNumber;
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
return Math.floor(nNumber * 1000) / 1000;
|
|
457
|
-
};
|
|
458
|
-
|
|
459
|
-
return Drawing;
|
|
460
|
-
})(window);
|
|
461
|
-
|
|
462
|
-
/**
|
|
463
|
-
* Get the type by string length
|
|
464
|
-
*
|
|
465
|
-
* @private
|
|
466
|
-
* @param {String} sText
|
|
467
|
-
* @param {Number} nCorrectLevel
|
|
468
|
-
* @return {Number} type
|
|
469
|
-
*/
|
|
470
|
-
function _getTypeNumber(sText, nCorrectLevel) {
|
|
471
|
-
var nType = 1;
|
|
472
|
-
var length = _getUTF8Length(sText);
|
|
473
|
-
|
|
474
|
-
for (var i = 0, len = QRCodeLimitLength.length; i <= len; i++) {
|
|
475
|
-
var nLimit = 0;
|
|
476
|
-
|
|
477
|
-
switch (nCorrectLevel) {
|
|
478
|
-
case QRErrorCorrectLevel.L :
|
|
479
|
-
nLimit = QRCodeLimitLength[i][0];
|
|
480
|
-
break;
|
|
481
|
-
case QRErrorCorrectLevel.M :
|
|
482
|
-
nLimit = QRCodeLimitLength[i][1];
|
|
483
|
-
break;
|
|
484
|
-
case QRErrorCorrectLevel.Q :
|
|
485
|
-
nLimit = QRCodeLimitLength[i][2];
|
|
486
|
-
break;
|
|
487
|
-
case QRErrorCorrectLevel.H :
|
|
488
|
-
nLimit = QRCodeLimitLength[i][3];
|
|
489
|
-
break;
|
|
490
|
-
}
|
|
491
|
-
|
|
492
|
-
if (length <= nLimit) {
|
|
493
|
-
break;
|
|
494
|
-
} else {
|
|
495
|
-
nType++;
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
|
-
|
|
499
|
-
if (nType > QRCodeLimitLength.length) {
|
|
500
|
-
throw new Error("Too long data");
|
|
501
|
-
}
|
|
502
|
-
|
|
503
|
-
return nType;
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
function _getUTF8Length(sText) {
|
|
507
|
-
var replacedText = encodeURI(sText).toString().replace(/\%[0-9a-fA-F]{2}/g, 'a');
|
|
508
|
-
return replacedText.length + (replacedText.length != sText ? 3 : 0);
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
/**
|
|
512
|
-
* @class QRCode
|
|
513
|
-
* @constructor
|
|
514
|
-
* @example
|
|
515
|
-
* new QRCode(document.getElementById("test"), "http://jindo.dev.naver.com/collie");
|
|
516
|
-
*
|
|
517
|
-
* @example
|
|
518
|
-
* var oQRCode = new QRCode("test", {
|
|
519
|
-
* text : "http://naver.com",
|
|
520
|
-
* width : 128,
|
|
521
|
-
* height : 128
|
|
522
|
-
* });
|
|
523
|
-
*
|
|
524
|
-
* oQRCode.clear(); // Clear the QRCode.
|
|
525
|
-
* oQRCode.makeCode("http://map.naver.com"); // Re-create the QRCode.
|
|
526
|
-
*
|
|
527
|
-
* @param {HTMLElement|String} el target element or 'id' attribute of element.
|
|
528
|
-
* @param {Object|String} vOption
|
|
529
|
-
* @param {String} vOption.text QRCode link data
|
|
530
|
-
* @param {Number} [vOption.width=256]
|
|
531
|
-
* @param {Number} [vOption.height=256]
|
|
532
|
-
* @param {String} [vOption.colorDark="#000000"]
|
|
533
|
-
* @param {String} [vOption.colorLight="#ffffff"]
|
|
534
|
-
* @param {QRCode.CorrectLevel} [vOption.correctLevel=QRCode.CorrectLevel.H] [L|M|Q|H]
|
|
535
|
-
*/
|
|
536
|
-
var QRCode = function (el, vOption) {
|
|
537
|
-
this._htOption = {
|
|
538
|
-
width : 256,
|
|
539
|
-
height : 256,
|
|
540
|
-
typeNumber : 4,
|
|
541
|
-
colorDark : "#000000",
|
|
542
|
-
colorLight : "#ffffff",
|
|
543
|
-
correctLevel : QRErrorCorrectLevel.H
|
|
544
|
-
};
|
|
545
|
-
|
|
546
|
-
if (typeof vOption === 'string') {
|
|
547
|
-
vOption = {
|
|
548
|
-
text : vOption
|
|
549
|
-
};
|
|
550
|
-
}
|
|
551
|
-
|
|
552
|
-
// Overwrites options
|
|
553
|
-
if (vOption) {
|
|
554
|
-
for (var i in vOption) {
|
|
555
|
-
this._htOption[i] = vOption[i];
|
|
556
|
-
}
|
|
557
|
-
}
|
|
558
|
-
|
|
559
|
-
if (typeof el == "string") {
|
|
560
|
-
el = document.getElementById(el);
|
|
561
|
-
}
|
|
562
|
-
|
|
563
|
-
if (this._htOption.useSVG) {
|
|
564
|
-
Drawing = svgDrawer;
|
|
565
|
-
}
|
|
566
|
-
|
|
567
|
-
this._android = _getAndroid();
|
|
568
|
-
this._el = el;
|
|
569
|
-
this._oQRCode = null;
|
|
570
|
-
this._oDrawing = new Drawing(this._el, this._htOption);
|
|
571
|
-
|
|
572
|
-
if (this._htOption.text) {
|
|
573
|
-
this.makeCode(this._htOption.text);
|
|
574
|
-
}
|
|
575
|
-
};
|
|
576
|
-
|
|
577
|
-
/**
|
|
578
|
-
* Make the QRCode
|
|
579
|
-
*
|
|
580
|
-
* @param {String} sText link data
|
|
581
|
-
*/
|
|
582
|
-
QRCode.prototype.makeCode = function (sText) {
|
|
583
|
-
this._oQRCode = new QRCodeModel(_getTypeNumber(sText, this._htOption.correctLevel), this._htOption.correctLevel);
|
|
584
|
-
this._oQRCode.addData(sText);
|
|
585
|
-
this._oQRCode.make();
|
|
586
|
-
this._el.title = sText;
|
|
587
|
-
this._oDrawing.draw(this._oQRCode);
|
|
588
|
-
this.makeImage();
|
|
589
|
-
};
|
|
590
|
-
|
|
591
|
-
/**
|
|
592
|
-
* Make the Image from Canvas element
|
|
593
|
-
* - It occurs automatically
|
|
594
|
-
* - Android below 3 doesn't support Data-URI spec.
|
|
595
|
-
*
|
|
596
|
-
* @private
|
|
597
|
-
*/
|
|
598
|
-
QRCode.prototype.makeImage = function () {
|
|
599
|
-
if (typeof this._oDrawing.makeImage == "function" && (!this._android || this._android >= 3)) {
|
|
600
|
-
this._oDrawing.makeImage();
|
|
601
|
-
}
|
|
602
|
-
};
|
|
603
|
-
|
|
604
|
-
/**
|
|
605
|
-
* Clear the QRCode
|
|
606
|
-
*/
|
|
607
|
-
QRCode.prototype.clear = function () {
|
|
608
|
-
this._oDrawing.clear();
|
|
609
|
-
};
|
|
610
|
-
|
|
611
|
-
/**
|
|
612
|
-
* @name QRCode.CorrectLevel
|
|
613
|
-
*/
|
|
614
|
-
QRCode.CorrectLevel = QRErrorCorrectLevel;
|
|
615
|
-
|
|
616
|
-
window.QRCode = QRCode;
|
|
617
|
-
})(window);
|
|
1
|
+
import { Alphanumeric, Byte, Charset, Encoder, Hanzi, Kanji, Numeric } from '@nuintun/qrcode';
|
|
2
|
+
|
|
3
|
+
function hex2rgb (hex) {
|
|
4
|
+
const value = parseInt(hex.slice(1, 7), 16);
|
|
5
|
+
|
|
6
|
+
return [(value >> 16) & 0xff, (value >> 8) & 0xff, value & 0xff];
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
function getHints ({ fnc1, aimIndicator }) {
|
|
10
|
+
switch (fnc1) {
|
|
11
|
+
case 'GS1':
|
|
12
|
+
return { fnc1: ['GS1'] };
|
|
13
|
+
case 'AIM':
|
|
14
|
+
return { fnc1: ['AIM', +aimIndicator] };
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function chooseBestMode ({ mode, content, charset }) {
|
|
19
|
+
switch (mode) {
|
|
20
|
+
case 'Auto':
|
|
21
|
+
const NUMERIC_RE = /^\d+$/;
|
|
22
|
+
const ALPHANUMERIC_RE = /^[0-9A-Z$%*+-./: ]+$/;
|
|
23
|
+
|
|
24
|
+
if (NUMERIC_RE.test(content)) {
|
|
25
|
+
return new Numeric(content);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (ALPHANUMERIC_RE.test(content)) {
|
|
29
|
+
return new Alphanumeric(content);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const hanzi = new Hanzi(content);
|
|
33
|
+
|
|
34
|
+
try {
|
|
35
|
+
hanzi.encode();
|
|
36
|
+
|
|
37
|
+
return hanzi;
|
|
38
|
+
} catch {
|
|
39
|
+
// 跳过错误
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const kanji = new Kanji(content);
|
|
43
|
+
|
|
44
|
+
try {
|
|
45
|
+
kanji.encode();
|
|
46
|
+
|
|
47
|
+
return kanji;
|
|
48
|
+
} catch {
|
|
49
|
+
// 跳过错误
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return new Byte(content, Charset[charset]);
|
|
53
|
+
case 'Hanzi':
|
|
54
|
+
return new Hanzi(content);
|
|
55
|
+
case 'Kanji':
|
|
56
|
+
return new Kanji(content);
|
|
57
|
+
case 'Numeric':
|
|
58
|
+
return new Numeric(content);
|
|
59
|
+
case 'Alphanumeric':
|
|
60
|
+
return new Alphanumeric(content);
|
|
61
|
+
default:
|
|
62
|
+
return new Byte(content, Charset[charset]);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export default function (data) {
|
|
67
|
+
const { level, version } = data;
|
|
68
|
+
|
|
69
|
+
const encoder = new Encoder({
|
|
70
|
+
level,
|
|
71
|
+
version,
|
|
72
|
+
hints: getHints(data),
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
try {
|
|
76
|
+
const qrcode = encoder.encode(chooseBestMode(data));
|
|
77
|
+
const { moduleSize, quietZone, background, foreground } = data;
|
|
78
|
+
return qrcode.toDataURL(moduleSize, {
|
|
79
|
+
margin: quietZone,
|
|
80
|
+
background: hex2rgb(background),
|
|
81
|
+
foreground: hex2rgb(foreground),
|
|
82
|
+
});
|
|
83
|
+
} catch (error) {
|
|
84
|
+
return "";
|
|
85
|
+
}
|
|
86
|
+
}
|
package/package.json
CHANGED
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "yh-hiprint",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.0",
|
|
4
4
|
"description": "Hiprint for Vue3 by NoahLiu in ForceCon in Hunan Changesha",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"types": "index.d.ts",
|
|
7
7
|
"scripts": {
|
|
8
|
+
"start": "npm run pub:aliyun && npm run pub:npm",
|
|
8
9
|
"pub:aliyun": "npm publish --registry https://packages.aliyun.com/60765e0161a945067837bb5f/npm/npm-registry/ --no-git-checks",
|
|
9
10
|
"pub:npm": "npm publish --registry https://registry.npmjs.org/ --no-git-checks"
|
|
10
11
|
},
|
|
11
12
|
"dependencies": {
|
|
12
|
-
"
|
|
13
|
+
"@nuintun/qrcode": "^5.0.1",
|
|
14
|
+
"canvg": "4.0.1",
|
|
13
15
|
"html2canvas": "1.4.1",
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
+
"jspdf": "2.5.1",
|
|
17
|
+
"nzh": "1.0.9"
|
|
16
18
|
},
|
|
17
19
|
"peerDependencies": {
|
|
18
20
|
"vue": "^3.0.0"
|