
Research
Security News
The Growing Risk of Malicious Browser Extensions
Socket researchers uncover how browser extensions in trusted stores are used to hijack sessions, redirect traffic, and manipulate user behavior.
svg-path-parser
Advanced tools
An SVG path parser, originally built from the PEG.js grammar specified here, published as an NPM module.
Grammar originally written by Gavin Kistner.
require('svg-path-parser')(d)
Takes an SVG path string. The following code…
var parseSVG = require('svg-path-parser');
var d='M3,7 5-6 L1,7 1e2-.4 m-10,10 l10,0 \
V27 89 H23 v10 h10 \
C33,43 38,47 43,47 c0,5 5,10 10,10 \
S63,67 63,67 s-10,10 10,10 \
Q50,50 73,57 q20,-5 0,-10 \
T70,40 t0,-15 \
A5,5 45 1,0 40,20 a5,5 20 0,1 -10-10 Z';
console.log(parseSVG(d));
…will yield an array of commands that define the path, like so:
[ { code:'M', command:'moveto', x:3, y:7 },
{ code:'L', command:'lineto', x:5, y:-6 },
{ code:'L', command:'lineto', x:1, y:7 },
{ code:'L', command:'lineto', x:100, y:-0.4 },
{ code:'m', command:'moveto', relative:true, x:-10, y:10 },
{ code:'l', command:'lineto', relative:true, x:10, y:0 },
{ code:'V', command:'vertical lineto', y:27 },
{ code:'V', command:'vertical lineto', y:89 },
{ code:'H', command:'horizontal lineto', x:23 },
{ code:'v', command:'vertical lineto', relative:true, y:10 },
{ code:'h', command:'horizontal lineto', relative:true, x:10 },
{ code:'C', command:'curveto', x1:33, y1:43, x2:38, y2:47, x:43, y:47 },
{ code:'c', command:'curveto', relative:true, x1:0, y1:5, x2:5, y2:10, x:10, y:10 },
{ code:'S', command:'smooth curveto', x2:63, y2:67, x:63, y:67 },
{ code:'s', command:'smooth curveto', relative:true, x2:-10, y2:10, x:10, y:10 },
{ code:'Q', command:'quadratic curveto', x1:50, y1:50, x:73, y:57 },
{ code:'q', command:'quadratic curveto', relative:true, x1:20, y1:-5, x:0, y:-10 },
{ code:'T', command:'smooth quadratic curveto', x:70, y:40 },
{ code:'t', command:'smooth quadratic curveto', relative:true, x:0, y:-15 },
{ code:'A', command:'elliptical arc', rx:5, ry:5, xAxisRotation:45, largeArc:true, sweep:false, x:40, y:20 },
{ code:'a', command:'elliptical arc', relative:true, rx:5, ry:5, xAxisRotation:20, largeArc:false, sweep:true, x:-10, y:-10 },
{ code:'Z', command:'closepath' } ]
Alternatively, from version 1.1 on, the module exports multiple functions that you can separately use:
const {parseSVG, makeAbsolute} = require('svg-path-parser');
Version 1.1 adds the ability to convert an array of path commands into their absolute-coordinate equivalents. This modifies the parsed command objects in place, and also returns the array of commands. Continuing the example above:
const {parseSVG, makeAbsolute} = require('svg-path-parser');
const commands = parseSVG(d);
makeAbsolute(commands); // Note: mutates the commands in place!
console.log(commands);
[ { code:'M', command:'moveto', x0:0, y0:0 x:3, y:7 },
{ code:'L', command:'lineto', x0:3, y0:7 x:5, y:-6 },
{ code:'L', command:'lineto', x0:5, y0:-6 x:1, y:7 },
{ code:'L', command:'lineto', x0:1, y0:7 x:100, y:-0.4 },
{ code:'M', command:'moveto', x0:100, y0:-0.4 x:90, y:9.6 },
{ code:'L', command:'lineto', x0:90, y0:9.6 x:100, y:9.6 },
{ code:'V', command:'vertical lineto', x0:100, y0:9.6, x:100, y:27 },
{ code:'V', command:'vertical lineto', x0:100, y0:27, x:100, y:89 },
{ code:'H', command:'horizontal lineto', x0:100, y0:89, x:23, y:89 },
{ code:'V', command:'vertical lineto', x0:23, y0:89, y:99, x:23 },
{ code:'H', command:'horizontal lineto', x0:23, y0:99, x:33, y:99 },
{ code:'C', command:'curveto', x0:33, y0:99 x1:33, y1:43, x2:38, y2:47, x:43, y:47 },
{ code:'C', command:'curveto', x0:43, y0:47 x1:43, y1:52, x2:48, y2:57, x:53, y:57 },
{ code:'S', command:'smooth curveto', x0:53, y0:57 x2:63, y2:67, x:63, y:67 },
{ code:'S', command:'smooth curveto', x0:63, y0:67 x2:53, y2:77, x:73, y:77 },
{ code:'Q', command:'quadratic curveto', x0:73, y0:77 x1:50, y1:50, x:73, y:57 },
{ code:'Q', command:'quadratic curveto', x0:73, y0:57 x1:93, y1:52, x:73, y:47 },
{ code:'T', command:'smooth quadratic curveto', x0:73, y0:47 x:70, y:40 },
{ code:'T', command:'smooth quadratic curveto', x0:70, y0:40 x:70, y:25 },
{ code:'A', command:'elliptical arc', x0:70, y0:25 rx:5, ry:5, xAxisRotation:45, largeArc:true, sweep:false, x:40, y:20 },
{ code:'A', command:'elliptical arc', x0:40, y0:20 rx:5, ry:5, xAxisRotation:20, largeArc:false, sweep:true, x:30, y:10 },
{ code:'Z', command:'closepath', x0:30, y0:10, x:90, y:9.6 } ]
In addition to converting all commands to absolute coordinates, the makeAbsolute
function ensures that:
x0
and y0
properties showing the start point for the command.x
and y
properties showing the finish point for the command.
H
, V
, and Z
commands equivalent to an L
command.makeAbsolute(cmds)
..x
) are no longer in a .args
array of values, but are instead part
of the command object itself.moveto
command is always absolute.This library is released under an MIT-style license. That generally means that you are free to do almost anything you want with it as long as you give a bit of credit where credit is due. See the LICENSE file included for the actual legal limitations.
FAQs
A parser for SVG's path syntax
The npm package svg-path-parser receives a total of 61,423 weekly downloads. As such, svg-path-parser popularity was classified as popular.
We found that svg-path-parser demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 2 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket researchers uncover how browser extensions in trusted stores are used to hijack sessions, redirect traffic, and manipulate user behavior.
Research
Security News
An in-depth analysis of credential stealers, crypto drainers, cryptojackers, and clipboard hijackers abusing open source package registries to compromise Web3 development environments.
Security News
pnpm 10.12.1 introduces a global virtual store for faster installs and new options for managing dependencies with version catalogs.