sqliki 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/USAGE CHANGED
@@ -28,3 +28,4 @@ EXAMPLE
28
28
  /wiki/rollback/(draft)
29
29
 
30
30
  The tables are always called pages, drafts, and links
31
+
@@ -2,17 +2,18 @@ require 'rubygems'
2
2
 
3
3
  SPEC = Gem::Specification.new do |s|
4
4
  s.name = %q{sqliki}
5
- s.version = "0.0.3"
6
- s.date = %q{2005-08-25}
5
+ s.version = "0.0.4"
6
+ s.date = %q{2005-09-03}
7
7
  s.summary = %q{[Rails] SQL-based wiki generator.}
8
8
  s.require_paths = ["."]
9
9
  s.email = %q{Markus@reality.com}
10
- s.homepage = %q{http://www.rubyonrails.org/show/Generators}
10
+ s.homepage = %q{http://rubyforge.org/projects/sqliki/}
11
11
  s.description = %q{Generates code for (primative) a SQL-based wiki within your Rails app.}
12
12
  s.authors = ["Markus J. Q. Roberts"]
13
13
  s.files = %w{
14
14
  USAGE
15
15
  templates/lib_sanitize_html.rb
16
+ templates/lib_roparojo.rb
16
17
  templates/README
17
18
  templates/model_draft.rb
18
19
  templates/view_edit.rhtml
@@ -26,7 +27,7 @@ SPEC = Gem::Specification.new do |s|
26
27
  templates/model_page.rb
27
28
  templates/controller_sqliki_controller.rb
28
29
  sqliki_generator.rb
29
- sqliki_generator-0.0.3.gemspec
30
+ sqliki_generator-0.0.4.gemspec
30
31
  }
31
32
  s.add_dependency('rails', [">= 0.13.1"])
32
33
  s.add_dependency('RedCloth')
@@ -16,7 +16,7 @@ class SqlikiGenerator < Rails::Generator::NamedBase
16
16
  m.template "controller_sqliki_controller.rb",File.join("app/controllers", class_path, "#{file_name}_controller.rb")
17
17
 
18
18
  # Libs.
19
- %w{sanitize_html}.each do |x|
19
+ %w{sanitize_html roparojo}.each do |x|
20
20
  m.template "lib_#{x}.rb",File.join("lib", class_path, "#{x}.rb")
21
21
  end
22
22
 
@@ -92,4 +92,10 @@ CREATE TABLE links (
92
92
  Implemented Orphaned/Wanted/Recently_revised
93
93
  Cleaned up the controller interface (w. the the
94
94
  trick from Tobias Luetke's Postback Generator)
95
+ 0.0.3
96
+ Fixed two typos in the gemspec that were making
97
+ it hard for some people to install
98
+ 0.0.4
99
+ Added ".id" to the Uses of "User.current_user" to
100
+ fix a bug which misattributed pages
95
101
 
@@ -3,7 +3,7 @@ class <%= class_name %>Controller < ApplicationController
3
3
  include LoginSystem
4
4
  before_filter :login_required
5
5
  def identify_page
6
- @page ||= Page.find_by_title(params[:id])
6
+ @page ||= Page.find(Page.key_from_URL(params[:id]))
7
7
  end
8
8
  def index
9
9
  list
@@ -0,0 +1,95 @@
1
+ require 'redcloth'
2
+
3
+ class RopaRojo < RedCloth
4
+ def hard_break(text)
5
+ @rules.each do |rule_name|
6
+ method( rule_name ).call( text ) if rule_name.to_s.match /^pre_/
7
+ end
8
+ super
9
+ end
10
+ def to_html(*rules,&callback)
11
+ @callback = callback
12
+ rules = DEFAULT_RULES if rules.empty?
13
+ text = super(*([:pre_wiki_words,:pre_make_divs,:post_add_toggle]+rules))
14
+ end
15
+ def htmlesc(str,mode)
16
+ super
17
+ str
18
+ end
19
+ # Bracket free text consists of either
20
+ # characters that are not "{" or "}",
21
+ # one or two "{"s, not followed by a third "{",
22
+ # one or two "}"s, not followed by a third "}",
23
+ #
24
+ BRACKET_FREE_TEXT = "((:?[^{}]|[{]{1,2}(?![{])|[}]{1,2}(?![}]))*?)"
25
+ DIV_BRACKETS = /\{\{\{#{BRACKET_FREE_TEXT}\}\}\}/m
26
+ ALT_TEXT = /
27
+ (
28
+ ([\s\[{(]|[#{PUNCT}])? # $pre
29
+ " # start
30
+ (#{C}) # $atts
31
+ ([^"]+?) # $text
32
+ \s?
33
+ (?:\(([^)]+?)\)(?="))? # $title
34
+ ":
35
+ )?
36
+ /mx
37
+ XDIV_RE = /
38
+ (
39
+ ([\s\[{(]|[#{PUNCT}])? # $pre
40
+ " # start
41
+ (#{C}) # $atts
42
+ ([^"]+?) # $text
43
+ \s?
44
+ (?:\(([^)]+?)\)(?="))? # $title
45
+ ":
46
+ )?
47
+ #{DIV_BRACKETS} # $div_block
48
+ /mx
49
+ DIV_RE = /#{ALT_TEXT}#{DIV_BRACKETS}/m
50
+
51
+ def pre_make_divs( text )
52
+ ## break the text into <div> blocks based on {{{ ... }}}
53
+ while text.gsub!( DIV_RE ) { |m|
54
+ has_link,pre,atts,link_text,title,div_block = $~.captures
55
+ if has_link
56
+ @need_toggle_function = true
57
+ id = "div_#{rand(100000)}"
58
+ atts = shelve(" onclick=\"toggle('#{id}'); return false;\" #{ pba(atts) } title=\"#{ title||'more...' }\"")
59
+ "#{ pre }<a#{ atts }>#{ link_text }</a><div id=\"#{id}\" style=\"display:none\">#{div_block}</div>"
60
+ else
61
+ "<div #{shelve(attrs) }>#{div_block}</div>"
62
+ end
63
+ }; end
64
+ text
65
+ end
66
+ def post_add_toggle(text)
67
+ text << %q{
68
+ <script type="text/javascript" language="JavaScript">
69
+ <!--
70
+ function toggle(name) {
71
+ q=document.getElementById(name);
72
+ if (q.style.display == 'none')
73
+ {q.style.display = 'block';}
74
+ else
75
+ {q.style.display = 'none';};
76
+ }
77
+ //-->
78
+ </script>
79
+ } if @need_toggle_function
80
+ end
81
+ NOT_WIKI_WORD = /\\(([A-Z]+[a-z0-9]+){2,})/
82
+ WIKI_WORD = /#{ALT_TEXT}(([A-Z]+['a-z1-9]+){2,})/
83
+ WIKI_PHRASE = /#{ALT_TEXT}\[\[(.*?)\]\]/m
84
+ def pre_wiki_words(text)
85
+ text.gsub!(NOT_WIKI_WORD) { |m| shelve $1 }
86
+ [WIKI_PHRASE,WIKI_WORD].each {|pattern|
87
+ text.gsub!(pattern) { |m|
88
+ has_link,pre,atts,link_text,title,ww = $~.captures
89
+ (pre||'') + shelve(@callback.call(:wiki_link,pattern,atts,link_text,ww))
90
+ }
91
+ }
92
+ text
93
+ end
94
+ end
95
+
@@ -1,5 +1,5 @@
1
1
  require 'sanitize_html'
2
- require 'redcloth'
2
+ require 'roparojo'
3
3
 
4
4
  class Draft < ActiveRecord::Base
5
5
  acts_as_tree :foreign_key => 'based_on_draft_id'
@@ -13,129 +13,29 @@ class Draft < ActiveRecord::Base
13
13
  def raw
14
14
  body
15
15
  end
16
- class RopaRojo < RedCloth
17
- def hard_break(text)
18
- @rules.each do |rule_name|
19
- method( rule_name ).call( text ) if rule_name.to_s.match /^pre_/
20
- end
21
- super
22
- end
23
- def to_html(*rules,&callback)
24
- @callback = callback
25
- rules = DEFAULT_RULES if rules.empty?
26
- text = super(*([:pre_wiki_words,:pre_make_divs,:post_add_toggle]+rules))
27
- end
28
- def htmlesc(str,mode)
29
- super
30
- str
31
- end
32
- # Bracket free text consists of either
33
- # characters that are not "{" or "}",
34
- # one or two "{"s, not followed by a third "{",
35
- # one or two "}"s, not followed by a third "}",
36
- #
37
- BRACKET_FREE_TEXT = "((:?[^{}]|[{]{1,2}(?![{])|[}]{1,2}(?![}]))*?)"
38
- DIV_BRACKETS = /\{\{\{#{BRACKET_FREE_TEXT}\}\}\}/m
39
- ALT_TEXT = /
40
- (
41
- ([\s\[{(]|[#{PUNCT}])? # $pre
42
- " # start
43
- (#{C}) # $atts
44
- ([^"]+?) # $text
45
- \s?
46
- (?:\(([^)]+?)\)(?="))? # $title
47
- ":
48
- )?
49
- /mx
50
- XDIV_RE = /
51
- (
52
- ([\s\[{(]|[#{PUNCT}])? # $pre
53
- " # start
54
- (#{C}) # $atts
55
- ([^"]+?) # $text
56
- \s?
57
- (?:\(([^)]+?)\)(?="))? # $title
58
- ":
59
- )?
60
- #{DIV_BRACKETS} # $div_block
61
- /mx
62
- DIV_RE = /#{ALT_TEXT}#{DIV_BRACKETS}/m
63
-
64
- def pre_make_divs( text )
65
- ## break the text into <div> blocks based on {{{ ... }}}
66
- while text.gsub!( DIV_RE ) { |m|
67
- has_link,pre,atts,link_text,title,div_block = $~.captures
68
- if has_link
69
- @need_toggle_function = true
70
- id = "div_#{rand(100000)}"
71
- atts = shelve(" onclick=\"toggle('#{id}'); return false;\" #{ pba(atts) } title=\"#{ title||'more...' }\"")
72
- "#{ pre }<a#{ atts }>#{ link_text }</a><div id=\"#{id}\" style=\"display:none\">#{div_block}</div>"
73
- else
74
- "<div #{shelve(attrs) }>#{div_block}</div>"
75
- end
76
- }; end
77
- text
78
- end
79
- def post_add_toggle(text)
80
- text << %q{
81
- <script type="text/javascript" language="JavaScript">
82
- <!--
83
- function toggle(name) {
84
- q=document.getElementById(name);
85
- if (q.style.display == 'none')
86
- {q.style.display = 'block';}
87
- else
88
- {q.style.display = 'none';};
89
- }
90
- //-->
91
- </script>
92
- } if @need_toggle_function
93
- end
94
- NOT_WIKI_WORD = /\\(([A-Z]+[a-z0-9]+){2,})/
95
- WIKI_WORD = /#{ALT_TEXT}(([A-Z]+[a-z1-9]+){2,})/
96
- WIKI_PHRASE = /#{ALT_TEXT}\[\[(.*?)\]\]/m
97
- def split_wiki_word(ww)
98
- ww.gsub(/([a-z0-9])([A-Z])/,'\1 \2');
99
- end
100
- def clean_wiki_word(ww)
101
- ww.gsub(/[^A-Za-z0-9$-_.+!*'(),]/,'')
102
- end
103
- include ActionView::Helpers::TagHelper
104
- include ActionView::Helpers::UrlHelper
105
- def wiki_link(link_text,ww)
106
- (@callback && @callback.call(:wiki_link,link_text,ww)) ||
107
- (link_to link_text, "/<%= file_name %>/show/#{clean_wiki_word(ww)}")
108
- end
109
- def pre_wiki_words(text)
110
- text.gsub!(NOT_WIKI_WORD) { |m| shelve $1 }
111
- [WIKI_PHRASE,WIKI_WORD].each {|pattern|
112
- text.gsub!(pattern) { |m|
113
- has_link,pre,atts,link_text,title,ww = $~.captures
114
- ww = split_wiki_word(ww) if pattern == WIKI_WORD
115
- (pre||'') + shelve(wiki_link("<span #{pba(atts)}>#{link_text||ww}</span>",ww))
116
- }
117
- }
118
- text
119
- end
120
- end
121
- def textilize(body) #html
122
- if body.blank?
123
- ""
124
- else
125
- RopaRojo.new(body, [:hard_breaks ]).to_html { |event,*details|
126
- case event
127
- when :wiki_link
128
- link_text,ww = *details
129
- page = (Page.find_by_title(ww) || Page.new_page(ww))
130
- links << page unless links.include? page
131
- nil
132
- else
133
- nil
134
- end
135
- }
136
- end
137
- end
16
+ include ActionView::Helpers::TagHelper
17
+ include ActionView::Helpers::UrlHelper
138
18
  def html
139
- sanitize_html(textilize(body))
19
+ sanitize_html(
20
+ #if body.blank?
21
+ # ""
22
+ # else
23
+ RopaRojo.new(body, [:hard_breaks ]).to_html { |event,*details|
24
+ case event
25
+ when :wiki_link
26
+ pattern,atts,link_text,ww = *details
27
+ ww = Page.key_from_CamelCase(ww) if pattern == RopaRojo::WIKI_WORD
28
+ page = (Page.find(ww) || Page.new_page(ww))
29
+ ww = page.title
30
+ links << page unless links.include? page
31
+ link_text = "<span #{pba(atts)}>#{link_text||ww}</span>"
32
+ link_to link_text, "/<%= file_name %>/show/#{Page.find_or_make(ww).for_URL}"
33
+ else
34
+ nil
35
+ end
36
+ }
37
+ # end
38
+ )
140
39
  end
141
40
  end
41
+
@@ -7,7 +7,7 @@ class Page < ActiveRecord::Base
7
7
  validates_length_of :title, :within => 1..80
8
8
  validates_presence_of :title
9
9
  def self.new_page(title)
10
- p = Page.new :created_by => User.current_user, :title => title
10
+ p = Page.new :created_by => User.current_user.id, :title => title
11
11
  p.raw = ''
12
12
  p
13
13
  end
@@ -18,7 +18,7 @@ class Page < ActiveRecord::Base
18
18
  d = Draft.new(
19
19
  :body => new_text || '',
20
20
  :based_on_draft_id => self.current_draft && self.current_draft.id,
21
- :created_by => User.current_user
21
+ :created_by => User.current_user.id
22
22
  );
23
23
  d.save;
24
24
  self.current_draft = d
@@ -28,4 +28,24 @@ class Page < ActiveRecord::Base
28
28
  def html
29
29
  current_draft.html
30
30
  end
31
+ def self.key_from_CamelCase(s)
32
+ s.gsub(/([a-z])([A-Z][a-z])/,'\1 \2')
33
+ end
34
+ def self.key_from_URL(s)
35
+ s.html_decode.gsub(/\+/,' ').gsub(/''/,'"')
36
+ end
37
+ def self.find(s*)
38
+ return super(s*) unless s.length == 1 and s.first.is_a? String
39
+ s = s.first
40
+ find_by_title(s) || ((s =~ /[a-z][A-Z][a-z]) && find_by_title(key_from_CamelCase(s)))
41
+ end
42
+ def for_URL
43
+ title.gsub(/ /,'+').gsub(/"/,"''").html_encode
44
+ end
45
+ def split_wiki_word(ww)
46
+ ww.gsub(/([a-z0-9])([A-Z])/,'\1 \2');
47
+ end
48
+ def clean_wiki_word(ww)
49
+ ww.gsub(/[^-A-Za-z0-9$_.+!*'(),]/,'')
50
+ end
31
51
  end
metadata CHANGED
@@ -3,13 +3,13 @@ rubygems_version: 0.8.10
3
3
  specification_version: 1
4
4
  name: sqliki
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.0.3
7
- date: 2005-08-25
6
+ version: 0.0.4
7
+ date: 2005-09-03
8
8
  summary: "[Rails] SQL-based wiki generator."
9
9
  require_paths:
10
10
  - "."
11
11
  email: Markus@reality.com
12
- homepage: http://www.rubyonrails.org/show/Generators
12
+ homepage: http://rubyforge.org/projects/sqliki/
13
13
  rubyforge_project:
14
14
  description: Generates code for (primative) a SQL-based wiki within your Rails app.
15
15
  autorequire:
@@ -29,6 +29,7 @@ authors:
29
29
  files:
30
30
  - USAGE
31
31
  - templates/lib_sanitize_html.rb
32
+ - templates/lib_roparojo.rb
32
33
  - templates/README
33
34
  - templates/model_draft.rb
34
35
  - templates/view_edit.rhtml
@@ -42,7 +43,7 @@ files:
42
43
  - templates/model_page.rb
43
44
  - templates/controller_sqliki_controller.rb
44
45
  - sqliki_generator.rb
45
- - sqliki_generator-0.0.3.gemspec
46
+ - sqliki_generator-0.0.4.gemspec
46
47
  test_files: []
47
48
  rdoc_options: []
48
49
  extra_rdoc_files: []