MT4.1:「MT」という文字をテーブルの背景色で表現
mixiに、「よってたかってMTテンプレ。」という濃いコミュニティが存在する。そこでは、「Movable Typeでどういうことができる?」的な実験的なコードを晒す場がある。
そこで昨日、Junnamaさんが挙げているお題
今移動中@新幹線なのですが、思い付いたので(市松模様にヒントを得て)。 5×5のテーブルを二つ作ってセルの背景色で「MT」って見えるようにするってのどうでしょう。 たぶん「T」は簡単だと思うのですが、「M」あたりに変態性があらわれるのではないかと。
このお題をといてみた。
私はこういうお題をとくときに、「コードが再利用できるように」ということを考える。でないと、今回こっきりのコードとなってしまって、少々もったいないから。
当然、If文で「この数字とこの数字のときは...」という条件分岐は全く考えなかった。前もって準備しておいた画像のデータをシーケンシャルに与えて、汎用性の高いコードで機械的に出力する。これしかない。
コード
<style type="text/css">
<!--
table {
border-collapse : collapse;
}
td {
border : 1px solid black;
width : 30px;
padding : 2px 0;
text-align : center;
}
-->
</style>
(5x5 MTOS)<br />
<MTIgnore>データ部</MTIgnore>
<MTSetVar name="BlockUpper" value="5">
<MTSetVar name="CharMax" value="4">
<MTSetVar name="DataM" value="1":"0":"0":"0":"1":"1":"1":"0":"1":"1":"1":"1":"0":"1":"1":"1":"0":"1":"0":"1":"1":"0":"1":"0":"1">
<MTSetVar name="DataT" value="1":"1":"1":"1":"1":"0":"0":"1":"0":"0":"0":"0":"1":"0":"0":"0":"0":"1":"0":"0":"0":"0":"1":"0":"0">
<MTSetVar name="DataO" value="0":"1":"1":"1":"0":"1":"0":"0":"0":"1":"1":"0":"0":"0":"1":"1":"0":"0":"0":"1":"0":"1":"1":"1":"0">
<MTSetVar name="DataS" value="0":"1":"1":"1":"1":"1":"0":"0":"0":"0":"1":"1":"1":"1":"1":"0":"0":"0":"0":"1":"1":"1":"1":"1":"0">
<MTIgnore>メイン部</MTIgnore>
<MTFor var="outer" from="1" to="$CharMax">
<MTSetVar name="inc" value="0">
<table>
<MTFor var="x" from="1" to="$BlockUpper">
<tr>
<MTFor var="y" from="1" to="$BlockUpper">
<MTSetVar name="inc" op="++">
<MTIf name="outer" eq="1">
<MTGetvar name="DataM" function="shift" setvar="compare">
<MTElseif eq="2">
<MTGetvar name="DataT" function="shift" setvar="compare">
<MTElseif eq="3">
<MTGetvar name="DataO" function="shift" setvar="compare">
<MTElseif eq="4">
<MTGetvar name="DataS" function="shift" setvar="compare">
</MTIf>
<MTIf name="compare" eq="1"><td style="background:red;"><MTElse><td></MTIf>
<MTGetVar name="inc">
</td>
</MTFor>
</tr>
</MTFor>
</table>
<br />
</MTFor>
貼ってみた
(5x5 MTOS)| 1 | 2 | 3 | 4 | 5 |
| 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 |
| 1 | 2 | 3 | 4 | 5 |
| 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 |
| 1 | 2 | 3 | 4 | 5 |
| 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 |
| 1 | 2 | 3 | 4 | 5 |
| 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 |
原理
データはあらかじめMTSetvarで配列として与えておく。テーブルは5×5で、ということなんだが、ここに「背景色がないときは0」と「背景色があるときは1」というデータを与える。5文字ずつ改行して5×5で並べておき、視覚的に0と1をセット→改行を削除すると早い。データとしては改行したままのほうが使いやすいのだが、それでは再構築でエラーとなるので改行は削除する。この方法だと、10×10のシーケンシャルデータでもかなり早くできる。
あとは3重ループで処理。一番外は文字ごと、2番目は縦ライン(5回)、最内は横ライン(5回)である。これで、5×5の文字がふたつ出来上がる。
最外outerカウンタを用いたループ内条件分岐でDataMとDataMTの一次元配列を扱っているのは冗長。この中ではshiftで使用した要素データを前からひとつづつ消している。
無駄なのはここ。
<MTIf name="outer" eq="1">
<MTGetvar name="DataM" function="shift" setvar="compare">
<MTElseif eq="2">
<MTGetvar name="DataT" function="shift" setvar="compare">
</MTIf>
ここは単に二次元の配列が扱えれば一行でできるんだが、MTではそれは無理。MTでこういうことを実現しようとするとなかなか上手く行かん。遊びなんで、このコード作ってやめてしまった。
最後に結果を出力してオシマイ。このコードは、データ部セクション(と中盤メイン部のIf文)のみ書き換えれば、10×10や20×20の何の文字でも流用できる。しかも再利用できるまでの時間は早い。0,1,0,1,0,1データを書き換えるだけなので、10×10の「MT」や「MTOS」への書き換えでも数分ほどでできるかと(実験済み)。
- カテゴリ:212MT4.1実験室
トラックバック(0)
このブログ記事を参照しているブログ一覧: MT4.1:「MT」という文字をテーブルの背景色で表現
このブログ記事に対するトラックバックURL:
- Categories
- Entries
-
- MT4分科会第2回勉強会に参加しました
- MTOS4.2RC1:各ページの拡張子を得る
- MTでAA
- MT4:MTの変数演算をプラグインで拡張
- MT4.1:「MT」という文字をテーブルの背景色で表現
- 「NabeAzzテンプレート問題・パート2」へ乗ってみる
- 作りたいプラグインの覚え書き
- 世界のナベアツをプラグインで表現
- MT4:世界のナベアツをテンプレートタグで表現(2)
- MT4.1:プラグインを書いてみよう
- MT4.1:予約変数の実験
- Movable Type 4.15 テスト中(1)
- mtde.info の、反省点
- mtde.info の、できる経緯
- MT4:前のエントリ・次のエントリのリンクをカテゴリごとに(条件あり)
- MT4:世界のナベアツをテンプレートタグで表現
- MT4.1:カテゴリ並べ替え・表示非表示切り替え(非プラグイン非カスタムフィールド)
- MT4.1:変数参照専用のモジュールの可能性
- MT4:XHTML+CSS素材テンプレート化の不具合修正・要望リスト
- MT4.1:Movable Type 4.1用テンプレート作った

コメントする