dollarmath.py
97 lines
| 3.1 KiB
| text/x-python
|
PythonLexer
/ nbconvert1 / dollarmath.py
smithj1
|
r6263 | # dollarmath.py by Akihiro Uchida *public domain* | ||
# the original one is written by Paul Kienzle | ||||
# and published as public domain in [sphinx-dev]: $math$ extension | ||||
r""" | ||||
Allow $math$ markup in text and docstrings, ignoring \$. | ||||
The $math$ markup should be separated from the surrounding text by spaces. | ||||
To embed markup within a word, place backslash-space before and after. | ||||
For convenience, the final $ can be followed by punctuation | ||||
(period, comma or semicolon). | ||||
""" | ||||
import re | ||||
dollar_pat = r"(?:^|(?<=\s))[$]([^\n]*?)(?<![\\])[$](?:$|(?=\s|[.,;\\]))" | ||||
_dollar = re.compile(dollar_pat) | ||||
_notdollar = re.compile(r"\\[$]") | ||||
David Warde-Farley
|
r8749 | |||
smithj1
|
r6263 | def replace_dollar(content): | ||
content = _dollar.sub(r":math:`\1`", content) | ||||
content = _notdollar.sub("$", content) | ||||
return content | ||||
David Warde-Farley
|
r8749 | |||
smithj1
|
r6263 | def rewrite_rst(app, docname, source): | ||
source[0] = replace_dollar(source[0]) | ||||
David Warde-Farley
|
r8749 | |||
smithj1
|
r6263 | def rewrite_autodoc(app, what, name, obj, options, lines): | ||
lines[:] = [replace_dollar(L) for L in lines] | ||||
David Warde-Farley
|
r8749 | |||
smithj1
|
r6263 | def setup(app): | ||
app.connect('source-read', rewrite_rst) | ||||
if 'autodoc-process-docstring' in app._events: | ||||
app.connect('autodoc-process-docstring', rewrite_autodoc) | ||||
David Warde-Farley
|
r8749 | |||
smithj1
|
r6263 | def test_expr(expr, expect): | ||
result = replace_dollar(expr) | ||||
print 'A math expression: %s' % expr | ||||
print 'A expected output: %s' % expect | ||||
if result == expect: | ||||
print 'OK: A result match expected one' | ||||
else: | ||||
print 'NG: A result %s does not match expected one!' % result | ||||
David Warde-Farley
|
r8749 | |||
smithj1
|
r6263 | def test_dollar(): | ||
samples = { | ||||
u"no dollar": u"no dollar", | ||||
u"$only$": u":math:`only`", | ||||
u"$first$ is good": u":math:`first` is good", | ||||
u"so is $last$": u"so is :math:`last`", | ||||
u"and $mid$ too": u"and :math:`mid` too", | ||||
u"$first$, $mid$, $last$": u":math:`first`, :math:`mid`, :math:`last`", | ||||
u"dollar\$ escape": u"dollar$ escape", | ||||
u"dollar \$escape\$ too": u"dollar $escape$ too", | ||||
u"emb\ $ed$\ ed": u"emb\ :math:`ed`\ ed", | ||||
u"$first$a": u"$first$a", | ||||
u"a$last$": u"a$last$", | ||||
u"a $mid$dle a": u"a $mid$dle a", | ||||
} | ||||
for expr, expect in samples.items(): | ||||
test_expr(expr, expect) | ||||
David Warde-Farley
|
r8749 | |||
smithj1
|
r6263 | if __name__ == "__main__": | ||
David Warde-Farley
|
r8749 | import sys | ||
import locale | ||||
import codecs | ||||
smithj1
|
r6263 | encoding = locale.getpreferredencoding() | ||
sys.stdout = codecs.getwriter(encoding)(sys.stdout) | ||||
sys.stdin = codecs.getreader(encoding)(sys.stdin) | ||||
import optparse | ||||
parser = optparse.OptionParser(usage='usage: %prog [options]') | ||||
parser.add_option("-i", "--input", dest="expr", type="string", | ||||
help="input $math$ expression to test") | ||||
parser.add_option("-o", "--output", dest="expect", type="string", | ||||
help="output result you expect") | ||||
opts, args = parser.parse_args() | ||||
if opts.expr: | ||||
expression = unicode(opts.expr, encoding) | ||||
if opts.expect: | ||||
expected = unicode(opts.expect, encoding) | ||||
test_expr(expression, expected) | ||||
else: | ||||
print replace_dollar(expression) | ||||
else: | ||||
if opts.expect: | ||||
parser.print_help() | ||||
parser.error("output option requires input expression") | ||||
else: | ||||
test_dollar() | ||||