Redmineの調整のためにrubyでRMagickを使った文字列描画をコーディングした

[Sponsored Link]


当ブログでは「役に立った!」「写真使いました!」などご参考頂いた方からのAmazonギフト券の寄付をお待ち致しております。

Share on FacebookTweet about this on TwitterShare on Google+Share on TumblrPin on PinterestShare on LinkedInDigg this

仕事でRedmineをいじくりまわす必要がでてきた。といっても、それほど大幅改修をするわけではなく、日付曜日を出すとかPDF出力時に縦罫線を引くとかだ。いろいろ調べて、先達が実装してくれた数々のパッチを参考にしながら実装していったが、一つ見つからないものがでてきた。それが、PNG出力時に日付曜日を出してくれということだった。

どのソースコードを直すかはあたりがついている。redmine/lib/redmine/helpers/gantt.rbだ。
このファイルの中のGanttクラス内にto_imageメソッドが定義されているので、この中で何か処理をすればいいことは、ほぼ間違いないだろう。
いろいろソースに手を入れているので行数指定はできないが、以下のメソッド定義部分を見つければよい。

def to_image(format='PNG')

そのすぐ下に「show_weeks」「show_days」という変数が定義されている。もう少し下を見ると「if show_days」などのように処理が区分されている。ズーム段数によって週や日の表示を制御している。私の依頼主は「常に出してくれ」ということだったので、以下のように修正した。元をコメントで残してから修正している。

        #show_weeks = @zoom > 1
        #show_days = @zoom > 2
        show_weeks = true
        show_days = true

さきの変数定義から8行程度下に「headers_height」の定義がある。日付と曜日を入れるので高さを調整する必要がある。headers_heightの値の3倍では不足し4倍では多すぎたので、3.5倍で調整してみた。この値に根拠はない。単に見た目の調整。元をコメントで残してから修正している。

        #headers_height = (show_weeks ? 2*header_height : header_height)
        headers_height = (show_weeks ? 3.5*header_height : header_height)

PNGで日本語が文字化けするというのは単純にサーバ上に日本語フォントがなかったということなので、yum install ipa-gothic-fontsでIPAフォントをインストールして対応。フォントの件については他のブログ等でもいろいろ記載があるので、検索してもらえばよいだろう。

        #gc.font = "c:\\WINDOWS\Fonts\VL-Gothic-Regular.ttf"
        gc.font = "/usr/share/fonts/ipa-gothic/ipag.ttf"

日付と曜日の表示の実装。「if show_days」の行から少し下。5~6行程度下に、次の1行が見つかるだろう。

          (date_to - @date_from + 1).to_i.times do

この直上に、次の4行を挿入する。

          day_num = self.date_from
          gc.pointsize(7)
          gc.font_weight(Magick::NormalWeight)
          gc.font_style(Magick::NormalStyle)

day_numは開始日付だ。self.date_fromから取得する。
gc.pointsize(7)は文字を7ポイントで指定している。rubyがよくわからないのでアレだが、gc.pointsize = 7という指定ではうまくいかなかったので、メソッドの形で指定した。勉強不足。
gc.font_weight(Magick::NormalWeight)とgc.font_style(Magick::NormalStyle)で文字の太さやスタイルを指定する。ここでは定数を指定している。

さらに数行下がり、以下の行を見つける。

            left = left + width

この行の直上に、次の行を挿入する。

            gc.stroke("transparent")
            gc.fill(wday == 6 ? 'blue' : wday == 7 ? 'red' : 'black')
            gc.text(left, 2*header_height+10, day_name(wday).first)
            gc.text(left, 2*header_height+20, day_num.day.to_s)
            day_num = day_num + 1

gc.stroke(‘transparent’)は枠線の色。この場合は透過にしている。
gc.fill(…)は塗りつぶしの色指定。この場合はテキストの色指定になる。メソッドの引数は条件式を多段で使用している。wdayは曜日が数値で入っていて、1~7がそれぞれ月~日に相当する。6=土曜日の場合は青、7=日曜日の場合は赤、それ以外は黒を指定するようにしている。
gc.text(…)で文字を描画する。第一引数がX軸、第二引数がY軸。たぶん文字書き出しの左上の座標を指定するのだと思う(ごめん調べてない…)。第三引数は表示する文字。
最初のgc.text(…)で曜日の漢字1文字を、次のgc.text(…)で日付を文字列化したものを指定している。
day_num = day_num + 1で日付を加算している。day_numオブジェクトは正しく年月日を持っていて+1しても32日とかになることなく正確に循環するものと期待している(調べてない…すまん…)。

最後に、endとendの間に以下を挿入する。ちょっと見やすいように以下に示す。

            day_num = day_num + 1
            left = left + width
            wday = wday + 1
            wday = 1 if wday > 7
          end
          gc.pointsize(11) # <-- これを追加する
        end

「# <-- これを追加する」の行を追加して、ポイント値を戻している。コメントはこのブログでの識別のために書いている。 ファイルを保存して、redmine/tmp/restart.txtファイルをtouchしてRedmineを再起動させる。 ファイルはもともといろいろ追加しているのでdiffはとっていない。必要に応じて上記を参照しながら手パッチしてもらえればと思う。 [widgets_on_pages id="PRA"]

Share on FacebookTweet about this on TwitterShare on Google+Share on TumblrPin on PinterestShare on LinkedInDigg this

当ブログでは「役に立った!」「写真使いました!」などご参考頂いた方からのAmazonギフト券の寄付をお待ち致しております。


Atsushi Ezura について

ナチュラルな女性のしぐさや表情を撮りたいIT系エンジニア。女性モデル募集中プロフィール
カテゴリー: Redmine, ruby, コンピュータ, ソフトウェア, プログラミング言語 タグ: , , パーマリンク

コメントを残す

メールアドレスが公開されることはありません。