LoginSignup
0
1

More than 5 years have passed since last update.

Velocityで与えた文字列を1文字ずつ分割して逆順に表示する

Posted at

HTMLの内容をwkhtmltopdfでPDF化するときに、グラフの縦軸ラベルのような縦書き表示のCSSが適用されなかった。
Java側でやるのも面倒だったので、Velocity側で無理やり逆順にしてCSSで回転させるようにした。
その時にVelocityのマクロを作ったのでメモ。(今後使うことあるのかな・・)

Macro.vm
#macro( StrReverseConv $str )
  #if( $str ) ## nullだった場合は何も表示しない
    #set( $len = $str.length() - 1 ) ## 文字列のサイズ
    #set( $spStr = $str.split(""))   ## 文字列を配列にする(ループ用)
    #foreach ( $s in $spStr )
      #if( $str.charAt( $len ) == " " ) ## スペースはそのまま表示すると消えてしまうので変換する
        <div>&nbsp;</div>
      #else
        <div>$str.charAt( $len )</div>
      #end
      #set ( $len = $len - 1 )
    #end
  #end
#end

マクロを使いたいvmファイルの最初に「#parse( "Macro.vm" )」と定義して以下のように使うと以下のように出力される。

#StrReverseConv( "ABCDE" )

<div>E</div>
<div>D</div>
<div>C</div>
<div>B</div>
<div>A</div>

エスケープ処理をしていないので文字列に「<」とか「>」が来ると正常に表示できない。エスケープ文字が入る可能性があるときはエスケープ文字の変換を忘れずに!

あとはCSSで「transform: rotate(-90deg)」とか「line-height」で行間を調整すれば似非縦軸ラベルの出来上がり。
Firofox、Chrome、IEで試したけどどれも同じ表示になってて満足。
ブラウザによって縦書きモードの「text-orientation」が効かなかったりPDF化したときに表示が崩れたりするので、こんな感じになった。
どのブラウザでも統一して表示できる縦書きモードがあったらいいのになぁ。

※というかすごいね。QiitaはVelocityのシンタックスもあるのね。驚き。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1