Mon 21 Jul 22:43:21 CEST 2025
This commit is contained in:
parent
48ef9a5edd
commit
894844ef6a
77
js/d3/d3-node.js
vendored
Normal file
77
js/d3/d3-node.js
vendored
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
'use strict'
|
||||||
|
const jsDom = require('jsdom')
|
||||||
|
|
||||||
|
module.exports = D3Node
|
||||||
|
|
||||||
|
module.exports.jsDom = jsDom
|
||||||
|
|
||||||
|
const defaults = {
|
||||||
|
selector: '', // selects base D3 Element
|
||||||
|
container: '', // markup inserted in body
|
||||||
|
svgStyles: '' // embedded svg stylesheets
|
||||||
|
}
|
||||||
|
|
||||||
|
function D3Node (opts) {
|
||||||
|
const options = Object.assign({}, defaults, opts)
|
||||||
|
|
||||||
|
// auto-new instance, so we always have 'this'
|
||||||
|
if (!(this instanceof D3Node)) {
|
||||||
|
return new D3Node(options)
|
||||||
|
}
|
||||||
|
|
||||||
|
// setup DOM
|
||||||
|
let document = jsDom.jsdom()
|
||||||
|
if (options.container) {
|
||||||
|
document = jsDom.jsdom(options.container)
|
||||||
|
}
|
||||||
|
|
||||||
|
// setup d3 selection
|
||||||
|
let d3Element = options.d3Module.select(document.body)
|
||||||
|
if (options.selector) {
|
||||||
|
d3Element = d3Element.select(options.selector)
|
||||||
|
}
|
||||||
|
|
||||||
|
this.options = options
|
||||||
|
this.document = document
|
||||||
|
this.window = document.defaultView
|
||||||
|
this.d3Element = d3Element
|
||||||
|
this.d3 = options.d3Module
|
||||||
|
}
|
||||||
|
|
||||||
|
D3Node.prototype.createSVG = function () {
|
||||||
|
const svg = this.d3Element.append('svg')
|
||||||
|
.attr('xmlns', 'http://www.w3.org/2000/svg')
|
||||||
|
|
||||||
|
if (this.options.svgStyles) {
|
||||||
|
svg.append('defs')
|
||||||
|
.append('style')
|
||||||
|
.attr('type', 'text/css')
|
||||||
|
.text(`<![CDATA[ ${this.options.svgStyles} ]]>`)
|
||||||
|
}
|
||||||
|
return svg
|
||||||
|
}
|
||||||
|
|
||||||
|
// experimental method for creating 2d canvas
|
||||||
|
D3Node.prototype.createCanvas = function () {
|
||||||
|
if (!this.document.createElement('canvas').getContext('2d')) {
|
||||||
|
throw new Error('Install node-canvas for HTMLCanvasElement support.')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this.document.querySelector('canvas')) {
|
||||||
|
return this.document.createElement('canvas')
|
||||||
|
} else {
|
||||||
|
return this.document.querySelector('canvas')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
D3Node.prototype.svgString = function () {
|
||||||
|
if (this.d3Element.select('svg').node()) {
|
||||||
|
return this.d3Element.select('svg').node().outerHTML
|
||||||
|
}
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
|
||||||
|
D3Node.prototype.html = function () {
|
||||||
|
return jsDom.serializeDocument(this.document)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user