@atooyu/uxto-ui 1.1.36 → 1.1.38

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/dist/index.js CHANGED
@@ -1,4 +1,7 @@
1
1
  "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
2
5
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
6
  const vue = require("vue");
4
7
  const _hoisted_1$H = ["disabled", "hover-class"];
@@ -503,7 +506,7 @@ const chat = "data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='htt
503
506
  const clipboard = "data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M19%203h-4.18C14.4%201.84%2013.3%201%2012%201c-1.3%200-2.4.84-2.82%202H5c-1.1%200-2%20.9-2%202v14c0%201.1.9%202%202%202h14c1.1%200%202-.9%202-2V5c0-1.1-.9-2-2-2zm-7%200c.55%200%201%20.45%201%201s-.45%201-1%201-1-.45-1-1%20.45-1%201-1zm2%2014H7v-2h7v2zm3-4H7v-2h10v2zm0-4H7V7h10v2z'/%3e%3c/svg%3e";
504
507
  const location = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20fill='currentColor'%3e%3cpath%20d='M12%202C8.13%202%205%205.13%205%209c0%205.25%207%2013%207%2013s7-7.75%207-13c0-3.87-3.13-7-7-7zm0%209.5c-1.38%200-2.5-1.12-2.5-2.5s1.12-2.5%202.5-2.5%202.5%201.12%202.5%202.5-1.12%202.5-2.5%202.5z'/%3e%3c/svg%3e";
505
508
  const scan = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20fill='currentColor'%3e%3cpath%20d='M3%2011h8V3H3v8zm2-6h4v4H5V5zm8-2v8h8V3h-8zm6%206h-4V5h4v4zM3%2021h8v-8H3v8zm2-6h4v4H5v-4zm13-2h-2v3h-3v2h3v3h2v-3h3v-2h-3v-3z'/%3e%3c/svg%3e";
506
- const qrcode$1 = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20fill='currentColor'%3e%3cpath%20d='M3%203h6v6H3V3zm2%202v2h2V5H5zm8-2h6v6h-6V3zm2%202v2h2V5h-2zM3%2013h6v6H3v-6zm2%202v2h2v-2H5zm13-2h3v2h-3v-2zm-3%200h2v4h-2v-4zm-2%202h2v2h-2v-2zm2%202h3v2h-3v-2zm3%202h2v2h-2v-2zm-5%200h2v2h-2v-2z'/%3e%3c/svg%3e";
509
+ const qrcode = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20fill='currentColor'%3e%3cpath%20d='M3%203h6v6H3V3zm2%202v2h2V5H5zm8-2h6v6h-6V3zm2%202v2h2V5h-2zM3%2013h6v6H3v-6zm2%202v2h2v-2H5zm13-2h3v2h-3v-2zm-3%200h2v4h-2v-4zm-2%202h2v2h-2v-2zm2%202h3v2h-3v-2zm3%202h2v2h-2v-2zm-5%200h2v2h-2v-2z'/%3e%3c/svg%3e";
507
510
  const moon = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20fill='currentColor'%3e%3cpath%20d='M12%203a9%209%200%20109%209c0-.46-.04-.92-.1-1.36a5.389%205.389%200%2001-4.4%202.26%205.403%205.403%200%2001-3.14-9.8c-.44-.06-.9-.1-1.36-.1z'/%3e%3c/svg%3e";
