view data/plugin/action/SvgEditor.py @ 472:8c4c99da678d

SvgEditor: svg-edit adapted to moin-1.9.0
author Reimar Bauer <rb.proj AT googlemail DOT com>
date Sun, 17 Jan 2010 13:55:09 +0100
parents 739789bdac90
children f03ce96a614d
line wrap: on
line source
# -*- coding: utf-8 -*-
"""
    MoinMoin - SvgEditor

    This action is used to call svg-edit, (http://code.google.com/p/svg-edit/) 
    
    svg-edit pre alpha 2.5 is called 
    this action needs moin-1.9 and is currently a mockup for an implementation in moin-2.0

    @copyright: 2009-2010 by MoinMoin:ReimarBauer
    @license: GNU GPL, see COPYING for details.
"""
from MoinMoin import config, wikiutil
from MoinMoin.action import AttachFile, do_show
from MoinMoin.Page import Page

action_name = __name__.split('.')[-1]

def gedit_drawing(self, url, text, **kw):
    # This is called for displaying a drawing image by gui editor.
    _ = self.request.getText
    # TODO: this 'text' argument is kind of superfluous, replace by using alt=... kw arg
    # ToDo: make this clickable for the gui editor
    if 'alt' not in kw or not kw['alt']:
        kw['alt'] = text
    # we force the title here, needed later for html>wiki converter
    kw['title'] = "drawing:%s" % wikiutil.quoteWikinameURL(url)
    pagename, drawing = AttachFile.absoluteName(url, self.page.page_name)
    drawing = wikiutil.taintfilename(drawing)
    drawing_url = AttachFile.getAttachUrl(pagename, drawing, self.request, do='modify')
    if not AttachFile.exists(self.request, pagename, drawing+'.svg'):
        title = _('Create new drawing "%(filename)s (opens in new window)"') % {'filename': drawing}
        img = self.icon('attachimg')  # TODO: we need a new "drawimg" in similar grey style and size
        css = 'nonexistent'

    # ToDo use EmbedObject here 
    
    kw['src'] = drawing + '.svg'
    return self.image(**kw)

def attachment_drawing(self, url, text, **kw):
    # This is called for displaying a clickable drawing image by text_html formatter.
    # XXX text arg is unused!
    _ = self.request.getText
    pagename, drawing = AttachFile.absoluteName(url, self.page.page_name)
    drawing = wikiutil.taintfilename(drawing)
    drawing_url = AttachFile.getAttachUrl(pagename, drawing, self.request, do='modify')
    if not AttachFile.exists(self.request, pagename, drawing):
        title = _('Create new drawing "%(filename)s (opens in new window)"') % {'filename': drawing}
        img = self.icon('attachimg')  # TODO: we need a new "drawimg" in similar grey style and size
        css = 'nonexistent'
        return self.url(1, drawing_url, css=css, title=title) + img + self.url(0)

    title = _('Edit drawing %(filename)s (opens in new window)') % {'filename': self.text(drawing)}
        
    from MoinMoin import macro
    from MoinMoin.parser.text import Parser
    macro.request = self.request
    macro.formatter = self.request.html_formatter
    p = Parser("##\n", self.request)
    m = macro.Macro(p)
    img = m.execute('EmbedObject', u'target=%s' % drawing)
    return self.url(1, drawing_url) + img + self.url(0)

