Changesets can be listed by changeset number.
The Git repository is here.
- Revision:
- 344
- Log:
Massive changeset which brings the old, ROOL customised Instiki
version up to date, but without any ROOL customisations in this
latest checked-in version (which is 0.19.1). This is deliberate,
so that it's easy to see the changes made for the ROOL version
in a subsequent changeset. The 'app/views/shared' directory is not
part of Instiki but is kept to maintain the change history with
updated ROOL customisations, some of which involve the same files
in that same directory.
- Author:
- rool
- Date:
- Sat Mar 19 19:52:13 +0000 2011
- Size:
- 6852 Bytes
1 | require 'xhtmldiff' |
2 | |
3 | # Temporary class containing all rendering stuff from a Revision |
4 | # I want to shift all rendering loguc to the controller eventually |
5 | |
6 | class PageRenderer |
7 | |
8 | def self.setup_url_generator(url_generator) |
9 | @@url_generator = url_generator |
10 | end |
11 | |
12 | def self.teardown_url_generator |
13 | @@url_generator = nil |
14 | end |
15 | |
16 | attr_reader :revision |
17 | |
18 | def initialize(revision = nil) |
19 | self.revision = revision |
20 | end |
21 | |
22 | def revision=(r) |
23 | @revision = r |
24 | @display_content = @display_published = @wiki_words_cache = @wiki_includes_cache = |
25 | @wiki_references_cache = nil |
26 | end |
27 | |
28 | def display_content(update_references = false) |
29 | @display_content ||= render(:update_references => update_references) |
30 | end |
31 | |
32 | def display_content_for_export |
33 | render :mode => :export |
34 | end |
35 | |
36 | def display_published |
37 | @display_published ||= render(:mode => :publish) |
38 | end |
39 | |
40 | def display_diff |
41 | previous_revision = @revision.page.previous_revision(@revision) |
42 | if previous_revision |
43 | |
44 | previous_content = "<div>" + WikiContent.new(previous_revision, @@url_generator).render!.to_s + "</div>" |
45 | current_content = "<div>" + display_content.to_s + "</div>" |
46 | diff_doc = REXML::Document.new |
47 | div = REXML::Element.new('div', nil, {:respect_whitespace =>:all}) |
48 | div.attributes['class'] = 'xhtmldiff_wrapper' |
49 | diff_doc << div |
50 | hd = XHTMLDiff.new(div) |
51 | |
52 | parsed_previous_revision = REXML::HashableElementDelegator.new( |
53 | REXML::XPath.first(REXML::Document.new(previous_content), '/div')) |
54 | parsed_display_content = REXML::HashableElementDelegator.new( |
55 | REXML::XPath.first(REXML::Document.new(current_content), '/div')) |
56 | Diff::LCS.traverse_balanced(parsed_previous_revision, parsed_display_content, hd) |
57 | |
58 | diffs = '' |
59 | diff_doc.write(diffs, -1, true, true) |
60 | diffs.gsub(/\A<div class='xhtmldiff_wrapper'>(.*)<\/div>\Z/m, '\1').html_safe |
61 | else |
62 | display_content |
63 | end |
64 | end |
65 | |
66 | attr :s5_theme |
67 | def s5_theme=(s) |
68 | @s5_theme = s |
69 | end |
70 | |
71 | # Renders an S5 slideshow |
72 | def display_s5 |
73 | @display_s5 ||= render(:mode => :s5, |
74 | :engine_opts => {:author => @author, :title => @plain_name}, |
75 | :renderer => self) |
76 | end |
77 | |
78 | # Returns an array of all the WikiIncludes present in the content of this revision. |
79 | def wiki_includes |
80 | unless @wiki_includes_cache |
81 | chunks = display_content.find_chunks(Include) |
82 | @wiki_includes_cache = chunks.map { |c| ( c.escaped? ? nil : c.page_name ) }.compact.uniq |
83 | end |
84 | @wiki_includes_cache |
85 | end |
86 | |
87 | # Returns an array of all the WikiReferences present in the content of this revision. |
88 | def wiki_references |
89 | unless @wiki_references_cache |
90 | chunks = display_content.find_chunks(WikiChunk::WikiReference) |
91 | @wiki_references_cache = chunks.map { |c| ( c.escaped? ? nil : c.page_name ) }.compact.uniq |
92 | end |
93 | @wiki_references_cache |
94 | end |
95 | |
96 | # Returns an array of all the WikiWords present in the content of this revision. |
97 | def wiki_words |
98 | @wiki_words_cache ||= find_wiki_words(display_content) |
99 | end |
100 | |
101 | def find_wiki_words(rendering_result) |
102 | the_wiki_words = wiki_links(rendering_result) |
103 | # Exclude backslash-escaped wiki words, such as \WikiWord, as well as links to files |
104 | # and pictures, such as [[foo.txt:file]] or [[foo.jpg:pic]] |
105 | the_wiki_words.delete_if { |link| link.escaped? or [:pic, :file, :audio, :video, :delete].include?(link.link_type) } |
106 | # convert to the list of unique page names |
107 | the_wiki_words.map { |link| ( link.page_name ) }.uniq |
108 | end |
109 | |
110 | # Returns an array of all the WikiWords present in the content of this revision. |
111 | def wiki_files |
112 | @wiki_files_cache ||= find_wiki_files(display_content) |
113 | end |
114 | |
115 | def find_wiki_files(rendering_result) |
116 | the_wiki_files = wiki_links(rendering_result) |
117 | the_wiki_files.delete_if { |link| ![:pic, :file, :audio, :video].include?(link.link_type) } |
118 | the_wiki_files.map { |link| ( link.page_name ) }.uniq |
119 | end |
120 | |
121 | def wiki_links(rendering_result) |
122 | rendering_result.find_chunks(WikiChunk::WikiLink) |
123 | end |
124 | |
125 | # Returns an array of all the WikiWords present in the content of this revision. |
126 | # that already exists as a page in the web. |
127 | def existing_pages |
128 | wiki_words.select { |wiki_word| @revision.page.web.page(wiki_word) } |
129 | end |
130 | |
131 | # Returns an array of all the WikiWords present in the content of this revision |
132 | # that *doesn't* already exists as a page in the web. |
133 | def unexisting_pages |
134 | wiki_words - existing_pages |
135 | end |
136 | |
137 | private |
138 | |
139 | def render(options = {}) |
140 | rendering_result = WikiContent.new(@revision, @@url_generator, options).render! |
141 | update_references(rendering_result) if options[:update_references] |
142 | rendering_result |
143 | end |
144 | |
145 | def update_references(rendering_result) |
146 | WikiReference.delete_all ['page_id = ?', @revision.page_id] |
147 | |
148 | references = @revision.page.wiki_references |
149 | |
150 | wiki_words = find_wiki_words(rendering_result) |
151 | # TODO it may be desirable to save links to files and pictures as WikiReference objects |
152 | # present version doesn't do it |
153 | |
154 | wiki_words.each do |referenced_name| |
155 | # Links to self are always considered linked |
156 | if referenced_name == @revision.page.name |
157 | link_type = WikiReference::LINKED_PAGE |
158 | else |
159 | link_type = WikiReference.link_type(@revision.page.web, referenced_name) |
160 | end |
161 | references.build :referenced_name => referenced_name, :link_type => link_type |
162 | end |
163 | |
164 | wiki_files = find_wiki_files(rendering_result) |
165 | wiki_files.each do |referenced_name| |
166 | references.build :referenced_name => referenced_name, :link_type => WikiReference::FILE |
167 | end |
168 | |
169 | include_chunks = rendering_result.find_chunks(Include) |
170 | includes = include_chunks.map { |c| ( c.escaped? ? nil : c.page_name ) }.compact.uniq |
171 | includes.each do |included_page_name| |
172 | references.build :referenced_name => included_page_name, |
173 | :link_type => WikiReference::INCLUDED_PAGE |
174 | end |
175 | |
176 | redirect_chunks = rendering_result.find_chunks(Redirect) |
177 | redirects = redirect_chunks.map { |c| ( c.escaped? ? nil : c.page_name ) }.compact.uniq |
178 | redirects.each do |redirected_page_name| |
179 | references.build :referenced_name => redirected_page_name, |
180 | :link_type => WikiReference::REDIRECTED_PAGE |
181 | end |
182 | |
183 | # ugly hack: store these in a thread-local variable, so that the cache-sweeper has access to it. |
184 | Thread.current[:page_redirects] ? |
185 | Thread.current[:page_redirects].update({ @revision.page => redirects}) : |
186 | Thread.current[:page_redirects] = { @revision.page => redirects} |
187 | |
188 | categories = rendering_result.find_chunks(Category).map { |cat| cat.list }.flatten |
189 | categories.each do |category| |
190 | references.build :referenced_name => category, :link_type => WikiReference::CATEGORY |
191 | end |
192 | end |
193 | end |