Psyduck - 可達鴨 之 鴨力山大2


Server : LiteSpeed
System : Linux premium217.web-hosting.com 4.18.0-553.54.1.lve.el8.x86_64 #1 SMP Wed Jun 4 13:01:13 UTC 2025 x86_64
User : alloknri ( 880)
PHP Version : 8.1.34
Disable Function : NONE
Directory :  /opt/alt/python27/lib64/python2.7/idlelib/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //opt/alt/python27/lib64/python2.7/idlelib/FormatParagraph.py
"""Extension to format a paragraph or selection to a max width.

Does basic, standard text formatting, and also understands Python
comment blocks. Thus, for editing Python source code, this
extension is really only suitable for reformatting these comment
blocks or triple-quoted strings.

Known problems with comment reformatting:
* If there is a selection marked, and the first line of the
  selection is not complete, the block will probably not be detected
  as comments, and will have the normal "text formatting" rules
  applied.
* If a comment block has leading whitespace that mixes tabs and
  spaces, they will not be considered part of the same block.
* Fancy comments, like this bulleted list, aren't handled :-)
"""

import re
from idlelib.configHandler import idleConf

class FormatParagraph:

    menudefs = [
        ('format', [   # /s/edit/format   dscherer@cmu.edu
            ('Format Paragraph', '<<format-paragraph>>'),
         ])
    ]

    def __init__(self, editwin):
        self.editwin = editwin

    def close(self):
        self.editwin = None

    def format_paragraph_event(self, event, limit=None):
        """Formats paragraph to a max width specified in idleConf.

        If text is selected, format_paragraph_event will start breaking lines
        at the max width, starting from the beginning selection.

        If no text is selected, format_paragraph_event uses the current
        cursor location to determine the paragraph (lines of text surrounded
        by blank lines) and formats it.

        The length limit parameter is for testing with a known value.
        """
        if limit is None:
            # The default length limit is that defined by pep8
            limit = idleConf.GetOption(
                'extensions', 'FormatParagraph', 'max-width',
                type='int', default=72)
        text = self.editwin.text
        first, last = self.editwin.get_selection_indices()
        if first and last:
            data = text.get(first, last)
            comment_header = get_comment_header(data)
        else:
            first, last, comment_header, data = \
                    find_paragraph(text, text.index("insert"))
        if comment_header:
            newdata = reformat_comment(data, limit, comment_header)
        else:
            newdata = reformat_paragraph(data, limit)
        text.tag_remove("sel", "1.0", "end")

        if newdata != data:
            text.mark_set("insert", first)
            text.undo_block_start()
            text.delete(first, last)
            text.insert(first, newdata)
            text.undo_block_stop()
        else:
            text.mark_set("insert", last)
        text.see("insert")
        return "break"

def find_paragraph(text, mark):
    """Returns the start/stop indices enclosing the paragraph that mark is in.

    Also returns the comment format string, if any, and paragraph of text
    between the start/stop indices.
    """
    lineno, col = map(int, mark.split("."))
    line = text.get("%d.0" % lineno, "%d.end" % lineno)

    # Look for start of next paragraph if the index passed in is a blank line
    while text.compare("%d.0" % lineno, "<", "end") and is_all_white(line):
        lineno = lineno + 1
        line = text.get("%d.0" % lineno, "%d.end" % lineno)
    first_lineno = lineno
    comment_header = get_comment_header(line)
    comment_header_len = len(comment_header)

    # Once start line found, search for end of paragraph (a blank line)
    while get_comment_header(line)==comment_header and \
              not is_all_white(line[comment_header_len:]):
        lineno = lineno + 1
        line = text.get("%d.0" % lineno, "%d.end" % lineno)
    last = "%d.0" % lineno

    # Search back to beginning of paragraph (first blank line before)
    lineno = first_lineno - 1
    line = text.get("%d.0" % lineno, "%d.end" % lineno)
    while lineno > 0 and \
              get_comment_header(line)==comment_header and \
              not is_all_white(line[comment_header_len:]):
        lineno = lineno - 1
        line = text.get("%d.0" % lineno, "%d.end" % lineno)
    first = "%d.0" % (lineno+1)

    return first, last, comment_header, text.get(first, last)

