From 4750ab4816728a7b54c7b9f94b9e1e24cec05025 Mon Sep 17 00:00:00 2001 From: Peter Landgren Date: Sun, 19 Jun 2011 11:47:22 +0000 Subject: [PATCH] Endnotes improvment, see issue 4997 & 4998. svn: r17809 --- src/gen/plug/docgen/textdoc.py | 10 -- src/gen/plug/report/endnotes.py | 119 +++++++++++++----------- src/plugins/docgen/AsciiDoc.py | 11 +-- src/plugins/docgen/HtmlDoc.py | 16 ---- src/plugins/docgen/LaTeXDoc.py | 11 --- src/plugins/docgen/ODFDoc.py | 22 ----- src/plugins/docgen/RTFDoc.py | 15 --- src/plugins/lib/libcairodoc.py | 13 +-- src/plugins/textreport/IndivComplete.py | 18 +++- 9 files changed, 83 insertions(+), 152 deletions(-) diff --git a/src/gen/plug/docgen/textdoc.py b/src/gen/plug/docgen/textdoc.py index aeea87cb2..17129c73f 100644 --- a/src/gen/plug/docgen/textdoc.py +++ b/src/gen/plug/docgen/textdoc.py @@ -203,16 +203,6 @@ class TextDoc(object): """ raise NotImplementedError - def write_endnotes_ref(self, text, style_name, links=False): - """ - Writes the note's text and take care of paragraphs, - - @param text: text to write. - @param style_name: style to be used. - @param links: make URLs in the text clickable (if supported) - """ - raise NotImplementedError - def write_styled_note(self, styledtext, format, style_name, contains_html=False, links=False): """ diff --git a/src/gen/plug/report/endnotes.py b/src/gen/plug/report/endnotes.py index fc9f71fca..c1c6031a4 100644 --- a/src/gen/plug/report/endnotes.py +++ b/src/gen/plug/report/endnotes.py @@ -26,8 +26,9 @@ Provide utilities for printing endnotes in text reports. """ from gen.plug.docgen import FontStyle, ParagraphStyle, FONT_SANS_SERIF -from gen.lib import NoteType +from gen.lib import NoteType, SourceRef from gen.ggettext import gettext as _ +from Utils import confidence def add_endnote_styles(style_sheet): """ @@ -41,32 +42,38 @@ def add_endnote_styles(style_sheet): para = ParagraphStyle() para.set_font(font) para.set_header_level(2) - para.set_top_margin(0.25) - para.set_bottom_margin(0.25) + para.set_top_margin(0.2) + para.set_bottom_margin(0.2) para.set_description(_('The style used for the generation header.')) style_sheet.add_paragraph_style("Endnotes-Header", para) para = ParagraphStyle() para.set(first_indent=-0.75, lmargin=.75) - para.set_top_margin(0.25) - para.set_bottom_margin(0.25) + para.set_top_margin(0.2) + para.set_bottom_margin(0.0) para.set_description(_('The basic style used for the endnotes source display.')) style_sheet.add_paragraph_style("Endnotes-Source", para) + + para = ParagraphStyle() + para.set(lmargin=.75) + para.set_top_margin(0.2) + para.set_bottom_margin(0.0) + para.set_description(_('The basic style used for the endnotes notes display.')) + style_sheet.add_paragraph_style("Endnotes-Source-Notes", para) para = ParagraphStyle() para.set(first_indent=-0.9, lmargin=1.9) -# para.set(lmargin=1.5) - para.set_top_margin(0.25) - para.set_bottom_margin(0.25) + para.set_top_margin(0.2) + para.set_bottom_margin(0.0) para.set_description(_('The basic style used for the endnotes reference display.')) style_sheet.add_paragraph_style("Endnotes-Ref", para) para = ParagraphStyle() - para.set(lmargin=1.5) - para.set_top_margin(0.25) - para.set_bottom_margin(0.25) - para.set_description(_('The basic style used for the endnotes notes display.')) - style_sheet.add_paragraph_style("Endnotes-Notes", para) + para.set(lmargin=1.9) + para.set_top_margin(0.2) + para.set_bottom_margin(0.0) + para.set_description(_('The basic style used for the endnotes reference notes display.')) + style_sheet.add_paragraph_style("Endnotes-Ref-Notes", para) def cite_source(bibliography, obj): """ @@ -121,52 +128,19 @@ def write_endnotes(bibliography, database, doc, printnotes=False, links=False): first = True doc.start_paragraph('Endnotes-Source', "%d." % cindex) - - src_txt = _format_source_text(source) - - doc.write_text(src_txt, links=links) + doc.write_text(_format_source_text(source), links=links) doc.end_paragraph() - - ref_list = citation.get_ref_list() - if ref_list: - first = True - reflines = "" - for key, ref in ref_list: - datepresent = False - date = ref.get_date_object() - if date is not None and not date.is_empty(): - datepresent = True - if datepresent: - if ref.get_page(): - txt = "%s: %s - %s" % (key, ref.get_page(), str(date)) - else: - txt = "%s: %s" % (key, str(date)) - else: - txt = "%s: %s" % (key, ref.get_page()) - if first: - reflines += txt - first = False - else: - reflines += ('\n%s' % txt) - doc.write_endnotes_ref(reflines,'Endnotes-Ref', links=links) - if printnotes: - note_list = source.get_note_list() - ind = 1 - for notehandle in note_list: - note = database.get_note_from_handle(notehandle) - doc.start_paragraph('Endnotes-Notes') - doc.write_text(_('Note %(ind)d - Type: %(type)s') % { - 'ind': ind, - 'type': str(note.get_type())}) - doc.end_paragraph() - doc.write_styled_note(note.get_styledtext(), - note.get_format(),'Endnotes-Notes', - contains_html= note.get_type() \ - == NoteType.HTML_CODE, - links=links) - ind += 1 + _print_notes(source, database, doc, 'Endnotes-Source-Notes', links) + + for key, ref in citation.get_ref_list(): + doc.start_paragraph('Endnotes-Ref', "%s:" % key) + doc.write_text(_format_ref_text(ref, key), links=links) + doc.end_paragraph() + + if printnotes: + _print_notes(ref, database, doc, 'Endnotes-Ref-Notes', links) def _format_source_text(source): if not source: return "" @@ -192,3 +166,36 @@ def _format_source_text(source): src_txt += "(%s)" % source.get_abbreviation() return src_txt + +def _format_ref_text(ref, key): + if not ref: return "" + + ref_txt = "" + + datepresent = False + date = ref.get_date_object() + if date is not None and not date.is_empty(): + datepresent = True + if datepresent: + if ref.get_page(): + ref_txt = "%s - %s" % (ref.get_page(), str(date)) + else: + ref_txt = str(date) + else: + ref_txt = ref.get_page() + + # Print only confidence level if it is not Normal + if ref.get_confidence_level() != SourceRef.CONF_NORMAL: + ref_txt += " [" + confidence[ref.get_confidence_level()] + "]" + + return ref_txt + +def _print_notes(obj, db, doc, style, links): + note_list = obj.get_note_list() + ind = 1 + for notehandle in note_list: + note = db.get_note_from_handle(notehandle) + contains_html = note.get_type() == NoteType.HTML_CODE + doc.write_styled_note(note.get_styledtext(), note.get_format(), style, + contains_html=contains_html, links=links) + ind += 1 diff --git a/src/plugins/docgen/AsciiDoc.py b/src/plugins/docgen/AsciiDoc.py index 10cc3a788..587983200 100644 --- a/src/plugins/docgen/AsciiDoc.py +++ b/src/plugins/docgen/AsciiDoc.py @@ -257,7 +257,7 @@ class AsciiDoc(BaseDoc,TextDoc): this_text = reformat_para(self.text,regular_indent,right,fmt, right_pad,first_indent) else: - this_text = self.text + this_text = ' '*(regular_indent+first_indent) + self.text if self.__note_format: # don't add an extra LF before the_pad if preformatted notes. @@ -404,15 +404,6 @@ class AsciiDoc(BaseDoc,TextDoc): self.write_text(line) self.end_paragraph() - def write_endnotes_ref(self, text, style_name, links=False): - """ - Overwrite base method for lines of endnotes references - """ - for line in text.split('\n'): - self.start_paragraph(style_name) - self.write_text(line) - self.end_paragraph() - #-------------------------------------------------------------------- # # Writes text. diff --git a/src/plugins/docgen/HtmlDoc.py b/src/plugins/docgen/HtmlDoc.py index b7e85ec41..3dfed566e 100644 --- a/src/plugins/docgen/HtmlDoc.py +++ b/src/plugins/docgen/HtmlDoc.py @@ -449,22 +449,6 @@ class HtmlDoc(BaseDoc, TextDoc): """ self.__reduce_list() - def write_endnotes_ref(self, text, style_name, links=False): - """ - Overwrite base method for lines of endnotes references - """ - self.htmllist += [Html('div', id='grampsstylednote')] - for line in text.split('\n'): - # more basic method we convert all to a monospace character - self.htmllist += [Html('pre', class_=style_name, - style = 'font-family: courier, monospace', - indent=None, inline=True)] - self.write_text(line) - #end pre element - self.__reduce_list() - #end div element - self.__reduce_list() - def write_styled_note(self, styledtext, format, style_name, contains_html=False, links=False): """ diff --git a/src/plugins/docgen/LaTeXDoc.py b/src/plugins/docgen/LaTeXDoc.py index 854e644e2..60827a92c 100644 --- a/src/plugins/docgen/LaTeXDoc.py +++ b/src/plugins/docgen/LaTeXDoc.py @@ -644,14 +644,3 @@ class LaTeXDoc(BaseDoc, TextDoc): self._backend.write("\\newline\n") self.end_paragraph() self._backend.write("\n\\vspace*{0.5cm} \n\\end{minipage}\n\n") - - def write_endnotes_ref(self, text, style_name, links=False): - """ - Overwrite base method for lines of endnotes references - """ - self._backend.write("\\begin{minipage}{{0.8\\linewidth}}\n") - for line in text.split('\n'): - self.start_paragraph(style_name) - self.write_text(line) - self.end_paragraph() - self._backend.write("\n\\vspace*{0.5cm} \n\end{minipage}\n\n") diff --git a/src/plugins/docgen/ODFDoc.py b/src/plugins/docgen/ODFDoc.py index d7bcb9db7..09b965ad6 100644 --- a/src/plugins/docgen/ODFDoc.py +++ b/src/plugins/docgen/ODFDoc.py @@ -1498,28 +1498,6 @@ class ODFDoc(BaseDoc, TextDoc, DrawDoc): ) self.new_cell = 1 - def write_endnotes_ref(self, text, style_name, links=False): - """ - Overwrite base method for lines of endnotes references - """ - for line in text.split('\n'): - text = escape(line, _esc_map) - # Replace multiple spaces: have to go from the largest number down - for n in range(text.count(' '), 1, -1): - text = text.replace(' '*n, ' ' % (n-1) ) - - if links == True: - text = re.sub(URL_PATTERN, _CLICKABLE, text) - - self.start_paragraph(style_name) -# self.cntnt.write('') - self.cntnt.write( - '' + - text + - '' - ) - self.end_paragraph() - def write_styled_note(self, styledtext, format, style_name, contains_html=False, links=False): """ diff --git a/src/plugins/docgen/RTFDoc.py b/src/plugins/docgen/RTFDoc.py index 3f8f941d3..ceebf0742 100644 --- a/src/plugins/docgen/RTFDoc.py +++ b/src/plugins/docgen/RTFDoc.py @@ -447,21 +447,6 @@ class RTFDoc(BaseDoc,TextDoc): self.write_text('\n') self.end_paragraph() - def write_endnotes_ref(self,text,style_name,links=False): - """ - Overwrite base method for lines of endnotes references - """ - for line in text.split('\n'): - self.start_paragraph(style_name) - self.write_text(line) - if self.in_table: - # Add LF when in table as in indiv_complete report - self.write_text('\n') - self.end_paragraph() - # Write an empty para after all ref lines for each source - self.start_paragraph(style_name) - self.end_paragraph() - #-------------------------------------------------------------------- # # Writes text. If braces are not currently open, open them. Loop diff --git a/src/plugins/lib/libcairodoc.py b/src/plugins/lib/libcairodoc.py index b220f4b2a..1ca563b0d 100644 --- a/src/plugins/lib/libcairodoc.py +++ b/src/plugins/lib/libcairodoc.py @@ -1293,18 +1293,9 @@ class CairoDoc(BaseDoc, TextDoc, DrawDoc): def end_cell(self): self._active_element = self._active_element.get_parent() - - def write_endnotes_ref(self, text, style_name): - """ - Overwrite base method for lines of endnotes references - """ - for line in text.split('\n\n'): - self.start_paragraph(style_name) - self.write_text(line) - self.end_paragraph() def write_styled_note(self, styledtext, format, style_name, - contains_html=False): + contains_html=False, links=False): """ Convenience function to write a styledtext to the cairo doc. styledtext : assumed a StyledText object to write @@ -1358,7 +1349,7 @@ class CairoDoc(BaseDoc, TextDoc, DrawDoc): text = self._backend.ESCAPE_FUNC()(text) self._active_element.add_text(text) - def write_text(self, text, mark=None): + def write_text(self, text, mark=None, links=False): """Write a normal piece of text according to the present style @param text: text to write. diff --git a/src/plugins/textreport/IndivComplete.py b/src/plugins/textreport/IndivComplete.py index 47fa3f981..e39e11fbf 100644 --- a/src/plugins/textreport/IndivComplete.py +++ b/src/plugins/textreport/IndivComplete.py @@ -165,7 +165,9 @@ class IndivCompleteReport(Report): Report.__init__(self, database, options_class) menu = options_class.menu + self.use_pagebreak = menu.get_option_by_name('pageben').get_value() self.use_srcs = menu.get_option_by_name('cites').get_value() + self.use_srcs_notes = menu.get_option_by_name('incsrcnotes').get_value() self.sort = menu.get_option_by_name('sort').get_value() @@ -624,7 +626,10 @@ class IndivCompleteReport(Report): self.write_addresses() self.write_note() if self.use_srcs: - Endnotes.write_endnotes(self.bibli, self.database, self.doc) + if self.use_pagebreak: + self.doc.page_break() + Endnotes.write_endnotes(self.bibli, self.database, self.doc, + printnotes=self.use_srcs_notes) #------------------------------------------------------------------------ # @@ -662,11 +667,22 @@ class IndivCompleteOptions(MenuReportOptions): sort = BooleanOption(_("List events chronologically"), True) sort.set_help(_("Whether to sort events into chronological order.")) menu.add_option(category_name, "sort", sort) + + pageben = BooleanOption(_("Page break before end notes"),False) + pageben.set_help( + _("Whether to start a new page before the end notes.")) + menu.add_option(category_name, "pageben", pageben) cites = BooleanOption(_("Include Source Information"), True) cites.set_help(_("Whether to cite sources.")) menu.add_option(category_name, "cites", cites) + incsrcnotes = BooleanOption(_("Include sources notes"), False) + incsrcnotes.set_help(_("Whether to include source notes in the " + "Endnotes section. Only works if Include sources is selected.")) + menu.add_option(category_name, "incsrcnotes", incsrcnotes) + + ################################ category_name = SECTION_CATEGORY ################################