/edk2/AppPkg/Applications/Python/Python-2.7.2/Tools/scripts/redemo.py

https://gitlab.com/envieidoc/Clover · Python · 171 lines · 141 code · 28 blank · 2 comment · 20 complexity · 4fd50b339bc485b9d8e8774ec96f4efe MD5 · raw file

  1. """Basic regular expression demostration facility (Perl style syntax)."""
  2. from Tkinter import *
  3. import re
  4. class ReDemo:
  5. def __init__(self, master):
  6. self.master = master
  7. self.promptdisplay = Label(self.master, anchor=W,
  8. text="Enter a Perl-style regular expression:")
  9. self.promptdisplay.pack(side=TOP, fill=X)
  10. self.regexdisplay = Entry(self.master)
  11. self.regexdisplay.pack(fill=X)
  12. self.regexdisplay.focus_set()
  13. self.addoptions()
  14. self.statusdisplay = Label(self.master, text="", anchor=W)
  15. self.statusdisplay.pack(side=TOP, fill=X)
  16. self.labeldisplay = Label(self.master, anchor=W,
  17. text="Enter a string to search:")
  18. self.labeldisplay.pack(fill=X)
  19. self.labeldisplay.pack(fill=X)
  20. self.showframe = Frame(master)
  21. self.showframe.pack(fill=X, anchor=W)
  22. self.showvar = StringVar(master)
  23. self.showvar.set("first")
  24. self.showfirstradio = Radiobutton(self.showframe,
  25. text="Highlight first match",
  26. variable=self.showvar,
  27. value="first",
  28. command=self.recompile)
  29. self.showfirstradio.pack(side=LEFT)
  30. self.showallradio = Radiobutton(self.showframe,
  31. text="Highlight all matches",
  32. variable=self.showvar,
  33. value="all",
  34. command=self.recompile)
  35. self.showallradio.pack(side=LEFT)
  36. self.stringdisplay = Text(self.master, width=60, height=4)
  37. self.stringdisplay.pack(fill=BOTH, expand=1)
  38. self.stringdisplay.tag_configure("hit", background="yellow")
  39. self.grouplabel = Label(self.master, text="Groups:", anchor=W)
  40. self.grouplabel.pack(fill=X)
  41. self.grouplist = Listbox(self.master)
  42. self.grouplist.pack(expand=1, fill=BOTH)
  43. self.regexdisplay.bind('<Key>', self.recompile)
  44. self.stringdisplay.bind('<Key>', self.reevaluate)
  45. self.compiled = None
  46. self.recompile()
  47. btags = self.regexdisplay.bindtags()
  48. self.regexdisplay.bindtags(btags[1:] + btags[:1])
  49. btags = self.stringdisplay.bindtags()
  50. self.stringdisplay.bindtags(btags[1:] + btags[:1])
  51. def addoptions(self):
  52. self.frames = []
  53. self.boxes = []
  54. self.vars = []
  55. for name in ('IGNORECASE',
  56. 'LOCALE',
  57. 'MULTILINE',
  58. 'DOTALL',
  59. 'VERBOSE'):
  60. if len(self.boxes) % 3 == 0:
  61. frame = Frame(self.master)
  62. frame.pack(fill=X)
  63. self.frames.append(frame)
  64. val = getattr(re, name)
  65. var = IntVar()
  66. box = Checkbutton(frame,
  67. variable=var, text=name,
  68. offvalue=0, onvalue=val,
  69. command=self.recompile)
  70. box.pack(side=LEFT)
  71. self.boxes.append(box)
  72. self.vars.append(var)
  73. def getflags(self):
  74. flags = 0
  75. for var in self.vars:
  76. flags = flags | var.get()
  77. flags = flags
  78. return flags
  79. def recompile(self, event=None):
  80. try:
  81. self.compiled = re.compile(self.regexdisplay.get(),
  82. self.getflags())
  83. bg = self.promptdisplay['background']
  84. self.statusdisplay.config(text="", background=bg)
  85. except re.error, msg:
  86. self.compiled = None
  87. self.statusdisplay.config(
  88. text="re.error: %s" % str(msg),
  89. background="red")
  90. self.reevaluate()
  91. def reevaluate(self, event=None):
  92. try:
  93. self.stringdisplay.tag_remove("hit", "1.0", END)
  94. except TclError:
  95. pass
  96. try:
  97. self.stringdisplay.tag_remove("hit0", "1.0", END)
  98. except TclError:
  99. pass
  100. self.grouplist.delete(0, END)
  101. if not self.compiled:
  102. return
  103. self.stringdisplay.tag_configure("hit", background="yellow")
  104. self.stringdisplay.tag_configure("hit0", background="orange")
  105. text = self.stringdisplay.get("1.0", END)
  106. last = 0
  107. nmatches = 0
  108. while last <= len(text):
  109. m = self.compiled.search(text, last)
  110. if m is None:
  111. break
  112. first, last = m.span()
  113. if last == first:
  114. last = first+1
  115. tag = "hit0"
  116. else:
  117. tag = "hit"
  118. pfirst = "1.0 + %d chars" % first
  119. plast = "1.0 + %d chars" % last
  120. self.stringdisplay.tag_add(tag, pfirst, plast)
  121. if nmatches == 0:
  122. self.stringdisplay.yview_pickplace(pfirst)
  123. groups = list(m.groups())
  124. groups.insert(0, m.group())
  125. for i in range(len(groups)):
  126. g = "%2d: %r" % (i, groups[i])
  127. self.grouplist.insert(END, g)
  128. nmatches = nmatches + 1
  129. if self.showvar.get() == "first":
  130. break
  131. if nmatches == 0:
  132. self.statusdisplay.config(text="(no match)",
  133. background="yellow")
  134. else:
  135. self.statusdisplay.config(text="")
  136. # Main function, run when invoked as a stand-alone Python program.
  137. def main():
  138. root = Tk()
  139. demo = ReDemo(root)
  140. root.protocol('WM_DELETE_WINDOW', root.quit)
  141. root.mainloop()
  142. if __name__ == '__main__':
  143. main()