HTMLテーブル形式のカレンダー返すメソッドを作ってみた(Rubyで)


共有スケジュールをカレンダーに埋め込んだ形で印刷したい(配布用)のだけど、求めてるサービスやアプリが見つからない。ないなら自分で作ってみようということで、まずは手始めにDateクラスの練習がてらカレンダー形式のHTMLタグを出力するメソッドを作ってみた。

具体的には以下のような感じ。

```rb
print make_calender(2015, 1)
```

結果

```html
<table>
	<tr><td>日</td><td>月</td><td>火</td><td>水</td><td>木</td><td>金</td><td>土</td></tr>
	<tr><td></td><td></td><td></td><td></td><td>1</td><td>2</td><td>3</td></tr>
	<tr><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td><td>9</td><td>10</td></tr>
	<tr><td>11</td><td>12</td><td>13</td><td>14</td><td>15</td><td>16</td><td>17</td></tr>
	<tr><td>18</td><td>19</td><td>20</td><td>21</td><td>22</td><td>23</td><td>24</td></tr>
	<tr><td>25</td><td>26</td><td>27</td><td>28</td><td>29</td><td>30</td><td>31</td></tr>
</table>
```

make_calenderメソッドは第一引数に西暦年、第二引数に月をしていすることで、指定した年月のカレンダーをhtmlのテーブルとして返す。

make_calenderメソッドは以下のように定義してみた。お見苦しいかもしれませんが・・・

```rb
require 'date'

def make_calender(_year,_month)
  first_date = Date.new(_year,_month,1) #指定した月の1日をDateオブジェクトとして保存
  last_date = Date.new(_year,_month,-1) #指定した月の最終日をDateオブジェクトとして保存

  calender_size = last_date.day + first_date.wday - last_date.wday + 6 #テーブルのカラム数を保存

  calender = "" #この変数にtableの中身を追加していく
  calender << '<table>' + "\n"
  calender << "\t" + '<tr><td>日</td><td>月</td><td>火</td><td>水</td><td>木</td><td>金</td><td>土</td></tr>' + "\n"

  #n週目まである月はn回<tr>タグを出力
  (calender_size / 7).times do |n|
    calender << "\t" + '<tr>'
    #<td>タグを7回出力
    7.times do |i|
      cal_count = n*7 + i #cal_countは直後に出力する<td>タグが全カラムのうち何番目かを保存(0から開始)
      calender << '<td>'
      calender << (cal_count - first_date.wday + 1).to_s if first_date.wday <= cal_count && last_date.day > cal_count - first_date.wday
      calender << '</td>'
    end
    calender << '</tr>' + "\n"
  end
  calender << '</table>'

  return calender
end

print make_calender(2015, 12), "\n\n"
print make_calender(2030, 9)
```

結果

```html
<table>
	<tr><td>日</td><td>月</td><td>火</td><td>水</td><td>木</td><td>金</td><td>土</td></tr>
	<tr><td></td><td></td><td></td><td></td><td>1</td><td>2</td><td>3</td></tr>
	<tr><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td><td>9</td><td>10</td></tr>
	<tr><td>11</td><td>12</td><td>13</td><td>14</td><td>15</td><td>16</td><td>17</td></tr>
	<tr><td>18</td><td>19</td><td>20</td><td>21</td><td>22</td><td>23</td><td>24</td></tr>
	<tr><td>25</td><td>26</td><td>27</td><td>28</td><td>29</td><td>30</td><td>31</td></tr>
</table>

<table>
	<tr><td>日</td><td>月</td><td>火</td><td>水</td><td>木</td><td>金</td><td>土</td></tr>
	<tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td></tr>
	<tr><td>8</td><td>9</td><td>10</td><td>11</td><td>12</td><td>13</td><td>14</td></tr>
	<tr><td>15</td><td>16</td><td>17</td><td>18</td><td>19</td><td>20</td><td>21</td></tr>
	<tr><td>22</td><td>23</td><td>24</td><td>25</td><td>26</td><td>27</td><td>28</td></tr>
	<tr><td>29</td><td>30</td><td></td><td></td><td></td><td></td><td></td></tr>
</table>
```

実際のテーブル

2015年12月

<table>
	<tr><td>日</td><td>月</td><td>火</td><td>水</td><td>木</td><td>金</td><td>土</td></tr>
	<tr><td></td><td></td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td></tr>
	<tr><td>6</td><td>7</td><td>8</td><td>9</td><td>10</td><td>11</td><td>12</td></tr>
	<tr><td>13</td><td>14</td><td>15</td><td>16</td><td>17</td><td>18</td><td>19</td></tr>
	<tr><td>20</td><td>21</td><td>22</td><td>23</td><td>24</td><td>25</td><td>26</td></tr>
	<tr><td>27</td><td>28</td><td>29</td><td>30</td><td>31</td><td></td><td></td></tr>
</table>

2030年9月

<table>
	<tr><td>日</td><td>月</td><td>火</td><td>水</td><td>木</td><td>金</td><td>土</td></tr>
	<tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td></tr>
	<tr><td>8</td><td>9</td><td>10</td><td>11</td><td>12</td><td>13</td><td>14</td></tr>
	<tr><td>15</td><td>16</td><td>17</td><td>18</td><td>19</td><td>20</td><td>21</td></tr>
	<tr><td>22</td><td>23</td><td>24</td><td>25</td><td>26</td><td>27</td><td>28</td></tr>
	<tr><td>29</td><td>30</td><td></td><td></td><td></td><td></td><td></td></tr>
</table>

今後はカラムの中にスケジュールなどを書き込む機能の実装を行いたい。