<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.inkscape.org/wiki/index.php?action=history&amp;feed=atom&amp;title=ExtensionsSystem</id>
	<title>ExtensionsSystem - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.inkscape.org/wiki/index.php?action=history&amp;feed=atom&amp;title=ExtensionsSystem"/>
	<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=ExtensionsSystem&amp;action=history"/>
	<updated>2026-04-08T16:07:52Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=ExtensionsSystem&amp;diff=80372&amp;oldid=prev</id>
		<title>Romain2Boss: /* Architecture of a Compliant Extension */ Some link cleaning</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=ExtensionsSystem&amp;diff=80372&amp;oldid=prev"/>
		<updated>2012-03-25T10:54:49Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Architecture of a Compliant Extension: &lt;/span&gt; Some link cleaning&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 10:54, 25 March 2012&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l74&quot;&gt;Line 74:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 74:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;       | svg_highlight --stroke-color=red --stroke-width=2px --id=rack_13 \&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;       | svg_highlight --stroke-color=red --stroke-width=2px --id=rack_13 \&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;       | svg_delete  --id=main_border --id=&amp;quot;legend_*&amp;quot; \&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;       | svg_delete  --id=main_border --id=&amp;quot;legend_*&amp;quot; \&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;       | svg_change_text --id=title_text --sed=&amp;quot;s&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[&lt;/del&gt;/Lab&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]] &lt;/del&gt;Diagram&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[&lt;/del&gt;/Rack&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]] &lt;/del&gt;Status/&amp;quot; \&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;       | svg_change_text --id=title_text --sed=&amp;quot;s/Lab Diagram/Rack Status/&amp;quot; \&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;       | sodipodi -z --export-png lab_diagram__rack_status.png&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;       | sodipodi -z --export-png lab_diagram__rack_status.png&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                                                                                  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                                                                                  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l110&quot;&gt;Line 110:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 110:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  1  - General failure&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  1  - General failure&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  2  - Memory error&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  2  - Memory error&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  3  - File I&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[&lt;/del&gt;/O&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]] &lt;/del&gt;error&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  3  - File I/O error&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  4  - Math error&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  4  - Math error&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  5  - Input not understood (not valid SVG?)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  5  - Input not understood (not valid SVG?)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Romain2Boss</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=ExtensionsSystem&amp;diff=27994&amp;oldid=prev</id>
		<title>Mfloryan: /* Key Requirements */</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=ExtensionsSystem&amp;diff=27994&amp;oldid=prev"/>
		<updated>2008-04-18T14:44:18Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Key Requirements&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 14:44, 18 April 2008&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l47&quot;&gt;Line 47:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 47:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                                                                                  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                                                                                  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Key Requirements ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Key Requirements ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* Extensions can be added to sodipodi without compiling it&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* Extensions can be invoked from the GUI Sodipodi&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* Extensions can be invoked from the commandline Sodipodi&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* Extensions can be organized into one or more menus and toolboxes&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* Quantity of extensions shall not delay program initialization&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* Extensions (incl init) shall not run in background&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* Authoring of an extension should be straightforward &amp;amp; easy to grok&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* Extensions shall operate on entire SVG documents&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* Extensions shall operate on fragments of SVG documents&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* Extensions shall operate on individual SVG entities&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* It shall be possible to write extensions in most any programming language&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;   * Extensions can be added to sodipodi without compiling it&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;   * Extensions can be invoked from the GUI Sodipodi&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;   * Extensions can be invoked from the commandline Sodipodi&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;   * Extensions can be organized into one or more menus and toolboxes&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;   * Quantity of extensions shall not delay program initialization&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;   * Extensions (incl init) shall not run in background&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;   * Authoring of an extension should be straightforward &amp;amp; easy to grok&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;   * Extensions shall operate on entire SVG documents&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;   * Extensions shall operate on fragments of SVG documents&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;   * Extensions shall operate on individual SVG entities&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;   * It shall be possible to write extensions in most any programming&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;     language&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                                                                                &lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Architecture of a Compliant Extension ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Architecture of a Compliant Extension ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Mfloryan</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=ExtensionsSystem&amp;diff=6978&amp;oldid=prev</id>
		<title>Colin Marquardt: +Category &quot;Wiki Attic&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=ExtensionsSystem&amp;diff=6978&amp;oldid=prev"/>
		<updated>2006-06-20T14:21:22Z</updated>

		<summary type="html">&lt;p&gt;+Category &amp;quot;Wiki Attic&amp;quot;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 14:21, 20 June 2006&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l366&quot;&gt;Line 366:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 366:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;-- Bryce W. Harrington&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;-- Bryce W. Harrington&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:Wiki Attic]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Colin Marquardt</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=ExtensionsSystem&amp;diff=1263&amp;oldid=prev</id>
		<title>Conversion script: link fix</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=ExtensionsSystem&amp;diff=1263&amp;oldid=prev"/>
		<updated>2006-01-22T02:32:59Z</updated>

		<summary type="html">&lt;p&gt;link fix&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;This is a copy of the original spec for the extensions system.  Part of this was accepted into the Sodipodi codebase.&lt;br /&gt;
