Changes In Branch multid Through [19496b5d36] Excluding Merge-Ins
This is equivalent to a diff from 18027d1022 to 19496b5d36
2018-02-19
| ||
18:08 | [fr] new performance test (better when the processor isn’t converting a video!) check-in: b34690f0d8 user: olr tags: trunk, fr | |
16:58 | [lo] update UI for dictionaries options check-in: 1aa225b40a user: olr tags: lo, multid | |
12:40 | [lo] dictionaries options: update UI (buggy: file picker crashes) check-in: 19496b5d36 user: olr tags: lo, multid | |
12:39 | [lo] remove print check-in: a6c452056b user: olr tags: lo, multid | |
09:44 | merge trunk check-in: 0b7150270a user: olr tags: multid | |
09:11 | [fr] version 0.6.2 check-in: 18027d1022 user: olr tags: trunk, fr | |
09:07 | [graphspell] normalize characters before spell checking check-in: 3348432a36 user: olr tags: trunk, graphspell | |
Modified gc_lang/fr/config.ini from [e2c23eef6d] to [c7e11a6902].
︙ | ︙ | |||
80 81 82 83 84 85 86 87 88 89 90 91 92 93 | oxt/About/About.py = pythonpath/About.py oxt/About/ab_strings.py = pythonpath/ab_strings.py # Dictionaries oxt/Dictionnaires/dictionaries = dictionaries oxt/Dictionnaires/dictionaries.xcu = dictionaries.xcu oxt/Dictionnaires/DictionarySwitcher.py = pythonpath/DictionarySwitcher.py oxt/Dictionnaires/ds_strings.py = pythonpath/ds_strings.py # ContextMenu oxt/ContextMenu/ContextMenu.py = ContextMenu.py oxt/ContextMenu/jobs.xcu = config/jobs.xcu # TextFormatter oxt/TextFormatter/TextFormatter.py = pythonpath/TextFormatter.py oxt/TextFormatter/tf_strings.py = pythonpath/tf_strings.py oxt/TextFormatter/tf_options.py = pythonpath/tf_options.py | > > > | 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | oxt/About/About.py = pythonpath/About.py oxt/About/ab_strings.py = pythonpath/ab_strings.py # Dictionaries oxt/Dictionnaires/dictionaries = dictionaries oxt/Dictionnaires/dictionaries.xcu = dictionaries.xcu oxt/Dictionnaires/DictionarySwitcher.py = pythonpath/DictionarySwitcher.py oxt/Dictionnaires/ds_strings.py = pythonpath/ds_strings.py # Dictionary Options oxt/DictOptions/DictOptions.py = pythonpath/DictOptions.py oxt/DictOptions/do_strings.py = pythonpath/do_strings.py # ContextMenu oxt/ContextMenu/ContextMenu.py = ContextMenu.py oxt/ContextMenu/jobs.xcu = config/jobs.xcu # TextFormatter oxt/TextFormatter/TextFormatter.py = pythonpath/TextFormatter.py oxt/TextFormatter/tf_strings.py = pythonpath/tf_strings.py oxt/TextFormatter/tf_options.py = pythonpath/tf_options.py |
︙ | ︙ |
Modified gc_lang/fr/oxt/AppLauncher.py from [30bcae4623] to [851c2d6eab].
︙ | ︙ | |||
38 39 40 41 42 43 44 45 46 47 48 49 50 51 | xDialog.run(sCmd[3:]) else: xDialog.run() elif sCmd == "TF": import TextFormatter xDialog = TextFormatter.TextFormatter(self.ctx) xDialog.run(self.sLang) elif sCmd == "DS": import DictionarySwitcher xDialog = DictionarySwitcher.FrenchDictionarySwitcher(self.ctx) xDialog.run(self.sLang) elif sCmd == "MA": import Author xDialog = Author.Author(self.ctx) | > > > > | 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | xDialog.run(sCmd[3:]) else: xDialog.run() elif sCmd == "TF": import TextFormatter xDialog = TextFormatter.TextFormatter(self.ctx) xDialog.run(self.sLang) elif sCmd == "DI": import DictOptions xDialog = DictOptions.DictOptions(self.ctx) xDialog.run(self.sLang) elif sCmd == "DS": import DictionarySwitcher xDialog = DictionarySwitcher.FrenchDictionarySwitcher(self.ctx) xDialog.run(self.sLang) elif sCmd == "MA": import Author xDialog = Author.Author(self.ctx) |
︙ | ︙ |
Added gc_lang/fr/oxt/DictOptions/DictOptions.py version [4af54009de].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 | # Dictionary Options # by Olivier R. # License: MPL 2 import unohelper import uno import traceback import helpers import do_strings from com.sun.star.task import XJobExecutor from com.sun.star.awt import XActionListener from com.sun.star.beans import PropertyValue class DictOptions (unohelper.Base, XActionListener, XJobExecutor): def __init__ (self, ctx): self.ctx = ctx self.xSvMgr = self.ctx.ServiceManager self.xContainer = None self.xDialog = None def _addWidget (self, name, wtype, x, y, w, h, **kwargs): xWidget = self.xDialog.createInstance('com.sun.star.awt.UnoControl%sModel' % wtype) xWidget.Name = name xWidget.PositionX = x xWidget.PositionY = y xWidget.Width = w xWidget.Height = h for k, w in kwargs.items(): setattr(xWidget, k, w) self.xDialog.insertByName(name, xWidget) return xWidget def run (self, sLang): dUI = do_strings.getUI(sLang) # what is the current dictionary xSettings = helpers.getConfigSetting("/org.openoffice.Office.Linguistic/ServiceManager/Dictionaries/HunSpellDic_fr", False) xLocations = xSettings.getByName("Locations") # dialog self.xDialog = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.UnoControlDialogModel', self.ctx) self.xDialog.Width = 200 self.xDialog.Height = 255 self.xDialog.Title = dUI.get('title', "#title#") xWindowSize = helpers.getWindowSize() self.xDialog.PositionX = int((xWindowSize.Width / 2) - (self.xDialog.Width / 2)) self.xDialog.PositionY = int((xWindowSize.Height / 2) - (self.xDialog.Height / 2)) # fonts xFDTitle = uno.createUnoStruct("com.sun.star.awt.FontDescriptor") xFDTitle.Height = 9 xFDTitle.Weight = uno.getConstantByName("com.sun.star.awt.FontWeight.BOLD") xFDTitle.Name = "Verdana" xFDSubTitle = uno.createUnoStruct("com.sun.star.awt.FontDescriptor") xFDSubTitle.Height = 8 xFDSubTitle.Weight = uno.getConstantByName("com.sun.star.awt.FontWeight.BOLD") xFDSubTitle.Name = "Verdana" # widget nX = 10 nY1 = 10 nY2 = nY1 + 50 nY3 = nY2 + 70 nWidth = self.xDialog.Width - 20 nHeight = 10 # Spell checker section self._addWidget("spelling_section", 'FixedLine', nX, nY1, nWidth, nHeight, Label = dUI.get("spelling_section", "#err"), FontDescriptor = xFDTitle) self.xActivateMain = self._addWidget('activate_main', 'CheckBox', nX, nY1+15, nWidth, nHeight, Label = dUI.get('activate_main', "#err"), State = True) self._addWidget('activate_main_descr', 'FixedText', nX, nY1+25, nWidth, nHeight*2, Label = dUI.get('activate_main_descr', "#err"), MultiLine = True) # Spell suggestion engine section self._addWidget("suggestion_section", 'FixedLine', nX, nY2, nWidth, nHeight, Label = dUI.get("suggestion_section", "#err"), FontDescriptor = xFDTitle) self.xActivateSugg = self._addWidget('activate_spell_sugg', 'CheckBox', nX, nY2+15, nWidth, nHeight, Label = dUI.get('activate_spell_sugg', "#err"), State = True) self._addWidget('activate_spell_sugg_descr', 'FixedText', nX, nY2+25, nWidth, nHeight*4, Label = dUI.get('activate_spell_sugg_descr', "#err"), MultiLine = True) # Personal dictionary section self._addWidget("personal_section", 'FixedLine', nX, nY3, nWidth, nHeight, Label = dUI.get("personal_section", "#err"), FontDescriptor = xFDTitle) self.xActivatePersonnal = self._addWidget('activate_personal', 'CheckBox', nX, nY3+15, nWidth, nHeight, Label = dUI.get('activate_personal', "#err"), State = True) self._addWidget('activate_personnal_descr', 'FixedText', nX, nY3+25, nWidth, nHeight*3, Label = dUI.get('activate_personal_descr', "#err"), MultiLine = True) self._addWidget('import_personal', 'FixedText', nX, nY3+55, nWidth-60, nHeight, Label = dUI.get('import_personal', "#err"), FontDescriptor = xFDSubTitle) self.xMsg = self._addWidget('msg', 'FixedText', nX, nY3+65, nWidth-50, nHeight, Label = "[néant]") self._addWidget('import_button', 'Button', self.xDialog.Width-50, nY3+65, 40, 10, Label = dUI.get('import_button', "#err"), TextColor = 0x005500) self._addWidget('create_dictionary', 'FixedText', nX, nY3+75, nWidth, nHeight*2, Label = dUI.get('create_dictionary', "#err"), MultiLine = True) # Button self._addWidget('apply_button', 'Button', self.xDialog.Width-120, self.xDialog.Height-25, 50, 14, Label = dUI.get('apply_button', "#err"), FontDescriptor = xFDTitle, TextColor = 0x005500) self._addWidget('cancel_button', 'Button', self.xDialog.Width-60, self.xDialog.Height-25, 50, 14, Label = dUI.get('cancel_button', "#err"), FontDescriptor = xFDTitle, TextColor = 0x550000) # container self.xContainer = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.UnoControlDialog', self.ctx) self.xContainer.setModel(self.xDialog) self.xContainer.getControl('apply_button').addActionListener(self) self.xContainer.getControl('apply_button').setActionCommand('Apply') self.xContainer.getControl('import_button').addActionListener(self) self.xContainer.getControl('import_button').setActionCommand('Import') self.xContainer.getControl('cancel_button').addActionListener(self) self.xContainer.getControl('cancel_button').setActionCommand('Cancel') self.xContainer.setVisible(False) toolkit = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.ExtToolkit', self.ctx) self.xContainer.createPeer(toolkit, None) self.xContainer.execute() # XActionListener def actionPerformed (self, xActionEvent): try: if xActionEvent.ActionCommand == 'Apply': if False: # Modify the registry xSettings = helpers.getConfigSetting("/org.openoffice.Office.Linguistic/ServiceManager/Dictionaries/HunSpellDic_fr", True) xLocations = xSettings.getByName("Locations") v1 = xLocations[0].replace(self.sCurrentDic, self.sSelectedDic) v2 = xLocations[1].replace(self.sCurrentDic, self.sSelectedDic) #xSettings.replaceByName("Locations", xLocations) # doesn't work, see line below uno.invoke(xSettings, "replaceByName", ("Locations", uno.Any("[]string", (v1, v2)))) xSettings.commitChanges() elif xActionEvent.ActionCommand == "Import": #xFilePicker = uno.createUnoService("com.sun.star.ui.dialogs.FilePicker") xFilePicker = self.xSvMgr.createInstanceWithContext('com.sun.star.ui.dialogs.SystemFilePicker', self.ctx) xFilePicker.appendFilter("Supported files", "*.json; *.bdic") #xFilePicker.setDisplayDirectory("") #xFilePicker.setMultiSelectionMode(True) nResult = xFilePicker.execute() print(nResult) if nResult == 1: print("two") lFile = xFilePicker.getSelectedFiles() print("one") lFile = xFilePicker.getFiles() print(lFile) else: pass self.xContainer.endExecute() except: traceback.print_exc() # XJobExecutor def trigger (self, args): try: dialog = DictOptions(self.ctx) dialog.run() except: traceback.print_exc() #g_ImplementationHelper = unohelper.ImplementationHelper() #g_ImplementationHelper.addImplementation(DictOptions, 'net.grammalecte.graphspell.DictOptions', ('com.sun.star.task.Job',)) |
Added gc_lang/fr/oxt/DictOptions/do_strings.py version [a801f3d0f2].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | def getUI (sLang): if sLang in dStrings: return dStrings[sLang] return dStrings["fr"] dStrings = { "fr": { "title": "Grammalecte · Options des dictionnaires", "spelling_section": "Correcteur orthographique", "activate_main": "Activer le correcteur orthographique de Grammalecte", "activate_main_descr": "Supplante le correcteur orthographique inclus dans LibreOffice (Hunspell).", "personal_section": "Dictionnaire personnel", "activate_personal": "Utiliser", "activate_personal_descr": "Le dictionnaire personnel est une commodité pour ajouter le vocabulaire qui vous est utile. Il ne supplante pas le dictionnaire commun ; il ne fait qu’ajouter de nouveaux mots.", "import_personal": "Importer un dictionnaire personnel", "import_button": "Importer", "create_dictionary": "Vous pouvez créer un dictionnaire personnel avec l’extension Grammalecte pour Firefox ou Chrome.", "suggestion_section": "Moteur de suggestion orthographique", "activate_spell_sugg": "Activer le moteur de suggestion de Grammalecte", "activate_spell_sugg_descr": "Désactivée, cette option remplace la suggestion orthographique de Grammalecte par celle fournie par LibreOffice (Hunspell). Les mots inclus dans le dictionnaire personnalisé ne seront plus inclus aux suggestions.", "apply_button": "Appliquer", "cancel_button": "Annuler", }, "en": { "title": "Grammalecte · Options for dictionaries", "spelling_section": "Spell checker", "activate_main": "Activate the spell checker from Grammalecte", "activate_main_descr": "Overrides the spell checker included in LibreOffice (Hunspell)", "personal_section": "Personal dictionary", "activate_personal": "Use", "activate_personal_descr": "The personal dictionary is a commodity to add the vocabulary you want. It doesn’t override the common dictionary ; it only adds new words.", "import_personal": "Import a personal dictionary", "import_button": "Import", "create_dictionary": "You can create a personal dictionary with the Grammalecte addon for Firefox or Chrome.", "suggestion_section": "Spell suggestion engine", "activate_spell_sugg": "Activate the suggestion engine of Grammalecte", "activate_spell_sugg_descr": "Disactivated, this option replace the spell suggestion engine of Grammalecte by the one of LibreOffice (Hunspell). Words included in the personal dictionary won’t be included among suggestions.", "apply_button": "Apply", "cancel_button": "Cancel", }, } |
Modified gc_lang/fr/oxt/TextFormatter/TextFormatter.py from [6fb58f6672] to [744fe2827e].
︙ | ︙ | |||
381 382 383 384 385 386 387 | # create options dictionary dOpt = {} for key, lWidget in self.dCheckboxWidgets.items(): w = getattr(self, key) dOpt[w.Name] = w.State for w in lWidget: dOpt[w.Name] = w.State | < < < < < < > | 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 | # create options dictionary dOpt = {} for key, lWidget in self.dCheckboxWidgets.items(): w = getattr(self, key) dOpt[w.Name] = w.State for w in lWidget: dOpt[w.Name] = w.State # write file sExtPath = helpers.getAbsolutePathOf("/pythonpath/tf_options.py") if os.path.isfile(sExtPath): hOpt = open(sExtPath, "w") hOpt.write("dDefaultOpt = " + str(tf_options.dDefaultOpt) + "\n") hOpt.write("dOpt = " + str(dOpt)) hOpt.close() except: traceback.print_exc() |
︙ | ︙ |
Modified gc_lang/fr/oxt/addons.xcu from [1d834d2bae] to [3b803f02e0].
︙ | ︙ | |||
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 | <value>com.sun.star.text.TextDocument,com.sun.star.text.GlobalDocument,com.sun.star.text.WebDocument</value> </prop> <prop oor:name="ImageIdentifier" oor:type="xs:string"> <value>org.dicollecte.images:Grammalecte</value> </prop> </node> <node oor:name="m6" oor:op="replace"> <prop oor:name="URL" oor:type="xs:string"> <value>service:net.grammalecte.AppLauncher?DS</value> </prop> <prop oor:name="Title" oor:type="xs:string"> <value/> <value xml:lang="fr">~Options orthographiques…</value> <value xml:lang="en-US">Spelling ~options…</value> </prop> <prop oor:name="Target" oor:type="xs:string"> <value>_self</value> </prop> <prop oor:name="Context" oor:type="xs:string"> <value>com.sun.star.text.TextDocument,com.sun.star.text.GlobalDocument,com.sun.star.text.WebDocument,com.sun.star.presentation.PresentationDocument</value> </prop> <prop oor:name="ImageIdentifier" oor:type="xs:string"> <value>org.dicollecte.images:Frenchflag</value> </prop> </node> | > > > > > > > > > > > > > > > > > > > | | | 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 | <value>com.sun.star.text.TextDocument,com.sun.star.text.GlobalDocument,com.sun.star.text.WebDocument</value> </prop> <prop oor:name="ImageIdentifier" oor:type="xs:string"> <value>org.dicollecte.images:Grammalecte</value> </prop> </node> <node oor:name="m6" oor:op="replace"> <prop oor:name="URL" oor:type="xs:string"> <value>service:net.grammalecte.AppLauncher?DI</value> </prop> <prop oor:name="Title" oor:type="xs:string"> <value/> <value xml:lang="fr">~Options des dictionnaires…</value> <value xml:lang="en-US">Dictionaries ~options…</value> </prop> <prop oor:name="Target" oor:type="xs:string"> <value>_self</value> </prop> <prop oor:name="Context" oor:type="xs:string"> <value>com.sun.star.text.TextDocument,com.sun.star.text.GlobalDocument,com.sun.star.text.WebDocument,com.sun.star.presentation.PresentationDocument</value> </prop> <prop oor:name="ImageIdentifier" oor:type="xs:string"> <value>org.dicollecte.images:Frenchflag</value> </prop> </node> <node oor:name="m7" oor:op="replace"> <prop oor:name="URL" oor:type="xs:string"> <value>service:net.grammalecte.AppLauncher?DS</value> </prop> <prop oor:name="Title" oor:type="xs:string"> <value/> <value xml:lang="fr">~Options orthographiques…</value> <value xml:lang="en-US">Spelling ~options…</value> </prop> <prop oor:name="Target" oor:type="xs:string"> <value>_self</value> </prop> <prop oor:name="Context" oor:type="xs:string"> <value>com.sun.star.text.TextDocument,com.sun.star.text.GlobalDocument,com.sun.star.text.WebDocument,com.sun.star.presentation.PresentationDocument</value> </prop> <prop oor:name="ImageIdentifier" oor:type="xs:string"> <value>org.dicollecte.images:Frenchflag</value> </prop> </node> <node oor:name="m8" oor:op="replace"> <prop oor:name="URL" oor:type="xs:string"> <value>private:separator</value> </prop> <prop oor:name="Context" oor:type="xs:string"> <value>com.sun.star.text.TextDocument,com.sun.star.text.GlobalDocument,com.sun.star.text.WebDocument,com.sun.star.presentation.PresentationDocument</value> </prop> </node> <node oor:name="m9" oor:op="replace"> <prop oor:name="URL" oor:type="xs:string"> <value>service:net.grammalecte.AppLauncher?About</value> </prop> <prop oor:name="Title" oor:type="xs:string"> <value/> <value xml:lang="fr">À ~propos de Grammalecte…</value> <value xml:lang="en-US">~About Grammalecte…</value> |
︙ | ︙ |
Modified gc_lang/fr/oxt/helpers.py from [3ebcc78813] to [0c0cec83d0].
|
| | | > > > < < > < > | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | # Helpers for LibreOffice extension import os import traceback import uno from com.sun.star.beans import PropertyValue from com.sun.star.uno import RuntimeException as _rtex def xray (myObject): "XRay - API explorer" try: sm = uno.getComponentContext().ServiceManager mspf = sm.createInstanceWithContext("com.sun.star.script.provider.MasterScriptProviderFactory", uno.getComponentContext()) scriptPro = mspf.createScriptProvider("") xScript = scriptPro.getScript("vnd.sun.star.script:XrayTool._Main.Xray?language=Basic&location=application") xScript.invoke((myObject,), (), ()) return except: raise _rtex("\nBasic library Xray is not installed", uno.getComponentContext()) def mri (ctx, xTarget): "MRI - API Explorer" try: xMri = ctx.ServiceManager.createInstanceWithContext("mytools.Mri", ctx) xMri.inspect(xTarget) except: raise _rtex("\nPython extension MRI is not installed", uno.getComponentContext()) def getConfigSetting (sNodeConfig, bUpdate): "get a configuration node" # example: xNode = getConfigSetting("/org.openoffice.Office.Common/Path/Current", False) xSvMgr = uno.getComponentContext().ServiceManager xConfigProvider = xSvMgr.createInstanceWithContext("com.sun.star.configuration.ConfigurationProvider", uno.getComponentContext()) |
︙ | ︙ | |||
56 57 58 59 60 61 62 | xContainerWindow = xDesktop.getCurrentComponent().CurrentController.Frame.ContainerWindow xWindowSize = xContainerWindow.convertSizeToLogic(xContainerWindow.Size, uno.getConstantByName("com.sun.star.util.MeasureUnit.POINT")) #print(xContainerWindow.Size.Width, ">", xWindowSize.Width) #print(xContainerWindow.Size.Height, ">", xWindowSize.Height) xWindowSize.Width = xWindowSize.Width * 0.666 xWindowSize.Height = xWindowSize.Height * 0.666 return xWindowSize | > > > > > > > > > > | 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | xContainerWindow = xDesktop.getCurrentComponent().CurrentController.Frame.ContainerWindow xWindowSize = xContainerWindow.convertSizeToLogic(xContainerWindow.Size, uno.getConstantByName("com.sun.star.util.MeasureUnit.POINT")) #print(xContainerWindow.Size.Width, ">", xWindowSize.Width) #print(xContainerWindow.Size.Height, ">", xWindowSize.Height) xWindowSize.Width = xWindowSize.Width * 0.666 xWindowSize.Height = xWindowSize.Height * 0.666 return xWindowSize def getAbsolutePathOf (sPath=""): xDefaultContext = uno.getComponentContext().ServiceManager.DefaultContext xPackageInfoProvider = xDefaultContext.getValueByName("/singletons/com.sun.star.deployment.PackageInformationProvider") sFullPath = xPackageInfoProvider.getPackageLocation("French.linguistic.resources.from.Dicollecte.by.OlivierR") if sPath and not sPath.startswith("/"): sPath = "/" + sPath sFullPath = sFullPath[8:] + sPath return os.path.abspath(sFullPath) |