def mainpart(section, line, linelen):
    global paragraph

    if linelen > 0 and len(paragraph) == 0 and \
       line.upper() == line and line.upper() != line.lower():
        # Headlines are always upper case
        style = h1style
        l = cleantext(line)
        section.addElement(text.H(outlinelevel=1, stylename=h1style, text=l))
    elif linelen >= FULLLINE:
        # In the middle of a paragraph
        paragraph.append(cleantext(line))
    elif linelen == 0:
        # End of paragraph
        if len(paragraph) > 0:
            addparagraph(section)
            paragraph=[]
    elif linelen < FULLLINE and len(paragraph) > 0:
        # Short tail of paragraph
        paragraph.append(cleantext(line))
    else:
        if line == title or line == title + " by " + creator:
            section.addElement(text.P( stylename=titlestyle, text=cleantext(line)))
            return
        if line == "by" or line == creator:
            section.addElement(text.P( stylename=subtitlestyle, text=cleantext(line)))
            return
        if len(paragraph) > 0:
            addparagraph(section)
            paragraph=[]
        section.addElement(text.P(stylename=textbodystyle, text=cleantext(line)))
示例#2
0
    def _render_name_freq(self, freq_table):
        """Produces name statistics table.

        :param freq_table: list of (name, count) tuples.
        """
        def _gencouples(namefreq):
            halflen = (len(namefreq) + 1) // 2
            for i in range(halflen):
                n1, c1 = namefreq[2 * i]
                n2, c2 = None, None
                if 2 * i + 1 < len(namefreq):
                    n2, c2 = namefreq[2 * i + 1]
                yield n1, c1, n2, c2

        total = float(sum(count for _, count in freq_table))

        tbl = table.Table()
        tbl.addElement(table.TableColumn())
        tbl.addElement(table.TableColumn())
        tbl.addElement(table.TableColumn())
        tbl.addElement(table.TableColumn())

        for name1, count1, name2, count2 in _gencouples(freq_table):

            row = table.TableRow()

            cell = table.TableCell()
            cell.addElement(text.P(text=name1 or '-'))
            row.addElement(cell)

            cell = table.TableCell()
            cell.addElement(
                text.P(text='%d (%.1f%%)' % (count1, count1 / total * 100)))
            row.addElement(cell)

            if count2 is not None:

                cell = table.TableCell()
                cell.addElement(text.P(text=name2 or '-'))
                row.addElement(cell)

                cell = table.TableCell()
                cell.addElement(
                    text.P(text='%d (%.1f%%)' %
                           (count2, count2 / total * 100)))
                row.addElement(cell)

            tbl.addElement(row)

        self.doc.text.addElement(tbl)
示例#3
0
 def test_simple_link(self):
     """ Create a link """
     textdoc = OpenDocumentText()
     para = text.P()
     anchor = text.A(href="http://www.com/", type="simple", text="A link label")
     para.addElement(anchor)
     textdoc.text.addElement(para)
示例#4
0
def __replace_text_in_odf_element(a_file, a_element_foo, a_replace_map: list):
    replace_map = {}
    for element in a_file.getElementsByType(a_element_foo):
        text = teletype.extractText(element)
        for mark in a_replace_map:
            text = text.replace(mark[0], mark[1])

        new_odf_element = odf_text.P()
        new_odf_element.setAttribute("stylename",
                                     element.getAttribute("stylename"))

        for space_elements in element.getElementsByType(odf_text.S):
            # Без этого все пробельные символы в начале строк удалятся
            spaces = space_elements.getAttribute('c')
            if spaces is not None:
                new_space_element = odf_text.S()
                new_space_element.setAttribute('c', spaces)
                new_odf_element.appendChild(new_space_element)

        new_odf_element.addText(text)
        replace_map[element] = new_odf_element

    for old, new in replace_map.items():
        old.parentNode.insertBefore(new, old)
        old.parentNode.removeChild(old)
        # Без этого дерево нодов сломается
        a_file.rebuild_caches(new.parentNode)
