179 lines
3.9 KiB
JavaScript
179 lines
3.9 KiB
JavaScript
function pathRegReplace(a, b, c, d) {
|
|
return c + d.replace(SVG.regex.dots, ' .')
|
|
}
|
|
|
|
// creates deep clone of array
|
|
function array_clone(arr){
|
|
var clone = arr.slice(0)
|
|
for(var i = clone.length; i--;){
|
|
if(Array.isArray(clone[i])){
|
|
clone[i] = array_clone(clone[i])
|
|
}
|
|
}
|
|
return clone
|
|
}
|
|
|
|
// tests if a given element is instance of an object
|
|
function is(el, obj){
|
|
return el instanceof obj
|
|
}
|
|
|
|
// tests if a given selector matches an element
|
|
function matches(el, selector) {
|
|
return (el.matches || el.matchesSelector || el.msMatchesSelector || el.mozMatchesSelector || el.webkitMatchesSelector || el.oMatchesSelector).call(el, selector);
|
|
}
|
|
|
|
// Convert dash-separated-string to camelCase
|
|
function camelCase(s) {
|
|
return s.toLowerCase().replace(/-(.)/g, function(m, g) {
|
|
return g.toUpperCase()
|
|
})
|
|
}
|
|
|
|
// Capitalize first letter of a string
|
|
function capitalize(s) {
|
|
return s.charAt(0).toUpperCase() + s.slice(1)
|
|
}
|
|
|
|
// Ensure to six-based hex
|
|
function fullHex(hex) {
|
|
return hex.length == 4 ?
|
|
[ '#',
|
|
hex.substring(1, 2), hex.substring(1, 2)
|
|
, hex.substring(2, 3), hex.substring(2, 3)
|
|
, hex.substring(3, 4), hex.substring(3, 4)
|
|
].join('') : hex
|
|
}
|
|
|
|
// Component to hex value
|
|
function compToHex(comp) {
|
|
var hex = comp.toString(16)
|
|
return hex.length == 1 ? '0' + hex : hex
|
|
}
|
|
|
|
// Calculate proportional width and height values when necessary
|
|
function proportionalSize(element, width, height) {
|
|
if (width == null || height == null) {
|
|
var box = element.bbox()
|
|
|
|
if (width == null)
|
|
width = box.width / box.height * height
|
|
else if (height == null)
|
|
height = box.height / box.width * width
|
|
}
|
|
|
|
return {
|
|
width: width
|
|
, height: height
|
|
}
|
|
}
|
|
|
|
// Delta transform point
|
|
function deltaTransformPoint(matrix, x, y) {
|
|
return {
|
|
x: x * matrix.a + y * matrix.c + 0
|
|
, y: x * matrix.b + y * matrix.d + 0
|
|
}
|
|
}
|
|
|
|
// Map matrix array to object
|
|
function arrayToMatrix(a) {
|
|
return { a: a[0], b: a[1], c: a[2], d: a[3], e: a[4], f: a[5] }
|
|
}
|
|
|
|
// Parse matrix if required
|
|
function parseMatrix(matrix) {
|
|
if (!(matrix instanceof SVG.Matrix))
|
|
matrix = new SVG.Matrix(matrix)
|
|
|
|
return matrix
|
|
}
|
|
|
|
// Add centre point to transform object
|
|
function ensureCentre(o, target) {
|
|
o.cx = o.cx == null ? target.bbox().cx : o.cx
|
|
o.cy = o.cy == null ? target.bbox().cy : o.cy
|
|
}
|
|
|
|
// PathArray Helpers
|
|
function arrayToString(a) {
|
|
for (var i = 0, il = a.length, s = ''; i < il; i++) {
|
|
s += a[i][0]
|
|
|
|
if (a[i][1] != null) {
|
|
s += a[i][1]
|
|
|
|
if (a[i][2] != null) {
|
|
s += ' '
|
|
s += a[i][2]
|
|
|
|
if (a[i][3] != null) {
|
|
s += ' '
|
|
s += a[i][3]
|
|
s += ' '
|
|
s += a[i][4]
|
|
|
|
if (a[i][5] != null) {
|
|
s += ' '
|
|
s += a[i][5]
|
|
s += ' '
|
|
s += a[i][6]
|
|
|
|
if (a[i][7] != null) {
|
|
s += ' '
|
|
s += a[i][7]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return s + ' '
|
|
}
|
|
|
|
// Deep new id assignment
|
|
function assignNewId(node) {
|
|
// do the same for SVG child nodes as well
|
|
for (var i = node.childNodes.length - 1; i >= 0; i--)
|
|
if (node.childNodes[i] instanceof window.SVGElement)
|
|
assignNewId(node.childNodes[i])
|
|
|
|
return SVG.adopt(node).id(SVG.eid(node.nodeName))
|
|
}
|
|
|
|
// Add more bounding box properties
|
|
function fullBox(b) {
|
|
if (b.x == null) {
|
|
b.x = 0
|
|
b.y = 0
|
|
b.width = 0
|
|
b.height = 0
|
|
}
|
|
|
|
b.w = b.width
|
|
b.h = b.height
|
|
b.x2 = b.x + b.width
|
|
b.y2 = b.y + b.height
|
|
b.cx = b.x + b.width / 2
|
|
b.cy = b.y + b.height / 2
|
|
|
|
return b
|
|
}
|
|
|
|
// Get id from reference string
|
|
function idFromReference(url) {
|
|
var m = (url || '').toString().match(SVG.regex.reference)
|
|
|
|
if (m) return m[1]
|
|
}
|
|
|
|
// If values like 1e-88 are passed, this is not a valid 32 bit float,
|
|
// but in those cases, we are so close to 0 that 0 works well!
|
|
function float32String(v) {
|
|
return Math.abs(v) > 1e-37 ? v : 0
|
|
}
|
|
|
|
// Create matrix array for looping
|
|
var abcdef = 'abcdef'.split('')
|