2 class Song < ActiveRecord::Base
3 include ::SelectableAttr::Base
4 before_save :make_words_for_search
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"
14 RUBY_KANJI_HIRA = %r/([一-龠]+)\(([ぁ-ん]+)\)/
15 RUBY_ENGLISH_KANA = %r/([a-zA-Z]+)\(([ァ-ンー]+)\)/
16 RUBY_KANA_HIRA = %r/([ァ-ン]+)\(([ぁ-ん]+)\)/
18 CODES = %w(A Ab Bb C Cm D E Eb Em F F#m Fm G)
20 named_scope :active, :conditions => ["#{table_name}.deleted_at IS NULL"]
22 validates_presence_of :title, :words, :font_size
23 validates_numericality_of :font_size
25 def self.default_font_size
26 font_size_id_by_key(:middle)
29 def make_words_for_search
30 words_for_search = words + kana
34 strip_ruby_base(words)
38 markup_html_ruby_tag(words)
42 # => <ruby><rb>慈</rb><rp>(</rp><rt>いつく</rt><rp>)</rp></ruby>しみ
43 def markup_html_ruby_tag(str)
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) }
51 def ruby_tag_template(base, text)
52 "<ruby><rb>#{base}</rb><rp>(</rp><rt>#{text}</rt><rp>)</rp></ruby>"
55 def strip_ruby_base(str)
56 str.gsub(RUBY_KANJI_HIRA){ $2 }.gsub(RUBY_ENGLISH_KANA){ $2 }.gsub(RUBY_KANA_HIRA){ $2 }