* src/docgen/LPRDoc.py: New paragraph formatting algorithm.
Proper alignment support (no implementation for justify yet). svn: r2969
This commit is contained in:
parent
e00ab4b350
commit
0d8ab3f31f
@ -1,3 +1,7 @@
|
|||||||
|
2004-03-04 Alex Roitman <shura@alex.neuro.umn.edu>
|
||||||
|
* src/docgen/LPRDoc.py: New paragraph formatting algorithm.
|
||||||
|
Proper alignment support (no implementation for justify yet).
|
||||||
|
|
||||||
2004-03-03 Alex Roitman <shura@alex.neuro.umn.edu>
|
2004-03-03 Alex Roitman <shura@alex.neuro.umn.edu>
|
||||||
* src/docgen/LPRDoc.py: Superscript support, line breaks,
|
* src/docgen/LPRDoc.py: Superscript support, line breaks,
|
||||||
page breaks, paragraph leader, dirty alignment hack.
|
page breaks, paragraph leader, dirty alignment hack.
|
||||||
|
@ -288,14 +288,22 @@ class GnomePrintParagraph:
|
|||||||
return max_word_size
|
return max_word_size
|
||||||
|
|
||||||
def get_height(self,width):
|
def get_height(self,width):
|
||||||
|
"""
|
||||||
|
Determine the height the paragraph would have
|
||||||
|
if formatted for a given width.
|
||||||
|
|
||||||
|
width - required formatting width
|
||||||
|
"""
|
||||||
if not self.lines:
|
if not self.lines:
|
||||||
self.format(width)
|
self.format(width)
|
||||||
return self.height
|
return self.height
|
||||||
|
|
||||||
def format(self,width):
|
def format(self,width):
|
||||||
"""
|
"""
|
||||||
Determine the height the paragraph would have
|
Format the paragraph for a given width.
|
||||||
if formatted for a given width.
|
This is a complex procedure. It assembles lines from the paragraph's
|
||||||
|
pieces. It also sets the height of the whole paragraph and
|
||||||
|
the widths available after the lines are assembled.
|
||||||
|
|
||||||
width - required formatting width
|
width - required formatting width
|
||||||
"""
|
"""
|
||||||
@ -694,7 +702,11 @@ class LPRDoc(BaseDoc.BaseDoc):
|
|||||||
left_margin,right_margin - boundaries to obey
|
left_margin,right_margin - boundaries to obey
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
if not paragraph.get_piece_list():
|
||||||
|
return (x,y)
|
||||||
|
|
||||||
left_margin = x
|
left_margin = x
|
||||||
|
no_space = 0
|
||||||
paragraph.format(width)
|
paragraph.format(width)
|
||||||
|
|
||||||
if y - _LINE_SPACING < self.bottom_margin:
|
if y - _LINE_SPACING < self.bottom_margin:
|
||||||
@ -703,12 +715,10 @@ class LPRDoc(BaseDoc.BaseDoc):
|
|||||||
x = left_margin
|
x = left_margin
|
||||||
y = self.__y
|
y = self.__y
|
||||||
|
|
||||||
|
# Loop over lines which were assembled by paragraph.format()
|
||||||
for (start_piece,start_word,end_piece,end_word,avail_width) \
|
for (start_piece,start_word,end_piece,end_word,avail_width) \
|
||||||
in paragraph.lines:
|
in paragraph.lines:
|
||||||
|
|
||||||
if not paragraph.get_piece_list():
|
|
||||||
continue
|
|
||||||
|
|
||||||
if paragraph.get_alignment() == BaseDoc.PARA_ALIGN_CENTER:
|
if paragraph.get_alignment() == BaseDoc.PARA_ALIGN_CENTER:
|
||||||
x = x + 0.5 * avail_width
|
x = x + 0.5 * avail_width
|
||||||
elif paragraph.get_alignment() == BaseDoc.PARA_ALIGN_RIGHT:
|
elif paragraph.get_alignment() == BaseDoc.PARA_ALIGN_RIGHT:
|
||||||
@ -719,6 +729,7 @@ class LPRDoc(BaseDoc.BaseDoc):
|
|||||||
print "Paragraph justification not supported."
|
print "Paragraph justification not supported."
|
||||||
print "Falling back to left-justified mode."
|
print "Falling back to left-justified mode."
|
||||||
|
|
||||||
|
# Loop over pieces that constitute the line
|
||||||
for piece_num in range(start_piece,end_piece+1):
|
for piece_num in range(start_piece,end_piece+1):
|
||||||
(directive,text) = paragraph.get_piece_list()[piece_num]
|
(directive,text) = paragraph.get_piece_list()[piece_num]
|
||||||
fontstyle = BaseDoc.FontStyle(paragraph.get_fontstyle())
|
fontstyle = BaseDoc.FontStyle(paragraph.get_fontstyle())
|
||||||
@ -738,18 +749,16 @@ class LPRDoc(BaseDoc.BaseDoc):
|
|||||||
the_textlist = textlist[start_word:]
|
the_textlist = textlist[start_word:]
|
||||||
elif piece_num == end_piece:
|
elif piece_num == end_piece:
|
||||||
the_textlist = textlist[:end_word]
|
the_textlist = textlist[:end_word]
|
||||||
else:
|
|
||||||
print "ERROR!!!"
|
|
||||||
return
|
|
||||||
|
|
||||||
the_text = string.join(the_textlist)
|
the_text = string.join(the_textlist)
|
||||||
if piece_num == start_piece \
|
if piece_num == start_piece \
|
||||||
or directive == _SUPER \
|
or directive == _SUPER \
|
||||||
or directive == _LINE_BREAK \
|
or no_space \
|
||||||
or (the_text and the_text[0] == '.'):
|
or (the_text and the_text[0] in string.punctuation):
|
||||||
pass
|
spacer = ""
|
||||||
else:
|
else:
|
||||||
the_text = " " + the_text
|
spacer = " "
|
||||||
|
the_text = spacer + the_text
|
||||||
|
|
||||||
self.__pc.setfont(find_font_from_fontstyle(fontstyle))
|
self.__pc.setfont(find_font_from_fontstyle(fontstyle))
|
||||||
self.__pc.moveto(x, y)
|
self.__pc.moveto(x, y)
|
||||||
@ -758,69 +767,17 @@ class LPRDoc(BaseDoc.BaseDoc):
|
|||||||
if directive == _SUPER:
|
if directive == _SUPER:
|
||||||
y = y - 0.25 * _LINE_SPACING
|
y = y - 0.25 * _LINE_SPACING
|
||||||
|
|
||||||
|
# If this was the linebreak, no space on the next line's start
|
||||||
|
if end_word:
|
||||||
|
no_space = 0
|
||||||
|
else:
|
||||||
|
no_space = 1
|
||||||
|
|
||||||
y = self.__advance_line(y)
|
y = self.__advance_line(y)
|
||||||
x = left_margin
|
x = left_margin
|
||||||
|
|
||||||
return (x,y)
|
return (x,y)
|
||||||
|
|
||||||
# #all text will fit within the width provided
|
|
||||||
# if not text:
|
|
||||||
# if directive == _SUPER:
|
|
||||||
# y = y - 0.25 * _LINE_SPACING
|
|
||||||
# continue
|
|
||||||
# if avail_width >= get_text_width(text,fontstyle):
|
|
||||||
# avail_width -= get_text_width(text,fontstyle)
|
|
||||||
# if paragraph.get_alignment() == BaseDoc.PARA_ALIGN_CENTER:
|
|
||||||
# x = x + 0.5 * avail_width
|
|
||||||
# elif paragraph.get_alignment() == BaseDoc.PARA_ALIGN_RIGHT:
|
|
||||||
# x = x + avail_width
|
|
||||||
# elif paragraph.get_alignment() == BaseDoc.PARA_ALIGN_LEFT:
|
|
||||||
# pass
|
|
||||||
# elif paragraph.get_alignment() == BaseDoc.PARA_ALIGN_JUSTIFY:
|
|
||||||
# pass
|
|
||||||
#
|
|
||||||
# self.__pc.setfont(find_font_from_fontstyle(fontstyle))
|
|
||||||
# self.__pc.moveto(x, y)
|
|
||||||
# self.__pc.show(text)
|
|
||||||
# x = x + get_text_width(text,fontstyle)
|
|
||||||
# else:
|
|
||||||
# #divide up text and print
|
|
||||||
# if x == left_margin or directive == _SUPER \
|
|
||||||
# or text[0] == '.':
|
|
||||||
# the_text = ""
|
|
||||||
# else:
|
|
||||||
# the_text = " "
|
|
||||||
# for element in text.split():
|
|
||||||
# if get_text_width(the_text + element + " ",fontstyle) < avail_width:
|
|
||||||
# the_text = the_text + element + " "
|
|
||||||
# else:
|
|
||||||
# # the_text contains as much as avail_width allows
|
|
||||||
# self.__pc.setfont(find_font_from_fontstyle(fontstyle))
|
|
||||||
# self.__pc.moveto(x, y)
|
|
||||||
# self.__pc.show(the_text)
|
|
||||||
# the_text = element + " "
|
|
||||||
# y = self.__advance_line(y)
|
|
||||||
# x = left_margin
|
|
||||||
# avail_width = width
|
|
||||||
#
|
|
||||||
# #if not in table and cursor is below bottom margin
|
|
||||||
# if (not self.__in_table) and (y < self.bottom_margin):
|
|
||||||
# self.end_page()
|
|
||||||
# self.start_page()
|
|
||||||
# x = self.__x
|
|
||||||
# y = self.__y
|
|
||||||
#
|
|
||||||
# #if __text still contains data, we will want to print it out
|
|
||||||
# if the_text:
|
|
||||||
# self.__pc.setfont(find_font_from_fontstyle(fontstyle))
|
|
||||||
# self.__pc.moveto(left_margin, y)
|
|
||||||
# self.__pc.show(the_text)
|
|
||||||
# x = x + get_text_width(the_text,fontstyle)
|
|
||||||
# avail_width = width - get_text_width(the_text,fontstyle)
|
|
||||||
# if directive == _SUPER:
|
|
||||||
# y = y - 0.25 * _LINE_SPACING
|
|
||||||
# y = self.__advance_line(y)
|
|
||||||
|
|
||||||
def __output_table(self):
|
def __output_table(self):
|
||||||
"""do calcs on data in table and output data in a formatted way"""
|
"""do calcs on data in table and output data in a formatted way"""
|
||||||
__min_col_size = [0] * self.__ncols
|
__min_col_size = [0] * self.__ncols
|
||||||
@ -833,12 +790,13 @@ class LPRDoc(BaseDoc.BaseDoc):
|
|||||||
if not self.__cell_widths[__row_num][__col]:
|
if not self.__cell_widths[__row_num][__col]:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
__max = 0
|
||||||
for paragraph in __row[__col]:
|
for paragraph in __row[__col]:
|
||||||
__min = paragraph.get_min_width()
|
__min = paragraph.get_min_width()
|
||||||
if __min > __min_col_size[__col]:
|
if __min > __min_col_size[__col]:
|
||||||
__min_col_size[__col] = __min
|
__min_col_size[__col] = __min
|
||||||
|
|
||||||
__max = paragraph.get_height(
|
__max += paragraph.get_height(
|
||||||
self.__cell_widths[__row_num][__col])
|
self.__cell_widths[__row_num][__col])
|
||||||
if __max > __max_vspace[__row_num]:
|
if __max > __max_vspace[__row_num]:
|
||||||
__max_vspace[__row_num] = __max
|
__max_vspace[__row_num] = __max
|
||||||
@ -872,6 +830,7 @@ class LPRDoc(BaseDoc.BaseDoc):
|
|||||||
self.__cell_widths[__row_num][__col])
|
self.__cell_widths[__row_num][__col])
|
||||||
|
|
||||||
__x = __x + self.__cell_widths[__row_num][__col] # set up margin for this row
|
__x = __x + self.__cell_widths[__row_num][__col] # set up margin for this row
|
||||||
|
self.__y = col_y - __max_vspace[__row_num]
|
||||||
|
|
||||||
#function to print text to a printer
|
#function to print text to a printer
|
||||||
def __do_print(self,dialog, job):
|
def __do_print(self,dialog, job):
|
||||||
|
Loading…
Reference in New Issue
Block a user