diff --git a/changelog.md b/changelog.md
index 4854aff95..3d28a718b 100644
--- a/changelog.md
+++ b/changelog.md
@@ -9,7 +9,8 @@
- Made links useable in footer (thanks u/Dustfinger1 re:249)
- Added print media queries to remove box shadow on print (thanks u/dmmagic re: 246)
- Fixed realtime renderer not functioning if loaded with malformed html on load (thanks u/RattiganIV re:247)
-
+- Removed a lot of unused files in shared
+- vitreum v4 now lets me use codemirror as a pure node dependacy
### Saturday, 03/12/2016 - v2.6.0
diff --git a/package.json b/package.json
index 94a3de7b2..017d7a047 100644
--- a/package.json
+++ b/package.json
@@ -32,6 +32,6 @@
"shortid": "^2.2.4",
"striptags": "^2.1.1",
"superagent": "^1.6.1",
- "vitreum": "^4.0.5"
+ "vitreum": "^4.0.7"
}
}
diff --git a/shared/naturalcrit/combat/combat.actions.js b/shared/naturalcrit/combat/combat.actions.js
deleted file mode 100644
index cecb836ef..000000000
--- a/shared/naturalcrit/combat/combat.actions.js
+++ /dev/null
@@ -1,23 +0,0 @@
-var dispatch = require('pico-flux').dispatch;
-
-module.exports = {
- updateMonsterManual : function(json){
- dispatch('UDPATE_MONSTER_MANUAL', json);
- },
- addEncounter : function(){
- dispatch('ADD_ENCOUNTER');
- },
- updateEncounter : function(index, json){
- dispatch('UPDATE_ENCOUNTER', index, json);
- },
- removeEncounter : function(index){
- dispatch('REMOVE_ENCOUNTER', index);
- },
- updatePlayers : function(text){
- dispatch('UPDATE_PLAYERS', text);
- },
- selectEncounter : function(index){
- dispatch('SELECT_ENCOUNTER', index);
- },
-
-}
\ No newline at end of file
diff --git a/shared/naturalcrit/combat/combat.store.js b/shared/naturalcrit/combat/combat.store.js
deleted file mode 100644
index d6a07bafb..000000000
--- a/shared/naturalcrit/combat/combat.store.js
+++ /dev/null
@@ -1,69 +0,0 @@
-var flux = require('pico-flux');
-var _ = require('lodash');
-
-var defaultMonsterManual = require('naturalcrit/defaultMonsterManual.js');
-var GetRandomEncounter = require('naturalcrit/randomEncounter.js');
-
-var Store = {
- selectedEncounterIndex : 0,
- encounters : JSON.parse(localStorage.getItem('encounters')) || [GetRandomEncounter()],
- monsterManual : JSON.parse(localStorage.getItem('monsterManual')) || defaultMonsterManual,
- players : localStorage.getItem('players') || 'jasper 13\nzatch 19',
-};
-
-
-module.exports = flux.createStore({
- UDPATE_MONSTER_MANUAL : function(json){
- Store.monsterManual = json;
- return true;
- },
- ADD_ENCOUNTER : function(){
- Store.encounters.push(GetRandomEncounter());
- return true;
- },
- UPDATE_ENCOUNTER : function(index, json){
- Store.encounters[index] = json;
- return true;
- },
- REMOVE_ENCOUNTER : function(index){
- Store.encounters.splice(index, 1);
- return true;
- },
- UPDATE_PLAYERS : function(text){
- Store.players = text;
- return true;
- },
- SELECT_ENCOUNTER : function(index){
- Store.selectedEncounterIndex = index;
- return true;
- },
-
-},{
- getMonsterManual : function(){
- return Store.monsterManual;
- },
- getSelectedEncounterIndex : function(){
- return Store.selectedEncounterIndex;
- },
- getSelectedEncounter : function(){
- return Store.encounters[Store.selectedEncounterIndex];
- },
- getEncounter : function(index){
- return Store.encounters[index];
- },
- getEncounters : function(index){
- return Store.encounters;
- },
- getPlayersText : function(){
- return Store.players;
- },
- getPlayers : function(){
- return _.reduce(Store.players.split('\n'), function(r, line){
- var idx = line.lastIndexOf(' ');
- if(idx !== -1){
- r[line.substring(0, idx)] = line.substring(idx)*1;
- }
- return r;
- }, {})
- },
-})
\ No newline at end of file
diff --git a/shared/naturalcrit/combat/defaultMonsterManual.js b/shared/naturalcrit/combat/defaultMonsterManual.js
deleted file mode 100644
index 9e9ea7e1a..000000000
--- a/shared/naturalcrit/combat/defaultMonsterManual.js
+++ /dev/null
@@ -1,140 +0,0 @@
-module.exports = {
- goblin : {
- size : 'small',
- type : 'beast',
- alignment : 'unaligned',
- stats : {
- hp : 40,
- mov: 30,
- ac : 13,
- },
- scores : {
- str : 8,
- con : 8,
- dex : 8,
- int : 8,
- wis : 8,
- cha : 8
- },
- attr : {
- skills : ['Stealth +5'],
- lang : ['common'],
- cr : 0.25,
- },
- abilities : {
- "pack tactics" : "Does a thing",
- "fancy dance" : "dances fancy"
- },
- actions : {
- bite : {
- type : "Melee weapon attack",
- atk : "+4 to hit",
- rng : "5ft",
- target : "one target",
- dmg : "4 (1d4 + 2) piercing damage",
- desc: ""
- },
- scare : {
- uses : "1/day",
- desc : "scares you"
- }
- },
- items : ['rat on a stick']
- },
-
- "Goat Slime" : {
- hp : 80,
- mov: 10,
- cr : 0.5,
- ac : 16,
- attr : {
- str : 8,
- con : 8,
- dex : 6,
- int : 4,
- wis : 8,
- cha : 8
- },
- attacks : {
- caress : {
- atk : "1d20+1",
- dmg : "3d4+1",
- type : "sensual"
- },
- },
- abilities : {
- "Agnostic Gel" : "Immune to magical damage"
- },
- items : []
- },
- "badass psycho" : {
- hp : 100,
- mov: 50,
- ac : 14,
- cr : 5,
- attr : {
- str : 17,
- con : 18,
- dex : 16,
- int : 7,
- wis : 7,
- cha : 7
- },
- attacks : {
- "throwing axe" : {
- atk : "1d20+5",
- dmg : "1d12+5",
- type : "piercing",
- rng : "30",
- notes : "returns to baddie after throw"
- },
- shoot : {
- atk : "1d20+2",
- dmg : "4d4",
- rng : "120"
- }
- },
- spells : {
- "meat popsicle" : {
- dmg : "4d6",
- uses : 8
- },
- "sanity check" : {
- dmg : "2d8+4",
- uses : 6
- }
- },
- abilities : {
- "rampage" : "when damaged, can choose to take damage from opportunity attacks for allies"
- },
- items : ['buzz_axe', 'healing_potion', 'tuna_fish']
- },
- toxicologist : {
- hp : 40,
- mov: 30,
- ac : 11,
- cr : 0.5,
- attr : {
- str : 7,
- con : 11,
- dex : 10,
- int : 18,
- wis : 15,
- cha : 7
- },
- spells : {
- "publish paper" : {
- dmg : "4d6",
- uses : 4
- },
- "tox test" : {
- heal : "2d8+4",
- uses : 6
- }
- },
- abilities : {
- "conference" : "when around more than 30 other toxicologists, consume 1 drink every 15 minutes"
- },
- items : ['grad_student', 'imposter_syndrome', 'ring']
- },
-}
\ No newline at end of file
diff --git a/shared/naturalcrit/combat/homebrewIcon.svg.jsx b/shared/naturalcrit/combat/homebrewIcon.svg.jsx
deleted file mode 100644
index f9b936a3f..000000000
--- a/shared/naturalcrit/combat/homebrewIcon.svg.jsx
+++ /dev/null
@@ -1,13 +0,0 @@
-var React = require('react');
-
-var Logo = React.createClass({
- render : function(){
- return
- }
-});
-
-module.exports = Logo;
diff --git a/shared/naturalcrit/combat/html2canvas.js b/shared/naturalcrit/combat/html2canvas.js
deleted file mode 100644
index c4ea07dcc..000000000
--- a/shared/naturalcrit/combat/html2canvas.js
+++ /dev/null
@@ -1,3375 +0,0 @@
-/*
- html2canvas 0.5.0-alpha1
- Copyright (c) 2015 Niklas von Hertzen
-
- Released under MIT License
-*/
-
-(function(window, document, exports, global, define, undefined){
-
-/*!
- * @overview es6-promise - a tiny implementation of Promises/A+.
- * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)
- * @license Licensed under MIT license
- * See https://raw.githubusercontent.com/jakearchibald/es6-promise/master/LICENSE
- * @version 2.0.1
- */
-
-(function(){function r(a,b){n[l]=a;n[l+1]=b;l+=2;2===l&&A()}function s(a){return"function"===typeof a}function F(){return function(){process.nextTick(t)}}function G(){var a=0,b=new B(t),c=document.createTextNode("");b.observe(c,{characterData:!0});return function(){c.data=a=++a%2}}function H(){var a=new MessageChannel;a.port1.onmessage=t;return function(){a.port2.postMessage(0)}}function I(){return function(){setTimeout(t,1)}}function t(){for(var a=0;a= 0x80 (not a basic code point)',
- 'invalid-input': 'Invalid input'
- },
-
- /** Convenience shortcuts */
- baseMinusTMin = base - tMin,
- floor = Math.floor,
- stringFromCharCode = String.fromCharCode,
-
- /** Temporary variable */
- key;
-
- /*--------------------------------------------------------------------------*/
-
- /**
- * A generic error utility function.
- * @private
- * @param {String} type The error type.
- * @returns {Error} Throws a `RangeError` with the applicable error message.
- */
- function error(type) {
- throw RangeError(errors[type]);
- }
-
- /**
- * A generic `Array#map` utility function.
- * @private
- * @param {Array} array The array to iterate over.
- * @param {Function} callback The function that gets called for every array
- * item.
- * @returns {Array} A new array of values returned by the callback function.
- */
- function map(array, fn) {
- var length = array.length;
- var result = [];
- while (length--) {
- result[length] = fn(array[length]);
- }
- return result;
- }
-
- /**
- * A simple `Array#map`-like wrapper to work with domain name strings or email
- * addresses.
- * @private
- * @param {String} domain The domain name or email address.
- * @param {Function} callback The function that gets called for every
- * character.
- * @returns {Array} A new string of characters returned by the callback
- * function.
- */
- function mapDomain(string, fn) {
- var parts = string.split('@');
- var result = '';
- if (parts.length > 1) {
- // In email addresses, only the domain name should be punycoded. Leave
- // the local part (i.e. everything up to `@`) intact.
- result = parts[0] + '@';
- string = parts[1];
- }
- var labels = string.split(regexSeparators);
- var encoded = map(labels, fn).join('.');
- return result + encoded;
- }
-
- /**
- * Creates an array containing the numeric code points of each Unicode
- * character in the string. While JavaScript uses UCS-2 internally,
- * this function will convert a pair of surrogate halves (each of which
- * UCS-2 exposes as separate characters) into a single code point,
- * matching UTF-16.
- * @see `punycode.ucs2.encode`
- * @see
- * @memberOf punycode.ucs2
- * @name decode
- * @param {String} string The Unicode input string (UCS-2).
- * @returns {Array} The new array of code points.
- */
- function ucs2decode(string) {
- var output = [],
- counter = 0,
- length = string.length,
- value,
- extra;
- while (counter < length) {
- value = string.charCodeAt(counter++);
- if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
- // high surrogate, and there is a next character
- extra = string.charCodeAt(counter++);
- if ((extra & 0xFC00) == 0xDC00) { // low surrogate
- output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
- } else {
- // unmatched surrogate; only append this code unit, in case the next
- // code unit is the high surrogate of a surrogate pair
- output.push(value);
- counter--;
- }
- } else {
- output.push(value);
- }
- }
- return output;
- }
-
- /**
- * Creates a string based on an array of numeric code points.
- * @see `punycode.ucs2.decode`
- * @memberOf punycode.ucs2
- * @name encode
- * @param {Array} codePoints The array of numeric code points.
- * @returns {String} The new Unicode string (UCS-2).
- */
- function ucs2encode(array) {
- return map(array, function(value) {
- var output = '';
- if (value > 0xFFFF) {
- value -= 0x10000;
- output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);
- value = 0xDC00 | value & 0x3FF;
- }
- output += stringFromCharCode(value);
- return output;
- }).join('');
- }
-
- /**
- * Converts a basic code point into a digit/integer.
- * @see `digitToBasic()`
- * @private
- * @param {Number} codePoint The basic numeric code point value.
- * @returns {Number} The numeric value of a basic code point (for use in
- * representing integers) in the range `0` to `base - 1`, or `base` if
- * the code point does not represent a value.
- */
- function basicToDigit(codePoint) {
- if (codePoint - 48 < 10) {
- return codePoint - 22;
- }
- if (codePoint - 65 < 26) {
- return codePoint - 65;
- }
- if (codePoint - 97 < 26) {
- return codePoint - 97;
- }
- return base;
- }
-
- /**
- * Converts a digit/integer into a basic code point.
- * @see `basicToDigit()`
- * @private
- * @param {Number} digit The numeric value of a basic code point.
- * @returns {Number} The basic code point whose value (when used for
- * representing integers) is `digit`, which needs to be in the range
- * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
- * used; else, the lowercase form is used. The behavior is undefined
- * if `flag` is non-zero and `digit` has no uppercase form.
- */
- function digitToBasic(digit, flag) {
- // 0..25 map to ASCII a..z or A..Z
- // 26..35 map to ASCII 0..9
- return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
- }
-
- /**
- * Bias adaptation function as per section 3.4 of RFC 3492.
- * http://tools.ietf.org/html/rfc3492#section-3.4
- * @private
- */
- function adapt(delta, numPoints, firstTime) {
- var k = 0;
- delta = firstTime ? floor(delta / damp) : delta >> 1;
- delta += floor(delta / numPoints);
- for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {
- delta = floor(delta / baseMinusTMin);
- }
- return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
- }
-
- /**
- * Converts a Punycode string of ASCII-only symbols to a string of Unicode
- * symbols.
- * @memberOf punycode
- * @param {String} input The Punycode string of ASCII-only symbols.
- * @returns {String} The resulting string of Unicode symbols.
- */
- function decode(input) {
- // Don't use UCS-2
- var output = [],
- inputLength = input.length,
- out,
- i = 0,
- n = initialN,
- bias = initialBias,
- basic,
- j,
- index,
- oldi,
- w,
- k,
- digit,
- t,
- /** Cached calculation results */
- baseMinusT;
-
- // Handle the basic code points: let `basic` be the number of input code
- // points before the last delimiter, or `0` if there is none, then copy
- // the first basic code points to the output.
-
- basic = input.lastIndexOf(delimiter);
- if (basic < 0) {
- basic = 0;
- }
-
- for (j = 0; j < basic; ++j) {
- // if it's not a basic code point
- if (input.charCodeAt(j) >= 0x80) {
- error('not-basic');
- }
- output.push(input.charCodeAt(j));
- }
-
- // Main decoding loop: start just after the last delimiter if any basic code
- // points were copied; start at the beginning otherwise.
-
- for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {
-
- // `index` is the index of the next character to be consumed.
- // Decode a generalized variable-length integer into `delta`,
- // which gets added to `i`. The overflow checking is easier
- // if we increase `i` as we go, then subtract off its starting
- // value at the end to obtain `delta`.
- for (oldi = i, w = 1, k = base; /* no condition */; k += base) {
-
- if (index >= inputLength) {
- error('invalid-input');
- }
-
- digit = basicToDigit(input.charCodeAt(index++));
-
- if (digit >= base || digit > floor((maxInt - i) / w)) {
- error('overflow');
- }
-
- i += digit * w;
- t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
-
- if (digit < t) {
- break;
- }
-
- baseMinusT = base - t;
- if (w > floor(maxInt / baseMinusT)) {
- error('overflow');
- }
-
- w *= baseMinusT;
-
- }
-
- out = output.length + 1;
- bias = adapt(i - oldi, out, oldi == 0);
-
- // `i` was supposed to wrap around from `out` to `0`,
- // incrementing `n` each time, so we'll fix that now:
- if (floor(i / out) > maxInt - n) {
- error('overflow');
- }
-
- n += floor(i / out);
- i %= out;
-
- // Insert `n` at position `i` of the output
- output.splice(i++, 0, n);
-
- }
-
- return ucs2encode(output);
- }
-
- /**
- * Converts a string of Unicode symbols (e.g. a domain name label) to a
- * Punycode string of ASCII-only symbols.
- * @memberOf punycode
- * @param {String} input The string of Unicode symbols.
- * @returns {String} The resulting Punycode string of ASCII-only symbols.
- */
- function encode(input) {
- var n,
- delta,
- handledCPCount,
- basicLength,
- bias,
- j,
- m,
- q,
- k,
- t,
- currentValue,
- output = [],
- /** `inputLength` will hold the number of code points in `input`. */
- inputLength,
- /** Cached calculation results */
- handledCPCountPlusOne,
- baseMinusT,
- qMinusT;
-
- // Convert the input in UCS-2 to Unicode
- input = ucs2decode(input);
-
- // Cache the length
- inputLength = input.length;
-
- // Initialize the state
- n = initialN;
- delta = 0;
- bias = initialBias;
-
- // Handle the basic code points
- for (j = 0; j < inputLength; ++j) {
- currentValue = input[j];
- if (currentValue < 0x80) {
- output.push(stringFromCharCode(currentValue));
- }
- }
-
- handledCPCount = basicLength = output.length;
-
- // `handledCPCount` is the number of code points that have been handled;
- // `basicLength` is the number of basic code points.
-
- // Finish the basic string - if it is not empty - with a delimiter
- if (basicLength) {
- output.push(delimiter);
- }
-
- // Main encoding loop:
- while (handledCPCount < inputLength) {
-
- // All non-basic code points < n have been handled already. Find the next
- // larger one:
- for (m = maxInt, j = 0; j < inputLength; ++j) {
- currentValue = input[j];
- if (currentValue >= n && currentValue < m) {
- m = currentValue;
- }
- }
-
- // Increase `delta` enough to advance the decoder's state to ,
- // but guard against overflow
- handledCPCountPlusOne = handledCPCount + 1;
- if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
- error('overflow');
- }
-
- delta += (m - n) * handledCPCountPlusOne;
- n = m;
-
- for (j = 0; j < inputLength; ++j) {
- currentValue = input[j];
-
- if (currentValue < n && ++delta > maxInt) {
- error('overflow');
- }
-
- if (currentValue == n) {
- // Represent delta as a generalized variable-length integer
- for (q = delta, k = base; /* no condition */; k += base) {
- t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
- if (q < t) {
- break;
- }
- qMinusT = q - t;
- baseMinusT = base - t;
- output.push(
- stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))
- );
- q = floor(qMinusT / baseMinusT);
- }
-
- output.push(stringFromCharCode(digitToBasic(q, 0)));
- bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
- delta = 0;
- ++handledCPCount;
- }
- }
-
- ++delta;
- ++n;
-
- }
- return output.join('');
- }
-
- /**
- * Converts a Punycode string representing a domain name or an email address
- * to Unicode. Only the Punycoded parts of the input will be converted, i.e.
- * it doesn't matter if you call it on a string that has already been
- * converted to Unicode.
- * @memberOf punycode
- * @param {String} input The Punycoded domain name or email address to
- * convert to Unicode.
- * @returns {String} The Unicode representation of the given Punycode
- * string.
- */
- function toUnicode(input) {
- return mapDomain(input, function(string) {
- return regexPunycode.test(string)
- ? decode(string.slice(4).toLowerCase())
- : string;
- });
- }
-
- /**
- * Converts a Unicode string representing a domain name or an email address to
- * Punycode. Only the non-ASCII parts of the domain name will be converted,
- * i.e. it doesn't matter if you call it with a domain that's already in
- * ASCII.
- * @memberOf punycode
- * @param {String} input The domain name or email address to convert, as a
- * Unicode string.
- * @returns {String} The Punycode representation of the given domain name or
- * email address.
- */
- function toASCII(input) {
- return mapDomain(input, function(string) {
- return regexNonASCII.test(string)
- ? 'xn--' + encode(string)
- : string;
- });
- }
-
- /*--------------------------------------------------------------------------*/
-
- /** Define the public API */
- punycode = {
- /**
- * A string representing the current Punycode.js version number.
- * @memberOf punycode
- * @type String
- */
- 'version': '1.3.1',
- /**
- * An object of methods to convert from JavaScript's internal character
- * representation (UCS-2) to Unicode code points, and back.
- * @see
- * @memberOf punycode
- * @type Object
- */
- 'ucs2': {
- 'decode': ucs2decode,
- 'encode': ucs2encode
- },
- 'decode': decode,
- 'encode': encode,
- 'toASCII': toASCII,
- 'toUnicode': toUnicode
- };
-
- /** Expose `punycode` */
- // Some AMD build optimizers, like r.js, check for specific condition patterns
- // like the following:
- if (
- typeof define == 'function' &&
- typeof define.amd == 'object' &&
- define.amd
- ) {
- define('punycode', function() {
- return punycode;
- });
- } else if (freeExports && freeModule) {
- if (module.exports == freeExports) { // in Node.js or RingoJS v0.8.0+
- freeModule.exports = punycode;
- } else { // in Narwhal or RingoJS v0.7.0-
- for (key in punycode) {
- punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);
- }
- }
- } else { // in Rhino or a web browser
- root.punycode = punycode;
- }
-
-}(this));
-
-var html2canvasNodeAttribute = "data-html2canvas-node";
-var html2canvasCanvasCloneAttribute = "data-html2canvas-canvas-clone";
-var html2canvasCanvasCloneIndex = 0;
-var html2canvasCloneIndex = 0;
-
-window.html2canvas = function(nodeList, options) {
- var index = html2canvasCloneIndex++;
- options = options || {};
- if (options.logging) {
- window.html2canvas.logging = true;
- window.html2canvas.start = Date.now();
- }
-
- options.async = typeof(options.async) === "undefined" ? true : options.async;
- options.allowTaint = typeof(options.allowTaint) === "undefined" ? false : options.allowTaint;
- options.removeContainer = typeof(options.removeContainer) === "undefined" ? true : options.removeContainer;
- options.javascriptEnabled = typeof(options.javascriptEnabled) === "undefined" ? false : options.javascriptEnabled;
- options.imageTimeout = typeof(options.imageTimeout) === "undefined" ? 10000 : options.imageTimeout;
- options.renderer = typeof(options.renderer) === "function" ? options.renderer : CanvasRenderer;
- options.strict = !!options.strict;
-
- if (typeof(nodeList) === "string") {
- if (typeof(options.proxy) !== "string") {
- return Promise.reject("Proxy must be used when rendering url");
- }
- var width = options.width != null ? options.width : window.innerWidth;
- var height = options.height != null ? options.height : window.innerHeight;
- return loadUrlDocument(absoluteUrl(nodeList), options.proxy, document, width, height, options).then(function(container) {
- return renderWindow(container.contentWindow.document.documentElement, container, options, width, height);
- });
- }
-
- var node = ((nodeList === undefined) ? [document.documentElement] : ((nodeList.length) ? nodeList : [nodeList]))[0];
- node.setAttribute(html2canvasNodeAttribute + index, index);
- return renderDocument(node.ownerDocument, options, node.ownerDocument.defaultView.innerWidth, node.ownerDocument.defaultView.innerHeight, index).then(function(canvas) {
- if (typeof(options.onrendered) === "function") {
- log("options.onrendered is deprecated, html2canvas returns a Promise containing the canvas");
- options.onrendered(canvas);
- }
- return canvas;
- });
-};
-
-window.html2canvas.punycode = this.punycode;
-window.html2canvas.proxy = {};
-
-function renderDocument(document, options, windowWidth, windowHeight, html2canvasIndex) {
- return createWindowClone(document, document, windowWidth, windowHeight, options, document.defaultView.pageXOffset, document.defaultView.pageYOffset).then(function(container) {
- log("Document cloned");
- var attributeName = html2canvasNodeAttribute + html2canvasIndex;
- var selector = "[" + attributeName + "='" + html2canvasIndex + "']";
- document.querySelector(selector).removeAttribute(attributeName);
- var clonedWindow = container.contentWindow;
- var node = clonedWindow.document.querySelector(selector);
- var oncloneHandler = (typeof(options.onclone) === "function") ? Promise.resolve(options.onclone(clonedWindow.document)) : Promise.resolve(true);
- return oncloneHandler.then(function() {
- return renderWindow(node, container, options, windowWidth, windowHeight);
- });
- });
-}
-
-function renderWindow(node, container, options, windowWidth, windowHeight) {
- var clonedWindow = container.contentWindow;
- var support = new Support(clonedWindow.document);
- var imageLoader = new ImageLoader(options, support);
- var bounds = getBounds(node);
- var width = options.type === "view" ? windowWidth : documentWidth(clonedWindow.document);
- var height = options.type === "view" ? windowHeight : documentHeight(clonedWindow.document);
- var renderer = new options.renderer(width, height, imageLoader, options, document);
- var parser = new NodeParser(node, renderer, support, imageLoader, options);
- return parser.ready.then(function() {
- log("Finished rendering");
- var canvas;
-
- if (options.type === "view") {
- canvas = crop(renderer.canvas, {width: renderer.canvas.width, height: renderer.canvas.height, top: 0, left: 0, x: 0, y: 0});
- } else if (node === clonedWindow.document.body || node === clonedWindow.document.documentElement || options.canvas != null) {
- canvas = renderer.canvas;
- } else {
- canvas = crop(renderer.canvas, {width: options.width != null ? options.width : bounds.width, height: options.height != null ? options.height : bounds.height, top: bounds.top, left: bounds.left, x: clonedWindow.pageXOffset, y: clonedWindow.pageYOffset});
- }
-
- cleanupContainer(container, options);
- return canvas;
- });
-}
-
-function cleanupContainer(container, options) {
- if (options.removeContainer) {
- container.parentNode.removeChild(container);
- log("Cleaned up container");
- }
-}
-
-function crop(canvas, bounds) {
- var croppedCanvas = document.createElement("canvas");
- var x1 = Math.min(canvas.width - 1, Math.max(0, bounds.left));
- var x2 = Math.min(canvas.width, Math.max(1, bounds.left + bounds.width));
- var y1 = Math.min(canvas.height - 1, Math.max(0, bounds.top));
- var y2 = Math.min(canvas.height, Math.max(1, bounds.top + bounds.height));
- croppedCanvas.width = bounds.width;
- croppedCanvas.height = bounds.height;
- log("Cropping canvas at:", "left:", bounds.left, "top:", bounds.top, "width:", (x2-x1), "height:", (y2-y1));
- log("Resulting crop with width", bounds.width, "and height", bounds.height, " with x", x1, "and y", y1);
- croppedCanvas.getContext("2d").drawImage(canvas, x1, y1, x2-x1, y2-y1, bounds.x, bounds.y, x2-x1, y2-y1);
- return croppedCanvas;
-}
-
-function documentWidth (doc) {
- return Math.max(
- Math.max(doc.body.scrollWidth, doc.documentElement.scrollWidth),
- Math.max(doc.body.offsetWidth, doc.documentElement.offsetWidth),
- Math.max(doc.body.clientWidth, doc.documentElement.clientWidth)
- );
-}
-
-function documentHeight (doc) {
- return Math.max(
- Math.max(doc.body.scrollHeight, doc.documentElement.scrollHeight),
- Math.max(doc.body.offsetHeight, doc.documentElement.offsetHeight),
- Math.max(doc.body.clientHeight, doc.documentElement.clientHeight)
- );
-}
-
-function smallImage() {
- return "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";
-}
-
-function isIE9() {
- return document.documentMode && document.documentMode <= 9;
-}
-
-// https://github.com/niklasvh/html2canvas/issues/503
-function cloneNodeIE9(node, javascriptEnabled) {
- var clone = node.nodeType === 3 ? document.createTextNode(node.nodeValue) : node.cloneNode(false);
-
- var child = node.firstChild;
- while(child) {
- if (javascriptEnabled === true || child.nodeType !== 1 || child.nodeName !== 'SCRIPT') {
- clone.appendChild(cloneNodeIE9(child, javascriptEnabled));
- }
- child = child.nextSibling;
- }
-
- return clone;
-}
-
-function createWindowClone(ownerDocument, containerDocument, width, height, options, x ,y) {
- labelCanvasElements(ownerDocument);
- var documentElement = isIE9() ? cloneNodeIE9(ownerDocument.documentElement, options.javascriptEnabled) : ownerDocument.documentElement.cloneNode(true);
- var container = containerDocument.createElement("iframe");
-
- container.className = "html2canvas-container";
- container.style.visibility = "hidden";
- container.style.position = "fixed";
- container.style.left = "-10000px";
- container.style.top = "0px";
- container.style.border = "0";
- container.width = width;
- container.height = height;
- container.scrolling = "no"; // ios won't scroll without it
- containerDocument.body.appendChild(container);
-
- return new Promise(function(resolve) {
- var documentClone = container.contentWindow.document;
-
- cloneNodeValues(ownerDocument.documentElement, documentElement, "textarea");
- cloneNodeValues(ownerDocument.documentElement, documentElement, "select");
-
- /* Chrome doesn't detect relative background-images assigned in inline