svg-parser
Advanced tools
Comparing version 2.0.2 to 2.0.3
(function (global, factory) { | ||
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : | ||
typeof define === 'function' && define.amd ? define(['exports'], factory) : | ||
(factory((global.svgParser = global.svgParser || {}))); | ||
(global = global || self, factory(global.svgParser = {})); | ||
}(this, (function (exports) { 'use strict'; | ||
function getLocator(source, options) { | ||
if (options === void 0) { options = {}; } | ||
var offsetLine = options.offsetLine || 0; | ||
var offsetColumn = options.offsetColumn || 0; | ||
var originalLines = source.split('\n'); | ||
var start = 0; | ||
var lineRanges = originalLines.map(function (line, i) { | ||
var end = start + line.length + 1; | ||
var range = { start: start, end: end, line: i }; | ||
start = end; | ||
return range; | ||
}); | ||
var i = 0; | ||
function rangeContains(range, index) { | ||
return range.start <= index && index < range.end; | ||
} | ||
function getLocation(range, index) { | ||
return { line: offsetLine + range.line, column: offsetColumn + index - range.start, character: index }; | ||
} | ||
function locate(search, startIndex) { | ||
if (typeof search === 'string') { | ||
search = source.indexOf(search, startIndex || 0); | ||
function getLocator(source, options) { | ||
if (options === void 0) { options = {}; } | ||
var offsetLine = options.offsetLine || 0; | ||
var offsetColumn = options.offsetColumn || 0; | ||
var originalLines = source.split('\n'); | ||
var start = 0; | ||
var lineRanges = originalLines.map(function (line, i) { | ||
var end = start + line.length + 1; | ||
var range = { start: start, end: end, line: i }; | ||
start = end; | ||
return range; | ||
}); | ||
var i = 0; | ||
function rangeContains(range, index) { | ||
return range.start <= index && index < range.end; | ||
} | ||
var range = lineRanges[i]; | ||
var d = search >= range.end ? 1 : -1; | ||
while (range) { | ||
if (rangeContains(range, search)) | ||
return getLocation(range, search); | ||
i += d; | ||
range = lineRanges[i]; | ||
function getLocation(range, index) { | ||
return { line: offsetLine + range.line, column: offsetColumn + index - range.start, character: index }; | ||
} | ||
function locate(search, startIndex) { | ||
if (typeof search === 'string') { | ||
search = source.indexOf(search, startIndex || 0); | ||
} | ||
var range = lineRanges[i]; | ||
var d = search >= range.end ? 1 : -1; | ||
while (range) { | ||
if (rangeContains(range, search)) | ||
return getLocation(range, search); | ||
i += d; | ||
range = lineRanges[i]; | ||
} | ||
} | ||
return locate; | ||
} | ||
; | ||
return locate; | ||
} | ||
function locate(source, search, options) { | ||
if (typeof options === 'number') { | ||
throw new Error('locate takes a { startIndex, offsetLine, offsetColumn } object as the third argument'); | ||
function locate(source, search, options) { | ||
if (typeof options === 'number') { | ||
throw new Error('locate takes a { startIndex, offsetLine, offsetColumn } object as the third argument'); | ||
} | ||
return getLocator(source, options)(search, options && options.startIndex); | ||
} | ||
return getLocator(source, options)(search, options && options.startIndex); | ||
} | ||
var validNameCharacters = /[a-zA-Z0-9:_-]/; | ||
var whitespace = /[\s\t\r\n]/; | ||
var quotemark = /['"]/; | ||
var validNameCharacters = /[a-zA-Z0-9:_-]/; | ||
var whitespace = /[\s\t\r\n]/; | ||
var quotemark = /['"]/; | ||
function repeat(str, i) { | ||
var result = ''; | ||
while (i--) result += str; | ||
return result; | ||
} | ||
function repeat(str, i) { | ||
var result = ''; | ||
while (i--) { result += str; } | ||
return result; | ||
} | ||
function parse(source) { | ||
var header = ''; | ||
var stack = []; | ||
function parse(source) { | ||
var header = ''; | ||
var stack = []; | ||
var state = metadata; | ||
var currentElement = null; | ||
var root = null; | ||
var state = metadata; | ||
var currentElement = null; | ||
var root = null; | ||
function error(message) { | ||
var ref = locate(source, i); | ||
var line = ref.line; | ||
var column = ref.column; | ||
var before = source.slice(0, i).replace(/^\t+/, function (match) { return repeat(' ', match.length); }); | ||
var beforeLine = /(^|\n).*$/.exec(before)[0]; | ||
var after = source.slice(i); | ||
var afterLine = /.*(\n|$)/.exec(after)[0]; | ||
function error(message) { | ||
var ref = locate(source, i); | ||
var line = ref.line; | ||
var column = ref.column; | ||
var before = source.slice(0, i); | ||
var beforeLine = /(^|\n).*$/.exec(before)[0].replace(/\t/g, ' '); | ||
var after = source.slice(i); | ||
var afterLine = /.*(\n|$)/.exec(after)[0]; | ||
var snippet = "" + beforeLine + afterLine + "\n" + (repeat(' ', beforeLine.length)) + "^"; | ||
var snippet = "" + beforeLine + afterLine + "\n" + (repeat(' ', beforeLine.length)) + "^"; | ||
throw new Error( | ||
(message + " (" + line + ":" + column + "). If this is valid SVG, it's probably a bug in svg-parser. Please raise an issue at https://github.com/Rich-Harris/svg-parser/issues – thanks!\n\n" + snippet) | ||
); | ||
} | ||
throw new Error( | ||
(message + " (" + line + ":" + column + "). If this is valid SVG, it's probably a bug in svg-parser. Please raise an issue at https://github.com/Rich-Harris/svg-parser/issues – thanks!\n\n" + snippet) | ||
); | ||
} | ||
function metadata() { | ||
while ((i < source.length && source[i] !== '<') || !validNameCharacters.test(source[i + 1])) { | ||
header += source[i++]; | ||
} | ||
function metadata() { | ||
while ((i < source.length && source[i] !== '<') || !validNameCharacters.test(source[i + 1])) { | ||
header += source[i++]; | ||
} | ||
return neutral(); | ||
} | ||
return neutral(); | ||
} | ||
function neutral() { | ||
var text = ''; | ||
while (i < source.length && source[i] !== '<') text += source[i++]; | ||
function neutral() { | ||
var text = ''; | ||
while (i < source.length && source[i] !== '<') { text += source[i++]; } | ||
if (/\S/.test(text)) { | ||
currentElement.children.push({ type: 'text', value: text }); | ||
} | ||
if (/\S/.test(text)) { | ||
currentElement.children.push({ type: 'text', value: text }); | ||
} | ||
if (source[i] === '<') { | ||
return tag; | ||
} | ||
if (source[i] === '<') { | ||
return tag; | ||
} | ||
return neutral; | ||
} | ||
return neutral; | ||
} | ||
function tag() { | ||
var char = source[i]; | ||
function tag() { | ||
var char = source[i]; | ||
if (char === '?') return neutral; // <?xml... | ||
if (char === '?') { return neutral; } // <?xml... | ||
if (char === '!') { | ||
if (source.slice(i + 1, i + 3) === '--') return comment; | ||
if (source.slice(i + 1, i + 8) === '[CDATA[') return cdata; | ||
if (/doctype/i.test(source.slice(i + 1, i + 8))) return neutral; | ||
} | ||
if (char === '!') { | ||
if (source.slice(i + 1, i + 3) === '--') { return comment; } | ||
if (source.slice(i + 1, i + 8) === '[CDATA[') { return cdata; } | ||
if (/doctype/i.test(source.slice(i + 1, i + 8))) { return neutral; } | ||
} | ||
if (char === '/') return closingTag; | ||
if (char === '/') { return closingTag; } | ||
var tagName = getName(); | ||
var tagName = getName(); | ||
var element = { | ||
type: 'element', | ||
tagName: tagName, | ||
properties: {}, | ||
children: [] | ||
}; | ||
var element = { | ||
type: 'element', | ||
tagName: tagName, | ||
properties: {}, | ||
children: [] | ||
}; | ||
if (currentElement) { | ||
currentElement.children.push(element); | ||
} else { | ||
root = element; | ||
} | ||
if (currentElement) { | ||
currentElement.children.push(element); | ||
} else { | ||
root = element; | ||
} | ||
var attribute; | ||
while (i < source.length && (attribute = getAttribute())) { | ||
element.properties[attribute.name] = attribute.value; | ||
} | ||
var attribute; | ||
while (i < source.length && (attribute = getAttribute())) { | ||
element.properties[attribute.name] = attribute.value; | ||
} | ||
var selfClosing = false; | ||
var selfClosing = false; | ||
if (source[i] === '/') { | ||
i += 1; | ||
selfClosing = true; | ||
} | ||
if (source[i] === '/') { | ||
i += 1; | ||
selfClosing = true; | ||
} | ||
if (source[i] !== '>') { | ||
error('Expected >'); | ||
} | ||
if (source[i] !== '>') { | ||
error('Expected >'); | ||
} | ||
if (!selfClosing) { | ||
currentElement = element; | ||
stack.push(element); | ||
} | ||
if (!selfClosing) { | ||
currentElement = element; | ||
stack.push(element); | ||
} | ||
return neutral; | ||
} | ||
return neutral; | ||
} | ||
function comment() { | ||
var index = source.indexOf('-->', i); | ||
if (!~index) error('expected -->'); | ||
function comment() { | ||
var index = source.indexOf('-->', i); | ||
if (!~index) { error('expected -->'); } | ||
i = index + 2; | ||
return neutral; | ||
} | ||
i = index + 2; | ||
return neutral; | ||
} | ||
function cdata() { | ||
var index = source.indexOf(']]>', i); | ||
if (!~index) error('expected ]]>'); | ||
function cdata() { | ||
var index = source.indexOf(']]>', i); | ||
if (!~index) { error('expected ]]>'); } | ||
currentElement.children.push(source.slice(i + 7, index)); | ||
currentElement.children.push(source.slice(i + 7, index)); | ||
i = index + 2; | ||
return neutral; | ||
} | ||
i = index + 2; | ||
return neutral; | ||
} | ||
function closingTag() { | ||
var tagName = getName(); | ||
function closingTag() { | ||
var tagName = getName(); | ||
if (!tagName) error('Expected tag name'); | ||
if (!tagName) { error('Expected tag name'); } | ||
if (tagName !== currentElement.tagName) { | ||
error(("Expected closing tag </" + tagName + "> to match opening tag <" + (currentElement.tagName) + ">")); | ||
} | ||
if (tagName !== currentElement.tagName) { | ||
error(("Expected closing tag </" + tagName + "> to match opening tag <" + (currentElement.tagName) + ">")); | ||
} | ||
if (source[i] !== '>') { | ||
error('Expected >'); | ||
} | ||
if (source[i] !== '>') { | ||
error('Expected >'); | ||
} | ||
stack.pop(); | ||
currentElement = stack[stack.length - 1]; | ||
stack.pop(); | ||
currentElement = stack[stack.length - 1]; | ||
return neutral; | ||
} | ||
return neutral; | ||
} | ||
function getName() { | ||
var name = ''; | ||
while (i < source.length && validNameCharacters.test(source[i])) name += source[i++]; | ||
function getName() { | ||
var name = ''; | ||
while (i < source.length && validNameCharacters.test(source[i])) { name += source[i++]; } | ||
return name; | ||
} | ||
return name; | ||
} | ||
function getAttribute() { | ||
if (!whitespace.test(source[i])) return null; | ||
allowSpaces(); | ||
function getAttribute() { | ||
if (!whitespace.test(source[i])) { return null; } | ||
allowSpaces(); | ||
var name = getName(); | ||
if (!name) return null; | ||
var name = getName(); | ||
if (!name) { return null; } | ||
var value = true; | ||
var value = true; | ||
allowSpaces(); | ||
if (source[i] === '=') { | ||
i += 1; | ||
allowSpaces(); | ||
allowSpaces(); | ||
if (source[i] === '=') { | ||
i += 1; | ||
allowSpaces(); | ||
value = getAttributeValue(); | ||
if (!isNaN(value) && value.trim() !== '') value = +value; // TODO whitelist numeric attributes? | ||
} | ||
value = getAttributeValue(); | ||
if (!isNaN(value) && value.trim() !== '') { value = +value; } // TODO whitelist numeric attributes? | ||
} | ||
return { name: name, value: value }; | ||
} | ||
return { name: name, value: value }; | ||
} | ||
function getAttributeValue() { | ||
return quotemark.test(source[i]) ? getQuotedAttributeValue() : getUnquotedAttributeValue(); | ||
} | ||
function getAttributeValue() { | ||
return quotemark.test(source[i]) ? getQuotedAttributeValue() : getUnquotedAttributeValue(); | ||
} | ||
function getUnquotedAttributeValue() { | ||
var value = ''; | ||
do { | ||
var char = source[i]; | ||
if (char === ' ' || char === '>' || char === '/') { | ||
return value; | ||
} | ||
function getUnquotedAttributeValue() { | ||
var value = ''; | ||
do { | ||
var char = source[i]; | ||
if (char === ' ' || char === '>' || char === '/') { | ||
return value; | ||
} | ||
value += char; | ||
i += 1; | ||
} while (i < source.length); | ||
value += char; | ||
i += 1; | ||
} while (i < source.length); | ||
return value; | ||
} | ||
return value; | ||
} | ||
function getQuotedAttributeValue() { | ||
var quotemark = source[i++]; | ||
function getQuotedAttributeValue() { | ||
var quotemark = source[i++]; | ||
var value = ''; | ||
var escaped = false; | ||
var value = ''; | ||
var escaped = false; | ||
while (i < source.length) { | ||
var char = source[i++]; | ||
if (char === quotemark && !escaped) { | ||
return value; | ||
} | ||
while (i < source.length) { | ||
var char = source[i++]; | ||
if (char === quotemark && !escaped) { | ||
return value; | ||
} | ||
if (char === '\\' && !escaped) { | ||
escaped = true; | ||
} | ||
if (char === '\\' && !escaped) { | ||
escaped = true; | ||
} | ||
value += escaped ? ("\\" + char) : char; | ||
escaped = false; | ||
} | ||
} | ||
value += escaped ? ("\\" + char) : char; | ||
escaped = false; | ||
} | ||
} | ||
function allowSpaces() { | ||
while (i < source.length && whitespace.test(source[i])) i += 1; | ||
} | ||
function allowSpaces() { | ||
while (i < source.length && whitespace.test(source[i])) { i += 1; } | ||
} | ||
var i = metadata.length; | ||
while (i < source.length) { | ||
if (!state) error('Unexpected character'); | ||
state = state(); | ||
i += 1; | ||
} | ||
var i = metadata.length; | ||
while (i < source.length) { | ||
if (!state) { error('Unexpected character'); } | ||
state = state(); | ||
i += 1; | ||
} | ||
if (state !== neutral) { | ||
error('Unexpected end of input'); | ||
} | ||
if (state !== neutral) { | ||
error('Unexpected end of input'); | ||
} | ||
if (root.tagName === 'svg') root.metadata = header; | ||
return { | ||
type: 'root', | ||
children: [root] | ||
}; | ||
} | ||
if (root.tagName === 'svg') { root.metadata = header; } | ||
return { | ||
type: 'root', | ||
children: [root] | ||
}; | ||
} | ||
exports.parse = parse; | ||
exports.parse = parse; | ||
Object.defineProperty(exports, '__esModule', { value: true }); | ||
Object.defineProperty(exports, '__esModule', { value: true }); | ||
}))); | ||
//# sourceMappingURL=svg-parser.umd.js.map |
{ | ||
"name": "svg-parser", | ||
"version": "2.0.2", | ||
"version": "2.0.3", | ||
"description": "Create a JSON-friendly object from an SVG string", | ||
"main": "dist/svg-parser.umd.js", | ||
"jsnext:main": "dist/svg-parser.es.js", | ||
"module": "dist/svg-parser.es.js", | ||
"jsnext:main": "dist/svg-parser.esm.js", | ||
"module": "dist/svg-parser.esm.js", | ||
"files": [ | ||
@@ -14,3 +14,3 @@ "dist", | ||
"test": "mocha", | ||
"build": "rollup -c", | ||
"build": "rm -rf dist && rollup -c", | ||
"pretest": "npm run build", | ||
@@ -42,2 +42,4 @@ "prepublish": "npm run lint && npm test", | ||
"devDependencies": { | ||
"@rollup/plugin-buble": "^0.21.0", | ||
"@rollup/plugin-node-resolve": "^7.0.0", | ||
"eslint": "^3.2.2", | ||
@@ -47,7 +49,5 @@ "locate-character": "^2.0.5", | ||
"prettier": "^1.18.2", | ||
"rollup": "^0.34.7", | ||
"rollup-plugin-buble": "^0.12.1", | ||
"rollup-plugin-node-resolve": "^2.0.0", | ||
"rollup": "^1.29.0", | ||
"source-map-support": "^0.4.2" | ||
} | ||
} |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
48540
447
1