@didaoktv/didaoui-uniapp 1.0.0 → 1.2.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.
Files changed (114) hide show
  1. package/README.md +16 -7
  2. package/components/dd-action-sheet/dd-action-sheet.vue +3 -3
  3. package/components/dd-album/album.js +19 -0
  4. package/components/dd-album/dd-album.vue +345 -0
  5. package/components/dd-album/props.js +89 -0
  6. package/components/dd-avatar/avatar.js +19 -0
  7. package/components/dd-avatar/dd-avatar.vue +172 -160
  8. package/components/dd-avatar/props.js +84 -0
  9. package/components/dd-avatar-group/avatarGroup.js +14 -0
  10. package/components/dd-avatar-group/dd-avatar-group.vue +110 -0
  11. package/components/dd-avatar-group/props.js +57 -0
  12. package/components/dd-badge/dd-badge.vue +2 -2
  13. package/components/dd-barcode/dd-barcode.vue +1030 -0
  14. package/components/dd-bill-detail/dd-bill-detail.vue +265 -0
  15. package/components/dd-button/dd-button.vue +17 -17
  16. package/components/dd-calendar/dd-calendar.vue +357 -0
  17. package/components/dd-canvas/dd-canvas.vue +1088 -0
  18. package/components/dd-capsule-button/dd-capsule-button.vue +6 -6
  19. package/components/dd-car-keyboard/carKeyboard.js +6 -0
  20. package/components/dd-car-keyboard/dd-car-keyboard.vue +315 -0
  21. package/components/dd-car-keyboard/props.js +19 -0
  22. package/components/dd-cascader/dd-cascader.vue +405 -0
  23. package/components/dd-cell/dd-cell.vue +50 -23
  24. package/components/dd-cell-group/dd-cell-group.vue +32 -25
  25. package/components/dd-champion-card/dd-champion-card.vue +4 -4
  26. package/components/dd-checkbox/dd-checkbox.vue +30 -39
  27. package/components/dd-checkbox-group/dd-checkbox-group.vue +67 -0
  28. package/components/dd-copy/dd-copy.vue +74 -0
  29. package/components/dd-coupon/dd-coupon.vue +368 -0
  30. package/components/dd-cropper/dd-cropper.vue +1297 -0
  31. package/components/dd-dialog/dd-dialog.vue +1 -1
  32. package/components/dd-divider/dd-divider.vue +3 -3
  33. package/components/dd-dropdown-item/dd-dropdown-item.vue +5 -5
  34. package/components/dd-empty-state/dd-empty-state.vue +1 -1
  35. package/components/dd-field/dd-field.vue +531 -106
  36. package/components/dd-form/dd-form.vue +116 -0
  37. package/components/dd-form/rules.ts +84 -0
  38. package/components/dd-goods-sku/dd-goods-sku.vue +434 -0
  39. package/components/dd-icon/dd-icon.vue +2 -2
  40. package/components/dd-image/dd-image.vue +4 -4
  41. package/components/dd-input/dd-input.vue +5 -5
  42. package/components/dd-keyboard/dd-keyboard.vue +178 -0
  43. package/components/dd-keyboard/keyboard.js +22 -0
  44. package/components/dd-keyboard/props.js +89 -0
  45. package/components/dd-link/dd-link.vue +87 -0
  46. package/components/dd-link/link.js +18 -0
  47. package/components/dd-link/props.js +44 -0
  48. package/components/dd-list-cell/dd-list-cell.vue +4 -4
  49. package/components/dd-loading/dd-loading.vue +1 -1
  50. package/components/dd-loadmore/dd-loadmore.vue +2 -2
  51. package/components/dd-markdown/dd-markdown.vue +344 -0
  52. package/components/dd-markdown/marked.esm.mjs +7 -0
  53. package/components/dd-mini-program-navbar/dd-mini-program-navbar.vue +9 -9
  54. package/components/dd-navigation/dd-navigation.vue +5 -5
  55. package/components/dd-number-keyboard/dd-number-keyboard.vue +200 -0
  56. package/components/dd-number-keyboard/numberKeyboard.js +8 -0
  57. package/components/dd-number-keyboard/props.js +24 -0
  58. package/components/dd-parse/dd-parse.vue +534 -0
  59. package/components/dd-parse/node/handler.wxs +26 -0
  60. package/components/dd-parse/node/node.vue +603 -0
  61. package/components/dd-parse/parse.js +13 -0
  62. package/components/dd-parse/parser.js +1400 -0
  63. package/components/dd-parse/props.js +57 -0
  64. package/components/dd-popover/dd-popover.vue +10 -10
  65. package/components/dd-popover-item/dd-popover-item.vue +3 -3
  66. package/components/dd-popup/dd-popup.vue +5 -5
  67. package/components/dd-poster/dd-poster.vue +695 -0
  68. package/components/dd-progress/dd-progress.vue +3 -3
  69. package/components/dd-pull-refresh/dd-pull-refresh.vue +3 -3
  70. package/components/dd-qrcode/dd-qrcode.vue +509 -0
  71. package/components/dd-qrcode/qrcode.js +1283 -0
  72. package/components/dd-radio/dd-radio.vue +19 -20
  73. package/components/dd-radio-group/dd-radio-group.vue +53 -0
  74. package/components/dd-rate/dd-rate.vue +1 -1
  75. package/components/dd-room-card/dd-room-card.vue +3 -3
  76. package/components/dd-search-bar/dd-search-bar.vue +8 -8
  77. package/components/dd-segmented-tab/dd-segmented-tab.vue +6 -6
  78. package/components/dd-signature/dd-signature.vue +513 -0
  79. package/components/dd-skeleton/dd-skeleton.vue +1 -1
  80. package/components/dd-slider/dd-slider.vue +4 -4
  81. package/components/dd-stat-card/dd-stat-card.vue +5 -5
  82. package/components/dd-step/dd-step.vue +11 -11
  83. package/components/dd-stepper/dd-stepper.vue +6 -6
  84. package/components/dd-swipe-action/dd-swipe-action.vue +1 -1
  85. package/components/dd-swipeable-tab/dd-swipeable-tab.vue +1 -1
  86. package/components/dd-tabbar-item/dd-tabbar-item.vue +8 -8
  87. package/components/dd-tag/dd-tag.vue +17 -1
  88. package/components/dd-text/dd-text.vue +250 -0
  89. package/components/dd-text/props.js +120 -0
  90. package/components/dd-text/text.js +30 -0
  91. package/components/dd-text/value.js +87 -0
  92. package/components/dd-toast/dd-toast.vue +2 -2
  93. package/components/dd-upload/dd-upload.vue +4 -4
  94. package/components/dd-workorder-card/dd-workorder-card.vue +237 -0
  95. package/index.ts +50 -9
  96. package/libs/config/color.js +16 -0
  97. package/libs/config/config.js +25 -0
  98. package/libs/config/props.js +185 -0
  99. package/libs/config/zIndex.js +20 -0
  100. package/libs/function/digit.js +167 -0
  101. package/libs/function/index.js +932 -0
  102. package/libs/function/test.js +327 -0
  103. package/libs/i18n/index.d.ts +2 -0
  104. package/libs/i18n/index.js +89 -0
  105. package/libs/i18n/locales/zh-Hans.js +86 -0
  106. package/libs/mixin/button.js +18 -0
  107. package/libs/mixin/mixin.js +44 -0
  108. package/libs/mixin/mpMixin.js +13 -0
  109. package/libs/mixin/openType.js +27 -0
  110. package/libs/utils.ts +462 -0
  111. package/libs/vue.js +3 -0
  112. package/package.json +1 -1
  113. package/scss/_dd-shared.scss +40 -0
  114. package/scss/_variables.scss +4 -1
