$58 GRAYBYTE WORDPRESS FILE MANAGER $57

SERVER : premium201.web-hosting.com #1 SMP Wed Mar 26 12:08:09 UTC 2025
SERVER IP : 172.67.217.254 | ADMIN IP 216.73.216.180
OPTIONS : CRL = ON | WGT = ON | SDO = OFF | PKEX = OFF
DEACTIVATED : mail

/opt/alt/python33/lib64/python3.3/idlelib/

HOME
Current File : /opt/alt/python33/lib64/python3.3/idlelib//SearchEngine.py
'''Define SearchEngine for search dialogs.'''
import re
from tkinter import StringVar, BooleanVar, TclError
import tkinter.messagebox as tkMessageBox

def get(root):
    '''Return the singleton SearchEngine instance for the process.

    The single SearchEngine saves settings between dialog instances.
    If there is not a SearchEngine already, make one.
    '''
    if not hasattr(root, "_searchengine"):
        root._searchengine = SearchEngine(root)
        # This creates a cycle that persists until root is deleted.
    return root._searchengine

class SearchEngine:
    """Handles searching a text widget for Find, Replace, and Grep."""

    def __init__(self, root):
        '''Initialize Variables that save search state.

        The dialogs bind these to the UI elements present in the dialogs.
        '''
        self.root = root  # need for report_error()
        self.patvar = StringVar(root, '')   # search pattern
        self.revar = BooleanVar(root, False)   # regular expression?
        self.casevar = BooleanVar(root, False)   # match case?
        self.wordvar = BooleanVar(root, False)   # match whole word?
        self.wrapvar = BooleanVar(root, True)   # wrap around buffer?
        self.backvar = BooleanVar(root, False)   # search backwards?

    # Access methods

    def getpat(self):
        return self.patvar.get()

    def setpat(self, pat):
        self.patvar.set(pat)

    def isre(self):
        return self.revar.get()

    def iscase(self):
        return self.casevar.get()

    def isword(self):
        return self.wordvar.get()

    def iswrap(self):
        return self.wrapvar.get()

    def isback(self):
        return self.backvar.get()

    # Higher level access methods

    def setcookedpat(self, pat):
        "Set pattern after escaping if re."
        # called only in SearchDialog.py: 66
        if self.isre():
            pat = re.escape(pat)
        self.setpat(pat)

    def getcookedpat(self):
        pat = self.getpat()
        if not self.isre():  # if True, see setcookedpat
            pat = re.escape(pat)
        if self.isword():
            pat = r"\b%s\b" % pat
        return pat

    def getprog(self):
        "Return compiled cooked search pattern."
        pat = self.getpat()
        if not pat:
            self.report_error(pat, "Empty regular expression")
            return None
        pat = self.getcookedpat()
        flags = 0
        if not self.iscase():
            flags = flags | re.IGNORECASE
        try:
            prog = re.compile(pat, flags)
        except re.error as what:
            args = what.args
            msg = args[0]
            col = arg[1] if len(args) >= 2 else -1
            self.report_error(pat, msg, col)
            return None
        return prog

    def report_error(self, pat, msg, col=-1):
        # Derived class could override this with something fancier
        msg = "Error: " + str(msg)
        if pat:
            msg = msg + "\nPattern: " + str(pat)
        if col >= 0:
            msg = msg + "\nOffset: " + str(col)
        tkMessageBox.showerror("Regular expression error",
                               msg, master=self.root)

    def search_text(self, text, prog=None, ok=0):
        '''Return (lineno, matchobj) or None for forward/backward search.

        This function calls the right function with the right arguments.
        It directly return the result of that call.

        Text is a text widget. Prog is a precompiled pattern.
        The ok parameteris a bit complicated as it has two effects.

        If there is a selection, the search begin at either end,
        depending on the direction setting and ok, with ok meaning that
        the search starts with the selection. Otherwise, search begins
        at the insert mark.

        To aid progress, the search functions do not return an empty
        match at the starting position unless ok is True.
        '''

        if not prog:
            prog = self.getprog()
            if not prog:
                return None # Compilation failed -- stop
        wrap = self.wrapvar.get()
        first, last = get_selection(text)
        if self.isback():
            if ok:
                start = last
            else:
                start = first
            line, col = get_line_col(start)
            res = self.search_backward(text, prog, line, col, wrap, ok)
        else:
            if ok:
                start = first
            else:
                start = last
            line, col = get_line_col(start)
            res = self.search_forward(text, prog, line, col, wrap, ok)
        return res

    def search_forward(self, text, prog, line, col, wrap, ok=0):
        wrapped = 0
        startline = line
        chars = text.get("%d.0" % line, "%d.0" % (line+1))
        while chars:
            m = prog.search(chars[:-1], col)
            if m:
                if ok or m.end() > col:
                    return line, m
            line = line + 1
            if wrapped and line > startline:
                break
            col = 0
            ok = 1
            chars = text.get("%d.0" % line, "%d.0" % (line+1))
            if not chars and wrap:
                wrapped = 1
                wrap = 0
                line = 1
                chars = text.get("1.0", "2.0")
        return None

    def search_backward(self, text, prog, line, col, wrap, ok=0):
        wrapped = 0
        startline = line
        chars = text.get("%d.0" % line, "%d.0" % (line+1))
        while 1:
            m = search_reverse(prog, chars[:-1], col)
            if m:
                if ok or m.start() < col:
                    return line, m
            line = line - 1
            if wrapped and line < startline:
                break
            ok = 1
            if line <= 0:
                if not wrap:
                    break
                wrapped = 1
                wrap = 0
                pos = text.index("end-1c")
                line, col = map(int, pos.split("."))
            chars = text.get("%d.0" % line, "%d.0" % (line+1))
            col = len(chars) - 1
        return None