# This should perhaps be replaced with textwrap.wrap
def reformat_paragraph(data, limit):
    """Return data reformatted to specified width (limit)."""
    lines = data.split("\n")
    i = 0
    n = len(lines)
    while i < n and is_all_white(lines[i]):
        i = i+1
    if i >= n:
        return data
    indent1 = get_indent(lines[i])
    if i+1 < n and not is_all_white(lines[i+1]):
        indent2 = get_indent(lines[i+1])
    else:
        indent2 = indent1
    new = lines[:i]
    partial = indent1
    while i < n and not is_all_white(lines[i]):
        # XXX Should take double space after period (etc.) into account
        words = re.split("(\s+)", lines[i])
        for j in range(0, len(words), 2):
            word = words[j]
            if not word:
                continue # Can happen when line ends in whitespace
            if len((partial + word).expandtabs()) > limit and \
                   partial != indent1:
                new.append(partial.rstrip())
                partial = indent2
            partial = partial + word + " "
            if j+1 < len(words) and words[j+1] != " ":
                partial = partial + " "
        i = i+1
    new.append(partial.rstrip())
    # XXX Should reformat remaining paragraphs as well
    new.extend(lines[i:])
    return "\n".join(new)

def reformat_comment(data, limit, comment_header):
    """Return data reformatted to specified width with comment header."""

    # Remove header from the comment lines
    lc = len(comment_header)
    data = "\n".join(line[lc:] for line in data.split("\n"))
    # Reformat to maxformatwidth chars or a 20 char width,
    # whichever is greater.
    format_width = max(limit - len(comment_header), 20)
    newdata = reformat_paragraph(data, format_width)
    # re-split and re-insert the comment header.
    newdata = newdata.split("\n")
    # If the block ends in a \n, we dont want the comment prefix
    # inserted after it. (Im not sure it makes sense to reformat a
    # comment block that is not made of complete lines, but whatever!)
    # Can't think of a clean solution, so we hack away
    block_suffix = ""
    if not newdata[-1]:
        block_suffix = "\n"
        newdata = newdata[:-1]
    return '\n'.join(comment_header+line for line in newdata) + block_suffix

def is_all_white(line):
    """Return True if line is empty or all whitespace."""

    return re.match(r"^\s*$", line) is not None

def get_indent(line):
    """Return the initial space or tab indent of line."""
    return re.match(r"^([ \t]*)", line).group()

def get_comment_header(line):
    """Return string with leading whitespace and '#' from line or ''.

    A null return indicates that the line is not a comment line. A non-
    null return, such as '    #', will be used to find the other lines of
    a comment block with the same  indent.
    """
    m = re.match(r"^([ \t]*#*)", line)
    if m is None: return ""
    return m.group(1)

if __name__ == "__main__":
    import unittest
    unittest.main('idlelib.idle_test.test_formatparagraph',
            verbosity=2, exit=False)