@@ -0,0 +1,1283 @@
1
+ let QRCode = {};
2
+ (function () {
3
+ /**
4
+ * 获取单个字符的utf8编码
5
+ * unicode BMP平面约65535个字符
6
+ * @param {num} code
7
+ * return {array}
8
+ */
9
+ function unicodeFormat8(code) {
10
+ // 1 byte
11
+ var c0, c1, c2;
12
+ if (code < 128) {
13
+ return [code];
14
+ // 2 bytes
15
+ } else if (code < 2048) {
16
+ c0 = 192 + (code >> 6);
17
+ c1 = 128 + (code & 63);
18
+ return [c0, c1];
19
+ // 3 bytes
20
+ } else {
21
+
22
+ c0 = 224 + (code >> 12);
23
+ c1 = 128 + (code >> 6 & 63);
24
+ c2 = 128 + (code & 63);
25
+ return [c0, c1, c2];
26
+ }
27
+ }
28
+ /**
29
+ * 获取字符串的utf8编码字节串
30
+ * @param {string} string
31
+ * @return {array}
32
+ */
33
+ function getUTF8Bytes(string) {
34
+ var utf8codes = [];
35
+ for (var i = 0; i < string.length; i++) {
36
+ var code = string.charCodeAt(i);
37
+ var utf8 = unicodeFormat8(code);
38
+ for (var j = 0; j < utf8.length; j++) {
39
+ utf8codes.push(utf8[j]);
40
+ }
41
+ }
42
+ return utf8codes;
43
+ }
44
+ /**
45
+ * 二维码算法实现
46
+ * @param {string} data 要编码的信息字符串
47
+ * @param {num} errorCorrectLevel 纠错等级
48
+ */
49
+ function QRCodeAlg(data, errorCorrectLevel) {
50
+ this.typeNumber = -1; //版本
51
+ this.errorCorrectLevel = errorCorrectLevel;
52
+ this.modules = null; //二维矩阵,存放最终结果
53
+ this.moduleCount = 0; //矩阵大小
54
+ this.dataCache = null; //数据缓存
55
+ this.rsBlocks = null; //版本数据信息
56
+ this.totalDataCount = -1; //可使用的数据量
57
+ this.data = data;
58
+ this.utf8bytes = getUTF8Bytes(data);
59
+ this.make();
60
+ }
61
+ QRCodeAlg.prototype = {
62
+ constructor: QRCodeAlg,
63
+ /**
64
+ * 获取二维码矩阵大小
65
+ * @return {num} 矩阵大小
66
+ */
67
+ getModuleCount: function () {
68
+ return this.moduleCount;
69
+ },
70
+ /**
71
+ * 编码
72
+ */
73
+ make: function () {
74
+ this.getRightType();
75
+ this.dataCache = this.createData();
76
+ this.createQrcode();
77
+ },
78
+ /**
79
+ * 设置二位矩阵功能图形
80
+ * @param {bool} test 表示是否在寻找最好掩膜阶段
81
+ * @param {num} maskPattern 掩膜的版本
82
+ */
83
+ makeImpl: function (maskPattern) {
84
+ this.moduleCount = this.typeNumber * 4 + 17;
85
+ this.modules = new Array(this.moduleCount);
86
+ for (var row = 0; row < this.moduleCount; row++) {
87
+ this.modules[row] = new Array(this.moduleCount);
88
+ }
89
+ this.setupPositionProbePattern(0, 0);
90
+ this.setupPositionProbePattern(this.moduleCount - 7, 0);
91
+ this.setupPositionProbePattern(0, this.moduleCount - 7);
92
+ this.setupPositionAdjustPattern();
93
+ this.setupTimingPattern();
94
+ this.setupTypeInfo(true, maskPattern);
95
+ if (this.typeNumber >= 7) {
96
+ this.setupTypeNumber(true);
97
+ }
98
+ this.mapData(this.dataCache, maskPattern);
99
+ },
100
+ /**
101
+ * 设置二维码的位置探测图形
102
+ * @param {num} row 探测图形的中心横坐标
103
+ * @param {num} col 探测图形的中心纵坐标
104
+ */
105
+ setupPositionProbePattern: function (row, col) {
106
+ for (var r = -1; r <= 7; r++) {
107
+ if (row + r <= -1 || this.moduleCount <= row + r) continue;
108
+ for (var c = -1; c <= 7; c++) {
109
+ if (col + c <= -1 || this.moduleCount <= col + c) continue;
110
+ 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)) {
111
+ this.modules[row + r][col + c] = true;
112
+ } else {
113
+ this.modules[row + r][col + c] = false;
114
+ }
115
+ }
116
+ }
117
+ },
118
+ /**
119
+ * 创建二维码
120
+ * @return {[type]} [description]
121
+ */
122
+ createQrcode: function () {
123
+ var minLostPoint = 0;
124
+ var pattern = 0;
125
+ var bestModules = null;
126
+ for (var i = 0; i < 8; i++) {
127
+ this.makeImpl(i);
128
+ var lostPoint = QRUtil.getLostPoint(this);
129
+ if (i == 0 || minLostPoint > lostPoint) {
130
+ minLostPoint = lostPoint;
131
+ pattern = i;
132
+ bestModules = this.modules;
133
+ }
134
+ }
135
+ this.modules = bestModules;
136
+ this.setupTypeInfo(false, pattern);
137
+ if (this.typeNumber >= 7) {
138
+ this.setupTypeNumber(false);
139
+ }
140
+ },
141
+ /**
142
+ * 设置定位图形
143
+ * @return {[type]} [description]
144
+ */
145
+ setupTimingPattern: function () {
146
+ for (var r = 8; r < this.moduleCount - 8; r++) {
147
+ if (this.modules[r][6] != null) {
148
+ continue;
149
+ }
150
+ this.modules[r][6] = (r % 2 == 0);
151
+ if (this.modules[6][r] != null) {
152
+ continue;
153
+ }
154
+ this.modules[6][r] = (r % 2 == 0);
155
+ }
156
+ },
157
+ /**
158
+ * 设置矫正图形
159
+ * @return {[type]} [description]
160
+ */
161
+ setupPositionAdjustPattern: function () {
162
+ var pos = QRUtil.getPatternPosition(this.typeNumber);
163
+ for (var i = 0; i < pos.length; i++) {
164
+ for (var j = 0; j < pos.length; j++) {
165
+ var row = pos[i];
166
+ var col = pos[j];
167
+ if (this.modules[row][col] != null) {
168
+ continue;
169
+ }
170
+ for (var r = -2; r <= 2; r++) {
171
+ for (var c = -2; c <= 2; c++) {
172
+ if (r == -2 || r == 2 || c == -2 || c == 2 || (r == 0 && c == 0)) {
173
+ this.modules[row + r][col + c] = true;
174
+ } else {
175
+ this.modules[row + r][col + c] = false;
176
+ }
177
+ }
178
+ }
179
+ }
180
+ }
181
+ },
182
+ /**
183
+ * 设置版本信息(7以上版本才有)
184
+ * @param {bool} test 是否处于判断最佳掩膜阶段
185
+ * @return {[type]} [description]
186
+ */
187
+ setupTypeNumber: function (test) {
188
+ var bits = QRUtil.getBCHTypeNumber(this.typeNumber);
189
+ for (var i = 0; i < 18; i++) {
190
+ var mod = (!test && ((bits >> i) & 1) == 1);
191
+ this.modules[Math.floor(i / 3)][i % 3 + this.moduleCount - 8 - 3] = mod;
192
+ this.modules[i % 3 + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod;
193
+ }
194
+ },
195
+ /**
196
+ * 设置格式信息(纠错等级和掩膜版本)
197
+ * @param {bool} test
198
+ * @param {num} maskPattern 掩膜版本
199
+ * @return {}
200
+ */
201
+ setupTypeInfo: function (test, maskPattern) {
202
+ var data = (QRErrorCorrectLevel[this.errorCorrectLevel] << 3) | maskPattern;
203
+ var bits = QRUtil.getBCHTypeInfo(data);
204
+ // vertical
205
+ for (var i = 0; i < 15; i++) {
206
+ var mod = (!test && ((bits >> i) & 1) == 1);
207
+ if (i < 6) {
208
+ this.modules[i][8] = mod;
209
+ } else if (i < 8) {
210
+ this.modules[i + 1][8] = mod;
211
+ } else {
212
+ this.modules[this.moduleCount - 15 + i][8] = mod;
213
+ }
214
+ // horizontal
215
+ var mod = (!test && ((bits >> i) & 1) == 1);
216
+ if (i < 8) {
217
+ this.modules[8][this.moduleCount - i - 1] = mod;
218
+ } else if (i < 9) {
219
+ this.modules[8][15 - i - 1 + 1] = mod;
220
+ } else {
221
+ this.modules[8][15 - i - 1] = mod;
222
+ }
223
+ }
224
+ // fixed module
225
+ this.modules[this.moduleCount - 8][8] = (!test);
226
+ },
227
+ /**
228
+ * 数据编码
229
+ * @return {[type]} [description]
230
+ */
231
+ createData: function () {
232
+ var buffer = new QRBitBuffer();
233
+ var lengthBits = this.typeNumber > 9 ? 16 : 8;
234
+ buffer.put(4, 4); //添加模式
235
+ buffer.put(this.utf8bytes.length, lengthBits);
236
+ for (var i = 0, l = this.utf8bytes.length; i < l; i++) {
237
+ buffer.put(this.utf8bytes[i], 8);
238
+ }
239
+ if (buffer.length + 4 <= this.totalDataCount * 8) {
240
+ buffer.put(0, 4);
241
+ }
242
+ // padding
243
+ while (buffer.length % 8 != 0) {
244
+ buffer.putBit(false);
245
+ }
246
+ // padding
247
+ while (true) {
248
+ if (buffer.length >= this.totalDataCount * 8) {
249
+ break;
250
+ }
251
+ buffer.put(QRCodeAlg.PAD0, 8);
252
+ if (buffer.length >= this.totalDataCount * 8) {
253
+ break;
254
+ }
255
+ buffer.put(QRCodeAlg.PAD1, 8);
256
+ }
257
+ return this.createBytes(buffer);
258
+ },
259
+ /**
260
+ * 纠错码编码
261
+ * @param {buffer} buffer 数据编码
262
+ * @return {[type]}
263
+ */
264
+ createBytes: function (buffer) {
265
+ var offset = 0;
266
+ var maxDcCount = 0;
267
+ var maxEcCount = 0;
268
+ var length = this.rsBlock.length / 3;
269
+ var rsBlocks = new Array();
270
+ for (var i = 0; i < length; i++) {
271
+ var count = this.rsBlock[i * 3 + 0];
272
+ var totalCount = this.rsBlock[i * 3 + 1];
273
+ var dataCount = this.rsBlock[i * 3 + 2];
274
+ for (var j = 0; j < count; j++) {
275
+ rsBlocks.push([dataCount, totalCount]);
276
+ }
277
+ }
278
+ var dcdata = new Array(rsBlocks.length);
279
+ var ecdata = new Array(rsBlocks.length);
280
+ for (var r = 0; r < rsBlocks.length; r++) {
281
+ var dcCount = rsBlocks[r][0];
282
+ var ecCount = rsBlocks[r][1] - dcCount;
283
+ maxDcCount = Math.max(maxDcCount, dcCount);
284
+ maxEcCount = Math.max(maxEcCount, ecCount);
285
+ dcdata[r] = new Array(dcCount);
286
+ for (var i = 0; i < dcdata[r].length; i++) {
287
+ dcdata[r][i] = 0xff & buffer.buffer[i + offset];
288
+ }
289
+ offset += dcCount;
290
+ var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount);
291
+ var rawPoly = new QRPolynomial(dcdata[r], rsPoly.getLength() - 1);
292
+ var modPoly = rawPoly.mod(rsPoly);
293
+ ecdata[r] = new Array(rsPoly.getLength() - 1);
294
+ for (var i = 0; i < ecdata[r].length; i++) {
295
+ var modIndex = i + modPoly.getLength() - ecdata[r].length;
296
+ ecdata[r][i] = (modIndex >= 0) ? modPoly.get(modIndex) : 0;
297
+ }
298
+ }
299
+ var data = new Array(this.totalDataCount);
300
+ var index = 0;
301
+ for (var i = 0; i < maxDcCount; i++) {
302
+ for (var r = 0; r < rsBlocks.length; r++) {
303
+ if (i < dcdata[r].length) {
304
+ data[index++] = dcdata[r][i];
305
+ }
306
+ }
307
+ }
308
+ for (var i = 0; i < maxEcCount; i++) {
309
+ for (var r = 0; r < rsBlocks.length; r++) {
310
+ if (i < ecdata[r].length) {
311
+ data[index++] = ecdata[r][i];
312
+ }
313
+ }
314
+ }
315
+ return data;
316
+
317
+ },
318
+ /**
319
+ * 布置模块,构建最终信息
320
+ * @param {} data
321
+ * @param {} maskPattern
322
+ * @return {}
323
+ */
324
+ mapData: function (data, maskPattern) {
325
+ var inc = -1;
326
+ var row = this.moduleCount - 1;
327
+ var bitIndex = 7;
328
+ var byteIndex = 0;
329
+ for (var col = this.moduleCount - 1; col > 0; col -= 2) {
330
+ if (col == 6) col--;
331
+ while (true) {
332
+ for (var c = 0; c < 2; c++) {
333
+ if (this.modules[row][col - c] == null) {
334
+ var dark = false;
335
+ if (byteIndex < data.length) {
336
+ dark = (((data[byteIndex] >>> bitIndex) & 1) == 1);
337
+ }
338
+ var mask = QRUtil.getMask(maskPattern, row, col - c);
339
+ if (mask) {
340
+ dark = !dark;
341
+ }
342
+ this.modules[row][col - c] = dark;
343
+ bitIndex--;
344
+ if (bitIndex == -1) {
345
+ byteIndex++;
346
+ bitIndex = 7;
347
+ }
348
+ }
349
+ }
350
+ row += inc;
351
+ if (row < 0 || this.moduleCount <= row) {
352
+ row -= inc;
353
+ inc = -inc;
354
+ break;
355
+ }
356
+ }
357
+ }
358
+ }
359
+ };
360
+ /**
361
+ * 填充字段
362
+ */
363
+ QRCodeAlg.PAD0 = 0xEC;
364
+ QRCodeAlg.PAD1 = 0x11;
365
+ //---------------------------------------------------------------------
366
+ // 纠错等级对应的编码
367
+ //---------------------------------------------------------------------
368
+ var QRErrorCorrectLevel = [1, 0, 3, 2];
369
+ //---------------------------------------------------------------------
370
+ // 掩膜版本
371
+ //---------------------------------------------------------------------
372
+ var QRMaskPattern = {
373
+ PATTERN000: 0,
374
+ PATTERN001: 1,
375
+ PATTERN010: 2,
376
+ PATTERN011: 3,
377
+ PATTERN100: 4,
378
+ PATTERN101: 5,
379
+ PATTERN110: 6,
380
+ PATTERN111: 7
381
+ };
382
+ //---------------------------------------------------------------------
383
+ // 工具类
384
+ //---------------------------------------------------------------------
385
+ var QRUtil = {
386
+ /*
387
+ 每个版本矫正图形的位置
388
+ */
389
+ PATTERN_POSITION_TABLE: [
390
+ [],
391
+ [6, 18],
392
+ [6, 22],
393
+ [6, 26],
394
+ [6, 30],
395
+ [6, 34],
396
+ [6, 22, 38],
397
+ [6, 24, 42],
398
+ [6, 26, 46],
399
+ [6, 28, 50],
400
+ [6, 30, 54],
401
+ [6, 32, 58],
402
+ [6, 34, 62],
403
+ [6, 26, 46, 66],
404
+ [6, 26, 48, 70],
405
+ [6, 26, 50, 74],
406
+ [6, 30, 54, 78],
407
+ [6, 30, 56, 82],
408
+ [6, 30, 58, 86],
409
+ [6, 34, 62, 90],
410
+ [6, 28, 50, 72, 94],
411
+ [6, 26, 50, 74, 98],
412
+ [6, 30, 54, 78, 102],
413
+ [6, 28, 54, 80, 106],
414
+ [6, 32, 58, 84, 110],
415
+ [6, 30, 58, 86, 114],
416
+ [6, 34, 62, 90, 118],
417
+ [6, 26, 50, 74, 98, 122],
418
+ [6, 30, 54, 78, 102, 126],
419
+ [6, 26, 52, 78, 104, 130],
420
+ [6, 30, 56, 82, 108, 134],
421
+ [6, 34, 60, 86, 112, 138],
422
+ [6, 30, 58, 86, 114, 142],
423
+ [6, 34, 62, 90, 118, 146],
424
+ [6, 30, 54, 78, 102, 126, 150],
425
+ [6, 24, 50, 76, 102, 128, 154],
426
+ [6, 28, 54, 80, 106, 132, 158],
427
+ [6, 32, 58, 84, 110, 136, 162],
428
+ [6, 26, 54, 82, 110, 138, 166],
429
+ [6, 30, 58, 86, 114, 142, 170]
430
+ ],
431
+ G15: (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0),
432
+ G18: (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0),
433
+ G15_MASK: (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1),
434
+ /*
435
+ BCH编码格式信息
436
+ */
437
+ getBCHTypeInfo: function (data) {
438
+ var d = data << 10;
439
+ while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) >= 0) {
440
+ d ^= (QRUtil.G15 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15)));
441
+ }
442
+ return ((data << 10) | d) ^ QRUtil.G15_MASK;
443
+ },
444
+ /*
445
+ BCH编码版本信息
446
+ */
447
+ getBCHTypeNumber: function (data) {
448
+ var d = data << 12;
449
+ while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) >= 0) {
450
+ d ^= (QRUtil.G18 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18)));
451
+ }
452
+ return (data << 12) | d;
453
+ },
454
+ /*
455
+ 获取BCH位信息
456
+ */
457
+ getBCHDigit: function (data) {
458
+ var digit = 0;
459
+ while (data != 0) {
460
+ digit++;
461
+ data >>>= 1;
462
+ }
463
+ return digit;
464
+ },
465
+ /*
466
+ 获取版本对应的矫正图形位置
467
+ */
468
+ getPatternPosition: function (typeNumber) {
469
+ return QRUtil.PATTERN_POSITION_TABLE[typeNumber - 1];
470
+ },
471
+ /*
472
+ 掩膜算法
473
+ */
474
+ getMask: function (maskPattern, i, j) {
475
+ switch (maskPattern) {
476
+ case QRMaskPattern.PATTERN000:
477
+ return (i + j) % 2 == 0;
478
+ case QRMaskPattern.PATTERN001:
479
+ return i % 2 == 0;
480
+ case QRMaskPattern.PATTERN010:
481
+ return j % 3 == 0;
482
+ case QRMaskPattern.PATTERN011:
483
+ return (i + j) % 3 == 0;
484
+ case QRMaskPattern.PATTERN100:
485
+ return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 == 0;
486
+ case QRMaskPattern.PATTERN101:
487
+ return (i * j) % 2 + (i * j) % 3 == 0;
488
+ case QRMaskPattern.PATTERN110:
489
+ return ((i * j) % 2 + (i * j) % 3) % 2 == 0;
490
+ case QRMaskPattern.PATTERN111:
491
+ return ((i * j) % 3 + (i + j) % 2) % 2 == 0;
492
+ default:
493
+ throw new Error("bad maskPattern:" + maskPattern);
494
+ }
495
+ },
496
+ /*
497
+ 获取RS的纠错多项式
498
+ */
499
+ getErrorCorrectPolynomial: function (errorCorrectLength) {
500
+ var a = new QRPolynomial([1], 0);
501
+ for (var i = 0; i < errorCorrectLength; i++) {
502
+ a = a.multiply(new QRPolynomial([1, QRMath.gexp(i)], 0));
503
+ }
504
+ return a;
505
+ },
506
+ /*
507
+ 获取评价
508
+ */
509
+ getLostPoint: function (qrCode) {
510
+ var moduleCount = qrCode.getModuleCount(),
511
+ lostPoint = 0,
512
+ darkCount = 0;
513
+ for (var row = 0; row < moduleCount; row++) {
514
+ var sameCount = 0;
515
+ var head = qrCode.modules[row][0];
516
+ for (var col = 0; col < moduleCount; col++) {
517
+ var current = qrCode.modules[row][col];
518
+ //level 3 评价
519
+ if (col < moduleCount - 6) {
520
+ if (current && !qrCode.modules[row][col + 1] && qrCode.modules[row][col + 2] && qrCode.modules[row][col + 3] && qrCode.modules[row][col + 4] && !qrCode.modules[row][col + 5] && qrCode.modules[row][col + 6]) {
521
+ if (col < moduleCount - 10) {
522
+ if (qrCode.modules[row][col + 7] && qrCode.modules[row][col + 8] && qrCode.modules[row][col + 9] && qrCode.modules[row][col + 10]) {
523
+ lostPoint += 40;
524
+ }
525
+ } else if (col > 3) {
526
+ if (qrCode.modules[row][col - 1] && qrCode.modules[row][col - 2] && qrCode.modules[row][col - 3] && qrCode.modules[row][col - 4]) {
527
+ lostPoint += 40;
528
+ }
529
+ }
530
+ }
531
+ }
532
+ //level 2 评价
533
+ if ((row < moduleCount - 1) && (col < moduleCount - 1)) {
534
+ var count = 0;
535
+ if (current) count++;
536
+ if (qrCode.modules[row + 1][col]) count++;
537
+ if (qrCode.modules[row][col + 1]) count++;
538
+ if (qrCode.modules[row + 1][col + 1]) count++;
539
+ if (count == 0 || count == 4) {
540
+ lostPoint += 3;
541
+ }
542
+ }
543
+ //level 1 评价
544
+ if (head ^ current) {
545
+ sameCount++;
546
+ } else {
547
+ head = current;
548
+ if (sameCount >= 5) {
549
+ lostPoint += (3 + sameCount - 5);
550
+ }
551
+ sameCount = 1;
552
+ }
553
+ //level 4 评价
554
+ if (current) {
555
+ darkCount++;
556
+ }
557
+ }
558
+ }
559
+ for (var col = 0; col < moduleCount; col++) {
560
+ var sameCount = 0;
561
+ var head = qrCode.modules[0][col];
562
+ for (var row = 0; row < moduleCount; row++) {
563
+ var current = qrCode.modules[row][col];
564
+ //level 3 评价
565
+ if (row < moduleCount - 6) {
566
+ if (current && !qrCode.modules[row + 1][col] && qrCode.modules[row + 2][col] && qrCode.modules[row + 3][col] && qrCode.modules[row + 4][col] && !qrCode.modules[row + 5][col] && qrCode.modules[row + 6][col]) {
567
+ if (row < moduleCount - 10) {
568
+ if (qrCode.modules[row + 7][col] && qrCode.modules[row + 8][col] && qrCode.modules[row + 9][col] && qrCode.modules[row + 10][col]) {
569
+ lostPoint += 40;
570
+ }
571
+ } else if (row > 3) {
572
+ if (qrCode.modules[row - 1][col] && qrCode.modules[row - 2][col] && qrCode.modules[row - 3][col] && qrCode.modules[row - 4][col]) {
573
+ lostPoint += 40;
574
+ }
575
+ }
576
+ }
577
+ }
578
+ //level 1 评价
579
+ if (head ^ current) {
580
+ sameCount++;
581
+ } else {
582
+ head = current;
583
+ if (sameCount >= 5) {
584
+ lostPoint += (3 + sameCount - 5);
585
+ }
586
+ sameCount = 1;
587
+ }
588
+ }
589
+ }
590
+ // LEVEL4
591
+ var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;
592
+ lostPoint += ratio * 10;
593
+ return lostPoint;
594
+ }
595
+
596
+ };
597
+ //---------------------------------------------------------------------
598
+ // QRMath使用的数学工具
599
+ //---------------------------------------------------------------------
600
+ var QRMath = {
601
+ /*
602
+ 将n转化为a^m
603
+ */
604
+ glog: function (n) {
605
+ if (n < 1) {
606
+ throw new Error("glog(" + n + ")");
607
+ }
608
+ return QRMath.LOG_TABLE[n];
609
+ },
610
+ /*
611
+ 将a^m转化为n
612
+ */
613
+ gexp: function (n) {
614
+ while (n < 0) {
615
+ n += 255;
616
+ }
617
+ while (n >= 256) {
618
+ n -= 255;
619
+ }
620
+ return QRMath.EXP_TABLE[n];
621
+ },
622
+ EXP_TABLE: new Array(256),
623
+ LOG_TABLE: new Array(256)
624
+
625
+ };
626
+ for (var i = 0; i < 8; i++) {
627
+ QRMath.EXP_TABLE[i] = 1 << i;
628
+ }
629
+ for (var i = 8; i < 256; i++) {
630
+ QRMath.EXP_TABLE[i] = QRMath.EXP_TABLE[i - 4] ^ QRMath.EXP_TABLE[i - 5] ^ QRMath.EXP_TABLE[i - 6] ^ QRMath.EXP_TABLE[i - 8];
631
+ }
632
+ for (var i = 0; i < 255; i++) {
633
+ QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]] = i;
634
+ }
635
+ //---------------------------------------------------------------------
636
+ // QRPolynomial 多项式
637
+ //---------------------------------------------------------------------
638
+ /**
639
+ * 多项式类
640
+ * @param {Array} num 系数
641
+ * @param {num} shift a^shift
642
+ */
643
+ function QRPolynomial(num, shift) {
644
+ if (num.length == undefined) {
645
+ throw new Error(num.length + "/" + shift);
646
+ }
647
+ var offset = 0;
648
+ while (offset < num.length && num[offset] == 0) {
649
+ offset++;
650
+ }
651
+ this.num = new Array(num.length - offset + shift);
652
+ for (var i = 0; i < num.length - offset; i++) {
653
+ this.num[i] = num[i + offset];
654
+ }
655
+ }
656
+ QRPolynomial.prototype = {
657
+ get: function (index) {
658
+ return this.num[index];
659
+ },
660
+ getLength: function () {
661
+ return this.num.length;
662
+ },
663
+ /**
664
+ * 多项式乘法
665
+ * @param {QRPolynomial} e 被乘多项式
666
+ * @return {[type]} [description]
667
+ */
668
+ multiply: function (e) {
669
+ var num = new Array(this.getLength() + e.getLength() - 1);
670
+ for (var i = 0; i < this.getLength(); i++) {
671
+ for (var j = 0; j < e.getLength(); j++) {
672
+ num[i + j] ^= QRMath.gexp(QRMath.glog(this.get(i)) + QRMath.glog(e.get(j)));
673
+ }
674
+ }
675
+ return new QRPolynomial(num, 0);
676
+ },
677
+ /**
678
+ * 多项式模运算
679
+ * @param {QRPolynomial} e 模多项式
680
+ * @return {}
681
+ */
682
+ mod: function (e) {
683
+ var tl = this.getLength(),
684
+ el = e.getLength();
685
+ if (tl - el < 0) {
686
+ return this;
687
+ }
688
+ var num = new Array(tl);
689
+ for (var i = 0; i < tl; i++) {
690
+ num[i] = this.get(i);
691
+ }
692
+ while (num.length >= el) {
693
+ var ratio = QRMath.glog(num[0]) - QRMath.glog(e.get(0));
694
+
695
+ for (var i = 0; i < e.getLength(); i++) {
696
+ num[i] ^= QRMath.gexp(QRMath.glog(e.get(i)) + ratio);
697
+ }
698
+ while (num[0] == 0) {
699
+ num.shift();
700
+ }
701
+ }
702
+ return new QRPolynomial(num, 0);
703
+ }
704
+ };
705
+
706
+ //---------------------------------------------------------------------
707
+ // RS_BLOCK_TABLE
708
+ //---------------------------------------------------------------------
709
+ /*
710
+ 二维码各个版本信息[块数, 每块中的数据块数, 每块中的信息块数]
711
+ */
712
+ var RS_BLOCK_TABLE = [
713
+ // L
714
+ // M
715
+ // Q
716
+ // H
717
+ // 1
718
+ [1, 26, 19],
719
+ [1, 26, 16],
720
+ [1, 26, 13],
721
+ [1, 26, 9],
722
+
723
+ // 2
724
+ [1, 44, 34],
725
+ [1, 44, 28],
726
+ [1, 44, 22],
727
+ [1, 44, 16],
728
+
729
+ // 3
730
+ [1, 70, 55],
731
+ [1, 70, 44],
732
+ [2, 35, 17],
733
+ [2, 35, 13],
734
+
735
+ // 4
736
+ [1, 100, 80],
737
+ [2, 50, 32],
738
+ [2, 50, 24],
739
+ [4, 25, 9],
740
+
741
+ // 5
742
+ [1, 134, 108],
743
+ [2, 67, 43],
744
+ [2, 33, 15, 2, 34, 16],
745
+ [2, 33, 11, 2, 34, 12],
746
+
747
+ // 6
748
+ [2, 86, 68],
749
+ [4, 43, 27],
750
+ [4, 43, 19],
751
+ [4, 43, 15],
752
+
753
+ // 7
754
+ [2, 98, 78],
755
+ [4, 49, 31],
756
+ [2, 32, 14, 4, 33, 15],
757
+ [4, 39, 13, 1, 40, 14],
758
+
759
+ // 8
760
+ [2, 121, 97],
761
+ [2, 60, 38, 2, 61, 39],
762
+ [4, 40, 18, 2, 41, 19],
763
+ [4, 40, 14, 2, 41, 15],
764
+
765
+ // 9
766
+ [2, 146, 116],
767
+ [3, 58, 36, 2, 59, 37],
768
+ [4, 36, 16, 4, 37, 17],
769
+ [4, 36, 12, 4, 37, 13],
770
+
771
+ // 10
772
+ [2, 86, 68, 2, 87, 69],
773
+ [4, 69, 43, 1, 70, 44],
774
+ [6, 43, 19, 2, 44, 20],
775
+ [6, 43, 15, 2, 44, 16],
776
+
777
+ // 11
778
+ [4, 101, 81],
779
+ [1, 80, 50, 4, 81, 51],
780
+ [4, 50, 22, 4, 51, 23],
781
+ [3, 36, 12, 8, 37, 13],
782
+
783
+ // 12
784
+ [2, 116, 92, 2, 117, 93],
785
+ [6, 58, 36, 2, 59, 37],
786
+ [4, 46, 20, 6, 47, 21],
787
+ [7, 42, 14, 4, 43, 15],
788
+
789
+ // 13
790
+ [4, 133, 107],
791
+ [8, 59, 37, 1, 60, 38],
792
+ [8, 44, 20, 4, 45, 21],
793
+ [12, 33, 11, 4, 34, 12],
794
+
795
+ // 14
796
+ [3, 145, 115, 1, 146, 116],
797
+ [4, 64, 40, 5, 65, 41],
798
+ [11, 36, 16, 5, 37, 17],
799
+ [11, 36, 12, 5, 37, 13],
800
+
801
+ // 15
802
+ [5, 109, 87, 1, 110, 88],
803
+ [5, 65, 41, 5, 66, 42],
804
+ [5, 54, 24, 7, 55, 25],
805
+ [11, 36, 12],
806
+
807
+ // 16
808
+ [5, 122, 98, 1, 123, 99],
809
+ [7, 73, 45, 3, 74, 46],
810
+ [15, 43, 19, 2, 44, 20],
811
+ [3, 45, 15, 13, 46, 16],
812
+
813
+ // 17
814
+ [1, 135, 107, 5, 136, 108],
815
+ [10, 74, 46, 1, 75, 47],
816
+ [1, 50, 22, 15, 51, 23],
817
+ [2, 42, 14, 17, 43, 15],
818
+
819
+ // 18
820
+ [5, 150, 120, 1, 151, 121],
821
+ [9, 69, 43, 4, 70, 44],
822
+ [17, 50, 22, 1, 51, 23],
823
+ [2, 42, 14, 19, 43, 15],
824
+
825
+ // 19
826
+ [3, 141, 113, 4, 142, 114],
827
+ [3, 70, 44, 11, 71, 45],
828
+ [17, 47, 21, 4, 48, 22],
829
+ [9, 39, 13, 16, 40, 14],
830
+
831
+ // 20
832
+ [3, 135, 107, 5, 136, 108],
833
+ [3, 67, 41, 13, 68, 42],
834
+ [15, 54, 24, 5, 55, 25],
835
+ [15, 43, 15, 10, 44, 16],
836
+
837
+ // 21
838
+ [4, 144, 116, 4, 145, 117],
839
+ [17, 68, 42],
840
+ [17, 50, 22, 6, 51, 23],
841
+ [19, 46, 16, 6, 47, 17],
842
+
843
+ // 22
844
+ [2, 139, 111, 7, 140, 112],
845
+ [17, 74, 46],
846
+ [7, 54, 24, 16, 55, 25],
847
+ [34, 37, 13],
848
+
849
+ // 23
850
+ [4, 151, 121, 5, 152, 122],
851
+ [4, 75, 47, 14, 76, 48],
852
+ [11, 54, 24, 14, 55, 25],
853
+ [16, 45, 15, 14, 46, 16],
854
+
855
+ // 24
856
+ [6, 147, 117, 4, 148, 118],
857
+ [6, 73, 45, 14, 74, 46],
858
+ [11, 54, 24, 16, 55, 25],
859
+ [30, 46, 16, 2, 47, 17],
860
+
861
+ // 25
862
+ [8, 132, 106, 4, 133, 107],
863
+ [8, 75, 47, 13, 76, 48],
864
+ [7, 54, 24, 22, 55, 25],
865
+ [22, 45, 15, 13, 46, 16],
866
+
867
+ // 26
868
+ [10, 142, 114, 2, 143, 115],
869
+ [19, 74, 46, 4, 75, 47],
870
+ [28, 50, 22, 6, 51, 23],
871
+ [33, 46, 16, 4, 47, 17],
872
+
873
+ // 27
874
+ [8, 152, 122, 4, 153, 123],
875
+ [22, 73, 45, 3, 74, 46],
876
+ [8, 53, 23, 26, 54, 24],
877
+ [12, 45, 15, 28, 46, 16],
878
+
879
+ // 28
880
+ [3, 147, 117, 10, 148, 118],
881
+ [3, 73, 45, 23, 74, 46],
882
+ [4, 54, 24, 31, 55, 25],
883
+ [11, 45, 15, 31, 46, 16],
884
+
885
+ // 29
886
+ [7, 146, 116, 7, 147, 117],
887
+ [21, 73, 45, 7, 74, 46],
888
+ [1, 53, 23, 37, 54, 24],
889
+ [19, 45, 15, 26, 46, 16],
890
+
891
+ // 30
892
+ [5, 145, 115, 10, 146, 116],
893
+ [19, 75, 47, 10, 76, 48],
894
+ [15, 54, 24, 25, 55, 25],
895
+ [23, 45, 15, 25, 46, 16],
896
+
897
+ // 31
898
+ [13, 145, 115, 3, 146, 116],
899
+ [2, 74, 46, 29, 75, 47],
900
+ [42, 54, 24, 1, 55, 25],
901
+ [23, 45, 15, 28, 46, 16],
902
+
903
+ // 32
904
+ [17, 145, 115],
905
+ [10, 74, 46, 23, 75, 47],
906
+ [10, 54, 24, 35, 55, 25],
907
+ [19, 45, 15, 35, 46, 16],
908
+
909
+ // 33
910
+ [17, 145, 115, 1, 146, 116],
911
+ [14, 74, 46, 21, 75, 47],
912
+ [29, 54, 24, 19, 55, 25],
913
+ [11, 45, 15, 46, 46, 16],
914
+
915
+ // 34
916
+ [13, 145, 115, 6, 146, 116],
917
+ [14, 74, 46, 23, 75, 47],
918
+ [44, 54, 24, 7, 55, 25],
919
+ [59, 46, 16, 1, 47, 17],
920
+
921
+ // 35
922
+ [12, 151, 121, 7, 152, 122],
923
+ [12, 75, 47, 26, 76, 48],
924
+ [39, 54, 24, 14, 55, 25],
925
+ [22, 45, 15, 41, 46, 16],
926
+
927
+ // 36
928
+ [6, 151, 121, 14, 152, 122],
929
+ [6, 75, 47, 34, 76, 48],
930
+ [46, 54, 24, 10, 55, 25],
931
+ [2, 45, 15, 64, 46, 16],
932
+
933
+ // 37
934
+ [17, 152, 122, 4, 153, 123],
935
+ [29, 74, 46, 14, 75, 47],
936
+ [49, 54, 24, 10, 55, 25],
937
+ [24, 45, 15, 46, 46, 16],
938
+
939
+ // 38
940
+ [4, 152, 122, 18, 153, 123],
941
+ [13, 74, 46, 32, 75, 47],
942
+ [48, 54, 24, 14, 55, 25],
943
+ [42, 45, 15, 32, 46, 16],
944
+
945
+ // 39
946
+ [20, 147, 117, 4, 148, 118],
947
+ [40, 75, 47, 7, 76, 48],
948
+ [43, 54, 24, 22, 55, 25],
949
+ [10, 45, 15, 67, 46, 16],
950
+
951
+ // 40
952
+ [19, 148, 118, 6, 149, 119],
953
+ [18, 75, 47, 31, 76, 48],
954
+ [34, 54, 24, 34, 55, 25],
955
+ [20, 45, 15, 61, 46, 16]
956
+ ];
957
+
958
+ /**
959
+ * 根据数据获取对应版本
960
+ * @return {[type]} [description]
961
+ */
962
+ QRCodeAlg.prototype.getRightType = function () {
963
+ for (var typeNumber = 1; typeNumber < 41; typeNumber++) {
964
+ var rsBlock = RS_BLOCK_TABLE[(typeNumber - 1) * 4 + this.errorCorrectLevel];
965
+ if (rsBlock == undefined) {
966
+ throw new Error("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" + this.errorCorrectLevel);
967
+ }
968
+ var length = rsBlock.length / 3;
969
+ var totalDataCount = 0;
970
+ for (var i = 0; i < length; i++) {
971
+ var count = rsBlock[i * 3 + 0];
972
+ var dataCount = rsBlock[i * 3 + 2];
973
+ totalDataCount += dataCount * count;
974
+ }
975
+ var lengthBytes = typeNumber > 9 ? 2 : 1;
976
+ if (this.utf8bytes.length + lengthBytes < totalDataCount || typeNumber == 40) {
977
+ this.typeNumber = typeNumber;
978
+ this.rsBlock = rsBlock;
979
+ this.totalDataCount = totalDataCount;
980
+ break;
981
+ }
982
+ }
983
+ };
984
+
985
+ //---------------------------------------------------------------------
986
+ // QRBitBuffer
987
+ //---------------------------------------------------------------------
988
+ function QRBitBuffer() {
989
+ this.buffer = new Array();
990
+ this.length = 0;
991
+ }
992
+ QRBitBuffer.prototype = {
993
+ get: function (index) {
994
+ var bufIndex = Math.floor(index / 8);
995
+ return ((this.buffer[bufIndex] >>> (7 - index % 8)) & 1);
996
+ },
997
+ put: function (num, length) {
998
+ for (var i = 0; i < length; i++) {
999
+ this.putBit(((num >>> (length - i - 1)) & 1));
1000
+ }
1001
+ },
1002
+ putBit: function (bit) {
1003
+ var bufIndex = Math.floor(this.length / 8);
1004
+ if (this.buffer.length <= bufIndex) {
1005
+ this.buffer.push(0);
1006
+ }
1007
+ if (bit) {
1008
+ this.buffer[bufIndex] |= (0x80 >>> (this.length % 8));
1009
+ }
1010
+ this.length++;
1011
+ }
1012
+ };
1013
+
1014
+
1015
+
1016
+ // xzedit
1017
+ let qrcodeAlgObjCache = [];
1018
+ /**
1019
+ * 二维码构造函数,主要用于绘制
1020
+ * @param {参数列表} opt 传递参数
1021
+ * @return {}
1022
+ */
1023
+ QRCode = function (opt) {
1024
+ //设置默认参数
1025
+ this.options = {
1026
+ text: '',
1027
+ size: 256,
1028
+ correctLevel: 3,
1029
+ quietZone: 0,
1030
+ background: '#ffffff',
1031
+ foreground: '#000000',
1032
+ pdground: '#000000',
1033
+ image: '',
1034
+ imageSize: 30,
1035
+ canvasId: opt.canvasId,
1036
+ ctx: opt.ctx,
1037
+ canvasHost: opt.canvasHost,
1038
+ isNvue: opt.isNvue,
1039
+ vuectx: opt.vuectx,
1040
+ usingComponents: opt.usingComponents,
1041
+ showLoading: opt.showLoading,
1042
+ loadingText: opt.loadingText,
1043
+ };
1044
+
1045
+ if (typeof opt === 'string') { // 只编码ASCII字符串
1046
+ opt = {
1047
+ text: opt
1048
+ };
1049
+ }
1050
+ if (opt) {
1051
+ for (var i in opt) {
1052
+ this.options[i] = opt[i];
1053
+ }
1054
+ }
1055
+ //使用QRCodeAlg创建二维码结构
1056
+ var qrCodeAlg = null;
1057
+ for (var i = 0, l = qrcodeAlgObjCache.length; i < l; i++) {
1058
+ if (qrcodeAlgObjCache[i].text == this.options.text && qrcodeAlgObjCache[i].text.correctLevel == this.options.correctLevel) {
1059
+ qrCodeAlg = qrcodeAlgObjCache[i].obj;
1060
+ break;
1061
+ }
1062
+ }
1063
+ if (i == l) {
1064
+ qrCodeAlg = new QRCodeAlg(this.options.text, this.options.correctLevel);
1065
+ qrcodeAlgObjCache.push({
1066
+ text: this.options.text,
1067
+ correctLevel: this.options.correctLevel,
1068
+ obj: qrCodeAlg
1069
+ });
1070
+ }
1071
+ /**
1072
+ * 计算矩阵点的前景色
1073
+ * @param {Obj} config
1074
+ * @param {Number} config.row 点x坐标
1075
+ * @param {Number} config.col 点y坐标
1076
+ * @param {Number} config.count 矩阵大小
1077
+ * @param {Number} config.options 组件的options
1078
+ * @return {String}
1079
+ */
1080
+ let getForeGround = function (config) {
1081
+ var options = config.options;
1082
+ if (options.pdground && (
1083
+ (config.row > 1 && config.row < 5 && config.col > 1 && config.col < 5) ||
1084
+ (config.row > (config.count - 6) && config.row < (config.count - 2) && config.col > 1 && config.col < 5) ||
1085
+ (config.row > 1 && config.row < 5 && config.col > (config.count - 6) && config.col < (config.count - 2))
1086
+ )) {
1087
+ return options.pdground;
1088
+ }
1089
+ return options.foreground;
1090
+ }
1091
+
1092
+ // 创建canvas
1093
+ let createCanvas = async function (options) {
1094
+ let isApp = false;
1095
+ // #ifdef APP
1096
+ isApp = true;
1097
+ // #endif
1098
+
1099
+ if(options.showLoading){
1100
+ uni.showLoading({
1101
+ title: options.loadingText,
1102
+ mask: true
1103
+ });
1104
+ }
1105
+ var ctx = '';
1106
+ ctx = options.ctx;
1107
+
1108
+ var count = qrCodeAlg.getModuleCount();
1109
+ var quietZone = Math.max(0, Math.floor(options.quietZone || 0));
1110
+ var renderCount = count + quietZone * 2;
1111
+ var ratioSize = options.size;
1112
+ var ratioImgSize = options.imageSize;
1113
+ //计算每个点的长宽
1114
+ var tileW = (ratioSize / renderCount).toPrecision(4);
1115
+ var tileH = (ratioSize / renderCount).toPrecision(4);
1116
+ //绘制
1117
+ for (var row = 0; row < renderCount; row++) {
1118
+ for (var col = 0; col < renderCount; col++) {
1119
+ var w = (Math.ceil((col + 1) * tileW) - Math.floor(col * tileW));
1120
+ var h = (Math.ceil((row + 1) * tileH) - Math.floor(row * tileH));
1121
+ var qrRow = row - quietZone;
1122
+ var qrCol = col - quietZone;
1123
+ var isDark = qrRow >= 0 && qrCol >= 0 && qrRow < count && qrCol < count && qrCodeAlg.modules[qrRow][qrCol];
1124
+ var foreground = getForeGround({
1125
+ row: qrRow,
1126
+ col: qrCol,
1127
+ count: count,
1128
+ options: options
1129
+ });
1130
+ setFillStyle(ctx, isDark ? foreground : options.background);
1131
+ ctx.fillRect(Math.round(col * tileW), Math.round(row * tileH), w, h);
1132
+ }
1133
+ }
1134
+ if (options.image) {
1135
+ var x = Number(((ratioSize - ratioImgSize) / 2).toFixed(2));
1136
+ var y = Number(((ratioSize - ratioImgSize) / 2).toFixed(2));
1137
+ drawRoundedRect(ctx, x, y, ratioImgSize, ratioImgSize, 2, 6, true, true)
1138
+ await options.vuectx.drawImage(options.image, x, y, ratioImgSize, ratioImgSize);
1139
+ // 画圆角矩形
1140
+ function drawRoundedRect(ctxi, x, y, width, height, r, lineWidth, fill, stroke) {
1141
+ setLineWidth(ctxi, lineWidth);
1142
+ setFillStyle(ctxi, options.background);
1143
+ setStrokeStyle(ctxi, options.background);
1144
+ ctxi.beginPath(); // draw top and top right corner
1145
+ ctxi.moveTo(x + r, y);
1146
+ ctxi.lineTo(x + width, y); // move to top-right corner
1147
+ ctxi.arc(x + width - r, y + r, r, -Math.PI / 2, 0); // draw right side and bottom right corner
1148
+
1149
+ ctxi.lineTo(x + width, y + height - r);
1150
+ ctxi.arc(x + width - r, y + height - r, r, 0, Math.PI / 2); // draw bottom and bottom left corner
1151
+
1152
+ ctxi.lineTo(x + r, y + height);
1153
+ ctxi.arc(x + r, y + height - r, r, Math.PI / 2, Math.PI);// draw left and top left corner
1154
+
1155
+ ctxi.lineTo(x, y + r);
1156
+ ctxi.arc(x + r, y + r, r, Math.PI, Math.PI * 3 / 2);
1157
+
1158
+ ctxi.closePath();
1159
+ if (fill) {
1160
+ ctxi.fill();
1161
+ }
1162
+ if (stroke) {
1163
+ ctxi.stroke();
1164
+ }
1165
+ }
1166
+ }
1167
+ // canvas2 绘制是自动的不需要手动绘制
1168
+ if(options.isNvue || isApp){
1169
+ let exportStarted = false;
1170
+ const reportFailure = function(error) {
1171
+ uni.hideLoading();
1172
+ if (options.cbResult) {
1173
+ options.cbResult(error instanceof Error ? error : new Error(String(error || '绘制失败')))
1174
+ }
1175
+ };
1176
+ const exportCode = async function() {
1177
+ if (exportStarted) return;
1178
+ exportStarted = true;
1179
+ try {
1180
+ if (!options.canvasHost || typeof options.canvasHost.toTempFilePath !== 'function') {
1181
+ throw new Error('无法获取二维码画布导出方法');
1182
+ }
1183
+ const res = await options.canvasHost.toTempFilePath({
1184
+ width: options.width || options.size,
1185
+ height: options.height || options.size,
1186
+ quality: Number(1)
1187
+ });
1188
+ const tempFilePath = res && (res.tempFilePath || res.apFilePath);
1189
+ if (empty(tempFilePath)) {
1190
+ throw new Error('二维码导出未返回文件路径');
1191
+ }
1192
+ if (options.cbResult) {
1193
+ options.cbResult(tempFilePath)
1194
+ }
1195
+ uni.hideLoading();
1196
+ } catch (error) {
1197
+ reportFailure(error);
1198
+ }
1199
+ };
1200
+ try {
1201
+ let drawResult;
1202
+ if (options.canvasHost && typeof options.canvasHost.draw === 'function') {
1203
+ drawResult = options.canvasHost.draw(true, exportCode);
1204
+ } else if (ctx && typeof ctx.draw === 'function') {
1205
+ drawResult = ctx.draw(true, exportCode);
1206
+ } else {
1207
+ exportCode();
1208
+ }
1209
+ if (drawResult && typeof drawResult.then === 'function') {
1210
+ drawResult.then(exportCode, reportFailure);
1211
+ }
1212
+ } catch (error) {
1213
+ reportFailure(error);
1214
+ }
1215
+ }
1216
+ else{
1217
+ setTimeout(function() {
1218
+ options.cbResult("")
1219
+ }, options.usingComponents ? 100 : 200);
1220
+ }
1221
+ }
1222
+ createCanvas(this.options).catch(function(error) {
1223
+ uni.hideLoading();
1224
+ if (opt.cbResult) {
1225
+ opt.cbResult(error instanceof Error ? error : new Error(String(error || '二维码绘制失败')))
1226
+ }
1227
+ });
1228
+ // 空判定
1229
+ let empty = function (v) {
1230
+ let tp = typeof v,
1231
+ rt = false;
1232
+ if (tp == "number" && String(v) == "") {
1233
+ rt = true
1234
+ } else if (tp == "undefined") {
1235
+ rt = true
1236
+ } else if (tp == "object") {
1237
+ if (JSON.stringify(v) == "{}" || JSON.stringify(v) == "[]" || v == null) rt = true
1238
+ } else if (tp == "string") {
1239
+ if (v == "" || v == "undefined" || v == "null" || v == "{}" || v == "[]") rt = true
1240
+ } else if (tp == "function") {
1241
+ rt = false
1242
+ }
1243
+ return rt
1244
+ }
1245
+ function setFillStyle(ctx, value) {
1246
+ if (ctx && typeof ctx.setFillStyle === 'function') {
1247
+ ctx.setFillStyle(value);
1248
+ } else if (ctx) {
1249
+ ctx.fillStyle = value;
1250
+ }
1251
+ }
1252
+ function setStrokeStyle(ctx, value) {
1253
+ if (ctx && typeof ctx.setStrokeStyle === 'function') {
1254
+ ctx.setStrokeStyle(value);
1255
+ } else if (ctx) {
1256
+ ctx.strokeStyle = value;
1257
+ }
1258
+ }
1259
+ function setLineWidth(ctx, value) {
1260
+ if (ctx && typeof ctx.setLineWidth === 'function') {
1261
+ ctx.setLineWidth(value);
1262
+ } else if (ctx) {
1263
+ ctx.lineWidth = value;
1264
+ }
1265
+ }
1266
+ };
1267
+ QRCode.prototype.clear = function (fn) {
1268
+ if (this.options.canvasHost && typeof this.options.canvasHost.clearCanvas === 'function') {
1269
+ this.options.canvasHost.clearCanvas()
1270
+ if (fn) fn()
1271
+ return
1272
+ }
1273
+ var ctx = this.options.ctx;
1274
+ ctx.clearRect(0, 0, this.options.size, this.options.size)
1275
+ ctx.draw(false, () => {
1276
+ if (fn) {
1277
+ fn()
1278
+ }
1279
+ })
1280
+ };
1281
+ })()
1282
+
1283
+ export default QRCode