* create and use getTransformList
* update dependencies
master
JFH 2023-03-31 01:57:06 +02:00 committed by GitHub
parent 8619a17333
commit 13cdaedc63
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 5166 additions and 3512 deletions

View File

@ -1,3 +0,0 @@
paths:
- src
- packages

View File

@ -1,73 +0,0 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"
on:
push:
branches: [ "master" ]
pull_request:
# The branches below must be a subset of the branches above
branches: [ "master" ]
schedule:
- cron: '20 20 * * 6'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'javascript' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
# Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
steps:
- name: Checkout repository
uses: actions/checkout@v3
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
# queries: ./path/to/local/query, your-org/your-repo/queries@main
config-file: ./.github/codeql/codeql-config.yml
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v2
# Command-line programs to run using the OS shell.
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
# If the Autobuild fails above, remove it and uncomment the following three lines.
# modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.
# - run: |
# echo "Run, Build Application using script"
# ./location_of_script_within_repo/buildscript.sh
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2

View File

@ -4,7 +4,7 @@
"@babel/env", "@babel/env",
{ {
"useBuiltIns": "entry", "useBuiltIns": "entry",
"corejs": "3.26" "corejs": "3.27"
} }
] ]
] ]

View File

@ -1,20 +1,20 @@
{"total": {"lines":{"total":6260,"covered":3507,"skipped":0,"pct":56.02},"statements":{"total":6571,"covered":3601,"skipped":0,"pct":54.8},"functions":{"total":949,"covered":454,"skipped":0,"pct":47.84},"branches":{"total":3223,"covered":1288,"skipped":0,"pct":39.96}} {"total": {"lines":{"total":6260,"covered":3796,"skipped":0,"pct":60.64},"statements":{"total":6574,"covered":3913,"skipped":0,"pct":59.52},"functions":{"total":949,"covered":495,"skipped":0,"pct":52.16},"branches":{"total":3223,"covered":1398,"skipped":0,"pct":43.38}}
,"/Users/jfhenon/Work/svgedit/packages/svgcanvas/common/browser.js": {"lines":{"total":25,"covered":24,"skipped":0,"pct":96},"functions":{"total":6,"covered":2,"skipped":0,"pct":33.33},"statements":{"total":30,"covered":25,"skipped":0,"pct":83.33},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} ,"/Users/jfhenon/Work/svgedit/packages/svgcanvas/common/browser.js": {"lines":{"total":25,"covered":24,"skipped":0,"pct":96},"functions":{"total":6,"covered":2,"skipped":0,"pct":33.33},"statements":{"total":30,"covered":25,"skipped":0,"pct":83.33},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}}
,"/Users/jfhenon/Work/svgedit/packages/svgcanvas/common/util.js": {"lines":{"total":90,"covered":8,"skipped":0,"pct":8.89},"functions":{"total":7,"covered":3,"skipped":0,"pct":42.86},"statements":{"total":92,"covered":10,"skipped":0,"pct":10.87},"branches":{"total":98,"covered":10,"skipped":0,"pct":10.2}} ,"/Users/jfhenon/Work/svgedit/packages/svgcanvas/common/util.js": {"lines":{"total":90,"covered":8,"skipped":0,"pct":8.89},"functions":{"total":7,"covered":3,"skipped":0,"pct":42.86},"statements":{"total":92,"covered":10,"skipped":0,"pct":10.87},"branches":{"total":98,"covered":10,"skipped":0,"pct":10.2}}
,"/Users/jfhenon/Work/svgedit/src/editor/ConfigObj.js": {"lines":{"total":101,"covered":46,"skipped":0,"pct":45.54},"functions":{"total":14,"covered":11,"skipped":0,"pct":78.57},"statements":{"total":102,"covered":46,"skipped":0,"pct":45.1},"branches":{"total":96,"covered":30,"skipped":0,"pct":31.25}} ,"/Users/jfhenon/Work/svgedit/src/editor/ConfigObj.js": {"lines":{"total":101,"covered":46,"skipped":0,"pct":45.54},"functions":{"total":14,"covered":11,"skipped":0,"pct":78.57},"statements":{"total":102,"covered":46,"skipped":0,"pct":45.1},"branches":{"total":96,"covered":30,"skipped":0,"pct":31.25}}
,"/Users/jfhenon/Work/svgedit/src/editor/Editor.js": {"lines":{"total":410,"covered":184,"skipped":0,"pct":44.88},"functions":{"total":102,"covered":32,"skipped":0,"pct":31.37},"statements":{"total":417,"covered":185,"skipped":0,"pct":44.36},"branches":{"total":213,"covered":66,"skipped":0,"pct":30.99}} ,"/Users/jfhenon/Work/svgedit/src/editor/Editor.js": {"lines":{"total":410,"covered":200,"skipped":0,"pct":48.78},"functions":{"total":102,"covered":34,"skipped":0,"pct":33.33},"statements":{"total":417,"covered":201,"skipped":0,"pct":48.2},"branches":{"total":213,"covered":78,"skipped":0,"pct":36.62}}
,"/Users/jfhenon/Work/svgedit/src/editor/EditorStartup.js": {"lines":{"total":346,"covered":210,"skipped":0,"pct":60.69},"functions":{"total":51,"covered":25,"skipped":0,"pct":49.02},"statements":{"total":357,"covered":218,"skipped":0,"pct":61.06},"branches":{"total":122,"covered":38,"skipped":0,"pct":31.15}} ,"/Users/jfhenon/Work/svgedit/src/editor/EditorStartup.js": {"lines":{"total":346,"covered":216,"skipped":0,"pct":62.43},"functions":{"total":51,"covered":27,"skipped":0,"pct":52.94},"statements":{"total":357,"covered":224,"skipped":0,"pct":62.75},"branches":{"total":122,"covered":41,"skipped":0,"pct":33.61}}
,"/Users/jfhenon/Work/svgedit/src/editor/MainMenu.js": {"lines":{"total":111,"covered":44,"skipped":0,"pct":39.64},"functions":{"total":14,"covered":7,"skipped":0,"pct":50},"statements":{"total":111,"covered":44,"skipped":0,"pct":39.64},"branches":{"total":48,"covered":7,"skipped":0,"pct":14.58}} ,"/Users/jfhenon/Work/svgedit/src/editor/MainMenu.js": {"lines":{"total":111,"covered":44,"skipped":0,"pct":39.64},"functions":{"total":14,"covered":7,"skipped":0,"pct":50},"statements":{"total":111,"covered":44,"skipped":0,"pct":39.64},"branches":{"total":48,"covered":7,"skipped":0,"pct":14.58}}
,"/Users/jfhenon/Work/svgedit/src/editor/Rulers.js": {"lines":{"total":119,"covered":91,"skipped":0,"pct":76.47},"functions":{"total":6,"covered":4,"skipped":0,"pct":66.67},"statements":{"total":124,"covered":94,"skipped":0,"pct":75.81},"branches":{"total":43,"covered":30,"skipped":0,"pct":69.77}} ,"/Users/jfhenon/Work/svgedit/src/editor/Rulers.js": {"lines":{"total":119,"covered":93,"skipped":0,"pct":78.15},"functions":{"total":6,"covered":5,"skipped":0,"pct":83.33},"statements":{"total":124,"covered":98,"skipped":0,"pct":79.03},"branches":{"total":43,"covered":32,"skipped":0,"pct":74.42}}
,"/Users/jfhenon/Work/svgedit/src/editor/browser-not-supported.js": {"lines":{"total":4,"covered":3,"skipped":0,"pct":75},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":4,"covered":3,"skipped":0,"pct":75},"branches":{"total":4,"covered":3,"skipped":0,"pct":75}} ,"/Users/jfhenon/Work/svgedit/src/editor/browser-not-supported.js": {"lines":{"total":4,"covered":3,"skipped":0,"pct":75},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":4,"covered":3,"skipped":0,"pct":75},"branches":{"total":4,"covered":3,"skipped":0,"pct":75}}
,"/Users/jfhenon/Work/svgedit/src/editor/contextmenu.js": {"lines":{"total":22,"covered":9,"skipped":0,"pct":40.91},"functions":{"total":8,"covered":1,"skipped":0,"pct":12.5},"statements":{"total":23,"covered":9,"skipped":0,"pct":39.13},"branches":{"total":13,"covered":0,"skipped":0,"pct":0}} ,"/Users/jfhenon/Work/svgedit/src/editor/contextmenu.js": {"lines":{"total":22,"covered":9,"skipped":0,"pct":40.91},"functions":{"total":8,"covered":1,"skipped":0,"pct":12.5},"statements":{"total":23,"covered":9,"skipped":0,"pct":39.13},"branches":{"total":13,"covered":0,"skipped":0,"pct":0}}
,"/Users/jfhenon/Work/svgedit/src/editor/locale.js": {"lines":{"total":14,"covered":9,"skipped":0,"pct":64.29},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":14,"covered":9,"skipped":0,"pct":64.29},"branches":{"total":10,"covered":3,"skipped":0,"pct":30}} ,"/Users/jfhenon/Work/svgedit/src/editor/locale.js": {"lines":{"total":14,"covered":9,"skipped":0,"pct":64.29},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":14,"covered":9,"skipped":0,"pct":64.29},"branches":{"total":10,"covered":3,"skipped":0,"pct":30}}
,"/Users/jfhenon/Work/svgedit/src/editor/components/PaintBox.js": {"lines":{"total":64,"covered":35,"skipped":0,"pct":54.69},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":67,"covered":35,"skipped":0,"pct":52.24},"branches":{"total":33,"covered":11,"skipped":0,"pct":33.33}} ,"/Users/jfhenon/Work/svgedit/src/editor/components/PaintBox.js": {"lines":{"total":64,"covered":51,"skipped":0,"pct":79.69},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":67,"covered":53,"skipped":0,"pct":79.1},"branches":{"total":33,"covered":21,"skipped":0,"pct":63.64}}
,"/Users/jfhenon/Work/svgedit/src/editor/components/index.js": {"lines":{"total":0,"covered":0,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":0,"covered":0,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} ,"/Users/jfhenon/Work/svgedit/src/editor/components/index.js": {"lines":{"total":0,"covered":0,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":0,"covered":0,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}}
,"/Users/jfhenon/Work/svgedit/src/editor/components/seButton.js": {"lines":{"total":57,"covered":40,"skipped":0,"pct":70.18},"functions":{"total":15,"covered":7,"skipped":0,"pct":46.67},"statements":{"total":60,"covered":42,"skipped":0,"pct":70},"branches":{"total":33,"covered":23,"skipped":0,"pct":69.7}} ,"/Users/jfhenon/Work/svgedit/src/editor/components/seButton.js": {"lines":{"total":57,"covered":40,"skipped":0,"pct":70.18},"functions":{"total":15,"covered":7,"skipped":0,"pct":46.67},"statements":{"total":60,"covered":42,"skipped":0,"pct":70},"branches":{"total":33,"covered":23,"skipped":0,"pct":69.7}}
,"/Users/jfhenon/Work/svgedit/src/editor/components/seColorPicker.js": {"lines":{"total":50,"covered":41,"skipped":0,"pct":82},"functions":{"total":16,"covered":11,"skipped":0,"pct":68.75},"statements":{"total":51,"covered":41,"skipped":0,"pct":80.39},"branches":{"total":11,"covered":8,"skipped":0,"pct":72.73}} ,"/Users/jfhenon/Work/svgedit/src/editor/components/seColorPicker.js": {"lines":{"total":50,"covered":41,"skipped":0,"pct":82},"functions":{"total":16,"covered":11,"skipped":0,"pct":68.75},"statements":{"total":51,"covered":41,"skipped":0,"pct":80.39},"branches":{"total":11,"covered":8,"skipped":0,"pct":72.73}}
,"/Users/jfhenon/Work/svgedit/src/editor/components/seExplorerButton.js": {"lines":{"total":95,"covered":72,"skipped":0,"pct":75.79},"functions":{"total":17,"covered":10,"skipped":0,"pct":58.82},"statements":{"total":98,"covered":72,"skipped":0,"pct":73.47},"branches":{"total":30,"covered":17,"skipped":0,"pct":56.67}} ,"/Users/jfhenon/Work/svgedit/src/editor/components/seExplorerButton.js": {"lines":{"total":95,"covered":72,"skipped":0,"pct":75.79},"functions":{"total":17,"covered":10,"skipped":0,"pct":58.82},"statements":{"total":98,"covered":72,"skipped":0,"pct":73.47},"branches":{"total":30,"covered":17,"skipped":0,"pct":56.67}}
,"/Users/jfhenon/Work/svgedit/src/editor/components/seFlyingButton.js": {"lines":{"total":74,"covered":42,"skipped":0,"pct":56.76},"functions":{"total":14,"covered":8,"skipped":0,"pct":57.14},"statements":{"total":75,"covered":42,"skipped":0,"pct":56},"branches":{"total":29,"covered":9,"skipped":0,"pct":31.03}} ,"/Users/jfhenon/Work/svgedit/src/editor/components/seFlyingButton.js": {"lines":{"total":74,"covered":47,"skipped":0,"pct":63.51},"functions":{"total":14,"covered":9,"skipped":0,"pct":64.29},"statements":{"total":75,"covered":48,"skipped":0,"pct":64},"branches":{"total":29,"covered":12,"skipped":0,"pct":41.38}}
,"/Users/jfhenon/Work/svgedit/src/editor/components/seInput.js": {"lines":{"total":46,"covered":31,"skipped":0,"pct":67.39},"functions":{"total":16,"covered":8,"skipped":0,"pct":50},"statements":{"total":47,"covered":31,"skipped":0,"pct":65.96},"branches":{"total":8,"covered":4,"skipped":0,"pct":50}} ,"/Users/jfhenon/Work/svgedit/src/editor/components/seInput.js": {"lines":{"total":46,"covered":31,"skipped":0,"pct":67.39},"functions":{"total":16,"covered":8,"skipped":0,"pct":50},"statements":{"total":47,"covered":31,"skipped":0,"pct":65.96},"branches":{"total":8,"covered":4,"skipped":0,"pct":50}}
,"/Users/jfhenon/Work/svgedit/src/editor/components/seList.js": {"lines":{"total":87,"covered":59,"skipped":0,"pct":67.82},"functions":{"total":21,"covered":10,"skipped":0,"pct":47.62},"statements":{"total":89,"covered":61,"skipped":0,"pct":68.54},"branches":{"total":22,"covered":12,"skipped":0,"pct":54.55}} ,"/Users/jfhenon/Work/svgedit/src/editor/components/seList.js": {"lines":{"total":87,"covered":59,"skipped":0,"pct":67.82},"functions":{"total":21,"covered":10,"skipped":0,"pct":47.62},"statements":{"total":89,"covered":61,"skipped":0,"pct":68.54},"branches":{"total":22,"covered":12,"skipped":0,"pct":54.55}}
,"/Users/jfhenon/Work/svgedit/src/editor/components/seListItem.js": {"lines":{"total":39,"covered":26,"skipped":0,"pct":66.67},"functions":{"total":12,"covered":4,"skipped":0,"pct":33.33},"statements":{"total":40,"covered":27,"skipped":0,"pct":67.5},"branches":{"total":10,"covered":8,"skipped":0,"pct":80}} ,"/Users/jfhenon/Work/svgedit/src/editor/components/seListItem.js": {"lines":{"total":39,"covered":26,"skipped":0,"pct":66.67},"functions":{"total":12,"covered":4,"skipped":0,"pct":33.33},"statements":{"total":40,"covered":27,"skipped":0,"pct":67.5},"branches":{"total":10,"covered":8,"skipped":0,"pct":80}}
@ -26,15 +26,15 @@
,"/Users/jfhenon/Work/svgedit/src/editor/components/seSelect.js": {"lines":{"total":56,"covered":45,"skipped":0,"pct":80.36},"functions":{"total":17,"covered":9,"skipped":0,"pct":52.94},"statements":{"total":59,"covered":47,"skipped":0,"pct":79.66},"branches":{"total":16,"covered":14,"skipped":0,"pct":87.5}} ,"/Users/jfhenon/Work/svgedit/src/editor/components/seSelect.js": {"lines":{"total":56,"covered":45,"skipped":0,"pct":80.36},"functions":{"total":17,"covered":9,"skipped":0,"pct":52.94},"statements":{"total":59,"covered":47,"skipped":0,"pct":79.66},"branches":{"total":16,"covered":14,"skipped":0,"pct":87.5}}
,"/Users/jfhenon/Work/svgedit/src/editor/components/seSpinInput.js": {"lines":{"total":65,"covered":55,"skipped":0,"pct":84.62},"functions":{"total":18,"covered":10,"skipped":0,"pct":55.56},"statements":{"total":66,"covered":55,"skipped":0,"pct":83.33},"branches":{"total":17,"covered":13,"skipped":0,"pct":76.47}} ,"/Users/jfhenon/Work/svgedit/src/editor/components/seSpinInput.js": {"lines":{"total":65,"covered":55,"skipped":0,"pct":84.62},"functions":{"total":18,"covered":10,"skipped":0,"pct":55.56},"statements":{"total":66,"covered":55,"skipped":0,"pct":83.33},"branches":{"total":17,"covered":13,"skipped":0,"pct":76.47}}
,"/Users/jfhenon/Work/svgedit/src/editor/components/seText.js": {"lines":{"total":28,"covered":18,"skipped":0,"pct":64.29},"functions":{"total":10,"covered":4,"skipped":0,"pct":40},"statements":{"total":29,"covered":18,"skipped":0,"pct":62.07},"branches":{"total":8,"covered":5,"skipped":0,"pct":62.5}} ,"/Users/jfhenon/Work/svgedit/src/editor/components/seText.js": {"lines":{"total":28,"covered":18,"skipped":0,"pct":64.29},"functions":{"total":10,"covered":4,"skipped":0,"pct":40},"statements":{"total":29,"covered":18,"skipped":0,"pct":62.07},"branches":{"total":8,"covered":5,"skipped":0,"pct":62.5}}
,"/Users/jfhenon/Work/svgedit/src/editor/components/seZoom.js": {"lines":{"total":99,"covered":62,"skipped":0,"pct":62.63},"functions":{"total":28,"covered":9,"skipped":0,"pct":32.14},"statements":{"total":104,"covered":63,"skipped":0,"pct":60.58},"branches":{"total":36,"covered":7,"skipped":0,"pct":19.44}} ,"/Users/jfhenon/Work/svgedit/src/editor/components/seZoom.js": {"lines":{"total":99,"covered":93,"skipped":0,"pct":93.94},"functions":{"total":28,"covered":24,"skipped":0,"pct":85.71},"statements":{"total":107,"covered":100,"skipped":0,"pct":93.46},"branches":{"total":36,"covered":21,"skipped":0,"pct":58.33}}
,"/Users/jfhenon/Work/svgedit/src/editor/components/jgraduate/ColorValuePicker.js": {"lines":{"total":231,"covered":54,"skipped":0,"pct":23.38},"functions":{"total":9,"covered":3,"skipped":0,"pct":33.33},"statements":{"total":249,"covered":63,"skipped":0,"pct":25.3},"branches":{"total":157,"covered":34,"skipped":0,"pct":21.66}} ,"/Users/jfhenon/Work/svgedit/src/editor/components/jgraduate/ColorValuePicker.js": {"lines":{"total":231,"covered":54,"skipped":0,"pct":23.38},"functions":{"total":9,"covered":3,"skipped":0,"pct":33.33},"statements":{"total":249,"covered":63,"skipped":0,"pct":25.3},"branches":{"total":157,"covered":34,"skipped":0,"pct":21.66}}
,"/Users/jfhenon/Work/svgedit/src/editor/components/jgraduate/Slider.js": {"lines":{"total":156,"covered":91,"skipped":0,"pct":58.33},"functions":{"total":17,"covered":9,"skipped":0,"pct":52.94},"statements":{"total":176,"covered":96,"skipped":0,"pct":54.55},"branches":{"total":186,"covered":96,"skipped":0,"pct":51.61}} ,"/Users/jfhenon/Work/svgedit/src/editor/components/jgraduate/Slider.js": {"lines":{"total":156,"covered":91,"skipped":0,"pct":58.33},"functions":{"total":17,"covered":9,"skipped":0,"pct":52.94},"statements":{"total":176,"covered":96,"skipped":0,"pct":54.55},"branches":{"total":186,"covered":97,"skipped":0,"pct":52.15}}
,"/Users/jfhenon/Work/svgedit/src/editor/components/jgraduate/jQuery.jGraduate.js": {"lines":{"total":580,"covered":275,"skipped":0,"pct":47.41},"functions":{"total":44,"covered":14,"skipped":0,"pct":31.82},"statements":{"total":602,"covered":281,"skipped":0,"pct":46.68},"branches":{"total":278,"covered":99,"skipped":0,"pct":35.61}} ,"/Users/jfhenon/Work/svgedit/src/editor/components/jgraduate/jQuery.jGraduate.js": {"lines":{"total":580,"covered":275,"skipped":0,"pct":47.41},"functions":{"total":44,"covered":14,"skipped":0,"pct":31.82},"statements":{"total":602,"covered":282,"skipped":0,"pct":46.84},"branches":{"total":278,"covered":100,"skipped":0,"pct":35.97}}
,"/Users/jfhenon/Work/svgedit/src/editor/components/jgraduate/jQuery.jPicker.js": {"lines":{"total":840,"covered":449,"skipped":0,"pct":53.45},"functions":{"total":60,"covered":39,"skipped":0,"pct":65},"statements":{"total":926,"covered":475,"skipped":0,"pct":51.3},"branches":{"total":777,"covered":327,"skipped":0,"pct":42.08}} ,"/Users/jfhenon/Work/svgedit/src/editor/components/jgraduate/jQuery.jPicker.js": {"lines":{"total":840,"covered":449,"skipped":0,"pct":53.45},"functions":{"total":60,"covered":39,"skipped":0,"pct":65},"statements":{"total":926,"covered":475,"skipped":0,"pct":51.3},"branches":{"total":777,"covered":327,"skipped":0,"pct":42.08}}
,"/Users/jfhenon/Work/svgedit/src/editor/dialogs/SePlainAlertDialog.js": {"lines":{"total":7,"covered":1,"skipped":0,"pct":14.29},"functions":{"total":1,"covered":0,"skipped":0,"pct":0},"statements":{"total":7,"covered":1,"skipped":0,"pct":14.29},"branches":{"total":2,"covered":0,"skipped":0,"pct":0}} ,"/Users/jfhenon/Work/svgedit/src/editor/dialogs/SePlainAlertDialog.js": {"lines":{"total":7,"covered":1,"skipped":0,"pct":14.29},"functions":{"total":1,"covered":0,"skipped":0,"pct":0},"statements":{"total":7,"covered":1,"skipped":0,"pct":14.29},"branches":{"total":2,"covered":0,"skipped":0,"pct":0}}
,"/Users/jfhenon/Work/svgedit/src/editor/dialogs/cmenuDialog.js": {"lines":{"total":120,"covered":112,"skipped":0,"pct":93.33},"functions":{"total":28,"covered":15,"skipped":0,"pct":53.57},"statements":{"total":131,"covered":116,"skipped":0,"pct":88.55},"branches":{"total":23,"covered":19,"skipped":0,"pct":82.61}} ,"/Users/jfhenon/Work/svgedit/src/editor/dialogs/cmenuDialog.js": {"lines":{"total":120,"covered":112,"skipped":0,"pct":93.33},"functions":{"total":28,"covered":16,"skipped":0,"pct":57.14},"statements":{"total":131,"covered":117,"skipped":0,"pct":89.31},"branches":{"total":23,"covered":19,"skipped":0,"pct":82.61}}
,"/Users/jfhenon/Work/svgedit/src/editor/dialogs/cmenuLayersDialog.js": {"lines":{"total":61,"covered":49,"skipped":0,"pct":80.33},"functions":{"total":16,"covered":6,"skipped":0,"pct":37.5},"statements":{"total":66,"covered":49,"skipped":0,"pct":74.24},"branches":{"total":18,"covered":13,"skipped":0,"pct":72.22}} ,"/Users/jfhenon/Work/svgedit/src/editor/dialogs/cmenuLayersDialog.js": {"lines":{"total":61,"covered":49,"skipped":0,"pct":80.33},"functions":{"total":16,"covered":6,"skipped":0,"pct":37.5},"statements":{"total":66,"covered":49,"skipped":0,"pct":74.24},"branches":{"total":18,"covered":13,"skipped":0,"pct":72.22}}
,"/Users/jfhenon/Work/svgedit/src/editor/dialogs/editorPreferencesDialog.js": {"lines":{"total":157,"covered":124,"skipped":0,"pct":78.98},"functions":{"total":30,"covered":9,"skipped":0,"pct":30},"statements":{"total":159,"covered":125,"skipped":0,"pct":78.62},"branches":{"total":46,"covered":34,"skipped":0,"pct":73.91}} ,"/Users/jfhenon/Work/svgedit/src/editor/dialogs/editorPreferencesDialog.js": {"lines":{"total":157,"covered":125,"skipped":0,"pct":79.62},"functions":{"total":30,"covered":9,"skipped":0,"pct":30},"statements":{"total":159,"covered":126,"skipped":0,"pct":79.25},"branches":{"total":46,"covered":35,"skipped":0,"pct":76.09}}
,"/Users/jfhenon/Work/svgedit/src/editor/dialogs/exportDialog.js": {"lines":{"total":55,"covered":39,"skipped":0,"pct":70.91},"functions":{"total":14,"covered":5,"skipped":0,"pct":35.71},"statements":{"total":58,"covered":39,"skipped":0,"pct":67.24},"branches":{"total":12,"covered":6,"skipped":0,"pct":50}} ,"/Users/jfhenon/Work/svgedit/src/editor/dialogs/exportDialog.js": {"lines":{"total":55,"covered":39,"skipped":0,"pct":70.91},"functions":{"total":14,"covered":5,"skipped":0,"pct":35.71},"statements":{"total":58,"covered":39,"skipped":0,"pct":67.24},"branches":{"total":12,"covered":6,"skipped":0,"pct":50}}
,"/Users/jfhenon/Work/svgedit/src/editor/dialogs/imagePropertiesDialog.js": {"lines":{"total":161,"covered":90,"skipped":0,"pct":55.9},"functions":{"total":20,"covered":5,"skipped":0,"pct":25},"statements":{"total":162,"covered":90,"skipped":0,"pct":55.56},"branches":{"total":53,"covered":23,"skipped":0,"pct":43.4}} ,"/Users/jfhenon/Work/svgedit/src/editor/dialogs/imagePropertiesDialog.js": {"lines":{"total":161,"covered":90,"skipped":0,"pct":55.9},"functions":{"total":20,"covered":5,"skipped":0,"pct":25},"statements":{"total":162,"covered":90,"skipped":0,"pct":55.56},"branches":{"total":53,"covered":23,"skipped":0,"pct":43.4}}
,"/Users/jfhenon/Work/svgedit/src/editor/dialogs/index.js": {"lines":{"total":0,"covered":0,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":0,"covered":0,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} ,"/Users/jfhenon/Work/svgedit/src/editor/dialogs/index.js": {"lines":{"total":0,"covered":0,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":0,"covered":0,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}}
@ -42,11 +42,11 @@
,"/Users/jfhenon/Work/svgedit/src/editor/dialogs/seConfirmDialog.js": {"lines":{"total":8,"covered":2,"skipped":0,"pct":25},"functions":{"total":1,"covered":0,"skipped":0,"pct":0},"statements":{"total":8,"covered":2,"skipped":0,"pct":25},"branches":{"total":2,"covered":0,"skipped":0,"pct":0}} ,"/Users/jfhenon/Work/svgedit/src/editor/dialogs/seConfirmDialog.js": {"lines":{"total":8,"covered":2,"skipped":0,"pct":25},"functions":{"total":1,"covered":0,"skipped":0,"pct":0},"statements":{"total":8,"covered":2,"skipped":0,"pct":25},"branches":{"total":2,"covered":0,"skipped":0,"pct":0}}
,"/Users/jfhenon/Work/svgedit/src/editor/dialogs/sePromptDialog.js": {"lines":{"total":24,"covered":5,"skipped":0,"pct":20.83},"functions":{"total":7,"covered":2,"skipped":0,"pct":28.57},"statements":{"total":24,"covered":5,"skipped":0,"pct":20.83},"branches":{"total":9,"covered":0,"skipped":0,"pct":0}} ,"/Users/jfhenon/Work/svgedit/src/editor/dialogs/sePromptDialog.js": {"lines":{"total":24,"covered":5,"skipped":0,"pct":20.83},"functions":{"total":7,"covered":2,"skipped":0,"pct":28.57},"statements":{"total":24,"covered":5,"skipped":0,"pct":20.83},"branches":{"total":9,"covered":0,"skipped":0,"pct":0}}
,"/Users/jfhenon/Work/svgedit/src/editor/dialogs/seSelectDialog.js": {"lines":{"total":8,"covered":2,"skipped":0,"pct":25},"functions":{"total":1,"covered":0,"skipped":0,"pct":0},"statements":{"total":8,"covered":2,"skipped":0,"pct":25},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} ,"/Users/jfhenon/Work/svgedit/src/editor/dialogs/seSelectDialog.js": {"lines":{"total":8,"covered":2,"skipped":0,"pct":25},"functions":{"total":1,"covered":0,"skipped":0,"pct":0},"statements":{"total":8,"covered":2,"skipped":0,"pct":25},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}}
,"/Users/jfhenon/Work/svgedit/src/editor/dialogs/svgSourceDialog.js": {"lines":{"total":74,"covered":56,"skipped":0,"pct":75.68},"functions":{"total":17,"covered":6,"skipped":0,"pct":35.29},"statements":{"total":75,"covered":56,"skipped":0,"pct":74.67},"branches":{"total":17,"covered":13,"skipped":0,"pct":76.47}} ,"/Users/jfhenon/Work/svgedit/src/editor/dialogs/svgSourceDialog.js": {"lines":{"total":74,"covered":56,"skipped":0,"pct":75.68},"functions":{"total":17,"covered":6,"skipped":0,"pct":35.29},"statements":{"total":75,"covered":57,"skipped":0,"pct":76},"branches":{"total":17,"covered":14,"skipped":0,"pct":82.35}}
,"/Users/jfhenon/Work/svgedit/src/editor/dialogs/se-elix/define/NumberSpinBox.js": {"lines":{"total":1,"covered":1,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":1,"covered":1,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} ,"/Users/jfhenon/Work/svgedit/src/editor/dialogs/se-elix/define/NumberSpinBox.js": {"lines":{"total":1,"covered":1,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":1,"covered":1,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}}
,"/Users/jfhenon/Work/svgedit/src/editor/dialogs/se-elix/src/base/NumberSpinBox.js": {"lines":{"total":54,"covered":52,"skipped":0,"pct":96.3},"functions":{"total":13,"covered":11,"skipped":0,"pct":84.62},"statements":{"total":54,"covered":52,"skipped":0,"pct":96.3},"branches":{"total":53,"covered":46,"skipped":0,"pct":86.79}} ,"/Users/jfhenon/Work/svgedit/src/editor/dialogs/se-elix/src/base/NumberSpinBox.js": {"lines":{"total":54,"covered":52,"skipped":0,"pct":96.3},"functions":{"total":13,"covered":11,"skipped":0,"pct":84.62},"statements":{"total":54,"covered":52,"skipped":0,"pct":96.3},"branches":{"total":53,"covered":47,"skipped":0,"pct":88.68}}
,"/Users/jfhenon/Work/svgedit/src/editor/dialogs/se-elix/src/plain/PlainNumberSpinBox.js": {"lines":{"total":0,"covered":0,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":0,"covered":0,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} ,"/Users/jfhenon/Work/svgedit/src/editor/dialogs/se-elix/src/plain/PlainNumberSpinBox.js": {"lines":{"total":0,"covered":0,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":0,"covered":0,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}}
,"/Users/jfhenon/Work/svgedit/src/editor/extensions/ext-eyedropper/ext-eyedropper.js": {"lines":{"total":60,"covered":39,"skipped":0,"pct":65},"functions":{"total":8,"covered":5,"skipped":0,"pct":62.5},"statements":{"total":71,"covered":39,"skipped":0,"pct":54.93},"branches":{"total":39,"covered":14,"skipped":0,"pct":35.9}} ,"/Users/jfhenon/Work/svgedit/src/editor/extensions/ext-eyedropper/ext-eyedropper.js": {"lines":{"total":60,"covered":39,"skipped":0,"pct":65},"functions":{"total":8,"covered":5,"skipped":0,"pct":62.5},"statements":{"total":71,"covered":39,"skipped":0,"pct":54.93},"branches":{"total":39,"covered":15,"skipped":0,"pct":38.46}}
,"/Users/jfhenon/Work/svgedit/src/editor/extensions/ext-eyedropper/locale/en.js": {"lines":{"total":0,"covered":0,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":0,"covered":0,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} ,"/Users/jfhenon/Work/svgedit/src/editor/extensions/ext-eyedropper/locale/en.js": {"lines":{"total":0,"covered":0,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":0,"covered":0,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}}
,"/Users/jfhenon/Work/svgedit/src/editor/extensions/ext-grid/ext-grid.js": {"lines":{"total":88,"covered":43,"skipped":0,"pct":48.86},"functions":{"total":8,"covered":4,"skipped":0,"pct":50},"statements":{"total":90,"covered":43,"skipped":0,"pct":47.78},"branches":{"total":10,"covered":4,"skipped":0,"pct":40}} ,"/Users/jfhenon/Work/svgedit/src/editor/extensions/ext-grid/ext-grid.js": {"lines":{"total":88,"covered":43,"skipped":0,"pct":48.86},"functions":{"total":8,"covered":4,"skipped":0,"pct":50},"statements":{"total":90,"covered":43,"skipped":0,"pct":47.78},"branches":{"total":10,"covered":4,"skipped":0,"pct":40}}
,"/Users/jfhenon/Work/svgedit/src/editor/extensions/ext-grid/locale/en.js": {"lines":{"total":0,"covered":0,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":0,"covered":0,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} ,"/Users/jfhenon/Work/svgedit/src/editor/extensions/ext-grid/locale/en.js": {"lines":{"total":0,"covered":0,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":0,"covered":0,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}}
@ -55,15 +55,15 @@
,"/Users/jfhenon/Work/svgedit/src/editor/extensions/ext-opensave/locale/en.js": {"lines":{"total":0,"covered":0,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":0,"covered":0,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} ,"/Users/jfhenon/Work/svgedit/src/editor/extensions/ext-opensave/locale/en.js": {"lines":{"total":0,"covered":0,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":0,"covered":0,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}}
,"/Users/jfhenon/Work/svgedit/src/editor/extensions/ext-panning/ext-panning.js": {"lines":{"total":30,"covered":22,"skipped":0,"pct":73.33},"functions":{"total":7,"covered":6,"skipped":0,"pct":85.71},"statements":{"total":30,"covered":22,"skipped":0,"pct":73.33},"branches":{"total":6,"covered":2,"skipped":0,"pct":33.33}} ,"/Users/jfhenon/Work/svgedit/src/editor/extensions/ext-panning/ext-panning.js": {"lines":{"total":30,"covered":22,"skipped":0,"pct":73.33},"functions":{"total":7,"covered":6,"skipped":0,"pct":85.71},"statements":{"total":30,"covered":22,"skipped":0,"pct":73.33},"branches":{"total":6,"covered":2,"skipped":0,"pct":33.33}}
,"/Users/jfhenon/Work/svgedit/src/editor/extensions/ext-panning/locale/en.js": {"lines":{"total":0,"covered":0,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":0,"covered":0,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} ,"/Users/jfhenon/Work/svgedit/src/editor/extensions/ext-panning/locale/en.js": {"lines":{"total":0,"covered":0,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":0,"covered":0,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}}
,"/Users/jfhenon/Work/svgedit/src/editor/extensions/ext-polystar/ext-polystar.js": {"lines":{"total":247,"covered":63,"skipped":0,"pct":25.51},"functions":{"total":18,"covered":8,"skipped":0,"pct":44.44},"statements":{"total":256,"covered":63,"skipped":0,"pct":24.61},"branches":{"total":62,"covered":10,"skipped":0,"pct":16.13}} ,"/Users/jfhenon/Work/svgedit/src/editor/extensions/ext-polystar/ext-polystar.js": {"lines":{"total":247,"covered":232,"skipped":0,"pct":93.93},"functions":{"total":18,"covered":16,"skipped":0,"pct":88.89},"statements":{"total":256,"covered":241,"skipped":0,"pct":94.14},"branches":{"total":62,"covered":39,"skipped":0,"pct":62.9}}
,"/Users/jfhenon/Work/svgedit/src/editor/extensions/ext-polystar/locale/en.js": {"lines":{"total":0,"covered":0,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":0,"covered":0,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} ,"/Users/jfhenon/Work/svgedit/src/editor/extensions/ext-polystar/locale/en.js": {"lines":{"total":0,"covered":0,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":0,"covered":0,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}}
,"/Users/jfhenon/Work/svgedit/src/editor/extensions/ext-shapes/ext-shapes.js": {"lines":{"total":76,"covered":74,"skipped":0,"pct":97.37},"functions":{"total":7,"covered":7,"skipped":0,"pct":100},"statements":{"total":80,"covered":78,"skipped":0,"pct":97.5},"branches":{"total":26,"covered":17,"skipped":0,"pct":65.38}} ,"/Users/jfhenon/Work/svgedit/src/editor/extensions/ext-shapes/ext-shapes.js": {"lines":{"total":76,"covered":74,"skipped":0,"pct":97.37},"functions":{"total":7,"covered":7,"skipped":0,"pct":100},"statements":{"total":80,"covered":78,"skipped":0,"pct":97.5},"branches":{"total":26,"covered":17,"skipped":0,"pct":65.38}}
,"/Users/jfhenon/Work/svgedit/src/editor/extensions/ext-shapes/locale/en.js": {"lines":{"total":0,"covered":0,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":0,"covered":0,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} ,"/Users/jfhenon/Work/svgedit/src/editor/extensions/ext-shapes/locale/en.js": {"lines":{"total":0,"covered":0,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":0,"covered":0,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}}
,"/Users/jfhenon/Work/svgedit/src/editor/extensions/ext-storage/ext-storage.js": {"lines":{"total":91,"covered":59,"skipped":0,"pct":64.84},"functions":{"total":12,"covered":7,"skipped":0,"pct":58.33},"statements":{"total":91,"covered":59,"skipped":0,"pct":64.84},"branches":{"total":68,"covered":27,"skipped":0,"pct":39.71}} ,"/Users/jfhenon/Work/svgedit/src/editor/extensions/ext-storage/ext-storage.js": {"lines":{"total":91,"covered":59,"skipped":0,"pct":64.84},"functions":{"total":12,"covered":7,"skipped":0,"pct":58.33},"statements":{"total":91,"covered":59,"skipped":0,"pct":64.84},"branches":{"total":68,"covered":27,"skipped":0,"pct":39.71}}
,"/Users/jfhenon/Work/svgedit/src/editor/extensions/ext-storage/storageDialog.js": {"lines":{"total":60,"covered":56,"skipped":0,"pct":93.33},"functions":{"total":10,"covered":7,"skipped":0,"pct":70},"statements":{"total":62,"covered":57,"skipped":0,"pct":91.94},"branches":{"total":15,"covered":13,"skipped":0,"pct":86.67}} ,"/Users/jfhenon/Work/svgedit/src/editor/extensions/ext-storage/storageDialog.js": {"lines":{"total":60,"covered":56,"skipped":0,"pct":93.33},"functions":{"total":10,"covered":7,"skipped":0,"pct":70},"statements":{"total":62,"covered":57,"skipped":0,"pct":91.94},"branches":{"total":15,"covered":13,"skipped":0,"pct":86.67}}
,"/Users/jfhenon/Work/svgedit/src/editor/locale/lang.en.js": {"lines":{"total":0,"covered":0,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":0,"covered":0,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} ,"/Users/jfhenon/Work/svgedit/src/editor/locale/lang.en.js": {"lines":{"total":0,"covered":0,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":0,"covered":0,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}}
,"/Users/jfhenon/Work/svgedit/src/editor/panels/BottomPanel.js": {"lines":{"total":71,"covered":56,"skipped":0,"pct":78.87},"functions":{"total":22,"covered":14,"skipped":0,"pct":63.64},"statements":{"total":77,"covered":59,"skipped":0,"pct":76.62},"branches":{"total":30,"covered":12,"skipped":0,"pct":40}} ,"/Users/jfhenon/Work/svgedit/src/editor/panels/BottomPanel.js": {"lines":{"total":71,"covered":58,"skipped":0,"pct":81.69},"functions":{"total":22,"covered":14,"skipped":0,"pct":63.64},"statements":{"total":77,"covered":61,"skipped":0,"pct":79.22},"branches":{"total":30,"covered":16,"skipped":0,"pct":53.33}}
,"/Users/jfhenon/Work/svgedit/src/editor/panels/LayersPanel.js": {"lines":{"total":157,"covered":70,"skipped":0,"pct":44.59},"functions":{"total":27,"covered":6,"skipped":0,"pct":22.22},"statements":{"total":163,"covered":71,"skipped":0,"pct":43.56},"branches":{"total":46,"covered":6,"skipped":0,"pct":13.04}} ,"/Users/jfhenon/Work/svgedit/src/editor/panels/LayersPanel.js": {"lines":{"total":157,"covered":70,"skipped":0,"pct":44.59},"functions":{"total":27,"covered":6,"skipped":0,"pct":22.22},"statements":{"total":163,"covered":71,"skipped":0,"pct":43.56},"branches":{"total":46,"covered":6,"skipped":0,"pct":13.04}}
,"/Users/jfhenon/Work/svgedit/src/editor/panels/LeftPanel.js": {"lines":{"total":58,"covered":37,"skipped":0,"pct":63.79},"functions":{"total":20,"covered":10,"skipped":0,"pct":50},"statements":{"total":59,"covered":37,"skipped":0,"pct":62.71},"branches":{"total":32,"covered":7,"skipped":0,"pct":21.88}} ,"/Users/jfhenon/Work/svgedit/src/editor/panels/LeftPanel.js": {"lines":{"total":58,"covered":47,"skipped":0,"pct":81.03},"functions":{"total":20,"covered":15,"skipped":0,"pct":75},"statements":{"total":59,"covered":47,"skipped":0,"pct":79.66},"branches":{"total":32,"covered":12,"skipped":0,"pct":37.5}}
,"/Users/jfhenon/Work/svgedit/src/editor/panels/TopPanel.js": {"lines":{"total":391,"covered":265,"skipped":0,"pct":67.77},"functions":{"total":73,"covered":42,"skipped":0,"pct":57.53},"statements":{"total":411,"covered":273,"skipped":0,"pct":66.42},"branches":{"total":207,"covered":105,"skipped":0,"pct":50.72}} ,"/Users/jfhenon/Work/svgedit/src/editor/panels/TopPanel.js": {"lines":{"total":391,"covered":296,"skipped":0,"pct":75.7},"functions":{"total":73,"covered":48,"skipped":0,"pct":65.75},"statements":{"total":411,"covered":304,"skipped":0,"pct":73.97},"branches":{"total":207,"covered":127,"skipped":0,"pct":61.35}}
} }

