1717# Constants and utilities
1818# ------------------------
1919# the default (recommended) mermaid lib
20- MERMAID_LIB_VERSION = '10.1.0'
21- # MERMAID_LIB = "https://unpkg.com/mermaid@%s/dist/mermaid.min.js"
22- MERMAID_LIB_PRE_10 = "https://unpkg.com/mermaid@%s/dist/mermaid.min.js"
23- MERMAID_LIB = "https://unpkg.com/mermaid@%s/dist/mermaid.esm.min.mjs"
20+ JAVASCRIPT_VERSION = '10.1.0'
21+ JAVASCRIPT_PRE_10 = "https://unpkg.com/mermaid@%s/dist/mermaid.min.js"
22+ JAVASCRIPT = "https://unpkg.com/mermaid@%s/dist/mermaid.esm.min.mjs"
2423
2524
2625
@@ -40,7 +39,8 @@ class MarkdownMermaidPlugin(BasePlugin):
4039 """
4140 config_scheme = (
4241
43- ('version' , PluginType (str , default = MERMAID_LIB_VERSION )),
42+ ('version' , PluginType (str , default = JAVASCRIPT_VERSION )),
43+ ('javascript' , PluginType (str , default = None )),
4444 ('arguments' , PluginType (dict , default = {})),
4545 # ('custom_loader', PluginType(bool, default=False))
4646 )
@@ -70,9 +70,9 @@ def mermaid_version(self) -> str:
7070 """
7171 The version of mermaid
7272 This information comes from the YAML file parameter,
73- or, if empty, from MERMAID_LIB_VERSION .
73+ or, if empty, from JAVASCRIPT_VERSION .
7474 """
75- version = self .config ['version' ]
75+ version = self .config ['version' ] or JAVASCRIPT_VERSION
7676 assert version , "No correct version of mermaid is provided!"
7777 return version
7878
@@ -89,41 +89,60 @@ def mermaid_major_version(self) -> int:
8989
9090
9191 @property
92- def extra_mermaid_lib (self ) -> str :
92+ def extra_javascript (self ) -> str :
9393 """
94- Provides the mermaid library defined in mkdocs.yml (if any)
94+ Provides the mermaid.js library defined in mkdocs.yml
95+ under extra_javascript.
96+
97+ To be recognized, the library must have 'mermaid' in the filename.
98+
99+ WARNING:
100+ Using extra_javascript for that purpose was the original way,
101+ but is now DEPRECATED; it bypasses the new and better mechanisms
102+ for selecting the javascript library.
103+ It will insert the mermaid library in all pages, regardless
104+ of whether a mermaid diagram is present or not.
95105 """
96- # As of mkdocs 1.5, extra_javascript is a list of objects;
97- # no longer a string. Call to str was used.
98- # Patched in 1.5.1, with __fspath___ method,
99- # see https://github.com/mkdocs/mkdocs/issues/3310
100- # But we keep it, to guarantee it's a string.
101- extra_javascript = map (str , self .full_config .get ('extra_javascript' , []))
102- for lib in extra_javascript :
103- # get the actual library name
104- if libname (lib ) == 'mermaid' :
105- return lib
106- return ''
106+ if not hasattr (self , '_extra_javascript' ):
107+ # As of mkdocs 1.5, extra_javascript is a list of objects;
108+ # no longer a string. Call to str was used.
109+ # Patched in 1.5.1, with __fspath___ method,
110+ # see https://github.com/mkdocs/mkdocs/issues/3310
111+ # But we keep it, to guarantee it's a string.
112+ extra_javascript = map (str , self .full_config .get ('extra_javascript' , []))
113+ for lib in extra_javascript :
114+ # check that 'mermaid' is in the filename, minus the extension.
115+ basename = os .path .basename (lib )
116+ basename , ext = os .path .splitext (basename )
117+ if 'mermaid' in basename .lower ():
118+ self ._extra_javascript = lib
119+ return lib
120+ self ._extra_javascript = None
121+ return self ._extra_javascript
107122
108123
109124 @property
110- def mermaid_lib (self ) -> str :
125+ def javascript (self ) -> str :
111126 """
112- Provides the url of mermaid library according to version
113- (distinction between version < 10 and after)
127+ Provides the url/pathanme of mermaid library according to version
128+ (distinction on the default, between version < 10 and after)
114129 """
115- if not hasattr (self , '_mermaid_lib' ):
116- if self .mermaid_major_version < 10 :
117- mermaid_lib = MERMAID_LIB_PRE_10 % self .mermaid_version
118- else :
119- # newer versions
120- mermaid_lib = MERMAID_LIB % self .mermaid_version
121- # make checks
122- if not url_exists (mermaid_lib ):
130+ if not hasattr (self , '_javascript' ):
131+ # check if a mermaid javascript parameter exists:
132+ javascript = self .config ['javascript' ]
133+ if not javascript :
134+ if self .mermaid_major_version < 10 :
135+ javascript = JAVASCRIPT_PRE_10 % self .mermaid_version
136+ else :
137+ # newer versions
138+ javascript = JAVASCRIPT % self .mermaid_version
139+ # make checks
140+ if not url_exists (javascript ,
141+ local_base_dir = self .full_config ['docs_dir' ]):
123142 raise FileNotFoundError ("Cannot find Mermaid library: %s" %
124- mermaid_lib )
125- self ._mermaid_lib = mermaid_lib
126- return self ._mermaid_lib
143+ javascript )
144+ self ._javascript = javascript
145+ return self ._javascript
127146
128147
129148 @property
@@ -186,13 +205,18 @@ def on_config(self, config):
186205 assert isinstance (self .mermaid_args , dict )
187206 info ("Initialization arguments:" , self .mermaid_args )
188207 # info on the javascript library:
189- if self .extra_mermaid_lib :
190- info ("Explicit mermaid javascript library:\n " ,
191- self .extra_mermaid_lib )
208+ if self .extra_javascript :
209+ info ("Explicit mermaid javascript library from extra_javascript:\n " ,
210+ self .extra_javascript )
211+ info ("WARNING: Using extra_javascript is now DEPRECATED; "
212+ "use mermaid:javascript instead!" )
213+ elif self .config ['javascript' ]:
214+ info ("Using specified javascript library: %s" %
215+ self .config ['javascript' ])
192216 else :
193217 info ("Using javascript library (%s):\n " %
194218 self .config ['version' ],
195- self .mermaid_lib )
219+ self .javascript )
196220
197221 def on_post_page (self , output_content , config , page , ** kwargs ):
198222 """
@@ -239,23 +263,23 @@ def on_post_page(self, output_content, config, page, **kwargs):
239263 # insertion of the <script> tag, with the initialization arguments
240264 new_tag = soup .new_tag ("script" )
241265 js_code = [] # the code lines
242- if not self .extra_mermaid_lib :
266+ if not self .extra_javascript :
243267 # if no extra library mentioned,
244268 # add the <SCRIPT> tag needed for mermaid
245- info ("Adding call to script for version"
246- f"{ self .mermaid_version } ." )
247- if self .mermaid_major_version < 10 :
248- # <script src="...">
249- new_tag ['src' ] = self .mermaid_lib
250- # it's necessary to close and reopen the tag:
251- soup .body .append (new_tag )
252- new_tag = soup .new_tag ("script" )
253- else :
269+ if self .javascript .endswith ('.mjs' ):
254270 # <script type="module">
255271 # import mermaid from ...
256272 new_tag ['type' ] = "module"
257273 js_code .append ('import mermaid from "%s";'
258- % self .mermaid_lib )
274+ % self .javascript )
275+ else :
276+ # <script src="...">
277+ # generally for self.mermaid_major_version < 10:
278+ new_tag ['src' ] = self .javascript
279+ # it's necessary to close and reopen the tag:
280+ soup .body .append (new_tag )
281+ new_tag = soup .new_tag ("script" )
282+
259283 # (self.mermaid_args), as found in the config file.
260284 if self .activate_custom_loader :
261285 # if the superfences extension is present, use the specific loader
0 commit comments