Plugins/WizardPlugins/QRegularExpressionWizard/QRegularExpressionWizardCharactersDialog.py

changeset 2736
86cd4d14b58e
child 2770
fd5ee85f0450
equal deleted inserted replaced
2734:eddb1a77f771 2736:86cd4d14b58e
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2013 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing a dialog for entering character classes.
8 """
9
10 from PyQt4.QtCore import QRegExp
11 from PyQt4.QtGui import QWidget, QDialog, QVBoxLayout, QHBoxLayout, QScrollArea, \
12 QPushButton, QSpacerItem, QSizePolicy, QComboBox, QRegExpValidator, QLineEdit, QLabel
13
14 from .Ui_QRegularExpressionWizardCharactersDialog import \
15 Ui_QRegularExpressionWizardCharactersDialog
16
17
18 class QRegularExpressionWizardCharactersDialog(
19 QDialog, Ui_QRegularExpressionWizardCharactersDialog):
20 """
21 Class implementing a dialog for entering character classes.
22 """
23 def __init__(self, parent=None):
24 """
25 Constructor
26
27 @param parent reference to the parent widget (QWidget)
28 """
29 super().__init__(parent)
30 self.setupUi(self)
31
32 self.__initCharacterSelectors()
33
34 self.comboItems = []
35 self.singleComboItems = [] # these are in addition to the above
36 self.comboItems.append((self.trUtf8("Normal character"), "-c"))
37 self.comboItems.append((self.trUtf8(
38 "Unicode character in hexadecimal notation"), "-h"))
39 self.comboItems.append((self.trUtf8(
40 "ASCII/Latin1 character in octal notation"), "-o"))
41 self.singleComboItems.extend([
42 ("---", "-i"),
43 (self.trUtf8("Bell character (\\a)"), "\\a"),
44 (self.trUtf8("Escape character (\\e)"), "\\e"),
45 (self.trUtf8("Page break (\\f)"), "\\f"),
46 (self.trUtf8("Line feed (\\n)"), "\\n"),
47 (self.trUtf8("Carriage return (\\r)"), "\\r"),
48 (self.trUtf8("Horizontal tabulator (\\t)"), "\\t"),
49 ("---", "-i"),
50 (self.trUtf8("Character Category"), "-ccp"),
51 (self.trUtf8("Special Character Category"), "-csp"),
52 (self.trUtf8("Character Block"), "-cbp"),
53 (self.trUtf8("POSIX Named Set"), "-psp"),
54 (self.trUtf8("Not Character Category"), "-ccn"),
55 (self.trUtf8("Not Character Block"), "-cbn"),
56 (self.trUtf8("Not Special Character Category"), "-csn"),
57 (self.trUtf8("Not POSIX Named Set"), "-psn"),
58 ])
59
60 self.charValidator = QRegExpValidator(QRegExp(".{0,1}"), self)
61 self.hexValidator = QRegExpValidator(QRegExp("[0-9a-fA-F]{0,4}"), self)
62 self.octValidator = QRegExpValidator(QRegExp("[0-3]?[0-7]{0,2}"), self)
63
64 # generate dialog part for single characters
65 self.singlesBoxLayout = QVBoxLayout(self.singlesBox)
66 self.singlesBoxLayout.setObjectName("singlesBoxLayout")
67 self.singlesBoxLayout.setSpacing(6)
68 self.singlesBoxLayout.setMargin(6)
69 self.singlesBox.setLayout(self.singlesBoxLayout)
70 self.singlesView = QScrollArea(self.singlesBox)
71 self.singlesView.setObjectName("singlesView")
72 self.singlesBoxLayout.addWidget(self.singlesView)
73
74 self.singlesItemsBox = QWidget(self)
75 self.singlesView.setWidget(self.singlesItemsBox)
76 self.singlesItemsBox.setObjectName("singlesItemsBox")
77 self.singlesItemsBox.setMinimumWidth(1000)
78 self.singlesItemsBoxLayout = QVBoxLayout(self.singlesItemsBox)
79 self.singlesItemsBoxLayout.setMargin(6)
80 self.singlesItemsBoxLayout.setSpacing(6)
81 self.singlesItemsBox.setLayout(self.singlesItemsBoxLayout)
82 self.singlesEntries = []
83 self.__addSinglesLine()
84
85 hlayout0 = QHBoxLayout()
86 hlayout0.setMargin(0)
87 hlayout0.setSpacing(6)
88 hlayout0.setObjectName("hlayout0")
89 self.moreSinglesButton = QPushButton(self.trUtf8("Additional Entries"),
90 self.singlesBox)
91 self.moreSinglesButton.setObjectName("moreSinglesButton")
92 hlayout0.addWidget(self.moreSinglesButton)
93 hspacer0 = QSpacerItem(30, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
94 hlayout0.addItem(hspacer0)
95 self.singlesBoxLayout.addLayout(hlayout0)
96 self.moreSinglesButton.clicked[()].connect(self.__addSinglesLine)
97
98 # generate dialog part for character ranges
99 self.rangesBoxLayout = QVBoxLayout(self.rangesBox)
100 self.rangesBoxLayout.setObjectName("rangesBoxLayout")
101 self.rangesBoxLayout.setSpacing(6)
102 self.rangesBoxLayout.setMargin(6)
103 self.rangesBox.setLayout(self.rangesBoxLayout)
104 self.rangesView = QScrollArea(self.rangesBox)
105 self.rangesView.setObjectName("rangesView")
106 self.rangesBoxLayout.addWidget(self.rangesView)
107
108 self.rangesItemsBox = QWidget(self)
109 self.rangesView.setWidget(self.rangesItemsBox)
110 self.rangesItemsBox.setObjectName("rangesItemsBox")
111 self.rangesItemsBox.setMinimumWidth(1000)
112 self.rangesItemsBoxLayout = QVBoxLayout(self.rangesItemsBox)
113 self.rangesItemsBoxLayout.setMargin(6)
114 self.rangesItemsBoxLayout.setSpacing(6)
115 self.rangesItemsBox.setLayout(self.rangesItemsBoxLayout)
116 self.rangesEntries = []
117 self.__addRangesLine()
118
119 hlayout1 = QHBoxLayout()
120 hlayout1.setMargin(0)
121 hlayout1.setSpacing(6)
122 hlayout1.setObjectName("hlayout1")
123 self.moreRangesButton = QPushButton(self.trUtf8("Additional Entries"),
124 self.rangesBox)
125 self.moreSinglesButton.setObjectName("moreRangesButton")
126 hlayout1.addWidget(self.moreRangesButton)
127 hspacer1 = QSpacerItem(30, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
128 hlayout1.addItem(hspacer1)
129 self.rangesBoxLayout.addLayout(hlayout1)
130 self.moreRangesButton.clicked[()].connect(self.__addRangesLine)
131
132 def __initCharacterSelectors(self):
133 """
134 Private method to initialize the W3C character selector entries.
135 """
136 self.__characterCategories = (
137 # display name code
138 (self.trUtf8("Letter, Any"), "L"),
139 (self.trUtf8("Letter, Lower case"), "Ll"),
140 (self.trUtf8("Letter, Modifier"), "Lm"),
141 (self.trUtf8("Letter, Other"), "Lo"),
142 (self.trUtf8("Letter, Title case"), "Lt"),
143 (self.trUtf8("Letter, Upper case"), "Lu"),
144 (self.trUtf8("Letter, Lower, Upper or Title"), "L&"),
145 (self.trUtf8("Mark, Any"), "M"),
146 (self.trUtf8("Mark, Spacing"), "Mc"),
147 (self.trUtf8("Mark, Enclosing"), "Me"),
148 (self.trUtf8("Mark, Non-spacing"), "Mn"),
149 (self.trUtf8("Number, Any"), "N"),
150 (self.trUtf8("Number, Decimal"), "Nd"),
151 (self.trUtf8("Number, Letter"), "Nl"),
152 (self.trUtf8("Number, Other"), "No"),
153 (self.trUtf8("Punctuation, Any"), "P"),
154 (self.trUtf8("Punctuation, Connector"), "Pc"),
155 (self.trUtf8("Punctuation, Dash"), "Pd"),
156 (self.trUtf8("Punctuation, Close"), "Pe"),
157 (self.trUtf8("Punctuation, Final"), "Pf"),
158 (self.trUtf8("Punctuation, Initial"), "Pi"),
159 (self.trUtf8("Punctuation, Other"), "Po"),
160 (self.trUtf8("Punctuation, Open"), "Ps"),
161 (self.trUtf8("Symbol, Any"), "S"),
162 (self.trUtf8("Symbol, Currency"), "Sc"),
163 (self.trUtf8("Symbol, Modifier"), "Sk"),
164 (self.trUtf8("Symbol, Mathematical"), "Sm"),
165 (self.trUtf8("Symbol, Other"), "So"),
166 (self.trUtf8("Separator, Any"), "Z"),
167 (self.trUtf8("Separator, Line"), "Zl"),
168 (self.trUtf8("Separator, Paragraph"), "Zp"),
169 (self.trUtf8("Separator, Space"), "Zs"),
170 (self.trUtf8("Other, Any"), "C"),
171 (self.trUtf8("Other, Control"), "Cc"),
172 (self.trUtf8("Other, Format"), "Cf"),
173 (self.trUtf8("Other, Unassigned"), "Cn"),
174 (self.trUtf8("Other, Private Use"), "Co"),
175 (self.trUtf8("Other, Surrogat"), "Cn"),
176 )
177
178 self.__specialCharacterCategories = (
179 # display name code
180 (self.trUtf8("Alphanumeric"), "Xan"),
181 (self.trUtf8("POSIX Space"), "Xps"),
182 (self.trUtf8("Perl Space"), "Xsp"),
183 (self.trUtf8("Universal Character"), "Xuc"),
184 (self.trUtf8("Perl Word"), "Xan"),
185 )
186
187 self.__characterBlocks = (
188 # display name code
189 (self.trUtf8("Arabic"), "Arabic"),
190 (self.trUtf8("Armenian"), "Armenian"),
191 (self.trUtf8("Avestan"), "Avestan"),
192 (self.trUtf8("Balinese"), "Balinese"),
193 (self.trUtf8("Bamum"), "Bamum"),
194 (self.trUtf8("Batak"), "Batak"),
195 (self.trUtf8("Bengali"), "Bengali"),
196 (self.trUtf8("Bopomofo"), "Bopomofo"),
197 (self.trUtf8("Brahmi"), "Brahmi"),
198 (self.trUtf8("Braille"), "Braille"),
199 (self.trUtf8("Buginese"), "Buginese"),
200 (self.trUtf8("Buhid"), "Buhid"),
201 (self.trUtf8("Canadian Aboriginal"), "Canadian_Aboriginal"),
202 (self.trUtf8("Carian"), "Carian"),
203 (self.trUtf8("Chakma"), "Chakma"),
204 (self.trUtf8("Cham"), "Cham"),
205 (self.trUtf8("Cherokee"), "Cherokee"),
206 (self.trUtf8("Common"), "Common"),
207 (self.trUtf8("Coptic"), "Coptic"),
208 (self.trUtf8("Cuneiform"), "Cuneiform"),
209 (self.trUtf8("Cypriot"), "Cypriot"),
210 (self.trUtf8("Cyrillic"), "Cyrillic"),
211 (self.trUtf8("Deseret"), "Deseret,"),
212 (self.trUtf8("Devanagari"), "Devanagari"),
213 (self.trUtf8("Egyptian Hieroglyphs"), "Egyptian_Hieroglyphs"),
214 (self.trUtf8("Ethiopic"), "Ethiopic"),
215 (self.trUtf8("Georgian"), "Georgian"),
216 (self.trUtf8("Glagolitic"), "Glagolitic"),
217 (self.trUtf8("Gothic"), "Gothic"),
218 (self.trUtf8("Greek"), "Greek"),
219 (self.trUtf8("Gujarati"), "Gujarati"),
220 (self.trUtf8("Gurmukhi"), "Gurmukhi"),
221 (self.trUtf8("Han"), "Han"),
222 (self.trUtf8("Hangul"), "Hangul"),
223 (self.trUtf8("Hanunoo"), "Hanunoo"),
224 (self.trUtf8("Hebrew"), "Hebrew"),
225 (self.trUtf8("Hiragana"), "Hiragana"),
226 (self.trUtf8("Imperial Aramaic"), "Imperial_Aramaic"),
227 (self.trUtf8("Inherited"), "Inherited"),
228 (self.trUtf8("Inscriptional Pahlavi"), "Inscriptional_Pahlavi"),
229 (self.trUtf8("Inscriptional Parthian"), "Inscriptional_Parthian"),
230 (self.trUtf8("Javanese"), "Javanese"),
231 (self.trUtf8("Kaithi"), "Kaithi"),
232 (self.trUtf8("Kannada"), "Kannada"),
233 (self.trUtf8("Katakana"), "Katakana"),
234 (self.trUtf8("Kayah Li"), "Kayah_Li"),
235 (self.trUtf8("Kharoshthi"), "Kharoshthi"),
236 (self.trUtf8("Khmer"), "Khmer"),
237 (self.trUtf8("Lao"), "Lao"),
238 (self.trUtf8("Latin"), "Latin"),
239 (self.trUtf8("Lepcha"), "Lepcha"),
240 (self.trUtf8("Limbu"), "Limbu"),
241 (self.trUtf8("Linear B"), "Linear_B"),
242 (self.trUtf8("Lisu"), "Lisu"),
243 (self.trUtf8("Lycian"), "Lycian"),
244 (self.trUtf8("Lydian"), "Lydian"),
245 (self.trUtf8("Malayalam"), "Malayalam"),
246 (self.trUtf8("Mandaic"), "Mandaic"),
247 (self.trUtf8("Meetei Mayek"), "Meetei_Mayek"),
248 (self.trUtf8("Meroitic Cursive"), "Meroitic_Cursive"),
249 (self.trUtf8("Meroitic Hieroglyphs"), "Meroitic_Hieroglyphs"),
250 (self.trUtf8("Miao"), "Miao"),
251 (self.trUtf8("Mongolian"), "Mongolian"),
252 (self.trUtf8("Myanmar"), "Myanmar"),
253 (self.trUtf8("New Tai Lue"), "New_Tai_Lue"),
254 (self.trUtf8("N'Ko"), "Nko"),
255 (self.trUtf8("Ogham"), "Ogham"),
256 (self.trUtf8("Old Italic"), "Old_Italic"),
257 (self.trUtf8("Old Persian"), "Old_Persian"),
258 (self.trUtf8("Old South Arabian"), "Old_South_Arabian"),
259 (self.trUtf8("Old Turkic"), "Old_Turkic,"),
260 (self.trUtf8("Ol Chiki"), "Ol_Chiki"),
261 (self.trUtf8("Oriya"), "Oriya"),
262 (self.trUtf8("Osmanya"), "Osmanya"),
263 (self.trUtf8("Phags-pa"), "Phags_Pa"),
264 (self.trUtf8("Phoenician"), "Phoenician"),
265 (self.trUtf8("Rejang"), "Rejang"),
266 (self.trUtf8("Runic"), "Runic"),
267 (self.trUtf8("Samaritan"), "Samaritan"),
268 (self.trUtf8("Saurashtra"), "Saurashtra"),
269 (self.trUtf8("Sharada"), "Sharada"),
270 (self.trUtf8("Shavian"), "Shavian"),
271 (self.trUtf8("Sinhala"), "Sinhala"),
272 (self.trUtf8("Sora Sompeng"), "Sora_Sompeng"),
273 (self.trUtf8("Sundanese"), "Sundanese"),
274 (self.trUtf8("Syloti Nagri"), "Syloti_Nagri"),
275 (self.trUtf8("Syriac"), "Syriac"),
276 (self.trUtf8("Tagalog"), "Tagalog"),
277 (self.trUtf8("Tagbanwa"), "Tagbanwa"),
278 (self.trUtf8("Tai Le"), "Tai_Le"),
279 (self.trUtf8("Tai Tham"), "Tai_Tham"),
280 (self.trUtf8("Tai Viet"), "Tai_Viet"),
281 (self.trUtf8("Takri"), "Takri"),
282 (self.trUtf8("Tamil"), "Tamil"),
283 (self.trUtf8("Telugu"), "Telugu"),
284 (self.trUtf8("Thaana"), "Thaana"),
285 (self.trUtf8("Thai"), "Thai"),
286 (self.trUtf8("Tibetan"), "Tibetan"),
287 (self.trUtf8("Tifinagh"), "Tifinagh"),
288 (self.trUtf8("Ugaritic"), "Ugaritic"),
289 (self.trUtf8("Vai"), "Vai"),
290 (self.trUtf8("Yi"), "Yi"),
291 )
292
293 self.__posixNamedSets = (
294 # display name code
295 (self.trUtf8("Alphanumeric"), "alnum"),
296 (self.trUtf8("Alphabetic"), "alpha"),
297 (self.trUtf8("ASCII"), "ascii"),
298 (self.trUtf8("Word Letter"), "word"),
299 (self.trUtf8("Lower Case Letter"), "lower"),
300 (self.trUtf8("Upper Case Letter"), "upper"),
301 (self.trUtf8("Decimal Digit"), "digit"),
302 (self.trUtf8("Hexadecimal Digit"), "xdigit"),
303 (self.trUtf8("Space or Tab"), "blank"),
304 (self.trUtf8("White Space"), "space"),
305 (self.trUtf8("Printing (excl. space)"), "graph"),
306 (self.trUtf8("Printing (incl. space)"), "print"),
307 (self.trUtf8("Printing (excl. alphanumeric)"), "punct"),
308 (self.trUtf8("Control Character"), "cntrl"),
309 )
310
311 def __populateCharTypeCombo(self, combo, isSingle):
312 """
313 Private method to populate a given character type selection combo box.
314
315 @param combo reference to the combo box to be populated (QComboBox)
316 @param isSingle flag indicating a singles combo (boolean)
317 """
318 for txt, value in self.comboItems:
319 combo.addItem(txt, value)
320 if isSingle:
321 for txt, value in self.singleComboItems:
322 combo.addItem(txt, value)
323
324 def __addSinglesLine(self):
325 """
326 Private slot to add a line of entry widgets for single characters.
327 """
328 hbox = QWidget(self.singlesItemsBox)
329 hboxLayout = QHBoxLayout(hbox)
330 hboxLayout.setMargin(0)
331 hboxLayout.setSpacing(6)
332 hbox.setLayout(hboxLayout)
333 cb1 = QComboBox(hbox)
334 cb1.setEditable(False)
335 self.__populateCharTypeCombo(cb1, True)
336 hboxLayout.addWidget(cb1)
337 le1 = QLineEdit(hbox)
338 le1.setValidator(self.charValidator)
339 hboxLayout.addWidget(le1)
340 cb1a = QComboBox(hbox)
341 cb1a.setEditable(False)
342 cb1a.setSizeAdjustPolicy(QComboBox.AdjustToContents)
343 hboxLayout.addWidget(cb1a)
344 cb1a.hide()
345 cb2 = QComboBox(hbox)
346 cb2.setEditable(False)
347 self.__populateCharTypeCombo(cb2, True)
348 hboxLayout.addWidget(cb2)
349 le2 = QLineEdit(hbox)
350 le2.setValidator(self.charValidator)
351 hboxLayout.addWidget(le2)
352 cb2a = QComboBox(hbox)
353 cb2a.setEditable(False)
354 cb2a.setSizeAdjustPolicy(QComboBox.AdjustToContents)
355 hboxLayout.addWidget(cb2a)
356 cb2a.hide()
357 self.singlesItemsBoxLayout.addWidget(hbox)
358
359 cb1.activated[int].connect(self.__singlesCharTypeSelected)
360 cb2.activated[int].connect(self.__singlesCharTypeSelected)
361 hbox.show()
362
363 self.singlesItemsBox.adjustSize()
364
365 self.singlesEntries.append([cb1, le1, cb1a])
366 self.singlesEntries.append([cb2, le2, cb2a])
367
368 def __addRangesLine(self):
369 """
370 Private slot to add a line of entry widgets for character ranges.
371 """
372 hbox = QWidget(self.rangesItemsBox)
373 hboxLayout = QHBoxLayout(hbox)
374 hboxLayout.setMargin(0)
375 hboxLayout.setSpacing(6)
376 hbox.setLayout(hboxLayout)
377 cb1 = QComboBox(hbox)
378 cb1.setEditable(False)
379 self.__populateCharTypeCombo(cb1, False)
380 hboxLayout.addWidget(cb1)
381 l1 = QLabel(self.trUtf8("Between:"), hbox)
382 hboxLayout.addWidget(l1)
383 le1 = QLineEdit(hbox)
384 le1.setValidator(self.charValidator)
385 hboxLayout.addWidget(le1)
386 l2 = QLabel(self.trUtf8("And:"), hbox)
387 hboxLayout.addWidget(l2)
388 le2 = QLineEdit(hbox)
389 le2.setValidator(self.charValidator)
390 hboxLayout.addWidget(le2)
391 self.rangesItemsBoxLayout.addWidget(hbox)
392
393 cb1.activated[int].connect(self.__rangesCharTypeSelected)
394 hbox.show()
395
396 self.rangesItemsBox.adjustSize()
397
398 self.rangesEntries.append([cb1, le1, le2])
399
400 def __populateCharacterCombo(self, combo, format):
401 """
402 Private method to populate a character selection combo.
403
404 @param combo combo box to be populated (QComboBox)
405 @param format format identifier (one of "-ccp", "-ccn",
406 "-cbp", "-cbn", "-csp", "-csn", "-psp", "-psn")
407 """
408 combo.clear()
409
410 if format in ["-ccp", "-ccn"]:
411 items = self.__characterCategories
412 elif format in ["-csp", "-csn"]:
413 items = self.__specialCharacterCategories
414 elif format in ["-cbp", "-cbn"]:
415 items = self.__characterBlocks
416 elif format in ["-psp", "-psn"]:
417 items = self.__posixNamedSets
418
419 comboLen = 0
420 for txt, code in items:
421 combo.addItem(txt, code)
422 comboLen = max(comboLen, len(txt))
423 combo.setMinimumContentsLength(comboLen)
424
425 def __performSelectedAction(self, format, lineedit, combo):
426 """
427 Private method performing some actions depending on the input.
428
429 @param format format of the selected entry (string)
430 @param lineedit line edit widget to act on (QLineEdit)
431 @param combo combo box widget to act on (QComboBox)
432 """
433 if format == "-i":
434 return
435
436 if format in ["-c", "-h", "-o"]:
437 lineedit.show()
438 lineedit.setEnabled(True)
439 if combo is not None:
440 combo.hide()
441 if format == "-c":
442 lineedit.setValidator(self.charValidator)
443 elif format == "-h":
444 lineedit.setValidator(self.hexValidator)
445 elif format == "-o":
446 lineedit.setValidator(self.octValidator)
447 elif format in ["-ccp", "-ccn", "-cbp", "-cbn", "-csp", "-csn", "-psp", "-psn"]:
448 lineedit.setEnabled(False)
449 lineedit.hide()
450 if combo is not None:
451 combo.show()
452 self.__populateCharacterCombo(combo, format)
453 else:
454 lineedit.setEnabled(False)
455 lineedit.hide()
456 if combo is not None:
457 combo.hide()
458 lineedit.clear()
459
460 def __singlesCharTypeSelected(self, index):
461 """
462 Private slot to handle the activated(int) signal of the single chars combo boxes.
463
464 @param index selected list index (integer)
465 """
466 combo = self.sender()
467 for entriesList in self.singlesEntries:
468 if combo == entriesList[0]:
469 format = combo.itemData(index)
470 self.__performSelectedAction(format, entriesList[1], entriesList[2])
471 break
472
473 def __rangesCharTypeSelected(self, index):
474 """
475 Private slot to handle the activated(int) signal of the char ranges combo boxes.
476
477 @param index selected list index (integer)
478 """
479 combo = self.sender()
480 for entriesList in self.rangesEntries:
481 if combo == entriesList[0]:
482 format = combo.itemData(index)
483 self.__performSelectedAction(format, entriesList[1], None)
484 self.__performSelectedAction(format, entriesList[2], None)
485 break
486
487 def __formatCharacter(self, char, format):
488 """
489 Private method to format the characters entered into the dialog.
490
491 @param char character string entered into the dialog (string)
492 @param format string giving a special format (-c, -h, -i or -o) or
493 the already formatted character (string)
494 @return formatted character string (string)
495 """
496 if format == "-c":
497 return char
498 elif format == "-i":
499 return ""
500
501 if format == "-h":
502 while len(char) < 2:
503 char = "0" + char
504 if len(char) > 2:
505 return "\\x{{{0}}}".format(char.lower())
506 else:
507 return "\\x{0}".format(char.lower())
508 elif format == "-o":
509 while len(char) < 3:
510 char = "0" + char
511 if len(char) > 3:
512 char = char[:3]
513 return "\\{0}".format(char)
514 elif format in ["-ccp", "-cbp", "-csp"]:
515 return "\\p{{{0}}}".format(char)
516 elif format in ["-ccn", "-cbn", "-csn"]:
517 return "\\P{{{0}}}".format(char)
518 elif format == "-psp":
519 return "[:{0}:]".format(char)
520 elif format == "-psn":
521 return "[:^{0}:]".format(char)
522 else:
523 return format
524
525 def getCharacters(self):
526 """
527 Public method to return the character string assembled via the dialog.
528
529 @return formatted string for character classes (string)
530 """
531 regexp = ""
532
533 # negative character range
534 if self.negativeCheckBox.isChecked():
535 regexp += "^"
536
537 # predefined character ranges
538 if self.wordCharCheckBox.isChecked():
539 regexp += "\\w"
540 if self.nonWordCharCheckBox.isChecked():
541 regexp += "\\W"
542 if self.digitsCheckBox.isChecked():
543 regexp += "\\d"
544 if self.nonDigitsCheckBox.isChecked():
545 regexp += "\\D"
546 if self.newlineCheckBox.isChecked():
547 regexp += "\\R"
548 if self.nonNewlineCheckBox.isChecked():
549 regexp += "\\N"
550 if self.whitespaceCheckBox.isChecked():
551 regexp += "\\s"
552 if self.nonWhitespaceCheckBox.isChecked():
553 regexp += "\\S"
554 if self.horizontalWhitespaceCheckBox.isChecked():
555 regexp += "\\h"
556 if self.nonHorizontalWhitespaceCheckBox.isChecked():
557 regexp += "\\H"
558 if self.verticalWhitespaceCheckBox.isChecked():
559 regexp += "\\v"
560 if self.nonVerticalWhitespaceCheckBox.isChecked():
561 regexp += "\\V"
562
563 # single characters
564 for entrieslist in self.singlesEntries:
565 format = entrieslist[0].itemData(entrieslist[0].currentIndex())
566 if format in ["-ccp", "-ccn", "-cbp", "-cbn", "-csp", "-csn", "-psp", "-psn"]:
567 char = entrieslist[2].itemData(entrieslist[2].currentIndex())
568 else:
569 char = entrieslist[1].text()
570 regexp += self.__formatCharacter(char, format)
571
572 # character ranges
573 for entrieslist in self.rangesEntries:
574 if not entrieslist[1].text() or \
575 not entrieslist[2].text():
576 continue
577 format = entrieslist[0].itemData(entrieslist[0].currentIndex())
578 char1 = entrieslist[1].text()
579 char2 = entrieslist[2].text()
580 regexp += "{0}-{1}".format(
581 self.__formatCharacter(char1, format),
582 self.__formatCharacter(char2, format))
583
584 if regexp:
585 if (regexp.startswith("\\") and \
586 regexp.count("\\") == 1 and \
587 "-" not in regexp) or \
588 len(regexp) == 1:
589 return regexp
590 else:
591 return "[{0}]".format(regexp)
592 else:
593 return ""

eric ide

mercurial