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)))
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)
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)
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)
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())
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)
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)
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)
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
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)
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))
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
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)
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)
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())
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)
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"))
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)
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()
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)
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()
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)
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")