ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

よってたかってMTテンプレ。コミュのNabeAzzテンプレート問題・パート2

  • mixiチェック
  • このエントリーをはてなブックマークに追加
yoshiさんのNabeAzz問題にチャレンジして、昨日テンプレートをアップし、「その解説はブログで」と書きました。

ただ、解説する前に、結果のテンプレートのエッセンスを抜き出して、かつもう少しひねった問題を作ってみようと思いました。
皆様ぜひチャレンジしてみてください。

私のお題は以下のとおりです。

* 1から200の数を、1行あたり10列のテーブルにして出力します。
* テーブルの個々のセルの背景に色を付けて、市松模様になるようにします。
* 3で割り切れる数(例:6)は、bタグで囲みます。
* 3を含む数(例:13)は、uタグで囲みます。
* 5で割り切れる数(例:10)は、iタグで囲みます。
* 5を含む数(例:52)は、sタグで囲みます。
* 上記の4つの条件を複数満たす場合は、それらすべてを適用します。
  例えば、51は3で割り切れて、かつ5を含みますので、bタグとiタグで囲みます。
  また、135は上記4つの条件をすべて満たしますので、b/u/i/sのすべてのタグで囲みます。

なお、結果のサンプルは以下のアドレスにあります。

http://www.h-fj.com/blog/nabeazz.html

コメント(13)

皆様はじめまして。
おもしろそうなコミュニティだったので参加させていただきました。

そして壱さんいつもプラグインを使わせていただいて助かっています。

さっそくですが、作ってみました。
http://tkobeya.net/beta/module/nabeazz.html


えーとソース公開してもいいのでしょうか?こんな感じになりました。


