diff --git a/src/sphinx_ext_mystmd/builder.py b/src/sphinx_ext_mystmd/builder.py index b35eb41..1d84d16 100644 --- a/src/sphinx_ext_mystmd/builder.py +++ b/src/sphinx_ext_mystmd/builder.py @@ -7,7 +7,7 @@ import hashlib from .transform import MySTNodeVisitor -from .utils import to_text, find_by_type, breadth_first_walk +from .utils import to_text, find_by_type, breadth_first_walk, title_to_name logger = logging.getLogger(__name__) @@ -17,7 +17,8 @@ class MySTBuilder(Builder): name = "myst" def _slugify(self, path): - return path.replace("/", "-") + name = os.path.basename(path) + return title_to_name(name) def _get_xref_path(self, doc_name): target_stem = self._slugify(doc_name) diff --git a/src/sphinx_ext_mystmd/transform.py b/src/sphinx_ext_mystmd/transform.py index c02c986..701d394 100644 --- a/src/sphinx_ext_mystmd/transform.py +++ b/src/sphinx_ext_mystmd/transform.py @@ -5,7 +5,7 @@ from sphinx.util import logging -from .utils import normalize_label +from .utils import normalize_label logger = logging.getLogger(__name__) diff --git a/src/sphinx_ext_mystmd/utils.py b/src/sphinx_ext_mystmd/utils.py index 639e63b..9816cba 100644 --- a/src/sphinx_ext_mystmd/utils.py +++ b/src/sphinx_ext_mystmd/utils.py @@ -2,6 +2,23 @@ import collections +def title_to_name(title): + return input_to_name(title.replace("&", "¶and¶"), re.compile(r"[a-z0-9-]"), "-")[:50] + + +def input_to_name(input_, allowed, join): + escaped = ''.join([c if allowed.search(c) else '¶' for c in f"¶{input_}".lower()]) + unique = re.sub(r"¶+", "¶", escaped) + name = re.sub("¶", join, unique[1:]) + if join: + name = re.sub(f"{join}+", join, name) + if name[0] == join: + name = name[1:] + if name[-1] == join: + name = name[:-1] + return name + + def normalize_label( label, ):