This might be replaced by a more full-fledged plugin system in Inkscape at some point.  The original patch is at&lt;br /&gt;
http://developer.osdl.org/bryce/patches/sodipodi/extension_02/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sodipodi Simple Extension System ==&lt;br /&gt;
 &lt;br /&gt;
This specification describes a design for implementing extension&lt;br /&gt;
capabilities in Sodipodi, a 2D vector-based drawing application that&lt;br /&gt;
uses the Scalable Vector Graphics (SVG) file format and the GNOME&lt;br /&gt;
graphical user interface system.&lt;br /&gt;
 &lt;br /&gt;
The concept for this extension system is simple:  The user selects&lt;br /&gt;
some drawing elements within Sodipodi, and then chooses an extension&lt;br /&gt;
program to run on them.  Sodipodi renders the textual SVG code for the&lt;br /&gt;
elements and then pipes this data to the stdin of the extension&lt;br /&gt;
program.  The extension performs its operations and prints the&lt;br /&gt;
resulting SVG text to its stdout, which Sodipodi captures, parses, and&lt;br /&gt;
displays.  This can either be added to a new document or the same&lt;br /&gt;
document, and if the latter, it can either replace the original&lt;br /&gt;
selections or be added atop it.&lt;br /&gt;
 &lt;br /&gt;
The idea of &amp;quot;pipes&amp;quot; should resonate well with experienced UNIX users,&lt;br /&gt;
because of the value they provide in general day-to-day use at the&lt;br /&gt;
commandline.  This approach allows small general purpose tools to be&lt;br /&gt;
quickly combined to perform some specific purpose.&lt;br /&gt;
 &lt;br /&gt;
This is not a sophisticated, ultra-powerful, or high-performance&lt;br /&gt;
system, but it is not intended to be so.  The primary objectives this&lt;br /&gt;
design seeks to achieve are simplicity of interface, language&lt;br /&gt;
independence, and maximum flexibility.  We aim to permit even neophyte&lt;br /&gt;
programmers to be able to quickly throw together a little script to&lt;br /&gt;
conduct some necessary transformation, without needing to first learn&lt;br /&gt;
some new programming technologies.  We also aim to enable more&lt;br /&gt;
experienced software engineers to augment Sodipodi's functionality&lt;br /&gt;
in a modular fashion that is independent of core development.  And&lt;br /&gt;
further, we hope that by allowing extension-writing to be done in a&lt;br /&gt;
multiplicity of languages that we can take advantage of powerful&lt;br /&gt;
functionalities already available via other languages (such as Perl's&lt;br /&gt;
wealth of CPAN modules, or Java's XML manipulation technologies, or&lt;br /&gt;
C++-based graphic manipulation libraries).  This system may not be&lt;br /&gt;
able to intrinsically meet 100% of the desires one would wish for in a&lt;br /&gt;
powerful C-based plug-in system, but it hopefully will meet a sizable&lt;br /&gt;
chunk of the needs, and should be able to do so with minimal impact on&lt;br /&gt;
Sodipodi's internal development.&lt;br /&gt;
 &lt;br /&gt;
                                                                                &lt;br /&gt;
