183 lines
5.0 KiB
JavaScript
183 lines
5.0 KiB
JavaScript
|
const {inchMM, ptMM, pcMM, svgColors} = require('./constants')
|
||
|
|
||
|
// Calculate the CAG length/size from the given SVG value (float)
|
||
|
const svg2cagX = function (v, svgUnitsPmm) {
|
||
|
return (v / svgUnitsPmm[0])
|
||
|
}
|
||
|
|
||
|
const svg2cagY = function (v, svgUnitsPmm) {
|
||
|
return 0 - (v / svgUnitsPmm[1])
|
||
|
}
|
||
|
|
||
|
// Calculate the CAG length/size from the given CSS value (string)
|
||
|
const cagLengthX = function (css, svgUnitsPmm, svgUnitsX) {
|
||
|
if (css.indexOf('%') < 0) {
|
||
|
return css2cag(css, svgUnitsPmm[0])
|
||
|
}
|
||
|
// calculate the units as a percentage of the width
|
||
|
var v = parseFloat(css) // number part
|
||
|
if (isNaN(v)) { return 0.0 }
|
||
|
if (v === 0) return v
|
||
|
v = (v / 100) * svgUnitsX
|
||
|
// convert the units to mm
|
||
|
v = v / svgUnitsPmm[0]
|
||
|
// return v;
|
||
|
return Math.round(v / -100000) * -100000
|
||
|
}
|
||
|
|
||
|
const cagLengthY = function (css, svgUnitsPmm, svgUnitsY) {
|
||
|
if (css.indexOf('%') < 0) {
|
||
|
return css2cag(css, svgUnitsPmm[1])
|
||
|
}
|
||
|
// calculate the units as a percentage of the width
|
||
|
var v = parseFloat(css) // number part
|
||
|
if (isNaN(v)) { return 0.0 }
|
||
|
if (v === 0) return v
|
||
|
v = (v / 100) * svgUnitsY
|
||
|
// convert the units to mm
|
||
|
v = v / svgUnitsPmm[1]
|
||
|
// return v;
|
||
|
return Math.round(v / -100000) * -100000
|
||
|
}
|
||
|
|
||
|
const cagLengthP = function (css, svgUnitsPmm, svgUnitsV) {
|
||
|
if (css.indexOf('%') < 0) {
|
||
|
return css2cag(css, svgUnitsPmm[1])
|
||
|
}
|
||
|
// calculate the units as a percentage of the viewport
|
||
|
var v = parseFloat(css) // number part
|
||
|
if (isNaN(v)) { return 0.0 }
|
||
|
if (v === 0) return v
|
||
|
v = (v / 100) * svgUnitsV
|
||
|
// convert the units to mm
|
||
|
v = v / svgUnitsPmm[0] // FIXME should this use X units?
|
||
|
return v
|
||
|
}
|
||
|
|
||
|
const css2cag = function (css, unit) {
|
||
|
// console.log('css2cag('+css+','+unit+')');
|
||
|
var v = parseFloat(css) // number part
|
||
|
if (isNaN(v)) { return 0.0 }
|
||
|
if (v === 0) return v
|
||
|
if (css.search(/EM/i) > 0) { // FIXME self assignment , useless ?
|
||
|
// v = v // font size
|
||
|
} else
|
||
|
if (css.search(/EX/i) > 0) { // FIXME self assignment , useless ?
|
||
|
// v = v // x-height of font
|
||
|
} else
|
||
|
if (css.search(/MM/i) > 0) { // FIXME self assignment , useless ?
|
||
|
// v = v // absolute millimeters
|
||
|
} else
|
||
|
if (css.search(/CM/i) > 0) {
|
||
|
v = (v * 10) // absolute centimeters > millimeters
|
||
|
} else
|
||
|
if (css.search(/IN/i) > 0) {
|
||
|
v = (v / inchMM) // absolute inches > millimeters
|
||
|
} else
|
||
|
if (css.search(/PT/i) > 0) {
|
||
|
v = (v / ptMM) // absolute points > millimeters
|
||
|
} else
|
||
|
if (css.search(/PC/i) > 0) {
|
||
|
v = (v / pcMM) // absolute picas > millimeters
|
||
|
} else {
|
||
|
v = (v / unit) // absolute pixels(units) > millimeters
|
||
|
}
|
||
|
// console.log('v ('+v+')');
|
||
|
return v
|
||
|
}
|
||
|
|
||
|
// convert the SVG color specification to CAG RGB
|
||
|
const cagColor = function (value) {
|
||
|
// var rgb = [0,0,0]; // default is black
|
||
|
var rgb = null
|
||
|
value = value.toLowerCase()
|
||
|
if (value in svgColors) {
|
||
|
rgb = svgColors[value]
|
||
|
rgb = [rgb[0] / 255, rgb[1] / 255, rgb[2] / 255] // converted to 0.0-1.0 values
|
||
|
} else {
|
||
|
if (value[0] === '#') {
|
||
|
if (value.length === 4) {
|
||
|
// short HEX specification
|
||
|
value = '#' + value[1] + value[1] + value[2] + value[2] + value[3] + value[3]
|
||
|
}
|
||
|
if (value.length === 7) {
|
||
|
// HEX specification
|
||
|
rgb = [ parseInt('0x' + value.slice(1, 3)) / 255,
|
||
|
parseInt('0x' + value.slice(3, 5)) / 255,
|
||
|
parseInt('0x' + value.slice(5, 7)) / 255 ]
|
||
|
}
|
||
|
} else {
|
||
|
var pat = /rgb\(.+,.+,.+\)/
|
||
|
var s = pat.exec(value)
|
||
|
if (s !== null) {
|
||
|
// RGB specification
|
||
|
s = s[0]
|
||
|
s = s.slice(s.indexOf('(') + 1, s.indexOf(')'))
|
||
|
rgb = s.split(',')
|
||
|
if (s.indexOf('%') > 0) {
|
||
|
// rgb(#%,#%,#%)
|
||
|
rgb = [parseInt(rgb[0]), parseInt(rgb[1]), parseInt(rgb[2])]
|
||
|
rgb = [rgb[0] / 100, rgb[1] / 100, rgb[2] / 100] // converted to 0.0-1.0 values
|
||
|
} else {
|
||
|
// rgb(#,#,#)
|
||
|
rgb = [parseInt(rgb[0]), parseInt(rgb[1]), parseInt(rgb[2])]
|
||
|
rgb = [rgb[0] / 255, rgb[1] / 255, rgb[2] / 255] // converted to 0.0-1.0 values
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return rgb
|
||
|
}
|
||
|
|
||
|
const cssStyle = function (element, name) {
|
||
|
if ('STYLE' in element) {
|
||
|
var list = element.STYLE
|
||
|
var pat = name + '\\s*:\\s*\\S+;'
|
||
|
var exp = new RegExp(pat, 'i')
|
||
|
var v = exp.exec(list)
|
||
|
if (v !== null) {
|
||
|
v = v[0]
|
||
|
var i = v.length
|
||
|
while (v[i] !== ' ') i--
|
||
|
v = v.slice(i + 1, v.length - 1)
|
||
|
return v
|
||
|
}
|
||
|
}
|
||
|
return null
|
||
|
}
|
||
|
|
||
|
const reflect = function (x, y, px, py) {
|
||
|
var ox = x - px
|
||
|
var oy = y - py
|
||
|
if (x === px && y === px) return [x, y]
|
||
|
if (x === px) return [x, py + (-oy)]
|
||
|
if (y === py) return [px + (-ox), y]
|
||
|
return [px + (-ox), py + (-oy)]
|
||
|
}
|
||
|
|
||
|
// Return the value for the given attribute from the group hiearchy
|
||
|
const groupValue = function (svgGroups, name) {
|
||
|
var i = svgGroups.length
|
||
|
while (i > 0) {
|
||
|
const g = svgGroups[i - 1]
|
||
|
if (name in g) {
|
||
|
return g[name]
|
||
|
}
|
||
|
i--
|
||
|
}
|
||
|
return null
|
||
|
}
|
||
|
|
||
|
module.exports = {
|
||
|
svg2cagX,
|
||
|
svg2cagY,
|
||
|
cagLengthX,
|
||
|
cagLengthY,
|
||
|
cagLengthP,
|
||
|
css2cag,
|
||
|
cagColor,
|
||
|
cssStyle,
|
||
|
reflect,
|
||
|
groupValue
|
||
|
}
|