SILENT KILLERPanel

Current Path: > > opt > alt > python38 > lib64 > python3.8


Operation   : Linux premium131.web-hosting.com 4.18.0-553.44.1.lve.el8.x86_64 #1 SMP Thu Mar 13 14:29:12 UTC 2025 x86_64
Software     : Apache
Server IP    : 162.0.232.56 | Your IP: 216.73.216.111
Domains      : 1034 Domain(s)
Permission   : [ 0755 ]

Files and Folders in: //opt/alt/python38/lib64/python3.8

NameTypeSizeLast ModifiedActions
__pycache__ Directory - -
asyncio Directory - -
collections Directory - -
concurrent Directory - -
config-3.8-x86_64-linux-gnu Directory - -
ctypes Directory - -
curses Directory - -
dbm Directory - -
distutils Directory - -
email Directory - -
encodings Directory - -
ensurepip Directory - -
html Directory - -
http Directory - -
importlib Directory - -
json Directory - -
lib-dynload Directory - -
lib2to3 Directory - -
logging Directory - -
multiprocessing Directory - -
pydoc_data Directory - -
site-packages Directory - -
sqlite3 Directory - -
unittest Directory - -
urllib Directory - -
venv Directory - -
wsgiref Directory - -
xml Directory - -
xmlrpc Directory - -
LICENSE.txt File 13937 bytes September 06 2024 20:41:55.
__future__.py File 5147 bytes September 06 2024 20:41:55.
__phello__.foo.py File 64 bytes September 06 2024 20:41:55.
_bootlocale.py File 1801 bytes September 06 2024 20:41:55.
_collections_abc.py File 26100 bytes September 06 2024 20:41:55.
_compat_pickle.py File 8749 bytes September 06 2024 20:41:55.
_compression.py File 5340 bytes September 06 2024 20:41:55.
_dummy_thread.py File 6027 bytes September 06 2024 20:41:55.
_markupbase.py File 14598 bytes September 06 2024 20:41:55.
_osx_support.py File 21774 bytes September 06 2024 20:41:55.
_py_abc.py File 6189 bytes September 06 2024 20:41:55.
_pydecimal.py File 228666 bytes September 06 2024 20:41:55.
_pyio.py File 93177 bytes September 06 2024 20:41:55.
_sitebuiltins.py File 3115 bytes September 06 2024 20:41:55.
_strptime.py File 25268 bytes September 06 2024 20:41:55.
_sysconfigdata__linux_x86_64-linux-gnu.py File 41679 bytes September 23 2024 11:25:15.
_sysconfigdata_d_linux_x86_64-linux-gnu.py File 41438 bytes September 23 2024 11:17:38.
_threading_local.py File 7220 bytes September 06 2024 20:41:55.
_weakrefset.py File 5735 bytes September 06 2024 20:41:55.
abc.py File 4489 bytes September 06 2024 20:41:55.
aifc.py File 32814 bytes September 06 2024 20:41:55.
antigravity.py File 477 bytes September 06 2024 20:41:55.
argparse.py File 96015 bytes September 06 2024 20:41:55.
ast.py File 19234 bytes September 06 2024 20:41:55.
asynchat.py File 11328 bytes September 06 2024 20:41:55.
asyncore.py File 20094 bytes September 06 2024 20:41:55.
base64.py File 20395 bytes September 06 2024 20:41:55.
bdb.py File 32056 bytes September 06 2024 20:41:55.
binhex.py File 13954 bytes September 06 2024 20:41:55.
bisect.py File 2214 bytes September 06 2024 20:41:55.
bz2.py File 12558 bytes September 06 2024 20:41:55.
cProfile.py File 7023 bytes September 06 2024 20:41:55.
calendar.py File 24832 bytes September 06 2024 20:41:55.
cgi.py File 33945 bytes September 06 2024 20:41:55.
cgitb.py File 12096 bytes September 06 2024 20:41:55.
chunk.py File 5435 bytes September 06 2024 20:41:55.
cmd.py File 14860 bytes September 06 2024 20:41:55.
code.py File 10622 bytes September 06 2024 20:41:55.
codecs.py File 36667 bytes September 06 2024 20:41:55.
codeop.py File 6330 bytes September 06 2024 20:41:55.
colorsys.py File 4064 bytes September 06 2024 20:41:55.
compileall.py File 13678 bytes September 06 2024 20:41:55.
configparser.py File 54374 bytes September 06 2024 20:41:55.
contextlib.py File 24995 bytes September 06 2024 20:41:55.
contextvars.py File 129 bytes September 06 2024 20:41:55.
copy.py File 8661 bytes September 06 2024 20:41:55.
copyreg.py File 7135 bytes September 06 2024 20:41:55.
crypt.py File 3610 bytes September 06 2024 20:41:55.
csv.py File 16144 bytes September 06 2024 20:41:55.
dataclasses.py File 49973 bytes September 06 2024 20:41:55.
datetime.py File 88287 bytes September 06 2024 20:41:55.
decimal.py File 320 bytes September 06 2024 20:41:55.
difflib.py File 84058 bytes September 06 2024 20:41:55.
dis.py File 20570 bytes September 06 2024 20:41:55.
doctest.py File 104543 bytes September 06 2024 20:41:55.
dummy_threading.py File 2815 bytes September 06 2024 20:41:55.
enum.py File 38136 bytes September 06 2024 20:41:55.
filecmp.py File 9830 bytes September 06 2024 20:41:55.
fileinput.py File 14709 bytes September 06 2024 20:41:55.
fnmatch.py File 4079 bytes September 06 2024 20:41:55.
formatter.py File 15143 bytes September 06 2024 20:41:55.
fractions.py File 24329 bytes September 06 2024 20:41:55.
ftplib.py File 35129 bytes September 06 2024 20:41:55.
functools.py File 37406 bytes September 06 2024 20:41:55.
genericpath.py File 4975 bytes September 06 2024 20:41:55.
getopt.py File 7489 bytes September 06 2024 20:41:55.
getpass.py File 5994 bytes September 06 2024 20:41:55.
gettext.py File 27138 bytes September 06 2024 20:41:55.
glob.py File 5697 bytes September 06 2024 20:41:55.
gzip.py File 21413 bytes September 06 2024 20:41:55.
hashlib.py File 9730 bytes September 06 2024 20:41:55.
heapq.py File 22877 bytes September 06 2024 20:41:55.
hmac.py File 6629 bytes September 06 2024 20:41:55.
imaplib.py File 53606 bytes September 06 2024 20:41:55.
imghdr.py File 3808 bytes September 06 2024 20:41:55.
imp.py File 10536 bytes September 06 2024 20:41:55.
inspect.py File 118550 bytes September 06 2024 20:41:55.
io.py File 3541 bytes September 06 2024 20:41:55.
ipaddress.py File 74899 bytes September 06 2024 20:41:55.
keyword.py File 945 bytes September 06 2024 20:41:55.
linecache.py File 5330 bytes September 06 2024 20:41:55.
locale.py File 78191 bytes September 06 2024 20:41:55.
lzma.py File 12983 bytes September 06 2024 20:41:55.
mailbox.py File 78661 bytes September 06 2024 20:41:55.
mailcap.py File 9067 bytes September 06 2024 20:41:55.
mimetypes.py File 21664 bytes September 06 2024 20:41:55.
modulefinder.py File 24430 bytes September 06 2024 20:41:55.
netrc.py File 5566 bytes September 06 2024 20:41:55.
nntplib.py File 43261 bytes September 06 2024 20:41:55.
ntpath.py File 27734 bytes September 06 2024 20:41:55.
nturl2path.py File 2887 bytes September 06 2024 20:41:55.
numbers.py File 10244 bytes September 06 2024 20:41:55.
opcode.py File 5808 bytes September 06 2024 20:41:55.
operator.py File 10711 bytes September 06 2024 20:41:55.
optparse.py File 60369 bytes September 06 2024 20:41:55.
os.py File 38995 bytes September 06 2024 20:41:55.
pathlib.py File 52610 bytes September 06 2024 20:41:55.
pdb.py File 62751 bytes September 06 2024 20:41:55.
pickle.py File 64467 bytes September 06 2024 20:41:55.
pickletools.py File 93486 bytes September 06 2024 20:41:55.
pipes.py File 8916 bytes September 06 2024 20:41:55.
pkgutil.py File 21500 bytes September 06 2024 20:41:55.
platform.py File 40438 bytes September 06 2024 20:41:55.
plistlib.py File 32220 bytes September 06 2024 20:41:55.
poplib.py File 15077 bytes September 06 2024 20:41:55.
posixpath.py File 15627 bytes September 06 2024 20:41:55.
pprint.py File 21484 bytes September 06 2024 20:41:55.
profile.py File 23559 bytes September 06 2024 20:41:55.
pstats.py File 27345 bytes September 06 2024 20:41:55.
pty.py File 4807 bytes September 06 2024 20:41:55.
py_compile.py File 8203 bytes September 23 2024 11:15:42.
pyclbr.py File 15255 bytes September 06 2024 20:41:55.
pydoc.py File 106700 bytes September 23 2024 11:26:08.
queue.py File 11356 bytes September 06 2024 20:41:55.
quopri.py File 7265 bytes September 06 2024 20:41:55.
random.py File 28802 bytes September 06 2024 20:41:55.
re.py File 15861 bytes September 06 2024 20:41:55.
reprlib.py File 5267 bytes September 06 2024 20:41:55.
rlcompleter.py File 7097 bytes September 06 2024 20:41:55.
runpy.py File 12052 bytes September 06 2024 20:41:55.
sched.py File 6442 bytes September 06 2024 20:41:55.
secrets.py File 2038 bytes September 06 2024 20:41:55.
selectors.py File 18561 bytes September 06 2024 20:41:55.
shelve.py File 8527 bytes September 06 2024 20:41:55.
shlex.py File 13325 bytes September 06 2024 20:41:55.
shutil.py File 51761 bytes September 06 2024 20:41:55.
signal.py File 2273 bytes September 06 2024 20:41:55.
site.py File 21877 bytes September 23 2024 11:15:42.
smtpd.py File 34722 bytes September 06 2024 20:41:55.
smtplib.py File 45014 bytes September 06 2024 20:41:55.
sndhdr.py File 7099 bytes September 06 2024 20:41:55.
socket.py File 35464 bytes September 06 2024 20:41:55.
socketserver.py File 27296 bytes September 06 2024 20:41:55.
sre_compile.py File 26695 bytes September 06 2024 20:41:55.
sre_constants.py File 7154 bytes September 06 2024 20:41:55.
sre_parse.py File 40230 bytes September 06 2024 20:41:55.
ssl.py File 52533 bytes September 06 2024 20:41:55.
stat.py File 5485 bytes September 06 2024 20:41:55.
statistics.py File 39690 bytes September 06 2024 20:41:55.
string.py File 10535 bytes September 06 2024 20:41:55.
stringprep.py File 12917 bytes September 06 2024 20:41:55.
struct.py File 257 bytes September 06 2024 20:41:55.
subprocess.py File 78250 bytes September 06 2024 20:41:55.
sunau.py File 18375 bytes September 06 2024 20:41:55.
symbol.py File 2109 bytes September 23 2024 11:18:30.
symtable.py File 8021 bytes September 06 2024 20:41:55.
sysconfig.py File 24893 bytes September 23 2024 11:15:42.
tabnanny.py File 11419 bytes September 06 2024 20:41:55.
tarfile.py File 106031 bytes September 06 2024 20:41:55.
telnetlib.py File 23254 bytes September 06 2024 20:41:55.
tempfile.py File 27822 bytes September 06 2024 20:41:55.
textwrap.py File 19407 bytes September 06 2024 20:41:55.
this.py File 1003 bytes September 06 2024 20:41:55.
threading.py File 50820 bytes September 06 2024 20:41:55.
timeit.py File 13493 bytes September 06 2024 20:41:55.
token.py File 2368 bytes September 06 2024 20:41:55.
tokenize.py File 25841 bytes September 06 2024 20:41:55.
trace.py File 29883 bytes September 06 2024 20:41:55.
traceback.py File 23611 bytes September 06 2024 20:41:55.
tracemalloc.py File 17076 bytes September 06 2024 20:41:55.
tty.py File 879 bytes September 06 2024 20:41:55.
types.py File 9713 bytes September 06 2024 20:41:55.
typing.py File 68962 bytes September 06 2024 20:41:55.
uu.py File 7277 bytes September 23 2024 11:26:07.
uuid.py File 30466 bytes September 06 2024 20:41:55.
warnings.py File 19688 bytes September 06 2024 20:41:55.
wave.py File 18230 bytes September 06 2024 20:41:55.
weakref.py File 21387 bytes September 06 2024 20:41:55.
webbrowser.py File 24096 bytes September 06 2024 20:41:55.
xdrlib.py File 5913 bytes September 06 2024 20:41:55.
zipapp.py File 7535 bytes September 06 2024 20:41:55.
zipfile.py File 88476 bytes September 06 2024 20:41:55.
zipimport.py File 30765 bytes September 06 2024 20:41:55.

