Source code for pyorg.convert.plaintext

from pyorg.ast import dispatch_node_type, ORG_NODE_TYPES, OrgNode
from .base import OrgConverterBase


[docs]class OrgPlaintextConverter(OrgConverterBase):
[docs] def convert_multi(self, items, blanks=False, sep=None): ctx = {} return self._convert_contents(items, ctx, blanks=blanks, sep=sep)
def _convert_contents(self, contents, ctx, blanks=False, sep=None): """Convert contents of a node to plaintext. Parameters ---------- contents : list List of org nodes or strings. blanks : bool Prepend and append whitespace according to the ``pre-blank`` and ``post-blank`` properties. sep : str Separator to use. Returns ------- str """ contents_str = [] for item in contents: if isinstance(item, OrgNode): txt = self._convert(item, ctx) if blanks: pre = ' ' * item.props.get('pre-blank', 0) post = ' ' * item.props.get('post-blank', 0) txt = pre + txt + post contents_str.append(txt) elif isinstance(item, str): contents_str.append(item) else: raise TypeError(item) if sep is None: sep = '' if blanks else ' ' return sep.join(contents_str) @dispatch_node_type() def _convert(self, node, ctx): return "<Can't convert %s node to plain text>" % node.type.name @_convert.register(['section']) def _convert_element_contents(self, node, ctx): return self._convert_contents(node.contents, ctx, sep='\n\n') @_convert.register([nt.name for nt in ORG_NODE_TYPES.values() if nt.is_object_container]) def _convert_object_container(self, node, ctx): return self._convert_contents(node.contents, ctx, blanks=True) @_convert.register([ 'code', 'comment', 'comment-block', 'latex-fragment', 'verbatim', 'example-block', 'statistics-cookie', 'fixed-width', 'src-block' ]) def _convert_from_value(self, node, ctx): return node['value'] @_convert.register('line-break') def _convert_line_break(self, node, ctx): return '\n' @_convert.register('timestamp') def _convert_timestamp(self, node, ctx): return node['raw-value'] @_convert.register('link') def _convert_link(self, node, ctx): if node.contents: return self._convert_object_container(node, ctx) else: return node['raw-link'] @_convert.register('entity') def _convert_entity(self, node, ctx): return node['utf-8']
[docs]def to_plaintext(arg, blanks=False, sep=None, **kwargs): converter = OrgPlaintextConverter(**kwargs) if isinstance(arg, OrgNode): return converter.convert(arg) else: return converter.convert_multi(arg, blanks=blanks, sep=sep)