77 lines
1.8 KiB
JavaScript
77 lines
1.8 KiB
JavaScript
|
|
const canPromise = require('./can-promise')
|
|
|
|
const QRCode = require('./core/qrcode')
|
|
const CanvasRenderer = require('./renderer/canvas')
|
|
const SvgRenderer = require('./renderer/svg-tag.js')
|
|
|
|
function renderCanvas (renderFunc, canvas, text, opts, cb) {
|
|
const args = [].slice.call(arguments, 1)
|
|
const argsNum = args.length
|
|
const isLastArgCb = typeof args[argsNum - 1] === 'function'
|
|
|
|
if (!isLastArgCb && !canPromise()) {
|
|
throw new Error('Callback required as last argument')
|
|
}
|
|
|
|
if (isLastArgCb) {
|
|
if (argsNum < 2) {
|
|
throw new Error('Too few arguments provided')
|
|
}
|
|
|
|
if (argsNum === 2) {
|
|
cb = text
|
|
text = canvas
|
|
canvas = opts = undefined
|
|
} else if (argsNum === 3) {
|
|
if (canvas.getContext && typeof cb === 'undefined') {
|
|
cb = opts
|
|
opts = undefined
|
|
} else {
|
|
cb = opts
|
|
opts = text
|
|
text = canvas
|
|
canvas = undefined
|
|
}
|
|
}
|
|
} else {
|
|
if (argsNum < 1) {
|
|
throw new Error('Too few arguments provided')
|
|
}
|
|
|
|
if (argsNum === 1) {
|
|
text = canvas
|
|
canvas = opts = undefined
|
|
} else if (argsNum === 2 && !canvas.getContext) {
|
|
opts = text
|
|
text = canvas
|
|
canvas = undefined
|
|
}
|
|
|
|
return new Promise(function (resolve, reject) {
|
|
try {
|
|
const data = QRCode.create(text, opts)
|
|
resolve(renderFunc(data, canvas, opts))
|
|
} catch (e) {
|
|
reject(e)
|
|
}
|
|
})
|
|
}
|
|
|
|
try {
|
|
const data = QRCode.create(text, opts)
|
|
cb(null, renderFunc(data, canvas, opts))
|
|
} catch (e) {
|
|
cb(e)
|
|
}
|
|
}
|
|
|
|
exports.create = QRCode.create
|
|
exports.toCanvas = renderCanvas.bind(null, CanvasRenderer.render)
|
|
exports.toDataURL = renderCanvas.bind(null, CanvasRenderer.renderToDataURL)
|
|
|
|
// only svg for now.
|
|
exports.toString = renderCanvas.bind(null, function (data, _, opts) {
|
|
return SvgRenderer.render(data, opts)
|
|
})
|