LessDumbWriter
ben at co.and.co
ben at co.and.co
Fri Mar 24 15:44:14 EST 2000
I've been having fun with my first python-program ever.
As a side-effect, I hacked "formatter.DumbWriter" till I got something
that should be able to render html-lists.
Have fun.
P.S. Can somebody please change the tutorial.
The first line should read: "You can't mix spaces and tabs in
python", in Times 20 pt bold, and the next line should read
"This will most likely happen if you cut and paste in your editor"
in a bigger font. Would have saved me 2 hours.
#!/usr/bin/env python
from formatter import *
class LessDumbWriter(NullWriter):
def __init__(self, file=None, maxcol=72, margin_width=4, margin_char=' '):
self.file = file or sys.stdout
self.maxcol = maxcol
self.m_width = margin_width
self.m_char = margin_char
NullWriter.__init__(self)
self.reset()
def reset(self):
self.col = 0
self.atbreak = 0
self.m_level = 0
self.atmargin = 0
def new_line(self, no_lines=1):
self.file.write('\n' * no_lines)
self.col = 0
self.atbreak = 0
self.atmargin = 1
def normal_margin(self):
if self.m_level:
self.file.write(self.m_char * (self.m_width * self.m_level))
self.col = self.m_width * self.m_level
self.atmargin = 0
def send_paragraph(self, blankline):
self.new_line(blankline)
def send_line_break(self):
self.new_line()
def send_hor_rule(self, *args, **kw):
self.new_line()
self.normal_margin()
self.file.write('-' * self.maxcol)
self.new_line()
def send_literal_data(self, data):
if not data: return
if self.atmargin: self.normal_margin()
lines = string.split(string.expandtabs(data), '\n')
for line in lines[:-2]:
self.file.write(line)
self.new_line()
self.normal_margin()
self.file.write(lines[-2])
if data[-1] == '\n':
self.new_line()
else:
self.col = self.col + len(lines[-2])
def send_flowing_data(self, data):
if not data: return
self.atbreak = self.atbreak or data[0] in string.whitespace
for word in string.split(data):
if self.atbreak:
if self.col + len(word) >= self.maxcol:
self.new_line()
else:
self.file.write(' ')
self.col = self.col + 1
if self.atmargin:
self.normal_margin()
self.file.write(word)
self.col = self.col + len(word)
self.atbreak = 1
self.atbreak = data[-1] in string.whitespace
def new_margin(self, which_margin, level):
self.m_level = level
if self.m_level < 0: self.m_level = 0
def send_label_data(self, data):
if not self.atmargin:
self.new_line()
if self.m_level > 1:
level = self.m_level - 1
self.file.write(self.m_char * (self.m_width * level))
self.col = level * self.m_width
l = len(data)
if l > self.m_width:
self.file.write(data)
self.col = self.col + l
else:
if l < self.m_width:
self.file.write(string.rjust(data, self.m_width - 1))
self.file.write(' ')
else:
self.file.write(data)
self.col = self.col + self.m_width
self.atmargin = 0
Greetings,
--
ben . de . rydt at pandora . be ------------------ your comments
http://users.pandora.be/bdr/ ------- inl. IPv6, Linux en Pandora
More information about the Python-list
mailing list