<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style type="text/css">
<!--
table { border-collapse : collapse; }
td { border : 1px solid #000;width : 50px; padding : 2px 0; text-align : center; }
.gray { background-color : gray; }
-->
</style>
</head>
<body>

<mt:setvar name="cnt" value="0"><table><mt:for from="1" to="200">

<mt:if name="__counter__" op="%" value="10" eq="1">
<tr><mt:setvar name="cnt" op="+" value="1">
</mt:if>

<mt:if name="cnt" op="%" value="2" eq="1"><mt:if name="__even__"><td class="gray"><mt:else><td></mt:if>
<mt:else><mt:if name="__even__"><td><mt:else><td class="gray"></mt:if></mt:if>

<mt:if name="__counter__" op="%" value="3" eq="0"><b></mt:if>
<mt:if name="__counter__" like="3"><u></mt:if>
<mt:if name="__counter__" op="%" value="5" eq="0"><i></mt:if>
<mt:if name="__counter__" like="5"><s></mt:if>
<mt:getvar name="__counter__">
<mt:if name="__counter__" like="5"></s></mt:if>
<mt:if name="__counter__" op="%" value="5" eq="0"></i></mt:if>
<mt:if name="__counter__" like="3"></u></mt:if>
<mt:if name="__counter__" op="%" value="3" eq="0"></b></mt:if>

</td>

<mt:if name="__counter__" op="%" value="10" eq="0"></tr></mt:if>
</mt:for>
</table>

</body>
はじめまして! (何ちゅうコミュですかここは!)

norikoさんのをそのままいただいた上で(勝手にいただいてすいません!)、実用性の全くなくて多分普通はこんなことせんやろ! っていうのを以下に貼付けてみます。

<mt:ignore>テンプレートを定義↓。重複しない文字列なら何でも良い</mt:ignore>
<mt:setvarblock name="tmpl">{counter}</mt:setvarblock>

<mt:setvar name="cnt" value="0"><table><mt:for from="1" to="200">
<mt:var name="tmpl" setvar="current">
<mt:if name="__counter__" op="%" value="10" eq="1">
<tr><mt:setvar name="cnt" op="+" value="1">
</mt:if>
<mt:if name="cnt" op="%" value="2" eq="1"><mt:if name="__even__"><td class="gray"><mt:else><td></mt:if>
<mt:else><mt:if name="__even__"><td><mt:else><td class="gray"></mt:if></mt:if>

<mt:ignore>ここから痴漢<違う!置換</mt:ignore>
<mt:if name="__counter__" op="%" value="3" eq="0"><mt:setvarblock name="current"><mt:var name="current" regex_replace="/({counter})/","<b>$1</b>"></mt:setvarblock></mt:if>
<mt:if name="__counter__" like="3"><mt:setvarblock name="current"><mt:var name="current" regex_replace="/({counter})/","<u>$1</u>"></mt:setvarblock></mt:if>
<mt:if name="__counter__" op="%" value="5" eq="0"><mt:setvarblock name="current"><mt:var name="current" regex_replace="/({counter})/","<i>$1</i>"></mt:setvarblock></mt:if>
<mt:if name="__counter__" like="5"><mt:setvarblock name="current"><mt:var name="current" regex_replace="/({counter})/","<s>$1</s>"></mt:setvarblock></mt:if>

<mt:ignore>仕上げ! 何故か一発でできなかったので開始タグたちと終了タグたちではさむ</mt:ignore>
<mt:var name="current" regex_replace="/^(.*){counter}(.*)$/","$1"><mt:var name="__counter__"><mt:var name="current" regex_replace="/^(.*){counter}(.*)$/","$2">

</td>
<mt:if name="__counter__" op="%" value="10" eq="0"></tr></mt:if>
</mt:for>
</table>
うーん、あんまりきれいなコードにならないなぁ。
特にBやI付けるところ(勝手に<strong>とかに変えてます)が、面白くない。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>FujiAzz</title>
<style type="text/css">
td {color: #000; background: #fff; text-align: center;}
td.odd-odd, td.even-even {color: #fff; background: #666;}
</style>
</head>
<body>
<table border="1">
<MTFor from="1" to="200">
<MTSetVar name="markup" eq="">
<MTIf name="__counter__" op="%" value="3" value="0"><MTSetVar name="markup" eq="b"></MTIf>
<MTIf name="__counter__" like="3"><MTSetVar name="markup" value="u" append="1"></MTIf>
<MTIf name="__counter__" op="%" value="5" eq="0"><MTSetVar name="markup" value="i" append="1"></MTIf>
<MTIf name="__counter__" like="5"><MTSetVar name="markup" value="s" append="1"></MTIf>
<MTVar name="__counter__" setvar="count">
<MTIf test="$count%10 == 1"><tr></MTIf>
<td class="<MTIf name="__even__">even<MTElse>odd</MTIf>-<MTIf test="(($count-1)/10)%2 == 1">odd<MTElse>even</MTIf>"><MTIf name="markup" like="b"><strong></MTIf><MTIf name="markup" like="u"><ins></MTIf><MTIf name="markup" like="i"><em></MTIf><MTIf name="markup" like="s"><del></MTIf><MTGetVar name="__counter__"><MTIf name="markup" like="s"></del></MTIf><MTIf name="markup" like="i"></em></MTIf><MTIf name="markup" like="u"></ins></MTIf><MTIf name="markup" like="b"></strong></MTIf></td>
<MTIf test="$count%10 == 0"></tr></MTIf>
</MTFor>
<MTIf test="$count%10 != 0"><td>COLSPANの数字が・・・</td></tr></MTIf>
</table>
</body>
</html>

後できれば203件とかの、端数の処理したいんだけど、絶対値ってどうやったら良いかしら?
「colspan="残りのセル数"」ってやりたいなぁ
皆様チャレンジありがとうございます。

>norikoさん
素直に書くとnorikoさんのようなコードになると思います。

>junnamaさん
「{」と「}」を見てSmartyを思い出してしまいました(笑)。
現在Smartyがらみの本を書いているもので・・・。

>oscarさん
絶対値を何に使うのでしょうか?
ちなみに、残りのセル数は「10-終了値%10」で良いと思います。
壱さん。
>ちなみに、残りのセル数は「10-終了値%10」で良いと思います。
そうなんですよ。でもそれをMTタグで書くとえらい回りくどくなりませんか?
符号の反転とか絶対値とか、あるといいなぁって・・・変わんないかな?

junnamaさんのregexは良いですね。いろいろ使えそうです。
昼休み書いてた途中でした。定時が終わったんで仕上げました。

ここ
<MTSetVar name="OpenTags" value="<b>":"<u>":"<i>":"<s>">
<MTSetVar name="CloseTags" value="</b>":"</u>":"</i>":"</s>">
だけ書き換えれば、タグが簡単に変更できるようになっています。

valueモデファイアに配列が指定できれば、コードはもっとすっきりするんですがね...




<style type="text/css">
<!--
table {
border-collapse : collapse;
}
td {
border : 1px solid black;
width : 70px;
padding : 2px 0;
text-align : center;
}
.evenbox {
background-color : #cccccc;
}
.oddbox {
background-color : #ccffff;
}
-->
</style>

<MTSetVar name="inc" value="0">
<MTSetVar name="Simasima" value="0">
<MTSetVar name="OpenTags" value="<b>":"<u>":"<i>":"<s>">
<MTSetVar name="CloseTags" value="</b>":"</u>":"</i>":"</s>">

<MTSetVarTemplate name="CheckEvenOdd">
<MTSetVar name="Flag" value="$Simasima">
<MTIf name="Flag" value="2" op="%" eq="0">
<MTSetVar name="TableClassName" value="evenbox">
<MTElse>
<MTSetVar name="TableClassName" value="oddbox">
</MTIf>
</MTSetVarTemplate>

<MTSetVarTemplate name="CreateTagData">
<MTSetVar name="Flag" value="$inc">
<MTSetVarBlock name="OpenTag">
<MTIf name="Flag" op="%" value="3" eq="0">
<MTGetVar name="OpenTags[0]">
</MTIf>
<MTIf name="Flag" like="3">
<MTGetVar name="OpenTags[1]">
</MTIf>
<MTIf name="Flag" op="%" value="5" eq="0">
<MTGetVar name="OpenTags[2]">
</MTIf>
<MTIf name="Flag" like="5">
<MTGetVar name="OpenTags[3]">
</MTIf>
</MTSetVarBlock>
<MTSetVarBlock name="CloseTag">
<MTIf name="Flag" op="%" value="3" eq="0">
<MTGetVar name="CloseTags[0]">
</MTIf>
<MTIf name="Flag" like="3">
<MTGetVar name="CloseTags[1]">
</MTIf>
<MTIf name="Flag" op="%" value="5" eq="0">
<MTGetVar name="CloseTags[2]">
</MTIf>
<MTIf name="Flag" like="5">
<MTGetVar name="CloseTags[3]">
</MTIf>
</MTSetVarBlock>
</MTSetVarTemplate>

<table cellspacing="0" cellpadding="0">
<MTFor var="i" from="1" to="20">
<tr>
<MTSetVar name="Simasima" op="++">
<MTFor var="j" from="1" to="10">
<MTSetVar name="inc" op="++">
<MTSetVar name="Simasima" op="++">
<MTGetVar name="CreateTagData"><MTIgnore>付与タグ</MTIgnore>
<MTGetVar name="CheckEvenOdd"><MTIgnore>しましま</MTIgnore>
<td class="<MTGetVar name="TableClassName">"><MTGetVar name="OpenTag"><MTGetVar name="inc"><MTGetVar name="CloseTag"></td>
</MTFor>
</tr>
</MTFor>
</table>
>oscarさん
確かに、MTSetVartタグを駆使して計算をすると、タグが冗長になるのが難点です。
そこで、<MTIF test="・・・">の処理を流用して、計算式の結果を変数に代入する「MTSetVarFormula」というプラグインを作ってみました。
「<MTSetVarFormula name="x" formula="abs(x)">」とか「<MTSetVarFormula name="x" formula="10 - %x % 10">といったことができます。
プラグインは後日公開します。

>yoshiさん
配列を使うなら、開始タグと終了タグを1つの配列でまとめると、より格好良い(?)と思います。
>壱さん
>「MTSetVarFormula」というプラグインを作ってみました。
うわぁー、それうれしいかも。公開お待ちしております。
こんばんは。
>「MTSetVarFormula」というプラグインを作ってみました。
私もそれうれしいです。楽しみにしてます。

今度はもう少し面白い(?)コードを書いてみたいなーと思います。
皆さんのコードみてると勉強にもなるしなにより楽しいです。
こんにちは。

解答例その1とその解説をブログにアップしました。

http://www.h-fj.com/blog/archives/2008/04/15-102209.php
どれだけ変態的に書けるかに挑戦してみました。

<mt:for from="1" to="200">
<mt:if name="__first__"><table></mt:if>
<mt:if test="$__index__%10 == 1"><tr></mt:if>
<td<mt:if test="(($__index__-1)/10+$__index__%10)%2 == 1"> style="background:red"</mt:if>>
<mt:setvar name="num" value="$__index__">
<mt:if test="$__index__%3 == 0"><mt:getvar name="num" regex_replace="/^(.+)$/","<b>$1</b>" setvar="num"></mt:if>
<mt:if name="__index__" like="3"><mt:getvar name="num" regex_replace="/^(.+)$/","<u>$1</u>" setvar="num"></mt:if>
<mt:if test="$__index__%5 == 0"><mt:getvar name="num" regex_replace="/^(.+)$/","<i>$1</i>" setvar="num"></mt:if>
<mt:if name="__index__" like="5"><mt:getvar name="num" regex_replace="/^(.+)$/","<s>$1</s>" setvar="num"></mt:if>
<mt:getvar name="num">
</td>
<mt:if test="$__index__%10 == 0"></tr></mt:if>
<mt:if name="__last__"></table></mt:if>
</mt:for>

blogで解説やってますので興味がある方は是非ご覧ください。

タグをつけるところがもう少し改善の余地がありそう

http://blog.webcreativepark.net/2008/04/17-140938.html
こんにちは。
解答例その2をブログにアップしました。

http://www.h-fj.com/blog/archives/2008/04/17-144932.php

コードは以下の通りです。

<MTIgnore>xは出力する数値</MTIgnore>
<MTSetVar name="x" value="1">
<table>
<MTIgnore>二重ループ</MTIgnore>
<MTFor var="r" from="1" to="20">
  <tr>
  <MTFor var="c" from="1" to="10">
    <MTIgnore>市松模様の判断</MTIgnore>
    <td<MTIf test="($r + $c) % 2 == 1"> class="reverse"</MTIf>>
      <MTIgnore>出力する値の生成</MTIgnore>
      <MTSetVar name="out" value="$x">
      <MTIf name="x" op="%" value="3" eq="0">
        <MTSetVarBlock name="out"><b><MTGetVar name="out"></b></MTSetVarBlock>
      </MTIf>
      <MTIf name="x" like="3">
        <MTSetVarBlock name="out"><u><MTGetVar name="out"></u></MTSetVarBlock>
      </MTIf>
      <MTIf name="x" op="%" value="5" eq="0">
        <MTSetVarBlock name="out"><i><MTGetVar name="out"></i></MTSetVarBlock>
      </MTIf>
      <MTIf name="x" like="5">
        <MTSetVarBlock name="out"><s><MTGetVar name="out"></s></MTSetVarBlock>
      </MTIf>
      <MTIgnore>値の出力</MTIgnore>
      <MTGetVar name="out">
    </td>
    <MTSetVar name="x" op="++">
  </MTFor>
  </tr>
</MTFor>
</table>

考え方はねこまんま2.0さんのものとほぼ同じですが、変態性は薄いです(笑)。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

よってたかってMTテンプレ。 更新情報

よってたかってMTテンプレ。のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング