@@ -36,8 +36,6 @@ class MetaMarkdown(Markdown):
3636 Dictionary of text aliases
3737 project :
3838 Ford project instance
39- relative :
40- Should internal URLs be relative
4139 base_url :
4240 Base/project URL for relative links (required if
4341 ``relative`` is True)
@@ -47,12 +45,11 @@ class MetaMarkdown(Markdown):
4745 def __init__ (
4846 self ,
4947 md_base : PathLike = "." ,
48+ base_url : PathLike = "." ,
5049 extensions : Optional [List [Union [str , Extension ]]] = None ,
5150 extension_configs : Optional [Dict [str , Dict ]] = None ,
5251 aliases : Optional [Dict [str , str ]] = None ,
5352 project : Optional [Project ] = None ,
54- relative : bool = False ,
55- base_url : Optional [PathLike ] = None ,
5653 ):
5754 """make thing"""
5855
@@ -71,10 +68,9 @@ def __init__(
7168 if project is not None :
7269 default_extensions .append (FordLinkExtension (project = project ))
7370
74- if relative :
75- if base_url is None :
76- raise ValueError ("Expected path for base_url, got None" )
77- default_extensions .append (RelativeLinksExtension (base_url = base_url ))
71+ self .base_url = Path (base_url )
72+ if base_url != "." :
73+ default_extensions .append (RelativeLinksExtension ())
7874
7975 if extensions is None :
8076 extensions = []
@@ -116,7 +112,14 @@ def convert(
116112 """
117113
118114 self .current_context = context
119- self .current_path = path
115+ if (
116+ path is None
117+ and context is not None
118+ and (url := context .get_url ()) is not None
119+ ):
120+ self .current_path = self .base_url / Path (url ).parent
121+ else :
122+ self .current_path = path
120123 return super ().convert (source )
121124
122125
@@ -235,7 +238,14 @@ def find_child(context):
235238 link .text = name
236239 return link
237240
238- link .attrib ["href" ] = item .get_url ()
241+ if (item_url := item .get_url ()) is None :
242+ # This is really to keep mypy happy
243+ raise RuntimeError (f"Found item { name } but no url" )
244+
245+ # Make sure links are relative to base url
246+ full_url = self .md .base_url / item_url
247+ rel_url = relpath (full_url , self .md .current_path )
248+ link .attrib ["href" ] = str (rel_url )
239249 link .text = item .name
240250 return link
241251
@@ -262,8 +272,8 @@ class RelativeLinksTreeProcessor(Treeprocessor):
262272
263273 md : MetaMarkdown
264274
265- def __init__ (self , md : MetaMarkdown , base_url : Path ):
266- self .base_url = base_url .resolve ()
275+ def __init__ (self , md : MetaMarkdown ):
276+ self .base_url = md . base_url .resolve ()
267277 super ().__init__ (md )
268278
269279 def _fix_attrib (self , tag : Element , attrib : str ):
@@ -290,11 +300,7 @@ class RelativeLinksExtension(Extension):
290300 """Markdown extension to register `RelativeLinksTreeProcessor`"""
291301
292302 def __init__ (self , ** kwargs ):
293- self .config = {"base_url" : [kwargs ["base_url" ], "Base URL of project" ]}
294303 super ().__init__ (** kwargs )
295304
296305 def extendMarkdown (self , md : MetaMarkdown ): # type: ignore[override]
297- base_url : Path = self .getConfig ("base_url" )
298- md .treeprocessors .register (
299- RelativeLinksTreeProcessor (md , base_url = base_url ), "relative_links" , 5
300- )
306+ md .treeprocessors .register (RelativeLinksTreeProcessor (md ), "relative_links" , 5 )
0 commit comments