=== Key Requirements ===&lt;br /&gt;
&lt;br /&gt;
   * Extensions can be added to sodipodi without compiling it&lt;br /&gt;
   * Extensions can be invoked from the GUI Sodipodi&lt;br /&gt;
   * Extensions can be invoked from the commandline Sodipodi&lt;br /&gt;
   * Extensions can be organized into one or more menus and toolboxes&lt;br /&gt;
   * Quantity of extensions shall not delay program initialization&lt;br /&gt;
   * Extensions (incl init) shall not run in background&lt;br /&gt;
   * Authoring of an extension should be straightforward &amp;amp; easy to grok&lt;br /&gt;
   * Extensions shall operate on entire SVG documents&lt;br /&gt;
   * Extensions shall operate on fragments of SVG documents&lt;br /&gt;
   * Extensions shall operate on individual SVG entities&lt;br /&gt;
   * It shall be possible to write extensions in most any programming&lt;br /&gt;
     language&lt;br /&gt;
                                                                                &lt;br /&gt;
=== Architecture of a Compliant Extension ===&lt;br /&gt;
&lt;br /&gt;
The extension is implemented as a commandline filter that takes some&lt;br /&gt;
arbitrary SVG through stdin, conducts some operations, and returns&lt;br /&gt;
processed SVG through stdout.&lt;br /&gt;
                                                                                &lt;br /&gt;
The benefit of the stdin/stdout approach is that it allows them to be&lt;br /&gt;
pipe chained.  For example, if one wished to modify a stock diagram&lt;br /&gt;
of a data center lab by indicating status of particular machines with&lt;br /&gt;
color, one might approach it via a complex commandline such as:&lt;br /&gt;
                                                                                &lt;br /&gt;
 $ cat lab_diagram.svg \&lt;br /&gt;
      | svg_highlight --stroke-color=yellow --id=rack_24 --id=rack_42 \&lt;br /&gt;
      | svg_highlight --stroke-color=red --stroke-width=2px --id=rack_13 \&lt;br /&gt;
      | svg_delete  --id=main_border --id=&amp;quot;legend_*&amp;quot; \&lt;br /&gt;
      | svg_change_text --id=title_text --sed=&amp;quot;s[[/Lab]] Diagram[[/Rack]] Status/&amp;quot; \&lt;br /&gt;
      | sodipodi -z --export-png lab_diagram__rack_status.png&lt;br /&gt;
                                                                                &lt;br /&gt;
Extensions can also be run at the commandline as stand-alone filter&lt;br /&gt;
programs.  They are able to take a saved Sodipodi SVG file as input&lt;br /&gt;
and emit a changed files with exactly the same effects as if it were&lt;br /&gt;
invoked on the entire document within the Sodipodi GUI.&lt;br /&gt;
                                                                                &lt;br /&gt;
By being runnable from the commandline, these filters have a much larger&lt;br /&gt;
applicability because they can be useful tools in their own right.  For&lt;br /&gt;
instance, the above example could be tied to output from a status&lt;br /&gt;
sampler program such as Nagios to provide a dynamic graphic of the data&lt;br /&gt;
center's machine status.&lt;br /&gt;
                                                                                &lt;br /&gt;
Each extension has a set of extension-specificit 'parameters'&lt;br /&gt;
associated with it.  These parameters are used to control the&lt;br /&gt;
extension's behavior.  Each parameter is indicated via gnu-style,&lt;br /&gt;
double-dash option syntax (i.e., --blah --foo=bar).&lt;br /&gt;
                                                                                &lt;br /&gt;
If Sodipodi is running in GUI mode and some parameters for an invoked&lt;br /&gt;
extension require or permit user specification at runtime, then a GUI&lt;br /&gt;
dialog box will be displayed with the appropriate widgets shown to&lt;br /&gt;
allow data specification by the user.&lt;br /&gt;
                                                                                &lt;br /&gt;
The extension also accepts one or more filenames on the commandline.&lt;br /&gt;
If any filenames are provided, the extension will open and process those&lt;br /&gt;
files the same as if they'd been cat'ed to STDIN.  (This is the standard&lt;br /&gt;
behavior for Perl scripts when using the common `while (&amp;lt;&amp;gt;) {` syntax.)&lt;br /&gt;
                                                                                &lt;br /&gt;