Reading File: //opt/alt/python38/lib64/python3.8/formatter.py

"""Generic output formatting.

Formatter objects transform an abstract flow of formatting events into
specific output events on writer objects. Formatters manage several stack
structures to allow various properties of a writer object to be changed and
restored; writers need not be able to handle relative changes nor any sort
of ``change back'' operation. Specific writer properties which may be
controlled via formatter objects are horizontal alignment, font, and left
margin indentations. A mechanism is provided which supports providing
arbitrary, non-exclusive style settings to a writer as well. Additional
interfaces facilitate formatting events which are not reversible, such as
paragraph separation.

Writer objects encapsulate device interfaces. Abstract devices, such as
file formats, are supported as well as physical devices. The provided
implementations all work with abstract devices. The interface makes
available mechanisms for setting the properties which formatter objects
manage and inserting data into the output.
"""

import sys
import warnings
warnings.warn('the formatter module is deprecated', DeprecationWarning,
              stacklevel=2)


AS_IS = None


class NullFormatter:
    """A formatter which does nothing.

    If the writer parameter is omitted, a NullWriter instance is created.
    No methods of the writer are called by NullFormatter instances.

    Implementations should inherit from this class if implementing a writer
    interface but don't need to inherit any implementation.

    """

    def __init__(self, writer=None):
        if writer is None:
            writer = NullWriter()
        self.writer = writer
    def end_paragraph(self, blankline): pass
    def add_line_break(self): pass
    def add_hor_rule(self, *args, **kw): pass
    def add_label_data(self, format, counter, blankline=None): pass
    def add_flowing_data(self, data): pass
    def add_literal_data(self, data): pass
    def flush_softspace(self): pass
    def push_alignment(self, align): pass
    def pop_alignment(self): pass
    def push_font(self, x): pass
    def pop_font(self): pass
    def push_margin(self, margin): pass
    def pop_margin(self): pass
    def set_spacing(self, spacing): pass
    def push_style(self, *styles): pass
    def pop_style(self, n=1): pass
    def assert_line_data(self, flag=1): pass


