Bugzilla – Attachment 93160 Details for
Bug 23566
Continue on device - with QR codes
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 23566: Continue on device - with QR codes
Bug-23566-Continue-on-device---with-QR-codes.patch (text/plain), 53.61 KB, created by
Biblibre Sandboxes
on 2019-09-25 18:57:40 UTC
(
hide
)
Description:
Bug 23566: Continue on device - with QR codes
Filename:
MIME Type:
Creator:
Biblibre Sandboxes
Created:
2019-09-25 18:57:40 UTC
Size:
53.61 KB
patch
obsolete
>From b22ca57b01769489094d378de52b2034f2947bb5 Mon Sep 17 00:00:00 2001 >From: Owen Leonard <oleonard@myacpl.org> >Date: Wed, 25 Sep 2019 17:10:46 +0000 >Subject: [PATCH] Bug 23566: Continue on device - with QR codes > >This patch adds the option to show a QR code on the OPAC bibliographic >detail page. The URL of the page is encoded in the image so that >scanning it will take the user to that page on their device. The feature >is controlled by a new system preference, OPACDetailQRCode, which is >disabled by default. > >The QR Code is generated by a JavaScript library, "kjua" >(https://github.com/lrsjng/kjua), which has been added to the "About" >page in the staff client. > >To test, apply the patch and run the database update. Rebuild the OPAC >CSS (https://wiki.koha-community.org/wiki/Working_with_SCSS_in_the_OPAC_and_staff_client). > > - In the staff client, go to Administration -> System preferences. > - Locate the OPACDetailQRCode system preferences under OPAC -> > Features. It should be disabled. > - Enable the preference and switch to the OPAC. > - Locate a title in the catalog and view the detail page. > - In the sidebar menu there should be a "Send to device" link. > - Clicking the link should display a QR Code. > - Scan the code using a QR Code-capable device. > - The URL should be correct. > - Disable the system preference and confirm that the "Send to device" > link no longer appears on the OPAC detail page. > >Signed-off-by: Christopher Brannon <cbrannon@cdalibrary.org> >--- > installer/data/mysql/atomicupdate/bug_23566.perl | 11 +++ > koha-tmpl/intranet-tmpl/prog/en/modules/about.tt | 3 + > .../prog/en/modules/admin/preferences/opac.pref | 6 ++ > koha-tmpl/opac-tmpl/bootstrap/css/src/opac.scss | 14 ++++ > .../bootstrap/en/includes/opac-detail-sidebar.inc | 8 ++ > .../opac-tmpl/bootstrap/en/modules/opac-detail.tt | 27 ++++++ > koha-tmpl/opac-tmpl/bootstrap/images/sprite.png | Bin 2561 -> 8286 bytes > koha-tmpl/opac-tmpl/lib/kjua/kjua.js | 18 ++++ > koha-tmpl/opac-tmpl/lib/kjua/kjua.min.js | 2 + > koha-tmpl/opac-tmpl/lib/kjua/lib/defaults.js | 50 +++++++++++ > koha-tmpl/opac-tmpl/lib/kjua/lib/dom.js | 32 ++++++++ > koha-tmpl/opac-tmpl/lib/kjua/lib/draw.js | 48 +++++++++++ > koha-tmpl/opac-tmpl/lib/kjua/lib/draw_mode.js | 47 +++++++++++ > koha-tmpl/opac-tmpl/lib/kjua/lib/draw_rounded.js | 91 +++++++++++++++++++++ > koha-tmpl/opac-tmpl/lib/kjua/lib/qrcode.js | 42 ++++++++++ > 15 files changed, 399 insertions(+) > create mode 100644 installer/data/mysql/atomicupdate/bug_23566.perl > create mode 100644 koha-tmpl/opac-tmpl/lib/kjua/kjua.js > create mode 100644 koha-tmpl/opac-tmpl/lib/kjua/kjua.min.js > create mode 100644 koha-tmpl/opac-tmpl/lib/kjua/lib/defaults.js > create mode 100644 koha-tmpl/opac-tmpl/lib/kjua/lib/dom.js > create mode 100644 koha-tmpl/opac-tmpl/lib/kjua/lib/draw.js > create mode 100644 koha-tmpl/opac-tmpl/lib/kjua/lib/draw_mode.js > create mode 100644 koha-tmpl/opac-tmpl/lib/kjua/lib/draw_rounded.js > create mode 100644 koha-tmpl/opac-tmpl/lib/kjua/lib/qrcode.js > >diff --git a/installer/data/mysql/atomicupdate/bug_23566.perl b/installer/data/mysql/atomicupdate/bug_23566.perl >new file mode 100644 >index 0000000..5f01c70 >--- /dev/null >+++ b/installer/data/mysql/atomicupdate/bug_23566.perl >@@ -0,0 +1,11 @@ >+$DBversion = 'XXX'; # will be replaced by the RM >+ >+if( CheckVersion( $DBversion ) ) { >+ $dbh->do(q| >+ INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES >+ ('OPACDetailQRCode','0','','Enable the display of a QR Code on the OPAC detail page','YesNo'); >+ |); >+ >+ SetVersion( $DBversion ); >+ print "Upgrade to $DBversion done (Bug 23566 - Add OPACDetailQRCode system preference)\n"; >+} >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/about.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/about.tt >index 5b8c1c4..38c90b9 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/about.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/about.tt >@@ -701,6 +701,9 @@ > > <h2>HC Sticky</h2> > <p><a href="http://somewebmedia.com/hc-sticky/">HC Sticky</a> by Some Web Media is a JavaScript library that makes any element on your page visible while you scroll, licensed under the <a href="https://github.com/somewebmedia/hc-sticky/blob/master/LICENSE">MIT license</a>.</p> >+ >+ <h2>kjua</h2> >+ <p><a href="https://larsjung.de/kjua/">kjua</a> by Lars Jung is a JavaScript library that generates QR codes, licensed under the <a href="https://github.com/lrsjng/kjua/blob/master/README.md">MIT license</a>.</p> > </div> > > <div id="translations"> >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/opac.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/opac.pref >index a078939..e9f31f5 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/opac.pref >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/opac.pref >@@ -403,6 +403,12 @@ OPAC: > no: "Don't show" > - patron images on the patron information page in the OPAC. > - >+ - pref: OPACDetailQRCode >+ choices: >+ yes: Enable >+ no: "Don't enable" >+ - the option to show a QR Code on the OPAC bibliographic detail page. >+ - > - pref: OPACFinesTab > choices: > yes: Allow >diff --git a/koha-tmpl/opac-tmpl/bootstrap/css/src/opac.scss b/koha-tmpl/opac-tmpl/bootstrap/css/src/opac.scss >index f2fea4a..3ada4df 100644 >--- a/koha-tmpl/opac-tmpl/bootstrap/css/src/opac.scss >+++ b/koha-tmpl/opac-tmpl/bootstrap/css/src/opac.scss >@@ -259,6 +259,12 @@ a { > &.removefromlist { > @extend %initial_icon; > } >+ >+ &.show_qrcode { >+ @extend %initial_icon; >+ background-position: 0 -1164px; /* QR Code */ >+ padding-left: 35px; >+ } > } > > h1 { >@@ -3210,5 +3216,13 @@ $star-selected: #EDB867; > > /* END jQuery Bar Rating plugin for star ratings */ > >+#qrcode { >+ margin-left: 35px; >+ >+ img, >+ canvas { >+ margin-top: 1em; >+ } >+} > > @import "responsive"; >diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/includes/opac-detail-sidebar.inc b/koha-tmpl/opac-tmpl/bootstrap/en/includes/opac-detail-sidebar.inc >index 9384e94..9bb2f2c 100644 >--- a/koha-tmpl/opac-tmpl/bootstrap/en/includes/opac-detail-sidebar.inc >+++ b/koha-tmpl/opac-tmpl/bootstrap/en/includes/opac-detail-sidebar.inc >@@ -40,6 +40,14 @@ > </li> > [% END %] > >+ >+ [% IF ( Koha.Preference('OPACDetailQRCode' ) ) %] >+ <li> >+ <a class="show_qrcode" href="#">Send to device</a> >+ <div id="qrcode" class="hidden"></div> >+ </li> >+ [% END %] >+ > [% SET export_options = Koha.Preference('OpacExportOptions').split(',') %] > [% IF export_options.size %] > <li> >diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-detail.tt b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-detail.tt >index 8afe1b7..cd4c5da 100644 >--- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-detail.tt >+++ b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-detail.tt >@@ -1392,6 +1392,9 @@ > [% IF ( OpacStarRatings != 'disable' ) %][% Asset.js("lib/jquery/plugins/jquery.barrating.min.js") | $raw %][% END %] > > [% IF ( OpacHighlightedWords ) %][% Asset.js("lib/jquery/plugins/jquery.highlight-3.js") | $raw %][% END %] >+[% IF ( Koha.Preference('OPACDetailQRCode') ) %] >+ [% Asset.js("lib/kjua/kjua.min.js") | $raw %] >+[% END %] > > <script> > [% IF ( OpacHighlightedWords ) %] >@@ -1420,6 +1423,30 @@ > [% END %] > > $(document).ready(function() { >+ >+ [% IF ( Koha.Preference('OPACDetailQRCode') ) %] >+ >+ var qrcode = kjua({ >+ ecLevel: "H", >+ render: "canvas", >+ rounded: 100, >+ size: 150, >+ text: location.href, >+ }); >+ if (qrcode) { >+ document.getElementById("qrcode").appendChild( qrcode ); >+ } >+ >+ $(".show_qrcode").on("click", function(){ >+ var qrcodeImg = $("#qrcode"); >+ if( qrcodeImg.hasClass("hidden") ){ >+ qrcodeImg.removeClass("hidden"); >+ } else { >+ qrcodeImg.addClass("hidden"); >+ } >+ }); >+ [% END %] >+ > $('#bibliodescriptions').tabs(); > $(".branch-info-tooltip-trigger").uitooltip({ > position: { my: "left+15 center", at: "right center" }, >diff --git a/koha-tmpl/opac-tmpl/bootstrap/images/sprite.png b/koha-tmpl/opac-tmpl/bootstrap/images/sprite.png >index cea1c3ca2529eaf1ed8b31e09f47aaddf31dbcbe..540459e83b850b6d9e7830a39f833666bb892d30 100644 >GIT binary patch >literal 8286 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 > >delta 1990 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 >Y1s2zbF4mprz5oCK07*qoM6N<$f-r98ZvX%Q > >diff --git a/koha-tmpl/opac-tmpl/lib/kjua/kjua.js b/koha-tmpl/opac-tmpl/lib/kjua/kjua.js >new file mode 100644 >index 0000000..07c4a21 >--- /dev/null >+++ b/koha-tmpl/opac-tmpl/lib/kjua/kjua.js >@@ -0,0 +1,18 @@ >+const {create_canvas, canvas_to_img, dpr} = require('./lib/dom'); >+const defaults = require('./lib/defaults'); >+const qrcode = require('./lib/qrcode'); >+const draw = require('./lib/draw'); >+ >+module.exports = options => { >+ const settings = Object.assign({}, defaults, options); >+ >+ const qr = qrcode(settings.text, settings.ecLevel, settings.minVersion, settings.quiet); >+ const ratio = settings.ratio || dpr; >+ const canvas = create_canvas(settings.size, ratio); >+ const context = canvas.getContext('2d'); >+ >+ context.scale(ratio, ratio); >+ draw(qr, context, settings); >+ >+ return settings.render === 'image' ? canvas_to_img(canvas) : canvas; >+}; >diff --git a/koha-tmpl/opac-tmpl/lib/kjua/kjua.min.js b/koha-tmpl/opac-tmpl/lib/kjua/kjua.min.js >new file mode 100644 >index 0000000..f70482d >--- /dev/null >+++ b/koha-tmpl/opac-tmpl/lib/kjua/kjua.min.js >@@ -0,0 +1,2 @@ >+/*! kjua v0.6.0 - https://larsjung.de/kjua/ */ >+!function(t,r){"object"==typeof exports&&"object"==typeof module?module.exports=r():"function"==typeof define&&define.amd?define("kjua",[],r):"object"==typeof exports?exports.kjua=r():t.kjua=r()}("undefined"!=typeof self?self:this,function(){return function(e){var n={};function o(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,o),r.l=!0,r.exports}return o.m=e,o.c=n,o.d=function(t,r,e){o.o(t,r)||Object.defineProperty(t,r,{enumerable:!0,get:e})},o.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},o.t=function(r,t){if(1&t&&(r=o(r)),8&t)return r;if(4&t&&"object"==typeof r&&r&&r.__esModule)return r;var e=Object.create(null);if(o.r(e),Object.defineProperty(e,"default",{enumerable:!0,value:r}),2&t&&"string"!=typeof r)for(var n in r)o.d(e,n,function(t){return r[t]}.bind(null,n));return e},o.n=function(t){var r=t&&t.__esModule?function(){return t.default}:function(){return t};return o.d(r,"a",r),r},o.o=function(t,r){return Object.prototype.hasOwnProperty.call(t,r)},o.p="",o(o.s=0)}([function(t,r,e){var n=e(1),a=n.create_canvas,u=n.canvas_to_img,f=n.dpr,c=e(3),l=e(4),s=e(6);t.exports=function(t){var r=Object.assign({},c,t),e=l(r.text,r.ecLevel,r.minVersion,r.quiet),n=r.ratio||f,o=a(r.size,n),i=o.getContext("2d");return i.scale(n,n),s(e,i,r),"image"===r.render?u(o):o}},function(u,t,r){(function(t){function n(t){return i.createElement(t)}function e(t,r){return t.getAttribute(r)}function o(t,r,e){return t.setAttribute(r,e)}var r=t.window,i=r.document,a=r.devicePixelRatio||1;u.exports={create_canvas:function(t,r){var e=n("canvas");return o(e,"width",t*r),o(e,"height",t*r),e.style.width="".concat(t,"px"),e.style.height="".concat(t,"px"),e},canvas_to_img:function(t){var r=n("img");return o(r,"crossorigin","anonymous"),o(r,"src",t.toDataURL("image/png")),o(r,"width",e(t,"width")),o(r,"height",e(t,"height")),r.style.width=t.style.width,r.style.height=t.style.height,r},dpr:a}}).call(this,r(2))},function(t,r){var e;e=function(){return this}();try{e=e||new Function("return this")()}catch(t){"object"==typeof window&&(e=window)}t.exports=e},function(t,r){t.exports={render:"image",crisp:!0,minVersion:1,ecLevel:"L",size:200,ratio:null,fill:"#333",back:"#fff",text:"no text",rounded:0,quiet:0,mode:"plain",mSize:30,mPosX:50,mPosY:50,label:"no label",fontname:"sans",fontcolor:"#333",image:null}},function(t,r,e){function a(t){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var u=/code length overflow/i,f=e(5);f.stringToBytes=f.stringToBytesFuncs["UTF-8"];t.exports=function(){var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:"",r=1<arguments.length&&void 0!==arguments[1]?arguments[1]:"L",e=2<arguments.length&&void 0!==arguments[2]?arguments[2]:1,n=3<arguments.length&&void 0!==arguments[3]?arguments[3]:0,o=function(t,r){for(var e=2<arguments.length&&void 0!==arguments[2]?arguments[2]:1,o=e=Math.max(1,e);o<=40;o+=1)try{var n=function(){var e=f(o,r);e.addData(t),e.make();var n=e.getModuleCount();return{v:{text:t,level:r,version:o,moduleCount:n,isDark:function(t,r){return 0<=t&&t<n&&0<=r&&r<n&&e.isDark(t,r)}}}}();if("object"===a(n))return n.v}catch(t){if(!(o<40&&u.test(t)))throw new Error(t)}return null}(t,r,e);if(o){var i=o.isDark;o.moduleCount+=2*n,o.isDark=function(t,r){return i(t-n,r-n)}}return o}},function(t,r,e){var n,o,i,a=function(){function i(t,r){function a(t,r){l=function(t){for(var r=new Array(t),e=0;e<t;e+=1){r[e]=new Array(t);for(var n=0;n<t;n+=1)r[e][n]=null}return r}(s=4*u+17),e(0,0),e(s-7,0),e(0,s-7),i(),o(),v(t,r),7<=u&&g(t),null==n&&(n=p(u,f,c)),d(n,r)}var u=t,f=y[r],l=null,s=0,n=null,c=[],h={},e=function(t,r){for(var e=-1;e<=7;e+=1)if(!(t+e<=-1||s<=t+e))for(var n=-1;n<=7;n+=1)r+n<=-1||s<=r+n||(l[t+e][r+n]=0<=e&&e<=6&&(0==n||6==n)||0<=n&&n<=6&&(0==e||6==e)||2<=e&&e<=4&&2<=n&&n<=4)},o=function(){for(var t=8;t<s-8;t+=1)null==l[t][6]&&(l[t][6]=t%2==0);for(var r=8;r<s-8;r+=1)null==l[6][r]&&(l[6][r]=r%2==0)},i=function(){for(var t=w.getPatternPosition(u),r=0;r<t.length;r+=1)for(var e=0;e<t.length;e+=1){var n=t[r],o=t[e];if(null==l[n][o])for(var i=-2;i<=2;i+=1)for(var a=-2;a<=2;a+=1)l[n+i][o+a]=-2==i||2==i||-2==a||2==a||0==i&&0==a}},g=function(t){for(var r=w.getBCHTypeNumber(u),e=0;e<18;e+=1){var n=!t&&1==(r>>e&1);l[Math.floor(e/3)][e%3+s-8-3]=n}for(e=0;e<18;e+=1){n=!t&&1==(r>>e&1);l[e%3+s-8-3][Math.floor(e/3)]=n}},v=function(t,r){for(var e=f<<3|r,n=w.getBCHTypeInfo(e),o=0;o<15;o+=1){var i=!t&&1==(n>>o&1);o<6?l[o][8]=i:o<8?l[o+1][8]=i:l[s-15+o][8]=i}for(o=0;o<15;o+=1){i=!t&&1==(n>>o&1);o<8?l[8][s-o-1]=i:o<9?l[8][15-o-1+1]=i:l[8][15-o-1]=i}l[s-8][8]=!t},d=function(t,r){for(var e=-1,n=s-1,o=7,i=0,a=w.getMaskFunction(r),u=s-1;0<u;u-=2)for(6==u&&(u-=1);;){for(var f=0;f<2;f+=1)if(null==l[n][u-f]){var c=!1;i<t.length&&(c=1==(t[i]>>>o&1)),a(n,u-f)&&(c=!c),l[n][u-f]=c,-1==(o-=1)&&(i+=1,o=7)}if((n+=e)<0||s<=n){n-=e,e=-e;break}}},p=function(t,r,e){for(var n=B.getRSBlocks(t,r),o=C(),i=0;i<e.length;i+=1){var a=e[i];o.put(a.getMode(),4),o.put(a.getLength(),w.getLengthInBits(a.getMode(),t)),a.write(o)}var u=0;for(i=0;i<n.length;i+=1)u+=n[i].dataCount;if(o.getLengthInBits()>8*u)throw"code length overflow. ("+o.getLengthInBits()+">"+8*u+")";for(o.getLengthInBits()+4<=8*u&&o.put(0,4);o.getLengthInBits()%8!=0;)o.putBit(!1);for(;!(o.getLengthInBits()>=8*u||(o.put(236,8),o.getLengthInBits()>=8*u));)o.put(17,8);return function(t,r){for(var e=0,n=0,o=0,i=new Array(r.length),a=new Array(r.length),u=0;u<r.length;u+=1){var f=r[u].dataCount,c=r[u].totalCount-f;n=Math.max(n,f),o=Math.max(o,c),i[u]=new Array(f);for(var l=0;l<i[u].length;l+=1)i[u][l]=255&t.getBuffer()[l+e];e+=f;var s=w.getErrorCorrectPolynomial(c),g=m(i[u],s.getLength()-1).mod(s);for(a[u]=new Array(s.getLength()-1),l=0;l<a[u].length;l+=1){var h=l+g.getLength()-a[u].length;a[u][l]=0<=h?g.getAt(h):0}}var v=0;for(l=0;l<r.length;l+=1)v+=r[l].totalCount;var d=new Array(v),p=0;for(l=0;l<n;l+=1)for(u=0;u<r.length;u+=1)l<i[u].length&&(d[p]=i[u][l],p+=1);for(l=0;l<o;l+=1)for(u=0;u<r.length;u+=1)l<a[u].length&&(d[p]=a[u][l],p+=1);return d}(o,n)};return h.addData=function(t,r){var e=null;switch(r=r||"Byte"){case"Numeric":e=x(t);break;case"Alphanumeric":e=A(t);break;case"Byte":e=M(t);break;case"Kanji":e=S(t);break;default:throw"mode:"+r}c.push(e),n=null},h.isDark=function(t,r){if(t<0||s<=t||r<0||s<=r)throw t+","+r;return l[t][r]},h.getModuleCount=function(){return s},h.make=function(){if(u<1){for(var t=1;t<40;t++){for(var r=B.getRSBlocks(t,f),e=C(),n=0;n<c.length;n++){var o=c[n];e.put(o.getMode(),4),e.put(o.getLength(),w.getLengthInBits(o.getMode(),t)),o.write(e)}var i=0;for(n=0;n<r.length;n++)i+=r[n].dataCount;if(e.getLengthInBits()<=8*i)break}u=t}a(!1,function(){for(var t=0,r=0,e=0;e<8;e+=1){a(!0,e);var n=w.getLostPoint(h);(0==e||n<t)&&(t=n,r=e)}return r}())},h.createTableTag=function(t,r){t=t||2;var e="";e+='<table style="',e+=" border-width: 0px; border-style: none;",e+=" border-collapse: collapse;",e+=" padding: 0px; margin: "+(r=void 0===r?4*t:r)+"px;",e+='">',e+="<tbody>";for(var n=0;n<h.getModuleCount();n+=1){e+="<tr>";for(var o=0;o<h.getModuleCount();o+=1)e+='<td style="',e+=" border-width: 0px; border-style: none;",e+=" border-collapse: collapse;",e+=" padding: 0px; margin: 0px;",e+=" width: "+t+"px;",e+=" height: "+t+"px;",e+=" background-color: ",e+=h.isDark(n,o)?"#000000":"#ffffff",e+=";",e+='"/>';e+="</tr>"}return e+="</tbody>",e+="</table>"},h.createSvgTag=function(t,r){var e={};"object"==typeof t&&(t=(e=t).cellSize,r=e.margin),t=t||2,r=void 0===r?4*t:r;var n,o,i,a,u=h.getModuleCount()*t+2*r,f="";for(a="l"+t+",0 0,"+t+" -"+t+",0 0,-"+t+"z ",f+='<svg version="1.1" xmlns="http://www.w3.org/2000/svg"',f+=e.scalable?"":' width="'+u+'px" height="'+u+'px"',f+=' viewBox="0 0 '+u+" "+u+'" ',f+=' preserveAspectRatio="xMinYMin meet">',f+='<rect width="100%" height="100%" fill="white" cx="0" cy="0"/>',f+='<path d="',o=0;o<h.getModuleCount();o+=1)for(i=o*t+r,n=0;n<h.getModuleCount();n+=1)h.isDark(o,n)&&(f+="M"+(n*t+r)+","+i+a);return f+='" stroke="transparent" fill="black"/>',f+="</svg>"},h.createDataURL=function(o,t){o=o||2,t=void 0===t?4*o:t;var r=h.getModuleCount()*o+2*t,i=t,a=r-t;return D(r,r,function(t,r){if(i<=t&&t<a&&i<=r&&r<a){var e=Math.floor((t-i)/o),n=Math.floor((r-i)/o);return h.isDark(n,e)?0:1}return 1})},h.createImgTag=function(t,r,e){t=t||2,r=void 0===r?4*t:r;var n=h.getModuleCount()*t+2*r,o="";return o+="<img",o+=' src="',o+=h.createDataURL(t,r),o+='"',o+=' width="',o+=n,o+='"',o+=' height="',o+=n,o+='"',e&&(o+=' alt="',o+=e,o+='"'),o+="/>"},h.createASCII=function(t,r){if((t=t||1)<2)return function(t){t=void 0===t?2:t;var r,e,n,o,i,a=1*h.getModuleCount()+2*t,u=t,f=a-t,c={"ââ":"â","â ":"â"," â":"â"," ":" "},l={"ââ":"â","â ":"â"," â":" "," ":" "},s="";for(r=0;r<a;r+=2){for(n=Math.floor((r-u)/1),o=Math.floor((r+1-u)/1),e=0;e<a;e+=1)i="â",u<=e&&e<f&&u<=r&&r<f&&h.isDark(n,Math.floor((e-u)/1))&&(i=" "),u<=e&&e<f&&u<=r+1&&r+1<f&&h.isDark(o,Math.floor((e-u)/1))?i+=" ":i+="â",s+=t<1&&f<=r+1?l[i]:c[i];s+="\n"}return a%2&&0<t?s.substring(0,s.length-a-1)+Array(1+a).join("â"):s.substring(0,s.length-1)}(r);t-=1,r=void 0===r?2*t:r;var e,n,o,i,a=h.getModuleCount()*t+2*r,u=r,f=a-r,c=Array(t+1).join("ââ"),l=Array(t+1).join(" "),s="",g="";for(e=0;e<a;e+=1){for(o=Math.floor((e-u)/t),g="",n=0;n<a;n+=1)i=1,u<=n&&n<f&&u<=e&&e<f&&h.isDark(o,Math.floor((n-u)/t))&&(i=0),g+=i?c:l;for(o=0;o<t;o+=1)s+=g+"\n"}return s.substring(0,s.length-1)},h.renderTo2dContext=function(t,r){r=r||2;for(var e=h.getModuleCount(),n=0;n<e;n++)for(var o=0;o<e;o++)t.fillStyle=h.isDark(n,o)?"black":"white",t.fillRect(n*r,o*r,r,r)},h}i.stringToBytes=(i.stringToBytesFuncs={default:function(t){for(var r=[],e=0;e<t.length;e+=1){var n=t.charCodeAt(e);r.push(255&n)}return r}}).default,i.createStringToBytes=function(u,f){var i=function(){function t(){var t=r.read();if(-1==t)throw"eof";return t}for(var r=L(u),e=0,n={};;){var o=r.read();if(-1==o)break;var i=t(),a=t()<<8|t();n[String.fromCharCode(o<<8|i)]=a,e+=1}if(e!=f)throw e+" != "+f;return n}(),a="?".charCodeAt(0);return function(t){for(var r=[],e=0;e<t.length;e+=1){var n=t.charCodeAt(e);if(n<128)r.push(n);else{var o=i[t.charAt(e)];"number"==typeof o?(255&o)==o?r.push(o):(r.push(o>>>8),r.push(255&o)):r.push(a)}}return r}};var a=1,u=2,o=4,f=8,y={L:1,M:0,Q:3,H:2},n=0,c=1,l=2,s=3,g=4,h=5,v=6,d=7,w=function(){function e(t){for(var r=0;0!=t;)r+=1,t>>>=1;return r}var r=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],t={};return t.getBCHTypeInfo=function(t){for(var r=t<<10;0<=e(r)-e(1335);)r^=1335<<e(r)-e(1335);return 21522^(t<<10|r)},t.getBCHTypeNumber=function(t){for(var r=t<<12;0<=e(r)-e(7973);)r^=7973<<e(r)-e(7973);return t<<12|r},t.getPatternPosition=function(t){return r[t-1]},t.getMaskFunction=function(t){switch(t){case n:return function(t,r){return(t+r)%2==0};case c:return function(t,r){return t%2==0};case l:return function(t,r){return r%3==0};case s:return function(t,r){return(t+r)%3==0};case g:return function(t,r){return(Math.floor(t/2)+Math.floor(r/3))%2==0};case h:return function(t,r){return t*r%2+t*r%3==0};case v:return function(t,r){return(t*r%2+t*r%3)%2==0};case d:return function(t,r){return(t*r%3+(t+r)%2)%2==0};default:throw"bad maskPattern:"+t}},t.getErrorCorrectPolynomial=function(t){for(var r=m([1],0),e=0;e<t;e+=1)r=r.multiply(m([1,p.gexp(e)],0));return r},t.getLengthInBits=function(t,r){if(1<=r&&r<10)switch(t){case a:return 10;case u:return 9;case o:case f:return 8;default:throw"mode:"+t}else if(r<27)switch(t){case a:return 12;case u:return 11;case o:return 16;case f:return 10;default:throw"mode:"+t}else{if(!(r<41))throw"type:"+r;switch(t){case a:return 14;case u:return 13;case o:return 16;case f:return 12;default:throw"mode:"+t}}},t.getLostPoint=function(t){for(var r=t.getModuleCount(),e=0,n=0;n<r;n+=1)for(var o=0;o<r;o+=1){for(var i=0,a=t.isDark(n,o),u=-1;u<=1;u+=1)if(!(n+u<0||r<=n+u))for(var f=-1;f<=1;f+=1)o+f<0||r<=o+f||0==u&&0==f||a==t.isDark(n+u,o+f)&&(i+=1);5<i&&(e+=3+i-5)}for(n=0;n<r-1;n+=1)for(o=0;o<r-1;o+=1){var c=0;t.isDark(n,o)&&(c+=1),t.isDark(n+1,o)&&(c+=1),t.isDark(n,o+1)&&(c+=1),t.isDark(n+1,o+1)&&(c+=1),0!=c&&4!=c||(e+=3)}for(n=0;n<r;n+=1)for(o=0;o<r-6;o+=1)t.isDark(n,o)&&!t.isDark(n,o+1)&&t.isDark(n,o+2)&&t.isDark(n,o+3)&&t.isDark(n,o+4)&&!t.isDark(n,o+5)&&t.isDark(n,o+6)&&(e+=40);for(o=0;o<r;o+=1)for(n=0;n<r-6;n+=1)t.isDark(n,o)&&!t.isDark(n+1,o)&&t.isDark(n+2,o)&&t.isDark(n+3,o)&&t.isDark(n+4,o)&&!t.isDark(n+5,o)&&t.isDark(n+6,o)&&(e+=40);var l=0;for(o=0;o<r;o+=1)for(n=0;n<r;n+=1)t.isDark(n,o)&&(l+=1);return e+=10*(Math.abs(100*l/r/r-50)/5)},t}(),p=function(){for(var r=new Array(256),e=new Array(256),t=0;t<8;t+=1)r[t]=1<<t;for(t=8;t<256;t+=1)r[t]=r[t-4]^r[t-5]^r[t-6]^r[t-8];for(t=0;t<255;t+=1)e[r[t]]=t;var n={glog:function(t){if(t<1)throw"glog("+t+")";return e[t]},gexp:function(t){for(;t<0;)t+=255;for(;256<=t;)t-=255;return r[t]}};return n}();function m(n,o){if(void 0===n.length)throw n.length+"/"+o;var r=function(){for(var t=0;t<n.length&&0==n[t];)t+=1;for(var r=new Array(n.length-t+o),e=0;e<n.length-t;e+=1)r[e]=n[e+t];return r}(),i={getAt:function(t){return r[t]},getLength:function(){return r.length},multiply:function(t){for(var r=new Array(i.getLength()+t.getLength()-1),e=0;e<i.getLength();e+=1)for(var n=0;n<t.getLength();n+=1)r[e+n]^=p.gexp(p.glog(i.getAt(e))+p.glog(t.getAt(n)));return m(r,0)},mod:function(t){if(i.getLength()-t.getLength()<0)return i;for(var r=p.glog(i.getAt(0))-p.glog(t.getAt(0)),e=new Array(i.getLength()),n=0;n<i.getLength();n+=1)e[n]=i.getAt(n);for(n=0;n<t.getLength();n+=1)e[n]^=p.gexp(p.glog(t.getAt(n))+r);return m(e,0).mod(t)}};return i}function b(){var e=[],o={writeByte:function(t){e.push(255&t)},writeShort:function(t){o.writeByte(t),o.writeByte(t>>>8)},writeBytes:function(t,r,e){r=r||0,e=e||t.length;for(var n=0;n<e;n+=1)o.writeByte(t[n+r])},writeString:function(t){for(var r=0;r<t.length;r+=1)o.writeByte(t.charCodeAt(r))},toByteArray:function(){return e},toString:function(){var t="";t+="[";for(var r=0;r<e.length;r+=1)0<r&&(t+=","),t+=e[r];return t+="]"}};return o}var k,t,B=(k=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12,7,37,13],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],(t={}).getRSBlocks=function(t,r){var e=function(t,r){switch(r){case y.L:return k[4*(t-1)+0];case y.M:return k[4*(t-1)+1];case y.Q:return k[4*(t-1)+2];case y.H:return k[4*(t-1)+3];default:return}}(t,r);if(void 0===e)throw"bad rs block @ typeNumber:"+t+"/errorCorrectionLevel:"+r;for(var n,o,i=e.length/3,a=[],u=0;u<i;u+=1)for(var f=e[3*u+0],c=e[3*u+1],l=e[3*u+2],s=0;s<f;s+=1)a.push((n=l,o=void 0,(o={}).totalCount=c,o.dataCount=n,o));return a},t),C=function(){var e=[],n=0,o={getBuffer:function(){return e},getAt:function(t){var r=Math.floor(t/8);return 1==(e[r]>>>7-t%8&1)},put:function(t,r){for(var e=0;e<r;e+=1)o.putBit(1==(t>>>r-e-1&1))},getLengthInBits:function(){return n},putBit:function(t){var r=Math.floor(n/8);e.length<=r&&e.push(0),t&&(e[r]|=128>>>n%8),n+=1}};return o},x=function(t){var r=a,n=t,e={getMode:function(){return r},getLength:function(t){return n.length},write:function(t){for(var r=n,e=0;e+2<r.length;)t.put(o(r.substring(e,e+3)),10),e+=3;e<r.length&&(r.length-e==1?t.put(o(r.substring(e,e+1)),4):r.length-e==2&&t.put(o(r.substring(e,e+2)),7))}},o=function(t){for(var r=0,e=0;e<t.length;e+=1)r=10*r+i(t.charAt(e));return r},i=function(t){if("0"<=t&&t<="9")return t.charCodeAt(0)-"0".charCodeAt(0);throw"illegal char :"+t};return e},A=function(t){var r=u,n=t,e={getMode:function(){return r},getLength:function(t){return n.length},write:function(t){for(var r=n,e=0;e+1<r.length;)t.put(45*o(r.charAt(e))+o(r.charAt(e+1)),11),e+=2;e<r.length&&t.put(o(r.charAt(e)),6)}},o=function(t){if("0"<=t&&t<="9")return t.charCodeAt(0)-"0".charCodeAt(0);if("A"<=t&&t<="Z")return t.charCodeAt(0)-"A".charCodeAt(0)+10;switch(t){case" ":return 36;case"$":return 37;case"%":return 38;case"*":return 39;case"+":return 40;case"-":return 41;case".":return 42;case"/":return 43;case":":return 44;default:throw"illegal char :"+t}};return e},M=function(t){var r=o,e=i.stringToBytes(t),n={getMode:function(){return r},getLength:function(t){return e.length},write:function(t){for(var r=0;r<e.length;r+=1)t.put(e[r],8)}};return n},S=function(t){var r=f,n=i.stringToBytesFuncs.SJIS;if(!n)throw"sjis not supported.";!function(t,r){var e=n("å");if(2!=e.length||38726!=(e[0]<<8|e[1]))throw"sjis not supported."}();var o=n(t),e={getMode:function(){return r},getLength:function(t){return~~(o.length/2)},write:function(t){for(var r=o,e=0;e+1<r.length;){var n=(255&r[e])<<8|255&r[e+1];if(33088<=n&&n<=40956)n-=33088;else{if(!(57408<=n&&n<=60351))throw"illegal char at "+(e+1)+"/"+n;n-=49472}n=192*(n>>>8&255)+(255&n),t.put(n,13),e+=2}if(e<r.length)throw"illegal char at "+(e+1)}};return e},L=function(t){var e=t,n=0,o=0,i=0,r={read:function(){for(;i<8;){if(n>=e.length){if(0==i)return-1;throw"unexpected end of file./"+i}var t=e.charAt(n);if(n+=1,"="==t)return i=0,-1;t.match(/^\s$/)||(o=o<<6|a(t.charCodeAt(0)),i+=6)}var r=o>>>i-8&255;return i-=8,r}},a=function(t){if(65<=t&&t<=90)return t-65;if(97<=t&&t<=122)return t-97+26;if(48<=t&&t<=57)return t-48+52;if(43==t)return 62;if(47==t)return 63;throw"c:"+t};return r},D=function(t,r,e){for(var n=function(t,r){var n=t,o=r,s=new Array(t*r),e={setPixel:function(t,r,e){s[r*n+t]=e},write:function(t){t.writeString("GIF87a"),t.writeShort(n),t.writeShort(o),t.writeByte(128),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(255),t.writeByte(255),t.writeByte(255),t.writeString(","),t.writeShort(0),t.writeShort(0),t.writeShort(n),t.writeShort(o),t.writeByte(0);var r=i(2);t.writeByte(2);for(var e=0;255<r.length-e;)t.writeByte(255),t.writeBytes(r,e,255),e+=255;t.writeByte(r.length-e),t.writeBytes(r,e,r.length-e),t.writeByte(0),t.writeString(";")}},i=function(t){for(var r=1<<t,e=1+(1<<t),n=t+1,o=g(),i=0;i<r;i+=1)o.add(String.fromCharCode(i));o.add(String.fromCharCode(r)),o.add(String.fromCharCode(e));var a=b(),u=function(t){var e=t,n=0,o=0,r={write:function(t,r){if(t>>>r!=0)throw"length over";for(;8<=n+r;)e.writeByte(255&(t<<n|o)),r-=8-n,t>>>=8-n,n=o=0;o|=t<<n,n+=r},flush:function(){0<n&&e.writeByte(o)}};return r}(a);u.write(r,n);var f=0,c=String.fromCharCode(s[f]);for(f+=1;f<s.length;){var l=String.fromCharCode(s[f]);f+=1,o.contains(c+l)?c+=l:(u.write(o.indexOf(c),n),o.size()<4095&&(o.size()==1<<n&&(n+=1),o.add(c+l)),c=l)}return u.write(o.indexOf(c),n),u.write(e,n),u.flush(),a.toByteArray()},g=function(){var r={},e=0,n={add:function(t){if(n.contains(t))throw"dup key:"+t;r[t]=e,e+=1},size:function(){return e},indexOf:function(t){return r[t]},contains:function(t){return void 0!==r[t]}};return n};return e}(t,r),o=0;o<r;o+=1)for(var i=0;i<t;i+=1)n.setPixel(i,o,e(i,o));var a=b();n.write(a);for(var u=function(){function e(t){a+=String.fromCharCode(r(63&t))}var n=0,o=0,i=0,a="",t={},r=function(t){if(t<0);else{if(t<26)return 65+t;if(t<52)return t-26+97;if(t<62)return t-52+48;if(62==t)return 43;if(63==t)return 47}throw"n:"+t};return t.writeByte=function(t){for(n=n<<8|255&t,o+=8,i+=1;6<=o;)e(n>>>o-6),o-=6},t.flush=function(){if(0<o&&(e(n<<6-o),o=n=0),i%3!=0)for(var t=3-i%3,r=0;r<t;r+=1)a+="="},t.toString=function(){return a},t}(),f=a.toByteArray(),c=0;c<f.length;c+=1)u.writeByte(f[c]);return u.flush(),"data:image/gif;base64,"+u};return i}();a.stringToBytesFuncs["UTF-8"]=function(t){return function(t){for(var r=[],e=0;e<t.length;e++){var n=t.charCodeAt(e);n<128?r.push(n):n<2048?r.push(192|n>>6,128|63&n):n<55296||57344<=n?r.push(224|n>>12,128|n>>6&63,128|63&n):(e++,n=65536+((1023&n)<<10|1023&t.charCodeAt(e)),r.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n))}return r}(t)},o=[],void 0===(i="function"==typeof(n=function(){return a})?n.apply(r,o):n)||(t.exports=i)},function(t,r,e){function c(t,r,e,n,o,i){t.isDark(o,i)&&r.rect(i*n,o*n,n,n)}var l=e(7),n=e(8);t.exports=function(t,r,e){!function(t,r){t.fillStyle=r.back,t.fillRect(0,0,r.size,r.size)}(r,e),function(t,r,e){if(t){var n=0<e.rounded&&e.rounded<=100?l:c,o=t.moduleCount,i=e.size/o,a=0;e.crisp&&(i=Math.floor(i),a=Math.floor((e.size-i*o)/2)),r.translate(a,a),r.beginPath();for(var u=0;u<o;u+=1)for(var f=0;f<o;f+=1)n(t,r,e,i,u,f);r.fillStyle=e.fill,r.fill(),r.translate(-a,-a)}}(t,r,e),n(r,e)}},function(t,r){t.exports=function(t,r,e,n,o,i){var a=i*n,u=o*n,f=a+n,c=u+n,l=.005*e.rounded*n,s=t.isDark,g=o-1,h=o+1,v=i-1,d=i+1,p=s(o,i),y=s(g,v),w=s(g,i),m=s(g,d),b=s(o,d),k=s(h,d),B=s(h,i),C=s(h,v),x=s(o,v);r=function(t){return{c:t,m:function(){var t;return(t=this.c).moveTo.apply(t,arguments),this},l:function(){var t;return(t=this.c).lineTo.apply(t,arguments),this},a:function(){var t;return(t=this.c).arcTo.apply(t,arguments),this}}}(r),p?function(t,r,e,n,o,i,a,u,f,c){a?t.m(r+i,e):t.m(r,e),u?t.l(n-i,e).a(n,e,n,o,i):t.l(n,e),f?t.l(n,o-i).a(n,o,r,o,i):t.l(n,o),c?t.l(r+i,o).a(r,o,r,e,i):t.l(r,o),a?t.l(r,e+i).a(r,e,n,e,i):t.l(r,e)}(r,a,u,f,c,l,!w&&!x,!w&&!b,!B&&!b,!B&&!x):function(t,r,e,n,o,i,a,u,f,c){a&&t.m(r+i,e).l(r,e).l(r,e+i).a(r,e,r+i,e,i),u&&t.m(n-i,e).l(n,e).l(n,e+i).a(n,e,n-i,e,i),f&&t.m(n-i,o).l(n,o).l(n,o-i).a(n,o,n-i,o,i),c&&t.m(r+i,o).l(r,o).l(r,o-i).a(r,o,r+i,o,i)}(r,a,u,f,c,l,w&&x&&y,w&&b&&m,B&&b&&k,B&&x&&C)}},function(t,r){t.exports=function(t,r){var e=r.mode;"label"===e?function(t,r){var e=r.size,n="bold "+.01*r.mSize*e+"px "+r.fontname;t.strokeStyle=r.back,t.lineWidth=.01*r.mSize*e*.1,t.fillStyle=r.fontcolor,t.font=n;var o=t.measureText(r.label).width,i=.01*r.mSize,a=(1-o/e)*r.mPosX*.01*e,u=(1-i)*r.mPosY*.01*e+.75*r.mSize*.01*e;t.strokeText(r.label,a,u),t.fillText(r.label,a,u)}(t,r):"image"===e&&function(t,r){var e=r.size,n=r.image.naturalWidth||1,o=r.image.naturalHeight||1,i=.01*r.mSize,a=i*n/o,u=(1-a)*r.mPosX*.01*e,f=(1-i)*r.mPosY*.01*e,c=a*e,l=i*e;t.drawImage(r.image,u,f,c,l)}(t,r)}}])}); >\ No newline at end of file >diff --git a/koha-tmpl/opac-tmpl/lib/kjua/lib/defaults.js b/koha-tmpl/opac-tmpl/lib/kjua/lib/defaults.js >new file mode 100644 >index 0000000..d07dc03 >--- /dev/null >+++ b/koha-tmpl/opac-tmpl/lib/kjua/lib/defaults.js >@@ -0,0 +1,50 @@ >+module.exports = { >+ // render method: 'canvas' or 'image' >+ render: 'image', >+ >+ // render pixel-perfect lines >+ crisp: true, >+ >+ // minimum version: 1..40 >+ minVersion: 1, >+ >+ // error correction level: 'L', 'M', 'Q' or 'H' >+ ecLevel: 'L', >+ >+ // size in pixel >+ size: 200, >+ >+ // pixel-ratio, null for devicePixelRatio >+ ratio: null, >+ >+ // code color >+ fill: '#333', >+ >+ // background color >+ back: '#fff', >+ >+ // content >+ text: 'no text', >+ >+ // roundend corners in pc: 0..100 >+ rounded: 0, >+ >+ // quiet zone in modules >+ quiet: 0, >+ >+ // modes: 'plain', 'label' or 'image' >+ mode: 'plain', >+ >+ // label/image size and pos in pc: 0..100 >+ mSize: 30, >+ mPosX: 50, >+ mPosY: 50, >+ >+ // label >+ label: 'no label', >+ fontname: 'sans', >+ fontcolor: '#333', >+ >+ // image element >+ image: null >+}; >diff --git a/koha-tmpl/opac-tmpl/lib/kjua/lib/dom.js b/koha-tmpl/opac-tmpl/lib/kjua/lib/dom.js >new file mode 100644 >index 0000000..0e72584 >--- /dev/null >+++ b/koha-tmpl/opac-tmpl/lib/kjua/lib/dom.js >@@ -0,0 +1,32 @@ >+const win = global.window; >+const doc = win.document; >+const dpr = win.devicePixelRatio || 1; >+const create = name => doc.createElement(name); >+const get_attr = (el, key) => el.getAttribute(key); >+const set_attr = (el, key, value) => el.setAttribute(key, value); >+ >+const create_canvas = (size, ratio) => { >+ const canvas = create('canvas'); >+ set_attr(canvas, 'width', size * ratio); >+ set_attr(canvas, 'height', size * ratio); >+ canvas.style.width = `${size}px`; >+ canvas.style.height = `${size}px`; >+ return canvas; >+}; >+ >+const canvas_to_img = canvas => { >+ const img = create('img'); >+ set_attr(img, 'crossorigin', 'anonymous'); >+ set_attr(img, 'src', canvas.toDataURL('image/png')); >+ set_attr(img, 'width', get_attr(canvas, 'width')); >+ set_attr(img, 'height', get_attr(canvas, 'height')); >+ img.style.width = canvas.style.width; >+ img.style.height = canvas.style.height; >+ return img; >+}; >+ >+module.exports = { >+ create_canvas, >+ canvas_to_img, >+ dpr >+}; >diff --git a/koha-tmpl/opac-tmpl/lib/kjua/lib/draw.js b/koha-tmpl/opac-tmpl/lib/kjua/lib/draw.js >new file mode 100644 >index 0000000..656f7f6 >--- /dev/null >+++ b/koha-tmpl/opac-tmpl/lib/kjua/lib/draw.js >@@ -0,0 +1,48 @@ >+const draw_module_rounded = require('./draw_rounded'); >+const draw_mode = require('./draw_mode'); >+ >+const draw_background = (ctx, settings) => { >+ ctx.fillStyle = settings.back; >+ ctx.fillRect(0, 0, settings.size, settings.size); >+}; >+ >+const draw_module_default = (qr, ctx, settings, width, row, col) => { >+ if (qr.isDark(row, col)) { >+ ctx.rect(col * width, row * width, width, width); >+ } >+}; >+ >+const draw_modules = (qr, ctx, settings) => { >+ if (!qr) { >+ return; >+ } >+ >+ const draw_module = settings.rounded > 0 && settings.rounded <= 100 ? draw_module_rounded : draw_module_default; >+ const mod_count = qr.moduleCount; >+ >+ let mod_size = settings.size / mod_count; >+ let offset = 0; >+ if (settings.crisp) { >+ mod_size = Math.floor(mod_size); >+ offset = Math.floor((settings.size - mod_size * mod_count) / 2); >+ } >+ >+ ctx.translate(offset, offset); >+ ctx.beginPath(); >+ for (let row = 0; row < mod_count; row += 1) { >+ for (let col = 0; col < mod_count; col += 1) { >+ draw_module(qr, ctx, settings, mod_size, row, col); >+ } >+ } >+ ctx.fillStyle = settings.fill; >+ ctx.fill(); >+ ctx.translate(-offset, -offset); >+}; >+ >+const draw = (qr, ctx, settings) => { >+ draw_background(ctx, settings); >+ draw_modules(qr, ctx, settings); >+ draw_mode(ctx, settings); >+}; >+ >+module.exports = draw; >diff --git a/koha-tmpl/opac-tmpl/lib/kjua/lib/draw_mode.js b/koha-tmpl/opac-tmpl/lib/kjua/lib/draw_mode.js >new file mode 100644 >index 0000000..5484b06 >--- /dev/null >+++ b/koha-tmpl/opac-tmpl/lib/kjua/lib/draw_mode.js >@@ -0,0 +1,47 @@ >+const draw_label = (ctx, settings) => { >+ const size = settings.size; >+ const font = 'bold ' + settings.mSize * 0.01 * size + 'px ' + settings.fontname; >+ >+ ctx.strokeStyle = settings.back; >+ ctx.lineWidth = settings.mSize * 0.01 * size * 0.1; >+ ctx.fillStyle = settings.fontcolor; >+ ctx.font = font; >+ >+ const w = ctx.measureText(settings.label).width; >+ const sh = settings.mSize * 0.01; >+ const sw = w / size; >+ const sl = (1 - sw) * settings.mPosX * 0.01; >+ const st = (1 - sh) * settings.mPosY * 0.01; >+ const x = sl * size; >+ const y = st * size + 0.75 * settings.mSize * 0.01 * size; >+ >+ ctx.strokeText(settings.label, x, y); >+ ctx.fillText(settings.label, x, y); >+}; >+ >+const draw_image = (ctx, settings) => { >+ const size = settings.size; >+ const w = settings.image.naturalWidth || 1; >+ const h = settings.image.naturalHeight || 1; >+ const sh = settings.mSize * 0.01; >+ const sw = sh * w / h; >+ const sl = (1 - sw) * settings.mPosX * 0.01; >+ const st = (1 - sh) * settings.mPosY * 0.01; >+ const x = sl * size; >+ const y = st * size; >+ const iw = sw * size; >+ const ih = sh * size; >+ >+ ctx.drawImage(settings.image, x, y, iw, ih); >+}; >+ >+const draw_mode = (ctx, settings) => { >+ const mode = settings.mode; >+ if (mode === 'label') { >+ draw_label(ctx, settings); >+ } else if (mode === 'image') { >+ draw_image(ctx, settings); >+ } >+}; >+ >+module.exports = draw_mode; >diff --git a/koha-tmpl/opac-tmpl/lib/kjua/lib/draw_rounded.js b/koha-tmpl/opac-tmpl/lib/kjua/lib/draw_rounded.js >new file mode 100644 >index 0000000..8428123 >--- /dev/null >+++ b/koha-tmpl/opac-tmpl/lib/kjua/lib/draw_rounded.js >@@ -0,0 +1,91 @@ >+const wrap_ctx = ctx => { >+ return { >+ c: ctx, >+ m(...args) {this.c.moveTo(...args); return this;}, >+ l(...args) {this.c.lineTo(...args); return this;}, >+ a(...args) {this.c.arcTo(...args); return this;} >+ }; >+}; >+ >+const draw_dark = (ctx, l, t, r, b, rad, nw, ne, se, sw) => { >+ if (nw) { >+ ctx.m(l + rad, t); >+ } else { >+ ctx.m(l, t); >+ } >+ >+ if (ne) { >+ ctx.l(r - rad, t).a(r, t, r, b, rad); >+ } else { >+ ctx.l(r, t); >+ } >+ >+ if (se) { >+ ctx.l(r, b - rad).a(r, b, l, b, rad); >+ } else { >+ ctx.l(r, b); >+ } >+ >+ if (sw) { >+ ctx.l(l + rad, b).a(l, b, l, t, rad); >+ } else { >+ ctx.l(l, b); >+ } >+ >+ if (nw) { >+ ctx.l(l, t + rad).a(l, t, r, t, rad); >+ } else { >+ ctx.l(l, t); >+ } >+}; >+ >+const draw_light = (ctx, l, t, r, b, rad, nw, ne, se, sw) => { >+ if (nw) { >+ ctx.m(l + rad, t).l(l, t).l(l, t + rad).a(l, t, l + rad, t, rad); >+ } >+ >+ if (ne) { >+ ctx.m(r - rad, t).l(r, t).l(r, t + rad).a(r, t, r - rad, t, rad); >+ } >+ >+ if (se) { >+ ctx.m(r - rad, b).l(r, b).l(r, b - rad).a(r, b, r - rad, b, rad); >+ } >+ >+ if (sw) { >+ ctx.m(l + rad, b).l(l, b).l(l, b - rad).a(l, b, l + rad, b, rad); >+ } >+}; >+ >+const draw_mod = (qr, ctx, settings, width, row, col) => { >+ const left = col * width; >+ const top = row * width; >+ const right = left + width; >+ const bottom = top + width; >+ const radius = settings.rounded * 0.005 * width; >+ >+ const isDark = qr.isDark; >+ const rowT = row - 1; >+ const rowB = row + 1; >+ const colL = col - 1; >+ const colR = col + 1; >+ const dC = isDark(row, col); >+ const dNW = isDark(rowT, colL); >+ const dN = isDark(rowT, col); >+ const dNE = isDark(rowT, colR); >+ const dE = isDark(row, colR); >+ const dSE = isDark(rowB, colR); >+ const dS = isDark(rowB, col); >+ const dSW = isDark(rowB, colL); >+ const dW = isDark(row, colL); >+ >+ ctx = wrap_ctx(ctx); >+ >+ if (dC) { >+ draw_dark(ctx, left, top, right, bottom, radius, !dN && !dW, !dN && !dE, !dS && !dE, !dS && !dW); >+ } else { >+ draw_light(ctx, left, top, right, bottom, radius, dN && dW && dNW, dN && dE && dNE, dS && dE && dSE, dS && dW && dSW); >+ } >+}; >+ >+module.exports = draw_mod; >diff --git a/koha-tmpl/opac-tmpl/lib/kjua/lib/qrcode.js b/koha-tmpl/opac-tmpl/lib/kjua/lib/qrcode.js >new file mode 100644 >index 0000000..adb7281 >--- /dev/null >+++ b/koha-tmpl/opac-tmpl/lib/kjua/lib/qrcode.js >@@ -0,0 +1,42 @@ >+const RE_CODE_LENGTH_OVERFLOW = /code length overflow/i; >+ >+const qr_gen = require('qrcode-generator'); >+qr_gen.stringToBytes = qr_gen.stringToBytesFuncs['UTF-8']; >+ >+const min_qrcode = (text, level, min_ver = 1) => { >+ min_ver = Math.max(1, min_ver); >+ >+ for (let version = min_ver; version <= 40; version += 1) { >+ try { >+ const qr = qr_gen(version, level); >+ qr.addData(text); >+ qr.make(); >+ const moduleCount = qr.getModuleCount(); >+ const isDark = (row, col) => { >+ return row >= 0 && >+ row < moduleCount && >+ col >= 0 && >+ col < moduleCount && >+ qr.isDark(row, col); >+ }; >+ return {text, level, version, moduleCount, isDark}; >+ } catch (err) { >+ if (!(version < 40 && RE_CODE_LENGTH_OVERFLOW.test(err))) { >+ throw new Error(err); >+ } >+ } >+ } >+ return null; >+}; >+ >+const quiet_qrcode = (text = '', level = 'L', min_ver = 1, quiet = 0) => { >+ const qr = min_qrcode(text, level, min_ver); >+ if (qr) { >+ const prev_is_dark = qr.isDark; >+ qr.moduleCount += 2 * quiet; >+ qr.isDark = (row, col) => prev_is_dark(row - quiet, col - quiet); >+ } >+ return qr; >+}; >+ >+module.exports = quiet_qrcode; >-- >2.7.4
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 23566
:
93159
|
93160
|
93324