The extension is required to provide an exit status value when it&lt;br /&gt;
completes.  These are as follows:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;0 - Extension-specific error&lt;br /&gt;
 0  - Success&lt;br /&gt;
 1  - General failure&lt;br /&gt;
 2  - Memory error&lt;br /&gt;
 3  - File I[[/O]] error&lt;br /&gt;
 4  - Math error&lt;br /&gt;
 5  - Input not understood (not valid SVG?)&lt;br /&gt;
 6  - Could not operate on any objects in this data stream&lt;br /&gt;
 7-127 - Reserved&lt;br /&gt;
                                                                                &lt;br /&gt;
If an extension returns any error value other than 0, it can also&lt;br /&gt;
print a textual error description (or stream) to STDERR.  This could&lt;br /&gt;
be used by Sodipodi to display error information to the user through a&lt;br /&gt;
GUI or stderr, and/or recorded into an error log.&lt;br /&gt;
                                                                                &lt;br /&gt;
In any case where the return value is non-zero, anything emitted to&lt;br /&gt;
STDOUT is discarded and ignored.&lt;br /&gt;
&lt;br /&gt;
=== Parseable Error Language ===&lt;br /&gt;
&lt;br /&gt;
If the first three characters of the STDERR stream match the characters&lt;br /&gt;
'#%%', then the stream is considered to be 'parseable error language'&lt;br /&gt;
text.  The remainder of the line following the '#%%' signifier is used&lt;br /&gt;
to specify the format and/or parsing options for the stream.  For&lt;br /&gt;
instance, if the first line matches '#%% INI', then the stream will be&lt;br /&gt;
interpreted as a line-oriented list of key=value pairs separated by&lt;br /&gt;
[sections].  The range of options supported by Sodipodi will be limited&lt;br /&gt;
(assuming any are available at all), so extension developers should take&lt;br /&gt;
care to select syntaxes that are well supported.&lt;br /&gt;
 &lt;br /&gt;
This 'parseable error language' system is completely optional for&lt;br /&gt;
extensions, and is not recommended for typical extensions.  It is&lt;br /&gt;
provided as a mechanism for allowing better interaction between an&lt;br /&gt;
extension and its caller than is available simply through error codes.&lt;br /&gt;
For instance, this could allow returning a list of per-entity error&lt;br /&gt;
messages, that Sodipodi could pop-up&lt;br /&gt;
 &lt;br /&gt;
For example, it could allow returning a long list of&lt;br /&gt;
error messages, with one message declared the &amp;quot;main error&amp;quot; and the&lt;br /&gt;
others provided for reference; or it could allow returning per-entity&lt;br /&gt;
error messages, that the calling application could display in&lt;br /&gt;
association with those objects; or it could permit returning error&lt;br /&gt;
information for input dialogs (e.g., if the user has provided invalid&lt;br /&gt;
input data), allowing them to re-edit and re-run the extension.&lt;br /&gt;
 &lt;br /&gt;
=== Extension Registration ===&lt;br /&gt;
&lt;br /&gt;
Extension registration is controlled and cached by Sodipodi and occurs&lt;br /&gt;
automatically when Sodipodi is started up.&lt;br /&gt;
 &lt;br /&gt;
Each extension is housed in its own subdirectory and is composed of&lt;br /&gt;
the following files:&lt;br /&gt;
 &lt;br /&gt;
* Toolbutton image&lt;br /&gt;
* Config file (XML)&lt;br /&gt;
* Main executable&lt;br /&gt;
* Additional code files (optional)&lt;br /&gt;
* README, COPYING, AUTHORS, Changes, etc.&lt;br /&gt;
 &lt;br /&gt;
The process of installation of these files is left to the&lt;br /&gt;
responsibility of the extension in question.  For instance, they could&lt;br /&gt;
be installed via RPM, make, or even generated by the script itself&lt;br /&gt;
(e.g., like 'shar').  If the extension does not provide a toolbar&lt;br /&gt;
image or config file, generic defaults will be used.&lt;br /&gt;
 &lt;br /&gt;
