This repository has been archived on 2023-03-25. You can view files and clone it, but cannot push or open issues or pull requests.
mightyscape-1.1-deprecated/extensions/fablabchemnitz/papercraft/openjscad/node_modules/@jscad/svg-deserializer/helpers.js

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
}