示例#5
0
    def convert_text_only(self):
        """Конвертация текста в файле ODT.

        Конвертируется все содерржимое <body>.
        Результат записывается в файл *.cnv.odt
        :return: None
        """

        body = self.doc.body
        new_doc = OpenDocumentText()
        for _body_elem in body.childNodes:
            for _elem in _body_elem.childNodes:
                body_text = teletype.extractText(_elem)
                body_text = self.converter(body_text)
                para = text.P()
                teletype.addTextToElement(para, body_text)
                new_doc.text.addElement(para)
                # print(body_text)

        # Замена шрифта в стилях.
        if self.style_font:
            self.set_font_for_all_styles()

        _suffix = '.all.odt'
        if self.extension:
            _suffix = self.extension

        new_odt = self.p_odt.with_suffix(_suffix)
        new_doc.save(new_odt.as_posix())
示例#6
0
 def _render_name_stat(self, n_total, n_females, n_males):
     # docstring inherited from base class
     items = ((TR('Person count'), n_total),
              (TR('Female count'), n_females), (TR('Male count'), n_males))
     for key, val in items:
         p = text.P(text='%s: %d' % (self._tr.tr(key), val))
         self.doc.text.addElement(p)
示例#7
0
    def _make_layout(self, doc, layout, firstpage):
        # set paper dimensions
        pageLayout = style.PageLayout(name=u"pl1")
        doc.automaticstyles.addElement(pageLayout)
        plProp = style.PageLayoutProperties(pageheight=str(layout.height),
                                            pagewidth=str(layout.width),
                                            marginleft=str(layout.left),
                                            marginright=str(layout.right),
                                            margintop=str(layout.top),
                                            marginbottom=str(layout.bottom))
        pageLayout.addElement(plProp)

        # add page numbers to the footers
        footer = style.Footer()
        foostyle = style.Style(name="Footer", family="paragraph")
        foostyle.addElement(style.ParagraphProperties(textalign='center'))
        foostyle.addElement(style.TextProperties(fontsize='10pt'))
        doc.automaticstyles.addElement(foostyle)
        p = text.P(stylename=foostyle)
        p.addElement(
            text.PageNumber(selectpage="current",
                            pageadjust=str(firstpage - 1)))
        footer.addElement(p)

        masterpage = style.MasterPage(name=u"Standard",
                                      pagelayoutname=pageLayout)
        masterpage.addElement(footer)
        doc.masterstyles.addElement(masterpage)
示例#8
0
    def _render_name_freq(self, freq_table):
        # docstring inherited from base class
        def _gencouples(namefreq):
            halflen = (len(namefreq) + 1) // 2
            for i in range(halflen):
                n1, c1 = namefreq[2 * i]
                n2, c2 = None, None
                if 2 * i + 1 < len(namefreq):
                    n2, c2 = namefreq[2 * i + 1]
                yield n1, c1, n2, c2

        total = float(sum(count for _, count in freq_table))

        tbl = table.Table()
        tbl.addElement(table.TableColumn())
        tbl.addElement(table.TableColumn())
        tbl.addElement(table.TableColumn())
        tbl.addElement(table.TableColumn())

        for name1, count1, name2, count2 in _gencouples(freq_table):

            row = table.TableRow()

            cell = table.TableCell()
            cell.addElement(text.P(text=name1 or '-'))
            row.addElement(cell)

            cell = table.TableCell()
            cell.addElement(
                text.P(text='%d (%.1f%%)' % (count1, count1 / total * 100)))
            row.addElement(cell)

            if count2 is not None:

                cell = table.TableCell()
                cell.addElement(text.P(text=name2 or '-'))
                row.addElement(cell)

                cell = table.TableCell()
                cell.addElement(
                    text.P(text='%d (%.1f%%)' %
                           (count2, count2 / total * 100)))
                row.addElement(cell)

            tbl.addElement(row)

        self.doc.text.addElement(tbl)
示例#9
0
 def s_html_dt(self, tag, attrs):
     if self.doc.getStyleByName("List_20_Heading") is None:
         style = Style(name="List_20_Heading", displayname="List Heading", family="paragraph", parentstylename="Standard",
              nextstylename="List_20_Contents", attributes={'class':"html"})
         p = ParagraphProperties(marginleft="0cm", marginright="0cm", textindent="0cm", autotextindent="false")
         style.addElement(p)
         self.doc.styles.addElement(style)
     e = text.P(stylename="List_20_Heading")
     self.curr.addElement(e)
     self.curr = e
示例#10
0
 def _render_toc(self):
     # docstring inherited from base class
     self.doc.text.addElement(text.P(text='', stylename=self.styles['br']))
     toc = text.TableOfContent(name='TOC')
     tocsrc = text.TableOfContentSource(outlinelevel=2)
     title = self._tr.tr(TR("Table Of Contents"))
     toctitle = text.IndexTitleTemplate(text=title)
     tocsrc.addElement(toctitle)
     toc.addElement(tocsrc)
     self.doc.text.addElement(toc)
