svg.screenCTM()
expect(spy).toHaveBeenCalled()
})
+
+ it('does not throw and returns identity matrix if element is not rendered', () => {
+ const canvas = SVG().viewbox(0, 0, 0, 0)
+ expect(canvas.screenCTM()).toEqual(new Matrix())
+ })
})
})
})
filter,
radians,
degrees,
- camelCase,
unCamelCase,
capitalize,
proportionalSize,
})
})
- describe('camelCase()', function () {
- it('converts dash-case and PascalCase to camelCase', function () {
- var dash1 = 'dash-1'
- var dashTwo = 'dash-two'
- var camelOne = 'camelOne'
- var pascalOne = 'PascalOne'
- var mixOne = 'mix-One'
-
- expect(camelCase(dash1)).toBe('dash1')
- expect(camelCase(dashTwo)).toBe('dashTwo')
- expect(camelCase(camelOne)).toBe('camelone')
- expect(camelCase(pascalOne)).toBe('pascalone')
- expect(camelCase(mixOne)).toBe('mixOne')
- })
- })
-
describe('unCamelCase()', function () {
it('converts camelCase to dash-case', function () {
var dash1 = 'dash-1'
-import { camelCase } from '../../utils/utils.js'
import { isBlank } from '../core/regex.js'
import { registerMethods } from '../../utils/methods.js'
-const camelCaseWithVars = (str) => (str.startsWith('--') ? str : camelCase(str))
-
// Dynamic style generator
export function css(style, val) {
const ret = {}
// get style properties as array
if (Array.isArray(style)) {
for (const name of style) {
- const cased = camelCaseWithVars(name)
+ const cased = name
ret[name] = this.node.style.getPropertyValue(cased)
}
return ret
// get style for property
if (typeof style === 'string') {
- return this.node.style.getPropertyValue(camelCaseWithVars(style))
+ return this.node.style.getPropertyValue(style)
}
// set styles in object
for (const name in style) {
// set empty string if null/undefined/'' was given
this.node.style.setProperty(
- camelCaseWithVars(name),
+ name,
style[name] == null || isBlank.test(style[name]) ? '' : style[name]
)
}
// set style for property
if (arguments.length === 2) {
this.node.style.setProperty(
- camelCaseWithVars(style),
+ style,
val == null || isBlank.test(val) ? '' : val
)
}
}
export function screenCTM() {
- /* https://bugzilla.mozilla.org/show_bug.cgi?id=1344537
- This is needed because FF does not return the transformation matrix
- for the inner coordinate system when getScreenCTM() is called on nested svgs.
- However all other Browsers do that */
- if (typeof this.isRoot === 'function' && !this.isRoot()) {
- const rect = this.rect(1, 1)
- const m = rect.node.getScreenCTM()
- rect.remove()
- return new Matrix(m)
- }
- return new Matrix(this.node.getScreenCTM())
+ try {
+ /* https://bugzilla.mozilla.org/show_bug.cgi?id=1344537
+ This is needed because FF does not return the transformation matrix
+ for the inner coordinate system when getScreenCTM() is called on nested svgs.
+ However all other Browsers do that */
+ if (typeof this.isRoot === 'function' && !this.isRoot()) {
+ const rect = this.rect(1, 1)
+ const m = rect.node.getScreenCTM()
+ rect.remove()
+ return new Matrix(m)
+ }
+ return new Matrix(this.node.getScreenCTM())
+ } catch (e) {
+ console.warn(
+ `Cannot get CTM from SVG node ${this.node.nodeName}. Is the element rendered?`
+ )
+ return new Matrix()
+ }
}
register(Matrix, 'Matrix')
return ((r * 180) / Math.PI) % 360
}
-// Convert dash-separated-string to camelCase
-export function camelCase(s) {
- return s.toLowerCase().replace(/-(.)/g, function (m, g) {
- return g.toUpperCase()
- })
-}
-
// Convert camel cased string to dash separated
export function unCamelCase(s) {
return s.replace(/([A-Z])/g, function (m, g) {
}
interface Sugar {
- fill(): any
+ fill(): string
fill(fill: FillData): this
fill(color: string): this
fill(pattern: Element): this
fill(image: Image): this
- stroke(): any
+ stroke(): string
stroke(stroke: StrokeData): this
stroke(color: string): this
+ matrix(): Matrix
matrix(
- a?: number,
- b?: number,
- c?: number,
- d?: number,
- e?: number,
- f?: number
- ): this
- matrix(
- mat: MatrixAlias,
- b?: number,
- c?: number,
- d?: number,
- e?: number,
- f?: number
+ a: number,
+ b: number,
+ c: number,
+ d: number,
+ e: number,
+ f: number
): this
+ matrix(mat: MatrixAlias): this
rotate(degrees: number, cx?: number, cy?: number): this
skew(skewX?: number, skewY?: number, cx?: number, cy?: number): this
scale(scaleX?: number, scaleY?: number, cx?: number, cy?: number): this
translate(x: number, y: number): this
- shear(lam: Matrix, cx: number, cy: number): this
+ shear(lam: number, cx: number, cy: number): this
relative(x: number, y: number): this
flip(direction?: string, around?: number): this
flip(around: number): this