sphinx2rst moved to own package
This commit is contained in:
Родитель
fdf1a0f6a3
Коммит
79c36500b6
6
Makefile
6
Makefile
|
@ -7,7 +7,7 @@ CONTRIBUTING="CONTRIBUTING.rst"
|
|||
CONFIGREF_SRC="docs/configuration.rst"
|
||||
README_SRC="docs/templates/readme.txt"
|
||||
CONTRIBUTING_SRC="docs/contributing.rst"
|
||||
SPHINX2RST="extra/release/sphinx-to-rst.py"
|
||||
SPHINX2RST="sphinx2rst"
|
||||
WORKER_GRAPH_FULL="docs/images/worker_graph_full.png"
|
||||
|
||||
SPHINX_HTMLDIR = "${SPHINX_BUILDDIR}/html"
|
||||
|
@ -52,7 +52,7 @@ readmecheck:
|
|||
iconv -f ascii -t ascii $(README) >/dev/null
|
||||
|
||||
$(README):
|
||||
$(PYTHON) $(SPHINX2RST) $(README_SRC) --ascii > $@
|
||||
$(SPHINX2RST) $(README_SRC) --ascii > $@
|
||||
|
||||
readme: readmeclean $(README) readmecheck
|
||||
|
||||
|
@ -60,7 +60,7 @@ contributingclean:
|
|||
-rm -f CONTRIBUTING.rst
|
||||
|
||||
$(CONTRIBUTING):
|
||||
$(PYTHON) $(SPHINX2RST) $(CONTRIBUTING_SRC) > $@
|
||||
$(SPHINX2RST) $(CONTRIBUTING_SRC) > $@
|
||||
|
||||
contributing: contributingclean $(CONTRIBUTING)
|
||||
|
||||
|
|
|
@ -1,170 +0,0 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
from __future__ import absolute_import, print_function, unicode_literals
|
||||
|
||||
import codecs
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
|
||||
from collections import Callable
|
||||
from functools import partial
|
||||
|
||||
SAY = partial(print, file=sys.stderr)
|
||||
|
||||
dirname = ''
|
||||
|
||||
RE_CODE_BLOCK = re.compile(r'(\s*).. code-block:: (.+?)\s*$')
|
||||
RE_INCLUDE = re.compile(r'\s*.. include:: (.+?)\s*$')
|
||||
RE_REFERENCE = re.compile(r':(\w+):`(.+?)`')
|
||||
RE_NAMED_REF = re.compile('(.+?)\<(.+)\>')
|
||||
UNITABLE = {
|
||||
'…': '...',
|
||||
'“': '"',
|
||||
'”': '"',
|
||||
}
|
||||
X = re.compile(re.escape('…'))
|
||||
HEADER = re.compile('^[\=\~\-]+$')
|
||||
UNIRE = re.compile('|'.join(re.escape(p) for p in UNITABLE),
|
||||
re.UNICODE)
|
||||
REFBASE = 'http://docs.celeryproject.org/en/latest'
|
||||
REFS = {
|
||||
'mailing-list':
|
||||
'http://groups.google.com/group/celery-users',
|
||||
'irc-channel': 'getting-started/resources.html#irc',
|
||||
'breakpoint-signal': 'tutorials/debugging.html',
|
||||
'internals-guide': 'internals/guide.html',
|
||||
'bundles': 'getting-started/introduction.html#bundles',
|
||||
'reporting-bugs': 'contributing.html#reporting-bugs',
|
||||
}
|
||||
|
||||
pending_refs = {}
|
||||
|
||||
|
||||
def _replace_handler(match, key=UNITABLE.__getitem__):
|
||||
return key(match.group(0))
|
||||
|
||||
|
||||
def include_file(lines, pos, match):
|
||||
global dirname
|
||||
orig_filename = match.groups()[0]
|
||||
filename = os.path.join(dirname, orig_filename)
|
||||
fh = codecs.open(filename, encoding='utf-8')
|
||||
try:
|
||||
old_dirname = dirname
|
||||
dirname = os.path.dirname(orig_filename)
|
||||
try:
|
||||
lines[pos] = sphinx_to_rst(fh)
|
||||
finally:
|
||||
dirname = old_dirname
|
||||
finally:
|
||||
fh.close()
|
||||
|
||||
|
||||
def asciify(lines):
|
||||
prev_diff = None
|
||||
for line in lines:
|
||||
new_line = UNIRE.sub(_replace_handler, line)
|
||||
if prev_diff and HEADER.match(new_line):
|
||||
new_line = ''.join([
|
||||
new_line.rstrip(), new_line[0] * prev_diff, '\n'])
|
||||
prev_diff = len(new_line) - len(line)
|
||||
yield new_line.encode('ascii')
|
||||
|
||||
|
||||
def replace_code_block(lines, pos, match):
|
||||
lines[pos] = ''
|
||||
curpos = pos - 1
|
||||
# Find the first previous line with text to append "::" to it.
|
||||
while True:
|
||||
prev_line = lines[curpos]
|
||||
if not prev_line.isspace():
|
||||
prev_line_with_text = curpos
|
||||
break
|
||||
curpos -= 1
|
||||
|
||||
if lines[prev_line_with_text].endswith(':'):
|
||||
lines[prev_line_with_text] += ':'
|
||||
else:
|
||||
lines[prev_line_with_text] += match.group(1) + '::'
|
||||
|
||||
|
||||
def _deref_default(target):
|
||||
return r'``{0}``'.format(target)
|
||||
|
||||
|
||||
def _deref_ref(target):
|
||||
m = RE_NAMED_REF.match(target)
|
||||
if m:
|
||||
text, target = m.group(1).strip(), m.group(2).strip()
|
||||
else:
|
||||
text = target
|
||||
|
||||
try:
|
||||
url = REFS[target]
|
||||
except KeyError:
|
||||
return _deref_default(target)
|
||||
|
||||
if '://' not in url:
|
||||
url = '/'.join([REFBASE, url])
|
||||
pending_refs[text] = url
|
||||
|
||||
return r'`{0}`_'.format(text)
|
||||
|
||||
|
||||
DEREF = {'ref': _deref_ref}
|
||||
|
||||
|
||||
def _deref(match):
|
||||
return DEREF.get(match.group(1), _deref_default)(match.group(2))
|
||||
|
||||
|
||||
def deref_all(line):
|
||||
return RE_REFERENCE.subn(_deref, line)[0]
|
||||
|
||||
|
||||
def resolve_ref(name, url):
|
||||
return '\n.. _`{0}`: {1}\n'.format(name, url)
|
||||
|
||||
|
||||
def resolve_pending_refs(lines):
|
||||
for line in lines:
|
||||
yield line
|
||||
for name, url in pending_refs.items():
|
||||
yield resolve_ref(name, url)
|
||||
|
||||
|
||||
TO_RST_MAP = {RE_CODE_BLOCK: replace_code_block,
|
||||
RE_INCLUDE: include_file}
|
||||
|
||||
|
||||
def _process(lines, encoding='utf-8'):
|
||||
lines = list(lines) # non-destructive
|
||||
for i, line in enumerate(lines):
|
||||
for regex, alt in TO_RST_MAP.items():
|
||||
if isinstance(alt, Callable):
|
||||
match = regex.match(line)
|
||||
if match:
|
||||
alt(lines, i, match)
|
||||
line = lines[i]
|
||||
else:
|
||||
lines[i] = regex.sub(alt, line)
|
||||
lines[i] = deref_all(lines[i])
|
||||
if encoding == 'ascii':
|
||||
lines = asciify(lines)
|
||||
return resolve_pending_refs(lines)
|
||||
|
||||
|
||||
def sphinx_to_rst(fh, encoding='utf-8'):
|
||||
return ''.join(_process(fh, encoding))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
global dirname
|
||||
dirname = os.path.dirname(sys.argv[1])
|
||||
encoding = 'ascii' if '--ascii' in sys.argv else 'utf-8'
|
||||
fh = codecs.open(sys.argv[1], encoding='utf-8')
|
||||
try:
|
||||
print(sphinx_to_rst(fh, encoding).encode('utf-8'))
|
||||
finally:
|
||||
fh.close()
|
|
@ -0,0 +1,12 @@
|
|||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
REFBASE = 'http://docs.celeryproject.org/en/latest'
|
||||
REFS = {
|
||||
'mailing-list':
|
||||
'http://groups.google.com/group/celery-users',
|
||||
'irc-channel': 'getting-started/resources.html#irc',
|
||||
'breakpoint-signal': 'tutorials/debugging.html',
|
||||
'internals-guide': 'internals/guide.html',
|
||||
'bundles': 'getting-started/introduction.html#bundles',
|
||||
'reporting-bugs': 'contributing.html#reporting-bugs',
|
||||
}
|
|
@ -3,3 +3,4 @@ wheel>=0.29.0
|
|||
flake8>=2.5.4
|
||||
flakeplus>=1.1
|
||||
tox>=2.3.1
|
||||
sphinx2rst>=1.0
|
||||
|
|
Загрузка…
Ссылка в новой задаче