class AbstractFormatter:
    """The standard formatter.

    This implementation has demonstrated wide applicability to many writers,
    and may be used directly in most circumstances.  It has been used to
    implement a full-featured World Wide Web browser.

    """

    #  Space handling policy:  blank spaces at the boundary between elements
    #  are handled by the outermost context.  "Literal" data is not checked
    #  to determine context, so spaces in literal data are handled directly
    #  in all circumstances.

    def __init__(self, writer):
        self.writer = writer            # Output device
        self.align = None               # Current alignment
        self.align_stack = []           # Alignment stack
        self.font_stack = []            # Font state
        self.margin_stack = []          # Margin state
        self.spacing = None             # Vertical spacing state
        self.style_stack = []           # Other state, e.g. color
        self.nospace = 1                # Should leading space be suppressed
        self.softspace = 0              # Should a space be inserted
        self.para_end = 1               # Just ended a paragraph
        self.parskip = 0                # Skipped space between paragraphs?
        self.hard_break = 1             # Have a hard break
        self.have_label = 0

    def end_paragraph(self, blankline):
        if not self.hard_break:
            self.writer.send_line_break()
            self.have_label = 0
        if self.parskip < blankline and not self.have_label:
            self.writer.send_paragraph(blankline - self.parskip)
            self.parskip = blankline
            self.have_label = 0
        self.hard_break = self.nospace = self.para_end = 1
        self.softspace = 0

    def add_line_break(self):
        if not (self.hard_break or self.para_end):
            self.writer.send_line_break()
            self.have_label = self.parskip = 0
        self.hard_break = self.nospace = 1
        self.softspace = 0

    def add_hor_rule(self, *args, **kw):
        if not self.hard_break:
            self.writer.send_line_break()
        self.writer.send_hor_rule(*args, **kw)
        self.hard_break = self.nospace = 1
        self.have_label = self.para_end = self.softspace = self.parskip = 0

    def add_label_data(self, format, counter, blankline = None):
        if self.have_label or not self.hard_break:
            self.writer.send_line_break()
        if not self.para_end:
            self.writer.send_paragraph((blankline and 1) or 0)
        if isinstance(format, str):
            self.writer.send_label_data(self.format_counter(format, counter))
        else:
            self.writer.send_label_data(format)
        self.nospace = self.have_label = self.hard_break = self.para_end = 1
        self.softspace = self.parskip = 0

    def format_counter(self, format, counter):
        label = ''
        for c in format:
            if c == '1':
                label = label + ('%d' % counter)
            elif c in 'aA':
                if counter > 0:
                    label = label + self.format_letter(c, counter)
            elif c in 'iI':
                if counter > 0:
                    label = label + self.format_roman(c, counter)
            else:
                label = label + c
        return label

    def format_letter(self, case, counter):
        label = ''
        while counter > 0:
            counter, x = divmod(counter-1, 26)
            # This makes a strong assumption that lowercase letters
            # and uppercase letters form two contiguous blocks, with
            # letters in order!
            s = chr(ord(case) + x)
            label = s + label
        return label

    def format_roman(self, case, counter):
        ones = ['i', 'x', 'c', 'm']
        fives = ['v', 'l', 'd']
        label, index = '', 0
        # This will die of IndexError when counter is too big
        while counter > 0:
            counter, x = divmod(counter, 10)
            if x == 9:
                label = ones[index] + ones[index+1] + label
            elif x == 4:
                label = ones[index] + fives[index] + label
            else:
                if x >= 5:
                    s = fives[index]
                    x = x-5
                else:
                    s = ''
                s = s + ones[index]*x
                label = s + label
            index = index + 1
        if case == 'I':
            return label.upper()
        return label

    def add_flowing_data(self, data):
        if not data: return
        prespace = data[:1].isspace()
        postspace = data[-1:].isspace()
        data = " ".join(data.split())
        if self.nospace and not data:
            return
        elif prespace or self.softspace:
            if not data:
                if not self.nospace:
                    self.softspace = 1
                    self.parskip = 0
                return
            if not self.nospace:
                data = ' ' + data
        self.hard_break = self.nospace = self.para_end = \
                          self.parskip = self.have_label = 0
        self.softspace = postspace
        self.writer.send_flowing_data(data)

    def add_literal_data(self, data):
        if not data: return
        if self.softspace:
            self.writer.send_flowing_data(" ")
        self.hard_break = data[-1:] == '\n'
        self.nospace = self.para_end = self.softspace = \
                       self.parskip = self.have_label = 0
        self.writer.send_literal_data(data)

    def flush_softspace(self):
        if self.softspace:
            self.hard_break = self.para_end = self.parskip = \
                              self.have_label = self.softspace = 0
            self.nospace = 1
            self.writer.send_flowing_data(' ')

    def push_alignment(self, align):
        if align and align != self.align:
            self.writer.new_alignment(align)
            self.align = align
            self.align_stack.append(align)
        else:
            self.align_stack.append(self.align)

    def pop_alignment(self):
        if self.align_stack:
            del self.align_stack[-1]
        if self.align_stack:
            self.align = align = self.align_stack[-1]
            self.writer.new_alignment(align)
        else:
            self.align = None
            self.writer.new_alignment(None)

    def push_font(self, font):
        size, i, b, tt = font
        if self.softspace:
            self.hard_break = self.para_end = self.softspace = 0
            self.nospace = 1
            self.writer.send_flowing_data(' ')
        if self.font_stack:
            csize, ci, cb, ctt = self.font_stack[-1]
            if size is AS_IS: size = csize
            if i is AS_IS: i = ci
            if b is AS_IS: b = cb
            if tt is AS_IS: tt = ctt
        font = (size, i, b, tt)
        self.font_stack.append(font)
        self.writer.new_font(font)

    def pop_font(self):
        if self.font_stack:
            del self.font_stack[-1]
        if self.font_stack:
            font = self.font_stack[-1]
        else:
            font = None
        self.writer.new_font(font)

    def push_margin(self, margin):
        self.margin_stack.append(margin)
        fstack = [m for m in self.margin_stack if m]
        if not margin and fstack:
            margin = fstack[-1]
        self.writer.new_margin(margin, len(fstack))

    def pop_margin(self):
        if self.margin_stack:
            del self.margin_stack[-1]
        fstack = [m for m in self.margin_stack if m]
        if fstack:
            margin = fstack[-1]
        else:
            margin = None
        self.writer.new_margin(margin, len(fstack))

    def set_spacing(self, spacing):
        self.spacing = spacing
        self.writer.new_spacing(spacing)

    def push_style(self, *styles):
        if self.softspace:
            self.hard_break = self.para_end = self.softspace = 0
            self.nospace = 1
            self.writer.send_flowing_data(' ')
        for style in styles:
            self.style_stack.append(style)
        self.writer.new_styles(tuple(self.style_stack))

    def pop_style(self, n=1):
        del self.style_stack[-n:]
        self.writer.new_styles(tuple(self.style_stack))

    def assert_line_data(self, flag=1):
        self.nospace = self.hard_break = not flag
        self.para_end = self.parskip = self.have_label = 0


