Current Path: > > usr > lib64 > python3.6 >
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 ]
Name | Type | Size | Last Modified | Actions |
---|---|---|---|---|
__pycache__ | Directory | - | - | |
asyncio | Directory | - | - | |
collections | Directory | - | - | |
concurrent | Directory | - | - | |
config-3.6m-x86_64-linux-gnu | Directory | - | - | |
ctypes | Directory | - | - | |
curses | Directory | - | - | |
dbm | Directory | - | - | |
distutils | Directory | - | - | |
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 | - | - | |
test | Directory | - | - | |
unittest | Directory | - | - | |
urllib | Directory | - | - | |
venv | Directory | - | - | |
wsgiref | Directory | - | - | |
xml | Directory | - | - | |
xmlrpc | Directory | - | - | |
__future__.py | File | 4841 bytes | December 23 2018 21:37:14. | |
__phello__.foo.py | File | 64 bytes | December 23 2018 21:37:14. | |
_bootlocale.py | File | 1301 bytes | December 23 2018 21:37:14. | |
_collections_abc.py | File | 26392 bytes | December 23 2018 21:37:14. | |
_compat_pickle.py | File | 8749 bytes | December 23 2018 21:37:14. | |
_compression.py | File | 5340 bytes | December 23 2018 21:37:14. | |
_dummy_thread.py | File | 5118 bytes | December 23 2018 21:37:14. | |
_markupbase.py | File | 14598 bytes | December 23 2018 21:37:14. | |
_osx_support.py | File | 19138 bytes | December 23 2018 21:37:14. | |
_pydecimal.py | File | 230228 bytes | December 23 2018 21:37:14. | |
_pyio.py | File | 88097 bytes | December 23 2018 21:37:14. | |
_sitebuiltins.py | File | 3115 bytes | December 23 2018 21:37:14. | |
_strptime.py | File | 24747 bytes | December 23 2018 21:37:14. | |
_sysconfigdata_dm_linux_x86_64-linux-gnu.py | File | 30191 bytes | July 01 2025 22:10:37. | |
_sysconfigdata_m_linux_x86_64-linux-gnu.py | File | 30367 bytes | July 01 2025 22:14:06. | |
_threading_local.py | File | 7214 bytes | December 23 2018 21:37:14. | |
_weakrefset.py | File | 5705 bytes | December 23 2018 21:37:14. | |
abc.py | File | 8727 bytes | December 23 2018 21:37:14. | |
aifc.py | File | 32454 bytes | December 23 2018 21:37:14. | |
antigravity.py | File | 477 bytes | December 23 2018 21:37:14. | |
argparse.py | File | 90372 bytes | December 23 2018 21:37:14. | |
ast.py | File | 12166 bytes | December 23 2018 21:37:14. | |
asynchat.py | File | 11328 bytes | December 23 2018 21:37:14. | |
asyncore.py | File | 20159 bytes | December 23 2018 21:37:14. | |
base64.py | File | 20388 bytes | December 23 2018 21:37:14. | |
bdb.py | File | 23556 bytes | December 23 2018 21:37:14. | |
binhex.py | File | 13954 bytes | December 23 2018 21:37:14. | |
bisect.py | File | 2595 bytes | December 23 2018 21:37:14. | |
bz2.py | File | 12478 bytes | December 23 2018 21:37:14. | |
cProfile.py | File | 5380 bytes | December 23 2018 21:37:14. | |
calendar.py | File | 23213 bytes | December 23 2018 21:37:14. | |
cgi.py | File | 37219 bytes | July 01 2025 22:09:53. | |
cgitb.py | File | 12018 bytes | December 23 2018 21:37:14. | |
chunk.py | File | 5425 bytes | December 23 2018 21:37:14. | |
cmd.py | File | 14860 bytes | December 23 2018 21:37:14. | |
code.py | File | 10614 bytes | December 23 2018 21:37:14. | |
codecs.py | File | 36276 bytes | December 23 2018 21:37:14. | |
codeop.py | File | 5994 bytes | December 23 2018 21:37:14. | |
colorsys.py | File | 4064 bytes | December 23 2018 21:37:14. | |
compileall.py | File | 12125 bytes | December 23 2018 21:37:14. | |
configparser.py | File | 53592 bytes | December 23 2018 21:37:14. | |
contextlib.py | File | 13162 bytes | December 23 2018 21:37:14. | |
copy.py | File | 8815 bytes | December 23 2018 21:37:14. | |
copyreg.py | File | 7007 bytes | December 23 2018 21:37:14. | |
crypt.py | File | 1864 bytes | December 23 2018 21:37:14. | |
csv.py | File | 16180 bytes | December 23 2018 21:37:14. | |
datetime.py | File | 82034 bytes | December 23 2018 21:37:14. | |
decimal.py | File | 320 bytes | December 23 2018 21:37:14. | |
difflib.py | File | 84377 bytes | December 23 2018 21:37:14. | |
dis.py | File | 18132 bytes | December 23 2018 21:37:14. | |
doctest.py | File | 104391 bytes | December 23 2018 21:37:14. | |
dummy_threading.py | File | 2815 bytes | December 23 2018 21:37:14. | |
enum.py | File | 33606 bytes | December 23 2018 21:37:14. | |
filecmp.py | File | 9830 bytes | December 23 2018 21:37:14. | |
fileinput.py | File | 14471 bytes | December 23 2018 21:37:14. | |
fnmatch.py | File | 3166 bytes | December 23 2018 21:37:14. | |
formatter.py | File | 15143 bytes | December 23 2018 21:37:14. | |
fractions.py | File | 23639 bytes | December 23 2018 21:37:14. | |
ftplib.py | File | 35617 bytes | July 01 2025 22:09:53. | |
functools.py | File | 31346 bytes | December 23 2018 21:37:14. | |
genericpath.py | File | 5028 bytes | July 01 2025 22:09:53. | |
getopt.py | File | 7489 bytes | December 23 2018 21:37:14. | |
getpass.py | File | 5994 bytes | December 23 2018 21:37:14. | |
gettext.py | File | 21530 bytes | December 23 2018 21:37:14. | |
glob.py | File | 5638 bytes | December 23 2018 21:37:14. | |
gzip.py | File | 20334 bytes | December 23 2018 21:37:14. | |
hashlib.py | File | 8799 bytes | July 01 2025 22:09:53. | |
heapq.py | File | 22929 bytes | December 23 2018 21:37:14. | |
hmac.py | File | 6381 bytes | July 01 2025 22:09:53. | |
imaplib.py | File | 53295 bytes | December 23 2018 21:37:14. | |
imghdr.py | File | 3795 bytes | December 23 2018 21:37:14. | |
imp.py | File | 10669 bytes | December 23 2018 21:37:14. | |
inspect.py | File | 116958 bytes | December 23 2018 21:37:14. | |
io.py | File | 3517 bytes | December 23 2018 21:37:14. | |
ipaddress.py | File | 77818 bytes | July 01 2025 22:09:53. | |
keyword.py | File | 2219 bytes | December 23 2018 21:37:14. | |
linecache.py | File | 5312 bytes | December 23 2018 21:37:14. | |
locale.py | File | 77300 bytes | December 23 2018 21:37:14. | |
lzma.py | File | 12983 bytes | December 23 2018 21:37:14. | |
macpath.py | File | 5971 bytes | December 23 2018 21:37:14. | |
macurl2path.py | File | 2732 bytes | December 23 2018 21:37:14. | |
mailbox.py | File | 78624 bytes | December 23 2018 21:37:14. | |
mailcap.py | File | 9067 bytes | July 01 2025 22:09:53. | |
mimetypes.py | File | 21042 bytes | December 23 2018 21:37:14. | |
modulefinder.py | File | 23027 bytes | December 23 2018 21:37:14. | |
netrc.py | File | 5684 bytes | December 23 2018 21:37:14. | |
nntplib.py | File | 43078 bytes | December 23 2018 21:37:14. | |
ntpath.py | File | 23094 bytes | December 23 2018 21:37:14. | |
nturl2path.py | File | 2444 bytes | December 23 2018 21:37:14. | |
numbers.py | File | 10243 bytes | December 23 2018 21:37:14. | |
opcode.py | File | 5822 bytes | December 23 2018 21:37:14. | |
operator.py | File | 10863 bytes | December 23 2018 21:37:14. | |
optparse.py | File | 60371 bytes | December 23 2018 21:37:14. | |
os.py | File | 37526 bytes | December 23 2018 21:37:14. | |
pathlib.py | File | 46238 bytes | July 01 2025 22:09:53. | |
pdb.py | File | 61320 bytes | December 23 2018 21:37:14. | |
pickle.py | File | 55691 bytes | December 23 2018 21:37:14. | |
pickletools.py | File | 91775 bytes | December 23 2018 21:37:14. | |
pipes.py | File | 8916 bytes | December 23 2018 21:37:14. | |
pkgutil.py | File | 21315 bytes | December 23 2018 21:37:14. | |
platform.py | File | 47214 bytes | July 01 2025 22:09:53. | |
plistlib.py | File | 32291 bytes | July 01 2025 22:09:53. | |
poplib.py | File | 14964 bytes | December 23 2018 21:37:14. | |
posixpath.py | File | 16324 bytes | July 01 2025 22:09:53. | |
pprint.py | File | 20860 bytes | December 23 2018 21:37:14. | |
profile.py | File | 22029 bytes | December 23 2018 21:37:14. | |
pstats.py | File | 26564 bytes | December 23 2018 21:37:14. | |
pty.py | File | 4763 bytes | December 23 2018 21:37:14. | |
py_compile.py | File | 7181 bytes | December 23 2018 21:37:14. | |
pyclbr.py | File | 13558 bytes | December 23 2018 21:37:14. | |
pydoc.py | File | 103501 bytes | July 01 2025 22:14:42. | |
queue.py | File | 8780 bytes | December 23 2018 21:37:14. | |
quopri.py | File | 7262 bytes | December 23 2018 21:37:14. | |
random.py | File | 27442 bytes | December 23 2018 21:37:14. | |
re.py | File | 15552 bytes | December 23 2018 21:37:14. | |
reprlib.py | File | 5336 bytes | December 23 2018 21:37:14. | |
rlcompleter.py | File | 7097 bytes | December 23 2018 21:37:14. | |
runpy.py | File | 11959 bytes | December 23 2018 21:37:14. | |
sched.py | File | 6511 bytes | December 23 2018 21:37:14. | |
secrets.py | File | 2038 bytes | December 23 2018 21:37:14. | |
selectors.py | File | 19438 bytes | December 23 2018 21:37:14. | |
shelve.py | File | 8515 bytes | December 23 2018 21:37:14. | |
shlex.py | File | 12956 bytes | December 23 2018 21:37:14. | |
shutil.py | File | 40829 bytes | July 01 2025 22:09:53. | |
signal.py | File | 2123 bytes | December 23 2018 21:37:14. | |
site.py | File | 21268 bytes | July 01 2025 22:09:53. | |
smtpd.py | File | 34719 bytes | December 23 2018 21:37:14. | |
smtplib.py | File | 44218 bytes | December 23 2018 21:37:14. | |
sndhdr.py | File | 7088 bytes | December 23 2018 21:37:14. | |
socket.py | File | 27443 bytes | December 23 2018 21:37:14. | |
socketserver.py | File | 27010 bytes | December 23 2018 21:37:14. | |
sre_compile.py | File | 19338 bytes | December 23 2018 21:37:14. | |
sre_constants.py | File | 6821 bytes | December 23 2018 21:37:14. | |
sre_parse.py | File | 36536 bytes | December 23 2018 21:37:14. | |
ssl.py | File | 44509 bytes | July 01 2025 22:09:53. | |
stat.py | File | 5038 bytes | December 23 2018 21:37:14. | |
statistics.py | File | 20673 bytes | December 23 2018 21:37:14. | |
string.py | File | 11795 bytes | December 23 2018 21:37:14. | |
stringprep.py | File | 12917 bytes | December 23 2018 21:37:14. | |
struct.py | File | 257 bytes | December 23 2018 21:37:14. | |
subprocess.py | File | 62339 bytes | December 23 2018 21:37:14. | |
sunau.py | File | 18095 bytes | December 23 2018 21:37:14. | |
symbol.py | File | 2119 bytes | December 23 2018 21:37:14. | |
symtable.py | File | 7277 bytes | December 23 2018 21:37:14. | |
sysconfig.py | File | 24876 bytes | July 01 2025 22:14:40. | |
tabnanny.py | File | 11411 bytes | December 23 2018 21:37:14. | |
tarfile.py | File | 111510 bytes | July 01 2025 22:09:53. | |
telnetlib.py | File | 23136 bytes | December 23 2018 21:37:14. | |
tempfile.py | File | 28066 bytes | July 01 2025 22:09:53. | |
textwrap.py | File | 19558 bytes | December 23 2018 21:37:14. | |
this.py | File | 1003 bytes | December 23 2018 21:37:14. | |
threading.py | File | 50136 bytes | July 01 2025 22:09:53. | |
timeit.py | File | 13342 bytes | December 23 2018 21:37:14. | |
token.py | File | 3075 bytes | December 23 2018 21:37:14. | |
tokenize.py | File | 29496 bytes | December 23 2018 21:37:14. | |
trace.py | File | 28733 bytes | December 23 2018 21:37:14. | |
traceback.py | File | 23458 bytes | December 23 2018 21:37:14. | |
tracemalloc.py | File | 16658 bytes | December 23 2018 21:37:14. | |
tty.py | File | 879 bytes | December 23 2018 21:37:14. | |
types.py | File | 8870 bytes | December 23 2018 21:37:14. | |
typing.py | File | 80274 bytes | December 23 2018 21:37:14. | |
uu.py | File | 6763 bytes | December 23 2018 21:37:14. | |
uuid.py | File | 24020 bytes | July 01 2025 22:09:53. | |
warnings.py | File | 18488 bytes | December 23 2018 21:37:14. | |
wave.py | File | 17709 bytes | December 23 2018 21:37:14. | |
weakref.py | File | 20466 bytes | December 23 2018 21:37:14. | |
webbrowser.py | File | 21767 bytes | December 23 2018 21:37:14. | |
xdrlib.py | File | 5913 bytes | December 23 2018 21:37:14. | |
zipapp.py | File | 7157 bytes | December 23 2018 21:37:14. | |
zipfile.py | File | 79924 bytes | July 01 2025 22:09:53. |
"""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