mediawiki-extensions-OATHAuth/modules/totp/jquery.qrcode.js
Dejan Savuljesku ea984e5c2b Refactor the extension to support multiple auth modules
Please note, this patch requires a schema change before merging

Change-Id: I71286534d21d95083436d64d79811943c1a1d032
ERM: #14484
Bug: T218210
2019-06-18 10:45:21 +00:00

100 lines
2.9 KiB
JavaScript

/* global QRCode, QRErrorCorrectLevel */
( function () {
$.fn.qrcode = function ( options ) {
var createCanvas, createTable;
// if options is string,
if ( typeof options === 'string' ) {
options = { text: options };
}
// set default values
// typeNumber < 1 for automatic calculation
options = $.extend( {}, {
render: 'canvas',
width: 256,
height: 256,
typeNumber: -1,
correctLevel: QRErrorCorrectLevel.H,
background: '#ffffff',
foreground: '#000000'
}, options );
createCanvas = function () {
var qrcode, canvas, ctx, tileW, tileH, row, col, w, h;
// create the qrcode itself
qrcode = new QRCode( options.typeNumber, options.correctLevel );
qrcode.addData( options.text );
qrcode.make();
// create canvas element
canvas = document.createElement( 'canvas' );
canvas.width = options.width;
canvas.height = options.height;
ctx = canvas.getContext( '2d' );
// compute tileW/tileH based on options.width/options.height
tileW = options.width / qrcode.getModuleCount();
tileH = options.height / qrcode.getModuleCount();
// draw in the canvas
for ( row = 0; row < qrcode.getModuleCount(); row++ ) {
for ( col = 0; col < qrcode.getModuleCount(); col++ ) {
ctx.fillStyle = qrcode.isDark( row, col ) ?
options.foreground :
options.background;
w = ( Math.ceil( ( col + 1 ) * tileW ) - Math.floor( col * tileW ) );
h = ( Math.ceil( ( row + 1 ) * tileW ) - Math.floor( row * tileW ) );
ctx.fillRect( Math.round( col * tileW ), Math.round( row * tileH ), w, h );
}
}
// return just built canvas
return canvas;
};
// from Jon-Carlos Rivera (https://github.com/imbcmdth)
createTable = function () {
var qrcode, $table, tileW, tileH, row, col, $row;
// create the qrcode itself
qrcode = new QRCode( options.typeNumber, options.correctLevel );
qrcode.addData( options.text );
qrcode.make();
// create table element
$table = $( '<table></table>' )
.css( 'width', options.width + 'px' )
.css( 'height', options.height + 'px' )
.css( 'border', '0' )
.css( 'border-collapse', 'collapse' )
.css( 'background-color', options.background );
// compute tileS percentage
tileW = options.width / qrcode.getModuleCount();
tileH = options.height / qrcode.getModuleCount();
// draw in the table
for ( row = 0; row < qrcode.getModuleCount(); row++ ) {
$row = $( '<tr></tr>' ).css( 'height', tileH + 'px' ).appendTo( $table );
for ( col = 0; col < qrcode.getModuleCount(); col++ ) {
$( '<td></td>' )
.css( 'width', tileW + 'px' )
.css( 'background-color', qrcode.isDark( row, col ) ? options.foreground : options.background )
.appendTo( $row );
}
}
// return just built canvas
return $table;
};
return this.each( function () {
var element = options.render === 'canvas' ? createCanvas() : createTable();
$( element ).appendTo( this );
} );
};
}() );