示例#11
0
 def testBadChild(self):
     """ Test that you can't add an illegal child """
     tablecontents = style.Style(name=u"Table Contents",
                                 family=u"paragraph")
     p = text.P(text=u"x")
     with self.assertRaises(Exception) as cm:
         tablecontents.addElement(p)
     # FIXME: This doesn't work on Python 3.
     if sys.version_info[0] == 2:
         self.assertTrue(isinstance(cm.exception, IllegalChild))
示例#12
0
    def __call__(self):
        datatable = table.Table(name="local-table")
        if self.datasourcehaslabels in ('row', 'both'):
            t = table.TableHeaderColumns()
            t.addElement(table.TableColumn())
            datatable.addElement(t)

        t = table.TableColumns()
        if self.datasourcehaslabels in ('row', 'both'):
            t.addElement(
                table.TableColumn(numbercolumnsrepeated=str(self.numcols - 1)))
        else:
            t.addElement(
                table.TableColumn(numbercolumnsrepeated=str(self.numcols)))
        datatable.addElement(t)

        if self.datasourcehaslabels in ('column', 'both'):
            t = table.TableHeaderRows()
            datatable.addElement(t)
            tr = table.TableRow()
            t.addElement(tr)
            content = self.values[0]
            for val in content:
                tc = table.TableCell(valuetype=valuetype(val))
                tr.addElement(tc)
                tc.addElement(text.P(text=str(val)))

        t = table.TableRows()
        datatable.addElement(t)
        rownum = 0
        for content in self.values:
            if rownum == 0 and self.datasourcehaslabels in ('column', 'both'):
                rownum += 1
                continue
            tr = table.TableRow()
            t.addElement(tr)
            for val in content:
                tc = table.TableCell(valuetype=valuetype(val), value=val)
                tr.addElement(tc)
                tc.addElement(text.P(text=str(val)))
            rownum += 1
        return datatable
示例#13
0
        def value2cell(ar, i, fld, val, style_name, tc):
            txt = fld.value2html(ar, val)

            p = text.P(stylename=style_name)
            html2odf(txt, p)

            try:
                tc.addElement(p)
            except Exception as e:
                logger.warning("20120614 addElement %s %s %r : %s",
                               i, fld, val, e)
示例#14
0
 def _render_toc(self):
     """Produce table of contents using info collected in _render_section().
     """
     self.doc.text.addElement(text.P(text='', stylename=self.styles['br']))
     toc = text.TableOfContent(name='TOC')
     tocsrc = text.TableOfContentSource(outlinelevel=2)
     title = self._tr.tr(TR("Table Of Contents"))
     toctitle = text.IndexTitleTemplate(text=title)
     tocsrc.addElement(toctitle)
     toc.addElement(tocsrc)
     self.doc.text.addElement(toc)
示例#15
0
    def testTable(self):
        """ Create a presentation with a page layout called MyLayout
        """
        presdoc = OpenDocumentPresentation()
        # We must describe the dimensions of the page
        pagelayout = style.PageLayout(name="MyLayout")
        presdoc.automaticstyles.addElement(pagelayout)
        pagelayout.addElement(
            style.PageLayoutProperties(margin="0cm",
                                       pagewidth="28cm",
                                       pageheight="21cm",
                                       printorientation="landscape"))

        # Every drawing page must have a master page assigned to it.
        masterpage = style.MasterPage(name="MyMaster",
                                      pagelayoutname=pagelayout)
        presdoc.masterstyles.addElement(masterpage)

        # Style for the title frame of the page
        # We set a centered 34pt font with yellowish background
        titlestyle = style.Style(name="MyMaster-title", family="presentation")
        titlestyle.addElement(style.ParagraphProperties(textalign="center"))
        titlestyle.addElement(style.TextProperties(fontsize="34pt"))
        titlestyle.addElement(style.GraphicProperties(fillcolor="#ffff99"))
        presdoc.styles.addElement(titlestyle)

        # Style for the photo frame
        mainstyle = style.Style(name="MyMaster-main", family="presentation")
        presdoc.styles.addElement(mainstyle)

        # Create style for drawing page
        dpstyle = style.Style(name="dp1", family="drawing-page")
        presdoc.automaticstyles.addElement(dpstyle)

        page = draw.Page(stylename=dpstyle, masterpagename=masterpage)
        presdoc.presentation.addElement(page)

        titleframe = draw.Frame(stylename=titlestyle,
                                width="720pt",
                                height="56pt",
                                x="40pt",
                                y="10pt")
        page.addElement(titleframe)
        textbox = draw.TextBox()
        titleframe.addElement(textbox)
        textbox.addElement(text.P(text="Presentation"))

        mainframe = draw.Frame(stylename=mainstyle,
                               width="720pt",
                               height="500pt",
                               x="0pt",
                               y="56pt")
        page.addElement(mainframe)
        mainframe.addElement(table.Table())
