diff --git a/README.md b/README.md index 277fe6a..52ab435 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,15 @@ the `MERMAID_THEME` variable. {% startmermaid "dark" %}graph LR; A--B;{% endmermaid %} ``` +### Mermaid use CDN + +By default, Django Mermaid uses the local copy of mermaid from staticfiles. However, if you want to use the CDN version +directly, you can set the `MERMAID_USE_CDN` variable in your Django project's **settings.py** file. + +```python +MERMAID_USE_CDN = True +``` + ### Mermaid theme variables You can define your custom theme by overriding the `MERMAID_THEME_VARIABLES` variable. You will need to use diff --git a/src/django_mermaid/__init__.py b/src/django_mermaid/__init__.py index a73339b..00ec2dc 100644 --- a/src/django_mermaid/__init__.py +++ b/src/django_mermaid/__init__.py @@ -1 +1 @@ -__version__ = "0.0.8" +__version__ = "0.0.9" diff --git a/src/django_mermaid/apps.py b/src/django_mermaid/apps.py index a2d3a0b..340bd9a 100644 --- a/src/django_mermaid/apps.py +++ b/src/django_mermaid/apps.py @@ -5,6 +5,7 @@ from django.conf import settings from .templatetags import DEFAULT_VERSION +from .templatetags import MERMAID_CDN class MermaidConfig(AppConfig): @@ -13,7 +14,6 @@ class MermaidConfig(AppConfig): def ready(self): """Download mermaid.js from CDN if not already present""" version = getattr(settings, "MERMAID_VERSION", DEFAULT_VERSION) - cdn = "https://cdnjs.cloudflare.com/ajax/libs/mermaid/%s/mermaid.min.js" % version current_dir = pathlib.Path(__file__).parent static_dir = current_dir / "static" mermaid_dir = static_dir / "mermaid" / version @@ -21,4 +21,4 @@ def ready(self): if not mermaid_js.exists() or \ mermaid_js.stat().st_size == 0: mermaid_dir.mkdir(parents=True, exist_ok=True) - urlretrieve(cdn, str(mermaid_js)) + urlretrieve(MERMAID_CDN % version, str(mermaid_js)) diff --git a/src/django_mermaid/templatetags/__init__.py b/src/django_mermaid/templatetags/__init__.py index 3c464ff..1075208 100644 --- a/src/django_mermaid/templatetags/__init__.py +++ b/src/django_mermaid/templatetags/__init__.py @@ -1,7 +1,12 @@ +MERMAID_CDN = "https://cdnjs.cloudflare.com/ajax/libs/mermaid/%s/mermaid.min.js" + DEFAULT_VERSION = "9.4.3" # default to latest stable version DEFAULT_THEME = "default" # use the mermaid 'default' theme +DEFAULT_USE_CDN = False # use local mermaid.js by default __all__ = [ + "DEFAULT_USE_CDN", "DEFAULT_VERSION", "DEFAULT_THEME", + "MERMAID_CDN", ] diff --git a/src/django_mermaid/templatetags/mermaid.py b/src/django_mermaid/templatetags/mermaid.py index a9b328a..44e86cd 100644 --- a/src/django_mermaid/templatetags/mermaid.py +++ b/src/django_mermaid/templatetags/mermaid.py @@ -7,7 +7,9 @@ from django.utils.safestring import mark_safe from . import DEFAULT_THEME +from . import DEFAULT_USE_CDN from . import DEFAULT_VERSION +from . import MERMAID_CDN register = template.Library() @@ -24,10 +26,11 @@ def mermaid(diagram=None, theme=None): """ version = getattr(settings, "MERMAID_VERSION", DEFAULT_VERSION) + use_cdn = getattr(settings, "MERMAID_USE_CDN", DEFAULT_USE_CDN) theme = theme or getattr(settings, "MERMAID_THEME", DEFAULT_THEME) theme_variables = getattr(settings, "MERMAID_THEME_VARIABLES", {}) if theme == "base" else {} - mermaid_uri = static("mermaid/%s/mermaid.js" % version) + mermaid_uri = MERMAID_CDN % version if use_cdn else static("mermaid/%s/mermaid.js" % version) html = "
%s
" % (diagram or "", mermaid_uri) init_properties = {"startOnLoad": True, "theme": theme, "themeVariables": theme_variables} return html + "" % json.dumps(init_properties) diff --git a/tests/test_tag.py b/tests/test_tag.py index 976082b..c3d6d55 100644 --- a/tests/test_tag.py +++ b/tests/test_tag.py @@ -36,6 +36,24 @@ def test_tag_use_in_template(version, template_code): ) +@override_settings(MERMAID_USE_CDN=True) +@pytest.mark.parametrize( + "template_code", + [ + "{% load mermaid %}{% mermaid content %}", + "{% load mermaid %}{% startmermaid %}{{ content|safe }}{% endmermaid %}" + ] +) +def test_tag_use_mermaid_cdn(version, template_code): + template = Template(template_code) + template = template.render(Context({"content": "graph LR; A-->B;"})) + assert template == ( + "
graph LR; A-->B;
" + "" % version + ) + + @override_settings(MERMAID_THEME="forest") @pytest.mark.parametrize( "template_code",