Sodipodi maintains a global XML config file with information about&lt;br /&gt;
each extension, taken from the extension's config file.  During&lt;br /&gt;
program initialization, it will look in the various places where&lt;br /&gt;
Sodipodi extensions can be installed, for any config files with&lt;br /&gt;
timestamps newer than the last time it loaded them.  If it finds such&lt;br /&gt;
a file, it will re-parse that file and load it in place of the old&lt;br /&gt;
data.  The reason for using this procedure is because it is believed&lt;br /&gt;
that loading and parsing a single config file, coupled with simple&lt;br /&gt;
directory checking operations will be significantly faster than&lt;br /&gt;
parsing individual extension config files during each activation.&lt;br /&gt;
                                                                                &lt;br /&gt;
In the master config file, each extension is registered with the&lt;br /&gt;
following information:&lt;br /&gt;
                                                                                &lt;br /&gt;
* Extension title&lt;br /&gt;
* State (active / inactive / etc.)&lt;br /&gt;
* Description&lt;br /&gt;
* Path (e.g., /usr/share/sodipodi/extensions/foobar/)&lt;br /&gt;
* Toolbutton image filename&lt;br /&gt;
* Executable filename&lt;br /&gt;
* Help document filename&lt;br /&gt;
* List of parameters with type and default value&lt;br /&gt;
* Class(es) of data it acts on (text, nodes, etc.)&lt;br /&gt;
* Whether data is replaced, added, or added to new doc&lt;br /&gt;
* Toolbox menu location&lt;br /&gt;
* Toolbox menu state (closed, etc.)&lt;br /&gt;
* Timestamp of last loading&lt;br /&gt;
                                                                                &lt;br /&gt;
Sodipodi includes some information about extensions that are not&lt;br /&gt;
necessarily present in the extension config file.  In addition, the&lt;br /&gt;
extension may incorporate other information into its config file that&lt;br /&gt;
Sodipodi may ignore and not load into the master config.&lt;br /&gt;
                                                                                &lt;br /&gt;
Overriding of some of this information is optionally permitted via the&lt;br /&gt;
user's preferences file.  These overrides are always preserved (on a&lt;br /&gt;
per-user basis) even if the global config file is regenerated.  This&lt;br /&gt;
capability is included to permit, for instance, per-user&lt;br /&gt;
reorganization of the toolbox menu structure.  The management of this&lt;br /&gt;
preference information is outside the scope of this document.&lt;br /&gt;
                                                                                &lt;br /&gt;
The benefit of loading from a global config file is that generally one&lt;br /&gt;
need only perform a single file-parse step during program&lt;br /&gt;
initialization, which should help avoid excessive paging, etc.  It is&lt;br /&gt;
particularly advantageous if one is loading a large number (hundreds)&lt;br /&gt;
of plugins, or are running in a very tight-memory situation.&lt;br /&gt;
                                                                                &lt;br /&gt;
Extensions are not allowed to modify this global config file directly.&lt;br /&gt;
They instead can update their personal config file (during&lt;br /&gt;
installation or upgrades), and Sodipodi will re-parse these as&lt;br /&gt;
appropriate.  Sodipodi will not make any changes to the individual&lt;br /&gt;
extension's config file directly.  In any case where config&lt;br /&gt;
information needs to be stored in the extension's config file,&lt;br /&gt;
Sodipodi will supply this information through the normal&lt;br /&gt;
commandline-option-based interface, and the extension will be&lt;br /&gt;
responsible for making the appropriate alterations to its config file.&lt;br /&gt;
                                                                                &lt;br /&gt;
A command will also be provided within Sodipodi's menubar to permit&lt;br /&gt;
regeneration of the master config file from all of the extension&lt;br /&gt;
configs.  This command will also be available as a commandline option&lt;br /&gt;
for the sodipodi executable.&lt;br /&gt;
                                                                                &lt;br /&gt;
 # Remaining Questions&lt;br /&gt;
 #&lt;br /&gt;
 # What format/schema is the master config file?&lt;br /&gt;
 #&lt;br /&gt;
 # What API (i.e., std cmdline option) should be used to specify&lt;br /&gt;
 # config values to add to the extension's config file?&lt;br /&gt;
                                                                                &lt;br /&gt;
                                                                                &lt;br /&gt;
