diff --git a/app/controllers/wiki_controller.rb b/app/controllers/wiki_controller.rb index dbed5666..7ed3c4d5 100644 --- a/app/controllers/wiki_controller.rb +++ b/app/controllers/wiki_controller.rb @@ -115,7 +115,6 @@ class WikiController < ApplicationController def list parse_category - @pages_by_name = @pages_in_category.by_name @page_names_that_are_wanted = @pages_in_category.wanted_pages @pages_that_are_orphaned = @pages_in_category.orphaned_pages end @@ -334,15 +333,15 @@ class WikiController < ApplicationController end def parse_category - @category = @params['category'] @categories = WikiReference.list_categories.sort - page_names_in_category = WikiReference.pages_in_category(@category) - if (page_names_in_category.empty?) + @category = @params['category'] + if @category + @set_name = "category '#{@category}'" + @pages_in_category = WikiReference.pages_in_category(@category).map { |page_name| @web.page(page_name) }.by_name + else + # no category specified, return all pages of the web @pages_in_category = @web.select_all.by_name @set_name = 'the web' - else - @pages_in_category = @web.select { |page| page_names_in_category.include?(page.name) }.by_name - @set_name = "category '#{@category}'" end end diff --git a/app/models/page.rb b/app/models/page.rb index 1896ac5f..c5f48d43 100644 --- a/app/models/page.rb +++ b/app/models/page.rb @@ -63,6 +63,10 @@ class Page < ActiveRecord::Base web.select.pages_that_reference(name) end + def wiki_words + wiki_references.select { |ref| ref.wiki_word? }.map { |ref| ref.referenced_name } + end + def linked_from web.select.pages_that_link_to(name) end diff --git a/app/models/page_set.rb b/app/models/page_set.rb index 9589b36c..4ac08c00 100644 --- a/app/models/page_set.rb +++ b/app/models/page_set.rb @@ -85,10 +85,8 @@ class PageSet < Array def wiki_words self.inject([]) { |wiki_words, page| - wiki_words + page.wiki_references. - select { |ref| ref.link_type != WikiReference::CATEGORY }. - map { |ref| ref.referenced_name } - }.flatten.uniq + wiki_words + page.wiki_words + }.flatten.uniq.sort end end diff --git a/app/models/wiki_reference.rb b/app/models/wiki_reference.rb index 9f4534a7..4a8b6de6 100644 --- a/app/models/wiki_reference.rb +++ b/app/models/wiki_reference.rb @@ -5,9 +5,11 @@ class WikiReference < ActiveRecord::Base INCLUDED_PAGE = 'I' CATEGORY = 'C' AUTHOR = 'A' + FILE = 'F' + WANTED_FILE = 'E' belongs_to :page - validates_inclusion_of :link_type, :in => [LINKED_PAGE, WANTED_PAGE, INCLUDED_PAGE, CATEGORY, AUTHOR] + validates_inclusion_of :link_type, :in => [LINKED_PAGE, WANTED_PAGE, INCLUDED_PAGE, CATEGORY, AUTHOR, FILE, WANTED_FILE] # FIXME all finders below MUST restrict their results to pages belonging to a particular web @@ -37,9 +39,10 @@ class WikiReference < ActiveRecord::Base end def self.pages_in_category(category) - query = 'SELECT name FROM pages JOIN wiki_references ON pages.id = wiki_references.page_id ' + + query = + 'SELECT name FROM pages JOIN wiki_references ON pages.id = wiki_references.page_id ' + 'WHERE wiki_references.referenced_name = ? ' + - "AND wiki_references.link_type = '#{CATEGORY}'" + "AND wiki_references.link_type = '#{CATEGORY}'" + names = connection.select_all(sanitize_sql([query, category])).map { |row| row['name'] } end @@ -48,10 +51,14 @@ class WikiReference < ActiveRecord::Base connection.select_all(query).map { |row| row['referenced_name'] } end - def wiki_link? + def wiki_word? linked_page? or wanted_page? end + def wiki_link? + linked_page? or wanted_page? or file? or wanted_file? + end + def linked_page? link_type == LINKED_PAGE end @@ -63,5 +70,13 @@ class WikiReference < ActiveRecord::Base def included_page? link_type == INCLUDED_PAGE end + + def file? + link_type == FILE + end + + def wanted_file? + link_type == WANTED_FILE + end end diff --git a/app/views/wiki/list.rhtml b/app/views/wiki/list.rhtml index d891f5a2..e1b584be 100644 --- a/app/views/wiki/list.rhtml +++ b/app/views/wiki/list.rhtml @@ -11,7 +11,7 @@ <% end %>
All content: <%= total_chars %> chars / <%= sprintf("%-.1f", (total_chars / 2275 )) %> pages
+All content: <%= total_chars %> chars / approx. <%= sprintf("%-.1f", (total_chars / 2275 )) %> printed pages
<% end %> diff --git a/lib/page_renderer.rb b/lib/page_renderer.rb index f47238f4..d48bc2c4 100644 --- a/lib/page_renderer.rb +++ b/lib/page_renderer.rb @@ -66,11 +66,16 @@ class PageRenderer # Returns an array of all the WikiWords present in the content of this revision. def wiki_words - unless @wiki_words_cache - wiki_chunks = display_content.find_chunks(WikiChunk::WikiLink) - @wiki_words_cache = wiki_chunks.map { |c| ( c.escaped? ? nil : c.page_name ) }.compact.uniq - end - @wiki_words_cache + @wiki_words_cache ||= find_wiki_words(display_content) + end + + def find_wiki_words(rendering_result) + wiki_links = rendering_result.find_chunks(WikiChunk::WikiLink) + # Exclude backslash-escaped wiki words, such as \WikiWord, as well as links to files + # and pictures, such as [[foo.txt:file]] or [[foo.jpg:pic]] + wiki_links.delete_if { |link| link.escaped? or [:pic, :file].include?(link.link_type) } + # convert to the list of unique page names + wiki_links.map { |link| ( link.page_name ) }.uniq end # Returns an array of all the WikiWords present in the content of this revision. @@ -88,12 +93,8 @@ class PageRenderer private def render(options = {}) - rendering_result = WikiContent.new(@revision, @@url_generator, options).render! - - if options[:update_references] - update_references(rendering_result) - end + update_references(rendering_result) if options[:update_references] rendering_result end @@ -101,9 +102,10 @@ class PageRenderer WikiReference.delete_all ['page_id = ?', @revision.page_id] references = @revision.page.wiki_references - - wiki_word_chunks = rendering_result.find_chunks(WikiChunk::WikiLink) - wiki_words = wiki_word_chunks.map { |c| ( c.escaped? ? nil : c.page_name ) }.compact.uniq + + wiki_words = find_wiki_words(rendering_result) + # TODO it may be desirable to save links to files and pictures as WikiReference objects + # present version doesn't do it wiki_words.each do |referenced_name| # Links to self are always considered linked diff --git a/public/stylesheets/instiki.css b/public/stylesheets/instiki.css index 667fb8e9..b179271d 100644 --- a/public/stylesheets/instiki.css +++ b/public/stylesheets/instiki.css @@ -1,15 +1,12 @@ -body { background-color: #fff; color: #333; } +body { background-color: white; color: #333; } body, p, ol, ul, td { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 18px; } #Container { float: none; margin: 0 auto; text-align: center; } #Content { margin: 0; padding: 5px; text-align: left; border-top: none; float: left; } -a { color: #000; } +a { color: black; } a:visited { color: #666; } -a:hover { color: #fff; background-color:#000; } - -.newWikiWord { background-color: #eee; } -.newWikiWord a:hover { background-color: white; } +a:hover { color: white; background-color:#000; } h1, h2, h3 { color: #333; font-family: georgia, verdana, sans-serif; } h1 { font-size: 28px } @@ -22,6 +19,9 @@ h1#pageName small { color: #444; line-height: 10px; font-size: 10px; padding: 0; a.nav, a.nav:link, a.nav:visited { color: #000; } a.nav:hover { color: #fff; background-color:#000; } +.newWikiWord { background-color: #BFBFBF; } +.newWikiWord a:hover { background-color: white; } + li { margin-bottom: 7px } .navigation { margin-top: 5px; font-size : 12px; color: #999; }