--!parent
 
 
 
-- ************************************************************************
 
-- SVG Exporter
 
--
 
-- @author Valentin Schmidt
 
-- @version 0.1
 
-- @requires xtra "FileIO", xtra "Shell", xtra "swfExport", swf2svg.exe
 
-- ************************************************************************
 
 
 
property _fx
 
property _sx
 
property _tmp_dir
 
 
 
----------------------------------------
 
-- @constructor
 
----------------------------------------
 
on new (me)
 
    me._fx = xtra("FileIO").new()
 
    me._sx = xtra("Shell").new()
 
    me._tmp_dir = me._sx.shell_getEnvVar("TMP")
 
    return me
 
end
 
 
 
----------------------------------------
 
-- Exports vector shape as SVG
 
-- @param {member} vs_mem - the vector shape as memberRef
 
-- @param {string} svg_file - the SVG file
 
-- @return {integer} success - TRUE or error code<0
 
----------------------------------------
 
on exportSvg (me, vs_mem, svg_file)
 
    if ilk(vs_mem)<>#member or ilk(svg_file)<>#string then return -1 -- wrong arguments
 
    if vs_mem.type<>#vectorShape then return -2 -- wrong member type
 
    
 
    q = QUOTE
 
    
 
    -- export vector shape as SWF in TMP
 
    tmp_name = me._tmp_dir & "\" & random(9999) 
 
    ok = exportSWF(vs_mem, tmp_name & ".swf")
 
    if not ok then return -3 -- failed to export swf
 
    
 
    -- run swf2svg.exe
 
    swf_file = tmp_name & ".swf"
 
    if swf_file contains SPACE then swf_file = q&swf_file&q
 
    props = [:]
 
    props["directory"] = me._tmp_dir
 
    props["show_cmd"] = 0
 
    props["wait"] = 1
 
    props["parameters"] = swf_file & " --nodots"
 
    exit_code = me._sx.shell_execex(_movie.path & "bin\swf2svg.exe", props) 
 
    if exit_code<>0 then
 
        res = -4 -- swf2svg.exe failed
 
    else
 
        -- read the SVG
 
        svg_data = me._getString(tmp_name & ".svg")
 
        if not stringP(svg_data) then
 
            res = -5 -- failed to read temporary svg
 
        else
 
            -- remove <defs> and </defs>
 
            svg_data = me._replace("<defs>", "", svg_data)
 
            svg_data = me._replace("</defs>", "", svg_data)
 
            
 
            -- translate to center
 
            w = vs_mem.width/2 + (vs_mem.width mod 2)
 
            h = vs_mem.height/2 + (vs_mem.height mod 2)
 
            t = " transform="&q&"translate("&w&&h&")"&q
 
            svg_data = me._replace("<g id="&q&"shape1"&q&">", "<g id="&q&"shape1"&q&t&">", svg_data)
 
            
 
            -- save as new file
 
            ok = me._putString(svg_file, svg_data)
 
            if not ok then
 
                res = -6 -- failed to write final svg
 
            else
 
                res = TRUE
 
            end if
 
        end if
 
    end if
 
    
 
    -- delete temporary files
 
    me._delete(tmp_name & ".swf")
 
    me._delete(tmp_name & ".svg")
 
    me._delete(me._tmp_dir & "\details.svg")
 
    
 
    return res
 
end
 
 
 
----------------------------------------
 
-- @private
 
----------------------------------------
 
on _getString (me, tFile)
 
    me._fx.openFile(tFile, 1)
 
    err = me._fx.status()
 
    if (err) then return FALSE
 
    ret = me._fx.readFile()
 
    me._fx.closeFile()
 
    return ret
 
end
 
 
 
----------------------------------------
 
-- @private
 
----------------------------------------
 
on _putString (me, tFile, tString)
 
    me._fx.openFile(tFile, 2)
 
    err = me._fx.status()
 
    if not (err) then me._fx.delete()
 
    else if (err and not (err = -37)) then return FALSE
 
    me._fx.createFile(tFile)
 
    err = me._fx.status()
 
    if (err) then return FALSE
 
    me._fx.openFile(tFile, 2)
 
    err = me._fx.status()
 
    if (err) then return FALSE
 
    me._fx.writeString(tString)
 
    me._fx.closeFile()
 
    return TRUE
 
end
 
 
 
----------------------------------------
 
-- @private
 
----------------------------------------
 
on _delete (me, tFile)
 
    me._fx.openFile(tFile, 0)
 
    err = me._fx.status()
 
    if not (err) then err = me._fx.delete()
 
    return (err=0)
 
end
 
 
 
----------------------------------------
 
-- @private
 
----------------------------------------
 
on _replace (me, stringToFind, stringToInsert, input)
 
    output = ""
 
    findLen = stringToFind.length - 1
 
    repeat while true
 
        currOffset = offset(stringToFind, input)
 
        if currOffset=0 then exit repeat
 
        put input.char [1..currOffset] after output
 
        delete the last char of output
 
        put stringToInsert after output
 
        delete input.char [1.. (currOffset + findLen)]
 
    end repeat
 
    put input after output
 
    return output
 
end