[download svg/jpg]

This commit is contained in:
CPunisher 2020-05-03 15:43:26 +08:00
parent 37e33724ce
commit 2f651c4a3f
9 changed files with 311 additions and 193 deletions

View File

@ -1,6 +0,0 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
</profile>
</component>

View File

@ -11,8 +11,15 @@
</component> </component>
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="78c692f3-8e9f-49c7-86c1-0c5e9d711b1f" name="Default Changelist" comment="静态参数调节组件初步完成"> <list default="true" id="78c692f3-8e9f-49c7-86c1-0c5e9d711b1f" name="Default Changelist" comment="静态参数调节组件初步完成">
<change beforePath="$PROJECT_DIR$/.gitignore" beforeDir="false" afterPath="$PROJECT_DIR$/.gitignore" afterDir="false" /> <change afterPath="$PROJECT_DIR$/src/components/QrRendererBlank.js" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/utils/downloader.js" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/inspectionProfiles/Project_Default.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/components/QrItem.js" beforeDir="false" afterPath="$PROJECT_DIR$/src/components/QrItem.js" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/components/QrRendererBase.js" beforeDir="false" afterPath="$PROJECT_DIR$/src/components/QrRendererBase.js" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/components/QrRendererRound.js" beforeDir="false" afterPath="$PROJECT_DIR$/src/components/QrRendererRound.js" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/components/Qrcode.js" beforeDir="false" afterPath="$PROJECT_DIR$/src/components/Qrcode.js" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/components/Qrcode.js" beforeDir="false" afterPath="$PROJECT_DIR$/src/components/Qrcode.js" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/utils/qrcode.js" beforeDir="false" afterPath="$PROJECT_DIR$/src/utils/qrcode.js" afterDir="false" />
</list> </list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" /> <option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -22,14 +29,20 @@
<component name="FileTemplateManagerImpl"> <component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES"> <option name="RECENT_TEMPLATES">
<list> <list>
<option value="JavaScript File" />
<option value="CSS File" /> <option value="CSS File" />
<option value="JavaScript File" />
</list> </list>
</option> </option>
</component> </component>
<component name="Git.Settings"> <component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" /> <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component> </component>
<component name="JsFlowSettings">
<service-enabled>true</service-enabled>
<exe-path />
<other-services-enabled>true</other-services-enabled>
<auto-save>true</auto-save>
</component>
<component name="ProjectId" id="1bFvrHaftMN3n3JxJkjIZayPhN8" /> <component name="ProjectId" id="1bFvrHaftMN3n3JxJkjIZayPhN8" />
<component name="ProjectLevelVcsManager" settingsEditedManually="true"> <component name="ProjectLevelVcsManager" settingsEditedManually="true">
<ConfirmationsSetting value="2" id="Add" /> <ConfirmationsSetting value="2" id="Add" />
@ -44,17 +57,22 @@
<property name="SHARE_PROJECT_CONFIGURATION_FILES" value="true" /> <property name="SHARE_PROJECT_CONFIGURATION_FILES" value="true" />
<property name="WebServerToolWindowFactoryState" value="false" /> <property name="WebServerToolWindowFactoryState" value="false" />
<property name="dart.analysis.tool.window.visible" value="false" /> <property name="dart.analysis.tool.window.visible" value="false" />
<property name="last_opened_file_path" value="$PROJECT_DIR$/src" /> <property name="last_opened_file_path" value="$PROJECT_DIR$/src/components" />
<property name="list.type.of.created.stylesheet" value="CSS" /> <property name="list.type.of.created.stylesheet" value="CSS" />
<property name="node.js.detected.package.eslint" value="true" /> <property name="node.js.detected.package.eslint" value="true" />
<property name="node.js.detected.package.standard" value="true" />
<property name="node.js.path.for.package.eslint" value="project" /> <property name="node.js.path.for.package.eslint" value="project" />
<property name="node.js.path.for.package.standard" value="project" />
<property name="node.js.selected.package.eslint" value="(autodetect)" /> <property name="node.js.selected.package.eslint" value="(autodetect)" />
<property name="node.js.selected.package.standard" value="" />
<property name="nodejs_interpreter_path" value="node" /> <property name="nodejs_interpreter_path" value="node" />
<property name="nodejs_package_manager_path" value="yarn" /> <property name="nodejs_package_manager_path" value="yarn" />
<property name="settings.editor.selected.configurable" value="settings.javascript.linters.eslint" />
<property name="ts.external.directory.path" value="$APPLICATION_HOME_DIR$/plugins/JavaScriptLanguage/jsLanguageServicesImpl/external" /> <property name="ts.external.directory.path" value="$APPLICATION_HOME_DIR$/plugins/JavaScriptLanguage/jsLanguageServicesImpl/external" />
</component> </component>
<component name="RecentsManager"> <component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS"> <key name="CopyFile.RECENT_KEYS">
<recent name="D:\github\qrbtf\src\components" />
<recent name="$PROJECT_DIR$/src" /> <recent name="$PROJECT_DIR$/src" />
</key> </key>
</component> </component>
@ -438,6 +456,10 @@
<screen x="0" y="23" width="2541" height="1057" /> <screen x="0" y="23" width="2541" height="1057" />
</state> </state>
<state x="1161" y="421" key="#Notifications/428.1103.1680.1027/0.23.2541.1057/-1600.203.1600.877@0.23.2541.1057" timestamp="1588307553058" /> <state x="1161" y="421" key="#Notifications/428.1103.1680.1027/0.23.2541.1057/-1600.203.1600.877@0.23.2541.1057" timestamp="1588307553058" />
<state x="270" y="57" key="SettingsEditor" timestamp="1588491676810">
<screen x="0" y="0" width="1536" height="824" />
</state>
<state x="270" y="57" key="SettingsEditor/0.0.1536.824@0.0.1536.824" timestamp="1588491676810" />
<state x="877" y="274" key="Vcs.Push.Dialog.v2" timestamp="1588438354037"> <state x="877" y="274" key="Vcs.Push.Dialog.v2" timestamp="1588438354037">
<screen x="0" y="0" width="2560" height="1080" /> <screen x="0" y="0" width="2560" height="1080" />
</state> </state>
@ -447,6 +469,14 @@
<screen x="0" y="0" width="2560" height="1080" /> <screen x="0" y="0" width="2560" height="1080" />
</state> </state>
<state x="99" y="100" width="2343" height="880" key="com.intellij.history.integration.ui.views.FileHistoryDialog/428.1080.1680.1050/0.0.2560.1080/-1600.180.1600.900@0.0.2560.1080" timestamp="1588438456208" /> <state x="99" y="100" width="2343" height="880" key="com.intellij.history.integration.ui.views.FileHistoryDialog/428.1080.1680.1050/0.0.2560.1080/-1600.180.1600.900@0.0.2560.1080" timestamp="1588438456208" />
<state x="380" y="14" key="com.intellij.openapi.editor.actions.MultiplePasteAction$ClipboardContentChooser" timestamp="1588479183892">
<screen x="0" y="0" width="1536" height="824" />
</state>
<state x="380" y="14" key="com.intellij.openapi.editor.actions.MultiplePasteAction$ClipboardContentChooser/0.0.1536.824@0.0.1536.824" timestamp="1588479183892" />
<state x="793" y="181" width="613" height="584" key="find.popup" timestamp="1588490972232">
<screen x="0" y="0" width="1536" height="824" />
</state>
<state x="793" y="181" width="613" height="584" key="find.popup/0.0.1536.824@0.0.1536.824" timestamp="1588490972232" />
<state x="1004" y="331" key="git4idea.merge.GitPullDialog" timestamp="1588436573499"> <state x="1004" y="331" key="git4idea.merge.GitPullDialog" timestamp="1588436573499">
<screen x="0" y="0" width="2560" height="1080" /> <screen x="0" y="0" width="2560" height="1080" />
</state> </state>

