Support tables

This commit is contained in:
Kujiu 2021-02-01 01:54:20 +01:00
parent 6371dd0f8d
commit dba8119eba
Signed by: kujiu
GPG key ID: ABBB2CAC6855599F

View file

@ -41,6 +41,9 @@ class GeminiWriter(writers.Writer):
class GeminiTranslator(SphinxTranslator): class GeminiTranslator(SphinxTranslator):
"""
Gemini Translator based on native TextTranslator
"""
builder = None builder = None
def __init__(self, document: nodes.document, builder: "GeminiBuilder") -> None: def __init__(self, document: nodes.document, builder: "GeminiBuilder") -> None:
@ -49,6 +52,8 @@ class GeminiTranslator(SphinxTranslator):
self.first_param = 0 self.first_param = 0
self.list_counter = [] self.list_counter = []
self.table = None self.table = None
self.cell_text = []
self.after_table = []
self.pre = False self.pre = False
self.body = '' self.body = ''
@ -350,23 +355,31 @@ class GeminiTranslator(SphinxTranslator):
pass pass
def visit_entry(self, node: Element) -> None: def visit_entry(self, node: Element) -> None:
self.entry = Cell( pass
rowspan=node.get("morerows", 0) + 1, colspan=node.get("morecols", 0) + 1
)
def depart_entry(self, node: Element) -> None: def depart_entry(self, node: Element) -> None:
pass entry = Cell(
rowspan=node.get("morerows", 0) + 1, colspan=node.get("morecols", 0) + 1
)
entry.text = '\n'.join(self.cell_text)
self.table.add_cell(entry)
self.cell_text = []
def visit_table(self, node: Element) -> None: def visit_table(self, node: Element) -> None:
if self.table: if self.table:
raise NotImplementedError('Nested tables are not supported.') raise NotImplementedError('Nested tables are not supported.')
self.enable_pre()
self.table = Table() self.table = Table()
def depart_table(self, node: Element) -> None: def depart_table(self, node: Element) -> None:
self.enable_pre()
self.add_text(str(self.table)) self.add_text(str(self.table))
self.disable_pre() self.disable_pre()
for line in self.after_table:
self.add_text(line)
self.end_block()
self.table = None self.table = None
self.cell_text = []
self.after_table = []
def visit_acks(self, node: Element) -> None: def visit_acks(self, node: Element) -> None:
bullet_list = cast(nodes.bullet_list, node[0]) bullet_list = cast(nodes.bullet_list, node[0])
@ -570,8 +583,9 @@ class GeminiTranslator(SphinxTranslator):
pass pass
def depart_paragraph(self, node: Element) -> None: def depart_paragraph(self, node: Element) -> None:
self.end_block() if not self.table:
self.end_block() self.end_block()
self.end_block()
def visit_target(self, node: Element) -> None: def visit_target(self, node: Element) -> None:
raise nodes.SkipNode raise nodes.SkipNode
@ -593,9 +607,15 @@ class GeminiTranslator(SphinxTranslator):
def visit_reference(self, node: Element) -> None: def visit_reference(self, node: Element) -> None:
if 'refuri' in node: if 'refuri' in node:
self.end_block() if self.table:
self.add_link(node['refuri'], node.astext()) self.after_table.append(
self.end_block() '=> %s %s' %
(node['refuri'], node.astext()))
self.cell_text.append(node.astext() or node['refuri'])
else:
self.end_block()
self.add_link(node['refuri'], node.astext())
self.end_block()
raise nodes.SkipNode raise nodes.SkipNode
def depart_reference(self, node: Element) -> None: def depart_reference(self, node: Element) -> None:
@ -683,6 +703,10 @@ class GeminiTranslator(SphinxTranslator):
def visit_Text(self, node: Text) -> None: def visit_Text(self, node: Text) -> None:
text = node.astext() text = node.astext()
if self.table:
self.cell_text.append(text)
raise nodes.SkipNode
if isinstance(node.parent, nodes.paragraph): if isinstance(node.parent, nodes.paragraph):
text = text.replace('\r', '') text = text.replace('\r', '')
text = text.replace('\n', ' ') text = text.replace('\n', ' ')