Add: baseurl. Fix a lot of things.
This commit is contained in:
parent
87dbd2f641
commit
450bfe2d05
3 changed files with 41 additions and 29 deletions
|
@ -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.
|
||||
|
|
|
@ -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__,
|
||||
|
|
|
@ -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()
|
||||
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
|
||||
|
|
Loading…
Reference in a new issue