irwi_mod 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.rdoc +12 -0
  3. data/app/views/base_wiki_pages/_wiki_page_actions.html.erb +5 -0
  4. data/app/views/base_wiki_pages/_wiki_page_history.html.erb +31 -0
  5. data/app/views/base_wiki_pages/_wiki_page_info.html.erb +3 -0
  6. data/app/views/base_wiki_pages/_wiki_page_style.html.erb +69 -0
  7. data/app/views/base_wiki_pages/all.html.erb +11 -0
  8. data/app/views/base_wiki_pages/compare.html.erb +15 -0
  9. data/app/views/base_wiki_pages/edit.html.erb +36 -0
  10. data/app/views/base_wiki_pages/history.html.erb +8 -0
  11. data/app/views/base_wiki_pages/index.html.erb +11 -0
  12. data/app/views/base_wiki_pages/new.html.erb +14 -0
  13. data/app/views/base_wiki_pages/no.html.erb +1 -0
  14. data/app/views/base_wiki_pages/not_allowed.html.erb +1 -0
  15. data/app/views/base_wiki_pages/show.html.erb +11 -0
  16. data/lib/generators/irwi_wiki/irwi_wiki_generator.rb +29 -0
  17. data/lib/generators/irwi_wiki/templates/controllers/wiki_pages_controller.rb +5 -0
  18. data/lib/generators/irwi_wiki/templates/helpers/wiki_pages_helper.rb +3 -0
  19. data/lib/generators/irwi_wiki/templates/migrate/create_wiki_pages.rb +44 -0
  20. data/lib/generators/irwi_wiki/templates/models/wiki_page.rb +5 -0
  21. data/lib/generators/irwi_wiki/templates/models/wiki_page_version.rb +5 -0
  22. data/lib/generators/irwi_wiki_attachments/irwi_wiki_attachments_generator.rb +22 -0
  23. data/lib/generators/irwi_wiki_attachments/templates/migrate/create_wiki_page_attachments.rb +19 -0
  24. data/lib/generators/irwi_wiki_attachments/templates/models/wiki_page_attachment.rb +9 -0
  25. data/lib/generators/irwi_wiki_views/irwi_wiki_views_generator.rb +13 -0
  26. data/lib/irwi_mod.rb +46 -0
  27. data/lib/irwi_mod/comparators/base.rb +20 -0
  28. data/lib/irwi_mod/comparators/diff_lcs.rb +54 -0
  29. data/lib/irwi_mod/comparators/spans/changed_span.rb +18 -0
  30. data/lib/irwi_mod/comparators/spans/not_changed_span.rb +20 -0
  31. data/lib/irwi_mod/config.rb +83 -0
  32. data/lib/irwi_mod/extensions/controllers.rb +18 -0
  33. data/lib/irwi_mod/extensions/controllers/wiki_page_attachments.rb +21 -0
  34. data/lib/irwi_mod/extensions/controllers/wiki_pages.rb +167 -0
  35. data/lib/irwi_mod/extensions/models.rb +24 -0
  36. data/lib/irwi_mod/extensions/models/wiki_page.rb +55 -0
  37. data/lib/irwi_mod/extensions/models/wiki_page_attachment.rb +9 -0
  38. data/lib/irwi_mod/extensions/models/wiki_page_version.rb +44 -0
  39. data/lib/irwi_mod/formatters/blue_cloth.rb +11 -0
  40. data/lib/irwi_mod/formatters/red_cloth.rb +11 -0
  41. data/lib/irwi_mod/formatters/simple_html.rb +10 -0
  42. data/lib/irwi_mod/formatters/wiki_cloth.rb +11 -0
  43. data/lib/irwi_mod/helpers.rb +13 -0
  44. data/lib/irwi_mod/helpers/wiki_page_attachments_helper.rb +25 -0
  45. data/lib/irwi_mod/helpers/wiki_pages_helper.rb +145 -0
  46. data/lib/irwi_mod/paginators/none.rb +16 -0
  47. data/lib/irwi_mod/paginators/will_paginate.rb +11 -0
  48. data/lib/irwi_mod/support/route_mapper.rb +36 -0
  49. data/lib/irwi_mod/support/template_finder.rb +11 -0
  50. data/lib/irwi_mod/version.rb +9 -0
  51. metadata +231 -0
