Changesets can be listed by changeset number.
The Git repository is here.
- Revision:
- 2
- Log:
Initial import of Instiki 0.11.0 sources from a downloaded Tarball.
Instiki is a Ruby On Rails based Wiki clone.
- Author:
- adh
- Date:
- Sat Jul 22 14:54:51 +0100 2006
- Size:
- 4445 Bytes
1 | require 'diff' |
2 | # Temporary class containing all rendering stuff from a Revision |
3 | # I want to shift all rendering loguc to the controller eventually |
4 | |
5 | class PageRenderer |
6 | |
7 | include HTMLDiff |
8 | |
9 | def self.setup_url_generator(url_generator) |
10 | @@url_generator = url_generator |
11 | end |
12 | |
13 | def self.teardown_url_generator |
14 | @@url_generator = nil |
15 | end |
16 | |
17 | attr_reader :revision |
18 | |
19 | def initialize(revision = nil) |
20 | self.revision = revision |
21 | end |
22 | |
23 | def revision=(r) |
24 | @revision = r |
25 | @display_content = @display_published = @wiki_words_cache = @wiki_includes_cache = |
26 | @wiki_references_cache = nil |
27 | end |
28 | |
29 | def display_content(update_references = false) |
30 | @display_content ||= render(:update_references => update_references) |
31 | end |
32 | |
33 | def display_content_for_export |
34 | render :mode => :export |
35 | end |
36 | |
37 | def display_published |
38 | @display_published ||= render(:mode => :publish) |
39 | end |
40 | |
41 | def display_diff |
42 | previous_revision = @revision.page.previous_revision(@revision) |
43 | if previous_revision |
44 | rendered_previous_revision = WikiContent.new(previous_revision, @@url_generator).render! |
45 | diff(rendered_previous_revision, display_content) |
46 | else |
47 | display_content |
48 | end |
49 | end |
50 | |
51 | # Returns an array of all the WikiIncludes present in the content of this revision. |
52 | def wiki_includes |
53 | unless @wiki_includes_cache |
54 | chunks = display_content.find_chunks(Include) |
55 | @wiki_includes_cache = chunks.map { |c| ( c.escaped? ? nil : c.page_name ) }.compact.uniq |
56 | end |
57 | @wiki_includes_cache |
58 | end |
59 | |
60 | # Returns an array of all the WikiReferences present in the content of this revision. |
61 | def wiki_references |
62 | unless @wiki_references_cache |
63 | chunks = display_content.find_chunks(WikiChunk::WikiReference) |
64 | @wiki_references_cache = chunks.map { |c| ( c.escaped? ? nil : c.page_name ) }.compact.uniq |
65 | end |
66 | @wiki_references_cache |
67 | end |
68 | |
69 | # Returns an array of all the WikiWords present in the content of this revision. |
70 | def wiki_words |
71 | @wiki_words_cache ||= find_wiki_words(display_content) |
72 | end |
73 | |
74 | def find_wiki_words(rendering_result) |
75 | wiki_links = rendering_result.find_chunks(WikiChunk::WikiLink) |
76 | # Exclude backslash-escaped wiki words, such as \WikiWord, as well as links to files |
77 | # and pictures, such as [[foo.txt:file]] or [[foo.jpg:pic]] |
78 | wiki_links.delete_if { |link| link.escaped? or [:pic, :file].include?(link.link_type) } |
79 | # convert to the list of unique page names |
80 | wiki_links.map { |link| ( link.page_name ) }.uniq |
81 | end |
82 | |
83 | # Returns an array of all the WikiWords present in the content of this revision. |
84 | # that already exists as a page in the web. |
85 | def existing_pages |
86 | wiki_words.select { |wiki_word| @revision.page.web.page(wiki_word) } |
87 | end |
88 | |
89 | # Returns an array of all the WikiWords present in the content of this revision |
90 | # that *doesn't* already exists as a page in the web. |
91 | def unexisting_pages |
92 | wiki_words - existing_pages |
93 | end |
94 | |
95 | private |
96 | |
97 | def render(options = {}) |
98 | rendering_result = WikiContent.new(@revision, @@url_generator, options).render! |
99 | update_references(rendering_result) if options[:update_references] |
100 | rendering_result |
101 | end |
102 | |
103 | def update_references(rendering_result) |
104 | WikiReference.delete_all ['page_id = ?', @revision.page_id] |
105 | |
106 | references = @revision.page.wiki_references |
107 | |
108 | wiki_words = find_wiki_words(rendering_result) |
109 | # TODO it may be desirable to save links to files and pictures as WikiReference objects |
110 | # present version doesn't do it |
111 | |
112 | wiki_words.each do |referenced_name| |
113 | # Links to self are always considered linked |
114 | if referenced_name == @revision.page.name |
115 | link_type = WikiReference::LINKED_PAGE |
116 | else |
117 | link_type = WikiReference.link_type(@revision.page.web, referenced_name) |
118 | end |
119 | references.create :referenced_name => referenced_name, :link_type => link_type |
120 | end |
121 | |
122 | include_chunks = rendering_result.find_chunks(Include) |
123 | includes = include_chunks.map { |c| ( c.escaped? ? nil : c.page_name ) }.compact.uniq |
124 | includes.each do |included_page_name| |
125 | references.create :referenced_name => included_page_name, |
126 | :link_type => WikiReference::INCLUDED_PAGE |
127 | end |
128 | |
129 | categories = rendering_result.find_chunks(Category).map { |cat| cat.list }.flatten |
130 | categories.each do |category| |
131 | references.create :referenced_name => category, :link_type => WikiReference::CATEGORY |
132 | end |
133 | end |
134 | end |