mirror of
https://github.com/scratchfoundation/paper.js.git
synced 2025-01-07 13:22:07 -05:00
Restructure SVGImporter code a bit.
This commit is contained in:
parent
d52fff7425
commit
118a02bf05
1 changed files with 33 additions and 27 deletions
|
@ -27,6 +27,27 @@
|
||||||
*/
|
*/
|
||||||
var SvgImporter = this.SvgImporter = new function() {
|
var SvgImporter = this.SvgImporter = new function() {
|
||||||
|
|
||||||
|
// Define a couple of helper functions to easily read values from SVG
|
||||||
|
// objects, dealing with baseVal, and item lists.
|
||||||
|
// index is option, and if passed, causes a lookup in a list.
|
||||||
|
|
||||||
|
function getValue(svg, key, index) {
|
||||||
|
var base = svg[key].baseVal;
|
||||||
|
return index !== undefined
|
||||||
|
? index < base.numberOfItems ? base.getItem(index).value || 0 : 0
|
||||||
|
: base.value || 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getPoint(svg, x, y, index) {
|
||||||
|
return Point.create(getValue(svg, x, index), getValue(svg, y, index));
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSize(svg, w, h, index) {
|
||||||
|
return Size.create(getValue(svg, w, index), getValue(svg, h, index));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Define importer functions for various SVG node types
|
||||||
|
|
||||||
function importGroup(svg) {
|
function importGroup(svg) {
|
||||||
var group = new Group(),
|
var group = new Group(),
|
||||||
nodes = svg.childNodes;
|
nodes = svg.childNodes;
|
||||||
|
@ -53,21 +74,6 @@ var SvgImporter = this.SvgImporter = new function() {
|
||||||
return poly;
|
return poly;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getValue(svg, key, index) {
|
|
||||||
var base = svg[key].baseVal;
|
|
||||||
return index !== undefined
|
|
||||||
? index < base.numberOfItems ? base.getItem(index).value || 0 : 0
|
|
||||||
: base.value || 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getPoint(svg, x, y, index) {
|
|
||||||
return Point.create(getValue(svg, x, index), getValue(svg, y, index));
|
|
||||||
}
|
|
||||||
|
|
||||||
function getSize(svg, w, h, index) {
|
|
||||||
return Size.create(getValue(svg, w, index), getValue(svg, h, index));
|
|
||||||
}
|
|
||||||
|
|
||||||
var importers = {
|
var importers = {
|
||||||
g: importGroup,
|
g: importGroup,
|
||||||
svg: importGroup,
|
svg: importGroup,
|
||||||
|
@ -214,7 +220,7 @@ var SvgImporter = this.SvgImporter = new function() {
|
||||||
|
|
||||||
symbol: function(svg) {
|
symbol: function(svg) {
|
||||||
var item = importGroup(svg);
|
var item = importGroup(svg);
|
||||||
importAttributesAndStyles(svg, item);
|
applyAttributesAndStyles(svg, item);
|
||||||
// TODO: We're returning a symbol. How to handle this?
|
// TODO: We're returning a symbol. How to handle this?
|
||||||
return new Symbol(item);
|
return new Symbol(item);
|
||||||
}
|
}
|
||||||
|
@ -227,29 +233,29 @@ var SvgImporter = this.SvgImporter = new function() {
|
||||||
* @param {SVGSVGElement} svg an SVG node to read style and attributes from.
|
* @param {SVGSVGElement} svg an SVG node to read style and attributes from.
|
||||||
* @param {Item} item the item to apply the style and attributes to.
|
* @param {Item} item the item to apply the style and attributes to.
|
||||||
*/
|
*/
|
||||||
function importAttributesAndStyles(svg, item) {
|
function applyAttributesAndStyles(svg, item) {
|
||||||
for (var i = 0, l = svg.style.length; i < l; i++) {
|
for (var i = 0, l = svg.style.length; i < l; i++) {
|
||||||
var name = svg.style[i];
|
var name = svg.style[i];
|
||||||
var cssName = name.replace(/-(.)/g, function(match, p) {
|
var cssName = name.replace(/-(.)/g, function(match, p) {
|
||||||
return p.toUpperCase();
|
return p.toUpperCase();
|
||||||
});
|
});
|
||||||
applyAttributeOrStyle(name, svg.style[cssName], item, svg);
|
applyAttributeOrStyle(svg, item, name, svg.style[cssName]);
|
||||||
}
|
}
|
||||||
for (var i = 0, l = svg.attributes.length; i < l; i++) {
|
for (var i = 0, l = svg.attributes.length; i < l; i++) {
|
||||||
var attr = svg.attributes[i];
|
var attr = svg.attributes[i];
|
||||||
applyAttributeOrStyle(attr.name, attr.value, item, svg);
|
applyAttributeOrStyle(svg, item, attr.name, attr.value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parses an SVG style attibute and applies it to a Paper.js item.
|
* Parses an SVG style attibute and applies it to a Paper.js item.
|
||||||
*
|
*
|
||||||
|
* @param {SVGSVGElement} svg an SVG node
|
||||||
|
* @param {Item} item the item to apply the style or attribute to.
|
||||||
* @param {String} name an SVG style name
|
* @param {String} name an SVG style name
|
||||||
* @param value the value of the SVG style
|
* @param value the value of the SVG style
|
||||||
* @param {Item} item the item to apply the style or attribute to.
|
|
||||||
* @param {SVGSVGElement} svg an SVG node
|
|
||||||
*/
|
*/
|
||||||
function applyAttributeOrStyle(name, value, item, svg) {
|
function applyAttributeOrStyle(svg, item, name, value) {
|
||||||
if (!value) {
|
if (!value) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -293,7 +299,7 @@ var SvgImporter = this.SvgImporter = new function() {
|
||||||
item.miterLimit = parseFloat(value, 10);
|
item.miterLimit = parseFloat(value, 10);
|
||||||
break;
|
break;
|
||||||
case 'transform':
|
case 'transform':
|
||||||
applyTransform(item, svg);
|
applyTransform(svg, item);
|
||||||
break;
|
break;
|
||||||
case 'opacity':
|
case 'opacity':
|
||||||
item.opacity = parseFloat(value, 10);
|
item.opacity = parseFloat(value, 10);
|
||||||
|
@ -317,7 +323,7 @@ var SvgImporter = this.SvgImporter = new function() {
|
||||||
text.style.font = value;
|
text.style.font = value;
|
||||||
for (var i = 0; i < text.style.length; i++) {
|
for (var i = 0; i < text.style.length; i++) {
|
||||||
var n = text.style[i];
|
var n = text.style[i];
|
||||||
applyAttributeOrStyle(n, text.style[n], item, svg);
|
applyAttributeOrStyle(svg, item, n, text.style[n]);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'font-family':
|
case 'font-family':
|
||||||
|
@ -335,10 +341,10 @@ var SvgImporter = this.SvgImporter = new function() {
|
||||||
/**
|
/**
|
||||||
* Applies the transformations specified on the SVG node to a Paper.js item
|
* Applies the transformations specified on the SVG node to a Paper.js item
|
||||||
*
|
*
|
||||||
* @param {Item} item a Paper.js item
|
|
||||||
* @param {SVGSVGElement} svg an SVG node
|
* @param {SVGSVGElement} svg an SVG node
|
||||||
|
* @param {Item} item a Paper.js item
|
||||||
*/
|
*/
|
||||||
function applyTransform(item, svg) {
|
function applyTransform(svg, item) {
|
||||||
var transforms = svg.transform.baseVal;
|
var transforms = svg.transform.baseVal;
|
||||||
var transform;
|
var transform;
|
||||||
var matrix = new Matrix();
|
var matrix = new Matrix();
|
||||||
|
@ -398,7 +404,7 @@ var SvgImporter = this.SvgImporter = new function() {
|
||||||
// TODO: importer == null: Not supported yet.
|
// TODO: importer == null: Not supported yet.
|
||||||
var item = importer && importer(svg);
|
var item = importer && importer(svg);
|
||||||
if (item)
|
if (item)
|
||||||
importAttributesAndStyles(svg, item);
|
applyAttributesAndStyles(svg, item);
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue