WebHelper rails text チート集


webhelpers.rails.text

リストの内容をサイクルで取得する(h.cycle、h.reset_cycle)
連続した番号を取得するh.counter、h.reset_counter)
文字を省略する(h.truncate)
文字を強調する(h.highlight)
キーワードに該当部分を抜き出す(h.excerpt)
指定した文字数で折り返す(h.word_wrap)
簡易なフォーマットをかける(h.simple_format)
URLな文字列にリンクを設定する(h.auto_link)
リンクが設定された文字列を戻す(h.strip_links)
Textile形式の文字列をHTMLに変換する(h.textilize)
Markdown形式の文字列をHTMLに変換する(h.markdown)


リストの内容をサイクルで取得する(h.cycle、h.reset_cycle)



h.cycleは引数にリストを指定し、
1回目の呼び出しでは、リストの1番目の内容
2回目の呼び出しでは、リストの2番目の内容
3回目の呼び出しでは、リストの3番目の内容
4回目の呼び出しでは、リストの4番目の内容
でも、リストの内容が3つまでだったら、1番目の内容を返す。
という機能を持っています。

そのため、

% for item in range(5):
${h.cycle('hoge','piyo','fuga')}


% endfor


このように記載すると、

hoge
piyo
fuga
hoge
piyo

と表示されます。


使いどころは、テーブルレイアウトで列の色を繰り返したい(ストライプ)
でしょうか。


<table>
% for item in range(8):
<tr>
  <td width="100" height="30" bgcolor="${h.cycle('blue','yellow','red')}">
    ${item}
</td>
</tr>
% endfor
</table>



表示はこんな感じです。


ただし、cycleの機能は一つのテンプレート内で連続します。
先ほどのテーブルを2個記述すると表示は以下のようになります。


※2つめのテーブルが青ではなく、赤から始まってます。

これを防止するには、<% h.reset_cycle() %>してやればOKです。


<table>
% for item in range(8):
<tr>
<td width="100" height="30" bgcolor="${h.cycle('blue','yellow','red')}">
${item}
</td>
</tr>
% endfor
</table>
<!-- ここでリセット -->
<% h.reset_cycle() %>
<table>
% for item in range(8):
<tr>
<td width="100" height="30" bgcolor="${h.cycle('blue','yellow','red')}">
${item}
</td>
</tr>
% endfor
</table>



1つのテンプレート内で複数のcycleを制御したい場合には、

${h.cycle(['red','blue'], name='cycle1')}

のようにcycleにnameをつけてやり、

<% h.reset_cycle(name='cycle1') %>

nameを指定してリセットします。




連続した番号を取得するh.counter、h.reset_counter)



項目に番号を振りたい時、

% for item in ['hoge','piyo','fuga']:
<tr>
  <td>${ h.counter() }</td>
  <td>${ item }</td>
</tr>
% endfor

としてやると、こんな感じで番号が表示されます。


1 hoge
2 piyo
3 fuga



cycleと同じく、同じテンプレート内で複数使用する場合は、
値が継続するので、


<% h.reset_counter() %>


として値をリセットするか、


${ h.counter(name='counter_name') }


のように、カウンターに名前をつけてやります。

※カウンターに名前をつけた場合は、

<% h.reset_counter(name='counter_name') %>

で、該当カウンターをリセット



文字を省略する(h.truncate)



長い文字列を表示するとき、10文字以上は「...」で表示したい時があります。
そんな時はtruncate


${h.truncate('abcdefghijklmnopqrstuvwxyz',length=10)}


こんな感じで表示されます。


abcdefg...


※省略用の文字も含めて、lengthで指定した長さになります。


省略用の文字を「...」以外にしたい場合は、


${h.truncate('abcdefghijklmnopqrstuvwxyz',length=10, truncate_string=u'(省略)')}


こんな感じで表示されます。


abcdef(省略)




文字を強調する(h.highlight)



検索結果の表示などを行う場合、キーワードに指定された文字を
強調して表示したい場合があります。

そんなときはhighlight


${h.highlight(u'文字の強調テスト', u'強調')}


こんなHTMLが出力されます。


文字の<strong class="highlight">強調</strong>テスト


cssでhighlightっていうクラスを作成すればよさげです。

出力するタグを変更したい場合は、


${h.highlight(u'文字の強調テスト', u'強調', highlighter='<font color="red"><b>\\1</b></font>')}

※旧バージョンはhilighterという名前だった模様。
 今のバージョンで使用すると、警告が表示されます。

HTMLの出力はこんな感じ


文字の<font color="red"><b>強調</b></font>テスト




キーワードに該当部分を抜き出す(h.excerpt)



Googleの検索結果の表示は、
... Pylons は、Django や TurboGears などを ...

と言うように、検索キーワードに指定された文字の前後を
抜き出して表示してくれます。

こんな機能を実装したいときはexcerpt


${h.excerpt(u'文字文字文字文字文字文字文字の強調テストテストテストテストテストテスト', u'強調', radius=10)}


HTMLはこんな感じ


...字文字文字文字文字の強調テストテストテストテ...


radiusで指定した文字数分、ターゲットの文字の前後に含めた形で
抜き出してくれます。

省略文字を変更したい場合は


excerpt_string=u'(省略)'


を引数に追加すればよいです。



指定した文字数で折り返す(h.word_wrap)



指定した文字列で折り返すには、


${h.word_wrap('abcdefghijklmnopqrstuvwxyz', line_width=10)}


出力されるHTMLはこんな感じ


abcdefghij
klmnopqrst
uvwxyz


line_widthで指定した文字数で改行します。
※<br/>ではなく、改行コードが挿入されます。


このメソッドは非推奨になったようで、使用すると

The word_wrap function has been deprecated:
Use python's builtin textwrap.fill function instead.


という警告メッセージが表示されます。
ここは素直に


<% import textwrap %>
${ textwrap.fill('abcdefghijklmnopqrstuvwxyz', width=10) }


としたほうが良い模様


textwrap



簡易なフォーマットをかける(h.simple_format)



simple_formatを使うと、
・文字列pタグで囲む
・改行1つの場合はbrタグ
・改行2つの場合は新たにpタグ
と言う感じで置換してくれます。


${h.simple_format('aaa\nbbb\n\ncc')}


出力されるHTMLはこんな感じです。


<p>aaa
<br />bbb</p>

<p>ccc</p>



うーん。微妙





URLな文字列にリンクを設定する(h.auto_link)



URLな文字列をアンカータグで囲ってくれます。


${h.auto_link(u'検索には、Google( http://www.google.co.jp )をよく使用します。')}


出力されるHTMLはこんな感じ


検索には、Google( <a href="http://www.google.co.jp">http://www.google.co.jp</a> )をよく使用します。



${h.auto_link(u'検索には、Google(http://www.google.co.jp)をよく使用します。')}


とした場合、


検索には、Google(<a href="http://www.google.co">http://www.google.co</a>.jp)をよく使用します。


ってなっちゃいました・・・うーん。

また、
link='email_addresses'
の引数を渡すと、メールアドレスのみ。

link='url' #(適当な文字列)
とすると、URLのみ変換される模様



リンクが設定された文字列を戻す(h.strip_links)



auto_linkと逆の機能です。


${h.strip_links(u'例えば、<a href="http://www.google.co.jp">Google</a>など・・・')}


出力されるHTMLはこちら


例えば、Googleなど・・・




Textile形式の文字列をHTMLに変換する(h.textilize)



WebHelperを使用してTextile形式の文字列をHTMLに変換する方法メモ
webhelpers.rails.text


Textileとは
http://hobix.com/textile/
HTMLのタグを簡単な表現で置き換える方法かな?

初めて知りました。


使い方はこんな感じ

${h.textilize('h1. This is a test of textile\n\nParagraph\n\nAnother paragraph\n\n* Bullets')}


出力されるHTMLはこうなります。


<h1>This is a test of textile</h1>

<p>Paragraph</p>

<p>Another paragraph</p>

<ul>
<li>Bullets</li>
</ul>


utf8な文字列を渡したら、エラーになりました・・・
日本語サイトでは、あまり使う機会はなさそうです。



Markdown形式の文字列をHTMLに変換する(h.markdown)



Markdownとは
Markdown記法
初めて知りました。

使い方はこんな感じ。


${h.markdown(u'#ヘッダー\n* リスト1\n* リスト2')}


出力されるHTMLはこんな感じです。


<h1>ヘッダー</h1>
<ul>
<li>
リスト1
</li>
<li>
リスト2
</li>
</ul>


若干wikiの記載に似ている気がします。
utf8も通るので、使う機会があるかも。






もどる