PostCSSには2日目で説明した、ASTを簡単に操作するためのAPIが用意されています。ASTはJavaScriptのオブジェクトなので、JavaScriptの構文で直接変換させることもできますが、より便利に、そして効率の良い処理をするためにも提供されているAPIを使います。
また、PostCSSの全てのAPIはAPIドキュメントで確認することができます。
ノードの種類
まずはASTのノードの種類です。PostCSSのASTのノードは以下の5つです。
-
Root
ノード: ASTの1番上のノード(Root
ノードは親ノードがない) -
Rule
ノード: 1つのルールセット -
AtRule
ノード: 1つの@
ルール -
Declaration
ノード: 1プロパティ宣言 -
Comment
: 1つのコメント
これらは実装的には PostCSSの Node
クラスを継承したもので、Node.type
を参照することで、それが何のノードかを知ることができます。
ノードの探索
次にノードを探索するAPIを見てみましょう。以下の input.css
を入力としたときの例を挙げます。
.foo {
font-size: 1.2rem;
}
.bar {
color: pink;
}
@media (max-width: 415px) {
.foo {
font-size: 1rem;
}
}
Rule
ノードの探索
Rule
ノードは container.walkRules([selector], callback)
というAPIを使って探索することができます。 container
というのは「子ノードを持つことができる(親ノードになることができる)ノード」である Container
クラスのインスタンスです。Root
ノード、Rule
ノード、AtRule
ノードがそれに当たります。
var css = fs.readFileSync('./input.css');
var root = postcss.parse(css); // `input.css`をパースしてASTを返す
root.walkRule(function (rule) {
// 全てのルールセットを探索
});
walkRules()
は第一引数にセレクタ名を文字列(または正規表現)で指定することもできます。
root.walkRules('.foo', function (rule) {
// 全て`.foo`セレクタのルールセットを探索
});
AtRule
ノードの探索
AtRule
ノードは container.walkAtRules([name], callback)
というAPIを使って探索することができます。第一引数に@
ルール名を指定することもできます。
root.walkAtRules('media', function (atrule) {
// `@media` の@ルールを探索
});
Declaration
ノードの探索
AtRule
ノードは container.walkAtRules([prop], callback)
というAPIを使って探索することができます。第一引数にプロパティ名を指定することもできます。
root.walkDecls('font-size', function (decl) {
// `font-size`プロパティのプロパティ宣言を探索
});
Comment
ノードの探索
AtRule
ノードは container.walkAtRules([prop], callback)
というAPIを使って探索することができます。
root.walkComments(function (comment) {
// 全てのコメントを探索
});
ノードの挿入・移動・削除
container.insertBefore(exist, add)
, container.insertAfter(exist, add)
はそれぞれ、ノードの指定した子ノードの直前と直後に新しくノード(add
)を追加するためのAPIです。
rule.insertBefore(decl, { prop: 'color', value: 'pink' }));
node.moveTo(newParent)
は、そのノードを削除し、指定したノードの子要素に追加するものです。
atrule.moveTo(atrule.root());
node.remove()
はノードを削除するためのAPIです。
if ( decl.prop.match(/^-webkit-/) ) {
decl.remove();
}
今日はPostCSSのASTを操作するためのAPIをいくつか紹介しました。これらのAPIを使って、ASTを変換するプラグラムがPostCSSのプラグインです。簡単なプラグインの実装を読んでみると、さらに理解が深まると思います。
明日は、これらのAPIを使って実際にPostCSSのプラグインの書き方を説明します。