vscode-markdown-preview-enhanced icon indicating copy to clipboard operation
vscode-markdown-preview-enhanced copied to clipboard

[Feature Request] support callout

Open zhuzhzh opened this issue 1 year ago • 7 comments

callout is one concept from Obsidian. See https://help.obsidian.md/Editing+and+formatting/Callouts

github already supports it. see https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#alerts

It looks mkdocs can support it with the plugin. See https://pypi.org/project/mkdocs-callouts/

[!TIP] try it

Please help check if MPE can support callout. Thanks!

zhuzhzh avatar Dec 29 '23 09:12 zhuzhzh

I support this request, would be very nice to have!

bjesuiter avatar Mar 26 '24 23:03 bjesuiter

[!note] related to #636

marcorossiIT avatar Apr 09 '24 11:04 marcorossiIT

Any update on this? Would love this feature!

brandonpeebles avatar Jan 17 '25 15:01 brandonpeebles

Would love to have this.

sun-cube avatar Feb 23 '25 04:02 sun-cube

I need this, so that docs can be compatible with Github and Obsidian and Foam.

ajkdrag avatar Apr 13 '25 13:04 ajkdrag

Since MPE can extend its markdown parser, I ask google gemini to write a parser for me to convert callout to Admonition which is supported by MPE. And it works quite good! 😀

You can replace the global markdown parser function onWillParseMarkdown with the following code in the parser.js file. (click ctrl+shift+p in vscode and search Markdown Preview Enhanced: Extend Parser (Global))

onWillParseMarkdown: async function (markdown) {
  return new Promise((resolve, reject) => {
    const calloutRegex = /^> ?\[!(?<type>\w+)\](?<title>.*)?\r?\n(?<content>(?:>.*\r?\n?)*)/gm;
    const newMarkdown = markdown.replace(
      calloutRegex,
      (match, type, title, content) => {
        const admonitionType = type.toLowerCase();
        const admonitionTitle = title && title.trim() ? `${title.trim()}` : "";

        const admonitionContent = content
          .replace(/^> ?/gm, "")
          .split(/\r?\n/)
          .map((line) => `    ${line}`)
          .join("\n");
        return `!!! ${admonitionType} ${admonitionTitle}\n${admonitionContent}\n\n`;
      }
    );
    return resolve(newMarkdown);
  });
}

preview:

Image

EmmetZ avatar Jul 05 '25 06:07 EmmetZ

Since MPE can extend its markdown parser, I ask google gemini to write a parser for me to convert callout to Admonition which is supported by MPE. And it works quite good! 😀

You can replace the global markdown parser function onWillParseMarkdown with the following code in the parser.js file. (click ctrl+shift+p in vscode and search Markdown Preview Enhanced: Extend Parser (Global))

onWillParseMarkdown: async function (markdown) { return new Promise((resolve, reject) => { const calloutRegex = /^> ?[!(?\w+)](?.<em>)?\r?\n(?<content>(?:>.</content></em>\r?\n?)*)/gm; const newMarkdown = markdown.replace( calloutRegex, (match, type, title, content) => { const admonitionType = type.toLowerCase(); const admonitionTitle = title && title.trim() ? <code>${title.trim()}</code> : "";

    const admonitionContent = content
      .replace(/^> ?/gm, "")
      .split(/\r?\n/)
      .map((line) => `    ${line}`)
      .join("\n");
    return `!!! ${admonitionType} ${admonitionTitle}\n${admonitionContent}\n\n`;
  }
);
return resolve(newMarkdown);

}); }

preview: Image

Great! If you test it fully, I think you should release one PR so that every one can enjoy it

zhuzhzh avatar Jul 17 '25 06:07 zhuzhzh