export function setup(helper) {
  if (helper.getOptions().previewing) {
    return;
  }

  helper.registerPlugin((md) => {
    md.core.ruler.push("anchor", (state) => {
      for (
        let idx = 0, lvl = 0, headingId = 0;
        idx < state.tokens.length;
        idx++
      ) {
        if (
          state.tokens[idx].type === "blockquote_open" ||
          (state.tokens[idx].type === "bbcode_open" &&
            state.tokens[idx].tag === "aside")
        ) {
          ++lvl;
        } else if (
          state.tokens[idx].type === "blockquote_close" ||
          (state.tokens[idx].type === "bbcode_close" &&
            state.tokens[idx].tag === "aside")
        ) {
          --lvl;
        }

        if (lvl > 0 || state.tokens[idx].type !== "heading_open") {
          continue;
        }

        const linkOpen = new state.Token("link_open", "a", 1);
        const linkClose = new state.Token("link_close", "a", -1);

        let slug = state.tokens[idx + 1].content
          .toLowerCase()
          .replace(/\s+/g, "-")
          .replace(/[^\w\-]+/g, "")
          .replace(/\-\-+/g, "-")
          .replace(/^-+/, "")
          .replace(/-+$/, "");

        if (slug.match(/^[^a-z]/)) {
          slug = `h-${slug}`;
        }

        slug = `${slug || "h"}-${++headingId}`;

        linkOpen.attrSet("name", slug);
        linkOpen.attrSet("class", "anchor");
        linkOpen.attrSet("href", "#" + slug);

        state.tokens[idx + 1].children.unshift(linkClose);
        state.tokens[idx + 1].children.unshift(linkOpen);
      }
    });
  });
}