Skip to content

Mermaid graphs on multiple pages only render on first synchronous load  #504

Closed
@jfmou

Description

@jfmou

Hi all,

Thanks a lot for the awesome work done on docsify, love it !
I'm having troubles with 2 mermaid graphs on two separate pages.
When I access each of these pages synchronously, each graph renders correctly.
But when I try to navigate from one page to the other, the second one asynchronously loaded doesn't have any graph rendered.
On click, it does go through the following snippet :

<script>
  mermaid.initialize({ startOnLoad: false });
  window.$docsify = {
    name: 'COP Front',
    coverpage: true,
    loadSidebar: true,
    subMaxLevel: 3,
    auto2top: true,
    themeColor: '#4e93a5',
    markdown: {
      renderer: {
        code: function(code, lang) {
          if (lang === "mermaid") {
            return (
              '<div class="mermaid">' + mermaid.render(lang, code) + "</div>"
            );
          }
          return this.origin.code.apply(this, arguments);
        }
      }
    }
  }
</script>

Mermaid seems to generate the proper svg graph based on raw text.
But when the destination page is rendered it looks like it didn't replace raw text by svg graph in place resulting in the page rendered without any graph.
I guess i'm missing something, thanks for your help.

Activity

sprungknoedl

sprungknoedl commented on Oct 25, 2018

@sprungknoedl

Hi,

This seems to be caused by the variable lang being used as an ID for mermaid. If you generate a random ID for the first parameter of mermaid.render it works:

<script>
    function makeid(len) {
        var text = new Array(len);
        var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        for (var i = 0; i < len; i++) text[i] = possible.charAt(Math.floor(Math.random() * possible.length));
        return text.join("");
    }

    mermaid.initialize({ startOnLoad: false });
    window.$docsify = {
    markdown: {
        renderer: {
            code: function(code, lang) {
                if (lang === "mermaid") {
                var id = makeid(10);
                var svg = mermaid.render(id, code)
                return (
                    '<div class="mermaid">' + svg + '</div>'
                );
                }
                return this.origin.code.apply(this, arguments);
            }
            }
        },
    }
</script>
jfmou

jfmou commented on Nov 5, 2018

@jfmou
Author

Well thank you very much, it did solve my case. I didn't notice mermaid #render method took an id as first param wasn't obvious for me while reading the demo and/or doc.

Thank you very much !

upupming

upupming commented on Nov 5, 2018

@upupming
Contributor

Thanks a lot, I have encountered this problem too after following docsify's documentation.

This is the problem:

docsify-mermaid-bug-1

I see the element tab on Chrome, there are several graphs with same id mermaid, so this is the root of this problem:

image

But could anyone explain the reason why this happens?

added a commit that references this issue on Nov 6, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @sprungknoedl@jfmou@upupming

        Issue actions

          Mermaid graphs on multiple pages only render on first synchronous load · Issue #504 · docsifyjs/docsify