Source code for timApp.documentmodel.documentwriter

"""Defines the DocumentWriter class."""
from typing import Optional

from documentmodel.documentparser import DocumentParser
from documentmodel.documentparseroptions import DocumentParserOptions
from utils import count_chars


[docs]class DocumentWriter: """Converts a sequence of document blocks to text. """ def __init__(self, pars, export_hashes=False, export_ids=True): """Initializes a DocumentWriter object. :param export_hashes: Whether to include hash attributes in the exported markdown. :param export_ids: Whether to include id attributes in the exported markdown. :param pars: A sequence of paragraphs representing the document. """ self.pars = pars self.ignored_attrs = ['md', 'type', 'html', 'links', 'doc_id', 'props', 'h'] if not export_hashes: self.ignored_attrs.append('t') if not export_ids: self.ignored_attrs.append('id')
[docs] def get_text(self, options: Optional[DocumentParserOptions]=None): """Gets the full text for the document. :return: The full text of the document. """ if options is None: options = DocumentParserOptions() text = '' for p in self.pars: blocks = DocumentParser(p['md']).get_blocks(options) text += '\n' if len(blocks) > 1: atomized = p.copy() atomized['atom'] = 'true' num_ticks = 3 for b in blocks: if b['type'] == 'code': num_ticks = count_chars(b['md'], '`') + 1 text += '`'*num_ticks + ' {' + self.attrs_to_str(atomized) + '}\n' + p['md'] + '\n' + '`'*num_ticks else: attrs_str = self.attrs_to_str(p) if not attrs_str: text += p['md'] else: if len(blocks) == 0 or blocks[0]['type'] == 'normal' or blocks[0]['type'] == 'autonormal': text += '#-' + ' {' + attrs_str + '}\n' + p['md'] else: parts = blocks[0]['md'].split('\n', 1) first_line, rest = parts[0], parts[1] if len(parts) > 1 else '' text += first_line + ' {' + attrs_str + '}\n' + rest if text[-1] != '\n': text += '\n' return text[1:]
[docs] def attrs_to_str(self, attrs): """ :type attrs: dict """ attr_str = '' for k, v in attrs.items(): if k in self.ignored_attrs: continue elif k == 'taskId': attr_str += '#' + v elif k == 'classes': attr_str += ' '.join(['.' + cl for cl in v]) elif isinstance(v, dict): attr_str += self.attrs_to_str(v) else: attr_str += k + '="' for char in str(v): if char in ('"', '\\'): attr_str += '\\' attr_str += char attr_str += '"' attr_str += ' ' return attr_str.strip()