Class: Orange::GollumResource

Inherits:
Resource
  • Object
show all
Defined in:
lib/orange-gollum/resources/gollum_resource.rb

Instance Method Summary collapse

Instance Method Details

#authorize!(packet) ⇒ Object



26
27
28
29
30
31
32
33
34
# File 'lib/orange-gollum/resources/gollum_resource.rb', line 26

def authorize!(packet)
  unless packet["user.id"]
    packet.flash["user.after_login"] = packet["route.path"]
    packet.flash["login.message"] = "Please provide a valid OpenID to edit the wiki."
    packet.reroute('/login')
    return false
  end
  return true
end

#commit_message(packet) ⇒ Object



12
13
14
15
16
# File 'lib/orange-gollum/resources/gollum_resource.rb', line 12

def commit_message(packet)
  { :message => packet.request.params["message"],
    :name => packet['user.id'] || 'anonymous',
    :email => packet['user.id'] || '[email protected]'}
end

#compare(packet, opts = {}) ⇒ Object



126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# File 'lib/orange-gollum/resources/gollum_resource.rb', line 126

def compare(packet, opts = {})
  opts = Mash.new(opts.with_defaults(packet.request.params))
  if packet.request.post?
    versions = opts[:versions] || []
    name = opts[:path]
    if versions.size < 2
      packet.reroute(wiki_url(packet) + 'history/'+::Gollum::Page.cname(name))
    else
      packet.reroute(wiki_url(packet) + 'compare/'+::Gollum::Page.cname(name) + '/' + versions.last + '...' + versions.first)
    end
  else
    parts = opts[:path].split('/')
    version_list = parts.pop
    opts[:path] = parts.join('/')
    name = opts[:path] || opts[:name]
    opts[:version_list] ||= version_list 
    opts[:versions] = opts[:version_list].split(/\.{2,3}/)
    opts[:name] = name
    opts[:page] ||= gollum(packet).page(name)
    diffs = gollum(packet).repo.diff(opts[:versions].first, opts[:versions].last, opts[:page].path)
    opts[:diff] = diffs.first
    opts[:lines] = lines_for_diff(diffs.first)
    do_view(packet, :compare, opts)
  end
end

#create(packet, opts = {}) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/orange-gollum/resources/gollum_resource.rb', line 55

def create(packet, opts = {})
  authorize!(packet)
  path = opts[:path] || packet['route.resource_path'] || "Home"
  if packet.request.post?
    name = packet.request.params["page"]
    wiki = gollum(packet)
    format = "markdown".intern
    begin
      wiki.write_page(name, format, packet.request.params["content"], commit_message(packet))
      packet.reroute(wiki_url(packet) + name)
    rescue Exception => e
      do_view(packet, :error, {:message => "Errored: #{e.inspect}"})
    end
  else
    opts[:name] ||= path
    opts[:title] ||= path.gsub('-', ' ')
    do_view(packet, :create, opts)
  end
  
end

#edit(packet, opts = {}) ⇒ Object



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/orange-gollum/resources/gollum_resource.rb', line 76

def edit(packet, opts = {})
  authorize!(packet)
  wiki = gollum(packet)
  path = opts[:path] || packet['route.resource_path'] || "Home"
  if packet.request.post?
    name   = path
    wiki   = gollum(packet)
    page   = wiki.page(name)
    format = "markdown".intern
    name   = packet.request.params["rename"] if packet.request.params["rename"]

    wiki.update_page(page, name, format, packet.request.params["content"], commit_message(packet))

    packet.reroute(wiki_url(packet) + ::Gollum::Page.cname(name))
  elsif page = wiki.page(path)
      opts[:page] = page
      opts[:name] = path
      opts[:title] = path.gsub('-', ' ')
      opts[:content] = page.raw_data
      do_view(packet, :edit, opts)
  else
    packet.reroute(wiki_url(packet))
  end
end

#exposed(packet) ⇒ Object



6
# File 'lib/orange-gollum/resources/gollum_resource.rb', line 6

def exposed(packet); [:index]; end

#gollum(packet) ⇒ Object



22
23
24
# File 'lib/orange-gollum/resources/gollum_resource.rb', line 22

def gollum(packet)
  ::Gollum::Wiki.new(options[:path], {:base_path => wiki_url(packet)})
end

#history(packet, opts = {}) ⇒ Object



101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/orange-gollum/resources/gollum_resource.rb', line 101

def history(packet, opts = {})
  opts.with_defaults!(packet.request.params)
  opts[:path] ||= (packet['route.resource_path'] || "Home")
  opts[:name] = opts[:path]
  opts[:page] ||= gollum(packet).page(opts[:path])
  opts[:page_num] = [opts[:page_num].to_i, 1, opts.delete("page_num").to_i].max
  page = opts[:page]
  versions = page.versions :page => opts[:page_num]
  
  i = versions.size + 1
  opts[:versions] = versions.map do |v|
      i -= 1
      { :id       => v.id,
        :id7      => v.id[0..6],
        :num      => i,
        :selected => page.version.id == v.id,
        :author   => v.author.name,
        :message  => v.message,
        :date     => v.committed_date.strftime("%B %d, %Y"),
        :gravatar => Digest::MD5.hexdigest(v.author.email) }
  end
  opts[:title] = opts[:path].gsub('-', ' ')
  do_view(packet, :history, opts)
