<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.inkscape.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Raphael</id>
	<title>Inkscape Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.inkscape.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Raphael"/>
	<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/Special:Contributions/Raphael"/>
	<updated>2026-05-05T18:21:00Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Script_extensions&amp;diff=98576</id>
		<title>Script extensions</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Script_extensions&amp;diff=98576"/>
		<updated>2016-03-13T10:38:42Z</updated>

		<summary type="html">&lt;p&gt;Raphael: /* See Also */  Removing dead link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[Note: This page concerns using scripting languages to create new Inkscape functionality.  To access Inkscape functionality from scripting languages (i.e. to script Inkscape), see the Inkscape man page (especially in the development version or v0.46 or later, which provide --select and --verb options), or see the work in the src/extension/script directory of Inkscape source.]&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Traditional Unix scripts can be used to extend Inkscape's functionality. Such programs read a stream of data on standard input, transform the data in some way, and then write the modified data to standard output. This is an easy way to expand Inkscape and provide custom functionality without learning the internals of Inkscape. Libraries for reading and writing SVG data exist for many programming languages, and most provide support for XML.  This tutorial describes the &amp;quot;ins and outs&amp;quot; of writing one of these scripts and making it work with Inkscape's core functionality.&lt;br /&gt;
&lt;br /&gt;
== Script functions ==&lt;br /&gt;
&lt;br /&gt;
There are three kinds of functions that can be added with a script:&lt;br /&gt;
&lt;br /&gt;
* Input, providing translation from a file format to SVG&lt;br /&gt;
* Output, providing translation from SVG to a format&lt;br /&gt;
* Effect, taking in SVG, changing it, and then outputting SVG&lt;br /&gt;
&lt;br /&gt;
While all of these are very similar in the scripting interface, there are slight differences between them.&lt;br /&gt;
&lt;br /&gt;
== Interaction ==&lt;br /&gt;
&lt;br /&gt;
It is important for a script author to understand how Inkscape and scripts communicate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
(interpreter)? your_script (--param=value)* /path/to/input[[/SVGfile]] | inkscape&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inkscape runs your script (optionally with an interpreter) passing it any number of parameters in long gnu style. The final argument is the name of the temporary svg file your script should read. After processing, the script should return the modified svg file to inkscape on STDOUT.&lt;br /&gt;
&lt;br /&gt;
== Important Tips ==&lt;br /&gt;
&lt;br /&gt;
* Receive the inkscape arguments.&lt;br /&gt;
* Clear temp files if it creates one.&lt;br /&gt;
* Write full changed SVG to the default output.&lt;br /&gt;
* Don't break an &amp;lt;code&amp;gt;xml:space=&amp;quot;preserve&amp;quot;&amp;lt;/code&amp;gt; area.&lt;br /&gt;
* Send error text to the error output and help the user.&lt;br /&gt;
&lt;br /&gt;
== Extension description file ==&lt;br /&gt;
&lt;br /&gt;
In order for Inkscape to make use of an external script or program, you must describe that script to Inkscape using an INX file. See the inkscape share directory for examples.&lt;br /&gt;
&lt;br /&gt;
The INX file allows you to:&lt;br /&gt;
* Define the script file and other dependencies.&lt;br /&gt;
* List all parameters and their types (to generate an input dialog window).&lt;br /&gt;
* Mark dialog window text for translation.&lt;br /&gt;
* Define an Inkscape menu entry.&lt;br /&gt;
* Chain extensions.&lt;br /&gt;
&lt;br /&gt;
See [[INX extension descriptor format]] for help creating an INX file.&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
The INX file describes which parameters the extension needs. Inkscape will prompt the user with a UI to fill out these parameters before the extension is called. Each parameter will be passed to the script as &amp;lt;code&amp;gt;--paramname=paramvalue&amp;lt;/code&amp;gt;. Specify the script file to be run with the &amp;lt;code&amp;gt;&amp;lt;command&amp;gt;&amp;lt;/code&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
For example, if you have described a string parameter with name &amp;lt;code&amp;gt;string1&amp;lt;/code&amp;gt; in the INX file, Inkscape will present a textbox to the user. When the user fills in &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; and presses Apply, it will pass &amp;lt;code&amp;gt;--string1=&amp;quot;text&amp;quot;&amp;lt;/code&amp;gt; to the script.&lt;br /&gt;
&lt;br /&gt;
There are several types of parameters that can be requested by the INX description:&lt;br /&gt;
&lt;br /&gt;
* String (textbox)&lt;br /&gt;
* Boolean (checkbox)&lt;br /&gt;
* Int (numeric textbox)&lt;br /&gt;
* Float (numeric textbox)&lt;br /&gt;
* Enum (drop down selection list)&lt;br /&gt;
* Option group (radio buttons)&lt;br /&gt;
* Notebook (pages/tabs)&lt;br /&gt;
* Description (not a parameter, provides static text)&lt;br /&gt;
&lt;br /&gt;
For a detailed description of all parameters and input controls, see [[INX Parameters]].&lt;br /&gt;
&lt;br /&gt;
== Installing ==&lt;br /&gt;
&lt;br /&gt;
Installing is as simple as copying the script (unless it resides in your path) and its INX file to the inkscape/share/extensions ($HOME/.config/inkscape/extensions) directory. (If you install a script in your home directory be sure to copy the dependencies.)&lt;br /&gt;
&lt;br /&gt;
If you are looking to use scripts that have already been written, the most difficult part will likely be the installation. Since scripts are  separate programs they may have any number of dependencies that are not included with inkscape. Currently, the best way to find missing dependencies is by reading the error messages produced by running the script from the command line.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
*[[Generating_objects_from_extensions]]. How to use a script to generate actual objects inside SVG documents.&lt;br /&gt;
&lt;br /&gt;
*[[PythonEffectTutorial]]&lt;br /&gt;
&lt;br /&gt;
*[[Tips For Python Script Extensions]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer Documentation]]&lt;br /&gt;
[[Category:Extensions]]&lt;/div&gt;</summary>
		<author><name>Raphael</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Inkscape&amp;diff=98571</id>
		<title>Inkscape</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Inkscape&amp;diff=98571"/>
		<updated>2016-03-13T10:37:37Z</updated>

		<summary type="html">&lt;p&gt;Raphael: /* Miscellaneous */ Add Script Extension link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Main_Page/Localized_versions}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is a freeform area for Inkscape development and discussion.  &lt;br /&gt;
