Lua用の使いやすいCSSセレクターパーサーライブラリーを開発しました。これは、クリアコードが株式会社セナネットワークス様からの発注を受けて開発したライブラリーです。
LuaCS(るあっくす)といいます。MITライセンスで公開しています。
LuaCSは、CSSセレクターをXPathに変換する機能を提供しています。 また、XMLuaと連携して、XML/HTMLのDOM内のノードをCSSセレクターで検索できます。
インストール方法
ライブラリーは、LuaRocksで公開しており、luarocks
コマンドで簡単にインストールできます。
例えば、Debian GNU/Linuxでは以下のようにインストールします。
% sudo luarocks install luacs
Debian GNU/Linux以外のOSでのインストールは、LuaCS - インストールを参照してください。
LuaCSは、Debian GNU/Linuxの他に、Ubuntu、CentOS、macOSに対応しています。
主な機能
LuaCSの主な機能を紹介します。
LuaCSを使うとLuaで以下のことができます。
CSSセレクターをXPathへ変換する
LuaCSを使って、簡単にCSSセレクターをXPathへ変換できます。
具体的には、to_xpaths
という関数を使って以下のように変換します。
local luacs = require("luacs")
-- CSSセレクターをXPathに変換
local xpaths = luacs.to_xpaths("*, .class, #id")
for _, xpath in ipairs(xpaths) do
print(xpath)
-- /descendant::*
-- /descendant::*[@class][contains(concat(' ', normalize-space(@class), ' '), ' class ')]
-- /descendant::*[@id='id' or @name='id']
end
上記のように、to_xpath
の引数には、,
区切りで複数のCSSセレクターを指定できます。
XMLuaと連携して、XML/HTMLのDOM内のノードをCSSセレクターを使って検索する。
Lua用HTML・XML処理ライブラリー XMLua は、version 1.0.4 からCSSセレクターを用いたノードの検索をサポートしています。 XMLuaのCSSセレクターを用いた検索機能は、LuaCSを使って実現しています。
CSSセレクターを用いた検索は、以下のように行います。
検索条件にマッチしたノードは、Luaのテーブルとして取得できますので、[]
を用いたアクセスや#
を用いて、検索条件にマッチしたノード数を取得できます。
local xmlua = require("xmlua")
local xml = [[
<root>
<sub1 class="A" id="CB"/>
<sub1 class="B"/>
<sub1 class="C">
<sub1 class="B" id="CB"/>
</sub1>
<sub2 class="B"/>
<sub1 class="D"/>
</root>
]]
local document = xmlua.XML.parse(xml)
-- class="B" または、id="CB"の要素をすべて検索します。
local all_classes = document:css_select(".B, #CB")
-- "#"を使ってマッチしたノードの数を出力できます。
print(#all_classes) -- -> 4
-- "[]"を使って、N番目のノードにアクセスできます。
print(all_classes[1]:to_xml()) -- -> <sub1 class="B"/>
print(all_classes[2]:to_xml()) -- -> <sub1 class="B" id="CB"/>
print(all_classes[3]:to_xml()) -- -> <sub2 class="B"/>
print(all_classes[4]:to_xml()) -- -> <sub1 class="A" id="CB"/>
おわりに
LuaCSの主な機能を紹介しました。より詳しい内容については、以下のドキュメントも参照してください。
このライブラリーは、XMLuaと同様株式会社セナネットワークス様からの依頼を受けて開発した受託開発の成果物です。
成果物をフリーソフトウェアとして公開すると、様々なユーザーがライブラリーを使うことによって、いままで気が付かなかったバグを発見できたり、ユーザーからの要望によって、当初想定していなかった、便利な新機能を実装するきっかけとなったり、様々なメリットがあます。
このように成果物の公開によって、ライブラリーの品質も高まるので、お客さんにとっても成果物を公開するメリットがあります。
ご依頼主の株式会社セナネットワークス様には、上記のようなメリットにご理解をいただき、成果を公開できました。ありがとうございます!