Under the Bridge

a Picture of the Late Him

MT4.1:「MT」という文字をテーブルの背景色で表現

2008年4月18日 23:05 | Writer: yoshi | 記事本文 | コメント(0) | トラックバック(0)

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」への書き換えでも数分ほどでできるかと(実験済み)。

トラックバック(0)

このブログ記事を参照しているブログ一覧: MT4.1:「MT」という文字をテーブルの背景色で表現

このブログ記事に対するトラックバックURL:

コメントする






Categories
Entries
Feed
スポンサードリンク

parts

フィードメーター - Under the Bridge

あわせて読みたい

なかのひと

2008年4月5日開催、MT4LP5

2008 yoshi(apstar)