mirror of
https://github.com/scratchfoundation/paper.js.git
synced 2025-06-10 12:10:54 -04:00
Loosely couple Node.js code to canvas module.
Treat absence of canvas module like a web worker context. Relates to #1103
This commit is contained in:
parent
73fc111b50
commit
89c60b1a05
11 changed files with 39 additions and 23 deletions
|
@ -47,7 +47,7 @@ buildNames.forEach(function(name) {
|
|||
evaluate: ['src/constants.js'],
|
||||
setup: function() {
|
||||
// Return objects to be defined in the preprocess-scope.
|
||||
// Note that this would be merge in with already existing
|
||||
// Note that this would be merged in with already existing
|
||||
// objects.
|
||||
return {
|
||||
__options: Object.assign({}, options, buildOptions[name])
|
||||
|
|
|
@ -347,7 +347,7 @@ Base.exports.PaperScript = function() {
|
|||
}
|
||||
if (/^(inline|both)$/.test(sourceMaps)) {
|
||||
code += "\n//# sourceMappingURL=data:application/json;base64,"
|
||||
+ window.btoa(unescape(encodeURIComponent(
|
||||
+ self.btoa(unescape(encodeURIComponent(
|
||||
JSON.stringify(map))));
|
||||
}
|
||||
code += "\n//# sourceURL=" + (url || 'paperscript');
|
||||
|
|
|
@ -36,7 +36,7 @@ paper = new (PaperScope.inject(Base.exports, {
|
|||
// - PaperScript support in require() with sourceMaps
|
||||
// - exportFrames / exportImage on CanvasView
|
||||
if (paper.agent.node)
|
||||
require('./node/extend')(paper);
|
||||
require('./node/extend.js')(paper);
|
||||
|
||||
// https://github.com/umdjs/umd
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
|
|
13
src/init.js
13
src/init.js
|
@ -19,11 +19,12 @@
|
|||
/* global document:true, window:true */
|
||||
// Create a window variable valid in the paper.js scope, that points to the
|
||||
// native window in browsers and the emulated JSDom one in node.js
|
||||
// In workers, window is null (but self is defined), so we can use the validity
|
||||
// of the local window object to detect a worker-like context in the library.
|
||||
var window = self ? self.window : require('./node/window'),
|
||||
document = window && window.document;
|
||||
// Make sure 'self' always points to a window object, also on Node.js.
|
||||
// In workers, and on Node.js when no Canvas is present, `window` is null (but
|
||||
// `self` is defined), so we can use the validity of the local window object to
|
||||
// detect a worker-like context in the library.
|
||||
// Make sure `self` always points to a window object, also on Node.js.
|
||||
self = self || require('./node/window.js');
|
||||
// NOTE: We're not modifying the global `self` here. We receive its value passed
|
||||
// to the paper.js function scope, and this is the one that is modified here.
|
||||
self = self || window;
|
||||
var window = self.window,
|
||||
document = self.document;
|
||||
|
|
|
@ -379,7 +379,7 @@ var Raster = Item.extend(/** @lends Raster# */{
|
|||
},
|
||||
|
||||
setSource: function(src) {
|
||||
var image = new window.Image(),
|
||||
var image = new self.Image(),
|
||||
crossOrigin = this._crossOrigin;
|
||||
if (crossOrigin)
|
||||
image.crossOrigin = crossOrigin;
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
var Http = {
|
||||
request: function(options) {
|
||||
// Code borrowed from Coffee Script and extended:
|
||||
var xhr = new window.XMLHttpRequest();
|
||||
var xhr = new self.XMLHttpRequest();
|
||||
xhr.open((options.method || 'get').toUpperCase(), options.url,
|
||||
Base.pick(options.async, true));
|
||||
if (options.mimeType)
|
||||
|
|
|
@ -10,16 +10,29 @@
|
|||
* All rights reserved.
|
||||
*/
|
||||
|
||||
var Canvas = require('canvas'),
|
||||
idlUtils = require('jsdom/lib/jsdom/living/generated/utils');
|
||||
|
||||
// Add some useful extensions to HTMLCanvasElement:
|
||||
// - HTMLCanvasElement#type, so we can switch to a PDF canvas
|
||||
// - Various Node Canvas methods, routed through from HTMLCanvasElement:
|
||||
// toBuffer, pngStream, createPNGStream, jpgStream, createJPGStream
|
||||
|
||||
module.exports = function(window) {
|
||||
var HTMLCanvasElement = window.HTMLCanvasElement;
|
||||
var Canvas;
|
||||
try {
|
||||
Canvas = require('canvas');
|
||||
} catch(e) {
|
||||
// Remove `self.window`, so we still have the global `self` reference,
|
||||
// but no `window` object:
|
||||
// - On the browser, this corresponds to a worker context.
|
||||
// - On Node.js, it basically means the canvas is missing or not working
|
||||
// which can be treated the same way.
|
||||
delete window.window;
|
||||
console.info(
|
||||
'Unable to load Canvas module. Running in a headless context.');
|
||||
return;
|
||||
}
|
||||
|
||||
var idlUtils = require('jsdom/lib/jsdom/living/generated/utils'),
|
||||
HTMLCanvasElement = window.HTMLCanvasElement;
|
||||
|
||||
// Add fake HTMLCanvasElement#type property:
|
||||
Object.defineProperty(HTMLCanvasElement.prototype, 'type', {
|
||||
|
|
|
@ -27,7 +27,7 @@ var document = jsdom.jsdom('<html><body></body></html>', {
|
|||
}),
|
||||
window = document.defaultView;
|
||||
|
||||
require('./canvas')(window);
|
||||
require('./canvas.js')(window);
|
||||
|
||||
// Define XMLSerializer and DOMParser shims, to emulate browser behavior.
|
||||
// Effort to bring this to jsdom: https://github.com/tmpvar/jsdom/issues/1368
|
||||
|
|
|
@ -369,7 +369,7 @@ new function() {
|
|||
definitions = null;
|
||||
}
|
||||
return options.asString
|
||||
? new window.XMLSerializer().serializeToString(svg)
|
||||
? new self.XMLSerializer().serializeToString(svg)
|
||||
: svg;
|
||||
}
|
||||
|
||||
|
|
|
@ -553,10 +553,12 @@ new function() {
|
|||
// WebKit. We also get variations of quotes or no quotes, single or
|
||||
// double, so handle it all with one regular expression:
|
||||
var match = value && value.match(/\((?:["'#]*)([^"')]+)/),
|
||||
res = match && definitions[match[1]
|
||||
// This is required by Firefox, which can produce absolute urls
|
||||
// for local gradients, see #1001:
|
||||
.replace(window.location.href.split('#')[0] + '#', '')];
|
||||
name = match && match[1],
|
||||
res = name && definitions[window
|
||||
// This is required by Firefox, which can produce absolute
|
||||
// urls for local gradients, see #1001:
|
||||
? name.replace(window.location.href.split('#')[0] + '#', '')
|
||||
: name];
|
||||
// Patch in support for SVG's gradientUnits="objectBoundingBox" through
|
||||
// Color#_scaleToBounds
|
||||
if (res && res._scaleToBounds) {
|
||||
|
@ -659,7 +661,7 @@ new function() {
|
|||
|
||||
function onLoad(svg) {
|
||||
try {
|
||||
var node = typeof svg === 'object' ? svg : new window.DOMParser()
|
||||
var node = typeof svg === 'object' ? svg : new self.DOMParser()
|
||||
.parseFromString(svg, 'image/svg+xml');
|
||||
if (!node.nodeName) {
|
||||
node = null;
|
||||
|
|
|
@ -86,7 +86,7 @@ var equals = function(actual, expected, message, options) {
|
|||
|| type === 'boolean' && 'Boolean'
|
||||
|| type === 'undefined' && 'Undefined'
|
||||
|| Array.isArray(expected) && 'Array'
|
||||
|| expected instanceof window.Element && 'Element' // handle DOM Elements
|
||||
|| expected instanceof self.Element && 'Element' // handle DOM Elements
|
||||
|| (cls = expected && expected._class) // check _class 2nd last
|
||||
|| type === 'object' && 'Object'; // Object as catch-all
|
||||
var comparator = type && comparators[type];
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue