Add: baseurl. Fix a lot of things.

This commit is contained in:
Kujiu 2021-01-31 03:21:33 +01:00
parent 87dbd2f641
commit 450bfe2d05
Signed by: kujiu
GPG key ID: ABBB2CAC6855599F
3 changed files with 41 additions and 29 deletions

View file

@ -5,3 +5,8 @@ Build gemini blog from Sphinx.
Install with `python setup.py install` and do `make gemini` in Install with `python setup.py install` and do `make gemini` in
your project. 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.

View file

@ -10,6 +10,7 @@ __version__ = '.'.join([str(val) for val in __version_info__])
from typing import Set, Dict, Any from typing import Set, Dict, Any
from urllib.parse import quote
from sphinx.builders.text import TextBuilder from sphinx.builders.text import TextBuilder
from sphinx.util import logging from sphinx.util import logging
@ -35,12 +36,21 @@ class GeminiBuilder(TextBuilder):
current_docname = None 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: def prepare_writing(self, docnames: Set[str]) -> None:
self.writer = GeminiWriter(self) 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]: def setup(app: Sphinx) -> Dict[str, Any]:
app.add_builder(GeminiBuilder) app.add_builder(GeminiBuilder)
app.add_config_value('gemini_footer', '', 'env')
app.add_config_value('gemini_baseurl', '', 'env')
return { return {
'version': __version__, 'version': __version__,

View file

@ -11,6 +11,7 @@ from docutils import writers, nodes
from docutils.nodes import Element, Text, Node from docutils.nodes import Element, Text, Node
from sphinx.util import logging from sphinx.util import logging
from sphinx.util.docutils import SphinxTranslator from sphinx.util.docutils import SphinxTranslator
from sphinx.util.osutil import relative_uri
from sphinx import addnodes from sphinx import addnodes
from sphinx.writers.text import Table, Cell from sphinx.writers.text import Table, Cell
from sphinx.locale import __, admonitionlabels from sphinx.locale import __, admonitionlabels
@ -71,19 +72,19 @@ class GeminiTranslator(SphinxTranslator):
def disable_pre(self) -> None: def disable_pre(self) -> None:
if self.pre: if self.pre:
self.body += '```\n' self.body += '\n```\n'
self.pre = True self.pre = False
def enable_pre(self) -> None: def enable_pre(self) -> None:
if not self.pre: if not self.pre:
self.body += '```\n' self.body += '\n```\n'
self.pre = True self.pre = True
def visit_document(self, node: Element) -> None: def visit_document(self, node: Element) -> None:
pass pass
def depart_document(self, node: Element) -> None: def depart_document(self, node: Element) -> None:
pass self.add_text(self.config.gemini_footer)
def visit_section(self, node: Element) -> None: def visit_section(self, node: Element) -> None:
self.sectionlevel += 1 self.sectionlevel += 1
@ -120,14 +121,14 @@ class GeminiTranslator(SphinxTranslator):
pass pass
def visit_title(self, node: Element) -> None: def visit_title(self, node: Element) -> None:
if isinstance(node.parent, nodes.Admonition): if not isinstance(node.parent, nodes.Admonition):
self.add_text(node.astext() + ' : ')
else:
self.add_title(node.astext()) self.add_title(node.astext())
self.end_block() self.end_block()
raise nodes.SkipNode
def depart_title(self, node: Element) -> None: def depart_title(self, node: Element) -> None:
pass if isinstance(node.parent, nodes.Admonition):
self.add_text(':')
def visit_subtitle(self, node: Element) -> None: def visit_subtitle(self, node: Element) -> None:
pass pass
@ -139,7 +140,7 @@ class GeminiTranslator(SphinxTranslator):
self.add_text('-- ') self.add_text('-- ')
def depart_attribution(self, node: Element) -> None: def depart_attribution(self, node: Element) -> None:
self.end_block() pass
def visit_desc(self, node: Element) -> None: def visit_desc(self, node: Element) -> None:
pass pass
@ -157,7 +158,7 @@ class GeminiTranslator(SphinxTranslator):
pass pass
def depart_desc_signature_line(self, node: Element) -> None: def depart_desc_signature_line(self, node: Element) -> None:
self.end_block() pass
def visit_desc_name(self, node: Element) -> None: def visit_desc_name(self, node: Element) -> None:
pass pass
@ -181,7 +182,7 @@ class GeminiTranslator(SphinxTranslator):
self.add_text(' -> ') self.add_text(' -> ')
def depart_desc_returns(self, node: Element) -> None: def depart_desc_returns(self, node: Element) -> None:
self.end_block() pass
def visit_desc_parameterlist(self, node: Element) -> None: def visit_desc_parameterlist(self, node: Element) -> None:
self.add_text('(') self.add_text('(')
@ -189,7 +190,6 @@ class GeminiTranslator(SphinxTranslator):
def depart_desc_parameterlist(self, node: Element) -> None: def depart_desc_parameterlist(self, node: Element) -> None:
self.add_text(')') self.add_text(')')
self.end_block()
def visit_desc_parameter(self, node: Element) -> None: def visit_desc_parameter(self, node: Element) -> None:
if not self.first_param: if not self.first_param:
@ -204,7 +204,6 @@ class GeminiTranslator(SphinxTranslator):
def depart_desc_optional(self, node: Element) -> None: def depart_desc_optional(self, node: Element) -> None:
self.add_text(']') self.add_text(']')
self.end_block()
def visit_desc_annotation(self, node: Element) -> None: def visit_desc_annotation(self, node: Element) -> None:
pass pass
@ -213,7 +212,7 @@ class GeminiTranslator(SphinxTranslator):
pass pass
def visit_desc_content(self, node: Element) -> None: def visit_desc_content(self, node: Element) -> None:
self.end_block() pass
def depart_desc_content(self, node: Element) -> None: def depart_desc_content(self, node: Element) -> None:
pass pass
@ -260,7 +259,6 @@ class GeminiTranslator(SphinxTranslator):
self.add_quote(node[0].astext()) self.add_quote(node[0].astext())
else: else:
self.add_quote() self.add_quote()
self.end_block()
def depart_citation(self, node: Element) -> None: def depart_citation(self, node: Element) -> None:
pass pass
@ -375,13 +373,15 @@ class GeminiTranslator(SphinxTranslator):
list_items = cast(Iterable[nodes.list_item], bullet_list) list_items = cast(Iterable[nodes.list_item], bullet_list)
self.new_state(0) self.new_state(0)
self.add_text(', '.join(n.astext() for n in list_items) + '.') self.add_text(', '.join(n.astext() for n in list_items) + '.')
self.end_block()
raise nodes.SkipNode raise nodes.SkipNode
def visit_image(self, node: Element) -> None: def visit_image(self, node: Element) -> None:
self.end_block()
if 'alt' in node.attributes: if 'alt' in node.attributes:
self.add_text(__('[image: %s]') % node['alt']) uri = relative_uri(self.builder.current_docname, node['uri'])
self.add_text(__('[image]')) self.add_link(uri, __('[image: %s]') % node['alt'])
else:
self.add_link(uri)
self.end_block() self.end_block()
raise nodes.SkipNode raise nodes.SkipNode
@ -429,7 +429,7 @@ class GeminiTranslator(SphinxTranslator):
pass pass
def depart_term(self, node: Element) -> None: def depart_term(self, node: Element) -> None:
self.end_block() pass
def visit_classifier(self, node: Element) -> None: def visit_classifier(self, node: Element) -> None:
self.add_text(' : ') self.add_text(' : ')
@ -465,7 +465,7 @@ class GeminiTranslator(SphinxTranslator):
pass pass
def depart_field_body(self, node: Element) -> None: def depart_field_body(self, node: Element) -> None:
self.end_block() pass
def visit_centered(self, node: Element) -> None: def visit_centered(self, node: Element) -> None:
pass pass
@ -489,7 +489,7 @@ class GeminiTranslator(SphinxTranslator):
pass pass
def depart_admonition(self, node: Element) -> None: def depart_admonition(self, node: Element) -> None:
self.end_block() pass
def _visit_admonition(self, node: Element) -> None: def _visit_admonition(self, node: Element) -> None:
pass pass
@ -523,7 +523,7 @@ class GeminiTranslator(SphinxTranslator):
pass pass
def depart_versionmodified(self, node: Element) -> None: def depart_versionmodified(self, node: Element) -> None:
self.end_block() pass
def visit_literal_block(self, node: Element) -> None: def visit_literal_block(self, node: Element) -> None:
self.enable_pre() self.enable_pre()
@ -545,13 +545,12 @@ class GeminiTranslator(SphinxTranslator):
def depart_line_block(self, node: Element) -> None: def depart_line_block(self, node: Element) -> None:
self.disable_pre() self.disable_pre()
self.end_block()
def visit_line(self, node: Element) -> None: def visit_line(self, node: Element) -> None:
pass pass
def depart_line(self, node: Element) -> None: def depart_line(self, node: Element) -> None:
self.end_block() pass
def visit_block_quote(self, node: Element) -> None: def visit_block_quote(self, node: Element) -> None:
pass pass
@ -572,6 +571,7 @@ class GeminiTranslator(SphinxTranslator):
def depart_paragraph(self, node: Element) -> None: def depart_paragraph(self, node: Element) -> None:
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
@ -690,10 +690,7 @@ class GeminiTranslator(SphinxTranslator):
pass pass
def visit_inline(self, node: Element) -> None: def visit_inline(self, node: Element) -> None:
if 'xref' in node['classes'] or 'term' in node['classes']: pass
self.end_block()
self.add_link(node['classes']['xref'], node.astext())
self.end_block()
def depart_inline(self, node: Element) -> None: def depart_inline(self, node: Element) -> None:
pass pass