def search_reverse(prog, chars, col):
    '''Search backwards and return an re match object or None.

    This is done by searching forwards until there is no match.
    Prog: compiled re object with a search method returning a match.
    Chars: line of text, without \n.
    Col: stop index for the search; the limit for match.end().
    '''
    m = prog.search(chars)
    if not m:
        return None
    found = None
    i, j = m.span()  # m.start(), m.end() == match slice indexes
    while i < col and j <= col:
        found = m
        if i == j:
            j = j+1
        m = prog.search(chars, j)
        if not m:
            break
        i, j = m.span()
    return found

def get_selection(text):
    '''Return tuple of 'line.col' indexes from selection or insert mark.
    '''
    try:
        first = text.index("sel.first")
        last = text.index("sel.last")
    except TclError:
        first = last = None
    if not first:
        first = text.index("insert")
    if not last:
        last = first
    return first, last

def get_line_col(index):
    '''Return (line, col) tuple of ints from 'line.col' string.'''
    line, col = map(int, index.split(".")) # Fails on invalid index
    return line, col

if __name__ == "__main__":
    from test import support; support.use_resources = ['gui']
    import unittest
    unittest.main('idlelib.idle_test.test_searchengine', verbosity=2, exit=False)


Current_dir [ NOT WRITEABLE ] Document_root [ NOT WRITEABLE ]


[ Back ]
NAME
SIZE
LAST TOUCH
USER
CAN-I?
FUNCTIONS
..
--
24 May 2024 8.33 AM
root / linksafe
0755
Icons
--
24 May 2024 8.33 AM
root / linksafe
0755
__pycache__
--
24 May 2024 8.33 AM
root / linksafe
0755
idle_test
--
24 May 2024 8.33 AM
root / linksafe
0755
AutoComplete.py
8.869 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
AutoCompleteWindow.py
17.258 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
AutoExpand.py
2.425 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
Bindings.py
3.354 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
CREDITS.txt
1.821 KB
19 Sep 2017 7.32 AM
root / linksafe
0644
CallTipWindow.py
5.761 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
CallTips.py
5.793 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
ChangeLog
55.071 KB
19 Sep 2017 7.32 AM
root / linksafe
0644
ClassBrowser.py
6.222 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
CodeContext.py
8.157 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
ColorDelegator.py
10.222 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
Debugger.py
15.983 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
Delegator.py
0.649 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
EditorWindow.py
64.753 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
FileList.py
3.725 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
FormatParagraph.py
6.998 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
GrepDialog.py
4.015 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
HISTORY.txt
10.075 KB
19 Sep 2017 7.32 AM
root / linksafe
0644
HyperParser.py
10.314 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
IOBinding.py
19.396 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
IdleHistory.py
4.021 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
MultiCall.py
17.118 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
MultiStatusBar.py
0.765 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
NEWS.txt
33.61 KB
19 Sep 2017 7.32 AM
root / linksafe
0644
ObjectBrowser.py
3.661 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
OutputWindow.py
4.291 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
ParenMatch.py
6.472 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
PathBrowser.py
2.811 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
Percolator.py
2.596 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
PyParse.py
18.959 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
PyShell.py
56.521 KB
17 Apr 2024 4.58 PM
root / linksafe
0755
README.txt
2.443 KB
19 Sep 2017 7.32 AM
root / linksafe
0644
RemoteDebugger.py
11.747 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
RemoteObjectBrowser.py
0.941 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
ReplaceDialog.py
5.692 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
RstripExtension.py
1.025 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
ScriptBinding.py
7.88 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
ScrolledList.py
3.903 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
SearchDialog.py
1.969 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
SearchDialogBase.py
5.063 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
SearchEngine.py
7.367 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
StackViewer.py
3.483 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
TODO.txt
8.279 KB
19 Sep 2017 7.32 AM
root / linksafe
0644
ToolTip.py
2.672 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
TreeWidget.py
14.863 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
UndoDelegator.py
10.063 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
WidgetRedirector.py
4.372 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
WindowList.py
2.414 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
ZoomHeight.py
1.276 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
__init__.py
0.036 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
__main__.py
0.106 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
aboutDialog.py
6.421 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
config-extensions.def
2.723 KB
19 Sep 2017 7.32 AM
root / linksafe
0644
config-highlight.def
1.699 KB
19 Sep 2017 7.32 AM
root / linksafe
0644
config-keys.def
7.348 KB
19 Sep 2017 7.32 AM
root / linksafe
0644
config-main.def
2.455 KB
19 Sep 2017 7.32 AM
root / linksafe
0644
configDialog.py
51.611 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
configHandler.py
28.636 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
configHelpSourceEdit.py
6.567 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
configSectionNameDialog.py
4.213 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
dynOptionMenuWidget.py
1.277 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
extend.txt
3.557 KB
19 Sep 2017 7.32 AM
root / linksafe
0644
help.txt
11.713 KB
19 Sep 2017 7.32 AM
root / linksafe
0644
idle.py
0.391 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
idle.pyw
0.655 KB
19 Sep 2017 7.32 AM
root / linksafe
0644
idlever.py
0.022 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
keybindingDialog.py
12.136 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
macosxSupport.py
7.004 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
rpc.py
20.462 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
run.py
13.373 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
tabbedpages.py
17.741 KB
17 Apr 2024 4.58 PM
root / linksafe
0644
textView.py
3.462 KB
17 Apr 2024 4.58 PM
root / linksafe
0644

GRAYBYTE WORDPRESS FILE MANAGER @ 2025 CONTACT ME
Static GIF