class NullWriter:
    """Minimal writer interface to use in testing & inheritance.

    A writer which only provides the interface definition; no actions are
    taken on any methods.  This should be the base class for all writers
    which do not need to inherit any implementation methods.

    """
    def __init__(self): pass
    def flush(self): pass
    def new_alignment(self, align): pass
    def new_font(self, font): pass
    def new_margin(self, margin, level): pass
    def new_spacing(self, spacing): pass
    def new_styles(self, styles): pass
    def send_paragraph(self, blankline): pass
    def send_line_break(self): pass
    def send_hor_rule(self, *args, **kw): pass
    def send_label_data(self, data): pass
    def send_flowing_data(self, data): pass
    def send_literal_data(self, data): pass


class AbstractWriter(NullWriter):
    """A writer which can be used in debugging formatters, but not much else.

    Each method simply announces itself by printing its name and
    arguments on standard output.

    """

    def new_alignment(self, align):
        print("new_alignment(%r)" % (align,))

    def new_font(self, font):
        print("new_font(%r)" % (font,))

    def new_margin(self, margin, level):
        print("new_margin(%r, %d)" % (margin, level))

    def new_spacing(self, spacing):
        print("new_spacing(%r)" % (spacing,))

    def new_styles(self, styles):
        print("new_styles(%r)" % (styles,))

    def send_paragraph(self, blankline):
        print("send_paragraph(%r)" % (blankline,))

    def send_line_break(self):
        print("send_line_break()")

    def send_hor_rule(self, *args, **kw):
        print("send_hor_rule()")

    def send_label_data(self, data):
        print("send_label_data(%r)" % (data,))

    def send_flowing_data(self, data):
        print("send_flowing_data(%r)" % (data,))

    def send_literal_data(self, data):
        print("send_literal_data(%r)" % (data,))


