medfreeman / markdown-it-toc-and-anchor

markdown-it plugin to add a toc and anchor links in headings
MIT License
60 stars 35 forks source link

Token class methods are undefined #29

Closed paulathevalley closed 5 years ago

paulathevalley commented 7 years ago

Before I add markdown-it-toc-and-anchor, there are five class methods available for the tokens:

screen shot 2016-10-12 at 10 43 57 am

After adding markdown-it-toc-and-anchor, they are undefined:

screen shot 2016-10-12 at 10 44 18 am

This is as far as I’ve gotten in debugging, let me know if there’s more helpful information I can provide. I would love to use these class methods if possible.

medfreeman commented 7 years ago

Hi, sorry about the long wait. Can you give me a simple test procedure / code ? I believe i've perhaps fixed this in master, but that would help me test this faster (i'm really busy these days).

Thanks !

paulathevalley commented 7 years ago

Phew, it’s been awhile for me, too! We definitely worked around the missing methods, but unfortunately I don’t remember all the details.

I am currently struggling with including both markdown-it and markdown-it-toc-and-anchor libraries in a JSBin to send you a working sample, but in the meantime, perhaps you’ll be able to see something in our current method that we’re missing.

If not, that’s okay, too.

  setMarkdownRenderer(currentPath) {
    const md = new MarkdownIt({
      html: true,
      linkify: true,
      typographer: true
    });

    md.use(markdownItTocAndAnchor, {
      anchorLinkSymbol: "",
      anchorClassName: "Anchor",
      tocCallback: (tocMarkdown, tocArray) => {
        this.props.updateTocArray(tocArray);
      }
    });

    // store the original rule
    const defaultRender = md.renderer.rules.link_open || function (tokens, idx, options, env, renderer) {
      return renderer.renderToken(tokens, idx, options);
    };

    const basename = this.props.basename;

    // Update links to include the basename
    md.renderer.rules.link_open = function (tokens, idx, options, env, renderer) {
      console.log("tokens[idx] token methods are undefined: ", tokens[idx]);

      // (The workaround to using `attrIndex`)
      const tokenAttrs = tokens[idx].attrs;
      const hrefIdx = findIndex(tokenAttrs, (arr) => arr.indexOf("href") >= 0);
      if (hrefIdx >= 0) {
        const href = tokenAttrs[hrefIdx];
        if (href.length > 1) {
          if (href[1].indexOf("#") === 0) {
            href[1] = `${basename}${currentPath}${href[1]}`;
            tokenAttrs.push(["aria-hidden", "true"]);
          }
        }
      }
      return defaultRender(tokens, idx, options, env, renderer);
    };

    this.md = md;
  }
medfreeman commented 5 years ago

Hi, it has been fixed in this commit, i'll cut a release with it today.

medfreeman commented 5 years ago

fixed in v4.2.0