end

#left_diff_line_number(id, line, left_diff_line, current_line_number) ⇒ Object



203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
# File 'lib/orange-gollum/resources/gollum_resource.rb', line 203

def left_diff_line_number(id, line, left_diff_line, current_line_number)
  if line =~ /^@@/
    m, li = *line.match(/\-(\d+)/)
    left_diff_line = li.to_i
    current_line_number = left_diff_line
    ret = '...'
  elsif line[0] == ?-
    ret = left_diff_line.to_s
    left_diff_line += 1
    current_line_number = left_diff_line - 1
  elsif line[0] == ?+
    ret = ' '
  else
    ret = left_diff_line.to_s
    left_diff_line += 1
    current_line_number = left_diff_line - 1
  end
  [left_diff_line,current_line_number,ret]
end

#line_class(line) ⇒ Object



191
192
193
194
195
196
197
198
199
200
201
# File 'lib/orange-gollum/resources/gollum_resource.rb', line 191

def line_class(line)
  if line =~ /^@@/
    'gc'
  elsif line =~ /^\+/
    'gi'
  elsif line =~ /^\-/
    'gd'
  else
    ''
  end
end

#lines_for_diff(diff) ⇒ Object



177
178
179
180
181
182
183
184
185
186
187
188
189
# File 'lib/orange-gollum/resources/gollum_resource.rb', line 177

def lines_for_diff(diff)
  lines = []
  left_line = right_line = nil
  diff.diff.split("\n")[2..-1].each_with_index do |line, line_index|
    left_line, current_line, left = left_diff_line_number(id, line, left_line, current_line)
    right_line, current_line, right = right_diff_line_number(id, line, right_line, current_line)
    lines << { :line => line,
               :class => line_class(line),
               :ldln => left,
               :rdln => right }
  end
  lines
end

#preview(packet, opts = {}) ⇒ Object



172
173
174
175
# File 'lib/orange-gollum/resources/gollum_resource.rb', line 172

def preview(packet, opts = {})
  data = packet.request.params['text']
  packet.markdown(gollum(packet).preview_page("Preview", data, "markdown").formatted_data)
end

#right_diff_line_number(id, line, right_diff_line_number, current_line_number) ⇒ Object



223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
# File 'lib/orange-gollum/resources/gollum_resource.rb', line 223

def right_diff_line_number(id, line, right_diff_line_number, current_line_number)
  if line =~ /^@@/
    m, ri = *line.match(/\+(\d+)/)
    right_diff_line_number = ri.to_i
    current_line_number = right_diff_line_number
    ret = '...'
  elsif line[0] == ?-
    ret = ' '
  elsif line[0] == ?+
    ret = right_diff_line_number.to_s
    right_diff_line_number += 1
    current_line_number = right_diff_line_number - 1
  else
    ret = right_diff_line_number.to_s
    right_diff_line_number += 1
    current_line_number = right_diff_line_number - 1
  end
  [right_diff_line_number,current_line_number,ret]
end

#show(packet, opts = {}) ⇒ Object



152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
# File 'lib/orange-gollum/resources/gollum_resource.rb', line 152

def show(packet, opts = {})
  path = opts[:path] || packet['route.resource_path'] || "Home"
  path = path.gsub(/^\//, "") if path =~ /^\//
  wiki = gollum(packet)
  if page = wiki.page(path)
    opts[:page] = page
    opts[:name] = path
    opts[:title] = path.gsub('-', ' ')
    opts[:content] = page.formatted_data
    do_view(packet, :show, opts)
  elsif file = wiki.file(path)
    packet["template.disable"] = true
    file.raw_data
  else
    opts[:name] = path
    opts[:title] = path.gsub('-', ' ')
    create(packet, opts)
  end
end

#stack_initObject



8
9
10
# File 'lib/orange-gollum/resources/gollum_resource.rb', line 8

def stack_init
  options[:path] = orange.options["gollum_path"]
end

#view(packet = false, *args) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/orange-gollum/resources/gollum_resource.rb', line 36

def view(packet = false, *args)
  %w(editbar gollum screen syntax).each{|css| packet.add_css("#{css}.css", :module => "_gollum_")}
  %w(previewable_comment_form tabs text_selection.min).each{|js| packet.add_js("jquery.#{js}.js", :module => "_gollum_")}
  packet.add_js("gollum.js", :module => "_gollum_")
  packet.add_js("MathJax/MathJax.js", :module => "_gollum_")
  opts = args.extract_options!
  path = opts[:path] || packet['route.resource_path'] || "/Home"
  path = "/Home" if path.blank?
  path_parts = path.split('/')
  path_parts.shift
  if %w(edit history compare create preview).include?(path_parts.first)
    action = path_parts.shift
  else
    action = "show"
  end
  opts[:path] = path_parts.join('/')
  self.__send__(action.to_sym, packet, opts)
end

#wiki_url(packet) ⇒ Object



18
19
20
# File 'lib/orange-gollum/resources/gollum_resource.rb', line 18

def wiki_url(packet)
  orange[:sitemap].url_for(packet, :resource => "gollum")
end