Overview
Comment: | [lo] formateur de texte: action sur sélection seulement (par Jean-Marc Zambon) |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk | lo |
Files: | files | file ages | folders |
SHA3-256: |
2e113ed23c73de25eceef15104e59718 |
User & Date: | olr on 2023-03-22 12:13:09 |
Other Links: | manifest | tags |
Context
2023-03-22
| ||
12:15 | [fr] phonet_simil: maj check-in: ff9e10f27d user: olr tags: fr, trunk | |
12:13 | [lo] formateur de texte: action sur sélection seulement (par Jean-Marc Zambon) check-in: 2e113ed23c user: olr tags: lo, trunk | |
12:05 | [graphspell] maj suggestions ad hoc check-in: aa801c719a user: olr tags: graphspell, trunk | |
Changes
Modified gc_lang/fr/oxt/TextFormatter/TextFormatter.py from [b311464570] to [91abcf765e].
︙ | ︙ | |||
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | import tf_tabrep import helpers import TextFormatterEditor import unohelper import uno from com.sun.star.task import XJobExecutor from com.sun.star.awt import XActionListener from com.sun.star.awt.MessageBoxButtons import BUTTONS_OK # BUTTONS_OK, BUTTONS_OK_CANCEL, BUTTONS_YES_NO, BUTTONS_YES_NO_CANCEL, BUTTONS_RETRY_CANCEL, BUTTONS_ABORT_IGNORE_RETRY # DEFAULT_BUTTON_OK, DEFAULT_BUTTON_CANCEL, DEFAULT_BUTTON_RETRY, DEFAULT_BUTTON_YES, DEFAULT_BUTTON_NO, DEFAULT_BUTTON_IGNORE from com.sun.star.awt.MessageBoxType import INFOBOX # MESSAGEBOX, INFOBOX, WARNINGBOX, ERRORBOX, QUERYBOX def MessageBox (xParentWin, sMsg, sTitle, nBoxType=INFOBOX, nBoxButtons=BUTTONS_OK): ctx = uno.getComponentContext() xToolkit = ctx.ServiceManager.createInstanceWithContext("com.sun.star.awt.Toolkit", ctx) xMsgBox = xToolkit.createMessageBox(xParentWin, nBoxType, nBoxButtons, sTitle, sMsg) return xMsgBox.execute() | > > > > > | 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 | import tf_tabrep import helpers import TextFormatterEditor import unohelper import uno from com.sun.star.task import XJobExecutor from com.sun.star.awt import XActionListener from com.sun.star.beans import PropertyValue from com.sun.star.lang import IllegalArgumentException from com.sun.star.awt.MessageBoxButtons import BUTTONS_OK # BUTTONS_OK, BUTTONS_OK_CANCEL, BUTTONS_YES_NO, BUTTONS_YES_NO_CANCEL, BUTTONS_RETRY_CANCEL, BUTTONS_ABORT_IGNORE_RETRY # DEFAULT_BUTTON_OK, DEFAULT_BUTTON_CANCEL, DEFAULT_BUTTON_RETRY, DEFAULT_BUTTON_YES, DEFAULT_BUTTON_NO, DEFAULT_BUTTON_IGNORE from com.sun.star.awt.MessageBoxType import INFOBOX # MESSAGEBOX, INFOBOX, WARNINGBOX, ERRORBOX, QUERYBOX from com.sun.star.style.NumberingType import CHAR_SPECIAL def MessageBox (xParentWin, sMsg, sTitle, nBoxType=INFOBOX, nBoxButtons=BUTTONS_OK): ctx = uno.getComponentContext() xToolkit = ctx.ServiceManager.createInstanceWithContext("com.sun.star.awt.Toolkit", ctx) xMsgBox = xToolkit.createMessageBox(xParentWin, nBoxType, nBoxButtons, sTitle, sMsg) return xMsgBox.execute() |
︙ | ︙ | |||
239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 | # dialog height self.xDialog.Height = 277 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)) # lists of checkbox widgets self.dCheckboxWidgets = { "ssp": [self.ssp1, self.ssp2, self.ssp3, self.ssp4, self.ssp5, self.ssp6, self.ssp7], "space": [self.space1, self.space2], "nbsp": [self.nbsp1, self.nbsp2, self.nbsp3, self.nbsp4, self.nbsp5, self.nbsp6, self.nnbsp1, self.nnbsp2, self.nnbsp4], "delete": [self.delete1, self.delete2, self.delete2a, self.delete2b, self.delete2c], "typo": [self.typo1, self.typo2, self.typo3, self.typo3a, self.typo3b, self.typo4, self.typo4a, self.typo4b, self.typo5, self.typo6, \ self.typo7, self.typo8, self.typo8a, self.typo8b, self.typo_ff, self.typo_fi, self.typo_ffi, self.typo_fl, self.typo_ffl, \ self.typo_ft, self.typo_st], "misc": [self.misc1, self.misc2, self.misc3, self.misc5, self.misc1a, self.misc5b, self.misc5c, self.misccustom], #self.misc4, | > > > > > > > > > > > > > > > > > | < | < < < < < < | < < < < < < < < | | | 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 | # dialog height self.xDialog.Height = 277 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)) # progress bar self.pbar = self._addWidget('pbar', 'ProgressBar', 22, y+50, 115, 10) self.pbar.ProgressValueMin = 0 self.pbar.ProgressValueMax = 32 # time counter self.time_res = self._addWidget('time_res', 'FixedText', 140, self.xDialog.Height-16, 20, nHeight, Label = "", Align = 2) # selection only self.bsel = self._addWidget('bsel', 'CheckBox', 170, self.xDialog.Height-15, 90, nHeight, Label = ui.get('bsel')) # buttons self.bdefault = self._addWidget('default', 'Button', 5, y+47, 15, 15, Label = ui.get('default'), \ HelpText = ui.get('default_help'), FontDescriptor = xFD2, TextColor = 0x444444) self.bapply = self._addWidget('apply', 'Button', self.xDialog.Width-55, self.xDialog.Height-19, 50, 15, Label = ui.get('apply'), \ FontDescriptor = xFD2, TextColor = 0x004400) self.binfo = self._addWidget('info', 'Button', self.xDialog.Width-15, 0, 10, 9, Label = ui.get('info'), \ HelpText = ui.get('infotitle'), FontDescriptor = xFDsmall, TextColor = 0x444444) # lists of checkbox widgets self.dCheckboxWidgets = { "ssp": [self.ssp1, self.ssp2, self.ssp3, self.ssp4, self.ssp5, self.ssp6, self.ssp7], "space": [self.space1, self.space2], "nbsp": [self.nbsp1, self.nbsp2, self.nbsp3, self.nbsp4, self.nbsp5, self.nbsp6, self.nnbsp1, self.nnbsp2, self.nnbsp4], "delete": [self.delete1, self.delete2, self.delete2a, self.delete2b, self.delete2c], "typo": [self.typo1, self.typo2, self.typo3, self.typo3a, self.typo3b, self.typo4, self.typo4a, self.typo4b, self.typo5, self.typo6, \ self.typo7, self.typo8, self.typo8a, self.typo8b, self.typo_ff, self.typo_fi, self.typo_ffi, self.typo_fl, self.typo_ffl, \ self.typo_ft, self.typo_st], "misc": [self.misc1, self.misc2, self.misc3, self.misc5, self.misc1a, self.misc5b, self.misc5c, self.misccustom], #self.misc4, "struct": [self.struct1, self.struct2, self.struct3], "other": [self.bsel] } # load configuration self.dTransRules = {} self.xGLOptionNode = helpers.getConfigSetting("/org.openoffice.Lightproof_grammalecte/Other/", True) self._loadConfig("fr") ## container self.xContainer = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.UnoControlDialog', self.ctx) self.xContainer.setModel(self.xDialog) self.xContainer.setVisible(False) self.xContainer.getControl('info').addActionListener(self) self.xContainer.getControl('info').setActionCommand('Info') |
︙ | ︙ | |||
310 311 312 313 314 315 316 | # XActionListener def actionPerformed (self, xActionEvent): try: if xActionEvent.ActionCommand == 'Apply': if self.bClose: self.xContainer.endExecute() else: | > | | < | < < | | | | > > | > > | | > | | | | | | | | | > > > | 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 | # XActionListener def actionPerformed (self, xActionEvent): try: if xActionEvent.ActionCommand == 'Apply': if self.bClose: self.xContainer.endExecute() else: try: xDesktop = self.ctx.ServiceManager.createInstanceWithContext("com.sun.star.frame.Desktop", self.ctx) xElem = xDesktop.getCurrentComponent() # Writer self._saveConfig("fr") self.xUndoManager = xElem.UndoManager if self.bsel.State: # modify selected text only xElem.lockControllers() self.xViewCursor = xElem.CurrentController.ViewCursor # some magic to workaround xTextTableCursor in multicell selection if xElem.CurrentSelection.supportsService("com.sun.star.text.TextTableCursor"): xElem.CurrentController.select(self.xViewCursor) self.xSelections = xElem.CurrentSelection self._replaceAll(xElem) # Impress # Note: impossible to format text on Impress right now as ReplaceDescriptors don’t accept regex! #xPages = xElem.getDrawPages() #for i in range(xPages.Count): # self._replaceAll(xPages.getByIndex(i)) #xPages = xElem.getMasterPages() #for i in range(xPages.Count): # self._replaceAll(xPages.getByIndex(i)) self._setApplyButtonLabel() finally: if xElem.hasControllersLocked(): xElem.unlockControllers() elif xActionEvent.ActionCommand == 'SwitchSsp': self._switchCheckBox(self.ssp) self._setApplyButtonLabel() elif xActionEvent.ActionCommand == 'SwitchSpace': self._switchCheckBox(self.space) self._setApplyButtonLabel() elif xActionEvent.ActionCommand == 'SwitchNbsp': |
︙ | ︙ | |||
406 407 408 409 410 411 412 | def _saveConfig (self, sLang): "save options in LibreOffice profile" try: # create options dictionary dOpt = {} for sKey, lWidget in self.dCheckboxWidgets.items(): | > | | | 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 | def _saveConfig (self, sLang): "save options in LibreOffice profile" try: # create options dictionary dOpt = {} for sKey, lWidget in self.dCheckboxWidgets.items(): if sKey != 'other': w = getattr(self, sKey) dOpt[w.Name] = w.State for w in lWidget: dOpt[w.Name] = w.State # save option to LO profile as JSON string xChild = self.xGLOptionNode.getByName("o_"+sLang) xChild.setPropertyValue("tf_options", json.dumps(dOpt)) self.xGLOptionNode.commitChanges() except: |
︙ | ︙ | |||
727 728 729 730 731 732 733 | def _replaceText (self, xElem, sPattern, sRepl, bRegex, bCaseSensitive=False): try: xRD = xElem.createReplaceDescriptor() xRD.SearchString = sPattern xRD.ReplaceString = sRepl xRD.SearchRegularExpression = bRegex xRD.SearchCaseSensitive = bCaseSensitive | > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > | | < > > > | < | | > | | > > | | | < | > > > | | | | < | > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > | > > > > | > > > | | > > | | | > > > > > | | > | < > > > > > > > > > > | > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > | > > | | | < | > > > | | < < < < | < < | | > | > > > > > > > > > > > > > > | 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 | def _replaceText (self, xElem, sPattern, sRepl, bRegex, bCaseSensitive=False): try: xRD = xElem.createReplaceDescriptor() xRD.SearchString = sPattern xRD.ReplaceString = sRepl xRD.SearchRegularExpression = bRegex xRD.SearchCaseSensitive = bCaseSensitive if not self.bsel.State: # no selection return xElem.replaceAll(xRD) else: # selection only import re def isinselection(xTextRange): try: if (xSel.Text.compareRegionStarts(xTextRange, xSel) < 1 and xSel.Text.compareRegionEnds(xTextRange, xSel) > -1): return True except IllegalArgumentException: try: return isinselection(xTextRange.TextFrame.Anchor) except AttributeError: try: return isinselection(xTextRange.TextTable.Anchor) except AttributeError: return False except Exception: # xray(xTextRange) traceback.print_exc() return False # endof isinselection() xAllFound = [ f for f in xElem.findAll(xRD) ] if xElem.CurrentSelection.supportsService("com.sun.star.text.TextTableCursor"): xElem.CurrentController.select(xElem.CurrentController.ViewCursor) fs = [] for xSel in self.xSelections: for f in xAllFound[::-1]: if isinselection(f): fs.append(f) xAllFound.remove(f) if fs: bResub = False if bRegex: if sRepl == r'\n': sRepl = r'\r' if "$" in sRepl: #py regex substitution is only needed here bResub = True sRepl = sRepl.replace("$", "\\") sPattern = sPattern.replace("[:alpha:]", "[^\\W\\d]").replace("[:digit:]", "\\d") if bCaseSensitive: replacer = re.compile(sPattern) else: replacer = re.compile(sPattern, flags=re.IGNORECASE) try: self.xUndoManager.enterUndoContext('Remplacer : {}x "{}" → "{}"'.format(len(fs), truncateString(sPattern), sRepl)) for f in fs: if bResub: f.setString(replacer.sub(sRepl, f.String)) else: f.setString(sRepl) finally: self.xUndoManager.leaveUndoContext() return len(fs) except: traceback.print_exc() return 0 def _replaceHyphenAtEndOfParagraphs (self, xDoc): def getCursors(xContainer): nonlocal islastmodified for xPara in xContainer: islastmodified = False try: if xPara.String.endswith("-"): xCursor = xPara.Text.createTextCursorByRange(xPara.End) xCursor.gotoStartOfWord(False) xCursor.gotoEndOfWord(True) if xCursor.String: # first part ok xCursor.gotoNextParagraph(True) xCursor.gotoEndOfWord(True) if xCursor.String.endswith(linesep): # no second part continue elif xCursor.createContentEnumeration("com.sun.star.text.TextContent").hasMoreElements(): # do not erase text content continue xWord = xCursor.String.replace('-' + linesep, '') if linesep in xWord: # we have a table here, do not merge continue elif xWord and xHunspell.isValid(xWord, xCursor.CharLocale, ()): cursors.append((xCursor, xWord)) islastmodified = True except AttributeError: # not a real paragraph if xPara.supportsService('com.sun.star.text.TextTable'): for cellname in xPara.CellNames: cell = xPara.getCellByName(cellname) getCursors(cell) else: # xray(xPara) pass # endof getCursors() self._replaceText(xDoc, r"-\s+$", "-", True) # remove spaces at end of paragraphs if - is the last character from os import linesep cursors = [] n = 0 islastmodified = False try: xHunspell = self.xSvMgr.createInstanceWithContext("com.sun.star.linguistic2.SpellChecker", self.ctx) if self.bsel.State: for xSel in self.xSelections: try: xText = xSel.Text except AttributeError: continue xTCursor = xText.createTextCursorByRange(xSel) getCursors(xTCursor) for xFrame in xDoc.TextFrames: xAnchor = xFrame.Anchor if self._isAnchorInSelection(xAnchor, xSel): getCursors(xFrame) else: getCursors(xDoc.Text) for xFrame in xDoc.TextFrames: getCursors(xFrame) # ignore last paragraph if selection only if self.bsel.State and islastmodified: cursors.pop() if cursors: n = len(cursors) # TODO: translate string self.xUndoManager.enterUndoContext("Césure en fin de paragraphe : {} {}".format(n, n > 1 and 'occurrences' or 'occurrence')) try: for xCursor, xWord in cursors: xCursor.setString(xWord) finally: self.xUndoManager.leaveUndoContext() except Exception: traceback.print_exc() return n def _mergeContiguousParagraphs (self, xDoc): def getCursors(xContainer): nonlocal islastmodified for xPara in xContainer: islastmodified = False try: if xPara.String: xCursor = xPara.Text.createTextCursorByRange(xPara.End) xCursor.goRight(1, True) if xCursor.String == linesep: cursors.append([xCursor, " "]) islastmodified = True else: if cursors: cursors[-1][1] = "" except AttributeError: # not a actual paragraph if xPara.supportsService('com.sun.star.text.TextTable'): for cellname in xPara.CellNames: cell = xPara.getCellByName(cellname) getCursors(cell) else: # xray(xPara) pass # endof getCursors() from os import linesep self._replaceText(xDoc, r"^\s+$", "", True) # clear empty paragraphs cursors = [] n = 0 islastmodified = False try: if self.bsel.State: for xSel in self.xSelections: try: xText = xSel.Text except AttributeError: continue xTCursor = xText.createTextCursorByRange(xSel) getCursors(xTCursor) for xFrame in xDoc.TextFrames: xAnchor = xFrame.Anchor if self._isAnchorInSelection(xAnchor, xSel): getCursors(xFrame) else: getCursors(xDoc.Text) for xFrame in xDoc.TextFrames: getCursors(xFrame) # ignore last paragraph if selection only if self.bsel.State and islastmodified: cursors.pop() if cursors: n = len(cursors) # TODO: translate string self.xUndoManager.enterUndoContext("Fusionner les paragraphes : {} {}".format(n, n > 1 and 'occurrences' or 'occurrence')) try: for xCursor, sRepl in cursors: # ignore first paragraph xCursor.setString(sRepl) finally: self.xUndoManager.leaveUndoContext() except Exception: traceback.print_exc() return n def _replaceBulletsByEmDash (self, xDoc): def hasBullet (xPara): try: numrule = xPara.NumberingRules[xPara.NumberingLevel] for prop in numrule: if prop.Name == "NumberingType" and prop.Value == CHAR_SPECIAL: return True return False except TypeError: # no numbering rules return False # endof hasBullet() def getParagraphs (xContainer): for xPara in xContainer: try: if hasBullet(xPara): starts.append(xPara.Start) except AttributeError: # not a real paragraph if xPara.supportsService('com.sun.star.text.TextTable'): for cellname in xPara.CellNames: cell = xPara.getCellByName(cellname) getParagraphs(cell) else: # xray(xPara) pass # endof getParagraphs() starts = [] n = 0 try: if self.bsel.State: for xSel in self.xSelections: try: xText = xSel.Text except AttributeError: continue xTCursor = xText.createTextCursorByRange(xSel) getParagraphs(xTCursor) for xFrame in xDoc.TextFrames: xAnchor = xFrame.Anchor if self._isAnchorInSelection(xAnchor, xSel): getParagraphs(xFrame) else: getParagraphs(xDoc.Text) for xFrame in xDoc.TextFrames: getParagraphs(xFrame) if starts: n = len(starts) sParaStyleName = "" if not self.delete2c.State: sParaStyleName = "Standard" if self.delete2a.State else "Text body" # TODO: translate string self.xUndoManager.enterUndoContext('Remplacer : {} {}'.format(n, n > 1 and 'puces' or 'puce')) try: for xStart in starts: if not self.delete2c.State: xStart.ParaStyleName = sParaStyleName xStart.NumberingStyleName = "" xStart.String = "— " finally: self.xUndoManager.leaveUndoContext() except Exception: traceback.print_exc() return n def _isAnchorInSelection (self, anchor, selection): try: if (selection.Text.compareRegionStarts(anchor, selection) < 1 and selection.Text.compareRegionEnds(anchor, selection) > -1): return True return False except IllegalArgumentException: return False def truncateString (sText): "shorten text if len(sText) > 20" return '{}...{}'.format(sText[:8], sText[-8:]) if len(sText) > 20 else sText def getTimeRes (n): "returns duration in seconds as string" if n < 10: return "{:.3f} s".format(n) if n < 100: return "{:.2f} s".format(n) |
︙ | ︙ |
Modified gc_lang/fr/oxt/TextFormatter/tf_options.py from [d6b9728d6e] to [c3b4b4649b].
1 2 3 4 5 6 7 8 9 10 11 | # text formatter options dDefaultOpt = { 'ssp': 1, 'ssp1': 1, 'ssp2': 1, 'ssp3': 1, 'ssp4': 1, 'ssp5': 1, 'ssp6': 1, 'ssp7': 1, 'nbsp': 1, 'nbsp1': 1, 'nbsp2': 1, 'nbsp3': 1, 'nbsp4': 1, 'nbsp5': 1, 'nbsp6': 1, 'nnbsp1': 0, 'nnbsp2': 0, 'nnbsp4': 0, 'space': 1, 'space1': 1, 'space2': 1, 'delete': 0, 'delete1': 1, 'delete2': 1, 'delete2a': 0, 'delete2b': 1, 'delete2c': 0, 'typo': 1, 'typo1': 1, 'typo2': 1, 'typo3': 1, 'typo4': 1, 'typo5': 1, 'typo6': 1, 'typo7': 1, 'typo8': 0, 'typo3a': 0, 'typo3b': 1, 'typo4a': 1, 'typo4b': 0, 'typo8a': 0, 'typo8b': 1, 'typo_ff': 1, 'typo_fi':1, 'typo_ffi':1, 'typo_fl':1, 'typo_ffl':1, 'typo_ft':1, 'typo_st': 1, 'misc': 1, 'misc1': 1, 'misc2': 1, 'misc3': 1, 'misc5': 1, 'misc1a': 0, 'misc5b': 0, 'misc5c': 0, 'misccustom': 0, 'struct': 0, 'struct1': 1, 'struct2': 1, 'struct3': 0, } | > | 1 2 3 4 5 6 7 8 9 10 11 12 | # text formatter options dDefaultOpt = { 'ssp': 1, 'ssp1': 1, 'ssp2': 1, 'ssp3': 1, 'ssp4': 1, 'ssp5': 1, 'ssp6': 1, 'ssp7': 1, 'nbsp': 1, 'nbsp1': 1, 'nbsp2': 1, 'nbsp3': 1, 'nbsp4': 1, 'nbsp5': 1, 'nbsp6': 1, 'nnbsp1': 0, 'nnbsp2': 0, 'nnbsp4': 0, 'space': 1, 'space1': 1, 'space2': 1, 'delete': 0, 'delete1': 1, 'delete2': 1, 'delete2a': 0, 'delete2b': 1, 'delete2c': 0, 'typo': 1, 'typo1': 1, 'typo2': 1, 'typo3': 1, 'typo4': 1, 'typo5': 1, 'typo6': 1, 'typo7': 1, 'typo8': 0, 'typo3a': 0, 'typo3b': 1, 'typo4a': 1, 'typo4b': 0, 'typo8a': 0, 'typo8b': 1, 'typo_ff': 1, 'typo_fi':1, 'typo_ffi':1, 'typo_fl':1, 'typo_ffl':1, 'typo_ft':1, 'typo_st': 1, 'misc': 1, 'misc1': 1, 'misc2': 1, 'misc3': 1, 'misc5': 1, 'misc1a': 0, 'misc5b': 0, 'misc5c': 0, 'misccustom': 0, 'struct': 0, 'struct1': 1, 'struct2': 1, 'struct3': 0, 'bsel': 0, } |
Modified gc_lang/fr/oxt/TextFormatter/tf_strings.py from [38d0d3b6b5] to [a998e8ec56].
︙ | ︙ | |||
90 91 92 93 94 95 96 | "struct2": "Enlever césures en fin de ligne/paragraphe", "struct3": "Fusionner les paragraphes contigus [!]", "struct3_help": "Concatène tous les paragraphes non séparés par un paragraphe vide.\nAttention : LibreOffice et OpenOffice ne peuvent accepter des paragraphes de plus de 65535 caractères, ce qui fait environ 12 pages avec une police de taille 12. Un dépassement de cette limite fera planter le logiciel. À partir de LibreOffice 4.3, cette limitation n’existe plus.", "default": "[·]", "default_help": "Options par défaut", | | | 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | "struct2": "Enlever césures en fin de ligne/paragraphe", "struct3": "Fusionner les paragraphes contigus [!]", "struct3_help": "Concatène tous les paragraphes non séparés par un paragraphe vide.\nAttention : LibreOffice et OpenOffice ne peuvent accepter des paragraphes de plus de 65535 caractères, ce qui fait environ 12 pages avec une police de taille 12. Un dépassement de cette limite fera planter le logiciel. À partir de LibreOffice 4.3, cette limitation n’existe plus.", "default": "[·]", "default_help": "Options par défaut", "bsel": "Sur la sélection a~ctive", "editor": "~Editeur…", "editor_help": "Éditeur de transformations", "apply": "~Appliquer", "close": "~Fermer", "info": "(i)", "infotitle": "Informations", |
︙ | ︙ | |||
177 178 179 180 181 182 183 | "struct2": "Remove syllabification hyphens at EOL/EOP", "struct3": "Merge contiguous paragraphs [!]", "struct3_help": "Concatenate all paragraphs not separated by an empty paragraph.\nCaution: LibreOffice and OpenOffice can’t deal with paragraphs longer than 65,535 characters, which is about 12 pages with font size 12. Overstepping this limit will crash the software. For LibreOffice 4.3 and beyond, this limitation doesn’t exist any more.", "default": "[·]", "default_help": "Default options", | | | 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 | "struct2": "Remove syllabification hyphens at EOL/EOP", "struct3": "Merge contiguous paragraphs [!]", "struct3_help": "Concatenate all paragraphs not separated by an empty paragraph.\nCaution: LibreOffice and OpenOffice can’t deal with paragraphs longer than 65,535 characters, which is about 12 pages with font size 12. Overstepping this limit will crash the software. For LibreOffice 4.3 and beyond, this limitation doesn’t exist any more.", "default": "[·]", "default_help": "Default options", "bsel": "~On current selection", "editor": "~Editor…", "editor_help": "Transformations editor", "apply": "~Apply", "close": "~Close", "info": "(i)", "infotitle": "Informations", "infomsg": "The text formatter is a tool which automates correction of typographical errors by using the internal engine “Search & replace” of Writer.\n\nUse this tool with caution. Due to several limitations, it cannot handle all cases. Check your text after use." } } |
Modified gc_lang/fr/oxt/TextFormatter/tf_tabrep.py from [2587fa1bfe] to [a34f0f9b57].
︙ | ︙ | |||
114 115 116 117 118 119 120 | "nbsp4": [ ("([:digit:])[ ]([:digit:])", "$1 $2", True, True) ], "nnbsp4": [ ("([:digit:])[ ]([:digit:])", "$1 $2", True, True) ], "nbsp5": [ | | > | 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | "nbsp4": [ ("([:digit:])[ ]([:digit:])", "$1 $2", True, True) ], "nnbsp4": [ ("([:digit:])[ ]([:digit:])", "$1 $2", True, True) ], "nbsp5": [ # ("(?<=[0-9⁰¹²³⁴⁵⁶⁷⁸⁹]) ?([kcmµnd]?(?:[slgJKΩΩℓ]|m[²³]?|Wh?|Hz|dB)|[%‰]|°C)\\b", " $1", True, True) ("([0-9⁰¹²³⁴⁵⁶⁷⁸⁹]) ?([kcmµnd]?(?:[slgJKΩΩℓ]|m[²³]?|Wh?|Hz|dB)|[%‰]|°C)\\b", "$1 $2", True, True) # adapted for selection only option ], "nbsp6": [ ("M(mes?|ᵐᵉˢ?|grs?|ᵍʳˢ?|lles?|ˡˡᵉˢ?|rs?|ʳˢ?|M\\.) ", "M$1 ", True, True), ("D(re?s?|ʳᵉ?ˢ?) ", "D$1 ", True, True), ("P(re?s?|ʳᵉ?ˢ?) ", "P$1 ", True, True), ("V(ves?|ᵛᵉˢ?) ", "V$1 ", True, True), ], |
︙ | ︙ |