OSDN Git Service

c47e6b4e6db878a9751d9c06f26eda619b28c6fb
[praisedb/praisedb.git] / app / models / song.rb
1 # coding: utf-8
2 class Song < ActiveRecord::Base
3   include ::SelectableAttr::Base
4   before_save :make_words_for_search
5
6   selectable_attr :font_size do
7     entry "0", :xsmall, "25pt"
8     entry "1", :small,  "30pt"
9     entry "2", :middle, "34pt"
10     entry "3", :large,  "39pt"
11     entry "4", :xlarge, "44pt"
12   end
13
14   RUBY_KANJI_HIRA   = %r/([一-龠]+)\(([ぁ-ん]+)\)/
15   RUBY_ENGLISH_KANA = %r/([a-zA-Z]+)\(([ァ-ンー]+)\)/
16   RUBY_KANA_HIRA    = %r/([ァ-ン]+)\(([ぁ-ん]+)\)/
17
18   CODES = %w(A Ab Bb C Cm D E Eb Em F F#m Fm G)
19
20   named_scope :active, :conditions => ["#{table_name}.deleted_at IS NULL"]
21
22   validates_presence_of :title, :words, :font_size
23   validates_numericality_of :font_size
24
25   def self.default_font_size
26     font_size_id_by_key(:middle)
27   end
28
29   def make_words_for_search
30     words_for_search = words + kana
31   end
32
33   def kana
34     strip_ruby_base(words)
35   end
36
37   def ruby
38     markup_html_ruby_tag(words)
39   end
40
41   # 慈(いつく)しみ
42   # => <ruby><rb>慈</rb><rp>(</rp><rt>いつく</rt><rp>)</rp></ruby>しみ
43   def markup_html_ruby_tag(str)
44     str.
45       to_s.
46       gsub(RUBY_KANJI_HIRA)  { ruby_tag_template($1, $2) }.
47       gsub(RUBY_ENGLISH_KANA){ ruby_tag_template($1, $2) }.
48       gsub(RUBY_KANA_HIRA)   { ruby_tag_template($1, $2) }
49   end
50
51   def ruby_tag_template(base, text)
52     "<ruby><rb>#{base}</rb><rp>(</rp><rt>#{text}</rt><rp>)</rp></ruby>"
53   end
54
55   def strip_ruby_base(str)
56     str.gsub(RUBY_KANJI_HIRA){ $2 }.gsub(RUBY_ENGLISH_KANA){ $2 }.gsub(RUBY_KANA_HIRA){ $2 }
57   end
58 end