=== Extension Operation ===&lt;br /&gt;
&lt;br /&gt;
When an extension is invoked from Sodipodi, the currently selected SVG&lt;br /&gt;
elements are serialized into textual SVG document fragments and piped&lt;br /&gt;
to the extension executable's stdin.  Sodipodi receives the resulting&lt;br /&gt;
stdout from the pipe in textual SVG form.  This is reparsed into&lt;br /&gt;
internal data elements by a method in repr-io.c in Sodipodi.  If this&lt;br /&gt;
parsing is successful and results in valid objects, the original&lt;br /&gt;
elements are deleted and replaced with the ones generated by the&lt;br /&gt;
script.&lt;br /&gt;
                                                                                &lt;br /&gt;
The operations performed by the extension are treated as a single&lt;br /&gt;
conceptual &amp;quot;change&amp;quot; for purposes of bookkeeping undo/redo, cache, etc.&lt;br /&gt;
                                                                                &lt;br /&gt;
Each extension specifies the classes and quantities of SVG elements it&lt;br /&gt;
can operate on in its config file.  Sodipodi could use this&lt;br /&gt;
information, for example, to determine when to &amp;quot;grey out&amp;quot; and&lt;br /&gt;
invalidate buttons of extensions that cannot be used on the current&lt;br /&gt;
selection.  Note that the extension mustn't assume that the data it is&lt;br /&gt;
passed is validated to meet these criteria before being called, and&lt;br /&gt;
should always perform data filtering and validation itself, on the&lt;br /&gt;
data it is given; consider for instance a case where the extension is&lt;br /&gt;
used on the commandline on a SVG file directly.&lt;br /&gt;
                                                                                &lt;br /&gt;
Any valid SVG element (line, circle, rectangle, text, etc.) recognized&lt;br /&gt;
by Sodipodi may be used for the class specification.  In addition,&lt;br /&gt;
individual nodes and the document itself (with no contents) are valid&lt;br /&gt;
types for extensions to operate on.  A method in sp-obect-repr.c will&lt;br /&gt;
be used to get a dynamic list of element classes.&lt;br /&gt;
                                                                                &lt;br /&gt;
Extensions may specify classes higher in the inheritance chain, so&lt;br /&gt;
that for example one can specify that it operates on 'shapes' in&lt;br /&gt;
general, including rects, lines, spirals and whatever new types there&lt;br /&gt;
may be added in future.&lt;br /&gt;
Quantities can be specified as ranges and/or comma separated lists,&lt;br /&gt;
for instance, &amp;quot;1+&amp;quot;, &amp;quot;2&amp;quot;, &amp;quot;2,4,6,8,10&amp;quot;, or &amp;quot;2,4-42&amp;quot;.&lt;br /&gt;
                                                                                &lt;br /&gt;
SVG DOM syntax is used to specify the naming/inheritance.  Sodipodi&lt;br /&gt;
will implement some DOM name queries to support this.&lt;br /&gt;
                                                                                &lt;br /&gt;
Note that as of this writing, Sodipodi does not implement&lt;br /&gt;
button-invalidation, but something like Qt 'actions' may be&lt;br /&gt;
implemented to support this in the future.&lt;br /&gt;
                                                                                &lt;br /&gt;
 # Remaining Questions&lt;br /&gt;
 #&lt;br /&gt;
 # Is it possible to pass a nodal entity and specify a subset of its&lt;br /&gt;
 # nodes to operate upon?  How?&lt;br /&gt;
                                                                                &lt;br /&gt;
                                                                                &lt;br /&gt;
=== Extension Interface Specification ====&lt;br /&gt;
&lt;br /&gt;
Some extensions can act directly on the elements selected, but many&lt;br /&gt;
will require further information to quantify &amp;amp; specify the parameters&lt;br /&gt;
that control their operation.  For example, an extension that&lt;br /&gt;
stretches elements would need to know what percentage to stretch the&lt;br /&gt;
object.  Another might need to know a color to use, or replacement&lt;br /&gt;
text for search and replace, etc.&lt;br /&gt;
                                                                                &lt;br /&gt;