示例#16
0
 def testBadChild(self):
     """ Test that you can't add an illegal child """
     tablecontents = style.Style(name=u"Table Contents",
                                 family=u"paragraph")
     p = text.P(text=u"x")
     # something to fix here
     if sys.version_info.major == 3:
         print(
             "There is some bug to fix: the exception 'IllegalChild' is correctly raised, but the call of 'assertRaises' fails, only with Python3! See line 61 in `teststyles.py`."
         )
     self.assertRaises(IllegalChild, tablecontents.addElement, p)
示例#17
0
 def _render_section(self, level, ref_id, title, newpage=False):
     # docstring inherited from base class
     style = "h" + str(level)
     if newpage:
         style += "br"
     self.doc.text.addElement(
         text.H(text=title,
                outlinelevel=level,
                stylename=self.styles.get(style)))
     if level == 1:
         # page break after H1
         self.doc.text.addElement(text.P(text='', stylename="Break"))
示例#18
0
    def _render_person(self, person, image_data, attributes, families, events,
                       notes):
        # docstring inherited from base class

        # image if present
        if image_data:
            imgframe = self._get_image_fragment(image_data)
            if imgframe:
                p = text.P()
                imgframe.setAttribute('stylename', self.styles['img'])
                imgframe.setAttribute('anchortype', 'paragraph')
                p.addElement(imgframe)
                self.doc.text.addElement(p)

        # all attributes follow
        for attr, value in attributes:
            self.doc.text.addElement(
                text.P(text=attr + ": " + self._interpolate(value)))

        if families:
            hdr = self._tr.tr(TR("Spouses and children"), person.sex)
            self._render_section(3, "", hdr)
            for family in families:
                family = self._interpolate(family)
                self.doc.text.addElement(text.P(text=family))

        if events:
            hdr = self._tr.tr(TR("Events and dates"))
            self._render_section(3, "", hdr)
            for date, facts in events:
                facts = self._interpolate(facts)
                self.doc.text.addElement(text.P(text=date + ": " + facts))

        if notes:
            hdr = self._tr.tr(TR("Comments"))
            self._render_section(3, "", hdr)
            for note in notes:
                self.doc.text.addElement(text.P(text=note))

        self._make_ancestor_tree(person)
示例#19
0
    def switch_notes(self, qte):

        for i in range(len(self.lignes)):
            #print(self.allText[self.lignes[i]])
            #ligne de notes
            old_text = teletype.extractText(self.allText[self.lignes[i]])
            newer_text = ""
            new_notes = []

            for j in range(len(self.notes[i].notes)):
                new_notes.append(
                    self.gamme.switch_note(self.notes[i].notes[j], self.bemol,
                                           qte).note)

            print("NOTESET")
            self.notes[i].show_noteset()

            print("NEW NOTESET : " + str(new_notes))

            cpt = 0

            for j in range(len(old_text) - 1):
                if old_text[j] != " " and old_text[j] != "/" and (
                        old_text[j] == self.notes[i].notes[cpt].note or
                    (old_text[j] + old_text[j + 1])
                        == self.notes[i].notes[cpt].note):
                    print("NEW NOTE")
                    newer_text += new_notes[cpt]
                    cpt += 1
                    if (cpt == len(new_notes)):
                        newer_text += " "
                        break
                else:
                    if (old_text[j] != "b" and old_text[j] != "#"):
                        newer_text += old_text[j]

            print("OLD TEXT  : " + old_text)
            print("NEW TEXT : " + newer_text)

            new_S = text.P()
            new_S.setAttribute(
                "stylename",
                self.allText[self.lignes[i]].getAttribute("stylename"))
            new_S.addText(newer_text)
            self.allText[self.lignes[i]] = new_S


