6 Commits

3 changed files with 50 additions and 16 deletions

View File

@ -655,7 +655,7 @@ class TxtConverter:
def get_output_filename(self, path):
return ""
def create_converter(self, args):
def create_converter(self, args, filename='default.txt'):
return None
def run(self, args=sys.argv[1:], out=sys.stdout, err=sys.stderr):
@ -704,7 +704,7 @@ class Txt2HtmlConverter(TxtConverter):
parser.add_argument('files', metavar='file', nargs='+', help='one or more files to convert')
return parser
def create_converter(self, args):
def create_converter(self, args, filename='default.txt'):
converter = Txt2Html()
converter.append_page_break = args.breakflag
converter.create_title = args.create_title

View File

@ -23,11 +23,25 @@ import re
import argparse
from lammpsdoc import lammps_filters
from lammpsdoc.txt2html import Markup, Formatting, TxtParser, TxtConverter
from collections import OrderedDict
def simplify_anchor(anchor_url):
""" Remove repeating words, but leave repeating numbers """
def unique_words(s):
parts = s.split('_')
last_word = ""
for word in parts:
if word.isdecimal() or word != last_word:
yield word
last_word = word
return '_'.join(unique_words(anchor_url))
class RSTMarkup(Markup):
def __init__(self):
def __init__(self, filename='default.rst'):
super().__init__()
self.filename = os.path.basename(filename)
def bold_start(self):
return "**"
@ -104,11 +118,20 @@ class RSTMarkup(Markup):
anchor_pos = href.find('#')
if anchor_pos >= 0 and not href.startswith('http'):
href = href[anchor_pos+1:]
if anchor_pos > 0 and not href.startswith('http'):
filename = os.path.splitext(href[0:anchor_pos])[0]
href = href[anchor_pos + 1:]
href = simplify_anchor(filename + "_" + href)
return ":ref:`%s <%s>`" % (content, href)
elif anchor_pos == 0 and not href.startswith('http'):
filename = os.path.splitext(self.filename)[0]
href = href[anchor_pos + 1:]
href = simplify_anchor(filename + "_" + href)
return ":ref:`%s <%s>`" % (content, href)
if href in self.references:
filename = os.path.splitext(self.filename)[0]
href = simplify_anchor(filename + "_" + href)
return ":ref:`%s <%s>`" % (content, href)
elif href in self.aliases:
href = "%s_" % href
@ -122,8 +145,9 @@ class RSTMarkup(Markup):
class RSTFormatting(Formatting):
RST_HEADER_TYPES = '#*=-^"'
def __init__(self, markup):
def __init__(self, markup, filename = 'default.rst'):
super().__init__(markup)
self.filename = os.path.basename(filename)
self.indent_level = 0
def paragraph(self, content):
@ -165,7 +189,9 @@ class RSTFormatting(Formatting):
def named_link(self, paragraph, name):
self.markup.add_internal_reference(name)
return (".. _%s:\n\n" % name) + paragraph
filename = os.path.splitext(self.filename)[0]
name = simplify_anchor(filename + "_" + name)
return (".. _%s:\n\n" % self.markup.unescape_rst_chars(name)) + paragraph
def define_link_alias(self, paragraph, alias, value):
self.markup.add_link_alias(alias, value)
@ -347,10 +373,10 @@ class RSTFormatting(Formatting):
class Txt2Rst(TxtParser):
def __init__(self):
def __init__(self, filename='default.rst'):
super().__init__()
self.markup = RSTMarkup()
self.format = RSTFormatting(self.markup)
self.markup = RSTMarkup(filename=filename)
self.format = RSTFormatting(self.markup,filename=filename)
self.register_filters()
def register_filters(self):
@ -394,8 +420,8 @@ class Txt2RstConverter(TxtConverter):
parser.add_argument('files', metavar='file', nargs='+', help='one or more files to convert')
return parser
def create_converter(self, args):
return Txt2Rst()
def create_converter(self, args, filename='default.txt'):
return Txt2Rst(filename=self.get_output_filename(filename))
def get_output_filename(self, path):
filename, ext = os.path.splitext(path)

View File

@ -411,18 +411,26 @@ class TestSpecialCommands(unittest.TestCase):
def test_internal_reference_link(self):
s = self.txt2rst.convert("one :link(name)\n"
"a \"link\"_name to above\n")
self.assertEqual(".. _name:\n"
self.assertEqual(".. _default_name:\n"
"\n"
"one \n\n"
"a :ref:`link <name>` to above\n\n", s)
"a :ref:`link <default_name>` to above\n\n", s)
def test_local_anchor_link(self):
s = self.txt2rst.convert("one :link(name)\n"
"a \"link\"_#name to above\n")
self.assertEqual(".. _name:\n"
self.assertEqual(".. _default_name:\n"
"\n"
"one \n\n"
"a :ref:`link <name>` to above\n\n", s)
"a :ref:`link <default_name>` to above\n\n", s)
def test_repeating_words_in_anchor_link(self):
s = self.txt2rst.convert("one :link(name_name_2_2)\n"
"a \"link\"_#name_name_2_2 to above\n")
self.assertEqual(".. _default_name_2_2:\n"
"\n"
"one \n\n"
"a :ref:`link <default_name_2_2>` to above\n\n", s)
def test_external_anchor_link(self):
s = self.txt2rst.convert('some text "containing a\n'