cnf-qrcode
Version:
generate qrcode,support svg base64 utf8
114 lines (96 loc) • 2.7 kB
JavaScript
import canPromise from './can-promise';
import * as QRCode from './core/qrcode';
import * as SvgRenderer from './renderer/svg';
import * as Utf8Renderer from './renderer/utf8';
import * as PngRenderer from './renderer/png';
function checkParams(text, opts, cb) {
if (typeof text === 'undefined') {
throw new Error('String required as first argument');
}
if (typeof cb === 'undefined') {
cb = opts;
opts = {};
}
if (typeof cb !== 'function') {
if (!canPromise()) {
throw new Error('Callback required as last argument');
} else {
opts = cb || {};
cb = null;
}
}
return {
opts,
cb,
};
}
function getRendererFromType(type) {
switch (type) {
case 'svg':
return SvgRenderer;
case 'txt':
case 'utf8':
return Utf8Renderer;
case 'png':
case 'image/png':
default:
return PngRenderer;
}
}
function getStringRendererFromType(type) {
switch (type) {
case 'svg':
return SvgRenderer;
case 'utf8':
default:
return Utf8Renderer;
}
}
function render(renderFunc, text, params) {
if (!params.cb) {
return new Promise(((resolve, reject) => {
try {
const data = QRCode.create(text, params.opts);
return renderFunc(data, params.opts, (err, data) => (err ? reject(err) : resolve(data)));
} catch (e) {
reject(e);
}
}));
}
try {
const data = QRCode.create(text, params.opts);
return renderFunc(data, params.opts, params.cb);
} catch (e) {
params.cb(e);
}
}
export const { create } = QRCode;
export function toString(text, opts, cb) {
const params = checkParams(text, opts, cb);
const renderer = getStringRendererFromType(params.opts.type);
return render(renderer.render, text, params);
}
export function toDataURL(text, opts, cb) {
const params = checkParams(text, opts, cb);
const renderer = getRendererFromType(params.opts.type);
return render(renderer.renderToDataURL, text, params);
}
export function toBuffer(text, opts, cb) {
const params = checkParams(text, opts, cb);
const renderer = getRendererFromType(params.opts.type);
return render(renderer.renderToBuffer, text, params);
}
export function getSvgDataURL(text, opts, cb) {
const params = checkParams(text, opts, cb);
const outCallBack = params.cb;
params.cb = (err, url) => {
outCallBack(err, `data:image/svg+xml;utf8,${encodeURIComponent(url)}`);
};
const renderer = getRendererFromType('svg');
return render(renderer.render, text, params);
}
export function getSvg(text, opts, cb) {
const params = checkParams(text, opts, cb);
const renderer = getRendererFromType('svg');
return render(renderer.render, text, params);
}