Rather than require each extension to implement GUI behaviors&lt;br /&gt;
independently (using Gtk bindings, Tk, etc.) this design includes&lt;br /&gt;
provision for extensions to provide interface &amp;quot;descriptions&amp;quot;, which&lt;br /&gt;
Sodipodi can parse and use to dynamically generate dialogs for the&lt;br /&gt;
extension.  In addition to simplifying the work facing extension&lt;br /&gt;
authors, this will provide more consistency of interface to end users,&lt;br /&gt;
and avoid a class of portability issues, should one wish, for example,&lt;br /&gt;
to use the scripts on a non-UNIX O[[/S]].&lt;br /&gt;
                                                                                &lt;br /&gt;
This interface description language must provide easy specification of&lt;br /&gt;
the widgets and text for the dialog, such as buttons, input boxes,&lt;br /&gt;
color/alpha selectors, dropdown boxes, radio buttons, checkboxes,&lt;br /&gt;
selection lists, gradient boxes, preview thumbnails, tree displays&lt;br /&gt;
(e.g., for XML editing, etc.).  It must allow precise positioning and&lt;br /&gt;
sizing of the widgets, but also allow auto-layout (so that one can&lt;br /&gt;
simply provide a list of text+widget_type pairs and the widgets placed&lt;br /&gt;
onto the dialog in a running list.  This way, extension authors can&lt;br /&gt;
specify the dialogs with a minimum of fuss, but can also have more&lt;br /&gt;
exact control over the layout of the form if they wish.&lt;br /&gt;
                                                                                &lt;br /&gt;
Parameter settings are not expected to be kept from one invocation of&lt;br /&gt;
the extension to the next.  If it is found to be necessary, it should&lt;br /&gt;
be provided via Sodipodi, rather than by the extension.&lt;br /&gt;
                                                                                &lt;br /&gt;
 # Remaining Questions:&lt;br /&gt;
 #&lt;br /&gt;
 # Should the interface definition be taken from config file&lt;br /&gt;
 # or queried from the script?&lt;br /&gt;
 #&lt;br /&gt;
 # What already-existing interface abstraction languages exist?&lt;br /&gt;
 #&lt;br /&gt;
 # How would multi-dialog interfaces be implemented?&lt;br /&gt;
                                                                                &lt;br /&gt;
                                                                                &lt;br /&gt;
=== Extension Examples ===&lt;br /&gt;
&lt;br /&gt;
The following cases are provided as &amp;quot;use cases&amp;quot; to help conceive the&lt;br /&gt;
way the extension system should/could work.  It should be clear that&lt;br /&gt;
some of these functions, while of obvious utility to certain&lt;br /&gt;
userbases, are too application specific to be worth incorporating into&lt;br /&gt;
Sodipodi's core.&lt;br /&gt;
                                                                                &lt;br /&gt;
                                                                                &lt;br /&gt;
Spellcheck: Checks spelling of text in document and changes color of&lt;br /&gt;
misspelled words to red.  This would be invaluable if one is producing&lt;br /&gt;
                                                                                &lt;br /&gt;
Translate:  Converts selected text into alternative language using&lt;br /&gt;
separate translation application.&lt;br /&gt;
                                                                                &lt;br /&gt;
Align_to_grid:  Adjusts all selected elements to line up to the&lt;br /&gt;
document grid.  Resizes objects so that all corners touch on grid&lt;br /&gt;
corner points.&lt;br /&gt;
                                                                                &lt;br /&gt;
Data_center_status:  Queries database of computer hardware and&lt;br /&gt;
generates a map of the machine room using color to indicate state of&lt;br /&gt;
computer racks.&lt;br /&gt;
                                                                                &lt;br /&gt;
Fractalize:  Changes a nodal line or shape's border to be&lt;br /&gt;
roughened using fractals.  This could be useful for creation of&lt;br /&gt;
realistic-looking coastlines in a map.&lt;br /&gt;
&lt;br /&gt;
Weave: Takes two overlapping curved lines and &amp;quot;weaves&amp;quot; them to&lt;br /&gt;
resemble a scroll-work rope such as is common in Celtic art.&lt;br /&gt;
&lt;br /&gt;
-- Bryce W. Harrington&lt;/div&gt;</summary>
		<author><name>Conversion script</name></author>
	</entry>
</feed>