Curious about [[WikiSyntax]]?&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;11&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
|-style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:33%;background-color: #E6E6E6; padding:.5em;&amp;quot;|&lt;br /&gt;
=== Project Info ===&lt;br /&gt;
* [http://www.inkscape.org/ Inkscape Homepage]&lt;br /&gt;
* [[About Inkscape]]&lt;br /&gt;
* [[Features of Inkscape|Features]]&lt;br /&gt;
* [[FAQ]] - Frequently Asked Questions&lt;br /&gt;
* [[Supported operating systems]]&lt;br /&gt;
* [[Tools]] - Supporting Tools and Applications&lt;br /&gt;
* [[Galleries]]&lt;br /&gt;
* [[Inkscape coverage|Coverage]] - Awards, articles, presentations, books about Inkscape&lt;br /&gt;
* [[Inkscape popularity|Popularity]]&lt;br /&gt;
* [[InkscapeInvariants|Inkscape's Mission]]&lt;br /&gt;
* [[CommunicationChannels|Communication Channels]]: how to reach us&lt;br /&gt;
* [[AnnouncementToSodipodi|Announcement To Sodipodi]]: this started it all&lt;br /&gt;
* [[Branding]]&lt;br /&gt;
* [[Travel Reimbursement Policy]]&lt;br /&gt;
* [[FundedProjectSystemDevelopment|Funded Project System Development]]&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width:33%;;background-color: white; padding:.5em;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
=== User Documentation ===&lt;br /&gt;
* [[Installing Inkscape|Installation]]&lt;br /&gt;
* [[International and Local Communities]]&lt;br /&gt;
* [[Inkscape glossary]]&lt;br /&gt;
* [[User manual information]] - where to find the free Inkscape manual and how to contribute to it&lt;br /&gt;
* [http://inkscape.org/en/learn/tutorials/ Tutorials]&lt;br /&gt;
* [[Inkscape SVG vs. plain SVG]]&lt;br /&gt;
* [[Output format requirements]] - what's needed to save in some formats&lt;br /&gt;
* [[Effect requirements]] - what's needed to use some effects&lt;br /&gt;
* [[Effect reference]] - what each effect does&lt;br /&gt;
* [[Connector tool tutorial]]&lt;br /&gt;
* [[Installing fonts]]&lt;br /&gt;
* [[Emergency save]] - recovery in case Inkscape crashed&lt;br /&gt;
* [[Release notes]]&lt;br /&gt;
** '''for version [[Release notes/0.92|0.92]] (active development)'''&lt;br /&gt;
** '''for version [[Release notes/0.91|0.91]] (current release)'''&lt;br /&gt;
** older versions: [[Release notes/0.48.5|0.48.5]] [[Release notes/0.48.4|0.48.4]] [[Release notes/0.48.3|0.48.3]], [[Release notes/0.48.2|0.48.2]], [[Release notes/0.48.1|0.48.1]], [[Release notes/0.48|0.48]], [[Release notes/0.47|0.47]]&lt;br /&gt;
* [[Announcing Releases]]&lt;br /&gt;
* [[Tricks and tips]] - miscellaneous advice, may be slightly outdated&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;width:33%;background-color: #E6E6E6; padding:.5em;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
=== Help Inkscape Without Coding === &lt;br /&gt;
* [[Bug management]]&lt;br /&gt;
* [[Testing]]&lt;br /&gt;
* [[Translation information]]&lt;br /&gt;
* [[WebSite]]&lt;br /&gt;
* [[Inkscape Classes]]&lt;br /&gt;
* [[Conferences]]&lt;br /&gt;
* [[Fundraising Ideas]]&lt;br /&gt;
&lt;br /&gt;
* [[HelpWanted]]&lt;br /&gt;
* [[BugTriageProjects]]&lt;br /&gt;
* [[CreatingDists]]: how to build packages&lt;br /&gt;
* [[StableBranchUpdates]]&lt;br /&gt;
* [[UpdatingTrackerItems]]&lt;br /&gt;
* [[TutorialsAndHelp]]&lt;br /&gt;
* [[How_To_Start_A_Page]] how to use the wiki&lt;br /&gt;
* [[CreatingScreencasts]]&lt;br /&gt;
* [[AboutScreenContest]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;width: 100%; background-color: white; border-width:1px; border-style:solid; border-color:#62C012; align:left; padding:11px 0em 0em 11px;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
=== Developer Documentation ===&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:50%;|&lt;br /&gt;
==== First Steps ====&lt;br /&gt;
* [[Working with Bazaar]] - How to obtain the source code. A quick start on how to use our version control system&lt;br /&gt;
* [[Working with Git]]&lt;br /&gt;
* [[Compiling Inkscape|Compilation]]&lt;br /&gt;
* [[Compiling Inkscape on Windows]]&lt;br /&gt;
* [[Using Eclipse]] - Debug Inkscape on Windows using Eclipse (outdated)&lt;br /&gt;
* [[Using Visual Studio]] - Debug Inkscape on Windows using Microsoft Visual Studio&lt;br /&gt;
* [[Developer manual]] - various important information, be sure to read this before coding&lt;br /&gt;
* [[Debugging Inkscape|Debugging]] - random tips to help debug problems&lt;br /&gt;
* [[Project organization]] - procedures, hierarchy, developer roles and the likes&lt;br /&gt;
* [[Janitorial tasks]] - small tasks that need doing&lt;br /&gt;
* [[Doxygen documentation]]&lt;br /&gt;
* [[Working with SVN]] - besides the code in Bazaar, we still have some things in SVN.&lt;br /&gt;
* [[Working with CMake]] - Getting started with cmake coding for configuring and building Inkscape&lt;br /&gt;
&lt;br /&gt;
==== Developer tutorials ====&lt;br /&gt;
* [[Architectural overview]] - a high-level look at Inkscape&lt;br /&gt;
* [[Preferences subsystem]] - creating and using preference values&lt;br /&gt;
* XML subsystem (WIP) - how to manipulate the XML representation of a document&lt;br /&gt;
* Display subsystem (WIP) - how to make things appear on the canvas&lt;br /&gt;
* Tools subsystem (WIP) - how to create a new tool&lt;br /&gt;
* [[Creating a new SPObject]]&lt;br /&gt;
* Extensions&lt;br /&gt;
** [[Extension subsystem]] - an overview of the functionality provided by extensions and the possible implementations&lt;br /&gt;
** [[Script extensions]]&lt;br /&gt;
** [[Python modules for extensions]] - some helpful routines for use in Python script extensions&lt;br /&gt;
* [[Creating Live Path Effects]]&lt;br /&gt;
* [[Boost shared pointers]]&lt;br /&gt;
* [[Using libsigc++ signals]]&lt;br /&gt;
* [[Windows development on Linux]]&lt;br /&gt;
&lt;br /&gt;
==== Miscellaneous ====&lt;br /&gt;
* [[Script extensions]]: extends Inkscape easily using scripting languages (Python, Perl,...)&lt;br /&gt;
* [[INX extension descriptor format]]&lt;br /&gt;
* [[Inkscape-specific XML attributes]] - documentation of attributes from Inkscape's XML namespace&lt;br /&gt;
&lt;br /&gt;
* [[Extension repository]]: an Internet central for Inkscape Extensions&lt;br /&gt;
* [[Related programs]]&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width:50%;|&lt;br /&gt;
&lt;br /&gt;
==== Continuous Integration (Automated testing) ====&lt;br /&gt;
* [http://jenkins.inkscape.org Our main testing website (Jenkins)]&lt;br /&gt;
* [[How to contribute to automated tests]]&lt;br /&gt;
* [[Jenkins server setup]]&lt;br /&gt;
&lt;br /&gt;
==== Development Discussion ====&lt;br /&gt;
* [[Roadmap]]: the main todo list&lt;br /&gt;
* [[Dependencies]] - what libs are needed to build Inkscape&lt;br /&gt;
* [[C++11]] - What C++11 features can be used&lt;br /&gt;
* [[NewFeatureProposals]]&lt;br /&gt;
* [[ExtensionArchitectureProposals]]&lt;br /&gt;
* [[Coding Style|Coding Style Discussion]]&lt;br /&gt;
* [[FileTypes]]&lt;br /&gt;
* [[ApplicationIcons]] (Application + Interface)&lt;br /&gt;
* [[Icons]]&lt;br /&gt;
* [[InkscapeColor]]&lt;br /&gt;
* [[PrintingSubsystem]]&lt;br /&gt;
* [[SVG Tiny Compliance]]&lt;br /&gt;
* [[SVG Test Suite Compliance]] - [[W3C]] full test suite&lt;br /&gt;
* [[CSS Support]]&lt;br /&gt;
* [[Google Summer Of Code]]&lt;br /&gt;
* [[Improved Media Management]]&lt;br /&gt;
* [[UI MockupScreenshots]]&lt;br /&gt;
* [[Swatch Book]]&lt;br /&gt;
* [[Tablet Dialog]]&lt;br /&gt;
* [[ViewBoxToDo]] View box support info&lt;br /&gt;
* [[Caching]]&lt;br /&gt;
* [[UI and Document coordinates‎]]&lt;br /&gt;
* [[Mipmapping]]&lt;br /&gt;
* [[GtkMMification]]: replace C boilerplate with gtkmm objects&lt;br /&gt;
* [[CMake Tasks]]: Converting the Inkscape build system to CMake&lt;br /&gt;
&lt;br /&gt;
===Lib2Geom===&lt;br /&gt;
*[[lib2geom]]&lt;br /&gt;
*[[lib2geom Goals]]&lt;br /&gt;
*[[lib2geom FAQ]]&lt;br /&gt;
*[[lib2geom SVN Repository Guide]]&lt;br /&gt;
*[[WorkingWith2GeomFAQ]]: real-life questions answered about using 2Geom in real code&lt;br /&gt;
*[[lib2geom py2geom]]: python bindings to 2geom. With this you can use the power of 2geom in python scripts.&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:50%;|&lt;br /&gt;
==== User Interface Discussion ====&lt;br /&gt;
* [[Translation_information]]&lt;br /&gt;
* [[AddingInterfaceVerbs]]&lt;br /&gt;
* [[AccessibleGraphics]]&lt;br /&gt;
* [[ObjectManager]]&lt;br /&gt;
* [[DialogsReorganization]]&lt;br /&gt;
* [[ModalInterfaces]]&lt;br /&gt;
* [[TextUsability]]: text tool /dialog dialog&lt;br /&gt;
* [[KeyboardShortcutsToDo]]&lt;br /&gt;
** [[KeyboardProfiles]]: how you can help &lt;br /&gt;
* [[StatusbarAPI]]&lt;br /&gt;
* [[Animation-(Timeline)]]&lt;br /&gt;
* [[Free Desktop Graphic Suite]]&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width:50%; |&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* [[WikiAttic]]: pages that are no longer relevant but kept for historical value&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
[[Category:About Inkscape]]&lt;br /&gt;
[[Category:User Documentation]]&lt;/div&gt;</summary>
		<author><name>Raphael</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=PythonEffectTutorial&amp;diff=98566</id>
		<title>PythonEffectTutorial</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=PythonEffectTutorial&amp;diff=98566"/>
		<updated>2016-03-13T10:33:46Z</updated>

		<summary type="html">&lt;p&gt;Raphael: Small style improvements + typo corrections&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Effect extensions in Inkscape means a simple programs or scripts that reads an SVG file from standard input, transforms it somehow and prints it to the standard output. Usually Inkscape sits on both ends, providing the file with some parameters as input first and finally reading the output, which is then used for further work.&lt;br /&gt;
[[Image:Effect_flow.svg|thumb|right|400px]]&lt;br /&gt;
&lt;br /&gt;
We will write a simple effect extension script in [http://docs.python.org Python] that will create a new &amp;quot;Hello World!&amp;quot; or &amp;quot;Hello &amp;lt;value of --what option&amp;gt;!&amp;quot; string in the center of document and inside a new layer.&lt;br /&gt;
&lt;br /&gt;
== Effect Extension Script ==&lt;br /&gt;
&lt;br /&gt;
First of all create a file ''hello_world.py'' and make it executable with the Python interpreter with the well-known directive:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you're going to put the file somewhere else than into Inkscape's installation directory, we need to add a path so that python can find the necessary modules:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
sys.path.append('/usr/share/inkscape/extensions') # or another path, as necessary&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Import the ''inkex.py'' file with the ''Effect'' base class that will do most of the work for us and the ''simplestyle.py'' module with support functions for working with CSS styles. We will use just the ''formatStyle'' function from this module:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import inkex&lt;br /&gt;
from simplestyle import *&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Declare a ''HelloWordEffect'' class that inherits from ''Effect'' and write a constructor where the base class is initialized and script options for the option parser are defined:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class HelloWorldEffect(inkex.Effect):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        inkex.Effect.__init__(self)&lt;br /&gt;
        self.OptionParser.add_option('-w', '--what', action = 'store',&lt;br /&gt;
          type = 'string', dest = 'what', default = 'World',&lt;br /&gt;
          help = 'What would you like to greet?')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The complete documentation for the ''OptionParser'' class can be found at [https://docs.python.org/2/library/optparse.html docs.python.org]. Here we just use the ''add_option'' method which has as first argument a short option name, as second argument a long option name and then a few other arguments with this meaning:&lt;br /&gt;
&lt;br /&gt;
* ''action'' - An action which should be done with option value. In this case we use action ''store'' which will store option value in ''self.options.&amp;lt;destination&amp;gt;'' attribute.&lt;br /&gt;
* ''type'' - Type of option value. We use string here.&lt;br /&gt;
* ''dest'' - Destination of option action specified by ''action'' argument. Using ''what'' value we say that we want to store option value to self.options.what attribute.&lt;br /&gt;
* ''default'' - Defalut value for this option if it is not specified.&lt;br /&gt;
* ''help'' - A help string that will be displayed if script will be given no arguments or some option or argument will have wrong syntax.&lt;br /&gt;
&lt;br /&gt;
Inkscape will create a GUI form with widgets for all specified options and prefill them with the default values specified using the ''.inx'' file for this extension which we will write later. &lt;br /&gt;
&lt;br /&gt;
We need to override only one ''Effect'' class method to provide the desired effect functionality: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    def effect(self):&lt;br /&gt;
        what = self.options.what&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
As you can imagine we just stored the ''--what'' option value to the ''what'' variable.&lt;br /&gt;
&lt;br /&gt;
Now we will finally start to do something. We will have to work with the XML representation of the SVG document that we can access via ''Effect'''s ''self.document'' attribute.&lt;br /&gt;
It is of lxml's '' _ElementTree'' class type.  Complete documentation for the lxml package can be found at [http://lxml.de/ lxml.de].&lt;br /&gt;
&lt;br /&gt;
First we get SVG document's ''svg'' element and its dimensions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        svg = self.document.getroot()&lt;br /&gt;
        # or alternatively&lt;br /&gt;
        # svg = self.document.xpath('//svg:svg',namespaces=inkex.NSS)[0]&lt;br /&gt;
&lt;br /&gt;
        # Again, there are two ways to get the attibutes:&lt;br /&gt;
        width  = self.unittouu(svg.get('width'))&lt;br /&gt;
        height = self.unittouu(svg.attrib['height'])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The ''xpath'' function returns a list of all matching elements so we just use the first one of them.&lt;br /&gt;
&lt;br /&gt;
We now create an SVG group element ('' 'g' '') and &amp;quot;mark&amp;quot; it as a layer using Inkscape' SVG extensions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        layer = inkex.etree.SubElement(svg, 'g')&lt;br /&gt;
        layer.set(inkex.addNS('label', 'inkscape'), 'Hello %s Layer' % (what))&lt;br /&gt;
        layer.set(inkex.addNS('groupmode', 'inkscape'), 'layer')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This creates ''inkscape:label'' and ''inkscape:groupmode'' attributes, which will only be read by Inkscape or compatible applications.  To all other viewers, this new element looks just like a plain SVG group.&lt;br /&gt;
&lt;br /&gt;
Now we create an SVG text element with a text value containing the &amp;quot;Hello World&amp;quot; string:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        text = inkex.etree.Element(inkex.addNS('text','svg'))&lt;br /&gt;
        text.text = 'Hello %s!' % (what)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Set the position of the text to the center of SVG document:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        text.set('x', str(width / 2))&lt;br /&gt;
        text.set('y', str(height / 2))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If we want to center the text on its position we need to define the CSS style of the SVG ''text'' element. Actually we use the ''text-anchor'' SVG extension to CSS styles to do that work:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        style = {'text-align' : 'center', 'text-anchor' : 'middle'}&lt;br /&gt;
        text.set('style', formatStyle(style))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finally we connect all created elements together and put them into the SVG document:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        layer.append(text)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We just defined a class that inherited from the original effect extension so we have to create an instance of it and execute it in the main control flow:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
effect = HelloWorldEffect()&lt;br /&gt;
effect.affect()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extension Description File ==&lt;br /&gt;
&lt;br /&gt;
To include script in Inkscape's main menu create ''hello_world.inx'' file describing script evokation. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;inkscape-extension xmlns=&amp;quot;http://www.inkscape.org/namespace/inkscape/extension&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;_name&amp;gt;Hello World!&amp;lt;/_name&amp;gt;&lt;br /&gt;
  &amp;lt;id&amp;gt;org.ekips.filter.hello_world&amp;lt;/id&amp;gt;&lt;br /&gt;
  &amp;lt;dependency type=&amp;quot;executable&amp;quot; location=&amp;quot;extensions&amp;quot;&amp;gt;hello_world.py&amp;lt;/dependency&amp;gt;&lt;br /&gt;
  &amp;lt;dependency type=&amp;quot;executable&amp;quot; location=&amp;quot;extensions&amp;quot;&amp;gt;inkex.py&amp;lt;/dependency&amp;gt;&lt;br /&gt;
  &amp;lt;param name=&amp;quot;what&amp;quot; type=&amp;quot;string&amp;quot; _gui-text=&amp;quot;What would you like to greet?&amp;quot;&amp;gt;World&amp;lt;/param&amp;gt;&lt;br /&gt;
  &amp;lt;effect&amp;gt;&lt;br /&gt;
    &amp;lt;object-type&amp;gt;all&amp;lt;/object-type&amp;gt;&lt;br /&gt;
    &amp;lt;effects-menu&amp;gt;&lt;br /&gt;
       &amp;lt;submenu _name=&amp;quot;Examples&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/effects-menu&amp;gt;&lt;br /&gt;
  &amp;lt;/effect&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
    &amp;lt;command reldir=&amp;quot;extensions&amp;quot; interpreter=&amp;quot;python&amp;quot;&amp;gt;hello_world.py&amp;lt;/command&amp;gt;&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/inkscape-extension&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create ''&amp;lt;param&amp;gt;'' element for every option of a script and ''&amp;lt;dependency&amp;gt;'' for every included module which is not from Python standard library. Inkscape will search for this modules in directory with script. ''&amp;lt;effect&amp;gt;'' element and its descendants defines name of menu item evoking our new &amp;quot;Hello World!&amp;quot; extension.&lt;br /&gt;
&lt;br /&gt;
If the inx file isn't well formed or if any of the dependencies wasn't met, the extension won't show up in the menu. If your extension doesn't show up, take a look at extension-errors.log, which may give you a hint why it wasn't loaded.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
To install a new extenstion just put ''hello_world.py'' and ''hello_world.inx'' files with all dependency modules to the ''&amp;lt;path_to_inkscape&amp;gt;/extensions'' or ''~/.config/inkscape/extensions'' directory.  On Linux you will probably have to make the python script executable first if you haven't done this yet.  This is usually done by the usual command (or in your preferred file manager):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ chmod a+x hello_world.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now start Inkscape. A new menu item ''Hello World!'' in ''Extensions-&amp;gt;Examples'' menu should appear.&lt;br /&gt;
&lt;br /&gt;
== Complete Source Code ==&lt;br /&gt;
&lt;br /&gt;
Here is a complete commented source pre of ''hello_world.py'' script file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
&lt;br /&gt;
# These two lines are only needed if you don't put the script directly into&lt;br /&gt;
# the installation directory&lt;br /&gt;
import sys&lt;br /&gt;
sys.path.append('/usr/share/inkscape/extensions')&lt;br /&gt;
&lt;br /&gt;
# We will use the inkex module with the predefined Effect base class.&lt;br /&gt;
import inkex&lt;br /&gt;
# The simplestyle module provides functions for style parsing.&lt;br /&gt;
from simplestyle import *&lt;br /&gt;
&lt;br /&gt;
class HelloWorldEffect(inkex.Effect):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Example Inkscape effect extension.&lt;br /&gt;
    Creates a new layer with a &amp;quot;Hello World!&amp;quot; text centered in the middle of the document.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        Constructor.&lt;br /&gt;
        Defines the &amp;quot;--what&amp;quot; option of a script.&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        # Call the base class constructor.&lt;br /&gt;
        inkex.Effect.__init__(self)&lt;br /&gt;
&lt;br /&gt;
        # Define string option &amp;quot;--what&amp;quot; with &amp;quot;-w&amp;quot; shortcut and default value &amp;quot;World&amp;quot;.&lt;br /&gt;
        self.OptionParser.add_option('-w', '--what', action = 'store',&lt;br /&gt;
          type = 'string', dest = 'what', default = 'World',&lt;br /&gt;
          help = 'What would you like to greet?')&lt;br /&gt;
&lt;br /&gt;
    def effect(self):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        Effect behaviour.&lt;br /&gt;
        Overrides base class' method and inserts &amp;quot;Hello World&amp;quot; text into SVG document.&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        # Get script's &amp;quot;--what&amp;quot; option value.&lt;br /&gt;
        what = self.options.what&lt;br /&gt;
&lt;br /&gt;
        # Get access to main SVG document element and get its dimensions.&lt;br /&gt;
        svg = self.document.getroot()&lt;br /&gt;
        # or alternatively&lt;br /&gt;
        # svg = self.document.xpath('//svg:svg',namespaces=inkex.NSS)[0]&lt;br /&gt;
&lt;br /&gt;
        # Again, there are two ways to get the attibutes:&lt;br /&gt;
        width  = self.unittouu(svg.get('width'))&lt;br /&gt;
        height = self.unittouu(svg.attrib['height'])&lt;br /&gt;
&lt;br /&gt;
        # Create a new layer.&lt;br /&gt;
        layer = inkex.etree.SubElement(svg, 'g')&lt;br /&gt;
        layer.set(inkex.addNS('label', 'inkscape'), 'Hello %s Layer' % (what))&lt;br /&gt;
        layer.set(inkex.addNS('groupmode', 'inkscape'), 'layer')&lt;br /&gt;
&lt;br /&gt;
        # Create text element&lt;br /&gt;
        text = inkex.etree.Element(inkex.addNS('text','svg'))&lt;br /&gt;
        text.text = 'Hello %s!' % (what)&lt;br /&gt;
&lt;br /&gt;
        # Set text position to center of document.&lt;br /&gt;
        text.set('x', str(width / 2))&lt;br /&gt;
        text.set('y', str(height / 2))&lt;br /&gt;
&lt;br /&gt;
        # Center text horizontally with CSS style.&lt;br /&gt;
        style = {'text-align' : 'center', 'text-anchor': 'middle'}&lt;br /&gt;
        text.set('style', formatStyle(style))&lt;br /&gt;
&lt;br /&gt;
        # Connect elements together.&lt;br /&gt;
        layer.append(text)&lt;br /&gt;
&lt;br /&gt;
# Create effect instance and apply it.&lt;br /&gt;
effect = HelloWorldEffect()&lt;br /&gt;
effect.affect()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Last edited by --[[User:Rubikcube|Rubikcube]] 21:18, 7 August 2008 (UTC), based on a version by&lt;br /&gt;
[[User:Blackhex|Blackhex]] 11:59, 26 April 2007 (UTC)&lt;br /&gt;
[[Category:Developer Documentation]]&lt;br /&gt;
[[Category:Extensions]]&lt;/div&gt;</summary>
		<author><name>Raphael</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Tips_For_Python_Script_Extensions&amp;diff=98561</id>
		<title>Tips For Python Script Extensions</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Tips_For_Python_Script_Extensions&amp;diff=98561"/>
		<updated>2016-03-13T09:58:09Z</updated>

		<summary type="html">&lt;p&gt;Raphael: Change default advices after v0.91&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Adding Translation Capability==&lt;br /&gt;
&lt;br /&gt;
One can add the ability to have Python text messages included for translation. To provide an error message, rather than using the Python &amp;lt;tt&amp;gt;sys.stderr&amp;lt;/tt&amp;gt;, use the provided &amp;lt;tt&amp;gt;errormsg()&amp;lt;/tt&amp;gt; function from inkex.py in conjunction with &amp;lt;tt&amp;gt;gettext&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
You must include the following at the beginning of your Python script:&lt;br /&gt;
 import inkex&lt;br /&gt;
 inkex.localize()&lt;br /&gt;
&lt;br /&gt;
Note: In prior versions (0.49), you will have to include the following lines instead:&lt;br /&gt;
 import inkex&lt;br /&gt;
 import gettext&lt;br /&gt;
 _ = gettext.gettext&lt;br /&gt;
&lt;br /&gt;
Where you wish to have an error message, write the following:&lt;br /&gt;
 inkex.errormsg(_(&amp;quot;This will be written to Python stderr&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
Of course, you may also change &amp;quot;_&amp;quot; to something else if you wish.&lt;br /&gt;
&lt;br /&gt;
[[Category:Extensions]]&lt;/div&gt;</summary>
		<author><name>Raphael</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Developer_manual&amp;diff=98476</id>
		<title>Developer manual</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Developer_manual&amp;diff=98476"/>
		<updated>2016-03-05T20:12:37Z</updated>

		<summary type="html">&lt;p&gt;Raphael: /* Please use const */ typo correction&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Inkscape Developer’s Manual =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
For those of you just joining us, or who have been with us but are just&lt;br /&gt;
now getting the itch to work on Inkscape, I thought I’d give some tips&lt;br /&gt;
for how to get started working in the codebase based on our own&lt;br /&gt;
experiences.&lt;br /&gt;
&lt;br /&gt;
One of the first things most people wonder is “What should I work on?”.&lt;br /&gt;
As you may have already noticed, we generally don’t “assign” projects.&lt;br /&gt;
We figure there’s plenty more work to do than people to do it, so you&lt;br /&gt;
may as well work on something that you’re either interested in or that&lt;br /&gt;
adds something of benefit to you; that’s extra motivation to get your&lt;br /&gt;
own itches scratched.&lt;br /&gt;
&lt;br /&gt;
If you’re really stumped though, we keep a detailed [[Roadmap]] in wiki that&lt;br /&gt;
you’re welcome to browse through to look for ideas of things to work&lt;br /&gt;
on.  Tasks that do not have names beside them are open for anyone to&lt;br /&gt;
take; if you want to take ownership of a task, just put your name beside&lt;br /&gt;
it.  Feel free to add or reword tasks as needed, although try not to&lt;br /&gt;
load up the current milestone with tasks that aren’t critical for the&lt;br /&gt;
release.  Feel free to work on stuff that is several milestones down the&lt;br /&gt;
road; there’s rarely any problem with getting stuff done sooner than&lt;br /&gt;
planned.  ;-)&lt;br /&gt;
&lt;br /&gt;
We have a process for gaining SVN commit access.  The reason is that&lt;br /&gt;
while it is important that we keep access to the codebase open, we don’t&lt;br /&gt;
want to be crazy and leave it wide open to any random passer-by.  The&lt;br /&gt;
process is that we require that the person make two contributions&lt;br /&gt;
(patches, documentation, web collateral, etc.) and then make a request&lt;br /&gt;
to get account access.&lt;br /&gt;
&lt;br /&gt;
In general you won’t need SVN commit access in order to start doing&lt;br /&gt;
development, because you can work from an anonymous checkout and create&lt;br /&gt;
patches.  If you’ve not done this before, you’ll need to learn this&lt;br /&gt;
skill first (basically see docs for `svn diff`).&lt;br /&gt;
&lt;br /&gt;
When you first start hacking on Inkscape code, I wouldn’t recommend&lt;br /&gt;
taking an objective of implementing a specific feature, because you will&lt;br /&gt;
need some time to familiarize yourself with the codebase, and because&lt;br /&gt;
you won’t really know what features are going to be straightforward to&lt;br /&gt;
implement and which will be highly challenging.  Of course, if you have&lt;br /&gt;
the time and love adventures, this might be a fun way to go.&lt;br /&gt;
&lt;br /&gt;
There are four approaches that I’ve seen people effectively use in&lt;br /&gt;
getting into the codebase:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;Write code documentation.&amp;lt;/strong&amp;gt;  Some people who don’t mind adding&lt;br /&gt;
comments to code or writing docs find it useful to just go through&lt;br /&gt;
code they’re interested in working on and writing up what it does.&lt;br /&gt;
The codebase is in dire need of better docs, so this approach pays&lt;br /&gt;
dividends well into the future.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;Fix bugs.&amp;lt;/strong&amp;gt;  Tracing down the cause of reported bugs is an effective&lt;br /&gt;
way to gain understanding of the codebase in small chunks.  Many&lt;br /&gt;
common bugs can be traced down and fixed in a matter of hours, and&lt;br /&gt;
often will identify some bit of code in need of refactoring or&lt;br /&gt;
extension.  Note that some of our older bugs are in the system&lt;br /&gt;
because they’re hard to fix, so you’ll want to work on the more&lt;br /&gt;
recent ones.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;Chip in on a group effort.&amp;lt;/strong&amp;gt;  Occasionally we identify a major&lt;br /&gt;
refactoring effort (such as when we converted from C to C++), that&lt;br /&gt;
we encourage lots of people to help on, in the philosophy that many&lt;br /&gt;
hands makes short work.  This work tends to be pretty rote so is&lt;br /&gt;
not hard for new folks to get involved with; it just takes time.  We&lt;br /&gt;
generally have one of these kinds of efforts per release.  It&lt;br /&gt;
usually isn’t glamorous work, but in aggregate moves the codebase&lt;br /&gt;
forward in a major way.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;Subsystem/module work.&amp;lt;/strong&amp;gt;  Some people want to get their hands in the&lt;br /&gt;
details quick, so take the approach of developing new code separate&lt;br /&gt;
from the codebase, to be integrated in later.  This generally tends&lt;br /&gt;
to take a larger time commitment than the other approaches, but can be&lt;br /&gt;
an effective approach in some circumstances.  We have a SVN module&lt;br /&gt;
called &amp;lt;code&amp;gt;experimental&amp;lt;/code&amp;gt; that you’re welcome to house your work until&lt;br /&gt;
it’s ready for prime time.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beyond that, you’re going to find the documentation for the Inkscape&lt;br /&gt;
code is pretty scarce.  We’ve worked on bits and pieces but&lt;br /&gt;
unfortunately the vast majority of the code is undocumented.  On the&lt;br /&gt;
plus side, often you can implement the stuff you care about after&lt;br /&gt;
learning only a limited portion of the codebase.&lt;br /&gt;
&lt;br /&gt;
I think you’d find Inkscape an enjoyable Open Source project to work on.&lt;br /&gt;
There’s a huge range of interesting and useful skills that can be&lt;br /&gt;
learned from it, plus the developers are great guys to participate with.&lt;br /&gt;
The project itself runs smoothly and puts a premium on keeping things&lt;br /&gt;
friendly and low-stress, so heated arguments are rare.  The users have&lt;br /&gt;
been great to work with and very appreciative of even small new features&lt;br /&gt;
and fixes.  Plus, since Inkscape is so visual in nature, it’s very cool&lt;br /&gt;
to see how your little changes make noticeable improvements to the app&lt;br /&gt;
overall.&lt;br /&gt;
&lt;br /&gt;
== C++ Reference ==&lt;br /&gt;
* FAQ (with answers) sheet. We strongly recommend that everyone read this site comprehensively. You should not need to bookmark it, it should be the first of the sites on your autocomplete list for &amp;lt;code&amp;gt;par&amp;lt;/code&amp;gt;!&lt;br /&gt;
&lt;br /&gt;
http://www.parashift.com/c++-faq-lite/&lt;br /&gt;
&lt;br /&gt;
It is actually more in-depth than the name FAQ suggests.  Many experienced C++ programmers would benefit from it.&lt;br /&gt;
&lt;br /&gt;
* List of &amp;lt;s&amp;gt;[http://www.cs.helsinki.fi/u/vkarvone/2004s/cplusplus/errors.html schoolboy errors] (Broken Link)&amp;lt;/s&amp;gt;. None of these should appear in [http://en.wikipedia.org/wiki/Free/Libre/Open-Source_Software FLOSS] code.&lt;br /&gt;
&lt;br /&gt;
== Please use const ==&lt;br /&gt;
&lt;br /&gt;
Please be very aggressive in adding ''const'' to any code you write. It will help us understand code better and will prevent bugs from creeping in. It is very easy to remove ''const'' later on, but very hard to add it.&lt;br /&gt;
&lt;br /&gt;
''const'' can go on either side of a type. However once you get into references and pointers and such with C++, you generally read those from right-to-left. So it makes the code a little more legible if the ''const'' comes between the variable type and name.&lt;br /&gt;
&lt;br /&gt;
 int const foo;&lt;br /&gt;
 // RTL reading gives &amp;quot;foo is a constant int&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
And then:&lt;br /&gt;
&lt;br /&gt;
 int const &amp;amp; foo;&lt;br /&gt;
 // RTL reading gives &amp;quot;foo is a reference to a constant int&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 int const * foo;&lt;br /&gt;
 // RTL reading gives &amp;quot;foo is a pointer to a constant int&amp;quot;&lt;br /&gt;
&lt;br /&gt;
whereas:&lt;br /&gt;
&lt;br /&gt;
 int * const foo;&lt;br /&gt;
 // RTL reading gives &amp;quot;foo is a constant pointer to an int&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Read also:&lt;br /&gt;
* [http://www.cprogramming.com/tutorial/const_correctness.html Const Correctness]&lt;br /&gt;
* [http://yosefk.com/c++fqa/const.html Const Correctness]&lt;br /&gt;
&lt;br /&gt;
== Strings ==&lt;br /&gt;
Please make sure any user-visible strings are localizable.  This requires wrapping them with &amp;quot;_(&amp;quot; and &amp;quot;)&amp;quot;, like so:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&amp;quot;Select object&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
becomes&lt;br /&gt;
 &amp;lt;code&amp;gt;_(&amp;quot;Select object&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case the interpretation of the string may be ambiguous or may differ according to context, you can add a context prefix (that won't be displayed) in order to eliminate the ambiguity. &lt;br /&gt;
 &amp;lt;code&amp;gt;&amp;quot;Ambiguous string&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
can then become&lt;br /&gt;
 &amp;lt;code&amp;gt;C_(&amp;quot;Context&amp;quot;, &amp;quot;Ambiguous string&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more complex things, please check the gettext/localization documentation.&lt;br /&gt;
See also http://library.gnome.org/devel/glib/unstable/glib-I18N.html&lt;br /&gt;
&lt;br /&gt;
== Implementing User Interface Changes ==&lt;br /&gt;
&lt;br /&gt;
[[UI improvements]] are enjoyable to work on because they produce visible changes in how Inkscape works.  These improvements are one of the most tangible ways to help improve how Inkscape works; thus, we strongly support new developers wishing to work in these areas.&lt;br /&gt;
&lt;br /&gt;
It is also very important to us that Inkscape presents an organized, productive, and easily discoverable interface to users.  Because of this it is important that new Inkscape UI developers work to ensure changes make Inkscape’s UI *more* consistent, *more* flexible, *more* cohesive, and so on.  We don’t have firm rules about what can and cannot done, in order to ensure plenty of freedom for innovation.  However, we can outline some general principles and guidelines that are important to keep in mind:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;Don’t please the artist—BE the artist.&amp;lt;/strong&amp;gt;  Many times UI is designed and created by programmers who “understand what the user wants”.  But in Inkscape we believe that the best requirements list is the list inside the user’s head.  Requirements docs, usability studies, and so on are very indirect ways of transferring this gut-level understanding from user to programmer.  We believe the best way to ensure this information is communicated clearly is for the user to BE the programmer.  Or, alternatively, for the programmer to BECOME a user.&lt;br /&gt;
&lt;br /&gt;
This is why we so strongly encourage users to get involved in coding, and why we so strongly encourage programmers to focus on the features that are most important to them personally.  This is also why it is absolutely critical to pay close attention to what users report when using a new feature—often they can tip you off to alternate designs that achieve the same result in a better way.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;Eliminate limitations.&amp;lt;/strong&amp;gt; Commercial software is often developed to fulfill feature requirement lists from a marketing department.  As such, it’s common to see the feature implemented to meet the requirement exactly, and no more.  However, especially with artistic software, art is often found outside what seems reasonable.  So when putting in a new feature, avoid the temptation to limit it to what you expect people to use it for—instead generalize it and open as many parameters as possible for tweaking, and let the artist decide what is reasonable.  That’s their job.  &lt;br /&gt;
&lt;br /&gt;
As an example, a drawing program might want to support the features “feather” and “drop shadow”.  Obviously, users need these important features.  Commercial software may well implement these as distinct features, each with their own UI controls.  However, these features are just special cases of the more general gaussian blur, and in Inkscape we implemented *that*.  With that in place, artists can do feathering and blur, &amp;lt;em&amp;gt;and&amp;lt;/em&amp;gt; a variety of other effects.&lt;br /&gt;
&lt;br /&gt;
It is interesting to note that, as an open collaborative standard, SVG&lt;br /&gt;
necessarily has the same goals as Inkscape: a minimum set of&lt;br /&gt;
universal, well thought-out building blocks that can accommodate the&lt;br /&gt;
widest possible range of graphics and applications. Thus, simply by&lt;br /&gt;
following the SVG philosophy, Inkscape scores quite a few important&lt;br /&gt;
points over commercial software. Live clones, patterns that can be contain any&lt;br /&gt;
objects, layers that are essentially groups and can be easily&lt;br /&gt;
converted to/from groups.  These are all examples where the underlying&lt;br /&gt;
universality of SVG directly translates into extremely valuable user&lt;br /&gt;
features.&lt;br /&gt;
&lt;br /&gt;
== Implementing New SVG Features ==&lt;br /&gt;
&lt;br /&gt;
The most important way to help Inkscape is to implement a new SVG feature in it.  Our hope is to eventually support ALL SVG features, so if you can help check one off the list, it brings us close to the nirvana of 100% SVG compliance.  :-)&lt;br /&gt;
&lt;br /&gt;
Generally we find that implementation of an SVG feature goes through three discrete stages:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Find the appropriate tags and attributes in the SVG spec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Implement support for rendering files with these tags&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Implement support for UI controls to edit the tags&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Step 1 is mostly a research project.  Start by reading the SVG spec so you&lt;br /&gt;
can learn about the tag, the attributes that go with it, and so forth.&lt;br /&gt;
It is good practice to set up a page in the Wiki for storing your notes&lt;br /&gt;
as you do this process, so that in case you don’t make it to steps 2 and&lt;br /&gt;
3, then maybe someone else can benefit from your research.&lt;br /&gt;
&lt;br /&gt;
Step 2 is the fun part.  It helps to be comfortable with Inkscape internals&lt;br /&gt;
for this part.  Depending on the feature, it may require advanced&lt;br /&gt;
knowledge of transformation, rendering, document management, and so on.&lt;br /&gt;
For this part, just hand-edit an SVG file to put the tags in that you&lt;br /&gt;
found in step #1, and keep plugging away at the code until Inkscape&lt;br /&gt;
displays things as the specification dictates.  It can help to compare&lt;br /&gt;
your work with Batik, as we use that program as our reference&lt;br /&gt;
implementation.&lt;br /&gt;
&lt;br /&gt;
Step 3 is the most important stage. It is the point at which the&lt;br /&gt;
feature becomes available for users.  This step often requires knowledge&lt;br /&gt;
of Gtk+, for creating dialogs, widgets, menus, etc. for allowing the&lt;br /&gt;
user to edit the characteristics of the feature.  Be sure to listen to&lt;br /&gt;
feedback from other developers and users—especially if there are&lt;br /&gt;
different opinions.  It is hard to come up with UI that everyone can&lt;br /&gt;
agree on, but it is worth the work to achieve this—the more critique&lt;br /&gt;
your UI survives, the better loved the feature will be for future users.&lt;br /&gt;
&lt;br /&gt;
Looking through Inkscape’s history, these stages are often done by different people.  If you’re new to Inkscape, you may find working on stages 1 and 3 easiest, but there are many developers who can answer questions when you’re ready to dig into the internals, so don’t be afraid to ask questions!&lt;br /&gt;
&lt;br /&gt;
== Standards Compliance - Extension Namespaces ==&lt;br /&gt;
&lt;br /&gt;
* Only elements and attributes from our extension namespaces that ''do not affect rendering'' may be saved in SVG documents.&lt;br /&gt;
* Generally, this means that extension elements and attributes should only be used to provide UI hints.&lt;br /&gt;
* Extension elements and attributes should ''only'' be used where an existing facility provided by XML or SVG is not sufficient.&lt;br /&gt;
&lt;br /&gt;
== Global Verbs ==&lt;br /&gt;
&lt;br /&gt;
Here’s a readers’ digest summary of how Inkscape accelerators work:&lt;br /&gt;
&lt;br /&gt;
A global mapping between key combinations and integer [[verb]] IDs&lt;br /&gt;
(&amp;lt;code&amp;gt;sp_verb_t&amp;lt;/code&amp;gt;) is maintained in &amp;lt;code&amp;gt;shortcuts.cpp&amp;lt;/code&amp;gt;; these are registered using&lt;br /&gt;
&amp;lt;code&amp;gt;sp_shortcut_set()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Given an &amp;lt;code&amp;gt;sp_verb_t&amp;lt;/code&amp;gt; and an &amp;lt;code&amp;gt;SPView&amp;lt;/code&amp;gt;, you can get an SPAction which&lt;br /&gt;
represents that action in that view.  These mappings are currently&lt;br /&gt;
hard-coded in &amp;lt;code&amp;gt;verbs.cpp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SPActions&amp;lt;/code&amp;gt; derive from &amp;lt;code&amp;gt;NRActiveObject&amp;lt;/code&amp;gt;, which putatively provides a&lt;br /&gt;
“lightweight” method of doing callbacks (vs &amp;lt;code&amp;gt;GObject&amp;lt;/code&amp;gt; signals).  I&lt;br /&gt;
don’t completely understand how it works.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SPActions&amp;lt;/code&amp;gt; also contain the label, image, etc, used for buttons and&lt;br /&gt;
menuitems.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sp_shortcut_invoke()&amp;lt;/code&amp;gt; looks up the &amp;lt;code&amp;gt;SPAction&amp;lt;/code&amp;gt; for a keypress and &amp;lt;code&amp;gt;SPView&amp;lt;/code&amp;gt; and&lt;br /&gt;
invokes it automatically. &amp;lt;code&amp;gt;SPEventContexts&amp;lt;/code&amp;gt; call it for keypresses that they do not handle themselves.&lt;br /&gt;
&lt;br /&gt;
== Garbage collection ==&lt;br /&gt;
&lt;br /&gt;
As you know, many automatic garbage collectors (like &amp;lt;code&amp;gt;libgc&amp;lt;/code&amp;gt;) only&lt;br /&gt;
free and recycle memory periodically.  This means you may have some&lt;br /&gt;
extra slush that could be freed, but hasn’t yet.&lt;br /&gt;
&lt;br /&gt;
There are other forces at work, though...&lt;br /&gt;
&lt;br /&gt;
Pretty much all allocators, whether automatic or not, whether the&lt;br /&gt;
system &amp;lt;code&amp;gt;malloc()&amp;lt;/code&amp;gt; or some custom allocator like &amp;lt;code&amp;gt;libgc&amp;lt;/code&amp;gt;’s, work the&lt;br /&gt;
same way:  they request large blocks of memory from the operating&lt;br /&gt;
system, then divvy those blocks into smaller ones internally to&lt;br /&gt;
satisfy application allocation requests.&lt;br /&gt;
&lt;br /&gt;
When an application frees memory, that memory is usually recycled&lt;br /&gt;
internally rather than returned to the OS immediately.  The reason&lt;br /&gt;
for this is that the large memory blocks acquired from the OS must&lt;br /&gt;
be completely unused before they can actually be freed.&lt;br /&gt;
&lt;br /&gt;
For example, let’s say an allocator acquires 16 8MB blocks from&lt;br /&gt;
the OS in response to 32768 4k application allocations...&lt;br /&gt;
&lt;br /&gt;
In a worst-case scenario, it’s possible that the application could&lt;br /&gt;
free 32752 of those 4k blocks but the remaining 16 4k just happen&lt;br /&gt;
to be distributed across the 16 8MB blocks requested from the OS.&lt;br /&gt;
&lt;br /&gt;
If that happens, from the application’s point of view it may only&lt;br /&gt;
have 64k allocated, but as far as the OS is concerned, it’s still&lt;br /&gt;
using 128MB!&lt;br /&gt;
&lt;br /&gt;
Note that this applies to nearly all allocators in common use.&lt;br /&gt;
&lt;br /&gt;
While it’s unusual for things to get quite that bad, memory&lt;br /&gt;
fragmentation is common enough that many popular allocators (for&lt;br /&gt;
example Perl’s) simply don’t bother trying to return memory to the&lt;br /&gt;
OS at all (the memory will still get forcibly reclaimed by the OS&lt;br /&gt;
when the process exits).&lt;br /&gt;
&lt;br /&gt;
[ FWIW, &amp;lt;code&amp;gt;libgc&amp;lt;/code&amp;gt;’s allocator is one of the ones that _does_ make an&lt;br /&gt;
effort to release memory to the OS, but it is limited by&lt;br /&gt;
fragmentation like any other ]&lt;br /&gt;
&lt;br /&gt;
Also note that for various reasons, the statistics you get from the&lt;br /&gt;
OS aren’t going to directly reflect the amount of heap-allocated&lt;br /&gt;
memory.  Be careful drawing conclusions from only looking at e.g.&lt;br /&gt;
the output of &amp;lt;code&amp;gt;top(1)&amp;lt;/code&amp;gt;...&lt;br /&gt;
&lt;br /&gt;
(The worst thing is, due to the modern practice of&lt;br /&gt;
overcommitting memory, the OS may literally lie to an application&lt;br /&gt;
about the amount of memory it is being given, hoping the&lt;br /&gt;
application won’t really try to use it all.)&lt;br /&gt;
&lt;br /&gt;
The best approach to evaluating memory usage is if you can ask the&lt;br /&gt;
allocator for information on memory usage directly, as that matches&lt;br /&gt;
the world from the point of view of the application.&lt;br /&gt;
&lt;br /&gt;
leftover gradients/markers/patterns will get automatically cleaned up when the objects that use them are deleted.&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
&lt;br /&gt;
* this only applies to such objects created with a build of Inkscape which post-dates this commit (June 7 2004) &amp;lt;!-- (2009?) - no, June 7 2004. The date was added in [http://wiki.inkscape.org/wiki/index.php?title=Developer_manual&amp;amp;diff=prev&amp;amp;oldid=1233 Revision as of 06:00, 7 June 2004] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* not all automatically-created objects will necessarily be collected; the code that creates them needs to be updated to set the correct collection policy&lt;br /&gt;
&lt;br /&gt;
* paint objects won’t get collected until another editing operation takes place, since &amp;lt;code&amp;gt;NRArenaShape&amp;lt;/code&amp;gt; currently holds onto an &amp;lt;code&amp;gt;SPStyle&amp;lt;/code&amp;gt; for too long&lt;br /&gt;
&lt;br /&gt;
Technical details:&lt;br /&gt;
&lt;br /&gt;
Assuming its collection policy permits it, an object will be collected&lt;br /&gt;
if neither it nor its descendants have any outstanding inter-document&lt;br /&gt;
URI references (nonzero &amp;lt;code&amp;gt;SPObject::hrefcount&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
There are two “policies” for collecting orphans:&lt;br /&gt;
&lt;br /&gt;
* “with-parent” - the object will only be collected if one of its ancestors is collected&lt;br /&gt;
&lt;br /&gt;
* “always” - the object is always collected if unused&lt;br /&gt;
&lt;br /&gt;
(a third policy might be “never”, which would necessarily also prevent&lt;br /&gt;
that object’s ancestors from ever being collected; I do not plan on&lt;br /&gt;
implementing it)&lt;br /&gt;
&lt;br /&gt;
The policy in effect is determined by the inkscape:collect attribute.&lt;br /&gt;
&lt;br /&gt;
Be careful with the “always” policy; it really only makes sense for&lt;br /&gt;
“private” objects that are indirectly created behind the scenes (e.g. by&lt;br /&gt;
selecting a fill or marker option in the GUI).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SPDocument&amp;lt;/code&amp;gt; manages a queue of objects to collect; &amp;lt;code&amp;gt;SPObject&amp;lt;/code&amp;gt; handles the machinery for actually queueing them when their &amp;lt;code&amp;gt;hrefcount&amp;lt;/code&amp;gt; falls (based on policy), and performing the actual collection (&amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt;).&lt;br /&gt;
&amp;lt;code&amp;gt;SPDocument::collectObjects()&amp;lt;/code&amp;gt; performs a collection pass. It’s currently only called from &amp;lt;code&amp;gt;sp_document_maybe_done()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Inkscape Experimental SVN ==&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;experimental&amp;lt;/code&amp;gt; module in Inkscape SVN is provided as a kind of “scratchpad” for &lt;br /&gt;
working up new ideas that aren’t quite ready for folding into the main codebase.&lt;br /&gt;
This includes architectural sketches, examples, experimental patchsets, tools &amp;amp; utilities, or&lt;br /&gt;
whatever else strikes the developer’s fancy.&lt;br /&gt;
&lt;br /&gt;
Please create a subdirectory within &amp;lt;code&amp;gt;experimental/&amp;lt;/code&amp;gt; for your work. You’re welcome to either post&lt;br /&gt;
the stuff at the top level or create a subdirectory for yourself.  Things linked in at the top level&lt;br /&gt;
should be considered fair game for other developers to collaborate on; items posted under&lt;br /&gt;
a developer’s username should be considered ask-first.  Same sort of idea as wiki.&lt;br /&gt;
&lt;br /&gt;
One of the principles behind this module is the idea of a shared working space.  Other developers&lt;br /&gt;
working in experimental can fairly easily see what others are working on in the tree, and perhaps&lt;br /&gt;
borrow or contribute ideas back and forth.   Since it is by definition not ‘production’ code, the &lt;br /&gt;
work may be incomplete or in a non-compileable state...and that’s okay.&lt;br /&gt;
&lt;br /&gt;
When an experiment has matured to the point of being actually useful, please move it out of&lt;br /&gt;
the experimental module to someplace more appropriate.  Alternatively, if the experimental work has become obsolete or irrelevant, please remove it so we can avoid having the experimental tree get too bulky.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Directory Organization ==&lt;br /&gt;
&lt;br /&gt;
=== Distribution / Packaging Files ===&lt;br /&gt;
&lt;br /&gt;
Files related to generation of distribution packages should go under inkscape/packaging, as follows:&lt;br /&gt;
                                                                                      &lt;br /&gt;
    inkscape/packaging/&lt;br /&gt;
                       common/&lt;br /&gt;
                       debian/&lt;br /&gt;
                       fedora/&lt;br /&gt;
                       fink/&lt;br /&gt;
                       mandrake/&lt;br /&gt;
                       suse/&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;Share&amp;quot; Collateral ===&lt;br /&gt;
&lt;br /&gt;
A variety of items are installed in addition to the program itself, and placed into a &amp;lt;code&amp;gt;share&amp;lt;/code&amp;gt; directory structured as follows:&lt;br /&gt;
                                                                                      &lt;br /&gt;
    AUTHORS&lt;br /&gt;
    NEWS&lt;br /&gt;
    clipart/&lt;br /&gt;
    examples/&lt;br /&gt;
    extensions/&lt;br /&gt;
    fonts/&lt;br /&gt;
    gradients/&lt;br /&gt;
    icons/&lt;br /&gt;
    keyboards/&lt;br /&gt;
    markers/&lt;br /&gt;
    palettes/&lt;br /&gt;
    patterns/&lt;br /&gt;
    screens/&lt;br /&gt;
        about.svg&lt;br /&gt;
    templates/&lt;br /&gt;
    tutorials/&lt;br /&gt;
                                                                                      &lt;br /&gt;
In the SVN codebase, all of these are placed in &amp;lt;code&amp;gt;inkscape/share/&amp;lt;/code&amp;gt; (except &amp;lt;code&amp;gt;AUTHORS&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;NEWS&amp;lt;/code&amp;gt; which will be copied to share during installation.  The idea is that in theory, this entire tree structure can be copied into place on the user’s machine.  &lt;br /&gt;
&lt;br /&gt;
However, we need to provide the user some level of control over the installation.  They may wish to exclude some items, or may wish to augment the default install with some items external to the Inkscape package.  For example, they may wish to incorporate external clipart collections.  One approach would be to install symlinks in the given component directory to the external collection.  For example, if the flags package were to install into &amp;lt;code&amp;gt;/usr/share/flags-svg/&amp;lt;/code&amp;gt;, we’d just symlink there.&lt;br /&gt;
&lt;br /&gt;
=== Code modules ===&lt;br /&gt;
Several parts of the code were written in a modular way, and they have been&lt;br /&gt;
accordingly placed in subdirectories of &amp;lt;code&amp;gt;src/&amp;lt;/code&amp;gt;, while the main src directory&lt;br /&gt;
still contains the biggest part. To get a first overview of the modules, you&lt;br /&gt;
might want to have a look at these dependency graphs before you read deeper&lt;br /&gt;
into the source code (outside at the moment):&lt;br /&gt;
&amp;lt;s&amp;gt;&lt;br /&gt;
[http://www.ark.in-berlin.de/gri-debug.svgz]&lt;br /&gt;
[http://www.ark.in-berlin.de/gri-dialogs.svgz]&lt;br /&gt;
[http://www.ark.in-berlin.de/gri-display.svgz]&lt;br /&gt;
[http://www.ark.in-berlin.de/gri-io.svgz]&lt;br /&gt;
[http://www.ark.in-berlin.de/gri-libcroco.svgz]&lt;br /&gt;
[http://www.ark.in-berlin.de/gri-libnr.svgz]&lt;br /&gt;
[http://www.ark.in-berlin.de/gri-libnrtype.svgz]&lt;br /&gt;
[http://www.ark.in-berlin.de/gri-livarot.svgz]&lt;br /&gt;
[http://www.ark.in-berlin.de/gri-widgets.svgz]&lt;br /&gt;
[http://www.ark.in-berlin.de/gri-xml.svgz]&amp;lt;/s&amp;gt; (links broken)&lt;br /&gt;
&amp;lt;!-- Was this the equivalent to the current Doxygen graphs? http://jenkins.inkscape.org/job/Inkscape_trunk_doxygen/doxygen/ --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These are not all modules! For questions about how to generate these graphs&lt;br /&gt;
with graph-includes, please [mailto:rwst@users.sf.net].&lt;br /&gt;
&lt;br /&gt;
Question on &amp;lt;code&amp;gt;.svgz&amp;lt;/code&amp;gt; files: Is the server sending the right &amp;lt;code&amp;gt;Content-Encoding:&amp;lt;/code&amp;gt; header?&lt;br /&gt;
This matters to Mozilla browsers in standards compliance mode! http://jwatt.org/svg/authoring/#server-configuration&lt;br /&gt;
&lt;br /&gt;
= See Also =&lt;br /&gt;
* [[DirectoryReorgProposal]]&lt;br /&gt;
* [[InkscapeJanitors]]&lt;br /&gt;
* [[CompilingInkscape]]&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
[http://advogato.org/article/51.html Software Quality]&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer Documentation]]&lt;/div&gt;</summary>
		<author><name>Raphael</name></author>
	</entry>
</feed>