gumayunov (owner)

Revisions

gist: 201598 Download_button fork
public
Public Clone URL: git://gist.github.com/201598.git
Embed All Files: show embed
Ruby #
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
  def create
    result = @article.content.append_fragment params[:content]
    @article.save
    respond_to do |format|
      format.json do
        render :json => result
      end
    end
  end
 
#-------------------------
 
class FragmentableTextile
 
  def update_fragment(id, textile)
    result = UpdateResult.empty
    if idx = fragments.map(&:id).index(id)
      parts = fragments.map(&:to_s)
      parts[idx] = textile
      new_fragments = parse_textile(parts.join "\n\n")
      fragments = @fragments.dup
      result = merge(fragments, new_fragments, idx)
      @fragments = fragments
    end
    result
  end
 
  def append_fragment(textile)
    result = UpdateResult.empty
    new_fragments = parse_textile([fragments.to_s, textile].join "\n\n")
    if new_fragments.size > @fragments.size
      result.insert_set << { @fragments.last.id => new_fragments.last }
      @fragments = new_fragments
    end
    result
  end
 
#-------------------------
 
class Article < ActiveRecord::Base
 
  fragmentable_textile_fields :content
  plain_textile_fields :abstract
 
#-------------------------
module FragmentableTextileExtension
  def self.included(klass)
    klass.extend ClassMethods
  end
 
 
  module ClassMethods
    def fragmentable_textile_fields(*attributes)
      attributes.each do |attribute|
 
        serialize attribute, FragmentableTextile
 
        define_method "#{attribute}=" do |value|
          raise "direct_change of '#{attribute}' is not implemented"
        end
 
      end
    end
  end
 
end
 
module PlainTextileExtension
  def self.included(klass)
    klass.extend ClassMethods
  end
 
 
  module ClassMethods
    def plain_textile_fields(*attributes)
      attributes.each do |attribute|
 
        serialize attribute, PlainTextile
 
        define_method "#{attribute}=" do |value|
          self[attribute] = case value
          when PlainTextile
            value
          else
            PlainTextile.new value
          end
        end
 
      end
    end
  end
 
end