Name
Size
Permissions
Options
Icons
--
drwxr-xr-x
idle_test
--
drwxr-xr-x
AutoComplete.py
8.754 KB
-rw-r--r--
AutoComplete.pyc
7.989 KB
-rw-r--r--
AutoComplete.pyo
7.989 KB
-rw-r--r--
AutoCompleteWindow.py
16.912 KB
-rw-r--r--
AutoCompleteWindow.pyc
12.416 KB
-rw-r--r--
AutoCompleteWindow.pyo
12.358 KB
-rw-r--r--
AutoExpand.py
3.315 KB
-rw-r--r--
AutoExpand.pyc
3.496 KB
-rw-r--r--
AutoExpand.pyo
3.496 KB
-rw-r--r--
Bindings.py
2.906 KB
-rw-r--r--
Bindings.pyc
4.598 KB
-rw-r--r--
Bindings.pyo
4.598 KB
-rw-r--r--
CREDITS.txt
1.822 KB
-rw-r--r--
CallTipWindow.py
5.923 KB
-rw-r--r--
CallTipWindow.pyc
6.145 KB
-rw-r--r--
CallTipWindow.pyo
6.145 KB
-rw-r--r--
CallTips.py
7.559 KB
-rw-r--r--
CallTips.pyc
8.158 KB
-rw-r--r--
CallTips.pyo
8.158 KB
-rw-r--r--
ChangeLog
55.071 KB
-rw-r--r--
ClassBrowser.py
6.835 KB
-rw-r--r--
ClassBrowser.pyc
9.658 KB
-rw-r--r--
ClassBrowser.pyo
9.658 KB
-rw-r--r--
CodeContext.py
8.146 KB
-rw-r--r--
CodeContext.pyc
6.629 KB
-rw-r--r--
CodeContext.pyo
6.586 KB
-rw-r--r--
ColorDelegator.py
9.533 KB
-rw-r--r--
ColorDelegator.pyc
8.905 KB
-rw-r--r--
ColorDelegator.pyo
8.905 KB
-rw-r--r--
Debugger.py
17.809 KB
-rw-r--r--
Debugger.pyc
17.719 KB
-rw-r--r--
Debugger.pyo
17.719 KB
-rw-r--r--
Delegator.py
0.649 KB
-rw-r--r--
Delegator.pyc
1.314 KB
-rw-r--r--
Delegator.pyo
1.314 KB
-rw-r--r--
EditorWindow.py
63.963 KB
-rw-r--r--
EditorWindow.pyc
57.15 KB
-rw-r--r--
EditorWindow.pyo
57.051 KB
-rw-r--r--
FileList.py
3.631 KB
-rw-r--r--
FileList.pyc
4.07 KB
-rw-r--r--
FileList.pyo
4.038 KB
-rw-r--r--
FormatParagraph.py
7.116 KB
-rw-r--r--
FormatParagraph.pyc
7.14 KB
-rw-r--r--
FormatParagraph.pyo
7.14 KB
-rw-r--r--
GrepDialog.py
5.024 KB
-rw-r--r--
GrepDialog.pyc
6.452 KB
-rw-r--r--
GrepDialog.pyo
6.452 KB
-rw-r--r--
HISTORY.txt
10.075 KB
-rw-r--r--
HyperParser.py
10.251 KB
-rw-r--r--
HyperParser.pyc
6.644 KB
-rw-r--r--
HyperParser.pyo
6.644 KB
-rw-r--r--
IOBinding.py
21.397 KB
-rw-r--r--
IOBinding.pyc
18.621 KB
-rw-r--r--
IOBinding.pyo
18.621 KB
-rw-r--r--
IdleHistory.py
3.957 KB
-rw-r--r--
IdleHistory.pyc
4.054 KB
-rw-r--r--
IdleHistory.pyo
4.054 KB
-rw-r--r--
MultiCall.py
17.286 KB
-rw-r--r--
MultiCall.pyc
16.399 KB
-rw-r--r--
MultiCall.pyo
16.327 KB
-rw-r--r--
MultiStatusBar.py
1.316 KB
-rw-r--r--
MultiStatusBar.pyc
2.302 KB
-rw-r--r--
MultiStatusBar.pyo
2.302 KB
-rw-r--r--
NEWS.txt
46.14 KB
-rw-r--r--
ObjectBrowser.py
4.273 KB
-rw-r--r--
ObjectBrowser.pyc
7.257 KB
-rw-r--r--
ObjectBrowser.pyo
7.257 KB
-rw-r--r--
OutputWindow.py
4.469 KB
-rw-r--r--
OutputWindow.pyc
5.3 KB
-rw-r--r--
OutputWindow.pyo
5.3 KB
-rw-r--r--
ParenMatch.py
6.557 KB
-rw-r--r--
ParenMatch.pyc
7.178 KB
-rw-r--r--
ParenMatch.pyo
7.178 KB
-rw-r--r--
PathBrowser.py
2.938 KB
-rw-r--r--
PathBrowser.pyc
4.571 KB
-rw-r--r--
PathBrowser.pyo
4.571 KB
-rw-r--r--
Percolator.py
3.146 KB
-rw-r--r--
Percolator.pyc
4.69 KB
-rw-r--r--
Percolator.pyo
4.511 KB
-rw-r--r--
PyParse.py
19.053 KB
-rw-r--r--
PyParse.pyc
9.986 KB
-rw-r--r--
PyParse.pyo
9.559 KB
-rw-r--r--
PyShell.py
57.492 KB
-rwxr-xr-x
PyShell.pyc
52.997 KB
-rw-r--r--
PyShell.pyo
52.897 KB
-rw-r--r--
README.txt
7.705 KB
-rw-r--r--
RemoteDebugger.py
11.359 KB
-rw-r--r--
RemoteDebugger.pyc
16.729 KB
-rw-r--r--
RemoteDebugger.pyo
16.579 KB
-rw-r--r--
RemoteObjectBrowser.py
0.92 KB
-rw-r--r--
RemoteObjectBrowser.pyc
2.227 KB
-rw-r--r--
RemoteObjectBrowser.pyo
2.227 KB
-rw-r--r--
ReplaceDialog.py
6.483 KB
-rw-r--r--
ReplaceDialog.pyc
7.828 KB
-rw-r--r--
ReplaceDialog.pyo
7.828 KB
-rw-r--r--
RstripExtension.py
1.025 KB
-rw-r--r--
RstripExtension.pyc
1.626 KB
-rw-r--r--
RstripExtension.pyo
1.626 KB
-rw-r--r--
ScriptBinding.py
8.261 KB
-rw-r--r--
ScriptBinding.pyc
8.174 KB
-rw-r--r--
ScriptBinding.pyo
8.174 KB
-rw-r--r--
ScrolledList.py
4.271 KB
-rw-r--r--
ScrolledList.pyc
6.609 KB
-rw-r--r--
ScrolledList.pyo
6.609 KB
-rw-r--r--
SearchDialog.py
2.568 KB
-rw-r--r--
SearchDialog.pyc
4.042 KB
-rw-r--r--
SearchDialog.pyo
4.042 KB
-rw-r--r--
SearchDialogBase.py
6.928 KB
-rw-r--r--
SearchDialogBase.pyc
8.429 KB
-rw-r--r--
SearchDialogBase.pyo
8.429 KB
-rw-r--r--
SearchEngine.py
7.288 KB
-rw-r--r--
SearchEngine.pyc
8.374 KB
-rw-r--r--
SearchEngine.pyo
8.374 KB
-rw-r--r--
StackViewer.py
4.327 KB
-rw-r--r--
StackViewer.pyc
6.521 KB
-rw-r--r--
StackViewer.pyo
6.521 KB
-rw-r--r--
TODO.txt
8.279 KB
-rw-r--r--
ToolTip.py
3.099 KB
-rw-r--r--
ToolTip.pyc
4.775 KB
-rw-r--r--
ToolTip.pyo
4.775 KB
-rw-r--r--
TreeWidget.py
14.685 KB
-rw-r--r--
TreeWidget.pyc
17.952 KB
-rw-r--r--
TreeWidget.pyo
17.952 KB
-rw-r--r--
UndoDelegator.py
10.534 KB
-rw-r--r--
UndoDelegator.pyc
13.885 KB
-rw-r--r--
UndoDelegator.pyo
13.885 KB
-rw-r--r--
WidgetRedirector.py
6.744 KB
-rw-r--r--
WidgetRedirector.pyc
7.765 KB
-rw-r--r--
WidgetRedirector.pyo
7.765 KB
-rw-r--r--
WindowList.py
2.415 KB
-rw-r--r--
WindowList.pyc
3.741 KB
-rw-r--r--
WindowList.pyo
3.741 KB
-rw-r--r--
ZoomHeight.py
1.27 KB
-rw-r--r--
ZoomHeight.pyc
1.671 KB
-rw-r--r--
ZoomHeight.pyo
1.671 KB
-rw-r--r--
__init__.py
0.281 KB
-rw-r--r--
__init__.pyc
0.434 KB
-rw-r--r--
__init__.pyo
0.434 KB
-rw-r--r--
aboutDialog.py
6.85 KB
-rw-r--r--
aboutDialog.pyc
6.853 KB
-rw-r--r--
aboutDialog.pyo
6.853 KB
-rw-r--r--
config-extensions.def
2.896 KB
-rw-r--r--
config-highlight.def
2.456 KB
-rw-r--r--
config-keys.def
7.595 KB
-rw-r--r--
config-main.def
2.501 KB
-rw-r--r--
configDialog.py
64.412 KB
-rw-r--r--
configDialog.pyc
53.159 KB
-rw-r--r--
configDialog.pyo
53.159 KB
-rw-r--r--
configHandler.py
31.724 KB
-rw-r--r--
configHandler.pyc
29.282 KB
-rw-r--r--
configHandler.pyo
29.282 KB
-rw-r--r--
configHelpSourceEdit.py
6.529 KB
-rw-r--r--
configHelpSourceEdit.pyc
6.555 KB
-rw-r--r--
configHelpSourceEdit.pyo
6.555 KB
-rw-r--r--
configSectionNameDialog.py
3.945 KB
-rw-r--r--
configSectionNameDialog.pyc
4.404 KB
-rw-r--r--
configSectionNameDialog.pyo
4.404 KB
-rw-r--r--
dynOptionMenuWidget.py
1.938 KB
-rw-r--r--
dynOptionMenuWidget.pyc
2.801 KB
-rw-r--r--
dynOptionMenuWidget.pyo
2.801 KB
-rw-r--r--
extend.txt
3.557 KB
-rw-r--r--
help.html
41.42 KB
-rw-r--r--
help.py
10.776 KB
-rw-r--r--
help.pyc
12.249 KB
-rw-r--r--
help.pyo
12.249 KB
-rw-r--r--
help.txt
11.859 KB
-rw-r--r--
idle.py
0.442 KB
-rw-r--r--
idle.pyc
0.413 KB
-rw-r--r--
idle.pyo
0.413 KB
-rw-r--r--
idle.pyw
0.55 KB
-rw-r--r--
idlever.py
0.405 KB
-rw-r--r--
idlever.pyc
0.577 KB
-rw-r--r--
idlever.pyo
0.577 KB
-rw-r--r--
keybindingDialog.py
12.176 KB
-rw-r--r--
keybindingDialog.pyc
12.078 KB
-rw-r--r--
keybindingDialog.pyo
12.078 KB
-rw-r--r--
macosxSupport.py
8.237 KB
-rw-r--r--
macosxSupport.pyc
8.384 KB
-rw-r--r--
macosxSupport.pyo
8.249 KB
-rw-r--r--
rpc.py
19.678 KB
-rw-r--r--
rpc.pyc
21.968 KB
-rw-r--r--
rpc.pyo
21.864 KB
-rw-r--r--
run.py
12.614 KB
-rw-r--r--
run.pyc
13.447 KB
-rw-r--r--
run.pyo
13.391 KB
-rw-r--r--
tabbedpages.py
18.007 KB
-rw-r--r--
tabbedpages.pyc
18.634 KB
-rw-r--r--
tabbedpages.pyo
18.634 KB
-rw-r--r--
textView.py
3.438 KB
-rw-r--r--
textView.pyc
4.02 KB
-rw-r--r--
textView.pyo
4.02 KB
-rw-r--r--