#        print("\n\n\n")
#       for i in range(len(self.allText)):
#          print(self.allText[i])

        self.reset_notes()
示例#20
0
    def _render_name_stat(self, n_total, n_females, n_males):
        """Produces summary table.

        Sum of male and female counters can be lower than total count due to
        individuals with unknown/unspecified gender.

        :param int n_total: Total number of individuals.
        :param int n_females: Number of female individuals.
        :param int n_males: Number of male individuals.
        """
        items = ((TR('Person count'), n_total),
                 (TR('Female count'), n_females), (TR('Male count'), n_males))
        for key, val in items:
            p = text.P(text='%s: %d' % (self._tr.tr(key), val))
            self.doc.text.addElement(p)
示例#21
0
    def switch_type(self):

        for i in range(len(self.lignes)):
            old_text = teletype.extractText(self.allText[self.lignes[i]])
            new_text = ""

            new_notes = []

            cpt = 0

            for j in range(len(self.notes[i].notes)):
                ind = self.get_char_index(self.notes[i].notes[j].note)
                if self.bemol:
                    new_notes.append(self.gamme.notes_diese[ind])
                else:
                    new_notes.append(self.gamme.notes_bemol[ind])

            print("NOTES : " + str(new_notes))

            for j in range(len(old_text) - 1):
                if old_text[j] != " " and old_text[j] != "/" and (
                        old_text[j] == self.notes[i].notes[cpt].note or
                    (old_text[j] + old_text[j + 1])
                        == self.notes[i].notes[cpt].note):
                    print("NEW NOTE")
                    new_text += new_notes[cpt]
                    cpt += 1
                    if (cpt == len(new_notes)):
                        new_text += " "
                        break
                else:
                    if (old_text[j] != "b" and old_text[j] != "#"):
                        new_text += old_text[j]

            print("OLD TEXT : " + old_text)
            print("NEW TEXT : " + new_text)

            new_S = text.P()
            new_S.setAttribute(
                "stylename",
                self.allText[self.lignes[i]].getAttribute("stylename"))
            new_S.addText(new_text)

            self.allText[self.lignes[i]] = new_S
            self.bemol = not self.bemol

        self.reset_notes()
示例#22
0
    def _write_journal(self, journal):
        path = os.path.join(
            options.REPORTS_DIR, 'Журнал {} {} {}.odt'.format(
                self.year,
                self.months[self.month],
                self.doctor[1],
            ))

        doc = opendocument.OpenDocumentText()
        table_style = style.Style(name='tableStyle',
                                  family='table',
                                  masterpagename='masterQ')
        page_layout = style.PageLayout(name='pageStyle')
        page_layout.addElement(
            style.PageLayoutProperties(
                printorientation='landscape',
                margin='0cm',
                pagewidth='290cm',
                pageheight='21cm',
            ))
        master_q = style.MasterPage(name='masterQ', pagelayoutname=page_layout)
        doc.automaticstyles.addElement(table_style)
        doc.automaticstyles.addElement(page_layout)
        doc.masterstyles.addElement(master_q)

        journal = ([['Дата', 'ФИО', 'Дата Рождения', 'Адрес', 'Заключение']] +
                   journal)

        _table = table.Table(name='journal')
        _table.addElement(
            table.TableColumn(numbercolumnsrepeated=len(journal[0])))
        for data in journal:
            row = table.TableRow()
            _table.addElement(row)
            for col in data:
                cell = table.TableCell(valuetype='string')
                cell.addElement(text.P(text=str(col or '')))
                row.addElement(cell)

        doc.text.addElement(_table)
        try:
            doc.save(path)
        except PermissionError:
            self.main_window.create_alert(
                'Файл журнала используется.\nЗакройте его и создайте снова.')
            return
        self._open(path)
示例#23
0
    def save_test(self):
        new_partition = OpenDocumentText()

        T5style = Style(name="T5", family="text")
        T5style.addElement(TextProperties(fontname="Arial"))
        new_partition.automaticstyles.addElement(T5style)

        for i in range(len(self.allText)):
            old_text = teletype.extractText(self.allText[i])
            p = text.P(text="", stylename="T5")
            for j in range(len(old_text)):
                if (old_text[j] == " " and i in self.lignes):
                    p.addElement(Span(text=' ', stylename='T5'))
                else:
                    p.addText(old_text[j])

            new_partition.text.addElement(p)
        new_partition.save("x_test.odt")