Hi,
Here I am trying to visualize a SVG figure generic enough to cover
many other SVG figures. Currently I use the SVG logo:
https://upload.wikimedia.org/wikipedia/commons/0/02/SVG_logo.svg which
contains SVG paths, rect, circles and polygons.
First I tried to parse with the Athens-SVG included in Pharo 6.1:
AthensSceneView new
scene: (AthensSVGConverter fromURL:
'https://upload.wikimedia.org/wikipedia/commons/0/02/SVG_logo.svg');
openInWindow
but fails with: "Error: cannot resolve url:
http://www.w3.org/Graphics/SVG/"
So I quickly switched to Roassal SVG.
The SVG examples does not cover for example specified colors but they
are replaced with Color random.
Also using this expression it seems there is no support for "circle" type.
RTSVGEntity withAllSubclasses
collect: [ : s | s hasSubclasses not ifTrue: [ s new type ] ]
as: Set) reject: #isNil
with that in mind I tried to parse the SVG logo with the following
terrible script which only support paths but can read named or hex
colors
| tree view |
view := RTView new.
tree := XMLDOMParser parseURL:
'https://upload.wikimedia.org/wikipedia/commons/0/02/SVG_logo.svg'.
view := RTView new.
(tree allElementsSelect: [ :e | e isElementNamed: #path ])
elementsDo: [ : node |
| elem color colorAtt |
color := (node includesAttribute: 'fill')
ifTrue: [ Color fromHexString: (((colorAtt := node
attributeAt: 'fill') beginsWith: '#') ifTrue: [ colorAtt allButFirst ]
ifFalse: [ colorAtt ]) ]
ifFalse: [ Color random ].
elem := (RTSVGPath new
path: (node attributeAt: 'd');
fillColor: color;
scale: 1) element model: (node attributeAt: 'title').
elem @ RTPopup.
view add: elem ].
view inspect
However adding support for circle, rect, polygon, etc. is becoming too
complicated this way :)
Is there some other recommended way how to approach this?
Cheers,
Hernán