@@ -0,0 +1,24 @@
1
+ require 'active_record'
2
+
3
+ module IrwiMod::Extensions::Models
4
+ autoload :WikiPage, 'irwi_mod/extensions/models/wiki_page'
5
+ autoload :WikiPageVersion, 'irwi_mod/extensions/models/wiki_page_version'
6
+ autoload :WikiPageAttachment, 'irwi_mod/extensions/models/wiki_page_attachment'
7
+ end
8
+
9
+ ActiveRecord::Base.instance_eval do
10
+
11
+ def acts_as_wiki_page( config = {} )
12
+ include IrwiMod::Extensions::Models::WikiPage
13
+ end
14
+
15
+ def acts_as_wiki_page_version( config = {} )
16
+ include IrwiMod::Extensions::Models::WikiPageVersion
17
+ end
18
+
19
+ def acts_as_wiki_page_attachment
20
+ include IrwiMod::Extensions::Models::WikiPageAttachment
21
+ yield if block_given?
22
+ end
23
+
24
+ end
@@ -0,0 +1,55 @@
1
+ module IrwiMod::Extensions::Models::WikiPage
2
+
3
+ module ClassMethods
4
+
5
+ def find_by_path_or_new( path )
6
+ self.find_by_path( path ) || self.new( :path => path, :title => CGI::unescape(path) )
7
+ end
8
+
9
+ end
10
+
11
+ module InstanceMethods
12
+
13
+ # Retrieve number of last version
14
+ def last_version_number
15
+ last = versions.first
16
+ last ? last.number : 0
17
+ end
18
+
19
+ protected
20
+
21
+ def create_new_version
22
+ n = last_version_number
23
+
24
+ v = versions.build
25
+ v.attributes = attributes.slice( *v.attribute_names )
26
+ v.comment = comment
27
+ v.number = n + 1
28
+ v.save!
29
+ end
30
+
31
+ end
32
+
33
+ def self.included( base )
34
+ base.send :extend, IrwiMod::Extensions::Models::WikiPage::ClassMethods
35
+ base.send :include, IrwiMod::Extensions::Models::WikiPage::InstanceMethods
36
+
37
+ base.attr_protected :id
38
+
39
+ base.send :attr_accessor, :comment, :previous_version_number
40
+
41
+ base.belongs_to :creator, :class_name => IrwiMod.config.user_class_name
42
+ base.belongs_to :updator, :class_name => IrwiMod.config.user_class_name
43
+
44
+ base.has_many :versions, :class_name => IrwiMod.config.page_version_class_name, :foreign_key => IrwiMod.config.page_version_foreign_key, :order => 'id DESC'
45
+
46
+ if IrwiMod::config.page_attachment_class_name
47
+ base.has_many :attachments, :class_name => IrwiMod.config.page_attachment_class_name, :foreign_key => IrwiMod.config.page_version_foreign_key
48
+ end
49
+
50
+ base.before_save {|record| record.content = '' if record.content.nil? }
51
+ base.before_save {|record| record.path = record.title} #Change by RH - I have to save the path
52
+ base.after_save :create_new_version
53
+ end
54
+
55
+ end
@@ -0,0 +1,9 @@
1
+ module IrwiMod::Extensions::Models::WikiPageAttachment
2
+
3
+ DEFAULT_PAPERCLIP_OPTIONS = {:styles => { :medium => "300x300>", :thumb => "100x100>" }}
4
+
5
+ def self.included( base )
6
+ base.belongs_to :page, :class_name => IrwiMod.config.page_class_name
7
+ end
8
+
9
+ end
@@ -0,0 +1,44 @@
1
+ module IrwiMod::Extensions::Models::WikiPageVersion
2
+
3
+ module ClassMethods
4
+
5
+ end
6
+
7
+ module InstanceMethods
8
+
9
+ def next
10
+ self.class.first :conditions => ["id > ? AND page_id = ?", id, page_id], :order => 'id ASC'
11
+ end
12
+
13
+ def previous
14
+ self.class.first :conditions => ["id < ? AND page_id = ?", id, page_id], :order => 'id DESC'
15
+ end
16
+
17
+ protected
18
+
19
+ def raise_on_update
20
+ raise ActiveRecordError.new "Can't modify existing version"
21
+ end
22
+
23
+ end
24
+
25
+ def self.included( base )
26
+ base.send :extend, IrwiMod::Extensions::Models::WikiPageVersion::ClassMethods
27
+ base.send :include, IrwiMod::Extensions::Models::WikiPageVersion::InstanceMethods
28
+
29
+ base.attr_protected :id
30
+
31
+ base.belongs_to :page, :class_name => IrwiMod.config.page_class_name
32
+ base.belongs_to :updator, :class_name => IrwiMod.config.user_class_name
33
+
34
+ base.before_update :raise_on_update
35
+
36
+ base.scope :between, lambda { | first, last |
37
+ first = first.to_i
38
+ last = last.to_i
39
+ first, last = last, first if last < first # Reordering if neeeded
40
+ { :conditions => [ 'number >= ? AND number <= ?', first, last ] }
41
+ }
42
+ end
43
+
44
+ end
@@ -0,0 +1,11 @@
1
+ class IrwiMod::Formatters::BlueCloth
2
+
3
+ def initialize
4
+ require 'bluecloth'
5
+ end
6
+
7
+ def format( text )
8
+ BlueCloth.new( text ).to_html
9
+ end
10
+
11
+ end
@@ -0,0 +1,11 @@
1
+ class IrwiMod::Formatters::RedCloth
2
+
3
+ def initialize
4
+ require 'RedCloth'
5
+ end
6
+
7
+ def format( text )
8
+ RedCloth.new( text ).to_html
9
+ end
10
+
11
+ end
@@ -0,0 +1,10 @@
1
+ class IrwiMod::Formatters::SimpleHtml
2
+
3
+ def initialize
4
+ end
5
+
6
+ def format( text )
7
+ text.html_safe
8
+ end
9
+
10
+ end
@@ -0,0 +1,11 @@
1
+ class IrwiMod::Formatters::WikiCloth
2
+
3
+ def initialize
4
+ require 'wikicloth'
5
+ end
6
+
7
+ def format( text )
8
+ WikiCloth::Parser.new({:data => text}).to_html
9
+ end
10
+
11
+ end
@@ -0,0 +1,13 @@
1
+ module IrwiMod::Helpers
2
+ autoload :WikiPagesHelper, 'irwi_mod/helpers/wiki_pages_helper'
3
+ autoload :WikiPageAttachmentsHelper, 'irwi_mod/helpers/wiki_page_attachments_helper'
4
+ end
5
+
6
+ Module.class_eval do
7
+
8
+ def acts_as_wiki_pages_helper( config = {} )
9
+ include IrwiMod::Helpers::WikiPagesHelper
10
+ include IrwiMod::Helpers::WikiPageAttachmentsHelper if IrwiMod::config.page_attachment_class_name
11
+ end
12
+
13
+ end
@@ -0,0 +1,25 @@
1
+ require 'active_record/errors'
2
+
3
+ module IrwiMod::Helpers::WikiPageAttachmentsHelper
4
+
5
+ def wiki_add_page_attachment_path(page)
6
+ page = page.path if page.respond_to? :path
7
+ url_for(:action => 'add_attachment', :path => page)
8
+ end
9
+
10
+ def wiki_remove_page_attachment_path(attachment_id)
11
+ url_for(:action => 'remove_attachment', :attachment_id => attachment_id)
12
+ end
13
+
14
+ def wiki_show_attachments(str)
15
+ str.gsub /Attachment_([\d]+)_([\w]+)/ do |m|
16
+ begin
17
+ attachment = IrwiMod.config.page_attachment_class.find($1)
18
+ image_tag attachment.wiki_page_attachment.url($2.to_sym), :class => 'wiki_page_attachment'
19
+ rescue ActiveRecord::RecordNotFound
20
+ nil
21
+ end
22
+ end
23
+ end
24
+
25
+ end
@@ -0,0 +1,145 @@
1
+ module IrwiMod::Helpers::WikiPagesHelper
2
+
3
+ include IrwiMod::Support::TemplateFinder
4
+ include IrwiMod::Helpers::WikiPageAttachmentsHelper
5
+
6
+ # Edit form for wiki page model
7
+ def wiki_page_form( config = {}, &block )
8
+ form_for( @page, { :as => :page, :url => url_for( :action => :update ), :html=> { :class => 'wiki_form', :method => :post } }.merge!( config ), &block )
9
+ end
10
+
11
+ def wiki_page_new_path
12
+ if params && params[:path].present?
13
+ page = CGI::escape(params[:path])
14
+ end
15
+ wiki_page_path( page, :new )
16
+ end
17
+
18
+ def wiki_page_edit_path( page = nil )
19
+ wiki_page_path( page, :edit )
20
+ end
21
+
22
+ def wiki_page_history_path( page = nil )
23
+ wiki_page_path( page, :history )
24
+ end
25
+
26
+ def wiki_page_compare_path( page = nil )
27
+ wiki_page_path( page, :compare )
28
+ end
29
+
30
+ def wiki_page_path( page = nil, action = :show )
31
+ if page
32
+ page = page.path if page.respond_to? :path
33
+ page = nil if page.empty?
34
+
35
+ url_for( :action => action, :path => page )
36
+ else
37
+ url_for( :action => action )
38
+ end
39
+ end
40
+
41
+ def wiki_content( text )
42
+ sanitize( auto_link( IrwiMod.config.formatter.format( wiki_linkify( wiki_show_attachments(text) ) ) ) )
43
+ end
44
+
45
+ def wiki_diff( old_text, new_text )
46
+ IrwiMod.config.comparator.render_changes(h(old_text), h(new_text)).html_safe
47
+ end
48
+
49
+ def wiki_user( user )
50
+ return ("&lt;" + wt("Unknown") + "&gt;").html_safe unless user
51
+
52
+ if user.respond_to?(:name)
53
+ user.name
54
+ else
55
+ "User##{user.id}"
56
+ end
57
+ end
58
+
59
+ def wiki_linkify( str )
60
+ str.gsub /\[\[
61
+ (?:([^\[\]\|]+)\|)?
62
+ ([^\[\]]+)
63
+ \]\]
64
+ (\w+)?/xu do |m|
65
+ text = "#$2#$3"
66
+ link, anchor = if $1 then $1.split('#', 2) else $2 end
67
+ "<a href=\"#{wiki_link link}#{ '#' + anchor if anchor}\">#{text}</a>"
68
+ end.html_safe
69
+ end
70
+
71
+ def wiki_paginate( collection, &block )
72
+ IrwiMod.config.paginator.paginated_section( self, collection, &block )
73
+ end
74
+
75
+ def wiki_link( title )
76
+ if page = IrwiMod.config.page_class.find_by_title( title )
77
+ url_for( :controller => IrwiMod.config.controller_name, :action => :show, :path => page.path )
78
+ else
79
+ url_for( :controller => IrwiMod.config.controller_name, :action => :show, :path => title)
80
+ end
81
+ end
82
+
83
+ ##
84
+ # Instead of having to translate strings and defining a default value:
85
+ #
86
+ # t("Hello World!", :default => 'Hello World!')
87
+ #
88
+ # We define this method to define the value only once:
89
+ #
90
+ # wt("Hello World!")
91
+ #
92
+ # Note that interpolation still works ...
93
+ #
94
+ # wt("Hello {{world}}!", :world => @world)
95
+ #
96
+ def wt(msg, *args)
97
+ config = args.extract_options!
98
+ config[:default] = msg if config[:default].blank?
99
+ config[:scope] = 'wiki'
100
+ I18n.t(msg, config)
101
+ end
102
+
103
+ def wiki_page_style
104
+ render :partial => "#{template_dir '_wiki_page_style'}/wiki_page_style"
105
+ end
106
+
107
+ def wiki_page_info(page = nil)
108
+ page ||= @page # By default take page from instance variable
109
+
110
+ render :partial => "#{template_dir '_wiki_page_info'}/wiki_page_info", :locals => { :page => page }
111
+ end
112
+
113
+ def wiki_page_actions(page = nil)
114
+ page ||= @page # By default take page from instance variable
115
+
116
+ render :partial => "#{template_dir '_wiki_page_actions'}/wiki_page_actions", :locals => { :page => page }
117
+ end
118
+
119
+ def wiki_page_history(page = nil,versions = nil)
120
+ page ||= @page # By default take page from instance variable
121
+ versions ||= @versions || page.versions
122
+
123
+ render :partial => "#{template_dir '_wiki_page_history'}/wiki_page_history", :locals => { :page => page, :versions => versions, :with_form => (versions.size > 1) }
124
+ end
125
+
126
+ def wiki_page_attachments(page = @page)
127
+ return unless IrwiMod::config.page_attachment_class_name
128
+
129
+ page.attachments.each do |attachment|
130
+ concat image_tag(attachment.wiki_page_attachment.url(:thumb))
131
+ concat "Attachment_#{attachment.id}"
132
+ concat link_to(wt('Remove'), wiki_remove_page_attachment_path(attachment.id), :method => :delete)
133
+ end
134
+
135
+ form_for(IrwiMod.config.page_attachment_class.new,
136
+ :as => :wiki_page_attachment,
137
+ :url => wiki_add_page_attachment_path(page),
138
+ :html => { :multipart => true }) do |form|
139
+ concat form.file_field :wiki_page_attachment
140
+ concat form.hidden_field :page_id, :value => page.id
141
+ concat form.submit 'Add Attachment'
142
+ end
143
+ end
144
+
145
+ end
@@ -0,0 +1,16 @@
1
+ require 'active_support/core_ext/hash'
2
+
3
+ class IrwiMod::Paginators::None
4
+
5
+ def paginate( collection, options = {} )
6
+ find_options = options.except :page, :per_page, :total_entries, :finder
7
+
8
+ collection.find( :all, find_options )
9
+ end
10
+
11
+ def paginated_section( view, collection, &block )
12
+ yield
13
+ return
14
+ end
15
+
16
+ end
@@ -0,0 +1,11 @@
1
+ class IrwiMod::Paginators::WillPaginate
2
+
3
+ def paginate( collection, options = {} )
4
+ collection.paginate( options )
5
+ end
6
+
7
+ def paginated_section( view, collection, &block )
8
+ view.paginated_section( collection, &block )
9
+ end
10
+
11
+ end
@@ -0,0 +1,36 @@
1
+ require 'action_dispatch'
2
+
3
+ module IrwiMod::Support::RouteMapper
4
+
5
+ # Defining wiki root mount point
6
+ def wiki_root( root, config = {} )
7
+ opts = {
8
+ :controller => 'wiki_pages',
9
+ :root => root
10
+ }.merge(config)
11
+
12
+ IrwiMod.config.system_pages.each do |page_action, page_path| # Adding routes for system pages
13
+ get( "#{root}/#{page_path}", opts.merge({ :action => page_action.dup }) )
14
+ end
15
+
16
+ get( "#{root}/compare/(*path)", opts.merge({ :action => 'compare', :as => 'compare_wiki_page' }) ) # Comparing two versions of page
17
+ get( "#{root}/new/(*path)", opts.merge({ :action => 'new', :as => 'new_wiki_page' }) ) # Wiki new route
18
+ get( "#{root}/edit/(*path)", opts.merge({ :action => 'edit', :as => 'edit_wiki_page' }) ) # Wiki edit route
19
+ get( "#{root}/history/(*path)", opts.merge({ :action => 'history', :as => 'history_wiki_page' }) ) # Wiki history route
20
+
21
+ # Attachments
22
+ post("#{root}/attach/(*path)", opts.merge({:action => 'add_attachment' }))
23
+ delete("#{root}/attach/:attachment_id", opts.merge({:action => 'remove_attachment' }))
24
+
25
+ get( "#{root}", opts.merge({ :action => 'index', :as => 'wiki_page_index' }) ) # Wiki pages route
26
+ delete( "#{root}/(*path)", opts.merge({ :action => 'destroy', :as => 'destroy_wiki_page' }) ) # Wiki destroy route
27
+ post( "#{root}/(*path)", opts.merge({ :action => 'update', :as => 'update_wiki_page' }) ) # Save wiki pages route
28
+ get( "#{root}/(*path)", opts.merge({ :action => 'show', :as => 'wiki_page' }) ) # Wiki pages route
29
+
30
+ end
31
+
32
+ end
33
+
34
+ ActionDispatch::Routing::Mapper.instance_eval do
35
+ include IrwiMod::Support::RouteMapper
36
+ end