8297
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -83,11 +83,11 @@
}, },
"dependencies": { "dependencies": {
"@svgedit/svgcanvas": "7.2.1", "@svgedit/svgcanvas": "7.2.1",
"browser-fs-access": "0.31.1", "browser-fs-access": "0.33.0",
"core-js": "3.27.1", "core-js": "3.29.1",
"elix": "15.0.1", "elix": "15.0.1",
"html2canvas": "1.4.1", "html2canvas": "1.4.1",
"i18next": "22.4.9", "i18next": "22.4.13",
"jspdf": "2.5.1", "jspdf": "2.5.1",
"pathseg": "1.2.1", "pathseg": "1.2.1",
"regenerator-runtime": "0.13.11", "regenerator-runtime": "0.13.11",
@ -95,45 +95,45 @@
"svg2pdf.js": "2.2.1" "svg2pdf.js": "2.2.1"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "7.20.12", "@babel/core": "7.21.3",
"@babel/preset-env": "7.20.2", "@babel/preset-env": "7.20.2",
"@babel/register": "7.18.9", "@babel/register": "7.21.0",
"@babel/runtime-corejs3": "7.20.7", "@babel/runtime-corejs3": "7.21.0",
"@cypress/code-coverage": "3.10.0", "@cypress/code-coverage": "3.10.1",
"@rollup/plugin-babel": "^6.0.3", "@rollup/plugin-babel": "^6.0.3",
"@rollup/plugin-commonjs": "^24", "@rollup/plugin-commonjs": "^24",
"@rollup/plugin-dynamic-import-vars": "2.0.2", "@rollup/plugin-dynamic-import-vars": "2.0.3",
"@rollup/plugin-node-resolve": "15.0.1", "@rollup/plugin-node-resolve": "15.0.1",
"@rollup/plugin-replace": "5.0.2", "@rollup/plugin-replace": "5.0.2",
"@rollup/plugin-url": "8.0.1", "@rollup/plugin-url": "8.0.1",
"@web/dev-server": "0.1.35", "@web/dev-server": "0.1.37",
"@web/dev-server-esbuild": "^0.3.3", "@web/dev-server-esbuild": "^0.3.5",
"@web/dev-server-rollup": "0.3.19", "@web/dev-server-rollup": "0.4.0",
"babel-plugin-istanbul": "^6.1.1", "babel-plugin-istanbul": "^6.1.1",
"babel-plugin-transform-object-rest-spread": "7.0.0-beta.3", "babel-plugin-transform-object-rest-spread": "7.0.0-beta.3",
"core-js-bundle": "3.27.1", "core-js-bundle": "3.29.1",
"cp-cli": "2.0.0", "cp-cli": "2.0.0",
"cypress": "12.3.0", "cypress": "12.9.0",
"cypress-multi-reporters": "1.6.2", "cypress-multi-reporters": "1.6.3",
"jamilih": "0.54.0", "jamilih": "0.54.0",
"jsdoc": "4.0.0", "jsdoc": "4.0.2",
"node-static": "0.7.11", "node-static": "0.7.11",
"npm-run-all": "4.1.5", "npm-run-all": "4.1.5",
"nyc": "15.1.0", "nyc": "15.1.0",
"open-cli": "7.1.0", "open-cli": "7.2.0",
"promise-fs": "2.1.1", "promise-fs": "2.1.1",
"qr-manipulation": "0.7.0", "qr-manipulation": "0.7.0",
"query-result": "1.0.5", "query-result": "1.0.5",
"remark-cli": "11.0.0", "remark-cli": "11.0.0",
"remark-lint-ordered-list-marker-value": "3.1.1", "remark-lint-ordered-list-marker-value": "3.1.1",
"rimraf": "3.0.2", "rimraf": "4.4.1",
"rollup": "3.9.1", "rollup": "3.20.2",
"rollup-plugin-copy": "3.4.0", "rollup-plugin-copy": "3.4.0",
"rollup-plugin-filesize": "9.1.2", "rollup-plugin-filesize": "10.0.0",
"rollup-plugin-html": "0.2.1", "rollup-plugin-html": "0.2.1",
"rollup-plugin-progress": "1.1.2", "rollup-plugin-progress": "1.1.2",
"rollup-plugin-re": "1.0.7", "rollup-plugin-re": "1.0.7",
"standard": "17.0.0", "standard": "17.0.0",
"start-server-and-test": "1.15.2" "start-server-and-test": "2.0.0"
} }
} }

