/opt/alt/python33/lib64/python3.3/idlelib
NameSizeModeActions
Icons/-0755rm
idle_test/-0755rm
__pycache__/-0755rm
aboutDialog.py65750644editdlrm
AutoComplete.py90820644editdlrm
AutoCompleteWindow.py176720644editdlrm
AutoExpand.py24830644editdlrm
Bindings.py34340644editdlrm
CallTips.py59320644editdlrm
CallTipWindow.py58990644editdlrm
ChangeLog563930644editdlrm
ClassBrowser.py63710644editdlrm
CodeContext.py83530644editdlrm
ColorDelegator.py104670644editdlrm
config-extensions.def27880644editdlrm
config-highlight.def17400644editdlrm
config-keys.def75240644editdlrm
config-main.def25140644editdlrm
configDialog.py528500644editdlrm
configHandler.py293230644editdlrm
configHelpSourceEdit.py67250644editdlrm
configSectionNameDialog.py43140644editdlrm
CREDITS.txt18650644editdlrm
Debugger.py163670644editdlrm
Delegator.py6650644editdlrm
dynOptionMenuWidget.py13080644editdlrm
EditorWindow.py663070644editdlrm
extend.txt36420644editdlrm
FileList.py38140644editdlrm
FormatParagraph.py71660644editdlrm
GrepDialog.py41110644editdlrm
help.txt119940644editdlrm
HISTORY.txt103170644editdlrm
HyperParser.py105620644editdlrm
idle.py4000644editdlrm
idle.pyw6710644editdlrm
IdleHistory.py41170644editdlrm
idlever.py230644editdlrm
IOBinding.py198620644editdlrm
keybindingDialog.py124270644editdlrm
macosxSupport.py71720644editdlrm
MultiCall.py175290644editdlrm
MultiStatusBar.py7830644editdlrm
NEWS.txt344170644editdlrm
ObjectBrowser.py37490644editdlrm
OutputWindow.py43940644editdlrm
ParenMatch.py66270644editdlrm
PathBrowser.py28780644editdlrm
Percolator.py26580644editdlrm
PyParse.py194140644editdlrm
PyShell.py578770755editdlrm
README.txt25020644editdlrm
RemoteDebugger.py120290644editdlrm
RemoteObjectBrowser.py9640644editdlrm
ReplaceDialog.py58290644editdlrm
rpc.py209530644editdlrm
RstripExtension.py10500644editdlrm
run.py136940644editdlrm
ScriptBinding.py80690644editdlrm
ScrolledList.py39970644editdlrm
SearchDialog.py20160644editdlrm
SearchDialogBase.py51850644editdlrm
SearchEngine.py75440644editdlrm
StackViewer.py35670644editdlrm
tabbedpages.py181670644editdlrm
textView.py35450644editdlrm
TODO.txt84780644editdlrm
ToolTip.py27360644editdlrm
TreeWidget.py152200644editdlrm
UndoDelegator.py103050644editdlrm
WidgetRedirector.py44770644editdlrm
WindowList.py24720644editdlrm
ZoomHeight.py13070644editdlrm
__init__.py370644editdlrm
__main__.py1090644editdlrm
Edit: /opt/alt/python33/lib64/python3.3/idlelib/ColorDelegator.py (10467B)
import time import re import keyword import builtins from tkinter import * from idlelib.Delegator import Delegator from idlelib.configHandler import idleConf DEBUG = False def any(name, alternates): "Return a named group pattern matching list of alternates." return "(?P<%s>" % name + "|".join(alternates) + ")" def make_pat(): kw = r"\b" + any("KEYWORD", keyword.kwlist) + r"\b" builtinlist = [str(name) for name in dir(builtins) if not name.startswith('_') and \ name not in keyword.kwlist] # self.file = open("file") : # 1st 'file' colorized normal, 2nd as builtin, 3rd as string builtin = r"([^.'\"\\#]\b|^)" + any("BUILTIN", builtinlist) + r"\b" comment = any("COMMENT", [r"#[^\n]*"]) stringprefix = r"(\br|u|ur|R|U|UR|Ur|uR|b|B|br|Br|bR|BR|rb|rB|Rb|RB)?" sqstring = stringprefix + r"'[^'\\\n]*(\\.[^'\\\n]*)*'?" dqstring = stringprefix + r'"[^"\\\n]*(\\.[^"\\\n]*)*"?' sq3string = stringprefix + r"'''[^'\\]*((\\.|'(?!''))[^'\\]*)*(''')?" dq3string = stringprefix + r'"""[^"\\]*((\\.|"(?!""))[^"\\]*)*(""")?' string = any("STRING", [sq3string, dq3string, sqstring, dqstring]) return kw + "|" + builtin + "|" + comment + "|" + string +\ "|" + any("SYNC", [r"\n"]) prog = re.compile(make_pat(), re.S) idprog = re.compile(r"\s+(\w+)", re.S) asprog = re.compile(r".*?\b(as)\b") class ColorDelegator(Delegator): def __init__(self): Delegator.__init__(self) self.prog = prog self.idprog = idprog self.asprog = asprog self.LoadTagDefs() def setdelegate(self, delegate): if self.delegate is not None: self.unbind("<>") Delegator.setdelegate(self, delegate) if delegate is not None: self.config_colors() self.bind("<>", self.toggle_colorize_event) self.notify_range("1.0", "end") else: # No delegate - stop any colorizing self.stop_colorizing = True self.allow_colorizing = False def config_colors(self): for tag, cnf in self.tagdefs.items(): if cnf: self.tag_configure(tag, **cnf) self.tag_raise('sel') def LoadTagDefs(self): theme = idleConf.GetOption('main','Theme','name') self.tagdefs = { "COMMENT": idleConf.GetHighlight(theme, "comment"), "KEYWORD": idleConf.GetHighlight(theme, "keyword"), "BUILTIN": idleConf.GetHighlight(theme, "builtin"), "STRING": idleConf.GetHighlight(theme, "string"), "DEFINITION": idleConf.GetHighlight(theme, "definition"), "SYNC": {'background':None,'foreground':None}, "TODO": {'background':None,'foreground':None}, "BREAK": idleConf.GetHighlight(theme, "break"), "ERROR": idleConf.GetHighlight(theme, "error"), # The following is used by ReplaceDialog: "hit": idleConf.GetHighlight(theme, "hit"), } if DEBUG: print('tagdefs',self.tagdefs) def insert(self, index, chars, tags=None): index = self.index(index) self.delegate.insert(index, chars, tags) self.notify_range(index, index + "+%dc" % len(chars)) def delete(self, index1, index2=None): index1 = self.index(index1) self.delegate.delete(index1, index2) self.notify_range(index1) after_id = None allow_colorizing = True colorizing = False def notify_range(self, index1, index2=None): self.tag_add("TODO", index1, index2) if self.after_id: if DEBUG: print("colorizing already scheduled") return if self.colorizing: self.stop_colorizing = True if DEBUG: print("stop colorizing") if self.allow_colorizing: if DEBUG: print("schedule colorizing") self.after_id = self.after(1, self.recolorize) close_when_done = None # Window to be closed when done colorizing def close(self, close_when_done=None): if self.after_id: after_id = self.after_id self.after_id = None if DEBUG: print("cancel scheduled recolorizer") self.after_cancel(after_id) self.allow_colorizing = False self.stop_colorizing = True if close_when_done: if not self.colorizing: close_when_done.destroy() else: self.close_when_done = close_when_done def toggle_colorize_event(self, event): if self.after_id: after_id = self.after_id self.after_id = None if DEBUG: print("cancel scheduled recolorizer") self.after_cancel(after_id) if self.allow_colorizing and self.colorizing: if DEBUG: print("stop colorizing") self.stop_colorizing = True self.allow_colorizing = not self.allow_colorizing if self.allow_colorizing and not self.colorizing: self.after_id = self.after(1, self.recolorize) if DEBUG: print("auto colorizing turned",\ self.allow_colorizing and "on" or "off") return "break" def recolorize(self): self.after_id = None if not self.delegate: if DEBUG: print("no delegate") return if not self.allow_colorizing: if DEBUG: print("auto colorizing is off") return if self.colorizing: if DEBUG: print("already colorizing") return try: self.stop_colorizing = False self.colorizing = True if DEBUG: print("colorizing...") t0 = time.perf_counter() self.recolorize_main() t1 = time.perf_counter() if DEBUG: print("%.3f seconds" % (t1-t0)) finally: self.colorizing = False if self.allow_colorizing and self.tag_nextrange("TODO", "1.0"): if DEBUG: print("reschedule colorizing") self.after_id = self.after(1, self.recolorize) if self.close_when_done: top = self.close_when_done self.close_when_done = None top.destroy() def recolorize_main(self): next = "1.0" while True: item = self.tag_nextrange("TODO", next) if not item: break head, tail = item self.tag_remove("SYNC", head, tail) item = self.tag_prevrange("SYNC", head) if item: head = item[1] else: head = "1.0" chars = "" next = head lines_to_get = 1 ok = False while not ok: mark = next next = self.index(mark + "+%d lines linestart" % lines_to_get) lines_to_get = min(lines_to_get * 2, 100) ok = "SYNC" in self.tag_names(next + "-1c") line = self.get(mark, next) ##print head, "get", mark, next, "->", repr(line) if not line: return for tag in self.tagdefs: self.tag_remove(tag, mark, next) chars = chars + line m = self.prog.search(chars) while m: for key, value in m.groupdict().items(): if value: a, b = m.span(key) self.tag_add(key, head + "+%dc" % a, head + "+%dc" % b) if value in ("def", "class"): m1 = self.idprog.match(chars, b) if m1: a, b = m1.span(1) self.tag_add("DEFINITION", head + "+%dc" % a, head + "+%dc" % b) elif value == "import": # color all the "as" words on same line, except # if in a comment; cheap approximation to the # truth if '#' in chars: endpos = chars.index('#') else: endpos = len(chars) while True: m1 = self.asprog.match(chars, b, endpos) if not m1: break a, b = m1.span(1) self.tag_add("KEYWORD", head + "+%dc" % a, head + "+%dc" % b) m = self.prog.search(chars, m.end()) if "SYNC" in self.tag_names(next + "-1c"): head = next chars = "" else: ok = False if not ok: # We're in an inconsistent state, and the call to # update may tell us to stop. It may also change # the correct value for "next" (since this is a # line.col string, not a true mark). So leave a # crumb telling the next invocation to resume here # in case update tells us to leave. self.tag_add("TODO", next) self.update() if self.stop_colorizing: if DEBUG: print("colorizing stopped") return def removecolors(self): for tag in self.tagdefs: self.tag_remove(tag, "1.0", "end") def main(): from idlelib.Percolator import Percolator root = Tk() root.wm_protocol("WM_DELETE_WINDOW", root.quit) text = Text(background="white") text.pack(expand=1, fill="both") text.focus_set() p = Percolator(text) d = ColorDelegator() p.insertfilter(d) root.mainloop() if __name__ == "__main__": main()