初始版本
This commit is contained in:
+1200
File diff suppressed because it is too large
Load Diff
Vendored
+99
@@ -0,0 +1,99 @@
|
||||
!
|
||||
function() {
|
||||
function o(w, v, i) {
|
||||
return w.getAttribute(v) || i
|
||||
}
|
||||
function j(i) {
|
||||
return document.getElementsByTagName(i)
|
||||
}
|
||||
function l() {
|
||||
var i = j("script"),
|
||||
w = i.length,
|
||||
v = i[w - 1];
|
||||
return {
|
||||
l: w,
|
||||
z: o(v, "zIndex", -1),
|
||||
o: o(v, "opacity", 0.5),
|
||||
c: o(v, "color", "92,92,92"),
|
||||
n: o(v, "count", 99)
|
||||
}
|
||||
}
|
||||
function k() {
|
||||
r = u.width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth,
|
||||
n = u.height = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight
|
||||
}
|
||||
function b() {
|
||||
e.clearRect(0, 0, r, n);
|
||||
var w = [f].concat(t);
|
||||
var x, v, A, B, z, y;
|
||||
t.forEach(function(i) {
|
||||
i.x += i.xa,
|
||||
i.y += i.ya,
|
||||
i.xa *= i.x > r || i.x < 0 ? -1 : 1,
|
||||
i.ya *= i.y > n || i.y < 0 ? -1 : 1,
|
||||
e.fillRect(i.x - 0.5, i.y - 0.5, 1, 1);
|
||||
for (v = 0; v < w.length; v++) {
|
||||
x = w[v];
|
||||
if (i !== x && null !== x.x && null !== x.y) {
|
||||
B = i.x - x.x,
|
||||
z = i.y - x.y,
|
||||
y = B * B + z * z;
|
||||
y < x.max && (x === f && y >= x.max / 2 && (i.x -= 0.03 * B, i.y -= 0.03 * z), A = (x.max - y) / x.max, e.beginPath(), e.lineWidth = A / 2, e.strokeStyle = "rgba(" + s.c + "," + (A + 0.2) + ")", e.moveTo(i.x, i.y), e.lineTo(x.x, x.y), e.stroke())
|
||||
}
|
||||
}
|
||||
w.splice(w.indexOf(i), 1)
|
||||
}),
|
||||
m(b)
|
||||
}
|
||||
var u = document.createElement("canvas"),
|
||||
s = l(),
|
||||
c = "c_n" + s.l,
|
||||
e = u.getContext("2d"),
|
||||
r,
|
||||
n,
|
||||
m = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame ||
|
||||
function(i) {
|
||||
window.setTimeout(i, 1000 / 45)
|
||||
},
|
||||
a = Math.random,
|
||||
f = {
|
||||
x: null,
|
||||
y: null,
|
||||
max: 10000
|
||||
};
|
||||
u.id = c;
|
||||
u.style.cssText = "position:fixed;top:0;left:0;z-index:" + s.z + ";opacity:" + s.o;
|
||||
j("body")[0].appendChild(u);
|
||||
k(),
|
||||
window.onresize = k;
|
||||
window.onmousemove = function(i) {
|
||||
i = i || window.event,
|
||||
f.x = i.clientX,
|
||||
f.y = i.clientY
|
||||
},
|
||||
window.onmouseout = function() {
|
||||
f.x = null,
|
||||
f.y = null
|
||||
};
|
||||
for (var t = [], p = 0; s.n > p; p++) {
|
||||
var h = a() * r,
|
||||
g = a() * n,
|
||||
q = 2 * a() - 1,
|
||||
d = 2 * a() - 1;
|
||||
t.push({
|
||||
x: h,
|
||||
y: g,
|
||||
xa: q,
|
||||
ya: d,
|
||||
max: 6000
|
||||
})
|
||||
}
|
||||
setTimeout(function() {
|
||||
b()
|
||||
},
|
||||
100)
|
||||
} ();
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
/**
|
||||
* File customizer.js.
|
||||
*
|
||||
* Theme Customizer enhancements for a better user experience.
|
||||
*
|
||||
* Contains handlers to make Theme Customizer preview reload changes asynchronously.
|
||||
*/
|
||||
|
||||
( function( $ ) {
|
||||
|
||||
// Site title and description.
|
||||
wp.customize( 'blogname', function( value ) {
|
||||
value.bind( function( to ) {
|
||||
$( '.site-title a' ).text( to );
|
||||
} );
|
||||
} );
|
||||
wp.customize( 'blogdescription', function( value ) {
|
||||
value.bind( function( to ) {
|
||||
$( '.site-description' ).text( to );
|
||||
} );
|
||||
} );
|
||||
|
||||
// Header text color.
|
||||
wp.customize( 'header_textcolor', function( value ) {
|
||||
value.bind( function( to ) {
|
||||
if ( 'blank' === to ) {
|
||||
$( '.site-title a, .site-description' ).css( {
|
||||
'clip': 'rect(1px, 1px, 1px, 1px)',
|
||||
'position': 'absolute'
|
||||
} );
|
||||
} else {
|
||||
$( '.site-title a, .site-description' ).css( {
|
||||
'clip': 'auto',
|
||||
'position': 'relative'
|
||||
} );
|
||||
$( '.site-title a, .site-description' ).css( {
|
||||
'color': to
|
||||
} );
|
||||
}
|
||||
} );
|
||||
} );
|
||||
|
||||
} )( jQuery );
|
||||
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Vendored
+4
@@ -0,0 +1,4 @@
|
||||
// 输入框特效
|
||||
const getCaretCoordinates=(()=>{const properties=["direction","boxSizing","width","height","overflowX","overflowY","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","borderStyle","paddingTop","paddingRight","paddingBottom","paddingLeft","fontStyle","fontVariant","fontWeight","fontStretch","fontSize","fontSizeAdjust","lineHeight","fontFamily","textAlign","textTransform","textIndent","textDecoration","letterSpacing","wordSpacing","tabSize","MozTabSize"];const isFirefox=window.mozInnerScreenX!=null;return function(element,position,options){const debug=options?.debug||false;if(debug){const mirrorDiv=document.querySelector("#input-textarea-caret-position-mirror-div");mirrorDiv?.parentNode?.removeChild(mirrorDiv)}const div=document.createElement("div");div.id="input-textarea-caret-position-mirror-div";document.body.appendChild(div);const style=div.style;const computed=getComputedStyle(element);style.whiteSpace="pre-wrap";if(element.nodeName!=="INPUT")style.wordWrap="break-word";style.position="absolute";if(!debug)style.visibility="hidden";properties.forEach(prop=>style[prop]=computed[prop]);if(isFirefox&&element.scrollHeight>parseInt(computed.height)){style.overflowY="scroll"}else{style.overflow="hidden"}div.textContent=element.value.substring(0,position);if(element.nodeName==="INPUT"){div.textContent=div.textContent.replace(/\s/g,"\u00a0")}const span=document.createElement("span");span.textContent=element.value.substring(position)||".";div.appendChild(span);const coordinates={top:span.offsetTop+parseInt(computed.borderTopWidth),left:span.offsetLeft+parseInt(computed.borderLeftWidth)};if(!debug)document.body.removeChild(div);return coordinates}})();
|
||||
//粒子系统核心逻辑
|
||||
const POWERMODE=(()=>{const canvas=document.createElement("canvas");const context=canvas.getContext("2d");let particles=new Array(500);let pointer=0;canvas.width=window.innerWidth;canvas.height=window.innerHeight;canvas.style.cssText="position:fixed;top:0;left:0;pointer-events:none;z-index:999999;will-change:contents";document.body.appendChild(canvas);let resizeTimeout;window.addEventListener("resize",()=>{clearTimeout(resizeTimeout);resizeTimeout=setTimeout(()=>{canvas.width=window.innerWidth;canvas.height=window.innerHeight},200)});const randomBetween=(min,max)=>Math.random()*(max-min)+min;const colorCache=new WeakMap();const getColor=element=>{if(!POWERMODE.colorful){if(!colorCache.has(element)){colorCache.set(element,getComputedStyle(element).color)}return colorCache.get(element)}const hue=Math.random()*360;return`hsla(${hue},100%,65%,1)`};const getCaret=()=>{const active=document.activeElement;if(!active)return{x:0,y:0,color:"transparent"};if(active.tagName==="TEXTAREA"||active.tagName==="INPUT"){const rect=active.getBoundingClientRect();const coords=getCaretCoordinates(active,active.selectionStart);return{x:coords.left+rect.left,y:coords.top+rect.top,color:getColor(active)}}const selection=window.getSelection();if(selection.rangeCount){const range=selection.getRangeAt(0);const rect=range.getBoundingClientRect();return{x:rect.left,y:rect.top,color:getColor(range.startContainer.nodeType===3?range.startContainer.parentNode:range.startContainer)}}return{x:0,y:0,color:"transparent"}};const createParticle=(x,y,color)=>({x:x+(Math.random()-0.5)*10,y:y+(Math.random()-0.5)*5,alpha:1,color:color,velocity:{x:(Math.random()-0.5)*3,y:-3.5+Math.random()*2}});const render=()=>{requestAnimationFrame(render);context.clearRect(0,0,canvas.width,canvas.height);particles.forEach((particle,index)=>{if(!particle||particle.alpha<=0.1)return;particle.velocity.y+=0.1;particle.x+=particle.velocity.x;particle.y+=particle.velocity.y;particle.alpha*=0.96;context.globalAlpha=particle.alpha;context.fillStyle=particle.color;context.fillRect(Math.round(particle.x-1.5),Math.round(particle.y-1.5),3,3);if(particle.alpha<=0.1)particles[index]=null})};requestAnimationFrame(render);return Object.assign(()=>{const caret=getCaret();let numParticles=5+Math.round(randomBetween(0,10));while(numParticles--){particles[pointer]=createParticle(caret.x,caret.y,caret.color);pointer=(pointer+1)%500}},{colorful:true})})();
|
||||
Vendored
+2
File diff suppressed because one or more lines are too long
@@ -0,0 +1,925 @@
|
||||
/*!
|
||||
* Copyright 2012, Chris Wanstrath
|
||||
* Released under the MIT License
|
||||
* https://github.com/defunkt/jquery-pjax
|
||||
*/
|
||||
|
||||
(function($){
|
||||
|
||||
// When called on a container with a selector, fetches the href with
|
||||
// ajax into the container or with the data-pjax attribute on the link
|
||||
// itself.
|
||||
//
|
||||
// Tries to make sure the back button and ctrl+click work the way
|
||||
// you'd expect.
|
||||
//
|
||||
// Exported as $.fn.pjax
|
||||
//
|
||||
// Accepts a jQuery ajax options object that may include these
|
||||
// pjax specific options:
|
||||
//
|
||||
//
|
||||
// container - Where to stick the response body. Usually a String selector.
|
||||
// $(container).html(xhr.responseBody)
|
||||
// (default: current jquery context)
|
||||
// push - Whether to pushState the URL. Defaults to true (of course).
|
||||
// replace - Want to use replaceState instead? That's cool.
|
||||
//
|
||||
// For convenience the second parameter can be either the container or
|
||||
// the options object.
|
||||
//
|
||||
// Returns the jQuery object
|
||||
function fnPjax(selector, container, options) {
|
||||
var context = this
|
||||
return this.on('click.pjax', selector, function(event) {
|
||||
var opts = $.extend({}, optionsFor(container, options))
|
||||
if (!opts.container)
|
||||
opts.container = $(this).attr('data-pjax') || context
|
||||
handleClick(event, opts)
|
||||
})
|
||||
}
|
||||
|
||||
// Public: pjax on click handler
|
||||
//
|
||||
// Exported as $.pjax.click.
|
||||
//
|
||||
// event - "click" jQuery.Event
|
||||
// options - pjax options
|
||||
//
|
||||
// Examples
|
||||
//
|
||||
// $(document).on('click', 'a', $.pjax.click)
|
||||
// // is the same as
|
||||
// $(document).pjax('a')
|
||||
//
|
||||
// $(document).on('click', 'a', function(event) {
|
||||
// var container = $(this).closest('[data-pjax-container]')
|
||||
// $.pjax.click(event, container)
|
||||
// })
|
||||
//
|
||||
// Returns nothing.
|
||||
function handleClick(event, container, options) {
|
||||
options = optionsFor(container, options)
|
||||
|
||||
var link = event.currentTarget
|
||||
|
||||
if (link.tagName.toUpperCase() !== 'A')
|
||||
throw "$.fn.pjax or $.pjax.click requires an anchor element"
|
||||
|
||||
// Middle click, cmd click, and ctrl click should open
|
||||
// links in a new tab as normal.
|
||||
if ( event.which > 1 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey )
|
||||
return
|
||||
|
||||
// Ignore cross origin links
|
||||
if ( location.protocol !== link.protocol || location.hostname !== link.hostname )
|
||||
return
|
||||
|
||||
// Ignore case when a hash is being tacked on the current URL
|
||||
if ( link.href.indexOf('#') > -1 && stripHash(link) == stripHash(location) )
|
||||
return
|
||||
|
||||
// Ignore event with default prevented
|
||||
if (event.isDefaultPrevented())
|
||||
return
|
||||
|
||||
var defaults = {
|
||||
url: link.href,
|
||||
container: $(link).attr('data-pjax'),
|
||||
target: link
|
||||
}
|
||||
|
||||
var opts = $.extend({}, defaults, options)
|
||||
var clickEvent = $.Event('pjax:click')
|
||||
$(link).trigger(clickEvent, [opts])
|
||||
|
||||
if (!clickEvent.isDefaultPrevented()) {
|
||||
pjax(opts)
|
||||
event.preventDefault()
|
||||
$(link).trigger('pjax:clicked', [opts])
|
||||
}
|
||||
}
|
||||
|
||||
// Public: pjax on form submit handler
|
||||
//
|
||||
// Exported as $.pjax.submit
|
||||
//
|
||||
// event - "click" jQuery.Event
|
||||
// options - pjax options
|
||||
//
|
||||
// Examples
|
||||
//
|
||||
// $(document).on('submit', 'form', function(event) {
|
||||
// var container = $(this).closest('[data-pjax-container]')
|
||||
// $.pjax.submit(event, container)
|
||||
// })
|
||||
//
|
||||
// Returns nothing.
|
||||
function handleSubmit(event, container, options) {
|
||||
options = optionsFor(container, options)
|
||||
|
||||
var form = event.currentTarget
|
||||
var $form = $(form)
|
||||
|
||||
if (form.tagName.toUpperCase() !== 'FORM')
|
||||
throw "$.pjax.submit requires a form element"
|
||||
|
||||
var defaults = {
|
||||
type: ($form.attr('method') || 'GET').toUpperCase(),
|
||||
url: $form.attr('action'),
|
||||
container: $form.attr('data-pjax'),
|
||||
target: form
|
||||
}
|
||||
|
||||
if (defaults.type !== 'GET' && window.FormData !== undefined) {
|
||||
defaults.data = new FormData(form);
|
||||
defaults.processData = false;
|
||||
defaults.contentType = false;
|
||||
} else {
|
||||
// Can't handle file uploads, exit
|
||||
if ($(form).find(':file').length) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Fallback to manually serializing the fields
|
||||
defaults.data = $(form).serializeArray();
|
||||
}
|
||||
|
||||
pjax($.extend({}, defaults, options))
|
||||
|
||||
event.preventDefault()
|
||||
}
|
||||
|
||||
// Loads a URL with ajax, puts the response body inside a container,
|
||||
// then pushState()'s the loaded URL.
|
||||
//
|
||||
// Works just like $.ajax in that it accepts a jQuery ajax
|
||||
// settings object (with keys like url, type, data, etc).
|
||||
//
|
||||
// Accepts these extra keys:
|
||||
//
|
||||
// container - Where to stick the response body.
|
||||
// $(container).html(xhr.responseBody)
|
||||
// push - Whether to pushState the URL. Defaults to true (of course).
|
||||
// replace - Want to use replaceState instead? That's cool.
|
||||
//
|
||||
// Use it just like $.ajax:
|
||||
//
|
||||
// var xhr = $.pjax({ url: this.href, container: '#main' })
|
||||
// console.log( xhr.readyState )
|
||||
//
|
||||
// Returns whatever $.ajax returns.
|
||||
function pjax(options) {
|
||||
options = $.extend(true, {}, $.ajaxSettings, pjax.defaults, options)
|
||||
|
||||
if ($.isFunction(options.url)) {
|
||||
options.url = options.url()
|
||||
}
|
||||
|
||||
var target = options.target
|
||||
|
||||
var hash = parseURL(options.url).hash
|
||||
|
||||
var context = options.context = findContainerFor(options.container)
|
||||
|
||||
// We want the browser to maintain two separate internal caches: one
|
||||
// for pjax'd partial page loads and one for normal page loads.
|
||||
// Without adding this secret parameter, some browsers will often
|
||||
// confuse the two.
|
||||
if (!options.data) options.data = {}
|
||||
if ($.isArray(options.data)) {
|
||||
options.data.push({name: '_pjax', value: context.selector})
|
||||
} else {
|
||||
options.data._pjax = context.selector
|
||||
}
|
||||
|
||||
function fire(type, args, props) {
|
||||
if (!props) props = {}
|
||||
props.relatedTarget = target
|
||||
var event = $.Event(type, props)
|
||||
context.trigger(event, args)
|
||||
return !event.isDefaultPrevented()
|
||||
}
|
||||
|
||||
var timeoutTimer
|
||||
|
||||
options.beforeSend = function(xhr, settings) {
|
||||
// No timeout for non-GET requests
|
||||
// Its not safe to request the resource again with a fallback method.
|
||||
if (settings.type !== 'GET') {
|
||||
settings.timeout = 0
|
||||
}
|
||||
|
||||
xhr.setRequestHeader('X-PJAX', 'true')
|
||||
xhr.setRequestHeader('X-PJAX-Container', context.selector)
|
||||
|
||||
if (!fire('pjax:beforeSend', [xhr, settings]))
|
||||
return false
|
||||
|
||||
if (settings.timeout > 0) {
|
||||
timeoutTimer = setTimeout(function() {
|
||||
if (fire('pjax:timeout', [xhr, options]))
|
||||
xhr.abort('timeout')
|
||||
}, settings.timeout)
|
||||
|
||||
// Clear timeout setting so jquerys internal timeout isn't invoked
|
||||
settings.timeout = 0
|
||||
}
|
||||
|
||||
var url = parseURL(settings.url)
|
||||
if (hash) url.hash = hash
|
||||
options.requestUrl = stripInternalParams(url)
|
||||
}
|
||||
|
||||
options.complete = function(xhr, textStatus) {
|
||||
if (timeoutTimer)
|
||||
clearTimeout(timeoutTimer)
|
||||
|
||||
fire('pjax:complete', [xhr, textStatus, options])
|
||||
|
||||
fire('pjax:end', [xhr, options])
|
||||
}
|
||||
|
||||
options.error = function(xhr, textStatus, errorThrown) {
|
||||
var container = extractContainer("", xhr, options)
|
||||
|
||||
var allowed = fire('pjax:error', [xhr, textStatus, errorThrown, options])
|
||||
if (options.type == 'GET' && textStatus !== 'abort' && allowed) {
|
||||
locationReplace(container.url)
|
||||
}
|
||||
}
|
||||
|
||||
options.success = function(data, status, xhr) {
|
||||
var previousState = pjax.state;
|
||||
|
||||
// If $.pjax.defaults.version is a function, invoke it first.
|
||||
// Otherwise it can be a static string.
|
||||
var currentVersion = (typeof $.pjax.defaults.version === 'function') ?
|
||||
$.pjax.defaults.version() :
|
||||
$.pjax.defaults.version
|
||||
|
||||
var latestVersion = xhr.getResponseHeader('X-PJAX-Version')
|
||||
|
||||
var container = extractContainer(data, xhr, options)
|
||||
|
||||
var url = parseURL(container.url)
|
||||
if (hash) {
|
||||
url.hash = hash
|
||||
container.url = url.href
|
||||
}
|
||||
|
||||
// If there is a layout version mismatch, hard load the new url
|
||||
if (currentVersion && latestVersion && currentVersion !== latestVersion) {
|
||||
locationReplace(container.url)
|
||||
return
|
||||
}
|
||||
|
||||
// If the new response is missing a body, hard load the page
|
||||
if (!container.contents) {
|
||||
locationReplace(container.url)
|
||||
return
|
||||
}
|
||||
|
||||
pjax.state = {
|
||||
id: options.id || uniqueId(),
|
||||
url: container.url,
|
||||
title: container.title,
|
||||
container: context.selector,
|
||||
fragment: options.fragment,
|
||||
timeout: options.timeout
|
||||
}
|
||||
|
||||
if (options.push || options.replace) {
|
||||
window.history.replaceState(pjax.state, container.title, container.url)
|
||||
}
|
||||
|
||||
// Only blur the focus if the focused element is within the container.
|
||||
var blurFocus = $.contains(options.container, document.activeElement)
|
||||
|
||||
// Clear out any focused controls before inserting new page contents.
|
||||
if (blurFocus) {
|
||||
try {
|
||||
document.activeElement.blur()
|
||||
} catch (e) { }
|
||||
}
|
||||
|
||||
if (container.title) document.title = container.title
|
||||
|
||||
fire('pjax:beforeReplace', [container.contents, options], {
|
||||
state: pjax.state,
|
||||
previousState: previousState
|
||||
})
|
||||
context.html(container.contents)
|
||||
|
||||
// FF bug: Won't autofocus fields that are inserted via JS.
|
||||
// This behavior is incorrect. So if theres no current focus, autofocus
|
||||
// the last field.
|
||||
//
|
||||
// http://www.w3.org/html/wg/drafts/html/master/forms.html
|
||||
var autofocusEl = context.find('input[autofocus], textarea[autofocus]').last()[0]
|
||||
if (autofocusEl && document.activeElement !== autofocusEl) {
|
||||
autofocusEl.focus();
|
||||
}
|
||||
|
||||
executeScriptTags(container.scripts)
|
||||
|
||||
var scrollTo = options.scrollTo
|
||||
|
||||
// Ensure browser scrolls to the element referenced by the URL anchor
|
||||
if (hash) {
|
||||
var name = decodeURIComponent(hash.slice(1))
|
||||
var target = document.getElementById(name) || document.getElementsByName(name)[0]
|
||||
if (target) scrollTo = $(target).offset().top
|
||||
}
|
||||
|
||||
if (typeof scrollTo == 'number') $(window).scrollTop(scrollTo)
|
||||
|
||||
fire('pjax:success', [data, status, xhr, options])
|
||||
}
|
||||
|
||||
|
||||
// Initialize pjax.state for the initial page load. Assume we're
|
||||
// using the container and options of the link we're loading for the
|
||||
// back button to the initial page. This ensures good back button
|
||||
// behavior.
|
||||
if (!pjax.state) {
|
||||
pjax.state = {
|
||||
id: uniqueId(),
|
||||
url: window.location.href,
|
||||
title: document.title,
|
||||
container: context.selector,
|
||||
fragment: options.fragment,
|
||||
timeout: options.timeout
|
||||
}
|
||||
window.history.replaceState(pjax.state, document.title)
|
||||
}
|
||||
|
||||
// Cancel the current request if we're already pjaxing
|
||||
abortXHR(pjax.xhr)
|
||||
|
||||
pjax.options = options
|
||||
var xhr = pjax.xhr = $.ajax(options)
|
||||
|
||||
if (xhr.readyState > 0) {
|
||||
if (options.push && !options.replace) {
|
||||
// Cache current container element before replacing it
|
||||
cachePush(pjax.state.id, cloneContents(context))
|
||||
|
||||
window.history.pushState(null, "", options.requestUrl)
|
||||
}
|
||||
|
||||
fire('pjax:start', [xhr, options])
|
||||
fire('pjax:send', [xhr, options])
|
||||
}
|
||||
|
||||
return pjax.xhr
|
||||
}
|
||||
|
||||
// Public: Reload current page with pjax.
|
||||
//
|
||||
// Returns whatever $.pjax returns.
|
||||
function pjaxReload(container, options) {
|
||||
var defaults = {
|
||||
url: window.location.href,
|
||||
push: false,
|
||||
replace: true,
|
||||
scrollTo: false
|
||||
}
|
||||
|
||||
return pjax($.extend(defaults, optionsFor(container, options)))
|
||||
}
|
||||
|
||||
// Internal: Hard replace current state with url.
|
||||
//
|
||||
// Work for around WebKit
|
||||
// https://bugs.webkit.org/show_bug.cgi?id=93506
|
||||
//
|
||||
// Returns nothing.
|
||||
function locationReplace(url) {
|
||||
window.history.replaceState(null, "", pjax.state.url)
|
||||
window.location.replace(url)
|
||||
}
|
||||
|
||||
|
||||
var initialPop = true
|
||||
var initialURL = window.location.href
|
||||
var initialState = window.history.state
|
||||
|
||||
// Initialize $.pjax.state if possible
|
||||
// Happens when reloading a page and coming forward from a different
|
||||
// session history.
|
||||
if (initialState && initialState.container) {
|
||||
pjax.state = initialState
|
||||
}
|
||||
|
||||
// Non-webkit browsers don't fire an initial popstate event
|
||||
if ('state' in window.history) {
|
||||
initialPop = false
|
||||
}
|
||||
|
||||
// popstate handler takes care of the back and forward buttons
|
||||
//
|
||||
// You probably shouldn't use pjax on pages with other pushState
|
||||
// stuff yet.
|
||||
function onPjaxPopstate(event) {
|
||||
|
||||
// Hitting back or forward should override any pending PJAX request.
|
||||
if (!initialPop) {
|
||||
abortXHR(pjax.xhr)
|
||||
}
|
||||
|
||||
var previousState = pjax.state
|
||||
var state = event.state
|
||||
var direction
|
||||
|
||||
if (state && state.container) {
|
||||
// When coming forward from a separate history session, will get an
|
||||
// initial pop with a state we are already at. Skip reloading the current
|
||||
// page.
|
||||
if (initialPop && initialURL == state.url) return
|
||||
|
||||
if (previousState) {
|
||||
// If popping back to the same state, just skip.
|
||||
// Could be clicking back from hashchange rather than a pushState.
|
||||
if (previousState.id === state.id) return
|
||||
|
||||
// Since state IDs always increase, we can deduce the navigation direction
|
||||
direction = previousState.id < state.id ? 'forward' : 'back'
|
||||
}
|
||||
|
||||
var cache = cacheMapping[state.id] || []
|
||||
var container = $(cache[0] || state.container), contents = cache[1]
|
||||
|
||||
if (container.length) {
|
||||
if (previousState) {
|
||||
// Cache current container before replacement and inform the
|
||||
// cache which direction the history shifted.
|
||||
cachePop(direction, previousState.id, cloneContents(container))
|
||||
}
|
||||
|
||||
var popstateEvent = $.Event('pjax:popstate', {
|
||||
state: state,
|
||||
direction: direction
|
||||
})
|
||||
container.trigger(popstateEvent)
|
||||
|
||||
var options = {
|
||||
id: state.id,
|
||||
url: state.url,
|
||||
container: container,
|
||||
push: false,
|
||||
fragment: state.fragment,
|
||||
timeout: state.timeout,
|
||||
scrollTo: false
|
||||
}
|
||||
|
||||
if (contents) {
|
||||
container.trigger('pjax:start', [null, options])
|
||||
|
||||
pjax.state = state
|
||||
if (state.title) document.title = state.title
|
||||
var beforeReplaceEvent = $.Event('pjax:beforeReplace', {
|
||||
state: state,
|
||||
previousState: previousState
|
||||
})
|
||||
container.trigger(beforeReplaceEvent, [contents, options])
|
||||
container.html(contents)
|
||||
|
||||
container.trigger('pjax:end', [null, options])
|
||||
} else {
|
||||
pjax(options)
|
||||
}
|
||||
|
||||
// Force reflow/relayout before the browser tries to restore the
|
||||
// scroll position.
|
||||
container[0].offsetHeight
|
||||
} else {
|
||||
locationReplace(location.href)
|
||||
}
|
||||
}
|
||||
initialPop = false
|
||||
}
|
||||
|
||||
// Fallback version of main pjax function for browsers that don't
|
||||
// support pushState.
|
||||
//
|
||||
// Returns nothing since it retriggers a hard form submission.
|
||||
function fallbackPjax(options) {
|
||||
var url = $.isFunction(options.url) ? options.url() : options.url,
|
||||
method = options.type ? options.type.toUpperCase() : 'GET'
|
||||
|
||||
var form = $('<form>', {
|
||||
method: method === 'GET' ? 'GET' : 'POST',
|
||||
action: url,
|
||||
style: 'display:none'
|
||||
})
|
||||
|
||||
if (method !== 'GET' && method !== 'POST') {
|
||||
form.append($('<input>', {
|
||||
type: 'hidden',
|
||||
name: '_method',
|
||||
value: method.toLowerCase()
|
||||
}))
|
||||
}
|
||||
|
||||
var data = options.data
|
||||
if (typeof data === 'string') {
|
||||
$.each(data.split('&'), function(index, value) {
|
||||
var pair = value.split('=')
|
||||
form.append($('<input>', {type: 'hidden', name: pair[0], value: pair[1]}))
|
||||
})
|
||||
} else if ($.isArray(data)) {
|
||||
$.each(data, function(index, value) {
|
||||
form.append($('<input>', {type: 'hidden', name: value.name, value: value.value}))
|
||||
})
|
||||
} else if (typeof data === 'object') {
|
||||
var key
|
||||
for (key in data)
|
||||
form.append($('<input>', {type: 'hidden', name: key, value: data[key]}))
|
||||
}
|
||||
|
||||
$(document.body).append(form)
|
||||
form.submit()
|
||||
}
|
||||
|
||||
// Internal: Abort an XmlHttpRequest if it hasn't been completed,
|
||||
// also removing its event handlers.
|
||||
function abortXHR(xhr) {
|
||||
if ( xhr && xhr.readyState < 4) {
|
||||
xhr.onreadystatechange = $.noop
|
||||
xhr.abort()
|
||||
}
|
||||
}
|
||||
|
||||
// Internal: Generate unique id for state object.
|
||||
//
|
||||
// Use a timestamp instead of a counter since ids should still be
|
||||
// unique across page loads.
|
||||
//
|
||||
// Returns Number.
|
||||
function uniqueId() {
|
||||
return (new Date).getTime()
|
||||
}
|
||||
|
||||
function cloneContents(container) {
|
||||
var cloned = container.clone()
|
||||
// Unmark script tags as already being eval'd so they can get executed again
|
||||
// when restored from cache. HAXX: Uses jQuery internal method.
|
||||
cloned.find('script').each(function(){
|
||||
if (!this.src) jQuery._data(this, 'globalEval', false)
|
||||
})
|
||||
return [container.selector, cloned.contents()]
|
||||
}
|
||||
|
||||
// Internal: Strip internal query params from parsed URL.
|
||||
//
|
||||
// Returns sanitized url.href String.
|
||||
function stripInternalParams(url) {
|
||||
url.search = url.search.replace(/([?&])(_pjax|_)=[^&]*/g, '')
|
||||
return url.href.replace(/\?($|#)/, '$1')
|
||||
}
|
||||
|
||||
// Internal: Parse URL components and returns a Locationish object.
|
||||
//
|
||||
// url - String URL
|
||||
//
|
||||
// Returns HTMLAnchorElement that acts like Location.
|
||||
function parseURL(url) {
|
||||
var a = document.createElement('a')
|
||||
a.href = url
|
||||
return a
|
||||
}
|
||||
|
||||
// Internal: Return the `href` component of given URL object with the hash
|
||||
// portion removed.
|
||||
//
|
||||
// location - Location or HTMLAnchorElement
|
||||
//
|
||||
// Returns String
|
||||
function stripHash(location) {
|
||||
return location.href.replace(/#.*/, '')
|
||||
}
|
||||
|
||||
// Internal: Build options Object for arguments.
|
||||
//
|
||||
// For convenience the first parameter can be either the container or
|
||||
// the options object.
|
||||
//
|
||||
// Examples
|
||||
//
|
||||
// optionsFor('#container')
|
||||
// // => {container: '#container'}
|
||||
//
|
||||
// optionsFor('#container', {push: true})
|
||||
// // => {container: '#container', push: true}
|
||||
//
|
||||
// optionsFor({container: '#container', push: true})
|
||||
// // => {container: '#container', push: true}
|
||||
//
|
||||
// Returns options Object.
|
||||
function optionsFor(container, options) {
|
||||
// Both container and options
|
||||
if ( container && options )
|
||||
options.container = container
|
||||
|
||||
// First argument is options Object
|
||||
else if ( $.isPlainObject(container) )
|
||||
options = container
|
||||
|
||||
// Only container
|
||||
else
|
||||
options = {container: container}
|
||||
|
||||
// Find and validate container
|
||||
if (options.container)
|
||||
options.container = findContainerFor(options.container)
|
||||
|
||||
return options
|
||||
}
|
||||
|
||||
// Internal: Find container element for a variety of inputs.
|
||||
//
|
||||
// Because we can't persist elements using the history API, we must be
|
||||
// able to find a String selector that will consistently find the Element.
|
||||
//
|
||||
// container - A selector String, jQuery object, or DOM Element.
|
||||
//
|
||||
// Returns a jQuery object whose context is `document` and has a selector.
|
||||
function findContainerFor(container) {
|
||||
container = $(container)
|
||||
|
||||
if ( !container.length ) {
|
||||
throw "no pjax container for " + container.selector
|
||||
} else if ( container.selector !== '' && container.context === document ) {
|
||||
return container
|
||||
} else if ( container.attr('id') ) {
|
||||
return $('#' + container.attr('id'))
|
||||
} else {
|
||||
throw "cant get selector for pjax container!"
|
||||
}
|
||||
}
|
||||
|
||||
// Internal: Filter and find all elements matching the selector.
|
||||
//
|
||||
// Where $.fn.find only matches descendants, findAll will test all the
|
||||
// top level elements in the jQuery object as well.
|
||||
//
|
||||
// elems - jQuery object of Elements
|
||||
// selector - String selector to match
|
||||
//
|
||||
// Returns a jQuery object.
|
||||
function findAll(elems, selector) {
|
||||
return elems.filter(selector).add(elems.find(selector));
|
||||
}
|
||||
|
||||
function parseHTML(html) {
|
||||
return $.parseHTML(html, document, true)
|
||||
}
|
||||
|
||||
// Internal: Extracts container and metadata from response.
|
||||
//
|
||||
// 1. Extracts X-PJAX-URL header if set
|
||||
// 2. Extracts inline <title> tags
|
||||
// 3. Builds response Element and extracts fragment if set
|
||||
//
|
||||
// data - String response data
|
||||
// xhr - XHR response
|
||||
// options - pjax options Object
|
||||
//
|
||||
// Returns an Object with url, title, and contents keys.
|
||||
function extractContainer(data, xhr, options) {
|
||||
var obj = {}, fullDocument = /<html/i.test(data)
|
||||
|
||||
// Prefer X-PJAX-URL header if it was set, otherwise fallback to
|
||||
// using the original requested url.
|
||||
var serverUrl = xhr.getResponseHeader('X-PJAX-URL')
|
||||
obj.url = serverUrl ? stripInternalParams(parseURL(serverUrl)) : options.requestUrl
|
||||
|
||||
// Attempt to parse response html into elements
|
||||
if (fullDocument) {
|
||||
var $head = $(parseHTML(data.match(/<head[^>]*>([\s\S.]*)<\/head>/i)[0]))
|
||||
var $body = $(parseHTML(data.match(/<body[^>]*>([\s\S.]*)<\/body>/i)[0]))
|
||||
} else {
|
||||
var $head = $body = $(parseHTML(data))
|
||||
}
|
||||
|
||||
// If response data is empty, return fast
|
||||
if ($body.length === 0)
|
||||
return obj
|
||||
|
||||
// If there's a <title> tag in the header, use it as
|
||||
// the page's title.
|
||||
obj.title = findAll($head, 'title').last().text()
|
||||
|
||||
if (options.fragment) {
|
||||
// If they specified a fragment, look for it in the response
|
||||
// and pull it out.
|
||||
if (options.fragment === 'body') {
|
||||
var $fragment = $body
|
||||
} else {
|
||||
var $fragment = findAll($body, options.fragment).first()
|
||||
}
|
||||
|
||||
if ($fragment.length) {
|
||||
obj.contents = options.fragment === 'body' ? $fragment : $fragment.contents()
|
||||
|
||||
// If there's no title, look for data-title and title attributes
|
||||
// on the fragment
|
||||
if (!obj.title)
|
||||
obj.title = $fragment.attr('title') || $fragment.data('title')
|
||||
}
|
||||
|
||||
} else if (!fullDocument) {
|
||||
obj.contents = $body
|
||||
}
|
||||
|
||||
// Clean up any <title> tags
|
||||
if (obj.contents) {
|
||||
// Remove any parent title elements
|
||||
obj.contents = obj.contents.not(function() { return $(this).is('title') })
|
||||
|
||||
// Then scrub any titles from their descendants
|
||||
obj.contents.find('title').remove()
|
||||
|
||||
// Gather all script[src] elements
|
||||
obj.scripts = findAll(obj.contents, 'script[src]').remove()
|
||||
obj.contents = obj.contents.not(obj.scripts)
|
||||
}
|
||||
|
||||
// Trim any whitespace off the title
|
||||
if (obj.title) obj.title = $.trim(obj.title)
|
||||
|
||||
return obj
|
||||
}
|
||||
|
||||
// Load an execute scripts using standard script request.
|
||||
//
|
||||
// Avoids jQuery's traditional $.getScript which does a XHR request and
|
||||
// globalEval.
|
||||
//
|
||||
// scripts - jQuery object of script Elements
|
||||
//
|
||||
// Returns nothing.
|
||||
function executeScriptTags(scripts) {
|
||||
if (!scripts) return
|
||||
|
||||
var existingScripts = $('script[src]')
|
||||
|
||||
scripts.each(function() {
|
||||
var src = this.src
|
||||
var matchedScripts = existingScripts.filter(function() {
|
||||
return this.src === src
|
||||
})
|
||||
if (matchedScripts.length) return
|
||||
|
||||
var script = document.createElement('script')
|
||||
var type = $(this).attr('type')
|
||||
if (type) script.type = type
|
||||
script.src = $(this).attr('src')
|
||||
document.head.appendChild(script)
|
||||
})
|
||||
}
|
||||
|
||||
// Internal: History DOM caching class.
|
||||
var cacheMapping = {}
|
||||
var cacheForwardStack = []
|
||||
var cacheBackStack = []
|
||||
|
||||
// Push previous state id and container contents into the history
|
||||
// cache. Should be called in conjunction with `pushState` to save the
|
||||
// previous container contents.
|
||||
//
|
||||
// id - State ID Number
|
||||
// value - DOM Element to cache
|
||||
//
|
||||
// Returns nothing.
|
||||
function cachePush(id, value) {
|
||||
cacheMapping[id] = value
|
||||
cacheBackStack.push(id)
|
||||
|
||||
// Remove all entries in forward history stack after pushing a new page.
|
||||
trimCacheStack(cacheForwardStack, 0)
|
||||
|
||||
// Trim back history stack to max cache length.
|
||||
trimCacheStack(cacheBackStack, pjax.defaults.maxCacheLength)
|
||||
}
|
||||
|
||||
// Shifts cache from directional history cache. Should be
|
||||
// called on `popstate` with the previous state id and container
|
||||
// contents.
|
||||
//
|
||||
// direction - "forward" or "back" String
|
||||
// id - State ID Number
|
||||
// value - DOM Element to cache
|
||||
//
|
||||
// Returns nothing.
|
||||
function cachePop(direction, id, value) {
|
||||
var pushStack, popStack
|
||||
cacheMapping[id] = value
|
||||
|
||||
if (direction === 'forward') {
|
||||
pushStack = cacheBackStack
|
||||
popStack = cacheForwardStack
|
||||
} else {
|
||||
pushStack = cacheForwardStack
|
||||
popStack = cacheBackStack
|
||||
}
|
||||
|
||||
pushStack.push(id)
|
||||
if (id = popStack.pop())
|
||||
delete cacheMapping[id]
|
||||
|
||||
// Trim whichever stack we just pushed to to max cache length.
|
||||
trimCacheStack(pushStack, pjax.defaults.maxCacheLength)
|
||||
}
|
||||
|
||||
// Trim a cache stack (either cacheBackStack or cacheForwardStack) to be no
|
||||
// longer than the specified length, deleting cached DOM elements as necessary.
|
||||
//
|
||||
// stack - Array of state IDs
|
||||
// length - Maximum length to trim to
|
||||
//
|
||||
// Returns nothing.
|
||||
function trimCacheStack(stack, length) {
|
||||
while (stack.length > length)
|
||||
delete cacheMapping[stack.shift()]
|
||||
}
|
||||
|
||||
// Public: Find version identifier for the initial page load.
|
||||
//
|
||||
// Returns String version or undefined.
|
||||
function findVersion() {
|
||||
return $('meta').filter(function() {
|
||||
var name = $(this).attr('http-equiv')
|
||||
return name && name.toUpperCase() === 'X-PJAX-VERSION'
|
||||
}).attr('content')
|
||||
}
|
||||
|
||||
// Install pjax functions on $.pjax to enable pushState behavior.
|
||||
//
|
||||
// Does nothing if already enabled.
|
||||
//
|
||||
// Examples
|
||||
//
|
||||
// $.pjax.enable()
|
||||
//
|
||||
// Returns nothing.
|
||||
function enable() {
|
||||
$.fn.pjax = fnPjax
|
||||
$.pjax = pjax
|
||||
$.pjax.enable = $.noop
|
||||
$.pjax.disable = disable
|
||||
$.pjax.click = handleClick
|
||||
$.pjax.submit = handleSubmit
|
||||
$.pjax.reload = pjaxReload
|
||||
$.pjax.defaults = {
|
||||
timeout: 650,
|
||||
push: true,
|
||||
replace: false,
|
||||
type: 'GET',
|
||||
dataType: 'html',
|
||||
scrollTo: 0,
|
||||
maxCacheLength: 20,
|
||||
version: findVersion
|
||||
}
|
||||
$(window).on('popstate.pjax', onPjaxPopstate)
|
||||
}
|
||||
|
||||
// Disable pushState behavior.
|
||||
//
|
||||
// This is the case when a browser doesn't support pushState. It is
|
||||
// sometimes useful to disable pushState for debugging on a modern
|
||||
// browser.
|
||||
//
|
||||
// Examples
|
||||
//
|
||||
// $.pjax.disable()
|
||||
//
|
||||
// Returns nothing.
|
||||
function disable() {
|
||||
$.fn.pjax = function() { return this }
|
||||
$.pjax = fallbackPjax
|
||||
$.pjax.enable = enable
|
||||
$.pjax.disable = $.noop
|
||||
$.pjax.click = $.noop
|
||||
$.pjax.submit = $.noop
|
||||
$.pjax.reload = function() { window.location.reload() }
|
||||
|
||||
$(window).off('popstate.pjax', onPjaxPopstate)
|
||||
}
|
||||
|
||||
|
||||
// Add the state property to jQuery's event object so we can use it in
|
||||
// $(window).bind('popstate')
|
||||
if ( $.inArray('state', $.event.props) < 0 )
|
||||
$.event.props.push('state')
|
||||
|
||||
// Is pjax supported by this browser?
|
||||
$.support.pjax =
|
||||
window.history && window.history.pushState && window.history.replaceState &&
|
||||
// pushState isn't reliable on iOS until 5.
|
||||
!navigator.userAgent.match(/((iPod|iPhone|iPad).+\bOS\s+[1-4]\D|WebApps\/.+CFNetwork)/)
|
||||
|
||||
$.support.pjax ? enable() : disable()
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,73 @@
|
||||
/*
|
||||
* Resize Image
|
||||
*/
|
||||
function resizeImage(id) {
|
||||
jQuery('#' + id).css({
|
||||
'position': 'absolute',
|
||||
'top': '0px',
|
||||
'left': '0px',
|
||||
'width': '100%',
|
||||
'height': '100%',
|
||||
'z-index': -1,
|
||||
'overflow': 'hidden'
|
||||
});
|
||||
var w = jQuery(window).width(),
|
||||
h = jQuery(window).height(),
|
||||
o = jQuery('#' + id).children('img'),
|
||||
iW = o.width(),
|
||||
iH = o.height();
|
||||
o.css({
|
||||
'display': 'block',
|
||||
'opacity': 0
|
||||
});
|
||||
if (w > h) {
|
||||
if (iW > iH) {
|
||||
o.css({
|
||||
'width': w
|
||||
});
|
||||
o.css({
|
||||
'height': Math.round((iH / iW) * w)
|
||||
});
|
||||
var newIh = Math.round((iH / iW) * w);
|
||||
if (newIh < h) {
|
||||
o.css({
|
||||
'height': h
|
||||
});
|
||||
o.css({
|
||||
'width': Math.round((iW / iH) * h)
|
||||
})
|
||||
}
|
||||
} else {
|
||||
o.css({
|
||||
'height': h
|
||||
});
|
||||
o.css({
|
||||
'width': Math.round((iW / iH) * h)
|
||||
})
|
||||
}
|
||||
} else {
|
||||
o.css({
|
||||
'height': h
|
||||
});
|
||||
o.css({
|
||||
'width': Math.round((iW / iH) * h)
|
||||
})
|
||||
}
|
||||
var newIW = o.width(),
|
||||
newIH = o.height();
|
||||
if (newIW > w) {
|
||||
var l = (newIW - w) / 2;
|
||||
o.css('margin-left', -l)
|
||||
} else {
|
||||
o.css('margin-left', 0)
|
||||
}
|
||||
if (newIH > h) {
|
||||
var t = (newIH - h) / 2;
|
||||
o.css('margin-top', -t)
|
||||
} else {
|
||||
o.css('margin-top', 0)
|
||||
}
|
||||
o.css({
|
||||
'opacity': '1'
|
||||
})
|
||||
}
|
||||
@@ -0,0 +1,480 @@
|
||||
/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress
|
||||
* @license MIT */
|
||||
|
||||
;(function(root, factory) {
|
||||
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
define(factory);
|
||||
} else if (typeof exports === 'object') {
|
||||
module.exports = factory();
|
||||
} else {
|
||||
root.NProgress = factory();
|
||||
}
|
||||
|
||||
})(this, function() {
|
||||
var NProgress = {};
|
||||
|
||||
NProgress.version = '0.2.0';
|
||||
|
||||
var Settings = NProgress.settings = {
|
||||
minimum: 0.08,
|
||||
easing: 'linear',
|
||||
positionUsing: '',
|
||||
speed: 200,
|
||||
trickle: true,
|
||||
trickleSpeed: 200,
|
||||
showSpinner: true,
|
||||
barSelector: '[role="bar"]',
|
||||
spinnerSelector: '[role="spinner"]',
|
||||
parent: 'body',
|
||||
template: '<div class="bar" role="bar"><div class="peg"></div></div><div class="spinner" role="spinner"><div class="spinner-icon"></div></div>'
|
||||
};
|
||||
|
||||
/**
|
||||
* Updates configuration.
|
||||
*
|
||||
* NProgress.configure({
|
||||
* minimum: 0.1
|
||||
* });
|
||||
*/
|
||||
NProgress.configure = function(options) {
|
||||
var key, value;
|
||||
for (key in options) {
|
||||
value = options[key];
|
||||
if (value !== undefined && options.hasOwnProperty(key)) Settings[key] = value;
|
||||
}
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Last number.
|
||||
*/
|
||||
|
||||
NProgress.status = null;
|
||||
|
||||
/**
|
||||
* Sets the progress bar status, where `n` is a number from `0.0` to `1.0`.
|
||||
*
|
||||
* NProgress.set(0.4);
|
||||
* NProgress.set(1.0);
|
||||
*/
|
||||
|
||||
NProgress.set = function(n) {
|
||||
var started = NProgress.isStarted();
|
||||
|
||||
n = clamp(n, Settings.minimum, 1);
|
||||
NProgress.status = (n === 1 ? null : n);
|
||||
|
||||
var progress = NProgress.render(!started),
|
||||
bar = progress.querySelector(Settings.barSelector),
|
||||
speed = Settings.speed,
|
||||
ease = Settings.easing;
|
||||
|
||||
progress.offsetWidth; /* Repaint */
|
||||
|
||||
queue(function(next) {
|
||||
// Set positionUsing if it hasn't already been set
|
||||
if (Settings.positionUsing === '') Settings.positionUsing = NProgress.getPositioningCSS();
|
||||
|
||||
// Add transition
|
||||
css(bar, barPositionCSS(n, speed, ease));
|
||||
|
||||
if (n === 1) {
|
||||
// Fade out
|
||||
css(progress, {
|
||||
transition: 'none',
|
||||
opacity: 1
|
||||
});
|
||||
progress.offsetWidth; /* Repaint */
|
||||
|
||||
setTimeout(function() {
|
||||
css(progress, {
|
||||
transition: 'all ' + speed + 'ms linear',
|
||||
opacity: 0
|
||||
});
|
||||
setTimeout(function() {
|
||||
NProgress.remove();
|
||||
next();
|
||||
}, speed);
|
||||
}, speed);
|
||||
} else {
|
||||
setTimeout(next, speed);
|
||||
}
|
||||
});
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
NProgress.isStarted = function() {
|
||||
return typeof NProgress.status === 'number';
|
||||
};
|
||||
|
||||
/**
|
||||
* Shows the progress bar.
|
||||
* This is the same as setting the status to 0%, except that it doesn't go backwards.
|
||||
*
|
||||
* NProgress.start();
|
||||
*
|
||||
*/
|
||||
NProgress.start = function() {
|
||||
if (!NProgress.status) NProgress.set(0);
|
||||
|
||||
var work = function() {
|
||||
setTimeout(function() {
|
||||
if (!NProgress.status) return;
|
||||
NProgress.trickle();
|
||||
work();
|
||||
}, Settings.trickleSpeed);
|
||||
};
|
||||
|
||||
if (Settings.trickle) work();
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Hides the progress bar.
|
||||
* This is the *sort of* the same as setting the status to 100%, with the
|
||||
* difference being `done()` makes some placebo effect of some realistic motion.
|
||||
*
|
||||
* NProgress.done();
|
||||
*
|
||||
* If `true` is passed, it will show the progress bar even if its hidden.
|
||||
*
|
||||
* NProgress.done(true);
|
||||
*/
|
||||
|
||||
NProgress.done = function(force) {
|
||||
if (!force && !NProgress.status) return this;
|
||||
|
||||
return NProgress.inc(0.3 + 0.5 * Math.random()).set(1);
|
||||
};
|
||||
|
||||
/**
|
||||
* Increments by a random amount.
|
||||
*/
|
||||
|
||||
NProgress.inc = function(amount) {
|
||||
var n = NProgress.status;
|
||||
|
||||
if (!n) {
|
||||
return NProgress.start();
|
||||
} else if(n > 1) {
|
||||
return;
|
||||
} else {
|
||||
if (typeof amount !== 'number') {
|
||||
if (n >= 0 && n < 0.2) { amount = 0.1; }
|
||||
else if (n >= 0.2 && n < 0.5) { amount = 0.04; }
|
||||
else if (n >= 0.5 && n < 0.8) { amount = 0.02; }
|
||||
else if (n >= 0.8 && n < 0.99) { amount = 0.005; }
|
||||
else { amount = 0; }
|
||||
}
|
||||
|
||||
n = clamp(n + amount, 0, 0.994);
|
||||
return NProgress.set(n);
|
||||
}
|
||||
};
|
||||
|
||||
NProgress.trickle = function() {
|
||||
return NProgress.inc();
|
||||
};
|
||||
|
||||
/**
|
||||
* Waits for all supplied jQuery promises and
|
||||
* increases the progress as the promises resolve.
|
||||
*
|
||||
* @param $promise jQUery Promise
|
||||
*/
|
||||
(function() {
|
||||
var initial = 0, current = 0;
|
||||
|
||||
NProgress.promise = function($promise) {
|
||||
if (!$promise || $promise.state() === "resolved") {
|
||||
return this;
|
||||
}
|
||||
|
||||
if (current === 0) {
|
||||
NProgress.start();
|
||||
}
|
||||
|
||||
initial++;
|
||||
current++;
|
||||
|
||||
$promise.always(function() {
|
||||
current--;
|
||||
if (current === 0) {
|
||||
initial = 0;
|
||||
NProgress.done();
|
||||
} else {
|
||||
NProgress.set((initial - current) / initial);
|
||||
}
|
||||
});
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
})();
|
||||
|
||||
/**
|
||||
* (Internal) renders the progress bar markup based on the `template`
|
||||
* setting.
|
||||
*/
|
||||
|
||||
NProgress.render = function(fromStart) {
|
||||
if (NProgress.isRendered()) return document.getElementById('nprogress');
|
||||
|
||||
addClass(document.documentElement, 'nprogress-busy');
|
||||
|
||||
var progress = document.createElement('div');
|
||||
progress.id = 'nprogress';
|
||||
progress.innerHTML = Settings.template;
|
||||
|
||||
var bar = progress.querySelector(Settings.barSelector),
|
||||
perc = fromStart ? '-100' : toBarPerc(NProgress.status || 0),
|
||||
parent = document.querySelector(Settings.parent),
|
||||
spinner;
|
||||
|
||||
css(bar, {
|
||||
transition: 'all 0 linear',
|
||||
transform: 'translate3d(' + perc + '%,0,0)'
|
||||
});
|
||||
|
||||
if (!Settings.showSpinner) {
|
||||
spinner = progress.querySelector(Settings.spinnerSelector);
|
||||
spinner && removeElement(spinner);
|
||||
}
|
||||
|
||||
if (parent != document.body) {
|
||||
addClass(parent, 'nprogress-custom-parent');
|
||||
}
|
||||
|
||||
parent.appendChild(progress);
|
||||
return progress;
|
||||
};
|
||||
|
||||
/**
|
||||
* Removes the element. Opposite of render().
|
||||
*/
|
||||
|
||||
NProgress.remove = function() {
|
||||
removeClass(document.documentElement, 'nprogress-busy');
|
||||
removeClass(document.querySelector(Settings.parent), 'nprogress-custom-parent');
|
||||
var progress = document.getElementById('nprogress');
|
||||
progress && removeElement(progress);
|
||||
};
|
||||
|
||||
/**
|
||||
* Checks if the progress bar is rendered.
|
||||
*/
|
||||
|
||||
NProgress.isRendered = function() {
|
||||
return !!document.getElementById('nprogress');
|
||||
};
|
||||
|
||||
/**
|
||||
* Determine which positioning CSS rule to use.
|
||||
*/
|
||||
|
||||
NProgress.getPositioningCSS = function() {
|
||||
// Sniff on document.body.style
|
||||
var bodyStyle = document.body.style;
|
||||
|
||||
// Sniff prefixes
|
||||
var vendorPrefix = ('WebkitTransform' in bodyStyle) ? 'Webkit' :
|
||||
('MozTransform' in bodyStyle) ? 'Moz' :
|
||||
('msTransform' in bodyStyle) ? 'ms' :
|
||||
('OTransform' in bodyStyle) ? 'O' : '';
|
||||
|
||||
if (vendorPrefix + 'Perspective' in bodyStyle) {
|
||||
// Modern browsers with 3D support, e.g. Webkit, IE10
|
||||
return 'translate3d';
|
||||
} else if (vendorPrefix + 'Transform' in bodyStyle) {
|
||||
// Browsers without 3D support, e.g. IE9
|
||||
return 'translate';
|
||||
} else {
|
||||
// Browsers without translate() support, e.g. IE7-8
|
||||
return 'margin';
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Helpers
|
||||
*/
|
||||
|
||||
function clamp(n, min, max) {
|
||||
if (n < min) return min;
|
||||
if (n > max) return max;
|
||||
return n;
|
||||
}
|
||||
|
||||
/**
|
||||
* (Internal) converts a percentage (`0..1`) to a bar translateX
|
||||
* percentage (`-100%..0%`).
|
||||
*/
|
||||
|
||||
function toBarPerc(n) {
|
||||
return (-1 + n) * 100;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* (Internal) returns the correct CSS for changing the bar's
|
||||
* position given an n percentage, and speed and ease from Settings
|
||||
*/
|
||||
|
||||
function barPositionCSS(n, speed, ease) {
|
||||
var barCSS;
|
||||
|
||||
if (Settings.positionUsing === 'translate3d') {
|
||||
barCSS = { transform: 'translate3d('+toBarPerc(n)+'%,0,0)' };
|
||||
} else if (Settings.positionUsing === 'translate') {
|
||||
barCSS = { transform: 'translate('+toBarPerc(n)+'%,0)' };
|
||||
} else {
|
||||
barCSS = { 'margin-left': toBarPerc(n)+'%' };
|
||||
}
|
||||
|
||||
barCSS.transition = 'all '+speed+'ms '+ease;
|
||||
|
||||
return barCSS;
|
||||
}
|
||||
|
||||
/**
|
||||
* (Internal) Queues a function to be executed.
|
||||
*/
|
||||
|
||||
var queue = (function() {
|
||||
var pending = [];
|
||||
|
||||
function next() {
|
||||
var fn = pending.shift();
|
||||
if (fn) {
|
||||
fn(next);
|
||||
}
|
||||
}
|
||||
|
||||
return function(fn) {
|
||||
pending.push(fn);
|
||||
if (pending.length == 1) next();
|
||||
};
|
||||
})();
|
||||
|
||||
/**
|
||||
* (Internal) Applies css properties to an element, similar to the jQuery
|
||||
* css method.
|
||||
*
|
||||
* While this helper does assist with vendor prefixed property names, it
|
||||
* does not perform any manipulation of values prior to setting styles.
|
||||
*/
|
||||
|
||||
var css = (function() {
|
||||
var cssPrefixes = [ 'Webkit', 'O', 'Moz', 'ms' ],
|
||||
cssProps = {};
|
||||
|
||||
function camelCase(string) {
|
||||
return string.replace(/^-ms-/, 'ms-').replace(/-([\da-z])/gi, function(match, letter) {
|
||||
return letter.toUpperCase();
|
||||
});
|
||||
}
|
||||
|
||||
function getVendorProp(name) {
|
||||
var style = document.body.style;
|
||||
if (name in style) return name;
|
||||
|
||||
var i = cssPrefixes.length,
|
||||
capName = name.charAt(0).toUpperCase() + name.slice(1),
|
||||
vendorName;
|
||||
while (i--) {
|
||||
vendorName = cssPrefixes[i] + capName;
|
||||
if (vendorName in style) return vendorName;
|
||||
}
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
function getStyleProp(name) {
|
||||
name = camelCase(name);
|
||||
return cssProps[name] || (cssProps[name] = getVendorProp(name));
|
||||
}
|
||||
|
||||
function applyCss(element, prop, value) {
|
||||
prop = getStyleProp(prop);
|
||||
element.style[prop] = value;
|
||||
}
|
||||
|
||||
return function(element, properties) {
|
||||
var args = arguments,
|
||||
prop,
|
||||
value;
|
||||
|
||||
if (args.length == 2) {
|
||||
for (prop in properties) {
|
||||
value = properties[prop];
|
||||
if (value !== undefined && properties.hasOwnProperty(prop)) applyCss(element, prop, value);
|
||||
}
|
||||
} else {
|
||||
applyCss(element, args[1], args[2]);
|
||||
}
|
||||
}
|
||||
})();
|
||||
|
||||
/**
|
||||
* (Internal) Determines if an element or space separated list of class names contains a class name.
|
||||
*/
|
||||
|
||||
function hasClass(element, name) {
|
||||
var list = typeof element == 'string' ? element : classList(element);
|
||||
return list.indexOf(' ' + name + ' ') >= 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* (Internal) Adds a class to an element.
|
||||
*/
|
||||
|
||||
function addClass(element, name) {
|
||||
var oldList = classList(element),
|
||||
newList = oldList + name;
|
||||
|
||||
if (hasClass(oldList, name)) return;
|
||||
|
||||
// Trim the opening space.
|
||||
element.className = newList.substring(1);
|
||||
}
|
||||
|
||||
/**
|
||||
* (Internal) Removes a class from an element.
|
||||
*/
|
||||
|
||||
function removeClass(element, name) {
|
||||
var oldList = classList(element),
|
||||
newList;
|
||||
|
||||
if (!hasClass(element, name)) return;
|
||||
|
||||
// Replace the class name.
|
||||
newList = oldList.replace(' ' + name + ' ', ' ');
|
||||
|
||||
// Trim the opening and closing spaces.
|
||||
element.className = newList.substring(1, newList.length - 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* (Internal) Gets a space separated list of the class names on the element.
|
||||
* The list is wrapped with a single space on each end to facilitate finding
|
||||
* matches within the list.
|
||||
*/
|
||||
|
||||
function classList(element) {
|
||||
return (' ' + (element && element.className || '') + ' ').replace(/\s+/gi, ' ');
|
||||
}
|
||||
|
||||
/**
|
||||
* (Internal) Removes an element from the DOM.
|
||||
*/
|
||||
|
||||
function removeElement(element) {
|
||||
element && element.parentNode && element.parentNode.removeChild(element);
|
||||
}
|
||||
|
||||
return NProgress;
|
||||
});
|
||||
Vendored
+787
@@ -0,0 +1,787 @@
|
||||
var QRCode;
|
||||
! function() {
|
||||
function a(a) {
|
||||
this.mode = c.MODE_8BIT_BYTE, this.data = a, this.parsedData = [];
|
||||
for (var b = [], d = 0, e = this.data.length; e > d; d++) {
|
||||
var f = this.data.charCodeAt(d);
|
||||
f > 65536 ? (b[0] = 240 | (1835008 & f) >>> 18, b[1] = 128 | (258048 & f) >>> 12, b[2] = 128 | (4032 & f) >>> 6, b[3] = 128 | 63 & f) : f > 2048 ? (b[0] = 224 | (61440 & f) >>> 12, b[1] = 128 | (4032 & f) >>> 6, b[2] = 128 | 63 & f) : f > 128 ? (b[0] = 192 | (1984 & f) >>> 6, b[1] = 128 | 63 & f) : b[0] = f, this.parsedData = this.parsedData.concat(b)
|
||||
}
|
||||
this.parsedData.length != this.data.length && (this.parsedData.unshift(191), this.parsedData.unshift(187), this.parsedData.unshift(239))
|
||||
}
|
||||
|
||||
function b(a, b) {
|
||||
this.typeNumber = a, this.errorCorrectLevel = b, this.modules = null, this.moduleCount = 0, this.dataCache = null, this.dataList = []
|
||||
}
|
||||
|
||||
function i(a, b) {
|
||||
if (void 0 == a.length) throw new Error(a.length + "/" + b);
|
||||
for (var c = 0; c < a.length && 0 == a[c];) c++;
|
||||
this.num = new Array(a.length - c + b);
|
||||
for (var d = 0; d < a.length - c; d++) this.num[d] = a[d + c]
|
||||
}
|
||||
|
||||
function j(a, b) {
|
||||
this.totalCount = a, this.dataCount = b
|
||||
}
|
||||
|
||||
function k() {
|
||||
this.buffer = [], this.length = 0
|
||||
}
|
||||
|
||||
function m() {
|
||||
return "undefined" != typeof CanvasRenderingContext2D
|
||||
}
|
||||
|
||||
function n() {
|
||||
var a = !1,
|
||||
b = navigator.userAgent;
|
||||
return /android/i.test(b) && (a = !0, aMat = b.toString().match(/android ([0-9]\.[0-9])/i), aMat && aMat[1] && (a = parseFloat(aMat[1]))), a
|
||||
}
|
||||
|
||||
function r(a, b) {
|
||||
for (var c = 1, e = s(a), f = 0, g = l.length; g >= f; f++) {
|
||||
var h = 0;
|
||||
switch (b) {
|
||||
case d.L:
|
||||
h = l[f][0];
|
||||
break;
|
||||
case d.M:
|
||||
h = l[f][1];
|
||||
break;
|
||||
case d.Q:
|
||||
h = l[f][2];
|
||||
break;
|
||||
case d.H:
|
||||
h = l[f][3]
|
||||
}
|
||||
if (h >= e) break;
|
||||
c++
|
||||
}
|
||||
if (c > l.length) throw new Error("Too long data");
|
||||
return c
|
||||
}
|
||||
|
||||
function s(a) {
|
||||
var b = encodeURI(a).toString().replace(/\%[0-9a-fA-F]{2}/g, "a");
|
||||
return b.length + (b.length != a ? 3 : 0)
|
||||
}
|
||||
a.prototype = {
|
||||
getLength: function() {
|
||||
return this.parsedData.length
|
||||
},
|
||||
write: function(a) {
|
||||
for (var b = 0, c = this.parsedData.length; c > b; b++) a.put(this.parsedData[b], 8)
|
||||
}
|
||||
}, b.prototype = {
|
||||
addData: function(b) {
|
||||
var c = new a(b);
|
||||
this.dataList.push(c), this.dataCache = null
|
||||
},
|
||||
isDark: function(a, b) {
|
||||
if (0 > a || this.moduleCount <= a || 0 > b || this.moduleCount <= b) throw new Error(a + "," + b);
|
||||
return this.modules[a][b]
|
||||
},
|
||||
getModuleCount: function() {
|
||||
return this.moduleCount
|
||||
},
|
||||
make: function() {
|
||||
this.makeImpl(!1, this.getBestMaskPattern())
|
||||
},
|
||||
makeImpl: function(a, c) {
|
||||
this.moduleCount = 4 * this.typeNumber + 17, this.modules = new Array(this.moduleCount);
|
||||
for (var d = 0; d < this.moduleCount; d++) {
|
||||
this.modules[d] = new Array(this.moduleCount);
|
||||
for (var e = 0; e < this.moduleCount; e++) this.modules[d][e] = null
|
||||
}
|
||||
this.setupPositionProbePattern(0, 0), this.setupPositionProbePattern(this.moduleCount - 7, 0), this.setupPositionProbePattern(0, this.moduleCount - 7), this.setupPositionAdjustPattern(), this.setupTimingPattern(), this.setupTypeInfo(a, c), this.typeNumber >= 7 && this.setupTypeNumber(a), null == this.dataCache && (this.dataCache = b.createData(this.typeNumber, this.errorCorrectLevel, this.dataList)), this.mapData(this.dataCache, c)
|
||||
},
|
||||
setupPositionProbePattern: function(a, b) {
|
||||
for (var c = -1; 7 >= c; c++)
|
||||
if (!(-1 >= a + c || this.moduleCount <= a + c))
|
||||
for (var d = -1; 7 >= d; d++) - 1 >= b + d || this.moduleCount <= b + d || (this.modules[a + c][b + d] = c >= 0 && 6 >= c && (0 == d || 6 == d) || d >= 0 && 6 >= d && (0 == c || 6 == c) || c >= 2 && 4 >= c && d >= 2 && 4 >= d ? !0 : !1)
|
||||
},
|
||||
getBestMaskPattern: function() {
|
||||
for (var a = 0, b = 0, c = 0; 8 > c; c++) {
|
||||
this.makeImpl(!0, c);
|
||||
var d = f.getLostPoint(this);
|
||||
(0 == c || a > d) && (a = d, b = c)
|
||||
}
|
||||
return b
|
||||
},
|
||||
createMovieClip: function(a, b, c) {
|
||||
var d = a.createEmptyMovieClip(b, c),
|
||||
e = 1;
|
||||
this.make();
|
||||
for (var f = 0; f < this.modules.length; f++)
|
||||
for (var g = f * e, h = 0; h < this.modules[f].length; h++) {
|
||||
var i = h * e,
|
||||
j = this.modules[f][h];
|
||||
j && (d.beginFill(0, 100), d.moveTo(i, g), d.lineTo(i + e, g), d.lineTo(i + e, g + e), d.lineTo(i, g + e), d.endFill())
|
||||
}
|
||||
return d
|
||||
},
|
||||
setupTimingPattern: function() {
|
||||
for (var a = 8; a < this.moduleCount - 8; a++) null == this.modules[a][6] && (this.modules[a][6] = 0 == a % 2);
|
||||
for (var b = 8; b < this.moduleCount - 8; b++) null == this.modules[6][b] && (this.modules[6][b] = 0 == b % 2)
|
||||
},
|
||||
setupPositionAdjustPattern: function() {
|
||||
for (var a = f.getPatternPosition(this.typeNumber), b = 0; b < a.length; b++)
|
||||
for (var c = 0; c < a.length; c++) {
|
||||
var d = a[b],
|
||||
e = a[c];
|
||||
if (null == this.modules[d][e])
|
||||
for (var g = -2; 2 >= g; g++)
|
||||
for (var h = -2; 2 >= h; h++) this.modules[d + g][e + h] = -2 == g || 2 == g || -2 == h || 2 == h || 0 == g && 0 == h ? !0 : !1
|
||||
}
|
||||
},
|
||||
setupTypeNumber: function(a) {
|
||||
for (var b = f.getBCHTypeNumber(this.typeNumber), c = 0; 18 > c; c++) {
|
||||
var d = !a && 1 == (1 & b >> c);
|
||||
this.modules[Math.floor(c / 3)][c % 3 + this.moduleCount - 8 - 3] = d
|
||||
}
|
||||
for (var c = 0; 18 > c; c++) {
|
||||
var d = !a && 1 == (1 & b >> c);
|
||||
this.modules[c % 3 + this.moduleCount - 8 - 3][Math.floor(c / 3)] = d
|
||||
}
|
||||
},
|
||||
setupTypeInfo: function(a, b) {
|
||||
for (var c = this.errorCorrectLevel << 3 | b, d = f.getBCHTypeInfo(c), e = 0; 15 > e; e++) {
|
||||
var g = !a && 1 == (1 & d >> e);
|
||||
6 > e ? this.modules[e][8] = g : 8 > e ? this.modules[e + 1][8] = g : this.modules[this.moduleCount - 15 + e][8] = g
|
||||
}
|
||||
for (var e = 0; 15 > e; e++) {
|
||||
var g = !a && 1 == (1 & d >> e);
|
||||
8 > e ? this.modules[8][this.moduleCount - e - 1] = g : 9 > e ? this.modules[8][15 - e - 1 + 1] = g : this.modules[8][15 - e - 1] = g
|
||||
}
|
||||
this.modules[this.moduleCount - 8][8] = !a
|
||||
},
|
||||
mapData: function(a, b) {
|
||||
for (var c = -1, d = this.moduleCount - 1, e = 7, g = 0, h = this.moduleCount - 1; h > 0; h -= 2)
|
||||
for (6 == h && h--;;) {
|
||||
for (var i = 0; 2 > i; i++)
|
||||
if (null == this.modules[d][h - i]) {
|
||||
var j = !1;
|
||||
g < a.length && (j = 1 == (1 & a[g] >>> e));
|
||||
var k = f.getMask(b, d, h - i);
|
||||
k && (j = !j), this.modules[d][h - i] = j, e--, -1 == e && (g++, e = 7)
|
||||
}
|
||||
if (d += c, 0 > d || this.moduleCount <= d) {
|
||||
d -= c, c = -c;
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}, b.PAD0 = 236, b.PAD1 = 17, b.createData = function(a, c, d) {
|
||||
for (var e = j.getRSBlocks(a, c), g = new k, h = 0; h < d.length; h++) {
|
||||
var i = d[h];
|
||||
g.put(i.mode, 4), g.put(i.getLength(), f.getLengthInBits(i.mode, a)), i.write(g)
|
||||
}
|
||||
for (var l = 0, h = 0; h < e.length; h++) l += e[h].dataCount;
|
||||
if (g.getLengthInBits() > 8 * l) throw new Error("code length overflow. (" + g.getLengthInBits() + ">" + 8 * l + ")");
|
||||
for (g.getLengthInBits() + 4 <= 8 * l && g.put(0, 4); 0 != g.getLengthInBits() % 8;) g.putBit(!1);
|
||||
for (;;) {
|
||||
if (g.getLengthInBits() >= 8 * l) break;
|
||||
if (g.put(b.PAD0, 8), g.getLengthInBits() >= 8 * l) break;
|
||||
g.put(b.PAD1, 8)
|
||||
}
|
||||
return b.createBytes(g, e)
|
||||
}, b.createBytes = function(a, b) {
|
||||
for (var c = 0, d = 0, e = 0, g = new Array(b.length), h = new Array(b.length), j = 0; j < b.length; j++) {
|
||||
var k = b[j].dataCount,
|
||||
l = b[j].totalCount - k;
|
||||
d = Math.max(d, k), e = Math.max(e, l), g[j] = new Array(k);
|
||||
for (var m = 0; m < g[j].length; m++) g[j][m] = 255 & a.buffer[m + c];
|
||||
c += k;
|
||||
var n = f.getErrorCorrectPolynomial(l),
|
||||
o = new i(g[j], n.getLength() - 1),
|
||||
p = o.mod(n);
|
||||
h[j] = new Array(n.getLength() - 1);
|
||||
for (var m = 0; m < h[j].length; m++) {
|
||||
var q = m + p.getLength() - h[j].length;
|
||||
h[j][m] = q >= 0 ? p.get(q) : 0
|
||||
}
|
||||
}
|
||||
for (var r = 0, m = 0; m < b.length; m++) r += b[m].totalCount;
|
||||
for (var s = new Array(r), t = 0, m = 0; d > m; m++)
|
||||
for (var j = 0; j < b.length; j++) m < g[j].length && (s[t++] = g[j][m]);
|
||||
for (var m = 0; e > m; m++)
|
||||
for (var j = 0; j < b.length; j++) m < h[j].length && (s[t++] = h[j][m]);
|
||||
return s
|
||||
};
|
||||
for (var c = {
|
||||
MODE_NUMBER: 1,
|
||||
MODE_ALPHA_NUM: 2,
|
||||
MODE_8BIT_BYTE: 4,
|
||||
MODE_KANJI: 8
|
||||
}, d = {
|
||||
L: 1,
|
||||
M: 0,
|
||||
Q: 3,
|
||||
H: 2
|
||||
}, e = {
|
||||
PATTERN000: 0,
|
||||
PATTERN001: 1,
|
||||
PATTERN010: 2,
|
||||
PATTERN011: 3,
|
||||
PATTERN100: 4,
|
||||
PATTERN101: 5,
|
||||
PATTERN110: 6,
|
||||
PATTERN111: 7
|
||||
}, f = {
|
||||
PATTERN_POSITION_TABLE: [
|
||||
[],
|
||||
[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]
|
||||
],
|
||||
G15: 1335,
|
||||
G18: 7973,
|
||||
G15_MASK: 21522,
|
||||
getBCHTypeInfo: function(a) {
|
||||
for (var b = a << 10; f.getBCHDigit(b) - f.getBCHDigit(f.G15) >= 0;) b ^= f.G15 << f.getBCHDigit(b) - f.getBCHDigit(f.G15);
|
||||
return (a << 10 | b) ^ f.G15_MASK
|
||||
},
|
||||
getBCHTypeNumber: function(a) {
|
||||
for (var b = a << 12; f.getBCHDigit(b) - f.getBCHDigit(f.G18) >= 0;) b ^= f.G18 << f.getBCHDigit(b) - f.getBCHDigit(f.G18);
|
||||
return a << 12 | b
|
||||
},
|
||||
getBCHDigit: function(a) {
|
||||
for (var b = 0; 0 != a;) b++, a >>>= 1;
|
||||
return b
|
||||
},
|
||||
getPatternPosition: function(a) {
|
||||
return f.PATTERN_POSITION_TABLE[a - 1]
|
||||
},
|
||||
getMask: function(a, b, c) {
|
||||
switch (a) {
|
||||
case e.PATTERN000:
|
||||
return 0 == (b + c) % 2;
|
||||
case e.PATTERN001:
|
||||
return 0 == b % 2;
|
||||
case e.PATTERN010:
|
||||
return 0 == c % 3;
|
||||
case e.PATTERN011:
|
||||
return 0 == (b + c) % 3;
|
||||
case e.PATTERN100:
|
||||
return 0 == (Math.floor(b / 2) + Math.floor(c / 3)) % 2;
|
||||
case e.PATTERN101:
|
||||
return 0 == b * c % 2 + b * c % 3;
|
||||
case e.PATTERN110:
|
||||
return 0 == (b * c % 2 + b * c % 3) % 2;
|
||||
case e.PATTERN111:
|
||||
return 0 == (b * c % 3 + (b + c) % 2) % 2;
|
||||
default:
|
||||
throw new Error("bad maskPattern:" + a)
|
||||
}
|
||||
},
|
||||
getErrorCorrectPolynomial: function(a) {
|
||||
for (var b = new i([1], 0), c = 0; a > c; c++) b = b.multiply(new i([1, g.gexp(c)], 0));
|
||||
return b
|
||||
},
|
||||
getLengthInBits: function(a, b) {
|
||||
if (b >= 1 && 10 > b) switch (a) {
|
||||
case c.MODE_NUMBER:
|
||||
return 10;
|
||||
case c.MODE_ALPHA_NUM:
|
||||
return 9;
|
||||
case c.MODE_8BIT_BYTE:
|
||||
return 8;
|
||||
case c.MODE_KANJI:
|
||||
return 8;
|
||||
default:
|
||||
throw new Error("mode:" + a)
|
||||
} else if (27 > b) switch (a) {
|
||||
case c.MODE_NUMBER:
|
||||
return 12;
|
||||
case c.MODE_ALPHA_NUM:
|
||||
return 11;
|
||||
case c.MODE_8BIT_BYTE:
|
||||
return 16;
|
||||
case c.MODE_KANJI:
|
||||
return 10;
|
||||
default:
|
||||
throw new Error("mode:" + a)
|
||||
} else {
|
||||
if (!(41 > b)) throw new Error("type:" + b);
|
||||
switch (a) {
|
||||
case c.MODE_NUMBER:
|
||||
return 14;
|
||||
case c.MODE_ALPHA_NUM:
|
||||
return 13;
|
||||
case c.MODE_8BIT_BYTE:
|
||||
return 16;
|
||||
case c.MODE_KANJI:
|
||||
return 12;
|
||||
default:
|
||||
throw new Error("mode:" + a)
|
||||
}
|
||||
}
|
||||
},
|
||||
getLostPoint: function(a) {
|
||||
for (var b = a.getModuleCount(), c = 0, d = 0; b > d; d++)
|
||||
for (var e = 0; b > e; e++) {
|
||||
for (var f = 0, g = a.isDark(d, e), h = -1; 1 >= h; h++)
|
||||
if (!(0 > d + h || d + h >= b))
|
||||
for (var i = -1; 1 >= i; i++) 0 > e + i || e + i >= b || (0 != h || 0 != i) && g == a.isDark(d + h, e + i) && f++;
|
||||
f > 5 && (c += 3 + f - 5)
|
||||
}
|
||||
for (var d = 0; b - 1 > d; d++)
|
||||
for (var e = 0; b - 1 > e; e++) {
|
||||
var j = 0;
|
||||
a.isDark(d, e) && j++, a.isDark(d + 1, e) && j++, a.isDark(d, e + 1) && j++, a.isDark(d + 1, e + 1) && j++, (0 == j || 4 == j) && (c += 3)
|
||||
}
|
||||
for (var d = 0; b > d; d++)
|
||||
for (var e = 0; b - 6 > e; e++) a.isDark(d, e) && !a.isDark(d, e + 1) && a.isDark(d, e + 2) && a.isDark(d, e + 3) && a.isDark(d, e + 4) && !a.isDark(d, e + 5) && a.isDark(d, e + 6) && (c += 40);
|
||||
for (var e = 0; b > e; e++)
|
||||
for (var d = 0; b - 6 > d; d++) a.isDark(d, e) && !a.isDark(d + 1, e) && a.isDark(d + 2, e) && a.isDark(d + 3, e) && a.isDark(d + 4, e) && !a.isDark(d + 5, e) && a.isDark(d + 6, e) && (c += 40);
|
||||
for (var k = 0, e = 0; b > e; e++)
|
||||
for (var d = 0; b > d; d++) a.isDark(d, e) && k++;
|
||||
var l = Math.abs(100 * k / b / b - 50) / 5;
|
||||
return c += 10 * l
|
||||
}
|
||||
}, g = {
|
||||
glog: function(a) {
|
||||
if (1 > a) throw new Error("glog(" + a + ")");
|
||||
return g.LOG_TABLE[a]
|
||||
},
|
||||
gexp: function(a) {
|
||||
for (; 0 > a;) a += 255;
|
||||
for (; a >= 256;) a -= 255;
|
||||
return g.EXP_TABLE[a]
|
||||
},
|
||||
EXP_TABLE: new Array(256),
|
||||
LOG_TABLE: new Array(256)
|
||||
}, h = 0; 8 > h; h++) g.EXP_TABLE[h] = 1 << h;
|
||||
for (var h = 8; 256 > h; h++) g.EXP_TABLE[h] = g.EXP_TABLE[h - 4] ^ g.EXP_TABLE[h - 5] ^ g.EXP_TABLE[h - 6] ^ g.EXP_TABLE[h - 8];
|
||||
for (var h = 0; 255 > h; h++) g.LOG_TABLE[g.EXP_TABLE[h]] = h;
|
||||
i.prototype = {
|
||||
get: function(a) {
|
||||
return this.num[a]
|
||||
},
|
||||
getLength: function() {
|
||||
return this.num.length
|
||||
},
|
||||
multiply: function(a) {
|
||||
for (var b = new Array(this.getLength() + a.getLength() - 1), c = 0; c < this.getLength(); c++)
|
||||
for (var d = 0; d < a.getLength(); d++) b[c + d] ^= g.gexp(g.glog(this.get(c)) + g.glog(a.get(d)));
|
||||
return new i(b, 0)
|
||||
},
|
||||
mod: function(a) {
|
||||
if (this.getLength() - a.getLength() < 0) return this;
|
||||
for (var b = g.glog(this.get(0)) - g.glog(a.get(0)), c = new Array(this.getLength()), d = 0; d < this.getLength(); d++) c[d] = this.get(d);
|
||||
for (var d = 0; d < a.getLength(); d++) c[d] ^= g.gexp(g.glog(a.get(d)) + b);
|
||||
return new i(c, 0).mod(a)
|
||||
}
|
||||
}, j.RS_BLOCK_TABLE = [
|
||||
[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],
|
||||
[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]
|
||||
], j.getRSBlocks = function(a, b) {
|
||||
var c = j.getRsBlockTable(a, b);
|
||||
if (void 0 == c) throw new Error("bad rs block @ typeNumber:" + a + "/errorCorrectLevel:" + b);
|
||||
for (var d = c.length / 3, e = [], f = 0; d > f; f++)
|
||||
for (var g = c[3 * f + 0], h = c[3 * f + 1], i = c[3 * f + 2], k = 0; g > k; k++) e.push(new j(h, i));
|
||||
return e
|
||||
}, j.getRsBlockTable = function(a, b) {
|
||||
switch (b) {
|
||||
case d.L:
|
||||
return j.RS_BLOCK_TABLE[4 * (a - 1) + 0];
|
||||
case d.M:
|
||||
return j.RS_BLOCK_TABLE[4 * (a - 1) + 1];
|
||||
case d.Q:
|
||||
return j.RS_BLOCK_TABLE[4 * (a - 1) + 2];
|
||||
case d.H:
|
||||
return j.RS_BLOCK_TABLE[4 * (a - 1) + 3];
|
||||
default:
|
||||
return void 0
|
||||
}
|
||||
}, k.prototype = {
|
||||
get: function(a) {
|
||||
var b = Math.floor(a / 8);
|
||||
return 1 == (1 & this.buffer[b] >>> 7 - a % 8)
|
||||
},
|
||||
put: function(a, b) {
|
||||
for (var c = 0; b > c; c++) this.putBit(1 == (1 & a >>> b - c - 1))
|
||||
},
|
||||
getLengthInBits: function() {
|
||||
return this.length
|
||||
},
|
||||
putBit: function(a) {
|
||||
var b = Math.floor(this.length / 8);
|
||||
this.buffer.length <= b && this.buffer.push(0), a && (this.buffer[b] |= 128 >>> this.length % 8), this.length++
|
||||
}
|
||||
};
|
||||
var l = [
|
||||
[17, 14, 11, 7],
|
||||
[32, 26, 20, 14],
|
||||
[53, 42, 32, 24],
|
||||
[78, 62, 46, 34],
|
||||
[106, 84, 60, 44],
|
||||
[134, 106, 74, 58],
|
||||
[154, 122, 86, 64],
|
||||
[192, 152, 108, 84],
|
||||
[230, 180, 130, 98],
|
||||
[271, 213, 151, 119],
|
||||
[321, 251, 177, 137],
|
||||
[367, 287, 203, 155],
|
||||
[425, 331, 241, 177],
|
||||
[458, 362, 258, 194],
|
||||
[520, 412, 292, 220],
|
||||
[586, 450, 322, 250],
|
||||
[644, 504, 364, 280],
|
||||
[718, 560, 394, 310],
|
||||
[792, 624, 442, 338],
|
||||
[858, 666, 482, 382],
|
||||
[929, 711, 509, 403],
|
||||
[1003, 779, 565, 439],
|
||||
[1091, 857, 611, 461],
|
||||
[1171, 911, 661, 511],
|
||||
[1273, 997, 715, 535],
|
||||
[1367, 1059, 751, 593],
|
||||
[1465, 1125, 805, 625],
|
||||
[1528, 1190, 868, 658],
|
||||
[1628, 1264, 908, 698],
|
||||
[1732, 1370, 982, 742],
|
||||
[1840, 1452, 1030, 790],
|
||||
[1952, 1538, 1112, 842],
|
||||
[2068, 1628, 1168, 898],
|
||||
[2188, 1722, 1228, 958],
|
||||
[2303, 1809, 1283, 983],
|
||||
[2431, 1911, 1351, 1051],
|
||||
[2563, 1989, 1423, 1093],
|
||||
[2699, 2099, 1499, 1139],
|
||||
[2809, 2213, 1579, 1219],
|
||||
[2953, 2331, 1663, 1273]
|
||||
],
|
||||
o = function() {
|
||||
var a = function(a, b) {
|
||||
this._el = a, this._htOption = b
|
||||
};
|
||||
return a.prototype.draw = function(a) {
|
||||
function g(a, b) {
|
||||
var c = document.createElementNS("http://www.w3.org/2000/svg", a);
|
||||
for (var d in b) b.hasOwnProperty(d) && c.setAttribute(d, b[d]);
|
||||
return c
|
||||
}
|
||||
var b = this._htOption,
|
||||
c = this._el,
|
||||
d = a.getModuleCount();
|
||||
Math.floor(b.width / d), Math.floor(b.height / d), this.clear();
|
||||
var h = g("svg", {
|
||||
viewBox: "0 0 " + String(d) + " " + String(d),
|
||||
width: "100%",
|
||||
height: "100%",
|
||||
fill: b.colorLight
|
||||
});
|
||||
h.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xlink", "http://www.w3.org/1999/xlink"), c.appendChild(h), h.appendChild(g("rect", {
|
||||
fill: b.colorDark,
|
||||
width: "1",
|
||||
height: "1",
|
||||
id: "template"
|
||||
}));
|
||||
for (var i = 0; d > i; i++)
|
||||
for (var j = 0; d > j; j++)
|
||||
if (a.isDark(i, j)) {
|
||||
var k = g("use", {
|
||||
x: String(i),
|
||||
y: String(j)
|
||||
});
|
||||
k.setAttributeNS("http://www.w3.org/1999/xlink", "href", "#template"), h.appendChild(k)
|
||||
}
|
||||
}, a.prototype.clear = function() {
|
||||
for (; this._el.hasChildNodes();) this._el.removeChild(this._el.lastChild)
|
||||
}, a
|
||||
}(),
|
||||
p = "svg" === document.documentElement.tagName.toLowerCase(),
|
||||
q = p ? o : m() ? function() {
|
||||
function a() {
|
||||
this._elImage.src = this._elCanvas.toDataURL("image/png"), this._elImage.style.display = "block", this._elCanvas.style.display = "none"
|
||||
}
|
||||
|
||||
function d(a, b) {
|
||||
var c = this;
|
||||
if (c._fFail = b, c._fSuccess = a, null === c._bSupportDataURI) {
|
||||
var d = document.createElement("img"),
|
||||
e = function() {
|
||||
c._bSupportDataURI = !1, c._fFail && _fFail.call(c)
|
||||
},
|
||||
f = function() {
|
||||
c._bSupportDataURI = !0, c._fSuccess && c._fSuccess.call(c)
|
||||
};
|
||||
return d.onabort = e, d.onerror = e, d.onload = f, d.src = "data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==", void 0
|
||||
}
|
||||
c._bSupportDataURI === !0 && c._fSuccess ? c._fSuccess.call(c) : c._bSupportDataURI === !1 && c._fFail && c._fFail.call(c)
|
||||
}
|
||||
if (this._android && this._android <= 2.1) {
|
||||
var b = 1 / window.devicePixelRatio,
|
||||
c = CanvasRenderingContext2D.prototype.drawImage;
|
||||
CanvasRenderingContext2D.prototype.drawImage = function(a, d, e, f, g, h, i, j) {
|
||||
if ("nodeName" in a && /img/i.test(a.nodeName))
|
||||
for (var l = arguments.length - 1; l >= 1; l--) arguments[l] = arguments[l] * b;
|
||||
else "undefined" == typeof j && (arguments[1] *= b, arguments[2] *= b, arguments[3] *= b, arguments[4] *= b);
|
||||
c.apply(this, arguments)
|
||||
}
|
||||
}
|
||||
var e = function(a, b) {
|
||||
this._bIsPainted = !1, this._android = n(), this._htOption = b, this._elCanvas = document.createElement("canvas"), this._elCanvas.width = b.width, this._elCanvas.height = b.height, a.appendChild(this._elCanvas), this._el = a, this._oContext = this._elCanvas.getContext("2d"), this._bIsPainted = !1, this._elImage = document.createElement("img"), this._elImage.style.display = "none", this._el.appendChild(this._elImage), this._bSupportDataURI = null
|
||||
};
|
||||
return e.prototype.draw = function(a) {
|
||||
var b = this._elImage,
|
||||
c = this._oContext,
|
||||
d = this._htOption,
|
||||
e = a.getModuleCount(),
|
||||
f = d.width / e,
|
||||
g = d.height / e,
|
||||
h = Math.round(f),
|
||||
i = Math.round(g);
|
||||
b.style.display = "none", this.clear();
|
||||
for (var j = 0; e > j; j++)
|
||||
for (var k = 0; e > k; k++) {
|
||||
var l = a.isDark(j, k),
|
||||
m = k * f,
|
||||
n = j * g;
|
||||
c.strokeStyle = l ? d.colorDark : d.colorLight, c.lineWidth = 1, c.fillStyle = l ? d.colorDark : d.colorLight, c.fillRect(m, n, f, g), c.strokeRect(Math.floor(m) + .5, Math.floor(n) + .5, h, i), c.strokeRect(Math.ceil(m) - .5, Math.ceil(n) - .5, h, i)
|
||||
}
|
||||
this._bIsPainted = !0
|
||||
}, e.prototype.makeImage = function() {
|
||||
this._bIsPainted && d.call(this, a)
|
||||
}, e.prototype.isPainted = function() {
|
||||
return this._bIsPainted
|
||||
}, e.prototype.clear = function() {
|
||||
this._oContext.clearRect(0, 0, this._elCanvas.width, this._elCanvas.height), this._bIsPainted = !1
|
||||
}, e.prototype.round = function(a) {
|
||||
return a ? Math.floor(1e3 * a) / 1e3 : a
|
||||
}, e
|
||||
}() : function() {
|
||||
var a = function(a, b) {
|
||||
this._el = a, this._htOption = b
|
||||
};
|
||||
return a.prototype.draw = function(a) {
|
||||
for (var b = this._htOption, c = this._el, d = a.getModuleCount(), e = Math.floor(b.width / d), f = Math.floor(b.height / d), g = ['<table style="border:0;border-collapse:collapse;">'], h = 0; d > h; h++) {
|
||||
g.push("<tr>");
|
||||
for (var i = 0; d > i; i++) g.push('<td style="border:0;border-collapse:collapse;padding:0;margin:0;width:' + e + "px;height:" + f + "px;background-color:" + (a.isDark(h, i) ? b.colorDark : b.colorLight) + ';"></td>');
|
||||
g.push("</tr>")
|
||||
}
|
||||
g.push("</table>"), c.innerHTML = g.join("");
|
||||
var j = c.childNodes[0],
|
||||
k = (b.width - j.offsetWidth) / 2,
|
||||
l = (b.height - j.offsetHeight) / 2;
|
||||
k > 0 && l > 0 && (j.style.margin = l + "px " + k + "px")
|
||||
}, a.prototype.clear = function() {
|
||||
this._el.innerHTML = ""
|
||||
}, a
|
||||
}();
|
||||
QRCode = function(a, b) {
|
||||
if (this._htOption = {
|
||||
width: 256,
|
||||
height: 256,
|
||||
typeNumber: 4,
|
||||
colorDark: "#000000",
|
||||
colorLight: "#ffffff",
|
||||
correctLevel: d.H
|
||||
}, "string" == typeof b && (b = {
|
||||
text: b
|
||||
}), b)
|
||||
for (var c in b) this._htOption[c] = b[c];
|
||||
"string" == typeof a && (a = document.getElementById(a)), this._android = n(), this._el = a, this._oQRCode = null, this._oDrawing = new q(this._el, this._htOption), this._htOption.text && this.makeCode(this._htOption.text)
|
||||
}, QRCode.prototype.makeCode = function(a) {
|
||||
this._oQRCode = new b(r(a, this._htOption.correctLevel), this._htOption.correctLevel), this._oQRCode.addData(a), this._oQRCode.make(), this._el.title = a, this._oDrawing.draw(this._oQRCode), this.makeImage()
|
||||
}, QRCode.prototype.makeImage = function() {
|
||||
"function" == typeof this._oDrawing.makeImage && (!this._android || this._android >= 3) && this._oDrawing.makeImage()
|
||||
}, QRCode.prototype.clear = function() {
|
||||
this._oDrawing.clear()
|
||||
}, QRCode.CorrectLevel = d
|
||||
}();
|
||||
Reference in New Issue
Block a user