You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2800 lines
70 KiB
2800 lines
70 KiB
3 years ago
|
/*
|
||
|
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
||
|
if you want to view the source, please visit the github repository of this plugin
|
||
|
*/
|
||
|
|
||
|
var __create = Object.create;
|
||
|
var __defProp = Object.defineProperty;
|
||
|
var __defProps = Object.defineProperties;
|
||
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
||
|
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
||
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
||
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
||
|
var __getProtoOf = Object.getPrototypeOf;
|
||
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
||
|
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
||
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
||
|
var __spreadValues = (a, b) => {
|
||
|
for (var prop in b || (b = {}))
|
||
|
if (__hasOwnProp.call(b, prop))
|
||
|
__defNormalProp(a, prop, b[prop]);
|
||
|
if (__getOwnPropSymbols)
|
||
|
for (var prop of __getOwnPropSymbols(b)) {
|
||
|
if (__propIsEnum.call(b, prop))
|
||
|
__defNormalProp(a, prop, b[prop]);
|
||
|
}
|
||
|
return a;
|
||
|
};
|
||
|
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
||
|
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
|
||
|
var __commonJS = (cb, mod) => function __require() {
|
||
|
return mod || (0, cb[Object.keys(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
||
|
};
|
||
|
var __export = (target, all) => {
|
||
|
__markAsModule(target);
|
||
|
for (var name in all)
|
||
|
__defProp(target, name, { get: all[name], enumerable: true });
|
||
|
};
|
||
|
var __reExport = (target, module2, desc) => {
|
||
|
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
|
||
|
for (let key of __getOwnPropNames(module2))
|
||
|
if (!__hasOwnProp.call(target, key) && key !== "default")
|
||
|
__defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
|
||
|
}
|
||
|
return target;
|
||
|
};
|
||
|
var __toModule = (module2) => {
|
||
|
return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
|
||
|
};
|
||
|
var __async = (__this, __arguments, generator) => {
|
||
|
return new Promise((resolve, reject) => {
|
||
|
var fulfilled = (value) => {
|
||
|
try {
|
||
|
step(generator.next(value));
|
||
|
} catch (e) {
|
||
|
reject(e);
|
||
|
}
|
||
|
};
|
||
|
var rejected = (value) => {
|
||
|
try {
|
||
|
step(generator.throw(value));
|
||
|
} catch (e) {
|
||
|
reject(e);
|
||
|
}
|
||
|
};
|
||
|
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
||
|
step((generator = generator.apply(__this, __arguments)).next());
|
||
|
});
|
||
|
};
|
||
|
|
||
|
// node_modules/qrious/dist/qrious.js
|
||
|
var require_qrious = __commonJS({
|
||
|
"node_modules/qrious/dist/qrious.js"(exports, module2) {
|
||
|
(function(global, factory) {
|
||
|
typeof exports === "object" && typeof module2 !== "undefined" ? module2.exports = factory() : typeof define === "function" && define.amd ? define(factory) : global.QRious = factory();
|
||
|
})(exports, function() {
|
||
|
"use strict";
|
||
|
var Constructor = function() {
|
||
|
};
|
||
|
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
||
|
var slice = Array.prototype.slice;
|
||
|
function createObject(prototype, properties) {
|
||
|
var result;
|
||
|
if (typeof Object.create === "function") {
|
||
|
result = Object.create(prototype);
|
||
|
} else {
|
||
|
Constructor.prototype = prototype;
|
||
|
result = new Constructor();
|
||
|
Constructor.prototype = null;
|
||
|
}
|
||
|
if (properties) {
|
||
|
extendObject(true, result, properties);
|
||
|
}
|
||
|
return result;
|
||
|
}
|
||
|
function extend(name, constructor, prototype, statics) {
|
||
|
var superConstructor = this;
|
||
|
if (typeof name !== "string") {
|
||
|
statics = prototype;
|
||
|
prototype = constructor;
|
||
|
constructor = name;
|
||
|
name = null;
|
||
|
}
|
||
|
if (typeof constructor !== "function") {
|
||
|
statics = prototype;
|
||
|
prototype = constructor;
|
||
|
constructor = function() {
|
||
|
return superConstructor.apply(this, arguments);
|
||
|
};
|
||
|
}
|
||
|
extendObject(false, constructor, superConstructor, statics);
|
||
|
constructor.prototype = createObject(superConstructor.prototype, prototype);
|
||
|
constructor.prototype.constructor = constructor;
|
||
|
constructor.class_ = name || superConstructor.class_;
|
||
|
constructor.super_ = superConstructor;
|
||
|
return constructor;
|
||
|
}
|
||
|
function extendObject(own, target, sources) {
|
||
|
sources = slice.call(arguments, 2);
|
||
|
var property;
|
||
|
var source;
|
||
|
for (var i = 0, length = sources.length; i < length; i++) {
|
||
|
source = sources[i];
|
||
|
for (property in source) {
|
||
|
if (!own || hasOwnProperty.call(source, property)) {
|
||
|
target[property] = source[property];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
var extend_1 = extend;
|
||
|
function Nevis() {
|
||
|
}
|
||
|
Nevis.class_ = "Nevis";
|
||
|
Nevis.super_ = Object;
|
||
|
Nevis.extend = extend_1;
|
||
|
var nevis = Nevis;
|
||
|
var lite = nevis;
|
||
|
var Renderer = lite.extend(function(qrious, element, enabled) {
|
||
|
this.qrious = qrious;
|
||
|
this.element = element;
|
||
|
this.element.qrious = qrious;
|
||
|
this.enabled = Boolean(enabled);
|
||
|
}, {
|
||
|
draw: function(frame) {
|
||
|
},
|
||
|
getElement: function() {
|
||
|
if (!this.enabled) {
|
||
|
this.enabled = true;
|
||
|
this.render();
|
||
|
}
|
||
|
return this.element;
|
||
|
},
|
||
|
getModuleSize: function(frame) {
|
||
|
var qrious = this.qrious;
|
||
|
var padding = qrious.padding || 0;
|
||
|
var pixels = Math.floor((qrious.size - padding * 2) / frame.width);
|
||
|
return Math.max(1, pixels);
|
||
|
},
|
||
|
getOffset: function(frame) {
|
||
|
var qrious = this.qrious;
|
||
|
var padding = qrious.padding;
|
||
|
if (padding != null) {
|
||
|
return padding;
|
||
|
}
|
||
|
var moduleSize = this.getModuleSize(frame);
|
||
|
var offset = Math.floor((qrious.size - moduleSize * frame.width) / 2);
|
||
|
return Math.max(0, offset);
|
||
|
},
|
||
|
render: function(frame) {
|
||
|
if (this.enabled) {
|
||
|
this.resize();
|
||
|
this.reset();
|
||
|
this.draw(frame);
|
||
|
}
|
||
|
},
|
||
|
reset: function() {
|
||
|
},
|
||
|
resize: function() {
|
||
|
}
|
||
|
});
|
||
|
var Renderer_1 = Renderer;
|
||
|
var CanvasRenderer = Renderer_1.extend({
|
||
|
draw: function(frame) {
|
||
|
var i, j;
|
||
|
var qrious = this.qrious;
|
||
|
var moduleSize = this.getModuleSize(frame);
|
||
|
var offset = this.getOffset(frame);
|
||
|
var context = this.element.getContext("2d");
|
||
|
context.fillStyle = qrious.foreground;
|
||
|
context.globalAlpha = qrious.foregroundAlpha;
|
||
|
for (i = 0; i < frame.width; i++) {
|
||
|
for (j = 0; j < frame.width; j++) {
|
||
|
if (frame.buffer[j * frame.width + i]) {
|
||
|
context.fillRect(moduleSize * i + offset, moduleSize * j + offset, moduleSize, moduleSize);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
reset: function() {
|
||
|
var qrious = this.qrious;
|
||
|
var context = this.element.getContext("2d");
|
||
|
var size = qrious.size;
|
||
|
context.lineWidth = 1;
|
||
|
context.clearRect(0, 0, size, size);
|
||
|
context.fillStyle = qrious.background;
|
||
|
context.globalAlpha = qrious.backgroundAlpha;
|
||
|
context.fillRect(0, 0, size, size);
|
||
|
},
|
||
|
resize: function() {
|
||
|
var element = this.element;
|
||
|
element.width = element.height = this.qrious.size;
|
||
|
}
|
||
|
});
|
||
|
var CanvasRenderer_1 = CanvasRenderer;
|
||
|
var Alignment = lite.extend(null, {
|
||
|
BLOCK: [
|
||
|
0,
|
||
|
11,
|
||
|
15,
|
||
|
19,
|
||
|
23,
|
||
|
27,
|
||
|
31,
|
||
|
16,
|
||
|
18,
|
||
|
20,
|
||
|
22,
|
||
|
24,
|
||
|
26,
|
||
|
28,
|
||
|
20,
|
||
|
22,
|
||
|
24,
|
||
|
24,
|
||
|
26,
|
||
|
28,
|
||
|
28,
|
||
|
22,
|
||
|
24,
|
||
|
24,
|
||
|
26,
|
||
|
26,
|
||
|
28,
|
||
|
28,
|
||
|
24,
|
||
|
24,
|
||
|
26,
|
||
|
26,
|
||
|
26,
|
||
|
28,
|
||
|
28,
|
||
|
24,
|
||
|
26,
|
||
|
26,
|
||
|
26,
|
||
|
28,
|
||
|
28
|
||
|
]
|
||
|
});
|
||
|
var Alignment_1 = Alignment;
|
||
|
var ErrorCorrection = lite.extend(null, {
|
||
|
BLOCKS: [
|
||
|
1,
|
||
|
0,
|
||
|
19,
|
||
|
7,
|
||
|
1,
|
||
|
0,
|
||
|
16,
|
||
|
10,
|
||
|
1,
|
||
|
0,
|
||
|
13,
|
||
|
13,
|
||
|
1,
|
||
|
0,
|
||
|
9,
|
||
|
17,
|
||
|
1,
|
||
|
0,
|
||
|
34,
|
||
|
10,
|
||
|
1,
|
||
|
0,
|
||
|
28,
|
||
|
16,
|
||
|
1,
|
||
|
0,
|
||
|
22,
|
||
|
22,
|
||
|
1,
|
||
|
0,
|
||
|
16,
|
||
|
28,
|
||
|
1,
|
||
|
0,
|
||
|
55,
|
||
|
15,
|
||
|
1,
|
||
|
0,
|
||
|
44,
|
||
|
26,
|
||
|
2,
|
||
|
0,
|
||
|
17,
|
||
|
18,
|
||
|
2,
|
||
|
0,
|
||
|
13,
|
||
|
22,
|
||
|
1,
|
||
|
0,
|
||
|
80,
|
||
|
20,
|
||
|
2,
|
||
|
0,
|
||
|
32,
|
||
|
18,
|
||
|
2,
|
||
|
0,
|
||
|
24,
|
||
|
26,
|
||
|
4,
|
||
|
0,
|
||
|
9,
|
||
|
16,
|
||
|
1,
|
||
|
0,
|
||
|
108,
|
||
|
26,
|
||
|
2,
|
||
|
0,
|
||
|
43,
|
||
|
24,
|
||
|
2,
|
||
|
2,
|
||
|
15,
|
||
|
18,
|
||
|
2,
|
||
|
2,
|
||
|
11,
|
||
|
22,
|
||
|
2,
|
||
|
0,
|
||
|
68,
|
||
|
18,
|
||
|
4,
|
||
|
0,
|
||
|
27,
|
||
|
16,
|
||
|
4,
|
||
|
0,
|
||
|
19,
|
||
|
24,
|
||
|
4,
|
||
|
0,
|
||
|
15,
|
||
|
28,
|
||
|
2,
|
||
|
0,
|
||
|
78,
|
||
|
20,
|
||
|
4,
|
||
|
0,
|
||
|
31,
|
||
|
18,
|
||
|
2,
|
||
|
4,
|
||
|
14,
|
||
|
18,
|
||
|
4,
|
||
|
1,
|
||
|
13,
|
||
|
26,
|
||
|
2,
|
||
|
0,
|
||
|
97,
|
||
|
24,
|
||
|
2,
|
||
|
2,
|
||
|
38,
|
||
|
22,
|
||
|
4,
|
||
|
2,
|
||
|
18,
|
||
|
22,
|
||
|
4,
|
||
|
2,
|
||
|
14,
|
||
|
26,
|
||
|
2,
|
||
|
0,
|
||
|
116,
|
||
|
30,
|
||
|
3,
|
||
|
2,
|
||
|
36,
|
||
|
22,
|
||
|
4,
|
||
|
4,
|
||
|
16,
|
||
|
20,
|
||
|
4,
|
||
|
4,
|
||
|
12,
|
||
|
24,
|
||
|
2,
|
||
|
2,
|
||
|
68,
|
||
|
18,
|
||
|
4,
|
||
|
1,
|
||
|
43,
|
||
|
26,
|
||
|
6,
|
||
|
2,
|
||
|
19,
|
||
|
24,
|
||
|
6,
|
||
|
2,
|
||
|
15,
|
||
|
28,
|
||
|
4,
|
||
|
0,
|
||
|
81,
|
||
|
20,
|
||
|
1,
|
||
|
4,
|
||
|
50,
|
||
|
30,
|
||
|
4,
|
||
|
4,
|
||
|
22,
|
||
|
28,
|
||
|
3,
|
||
|
8,
|
||
|
12,
|
||
|
24,
|
||
|
2,
|
||
|
2,
|
||
|
92,
|
||
|
24,
|
||
|
6,
|
||
|
2,
|
||
|
36,
|
||
|
22,
|
||
|
4,
|
||
|
6,
|
||
|
20,
|
||
|
26,
|
||
|
7,
|
||
|
4,
|
||
|
14,
|
||
|
28,
|
||
|
4,
|
||
|
0,
|
||
|
107,
|
||
|
26,
|
||
|
8,
|
||
|
1,
|
||
|
37,
|
||
|
22,
|
||
|
8,
|
||
|
4,
|
||
|
20,
|
||
|
24,
|
||
|
12,
|
||
|
4,
|
||
|
11,
|
||
|
22,
|
||
|
3,
|
||
|
1,
|
||
|
115,
|
||
|
30,
|
||
|
4,
|
||
|
5,
|
||
|
40,
|
||
|
24,
|
||
|
11,
|
||
|
5,
|
||
|
16,
|
||
|
20,
|
||
|
11,
|
||
|
5,
|
||
|
12,
|
||
|
24,
|
||
|
5,
|
||
|
1,
|
||
|
87,
|
||
|
22,
|
||
|
5,
|
||
|
5,
|
||
|
41,
|
||
|
24,
|
||
|
5,
|
||
|
7,
|
||
|
24,
|
||
|
30,
|
||
|
11,
|
||
|
7,
|
||
|
12,
|
||
|
24,
|
||
|
5,
|
||
|
1,
|
||
|
98,
|
||
|
24,
|
||
|
7,
|
||
|
3,
|
||
|
45,
|
||
|
28,
|
||
|
15,
|
||
|
2,
|
||
|
19,
|
||
|
24,
|
||
|
3,
|
||
|
13,
|
||
|
15,
|
||
|
30,
|
||
|
1,
|
||
|
5,
|
||
|
107,
|
||
|
28,
|
||
|
10,
|
||
|
1,
|
||
|
46,
|
||
|
28,
|
||
|
1,
|
||
|
15,
|
||
|
22,
|
||
|
28,
|
||
|
2,
|
||
|
17,
|
||
|
14,
|
||
|
28,
|
||
|
5,
|
||
|
1,
|
||
|
120,
|
||
|
30,
|
||
|
9,
|
||
|
4,
|
||
|
43,
|
||
|
26,
|
||
|
17,
|
||
|
1,
|
||
|
22,
|
||
|
28,
|
||
|
2,
|
||
|
19,
|
||
|
14,
|
||
|
28,
|
||
|
3,
|
||
|
4,
|
||
|
113,
|
||
|
28,
|
||
|
3,
|
||
|
11,
|
||
|
44,
|
||
|
26,
|
||
|
17,
|
||
|
4,
|
||
|
21,
|
||
|
26,
|
||
|
9,
|
||
|
16,
|
||
|
13,
|
||
|
26,
|
||
|
3,
|
||
|
5,
|
||
|
107,
|
||
|
28,
|
||
|
3,
|
||
|
13,
|
||
|
41,
|
||
|
26,
|
||
|
15,
|
||
|
5,
|
||
|
24,
|
||
|
30,
|
||
|
15,
|
||
|
10,
|
||
|
15,
|
||
|
28,
|
||
|
4,
|
||
|
4,
|
||
|
116,
|
||
|
28,
|
||
|
17,
|
||
|
0,
|
||
|
42,
|
||
|
26,
|
||
|
17,
|
||
|
6,
|
||
|
22,
|
||
|
28,
|
||
|
19,
|
||
|
6,
|
||
|
16,
|
||
|
30,
|
||
|
2,
|
||
|
7,
|
||
|
111,
|
||
|
28,
|
||
|
17,
|
||
|
0,
|
||
|
46,
|
||
|
28,
|
||
|
7,
|
||
|
16,
|
||
|
24,
|
||
|
30,
|
||
|
34,
|
||
|
0,
|
||
|
13,
|
||
|
24,
|
||
|
4,
|
||
|
5,
|
||
|
121,
|
||
|
30,
|
||
|
4,
|
||
|
14,
|
||
|
47,
|
||
|
28,
|
||
|
11,
|
||
|
14,
|
||
|
24,
|
||
|
30,
|
||
|
16,
|
||
|
14,
|
||
|
15,
|
||
|
30,
|
||
|
6,
|
||
|
4,
|
||
|
117,
|
||
|
30,
|
||
|
6,
|
||
|
14,
|
||
|
45,
|
||
|
28,
|
||
|
11,
|
||
|
16,
|
||
|
24,
|
||
|
30,
|
||
|
30,
|
||
|
2,
|
||
|
16,
|
||
|
30,
|
||
|
8,
|
||
|
4,
|
||
|
106,
|
||
|
26,
|
||
|
8,
|
||
|
13,
|
||
|
47,
|
||
|
28,
|
||
|
7,
|
||
|
22,
|
||
|
24,
|
||
|
30,
|
||
|
22,
|
||
|
13,
|
||
|
15,
|
||
|
30,
|
||
|
10,
|
||
|
2,
|
||
|
114,
|
||
|
28,
|
||
|
19,
|
||
|
4,
|
||
|
46,
|
||
|
28,
|
||
|
28,
|
||
|
6,
|
||
|
22,
|
||
|
28,
|
||
|
33,
|
||
|
4,
|
||
|
16,
|
||
|
30,
|
||
|
8,
|
||
|
4,
|
||
|
122,
|
||
|
30,
|
||
|
22,
|
||
|
3,
|
||
|
45,
|
||
|
28,
|
||
|
8,
|
||
|
26,
|
||
|
23,
|
||
|
30,
|
||
|
12,
|
||
|
28,
|
||
|
15,
|
||
|
30,
|
||
|
3,
|
||
|
10,
|
||
|
117,
|
||
|
30,
|
||
|
3,
|
||
|
23,
|
||
|
45,
|
||
|
28,
|
||
|
4,
|
||
|
31,
|
||
|
24,
|
||
|
30,
|
||
|
11,
|
||
|
31,
|
||
|
15,
|
||
|
30,
|
||
|
7,
|
||
|
7,
|
||
|
116,
|
||
|
30,
|
||
|
21,
|
||
|
7,
|
||
|
45,
|
||
|
28,
|
||
|
1,
|
||
|
37,
|
||
|
23,
|
||
|
30,
|
||
|
19,
|
||
|
26,
|
||
|
15,
|
||
|
30,
|
||
|
5,
|
||
|
10,
|
||
|
115,
|
||
|
30,
|
||
|
19,
|
||
|
10,
|
||
|
47,
|
||
|
28,
|
||
|
15,
|
||
|
25,
|
||
|
24,
|
||
|
30,
|
||
|
23,
|
||
|
25,
|
||
|
15,
|
||
|
30,
|
||
|
13,
|
||
|
3,
|
||
|
115,
|
||
|
30,
|
||
|
2,
|
||
|
29,
|
||
|
46,
|
||
|
28,
|
||
|
42,
|
||
|
1,
|
||
|
24,
|
||
|
30,
|
||
|
23,
|
||
|
28,
|
||
|
15,
|
||
|
30,
|
||
|
17,
|
||
|
0,
|
||
|
115,
|
||
|
30,
|
||
|
10,
|
||
|
23,
|
||
|
46,
|
||
|
28,
|
||
|
10,
|
||
|
35,
|
||
|
24,
|
||
|
30,
|
||
|
19,
|
||
|
35,
|
||
|
15,
|
||
|
30,
|
||
|
17,
|
||
|
1,
|
||
|
115,
|
||
|
30,
|
||
|
14,
|
||
|
21,
|
||
|
46,
|
||
|
28,
|
||
|
29,
|
||
|
19,
|
||
|
24,
|
||
|
30,
|
||
|
11,
|
||
|
46,
|
||
|
15,
|
||
|
30,
|
||
|
13,
|
||
|
6,
|
||
|
115,
|
||
|
30,
|
||
|
14,
|
||
|
23,
|
||
|
46,
|
||
|
28,
|
||
|
44,
|
||
|
7,
|
||
|
24,
|
||
|
30,
|
||
|
59,
|
||
|
1,
|
||
|
16,
|
||
|
30,
|
||
|
12,
|
||
|
7,
|
||
|
121,
|
||
|
30,
|
||
|
12,
|
||
|
26,
|
||
|
47,
|
||
|
28,
|
||
|
39,
|
||
|
14,
|
||
|
24,
|
||
|
30,
|
||
|
22,
|
||
|
41,
|
||
|
15,
|
||
|
30,
|
||
|
6,
|
||
|
14,
|
||
|
121,
|
||
|
30,
|
||
|
6,
|
||
|
34,
|
||
|
47,
|
||
|
28,
|
||
|
46,
|
||
|
10,
|
||
|
24,
|
||
|
30,
|
||
|
2,
|
||
|
64,
|
||
|
15,
|
||
|
30,
|
||
|
17,
|
||
|
4,
|
||
|
122,
|
||
|
30,
|
||
|
29,
|
||
|
14,
|
||
|
46,
|
||
|
28,
|
||
|
49,
|
||
|
10,
|
||
|
24,
|
||
|
30,
|
||
|
24,
|
||
|
46,
|
||
|
15,
|
||
|
30,
|
||
|
4,
|
||
|
18,
|
||
|
122,
|
||
|
30,
|
||
|
13,
|
||
|
32,
|
||
|
46,
|
||
|
28,
|
||
|
48,
|
||
|
14,
|
||
|
24,
|
||
|
30,
|
||
|
42,
|
||
|
32,
|
||
|
15,
|
||
|
30,
|
||
|
20,
|
||
|
4,
|
||
|
117,
|
||
|
30,
|
||
|
40,
|
||
|
7,
|
||
|
47,
|
||
|
28,
|
||
|
43,
|
||
|
22,
|
||
|
24,
|
||
|
30,
|
||
|
10,
|
||
|
67,
|
||
|
15,
|
||
|
30,
|
||
|
19,
|
||
|
6,
|
||
|
118,
|
||
|
30,
|
||
|
18,
|
||
|
31,
|
||
|
47,
|
||
|
28,
|
||
|
34,
|
||
|
34,
|
||
|
24,
|
||
|
30,
|
||
|
20,
|
||
|
61,
|
||
|
15,
|
||
|
30
|
||
|
],
|
||
|
FINAL_FORMAT: [
|
||
|
30660,
|
||
|
29427,
|
||
|
32170,
|
||
|
30877,
|
||
|
26159,
|
||
|
25368,
|
||
|
27713,
|
||
|
26998,
|
||
|
21522,
|
||
|
20773,
|
||
|
24188,
|
||
|
23371,
|
||
|
17913,
|
||
|
16590,
|
||
|
20375,
|
||
|
19104,
|
||
|
13663,
|
||
|
12392,
|
||
|
16177,
|
||
|
14854,
|
||
|
9396,
|
||
|
8579,
|
||
|
11994,
|
||
|
11245,
|
||
|
5769,
|
||
|
5054,
|
||
|
7399,
|
||
|
6608,
|
||
|
1890,
|
||
|
597,
|
||
|
3340,
|
||
|
2107
|
||
|
],
|
||
|
LEVELS: {
|
||
|
L: 1,
|
||
|
M: 2,
|
||
|
Q: 3,
|
||
|
H: 4
|
||
|
}
|
||
|
});
|
||
|
var ErrorCorrection_1 = ErrorCorrection;
|
||
|
var Galois = lite.extend(null, {
|
||
|
EXPONENT: [
|
||
|
1,
|
||
|
2,
|
||
|
4,
|
||
|
8,
|
||
|
16,
|
||
|
32,
|
||
|
64,
|
||
|
128,
|
||
|
29,
|
||
|
58,
|
||
|
116,
|
||
|
232,
|
||
|
205,
|
||
|
135,
|
||
|
19,
|
||
|
38,
|
||
|
76,
|
||
|
152,
|
||
|
45,
|
||
|
90,
|
||
|
180,
|
||
|
117,
|
||
|
234,
|
||
|
201,
|
||
|
143,
|
||
|
3,
|
||
|
6,
|
||
|
12,
|
||
|
24,
|
||
|
48,
|
||
|
96,
|
||
|
192,
|
||
|
157,
|
||
|
39,
|
||
|
78,
|
||
|
156,
|
||
|
37,
|
||
|
74,
|
||
|
148,
|
||
|
53,
|
||
|
106,
|
||
|
212,
|
||
|
181,
|
||
|
119,
|
||
|
238,
|
||
|
193,
|
||
|
159,
|
||
|
35,
|
||
|
70,
|
||
|
140,
|
||
|
5,
|
||
|
10,
|
||
|
20,
|
||
|
40,
|
||
|
80,
|
||
|
160,
|
||
|
93,
|
||
|
186,
|
||
|
105,
|
||
|
210,
|
||
|
185,
|
||
|
111,
|
||
|
222,
|
||
|
161,
|
||
|
95,
|
||
|
190,
|
||
|
97,
|
||
|
194,
|
||
|
153,
|
||
|
47,
|
||
|
94,
|
||
|
188,
|
||
|
101,
|
||
|
202,
|
||
|
137,
|
||
|
15,
|
||
|
30,
|
||
|
60,
|
||
|
120,
|
||
|
240,
|
||
|
253,
|
||
|
231,
|
||
|
211,
|
||
|
187,
|
||
|
107,
|
||
|
214,
|
||
|
177,
|
||
|
127,
|
||
|
254,
|
||
|
225,
|
||
|
223,
|
||
|
163,
|
||
|
91,
|
||
|
182,
|
||
|
113,
|
||
|
226,
|
||
|
217,
|
||
|
175,
|
||
|
67,
|
||
|
134,
|
||
|
17,
|
||
|
34,
|
||
|
68,
|
||
|
136,
|
||
|
13,
|
||
|
26,
|
||
|
52,
|
||
|
104,
|
||
|
208,
|
||
|
189,
|
||
|
103,
|
||
|
206,
|
||
|
129,
|
||
|
31,
|
||
|
62,
|
||
|
124,
|
||
|
248,
|
||
|
237,
|
||
|
199,
|
||
|
147,
|
||
|
59,
|
||
|
118,
|
||
|
236,
|
||
|
197,
|
||
|
151,
|
||
|
51,
|
||
|
102,
|
||
|
204,
|
||
|
133,
|
||
|
23,
|
||
|
46,
|
||
|
92,
|
||
|
184,
|
||
|
109,
|
||
|
218,
|
||
|
169,
|
||
|
79,
|
||
|
158,
|
||
|
33,
|
||
|
66,
|
||
|
132,
|
||
|
21,
|
||
|
42,
|
||
|
84,
|
||
|
168,
|
||
|
77,
|
||
|
154,
|
||
|
41,
|
||
|
82,
|
||
|
164,
|
||
|
85,
|
||
|
170,
|
||
|
73,
|
||
|
146,
|
||
|
57,
|
||
|
114,
|
||
|
228,
|
||
|
213,
|
||
|
183,
|
||
|
115,
|
||
|
230,
|
||
|
209,
|
||
|
191,
|
||
|
99,
|
||
|
198,
|
||
|
145,
|
||
|
63,
|
||
|
126,
|
||
|
252,
|
||
|
229,
|
||
|
215,
|
||
|
179,
|
||
|
123,
|
||
|
246,
|
||
|
241,
|
||
|
255,
|
||
|
227,
|
||
|
219,
|
||
|
171,
|
||
|
75,
|
||
|
150,
|
||
|
49,
|
||
|
98,
|
||
|
196,
|
||
|
149,
|
||
|
55,
|
||
|
110,
|
||
|
220,
|
||
|
165,
|
||
|
87,
|
||
|
174,
|
||
|
65,
|
||
|
130,
|
||
|
25,
|
||
|
50,
|
||
|
100,
|
||
|
200,
|
||
|
141,
|
||
|
7,
|
||
|
14,
|
||
|
28,
|
||
|
56,
|
||
|
112,
|
||
|
224,
|
||
|
221,
|
||
|
167,
|
||
|
83,
|
||
|
166,
|
||
|
81,
|
||
|
162,
|
||
|
89,
|
||
|
178,
|
||
|
121,
|
||
|
242,
|
||
|
249,
|
||
|
239,
|
||
|
195,
|
||
|
155,
|
||
|
43,
|
||
|
86,
|
||
|
172,
|
||
|
69,
|
||
|
138,
|
||
|
9,
|
||
|
18,
|
||
|
36,
|
||
|
72,
|
||
|
144,
|
||
|
61,
|
||
|
122,
|
||
|
244,
|
||
|
245,
|
||
|
247,
|
||
|
243,
|
||
|
251,
|
||
|
235,
|
||
|
203,
|
||
|
139,
|
||
|
11,
|
||
|
22,
|
||
|
44,
|
||
|
88,
|
||
|
176,
|
||
|
125,
|
||
|
250,
|
||
|
233,
|
||
|
207,
|
||
|
131,
|
||
|
27,
|
||
|
54,
|
||
|
108,
|
||
|
216,
|
||
|
173,
|
||
|
71,
|
||
|
142,
|
||
|
0
|
||
|
],
|
||
|
LOG: [
|
||
|
255,
|
||
|
0,
|
||
|
1,
|
||
|
25,
|
||
|
2,
|
||
|
50,
|
||
|
26,
|
||
|
198,
|
||
|
3,
|
||
|
223,
|
||
|
51,
|
||
|
238,
|
||
|
27,
|
||
|
104,
|
||
|
199,
|
||
|
75,
|
||
|
4,
|
||
|
100,
|
||
|
224,
|
||
|
14,
|
||
|
52,
|
||
|
141,
|
||
|
239,
|
||
|
129,
|
||
|
28,
|
||
|
193,
|
||
|
105,
|
||
|
248,
|
||
|
200,
|
||
|
8,
|
||
|
76,
|
||
|
113,
|
||
|
5,
|
||
|
138,
|
||
|
101,
|
||
|
47,
|
||
|
225,
|
||
|
36,
|
||
|
15,
|
||
|
33,
|
||
|
53,
|
||
|
147,
|
||
|
142,
|
||
|
218,
|
||
|
240,
|
||
|
18,
|
||
|
130,
|
||
|
69,
|
||
|
29,
|
||
|
181,
|
||
|
194,
|
||
|
125,
|
||
|
106,
|
||
|
39,
|
||
|
249,
|
||
|
185,
|
||
|
201,
|
||
|
154,
|
||
|
9,
|
||
|
120,
|
||
|
77,
|
||
|
228,
|
||
|
114,
|
||
|
166,
|
||
|
6,
|
||
|
191,
|
||
|
139,
|
||
|
98,
|
||
|
102,
|
||
|
221,
|
||
|
48,
|
||
|
253,
|
||
|
226,
|
||
|
152,
|
||
|
37,
|
||
|
179,
|
||
|
16,
|
||
|
145,
|
||
|
34,
|
||
|
136,
|
||
|
54,
|
||
|
208,
|
||
|
148,
|
||
|
206,
|
||
|
143,
|
||
|
150,
|
||
|
219,
|
||
|
189,
|
||
|
241,
|
||
|
210,
|
||
|
19,
|
||
|
92,
|
||
|
131,
|
||
|
56,
|
||
|
70,
|
||
|
64,
|
||
|
30,
|
||
|
66,
|
||
|
182,
|
||
|
163,
|
||
|
195,
|
||
|
72,
|
||
|
126,
|
||
|
110,
|
||
|
107,
|
||
|
58,
|
||
|
40,
|
||
|
84,
|
||
|
250,
|
||
|
133,
|
||
|
186,
|
||
|
61,
|
||
|
202,
|
||
|
94,
|
||
|
155,
|
||
|
159,
|
||
|
10,
|
||
|
21,
|
||
|
121,
|
||
|
43,
|
||
|
78,
|
||
|
212,
|
||
|
229,
|
||
|
172,
|
||
|
115,
|
||
|
243,
|
||
|
167,
|
||
|
87,
|
||
|
7,
|
||
|
112,
|
||
|
192,
|
||
|
247,
|
||
|
140,
|
||
|
128,
|
||
|
99,
|
||
|
13,
|
||
|
103,
|
||
|
74,
|
||
|
222,
|
||
|
237,
|
||
|
49,
|
||
|
197,
|
||
|
254,
|
||
|
24,
|
||
|
227,
|
||
|
165,
|
||
|
153,
|
||
|
119,
|
||
|
38,
|
||
|
184,
|
||
|
180,
|
||
|
124,
|
||
|
17,
|
||
|
68,
|
||
|
146,
|
||
|
217,
|
||
|
35,
|
||
|
32,
|
||
|
137,
|
||
|
46,
|
||
|
55,
|
||
|
63,
|
||
|
209,
|
||
|
91,
|
||
|
149,
|
||
|
188,
|
||
|
207,
|
||
|
205,
|
||
|
144,
|
||
|
135,
|
||
|
151,
|
||
|
178,
|
||
|
220,
|
||
|
252,
|
||
|
190,
|
||
|
97,
|
||
|
242,
|
||
|
86,
|
||
|
211,
|
||
|
171,
|
||
|
20,
|
||
|
42,
|
||
|
93,
|
||
|
158,
|
||
|
132,
|
||
|
60,
|
||
|
57,
|
||
|
83,
|
||
|
71,
|
||
|
109,
|
||
|
65,
|
||
|
162,
|
||
|
31,
|
||
|
45,
|
||
|
67,
|
||
|
216,
|
||
|
183,
|
||
|
123,
|
||
|
164,
|
||
|
118,
|
||
|
196,
|
||
|
23,
|
||
|
73,
|
||
|
236,
|
||
|
127,
|
||
|
12,
|
||
|
111,
|
||
|
246,
|
||
|
108,
|
||
|
161,
|
||
|
59,
|
||
|
82,
|
||
|
41,
|
||
|
157,
|
||
|
85,
|
||
|
170,
|
||
|
251,
|
||
|
96,
|
||
|
134,
|
||
|
177,
|
||
|
187,
|
||
|
204,
|
||
|
62,
|
||
|
90,
|
||
|
203,
|
||
|
89,
|
||
|
95,
|
||
|
176,
|
||
|
156,
|
||
|
169,
|
||
|
160,
|
||
|
81,
|
||
|
11,
|
||
|
245,
|
||
|
22,
|
||
|
235,
|
||
|
122,
|
||
|
117,
|
||
|
44,
|
||
|
215,
|
||
|
79,
|
||
|
174,
|
||
|
213,
|
||
|
233,
|
||
|
230,
|
||
|
231,
|
||
|
173,
|
||
|
232,
|
||
|
116,
|
||
|
214,
|
||
|
244,
|
||
|
234,
|
||
|
168,
|
||
|
80,
|
||
|
88,
|
||
|
175
|
||
|
]
|
||
|
});
|
||
|
var Galois_1 = Galois;
|
||
|
var Version = lite.extend(null, {
|
||
|
BLOCK: [
|
||
|
3220,
|
||
|
1468,
|
||
|
2713,
|
||
|
1235,
|
||
|
3062,
|
||
|
1890,
|
||
|
2119,
|
||
|
1549,
|
||
|
2344,
|
||
|
2936,
|
||
|
1117,
|
||
|
2583,
|
||
|
1330,
|
||
|
2470,
|
||
|
1667,
|
||
|
2249,
|
||
|
2028,
|
||
|
3780,
|
||
|
481,
|
||
|
4011,
|
||
|
142,
|
||
|
3098,
|
||
|
831,
|
||
|
3445,
|
||
|
592,
|
||
|
2517,
|
||
|
1776,
|
||
|
2234,
|
||
|
1951,
|
||
|
2827,
|
||
|
1070,
|
||
|
2660,
|
||
|
1345,
|
||
|
3177
|
||
|
]
|
||
|
});
|
||
|
var Version_1 = Version;
|
||
|
var Frame = lite.extend(function(options) {
|
||
|
var dataBlock, eccBlock, index2, neccBlock1, neccBlock2;
|
||
|
var valueLength = options.value.length;
|
||
|
this._badness = [];
|
||
|
this._level = ErrorCorrection_1.LEVELS[options.level];
|
||
|
this._polynomial = [];
|
||
|
this._value = options.value;
|
||
|
this._version = 0;
|
||
|
this._stringBuffer = [];
|
||
|
while (this._version < 40) {
|
||
|
this._version++;
|
||
|
index2 = (this._level - 1) * 4 + (this._version - 1) * 16;
|
||
|
neccBlock1 = ErrorCorrection_1.BLOCKS[index2++];
|
||
|
neccBlock2 = ErrorCorrection_1.BLOCKS[index2++];
|
||
|
dataBlock = ErrorCorrection_1.BLOCKS[index2++];
|
||
|
eccBlock = ErrorCorrection_1.BLOCKS[index2];
|
||
|
index2 = dataBlock * (neccBlock1 + neccBlock2) + neccBlock2 - 3 + (this._version <= 9);
|
||
|
if (valueLength <= index2) {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
this._dataBlock = dataBlock;
|
||
|
this._eccBlock = eccBlock;
|
||
|
this._neccBlock1 = neccBlock1;
|
||
|
this._neccBlock2 = neccBlock2;
|
||
|
var width = this.width = 17 + 4 * this._version;
|
||
|
this.buffer = Frame._createArray(width * width);
|
||
|
this._ecc = Frame._createArray(dataBlock + (dataBlock + eccBlock) * (neccBlock1 + neccBlock2) + neccBlock2);
|
||
|
this._mask = Frame._createArray((width * (width + 1) + 1) / 2);
|
||
|
this._insertFinders();
|
||
|
this._insertAlignments();
|
||
|
this.buffer[8 + width * (width - 8)] = 1;
|
||
|
this._insertTimingGap();
|
||
|
this._reverseMask();
|
||
|
this._insertTimingRowAndColumn();
|
||
|
this._insertVersion();
|
||
|
this._syncMask();
|
||
|
this._convertBitStream(valueLength);
|
||
|
this._calculatePolynomial();
|
||
|
this._appendEccToData();
|
||
|
this._interleaveBlocks();
|
||
|
this._pack();
|
||
|
this._finish();
|
||
|
}, {
|
||
|
_addAlignment: function(x, y) {
|
||
|
var i;
|
||
|
var buffer = this.buffer;
|
||
|
var width = this.width;
|
||
|
buffer[x + width * y] = 1;
|
||
|
for (i = -2; i < 2; i++) {
|
||
|
buffer[x + i + width * (y - 2)] = 1;
|
||
|
buffer[x - 2 + width * (y + i + 1)] = 1;
|
||
|
buffer[x + 2 + width * (y + i)] = 1;
|
||
|
buffer[x + i + 1 + width * (y + 2)] = 1;
|
||
|
}
|
||
|
for (i = 0; i < 2; i++) {
|
||
|
this._setMask(x - 1, y + i);
|
||
|
this._setMask(x + 1, y - i);
|
||
|
this._setMask(x - i, y - 1);
|
||
|
this._setMask(x + i, y + 1);
|
||
|
}
|
||
|
},
|
||
|
_appendData: function(data, dataLength, ecc, eccLength) {
|
||
|
var bit, i, j;
|
||
|
var polynomial = this._polynomial;
|
||
|
var stringBuffer = this._stringBuffer;
|
||
|
for (i = 0; i < eccLength; i++) {
|
||
|
stringBuffer[ecc + i] = 0;
|
||
|
}
|
||
|
for (i = 0; i < dataLength; i++) {
|
||
|
bit = Galois_1.LOG[stringBuffer[data + i] ^ stringBuffer[ecc]];
|
||
|
if (bit !== 255) {
|
||
|
for (j = 1; j < eccLength; j++) {
|
||
|
stringBuffer[ecc + j - 1] = stringBuffer[ecc + j] ^ Galois_1.EXPONENT[Frame._modN(bit + polynomial[eccLength - j])];
|
||
|
}
|
||
|
} else {
|
||
|
for (j = ecc; j < ecc + eccLength; j++) {
|
||
|
stringBuffer[j] = stringBuffer[j + 1];
|
||
|
}
|
||
|
}
|
||
|
stringBuffer[ecc + eccLength - 1] = bit === 255 ? 0 : Galois_1.EXPONENT[Frame._modN(bit + polynomial[0])];
|
||
|
}
|
||
|
},
|
||
|
_appendEccToData: function() {
|
||
|
var i;
|
||
|
var data = 0;
|
||
|
var dataBlock = this._dataBlock;
|
||
|
var ecc = this._calculateMaxLength();
|
||
|
var eccBlock = this._eccBlock;
|
||
|
for (i = 0; i < this._neccBlock1; i++) {
|
||
|
this._appendData(data, dataBlock, ecc, eccBlock);
|
||
|
data += dataBlock;
|
||
|
ecc += eccBlock;
|
||
|
}
|
||
|
for (i = 0; i < this._neccBlock2; i++) {
|
||
|
this._appendData(data, dataBlock + 1, ecc, eccBlock);
|
||
|
data += dataBlock + 1;
|
||
|
ecc += eccBlock;
|
||
|
}
|
||
|
},
|
||
|
_applyMask: function(mask) {
|
||
|
var r3x, r3y, x, y;
|
||
|
var buffer = this.buffer;
|
||
|
var width = this.width;
|
||
|
switch (mask) {
|
||
|
case 0:
|
||
|
for (y = 0; y < width; y++) {
|
||
|
for (x = 0; x < width; x++) {
|
||
|
if (!(x + y & 1) && !this._isMasked(x, y)) {
|
||
|
buffer[x + y * width] ^= 1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
case 1:
|
||
|
for (y = 0; y < width; y++) {
|
||
|
for (x = 0; x < width; x++) {
|
||
|
if (!(y & 1) && !this._isMasked(x, y)) {
|
||
|
buffer[x + y * width] ^= 1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
case 2:
|
||
|
for (y = 0; y < width; y++) {
|
||
|
for (r3x = 0, x = 0; x < width; x++, r3x++) {
|
||
|
if (r3x === 3) {
|
||
|
r3x = 0;
|
||
|
}
|
||
|
if (!r3x && !this._isMasked(x, y)) {
|
||
|
buffer[x + y * width] ^= 1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
case 3:
|
||
|
for (r3y = 0, y = 0; y < width; y++, r3y++) {
|
||
|
if (r3y === 3) {
|
||
|
r3y = 0;
|
||
|
}
|
||
|
for (r3x = r3y, x = 0; x < width; x++, r3x++) {
|
||
|
if (r3x === 3) {
|
||
|
r3x = 0;
|
||
|
}
|
||
|
if (!r3x && !this._isMasked(x, y)) {
|
||
|
buffer[x + y * width] ^= 1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
case 4:
|
||
|
for (y = 0; y < width; y++) {
|
||
|
for (r3x = 0, r3y = y >> 1 & 1, x = 0; x < width; x++, r3x++) {
|
||
|
if (r3x === 3) {
|
||
|
r3x = 0;
|
||
|
r3y = !r3y;
|
||
|
}
|
||
|
if (!r3y && !this._isMasked(x, y)) {
|
||
|
buffer[x + y * width] ^= 1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
case 5:
|
||
|
for (r3y = 0, y = 0; y < width; y++, r3y++) {
|
||
|
if (r3y === 3) {
|
||
|
r3y = 0;
|
||
|
}
|
||
|
for (r3x = 0, x = 0; x < width; x++, r3x++) {
|
||
|
if (r3x === 3) {
|
||
|
r3x = 0;
|
||
|
}
|
||
|
if (!((x & y & 1) + !(!r3x | !r3y)) && !this._isMasked(x, y)) {
|
||
|
buffer[x + y * width] ^= 1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
case 6:
|
||
|
for (r3y = 0, y = 0; y < width; y++, r3y++) {
|
||
|
if (r3y === 3) {
|
||
|
r3y = 0;
|
||
|
}
|
||
|
for (r3x = 0, x = 0; x < width; x++, r3x++) {
|
||
|
if (r3x === 3) {
|
||
|
r3x = 0;
|
||
|
}
|
||
|
if (!((x & y & 1) + (r3x && r3x === r3y) & 1) && !this._isMasked(x, y)) {
|
||
|
buffer[x + y * width] ^= 1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
case 7:
|
||
|
for (r3y = 0, y = 0; y < width; y++, r3y++) {
|
||
|
if (r3y === 3) {
|
||
|
r3y = 0;
|
||
|
}
|
||
|
for (r3x = 0, x = 0; x < width; x++, r3x++) {
|
||
|
if (r3x === 3) {
|
||
|
r3x = 0;
|
||
|
}
|
||
|
if (!((r3x && r3x === r3y) + (x + y & 1) & 1) && !this._isMasked(x, y)) {
|
||
|
buffer[x + y * width] ^= 1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
},
|
||
|
_calculateMaxLength: function() {
|
||
|
return this._dataBlock * (this._neccBlock1 + this._neccBlock2) + this._neccBlock2;
|
||
|
},
|
||
|
_calculatePolynomial: function() {
|
||
|
var i, j;
|
||
|
var eccBlock = this._eccBlock;
|
||
|
var polynomial = this._polynomial;
|
||
|
polynomial[0] = 1;
|
||
|
for (i = 0; i < eccBlock; i++) {
|
||
|
polynomial[i + 1] = 1;
|
||
|
for (j = i; j > 0; j--) {
|
||
|
polynomial[j] = polynomial[j] ? polynomial[j - 1] ^ Galois_1.EXPONENT[Frame._modN(Galois_1.LOG[polynomial[j]] + i)] : polynomial[j - 1];
|
||
|
}
|
||
|
polynomial[0] = Galois_1.EXPONENT[Frame._modN(Galois_1.LOG[polynomial[0]] + i)];
|
||
|
}
|
||
|
for (i = 0; i <= eccBlock; i++) {
|
||
|
polynomial[i] = Galois_1.LOG[polynomial[i]];
|
||
|
}
|
||
|
},
|
||
|
_checkBadness: function() {
|
||
|
var b, b1, h, x, y;
|
||
|
var bad = 0;
|
||
|
var badness = this._badness;
|
||
|
var buffer = this.buffer;
|
||
|
var width = this.width;
|
||
|
for (y = 0; y < width - 1; y++) {
|
||
|
for (x = 0; x < width - 1; x++) {
|
||
|
if (buffer[x + width * y] && buffer[x + 1 + width * y] && buffer[x + width * (y + 1)] && buffer[x + 1 + width * (y + 1)] || !(buffer[x + width * y] || buffer[x + 1 + width * y] || buffer[x + width * (y + 1)] || buffer[x + 1 + width * (y + 1)])) {
|
||
|
bad += Frame.N2;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
var bw = 0;
|
||
|
for (y = 0; y < width; y++) {
|
||
|
h = 0;
|
||
|
badness[0] = 0;
|
||
|
for (b = 0, x = 0; x < width; x++) {
|
||
|
b1 = buffer[x + width * y];
|
||
|
if (b === b1) {
|
||
|
badness[h]++;
|
||
|
} else {
|
||
|
badness[++h] = 1;
|
||
|
}
|
||
|
b = b1;
|
||
|
bw += b ? 1 : -1;
|
||
|
}
|
||
|
bad += this._getBadness(h);
|
||
|
}
|
||
|
if (bw < 0) {
|
||
|
bw = -bw;
|
||
|
}
|
||
|
var count = 0;
|
||
|
var big = bw;
|
||
|
big += big << 2;
|
||
|
big <<= 1;
|
||
|
while (big > width * width) {
|
||
|
big -= width * width;
|
||
|
count++;
|
||
|
}
|
||
|
bad += count * Frame.N4;
|
||
|
for (x = 0; x < width; x++) {
|
||
|
h = 0;
|
||
|
badness[0] = 0;
|
||
|
for (b = 0, y = 0; y < width; y++) {
|
||
|
b1 = buffer[x + width * y];
|
||
|
if (b === b1) {
|
||
|
badness[h]++;
|
||
|
} else {
|
||
|
badness[++h] = 1;
|
||
|
}
|
||
|
b = b1;
|
||
|
}
|
||
|
bad += this._getBadness(h);
|
||
|
}
|
||
|
return bad;
|
||
|
},
|
||
|
_convertBitStream: function(length) {
|
||
|
var bit, i;
|
||
|
var ecc = this._ecc;
|
||
|
var version = this._version;
|
||
|
for (i = 0; i < length; i++) {
|
||
|
ecc[i] = this._value.charCodeAt(i);
|
||
|
}
|
||
|
var stringBuffer = this._stringBuffer = ecc.slice();
|
||
|
var maxLength = this._calculateMaxLength();
|
||
|
if (length >= maxLength - 2) {
|
||
|
length = maxLength - 2;
|
||
|
if (version > 9) {
|
||
|
length--;
|
||
|
}
|
||
|
}
|
||
|
var index2 = length;
|
||
|
if (version > 9) {
|
||
|
stringBuffer[index2 + 2] = 0;
|
||
|
stringBuffer[index2 + 3] = 0;
|
||
|
while (index2--) {
|
||
|
bit = stringBuffer[index2];
|
||
|
stringBuffer[index2 + 3] |= 255 & bit << 4;
|
||
|
stringBuffer[index2 + 2] = bit >> 4;
|
||
|
}
|
||
|
stringBuffer[2] |= 255 & length << 4;
|
||
|
stringBuffer[1] = length >> 4;
|
||
|
stringBuffer[0] = 64 | length >> 12;
|
||
|
} else {
|
||
|
stringBuffer[index2 + 1] = 0;
|
||
|
stringBuffer[index2 + 2] = 0;
|
||
|
while (index2--) {
|
||
|
bit = stringBuffer[index2];
|
||
|
stringBuffer[index2 + 2] |= 255 & bit << 4;
|
||
|
stringBuffer[index2 + 1] = bit >> 4;
|
||
|
}
|
||
|
stringBuffer[1] |= 255 & length << 4;
|
||
|
stringBuffer[0] = 64 | length >> 4;
|
||
|
}
|
||
|
index2 = length + 3 - (version < 10);
|
||
|
while (index2 < maxLength) {
|
||
|
stringBuffer[index2++] = 236;
|
||
|
stringBuffer[index2++] = 17;
|
||
|
}
|
||
|
},
|
||
|
_getBadness: function(length) {
|
||
|
var i;
|
||
|
var badRuns = 0;
|
||
|
var badness = this._badness;
|
||
|
for (i = 0; i <= length; i++) {
|
||
|
if (badness[i] >= 5) {
|
||
|
badRuns += Frame.N1 + badness[i] - 5;
|
||
|
}
|
||
|
}
|
||
|
for (i = 3; i < length - 1; i += 2) {
|
||
|
if (badness[i - 2] === badness[i + 2] && badness[i + 2] === badness[i - 1] && badness[i - 1] === badness[i + 1] && badness[i - 1] * 3 === badness[i] && (badness[i - 3] === 0 || i + 3 > length || badness[i - 3] * 3 >= badness[i] * 4 || badness[i + 3] * 3 >= badness[i] * 4)) {
|
||
|
badRuns += Frame.N3;
|
||
|
}
|
||
|
}
|
||
|
return badRuns;
|
||
|
},
|
||
|
_finish: function() {
|
||
|
this._stringBuffer = this.buffer.slice();
|
||
|
var currentMask, i;
|
||
|
var bit = 0;
|
||
|
var mask = 3e4;
|
||
|
for (i = 0; i < 8; i++) {
|
||
|
this._applyMask(i);
|
||
|
currentMask = this._checkBadness();
|
||
|
if (currentMask < mask) {
|
||
|
mask = currentMask;
|
||
|
bit = i;
|
||
|
}
|
||
|
if (bit === 7) {
|
||
|
break;
|
||
|
}
|
||
|
this.buffer = this._stringBuffer.slice();
|
||
|
}
|
||
|
if (bit !== i) {
|
||
|
this._applyMask(bit);
|
||
|
}
|
||
|
mask = ErrorCorrection_1.FINAL_FORMAT[bit + (this._level - 1 << 3)];
|
||
|
var buffer = this.buffer;
|
||
|
var width = this.width;
|
||
|
for (i = 0; i < 8; i++, mask >>= 1) {
|
||
|
if (mask & 1) {
|
||
|
buffer[width - 1 - i + width * 8] = 1;
|
||
|
if (i < 6) {
|
||
|
buffer[8 + width * i] = 1;
|
||
|
} else {
|
||
|
buffer[8 + width * (i + 1)] = 1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
for (i = 0; i < 7; i++, mask >>= 1) {
|
||
|
if (mask & 1) {
|
||
|
buffer[8 + width * (width - 7 + i)] = 1;
|
||
|
if (i) {
|
||
|
buffer[6 - i + width * 8] = 1;
|
||
|
} else {
|
||
|
buffer[7 + width * 8] = 1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
_interleaveBlocks: function() {
|
||
|
var i, j;
|
||
|
var dataBlock = this._dataBlock;
|
||
|
var ecc = this._ecc;
|
||
|
var eccBlock = this._eccBlock;
|
||
|
var k = 0;
|
||
|
var maxLength = this._calculateMaxLength();
|
||
|
var neccBlock1 = this._neccBlock1;
|
||
|
var neccBlock2 = this._neccBlock2;
|
||
|
var stringBuffer = this._stringBuffer;
|
||
|
for (i = 0; i < dataBlock; i++) {
|
||
|
for (j = 0; j < neccBlock1; j++) {
|
||
|
ecc[k++] = stringBuffer[i + j * dataBlock];
|
||
|
}
|
||
|
for (j = 0; j < neccBlock2; j++) {
|
||
|
ecc[k++] = stringBuffer[neccBlock1 * dataBlock + i + j * (dataBlock + 1)];
|
||
|
}
|
||
|
}
|
||
|
for (j = 0; j < neccBlock2; j++) {
|
||
|
ecc[k++] = stringBuffer[neccBlock1 * dataBlock + i + j * (dataBlock + 1)];
|
||
|
}
|
||
|
for (i = 0; i < eccBlock; i++) {
|
||
|
for (j = 0; j < neccBlock1 + neccBlock2; j++) {
|
||
|
ecc[k++] = stringBuffer[maxLength + i + j * eccBlock];
|
||
|
}
|
||
|
}
|
||
|
this._stringBuffer = ecc;
|
||
|
},
|
||
|
_insertAlignments: function() {
|
||
|
var i, x, y;
|
||
|
var version = this._version;
|
||
|
var width = this.width;
|
||
|
if (version > 1) {
|
||
|
i = Alignment_1.BLOCK[version];
|
||
|
y = width - 7;
|
||
|
for (; ; ) {
|
||
|
x = width - 7;
|
||
|
while (x > i - 3) {
|
||
|
this._addAlignment(x, y);
|
||
|
if (x < i) {
|
||
|
break;
|
||
|
}
|
||
|
x -= i;
|
||
|
}
|
||
|
if (y <= i + 9) {
|
||
|
break;
|
||
|
}
|
||
|
y -= i;
|
||
|
this._addAlignment(6, y);
|
||
|
this._addAlignment(y, 6);
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
_insertFinders: function() {
|
||
|
var i, j, x, y;
|
||
|
var buffer = this.buffer;
|
||
|
var width = this.width;
|
||
|
for (i = 0; i < 3; i++) {
|
||
|
j = 0;
|
||
|
y = 0;
|
||
|
if (i === 1) {
|
||
|
j = width - 7;
|
||
|
}
|
||
|
if (i === 2) {
|
||
|
y = width - 7;
|
||
|
}
|
||
|
buffer[y + 3 + width * (j + 3)] = 1;
|
||
|
for (x = 0; x < 6; x++) {
|
||
|
buffer[y + x + width * j] = 1;
|
||
|
buffer[y + width * (j + x + 1)] = 1;
|
||
|
buffer[y + 6 + width * (j + x)] = 1;
|
||
|
buffer[y + x + 1 + width * (j + 6)] = 1;
|
||
|
}
|
||
|
for (x = 1; x < 5; x++) {
|
||
|
this._setMask(y + x, j + 1);
|
||
|
this._setMask(y + 1, j + x + 1);
|
||
|
this._setMask(y + 5, j + x);
|
||
|
this._setMask(y + x + 1, j + 5);
|
||
|
}
|
||
|
for (x = 2; x < 4; x++) {
|
||
|
buffer[y + x + width * (j + 2)] = 1;
|
||
|
buffer[y + 2 + width * (j + x + 1)] = 1;
|
||
|
buffer[y + 4 + width * (j + x)] = 1;
|
||
|
buffer[y + x + 1 + width * (j + 4)] = 1;
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
_insertTimingGap: function() {
|
||
|
var x, y;
|
||
|
var width = this.width;
|
||
|
for (y = 0; y < 7; y++) {
|
||
|
this._setMask(7, y);
|
||
|
this._setMask(width - 8, y);
|
||
|
this._setMask(7, y + width - 7);
|
||
|
}
|
||
|
for (x = 0; x < 8; x++) {
|
||
|
this._setMask(x, 7);
|
||
|
this._setMask(x + width - 8, 7);
|
||
|
this._setMask(x, width - 8);
|
||
|
}
|
||
|
},
|
||
|
_insertTimingRowAndColumn: function() {
|
||
|
var x;
|
||
|
var buffer = this.buffer;
|
||
|
var width = this.width;
|
||
|
for (x = 0; x < width - 14; x++) {
|
||
|
if (x & 1) {
|
||
|
this._setMask(8 + x, 6);
|
||
|
this._setMask(6, 8 + x);
|
||
|
} else {
|
||
|
buffer[8 + x + width * 6] = 1;
|
||
|
buffer[6 + width * (8 + x)] = 1;
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
_insertVersion: function() {
|
||
|
var i, j, x, y;
|
||
|
var buffer = this.buffer;
|
||
|
var version = this._version;
|
||
|
var width = this.width;
|
||
|
if (version > 6) {
|
||
|
i = Version_1.BLOCK[version - 7];
|
||
|
j = 17;
|
||
|
for (x = 0; x < 6; x++) {
|
||
|
for (y = 0; y < 3; y++, j--) {
|
||
|
if (1 & (j > 11 ? version >> j - 12 : i >> j)) {
|
||
|
buffer[5 - x + width * (2 - y + width - 11)] = 1;
|
||
|
buffer[2 - y + width - 11 + width * (5 - x)] = 1;
|
||
|
} else {
|
||
|
this._setMask(5 - x, 2 - y + width - 11);
|
||
|
this._setMask(2 - y + width - 11, 5 - x);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
_isMasked: function(x, y) {
|
||
|
var bit = Frame._getMaskBit(x, y);
|
||
|
return this._mask[bit] === 1;
|
||
|
},
|
||
|
_pack: function() {
|
||
|
var bit, i, j;
|
||
|
var k = 1;
|
||
|
var v = 1;
|
||
|
var width = this.width;
|
||
|
var x = width - 1;
|
||
|
var y = width - 1;
|
||
|
var length = (this._dataBlock + this._eccBlock) * (this._neccBlock1 + this._neccBlock2) + this._neccBlock2;
|
||
|
for (i = 0; i < length; i++) {
|
||
|
bit = this._stringBuffer[i];
|
||
|
for (j = 0; j < 8; j++, bit <<= 1) {
|
||
|
if (128 & bit) {
|
||
|
this.buffer[x + width * y] = 1;
|
||
|
}
|
||
|
do {
|
||
|
if (v) {
|
||
|
x--;
|
||
|
} else {
|
||
|
x++;
|
||
|
if (k) {
|
||
|
if (y !== 0) {
|
||
|
y--;
|
||
|
} else {
|
||
|
x -= 2;
|
||
|
k = !k;
|
||
|
if (x === 6) {
|
||
|
x--;
|
||
|
y = 9;
|
||
|
}
|
||
|
}
|
||
|
} else if (y !== width - 1) {
|
||
|
y++;
|
||
|
} else {
|
||
|
x -= 2;
|
||
|
k = !k;
|
||
|
if (x === 6) {
|
||
|
x--;
|
||
|
y -= 8;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
v = !v;
|
||
|
} while (this._isMasked(x, y));
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
_reverseMask: function() {
|
||
|
var x, y;
|
||
|
var width = this.width;
|
||
|
for (x = 0; x < 9; x++) {
|
||
|
this._setMask(x, 8);
|
||
|
}
|
||
|
for (x = 0; x < 8; x++) {
|
||
|
this._setMask(x + width - 8, 8);
|
||
|
this._setMask(8, x);
|
||
|
}
|
||
|
for (y = 0; y < 7; y++) {
|
||
|
this._setMask(8, y + width - 7);
|
||
|
}
|
||
|
},
|
||
|
_setMask: function(x, y) {
|
||
|
var bit = Frame._getMaskBit(x, y);
|
||
|
this._mask[bit] = 1;
|
||
|
},
|
||
|
_syncMask: function() {
|
||
|
var x, y;
|
||
|
var width = this.width;
|
||
|
for (y = 0; y < width; y++) {
|
||
|
for (x = 0; x <= y; x++) {
|
||
|
if (this.buffer[x + width * y]) {
|
||
|
this._setMask(x, y);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}, {
|
||
|
_createArray: function(length) {
|
||
|
var i;
|
||
|
var array = [];
|
||
|
for (i = 0; i < length; i++) {
|
||
|
array[i] = 0;
|
||
|
}
|
||
|
return array;
|
||
|
},
|
||
|
_getMaskBit: function(x, y) {
|
||
|
var bit;
|
||
|
if (x > y) {
|
||
|
bit = x;
|
||
|
x = y;
|
||
|
y = bit;
|
||
|
}
|
||
|
bit = y;
|
||
|
bit += y * y;
|
||
|
bit >>= 1;
|
||
|
bit += x;
|
||
|
return bit;
|
||
|
},
|
||
|
_modN: function(x) {
|
||
|
while (x >= 255) {
|
||
|
x -= 255;
|
||
|
x = (x >> 8) + (x & 255);
|
||
|
}
|
||
|
return x;
|
||
|
},
|
||
|
N1: 3,
|
||
|
N2: 3,
|
||
|
N3: 40,
|
||
|
N4: 10
|
||
|
});
|
||
|
var Frame_1 = Frame;
|
||
|
var ImageRenderer = Renderer_1.extend({
|
||
|
draw: function() {
|
||
|
this.element.src = this.qrious.toDataURL();
|
||
|
},
|
||
|
reset: function() {
|
||
|
this.element.src = "";
|
||
|
},
|
||
|
resize: function() {
|
||
|
var element = this.element;
|
||
|
element.width = element.height = this.qrious.size;
|
||
|
}
|
||
|
});
|
||
|
var ImageRenderer_1 = ImageRenderer;
|
||
|
var Option = lite.extend(function(name, modifiable, defaultValue, valueTransformer) {
|
||
|
this.name = name;
|
||
|
this.modifiable = Boolean(modifiable);
|
||
|
this.defaultValue = defaultValue;
|
||
|
this._valueTransformer = valueTransformer;
|
||
|
}, {
|
||
|
transform: function(value) {
|
||
|
var transformer = this._valueTransformer;
|
||
|
if (typeof transformer === "function") {
|
||
|
return transformer(value, this);
|
||
|
}
|
||
|
return value;
|
||
|
}
|
||
|
});
|
||
|
var Option_1 = Option;
|
||
|
var Utilities = lite.extend(null, {
|
||
|
abs: function(value) {
|
||
|
return value != null ? Math.abs(value) : null;
|
||
|
},
|
||
|
hasOwn: function(object, name) {
|
||
|
return Object.prototype.hasOwnProperty.call(object, name);
|
||
|
},
|
||
|
noop: function() {
|
||
|
},
|
||
|
toUpperCase: function(string) {
|
||
|
return string != null ? string.toUpperCase() : null;
|
||
|
}
|
||
|
});
|
||
|
var Utilities_1 = Utilities;
|
||
|
var OptionManager = lite.extend(function(options) {
|
||
|
this.options = {};
|
||
|
options.forEach(function(option) {
|
||
|
this.options[option.name] = option;
|
||
|
}, this);
|
||
|
}, {
|
||
|
exists: function(name) {
|
||
|
return this.options[name] != null;
|
||
|
},
|
||
|
get: function(name, target) {
|
||
|
return OptionManager._get(this.options[name], target);
|
||
|
},
|
||
|
getAll: function(target) {
|
||
|
var name;
|
||
|
var options = this.options;
|
||
|
var result = {};
|
||
|
for (name in options) {
|
||
|
if (Utilities_1.hasOwn(options, name)) {
|
||
|
result[name] = OptionManager._get(options[name], target);
|
||
|
}
|
||
|
}
|
||
|
return result;
|
||
|
},
|
||
|
init: function(options, target, changeHandler) {
|
||
|
if (typeof changeHandler !== "function") {
|
||
|
changeHandler = Utilities_1.noop;
|
||
|
}
|
||
|
var name, option;
|
||
|
for (name in this.options) {
|
||
|
if (Utilities_1.hasOwn(this.options, name)) {
|
||
|
option = this.options[name];
|
||
|
OptionManager._set(option, option.defaultValue, target);
|
||
|
OptionManager._createAccessor(option, target, changeHandler);
|
||
|
}
|
||
|
}
|
||
|
this._setAll(options, target, true);
|
||
|
},
|
||
|
set: function(name, value, target) {
|
||
|
return this._set(name, value, target);
|
||
|
},
|
||
|
setAll: function(options, target) {
|
||
|
return this._setAll(options, target);
|
||
|
},
|
||
|
_set: function(name, value, target, allowUnmodifiable) {
|
||
|
var option = this.options[name];
|
||
|
if (!option) {
|
||
|
throw new Error("Invalid option: " + name);
|
||
|
}
|
||
|
if (!option.modifiable && !allowUnmodifiable) {
|
||
|
throw new Error("Option cannot be modified: " + name);
|
||
|
}
|
||
|
return OptionManager._set(option, value, target);
|
||
|
},
|
||
|
_setAll: function(options, target, allowUnmodifiable) {
|
||
|
if (!options) {
|
||
|
return false;
|
||
|
}
|
||
|
var name;
|
||
|
var changed = false;
|
||
|
for (name in options) {
|
||
|
if (Utilities_1.hasOwn(options, name) && this._set(name, options[name], target, allowUnmodifiable)) {
|
||
|
changed = true;
|
||
|
}
|
||
|
}
|
||
|
return changed;
|
||
|
}
|
||
|
}, {
|
||
|
_createAccessor: function(option, target, changeHandler) {
|
||
|
var descriptor = {
|
||
|
get: function() {
|
||
|
return OptionManager._get(option, target);
|
||
|
}
|
||
|
};
|
||
|
if (option.modifiable) {
|
||
|
descriptor.set = function(value) {
|
||
|
if (OptionManager._set(option, value, target)) {
|
||
|
changeHandler(value, option);
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
Object.defineProperty(target, option.name, descriptor);
|
||
|
},
|
||
|
_get: function(option, target) {
|
||
|
return target["_" + option.name];
|
||
|
},
|
||
|
_set: function(option, value, target) {
|
||
|
var fieldName = "_" + option.name;
|
||
|
var oldValue = target[fieldName];
|
||
|
var newValue = option.transform(value != null ? value : option.defaultValue);
|
||
|
target[fieldName] = newValue;
|
||
|
return newValue !== oldValue;
|
||
|
}
|
||
|
});
|
||
|
var OptionManager_1 = OptionManager;
|
||
|
var ServiceManager = lite.extend(function() {
|
||
|
this._services = {};
|
||
|
}, {
|
||
|
getService: function(name) {
|
||
|
var service = this._services[name];
|
||
|
if (!service) {
|
||
|
throw new Error("Service is not being managed with name: " + name);
|
||
|
}
|
||
|
return service;
|
||
|
},
|
||
|
setService: function(name, service) {
|
||
|
if (this._services[name]) {
|
||
|
throw new Error("Service is already managed with name: " + name);
|
||
|
}
|
||
|
if (service) {
|
||
|
this._services[name] = service;
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
var ServiceManager_1 = ServiceManager;
|
||
|
var optionManager = new OptionManager_1([
|
||
|
new Option_1("background", true, "white"),
|
||
|
new Option_1("backgroundAlpha", true, 1, Utilities_1.abs),
|
||
|
new Option_1("element"),
|
||
|
new Option_1("foreground", true, "black"),
|
||
|
new Option_1("foregroundAlpha", true, 1, Utilities_1.abs),
|
||
|
new Option_1("level", true, "L", Utilities_1.toUpperCase),
|
||
|
new Option_1("mime", true, "image/png"),
|
||
|
new Option_1("padding", true, null, Utilities_1.abs),
|
||
|
new Option_1("size", true, 100, Utilities_1.abs),
|
||
|
new Option_1("value", true, "")
|
||
|
]);
|
||
|
var serviceManager = new ServiceManager_1();
|
||
|
var QRious2 = lite.extend(function(options) {
|
||
|
optionManager.init(options, this, this.update.bind(this));
|
||
|
var element = optionManager.get("element", this);
|
||
|
var elementService = serviceManager.getService("element");
|
||
|
var canvas = element && elementService.isCanvas(element) ? element : elementService.createCanvas();
|
||
|
var image = element && elementService.isImage(element) ? element : elementService.createImage();
|
||
|
this._canvasRenderer = new CanvasRenderer_1(this, canvas, true);
|
||
|
this._imageRenderer = new ImageRenderer_1(this, image, image === element);
|
||
|
this.update();
|
||
|
}, {
|
||
|
get: function() {
|
||
|
return optionManager.getAll(this);
|
||
|
},
|
||
|
set: function(options) {
|
||
|
if (optionManager.setAll(options, this)) {
|
||
|
this.update();
|
||
|
}
|
||
|
},
|
||
|
toDataURL: function(mime) {
|
||
|
return this.canvas.toDataURL(mime || this.mime);
|
||
|
},
|
||
|
update: function() {
|
||
|
var frame = new Frame_1({
|
||
|
level: this.level,
|
||
|
value: this.value
|
||
|
});
|
||
|
this._canvasRenderer.render(frame);
|
||
|
this._imageRenderer.render(frame);
|
||
|
}
|
||
|
}, {
|
||
|
use: function(service) {
|
||
|
serviceManager.setService(service.getName(), service);
|
||
|
}
|
||
|
});
|
||
|
Object.defineProperties(QRious2.prototype, {
|
||
|
canvas: {
|
||
|
get: function() {
|
||
|
return this._canvasRenderer.getElement();
|
||
|
}
|
||
|
},
|
||
|
image: {
|
||
|
get: function() {
|
||
|
return this._imageRenderer.getElement();
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
var QRious_1$2 = QRious2;
|
||
|
var index = QRious_1$2;
|
||
|
var Service = lite.extend({
|
||
|
getName: function() {
|
||
|
}
|
||
|
});
|
||
|
var Service_1 = Service;
|
||
|
var ElementService = Service_1.extend({
|
||
|
createCanvas: function() {
|
||
|
},
|
||
|
createImage: function() {
|
||
|
},
|
||
|
getName: function() {
|
||
|
return "element";
|
||
|
},
|
||
|
isCanvas: function(element) {
|
||
|
},
|
||
|
isImage: function(element) {
|
||
|
}
|
||
|
});
|
||
|
var ElementService_1 = ElementService;
|
||
|
var BrowserElementService = ElementService_1.extend({
|
||
|
createCanvas: function() {
|
||
|
return document.createElement("canvas");
|
||
|
},
|
||
|
createImage: function() {
|
||
|
return document.createElement("img");
|
||
|
},
|
||
|
isCanvas: function(element) {
|
||
|
return element instanceof HTMLCanvasElement;
|
||
|
},
|
||
|
isImage: function(element) {
|
||
|
return element instanceof HTMLImageElement;
|
||
|
}
|
||
|
});
|
||
|
var BrowserElementService_1 = BrowserElementService;
|
||
|
index.use(new BrowserElementService_1());
|
||
|
var QRious_1 = index;
|
||
|
return QRious_1;
|
||
|
});
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// src/main.ts
|
||
|
__export(exports, {
|
||
|
default: () => MatterPlugin
|
||
|
});
|
||
|
var import_obsidian2 = __toModule(require("obsidian"));
|
||
|
|
||
|
// src/api.ts
|
||
|
var CLIENT_TYPE = "integration";
|
||
|
var MATTER_API_VERSION = "v11";
|
||
|
var MATTER_API_DOMAIN = "api.getmatter.app";
|
||
|
var MATTER_API_HOST = `https://${MATTER_API_DOMAIN}/api/${MATTER_API_VERSION}`;
|
||
|
var ENDPOINTS = {
|
||
|
QR_LOGIN_TRIGGER: `${MATTER_API_HOST}/qr_login/trigger/`,
|
||
|
QR_LOGIN_EXCHANGE: `${MATTER_API_HOST}/qr_login/exchange/`,
|
||
|
REFRESH_TOKEN_EXCHANGE: `${MATTER_API_HOST}/token/refresh/`,
|
||
|
HIGHLIGHTS_FEED: `${MATTER_API_HOST}/library_items/highlights_feed/`
|
||
|
};
|
||
|
var RequestError = class extends Error {
|
||
|
constructor(response, message) {
|
||
|
super(message);
|
||
|
this.response = response;
|
||
|
}
|
||
|
};
|
||
|
function authedRequest(_0, _1) {
|
||
|
return __async(this, arguments, function* (accessToken, url, fetchArgs = {}) {
|
||
|
const headers = new Headers();
|
||
|
headers.set("Authorization", `Bearer ${accessToken}`);
|
||
|
headers.set("Content-Type", "application/json");
|
||
|
const response = yield fetch(url, __spreadProps(__spreadValues({}, fetchArgs), {
|
||
|
headers
|
||
|
}));
|
||
|
if (!response.ok) {
|
||
|
throw new RequestError(response, "Matter authenticated request failed");
|
||
|
}
|
||
|
return yield response.json();
|
||
|
});
|
||
|
}
|
||
|
|
||
|
// src/settings.ts
|
||
|
var import_obsidian = __toModule(require("obsidian"));
|
||
|
var import_qrious = __toModule(require_qrious());
|
||
|
|
||
|
// src/utils.ts
|
||
|
var sleep = (ms) => {
|
||
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
||
|
};
|
||
|
var toFilename = (s) => {
|
||
|
return s.replace(/[/\\?%*:|"<>]/g, "-");
|
||
|
};
|
||
|
|
||
|
// src/settings.ts
|
||
|
var DEFAULT_SETTINGS = {
|
||
|
accessToken: null,
|
||
|
refreshToken: null,
|
||
|
qrSessionToken: null,
|
||
|
dataDir: "Matter",
|
||
|
syncInterval: 60,
|
||
|
hasCompletedInitialSetup: false,
|
||
|
lastSync: null,
|
||
|
isSyncing: false,
|
||
|
contentMap: {}
|
||
|
};
|
||
|
var MatterSettingsTab = class extends import_obsidian.PluginSettingTab {
|
||
|
constructor(app, plugin) {
|
||
|
super(app, plugin);
|
||
|
this.plugin = plugin;
|
||
|
}
|
||
|
display() {
|
||
|
const { containerEl } = this;
|
||
|
containerEl.empty();
|
||
|
this.loadInterface();
|
||
|
}
|
||
|
loadInterface() {
|
||
|
const { containerEl } = this;
|
||
|
containerEl.createEl("h1", { text: "Matter" });
|
||
|
if (!this.plugin.settings.accessToken || !this.plugin.settings.hasCompletedInitialSetup) {
|
||
|
this.displaySetup();
|
||
|
} else {
|
||
|
this.displaySettings();
|
||
|
}
|
||
|
}
|
||
|
displaySetup() {
|
||
|
return __async(this, null, function* () {
|
||
|
const { containerEl } = this;
|
||
|
try {
|
||
|
const headers = new Headers();
|
||
|
headers.set("Content-Type", "application/json");
|
||
|
const triggerResponse = yield fetch(ENDPOINTS.QR_LOGIN_TRIGGER, {
|
||
|
method: "POST",
|
||
|
body: JSON.stringify({ client_type: CLIENT_TYPE }),
|
||
|
headers
|
||
|
});
|
||
|
this.plugin.settings.qrSessionToken = (yield triggerResponse.json()).session_token;
|
||
|
} catch (error) {
|
||
|
return;
|
||
|
}
|
||
|
const qrSetting = new import_obsidian.Setting(containerEl).setName("Scan this QR code in the Matter app").setDesc("Go to Profile > Settings > Connected Accounts > Obsidian");
|
||
|
const canvas = document.createElement("canvas");
|
||
|
canvas.className = "matter-qr";
|
||
|
qrSetting.settingEl.appendChild(canvas);
|
||
|
new import_qrious.default({
|
||
|
element: canvas,
|
||
|
value: this.plugin.settings.qrSessionToken,
|
||
|
size: 80,
|
||
|
backgroundAlpha: 0.2
|
||
|
});
|
||
|
new import_obsidian.Setting(containerEl).setName("Matter Sync Folder").setDesc("Where do you want your Matter data to live in Obsidian?").addText((text) => text.setPlaceholder("Enter location").setValue(this.plugin.settings.dataDir).onChange((value) => __async(this, null, function* () {
|
||
|
value = value.replace(/^\/+|\/+$/g, "");
|
||
|
this.plugin.settings.dataDir = (0, import_obsidian.normalizePath)(value);
|
||
|
yield this.plugin.saveSettings();
|
||
|
})));
|
||
|
console.log(this.plugin.app.workspace.getLayout());
|
||
|
const startBtn = new import_obsidian.ButtonComponent(containerEl).setButtonText("Start Syncing").setClass("mod-cta").setClass("matter-setup-btn").setDisabled(true).onClick(() => __async(this, null, function* () {
|
||
|
this.plugin.settings.hasCompletedInitialSetup = true;
|
||
|
yield this.plugin.saveSettings();
|
||
|
this.plugin.sync();
|
||
|
this.plugin.loopSync();
|
||
|
this.display();
|
||
|
}));
|
||
|
const { access_token, refresh_token } = yield this._pollQRLoginExchange();
|
||
|
if (access_token) {
|
||
|
this.plugin.settings.accessToken = access_token;
|
||
|
this.plugin.settings.refreshToken = refresh_token;
|
||
|
yield this.plugin.saveSettings();
|
||
|
canvas.remove();
|
||
|
const authConfirmation = document.createElement("p");
|
||
|
authConfirmation.className = "matter-auth-confirmation";
|
||
|
authConfirmation.appendText("\u2705");
|
||
|
qrSetting.settingEl.appendChild(authConfirmation);
|
||
|
startBtn.setDisabled(false);
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
displaySettings() {
|
||
|
return __async(this, null, function* () {
|
||
|
const { containerEl } = this;
|
||
|
let newDataDir = this.plugin.settings.dataDir;
|
||
|
new import_obsidian.Setting(containerEl).setName("Matter Sync Folder").setDesc('Where do you want your Matter data to live in Obsidian? Once you click "Apply" all of your current data will be moved').addText((text) => text.setPlaceholder("Enter location").setValue(newDataDir).onChange((value) => __async(this, null, function* () {
|
||
|
value = value.replace(/^\/+|\/+$/g, "");
|
||
|
newDataDir = value;
|
||
|
}))).addButton((button) => button.setButtonText("Apply").setClass("matter-folder-button").onClick(() => __async(this, null, function* () {
|
||
|
if (newDataDir === this.plugin.settings.dataDir) {
|
||
|
return;
|
||
|
}
|
||
|
if (this.plugin.settings.isSyncing) {
|
||
|
new import_obsidian.Notice("Wait for the current sync to end and try again.");
|
||
|
return;
|
||
|
}
|
||
|
this.plugin.settings.isSyncing = true;
|
||
|
yield this.plugin.saveSettings();
|
||
|
const fs = this.plugin.app.vault.adapter;
|
||
|
try {
|
||
|
yield fs.rename(this.plugin.settings.dataDir, newDataDir);
|
||
|
} catch (e) {
|
||
|
new import_obsidian.Notice(e.message);
|
||
|
this.plugin.settings.isSyncing = false;
|
||
|
yield this.plugin.saveSettings();
|
||
|
return;
|
||
|
}
|
||
|
this.plugin.settings.dataDir = (0, import_obsidian.normalizePath)(newDataDir);
|
||
|
this.plugin.settings.isSyncing = false;
|
||
|
yield this.plugin.saveSettings();
|
||
|
new import_obsidian.Notice("Sync folder updated");
|
||
|
})));
|
||
|
new import_obsidian.Setting(containerEl).setName("Sync Frequency").setDesc("How often should Obsidian sync with Matter?").addDropdown((dropdown) => dropdown.addOption("30", "Every half hour").addOption("60", "Every hour").addOption("720", "Every 12 hours").addOption("1440", "Every 24 hours").setValue(this.plugin.settings.syncInterval.toString()).onChange((val) => __async(this, null, function* () {
|
||
|
this.plugin.settings.syncInterval = parseInt(val, 10);
|
||
|
yield this.plugin.saveSettings();
|
||
|
})));
|
||
|
new import_obsidian.Setting(containerEl).setName("Sync Now").setDesc("Manually start a sync with Matter").addButton((button) => button.setButtonText("Sync Now").onClick(() => __async(this, null, function* () {
|
||
|
yield this.plugin.sync();
|
||
|
})));
|
||
|
});
|
||
|
}
|
||
|
_pollQRLoginExchange() {
|
||
|
return __async(this, null, function* () {
|
||
|
if (!this.plugin.settings.qrSessionToken) {
|
||
|
return;
|
||
|
}
|
||
|
let attempts = 0;
|
||
|
while (attempts < 600) {
|
||
|
try {
|
||
|
const loginSession = yield this._qrLoginExchange(this.plugin.settings.qrSessionToken);
|
||
|
if (loginSession == null ? void 0 : loginSession.access_token) {
|
||
|
return {
|
||
|
access_token: loginSession.access_token,
|
||
|
refresh_token: loginSession.refresh_token
|
||
|
};
|
||
|
}
|
||
|
} finally {
|
||
|
attempts++;
|
||
|
yield sleep(1e3);
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
_qrLoginExchange(sessionToken) {
|
||
|
return __async(this, null, function* () {
|
||
|
const headers = new Headers();
|
||
|
headers.set("Content-Type", "application/json");
|
||
|
const response = yield fetch(ENDPOINTS.QR_LOGIN_EXCHANGE, {
|
||
|
method: "POST",
|
||
|
body: JSON.stringify({
|
||
|
session_token: sessionToken
|
||
|
}),
|
||
|
headers
|
||
|
});
|
||
|
return response.json();
|
||
|
});
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// src/main.ts
|
||
|
var LOOP_SYNC_INTERVAL = 60 * 1e3;
|
||
|
var MatterPlugin = class extends import_obsidian2.Plugin {
|
||
|
onload() {
|
||
|
return __async(this, null, function* () {
|
||
|
yield this.loadSettings();
|
||
|
this.addSettingTab(new MatterSettingsTab(this.app, this));
|
||
|
this.initialSync();
|
||
|
this.registerInterval(window.setInterval(() => __async(this, null, function* () {
|
||
|
yield this.loopSync();
|
||
|
}), LOOP_SYNC_INTERVAL));
|
||
|
});
|
||
|
}
|
||
|
onunload() {
|
||
|
}
|
||
|
initialSync() {
|
||
|
return __async(this, null, function* () {
|
||
|
this.settings.isSyncing = false;
|
||
|
yield this.saveSettings();
|
||
|
if (this.settings.accessToken && this.settings.hasCompletedInitialSetup) {
|
||
|
yield this.sync();
|
||
|
} else {
|
||
|
new import_obsidian2.Notice("Finish setting up Matter in settings");
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
loadSettings() {
|
||
|
return __async(this, null, function* () {
|
||
|
this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData());
|
||
|
});
|
||
|
}
|
||
|
saveSettings() {
|
||
|
return __async(this, null, function* () {
|
||
|
yield this.saveData(this.settings);
|
||
|
});
|
||
|
}
|
||
|
loopSync() {
|
||
|
return __async(this, null, function* () {
|
||
|
const msSinceLastSync = new Date().valueOf() - new Date(this.settings.lastSync).valueOf();
|
||
|
const mssyncInterval = this.settings.syncInterval * 60 * 1e3;
|
||
|
if (this.settings.accessToken && this.settings.hasCompletedInitialSetup && msSinceLastSync >= mssyncInterval) {
|
||
|
this.sync();
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
sync() {
|
||
|
return __async(this, null, function* () {
|
||
|
if (this.settings.isSyncing || !this.settings.accessToken) {
|
||
|
return;
|
||
|
}
|
||
|
this.settings.isSyncing = true;
|
||
|
yield this.saveSettings();
|
||
|
try {
|
||
|
new import_obsidian2.Notice("Syncing with Matter");
|
||
|
yield this._pageAnnotations();
|
||
|
this.settings.lastSync = new Date();
|
||
|
new import_obsidian2.Notice("Finished syncing with Matter");
|
||
|
} catch (error) {
|
||
|
console.error(error);
|
||
|
new import_obsidian2.Notice("There was a problem syncing with Matter, try again later.");
|
||
|
}
|
||
|
this.settings.isSyncing = false;
|
||
|
yield this.saveSettings();
|
||
|
});
|
||
|
}
|
||
|
_pageAnnotations() {
|
||
|
return __async(this, null, function* () {
|
||
|
let url = ENDPOINTS.HIGHLIGHTS_FEED;
|
||
|
let feedEntries = [];
|
||
|
while (url !== null) {
|
||
|
const response = yield this._authedRequest(url);
|
||
|
feedEntries = feedEntries.concat(response.feed);
|
||
|
url = response.next;
|
||
|
}
|
||
|
feedEntries = feedEntries.reverse();
|
||
|
for (const feedEntry of feedEntries) {
|
||
|
yield this._handleFeedEntry(feedEntry);
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
_authedRequest(url) {
|
||
|
return __async(this, null, function* () {
|
||
|
try {
|
||
|
return yield authedRequest(this.settings.accessToken, url);
|
||
|
} catch (e) {
|
||
|
yield this._refreshTokenExchange();
|
||
|
return yield authedRequest(this.settings.accessToken, url);
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
_refreshTokenExchange() {
|
||
|
return __async(this, null, function* () {
|
||
|
const headers = new Headers();
|
||
|
headers.set("Content-Type", "application/json");
|
||
|
const response = yield fetch(ENDPOINTS.REFRESH_TOKEN_EXCHANGE, {
|
||
|
method: "POST",
|
||
|
headers,
|
||
|
body: JSON.stringify({ refresh_token: this.settings.refreshToken })
|
||
|
});
|
||
|
const payload = yield response.json();
|
||
|
this.settings.accessToken = payload.access_token;
|
||
|
this.settings.refreshToken = payload.refresh_token;
|
||
|
yield this.saveSettings();
|
||
|
if (!this.settings.accessToken) {
|
||
|
new import_obsidian2.Notice("Unable to sync with Matter, please sign in again.");
|
||
|
throw new Error("Authentication failed");
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
_handleFeedEntry(feedEntry) {
|
||
|
return __async(this, null, function* () {
|
||
|
const fs = this.app.vault.adapter;
|
||
|
if (!(yield fs.exists(this.settings.dataDir))) {
|
||
|
yield fs.mkdir(this.settings.dataDir);
|
||
|
}
|
||
|
const entryName = yield this._generateEntryName(feedEntry);
|
||
|
const entryPath = this._getPath(entryName);
|
||
|
if (yield fs.exists(entryPath)) {
|
||
|
const after = new Date(this.settings.lastSync);
|
||
|
const content = yield fs.read(entryPath);
|
||
|
const newContent = this._appendAnnotations(feedEntry, content, after);
|
||
|
if (newContent != content) {
|
||
|
yield fs.write(entryPath, newContent);
|
||
|
}
|
||
|
} else {
|
||
|
yield fs.write(entryPath, this._renderFeedEntry(feedEntry));
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
_getPath(name) {
|
||
|
return (0, import_obsidian2.normalizePath)(`${this.settings.dataDir}/${name}`);
|
||
|
}
|
||
|
_generateEntryName(feedEntry) {
|
||
|
return __async(this, null, function* () {
|
||
|
const fs = this.app.vault.adapter;
|
||
|
let name = `${toFilename(feedEntry.content.title)}.md`;
|
||
|
let i = 1;
|
||
|
while ((yield fs.exists(this._getPath(name))) && this.settings.contentMap[name] !== feedEntry.id) {
|
||
|
i++;
|
||
|
name = `${toFilename(feedEntry.content.title)}-${i}.md`;
|
||
|
}
|
||
|
this.settings.contentMap[name] = feedEntry.id;
|
||
|
yield this.saveSettings();
|
||
|
return name;
|
||
|
});
|
||
|
}
|
||
|
_appendAnnotations(feedEntry, content, after) {
|
||
|
const newAnnotations = feedEntry.content.my_annotations.filter((a) => new Date(a.created_date) > after);
|
||
|
if (!newAnnotations.length) {
|
||
|
return content;
|
||
|
}
|
||
|
if (content[-1] !== "\n") {
|
||
|
content += "\n";
|
||
|
}
|
||
|
return content + `${newAnnotations.map(this._renderAnnotation).join("\n")}`;
|
||
|
}
|
||
|
_renderFeedEntry(feedEntry) {
|
||
|
const annotations = feedEntry.content.my_annotations.sort((a, b) => a.word_start - b.word_start);
|
||
|
return `
|
||
|
## Metadata
|
||
|
${this._renderMetadata(feedEntry)}
|
||
|
## Highlights
|
||
|
${annotations.map(this._renderAnnotation).join("\n")}
|
||
|
`.trim();
|
||
|
}
|
||
|
_renderMetadata(feedEntry) {
|
||
|
let metadata = `* URL: [${feedEntry.content.url}](${feedEntry.content.url})`;
|
||
|
if (feedEntry.content.publication_date) {
|
||
|
const publicationDate = new Date(feedEntry.content.publication_date);
|
||
|
const publicationDateStr = publicationDate.toISOString().slice(0, 10);
|
||
|
metadata += `
|
||
|
* Published Date: ${publicationDateStr}`;
|
||
|
}
|
||
|
if (feedEntry.content.author) {
|
||
|
metadata += `
|
||
|
* Author: [[${feedEntry.content.author.any_name}]]`;
|
||
|
}
|
||
|
metadata += "\n";
|
||
|
return metadata;
|
||
|
}
|
||
|
_renderAnnotation(annotation) {
|
||
|
return `
|
||
|
* ${annotation.text}${annotation.note ? `
|
||
|
* **Note**: ${annotation.note}` : ""}
|
||
|
`.trim();
|
||
|
}
|
||
|
};
|