class SvgEditor(object):
    """ svg-edit action """
    def __init__(self, request, pagename, target):
        self._ = request.getText
        self.request = request
        self.pagename = pagename
        self.target = target

    def render_msg(self, msg, msgtype):
        """ Called to display some message (can also be the action form) """
        self.request.theme.add_msg(msg, msgtype)
        do_show(self.pagename, self.request)

    def save(self):
        _ = self._
        pagename = self.pagename
        request = self.request
        if not request.user.may.write(pagename):
            return _('You are not allowed to save a drawing on this page.')

        filecontent = request.values.get('svg_data', '')
        target = request.values.get('target', 'example.svg').strip()
        if filecontent:
            AttachFile._addLogEntry(request, 'ATTDRW', pagename, target)
            # get directory, and possibly create it
            attach_dir = AttachFile.getAttachDir(request, pagename, create=1)
            # save file
            fpath = AttachFile.getFilename(request, pagename, target).encode(config.charset)
            file(fpath, 'w').write(filecontent.decode('base_64'))

 
    def render(self):
        _ = self._
        request = self.request
        pagename = self.pagename
        target = self.target
        url = request.getQualifiedURL()
        htdocs = "%s%s" % (request.cfg.url_prefix_static, '/svg-edit/editor')
        filecontent = ''
        if AttachFile.exists(request, pagename, target):
            fpath = AttachFile.getFilename(request, pagename, target).encode(config.charset)
            filecontent = file(fpath, 'r').readlines()
            filecontent = ''.join(filecontent[1:])
        if filecontent:
             # svg data is saved as xml. at least firefox changes the data by adding closing tags e.g. </rect></circle></circle></circle></rect></svg>
             # this renders then only the first element
             filecontent = "<script>%s</script>" % filecontent
        meta = """
<meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
<meta http-equiv="X-UA-Compatible" content="chrome=1"/>
<link rel="icon" type="image/png" href="%(htdocs)s/images/logo.png">
<link rel="stylesheet" href="%(htdocs)s/jgraduate/css/jPicker-1.0.9.css" type="text/css"/>
<link rel="stylesheet" href="%(htdocs)s/jgraduate/css/jGraduate-0.2.0.css" type="text/css"/>
<link rel="stylesheet" href="%(htdocs)s/svg-editor.css" type="text/css"/>
<link rel="stylesheet" href="%(htdocs)s/spinbtn/JQuerySpinBtn.css" type="text/css"/>
<!-- Development version of script tags: -->
<script type="text/javascript" src="%(htdocs)s/jquery.js"></script>
<script type="text/javascript" src="%(htdocs)s/js-hotkeys/jquery.hotkeys.min.js"></script>
<script type="text/javascript" src="%(htdocs)s/jgraduate/jquery.jgraduate.js"></script>
<script type="text/javascript" src="%(htdocs)s/svgicons/jquery.svgicons.js"></script>
<script type="text/javascript" src="%(htdocs)s/spinbtn/JQuerySpinBtn.js"></script>
<script type="text/javascript" src="%(htdocs)s/locale/locale.js"></script>
<script type="text/javascript" src="%(htdocs)s/svgcanvas.js"></script>
<script type="text/javascript" src="%(htdocs)s/svg-editor.js"></script>

<!-- Release version of script tags: >
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"></script>
<script type="text/javascript" src="%(htdocs)s/js-hotkeys/jquery.hotkeys-0.7.9.js"></script>
<script type="text/javascript" src="%(htdocs)s/jgraduate/jquery.jgraduate.min.js"></script>
<script type="text/javascript" src="%(htdocs)s/spinbtn/JQuerySpinBtn.min.js"></script>
<script type="text/javascript" src="%(htdocs)s/svgcanvas.min.js"></script>
<script type="text/javascript" src="%(htdocs)s/svg-editor.min.js"></script>
script type="text/javascript" src="%(htdocs)s/locale/locale.min.js"></script-->


<!-- always minified scripts -->
<script type="text/javascript" src="%(htdocs)s/jquery-ui/jquery-ui-1.7.2.custom.min.js"></script>
<script type="text/javascript" src="%(htdocs)s/jgraduate/jpicker-1.0.9.min.js"></script>

<!-- feeds -->
<link rel="alternate" type="application/atom+xml" title="SVG-edit General Discussion" href="http://groups.google.com/group/svg-edit/feed/atom_v1_0_msgs.xml" />
<link rel="alternate" type="application/atom+xml" title="SVG-edit Updates (Issues/Fixes/Commits)" href="http://code.google.com/feeds/p/svg-edit/updates/basic" />
""" % {"htdocs": htdocs}

        html = """
<!-- Add script with custom handlers here -->
<body>
<div id="htdocs"><!-- %(htdocs)s/ --></div>
<div id="svg_editor">
<div id="workarea">
<style id="styleoverrides" type="text/css" media="screen" scoped="scoped"></style>
<div id="svgcanvas"></div>
<div id="svgdata">%(filecontent)s</div>
</div>

<div id="sidepanels">
    <div id="layerpanel">
        <h3 id="layersLabel">Layers</h3>
        <fieldset id="layerbuttons">
            <div id="layer_new" class="layer_button"  title="New Layer"></div>
            <div id="layer_delete" class="layer_button"  title="Delete Layer"></div>
            <div id="layer_rename" class="layer_button"  title="Rename Layer"></div>
            <div id="layer_up" class="layer_button"  title="Move Layer Up"></div>
            <div id="layer_down" class="layer_button"  title="Move Layer Down"></div>
        </fieldset>
        
        <table id="layerlist">
            <tr class="layer">
                <td class="layervis"></td>
                <td class="layername">Layer 1</td>
            </tr>
        </table>
        <span id="selLayerLabel">Move elements to:</span>
        <select id="selLayerNames" title="Move selected elements to a different layer" disabled="disabled">
            <option selected="selected" value="layer1">Layer 1</option>
        </select>
    </div>
    <div id="sidepanel_handle" onselectstart="return false;" title="Drag left/right to resize side panel [X]">L a y e r s</div>
</div> 
<div id="logo">
    <a href="http://svg-edit.googlecode.com/" target="_blank" title="SVG-edit Home Page">
    </a>
</div>
<div id="tools_top" class="tools_panel">
    
    <!-- File-like buttons: New, Save, Source -->
    <div id="file_panel">
        <div class="push_button" id="tool_clear" title="New Image [N]"></div>
        
        <div id="fileinputs" class="push_button">
            <div id="tool_open" title="Open Image [O]" ></div>
        </div>
      
        <div class="push_button" id="tool_save" title="Save Image [S]"></div>
        <div class="push_button" id="tool_docprops" title="Document Properties [I]"></div>
        <div class="push_button" id="tool_source" title="Edit Source [U]"></div>
        <div class="tool_button" id="tool_wireframe" title="Wireframe Mode [F]"></div>
    </div>

    <!-- History buttons -->
    <div id="history_panel">
        <div class="tool_sep"></div>
        <div class="push_button tool_button_disabled" id="tool_undo" title="Undo [Z]"></div>
        <div class="push_button tool_button_disabled" id="tool_redo" title="Redo [Y]"></div>
    </div>
    
    <!-- Buttons when a single element is selected -->
    <div id="selected_panel">
        <div class="toolset">
            <div class="tool_sep"></div>
            <div class="push_button" id="tool_clone" title="Clone Element [C]"></div>
            <div class="push_button" id="tool_delete" title="Delete Element [Delete/Backspace]"></div>
            <div class="tool_sep"></div>
            <div class="push_button" id="tool_move_top" title="Move to Top [Shift+Up]"></div>
            <div class="push_button" id="tool_move_bottom" title="Move to Bottom [Shift+Down]"></div>
            <div class="push_button" id="tool_topath" title="Convert to Path"></div>
            <div class="push_button" id="tool_reorient" title="Reorient path"></div>
            <div class="tool_sep"></div>
        </div>
        <div class="toolset">
            <label id="group_opacityLabel" class="selected_tool" for="group_opacity">opac:</label>
            <input id="group_opacity" class="selected_tool" title="Change selected item opacity" size="3" value="100" type="text"/>
            <div id="opacity_dropdown" class="dropdown">
                <button></button>
                <ul>
                    <li class="special"><div id="opac_slider"></div></li>
                    <li>100%% (no transparency)</li>
                    <li>0%%</li>
                    <li>25%%</li>
                    <li>50%%</li>
                    <li>75%%</li>
                    <li>100%%</li>
                </ul>
            </div>
        </div>
        <div class="toolset">
            <label id="angleLabel" class="selected_tool">angle:</label>
            <input id="angle" class="selected_tool" title="Change rotation angle" size="2" value="0" type="text"/>
        </div>
        <div id="xy_panel" class="toolset">
            <label class="selected_tool">x:</label>
            <input id="selected_x" class="selected_tool attr_changer" title="Change X coordinate" size="3" data-attr="x"/>
            <label class="selected_tool">y:</label>
            <input id="selected_y" class="selected_tool attr_changer" title="Change Y coordinate" size="3" data-attr="y"/>
        </div>
    </div>

    <!-- Buttons when multiple elements are selected -->
    <div id="multiselected_panel">
        <div class="tool_sep"></div>
        <div class="push_button" id="tool_clone_multi" title="Clone Elements [C]"></div>
        <div class="push_button" id="tool_delete_multi" title="Delete Selected Elements [Delete/Backspace]"></div>
        <div class="tool_sep"></div>
        <div class="push_button" id="tool_group" title="Group Elements [G]"></div>
        <div class="push_button" id="tool_alignleft" title="Align Left"></div>
        <div class="push_button" id="tool_aligncenter" title="Align Center"></div>
        <div class="push_button" id="tool_alignright" title="Align Right"></div>
        <div class="push_button" id="tool_aligntop" title="Align Top"></div>
        <div class="push_button" id="tool_alignmiddle" title="Align Middle"></div>
        <div class="push_button" id="tool_alignbottom" title="Align Bottom"></div>
        <span id="relativeToLabel" class="selected_tool">relative to:</span>
        <select id="align_relative_to" class="selected_tool" title="Align relative to ...">
        <option id="selected_objects" value="selected">selected objects</option>
        <option id="largest_object" value="largest">largest object</option>
        <option id="smallest_object" value="smallest">smallest object</option>
        <option id="page" value="page">page</option>
        </select>
        <div class="tool_sep"></div>

    </div>

    <div id="g_panel">
        <div class="tool_sep"></div>
        <div class="push_button" id="tool_ungroup" title="Ungroup Elements [G]"></div>
    </div>

    <div id="rect_panel">
        <div class="toolset">
            <label id="rwidthLabel" class="rect_tool">width:</label>
            <input id="rect_width" class="rect_tool attr_changer" title="Change rectangle width" size="3" data-attr="width"/>
            <label id="rheightLabel" class="rect_tool">height:</label>
            <input id="rect_height" class="rect_tool attr_changer" title="Change rectangle height" size="3" data-attr="height"/>
        </div>
        <div class="toolset">
            <label id="cornerRadiusLabel" class="rect_tool">Corner Radius:</label>
            <input id="rect_rx" size="3" value="0" class="rect_tool" type="text" title="Change Rectangle Corner Radius" data-attr="Corner Radius"/>
        </div>    
    </div>

    <div id="image_panel">
    <div class="toolset">
        <label id="iwidthLabel" class="image_tool">width:</label>
        <input id="image_width" class="image_tool attr_changer" title="Change image width" size="3" data-attr="width"/>
        <label id="iheightLabel" class="image_tool">height:</label>
        <input id="image_height" class="image_tool attr_changer" title="Change image height" size="3" data-attr="height"/>
    </div>
    <div class="toolset">
        <label class="image_tool">url:</label>
        <input id="image_url" class="image_tool" type="text" title="Change URL" size="35"/>
        <button id="change_image_url" style="display:none;">Change Image</button>
        <div id="url_notice" title="NOTE: This image cannot be embedded. It will depend on this path to be displayed"></div>
    </div>
  </div>

    <div id="circle_panel">
        <div class="toolset">
            <label class="circle_tool">cx:</label>
            <input id="circle_cx" class="circle_tool attr_changer" title="Change circle's cx coordinate" size="3" data-attr="cx"/>
            <label class="circle_tool">cy:</label>
            <input id="circle_cy" class="circle_tool attr_changer" title="Change circle's cy coordinate" size="3" data-attr="cy"/>
        </div>
        <div class="toolset">
            <label class="circle_tool">r:</label>
            <input id="circle_r" class="circle_tool attr_changer" title="Change circle's radius" size="3" data-attr="r"/>
        </div>
    </div>

    <div id="ellipse_panel">
        <div class="toolset">
            <label class="ellipse_tool">cx:</label>
            <input id="ellipse_cx" class="ellipse_tool attr_changer" title="Change ellipse's cx coordinate" size="3" data-attr="cx"/>
            <label class="ellipse_tool">cy:</label>
            <input id="ellipse_cy" class="ellipse_tool attr_changer" title="Change ellipse's cy coordinate" size="3" data-attr="cy"/>
            </div>
        <div class="toolset">
            <label class="ellipse_tool">rx:</label>
            <input id="ellipse_rx" class="ellipse_tool attr_changer" title="Change ellipse's x radius" size="3" data-attr="rx"/>
            <label class="ellipse_tool">ry:</label>
            <input id="ellipse_ry" class="ellipse_tool attr_changer" title="Change ellipse's y radius" size="3" data-attr="ry"/>
        </div>
    </div>

    <div id="line_panel">
        <div class="toolset">
            <label class="line_tool">x1:</label>
            <input id="line_x1" class="line_tool attr_changer" title="Change line's starting x coordinate" size="3" data-attr="x1"/>
            <label class="line_tool">y1:</label>
            <input id="line_y1" class="line_tool attr_changer" title="Change line's starting y coordinate" size="3" data-attr="y1"/>
        </div>
        <div class="toolset">
            <label class="line_tool">x2:</label>
            <input id="line_x2" class="line_tool attr_changer" title="Change line's ending x coordinate" size="3" data-attr="x2"/>
            <label class="line_tool">y2:</label>
            <input id="line_y2" class="line_tool attr_changer" title="Change line's ending y coordinate" size="3" data-attr="y2"/>
        </div>
    </div>

    <div id="text_panel">
        <div class="toolset">
            <div class="tool_button" id="tool_bold" title="Bold Text [B]"><span></span>B</div>
            <div class="tool_button" id="tool_italic" title="Italic Text [I]"><span></span>i</div>
        </div>
        
        <div class="toolset">
            <input id="font_family" class="text_tool" type="text" title="Change Font Family" size="12"/>
            <div id="font_family_dropdown" class="dropdown">
                <button></button>
                <ul>
                    <li style="font-family:serif">Serif</li>
                    <li style="font-family:sans-serif">Sans-serif</li>
                    <li style="font-family:cursive">Cursive</li>
                    <li style="font-family:fantasy">Fantasy</li>
                    <li style="font-family:monospace">Monospace</li>
                </ul>
            </div>
        </div>

        <div class="toolset">
            <label id="font_sizeLabel" class="text_tool" for="font_size">size:</label>
            <input id="font_size" class="text_tool" title="Change Font Size" size="3" value="0" type="text"/>
        </div>
        <input id="text" class="text_tool" type="text" title="Change text contents" size="35"/>
    </div>
    
    <div id="path_node_panel">
        <div class="tool_sep"></div>
        <div class="tool_button" id="tool_node_link" title="Link Control Points"></div>
        <div class="tool_sep"></div>
        <label class="path_node_tool">x:</label>
        <input id="path_node_x" class="path_node_tool attr_changer" title="Change node's x coordinate" size="3" data-attr="x"/>
        <label class="path_node_tool">y:</label>
        <input id="path_node_y" class="path_node_tool attr_changer" title="Change node's y coordinate" size="3" data-attr="y"/>
        <select id="seg_type" class="path_node_tool" title="Change Segment type">
            <option id="straight_segments" selected="selected" value="4">Straight</option>
            <option id="curve_segments" value="6">Curve</option>
        </select>
        <div class="tool_button" id="tool_node_clone" title="Clone Node"></div>
        <div class="tool_button" id="tool_node_delete" title="Delete Node"></div>
    </div>
    
</div> <!-- tools_top -->

<div id="tools_left" class="tools_panel">
    <div class="tool_button_current" id="tool_select" title="Select Tool [1]"></div>
    <div class="tool_button" id="tool_fhpath" title="Pencil Tool [2]"></div>
    <div class="tool_button" id="tool_line" title="Line Tool [3]"></div>
    <div class="tool_button" id="tools_rect_show" title="Square/Rect Tool [4/Shift+4]"></div>
    <div class="flyout_arrow_horiz"></div>
    <div class="tool_button" id="tools_ellipse_show" title="Ellipse/Circle Tool [5/Shift+5]"></div>
    <div class="flyout_arrow_horiz"></div>
    <div class="tool_button" id="tool_path" title="Path Tool [7]"></div>
    <div class="tool_button" id="tool_text" title="Text Tool [6]"></div>
    <div class="tool_button" id="tool_image" title="Image Tool [8]"></div>
    <div class="tool_button" id="tool_zoom" title="Zoom Tool [Ctrl+Up/Down]"></div>
</div> <!-- tools_left -->

<div id="tools_bottom" class="tools_panel">

    <!-- Zoom buttons -->
    <div id="zoom_panel" class="magic_field">
        <span id="zoomLabel" class="zoom_tool label">zoom:</span>
        <input id="zoom" class="zoom_tool" title="Change zoom level" size="3" value="100" type="text" />
        <div id="zoom_dropdown" class="dropdown">
            <button></button>
            <ul>
                <li>1000%%</li>
                <li>400%%</li>
                <li>200%%</li>
                <li>100%%</li>
                <li>50%%</li>
                <li>25%%</li>
                <li id="fit_to_canvas" data-val="canvas">Fit to canvas</li>
                <li id="fit_to_sel" data-val="selection">Fit to selection</li>
                <li id="fit_to_layer_content" data-val="layer">Fit to layer content</li>
                <li id="fit_to_all" data-val="content">Fit to all content</li>
                <li>100%%</li>
            </ul>
        </div>
        <div class="tool_sep"></div>
    </div>

    <div id="tools_bottom_2">
        <table>
        <tr>
            <td id="fill_tool_bottom" class="label">fill:</td>
            <td><div id="fill_bg"></div><div id="fill_color" class="color_block"  title="Change fill color"></div></td>
            <td colspan="3"><div id="fill_opacity" class="label">100%%</div></td>
        </tr><tr>
            <td id="stroke_tool_bottom" class="label">stroke:</td>
            <td><div id="stroke_bg"></div><div id="stroke_color" class="color_block" title="Change stroke color"></div></td>
            <td><div id="stroke_opacity" class="label">100 %%</div></td>
            <td>
                <input id="stroke_width" title="Change stroke width by 1, shift-click to change by 0.1" size="2" value="5" type="text" data-attr="Stroke Width"/>
            </td>
            <td>
                <select id="stroke_style" title="Change stroke dash style">
                    <option selected="selected" value="none">---</option>
                    <option value="2,2">...</option>
                    <option value="5,5">- -</option>
                    <option value="5,2,2,2">- .</option>
                    <option value="5,2,2,2,2,2">- ..</option>
                </select>
            </td>
        </tr>
        </table>
    </div>

    <div id="tools_bottom_3">
        <div id="palette_holder"><div id="palette" title="Click to change fill color, shift-click to change stroke color"></div></div>
    </div>
    <div id="copyright">Powered by <a href="http://svg-edit.googlecode.com/" target="_blank">SVG-edit v2.5-preAlpha</a></div>
</div>

<!-- hidden divs -->
<div id="color_picker"></div>

<div id="tools_rect" class="tools_flyout">
    <div id="tool_rect" class="tool_flyout_button" title="Rectangle"></div>
    <div id="tool_square" class="tool_flyout_button" title="Square"></div>
    <div id="tool_fhrect" class="tool_flyout_button" title="Free-Hand Rectangle"></div>
</div>

<div id="tools_ellipse" class="tools_flyout">
    <div id="tool_ellipse" class="tool_flyout_button" title="Ellipse"></div>
    <div id="tool_circle" class="tool_flyout_button" title="Circle"></div>
    <div id="tool_fhellipse" class="tool_flyout_button" title="Free-Hand Ellipse"></div>
</div>

</div> <!-- svg_editor -->

<div id="svg_source_editor">
    <div id="svg_source_overlay"></div>
    <div id="svg_source_container">
        <div id="tool_source_back" class="toolbar_button">
            <button id="tool_source_save">Apply Changes</button>
            <button id="tool_source_cancel">Cancel</button>
        </div>
        <form>
            <textarea id="svg_source_textarea" spellcheck="false"></textarea>
        </form>
    </div>
</div>

<div id="svg_docprops">
    <div id="svg_docprops_overlay"></div>
    <div id="svg_docprops_container">
        <div id="tool_docprops_back" class="toolbar_button">
            <button id="tool_docprops_save">OK</button>
            <button id="tool_docprops_cancel">Cancel</button>
        </div>


        <fieldset id="svg_docprops_docprops">
            <legend id="svginfo_image_props">Image Properties</legend>
            <label>
                <span id="svginfo_title">Title:</span>
                <input type="text" id="canvas_title" size="24">
            </label>            
    
            <fieldset id="change_resolution">
                <legend id="svginfo_dim">Canvas Dimensions</legend>

                <label><span id="svginfo_width">Width:</span> <input type="text" id="canvas_width" size="6"></label>
                    
                <label><span id="svginfo_height">Height:</span> <input type="text" id="canvas_height" size="6"></label>
                
                <label>
                    <select id="resolution">
                        <option id="selectedPredefined" selected="selected">Select predefined:</option>
                        <option>640x480</option>
                        <option>800x600</option>
                        <option>1024x768</option>
                        <option>1280x960</option>
                        <option>1600x1200</option>
                        <option id="fitToContent" value="content">Fit to Content</option>
                    </select>
                </label>
            </fieldset>

            <fieldset id="image_save_opts">
                <legend id="includedImages">Included Images</legend>
                <label><input type="radio" name="image_opt" value="embed" checked="checked"/> <span id="image_opt_embed">Embed data (local files)</span> </label>
                <label><input type="radio" name="image_opt" value="ref"/> <span id="image_opt_ref">Use file reference</span> </label>
            </fieldset>            


        </fieldset>

        <fieldset id="svg_docprops_prefs">
            <legend id="svginfo_editor_prefs">Editor Preferences</legend>

            <label><span id="svginfo_lang">Language:</span>
                <!-- Source: http://en.wikipedia.org/wiki/Language_names -->
                <select id="lang_select">
                    <option id="lang_cs" value="cs">Čeština</option>
                    <option id="lang_de" value="de">Deutsch</option>
                    <option id="lang_en" value="en" selected="selected">English</option>
                    <option id="lang_es" value="es">Español</option>
                    <option id="lang_fa" value="fa">فارسی</option>
                    <option id="lang_fr" value="fr">Français</option>
                    <option id="lang_nl" value="nl">Nederlands</option>
                    <option id="lang_ro" value="ro">Româneşte</option>
                    <option id="lang_sk" value="sk">Slovenčina</option>
                </select>
            </label>

            <label><span id="svginfo_icons">Icon size:</span>
                <select id="iconsize">
                    <option id="icon_small" value="s">Small</option>
                    <option id="icon_medium" value="m" selected="selected">Medium</option>
                    <option id="icon_large" value="l">Large</option>
                    <option id="icon_xlarge" value="xl">Extra Large</option>
                </select>
            </label>

            <fieldset id="change_background">
                <legend id="svginfo_change_background">Editor Background</legend>
                <div id="bg_blocks"></div>
                <label><span id="svginfo_bg_url">URL:</span> <input type="text" id="canvas_bg_url" size="21"></label>
                <p id="svginfo_bg_note">Note: Background will not be saved with image.</p>
            </fieldset>
            
        </fieldset>

    </div>
</div>

<div id="dialog_box">
    <div id="dialog_box_overlay"></div>
    <div id="dialog_container">
        <div id="dialog_content">
            Test message
        </div>
        <div id="dialog_buttons"></div>
    </div>
</div>       
""" % {"htdocs": htdocs,
       "filecontent": filecontent,
       }
        title = '%s %s:%s' % (_('Edit drawing'), pagename, target)
        request.theme.send_title(title, page=request.page, pagename=pagename)
        request.write(request.formatter.startContent("content"))
        request.write(request.formatter.rawHTML(meta))
        request.write(request.formatter.rawHTML(html))
        request.write(request.formatter.endContent())
        request.theme.send_footer(pagename)
        request.theme.send_closing_html()         
        
def execute(pagename, request):
    #ToDo refactoring to class 

    _ = request.getText
    msg = None
    if not request.user.may.read(pagename):
        msg = '<p>%s</p>' % _('You are not allowed to view this page.')
        SvgEditor(request, pagename, target).render_msg(msg, 'error')
        return

    target = request.values.get('target', '')
    if not target:
        msg = '<p>%s</p>' % _("Empty target given.")
        SvgEditor(request, pagename, target).render_msg(msg, 'error')
        return

    do = request.values.get('do', '')
    if do == 'save' and request.user.may.write(pagename):
        msg = SvgEditor(request, pagename, target).save()
        SvgEditor(request, pagename, target).render_msg(msg, 'error')
        return

    SvgEditor(request, pagename, target).render()