GenDoc / src /domain /doc.py
YvesP's picture
initial commit
4cf88e8
Raw
History Blame Contribute Delete
3.26 kB
import docx
from src.domain.container import Container
from src.domain.paragraph import Paragraph
from src.domain.styles import Styles
import shutil
import os
class Doc:
def __init__(self, path='', id_=None):
self.xdoc = docx.Document(path)
self.title = path.split('/')[-1]
self.name = self.title.split('.')[0]
self.id_ = id(self)
self.path = path
paragraphs = [Paragraph(xp, self.id_, i) for (i, xp) in enumerate(self.xdoc.paragraphs)]
self.container = Container(paragraphs, father=self)
self.styles = Styles(self.xdoc.styles)
self.tasks = [c.get_fulltask(self.container.one_liner) for c in self.container.containers if c.task]
def copy(self, new_doc_path):
shutil.copyfile(self.path, new_doc_path)
new_doc = Doc(new_doc_path)
new_doc.save_as_docx(new_doc_path)
return new_doc
def clear(self):
os.remove(self.path)
def apply_template(self, template, add_front_pages=True):
if add_front_pages:
self.add_front_pages_from(template)
log = self.styles.apply_from(template.styles)
self.save_as_docx()
return log
def copy_one_style(self, src_style_name: str, dest_style_name: str, template):
style_dest = template.styles.get_style_from_name(dest_style_name)
src_style = self.styles.get_style_from_name(src_style_name)
log = self.styles.copy_one_style(src_style, style_dest)
return log
def get_different_styles_with_template(self, template):
different_styles = self.styles.get_different_styles(template.styles)
return different_styles
def save_as_docx(self, path: str = ''):
path = path if path else self.path
self.path = path
self.xdoc.save(path)
def add_front_pages_from(self, src_doc):
src_paragraphs = [p for p in src_doc.xdoc.paragraphs]
src_paragraphs.reverse()
for p in src_paragraphs:
self.xdoc.paragraphs[0].insert_paragraph_before(text=p.text, style=p.style)
paragraphs = [Paragraph(xp, self.id_, i) for (i, xp) in enumerate(self.xdoc.paragraphs)]
self.container = Container(paragraphs, father=self)
def get_blocks(self):
def from_list_to_str(index_list):
index_str = str(index_list[0])
for el in index_list[1:]:
index_str += '.' + str(el)
return index_str
blocks = self.container.blocks
for block in blocks:
block.doc = self.title
if block.level == 0:
blocks.remove(block)
block.index = from_list_to_str(block.index)
return blocks
@property
def structure(self):
return self.container.structure
def replace_tasks(self, resolutions: [str]):
if len(resolutions) == len(self.tasks): # exception to be handled
p_tasks = [p for p in self.get_paragraphs() if p.type == 'task']
for p, r in zip(p_tasks, resolutions):
p.set_text(r)
else:
print(f"résolutions : {len(resolutions)} != {len(self.tasks)} tasks")
return self
def get_paragraphs(self):
return self.container.all_paragraphs