View File

@ -8,7 +8,7 @@ import {
snapToGrid, assignAttributes, getBBox, getRefElem, findDefs snapToGrid, assignAttributes, getBBox, getRefElem, findDefs
} from './utilities.js' } from './utilities.js'
import { import {
transformPoint, transformListToTransform, matrixMultiply, transformBox transformPoint, transformListToTransform, matrixMultiply, transformBox, getTransformList
} from './math.js' } from './math.js'
// this is how we map paths to our preferred relative segment types // this is how we map paths to our preferred relative segment types
@ -98,7 +98,7 @@ export const remapElement = (selected, changes, m) => {
changes.y = Number.parseFloat(changes.y) + tNew.f changes.y = Number.parseFloat(changes.y) + tNew.f
} else { } else {
// we just absorb all matrices into the element and don't do any remapping // we just absorb all matrices into the element and don't do any remapping
const chlist = selected.transform.baseVal const chlist = getTransformList(selected)
const mt = svgCanvas.getSvgRoot().createSVGTransform() const mt = svgCanvas.getSvgRoot().createSVGTransform()
mt.setMatrix(matrixMultiply(transformListToTransform(chlist).matrix, m)) mt.setMatrix(matrixMultiply(transformListToTransform(chlist).matrix, m))
chlist.clear() chlist.clear()
@ -115,7 +115,7 @@ export const remapElement = (selected, changes, m) => {
// Allow images to be inverted (give them matrix when flipped) // Allow images to be inverted (give them matrix when flipped)
if (elName === 'image' && (m.a < 0 || m.d < 0)) { if (elName === 'image' && (m.a < 0 || m.d < 0)) {
// Convert to matrix // Convert to matrix
const chlist = selected.transform.baseVal const chlist = getTransformList(selected)
const mt = svgCanvas.getSvgRoot().createSVGTransform() const mt = svgCanvas.getSvgRoot().createSVGTransform()
mt.setMatrix(matrixMultiply(transformListToTransform(chlist).matrix, m)) mt.setMatrix(matrixMultiply(transformListToTransform(chlist).matrix, m))
chlist.clear() chlist.clear()

View File

@ -12,7 +12,7 @@ import {
convertAttrs convertAttrs
} from './units.js' } from './units.js'
import { import {
transformPoint, hasMatrixTransform, getMatrix, snapToAngle transformPoint, hasMatrixTransform, getMatrix, snapToAngle, getTransformList
} from './math.js' } from './math.js'
import * as draw from './draw.js' import * as draw from './draw.js'
import * as pathModule from './path.js' import * as pathModule from './path.js'
@ -83,7 +83,7 @@ const getBsplinePoint = (t) => {
const updateTransformList = (svgRoot, element, dx, dy) => { const updateTransformList = (svgRoot, element, dx, dy) => {
const xform = svgRoot.createSVGTransform() const xform = svgRoot.createSVGTransform()
xform.setTranslate(dx, dy) xform.setTranslate(dx, dy)
const tlist = element.transform?.baseVal const tlist = getTransformList(element)
if (tlist.numberOfItems) { if (tlist.numberOfItems) {
const firstItem = tlist.getItem(0) const firstItem = tlist.getItem(0)
if (firstItem.type === 2) { // SVG_TRANSFORM_TRANSLATE = 2 if (firstItem.type === 2) { // SVG_TRANSFORM_TRANSLATE = 2
@ -221,7 +221,7 @@ const mouseMoveEvent = (evt) => {
// we track the resize bounding box and translate/scale the selected element // we track the resize bounding box and translate/scale the selected element
// while the mouse is down, when mouse goes up, we use this to recalculate // while the mouse is down, when mouse goes up, we use this to recalculate
// the shape's coordinates // the shape's coordinates
tlist = selected.transform.baseVal tlist = getTransformList(selected)
const hasMatrix = hasMatrixTransform(tlist) const hasMatrix = hasMatrixTransform(tlist)
box = hasMatrix ? svgCanvas.getInitBbox() : getBBox(selected) box = hasMatrix ? svgCanvas.getInitBbox() : getBBox(selected)
let left = box.x let left = box.x
@ -1026,7 +1026,7 @@ const mouseDownEvent = (evt) => {
svgCanvas.setStartTransform(mouseTarget.getAttribute('transform')) svgCanvas.setStartTransform(mouseTarget.getAttribute('transform'))
const tlist = mouseTarget.transform.baseVal const tlist = getTransformList(mouseTarget)
// consolidate transforms using standard SVG but keep the transformation used for the move/scale // consolidate transforms using standard SVG but keep the transformation used for the move/scale
if (tlist.numberOfItems > 1) { if (tlist.numberOfItems > 1) {
const firstTransform = tlist.getItem(0) const firstTransform = tlist.getItem(0)
@ -1060,7 +1060,7 @@ const mouseDownEvent = (evt) => {
// a transform to use for its translate // a transform to use for its translate
for (const selectedElement of selectedElements) { for (const selectedElement of selectedElements) {
if (!selectedElement) { continue } if (!selectedElement) { continue }
const slist = selectedElement.transform?.baseVal const slist = getTransformList(selectedElement)
if (slist.numberOfItems) { if (slist.numberOfItems) {
slist.insertItemBefore(svgRoot.createSVGTransform(), 0) slist.insertItemBefore(svgRoot.createSVGTransform(), 0)
} else { } else {

View File

@ -7,17 +7,17 @@
*/ */
/** /**
* @typedef {PlainObject} module:math.AngleCoord45 * @typedef {PlainObject} module:math.AngleCoord45
* @property {Float} x - The angle-snapped x value * @property {Float} x - The angle-snapped x value
* @property {Float} y - The angle-snapped y value * @property {Float} y - The angle-snapped y value
* @property {Integer} a - The angle at which to snap * @property {Integer} a - The angle at which to snap
*/ */
/** /**
* @typedef {PlainObject} module:math.XYObject * @typedef {PlainObject} module:math.XYObject
* @property {Float} x * @property {Float} x
* @property {Float} y * @property {Float} y
*/ */
import { NS } from './namespaces.js' import { NS } from './namespaces.js'
@ -35,20 +35,35 @@ const svg = document.createElementNS(NS.SVG, 'svg')
* @param {Float} y - Float representing the y coordinate * @param {Float} y - Float representing the y coordinate
* @param {SVGMatrix} m - Matrix object to transform the point with * @param {SVGMatrix} m - Matrix object to transform the point with
* @returns {module:math.XYObject} An x, y object representing the transformed point * @returns {module:math.XYObject} An x, y object representing the transformed point
*/ */
export const transformPoint = function (x, y, m) { export const transformPoint = function (x, y, m) {
return { x: m.a * x + m.c * y + m.e, y: m.b * x + m.d * y + m.f } return { x: m.a * x + m.c * y + m.e, y: m.b * x + m.d * y + m.f }
} }
export const getTransformList = (elem) => {
if (elem.transform) {
return elem.transform?.baseVal
}
if (elem.gradientTransform) {
return elem.gradientTransform?.baseVal
}
if (elem.patternTransform) {
return elem.patternTransform?.baseVal
}
console.warn('no transform list found - check browser version', elem)
}
/** /**
* Helper function to check if the matrix performs no actual transform * Helper function to check if the matrix performs no actual transform
* (i.e. exists for identity purposes). * (i.e. exists for identity purposes).
* @function module:math.isIdentity * @function module:math.isIdentity
* @param {SVGMatrix} m - The matrix object to check * @param {SVGMatrix} m - The matrix object to check
* @returns {boolean} Indicates whether or not the matrix is 1,0,0,1,0,0 * @returns {boolean} Indicates whether or not the matrix is 1,0,0,1,0,0
*/ */
export const isIdentity = function (m) { export const isIdentity = function (m) {
return (m.a === 1 && m.b === 0 && m.c === 0 && m.d === 1 && m.e === 0 && m.f === 0) return (
m.a === 1 && m.b === 0 && m.c === 0 && m.d === 1 && m.e === 0 && m.f === 0
)
} }
/** /**
@ -57,18 +72,30 @@ export const isIdentity = function (m) {
* @function module:math.matrixMultiply * @function module:math.matrixMultiply
* @param {...SVGMatrix} args - Matrix objects to multiply * @param {...SVGMatrix} args - Matrix objects to multiply
* @returns {SVGMatrix} The matrix object resulting from the calculation * @returns {SVGMatrix} The matrix object resulting from the calculation
*/ */
export const matrixMultiply = function (...args) { export const matrixMultiply = function (...args) {
const m = args.reduceRight((prev, m1) => { const m = args.reduceRight((prev, m1) => {
return m1.multiply(prev) return m1.multiply(prev)
}) })
if (Math.abs(m.a) < NEAR_ZERO) { m.a = 0 } if (Math.abs(m.a) < NEAR_ZERO) {
if (Math.abs(m.b) < NEAR_ZERO) { m.b = 0 } m.a = 0
if (Math.abs(m.c) < NEAR_ZERO) { m.c = 0 } }
if (Math.abs(m.d) < NEAR_ZERO) { m.d = 0 } if (Math.abs(m.b) < NEAR_ZERO) {
if (Math.abs(m.e) < NEAR_ZERO) { m.e = 0 } m.b = 0
if (Math.abs(m.f) < NEAR_ZERO) { m.f = 0 } }
if (Math.abs(m.c) < NEAR_ZERO) {
m.c = 0
}
if (Math.abs(m.d) < NEAR_ZERO) {
m.d = 0
}
if (Math.abs(m.e) < NEAR_ZERO) {
m.e = 0
}
if (Math.abs(m.f) < NEAR_ZERO) {
m.f = 0
}
return m return m
} }
@ -78,29 +105,33 @@ export const matrixMultiply = function (...args) {
* @function module:math.hasMatrixTransform * @function module:math.hasMatrixTransform
* @param {SVGTransformList} [tlist] - The transformlist to check * @param {SVGTransformList} [tlist] - The transformlist to check
* @returns {boolean} Whether or not a matrix transform was found * @returns {boolean} Whether or not a matrix transform was found
*/ */
export const hasMatrixTransform = function (tlist) { export const hasMatrixTransform = function (tlist) {
if (!tlist) { return false } if (!tlist) {
return false
}
let num = tlist.numberOfItems let num = tlist.numberOfItems
while (num--) { while (num--) {
const xform = tlist.getItem(num) const xform = tlist.getItem(num)
if (xform.type === 1 && !isIdentity(xform.matrix)) { return true } if (xform.type === 1 && !isIdentity(xform.matrix)) {
return true
}
} }
return false return false
} }
/** /**
* @typedef {PlainObject} module:math.TransformedBox An object with the following values * @typedef {PlainObject} module:math.TransformedBox An object with the following values
* @property {module:math.XYObject} tl - The top left coordinate * @property {module:math.XYObject} tl - The top left coordinate
* @property {module:math.XYObject} tr - The top right coordinate * @property {module:math.XYObject} tr - The top right coordinate
* @property {module:math.XYObject} bl - The bottom left coordinate * @property {module:math.XYObject} bl - The bottom left coordinate
* @property {module:math.XYObject} br - The bottom right coordinate * @property {module:math.XYObject} br - The bottom right coordinate
* @property {PlainObject} aabox - Object with the following values: * @property {PlainObject} aabox - Object with the following values:
* @property {Float} aabox.x - Float with the axis-aligned x coordinate * @property {Float} aabox.x - Float with the axis-aligned x coordinate
* @property {Float} aabox.y - Float with the axis-aligned y coordinate * @property {Float} aabox.y - Float with the axis-aligned y coordinate
* @property {Float} aabox.width - Float with the axis-aligned width coordinate * @property {Float} aabox.width - Float with the axis-aligned width coordinate
* @property {Float} aabox.height - Float with the axis-aligned height coordinate * @property {Float} aabox.height - Float with the axis-aligned height coordinate
*/ */
/** /**
* Transforms a rectangle based on the given matrix. * Transforms a rectangle based on the given matrix.
@ -111,12 +142,12 @@ export const hasMatrixTransform = function (tlist) {
* @param {Float} h - Float with the box height * @param {Float} h - Float with the box height
* @param {SVGMatrix} m - Matrix object to transform the box by * @param {SVGMatrix} m - Matrix object to transform the box by
* @returns {module:math.TransformedBox} * @returns {module:math.TransformedBox}
*/ */
export const transformBox = function (l, t, w, h, m) { export const transformBox = function (l, t, w, h, m) {
const tl = transformPoint(l, t, m) const tl = transformPoint(l, t, m)
const tr = transformPoint((l + w), t, m) const tr = transformPoint(l + w, t, m)
const bl = transformPoint(l, (t + h), m) const bl = transformPoint(l, t + h, m)
const br = transformPoint((l + w), (t + h), m) const br = transformPoint(l + w, t + h, m)
const minx = Math.min(tl.x, tr.x, bl.x, br.x) const minx = Math.min(tl.x, tr.x, bl.x, br.x)
const maxx = Math.max(tl.x, tr.x, bl.x, br.x) const maxx = Math.max(tl.x, tr.x, bl.x, br.x)
@ -131,8 +162,8 @@ export const transformBox = function (l, t, w, h, m) {
aabox: { aabox: {
x: minx, x: minx,
y: miny, y: miny,
width: (maxx - minx), width: maxx - minx,
height: (maxy - miny) height: maxy - miny
} }
} }
} }
@ -148,23 +179,28 @@ export const transformBox = function (l, t, w, h, m) {
* @param {Integer} [max] - Optional integer indicating end transform position; * @param {Integer} [max] - Optional integer indicating end transform position;
* defaults to one less than the tlist's `numberOfItems` * defaults to one less than the tlist's `numberOfItems`
* @returns {SVGTransform} A single matrix transform object * @returns {SVGTransform} A single matrix transform object
*/ */
export const transformListToTransform = function (tlist, min, max) { export const transformListToTransform = function (tlist, min, max) {
if (!tlist) { if (!tlist) {
// Or should tlist = null have been prevented before this? // Or should tlist = null have been prevented before this?
return svg.createSVGTransformFromMatrix(svg.createSVGMatrix()) return svg.createSVGTransformFromMatrix(svg.createSVGMatrix())
} }
min = min || 0 min = min || 0
max = max || (tlist.numberOfItems - 1) max = max || tlist.numberOfItems - 1
min = Number.parseInt(min) min = Number.parseInt(min)
max = Number.parseInt(max) max = Number.parseInt(max)
if (min > max) { const temp = max; max = min; min = temp } if (min > max) {
const temp = max
max = min
min = temp
}
let m = svg.createSVGMatrix() let m = svg.createSVGMatrix()
for (let i = min; i <= max; ++i) { for (let i = min; i <= max; ++i) {
// if our indices are out of range, just use a harmless identity matrix // if our indices are out of range, just use a harmless identity matrix
const mtom = (i >= 0 && i < tlist.numberOfItems const mtom =
? tlist.getItem(i).matrix i >= 0 && i < tlist.numberOfItems
: svg.createSVGMatrix()) ? tlist.getItem(i).matrix
: svg.createSVGMatrix()
m = matrixMultiply(m, mtom) m = matrixMultiply(m, mtom)
} }
return svg.createSVGTransformFromMatrix(m) return svg.createSVGTransformFromMatrix(m)
@ -175,9 +211,9 @@ export const transformListToTransform = function (tlist, min, max) {
* @function module:math.getMatrix * @function module:math.getMatrix
* @param {Element} elem - The DOM element to check * @param {Element} elem - The DOM element to check
* @returns {SVGMatrix} The matrix object associated with the element's transformlist * @returns {SVGMatrix} The matrix object associated with the element's transformlist
*/ */
export const getMatrix = (elem) => { export const getMatrix = (elem) => {
const tlist = elem.transform.baseVal const tlist = getTransformList(elem)
return transformListToTransform(tlist).matrix return transformListToTransform(tlist).matrix
} }
@ -190,7 +226,7 @@ export const getMatrix = (elem) => {
* @param {Integer} x2 - Second coordinate's x value * @param {Integer} x2 - Second coordinate's x value
* @param {Integer} y2 - Second coordinate's y value * @param {Integer} y2 - Second coordinate's y value
* @returns {module:math.AngleCoord45} * @returns {module:math.AngleCoord45}
*/ */
export const snapToAngle = (x1, y1, x2, y2) => { export const snapToAngle = (x1, y1, x2, y2) => {
const snap = Math.PI / 4 // 45 degrees const snap = Math.PI / 4 // 45 degrees
const dx = x2 - x1 const dx = x2 - x1
@ -214,8 +250,10 @@ export const snapToAngle = (x1, y1, x2, y2) => {
* @returns {boolean} True if rectangles intersect * @returns {boolean} True if rectangles intersect
*/ */
export const rectsIntersect = (r1, r2) => { export const rectsIntersect = (r1, r2) => {
return r2.x < (r1.x + r1.width) && return (
(r2.x + r2.width) > r1.x && r2.x < r1.x + r1.width &&
r2.y < (r1.y + r1.height) && r2.x + r2.width > r1.x &&
(r2.y + r2.height) > r1.y r2.y < r1.y + r1.height &&
r2.y + r2.height > r1.y
)
} }

View File

@ -11,7 +11,7 @@ import { shortFloat } from './units.js'
import { ChangeElementCommand, BatchCommand } from './history.js' import { ChangeElementCommand, BatchCommand } from './history.js'
import { import {
transformPoint, snapToAngle, rectsIntersect, transformPoint, snapToAngle, rectsIntersect,
transformListToTransform transformListToTransform, getTransformList
} from './math.js' } from './math.js'
import { import {
assignAttributes, getElement, getRotationAngle, snapToGrid, assignAttributes, getElement, getRotationAngle, snapToGrid,
@ -876,7 +876,7 @@ export const pathActionsMethod = (function () {
*/ */
resetOrientation (pth) { resetOrientation (pth) {
if (pth?.nodeName !== 'path') { return false } if (pth?.nodeName !== 'path') { return false }
const tlist = pth.transform.baseVal const tlist = getTransformList(pth)
const m = transformListToTransform(tlist).matrix const m = transformListToTransform(tlist).matrix
tlist.clear() tlist.clear()
pth.removeAttribute('transform') pth.removeAttribute('transform')

View File

@ -7,7 +7,7 @@
*/ */
import { shortFloat } from './units.js' import { shortFloat } from './units.js'
import { transformPoint } from './math.js' import { transformPoint, getTransformList } from './math.js'
import { import {
getRotationAngle, getBBox, getRotationAngle, getBBox,
getRefElem, findDefs, getRefElem, findDefs,
@ -511,7 +511,7 @@ export const recalcRotatedPath = () => {
// now we must set the new transform to be rotated around the new center // now we must set the new transform to be rotated around the new center
const Rnc = svgCanvas.getSvgRoot().createSVGTransform() const Rnc = svgCanvas.getSvgRoot().createSVGTransform()
const tlist = currentPath.transform.baseVal const tlist = getTransformList(currentPath)
Rnc.setRotate((angle * 180.0 / Math.PI), newcx, newcy) Rnc.setRotate((angle * 180.0 / Math.PI), newcx, newcy)
tlist.replaceItem(Rnc, 0) tlist.replaceItem(Rnc, 0)
} }

View File

@ -11,7 +11,7 @@ import { BatchCommand, ChangeElementCommand } from './history.js'
import { remapElement } from './coords.js' import { remapElement } from './coords.js'
import { import {
isIdentity, matrixMultiply, transformPoint, transformListToTransform, isIdentity, matrixMultiply, transformPoint, transformListToTransform,
hasMatrixTransform hasMatrixTransform, getTransformList
} from './math.js' } from './math.js'
import { import {
mergeDeep mergeDeep
@ -55,7 +55,7 @@ export const init = (canvas) => {
*/ */
export const updateClipPath = (attr, tx, ty) => { export const updateClipPath = (attr, tx, ty) => {
const path = getRefElem(attr).firstChild const path = getRefElem(attr).firstChild
const cpXform = path.transform.baseVal const cpXform = getTransformList(path)
const newxlate = svgCanvas.getSvgRoot().createSVGTransform() const newxlate = svgCanvas.getSvgRoot().createSVGTransform()
newxlate.setTranslate(tx, ty) newxlate.setTranslate(tx, ty)
@ -75,7 +75,7 @@ export const recalculateDimensions = (selected) => {
if (!selected) return null if (!selected) return null
const svgroot = svgCanvas.getSvgRoot() const svgroot = svgCanvas.getSvgRoot()
const dataStorage = svgCanvas.getDataStorage() const dataStorage = svgCanvas.getDataStorage()
const tlist = selected.transform?.baseVal const tlist = getTransformList(selected)
// remove any unnecessary transforms // remove any unnecessary transforms
if (tlist?.numberOfItems > 0) { if (tlist?.numberOfItems > 0) {
let k = tlist.numberOfItems let k = tlist.numberOfItems
@ -113,7 +113,6 @@ export const recalculateDimensions = (selected) => {
selected.setAttribute('transform', '') selected.setAttribute('transform', '')
// However, this still next line currently doesn't work at all in Chrome // However, this still next line currently doesn't work at all in Chrome
selected.removeAttribute('transform') selected.removeAttribute('transform')
// selected.transform.baseVal.clear(); // Didn't help for Chrome bug
return null return null
} }
@ -296,7 +295,7 @@ export const recalculateDimensions = (selected) => {
tx = 0 tx = 0
ty = 0 ty = 0
if (child.nodeType === 1) { if (child.nodeType === 1) {
const childTlist = child.transform.baseVal const childTlist = getTransformList(child)
// some children might not have a transform (<metadata>, <defs>, etc) // some children might not have a transform (<metadata>, <defs>, etc)
if (!childTlist) { continue } if (!childTlist) { continue }
@ -413,7 +412,7 @@ export const recalculateDimensions = (selected) => {
oldStartTransform = svgCanvas.getStartTransform() oldStartTransform = svgCanvas.getStartTransform()
svgCanvas.setStartTransform(child.getAttribute('transform')) svgCanvas.setStartTransform(child.getAttribute('transform'))
const childTlist = child.transform?.baseVal const childTlist = getTransformList(child)
// some children might not have a transform (<metadata>, <defs>, etc) // some children might not have a transform (<metadata>, <defs>, etc)
if (childTlist) { if (childTlist) {
const newxlate = svgroot.createSVGTransform() const newxlate = svgroot.createSVGTransform()
@ -460,7 +459,7 @@ export const recalculateDimensions = (selected) => {
if (child.nodeType === 1) { if (child.nodeType === 1) {
oldStartTransform = svgCanvas.getStartTransform() oldStartTransform = svgCanvas.getStartTransform()
svgCanvas.setStartTransform(child.getAttribute('transform')) svgCanvas.setStartTransform(child.getAttribute('transform'))
const childTlist = child.transform?.baseVal const childTlist = getTransformList(child)
if (!childTlist) { continue } if (!childTlist) { continue }
@ -544,7 +543,7 @@ export const recalculateDimensions = (selected) => {
if (child.nodeType === 1) { if (child.nodeType === 1) {
oldStartTransform = svgCanvas.getStartTransform() oldStartTransform = svgCanvas.getStartTransform()
svgCanvas.setStartTransform(child.getAttribute('transform')) svgCanvas.setStartTransform(child.getAttribute('transform'))
const childTlist = child.transform?.baseVal const childTlist = getTransformList(child)
const newxlate = svgroot.createSVGTransform() const newxlate = svgroot.createSVGTransform()
newxlate.setTranslate(tx, ty) newxlate.setTranslate(tx, ty)
if (childTlist.numberOfItems) { if (childTlist.numberOfItems) {
@ -629,7 +628,7 @@ export const recalculateDimensions = (selected) => {
if (attrVal === 'userSpaceOnUse') { if (attrVal === 'userSpaceOnUse') {
// Update the userSpaceOnUse element // Update the userSpaceOnUse element
m = transformListToTransform(tlist).matrix m = transformListToTransform(tlist).matrix
const gtlist = paint.transform.baseVal const gtlist = getTransformList(paint)
const gmatrix = transformListToTransform(gtlist).matrix const gmatrix = transformListToTransform(gtlist).matrix
m = matrixMultiply(m, gmatrix) m = matrixMultiply(m, gmatrix)
const mStr = 'matrix(' + [m.a, m.b, m.c, m.d, m.e, m.f].join(',') + ')' const mStr = 'matrix(' + [m.a, m.b, m.c, m.d, m.e, m.f].join(',') + ')'

View File

@ -8,7 +8,7 @@
import { isWebkit } from '../common/browser.js' import { isWebkit } from '../common/browser.js'
import { getRotationAngle, getBBox, getStrokedBBox } from './utilities.js' import { getRotationAngle, getBBox, getStrokedBBox } from './utilities.js'
import { transformListToTransform, transformBox, transformPoint, matrixMultiply } from './math.js' import { transformListToTransform, transformBox, transformPoint, matrixMultiply, getTransformList } from './math.js'
import { NS } from './namespaces' import { NS } from './namespaces'
let svgCanvas let svgCanvas
@ -130,14 +130,14 @@ export class Selector {
while (currentElt.parentNode) { while (currentElt.parentNode) {
if (currentElt.parentNode && currentElt.parentNode.tagName === 'g' && currentElt.parentNode.transform) { if (currentElt.parentNode && currentElt.parentNode.tagName === 'g' && currentElt.parentNode.transform) {
if (currentElt.parentNode.transform.baseVal.numberOfItems) { if (currentElt.parentNode.transform.baseVal.numberOfItems) {
parentTransformationMatrix = matrixMultiply(transformListToTransform(selected.parentNode.transform.baseVal).matrix, parentTransformationMatrix) parentTransformationMatrix = matrixMultiply(transformListToTransform(getTransformList(selected.parentNode)).matrix, parentTransformationMatrix)
} }
} }
currentElt = currentElt.parentNode currentElt = currentElt.parentNode
} }
// loop and transform our bounding box until we reach our first rotation // loop and transform our bounding box until we reach our first rotation
const tlist = selected.transform.baseVal const tlist = getTransformList(selected)
// combines the parent transformation with that of the selected element if necessary // combines the parent transformation with that of the selected element if necessary
const m = parentTransformationMatrix ? matrixMultiply(parentTransformationMatrix, transformListToTransform(tlist).matrix) : transformListToTransform(tlist).matrix const m = parentTransformationMatrix ? matrixMultiply(parentTransformationMatrix, transformListToTransform(tlist).matrix) : transformListToTransform(tlist).matrix

View File

@ -26,7 +26,8 @@ import {
import { import {
transformPoint, transformPoint,
matrixMultiply, matrixMultiply,
transformListToTransform transformListToTransform,
getTransformList
} from './math.js' } from './math.js'
import { recalculateDimensions } from './recalculate.js' import { recalculateDimensions } from './recalculate.js'
import { isGecko } from '../common/browser.js' import { isGecko } from '../common/browser.js'
@ -207,7 +208,7 @@ const moveSelectedElements = (dx, dy, undoable = true) => {
selectedElements.forEach((selected, i) => { selectedElements.forEach((selected, i) => {
if (selected) { if (selected) {
const xform = svgCanvas.getSvgRoot().createSVGTransform() const xform = svgCanvas.getSvgRoot().createSVGTransform()
const tlist = selected.transform?.baseVal const tlist = getTransformList(selected)
// dx and dy could be arrays // dx and dy could be arrays
if (Array.isArray(dx)) { if (Array.isArray(dx)) {
@ -724,7 +725,7 @@ const pushGroupProperty = (g, undoable) => {
const len = children.length const len = children.length
const xform = g.getAttribute('transform') const xform = g.getAttribute('transform')
const glist = g.transform.baseVal const glist = getTransformList(g)
const m = transformListToTransform(glist).matrix const m = transformListToTransform(glist).matrix
const batchCmd = new BatchCommand('Push group properties') const batchCmd = new BatchCommand('Push group properties')
@ -810,7 +811,7 @@ const pushGroupProperty = (g, undoable) => {
} }
} }
let chtlist = elem.transform?.baseVal let chtlist = getTransformList(elem)
// Don't process gradient transforms // Don't process gradient transforms
if (elem.tagName.includes('Gradient')) { if (elem.tagName.includes('Gradient')) {
@ -963,7 +964,7 @@ const convertToGroup = elem => {
} }
dataStorage.remove(elem, 'gsvg') dataStorage.remove(elem, 'gsvg')
const tlist = elem.transform.baseVal const tlist = getTransformList(elem)
const xform = svgCanvas.getSvgRoot().createSVGTransform() const xform = svgCanvas.getSvgRoot().createSVGTransform()
xform.setTranslate(pt.x, pt.y) xform.setTranslate(pt.x, pt.y)
tlist.appendItem(xform) tlist.appendItem(xform)

View File

@ -13,7 +13,8 @@ import {
import { import {
transformPoint, transformPoint,
transformListToTransform, transformListToTransform,
rectsIntersect rectsIntersect,
getTransformList
} from './math.js' } from './math.js'
import * as hstry from './history.js' import * as hstry from './history.js'
import { getClosest } from '../common/util.js' import { getClosest } from '../common/util.js'
@ -392,7 +393,7 @@ const setRotationAngle = (val, preventUndo) => {
const bbox = getBBox(elem) const bbox = getBBox(elem)
const cx = bbox.x + bbox.width / 2 const cx = bbox.x + bbox.width / 2
const cy = bbox.y + bbox.height / 2 const cy = bbox.y + bbox.height / 2
const tlist = elem.transform.baseVal const tlist = getTransformList(elem)
// only remove the real rotational transform if present (i.e. at index=0) // only remove the real rotational transform if present (i.e. at index=0)
if (tlist.numberOfItems > 0) { if (tlist.numberOfItems > 0) {

View File

@ -23,7 +23,7 @@ import {
getBBox as utilsGetBBox, getBBox as utilsGetBBox,
hashCode hashCode
} from './utilities.js' } from './utilities.js'
import { transformPoint, transformListToTransform } from './math.js' import { transformPoint, transformListToTransform, getTransformList } from './math.js'
import { convertUnit, shortFloat, convertToNum } from './units.js' import { convertUnit, shortFloat, convertToNum } from './units.js'
import { isGecko, isChrome, isWebkit } from '../common/browser.js' import { isGecko, isChrome, isWebkit } from '../common/browser.js'
import * as pathModule from './path.js' import * as pathModule from './path.js'
@ -1269,7 +1269,7 @@ const convertGradientsMethod = (elem) => {
} }
// If has transform, convert // If has transform, convert
const tlist = grad.gradientTransform.baseVal const tlist = getTransformList(grad)
if (tlist?.numberOfItems > 0) { if (tlist?.numberOfItems > 0) {
const m = transformListToTransform(tlist).matrix const m = transformListToTransform(tlist).matrix
const pt1 = transformPoint(gCoords.x1, gCoords.y1, m) const pt1 = transformPoint(gCoords.x1, gCoords.y1, m)

View File

@ -13,7 +13,7 @@ import {
isGecko isGecko
} from '../common/browser.js' } from '../common/browser.js'
import { import {
transformPoint, transformListToTransform transformPoint, transformListToTransform, getTransformList
} from './math.js' } from './math.js'
const { const {
@ -228,7 +228,7 @@ export const changeSelectedAttributeNoUndoMethod = (attr, newValue, elems) => {
// we need to update the rotational transform attribute // we need to update the rotational transform attribute
const angle = getRotationAngle(elem) const angle = getRotationAngle(elem)
if (angle !== 0 && attr !== 'transform') { if (angle !== 0 && attr !== 'transform') {
const tlist = elem.transform?.baseVal const tlist = getTransformList(elem)
let n = tlist.numberOfItems let n = tlist.numberOfItems
while (n--) { while (n--) {
const xform = tlist.getItem(n) const xform = tlist.getItem(n)

View File

@ -9,7 +9,7 @@
import { NS } from './namespaces.js' import { NS } from './namespaces.js'
import { setUnitAttr, getTypeMap } from './units.js' import { setUnitAttr, getTypeMap } from './units.js'
import { import {
hasMatrixTransform, transformListToTransform, transformBox hasMatrixTransform, transformListToTransform, transformBox, getTransformList
} from './math.js' } from './math.js'
import { getClosest, mergeDeep } from '../common/util.js' import { getClosest, mergeDeep } from '../common/util.js'
@ -770,7 +770,7 @@ export const convertToPath = (elem, attrs, svgCanvas) => {
// Reorient if it has a matrix // Reorient if it has a matrix
if (eltrans) { if (eltrans) {
const tlist = path.transform.baseVal const tlist = getTransformList(path)
if (hasMatrixTransform(tlist)) { if (hasMatrixTransform(tlist)) {
svgCanvas.pathActions.resetOrientation(path) svgCanvas.pathActions.resetOrientation(path)
} }
@ -841,7 +841,7 @@ export const getBBoxWithTransform = function (elem, addSVGElementsFromJson, path
return null return null
} }
const tlist = elem.transform.baseVal const tlist = getTransformList(elem)
const angle = getRotationAngleFromTransformList(tlist) const angle = getRotationAngleFromTransformList(tlist)
const hasMatrixXForm = hasMatrixTransform(tlist) const hasMatrixXForm = hasMatrixTransform(tlist)
@ -1029,7 +1029,7 @@ export const getRotationAngleFromTransformList = (tlist, toRad) => {
export let getRotationAngle = (elem, toRad) => { export let getRotationAngle = (elem, toRad) => {
const selected = elem || svgCanvas.getSelectedElements()[0] const selected = elem || svgCanvas.getSelectedElements()[0]
// find the rotation transform (if any) and set it // find the rotation transform (if any) and set it
const tlist = selected.transform?.baseVal const tlist = getTransformList(selected)
return getRotationAngleFromTransformList(tlist, toRad) return getRotationAngleFromTransformList(tlist, toRad)
} }

View File

@ -10,7 +10,8 @@ import commonjs from '@rollup/plugin-commonjs'
import filesize from 'rollup-plugin-filesize' import filesize from 'rollup-plugin-filesize'
// remove existing distribution // remove existing distribution
rimraf('./dist', () => console.info('recreating dist')) await rimraf('./dist')
console.info('recreating dist')
// config for svgedit core module // config for svgedit core module
const config = [{ const config = [{

View File

@ -30,7 +30,8 @@ const extensionDirs = getDirectories('src/editor/extensions')
const dest = ['dist/editor'] const dest = ['dist/editor']
// remove existing distribution // remove existing distribution
rimraf('./dist', () => console.info('recreating dist')) await rimraf('./dist')
console.info('recreating dist')
// config for svgedit core module // config for svgedit core module
const config = [{ const config = [{