View File

@ -1,13 +1,6 @@
import React from "react"; import React from "react";
import './Qrcode.css' import './Qrcode.css'
function calViewBox(props) {
if (!props.qrcode) return '0 0 0 0';
const nCount = props.qrcode.getModuleCount();
return '0 0 ' + String(nCount) + ' ' + String(nCount);
}
function calClassName(props) { function calClassName(props) {
if (props.selected == true) return 'Qr-item Qr-item-selected'; if (props.selected == true) return 'Qr-item Qr-item-selected';
return 'Qr-item'; return 'Qr-item';
@ -19,12 +12,12 @@ class QrItem extends React.Component {
super(props); super(props);
this.handleClick = this.handleClick.bind(this); this.handleClick = this.handleClick.bind(this);
this.state = { this.state = {
value: props.value params: new Array(16)
} };
} }
handleClick(e) { handleClick(e) {
this.props.onSelected(this.state.value); this.props.onSelected(this.props.index);
} }
render() { render() {
@ -32,13 +25,11 @@ class QrItem extends React.Component {
<div className={calClassName(this.props)} onClick={this.handleClick}> <div className={calClassName(this.props)} onClick={this.handleClick}>
<div className="Qr-item-image"> <div className="Qr-item-image">
<div className="Qr-item-image-inner"> <div className="Qr-item-image-inner">
<svg className="Qr-item-svg" width="100%" height="100%" viewBox={calViewBox(this.props)} fill="white">
{this.props.renderer} {this.props.renderer}
</svg>
</div> </div>
</div> </div>
<div className="Qr-item-detail"> <div className="Qr-item-detail">
{this.state.value} {this.props.value}
</div> </div>
</div> </div>
); );

View File

@ -17,15 +17,18 @@ function listPoint(props) {
return pointList; return pointList;
} }
function calViewBox(props) {
if (!props.qrcode) return '0 0 0 0';
const nCount = props.qrcode.getModuleCount();
return '0 0 ' + String(nCount) + ' ' + String(nCount);
}
class QrRendererBase extends React.Component { class QrRendererBase extends React.Component {
constructor(props) {
super(props);
}
render() { render() {
return ( return (
<svg> <svg className="Qr-item-svg" width="100%" height="100%" viewBox={calViewBox(this.props)} fill="white"
xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink">
<rect fill="black" width={1} height={1} id="simpleRect"/> <rect fill="black" width={1} height={1} id="simpleRect"/>
{listPoint(this.props)} {listPoint(this.props)}
</svg> </svg>

View File

@ -0,0 +1,14 @@
import React from "react";
import './Qrcode.css'
class QrRendererBlank extends React.Component {
render() {
return (
<svg className="Qr-item-svg" width="100%" height="100%" viewBox="0 0 0 0" fill="white"
xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink">
</svg>
);
}
}
export default QrRendererBlank

View File

@ -17,15 +17,18 @@ function listPoint(props) {
return pointList; return pointList;
} }
function calViewBox(props) {
if (!props.qrcode) return '0 0 0 0';
const nCount = props.qrcode.getModuleCount();
return '0 0 ' + String(nCount) + ' ' + String(nCount);
}
class QrRendererRound extends React.Component { class QrRendererRound extends React.Component {
constructor(props) {
super(props);
}
render() { render() {
return ( return (
<svg> <svg className="Qr-item-svg" width="100%" height="100%" viewBox={calViewBox(this.props)} fill="white"
xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink">
<circle fill="black" r={0.6} id="simpleRound"/> <circle fill="black" r={0.6} id="simpleRound"/>
{listPoint(this.props)} {listPoint(this.props)}
</svg> </svg>

View File

@ -1,42 +1,47 @@
import React from "react"; import React from "react";
import ReactDOMServer from 'react-dom/server'
import {getQrcodeData} from "../utils/qrcodeHandler"; import {getQrcodeData} from "../utils/qrcodeHandler";
import {saveImg, saveSvg} from "../utils/downloader";
import './Qrcode.css'; import './Qrcode.css';
import QrRendererBase from "./QrRendererBase"; import QrRendererBase from "./QrRendererBase";
import QrRendererRound from "./QrRendererRound"; import QrRendererRound from "./QrRendererRound";
import QrRendererBlank from "./QrRendererBlank";
import QrItem from "./QrItem"; import QrItem from "./QrItem";
function getStyleList(qrcode) { const styleList = [
const styleList = [ {value: "A1", renderer: QrRendererBase},
{value: "A1", renderer: <QrRendererBase qrcode={qrcode}/> }, {value: "A2", renderer: QrRendererRound},
{value: "A2", renderer: <QrRendererRound qrcode={qrcode}/>}, {value: "B1", renderer: QrRendererBlank},
{value: "B1"}, {value: "B2", renderer: QrRendererBlank},
{value: "B2"}, {value: "C1", renderer: QrRendererBlank},
{value: "C1"}, {value: "C2", renderer: QrRendererBlank},
{value: "C2"}, {value: "D1", renderer: QrRendererBlank},
{value: "D1"}, {value: "D2", renderer: QrRendererBlank},
{value: "D2"}, ];
];
return styleList;
}
class Qrcode extends React.Component { class Qrcode extends React.Component {
constructor(props) { constructor(props) {
super(props); super(props);
this.handleChange = this.handleChange.bind(this) this.handleChange = this.handleChange.bind(this)
this.handleCreate = this.handleCreate.bind(this) this.handleCreate = this.handleCreate.bind(this)
this.handleSelected = this.handleSelected.bind(this) this.handleSelected = this.handleSelected.bind(this)
this.downloadSvg = this.downloadSvg.bind(this)
this.downloadImg = this.downloadImg.bind(this)
this.state = { this.state = {
text: '', text: '',
selected: 'A1', selectedIndex: 0,
options: {text: ''}, options: {text: ''},
qrcode: null qrcode: null
}; };
} }
handleSelected(value) { componentDidMount() {
this.setState({selected: value}); this.handleCreate()
}
handleSelected(index) {
this.setState({selectedIndex: index});
} }
handleChange(e) { handleChange(e) {
@ -52,7 +57,19 @@ class Qrcode extends React.Component {
text = 'https://qrbtf.com/'; text = 'https://qrbtf.com/';
this.setState({text: text, options: {text: text}, qrcode: getQrcodeData({text: text})}); this.setState({text: text, options: {text: text}, qrcode: getQrcodeData({text: text})});
} }
e.target.blur(); if (e) e.target.blur();
}
downloadSvg(e) {
const style = styleList[this.state.selectedIndex]
const el = React.createElement(style.renderer, {qrcode: this.state.qrcode})
saveSvg(style.value, ReactDOMServer.renderToString(el))
}
downloadImg(e) {
const style = styleList[this.state.selectedIndex]
const el = React.createElement(style.renderer, {qrcode: this.state.qrcode})
saveImg(style.value, ReactDOMServer.renderToString(el), 512, 512)
} }
render() { render() {
@ -64,7 +81,6 @@ class Qrcode extends React.Component {
<input <input
className="Qr-input big-input" className="Qr-input big-input"
placeholder="Input your URL here" placeholder="Input your URL here"
value={this.state.text}
onChange={this.handleChange} onChange={this.handleChange}
onBlur={this.handleCreate} onBlur={this.handleCreate}
onKeyPress={(e) => {if(e.key == 'Enter') this.handleCreate(e)}} onKeyPress={(e) => {if(e.key == 'Enter') this.handleCreate(e)}}
@ -78,13 +94,16 @@ class Qrcode extends React.Component {
<div className="Qr-s"> <div className="Qr-s">
<div className="Qr-box"> <div className="Qr-box">
{ {
getStyleList(this.state.qrcode).map((style) => { styleList.map((style, index) => {
return <QrItem return <QrItem
value={style.value}
key={style.value} key={style.value}
value={style.value}
index={index}
qrcode={this.state.qrcode} qrcode={this.state.qrcode}
renderer={style.renderer} renderer={React.createElement(style.renderer, {
selected={style.value == this.state.selected} qrcode: this.state.qrcode,
})}
selected={index == this.state.selectedIndex}
onSelected={this.handleSelected} onSelected={this.handleSelected}
/> />
}) })
@ -124,8 +143,8 @@ class Qrcode extends React.Component {
</div> </div>
<div className="Qr-Centered"> <div className="Qr-Centered">
<div className="div-btn"> <div className="div-btn">
<button className="dl-btn">SVG</button> <button className="dl-btn" onClick={this.downloadSvg}>SVG</button>
<button className="dl-btn">JPG</button> <button className="dl-btn" onClick={this.downloadImg}>JPG</button>
</div> </div>
</div> </div>

64
src/utils/downloader.js Normal file
View File

@ -0,0 +1,64 @@
const svgHead = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n " +
"<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 20010904//EN\" \"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd\">\n"
export function isChrome() {
return navigator.userAgent.toLowerCase().indexOf('chrome') > -1;
}
export function saveSvg(filename, content) {
let htmlContent = [svgHead + content]
let bl = new Blob(htmlContent, {type: "text/html"})
let a = document.createElement("a")
filename = "QRcode_" + filename + ".svg"
a.href = URL.createObjectURL(bl)
a.download = filename
a.hidden = true
a.click()
}
export function saveImg(filename, content, width, height) {
// Finish creating downloadable data
filename = "QRcode_" + filename + ".jpg";
const wrap = document.createElement('div');
wrap.innerHTML = content;
const $svg = wrap.firstChild
const $clone = $svg.cloneNode(true);
$clone.setAttribute('width', width);
$clone.setAttribute('height', height);
const svgData = new XMLSerializer().serializeToString($clone);
let canvas = document.createElement('canvas');
// Image will be scaled to the requested size.
// var size = data.requestedSize;
canvas.setAttribute('width', width);
canvas.setAttribute('height', height);
let ctx = canvas.getContext('2d');
let img = document.createElement('img');
// New window for the image when it's loaded
if(!isChrome()) window.open('', 'download');
img.onload = () => {
ctx.fillStyle = 'white'
ctx.fillRect(0, 0, width, height)
ctx.drawImage(img, 0, 0, width, height);
// `download` attr is not well supported
// Will result in a download popup for chrome and the
// image opening in a new tab for others.
let a = document.createElement('a');
a.setAttribute('href', canvas.toDataURL('image/jpeg', 0.8))
a.setAttribute('target', 'download')
a.setAttribute('download', filename);
a.click();
};
img.setAttribute('src', 'data:image/svg+xml;base64,' + btoa(svgData));
}

View File

@ -30,7 +30,7 @@ QR8bitByte.prototype = {
}, },
write : function(buffer) { write : function(buffer) {
for (var i = 0; i < this.data.length; i++) { for (let i = 0; i < this.data.length; i++) {
// not JIS ... // not JIS ...
buffer.put(this.data.charCodeAt(i), 8); buffer.put(this.data.charCodeAt(i), 8);
} }
@ -47,13 +47,13 @@ function QRCode(typeNumber, errorCorrectLevel) {
this.modules = null; this.modules = null;
this.moduleCount = 0; this.moduleCount = 0;
this.dataCache = null; this.dataCache = null;
this.dataList = new Array(); this.dataList = [];
} }
QRCode.prototype = { QRCode.prototype = {
addData : function(data) { addData : function(data) {
var newData = new QR8bitByte(data); let newData = new QR8bitByte(data);
this.dataList.push(newData); this.dataList.push(newData);
this.dataCache = null; this.dataCache = null;
}, },
@ -72,18 +72,18 @@ QRCode.prototype = {
make : function() { make : function() {
// Calculate automatically typeNumber if provided is < 1 // Calculate automatically typeNumber if provided is < 1
if (this.typeNumber < 1 ){ if (this.typeNumber < 1 ){
var typeNumber = 1; let typeNumber = 1;
for (typeNumber = 1; typeNumber < 40; typeNumber++) { for (typeNumber = 1; typeNumber < 40; typeNumber++) {
var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, this.errorCorrectLevel); let rsBlocks = QRRSBlock.getRSBlocks(typeNumber, this.errorCorrectLevel);
var buffer = new QRBitBuffer(); let buffer = new QRBitBuffer();
var totalDataCount = 0; let totalDataCount = 0;
for (var i = 0; i < rsBlocks.length; i++) { for (let i = 0; i < rsBlocks.length; i++) {
totalDataCount += rsBlocks[i].dataCount; totalDataCount += rsBlocks[i].dataCount;
} }
for (var i = 0; i < this.dataList.length; i++) { for (let i = 0; i < this.dataList.length; i++) {
var data = this.dataList[i]; let data = this.dataList[i];
buffer.put(data.mode, 4); buffer.put(data.mode, 4);
buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber) ); buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber) );
data.write(buffer); data.write(buffer);
@ -101,11 +101,11 @@ QRCode.prototype = {
this.moduleCount = this.typeNumber * 4 + 17; this.moduleCount = this.typeNumber * 4 + 17;
this.modules = new Array(this.moduleCount); this.modules = new Array(this.moduleCount);
for (var row = 0; row < this.moduleCount; row++) { for (let row = 0; row < this.moduleCount; row++) {
this.modules[row] = new Array(this.moduleCount); this.modules[row] = new Array(this.moduleCount);
for (var col = 0; col < this.moduleCount; col++) { for (let col = 0; col < this.moduleCount; col++) {
this.modules[row][col] = null;//(col + row) % 3; this.modules[row][col] = null;//(col + row) % 3;
} }
} }
@ -130,11 +130,11 @@ QRCode.prototype = {
setupPositionProbePattern : function(row, col) { setupPositionProbePattern : function(row, col) {
for (var r = -1; r <= 7; r++) { for (let r = -1; r <= 7; r++) {
if (row + r <= -1 || this.moduleCount <= row + r) continue; if (row + r <= -1 || this.moduleCount <= row + r) continue;
for (var c = -1; c <= 7; c++) { for (let c = -1; c <= 7; c++) {
if (col + c <= -1 || this.moduleCount <= col + c) continue; if (col + c <= -1 || this.moduleCount <= col + c) continue;
@ -151,14 +151,14 @@ QRCode.prototype = {
getBestMaskPattern : function() { getBestMaskPattern : function() {
var minLostPoint = 0; let minLostPoint = 0;
var pattern = 0; let pattern = 0;
for (var i = 0; i < 8; i++) { for (let i = 0; i < 8; i++) {
this.makeImpl(true, i); this.makeImpl(true, i);
var lostPoint = QRUtil.getLostPoint(this); let lostPoint = QRUtil.getLostPoint(this);
if (i == 0 || minLostPoint > lostPoint) { if (i == 0 || minLostPoint > lostPoint) {
minLostPoint = lostPoint; minLostPoint = lostPoint;
@ -171,19 +171,19 @@ QRCode.prototype = {
createMovieClip : function(target_mc, instance_name, depth) { createMovieClip : function(target_mc, instance_name, depth) {
var qr_mc = target_mc.createEmptyMovieClip(instance_name, depth); let qr_mc = target_mc.createEmptyMovieClip(instance_name, depth);
var cs = 1; let cs = 1;
this.make(); this.make();
for (var row = 0; row < this.modules.length; row++) { for (let row = 0; row < this.modules.length; row++) {
var y = row * cs; let y = row * cs;
for (var col = 0; col < this.modules[row].length; col++) { for (let col = 0; col < this.modules[row].length; col++) {
var x = col * cs; let x = col * cs;
var dark = this.modules[row][col]; let dark = this.modules[row][col];
if (dark) { if (dark) {
qr_mc.beginFill(0, 100); qr_mc.beginFill(0, 100);
@ -201,14 +201,14 @@ QRCode.prototype = {
setupTimingPattern : function() { setupTimingPattern : function() {
for (var r = 8; r < this.moduleCount - 8; r++) { for (let r = 8; r < this.moduleCount - 8; r++) {
if (this.modules[r][6] != null) { if (this.modules[r][6] != null) {
continue; continue;
} }
this.modules[r][6] = (r % 2 == 0); this.modules[r][6] = (r % 2 == 0);
} }
for (var c = 8; c < this.moduleCount - 8; c++) { for (let c = 8; c < this.moduleCount - 8; c++) {
if (this.modules[6][c] != null) { if (this.modules[6][c] != null) {
continue; continue;
} }
@ -218,22 +218,22 @@ QRCode.prototype = {
setupPositionAdjustPattern : function() { setupPositionAdjustPattern : function() {
var pos = QRUtil.getPatternPosition(this.typeNumber); let pos = QRUtil.getPatternPosition(this.typeNumber);
for (var i = 0; i < pos.length; i++) { for (let i = 0; i < pos.length; i++) {
for (var j = 0; j < pos.length; j++) { for (let j = 0; j < pos.length; j++) {
var row = pos[i]; let row = pos[i];
var col = pos[j]; let col = pos[j];
if (this.modules[row][col] != null) { if (this.modules[row][col] != null) {
continue; continue;
} }
for (var r = -2; r <= 2; r++) { for (let r = -2; r <= 2; r++) {
for (var c = -2; c <= 2; c++) { for (let c = -2; c <= 2; c++) {
if (r == -2 || r == 2 || c == -2 || c == 2 if (r == -2 || r == 2 || c == -2 || c == 2
|| (r == 0 && c == 0) ) { || (r == 0 && c == 0) ) {
@ -249,28 +249,28 @@ QRCode.prototype = {
setupTypeNumber : function(test) { setupTypeNumber : function(test) {
var bits = QRUtil.getBCHTypeNumber(this.typeNumber); let bits = QRUtil.getBCHTypeNumber(this.typeNumber);
for (var i = 0; i < 18; i++) { for (let i = 0; i < 18; i++) {
var mod = (!test && ( (bits >> i) & 1) == 1); let mod = (!test && ( (bits >> i) & 1) == 1);
this.modules[Math.floor(i / 3)][i % 3 + this.moduleCount - 8 - 3] = mod; this.modules[Math.floor(i / 3)][i % 3 + this.moduleCount - 8 - 3] = mod;
} }
for (var i = 0; i < 18; i++) { for (let i = 0; i < 18; i++) {
var mod = (!test && ( (bits >> i) & 1) == 1); let mod = (!test && ( (bits >> i) & 1) == 1);
this.modules[i % 3 + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod; this.modules[i % 3 + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod;
} }
}, },
setupTypeInfo : function(test, maskPattern) { setupTypeInfo : function(test, maskPattern) {
var data = (this.errorCorrectLevel << 3) | maskPattern; let data = (this.errorCorrectLevel << 3) | maskPattern;
var bits = QRUtil.getBCHTypeInfo(data); let bits = QRUtil.getBCHTypeInfo(data);
// vertical // vertical
for (var i = 0; i < 15; i++) { for (let i = 0; i < 15; i++) {
var mod = (!test && ( (bits >> i) & 1) == 1); let mod = (!test && ( (bits >> i) & 1) == 1);
if (i < 6) { if (i < 6) {
this.modules[i][8] = mod; this.modules[i][8] = mod;
@ -282,9 +282,9 @@ QRCode.prototype = {
} }
// horizontal // horizontal
for (var i = 0; i < 15; i++) { for (let i = 0; i < 15; i++) {
var mod = (!test && ( (bits >> i) & 1) == 1); let mod = (!test && ( (bits >> i) & 1) == 1);
if (i < 8) { if (i < 8) {
this.modules[8][this.moduleCount - i - 1] = mod; this.modules[8][this.moduleCount - i - 1] = mod;
@ -302,28 +302,28 @@ QRCode.prototype = {
mapData : function(data, maskPattern) { mapData : function(data, maskPattern) {
var inc = -1; let inc = -1;
var row = this.moduleCount - 1; let row = this.moduleCount - 1;
var bitIndex = 7; let bitIndex = 7;
var byteIndex = 0; let byteIndex = 0;
for (var col = this.moduleCount - 1; col > 0; col -= 2) { for (let col = this.moduleCount - 1; col > 0; col -= 2) {
if (col == 6) col--; if (col == 6) col--;
while (true) { while (true) {
for (var c = 0; c < 2; c++) { for (let c = 0; c < 2; c++) {
if (this.modules[row][col - c] == null) { if (this.modules[row][col - c] == null) {
var dark = false; let dark = false;
if (byteIndex < data.length) { if (byteIndex < data.length) {
dark = ( ( (data[byteIndex] >>> bitIndex) & 1) == 1); dark = ( ( (data[byteIndex] >>> bitIndex) & 1) == 1);
} }
var mask = QRUtil.getMask(maskPattern, row, col - c); let mask = QRUtil.getMask(maskPattern, row, col - c);
if (mask) { if (mask) {
dark = !dark; dark = !dark;
@ -358,20 +358,20 @@ QRCode.PAD1 = 0x11;
QRCode.createData = function(typeNumber, errorCorrectLevel, dataList) { QRCode.createData = function(typeNumber, errorCorrectLevel, dataList) {
var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectLevel); let rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectLevel);
var buffer = new QRBitBuffer(); let buffer = new QRBitBuffer();
for (var i = 0; i < dataList.length; i++) { for (let i = 0; i < dataList.length; i++) {
var data = dataList[i]; let data = dataList[i];
buffer.put(data.mode, 4); buffer.put(data.mode, 4);
buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber) ); buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber) );
data.write(buffer); data.write(buffer);
} }
// calc num max data. // calc num max data.
var totalDataCount = 0; let totalDataCount = 0;
for (var i = 0; i < rsBlocks.length; i++) { for (let i = 0; i < rsBlocks.length; i++) {
totalDataCount += rsBlocks[i].dataCount; totalDataCount += rsBlocks[i].dataCount;
} }
@ -412,59 +412,59 @@ QRCode.createData = function(typeNumber, errorCorrectLevel, dataList) {
QRCode.createBytes = function(buffer, rsBlocks) { QRCode.createBytes = function(buffer, rsBlocks) {
var offset = 0; let offset = 0;
var maxDcCount = 0; let maxDcCount = 0;
var maxEcCount = 0; let maxEcCount = 0;
var dcdata = new Array(rsBlocks.length); let dcdata = new Array(rsBlocks.length);
var ecdata = new Array(rsBlocks.length); let ecdata = new Array(rsBlocks.length);
for (var r = 0; r < rsBlocks.length; r++) { for (let r = 0; r < rsBlocks.length; r++) {
var dcCount = rsBlocks[r].dataCount; let dcCount = rsBlocks[r].dataCount;
var ecCount = rsBlocks[r].totalCount - dcCount; let ecCount = rsBlocks[r].totalCount - dcCount;
maxDcCount = Math.max(maxDcCount, dcCount); maxDcCount = Math.max(maxDcCount, dcCount);
maxEcCount = Math.max(maxEcCount, ecCount); maxEcCount = Math.max(maxEcCount, ecCount);
dcdata[r] = new Array(dcCount); dcdata[r] = new Array(dcCount);
for (var i = 0; i < dcdata[r].length; i++) { for (let i = 0; i < dcdata[r].length; i++) {
dcdata[r][i] = 0xff & buffer.buffer[i + offset]; dcdata[r][i] = 0xff & buffer.buffer[i + offset];
} }
offset += dcCount; offset += dcCount;
var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount); let rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount);
var rawPoly = new QRPolynomial(dcdata[r], rsPoly.getLength() - 1); let rawPoly = new QRPolynomial(dcdata[r], rsPoly.getLength() - 1);
var modPoly = rawPoly.mod(rsPoly); let modPoly = rawPoly.mod(rsPoly);
ecdata[r] = new Array(rsPoly.getLength() - 1); ecdata[r] = new Array(rsPoly.getLength() - 1);
for (var i = 0; i < ecdata[r].length; i++) { for (let i = 0; i < ecdata[r].length; i++) {
var modIndex = i + modPoly.getLength() - ecdata[r].length; let modIndex = i + modPoly.getLength() - ecdata[r].length;
ecdata[r][i] = (modIndex >= 0)? modPoly.get(modIndex) : 0; ecdata[r][i] = (modIndex >= 0)? modPoly.get(modIndex) : 0;
} }
} }
var totalCodeCount = 0; let totalCodeCount = 0;
for (var i = 0; i < rsBlocks.length; i++) { for (let i = 0; i < rsBlocks.length; i++) {
totalCodeCount += rsBlocks[i].totalCount; totalCodeCount += rsBlocks[i].totalCount;
} }
var data = new Array(totalCodeCount); let data = new Array(totalCodeCount);
var index = 0; let index = 0;
for (var i = 0; i < maxDcCount; i++) { for (let i = 0; i < maxDcCount; i++) {
for (var r = 0; r < rsBlocks.length; r++) { for (let r = 0; r < rsBlocks.length; r++) {
if (i < dcdata[r].length) { if (i < dcdata[r].length) {
data[index++] = dcdata[r][i]; data[index++] = dcdata[r][i];
} }
} }
} }
for (var i = 0; i < maxEcCount; i++) { for (let i = 0; i < maxEcCount; i++) {
for (var r = 0; r < rsBlocks.length; r++) { for (let r = 0; r < rsBlocks.length; r++) {
if (i < ecdata[r].length) { if (i < ecdata[r].length) {
data[index++] = ecdata[r][i]; data[index++] = ecdata[r][i];
} }
@ -479,7 +479,7 @@ QRCode.createBytes = function(buffer, rsBlocks) {
// QRMode // QRMode
//--------------------------------------------------------------------- //---------------------------------------------------------------------
var QRMode = { let QRMode = {
MODE_NUMBER : 1 << 0, MODE_NUMBER : 1 << 0,
MODE_ALPHA_NUM : 1 << 1, MODE_ALPHA_NUM : 1 << 1,
MODE_8BIT_BYTE : 1 << 2, MODE_8BIT_BYTE : 1 << 2,
@ -490,7 +490,7 @@ var QRMode = {
// QRErrorCorrectLevel // QRErrorCorrectLevel
//--------------------------------------------------------------------- //---------------------------------------------------------------------
var QRErrorCorrectLevel = { let QRErrorCorrectLevel = {
L : 1, L : 1,
M : 0, M : 0,
Q : 3, Q : 3,
@ -501,7 +501,7 @@ var QRErrorCorrectLevel = {
// QRMaskPattern // QRMaskPattern
//--------------------------------------------------------------------- //---------------------------------------------------------------------
var QRMaskPattern = { let QRMaskPattern = {
PATTERN000 : 0, PATTERN000 : 0,
PATTERN001 : 1, PATTERN001 : 1,
PATTERN010 : 2, PATTERN010 : 2,
@ -516,7 +516,7 @@ var QRMaskPattern = {
// QRUtil // QRUtil
//--------------------------------------------------------------------- //---------------------------------------------------------------------
var QRUtil = { let QRUtil = {
PATTERN_POSITION_TABLE : [ PATTERN_POSITION_TABLE : [
[], [],
@ -566,7 +566,7 @@ var QRUtil = {
G15_MASK : (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1), G15_MASK : (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1),
getBCHTypeInfo : function(data) { getBCHTypeInfo : function(data) {
var d = data << 10; let d = data << 10;
while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) >= 0) { while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) >= 0) {
d ^= (QRUtil.G15 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) ) ); d ^= (QRUtil.G15 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) ) );
} }
@ -574,7 +574,7 @@ var QRUtil = {
}, },
getBCHTypeNumber : function(data) { getBCHTypeNumber : function(data) {
var d = data << 12; let d = data << 12;
while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) >= 0) { while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) >= 0) {
d ^= (QRUtil.G18 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) ) ); d ^= (QRUtil.G18 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) ) );
} }
@ -583,7 +583,7 @@ var QRUtil = {
getBCHDigit : function(data) { getBCHDigit : function(data) {
var digit = 0; let digit = 0;
while (data != 0) { while (data != 0) {
digit++; digit++;
@ -617,9 +617,9 @@ var QRUtil = {
getErrorCorrectPolynomial : function(errorCorrectLength) { getErrorCorrectPolynomial : function(errorCorrectLength) {
var a = new QRPolynomial([1], 0); let a = new QRPolynomial([1], 0);
for (var i = 0; i < errorCorrectLength; i++) { for (let i = 0; i < errorCorrectLength; i++) {
a = a.multiply(new QRPolynomial([1, QRMath.gexp(i)], 0) ); a = a.multiply(new QRPolynomial([1, QRMath.gexp(i)], 0) );
} }
@ -674,26 +674,26 @@ var QRUtil = {
getLostPoint : function(qrCode) { getLostPoint : function(qrCode) {
var moduleCount = qrCode.getModuleCount(); let moduleCount = qrCode.getModuleCount();
var lostPoint = 0; let lostPoint = 0;
// LEVEL1 // LEVEL1
for (var row = 0; row < moduleCount; row++) { for (let row = 0; row < moduleCount; row++) {
for (var col = 0; col < moduleCount; col++) { for (let col = 0; col < moduleCount; col++) {
var sameCount = 0; let sameCount = 0;
var dark = qrCode.isDark(row, col); let dark = qrCode.isDark(row, col);
for (var r = -1; r <= 1; r++) { for (let r = -1; r <= 1; r++) {
if (row + r < 0 || moduleCount <= row + r) { if (row + r < 0 || moduleCount <= row + r) {
continue; continue;
} }
for (var c = -1; c <= 1; c++) { for (let c = -1; c <= 1; c++) {
if (col + c < 0 || moduleCount <= col + c) { if (col + c < 0 || moduleCount <= col + c) {
continue; continue;
@ -717,9 +717,9 @@ var QRUtil = {
// LEVEL2 // LEVEL2
for (var row = 0; row < moduleCount - 1; row++) { for (let row = 0; row < moduleCount - 1; row++) {
for (var col = 0; col < moduleCount - 1; col++) { for (let col = 0; col < moduleCount - 1; col++) {
var count = 0; let count = 0;
if (qrCode.isDark(row, col ) ) count++; if (qrCode.isDark(row, col ) ) count++;
if (qrCode.isDark(row + 1, col ) ) count++; if (qrCode.isDark(row + 1, col ) ) count++;
if (qrCode.isDark(row, col + 1) ) count++; if (qrCode.isDark(row, col + 1) ) count++;
@ -732,8 +732,8 @@ var QRUtil = {
// LEVEL3 // LEVEL3
for (var row = 0; row < moduleCount; row++) { for (let row = 0; row < moduleCount; row++) {
for (var col = 0; col < moduleCount - 6; col++) { for (let col = 0; col < moduleCount - 6; col++) {
if (qrCode.isDark(row, col) if (qrCode.isDark(row, col)
&& !qrCode.isDark(row, col + 1) && !qrCode.isDark(row, col + 1)
&& qrCode.isDark(row, col + 2) && qrCode.isDark(row, col + 2)
@ -746,8 +746,8 @@ var QRUtil = {
} }
} }
for (var col = 0; col < moduleCount; col++) { for (let col = 0; col < moduleCount; col++) {
for (var row = 0; row < moduleCount - 6; row++) { for (let row = 0; row < moduleCount - 6; row++) {
if (qrCode.isDark(row, col) if (qrCode.isDark(row, col)
&& !qrCode.isDark(row + 1, col) && !qrCode.isDark(row + 1, col)
&& qrCode.isDark(row + 2, col) && qrCode.isDark(row + 2, col)
@ -762,17 +762,17 @@ var QRUtil = {
// LEVEL4 // LEVEL4
var darkCount = 0; let darkCount = 0;
for (var col = 0; col < moduleCount; col++) { for (let col = 0; col < moduleCount; col++) {
for (var row = 0; row < moduleCount; row++) { for (let row = 0; row < moduleCount; row++) {
if (qrCode.isDark(row, col) ) { if (qrCode.isDark(row, col) ) {
darkCount++; darkCount++;
} }
} }
} }
var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5; let ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;
lostPoint += ratio * 10; lostPoint += ratio * 10;
return lostPoint; return lostPoint;
@ -785,7 +785,7 @@ var QRUtil = {
// QRMath // QRMath
//--------------------------------------------------------------------- //---------------------------------------------------------------------
var QRMath = { let QRMath = {
glog : function(n) { glog : function(n) {
@ -815,16 +815,16 @@ var QRMath = {
}; };
for (var i = 0; i < 8; i++) { for (let i = 0; i < 8; i++) {
QRMath.EXP_TABLE[i] = 1 << i; QRMath.EXP_TABLE[i] = 1 << i;
} }
for (var i = 8; i < 256; i++) { for (let i = 8; i < 256; i++) {
QRMath.EXP_TABLE[i] = QRMath.EXP_TABLE[i - 4] QRMath.EXP_TABLE[i] = QRMath.EXP_TABLE[i - 4]
^ QRMath.EXP_TABLE[i - 5] ^ QRMath.EXP_TABLE[i - 5]
^ QRMath.EXP_TABLE[i - 6] ^ QRMath.EXP_TABLE[i - 6]
^ QRMath.EXP_TABLE[i - 8]; ^ QRMath.EXP_TABLE[i - 8];
} }
for (var i = 0; i < 255; i++) { for (let i = 0; i < 255; i++) {
QRMath.LOG_TABLE[QRMath.EXP_TABLE[i] ] = i; QRMath.LOG_TABLE[QRMath.EXP_TABLE[i] ] = i;
} }
@ -838,14 +838,14 @@ function QRPolynomial(num, shift) {
throw new Error(num.length + "/" + shift); throw new Error(num.length + "/" + shift);
} }
var offset = 0; let offset = 0;
while (offset < num.length && num[offset] == 0) { while (offset < num.length && num[offset] == 0) {
offset++; offset++;
} }
this.num = new Array(num.length - offset + shift); this.num = new Array(num.length - offset + shift);
for (var i = 0; i < num.length - offset; i++) { for (let i = 0; i < num.length - offset; i++) {
this.num[i] = num[i + offset]; this.num[i] = num[i + offset];
} }
} }
@ -862,10 +862,10 @@ QRPolynomial.prototype = {
multiply : function(e) { multiply : function(e) {
var num = new Array(this.getLength() + e.getLength() - 1); let num = new Array(this.getLength() + e.getLength() - 1);
for (var i = 0; i < this.getLength(); i++) { for (let i = 0; i < this.getLength(); i++) {
for (var j = 0; j < e.getLength(); j++) { for (let j = 0; j < e.getLength(); j++) {
num[i + j] ^= QRMath.gexp(QRMath.glog(this.get(i) ) + QRMath.glog(e.get(j) ) ); num[i + j] ^= QRMath.gexp(QRMath.glog(this.get(i) ) + QRMath.glog(e.get(j) ) );
} }
} }
@ -879,15 +879,15 @@ QRPolynomial.prototype = {
return this; return this;
} }
var ratio = QRMath.glog(this.get(0) ) - QRMath.glog(e.get(0) ); let ratio = QRMath.glog(this.get(0) ) - QRMath.glog(e.get(0) );
var num = new Array(this.getLength() ); let num = new Array(this.getLength() );
for (var i = 0; i < this.getLength(); i++) { for (let i = 0; i < this.getLength(); i++) {
num[i] = this.get(i); num[i] = this.get(i);
} }
for (var i = 0; i < e.getLength(); i++) { for (let i = 0; i < e.getLength(); i++) {
num[i] ^= QRMath.gexp(QRMath.glog(e.get(i) ) + ratio); num[i] ^= QRMath.gexp(QRMath.glog(e.get(i) ) + ratio);
} }
@ -1155,23 +1155,23 @@ QRRSBlock.RS_BLOCK_TABLE = [
QRRSBlock.getRSBlocks = function(typeNumber, errorCorrectLevel) { QRRSBlock.getRSBlocks = function(typeNumber, errorCorrectLevel) {
var rsBlock = QRRSBlock.getRsBlockTable(typeNumber, errorCorrectLevel); let rsBlock = QRRSBlock.getRsBlockTable(typeNumber, errorCorrectLevel);
if (rsBlock == undefined) { if (rsBlock == undefined) {
throw new Error("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" + errorCorrectLevel); throw new Error("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" + errorCorrectLevel);
} }
var length = rsBlock.length / 3; let length = rsBlock.length / 3;
var list = new Array(); let list = [];
for (var i = 0; i < length; i++) { for (let i = 0; i < length; i++) {
var count = rsBlock[i * 3 + 0]; let count = rsBlock[i * 3 + 0];
var totalCount = rsBlock[i * 3 + 1]; let totalCount = rsBlock[i * 3 + 1];
var dataCount = rsBlock[i * 3 + 2]; let dataCount = rsBlock[i * 3 + 2];
for (var j = 0; j < count; j++) { for (let j = 0; j < count; j++) {
list.push(new QRRSBlock(totalCount, dataCount) ); list.push(new QRRSBlock(totalCount, dataCount) );
} }
} }
@ -1200,19 +1200,19 @@ QRRSBlock.getRsBlockTable = function(typeNumber, errorCorrectLevel) {
//--------------------------------------------------------------------- //---------------------------------------------------------------------
function QRBitBuffer() { function QRBitBuffer() {
this.buffer = new Array(); this.buffer = [];
this.length = 0; this.length = 0;
} }
QRBitBuffer.prototype = { QRBitBuffer.prototype = {
get : function(index) { get : function(index) {
var bufIndex = Math.floor(index / 8); let bufIndex = Math.floor(index / 8);
return ( (this.buffer[bufIndex] >>> (7 - index % 8) ) & 1) == 1; return ( (this.buffer[bufIndex] >>> (7 - index % 8) ) & 1) == 1;
}, },
put : function(num, length) { put : function(num, length) {
for (var i = 0; i < length; i++) { for (let i = 0; i < length; i++) {
this.putBit( ( (num >>> (length - i - 1) ) & 1) == 1); this.putBit( ( (num >>> (length - i - 1) ) & 1) == 1);
} }
}, },
@ -1223,7 +1223,7 @@ QRBitBuffer.prototype = {
putBit : function(bit) { putBit : function(bit) {
var bufIndex = Math.floor(this.length / 8); let bufIndex = Math.floor(this.length / 8);
if (this.buffer.length <= bufIndex) { if (this.buffer.length <= bufIndex) {
this.buffer.push(0); this.buffer.push(0);
} }