# HG changeset patch # User wycc # Date 1236477983 -28800 # Node ID 9c006581f0cd970afb6b06c1fb7d8eb460d70fbb # Parent 6e01d3d7d104e48b3ce035b5bfd69541070d829d# Parent 6a1b36738d3de86381e6b4fd31c1befa2b68cfb5 merge diff -r 6a1b36738d3d -r 9c006581f0cd inkscape/firefox/INSTALL --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inkscape/firefox/INSTALL Sun Mar 08 10:06:23 2009 +0800 @@ -0,0 +1,10 @@ +# Installation in ubuntu 8.1 + +* Install required modules + * sudo apt-get install python-soappy python-twisted mozplugger python-lxml +* Install inkscape for madbutterfly + * tar -C / -xzvf inkscape-mb.tgz +* Install madbuilder + * firefox madbuilder.xpi + +* Restart firefox and select the MadBuilder under tools diff -r 6a1b36738d3d -r 9c006581f0cd inkscape/firefox/MBServer.py --- a/inkscape/firefox/MBServer.py Sun Mar 08 00:15:21 2009 +0800 +++ b/inkscape/firefox/MBServer.py Sun Mar 08 10:06:23 2009 +0800 @@ -476,7 +476,7 @@ except: return traceback.format_exc() import os -os.chdir('/usr/share/inkscape/extensions') +os.chdir('/usr/local/share/inkscape/extensions') A = MBScene() A.affect() diff -r 6a1b36738d3d -r 9c006581f0cd inkscape/firefox/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inkscape/firefox/Makefile Sun Mar 08 10:06:23 2009 +0800 @@ -0,0 +1,35 @@ +all: madbuilder.xpi inkscape-mb + +madbuilder.xpi: chrome.manifest install.rdf content/* + zip madbuilder.xpi chrome.manifest content/* install.rdf README + +inkscape-0.46.tar.gz: + wget -O inkscape-0.46.tar.gz http://nchc.dl.sourceforge.net/sourceforge/inkscape/inkscape-0.46.tar.gz + +inkscape-0.46/.configured: inkscape-0.46.tar.gz + tar xzvf inkscape-0.46.tar.gz + cd inkscape-0.46; patch -p1 < ../inkscape-mb-patch.diff ; ./configure + touch inkscape-0.46/.configured + +inkscape-0.46/.compiled: inkscape-0.46/.configured + cd inkscape-0.46; make -j 2 + touch inkscape-0.46/.compiled + +inkscape-mb: inkscape-0.46/.compiled + rm -rf inkscape-0.46/dest + - mkdir -p inkscape-0.46/dest/usr/local + cd inkscape-0.46; make prefix=`pwd`/dest/usr/local install + cp MBFilter.inx MBServer.py testsoap.py inkscape-0.46/dest/usr/local/share/inkscape/extensions + cp helper_mb.py inkscape-0.46/dest/usr/local/bin + chmod +x inkscape-0.46/dest/usr/local/bin/helper_mb.py + mv inkscape-0.46/dest/usr/local/bin/inkscape inkscape-0.46/dest/usr/local/bin/inkscape-mb + cd inkscape-0.46/dest; tar czvf ../../inkscape-mb.tgz usr + + + +mozplugger: + + +clean: + rm -f inkscape-0.46/.configured inkscape-0.46/.compiled + make -C inkscape-0.46 clean diff -r 6a1b36738d3d -r 9c006581f0cd inkscape/firefox/README --- a/inkscape/firefox/README Sun Mar 08 00:15:21 2009 +0800 +++ b/inkscape/firefox/README Sun Mar 08 10:06:23 2009 +0800 @@ -1,3 +1,13 @@ +Installation +======================================= +(1) Install mozplugger +(2) Install twisted & python +(3) Install soappy +(4) Install madbuilder.xpi + + + + How to execute the unit test ====================================== diff -r 6a1b36738d3d -r 9c006581f0cd inkscape/firefox/active-empty.png Binary file inkscape/firefox/active-empty.png has changed diff -r 6a1b36738d3d -r 9c006581f0cd inkscape/firefox/active-empty.svg --- a/inkscape/firefox/active-empty.svg Sun Mar 08 00:15:21 2009 +0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,74 +0,0 @@ - - - - - - - - - - - image/svg+xml - - - - - - - - diff -r 6a1b36738d3d -r 9c006581f0cd inkscape/firefox/active-fill.png Binary file inkscape/firefox/active-fill.png has changed diff -r 6a1b36738d3d -r 9c006581f0cd inkscape/firefox/active-fill.svg --- a/inkscape/firefox/active-fill.svg Sun Mar 08 00:15:21 2009 +0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,81 +0,0 @@ - - - - - - - - - - - image/svg+xml - - - - - - - - - diff -r 6a1b36738d3d -r 9c006581f0cd inkscape/firefox/active-start.png Binary file inkscape/firefox/active-start.png has changed diff -r 6a1b36738d3d -r 9c006581f0cd inkscape/firefox/active-start.svg --- a/inkscape/firefox/active-start.svg Sun Mar 08 00:15:21 2009 +0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,91 +0,0 @@ - - - - - - - - - - - image/svg+xml - - - - - - - - - - diff -r 6a1b36738d3d -r 9c006581f0cd inkscape/firefox/chrome.manifest --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inkscape/firefox/chrome.manifest Sun Mar 08 10:06:23 2009 +0800 @@ -0,0 +1,2 @@ +content MadBuilder content/ +overlay chrome://browser/content/browser.xul chrome://MadBuilder/content/MadBuilderOverlay.xul diff -r 6a1b36738d3d -r 9c006581f0cd inkscape/firefox/content/MadBuilderOverlay.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inkscape/firefox/content/MadBuilderOverlay.js Sun Mar 08 10:06:23 2009 +0800 @@ -0,0 +1,6 @@ +function start_madbuilder() { + var url = "chrome://MadBuilder/content/madbuilder.html"; + var browser = document.getElementById("content"); + + browser.loadURI(url, null, null, true); +} diff -r 6a1b36738d3d -r 9c006581f0cd inkscape/firefox/content/MadBuilderOverlay.xul --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inkscape/firefox/content/MadBuilderOverlay.xul Sun Mar 08 10:06:23 2009 +0800 @@ -0,0 +1,14 @@ + + + + + + + + + + + +
+
+ +
+ Jump + Insert + Extend + Delete + Make Symbol + make Button +
+
+
+
+
+ + + diff -r 6a1b36738d3d -r 9c006581f0cd inkscape/firefox/content/scene.mbsvg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inkscape/firefox/content/scene.mbsvg Sun Mar 08 10:06:23 2009 +0800 @@ -0,0 +1,105 @@ + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff -r 6a1b36738d3d -r 9c006581f0cd inkscape/firefox/content/start.png Binary file inkscape/firefox/content/start.png has changed diff -r 6a1b36738d3d -r 9c006581f0cd inkscape/firefox/content/start.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inkscape/firefox/content/start.svg Sun Mar 08 10:06:23 2009 +0800 @@ -0,0 +1,91 @@ + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff -r 6a1b36738d3d -r 9c006581f0cd inkscape/firefox/empty.png Binary file inkscape/firefox/empty.png has changed diff -r 6a1b36738d3d -r 9c006581f0cd inkscape/firefox/empty.svg --- a/inkscape/firefox/empty.svg Sun Mar 08 00:15:21 2009 +0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,74 +0,0 @@ - - - - - - - - - - - image/svg+xml - - - - - - - - diff -r 6a1b36738d3d -r 9c006581f0cd inkscape/firefox/fill.png Binary file inkscape/firefox/fill.png has changed diff -r 6a1b36738d3d -r 9c006581f0cd inkscape/firefox/fill.svg --- a/inkscape/firefox/fill.svg Sun Mar 08 00:15:21 2009 +0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,81 +0,0 @@ - - - - - - - - - - - image/svg+xml - - - - - - - - - diff -r 6a1b36738d3d -r 9c006581f0cd inkscape/firefox/helper_mb.py --- a/inkscape/firefox/helper_mb.py Sun Mar 08 00:15:21 2009 +0800 +++ b/inkscape/firefox/helper_mb.py Sun Mar 08 10:06:23 2009 +0800 @@ -71,9 +71,11 @@ self.client.SCENE(n).addCallback(self.generic_return,d) return d def generic_return(self,result,d): + print "Get result:" print [result] d.callback(result) def generic_error(self,result,d): + print "Error:" print [result] d.errback(result) def soap_START(self): @@ -82,15 +84,28 @@ time.sleep(1) self.client = Client() return "OK" + def getdoc_error(self,result,d): + try: + print "reconnect" + time.sleep(1) + os.kill(self.pid,12) + op = self.client.GETDOC() + op.addCallback(self.generic_return,d) + op.addErrback(self.getdoc_error,d) + except: + traceback.print_exc() def soap_GETDOC(self): try: print "xxxxx" if self.client == None: - os.kill(self.pid,12) - time.sleep(1) + while os.kill(self.pid,12)<0: + time.sleep(1) + self.client = Client() d = defer.Deferred() - self.client.GETDOC().addCallback(self.generic_return,d) + op = self.client.GETDOC() + op.addCallback(self.generic_return,d) + op.addErrback(self.getdoc_error,d) print "yyy" return d except: @@ -109,13 +124,25 @@ def INSERTKEY(self,layer,n): return self.proxy.callRemote('INSERTKEY',layer,n) def GETDOC(self): - return self.proxy.callRemote('GETDOC') + doc = self.proxy.callRemote('GETDOC') + return doc def EXTENDSCENE(self,layer,n): return self.proxy.callRemote('EXTENDSCENE',layer,n) def DELETESCENE(self,layer,n): return self.proxy.callRemote('DELETESCENE',layer,n) os.system("killall -9 inkscape-mb") +try: + f = open("/tmp/madbuilder.pid","r") + pid = int(f.read()) + f.close() + os.system("kill -9 %d" % pid) + f = open("/tmp/madbuilder.pid","w") + f.write("%d\n" % os.getpid()) + f.close() +except: + traceback.print_exc() + pid = os.fork() if pid==0: os.execvp("inkscape-mb",["inkscape-mb","/tmp/scene.mbsvg"]) @@ -123,7 +150,11 @@ s.client = None s.pid = pid site = server.Site(s) +# Sleep for two seconds to wait for the inkscape become ready. It seems that our inkscape modification has +# semaphore issue so that it will be blocked if we connect to it in early stage. We need to check it and +# remove the following wait in the future. reactor.listenTCP(19192,site) +time.sleep(5) reactor.run() diff -r 6a1b36738d3d -r 9c006581f0cd inkscape/firefox/inkscape-mb-patch.diff --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inkscape/firefox/inkscape-mb-patch.diff Sun Mar 08 10:06:23 2009 +0800 @@ -0,0 +1,278 @@ +diff -cr inkscape-0.46/share/ui/menus-bars.xml inkscape-0.46-mb/share/ui/menus-bars.xml +*** inkscape-0.46/share/ui/menus-bars.xml 2008-03-11 12:21:15.000000000 +0800 +--- inkscape-0.46-mb/share/ui/menus-bars.xml 2009-01-18 12:09:57.000000000 +0800 +*************** +*** 22,27 **** +--- 22,28 ---- + + + ++ + + + +diff -cr inkscape-0.46/src/dom/io/uristream.cpp inkscape-0.46-mb/src/dom/io/uristream.cpp +*** inkscape-0.46/src/dom/io/uristream.cpp 2008-03-11 12:19:31.000000000 +0800 +--- inkscape-0.46-mb/src/dom/io/uristream.cpp 2008-11-04 23:08:25.000000000 +0800 +*************** +*** 39,45 **** + * Released under GNU GPL, read the file 'COPYING' for more information + */ + +! + #include "uristream.h" + + +--- 39,45 ---- + * Released under GNU GPL, read the file 'COPYING' for more information + */ + +! #include + #include "uristream.h" + + +diff -cr inkscape-0.46/src/extension/effect.cpp inkscape-0.46-mb/src/extension/effect.cpp +*** inkscape-0.46/src/extension/effect.cpp 2008-03-11 12:20:24.000000000 +0800 +--- inkscape-0.46-mb/src/extension/effect.cpp 2009-01-18 10:54:48.000000000 +0800 +*************** +*** 27,32 **** +--- 27,35 ---- + namespace Extension { + + Effect * Effect::_last_effect = NULL; ++ #ifdef CONF_MADBUTTERFLY ++ Effect * Effect::MadButterflyEffect = NULL; ++ #endif + Inkscape::XML::Node * Effect::_effects_list = NULL; + + Effect::Effect (Inkscape::XML::Node * in_repr, Implementation::Implementation * in_imp) +*************** +*** 44,49 **** +--- 47,58 ---- + if (!strcmp(this->get_id(), "org.inkscape.filter.dropshadow")) + return; + ++ #ifdef CONF_MADBUTTERFLY ++ if (!strcmp(this->get_id(),"net.sourceforge.madbutterfly.filter.update")) { ++ MadButterflyEffect = this; ++ } ++ #endif ++ + bool hidden = false; + + no_doc = false; +diff -cr inkscape-0.46/src/extension/effect.h inkscape-0.46-mb/src/extension/effect.h +*** inkscape-0.46/src/extension/effect.h 2008-03-11 12:20:18.000000000 +0800 +--- inkscape-0.46-mb/src/extension/effect.h 2009-01-18 09:51:23.000000000 +0800 +*************** +*** 40,45 **** +--- 40,48 ---- + /** \brief This is the last effect that was used. This is used in + a menu item to rapidly recall the same effect. */ + static Effect * _last_effect; ++ #ifdef CONF_MADBUTTERFLY ++ static Effect * MadButterflyEffect; ++ #endif + /** \brief The location of the effects menu on the menu structure + XML file. This is saved so it only has to be discovered + once. */ +*************** +*** 120,125 **** +--- 123,131 ---- + + /** \brief Static function to get the last effect used */ + static Effect * get_last_effect (void) { return _last_effect; }; ++ #ifdef CONF_MADBUTTERFLY ++ static Effect * get_madbutterfly_effect (void) { return MadButterflyEffect; }; ++ #endif + static void set_last_effect (Effect * in_effect); + + static void place_menus (void); +diff -cr inkscape-0.46/src/extension/init.cpp inkscape-0.46-mb/src/extension/init.cpp +*** inkscape-0.46/src/extension/init.cpp 2008-03-11 12:20:24.000000000 +0800 +--- inkscape-0.46-mb/src/extension/init.cpp 2009-01-18 10:16:51.000000000 +0800 +*************** +*** 97,103 **** + #include "internal/bitmap/unsharpmask.h" + #include "internal/bitmap/wave.h" + #endif /* WITH_IMAGE_MAGICK */ +! + extern gboolean inkscape_app_use_gui( Inkscape::Application const *app ); + + namespace Inkscape { +--- 97,103 ---- + #include "internal/bitmap/unsharpmask.h" + #include "internal/bitmap/wave.h" + #endif /* WITH_IMAGE_MAGICK */ +! #include "effect.h" + extern gboolean inkscape_app_use_gui( Inkscape::Application const *app ); + + namespace Inkscape { +diff -cr inkscape-0.46/src/inkscape.cpp inkscape-0.46-mb/src/inkscape.cpp +*** inkscape-0.46/src/inkscape.cpp 2008-03-11 12:20:05.000000000 +0800 +--- inkscape-0.46-mb/src/inkscape.cpp 2009-01-21 23:48:17.000000000 +0800 +*************** +*** 61,66 **** +--- 61,68 ---- + #include "prefs-utils.h" + #include "xml/repr.h" + #include "io/sys.h" ++ #include "verbs.h" ++ #include "helper/action.h" + + #include "extension/init.h" + +*************** +*** 577,582 **** +--- 579,596 ---- + } + + ++ #ifdef CONF_MADBUTTERFLY ++ void ++ inkscape_int_handler(int signo) ++ { ++ SPDesktop *desk = inkscape_active_desktop(); ++ Inkscape::Verb *v = Inkscape::Verb::get(SP_VERB_EFFECT_MADBUTTERFLY); ++ SPAction *act = v->get_action(desk); ++ if (act) ++ sp_action_perform(act,NULL); ++ signal(SIGINT, inkscape_int_handler); ++ } ++ #endif + + void + inkscape_application_init (const gchar *argv0, gboolean use_gui) +*************** +*** 591,596 **** +--- 605,613 ---- + #ifndef WIN32 + bus_handler = signal (SIGBUS, inkscape_crash_handler); + #endif ++ //#ifdef CONF_MADBUTTERFLY ++ signal(SIGUSR2, inkscape_int_handler); ++ //#endif + + inkscape->use_gui = use_gui; + inkscape->argv0 = g_strdup(argv0); +diff -cr inkscape-0.46/src/verbs.cpp inkscape-0.46-mb/src/verbs.cpp +*** inkscape-0.46/src/verbs.cpp 2008-03-11 12:20:07.000000000 +0800 +--- inkscape-0.46-mb/src/verbs.cpp 2009-01-18 12:04:40.000000000 +0800 +*************** +*** 1903,1908 **** +--- 1903,1974 ---- + SPActionEventVector TextVerb::vector = + {{NULL},TextVerb::perform, NULL, NULL, NULL, NULL}; + ++ #ifdef CONF_MADBUTTERFLY ++ /* *********** Effect MadButterfly ********** */ ++ ++ /** \brief A class to represent the last effect issued */ ++ class EffectMadButterflyVerb : public Verb { ++ private: ++ static void perform(SPAction *action, void *mydata, void *otherdata); ++ static SPActionEventVector vector; ++ protected: ++ virtual SPAction *make_action(Inkscape::UI::View::View *view); ++ public: ++ /** \brief Use the Verb initializer with the same parameters. */ ++ EffectMadButterflyVerb(unsigned int const code, ++ gchar const *id, ++ gchar const *name, ++ gchar const *tip, ++ gchar const *image) : ++ Verb(code, id, name, tip, image) ++ { ++ set_default_sensitive(false); ++ } ++ }; /* EffectMadButterflyVerb class */ ++ ++ /** ++ * The vector to attach in the last effect verb. ++ */ ++ SPActionEventVector EffectMadButterflyVerb::vector = ++ {{NULL},EffectMadButterflyVerb::perform, NULL, NULL, NULL, NULL}; ++ ++ /** \brief Create an action for a \c EffectLastVerb ++ \param view Which view the action should be created for ++ \return The built action. ++ ++ Calls \c make_action_helper with the \c vector. ++ */ ++ SPAction * ++ EffectMadButterflyVerb::make_action(Inkscape::UI::View::View *view) ++ { ++ return make_action_helper(view, &vector); ++ } ++ ++ /** \brief Decode the verb code and take appropriate action */ ++ void ++ EffectMadButterflyVerb::perform(SPAction *action, void *data, void */*pdata*/) ++ { ++ /* These aren't used, but are here to remind people not to use ++ the CURRENT_DOCUMENT macros unless they really have to. */ ++ Inkscape::UI::View::View *current_view = sp_action_get_view(action); ++ // SPDocument *current_document = SP_VIEW_DOCUMENT(current_view); ++ Inkscape::Extension::Effect *effect = Inkscape::Extension::Effect::get_madbutterfly_effect(); ++ ++ if (effect == NULL) return; ++ if (current_view == NULL) return; ++ ++ switch ((long) data) { ++ case SP_VERB_EFFECT_MADBUTTERFLY: ++ effect->effect(current_view); ++ break; ++ default: ++ return; ++ } ++ ++ return; ++ } ++ /* *********** End Effect MadButterfly ********** */ ++ #endif + + /* *********** Effect Last ********** */ + +*************** +*** 2570,2575 **** +--- 2636,2645 ---- + N_("Repeat the last effect with the same settings"), NULL), + new EffectLastVerb(SP_VERB_EFFECT_LAST_PREF, "EffectLastPref", N_("Previous Effect Settings..."), + N_("Repeat the last effect with new settings"), NULL), ++ //#ifdef CONF_MADBUTTERFLY ++ new EffectMadButterflyVerb(SP_VERB_EFFECT_MADBUTTERFLY, "EffectMadButterfly", N_("Effect for MadButterfly"), ++ N_("For MadButterfly integration"), NULL), ++ //#endif + + /* Fit Page */ + new FitCanvasVerb(SP_VERB_FIT_CANVAS_TO_SELECTION, "FitCanvasToSelection", N_("Fit Page to Selection"), +diff -cr inkscape-0.46/src/verbs.h inkscape-0.46-mb/src/verbs.h +*** inkscape-0.46/src/verbs.h 2008-03-11 12:20:28.000000000 +0800 +--- inkscape-0.46-mb/src/verbs.h 2009-01-18 00:37:43.000000000 +0800 +*************** +*** 23,29 **** + #include "helper/helper-forward.h" + #include "forward.h" + #include +! + /** \brief This anonymous enum is used to provide a list of the Verbs + which are defined staticly in the verb files. There may be + other verbs which are defined dynamically also. */ +--- 23,29 ---- + #include "helper/helper-forward.h" + #include "forward.h" + #include +! #define CONF_MADBUTTERFLY + /** \brief This anonymous enum is used to provide a list of the Verbs + which are defined staticly in the verb files. There may be + other verbs which are defined dynamically also. */ +*************** +*** 246,251 **** +--- 246,252 ---- + /* Effects */ + SP_VERB_EFFECT_LAST, + SP_VERB_EFFECT_LAST_PREF, ++ SP_VERB_EFFECT_MADBUTTERFLY, + /* Fit Canvas */ + SP_VERB_FIT_CANVAS_TO_SELECTION, + SP_VERB_FIT_CANVAS_TO_DRAWING, diff -r 6a1b36738d3d -r 9c006581f0cd inkscape/firefox/inkscape.js --- a/inkscape/firefox/inkscape.js Sun Mar 08 00:15:21 2009 +0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,394 +0,0 @@ -var isInProgress=0; - -var MAX_DUMP_DEPTH = 10; -var inkscape; - - - -function dumpObj(obj, name, indent, depth) { - if (depth > MAX_DUMP_DEPTH) { - return indent + name + ": \n"; - } - if (typeof obj == "object") { - var child = null; - var output = indent + name + "\n"; - indent += "\t"; - for (var item in obj) - { - try { - child = obj[item]; - } catch (e) { - child = ""; - } - if (typeof child == "object") { - output += dumpObj(child, item, indent, depth + 1); - } else { - output += indent + item + ": " + child + "\n"; - } - } - return output; - } else { - return obj; - } -} -function dumpObjItem(obj, name, indent, depth) { - if (depth > MAX_DUMP_DEPTH) { - return indent + name + ": \n"; - } - if (typeof obj == "object") { - var child = null; - var output = indent + name + "\n"; - indent += "\t"; - for (var item in obj) - { - try { - child = obj[item]; - } catch (e) { - child = ""; - } - if (typeof child == "object") { - output += dumpObjItem(child, item, indent, depth + 1); - } else { - output += indent + item + ":\n"; - } - } - return output; - } else { - return obj; - } -} -/** - * Inkscape class - * - */ -function Inkscape(file) -{ - var ink = document.getElementById('inkscape'); - ink.innerHTML = ""; - this.isInProgress = 0; - - setTimeout("inkscape.fetchDocument()",4000); -} - -Inkscape.prototype.gotoScene = function (n) -{ - nextScene = n; - var soapBody = new SOAPObject("START"); - var sr = new SOAPRequest("START", soapBody); - SOAPClient.Proxy = "http://localhost:19192/"; - SOAPClient.SendRequest(sr, function (resp,arg) {arg.gotoScene1(resp);},this); - this.isInProgress++; -} -Inkscape.prototype.gotoScene1 = function (resp,n) -{ - var soapBody = new SOAPObject("SCENE"); - var v1 = new SOAPObject("v1"); - v1.val(nextScene); - soapBody.appendChild(v1); - var sr = new SOAPRequest("SCENE", soapBody); - SOAPClient.Proxy = "http://localhost:19192/"; - SOAPClient.SendRequest(sr, function (resp,arg) {arg.gotoScene2(resp);},this); -} -Inkscape.prototype.gotoScene2 = function (resp) -{ - var soapBody = new SOAPObject("PUBLISH"); - var sr = new SOAPRequest("PUBLISH", soapBody); - SOAPClient.Proxy = "http://localhost:19192/"; - SOAPClient.SendRequest(sr, function (resp,arg) {arg.gotoScene3(resp);},this); -} - -Inkscape.prototype.gotoScene3 = function (resp) -{ - this.isInProgress--; -} -Inkscape.prototype.publishDocument= function(resp) -{ - mbsvg = new MBSVGString(resp.Body[0].GETDOCResponse[0].Result[0].Text); - mbsvg.renderUI(); - - var soapBody = new SOAPObject("PUBLISH"); - var sr = new SOAPRequest("PUBLISH", soapBody); - SOAPClient.Proxy = "http://localhost:19192/"; - SOAPClient.SendRequest(sr, function(resp,arg) {arg.operationDone(resp);},this); -} - -Inkscape.prototype.refreshDocument = function(resp) -{ - var soapBody = new SOAPObject("GETDOC"); - var sr = new SOAPRequest("GETDOC", soapBody); - SOAPClient.Proxy = "http://localhost:19192/"; - SOAPClient.SendRequest(sr, function(resp,arg) { arg.publishDocument(resp);},this); -} - -Inkscape.prototype.operationDone = function (res) -{ - this.isInProgress--; -} -Inkscape.prototype.insertKey= function(n) -{ - nextScene = n; - var soapBody = new SOAPObject("START"); - var sr = new SOAPRequest("START", soapBody); - SOAPClient.Proxy = "http://localhost:19192/"; - SOAPClient.SendRequest(sr, function (resp,arg) {arg.insertKey1(resp);},this); - this.isInProgress++; -} -Inkscape.prototype.insertKey1 = function(resp) -{ - var soapBody = new SOAPObject("INSERTKEY"); - var v1 = new SOAPObject("v1"); - v1.attr('type','string'); - v1.val(currentLayer); - soapBody.appendChild(v1); - var v2 = new SOAPObject("v2"); - v2.val(nextScene); - soapBody.appendChild(v2); - var sr = new SOAPRequest("INSERTKEY", soapBody); - SOAPClient.Proxy = "http://localhost:19192/"; - SOAPClient.SendRequest(sr, function (resp,arg) {arg.refreshDocument(resp);},this); -} - -Inkscape.prototype.extendScene=function() -{ - var soapBody = new SOAPObject("START"); - var sr = new SOAPRequest("START", soapBody); - SOAPClient.Proxy = "http://localhost:19192/"; - SOAPClient.SendRequest(sr, function (resp,arg) {arg.extendScene1(resp);},this); - this.isInProgress++; -} - - -Inkscape.prototype.extendScene1 = function(resp) -{ - var soapBody = new SOAPObject("EXTENDSCENE"); - var v1 = new SOAPObject("v1"); - v1.attr('type','string'); - v1.val(currentLayer); - soapBody.appendChild(v1); - var v2 = new SOAPObject("v2"); - v2.val(currentScene); - soapBody.appendChild(v2); - var sr = new SOAPRequest("EXTENDSCENE", soapBody); - SOAPClient.Proxy = "http://localhost:19192/"; - SOAPClient.SendRequest(sr, function (resp,arg) {arg.refreshDocument(resp);},this); -} - - -Inkscape.prototype.deleteScene=function() -{ - var soapBody = new SOAPObject("START"); - var sr = new SOAPRequest("START", soapBody); - SOAPClient.Proxy = "http://localhost:19192/"; - SOAPClient.SendRequest(sr, function (resp,arg) {arg.deleteScene1(resp);},this); - this.isInProgress++; -} - -Inkscape.prototype.deleteScene1=function(resp) -{ - var soapBody = new SOAPObject("DELETESCENE"); - var v1 = new SOAPObject("v1"); - v1.attr('type','string'); - v1.val(currentLayer); - soapBody.appendChild(v1); - var v2 = new SOAPObject("v2"); - v2.val(currentScene); - soapBody.appendChild(v2); - var sr = new SOAPRequest("EXTENDSCENE", soapBody); - SOAPClient.Proxy = "http://localhost:19192/"; - SOAPClient.SendRequest(sr, function (resp,arg) {arg.refreshDocument(resp);},this); -} - -Inkscape.prototype.fetchDocument = function() -{ - var soapBody = new SOAPObject("START"); - var sr = new SOAPRequest("START", soapBody); - SOAPClient.Proxy = "http://localhost:19192/"; - SOAPClient.SendRequest(sr,function(resp,arg) {arg.refreshDocument(resp);},this); - this.isInProgress++; -} - - - -function MBSVG(file) -{ - var xmlDoc=document.implementation.createDocument("http://madbutterfly.sourceforge.net/DTD/madbutterfly.dtd","",null); - xmlDoc.async=false; - xmlDoc.load(file); - MBSVG_loadFromDoc(this,xmlDoc); - -} -function MBSVGString(xml) -{ - var xmlParser = new DOMParser(); - var xmlDoc = xmlParser.parseFromString( xml, 'text/xml'); - MBSVG_loadFromDoc(this,xmlDoc); -} - - - -function MBSVG_loadFromDoc(self,xmlDoc) -{ - var scenesNode = xmlDoc.getElementsByTagNameNS("http://madbutterfly.sourceforge.net/DTD/madbutterfly.dtd","scene"); - if (scenesNode == null) { - alert('This is not a valid scene file'); - } - var len = scenesNode.length; - var i,j; - var max = 0; - var scenes = new Array(); - - // Get the length of scenes - for(i=0;i"; - for(var j=1;j<=max;j++) - cmd = cmd + ""+j+""; - - for(var i=layers.length-1;i>=0;i--) { - var l = layers[i]; - var id = l.getAttribute('id'); - var label = l.getAttribute('inkscape:label'); - cmd = cmd + ""+label+""; - for(j=0;j"; - empty = 0; - break; - } else if ((n>scenes[k].start)&&(n <= scenes[k].end)) { - cmd = cmd + ""; - empty = 0; - break; - } - } - if (empty) { - cmd = cmd + ""; - } - - } - cmd = cmd + "\n"; - } - cmd = cmd + "\n"; - var frame = document.getElementById('frame'); - frame.innerHTML=cmd; -} - - - -/** - * UI for madbuilder.html to build the scene editor - */ - -function selectCell(obj) -{ - var id = obj.getAttribute('id'); - var layer,n; - var f = id.split('#'); - layer=f[0]; - n = f[1]; - var img = obj.getAttribute('src'); - var f = img.split('-'); - - if (f[0] == 'active') - return; - else { - obj.setAttribute('src', 'active-'+img); - } - - if (last_select != null) { - f = last_select.getAttribute('src').split('-'); - last_select.setAttribute('src', f[1]); - } - last_select = obj; - currentScene = n; - currentLayer = layer; -} - - -function onButtonClick(obj) -{ - if (inkscape.isInProgress != 0) return; - var id = obj.getAttribute('id'); - if (id == 'Jump') { - if (currentScene != 0) - inkscape.gotoScene(currentScene); - } else if (id == 'InsertKey') { - inkscape.insertKey(currentScene); - } else if (id == 'ExtendScene') { - inkscape.extendScene(currentScene); - } else if (id == 'DeleteScene') { - inkscape.deleteScene(currentScene); - } else { - alert(id+' has not been implemented yet'); - } -} - -function gotoScene_cb(resObj) -{ - -} -var nextScene; -var currentScene = 0; -var currentLayer = ''; - -var last_select = null; -inkscape = new Inkscape("scene.mbsvg"); - -$('a.button').mouseover(function () { - if (inkscape.isInProgress==0) - this.style.MozOpacity = 0.1; - }).mouseout(function () { - this.style.MozOpacity= 1; - }); - diff -r 6a1b36738d3d -r 9c006581f0cd inkscape/firefox/install.rdf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inkscape/firefox/install.rdf Sun Mar 08 10:06:23 2009 +0800 @@ -0,0 +1,21 @@ + + + + + + + {9cb6698c-667e-488c-8e61-dddfa2a5f8eb} + 0.2 + 2 + + + {ec8030f7-c20a-464f-9b0e-13a3a9e97384} + 3.0 + 9.0 + + + MadBuilder + + diff -r 6a1b36738d3d -r 9c006581f0cd inkscape/firefox/jqSOAPClient.js --- a/inkscape/firefox/jqSOAPClient.js Sun Mar 08 00:15:21 2009 +0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,159 +0,0 @@ -/* - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -//Singleton SOAP Client -var SOAPClient = { - Proxy: "", - SOAPServer: "", - ContentType: "text/xml", - CharSet: "utf-8", - ResponseXML: null, - ResponseText: "", - Status: 0, - ContentLength: 0, - Namespace: function(name, uri) { - return {"name":name, "uri":uri}; - }, - SendRequest: function(soapReq, callback,arg) { - if(!!SOAPClient.Proxy) { - SOAPClient.ResponseText = ""; - SOAPClient.ResponseXML = null; - SOAPClient.Status = 0; - - var content = soapReq.toString(); - SOAPClient.ContentLength = content.length; - - function getResponse(xData) { - if(!!callback) { - SOAPClient.Status = xData.status; - SOAPClient.ResponseText = xData.responseText; - SOAPClient.ResponseXML = xData.responseXML; - var jsOut = $.xmlToJSON(xData.responseXML); - callback(jsOut,arg); - } - } - $.ajax({ - type: "POST", - url: SOAPClient.Proxy, - dataType: "xml", - processData: false, - data: content, - complete: getResponse, - contentType: SOAPClient.ContentType + "; charset=\"" + SOAPClient.CharSet + "\"", - beforeSend: function(req) { - req.setRequestHeader("Method", "POST"); - req.setRequestHeader("Content-Length", SOAPClient.ContentLength); - req.setRequestHeader("SOAPServer", SOAPClient.SOAPServer); - req.setRequestHeader("SOAPAction", soapReq.Action); - } - }); - } - }, - ToXML: function(soapObj) { - var out = []; - var isNSObj=false; - try { - if(!!soapObj&&typeof(soapObj)==="object"&&soapObj.typeOf==="SOAPObject") { - //Namespaces - if(!!soapObj.ns) { - if(typeof(soapObj.ns)==="object") { - isNSObj=true; - out.push("<"+soapObj.ns.name+":"+soapObj.name); - out.push(" xmlns:"+soapObj.ns.name+"=\""+soapObj.ns.uri+"\""); - } else { - out.push("<"+soapObj.name); - out.push(" xmlns=\""+soapObj.ns+"\""); - } - } else { - out.push("<"+soapObj.name); - } - //Node Attributes - if(soapObj.attributes.length > 0) { - var cAttr; - var aLen=soapObj.attributes.length-1; - do { - cAttr=soapObj.attributes[aLen]; - if(isNSObj) { - out.push(" "+soapObj.ns.name+":"+cAttr.name+"=\""+cAttr.value+"\""); - } else { - out.push(" "+cAttr.name+"=\""+cAttr.value+"\""); - } - } while(aLen--); - } - out.push(">"); - //Node children - if(soapObj.hasChildren()) { - var cPos, cObj; - for(cPos in soapObj.children){ - cObj = soapObj.children[cPos]; - if(typeof(cObj)==="object"){out.push(SOAPClient.ToXML(cObj));} - } - } - //Node Value - if(!!soapObj.value){out.push(soapObj.value);} - //Close Tag - if(isNSObj){out.push("");} - else {out.push("");} - return out.join(""); - } - } catch(e){alert("Unable to process SOAPObject! Object must be an instance of SOAPObject");} - } -}; -//Soap request - this is what being sent using SOAPClient.SendRequest -var SOAPRequest=function(action, soapObj) { - this.Action=action; - var nss=[]; - var headers=[]; - var bodies=(!!soapObj)?[soapObj]:[]; - this.addNamespace=function(ns, uri){nss.push(new SOAPClient.Namespace(ns, uri));}; - this.addHeader=function(soapObj){headers.push(soapObj);}; - this.addBody=function(soapObj){bodies.push(soapObj);}; - this.toString=function() { - var soapEnv = new SOAPObject("soapenv:Envelope"); - soapEnv.attr("xmlns:soapenv","http://schemas.xmlsoap.org/soap/envelope/"); - //Add Namespace(s) - if(nss.length>0){ - var tNs, tNo; - for(tNs in nss){if(!nss.hasOwnProperty || nss.hasOwnProperty(tNs)){tNo=nss[tNs];if(typeof(tNo)==="object"){soapEnv.attr("xmlns:"+tNo.name, tNo.uri);}}} - } - //Add Header(s) - if(headers.length>0) { - var soapHeader = soapEnv.appendChild(new SOAPObject("soapenv:Header")); - var tHdr; - for(tHdr in headers){if(!headers.hasOwnProperty || headers.hasOwnProperty(tHdr)){soapHeader.appendChild(headers[tHdr]);}} - } - //Add Body(s) - if(bodies.length>0) { - var soapBody = soapEnv.appendChild(new SOAPObject("soapenv:Body")); - var tBdy; - for(tBdy in bodies){if(!bodies.hasOwnProperty || bodies.hasOwnProperty(tBdy)){soapBody.appendChild(bodies[tBdy]);}} - } - return soapEnv.toString(); - }; -}; - -//Soap Object - Used to build body envelope and other structures -var SOAPObject = function(name) { - this.typeOf="SOAPObject"; - this.ns=null; - this.name=name; - this.attributes=[]; - this.children=[]; - this.value=null; - this.attr=function(name, value){this.attributes.push({"name":name, "value":value});return this;}; - this.appendChild=function(obj){this.children.push(obj);return obj;}; - this.hasChildren=function(){return (this.children.length > 0)?true:false;}; - this.val=function(v){if(!v){return this.value;}else{this.value=v;return this;}}; - this.toString=function(){return SOAPClient.ToXML(this);}; -}; diff -r 6a1b36738d3d -r 9c006581f0cd inkscape/firefox/jqSOAPClient.pack.js --- a/inkscape/firefox/jqSOAPClient.pack.js Sun Mar 08 00:15:21 2009 +0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -/* - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -var SOAPClient={Proxy:"",SOAPServer:"",ContentType:"text/xml",CharSet:"utf-8",ResponseXML:null,ResponseText:"",Status:0,ContentLength:0,Namespace:function(a,b){return{"name":a,"uri":b}},SendRequest:function(c,d){if(!!SOAPClient.Proxy){SOAPClient.ResponseText="";SOAPClient.ResponseXML=null;SOAPClient.Status=0;var e=c.toString();SOAPClient.ContentLength=e.length;function getResponse(a){if(!!d){SOAPClient.Status=a.status;SOAPClient.ResponseText=a.responseText;SOAPClient.ResponseXML=a.responseXML;var b=$.xmlToJSON(a.responseXML);d(b)}}$.ajax({type:"POST",url:SOAPClient.Proxy,dataType:"xml",processData:false,data:e,complete:getResponse,contentType:SOAPClient.ContentType+"; charset=\""+SOAPClient.CharSet+"\"",beforeSend:function(a){a.setRequestHeader("Method","POST");a.setRequestHeader("Content-Length",SOAPClient.ContentLength);a.setRequestHeader("SOAPServer",SOAPClient.SOAPServer);a.setRequestHeader("SOAPAction",c.Action)}})}},ToXML:function(a){var b=[];var c=false;try{if(!!a&&typeof(a)==="object"&&a.typeOf==="SOAPObject"){if(!!a.ns){if(typeof(a.ns)==="object"){c=true;b.push("<"+a.ns.name+":"+a.name);b.push(" xmlns:"+a.ns.name+"=\""+a.ns.uri+"\"")}else{b.push("<"+a.name);b.push(" xmlns=\""+a.ns+"\"")}}else{b.push("<"+a.name)}if(a.attributes.length>0){var d;var f=a.attributes.length-1;do{d=a.attributes[f];if(c){b.push(" "+a.ns.name+":"+d.name+"=\""+d.value+"\"")}else{b.push(" "+d.name+"=\""+d.value+"\"")}}while(f--)}b.push(">");if(a.hasChildren()){var g,cObj;for(g in a.children){cObj=a.children[g];if(typeof(cObj)==="object"){b.push(SOAPClient.ToXML(cObj))}}}if(!!a.value){b.push(a.value)}if(c){b.push("")}else{b.push("")}return b.join("")}}catch(e){alert("Unable to process SOAPObject! Object must be an instance of SOAPObject")}}};var SOAPRequest=function(g,h){this.Action=g;var i=[];var j=[];var k=(!!h)?[h]:[];this.addNamespace=function(a,b){i.push(new SOAPClient.Namespace(a,b))};this.addHeader=function(a){j.push(a)};this.addBody=function(a){k.push(a)};this.toString=function(){var a=new SOAPObject("soapenv:Envelope");a.attr("xmlns:soapenv","http://schemas.xmlsoap.org/soap/envelope/");if(i.length>0){var b,tNo;for(b in i){if(!i.hasOwnProperty||i.hasOwnProperty(b)){tNo=i[b];if(typeof(tNo)==="object"){a.attr("xmlns:"+tNo.name,tNo.uri)}}}}if(j.length>0){var c=a.appendChild(new SOAPObject("soapenv:Header"));var d;for(d in j){if(!j.hasOwnProperty||j.hasOwnProperty(d)){c.appendChild(j[d])}}}if(k.length>0){var e=a.appendChild(new SOAPObject("soapenv:Body"));var f;for(f in k){if(!k.hasOwnProperty||k.hasOwnProperty(f)){e.appendChild(k[f])}}}return a.toString()}};var SOAPObject=function(c){this.typeOf="SOAPObject";this.ns=null;this.name=c;this.attributes=[];this.children=[];this.value=null;this.attr=function(a,b){this.attributes.push({"name":a,"value":b});return this};this.appendChild=function(a){this.children.push(a);return a};this.hasChildren=function(){return(this.children.length>0)?true:false};this.val=function(v){if(!v){return this.value}else{this.value=v;return this}};this.toString=function(){return SOAPClient.ToXML(this)}}; \ No newline at end of file diff -r 6a1b36738d3d -r 9c006581f0cd inkscape/firefox/jqXMLUtils.js --- a/inkscape/firefox/jqXMLUtils.js Sun Mar 08 00:15:21 2009 +0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,250 +0,0 @@ -/* - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -(function($) { - //Converts XML DOM to JSON - $.extend ({ - xmlToJSON: function(xdoc) { - try { - if(!xdoc){ return null; } - var tmpObj = {}; - tmpObj.typeOf = "JSXBObject"; - var xroot = (xdoc.nodeType == 9)?xdoc.documentElement:xdoc; - tmpObj.RootName = xroot.nodeName || ""; - if(xdoc.nodeType == 3 || xdoc.nodeType == 4) { - return xdoc.nodeValue; - } - var isNumeric = function(s) { - var testStr = ""; - if(s && typeof s == "string") { testStr = s; } - var pattern = /^((-)?([0-9]*)((\.{0,1})([0-9]+))?$)/; - return pattern.test(testStr); - }; - //Alters attribute and collection names to comply with JS - function formatName(name) { - var regEx = /-/g; - var tName = String(name).replace(regEx,"_"); - return tName; - } - //Set Attributes of an object - function setAttributes(obj, node) { - if(node.attributes.length > 0) { - var a = node.attributes.length-1; - var attName; - obj._attributes = []; - do { //Order is irrelevant (speed-up) - attName = String(formatName(node.attributes[a].name)); - obj._attributes.push(attName); - obj[attName] = $.trim(node.attributes[a].value); - } while(a--); - } - } - //Set collections - function setHelpers(grpObj) { - //Selects a node withing array where attribute = value - grpObj.getNodeByAttribute = function(attr, obj) { - if(this.length > 0) { - var cNode; - var maxLen = this.length -1; - try { - do { - cNode = this[maxLen]; - if(cNode[attr] == obj) { - return cNode; - } - } while(maxLen--); - } catch(e) {return false;} - return false; - } - }; - - grpObj.contains = function(attr, obj) { - if(this.length > 0) { - var maxLen = this.length -1; - try { - do { - if(this[maxLen][attr] == obj) { - return true; - } - } while(maxLen--); - } catch(e) {return false;} - return false; - } - }; - - grpObj.indexOf = function(attr, obj) { - var pos = -1; - if(this.length > 0) { - var maxLen = this.length -1; - try { - do { - if(this[maxLen][attr] == obj) { - pos = maxLen; - } - } while(maxLen--); - } catch(e) {return -1;} - return pos; - } - }; - - grpObj.SortByAttribute = function(col, dir) { - if(this.length) { - function getValue(pair, idx) { - var out = pair[idx]; - out = (isNumeric(out))?parseFloat(out):out; - return out; - } - function sortFn(a, b) { - var res = 0; - var tA, tB; - tA = getValue(a, col); - tB = getValue(b, col); - if(tA < tB) { res = -1; } else if(tB < tA) { res = 1; } - if(dir) { - res = (dir.toUpperCase() == "DESC")?(0 - res):res; - } - return res; - } - this.sort(sortFn); - } - }; - - grpObj.SortByValue = function(dir) { - if(this.length) { - function getValue(pair) { - var out = pair.Text; - out = (isNumeric(out))?parseFloat(out):out; - return out; - } - function sortFn(a, b) { - var res = 0; - var tA, tB; - tA = getValue(a); - tB = getValue(b); - if(tA < tB) { res = -1; } else if(tB < tA) { res = 1; } - if(dir) { - res = (dir.toUpperCase() == "DESC")?(0 - res):res; - } - return res; - } - this.sort(sortFn); - } - }; - grpObj.SortByNode = function(node, dir) { - if(this.length) { - function getValue(pair, node) { - var out = pair[node][0].Text; - out = (isNumeric(out))?parseFloat(out):out; - return out; - } - function sortFn(a, b) { - var res = 0; - var tA, tB; - tA = getValue(a, node); - tB = getValue(b, node); - if(tA < tB) { res = -1; } else if(tB < tA) { res = 1; } - if(dir) { - res = (dir.toUpperCase() == "DESC")?(0 - res):res; - } - return res; - } - this.sort(sortFn); - } - }; - } - //Recursive JSON Assembler - //Set Object Nodes - function setObjects(obj, node) { - var elemName; //Element name - var cnode; //Current Node - var tObj; //New subnode - var cName = ""; - if(!node) { return null; } - //Set node attributes if any - if(node.attributes.length > 0){setAttributes(obj, node);} - obj.Text = ""; - if(node.hasChildNodes()) { - var nodeCount = node.childNodes.length - 1; - var n = 0; - do { //Order is irrelevant (speed-up) - cnode = node.childNodes[n]; - switch(cnode.nodeType) { - case 1: //Node - //Process child nodes - obj._children = []; - //SOAP XML FIX to remove namespaces (i.e. soapenv:) - elemName = (cnode.localName)?cnode.localName:cnode.baseName; - elemName = formatName(elemName); - if(cName != elemName) { obj._children.push(elemName); } - //Create sub elemns array - if(!obj[elemName]) { - obj[elemName] = []; //Create Collection - } - tObj = {}; - obj[elemName].push(tObj); - if(cnode.attributes.length > 0) { - setAttributes(tObj, cnode); - } - //Set Helper functions (contains, indexOf, sort, etc); - if(!obj[elemName].contains) { - setHelpers(obj[elemName]); - } - cName = elemName; - if(cnode.hasChildNodes()) { - setObjects(tObj, cnode); //Recursive Call - } - break; - case 3: //Text Value - obj.Text += $.trim(cnode.nodeValue); - break; - case 4: //CDATA - obj.Text += (cnode.text)?$.trim(cnode.text):$.trim(cnode.nodeValue); - break; - } - } while(n++ < nodeCount); - } - } - //RUN - setObjects(tmpObj, xroot); - //Clean-up memmory - xdoc = null; - xroot = null; - return tmpObj; - - } catch(e) { - return null; - } - } - }); - - //Converts Text to XML DOM - $.extend({ - textToXML: function(strXML) { - var xmlDoc = null; - try { - xmlDoc = ($.browser.msie)?new ActiveXObject("Microsoft.XMLDOM"):new DOMParser(); - xmlDoc.async = false; - } catch(e) {throw new Error("XML Parser could not be instantiated");} - var out; - try { - if($.browser.msie) { - out = (xmlDoc.loadXML(strXML))?xmlDoc:false; - } else { - out = xmlDoc.parseFromString(strXML, "text/xml"); - } - } catch(e) { throw new Error("Error parsing XML string"); } - return out; - } - }); -})(jQuery); \ No newline at end of file diff -r 6a1b36738d3d -r 9c006581f0cd inkscape/firefox/jquery-1.3.1.js --- a/inkscape/firefox/jquery-1.3.1.js Sun Mar 08 00:15:21 2009 +0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4241 +0,0 @@ -/*! - * jQuery JavaScript Library v1.3.1 - * http://jquery.com/ - * - * Copyright (c) 2009 John Resig - * Dual licensed under the MIT and GPL licenses. - * http://docs.jquery.com/License - * - * Date: 2009-01-21 20:42:16 -0500 (Wed, 21 Jan 2009) - * Revision: 6158 - */ -(function(){ - -var - // Will speed up references to window, and allows munging its name. - window = this, - // Will speed up references to undefined, and allows munging its name. - undefined, - // Map over jQuery in case of overwrite - _jQuery = window.jQuery, - // Map over the $ in case of overwrite - _$ = window.$, - - jQuery = window.jQuery = window.$ = function( selector, context ) { - // The jQuery object is actually just the init constructor 'enhanced' - return new jQuery.fn.init( selector, context ); - }, - - // A simple way to check for HTML strings or ID strings - // (both of which we optimize for) - quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/, - // Is it a simple selector - isSimple = /^.[^:#\[\.,]*$/; - -jQuery.fn = jQuery.prototype = { - init: function( selector, context ) { - // Make sure that a selection was provided - selector = selector || document; - - // Handle $(DOMElement) - if ( selector.nodeType ) { - this[0] = selector; - this.length = 1; - this.context = selector; - return this; - } - // Handle HTML strings - if ( typeof selector === "string" ) { - // Are we dealing with HTML string or an ID? - var match = quickExpr.exec( selector ); - - // Verify a match, and that no context was specified for #id - if ( match && (match[1] || !context) ) { - - // HANDLE: $(html) -> $(array) - if ( match[1] ) - selector = jQuery.clean( [ match[1] ], context ); - - // HANDLE: $("#id") - else { - var elem = document.getElementById( match[3] ); - - // Handle the case where IE and Opera return items - // by name instead of ID - if ( elem && elem.id != match[3] ) - return jQuery().find( selector ); - - // Otherwise, we inject the element directly into the jQuery object - var ret = jQuery( elem || [] ); - ret.context = document; - ret.selector = selector; - return ret; - } - - // HANDLE: $(expr, [context]) - // (which is just equivalent to: $(content).find(expr) - } else - return jQuery( context ).find( selector ); - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) - return jQuery( document ).ready( selector ); - - // Make sure that old selector state is passed along - if ( selector.selector && selector.context ) { - this.selector = selector.selector; - this.context = selector.context; - } - - return this.setArray(jQuery.makeArray(selector)); - }, - - // Start with an empty selector - selector: "", - - // The current version of jQuery being used - jquery: "1.3.1", - - // The number of elements contained in the matched element set - size: function() { - return this.length; - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - return num === undefined ? - - // Return a 'clean' array - jQuery.makeArray( this ) : - - // Return just the object - this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems, name, selector ) { - // Build a new jQuery matched element set - var ret = jQuery( elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - ret.context = this.context; - - if ( name === "find" ) - ret.selector = this.selector + (this.selector ? " " : "") + selector; - else if ( name ) - ret.selector = this.selector + "." + name + "(" + selector + ")"; - - // Return the newly-formed element set - return ret; - }, - - // Force the current matched set of elements to become - // the specified array of elements (destroying the stack in the process) - // You should use pushStack() in order to do this, but maintain the stack - setArray: function( elems ) { - // Resetting the length to 0, then using the native Array push - // is a super-fast way to populate an object with array-like properties - this.length = 0; - Array.prototype.push.apply( this, elems ); - - return this; - }, - - // Execute a callback for every element in the matched set. - // (You can seed the arguments with an array of args, but this is - // only used internally.) - each: function( callback, args ) { - return jQuery.each( this, callback, args ); - }, - - // Determine the position of an element within - // the matched set of elements - index: function( elem ) { - // Locate the position of the desired element - return jQuery.inArray( - // If it receives a jQuery object, the first element is used - elem && elem.jquery ? elem[0] : elem - , this ); - }, - - attr: function( name, value, type ) { - var options = name; - - // Look for the case where we're accessing a style value - if ( typeof name === "string" ) - if ( value === undefined ) - return this[0] && jQuery[ type || "attr" ]( this[0], name ); - - else { - options = {}; - options[ name ] = value; - } - - // Check to see if we're setting style values - return this.each(function(i){ - // Set all the styles - for ( name in options ) - jQuery.attr( - type ? - this.style : - this, - name, jQuery.prop( this, options[ name ], type, i, name ) - ); - }); - }, - - css: function( key, value ) { - // ignore negative width and height values - if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 ) - value = undefined; - return this.attr( key, value, "curCSS" ); - }, - - text: function( text ) { - if ( typeof text !== "object" && text != null ) - return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) ); - - var ret = ""; - - jQuery.each( text || this, function(){ - jQuery.each( this.childNodes, function(){ - if ( this.nodeType != 8 ) - ret += this.nodeType != 1 ? - this.nodeValue : - jQuery.fn.text( [ this ] ); - }); - }); - - return ret; - }, - - wrapAll: function( html ) { - if ( this[0] ) { - // The elements to wrap the target around - var wrap = jQuery( html, this[0].ownerDocument ).clone(); - - if ( this[0].parentNode ) - wrap.insertBefore( this[0] ); - - wrap.map(function(){ - var elem = this; - - while ( elem.firstChild ) - elem = elem.firstChild; - - return elem; - }).append(this); - } - - return this; - }, - - wrapInner: function( html ) { - return this.each(function(){ - jQuery( this ).contents().wrapAll( html ); - }); - }, - - wrap: function( html ) { - return this.each(function(){ - jQuery( this ).wrapAll( html ); - }); - }, - - append: function() { - return this.domManip(arguments, true, function(elem){ - if (this.nodeType == 1) - this.appendChild( elem ); - }); - }, - - prepend: function() { - return this.domManip(arguments, true, function(elem){ - if (this.nodeType == 1) - this.insertBefore( elem, this.firstChild ); - }); - }, - - before: function() { - return this.domManip(arguments, false, function(elem){ - this.parentNode.insertBefore( elem, this ); - }); - }, - - after: function() { - return this.domManip(arguments, false, function(elem){ - this.parentNode.insertBefore( elem, this.nextSibling ); - }); - }, - - end: function() { - return this.prevObject || jQuery( [] ); - }, - - // For internal use only. - // Behaves like an Array's .push method, not like a jQuery method. - push: [].push, - - find: function( selector ) { - if ( this.length === 1 && !/,/.test(selector) ) { - var ret = this.pushStack( [], "find", selector ); - ret.length = 0; - jQuery.find( selector, this[0], ret ); - return ret; - } else { - var elems = jQuery.map(this, function(elem){ - return jQuery.find( selector, elem ); - }); - - return this.pushStack( /[^+>] [^+>]/.test( selector ) ? - jQuery.unique( elems ) : - elems, "find", selector ); - } - }, - - clone: function( events ) { - // Do the clone - var ret = this.map(function(){ - if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) { - // IE copies events bound via attachEvent when - // using cloneNode. Calling detachEvent on the - // clone will also remove the events from the orignal - // In order to get around this, we use innerHTML. - // Unfortunately, this means some modifications to - // attributes in IE that are actually only stored - // as properties will not be copied (such as the - // the name attribute on an input). - var clone = this.cloneNode(true), - container = document.createElement("div"); - container.appendChild(clone); - return jQuery.clean([container.innerHTML])[0]; - } else - return this.cloneNode(true); - }); - - // Need to set the expando to null on the cloned set if it exists - // removeData doesn't work here, IE removes it from the original as well - // this is primarily for IE but the data expando shouldn't be copied over in any browser - var clone = ret.find("*").andSelf().each(function(){ - if ( this[ expando ] !== undefined ) - this[ expando ] = null; - }); - - // Copy the events from the original to the clone - if ( events === true ) - this.find("*").andSelf().each(function(i){ - if (this.nodeType == 3) - return; - var events = jQuery.data( this, "events" ); - - for ( var type in events ) - for ( var handler in events[ type ] ) - jQuery.event.add( clone[ i ], type, events[ type ][ handler ], events[ type ][ handler ].data ); - }); - - // Return the cloned set - return ret; - }, - - filter: function( selector ) { - return this.pushStack( - jQuery.isFunction( selector ) && - jQuery.grep(this, function(elem, i){ - return selector.call( elem, i ); - }) || - - jQuery.multiFilter( selector, jQuery.grep(this, function(elem){ - return elem.nodeType === 1; - }) ), "filter", selector ); - }, - - closest: function( selector ) { - var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null; - - return this.map(function(){ - var cur = this; - while ( cur && cur.ownerDocument ) { - if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) - return cur; - cur = cur.parentNode; - } - }); - }, - - not: function( selector ) { - if ( typeof selector === "string" ) - // test special case where just one selector is passed in - if ( isSimple.test( selector ) ) - return this.pushStack( jQuery.multiFilter( selector, this, true ), "not", selector ); - else - selector = jQuery.multiFilter( selector, this ); - - var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType; - return this.filter(function() { - return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector; - }); - }, - - add: function( selector ) { - return this.pushStack( jQuery.unique( jQuery.merge( - this.get(), - typeof selector === "string" ? - jQuery( selector ) : - jQuery.makeArray( selector ) - ))); - }, - - is: function( selector ) { - return !!selector && jQuery.multiFilter( selector, this ).length > 0; - }, - - hasClass: function( selector ) { - return !!selector && this.is( "." + selector ); - }, - - val: function( value ) { - if ( value === undefined ) { - var elem = this[0]; - - if ( elem ) { - if( jQuery.nodeName( elem, 'option' ) ) - return (elem.attributes.value || {}).specified ? elem.value : elem.text; - - // We need to handle select boxes special - if ( jQuery.nodeName( elem, "select" ) ) { - var index = elem.selectedIndex, - values = [], - options = elem.options, - one = elem.type == "select-one"; - - // Nothing was selected - if ( index < 0 ) - return null; - - // Loop through all the selected options - for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { - var option = options[ i ]; - - if ( option.selected ) { - // Get the specifc value for the option - value = jQuery(option).val(); - - // We don't need an array for one selects - if ( one ) - return value; - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - } - - // Everything else, we just grab the value - return (elem.value || "").replace(/\r/g, ""); - - } - - return undefined; - } - - if ( typeof value === "number" ) - value += ''; - - return this.each(function(){ - if ( this.nodeType != 1 ) - return; - - if ( jQuery.isArray(value) && /radio|checkbox/.test( this.type ) ) - this.checked = (jQuery.inArray(this.value, value) >= 0 || - jQuery.inArray(this.name, value) >= 0); - - else if ( jQuery.nodeName( this, "select" ) ) { - var values = jQuery.makeArray(value); - - jQuery( "option", this ).each(function(){ - this.selected = (jQuery.inArray( this.value, values ) >= 0 || - jQuery.inArray( this.text, values ) >= 0); - }); - - if ( !values.length ) - this.selectedIndex = -1; - - } else - this.value = value; - }); - }, - - html: function( value ) { - return value === undefined ? - (this[0] ? - this[0].innerHTML : - null) : - this.empty().append( value ); - }, - - replaceWith: function( value ) { - return this.after( value ).remove(); - }, - - eq: function( i ) { - return this.slice( i, +i + 1 ); - }, - - slice: function() { - return this.pushStack( Array.prototype.slice.apply( this, arguments ), - "slice", Array.prototype.slice.call(arguments).join(",") ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map(this, function(elem, i){ - return callback.call( elem, i, elem ); - })); - }, - - andSelf: function() { - return this.add( this.prevObject ); - }, - - domManip: function( args, table, callback ) { - if ( this[0] ) { - var fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(), - scripts = jQuery.clean( args, (this[0].ownerDocument || this[0]), fragment ), - first = fragment.firstChild, - extra = this.length > 1 ? fragment.cloneNode(true) : fragment; - - if ( first ) - for ( var i = 0, l = this.length; i < l; i++ ) - callback.call( root(this[i], first), i > 0 ? extra.cloneNode(true) : fragment ); - - if ( scripts ) - jQuery.each( scripts, evalScript ); - } - - return this; - - function root( elem, cur ) { - return table && jQuery.nodeName(elem, "table") && jQuery.nodeName(cur, "tr") ? - (elem.getElementsByTagName("tbody")[0] || - elem.appendChild(elem.ownerDocument.createElement("tbody"))) : - elem; - } - } -}; - -// Give the init function the jQuery prototype for later instantiation -jQuery.fn.init.prototype = jQuery.fn; - -function evalScript( i, elem ) { - if ( elem.src ) - jQuery.ajax({ - url: elem.src, - async: false, - dataType: "script" - }); - - else - jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" ); - - if ( elem.parentNode ) - elem.parentNode.removeChild( elem ); -} - -function now(){ - return +new Date; -} - -jQuery.extend = jQuery.fn.extend = function() { - // copy reference to target object - var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - target = arguments[1] || {}; - // skip the boolean and the target - i = 2; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction(target) ) - target = {}; - - // extend jQuery itself if only one argument is passed - if ( length == i ) { - target = this; - --i; - } - - for ( ; i < length; i++ ) - // Only deal with non-null/undefined values - if ( (options = arguments[ i ]) != null ) - // Extend the base object - for ( var name in options ) { - var src = target[ name ], copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) - continue; - - // Recurse if we're merging object values - if ( deep && copy && typeof copy === "object" && !copy.nodeType ) - target[ name ] = jQuery.extend( deep, - // Never move original objects, clone them - src || ( copy.length != null ? [ ] : { } ) - , copy ); - - // Don't bring in undefined values - else if ( copy !== undefined ) - target[ name ] = copy; - - } - - // Return the modified object - return target; -}; - -// exclude the following css properties to add px -var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i, - // cache defaultView - defaultView = document.defaultView || {}, - toString = Object.prototype.toString; - -jQuery.extend({ - noConflict: function( deep ) { - window.$ = _$; - - if ( deep ) - window.jQuery = _jQuery; - - return jQuery; - }, - - // See test/unit/core.js for details concerning isFunction. - // Since version 1.3, DOM methods and functions like alert - // aren't supported. They return false on IE (#2968). - isFunction: function( obj ) { - return toString.call(obj) === "[object Function]"; - }, - - isArray: function( obj ) { - return toString.call(obj) === "[object Array]"; - }, - - // check if an element is in a (or is an) XML document - isXMLDoc: function( elem ) { - return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" || - !!elem.ownerDocument && jQuery.isXMLDoc( elem.ownerDocument ); - }, - - // Evalulates a script in a global context - globalEval: function( data ) { - data = jQuery.trim( data ); - - if ( data ) { - // Inspired by code by Andrea Giammarchi - // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html - var head = document.getElementsByTagName("head")[0] || document.documentElement, - script = document.createElement("script"); - - script.type = "text/javascript"; - if ( jQuery.support.scriptEval ) - script.appendChild( document.createTextNode( data ) ); - else - script.text = data; - - // Use insertBefore instead of appendChild to circumvent an IE6 bug. - // This arises when a base node is used (#2709). - head.insertBefore( script, head.firstChild ); - head.removeChild( script ); - } - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase(); - }, - - // args is for internal usage only - each: function( object, callback, args ) { - var name, i = 0, length = object.length; - - if ( args ) { - if ( length === undefined ) { - for ( name in object ) - if ( callback.apply( object[ name ], args ) === false ) - break; - } else - for ( ; i < length; ) - if ( callback.apply( object[ i++ ], args ) === false ) - break; - - // A special, fast, case for the most common use of each - } else { - if ( length === undefined ) { - for ( name in object ) - if ( callback.call( object[ name ], name, object[ name ] ) === false ) - break; - } else - for ( var value = object[0]; - i < length && callback.call( value, i, value ) !== false; value = object[++i] ){} - } - - return object; - }, - - prop: function( elem, value, type, i, name ) { - // Handle executable functions - if ( jQuery.isFunction( value ) ) - value = value.call( elem, i ); - - // Handle passing in a number to a CSS property - return typeof value === "number" && type == "curCSS" && !exclude.test( name ) ? - value + "px" : - value; - }, - - className: { - // internal only, use addClass("class") - add: function( elem, classNames ) { - jQuery.each((classNames || "").split(/\s+/), function(i, className){ - if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) ) - elem.className += (elem.className ? " " : "") + className; - }); - }, - - // internal only, use removeClass("class") - remove: function( elem, classNames ) { - if (elem.nodeType == 1) - elem.className = classNames !== undefined ? - jQuery.grep(elem.className.split(/\s+/), function(className){ - return !jQuery.className.has( classNames, className ); - }).join(" ") : - ""; - }, - - // internal only, use hasClass("class") - has: function( elem, className ) { - return elem && jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1; - } - }, - - // A method for quickly swapping in/out CSS properties to get correct calculations - swap: function( elem, options, callback ) { - var old = {}; - // Remember the old values, and insert the new ones - for ( var name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - callback.call( elem ); - - // Revert the old values - for ( var name in options ) - elem.style[ name ] = old[ name ]; - }, - - css: function( elem, name, force ) { - if ( name == "width" || name == "height" ) { - var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ]; - - function getWH() { - val = name == "width" ? elem.offsetWidth : elem.offsetHeight; - var padding = 0, border = 0; - jQuery.each( which, function() { - padding += parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0; - border += parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0; - }); - val -= Math.round(padding + border); - } - - if ( jQuery(elem).is(":visible") ) - getWH(); - else - jQuery.swap( elem, props, getWH ); - - return Math.max(0, val); - } - - return jQuery.curCSS( elem, name, force ); - }, - - curCSS: function( elem, name, force ) { - var ret, style = elem.style; - - // We need to handle opacity special in IE - if ( name == "opacity" && !jQuery.support.opacity ) { - ret = jQuery.attr( style, "opacity" ); - - return ret == "" ? - "1" : - ret; - } - - // Make sure we're using the right name for getting the float value - if ( name.match( /float/i ) ) - name = styleFloat; - - if ( !force && style && style[ name ] ) - ret = style[ name ]; - - else if ( defaultView.getComputedStyle ) { - - // Only "float" is needed here - if ( name.match( /float/i ) ) - name = "float"; - - name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase(); - - var computedStyle = defaultView.getComputedStyle( elem, null ); - - if ( computedStyle ) - ret = computedStyle.getPropertyValue( name ); - - // We should always get a number back from opacity - if ( name == "opacity" && ret == "" ) - ret = "1"; - - } else if ( elem.currentStyle ) { - var camelCase = name.replace(/\-(\w)/g, function(all, letter){ - return letter.toUpperCase(); - }); - - ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ]; - - // From the awesome hack by Dean Edwards - // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 - - // If we're not dealing with a regular pixel number - // but a number that has a weird ending, we need to convert it to pixels - if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) { - // Remember the original values - var left = style.left, rsLeft = elem.runtimeStyle.left; - - // Put in the new values to get a computed value out - elem.runtimeStyle.left = elem.currentStyle.left; - style.left = ret || 0; - ret = style.pixelLeft + "px"; - - // Revert the changed values - style.left = left; - elem.runtimeStyle.left = rsLeft; - } - } - - return ret; - }, - - clean: function( elems, context, fragment ) { - context = context || document; - - // !context.createElement fails in IE with an error but returns typeof 'object' - if ( typeof context.createElement === "undefined" ) - context = context.ownerDocument || context[0] && context[0].ownerDocument || document; - - // If a single string is passed in and it's a single tag - // just do a createElement and skip the rest - if ( !fragment && elems.length === 1 && typeof elems[0] === "string" ) { - var match = /^<(\w+)\s*\/?>$/.exec(elems[0]); - if ( match ) - return [ context.createElement( match[1] ) ]; - } - - var ret = [], scripts = [], div = context.createElement("div"); - - jQuery.each(elems, function(i, elem){ - if ( typeof elem === "number" ) - elem += ''; - - if ( !elem ) - return; - - // Convert html string into DOM nodes - if ( typeof elem === "string" ) { - // Fix "XHTML"-style tags in all browsers - elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){ - return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ? - all : - front + ">"; - }); - - // Trim whitespace, otherwise indexOf won't work as expected - var tags = jQuery.trim( elem ).toLowerCase(); - - var wrap = - // option or optgroup - !tags.indexOf("", "" ] || - - !tags.indexOf("", "" ] || - - tags.match(/^<(thead|tbody|tfoot|colg|cap)/) && - [ 1, "", "
" ] || - - !tags.indexOf("", "" ] || - - // matched above - (!tags.indexOf("", "" ] || - - !tags.indexOf("", "" ] || - - // IE can't serialize and - - - - - - -
-
- - -
-
- - - diff -r 6a1b36738d3d -r 9c006581f0cd inkscape/firefox/scene.mbsvg --- a/inkscape/firefox/scene.mbsvg Sun Mar 08 00:15:21 2009 +0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,105 +0,0 @@ - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - diff -r 6a1b36738d3d -r 9c006581f0cd inkscape/firefox/start.png Binary file inkscape/firefox/start.png has changed diff -r 6a1b36738d3d -r 9c006581f0cd inkscape/firefox/start.svg --- a/inkscape/firefox/start.svg Sun Mar 08 00:15:21 2009 +0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,91 +0,0 @@ - - - - - - - - - - - image/svg+xml - - - - - - - - - -