diff --git a/README.rst b/README.rst index 0232ac7..b1429e4 100644 --- a/README.rst +++ b/README.rst @@ -5,3 +5,8 @@ Build gemini blog from Sphinx. Install with `python setup.py install` and do `make gemini` in your project. + + +You can add a `gemini_footer` in config, formatted under the +Gemini specification. You need to set `gemini_baseurl` for +good url in links. diff --git a/sphinx_gemini_builder/__init__.py b/sphinx_gemini_builder/__init__.py index 908b107..98d09ed 100644 --- a/sphinx_gemini_builder/__init__.py +++ b/sphinx_gemini_builder/__init__.py @@ -10,6 +10,7 @@ __version__ = '.'.join([str(val) for val in __version_info__]) from typing import Set, Dict, Any +from urllib.parse import quote from sphinx.builders.text import TextBuilder from sphinx.util import logging @@ -35,12 +36,21 @@ class GeminiBuilder(TextBuilder): current_docname = None + def __init__(self, app) -> None: + super().__init__(app) + self.baseurl = self.config.gemini_baseurl + def prepare_writing(self, docnames: Set[str]) -> None: self.writer = GeminiWriter(self) + def get_target_uri(self, docname: str, typ: str = None) -> str: + return self.baseurl + quote(docname) + self.out_suffix + def setup(app: Sphinx) -> Dict[str, Any]: app.add_builder(GeminiBuilder) + app.add_config_value('gemini_footer', '', 'env') + app.add_config_value('gemini_baseurl', '', 'env') return { 'version': __version__, diff --git a/sphinx_gemini_builder/writer.py b/sphinx_gemini_builder/writer.py index b30eed2..12b1f19 100644 --- a/sphinx_gemini_builder/writer.py +++ b/sphinx_gemini_builder/writer.py @@ -11,6 +11,7 @@ from docutils import writers, nodes from docutils.nodes import Element, Text, Node from sphinx.util import logging from sphinx.util.docutils import SphinxTranslator +from sphinx.util.osutil import relative_uri from sphinx import addnodes from sphinx.writers.text import Table, Cell from sphinx.locale import __, admonitionlabels @@ -71,19 +72,19 @@ class GeminiTranslator(SphinxTranslator): def disable_pre(self) -> None: if self.pre: - self.body += '```\n' - self.pre = True + self.body += '\n```\n' + self.pre = False def enable_pre(self) -> None: if not self.pre: - self.body += '```\n' + self.body += '\n```\n' self.pre = True def visit_document(self, node: Element) -> None: pass def depart_document(self, node: Element) -> None: - pass + self.add_text(self.config.gemini_footer) def visit_section(self, node: Element) -> None: self.sectionlevel += 1 @@ -120,14 +121,14 @@ class GeminiTranslator(SphinxTranslator): pass def visit_title(self, node: Element) -> None: - if isinstance(node.parent, nodes.Admonition): - self.add_text(node.astext() + ' : ') - else: + if not isinstance(node.parent, nodes.Admonition): self.add_title(node.astext()) - self.end_block() + self.end_block() + raise nodes.SkipNode def depart_title(self, node: Element) -> None: - pass + if isinstance(node.parent, nodes.Admonition): + self.add_text(':') def visit_subtitle(self, node: Element) -> None: pass @@ -139,7 +140,7 @@ class GeminiTranslator(SphinxTranslator): self.add_text('-- ') def depart_attribution(self, node: Element) -> None: - self.end_block() + pass def visit_desc(self, node: Element) -> None: pass @@ -157,7 +158,7 @@ class GeminiTranslator(SphinxTranslator): pass def depart_desc_signature_line(self, node: Element) -> None: - self.end_block() + pass def visit_desc_name(self, node: Element) -> None: pass @@ -181,7 +182,7 @@ class GeminiTranslator(SphinxTranslator): self.add_text(' -> ') def depart_desc_returns(self, node: Element) -> None: - self.end_block() + pass def visit_desc_parameterlist(self, node: Element) -> None: self.add_text('(') @@ -189,7 +190,6 @@ class GeminiTranslator(SphinxTranslator): def depart_desc_parameterlist(self, node: Element) -> None: self.add_text(')') - self.end_block() def visit_desc_parameter(self, node: Element) -> None: if not self.first_param: @@ -204,7 +204,6 @@ class GeminiTranslator(SphinxTranslator): def depart_desc_optional(self, node: Element) -> None: self.add_text(']') - self.end_block() def visit_desc_annotation(self, node: Element) -> None: pass @@ -213,7 +212,7 @@ class GeminiTranslator(SphinxTranslator): pass def visit_desc_content(self, node: Element) -> None: - self.end_block() + pass def depart_desc_content(self, node: Element) -> None: pass @@ -260,7 +259,6 @@ class GeminiTranslator(SphinxTranslator): self.add_quote(node[0].astext()) else: self.add_quote() - self.end_block() def depart_citation(self, node: Element) -> None: pass @@ -375,13 +373,15 @@ class GeminiTranslator(SphinxTranslator): list_items = cast(Iterable[nodes.list_item], bullet_list) self.new_state(0) self.add_text(', '.join(n.astext() for n in list_items) + '.') - self.end_block() raise nodes.SkipNode def visit_image(self, node: Element) -> None: + self.end_block() if 'alt' in node.attributes: - self.add_text(__('[image: %s]') % node['alt']) - self.add_text(__('[image]')) + uri = relative_uri(self.builder.current_docname, node['uri']) + self.add_link(uri, __('[image: %s]') % node['alt']) + else: + self.add_link(uri) self.end_block() raise nodes.SkipNode @@ -429,7 +429,7 @@ class GeminiTranslator(SphinxTranslator): pass def depart_term(self, node: Element) -> None: - self.end_block() + pass def visit_classifier(self, node: Element) -> None: self.add_text(' : ') @@ -465,7 +465,7 @@ class GeminiTranslator(SphinxTranslator): pass def depart_field_body(self, node: Element) -> None: - self.end_block() + pass def visit_centered(self, node: Element) -> None: pass @@ -489,7 +489,7 @@ class GeminiTranslator(SphinxTranslator): pass def depart_admonition(self, node: Element) -> None: - self.end_block() + pass def _visit_admonition(self, node: Element) -> None: pass @@ -523,7 +523,7 @@ class GeminiTranslator(SphinxTranslator): pass def depart_versionmodified(self, node: Element) -> None: - self.end_block() + pass def visit_literal_block(self, node: Element) -> None: self.enable_pre() @@ -545,13 +545,12 @@ class GeminiTranslator(SphinxTranslator): def depart_line_block(self, node: Element) -> None: self.disable_pre() - self.end_block() def visit_line(self, node: Element) -> None: pass def depart_line(self, node: Element) -> None: - self.end_block() + pass def visit_block_quote(self, node: Element) -> None: pass @@ -572,6 +571,7 @@ class GeminiTranslator(SphinxTranslator): def depart_paragraph(self, node: Element) -> None: self.end_block() + self.end_block() def visit_target(self, node: Element) -> None: raise nodes.SkipNode @@ -690,10 +690,7 @@ class GeminiTranslator(SphinxTranslator): pass def visit_inline(self, node: Element) -> None: - if 'xref' in node['classes'] or 'term' in node['classes']: - self.end_block() - self.add_link(node['classes']['xref'], node.astext()) - self.end_block() + pass def depart_inline(self, node: Element) -> None: pass