Closed3
MarpでUnoCSSを使う

今回はMarp CLIでリポジトリに置いたMarkdownからスライドを自動生成することを目指す。
Marp CLIではMarkdown→スライドの変換エンジンにデフォルトでMarp Coreが使用される。
https://github.com/marp-team/marp-cli?tab=readme-ov-file#engineで紹介されているように、このエンジン部分は設定ファイルを作成することで自由に指定することができる。このファイル内で、変換処理後にUnoCSSを噛ませてあげれば良さそう。
結論としては以下の通り。
engine.mjs
import { Marp } from "@marp-team/marp-core";
import { createGenerator } from "@unocss/core";
import markdownItAttrs from "markdown-it-attrs";
import markdownItBracketedSpans from "markdown-it-bracketed-spans";
import markdownItContainer from "markdown-it-container";
import unoConfig from "./uno.config.mjs";
const unoGenerator = await createGenerator(unoConfig);
class UnoMarp extends Marp {
async render(markdown, env) {
const res = super.render(markdown, env);
const { css: unoCss } = await unoGenerator.generate(res.html, {
minify: true,
});
return {
...res,
css: unoCss + res.css,
};
}
}
/**
* @type {import('@marp-team/marp-cli').Config<typeof import('@marp-team/marpit').Marpit>["engine"]}
*/
export default async ({ marp: _marp, ...config }) => {
const uno = new UnoMarp(config);
return uno
.use(markdownItBracketedSpans)
.use(markdownItAttrs)
.use(markdownItContainer, "", {
// allow empty name
validate: () => true,
render: (tokens, idx) => {
const _class = tokens[idx].info.trim();
if (tokens[idx].nesting === 1) {
// opening tag
return `<div class="${_class}">\n`;
}
// closing tag
return "</div>\n";
},
});
};
engine.mjs
でMarpit
クラスまたはMarpit
クラスを返す関数をexportする。
(@marp-team/marp-core
のMarpit
クラスがMarpit
クラスを継承している)
Markdownからhtml, cssへの変換はMarpit.render()
によって行われているため、これをうまくラップすればよい。
UnoCSSによるcssの生成は@unocss/core
で行っている。
render
内でMarpit側で生成されたhtmlからcssを生成し、Marpit側のcssと単に結合しているだけ。
Marp用にUnoCSS側のconfigも最適化する必要がありそうだけど(extractorとか)これで動いているので一旦保留。
あとはMarkdown内で簡単にクラスを指定する必要がある。見せてあげよう、Marp の真髄をで紹介されているように、とりあえずmarkdown-it-attrs
を使うのが楽か。
これで{.bg-red}
などと書けば動作するようになった🎉

TODO
- VSCodeでannotation表示/autocompleteできるようにする
-
.hoge
のようにクラス直前に.
があるとannotation表示されない - HTMLタグ内でないとautocompleteできないhttps://github.com/unocss/unocss/blob/8cfcf603ae54fa92098ed32e1dfe3148eac1d796/packages/vscode/src/utils.ts#L206-L225
-
-
{.hoge .puni .poyo}
の書き方が冗長-
{hoge puni poyo}
で書けるようにmarkdown-itのpluginを書く?
-
このスクラップは2025/01/10にクローズされました