Some regression because of new algorithm
svn: r2968
This commit is contained in:
parent
1c685517c5
commit
b8075b283f
@ -189,6 +189,8 @@ def append_to_paragraph(paragraph,directive,text):
|
|||||||
directive - what to do with this piece
|
directive - what to do with this piece
|
||||||
text - the text of the corresponding piece
|
text - the text of the corresponding piece
|
||||||
"""
|
"""
|
||||||
|
if not directive and not text:
|
||||||
|
return
|
||||||
text_list = text.split('\n')
|
text_list = text.split('\n')
|
||||||
for the_text in text_list[:-1]:
|
for the_text in text_list[:-1]:
|
||||||
paragraph.add_piece(directive,the_text)
|
paragraph.add_piece(directive,the_text)
|
||||||
@ -215,7 +217,8 @@ class GnomePrintParagraph:
|
|||||||
self.style = paragraph_style
|
self.style = paragraph_style
|
||||||
self.fontstyle = self.style.get_font()
|
self.fontstyle = self.style.get_font()
|
||||||
self.piece_list = []
|
self.piece_list = []
|
||||||
self.lines = []
|
self.lines = []
|
||||||
|
self.height = None
|
||||||
|
|
||||||
def add_piece(self,directive,text):
|
def add_piece(self,directive,text):
|
||||||
"""
|
"""
|
||||||
@ -285,16 +288,31 @@ class GnomePrintParagraph:
|
|||||||
return max_word_size
|
return max_word_size
|
||||||
|
|
||||||
def get_height(self,width):
|
def get_height(self,width):
|
||||||
|
if not self.lines:
|
||||||
|
self.format(width)
|
||||||
|
return self.height
|
||||||
|
|
||||||
|
def format(self,width):
|
||||||
"""
|
"""
|
||||||
Determine the height the paragraph would have
|
Determine the height the paragraph would have
|
||||||
if formatted for a given width.
|
if formatted for a given width.
|
||||||
|
|
||||||
width - required formatting width
|
width - required formatting width
|
||||||
"""
|
"""
|
||||||
nlines = 0
|
|
||||||
|
if self.lines:
|
||||||
|
return
|
||||||
|
|
||||||
|
nlines = 1
|
||||||
avail_width = width
|
avail_width = width
|
||||||
|
|
||||||
|
start_piece = end_piece = start_word = end_word = 0
|
||||||
|
|
||||||
for (directive,text) in self.piece_list:
|
for piece_num in range(len(self.piece_list)):
|
||||||
|
end_piece = piece_num
|
||||||
|
|
||||||
|
(directive,text) = self.piece_list[piece_num]
|
||||||
|
|
||||||
fontstyle = BaseDoc.FontStyle(self.fontstyle)
|
fontstyle = BaseDoc.FontStyle(self.fontstyle)
|
||||||
if directive == _BOLD:
|
if directive == _BOLD:
|
||||||
fontstyle.set_bold(1)
|
fontstyle.set_bold(1)
|
||||||
@ -304,27 +322,40 @@ class GnomePrintParagraph:
|
|||||||
|
|
||||||
if text and avail_width > get_text_width(text,fontstyle):
|
if text and avail_width > get_text_width(text,fontstyle):
|
||||||
avail_width -= get_text_width(text,fontstyle)
|
avail_width -= get_text_width(text,fontstyle)
|
||||||
|
end_word = len(text.split())
|
||||||
elif directive == _LINE_BREAK:
|
elif directive == _LINE_BREAK:
|
||||||
nlines += 1
|
nlines += 1
|
||||||
|
end_word = 0
|
||||||
|
self.lines.append((start_piece,start_word,end_piece,end_word,avail_width))
|
||||||
avail_width = width
|
avail_width = width
|
||||||
|
start_piece = end_piece
|
||||||
|
start_word = 0
|
||||||
elif text and avail_width <= get_text_width(text,fontstyle):
|
elif text and avail_width <= get_text_width(text,fontstyle):
|
||||||
#divide up text and print
|
# divide up text
|
||||||
textlist = text.split()
|
textlist = text.split()
|
||||||
the_text = ""
|
the_text = ""
|
||||||
for element in textlist:
|
for word_num in range(len(textlist)):
|
||||||
if get_text_width(the_text + element + " ",fontstyle) < avail_width:
|
word = textlist[word_num]
|
||||||
the_text = the_text + element + " "
|
if get_text_width(the_text + word + " ",fontstyle) <= avail_width:
|
||||||
|
the_text = the_text + word + " "
|
||||||
else:
|
else:
|
||||||
# the_text contains as much as avail_width allows
|
# the_text contains as much as avail_width allows
|
||||||
nlines += 1
|
nlines += 1
|
||||||
the_text = element + " "
|
end_word = word_num
|
||||||
|
avail_width -= get_text_width(the_text,fontstyle)
|
||||||
|
self.lines.append((start_piece,start_word,end_piece,end_word,avail_width))
|
||||||
avail_width = width
|
avail_width = width
|
||||||
|
the_text = word + " "
|
||||||
|
start_piece = end_piece
|
||||||
|
start_word = word_num
|
||||||
|
|
||||||
# if the_text still contains data, we will want to print it out
|
# if the_text still contains data, we will want to print it out
|
||||||
if the_text:
|
if the_text:
|
||||||
avail_width = width - get_text_width(the_text,fontstyle)
|
avail_width = width - get_text_width(the_text,fontstyle)
|
||||||
|
end_word = len(textlist)
|
||||||
|
|
||||||
return nlines * _LINE_SPACING
|
self.lines.append((start_piece,start_word,end_piece,end_word,avail_width))
|
||||||
|
self.height = nlines * _LINE_SPACING
|
||||||
|
|
||||||
|
|
||||||
#------------------------------------------------------------------------
|
#------------------------------------------------------------------------
|
||||||
@ -431,7 +462,7 @@ class LPRDoc(BaseDoc.BaseDoc):
|
|||||||
# paragraph not in table: write it right away
|
# paragraph not in table: write it right away
|
||||||
self.__x, self.__y = self.write_paragraph(self.paragraph,
|
self.__x, self.__y = self.write_paragraph(self.paragraph,
|
||||||
self.__x, self.__y,
|
self.__x, self.__y,
|
||||||
self.left_margin, self.right_margin)
|
self.right_margin - self.left_margin)
|
||||||
self.__y = self.__advance_line(self.__y)
|
self.__y = self.__advance_line(self.__y)
|
||||||
self.paragraph = None
|
self.paragraph = None
|
||||||
|
|
||||||
@ -654,7 +685,7 @@ class LPRDoc(BaseDoc.BaseDoc):
|
|||||||
self.__x = x
|
self.__x = x
|
||||||
return new_y
|
return new_y
|
||||||
|
|
||||||
def write_paragraph(self,paragraph,x,y,left_margin,right_margin):
|
def write_paragraph(self,paragraph,x,y,width):
|
||||||
"""
|
"""
|
||||||
Write the contents of the paragraph, observing per-piece info.
|
Write the contents of the paragraph, observing per-piece info.
|
||||||
|
|
||||||
@ -662,90 +693,134 @@ class LPRDoc(BaseDoc.BaseDoc):
|
|||||||
x,y - coordinates to start at
|
x,y - coordinates to start at
|
||||||
left_margin,right_margin - boundaries to obey
|
left_margin,right_margin - boundaries to obey
|
||||||
"""
|
"""
|
||||||
width = right_margin - left_margin
|
|
||||||
avail_width = width
|
left_margin = x
|
||||||
|
paragraph.format(width)
|
||||||
|
|
||||||
if y - _LINE_SPACING < self.bottom_margin:
|
if y - _LINE_SPACING < self.bottom_margin:
|
||||||
self.end_page()
|
self.end_page()
|
||||||
self.start_page()
|
self.start_page()
|
||||||
x = self.__x
|
x = left_margin
|
||||||
y = self.__y
|
y = self.__y
|
||||||
|
|
||||||
x = left_margin
|
for (start_piece,start_word,end_piece,end_word,avail_width) \
|
||||||
|
in paragraph.lines:
|
||||||
for (directive,text) in paragraph.get_piece_list():
|
|
||||||
fontstyle = BaseDoc.FontStyle(paragraph.get_fontstyle())
|
if not paragraph.get_piece_list():
|
||||||
if directive == _BOLD:
|
|
||||||
fontstyle.set_bold(1)
|
|
||||||
elif directive == _SUPER:
|
|
||||||
size = fontstyle.get_size()
|
|
||||||
fontstyle.set_size(size-2)
|
|
||||||
y = y + 0.25 * _LINE_SPACING
|
|
||||||
elif directive == _LINE_BREAK:
|
|
||||||
y = self.__advance_line(y)
|
|
||||||
x = left_margin
|
|
||||||
avail_width = width
|
|
||||||
continue
|
continue
|
||||||
|
|
||||||
#all text will fit within the width provided
|
if paragraph.get_alignment() == BaseDoc.PARA_ALIGN_CENTER:
|
||||||
if not text:
|
x = x + 0.5 * avail_width
|
||||||
if directive == _SUPER:
|
elif paragraph.get_alignment() == BaseDoc.PARA_ALIGN_RIGHT:
|
||||||
y = y - 0.25 * _LINE_SPACING
|
x = x + avail_width
|
||||||
continue
|
elif paragraph.get_alignment() == BaseDoc.PARA_ALIGN_LEFT:
|
||||||
if avail_width >= get_text_width(text,fontstyle):
|
pass
|
||||||
avail_width -= get_text_width(text,fontstyle)
|
elif paragraph.get_alignment() == BaseDoc.PARA_ALIGN_JUSTIFY:
|
||||||
if paragraph.get_alignment() == BaseDoc.PARA_ALIGN_CENTER:
|
print "Paragraph justification not supported."
|
||||||
x = x + 0.5 * avail_width
|
print "Falling back to left-justified mode."
|
||||||
elif paragraph.get_alignment() == BaseDoc.PARA_ALIGN_RIGHT:
|
|
||||||
x = x + avail_width
|
for piece_num in range(start_piece,end_piece+1):
|
||||||
elif paragraph.get_alignment() == BaseDoc.PARA_ALIGN_LEFT:
|
(directive,text) = paragraph.get_piece_list()[piece_num]
|
||||||
pass
|
fontstyle = BaseDoc.FontStyle(paragraph.get_fontstyle())
|
||||||
elif paragraph.get_alignment() == BaseDoc.PARA_ALIGN_JUSTIFY:
|
if directive == _BOLD:
|
||||||
|
fontstyle.set_bold(1)
|
||||||
|
elif directive == _SUPER:
|
||||||
|
size = fontstyle.get_size()
|
||||||
|
fontstyle.set_size(size-2)
|
||||||
|
y = y + 0.25 * _LINE_SPACING
|
||||||
|
|
||||||
|
textlist = text.split()
|
||||||
|
if start_piece == end_piece:
|
||||||
|
the_textlist = textlist[start_word:end_word]
|
||||||
|
elif piece_num > start_piece and piece_num < end_piece:
|
||||||
|
the_textlist = textlist[:]
|
||||||
|
elif piece_num == start_piece:
|
||||||
|
the_textlist = textlist[start_word:]
|
||||||
|
elif piece_num == end_piece:
|
||||||
|
the_textlist = textlist[:end_word]
|
||||||
|
else:
|
||||||
|
print "ERROR!!!"
|
||||||
|
return
|
||||||
|
|
||||||
|
the_text = string.join(the_textlist)
|
||||||
|
if piece_num == start_piece \
|
||||||
|
or directive == _SUPER \
|
||||||
|
or directive == _LINE_BREAK \
|
||||||
|
or (the_text and the_text[0] == '.'):
|
||||||
pass
|
pass
|
||||||
|
else:
|
||||||
|
the_text = " " + 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)
|
||||||
self.__pc.show(text)
|
self.__pc.show(the_text)
|
||||||
x = x + get_text_width(text,fontstyle)
|
x = x + get_text_width(the_text,fontstyle)
|
||||||
else:
|
if directive == _SUPER:
|
||||||
#divide up text and print
|
y = y - 0.25 * _LINE_SPACING
|
||||||
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
|
y = self.__advance_line(y)
|
||||||
if (not self.__in_table) and (y < self.bottom_margin):
|
x = left_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)
|
|
||||||
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
|
||||||
@ -780,21 +855,21 @@ class LPRDoc(BaseDoc.BaseDoc):
|
|||||||
#output data in table
|
#output data in table
|
||||||
for __row_num in range(len(self.__table_data)):
|
for __row_num in range(len(self.__table_data)):
|
||||||
__row = self.__table_data[__row_num]
|
__row = self.__table_data[__row_num]
|
||||||
__x = self.left_margin #reset so that x is at margin
|
|
||||||
# If this row puts us below the bottom, start new page here
|
# If this row puts us below the bottom, start new page here
|
||||||
if self.__y - __max_vspace[__row_num] < self.bottom_margin:
|
if self.__y - __max_vspace[__row_num] < self.bottom_margin:
|
||||||
self.end_page()
|
self.end_page()
|
||||||
self.start_page()
|
self.start_page()
|
||||||
|
|
||||||
|
__x = self.left_margin #reset so that x is at margin
|
||||||
col_y = self.__y # all columns start at the same height
|
col_y = self.__y # all columns start at the same height
|
||||||
for __col in range(self.__ncols):
|
for __col in range(self.__ncols):
|
||||||
if not self.__cell_widths[__row_num][__col]:
|
if not self.__cell_widths[__row_num][__col]:
|
||||||
continue
|
continue
|
||||||
self.__y = col_y
|
self.__y = col_y
|
||||||
for paragraph in __row[__col]:
|
for paragraph in __row[__col]:
|
||||||
__nothing, self.__y = self.write_paragraph(paragraph,
|
junk, self.__y = self.write_paragraph(paragraph,
|
||||||
self.__x, self.__y, __x,
|
__x, self.__y,
|
||||||
__x + 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
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user