LDIF で HTML を書くために ldap2html を作った

このページは 京大マイコンクラブ Advent Calendar 2019 2日目と 京都大学 LDIF 同好会 Advent Calendar 2019 1日目の記事です。京大マイコンクラブ Advent Calendar 2019 の昨日の記事は、 smith の深圳旅行記でした。

ldap2html

こんにちは、京大マイコンクラブ6回生かつ京都大学 LDIF 同好会1回生の nonylene です。

先日、京都大学 LDIF 同好会のページを作るために LDAP エントリから HTML を出力する ldap2html を作りました。

レポジトリ: nonylene/ldap2html

京都大学 LDIF 同好会のページは 全て LDIF で記述されています!!このページの LDIF も 公開されて います。

ldap2html は $ pip install ldap2html でインストール可能です。

LDIF が好きなそこの貴方、LDIF で HTML を書いてみませんか?

経緯

京大マイコンクラブでは部員情報の管理に LDAP を使用しており、部内ネットワークでは LDAP のパケットが日々飛び交っています。また、LDAP の管理の一環で LDIF を書くこともたまにあります。

その流れで京都大学 LDIF 同好会が設立されました。以前に LDIF を触っていた自分も GitHub organization に invite され、「たのんだ」と言われたので何かコンテンツを作ることにしました。

検討

LDIF 同好会なのですから、何かしら LDIF を絡めるべきです。以下のような案を考えていました。

  1. LDIF を Markdown パーサーに食わせてドキュメントを生成する
  2. LDAP で HTML を格納できるように schema を作って登録、 LDIF からデータを流し込んで HTML にする

1 は一見悪くなさそうですが、せいぜいコメントで H1, H2, ... が書けて喜ぶことしかできません。KMC では自前の Schema を作っていることもあり、 2 を採用することにしました。

設計

HTML から LDIF を表示する際の構造は以下のようにしました。大きく分けるとファイル、エレメント、テキストに分けられます。

ファイル

ファイル(htmlFile)はファイル自体を示します。一階層下には htmlTagName=htmlhtmlNormalElement (dn 例: ou=html,o=example.html,dc=example,dc=com) が存在しています。

エレメント

エレメント(html{Normal/Void}Element)はエレメントのタグと属性部分に対応します。Void elements は下の階層が存在しないエレメントです。

使用できるエレメントの属性は Schema で決められています。ここに無い属性を使いたい場合は、Schema を更新することになります。一つ一つ定義しているのは、 LDAP のエントリで動的なキーバリューを持つことが難しいためです。

また、エレメントには htmlNthChild という値を設定することができます。これは、結果の順序が定められていない LDAP において同一階層内の順序を決定するのに用いられます。

テキスト

テキスト(htmlText)はエレメント内のテキストに対応します。

以下は LDAP エントリから HTML への対応付けの例です。

LDAP エントリの構造

LDAP エントリを格納する際、階層の表現方法として Flat 型と Hierarchical 型が存在します。Flat 型の場合は、全てのエレメントやテキストのエントリはそれぞれ一つの階層にまとまっていて、親エレメントに所属する子エレメント・テキストの dn を親エレメントの属性として記述することになります。参考リンク: Appendix A: LDAP - Some Notes on Structuring Directories

Flat 型では、人員再配置などグループの移動がしやすいというメリットがあります。しかし、今回は以下の理由により Flat 型の採用は見合わせました。

また、dn の特性を活かして各エレメントの id には dn を設定するようにしました。

実装

Schema の設計が終わると後は Schema を定義し、実装するだけです。ldap2html は Python3 で実装しました。

LDIF で HTML を書いた感想

しんどいです!LDIF って HTML 書くのに向いてなさそう!この記事を手で書くには大変すぎるのである方法を使っています(近日公開)。

例えばエレメントを一番上に挿入したいときには既存の htmlNthChild が大変なことになります。そんな欠点はあるものの、LDIF 大好きなので最高です!

追伸: ku-ldif.github.io は 「DON'T MODIFY LDIF, DO ADD NEW LDIF.」を掲げておりますが、今回は諸事情により force-push を繰り返してしまいました。同好会の皆様には大変失礼致しました。

京大マイコンクラブ Advent Calendar 2019 の明日の担当は opesan で、「聖地巡礼記2019」とのことです!自分も聖蹟桜ヶ丘に聖地巡礼したい。