class DumbWriter(NullWriter):
    """Simple writer class which writes output on the file object passed in
    as the file parameter or, if file is omitted, on standard output.  The
    output is simply word-wrapped to the number of columns specified by
    the maxcol parameter.  This class is suitable for reflowing a sequence
    of paragraphs.

    """

    def __init__(self, file=None, maxcol=72):
        self.file = file or sys.stdout
        self.maxcol = maxcol
        NullWriter.__init__(self)
        self.reset()

    def reset(self):
        self.col = 0
        self.atbreak = 0

    def send_paragraph(self, blankline):
        self.file.write('\n'*blankline)
        self.col = 0
        self.atbreak = 0

    def send_line_break(self):
        self.file.write('\n')
        self.col = 0
        self.atbreak = 0

    def send_hor_rule(self, *args, **kw):
        self.file.write('\n')
        self.file.write('-'*self.maxcol)
        self.file.write('\n')
        self.col = 0
        self.atbreak = 0

    def send_literal_data(self, data):
        self.file.write(data)
        i = data.rfind('\n')
        if i >= 0:
            self.col = 0
            data = data[i+1:]
        data = data.expandtabs()
        self.col = self.col + len(data)
        self.atbreak = 0

    def send_flowing_data(self, data):
        if not data: return
        atbreak = self.atbreak or data[0].isspace()
        col = self.col
        maxcol = self.maxcol
        write = self.file.write
        for word in data.split():
            if atbreak:
                if col + len(word) >= maxcol:
                    write('\n')
                    col = 0
                else:
                    write(' ')
                    col = col + 1
            write(word)
            col = col + len(word)
            atbreak = 1
        self.col = col
        self.atbreak = data[-1].isspace()


def test(file = None):
    w = DumbWriter()
    f = AbstractFormatter(w)
    if file is not None:
        fp = open(file)
    elif sys.argv[1:]:
        fp = open(sys.argv[1])
    else:
        fp = sys.stdin
    try:
        for line in fp:
            if line == '\n':
                f.end_paragraph(1)
            else:
                f.add_flowing_data(line)
    finally:
        if fp is not sys.stdin:
            fp.close()
    f.end_paragraph(0)


if __name__ == '__main__':
    test()

SILENT KILLER Tool