508
511
  const icons = {
509
512
  // 箭头类
@@ -559,7 +562,7 @@ const icons = {
559
562
  "like": like,
560
563
  "like-o": likeO,
561
564
  "share": share,
562
- "qrcode": qrcode$1,
565
+ "qrcode": qrcode,
563
566
  "moon": moon,
564
567
  // 用户类
565
568
  "user": user,
@@ -5027,1658 +5030,485 @@ const _sfc_main$2 = /* @__PURE__ */ vue.defineComponent({
5027
5030
  }
5028
5031
  });
5029
5032
  const uTabbar = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__scopeId", "data-v-10cb84bc"]]);
5030
- const qrcode = function(typeNumber, errorCorrectionLevel) {
5031
- const PAD0 = 236;
5032
- const PAD1 = 17;
5033
- let _typeNumber = typeNumber;
5034
- const _errorCorrectionLevel = QRErrorCorrectionLevel[errorCorrectionLevel];
5035
- let _modules = null;
5036
- let _moduleCount = 0;
5037
- let _dataCache = null;
5038
- const _dataList = [];
5039
- const _this = {};
5040
- const makeImpl = function(test, maskPattern) {
5041
- _moduleCount = _typeNumber * 4 + 17;
5042
- _modules = function(moduleCount) {
5043
- const modules = new Array(moduleCount);
5044
- for (let row = 0; row < moduleCount; row += 1) {
5045
- modules[row] = new Array(moduleCount);
5046
- for (let col = 0; col < moduleCount; col += 1) {
5047
- modules[row][col] = null;
5048
- }
5049
- }
5050
- return modules;
5051
- }(_moduleCount);
5052
- setupPositionProbePattern(0, 0);
5053
- setupPositionProbePattern(_moduleCount - 7, 0);
5054
- setupPositionProbePattern(0, _moduleCount - 7);
5055
- setupPositionAdjustPattern();
5056
- setupTimingPattern();
5057
- setupTypeInfo(test, maskPattern);
5058
- if (_typeNumber >= 7) {
5059
- setupTypeNumber(test);
5033
+ const __default__$1 = {
5034
+ options: {
5035
+ virtualHost: true,
5036
+ styleIsolation: "shared"
5037
+ }
5038
+ };
5039
+ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
5040
+ ...__default__$1,
5041
+ __name: "u-qrcode",
5042
+ props: {
5043
+ value: { default: "" },
5044
+ size: { default: 200 },
5045
+ color: { default: "#000000" },
5046
+ bgColor: { default: "#ffffff" },
5047
+ errorCorrectLevel: { default: "M" }
5048
+ },
5049
+ setup(__props) {
5050
+ const props = __props;
5051
+ const modules = vue.ref([]);
5052
+ const moduleCount = vue.ref(0);
5053
+ const cellSize = vue.computed(() => {
5054
+ if (moduleCount.value === 0) return 0;
5055
+ return props.size / moduleCount.value;
5056
+ });
5057
+ const QRErrorCorrectionLevel = { L: 1, M: 0, Q: 3, H: 2 };
5058
+ const PAD0 = 236;
5059
+ const PAD1 = 17;
5060
+ const PATTERN_POSITION_TABLE = [
5061
+ [],
5062
+ [6, 18],
5063
+ [6, 22],
5064
+ [6, 26],
5065
+ [6, 30],
5066
+ [6, 34],
5067
+ [6, 22, 38],
5068
+ [6, 24, 42],
5069
+ [6, 26, 46],
5070
+ [6, 28, 50],
5071
+ [6, 30, 54],
5072
+ [6, 32, 58],
5073
+ [6, 34, 62],
5074
+ [6, 26, 46, 66],
5075
+ [6, 26, 48, 70],
5076
+ [6, 26, 50, 74],
5077
+ [6, 30, 54, 78],
5078
+ [6, 30, 56, 82],
5079
+ [6, 30, 58, 86],
5080
+ [6, 34, 62, 90],
5081
+ [6, 28, 50, 72, 94],
5082
+ [6, 26, 50, 74, 98],
5083
+ [6, 30, 54, 78, 102],
5084
+ [6, 28, 54, 80, 106],
5085
+ [6, 32, 58, 84, 110],
5086
+ [6, 30, 58, 86, 114],
5087
+ [6, 34, 62, 90, 118],
5088
+ [6, 26, 50, 74, 98, 122],
5089
+ [6, 30, 54, 78, 102, 126],
5090
+ [6, 26, 52, 78, 104, 130],
5091
+ [6, 30, 56, 82, 108, 134],
5092
+ [6, 34, 60, 86, 112, 138],
5093
+ [6, 30, 58, 86, 114, 142],
5094
+ [6, 34, 62, 90, 118, 146],
5095
+ [6, 30, 54, 78, 102, 126, 150],
5096
+ [6, 24, 50, 76, 102, 128, 154],
5097
+ [6, 28, 54, 80, 106, 132, 158],
5098
+ [6, 32, 58, 84, 110, 136, 162],
5099
+ [6, 26, 54, 82, 110, 138, 166],
5100
+ [6, 30, 58, 86, 114, 142, 170]
5101
+ ];
5102
+ const G15 = 1 << 10 | 1 << 8 | 1 << 5 | 1 << 4 | 1 << 2 | 1 << 1 | 1 << 0;
5103
+ const G15_MASK = 1 << 14 | 1 << 12 | 1 << 10 | 1 << 4 | 1 << 1;
5104
+ const RS_BLOCK_TABLE = [
5105
+ [1, 26, 19],
5106
+ [1, 26, 16],
5107
+ [1, 26, 13],
5108
+ [1, 26, 9],
5109
+ [1, 44, 34],
5110
+ [1, 44, 28],
5111
+ [1, 44, 22],
5112
+ [1, 44, 16],
5113
+ [1, 70, 55],
5114
+ [1, 70, 44],
5115
+ [2, 35, 17],
5116
+ [2, 35, 13],
5117
+ [1, 100, 80],
5118
+ [2, 50, 32],
5119
+ [2, 50, 24],
5120
+ [4, 25, 9],
5121
+ [1, 134, 108],
5122
+ [2, 67, 43],
5123
+ [2, 33, 15, 2, 34, 16],
5124
+ [2, 33, 11, 2, 34, 12],
5125
+ [2, 86, 68],
5126
+ [4, 43, 27],
5127
+ [4, 43, 19],
5128
+ [4, 43, 15],
5129
+ [2, 98, 78],
5130
+ [4, 49, 31],
5131
+ [2, 32, 14, 4, 33, 15],
5132
+ [4, 39, 13, 1, 40, 14],
5133
+ [2, 121, 97],
5134
+ [2, 60, 38, 2, 61, 39],
5135
+ [4, 40, 18, 2, 41, 19],
5136
+ [4, 40, 14, 2, 41, 15],
5137
+ [2, 146, 116],
5138
+ [3, 58, 36, 2, 59, 37],
5139
+ [4, 36, 16, 4, 37, 17],
5140
+ [4, 36, 12, 4, 37, 13],
5141
+ [2, 86, 68, 2, 87, 69],
5142
+ [4, 69, 43, 1, 70, 44],
5143
+ [6, 43, 19, 2, 44, 20],
5144
+ [6, 43, 15, 2, 44, 16],
5145
+ [4, 101, 81],
5146
+ [1, 80, 50, 4, 81, 51],
5147
+ [4, 50, 22, 4, 51, 23],
5148
+ [3, 36, 12, 8, 37, 13],
5149
+ [2, 116, 92, 2, 117, 93],
5150
+ [6, 58, 36, 2, 59, 37],
5151
+ [4, 46, 20, 6, 47, 21],
5152
+ [7, 42, 14, 4, 43, 15],
5153
+ [4, 133, 107],
5154
+ [8, 59, 37, 1, 60, 38],
5155
+ [8, 44, 20, 4, 45, 21],
5156
+ [12, 33, 11, 4, 34, 12],
5157
+ [3, 145, 115, 1, 146, 116],
5158
+ [4, 64, 40, 5, 65, 41],
5159
+ [11, 36, 16, 5, 37, 17],
5160
+ [11, 36, 12, 5, 37, 13],
5161
+ [5, 109, 87, 1, 110, 88],
5162
+ [5, 65, 41, 5, 66, 42],
5163
+ [5, 54, 24, 7, 55, 25],
5164
+ [11, 36, 12, 7, 37, 13],
5165
+ [5, 122, 98, 1, 123, 99],
5166
+ [7, 73, 45, 3, 74, 46],
5167
+ [15, 43, 19, 2, 44, 20],
5168
+ [3, 45, 15, 13, 46, 16],
5169
+ [1, 135, 107, 5, 136, 108],
5170
+ [10, 74, 46, 1, 75, 47],
5171
+ [1, 50, 22, 15, 51, 23],
5172
+ [2, 42, 14, 17, 43, 15],
5173
+ [5, 150, 120, 1, 151, 121],
5174
+ [9, 69, 43, 4, 70, 44],
5175
+ [17, 50, 22, 1, 51, 23],
5176
+ [2, 42, 14, 19, 43, 15],
5177
+ [3, 141, 113, 4, 142, 114],
5178
+ [3, 70, 44, 11, 71, 45],
5179
+ [17, 47, 21, 4, 48, 22],
5180
+ [9, 39, 13, 16, 40, 14],
5181
+ [3, 135, 107, 5, 136, 108],
5182
+ [3, 67, 41, 13, 68, 42],
5183
+ [15, 54, 24, 5, 55, 25],
5184
+ [15, 43, 15, 10, 44, 16]
5185
+ ];
5186
+ const EXP_TABLE = [];
5187
+ const LOG_TABLE = [];
5188
+ for (let i = 0; i < 8; i++) EXP_TABLE[i] = 1 << i;
5189
+ for (let i = 8; i < 256; i++) EXP_TABLE[i] = EXP_TABLE[i - 4] ^ EXP_TABLE[i - 5] ^ EXP_TABLE[i - 6] ^ EXP_TABLE[i - 8];
5190
+ for (let i = 0; i < 255; i++) LOG_TABLE[EXP_TABLE[i]] = i;
5191
+ for (let i = 255; i < 512; i++) EXP_TABLE[i] = EXP_TABLE[i - 255];
5192
+ function glog(n) {
5193
+ if (n < 1) throw new Error("glog(" + n + ")");
5194
+ return LOG_TABLE[n];
5060
5195
  }
5061
- if (_dataCache == null) {
5062
- _dataCache = createData(_typeNumber, _errorCorrectionLevel, _dataList);
5196
+ function gexp(n) {
5197
+ while (n < 0) n += 255;
5198
+ while (n >= 256) n -= 255;
5199
+ return EXP_TABLE[n];
5063
5200
  }
5064
- mapData(_dataCache, maskPattern);
5065
- };
5066
- const setupPositionProbePattern = function(row, col) {
5067
- for (let r = -1; r <= 7; r += 1) {
5068
- if (row + r <= -1 || _moduleCount <= row + r) continue;
5069
- for (let c = -1; c <= 7; c += 1) {
5070
- if (col + c <= -1 || _moduleCount <= col + c) continue;
5071
- 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) {
5072
- _modules[row + r][col + c] = true;
5073
- } else {
5074
- _modules[row + r][col + c] = false;
5075
- }
5201
+ function getBCHDigit(data) {
5202
+ let digit = 0;
5203
+ while (data !== 0) {
5204
+ digit++;
5205
+ data >>>= 1;
5076
5206
  }
5207
+ return digit;
5077
5208
  }
5078
- };
5079
- const getBestMaskPattern = function() {
5080
- let minLostPoint = 0;
5081
- let pattern = 0;
5082
- for (let i = 0; i < 8; i += 1) {
5083
- makeImpl(true, i);
5084
- const lostPoint = QRUtil.getLostPoint(_this);
5085
- if (i == 0 || minLostPoint > lostPoint) {
5086
- minLostPoint = lostPoint;
5087
- pattern = i;
5088
- }
5209
+ function getBCHTypeInfo(data) {
5210
+ let d = data << 10;
5211
+ while (getBCHDigit(d) - getBCHDigit(G15) >= 0) d ^= G15 << getBCHDigit(d) - getBCHDigit(G15);
5212
+ return (data << 10 | d) ^ G15_MASK;
5089
5213
  }
5090
- return pattern;
5091
- };
5092
- const setupTimingPattern = function() {
5093
- for (let r = 8; r < _moduleCount - 8; r += 1) {
5094
- if (_modules[r][6] != null) {
5095
- continue;
5096
- }
5097
- _modules[r][6] = r % 2 == 0;
5214
+ function getPatternPosition(typeNumber) {
5215
+ return PATTERN_POSITION_TABLE[typeNumber - 1] || [];
5098
5216
  }
5099
- for (let c = 8; c < _moduleCount - 8; c += 1) {
5100
- if (_modules[6][c] != null) {
5101
- continue;
5102
- }
5103
- _modules[6][c] = c % 2 == 0;
5104
- }
5105
- };
5106
- const setupPositionAdjustPattern = function() {
5107
- const pos = QRUtil.getPatternPosition(_typeNumber);
5108
- for (let i = 0; i < pos.length; i += 1) {
5109
- for (let j = 0; j < pos.length; j += 1) {
5110
- const row = pos[i];
5111
- const col = pos[j];
5112
- if (_modules[row][col] != null) {
5113
- continue;
5114
- }
5115
- for (let r = -2; r <= 2; r += 1) {
5116
- for (let c = -2; c <= 2; c += 1) {
5117
- if (r == -2 || r == 2 || c == -2 || c == 2 || r == 0 && c == 0) {
5118
- _modules[row + r][col + c] = true;
5119
- } else {
5120
- _modules[row + r][col + c] = false;
5121
- }
5122
- }
5123
- }
5217
+ function getMaskFunction(maskPattern) {
5218
+ switch (maskPattern) {
5219
+ case 0:
5220
+ return (i, j) => (i + j) % 2 === 0;
5221
+ case 1:
5222
+ return (i, j) => i % 2 === 0;
5223
+ case 2:
5224
+ return (i, j) => j % 3 === 0;
5225
+ case 3:
5226
+ return (i, j) => (i + j) % 3 === 0;
5227
+ case 4:
5228
+ return (i, j) => (Math.floor(i / 2) + Math.floor(j / 3)) % 2 === 0;
5229
+ case 5:
5230
+ return (i, j) => i * j % 2 + i * j % 3 === 0;
5231
+ case 6:
5232
+ return (i, j) => (i * j % 2 + i * j % 3) % 2 === 0;
5233
+ case 7:
5234
+ return (i, j) => (i * j % 3 + (i + j) % 2) % 2 === 0;
5235
+ default:
5236
+ return () => false;
5124
5237
  }
5125
5238
  }
5126
- };
5127
- const setupTypeNumber = function(test) {
5128
- const bits = QRUtil.getBCHTypeNumber(_typeNumber);
5129
- for (let i = 0; i < 18; i += 1) {
5130
- const mod = !test && (bits >> i & 1) == 1;
5131
- _modules[Math.floor(i / 3)][i % 3 + _moduleCount - 8 - 3] = mod;
5132
- }
5133
- for (let i = 0; i < 18; i += 1) {
5134
- const mod = !test && (bits >> i & 1) == 1;
5135
- _modules[i % 3 + _moduleCount - 8 - 3][Math.floor(i / 3)] = mod;
5136
- }
5137
- };
5138
- const setupTypeInfo = function(test, maskPattern) {
5139
- const data = _errorCorrectionLevel << 3 | maskPattern;
5140
- const bits = QRUtil.getBCHTypeInfo(data);
5141
- for (let i = 0; i < 15; i += 1) {
5142
- const mod = !test && (bits >> i & 1) == 1;
5143
- if (i < 6) {
5144
- _modules[i][8] = mod;
5145
- } else if (i < 8) {
5146
- _modules[i + 1][8] = mod;
5147
- } else {
5148
- _modules[_moduleCount - 15 + i][8] = mod;
5239
+ function getRSBlocks(typeNumber, errorCorrectionLevel) {
5240
+ const index = (typeNumber - 1) * 4 + errorCorrectionLevel;
5241
+ const block = RS_BLOCK_TABLE[index];
5242
+ if (!block) throw new Error("bad rs block");
5243
+ const list2 = [];
5244
+ const length = Math.floor(block.length / 3);
5245
+ for (let i = 0; i < length; i++) {
5246
+ const count = block[i * 3];
5247
+ const totalCount = block[i * 3 + 1];
5248
+ const dataCount = block[i * 3 + 2];
5249
+ for (let j = 0; j < count; j++) list2.push({ totalCount, dataCount });
5149
5250
  }
5251
+ return list2;
5150
5252
  }
5151
- for (let i = 0; i < 15; i += 1) {
5152
- const mod = !test && (bits >> i & 1) == 1;
5153
- if (i < 8) {
5154
- _modules[8][_moduleCount - i - 1] = mod;
5155
- } else if (i < 9) {
5156
- _modules[8][15 - i - 1 + 1] = mod;
5157
- } else {
5158
- _modules[8][15 - i - 1] = mod;
5253
+ class BitBuffer {
5254
+ constructor() {
5255
+ __publicField(this, "buffer", []);
5256
+ __publicField(this, "length", 0);
5159
5257
  }
5160
- }
5161
- _modules[_moduleCount - 8][8] = !test;
5162
- };
5163
- const mapData = function(data, maskPattern) {
5164
- let inc = -1;
5165
- let row = _moduleCount - 1;
5166
- let bitIndex = 7;
5167
- let byteIndex = 0;
5168
- const maskFunc = QRUtil.getMaskFunction(maskPattern);
5169
- for (let col = _moduleCount - 1; col > 0; col -= 2) {
5170
- if (col == 6) col -= 1;
5171
- while (true) {
5172
- for (let c = 0; c < 2; c += 1) {
5173
- if (_modules[row][col - c] == null) {
5174
- let dark = false;
5175
- if (byteIndex < data.length) {
5176
- dark = (data[byteIndex] >>> bitIndex & 1) == 1;
5177
- }
5178
- const mask = maskFunc(row, col - c);
5179
- if (mask) {
5180
- dark = !dark;
5181
- }
5182
- _modules[row][col - c] = dark;
5183
- bitIndex -= 1;
5184
- if (bitIndex == -1) {
5185
- byteIndex += 1;
5186
- bitIndex = 7;
5187
- }
5188
- }
5189
- }
5190
- row += inc;
5191
- if (row < 0 || _moduleCount <= row) {
5192
- row -= inc;
5193
- inc = -inc;
5194
- break;
5195
- }
5258
+ getBuffer() {
5259
+ return this.buffer;
5196
5260
  }
5197
- }
5198
- };
5199
- const createBytes = function(buffer, rsBlocks) {
5200
- let offset = 0;
5201
- let maxDcCount = 0;
5202
- let maxEcCount = 0;
5203
- const dcdata = new Array(rsBlocks.length);
5204
- const ecdata = new Array(rsBlocks.length);
5205
- for (let r = 0; r < rsBlocks.length; r += 1) {
5206
- const dcCount = rsBlocks[r].dataCount;
5207
- const ecCount = rsBlocks[r].totalCount - dcCount;
5208
- maxDcCount = Math.max(maxDcCount, dcCount);
5209
- maxEcCount = Math.max(maxEcCount, ecCount);
5210
- dcdata[r] = new Array(dcCount);
5211
- for (let i = 0; i < dcdata[r].length; i += 1) {
5212
- dcdata[r][i] = 255 & buffer.getBuffer()[i + offset];
5213
- }
5214
- offset += dcCount;
5215
- const rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount);
5216
- const rawPoly = qrPolynomial(dcdata[r], rsPoly.getLength() - 1);
5217
- const modPoly = rawPoly.mod(rsPoly);
5218
- ecdata[r] = new Array(rsPoly.getLength() - 1);
5219
- for (let i = 0; i < ecdata[r].length; i += 1) {
5220
- const modIndex = i + modPoly.getLength() - ecdata[r].length;
5221
- ecdata[r][i] = modIndex >= 0 ? modPoly.getAt(modIndex) : 0;
5261
+ getLengthInBits() {
5262
+ return this.length;
5222
5263
  }
5223
- }
5224
- let totalCodeCount = 0;
5225
- for (let i = 0; i < rsBlocks.length; i += 1) {
5226
- totalCodeCount += rsBlocks[i].totalCount;
5227
- }
5228
- const data = new Array(totalCodeCount);
5229
- let index = 0;
5230
- for (let i = 0; i < maxDcCount; i += 1) {
5231
- for (let r = 0; r < rsBlocks.length; r += 1) {
5232
- if (i < dcdata[r].length) {
5233
- data[index] = dcdata[r][i];
5234
- index += 1;
5235
- }
5264
+ put(num, len) {
5265
+ for (let i = 0; i < len; i++) this.putBit((num >>> len - i - 1 & 1) === 1);
5236
5266
  }
5237
- }
5238
- for (let i = 0; i < maxEcCount; i += 1) {
5239
- for (let r = 0; r < rsBlocks.length; r += 1) {
5240
- if (i < ecdata[r].length) {
5241
- data[index] = ecdata[r][i];
5242
- index += 1;
5243
- }
5267
+ putBit(bit) {
5268
+ const bufIndex = Math.floor(this.length / 8);
5269
+ if (this.buffer.length <= bufIndex) this.buffer.push(0);
5270
+ if (bit) this.buffer[bufIndex] |= 128 >>> this.length % 8;
5271
+ this.length++;
5244
5272
  }
5245
5273
  }
5246
- return data;
5247
- };
5248
- const createData = function(typeNumber2, errorCorrectionLevel2, dataList) {
5249
- const rsBlocks = QRRSBlock.getRSBlocks(typeNumber2, errorCorrectionLevel2);
5250
- const buffer = qrBitBuffer();
5251
- for (let i = 0; i < dataList.length; i += 1) {
5252
- const data = dataList[i];
5253
- buffer.put(data.getMode(), 4);
5254
- buffer.put(data.getLength(), QRUtil.getLengthInBits(data.getMode(), typeNumber2));
5255
- data.write(buffer);
5256
- }
5257
- let totalDataCount = 0;
5258
- for (let i = 0; i < rsBlocks.length; i += 1) {
5259
- totalDataCount += rsBlocks[i].dataCount;
5260
- }
5261
- if (buffer.getLengthInBits() > totalDataCount * 8) {
5262
- throw "code length overflow. (" + buffer.getLengthInBits() + ">" + totalDataCount * 8 + ")";
5263
- }
5264
- if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) {
5265
- buffer.put(0, 4);
5274
+ function stringToBytes(s) {
5275
+ const bytes = [];
5276
+ for (let i = 0; i < s.length; i++) bytes.push(s.charCodeAt(i) & 255);
5277
+ return bytes;
5266
5278
  }
5267
- while (buffer.getLengthInBits() % 8 != 0) {
5268
- buffer.putBit(false);
5279
+ function getLengthInBits(mode, type) {
5280
+ if (type < 10) return mode === 4 ? 8 : 8;
5281
+ if (type < 27) return mode === 4 ? 16 : 10;
5282
+ return mode === 4 ? 16 : 12;
5269
5283
  }
5270
- while (true) {
5271
- if (buffer.getLengthInBits() >= totalDataCount * 8) {
5272
- break;
5273
- }
5274
- buffer.put(PAD0, 8);
5275
- if (buffer.getLengthInBits() >= totalDataCount * 8) {
5276
- break;
5277
- }
5278
- buffer.put(PAD1, 8);
5279
- }
5280
- return createBytes(buffer, rsBlocks);
5281
- };
5282
- _this.addData = function(data, mode) {
5283
- mode = mode || "Byte";
5284
- let newData = null;
5285
- switch (mode) {
5286
- case "Numeric":
5287
- newData = qrNumber(data);
5288
- break;
5289
- case "Alphanumeric":
5290
- newData = qrAlphaNum(data);
5291
- break;
5292
- case "Byte":
5293
- newData = qr8BitByte(data);
5294
- break;
5295
- case "Kanji":
5296
- newData = qrKanji(data);
5297
- break;
5298
- default:
5299
- throw "mode:" + mode;
5300
- }
5301
- _dataList.push(newData);
5302
- _dataCache = null;
5303
- };
5304
- _this.isDark = function(row, col) {
5305
- if (row < 0 || _moduleCount <= row || col < 0 || _moduleCount <= col) {
5306
- throw row + "," + col;
5307
- }
5308
- return _modules[row][col];
5309
- };
5310
- _this.getModuleCount = function() {
5311
- return _moduleCount;
5312
- };
5313
- _this.make = function() {
5314
- if (_typeNumber < 1) {
5315
- let typeNumber2 = 1;
5316
- for (; typeNumber2 < 40; typeNumber2++) {
5317
- const rsBlocks = QRRSBlock.getRSBlocks(typeNumber2, _errorCorrectionLevel);
5318
- const buffer = qrBitBuffer();
5319
- for (let i = 0; i < _dataList.length; i++) {
5320
- const data = _dataList[i];
5321
- buffer.put(data.getMode(), 4);
5322
- buffer.put(data.getLength(), QRUtil.getLengthInBits(data.getMode(), typeNumber2));
5323
- data.write(buffer);
5324
- }
5325
- let totalDataCount = 0;
5326
- for (let i = 0; i < rsBlocks.length; i++) {
5327
- totalDataCount += rsBlocks[i].dataCount;
5328
- }
5329
- if (buffer.getLengthInBits() <= totalDataCount * 8) {
5330
- break;
5284
+ function multiplyPolynomials(a, b) {
5285
+ const result = new Array(a.length + b.length - 1).fill(0);
5286
+ for (let i = 0; i < a.length; i++) {
5287
+ for (let j = 0; j < b.length; j++) {
5288
+ result[i + j] ^= gexp(glog(a[i]) + glog(b[j]));
5331
5289
  }
5332
5290
  }
5333
- _typeNumber = typeNumber2;
5334
- }
5335
- makeImpl(false, getBestMaskPattern());
5336
- };
5337
- _this.createTableTag = function(cellSize, margin) {
5338
- cellSize = cellSize || 2;
5339
- margin = typeof margin == "undefined" ? cellSize * 4 : margin;
5340
- let qrHtml = "";
5341
- qrHtml += '<table style="';
5342
- qrHtml += " border-width: 0px; border-style: none;";
5343
- qrHtml += " border-collapse: collapse;";
5344
- qrHtml += " padding: 0px; margin: " + margin + "px;";
5345
- qrHtml += '">';
5346
- qrHtml += "<tbody>";
5347
- for (let r = 0; r < _this.getModuleCount(); r += 1) {
5348
- qrHtml += "<tr>";
5349
- for (let c = 0; c < _this.getModuleCount(); c += 1) {
5350
- qrHtml += '<td style="';
5351
- qrHtml += " border-width: 0px; border-style: none;";
5352
- qrHtml += " border-collapse: collapse;";
5353
- qrHtml += " padding: 0px; margin: 0px;";
5354
- qrHtml += " width: " + cellSize + "px;";
5355
- qrHtml += " height: " + cellSize + "px;";
5356
- qrHtml += " background-color: ";
5357
- qrHtml += _this.isDark(r, c) ? "#000000" : "#ffffff";
5358
- qrHtml += ";";
5359
- qrHtml += '"/>';
5360
- }
5361
- qrHtml += "</tr>";
5362
- }
5363
- qrHtml += "</tbody>";
5364
- qrHtml += "</table>";
5365
- return qrHtml;
5366
- };
5367
- _this.createSvgTag = function(cellSize, margin, alt, title) {
5368
- let opts = {};
5369
- if (typeof arguments[0] == "object") {
5370
- opts = arguments[0];
5371
- cellSize = opts.cellSize;
5372
- margin = opts.margin;
5373
- alt = opts.alt;
5374
- title = opts.title;
5291
+ return result;
5375
5292
  }
5376
- cellSize = cellSize || 2;
5377
- margin = typeof margin == "undefined" ? cellSize * 4 : margin;
5378
- alt = typeof alt === "string" ? { text: alt } : alt || {};
5379
- alt.text = alt.text || null;
5380
- alt.id = alt.text ? alt.id || "qrcode-description" : null;
5381
- title = typeof title === "string" ? { text: title } : title || {};
5382
- title.text = title.text || null;
5383
- title.id = title.text ? title.id || "qrcode-title" : null;
5384
- const size = _this.getModuleCount() * cellSize + margin * 2;
5385
- let c, mc, r, mr, qrSvg = "", rect;
5386
- rect = "l" + cellSize + ",0 0," + cellSize + " -" + cellSize + ",0 0,-" + cellSize + "z ";
5387
- qrSvg += '<svg version="1.1" xmlns="http://www.w3.org/2000/svg"';
5388
- qrSvg += !opts.scalable ? ' width="' + size + 'px" height="' + size + 'px"' : "";
5389
- qrSvg += ' viewBox="0 0 ' + size + " " + size + '" ';
5390
- qrSvg += ' preserveAspectRatio="xMinYMin meet"';
5391
- qrSvg += title.text || alt.text ? ' role="img" aria-labelledby="' + escapeXml([title.id, alt.id].join(" ").trim()) + '"' : "";
5392
- qrSvg += ">";
5393
- qrSvg += title.text ? '<title id="' + escapeXml(title.id) + '">' + escapeXml(title.text) + "</title>" : "";
5394
- qrSvg += alt.text ? '<description id="' + escapeXml(alt.id) + '">' + escapeXml(alt.text) + "</description>" : "";
5395
- qrSvg += '<rect width="100%" height="100%" fill="white" cx="0" cy="0"/>';
5396
- qrSvg += '<path d="';
5397
- for (r = 0; r < _this.getModuleCount(); r += 1) {
5398
- mr = r * cellSize + margin;
5399
- for (c = 0; c < _this.getModuleCount(); c += 1) {
5400
- if (_this.isDark(r, c)) {
5401
- mc = c * cellSize + margin;
5402
- qrSvg += "M" + mc + "," + mr + rect;
5293
+ function modPolynomial(a, b) {
5294
+ let result = [...a];
5295
+ while (result.length >= b.length) {
5296
+ const ratio = glog(result[0]) - glog(b[0]);
5297
+ for (let i = 0; i < b.length; i++) {
5298
+ result[i] ^= gexp(glog(b[i]) + ratio);
5403
5299
  }
5300
+ while (result.length > 0 && result[0] === 0) result.shift();
5404
5301
  }
5302
+ return result;
5405
5303
  }
5406
- qrSvg += '" stroke="transparent" fill="black"/>';
5407
- qrSvg += "</svg>";
5408
- return qrSvg;
5409
- };
5410
- _this.createDataURL = function(cellSize, margin) {
5411
- cellSize = cellSize || 2;
5412
- margin = typeof margin == "undefined" ? cellSize * 4 : margin;
5413
- const size = _this.getModuleCount() * cellSize + margin * 2;
5414
- const min = margin;
5415
- const max = size - margin;
5416
- return createDataURL(size, size, function(x, y) {
5417
- if (min <= x && x < max && min <= y && y < max) {
5418
- const c = Math.floor((x - min) / cellSize);
5419
- const r = Math.floor((y - min) / cellSize);
5420
- return _this.isDark(r, c) ? 0 : 1;
5421
- } else {
5422
- return 1;
5304
+ function getErrorCorrectPolynomial(errorCorrectLength) {
5305
+ let poly = [1];
5306
+ for (let i = 0; i < errorCorrectLength; i++) {
5307
+ poly = multiplyPolynomials(poly, [1, gexp(i)]);
5423
5308
  }
5424
- });
5425
- };
5426
- _this.createImgTag = function(cellSize, margin, alt) {
5427
- cellSize = cellSize || 2;
5428
- margin = typeof margin == "undefined" ? cellSize * 4 : margin;
5429
- const size = _this.getModuleCount() * cellSize + margin * 2;
5430
- let img = "";
5431
- img += "<img";
5432
- img += ' src="';
5433
- img += _this.createDataURL(cellSize, margin);
5434
- img += '"';
5435
- img += ' width="';
5436
- img += size;
5437
- img += '"';
5438
- img += ' height="';
5439
- img += size;
5440
- img += '"';
5441
- if (alt) {
5442
- img += ' alt="';
5443
- img += escapeXml(alt);
5444
- img += '"';
5309
+ return poly;
5445
5310
  }
5446
- img += "/>";
5447
- return img;
5448
- };
5449
- const escapeXml = function(s) {
5450
- let escaped = "";
5451
- for (let i = 0; i < s.length; i += 1) {
5452
- const c = s.charAt(i);
5453
- switch (c) {
5454
- case "<":
5455
- escaped += "&lt;";
5456
- break;
5457
- case ">":
5458
- escaped += "&gt;";
5459
- break;
5460
- case "&":
5461
- escaped += "&amp;";
5462
- break;
5463
- case '"':
5464
- escaped += "&quot;";
5465
- break;
5466
- default:
5467
- escaped += c;
5468
- break;
5311
+ function createData(typeNumber, errorCorrectionLevel, data) {
5312
+ const rsBlocks = getRSBlocks(typeNumber, errorCorrectionLevel);
5313
+ let totalDataCount = 0;
5314
+ for (const block of rsBlocks) totalDataCount += block.dataCount;
5315
+ const buffer = new BitBuffer();
5316
+ buffer.put(4, 4);
5317
+ const bytes = stringToBytes(data);
5318
+ buffer.put(bytes.length, getLengthInBits(4, typeNumber));
5319
+ for (const byte of bytes) buffer.put(byte, 8);
5320
+ if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) buffer.put(0, 4);
5321
+ while (buffer.getLengthInBits() % 8 !== 0) buffer.putBit(false);
5322
+ let padIndex = 0;
5323
+ const padBytes = [PAD0, PAD1];
5324
+ while (buffer.getLengthInBits() < totalDataCount * 8) {
5325
+ buffer.put(padBytes[padIndex], 8);
5326
+ padIndex = (padIndex + 1) % 2;
5327
+ }
5328
+ const dataBuffer = buffer.getBuffer();
5329
+ let dataIndex = 0;
5330
+ const dcData = [];
5331
+ const ecData = [];
5332
+ for (const block of rsBlocks) {
5333
+ const dc = dataBuffer.slice(dataIndex, dataIndex + block.dataCount);
5334
+ dataIndex += block.dataCount;
5335
+ dcData.push(dc);
5336
+ const ecCount = block.totalCount - block.dataCount;
5337
+ const rsPoly = getErrorCorrectPolynomial(ecCount);
5338
+ const dataPoly = [...dc, ...new Array(ecCount).fill(0)];
5339
+ const ec = modPolynomial(dataPoly, rsPoly);
5340
+ ecData.push(ec.slice(-ecCount));
5469
5341
  }
5470
- }
5471
- return escaped;
5472
- };
5473
- const _createHalfASCII = function(margin) {
5474
- const cellSize = 1;
5475
- margin = typeof margin == "undefined" ? cellSize * 2 : margin;
5476
- const size = _this.getModuleCount() * cellSize + margin * 2;
5477
- const min = margin;
5478
- const max = size - margin;
5479
- let y, x, r1, r2, p;
5480
- const blocks = {
5481
- "██": "█",
5482
- "█ ": "▀",
5483
- " █": "▄",
5484
- " ": " "
5485
- };
5486
- const blocksLastLineNoMargin = {
5487
- "██": "▀",
5488
- "█ ": "▀",
5489
- " █": " ",
5490
- " ": " "
5491
- };
5492
- let ascii = "";
5493
- for (y = 0; y < size; y += 2) {
5494
- r1 = Math.floor((y - min) / cellSize);
5495
- r2 = Math.floor((y + 1 - min) / cellSize);
5496
- for (x = 0; x < size; x += 1) {
5497
- p = "█";
5498
- if (min <= x && x < max && min <= y && y < max && _this.isDark(r1, Math.floor((x - min) / cellSize))) {
5499
- p = " ";
5500
- }
5501
- if (min <= x && x < max && min <= y + 1 && y + 1 < max && _this.isDark(r2, Math.floor((x - min) / cellSize))) {
5502
- p += " ";
5503
- } else {
5504
- p += "█";
5342
+ const result = [];
5343
+ let maxDcCount = 0;
5344
+ let maxEcCount = 0;
5345
+ for (const block of rsBlocks) {
5346
+ maxDcCount = Math.max(maxDcCount, block.dataCount);
5347
+ maxEcCount = Math.max(maxEcCount, block.totalCount - block.dataCount);
5348
+ }
5349
+ for (let i = 0; i < maxDcCount; i++) {
5350
+ for (const dc of dcData) {
5351
+ if (i < dc.length) result.push(dc[i]);
5505
5352
  }
5506
- ascii += margin < 1 && y + 1 >= max ? blocksLastLineNoMargin[p] : blocks[p];
5507
5353
  }
5508
- ascii += "\n";
5509
- }
5510
- if (size % 2 && margin > 0) {
5511
- return ascii.substring(0, ascii.length - size - 1) + Array(size + 1).join("▀");
5512
- }
5513
- return ascii.substring(0, ascii.length - 1);
5514
- };
5515
- _this.createASCII = function(cellSize, margin) {
5516
- cellSize = cellSize || 1;
5517
- if (cellSize < 2) {
5518
- return _createHalfASCII(margin);
5519
- }
5520
- cellSize -= 1;
5521
- margin = typeof margin == "undefined" ? cellSize * 2 : margin;
5522
- const size = _this.getModuleCount() * cellSize + margin * 2;
5523
- const min = margin;
5524
- const max = size - margin;
5525
- let y, x, r, p;
5526
- const white = Array(cellSize + 1).join("██");
5527
- const black = Array(cellSize + 1).join(" ");
5528
- let ascii = "";
5529
- let line = "";
5530
- for (y = 0; y < size; y += 1) {
5531
- r = Math.floor((y - min) / cellSize);
5532
- line = "";
5533
- for (x = 0; x < size; x += 1) {
5534
- p = 1;
5535
- if (min <= x && x < max && min <= y && y < max && _this.isDark(r, Math.floor((x - min) / cellSize))) {
5536
- p = 0;
5354
+ for (let i = 0; i < maxEcCount; i++) {
5355
+ for (const ec of ecData) {
5356
+ if (i < ec.length) result.push(ec[i]);
5537
5357
  }
5538
- line += p ? white : black;
5539
- }
5540
- for (r = 0; r < cellSize; r += 1) {
5541
- ascii += line + "\n";
5542
5358
  }
5359
+ return result;
5543
5360
  }
5544
- return ascii.substring(0, ascii.length - 1);
5545
- };
5546
- _this.renderTo2dContext = function(context, cellSize) {
5547
- cellSize = cellSize || 2;
5548
- const length = _this.getModuleCount();
5549
- for (let row = 0; row < length; row++) {
5550
- for (let col = 0; col < length; col++) {
5551
- context.fillStyle = _this.isDark(row, col) ? "black" : "white";
5552
- context.fillRect(col * cellSize, row * cellSize, cellSize, cellSize);
5553
- }
5554
- }
5555
- };
5556
- return _this;
5557
- };
5558
- qrcode.stringToBytes = function(s) {
5559
- const bytes = [];
5560
- for (let i = 0; i < s.length; i += 1) {
5561
- const c = s.charCodeAt(i);
5562
- bytes.push(c & 255);
5563
- }
5564
- return bytes;
5565
- };
5566
- qrcode.createStringToBytes = function(unicodeData, numChars) {
5567
- const unicodeMap = function() {
5568
- const bin = base64DecodeInputStream(unicodeData);
5569
- const read = function() {
5570
- const b = bin.read();
5571
- if (b == -1) throw "eof";
5572
- return b;
5573
- };
5574
- let count = 0;
5575
- const unicodeMap2 = {};
5576
- while (true) {
5577
- const b0 = bin.read();
5578
- if (b0 == -1) break;
5579
- const b1 = read();
5580
- const b2 = read();
5581
- const b3 = read();
5582
- const k = String.fromCharCode(b0 << 8 | b1);
5583
- const v = b2 << 8 | b3;
5584
- unicodeMap2[k] = v;
5585
- count += 1;
5586
- }
5587
- if (count != numChars) {
5588
- throw count + " != " + numChars;
5589
- }
5590
- return unicodeMap2;
5591
- }();
5592
- const unknownChar = "?".charCodeAt(0);
5593
- return function(s) {
5594
- const bytes = [];
5595
- for (let i = 0; i < s.length; i += 1) {
5596
- const c = s.charCodeAt(i);
5597
- if (c < 128) {
5598
- bytes.push(c);
5599
- } else {
5600
- const b = unicodeMap[s.charAt(i)];
5601
- if (typeof b == "number") {
5602
- if ((b & 255) == b) {
5603
- bytes.push(b);
5604
- } else {
5605
- bytes.push(b >>> 8);
5606
- bytes.push(b & 255);
5361
+ function generateQRCode(text, errorLevel) {
5362
+ const ecl = QRErrorCorrectionLevel[errorLevel] ?? 0;
5363
+ let typeNumber = 1;
5364
+ for (; typeNumber <= 40; typeNumber++) {
5365
+ const rsBlocks = getRSBlocks(typeNumber, ecl);
5366
+ let totalDataCount = 0;
5367
+ for (const block of rsBlocks) totalDataCount += block.dataCount;
5368
+ const lengthBits = typeNumber < 10 ? 8 : 16;
5369
+ const totalBits = 4 + lengthBits + stringToBytes(text).length * 8;
5370
+ if (totalBits <= totalDataCount * 8) break;
5371
+ }
5372
+ const size = typeNumber * 4 + 17;
5373
+ const data = createData(typeNumber, ecl, text);
5374
+ const mod = [];
5375
+ for (let i = 0; i < size; i++) mod[i] = new Array(size).fill(null);
5376
+ const setupFinderPattern = (row, col) => {
5377
+ for (let r = -1; r <= 7; r++) {
5378
+ for (let c = -1; c <= 7; c++) {
5379
+ const nr = row + r, nc = col + c;
5380
+ if (nr < 0 || nr >= size || nc < 0 || nc >= size) continue;
5381
+ if (r >= 0 && r <= 6 && (c === 0 || c === 6) || c >= 0 && c <= 6 && (r === 0 || r === 6) || r >= 2 && r <= 4 && c >= 2 && c <= 4) {
5382
+ mod[nr][nc] = true;
5383
+ } else {
5384
+ mod[nr][nc] = false;
5385
+ }
5607
5386
  }
5608
- } else {
5609
- bytes.push(unknownChar);
5610
5387
  }
5611
- }
5612
- }
5613
- return bytes;
5614
- };
5615
- };
5616
- const QRMode = {
5617
- MODE_NUMBER: 1 << 0,
5618
- MODE_ALPHA_NUM: 1 << 1,
5619
- MODE_8BIT_BYTE: 1 << 2,
5620
- MODE_KANJI: 1 << 3
5621
- };
5622
- const QRErrorCorrectionLevel = {
5623
- L: 1,
5624
- M: 0,
5625
- Q: 3,
5626
- H: 2
5627
- };
5628
- const QRMaskPattern = {
5629
- PATTERN000: 0,
5630
- PATTERN001: 1,
5631
- PATTERN010: 2,
5632
- PATTERN011: 3,
5633
- PATTERN100: 4,
5634
- PATTERN101: 5,
5635
- PATTERN110: 6,
5636
- PATTERN111: 7
5637
- };
5638
- const QRUtil = function() {
5639
- const PATTERN_POSITION_TABLE = [
5640
- [],
5641
- [6, 18],
5642
- [6, 22],
5643
- [6, 26],
5644
- [6, 30],
5645
- [6, 34],
5646
- [6, 22, 38],
5647
- [6, 24, 42],
5648
- [6, 26, 46],
5649
- [6, 28, 50],
5650
- [6, 30, 54],
5651
- [6, 32, 58],
5652
- [6, 34, 62],
5653
- [6, 26, 46, 66],
5654
- [6, 26, 48, 70],
5655
- [6, 26, 50, 74],
5656
- [6, 30, 54, 78],
5657
- [6, 30, 56, 82],
5658
- [6, 30, 58, 86],
5659
- [6, 34, 62, 90],
5660
- [6, 28, 50, 72, 94],
5661
- [6, 26, 50, 74, 98],
5662
- [6, 30, 54, 78, 102],
5663
- [6, 28, 54, 80, 106],
5664
- [6, 32, 58, 84, 110],
5665
- [6, 30, 58, 86, 114],
5666
- [6, 34, 62, 90, 118],
5667
- [6, 26, 50, 74, 98, 122],
5668
- [6, 30, 54, 78, 102, 126],
5669
- [6, 26, 52, 78, 104, 130],
5670
- [6, 30, 56, 82, 108, 134],
5671
- [6, 34, 60, 86, 112, 138],
5672
- [6, 30, 58, 86, 114, 142],
5673
- [6, 34, 62, 90, 118, 146],
5674
- [6, 30, 54, 78, 102, 126, 150],
5675
- [6, 24, 50, 76, 102, 128, 154],
5676
- [6, 28, 54, 80, 106, 132, 158],
5677
- [6, 32, 58, 84, 110, 136, 162],
5678
- [6, 26, 54, 82, 110, 138, 166],
5679
- [6, 30, 58, 86, 114, 142, 170]
5680
- ];
5681
- const G15 = 1 << 10 | 1 << 8 | 1 << 5 | 1 << 4 | 1 << 2 | 1 << 1 | 1 << 0;
5682
- const G18 = 1 << 12 | 1 << 11 | 1 << 10 | 1 << 9 | 1 << 8 | 1 << 5 | 1 << 2 | 1 << 0;
5683
- const G15_MASK = 1 << 14 | 1 << 12 | 1 << 10 | 1 << 4 | 1 << 1;
5684
- const _this = {};
5685
- const getBCHDigit = function(data) {
5686
- let digit = 0;
5687
- while (data != 0) {
5688
- digit += 1;
5689
- data >>>= 1;
5690
- }
5691
- return digit;
5692
- };
5693
- _this.getBCHTypeInfo = function(data) {
5694
- let d = data << 10;
5695
- while (getBCHDigit(d) - getBCHDigit(G15) >= 0) {
5696
- d ^= G15 << getBCHDigit(d) - getBCHDigit(G15);
5697
- }
5698
- return (data << 10 | d) ^ G15_MASK;
5699
- };
5700
- _this.getBCHTypeNumber = function(data) {
5701
- let d = data << 12;
5702
- while (getBCHDigit(d) - getBCHDigit(G18) >= 0) {
5703
- d ^= G18 << getBCHDigit(d) - getBCHDigit(G18);
5704
- }
5705
- return data << 12 | d;
5706
- };
5707
- _this.getPatternPosition = function(typeNumber) {
5708
- return PATTERN_POSITION_TABLE[typeNumber - 1];
5709
- };
5710
- _this.getMaskFunction = function(maskPattern) {
5711
- switch (maskPattern) {
5712
- case QRMaskPattern.PATTERN000:
5713
- return function(i, j) {
5714
- return (i + j) % 2 == 0;
5715
- };
5716
- case QRMaskPattern.PATTERN001:
5717
- return function(i, j) {
5718
- return i % 2 == 0;
5719
- };
5720
- case QRMaskPattern.PATTERN010:
5721
- return function(i, j) {
5722
- return j % 3 == 0;
5723
- };
5724
- case QRMaskPattern.PATTERN011:
5725
- return function(i, j) {
5726
- return (i + j) % 3 == 0;
5727
- };
5728
- case QRMaskPattern.PATTERN100:
5729
- return function(i, j) {
5730
- return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 == 0;
5731
- };
5732
- case QRMaskPattern.PATTERN101:
5733
- return function(i, j) {
5734
- return i * j % 2 + i * j % 3 == 0;
5735
- };
5736
- case QRMaskPattern.PATTERN110:
5737
- return function(i, j) {
5738
- return (i * j % 2 + i * j % 3) % 2 == 0;
5739
- };
5740
- case QRMaskPattern.PATTERN111:
5741
- return function(i, j) {
5742
- return (i * j % 3 + (i + j) % 2) % 2 == 0;
5743
- };
5744
- default:
5745
- throw "bad maskPattern:" + maskPattern;
5746
- }
5747
- };
5748
- _this.getErrorCorrectPolynomial = function(errorCorrectLength) {
5749
- let a = qrPolynomial([1], 0);
5750
- for (let i = 0; i < errorCorrectLength; i += 1) {
5751
- a = a.multiply(qrPolynomial([1, QRMath.gexp(i)], 0));
5752
- }
5753
- return a;
5754
- };
5755
- _this.getLengthInBits = function(mode, type) {
5756
- if (1 <= type && type < 10) {
5757
- switch (mode) {
5758
- case QRMode.MODE_NUMBER:
5759
- return 10;
5760
- case QRMode.MODE_ALPHA_NUM:
5761
- return 9;
5762
- case QRMode.MODE_8BIT_BYTE:
5763
- return 8;
5764
- case QRMode.MODE_KANJI:
5765
- return 8;
5766
- default:
5767
- throw "mode:" + mode;
5768
- }
5769
- } else if (type < 27) {
5770
- switch (mode) {
5771
- case QRMode.MODE_NUMBER:
5772
- return 12;
5773
- case QRMode.MODE_ALPHA_NUM:
5774
- return 11;
5775
- case QRMode.MODE_8BIT_BYTE:
5776
- return 16;
5777
- case QRMode.MODE_KANJI:
5778
- return 10;
5779
- default:
5780
- throw "mode:" + mode;
5781
- }
5782
- } else if (type < 41) {
5783
- switch (mode) {
5784
- case QRMode.MODE_NUMBER:
5785
- return 14;
5786
- case QRMode.MODE_ALPHA_NUM:
5787
- return 13;
5788
- case QRMode.MODE_8BIT_BYTE:
5789
- return 16;
5790
- case QRMode.MODE_KANJI:
5791
- return 12;
5792
- default:
5793
- throw "mode:" + mode;
5794
- }
5795
- } else {
5796
- throw "type:" + type;
5797
- }
5798
- };
5799
- _this.getLostPoint = function(qrcode2) {
5800
- const moduleCount = qrcode2.getModuleCount();
5801
- let lostPoint = 0;
5802
- for (let row = 0; row < moduleCount; row += 1) {
5803
- for (let col = 0; col < moduleCount; col += 1) {
5804
- let sameCount = 0;
5805
- const dark = qrcode2.isDark(row, col);
5806
- for (let r = -1; r <= 1; r += 1) {
5807
- if (row + r < 0 || moduleCount <= row + r) {
5808
- continue;
5809
- }
5810
- for (let c = -1; c <= 1; c += 1) {
5811
- if (col + c < 0 || moduleCount <= col + c) {
5812
- continue;
5813
- }
5814
- if (r == 0 && c == 0) {
5815
- continue;
5816
- }
5817
- if (dark == qrcode2.isDark(row + r, col + c)) {
5818
- sameCount += 1;
5388
+ };
5389
+ setupFinderPattern(0, 0);
5390
+ setupFinderPattern(size - 7, 0);
5391
+ setupFinderPattern(0, size - 7);
5392
+ for (let i = 8; i < size - 8; i++) {
5393
+ if (mod[i][6] === null) mod[i][6] = i % 2 === 0;
5394
+ if (mod[6][i] === null) mod[6][i] = i % 2 === 0;
5395
+ }
5396
+ const alignPos = getPatternPosition(typeNumber);
5397
+ for (const row of alignPos) {
5398
+ for (const col of alignPos) {
5399
+ if (mod[row][col] !== null) continue;
5400
+ for (let r = -2; r <= 2; r++) {
5401
+ for (let c = -2; c <= 2; c++) {
5402
+ mod[row + r][col + c] = r === -2 || r === 2 || c === -2 || c === 2 || r === 0 && c === 0;
5819
5403
  }
5820
5404
  }
5821
5405
  }
5822
- if (sameCount > 5) {
5823
- lostPoint += 3 + sameCount - 5;
5824
- }
5825
5406
  }
5826
- }
5827
- for (let row = 0; row < moduleCount - 1; row += 1) {
5828
- for (let col = 0; col < moduleCount - 1; col += 1) {
5829
- let count = 0;
5830
- if (qrcode2.isDark(row, col)) count += 1;
5831
- if (qrcode2.isDark(row + 1, col)) count += 1;
5832
- if (qrcode2.isDark(row, col + 1)) count += 1;
5833
- if (qrcode2.isDark(row + 1, col + 1)) count += 1;
5834
- if (count == 0 || count == 4) {
5835
- lostPoint += 3;
5407
+ for (let i = 0; i < 9; i++) {
5408
+ if (mod[8][i] === null) mod[8][i] = false;
5409
+ if (mod[i][8] === null) mod[i][8] = false;
5410
+ }
5411
+ for (let i = 0; i < 8; i++) {
5412
+ if (mod[8][size - 1 - i] === null) mod[8][size - 1 - i] = false;
5413
+ if (mod[size - 1 - i][8] === null) mod[size - 1 - i][8] = false;
5414
+ }
5415
+ mod[size - 8][8] = true;
5416
+ if (typeNumber >= 7) {
5417
+ const bits = typeNumber;
5418
+ for (let i = 0; i < 6; i++) {
5419
+ for (let j = 0; j < 3; j++) {
5420
+ mod[i][size - 11 + j] = (bits >> i * 3 + j & 1) === 1;
5421
+ mod[size - 11 + j][i] = (bits >> i * 3 + j & 1) === 1;
5422
+ }
5836
5423
  }
5837
5424
  }
5838
- }
5839
- for (let row = 0; row < moduleCount; row += 1) {
5840
- for (let col = 0; col < moduleCount - 6; col += 1) {
5841
- if (qrcode2.isDark(row, col) && !qrcode2.isDark(row, col + 1) && qrcode2.isDark(row, col + 2) && qrcode2.isDark(row, col + 3) && qrcode2.isDark(row, col + 4) && !qrcode2.isDark(row, col + 5) && qrcode2.isDark(row, col + 6)) {
5842
- lostPoint += 40;
5425
+ let bestMask = 0;
5426
+ let bestPenalty = Infinity;
5427
+ for (let mask = 0; mask < 8; mask++) {
5428
+ const testMod = mod.map((row) => [...row]);
5429
+ mapData(testMod, size, data, mask);
5430
+ const penalty = calculatePenalty(testMod, size);
5431
+ if (penalty < bestPenalty) {
5432
+ bestPenalty = penalty;
5433
+ bestMask = mask;
5843
5434
  }
5844
5435
  }
5845
- }
5846
- for (let col = 0; col < moduleCount; col += 1) {
5847
- for (let row = 0; row < moduleCount - 6; row += 1) {
5848
- if (qrcode2.isDark(row, col) && !qrcode2.isDark(row + 1, col) && qrcode2.isDark(row + 2, col) && qrcode2.isDark(row + 3, col) && qrcode2.isDark(row + 4, col) && !qrcode2.isDark(row + 5, col) && qrcode2.isDark(row + 6, col)) {
5849
- lostPoint += 40;
5436
+ mapData(mod, size, data, bestMask);
5437
+ const formatData = ecl << 3 | bestMask;
5438
+ const formatBits = getBCHTypeInfo(formatData);
5439
+ for (let i = 0; i < 6; i++) mod[8][i] = (formatBits >> i & 1) === 1;
5440
+ mod[8][7] = (formatBits >> 6 & 1) === 1;
5441
+ mod[8][8] = (formatBits >> 7 & 1) === 1;
5442
+ mod[7][8] = (formatBits >> 8 & 1) === 1;
5443
+ for (let i = 9; i < 15; i++) mod[14 - i][8] = (formatBits >> i & 1) === 1;
5444
+ for (let i = 0; i < 8; i++) mod[8][size - 1 - i] = (formatBits >> i & 1) === 1;
5445
+ for (let i = 8; i < 15; i++) mod[size - 15 + i][8] = (formatBits >> i & 1) === 1;
5446
+ const result = [];
5447
+ for (let r = 0; r < size; r++) {
5448
+ result[r] = [];
5449
+ for (let c = 0; c < size; c++) {
5450
+ result[r][c] = mod[r][c] === true;
5850
5451
  }
5851
5452
  }
5453
+ return { modules: result, moduleCount: size };
5852
5454
  }
5853
- let darkCount = 0;
5854
- for (let col = 0; col < moduleCount; col += 1) {
5855
- for (let row = 0; row < moduleCount; row += 1) {
5856
- if (qrcode2.isDark(row, col)) {
5857
- darkCount += 1;
5455
+ function mapData(mod, size, data, maskPattern) {
5456
+ const maskFunc = getMaskFunction(maskPattern);
5457
+ let bitIndex = 0;
5458
+ let inc = -1;
5459
+ let row = size - 1;
5460
+ for (let col = size - 1; col > 0; col -= 2) {
5461
+ if (col === 6) col = 5;
5462
+ while (true) {
5463
+ for (let c = 0; c < 2; c++) {
5464
+ const tc = col - c;
5465
+ if (mod[row][tc] === null) {
5466
+ let dark = false;
5467
+ if (bitIndex < data.length * 8) {
5468
+ dark = (data[Math.floor(bitIndex / 8)] >>> 7 - bitIndex % 8 & 1) === 1;
5469
+ }
5470
+ if (maskFunc(row, tc)) dark = !dark;
5471
+ mod[row][tc] = dark;
5472
+ bitIndex++;
5473
+ }
5474
+ }
5475
+ row += inc;
5476
+ if (row < 0 || row >= size) {
5477
+ row -= inc;
5478
+ inc = -inc;
5479
+ break;
5480
+ }
5858
5481
  }
5859
5482
  }
5860
5483
  }
5861
- const ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;
5862
- lostPoint += ratio * 10;
5863
- return lostPoint;
5864
- };
5865
- return _this;
5866
- }();
5867
- const QRMath = function() {
5868
- const EXP_TABLE = new Array(256);
5869
- const LOG_TABLE = new Array(256);
5870
- for (let i = 0; i < 8; i += 1) {
5871
- EXP_TABLE[i] = 1 << i;
5872
- }
5873
- for (let i = 8; i < 256; i += 1) {
5874
- EXP_TABLE[i] = EXP_TABLE[i - 4] ^ EXP_TABLE[i - 5] ^ EXP_TABLE[i - 6] ^ EXP_TABLE[i - 8];
5875
- }
5876
- for (let i = 0; i < 255; i += 1) {
5877
- LOG_TABLE[EXP_TABLE[i]] = i;
5878
- }
5879
- const _this = {};
5880
- _this.glog = function(n) {
5881
- if (n < 1) {
5882
- throw "glog(" + n + ")";
5883
- }
5884
- return LOG_TABLE[n];
5885
- };
5886
- _this.gexp = function(n) {
5887
- while (n < 0) {
5888
- n += 255;
5889
- }
5890
- while (n >= 256) {
5891
- n -= 255;
5892
- }
5893
- return EXP_TABLE[n];
5894
- };
5895
- return _this;
5896
- }();
5897
- const qrPolynomial = function(num, shift) {
5898
- if (typeof num.length == "undefined") {
5899
- throw num.length + "/" + shift;
5900
- }
5901
- const _num = function() {
5902
- let offset = 0;
5903
- while (offset < num.length && num[offset] == 0) {
5904
- offset += 1;
5905
- }
5906
- const _num2 = new Array(num.length - offset + shift);
5907
- for (let i = 0; i < num.length - offset; i += 1) {
5908
- _num2[i] = num[i + offset];
5909
- }
5910
- return _num2;
5911
- }();
5912
- const _this = {};
5913
- _this.getAt = function(index) {
5914
- return _num[index];
5915
- };
5916
- _this.getLength = function() {
5917
- return _num.length;
5918
- };
5919
- _this.multiply = function(e) {
5920
- const num2 = new Array(_this.getLength() + e.getLength() - 1);
5921
- for (let i = 0; i < _this.getLength(); i += 1) {
5922
- for (let j = 0; j < e.getLength(); j += 1) {
5923
- num2[i + j] ^= QRMath.gexp(QRMath.glog(_this.getAt(i)) + QRMath.glog(e.getAt(j)));
5924
- }
5925
- }
5926
- return qrPolynomial(num2, 0);
5927
- };
5928
- _this.mod = function(e) {
5929
- if (_this.getLength() - e.getLength() < 0) {
5930
- return _this;
5931
- }
5932
- const ratio = QRMath.glog(_this.getAt(0)) - QRMath.glog(e.getAt(0));
5933
- const num2 = new Array(_this.getLength());
5934
- for (let i = 0; i < _this.getLength(); i += 1) {
5935
- num2[i] = _this.getAt(i);
5936
- }
5937
- for (let i = 0; i < e.getLength(); i += 1) {
5938
- num2[i] ^= QRMath.gexp(QRMath.glog(e.getAt(i)) + ratio);
5939
- }
5940
- return qrPolynomial(num2, 0).mod(e);
5941
- };
5942
- return _this;
5943
- };
5944
- const QRRSBlock = function() {
5945
- const RS_BLOCK_TABLE = [
5946
- // L
5947
- // M
5948
- // Q
5949
- // H
5950
- // 1
5951
- [1, 26, 19],
5952
- [1, 26, 16],
5953
- [1, 26, 13],
5954
- [1, 26, 9],
5955
- // 2
5956
- [1, 44, 34],
5957
- [1, 44, 28],
5958
- [1, 44, 22],
5959
- [1, 44, 16],
5960
- // 3
5961
- [1, 70, 55],
5962
- [1, 70, 44],
5963
- [2, 35, 17],
5964
- [2, 35, 13],
5965
- // 4
5966
- [1, 100, 80],
5967
- [2, 50, 32],
5968
- [2, 50, 24],
5969
- [4, 25, 9],
5970
- // 5
5971
- [1, 134, 108],
5972
- [2, 67, 43],
5973
- [2, 33, 15, 2, 34, 16],
5974
- [2, 33, 11, 2, 34, 12],
5975
- // 6
5976
- [2, 86, 68],
5977
- [4, 43, 27],
5978
- [4, 43, 19],
5979
- [4, 43, 15],
5980
- // 7
5981
- [2, 98, 78],
5982
- [4, 49, 31],
5983
- [2, 32, 14, 4, 33, 15],
5984
- [4, 39, 13, 1, 40, 14],
5985
- // 8
5986
- [2, 121, 97],
5987
- [2, 60, 38, 2, 61, 39],
5988
- [4, 40, 18, 2, 41, 19],
5989
- [4, 40, 14, 2, 41, 15],
5990
- // 9
5991
- [2, 146, 116],
5992
- [3, 58, 36, 2, 59, 37],
5993
- [4, 36, 16, 4, 37, 17],
5994
- [4, 36, 12, 4, 37, 13],
5995
- // 10
5996
- [2, 86, 68, 2, 87, 69],
5997
- [4, 69, 43, 1, 70, 44],
5998
- [6, 43, 19, 2, 44, 20],
5999
- [6, 43, 15, 2, 44, 16],
6000
- // 11
6001
- [4, 101, 81],
6002
- [1, 80, 50, 4, 81, 51],
6003
- [4, 50, 22, 4, 51, 23],
6004
- [3, 36, 12, 8, 37, 13],
6005
- // 12
6006
- [2, 116, 92, 2, 117, 93],
6007
- [6, 58, 36, 2, 59, 37],
6008
- [4, 46, 20, 6, 47, 21],
6009
- [7, 42, 14, 4, 43, 15],
6010
- // 13
6011
- [4, 133, 107],
6012
- [8, 59, 37, 1, 60, 38],
6013
- [8, 44, 20, 4, 45, 21],
6014
- [12, 33, 11, 4, 34, 12],
6015
- // 14
6016
- [3, 145, 115, 1, 146, 116],
6017
- [4, 64, 40, 5, 65, 41],
6018
- [11, 36, 16, 5, 37, 17],
6019
- [11, 36, 12, 5, 37, 13],
6020
- // 15
6021
- [5, 109, 87, 1, 110, 88],
6022
- [5, 65, 41, 5, 66, 42],
6023
- [5, 54, 24, 7, 55, 25],
6024
- [11, 36, 12, 7, 37, 13],
6025
- // 16
6026
- [5, 122, 98, 1, 123, 99],
6027
- [7, 73, 45, 3, 74, 46],
6028
- [15, 43, 19, 2, 44, 20],
6029
- [3, 45, 15, 13, 46, 16],
6030
- // 17
6031
- [1, 135, 107, 5, 136, 108],
6032
- [10, 74, 46, 1, 75, 47],
6033
- [1, 50, 22, 15, 51, 23],
6034
- [2, 42, 14, 17, 43, 15],
6035
- // 18
6036
- [5, 150, 120, 1, 151, 121],
6037
- [9, 69, 43, 4, 70, 44],
6038
- [17, 50, 22, 1, 51, 23],
6039
- [2, 42, 14, 19, 43, 15],
6040
- // 19
6041
- [3, 141, 113, 4, 142, 114],
6042
- [3, 70, 44, 11, 71, 45],
6043
- [17, 47, 21, 4, 48, 22],
6044
- [9, 39, 13, 16, 40, 14],
6045
- // 20
6046
- [3, 135, 107, 5, 136, 108],
6047
- [3, 67, 41, 13, 68, 42],
6048
- [15, 54, 24, 5, 55, 25],
6049
- [15, 43, 15, 10, 44, 16],
6050
- // 21
6051
- [4, 144, 116, 4, 145, 117],
6052
- [17, 68, 42],
6053
- [17, 50, 22, 6, 51, 23],
6054
- [19, 46, 16, 6, 47, 17],
6055
- // 22
6056
- [2, 139, 111, 7, 140, 112],
6057
- [17, 74, 46],
6058
- [7, 54, 24, 16, 55, 25],
6059
- [34, 37, 13],
6060
- // 23
6061
- [4, 151, 121, 5, 152, 122],
6062
- [4, 75, 47, 14, 76, 48],
6063
- [11, 54, 24, 14, 55, 25],
6064
- [16, 45, 15, 14, 46, 16],
6065
- // 24
6066
- [6, 147, 117, 4, 148, 118],
6067
- [6, 73, 45, 14, 74, 46],
6068
- [11, 54, 24, 16, 55, 25],
6069
- [30, 46, 16, 2, 47, 17],
6070
- // 25
6071
- [8, 132, 106, 4, 133, 107],
6072
- [8, 75, 47, 13, 76, 48],
6073
- [7, 54, 24, 22, 55, 25],
6074
- [22, 45, 15, 13, 46, 16],
6075
- // 26
6076
- [10, 142, 114, 2, 143, 115],
6077
- [19, 74, 46, 4, 75, 47],
6078
- [28, 50, 22, 6, 51, 23],
6079
- [33, 46, 16, 4, 47, 17],
6080
- // 27
6081
- [8, 152, 122, 4, 153, 123],
6082
- [22, 73, 45, 3, 74, 46],
6083
- [8, 53, 23, 26, 54, 24],
6084
- [12, 45, 15, 28, 46, 16],
6085
- // 28
6086
- [3, 147, 117, 10, 148, 118],
6087
- [3, 73, 45, 23, 74, 46],
6088
- [4, 54, 24, 31, 55, 25],
6089
- [11, 45, 15, 31, 46, 16],
6090
- // 29
6091
- [7, 146, 116, 7, 147, 117],
6092
- [21, 73, 45, 7, 74, 46],
6093
- [1, 53, 23, 37, 54, 24],
6094
- [19, 45, 15, 26, 46, 16],
6095
- // 30
6096
- [5, 145, 115, 10, 146, 116],
6097
- [19, 75, 47, 10, 76, 48],
6098
- [15, 54, 24, 25, 55, 25],
6099
- [23, 45, 15, 25, 46, 16],
6100
- // 31
6101
- [13, 145, 115, 3, 146, 116],
6102
- [2, 74, 46, 29, 75, 47],
6103
- [42, 54, 24, 1, 55, 25],
6104
- [23, 45, 15, 28, 46, 16],
6105
- // 32
6106
- [17, 145, 115],
6107
- [10, 74, 46, 23, 75, 47],
6108
- [10, 54, 24, 35, 55, 25],
6109
- [19, 45, 15, 35, 46, 16],
6110
- // 33
6111
- [17, 145, 115, 1, 146, 116],
6112
- [14, 74, 46, 21, 75, 47],
6113
- [29, 54, 24, 19, 55, 25],
6114
- [11, 45, 15, 46, 46, 16],
6115
- // 34
6116
- [13, 145, 115, 6, 146, 116],
6117
- [14, 74, 46, 23, 75, 47],
6118
- [44, 54, 24, 7, 55, 25],
6119
- [59, 46, 16, 1, 47, 17],
6120
- // 35
6121
- [12, 151, 121, 7, 152, 122],
6122
- [12, 75, 47, 26, 76, 48],
6123
- [39, 54, 24, 14, 55, 25],
6124
- [22, 45, 15, 41, 46, 16],
6125
- // 36
6126
- [6, 151, 121, 14, 152, 122],
6127
- [6, 75, 47, 34, 76, 48],
6128
- [46, 54, 24, 10, 55, 25],
6129
- [2, 45, 15, 64, 46, 16],
6130
- // 37
6131
- [17, 152, 122, 4, 153, 123],
6132
- [29, 74, 46, 14, 75, 47],
6133
- [49, 54, 24, 10, 55, 25],
6134
- [24, 45, 15, 46, 46, 16],
6135
- // 38
6136
- [4, 152, 122, 18, 153, 123],
6137
- [13, 74, 46, 32, 75, 47],
6138
- [48, 54, 24, 14, 55, 25],
6139
- [42, 45, 15, 32, 46, 16],
6140
- // 39
6141
- [20, 147, 117, 4, 148, 118],
6142
- [40, 75, 47, 7, 76, 48],
6143
- [43, 54, 24, 22, 55, 25],
6144
- [10, 45, 15, 67, 46, 16],
6145
- // 40
6146
- [19, 148, 118, 6, 149, 119],
6147
- [18, 75, 47, 31, 76, 48],
6148
- [34, 54, 24, 34, 55, 25],
6149
- [20, 45, 15, 61, 46, 16]
6150
- ];
6151
- const qrRSBlock = function(totalCount, dataCount) {
6152
- const _this2 = {};
6153
- _this2.totalCount = totalCount;
6154
- _this2.dataCount = dataCount;
6155
- return _this2;
6156
- };
6157
- const _this = {};
6158
- const getRsBlockTable = function(typeNumber, errorCorrectionLevel) {
6159
- switch (errorCorrectionLevel) {
6160
- case QRErrorCorrectionLevel.L:
6161
- return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0];
6162
- case QRErrorCorrectionLevel.M:
6163
- return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1];
6164
- case QRErrorCorrectionLevel.Q:
6165
- return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2];
6166
- case QRErrorCorrectionLevel.H:
6167
- return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3];
6168
- default:
6169
- return void 0;
6170
- }
6171
- };
6172
- _this.getRSBlocks = function(typeNumber, errorCorrectionLevel) {
6173
- const rsBlock = getRsBlockTable(typeNumber, errorCorrectionLevel);
6174
- if (typeof rsBlock == "undefined") {
6175
- throw "bad rs block @ typeNumber:" + typeNumber + "/errorCorrectionLevel:" + errorCorrectionLevel;
6176
- }
6177
- const length = rsBlock.length / 3;
6178
- const list2 = [];
6179
- for (let i = 0; i < length; i += 1) {
6180
- const count = rsBlock[i * 3 + 0];
6181
- const totalCount = rsBlock[i * 3 + 1];
6182
- const dataCount = rsBlock[i * 3 + 2];
6183
- for (let j = 0; j < count; j += 1) {
6184
- list2.push(qrRSBlock(totalCount, dataCount));
6185
- }
6186
- }
6187
- return list2;
6188
- };
6189
- return _this;
6190
- }();
6191
- const qrBitBuffer = function() {
6192
- const _buffer = [];
6193
- let _length = 0;
6194
- const _this = {};
6195
- _this.getBuffer = function() {
6196
- return _buffer;
6197
- };
6198
- _this.getAt = function(index) {
6199
- const bufIndex = Math.floor(index / 8);
6200
- return (_buffer[bufIndex] >>> 7 - index % 8 & 1) == 1;
6201
- };
6202
- _this.put = function(num, length) {
6203
- for (let i = 0; i < length; i += 1) {
6204
- _this.putBit((num >>> length - i - 1 & 1) == 1);
6205
- }
6206
- };
6207
- _this.getLengthInBits = function() {
6208
- return _length;
6209
- };
6210
- _this.putBit = function(bit) {
6211
- const bufIndex = Math.floor(_length / 8);
6212
- if (_buffer.length <= bufIndex) {
6213
- _buffer.push(0);
6214
- }
6215
- if (bit) {
6216
- _buffer[bufIndex] |= 128 >>> _length % 8;
6217
- }
6218
- _length += 1;
6219
- };
6220
- return _this;
6221
- };
6222
- const qrNumber = function(data) {
6223
- const _mode = QRMode.MODE_NUMBER;
6224
- const _data = data;
6225
- const _this = {};
6226
- _this.getMode = function() {
6227
- return _mode;
6228
- };
6229
- _this.getLength = function(buffer) {
6230
- return _data.length;
6231
- };
6232
- _this.write = function(buffer) {
6233
- const data2 = _data;
6234
- let i = 0;
6235
- while (i + 2 < data2.length) {
6236
- buffer.put(strToNum(data2.substring(i, i + 3)), 10);
6237
- i += 3;
6238
- }
6239
- if (i < data2.length) {
6240
- if (data2.length - i == 1) {
6241
- buffer.put(strToNum(data2.substring(i, i + 1)), 4);
6242
- } else if (data2.length - i == 2) {
6243
- buffer.put(strToNum(data2.substring(i, i + 2)), 7);
6244
- }
6245
- }
6246
- };
6247
- const strToNum = function(s) {
6248
- let num = 0;
6249
- for (let i = 0; i < s.length; i += 1) {
6250
- num = num * 10 + chatToNum(s.charAt(i));
6251
- }
6252
- return num;
6253
- };
6254
- const chatToNum = function(c) {
6255
- if ("0" <= c && c <= "9") {
6256
- return c.charCodeAt(0) - "0".charCodeAt(0);
6257
- }
6258
- throw "illegal char :" + c;
6259
- };
6260
- return _this;
6261
- };
6262
- const qrAlphaNum = function(data) {
6263
- const _mode = QRMode.MODE_ALPHA_NUM;
6264
- const _data = data;
6265
- const _this = {};
6266
- _this.getMode = function() {
6267
- return _mode;
6268
- };
6269
- _this.getLength = function(buffer) {
6270
- return _data.length;
6271
- };
6272
- _this.write = function(buffer) {
6273
- const s = _data;
6274
- let i = 0;
6275
- while (i + 1 < s.length) {
6276
- buffer.put(
6277
- getCode(s.charAt(i)) * 45 + getCode(s.charAt(i + 1)),
6278
- 11
6279
- );
6280
- i += 2;
6281
- }
6282
- if (i < s.length) {
6283
- buffer.put(getCode(s.charAt(i)), 6);
6284
- }
6285
- };
6286
- const getCode = function(c) {
6287
- if ("0" <= c && c <= "9") {
6288
- return c.charCodeAt(0) - "0".charCodeAt(0);
6289
- } else if ("A" <= c && c <= "Z") {
6290
- return c.charCodeAt(0) - "A".charCodeAt(0) + 10;
6291
- } else {
6292
- switch (c) {
6293
- case " ":
6294
- return 36;
6295
- case "$":
6296
- return 37;
6297
- case "%":
6298
- return 38;
6299
- case "*":
6300
- return 39;
6301
- case "+":
6302
- return 40;
6303
- case "-":
6304
- return 41;
6305
- case ".":
6306
- return 42;
6307
- case "/":
6308
- return 43;
6309
- case ":":
6310
- return 44;
6311
- default:
6312
- throw "illegal char :" + c;
6313
- }
6314
- }
6315
- };
6316
- return _this;
6317
- };
6318
- const qr8BitByte = function(data) {
6319
- const _mode = QRMode.MODE_8BIT_BYTE;
6320
- const _bytes = qrcode.stringToBytes(data);
6321
- const _this = {};
6322
- _this.getMode = function() {
6323
- return _mode;
6324
- };
6325
- _this.getLength = function(buffer) {
6326
- return _bytes.length;
6327
- };
6328
- _this.write = function(buffer) {
6329
- for (let i = 0; i < _bytes.length; i += 1) {
6330
- buffer.put(_bytes[i], 8);
6331
- }
6332
- };
6333
- return _this;
6334
- };
6335
- const qrKanji = function(data) {
6336
- const _mode = QRMode.MODE_KANJI;
6337
- const stringToBytes = qrcode.stringToBytes;
6338
- !function(c, code2) {
6339
- const test = stringToBytes(c);
6340
- if (test.length != 2 || (test[0] << 8 | test[1]) != code2) {
6341
- throw "sjis not supported.";
6342
- }
6343
- }("友", 38726);
6344
- const _bytes = stringToBytes(data);
6345
- const _this = {};
6346
- _this.getMode = function() {
6347
- return _mode;
6348
- };
6349
- _this.getLength = function(buffer) {
6350
- return ~~(_bytes.length / 2);
6351
- };
6352
- _this.write = function(buffer) {
6353
- const data2 = _bytes;
6354
- let i = 0;
6355
- while (i + 1 < data2.length) {
6356
- let c = (255 & data2[i]) << 8 | 255 & data2[i + 1];
6357
- if (33088 <= c && c <= 40956) {
6358
- c -= 33088;
6359
- } else if (57408 <= c && c <= 60351) {
6360
- c -= 49472;
6361
- } else {
6362
- throw "illegal char at " + (i + 1) + "/" + c;
6363
- }
6364
- c = (c >>> 8 & 255) * 192 + (c & 255);
6365
- buffer.put(c, 13);
6366
- i += 2;
6367
- }
6368
- if (i < data2.length) {
6369
- throw "illegal char at " + (i + 1);
6370
- }
6371
- };
6372
- return _this;
6373
- };
6374
- const byteArrayOutputStream = function() {
6375
- const _bytes = [];
6376
- const _this = {};
6377
- _this.writeByte = function(b) {
6378
- _bytes.push(b & 255);
6379
- };
6380
- _this.writeShort = function(i) {
6381
- _this.writeByte(i);
6382
- _this.writeByte(i >>> 8);
6383
- };
6384
- _this.writeBytes = function(b, off, len) {
6385
- off = off || 0;
6386
- len = len || b.length;
6387
- for (let i = 0; i < len; i += 1) {
6388
- _this.writeByte(b[i + off]);
6389
- }
6390
- };
6391
- _this.writeString = function(s) {
6392
- for (let i = 0; i < s.length; i += 1) {
6393
- _this.writeByte(s.charCodeAt(i));
6394
- }
6395
- };
6396
- _this.toByteArray = function() {
6397
- return _bytes;
6398
- };
6399
- _this.toString = function() {
6400
- let s = "";
6401
- s += "[";
6402
- for (let i = 0; i < _bytes.length; i += 1) {
6403
- if (i > 0) {
6404
- s += ",";
6405
- }
6406
- s += _bytes[i];
6407
- }
6408
- s += "]";
6409
- return s;
6410
- };
6411
- return _this;
6412
- };
6413
- const base64EncodeOutputStream = function() {
6414
- let _buffer = 0;
6415
- let _buflen = 0;
6416
- let _length = 0;
6417
- let _base64 = "";
6418
- const _this = {};
6419
- const writeEncoded = function(b) {
6420
- _base64 += String.fromCharCode(encode(b & 63));
6421
- };
6422
- const encode = function(n) {
6423
- if (n < 0) {
6424
- throw "n:" + n;
6425
- } else if (n < 26) {
6426
- return 65 + n;
6427
- } else if (n < 52) {
6428
- return 97 + (n - 26);
6429
- } else if (n < 62) {
6430
- return 48 + (n - 52);
6431
- } else if (n == 62) {
6432
- return 43;
6433
- } else if (n == 63) {
6434
- return 47;
6435
- } else {
6436
- throw "n:" + n;
6437
- }
6438
- };
6439
- _this.writeByte = function(n) {
6440
- _buffer = _buffer << 8 | n & 255;
6441
- _buflen += 8;
6442
- _length += 1;
6443
- while (_buflen >= 6) {
6444
- writeEncoded(_buffer >>> _buflen - 6);
6445
- _buflen -= 6;
6446
- }
6447
- };
6448
- _this.flush = function() {
6449
- if (_buflen > 0) {
6450
- writeEncoded(_buffer << 6 - _buflen);
6451
- _buffer = 0;
6452
- _buflen = 0;
6453
- }
6454
- if (_length % 3 != 0) {
6455
- const padlen = 3 - _length % 3;
6456
- for (let i = 0; i < padlen; i += 1) {
6457
- _base64 += "=";
6458
- }
6459
- }
6460
- };
6461
- _this.toString = function() {
6462
- return _base64;
6463
- };
6464
- return _this;
6465
- };
6466
- const base64DecodeInputStream = function(str) {
6467
- const _str = str;
6468
- let _pos = 0;
6469
- let _buffer = 0;
6470
- let _buflen = 0;
6471
- const _this = {};
6472
- _this.read = function() {
6473
- while (_buflen < 8) {
6474
- if (_pos >= _str.length) {
6475
- if (_buflen == 0) {
6476
- return -1;
5484
+ function calculatePenalty(mod, size) {
5485
+ let penalty = 0;
5486
+ for (let row = 0; row < size; row++) {
5487
+ let count = 1;
5488
+ for (let col = 1; col < size; col++) {
5489
+ if (mod[row][col] === mod[row][col - 1]) {
5490
+ count++;
5491
+ } else {
5492
+ if (count >= 5) penalty += 3 + (count - 5);
5493
+ count = 1;
5494
+ }
6477
5495
  }
6478
- throw "unexpected end of file./" + _buflen;
6479
- }
6480
- const c = _str.charAt(_pos);
6481
- _pos += 1;
6482
- if (c == "=") {
6483
- _buflen = 0;
6484
- return -1;
6485
- } else if (c.match(/^\s$/)) {
6486
- continue;
6487
- }
6488
- _buffer = _buffer << 6 | decode(c.charCodeAt(0));
6489
- _buflen += 6;
6490
- }
6491
- const n = _buffer >>> _buflen - 8 & 255;
6492
- _buflen -= 8;
6493
- return n;
6494
- };
6495
- const decode = function(c) {
6496
- if (65 <= c && c <= 90) {
6497
- return c - 65;
6498
- } else if (97 <= c && c <= 122) {
6499
- return c - 97 + 26;
6500
- } else if (48 <= c && c <= 57) {
6501
- return c - 48 + 52;
6502
- } else if (c == 43) {
6503
- return 62;
6504
- } else if (c == 47) {
6505
- return 63;
6506
- } else {
6507
- throw "c:" + c;
6508
- }
6509
- };
6510
- return _this;
6511
- };
6512
- const gifImage = function(width, height) {
6513
- const _width = width;
6514
- const _height = height;
6515
- const _data = new Array(width * height);
6516
- const _this = {};
6517
- _this.setPixel = function(x, y, pixel) {
6518
- _data[y * _width + x] = pixel;
6519
- };
6520
- _this.write = function(out) {
6521
- out.writeString("GIF87a");
6522
- out.writeShort(_width);
6523
- out.writeShort(_height);
6524
- out.writeByte(128);
6525
- out.writeByte(0);
6526
- out.writeByte(0);
6527
- out.writeByte(0);
6528
- out.writeByte(0);
6529
- out.writeByte(0);
6530
- out.writeByte(255);
6531
- out.writeByte(255);
6532
- out.writeByte(255);
6533
- out.writeString(",");
6534
- out.writeShort(0);
6535
- out.writeShort(0);
6536
- out.writeShort(_width);
6537
- out.writeShort(_height);
6538
- out.writeByte(0);
6539
- const lzwMinCodeSize = 2;
6540
- const raster = getLZWRaster(lzwMinCodeSize);
6541
- out.writeByte(lzwMinCodeSize);
6542
- let offset = 0;
6543
- while (raster.length - offset > 255) {
6544
- out.writeByte(255);
6545
- out.writeBytes(raster, offset, 255);
6546
- offset += 255;
6547
- }
6548
- out.writeByte(raster.length - offset);
6549
- out.writeBytes(raster, offset, raster.length - offset);
6550
- out.writeByte(0);
6551
- out.writeString(";");
6552
- };
6553
- const bitOutputStream = function(out) {
6554
- const _out = out;
6555
- let _bitLength = 0;
6556
- let _bitBuffer = 0;
6557
- const _this2 = {};
6558
- _this2.write = function(data, length) {
6559
- if (data >>> length != 0) {
6560
- throw "length over";
6561
- }
6562
- while (_bitLength + length >= 8) {
6563
- _out.writeByte(255 & (data << _bitLength | _bitBuffer));
6564
- length -= 8 - _bitLength;
6565
- data >>>= 8 - _bitLength;
6566
- _bitBuffer = 0;
6567
- _bitLength = 0;
6568
- }
6569
- _bitBuffer = data << _bitLength | _bitBuffer;
6570
- _bitLength = _bitLength + length;
6571
- };
6572
- _this2.flush = function() {
6573
- if (_bitLength > 0) {
6574
- _out.writeByte(_bitBuffer);
6575
- }
6576
- };
6577
- return _this2;
6578
- };
6579
- const getLZWRaster = function(lzwMinCodeSize) {
6580
- const clearCode = 1 << lzwMinCodeSize;
6581
- const endCode = (1 << lzwMinCodeSize) + 1;
6582
- let bitLength = lzwMinCodeSize + 1;
6583
- const table = lzwTable();
6584
- for (let i = 0; i < clearCode; i += 1) {
6585
- table.add(String.fromCharCode(i));
6586
- }
6587
- table.add(String.fromCharCode(clearCode));
6588
- table.add(String.fromCharCode(endCode));
6589
- const byteOut = byteArrayOutputStream();
6590
- const bitOut = bitOutputStream(byteOut);
6591
- bitOut.write(clearCode, bitLength);
6592
- let dataIndex = 0;
6593
- let s = String.fromCharCode(_data[dataIndex]);
6594
- dataIndex += 1;
6595
- while (dataIndex < _data.length) {
6596
- const c = String.fromCharCode(_data[dataIndex]);
6597
- dataIndex += 1;
6598
- if (table.contains(s + c)) {
6599
- s = s + c;
6600
- } else {
6601
- bitOut.write(table.indexOf(s), bitLength);
6602
- if (table.size() < 4095) {
6603
- if (table.size() == 1 << bitLength) {
6604
- bitLength += 1;
5496
+ if (count >= 5) penalty += 3 + (count - 5);
5497
+ }
5498
+ for (let col = 0; col < size; col++) {
5499
+ let count = 1;
5500
+ for (let row = 1; row < size; row++) {
5501
+ if (mod[row][col] === mod[row - 1][col]) {
5502
+ count++;
5503
+ } else {
5504
+ if (count >= 5) penalty += 3 + (count - 5);
5505
+ count = 1;
6605
5506
  }
6606
- table.add(s + c);
6607
5507
  }
6608
- s = c;
5508
+ if (count >= 5) penalty += 3 + (count - 5);
6609
5509
  }
5510
+ return penalty;
6610
5511
  }
6611
- bitOut.write(table.indexOf(s), bitLength);
6612
- bitOut.write(endCode, bitLength);
6613
- bitOut.flush();
6614
- return byteOut.toByteArray();
6615
- };
6616
- const lzwTable = function() {
6617
- const _map = {};
6618
- let _size = 0;
6619
- const _this2 = {};
6620
- _this2.add = function(key) {
6621
- if (_this2.contains(key)) {
6622
- throw "dup key:" + key;
6623
- }
6624
- _map[key] = _size;
6625
- _size += 1;
6626
- };
6627
- _this2.size = function() {
6628
- return _size;
6629
- };
6630
- _this2.indexOf = function(key) {
6631
- return _map[key];
6632
- };
6633
- _this2.contains = function(key) {
6634
- return typeof _map[key] != "undefined";
6635
- };
6636
- return _this2;
6637
- };
6638
- return _this;
6639
- };
6640
- const createDataURL = function(width, height, getPixel) {
6641
- const gif = gifImage(width, height);
6642
- for (let y = 0; y < height; y += 1) {
6643
- for (let x = 0; x < width; x += 1) {
6644
- gif.setPixel(x, y, getPixel(x, y));
6645
- }
6646
- }
6647
- const b = byteArrayOutputStream();
6648
- gif.write(b);
6649
- const base64 = base64EncodeOutputStream();
6650
- const bytes = b.toByteArray();
6651
- for (let i = 0; i < bytes.length; i += 1) {
6652
- base64.writeByte(bytes[i]);
6653
- }
6654
- base64.flush();
6655
- return "data:image/gif;base64," + base64;
6656
- };
6657
- qrcode.stringToBytes;
6658
- const __default__$1 = {
6659
- options: {
6660
- virtualHost: true,
6661
- styleIsolation: "shared"
6662
- }
6663
- };
6664
- const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
6665
- ...__default__$1,
6666
- __name: "u-qrcode",
6667
- props: {
6668
- value: { default: "" },
6669
- size: { default: 200 },
6670
- color: { default: "#000000" },
6671
- bgColor: { default: "#ffffff" },
6672
- errorCorrectLevel: { default: "M" }
6673
- },
6674
- setup(__props) {
6675
- const props = __props;
6676
- const modules = vue.ref([]);
6677
- const moduleCount = vue.ref(0);
6678
- const cellSize = vue.computed(() => {
6679
- if (moduleCount.value === 0) return 0;
6680
- return props.size / moduleCount.value;
6681
- });
6682
5512
  const generate = () => {
6683
5513
  if (!props.value) {
6684
5514
  modules.value = [];
@@ -6686,19 +5516,9 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
6686
5516
  return;
6687
5517
  }
6688
5518
  try {
6689
- const qr = qrcode(0, props.errorCorrectLevel);
6690
- qr.addData(props.value);
6691
- qr.make();
6692
- const count = qr.getModuleCount();
6693
- moduleCount.value = count;
6694
- const result = [];
6695
- for (let row = 0; row < count; row++) {
6696
- result[row] = [];
6697
- for (let col = 0; col < count; col++) {
6698
- result[row][col] = qr.isDark(row, col);
6699
- }
6700
- }
6701
- modules.value = result;
5519
+ const qr = generateQRCode(props.value, props.errorCorrectLevel);
5520
+ modules.value = qr.modules;
5521
+ moduleCount.value = qr.moduleCount;
6702
5522
  } catch (e) {
6703
5523
  console.error("QR Code generation failed:", e);
6704
5524
  modules.value = [];
@@ -6740,7 +5560,7 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
6740
5560
  };
6741
5561
  }
6742
5562
  });
6743
- const uQrcode = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-135fd2d5"]]);
5563
+ const uQrcode = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-a6ae1830"]]);
6744
5564
  const _hoisted_1 = { class: "u-barcode" };
6745
5565
  const _hoisted_2 = ["canvas-id"];
6746
5566
  const _hoisted_3 = ["src"];