Thank you for the custom made class CardsSvgWriter I loaded it from
http://smalltalkhub.com/#!/~StephanEggermont/Documentation CardsMorphic-StephanEggermont.57 through the Monticello Browser. BTW Gofer new smalltalkhubUser: 'StephanEggermont' project: 'Documentation' package: 'CardsMorphic'; load. taken from above gives an error message. I understand that there is no menu command yet to do the export so I did CardsSvgWriter newFile: 'cards.svg' on: (CardWall allInstances at: 1) in a playground workspace window. I suggest to include that the context menu. Texts are preserved in the svg file, so search is possible. Fontsize is an issue: in the exported SVG file it is much smaller than in the CardWall panel. Adding a card by just typing the card text and hitting '<ENTER>' would be nice. --Hannes On 6/30/15, Stephan Eggermont <step...@stack.nl> wrote: > The export as SVG is indeed easy. > I've added this helper class to CardsMorphic-StephanEggermont.56 > It is not well-factored, and for now ignores font families. > > A class helper method to directly create a file: > > CardSvgWriter class>newFile: aString on: aCardWall > ^self new write: aCardWall to: (aString asFileReference writeStream ) > > Write a SVG header, the size and then the contents of the cardwall, > finally close the SVG. > > CardSvgWriter>>write: aWall to: aStream > stream := aStream. > stream nextPutAll: self fileHeader. > self fileSized: aWall fullFrame. > stream cr. > aWall cardSpace submorphsDo: [ :column | > self writeColumn: column]. > stream nextPutAll: '</svg>'. > stream close > > SVG is an XML format > > CardSvgWriter>>fileHeader > ^'<?xml version="1.0" standalone="no"?> > <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" > "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> > ' > > Take the SVG size from the CardWall morph. Two namespaces are needed, > the second one to make the images work. > > CardSvgWriter>>fileSized: frame > stream nextPutAll: '<svg xmlns="http://www.w3.org/2000/svg" > xmlns:xlink="http://www.w3.org/1999/xlink" viewBox = "', > (frame left) asString,' ', > (frame top) asString,' ', > (frame width) asString,' ', > (frame height) asString,'" version = "1.1">' > > For each column, write the title and a gray background > > CardSvgWriter>>writeColumn: aColumn > |background| > stream nextPutAll: '<text x="',(aColumn left+2) asString,'" > y="',(aColumn top+2) asString,'" fill="gray" font-size= "11">'. > stream nextPutAll: aColumn title. > stream nextPutAll: '</text>'. > stream cr. > background := aColumn submorphs first. > stream nextPutAll: '<rect x= "',(background left) asString, > '" y="',(background top) asString, > '" width="',(background width) asString, > '" height="',(background height) asString, > '" fill="rgb(250,250,250)" />'. > stream cr. > background submorphsDo: [ :card | self writeCard: card ]. > > for each card, write its components > > CardSvgWriter>>writeCard: aCard > self writeCardRectangle: aCard. > self writeCardText: aCard. > self writeCardImage: aCard > > The rectangle still has hardcoded border and borderColor > > CardSvgWriter>>writeCardRectangle: aCard > stream nextPutAll: '<rect x= "',(aCard left) asString, > '" y="',(aCard top) asString, > '" width="',(aCard width) asString, > '" height="',(aCard height) asString, > '" stroke="','rgb(240,240,240)'"aCard borderColor asHTMLColor", > '" stroke-width="', '1',"aCard borderWidth asString," > '" fill="',aCard color asHTMLColor,'" />'. > stream cr. > > Positioning of text is different in SVG and Morphic. In SVG, > it is the left-bottom, vs left-top in Morphic. > > CardSVGWriter>>writeCardText: aCard > stream nextPutAll: '<text x="',(aCard left+2) asString,'" y="',(aCard > top+12) asString,'" fill="black" font-size= "10">'. > stream nextPutAll: aCard title. > stream nextPutAll: '</text>'. > stream cr. > > The avatars are jpegs. they need to be base64 encoded. > Here they are repeated for each card, they should be > written once and linked. > > CardSVGWriter>writeCardImage: aCard > aCard person ifNotNil: [ > stream nextPutAll: '<image x="',(aCard right-32) asString,'" > y="',(aCard bottom-32) asString,'" width="32" height="32" > xlink:href="data:image/jpg;base64,', > (ZnUtils encodeBase64: (ByteArray streamContents: [:s | > PluginBasedJPEGReadWriter putForm: (AvatarCache default > imageFor: > aCard person) onStream: s])) > ,'"/>'. > stream cr] > >