You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
174 lines
3.9 KiB
174 lines
3.9 KiB
/* Any copyright is dedicated to the Public Domain. |
|
* http://creativecommons.org/publicdomain/zero/1.0/ */ |
|
|
|
function xmlEncode(s){ |
|
var i = 0, ch; |
|
s = String(s); |
|
while (i < s.length && (ch = s[i]) !== '&' && ch !== '<' && |
|
ch !== '\"' && ch !== '\n' && ch !== '\r' && ch !== '\t') { |
|
i++; |
|
} |
|
if (i >= s.length) { |
|
return s; |
|
} |
|
var buf = s.substring(0, i); |
|
while (i < s.length) { |
|
ch = s[i++]; |
|
switch (ch) { |
|
case '&': |
|
buf += '&'; |
|
break; |
|
case '<': |
|
buf += '<'; |
|
break; |
|
case '\"': |
|
buf += '"'; |
|
break; |
|
case '\n': |
|
buf += '
'; |
|
break; |
|
case '\r': |
|
buf += '
'; |
|
break; |
|
case '\t': |
|
buf += '	'; |
|
break; |
|
default: |
|
buf += ch; |
|
break; |
|
} |
|
} |
|
return buf; |
|
} |
|
|
|
global.btoa = function btoa(chars) { |
|
var digits = |
|
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; |
|
var buffer = ''; |
|
var i, n; |
|
for (i = 0, n = chars.length; i < n; i += 3) { |
|
var b1 = chars.charCodeAt(i) & 0xFF; |
|
var b2 = chars.charCodeAt(i + 1) & 0xFF; |
|
var b3 = chars.charCodeAt(i + 2) & 0xFF; |
|
var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4); |
|
var d3 = i + 1 < n ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64; |
|
var d4 = i + 2 < n ? (b3 & 0x3F) : 64; |
|
buffer += (digits.charAt(d1) + digits.charAt(d2) + |
|
digits.charAt(d3) + digits.charAt(d4)); |
|
} |
|
return buffer; |
|
}; |
|
|
|
function DOMElement(name) { |
|
this.nodeName = name; |
|
this.childNodes = []; |
|
this.attributes = {}; |
|
this.textContent = ''; |
|
|
|
if (name === 'style') { |
|
this.sheet = { |
|
cssRules: [], |
|
insertRule: function (rule) { |
|
this.cssRules.push(rule); |
|
}, |
|
}; |
|
} |
|
} |
|
|
|
DOMElement.prototype = { |
|
|
|
getAttributeNS: function DOMElement_getAttributeNS(NS, name) { |
|
return name in this.attributes ? this.attributes[name] : null; |
|
}, |
|
|
|
setAttributeNS: function DOMElement_setAttributeNS(NS, name, value) { |
|
value = value || ''; |
|
value = xmlEncode(value); |
|
this.attributes[name] = value; |
|
}, |
|
|
|
appendChild: function DOMElement_appendChild(element) { |
|
var childNodes = this.childNodes; |
|
if (childNodes.indexOf(element) === -1) { |
|
childNodes.push(element); |
|
} |
|
}, |
|
|
|
toString: function DOMElement_toString() { |
|
var buf = []; |
|
buf.push('<' + this.nodeName); |
|
if (this.nodeName === 'svg:svg') { |
|
buf.push(' xmlns:xlink="http://www.w3.org/1999/xlink"' + |
|
' xmlns:svg="http://www.w3.org/2000/svg"'); |
|
} |
|
for (var i in this.attributes) { |
|
buf.push(' ' + i + '="' + xmlEncode(this.attributes[i]) + '"'); |
|
} |
|
|
|
buf.push('>'); |
|
|
|
if (this.nodeName === 'svg:tspan' || this.nodeName === 'svg:style') { |
|
buf.push(xmlEncode(this.textContent)); |
|
} else { |
|
this.childNodes.forEach(function(childNode) { |
|
buf.push(childNode.toString()); |
|
}); |
|
} |
|
buf.push('</' + this.nodeName + '>'); |
|
return buf.join(''); |
|
}, |
|
|
|
cloneNode: function DOMElement_cloneNode() { |
|
var newNode = new DOMElement(this.nodeName); |
|
newNode.childNodes = this.childNodes; |
|
newNode.attributes = this.attributes; |
|
newNode.textContent = this.textContent; |
|
return newNode; |
|
}, |
|
} |
|
|
|
global.document = { |
|
childNodes : [], |
|
|
|
get currentScript() { |
|
return { src: '' }; |
|
}, |
|
|
|
get documentElement() { |
|
return this; |
|
}, |
|
|
|
createElementNS: function (NS, element) { |
|
var elObject = new DOMElement(element); |
|
return elObject; |
|
}, |
|
|
|
createElement: function (element) { |
|
return this.createElementNS('', element); |
|
}, |
|
|
|
getElementsByTagName: function (element) { |
|
if (element === 'head') { |
|
return [this.head || (this.head = new DOMElement('head'))]; |
|
} |
|
return []; |
|
} |
|
}; |
|
|
|
function Image () { |
|
this._src = null; |
|
this.onload = null; |
|
} |
|
Image.prototype = { |
|
get src () { |
|
return this._src; |
|
}, |
|
set src (value) { |
|
this._src = value; |
|
if (this.onload) { |
|
this.onload(); |
|
} |
|
} |
|
} |
|
|
|
global.Image = Image;
|
|
|