2707: Add markup notes to html output: div and class elements

svn: r12647
This commit is contained in:
Benny Malengier 2009-06-09 20:47:32 +00:00
parent a2e8436da8
commit e4de221227
2 changed files with 81 additions and 20 deletions

View File

@ -68,6 +68,14 @@ class HtmlDoc(BaseDoc, TextDoc):
"""Implementation of the BaseDoc and TextDoc gen.plug.docgen api for the """Implementation of the BaseDoc and TextDoc gen.plug.docgen api for the
creation of Html files. This is achieved by writing on a HtmlBackend creation of Html files. This is achieved by writing on a HtmlBackend
object object
div id's defined here:
id="grampstextdoc" : the entire text report
id="grampsheading" : a small defined heading, but not h1 to h6 !
id="grampsstylednote" : start of part with a styled note, divided in
paragraphs
id="grampsnote" : start of part with a note. This id is normally not
used
""" """
def __init__(self, styles, paper_style): def __init__(self, styles, paper_style):
@ -80,6 +88,8 @@ class HtmlDoc(BaseDoc, TextDoc):
self._col = 0 self._col = 0
self._tbl = None self._tbl = None
self._empty = 1 self._empty = 1
self.title = ''
self.__title_written = -1 # -1 = not written, 0 = writing, 1 = written
def set_css_filename(self, css_filename): def set_css_filename(self, css_filename):
""" """
@ -93,9 +103,10 @@ class HtmlDoc(BaseDoc, TextDoc):
Overwrite base method Overwrite base method
""" """
self._backend = HtmlBackend(filename) self._backend = HtmlBackend(filename)
#self._backend.set_title(....)
self._backend.open() self._backend.open()
self.htmllist += [self._backend.html_body] self.htmllist += [self._backend.html_body]
#start a gramps report
self.htmllist += [Html('div', id="grampstextdoc")]
self.build_header() self.build_header()
@ -145,7 +156,7 @@ class HtmlDoc(BaseDoc, TextDoc):
left = 'thin solid #000000' left = 'thin solid #000000'
if style.get_right_border(): if style.get_right_border():
right = 'thin solid #000000' right = 'thin solid #000000'
text.append('.%s {\n' text.append('#grampstextdoc .%s {\n'
'\tpadding: %s %s %s %s;\n' '\tpadding: %s %s %s %s;\n'
'\tborder-top:%s; border-bottom:%s;\n' '\tborder-top:%s; border-bottom:%s;\n'
'\tborder-left:%s; border-right:%s;\n}' '\tborder-left:%s; border-right:%s;\n}'
@ -156,7 +167,7 @@ class HtmlDoc(BaseDoc, TextDoc):
style = styles.get_paragraph_style(style_name) style = styles.get_paragraph_style(style_name)
font = style.get_font() font = style.get_font()
font_size = font.get_size() font_size = font.get_size()
font_color = '#%02x%02x%02x' % font.get_color() #font_color = '#%02x%02x%02x' % font.get_color()
align = style.get_alignment_text() align = style.get_alignment_text()
text_indent = "%.2f" % style.get_first_indent() text_indent = "%.2f" % style.get_first_indent()
right_margin = "%.2f" % style.get_right_margin() right_margin = "%.2f" % style.get_right_margin()
@ -179,25 +190,27 @@ class HtmlDoc(BaseDoc, TextDoc):
italic = 'font-style:italic; ' italic = 'font-style:italic; '
if font.get_bold(): if font.get_bold():
bold = 'font-weight:bold; ' bold = 'font-weight:bold; '
if font.get_type_face() == FONT_SANS_SERIF: #if font.get_type_face() == FONT_SANS_SERIF:
family = '"Helvetica","Arial","sans-serif"' # family = '"Helvetica","Arial","sans-serif"'
else: #else:
family = '"Times New Roman","Times","serif"' # family = '"Times New Roman","Times","serif"'
# do not allow color, set in base css !
text.append('.%s {\n' # so no : 'color: %s' % font_color
'\tfont-size: %dpt; color: %s;\n' # so no : 'font-family:%s;' % family
text.append('#grampstextdoc .%s {\n'
'\tfont-size: %dpt;\n'
'\ttext-align: %s; text-indent: %scm;\n' '\ttext-align: %s; text-indent: %scm;\n'
'\tmargin-right: %scm; margin-left: %scm;\n' '\tmargin-right: %scm; margin-left: %scm;\n'
'\tmargin-top: %scm; margin-bottom: %scm;\n' '\tmargin-top: %scm; margin-bottom: %scm;\n'
'\tborder-top:%s; border-bottom:%s;\n' '\tborder-top:%s; border-bottom:%s;\n'
'\tborder-left:%s; border-right:%s;\n' '\tborder-left:%s; border-right:%s;\n'
'\t%s%sfont-family:%s;\n}' '\t%s%s\n}'
% (style_name, font_size, font_color, % (style_name, font_size,
align, text_indent, align, text_indent,
right_margin, left_margin, right_margin, left_margin,
top_margin, bottom_margin, top_margin, bottom_margin,
top, bottom, left, right, top, bottom, left, right,
italic, bold, family)) italic, bold))
text.append('-->\n</style>') text.append('-->\n</style>')
self.style_declaration = '\n'.join(text) self.style_declaration = '\n'.join(text)
@ -273,6 +286,8 @@ class HtmlDoc(BaseDoc, TextDoc):
""" """
if not markup: if not markup:
text = self._backend.ESCAPE_FUNC()(text) text = self._backend.ESCAPE_FUNC()(text)
if self.__title_written == 0 :
self.title += text
self.htmllist[-1] += text self.htmllist[-1] += text
def __empty_char(self): def __empty_char(self):
@ -289,7 +304,15 @@ class HtmlDoc(BaseDoc, TextDoc):
if text != "": if text != "":
self._empty = 0 self._empty = 0
self.__write_text(text, mark) self.__write_text(text, mark)
def write_title(self):
"""
Add title field to header
"""
self._backend.html_header += Html('title', self.title,
inline=True, indent=True)
def start_table(self, name, style): def start_table(self, name, style):
""" """
Overwrite base method Overwrite base method
@ -303,6 +326,7 @@ class HtmlDoc(BaseDoc, TextDoc):
""" """
Overwrite base method Overwrite base method
""" """
self.write_text('\n')
self.__reduce_list() self.__reduce_list()
def start_row(self): def start_row(self):
@ -316,6 +340,7 @@ class HtmlDoc(BaseDoc, TextDoc):
""" """
Overwrite base method Overwrite base method
""" """
self.write_text('\n')
self.__reduce_list() self.__reduce_list()
def start_cell(self, style_name, span=1): def start_cell(self, style_name, span=1):
@ -326,26 +351,47 @@ class HtmlDoc(BaseDoc, TextDoc):
#self.f.write('<td valign="top"') #self.f.write('<td valign="top"')
if span > 1: if span > 1:
self.htmllist += [Html('td', colspan=str(span), self.htmllist += [Html('td', colspan=str(span),
_class=style_name)] class_=style_name)]
self._col += span self._col += span
else: else:
self.htmllist += [Html('td', colspan=str(span), self.htmllist += [Html('td', colspan=str(span),
width=str(self._tbl.get_column_width( width=str(self._tbl.get_column_width(
self._col))+ '%%', self._col))+ '%%',
_class=style_name)] class_=style_name)]
self._col += 1 self._col += 1
def end_cell(self): def end_cell(self):
""" """
Overwrite base method Overwrite base method
""" """
self.write_text('\n')
self.__reduce_list() self.__reduce_list()
def start_paragraph(self, style_name, leader=None): def start_paragraph(self, style_name, leader=None):
""" """
Overwrite base method Overwrite base method
""" """
self.htmllist += [Html('p', _class=style_name)] style_sheet = self.get_style_sheet()
style = style_sheet.get_paragraph_style(style_name)
level = style.get_header_level()
if level == 0:
#a normal paragraph
self.htmllist += [Html('p', class_=style_name)]
elif level == 1:
if self.__title_written == -1 and \
style_name.upper().find('TITLE') != -1:
self.__title_written == 0
self.htmllist += [Html('div', id="header")]
self.htmllist += [Html('h1', id='SiteTitle')]
else:
self.htmllist += [Html('h1', class_=style_name)]
elif 2<= level <= 5:
tag = 'h'+str(level+1)
self.htmllist += [Html(tag, class_=style_name)]
else:
# a low level header
self.htmllist += [Html('div', id='grampsheading',
class_=style_name)]
if leader is not None: if leader is not None:
self.write_text(leader+' ') self.write_text(leader+' ')
@ -353,10 +399,16 @@ class HtmlDoc(BaseDoc, TextDoc):
""" """
Overwrite base method Overwrite base method
""" """
self.write_text('\n')
if self._empty == 1: if self._empty == 1:
self.__empty_char() self.__empty_char()
self._empty = 0 self._empty = 0
self.__reduce_list() self.__reduce_list()
if self.__title_written == 0:
self.__title_written = 1
#close div statement
self.__reduce_list()
self.write_title()
def start_bold(self): def start_bold(self):
""" """
@ -386,13 +438,15 @@ class HtmlDoc(BaseDoc, TextDoc):
""" """
Overwrite base method Overwrite base method
""" """
self.htmllist += [Html('div', id='grampsstylednote')]
if format == 1: if format == 1:
#preformatted, retain whitespace. #preformatted, retain whitespace.
# User should use write_styled_note for correct behavior, in this # User should use write_styled_note for correct behavior, in this
# more basic method we convert all to a monospace character # more basic method we convert all to a monospace character
self.htmllist += [Html('pre', _class=style_name, self.htmllist += [Html('pre', class_=style_name,
style = 'font-family: courier, monospace')] style = 'font-family: courier, monospace')]
self.write_text(text) self.write_text(text)
#end pre element
self.__reduce_list() self.__reduce_list()
elif format == 0: elif format == 0:
for line in text.split('\n\n'): for line in text.split('\n\n'):
@ -401,6 +455,8 @@ class HtmlDoc(BaseDoc, TextDoc):
self.end_paragraph() self.end_paragraph()
else: else:
raise NotImplementedError raise NotImplementedError
#end div element
self.__reduce_list()
def write_styled_note(self, styledtext, format, style_name): def write_styled_note(self, styledtext, format, style_name):
""" """
@ -415,17 +471,20 @@ class HtmlDoc(BaseDoc, TextDoc):
#FIXME: following split should be regex to match \n\s*\n instead? #FIXME: following split should be regex to match \n\s*\n instead?
markuptext = self._backend.add_markup_from_styled(text, s_tags, markuptext = self._backend.add_markup_from_styled(text, s_tags,
split='\n\n') split='\n\n')
self.htmllist += [Html('div', id='grampsstylednote')]
if format == 1: if format == 1:
#preformatted, retain whitespace. #preformatted, retain whitespace.
#so use \n\n for paragraph detection #so use \n\n for paragraph detection
#FIXME: following split should be regex to match \n\s*\n instead? #FIXME: following split should be regex to match \n\s*\n instead?
self.htmllist += [Html('pre')]
for line in markuptext.split('\n\n'): for line in markuptext.split('\n\n'):
self.start_paragraph(style_name) self.start_paragraph(style_name)
for realline in line.split('\n'): for realline in line.split('\n'):
self.__write_text(realline, markup=True) self.__write_text(realline, markup=True)
self.htmllist[-1] += Html('br') self.htmllist[-1] += Html('br')
self.end_paragraph() self.end_paragraph()
#end pre element
self.__reduce_list()
elif format == 0: elif format == 0:
#flowed #flowed
#FIXME: following split should be regex to match \n\s*\n instead? #FIXME: following split should be regex to match \n\s*\n instead?
@ -433,6 +492,8 @@ class HtmlDoc(BaseDoc, TextDoc):
self.start_paragraph(style_name) self.start_paragraph(style_name)
self.__write_text(line, markup=True) self.__write_text(line, markup=True)
self.end_paragraph() self.end_paragraph()
#end div element
self.__reduce_list()
def add_media_object(self, name, pos, w_cm, h_cm, alt=''): def add_media_object(self, name, pos, w_cm, h_cm, alt=''):
""" """

View File

@ -162,7 +162,7 @@ class HtmlBackend(DocBackend):
""" """
write out the html to the page write out the html to the page
""" """
self.html_page.write(self.__write) self.html_page.write(self.__write, indent='')
DocBackend.close(self) DocBackend.close(self)
def datadir(self): def datadir(self):