From 427f989d694b7bb51118a59cf8f4132a70ae710d Mon Sep 17 00:00:00 2001 From: Alexey Verkhovsky Date: Fri, 9 Sep 2005 05:31:27 +0000 Subject: [PATCH] Extacted rendering logic from the model --- app/controllers/file_controller.rb | 2 - app/controllers/wiki_controller.rb | 23 +- app/helpers/application_helper.rb | 4 + app/models/page.rb | 11 - app/models/page_set.rb | 8 +- app/models/revision.rb | 101 +-- app/models/web.rb | 11 - app/models/wiki.rb | 1 - app/views/wiki/page.rhtml | 4 +- app/views/wiki/print.rhtml | 2 +- app/views/wiki/published.rhtml | 2 +- app/views/wiki/revision.rhtml | 4 +- app/views/wiki/rss_feed.rhtml | 4 +- config/environments/development.rb | 14 +- lib/page_renderer.rb | 106 +++ test/functional/file_controller_test.rb | 6 +- test/functional/wiki_controller_test.rb | 2 +- ...revision_test.rb => page_renderer_test.rb} | 707 ++++++++++-------- test/unit/web_test.rb | 63 +- 19 files changed, 550 insertions(+), 525 deletions(-) create mode 100644 lib/page_renderer.rb rename test/unit/{revision_test.rb => page_renderer_test.rb} (73%) diff --git a/app/controllers/file_controller.rb b/app/controllers/file_controller.rb index e67ee3a2..e8356fb5 100644 --- a/app/controllers/file_controller.rb +++ b/app/controllers/file_controller.rb @@ -17,7 +17,6 @@ class FileController < ApplicationController # form supplied file_yard.upload_file(@file_name, @params['file']) flash[:info] = "File '#{@file_name}' successfully uploaded" - @web.refresh_pages_with_references(@file_name) return_to_last_remembered elsif file_yard.has_file?(@file_name) send_file(file_yard.file_path(@file_name)) @@ -36,7 +35,6 @@ class FileController < ApplicationController if @params['file'] # form supplied file_yard.upload_file(@file_name, @params['file']) - @web.refresh_pages_with_references(@file_name) flash[:info] = "Image '#{@file_name}' successfully uploaded" return_to_last_remembered elsif file_yard.has_file?(@file_name) diff --git a/app/controllers/wiki_controller.rb b/app/controllers/wiki_controller.rb index d0b825bf..1bade80f 100644 --- a/app/controllers/wiki_controller.rb +++ b/app/controllers/wiki_controller.rb @@ -48,6 +48,7 @@ class WikiController < ApplicationController def export_html export_pages_as_zip('html') do |page| @page = page + @renderer = PageRenderer.new(page.revisions.last) @link_mode = :export render_to_string('wiki/print', use_layout = (@params['layout'] != 'no')) end @@ -152,12 +153,14 @@ class WikiController < ApplicationController def print @link_mode ||= :show + @renderer = PageRenderer.new(@page.revisions.last) # to template end def published if @web.published? - @page = wiki.read_page(@web_name, @page_name || 'HomePage') + page = wiki.read_page(@web_name, @page_name || 'HomePage') + @renderer = PageRenderer.new(page.revisions.last) else redirect_home end @@ -165,6 +168,7 @@ class WikiController < ApplicationController def revision get_page_and_revision + @renderer = PageRenderer.new(@revision) end def rollback @@ -200,6 +204,7 @@ class WikiController < ApplicationController def show if @page begin + @renderer = PageRenderer.new(@page.revisions.last) render_action 'page' # TODO this rescue should differentiate between errors due to rendering and errors in # the application itself (for application errors, it's better not to rescue the error at all) @@ -280,14 +285,20 @@ class WikiController < ApplicationController end def parse_category - @categories = @web.categories @category = @params['category'] - if @categories.include?(@category) - @pages_in_category = @web.select { |page| page.in_category?(@category) } - @set_name = "category '#{@category}'" - else + @categories = [] + @pages_in_category = @web.select do |page| + page_categories = PageRenderer.new(page.revisions.last).display_content.find_chunks(Category) + page_categories = page_categories.map { |cat| cat.list }.flatten + page_categories.each {|c| @categories << c unless @categories.include? c } + page_categories.include?(@category) + end + @categories.sort! + if (@pages_in_category.empty?) @pages_in_category = PageSet.new(@web).by_name @set_name = 'the web' + else + @set_name = "category '#{@category}'" end end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 6e100fb9..491fb410 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -78,4 +78,8 @@ module ApplicationHelper date.sec).strftime("%B %e, %Y %H:%M:%S") end + def rendered_content(page) + PageRenderer.new(page.revisions.last).display_content + end + end diff --git a/app/models/page.rb b/app/models/page.rb index dfd5b87c..c0794678 100644 --- a/app/models/page.rb +++ b/app/models/page.rb @@ -24,10 +24,7 @@ class Page < ActiveRecord::Base else Revision.create(:page => self, :content => content, :author => author, :revised_at => time) end - save - web.refresh_pages_with_references(name) if revisions_size == 0 - self end @@ -58,14 +55,6 @@ class Page < ActiveRecord::Base end end - def in_category?(cat) - cat.nil? || cat.empty? || categories.include?(cat) - end - - def categories - display_content.find_chunks(Category).map { |cat| cat.list }.flatten - end - def authors revisions.collect { |rev| rev.author } end diff --git a/app/models/page_set.rb b/app/models/page_set.rb index 38671eda..9fd43ca9 100644 --- a/app/models/page_set.rb +++ b/app/models/page_set.rb @@ -31,15 +31,15 @@ class PageSet < Array end def pages_that_reference(page_name) - self.select { |page| page.wiki_references.include?(page_name) } + self.select { |page| PageRenderer.new(page.revisions.last).wiki_references.include?(page_name) } end def pages_that_link_to(page_name) - self.select { |page| page.wiki_words.include?(page_name) } + self.select { |page| PageRenderer.new(page.revisions.last).wiki_words.include?(page_name) } end def pages_that_include(page_name) - self.select { |page| page.wiki_includes.include?(page_name) } + self.select { |page| PageRenderer.new(page.revisions.last).wiki_includes.include?(page_name) } end def pages_authored_by(author) @@ -78,7 +78,7 @@ class PageSet < Array end def wiki_words - self.inject([]) { |wiki_words, page| wiki_words << page.wiki_words }.flatten.uniq + self.inject([]) { |wiki_words, page| wiki_words << PageRenderer.new(page.revisions.last).wiki_words }.flatten.uniq end def authors diff --git a/app/models/revision.rb b/app/models/revision.rb index 56d818ce..a05e04ae 100644 --- a/app/models/revision.rb +++ b/app/models/revision.rb @@ -3,103 +3,10 @@ class Revision < ActiveRecord::Base belongs_to :page composed_of :author, :mapping => [ %w(author name), %w(ip ip) ] - # Returns an array of all the WikiIncludes present in the content of this revision. - def wiki_includes - unless @wiki_includes_cache - chunks = display_content.find_chunks(Include) - @wiki_includes_cache = chunks.map { |c| ( c.escaped? ? nil : c.page_name ) }.compact.uniq - end - @wiki_includes_cache - end - - # Returns an array of all the WikiReferences present in the content of this revision. - def wiki_references - unless @wiki_references_cache - chunks = display_content.find_chunks(WikiChunk::WikiReference) - @wiki_references_cache = chunks.map { |c| ( c.escaped? ? nil : c.page_name ) }.compact.uniq - end - @wiki_references_cache - end - - # 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 - end - - # Returns an array of all the WikiWords present in the content of this revision. - # that already exists as a page in the web. - def existing_pages - wiki_words.select { |wiki_word| page.web.page(wiki_word) } - end - - # Returns an array of all the WikiWords present in the content of this revision - # that *doesn't* already exists as a page in the web. - def unexisting_pages - wiki_words - existing_pages - end - - # Explicit check for new type of display cache with chunks_by_type method. - # Ensures new version works with older snapshots. - def display_content - unless @display_cache && @display_cache.respond_to?(:chunks_by_type) - @display_cache = WikiContent.new(self) - @display_cache.render! - end - @display_cache - end - - # TODO this probably doesn't belong in revision (because it has to call back the page) - def display_diff - previous_revision = page.previous_revision(self) - if previous_revision - HTMLDiff.diff(previous_revision.display_content, display_content) - else - display_content - end - end - - def clear_display_cache - @wiki_words_cache = @published_cache = @display_cache = @wiki_includes_cache = - @wiki_references_cache = nil - end - - def display_published - unless @published_cache && @published_cache.respond_to?(:chunks_by_type) - @published_cache = WikiContent.new(self, {:mode => :publish}) - @published_cache.render! - end - @published_cache - end - - def display_content_for_export - WikiContent.new(self, {:mode => :export} ).render! - end - - def force_rendering - begin - display_content.render! - rescue => e - logger.error "Failed rendering page #{@name}" - logger.error e - message = e.message - # substitute content with an error message - self.content = <<-EOL -

Markup engine has failed to render this page, raising the following error:

-

#{message}

-
#{self.content}
- EOL - clear_display_cache - raise e - end - end - - protected - after_create :force_rendering - after_save :clear_display_cache + + def force_rendering + PageRenderer.new(self).force_rendering + end end diff --git a/app/models/web.rb b/app/models/web.rb index e9b44c83..2af2709a 100644 --- a/app/models/web.rb +++ b/app/models/web.rb @@ -66,17 +66,6 @@ class Web < ActiveRecord::Base end end - # Clears the display cache for all the pages with references to - def refresh_pages_with_references(page_name) - #select.pages_that_reference(page_name).each { |page| - # page.revisions.each { |revision| revision.clear_display_cache } - #} - end - - def refresh_revisions - select.each { |page| page.revisions.each { |revision| revision.clear_display_cache } } - end - def remove_pages(pages_to_be_removed) pages_to_be_removed.each { |p| p.destroy } end diff --git a/app/models/wiki.rb b/app/models/wiki.rb index 5880e3c5..20906c4a 100644 --- a/app/models/wiki.rb +++ b/app/models/wiki.rb @@ -32,7 +32,6 @@ class Wiki raise Instiki::ValidationError.new("Web with address '#{old_address}' does not exist") end - web.refresh_revisions if web.settings_changed?(markup, safe_mode, brackets_only) web.update_attributes(:address => new_address, :name => name, :markup => markup, :color => color, :additional_style => additional_style, :safe_mode => safe_mode, :password => password, :published => published, :brackets_only => brackets_only, :count_pages => count_pages, :allow_uploads => allow_uploads, :max_upload_size => max_upload_size) diff --git a/app/views/wiki/page.rhtml b/app/views/wiki/page.rhtml index 904382ce..57c06927 100644 --- a/app/views/wiki/page.rhtml +++ b/app/views/wiki/page.rhtml @@ -4,7 +4,7 @@ %>
- <%= @page.display_content %> + <%= @renderer.display_content %>
@@ -17,7 +17,7 @@

- <%= @page.display_diff %> + <%= @renderer.display_diff %> <% end %> diff --git a/app/views/wiki/print.rhtml b/app/views/wiki/print.rhtml index 25bf0f30..3bc191a8 100644 --- a/app/views/wiki/print.rhtml +++ b/app/views/wiki/print.rhtml @@ -5,7 +5,7 @@ @inline_style = true %> -<%= @page.display_content_for_export %> +<%= @renderer.display_content_for_export %>
<%= @page.revisions? ? "Revised" : "Created" %> on <%= format_date(@page.revised_at) %> diff --git a/app/views/wiki/published.rhtml b/app/views/wiki/published.rhtml index edd1a171..b394583c 100644 --- a/app/views/wiki/published.rhtml +++ b/app/views/wiki/published.rhtml @@ -6,4 +6,4 @@ @show_footer = true %> -<%= @page.display_published %> +<%= @renderer.display_published %> diff --git a/app/views/wiki/revision.rhtml b/app/views/wiki/revision.rhtml index 89e2a685..f50b4935 100644 --- a/app/views/wiki/revision.rhtml +++ b/app/views/wiki/revision.rhtml @@ -1,7 +1,7 @@ <% @title = "#{@page.plain_name} (Rev ##{@revision_number})" %>
- <%= @revision.display_content %> + <%= @renderer.display_content %>
diff --git a/app/views/wiki/rss_feed.rhtml b/app/views/wiki/rss_feed.rhtml index f6e63352..47815c49 100644 --- a/app/views/wiki/rss_feed.rhtml +++ b/app/views/wiki/rss_feed.rhtml @@ -7,10 +7,10 @@ en-us 40 <% for page in @pages_by_revision %> - + <%= h page.plain_name %> <% unless @hide_description %> - <%= h page.display_content %> + <%= h rendered_content(page) %> <% end %> <%= page.revised_at.getgm.strftime "%a, %d %b %Y %H:%M:%S Z" %> <%= url_for :only_path => false, :web => @web_name, :action => @link_action, :id => page.name %> diff --git a/config/environments/development.rb b/config/environments/development.rb index 3f0868e6..d214c666 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -1,4 +1,14 @@ -Dependencies.mechanism = :require +# In the development environment your application's code is reloaded on +# every request. This slows down response time but is perfect for development +# since you don't have to restart the webserver when you make code changes. + +# Log error messages when you accidentally call methods on nil. +require 'active_support/whiny_nil' + +# Reload code; show full error reports; disable caching. +Dependencies.mechanism = :load ActionController::Base.consider_all_requests_local = true -ActionController::Base.perform_caching = false +ActionController::Base.perform_caching = false + +# The breakpoint server port that script/breakpointer connects to. BREAKPOINT_SERVER_PORT = 42531 diff --git a/lib/page_renderer.rb b/lib/page_renderer.rb new file mode 100644 index 00000000..c9887404 --- /dev/null +++ b/lib/page_renderer.rb @@ -0,0 +1,106 @@ +# Temporary class containing all rendering stuff from a Revision +# I want to shift all rendering loguc to the controller eventually + +class PageRenderer + + def initialize(revision) + @revision = revision + end + + # Returns an array of all the WikiIncludes present in the content of this revision. + def wiki_includes + unless @wiki_includes_cache + chunks = display_content.find_chunks(Include) + @wiki_includes_cache = chunks.map { |c| ( c.escaped? ? nil : c.page_name ) }.compact.uniq + end + @wiki_includes_cache + end + + # Returns an array of all the WikiReferences present in the content of this revision. + def wiki_references + unless @wiki_references_cache + chunks = display_content.find_chunks(WikiChunk::WikiReference) + @wiki_references_cache = chunks.map { |c| ( c.escaped? ? nil : c.page_name ) }.compact.uniq + end + @wiki_references_cache + end + + # 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 + end + + # Returns an array of all the WikiWords present in the content of this revision. + # that already exists as a page in the web. + def existing_pages + wiki_words.select { |wiki_word| @revision.page.web.page(wiki_word) } + end + + # Returns an array of all the WikiWords present in the content of this revision + # that *doesn't* already exists as a page in the web. + def unexisting_pages + wiki_words - existing_pages + end + + # Explicit check for new type of display cache with chunks_by_type method. + # Ensures new version works with older snapshots. + def display_content + unless @display_cache && @display_cache.respond_to?(:chunks_by_type) + @display_cache = WikiContent.new(@revision) + @display_cache.render! + end + @display_cache + end + + # TODO this probably doesn't belong in revision (because it has to call back the page) + def display_diff + previous_revision = @revision.page.previous_revision(@revision) + if previous_revision + HTMLDiff.diff(PageRenderer.new(previous_revision).display_content, display_content) + else + display_content + end + end + + def clear_display_cache + @wiki_words_cache = @published_cache = @display_cache = @wiki_includes_cache = + @wiki_references_cache = nil + end + + def display_published + unless @published_cache && @published_cache.respond_to?(:chunks_by_type) + @published_cache = WikiContent.new(@revision, {:mode => :publish}) + @published_cache.render! + end + @published_cache + end + + def display_content_for_export + WikiContent.new(@revision, {:mode => :export} ).render! + end + + def force_rendering + begin + display_content.render! + rescue => e + logger.error "Failed rendering page #{@name}" + logger.error e + message = e.message + # substitute content with an error message + @revision.content = <<-EOL +

Markup engine has failed to render this page, raising the following error:

+

#{message}

+
#{self.content}
+ EOL + clear_display_cache + raise e + end + end + + protected + +end \ No newline at end of file diff --git a/test/functional/file_controller_test.rb b/test/functional/file_controller_test.rb index a7023aff..01586b09 100755 --- a/test/functional/file_controller_test.rb +++ b/test/functional/file_controller_test.rb @@ -96,8 +96,8 @@ class FileControllerTest < Test::Unit::TestCase @wiki.revise_page('wiki1', 'HomePage', '[[instiki-e2e.txt:file]]', Time.now, 'AnonymousBrave') assert_equal "

instiki-e2e.txt" + "?

", - @home.display_content - + PageRenderer.new(@home.revisions.last).display_content + # rails-e2e.gif is unknown to the system, so pic action goes to the file [upload] form r = process 'file', 'web' => 'wiki1', 'id' => 'instiki-e2e.txt' assert_success @@ -114,7 +114,7 @@ class FileControllerTest < Test::Unit::TestCase @home = Page.find(@home.id) assert_equal "

" + "instiki-e2e.txt

", - @home.display_content + PageRenderer.new(@home.revisions.last).display_content end def test_uploads_blocking diff --git a/test/functional/wiki_controller_test.rb b/test/functional/wiki_controller_test.rb index 57329061..095a74c1 100755 --- a/test/functional/wiki_controller_test.rb +++ b/test/functional/wiki_controller_test.rb @@ -364,7 +364,7 @@ class WikiControllerTest < Test::Unit::TestCase def test_rss_with_content r = process 'rss_with_content', 'web' => 'wiki1' - + assert_success pages = r.template_objects['pages_by_revision'] assert_equal [@elephant, @oak, pages(:no_wiki_word), pages(:that_way), pages(:smart_engine), pages(:my_way), pages(:first_page), @home], pages, diff --git a/test/unit/revision_test.rb b/test/unit/page_renderer_test.rb similarity index 73% rename from test/unit/revision_test.rb rename to test/unit/page_renderer_test.rb index f22bfd5d..1c71449f 100644 --- a/test/unit/revision_test.rb +++ b/test/unit/page_renderer_test.rb @@ -1,317 +1,390 @@ -require File.expand_path(File.dirname(__FILE__) + '/../test_helper') - -class RevisionTest < Test::Unit::TestCase - fixtures :webs, :pages, :revisions, :system - - def setup - @wiki = Wiki.new - @web = webs(:test_wiki) - @page = pages(:home_page) - @revision = revisions(:home_page_second_revision) - end - - def test_wiki_words - assert_equal %w( HisWay MyWay SmartEngine SmartEngineGUI ThatWay ), @revision.wiki_words.sort - - @wiki.write_page('wiki1', 'NoWikiWord', 'hey you!', Time.now, 'Me') - assert_equal [], @wiki.read_page('wiki1', 'NoWikiWord').wiki_words - end - - def test_existing_pages - assert_equal %w( MyWay SmartEngine ThatWay ), @revision.existing_pages.sort - end - - def test_unexisting_pages - assert_equal %w( HisWay SmartEngineGUI ), @revision.unexisting_pages.sort - end - - def test_content_with_wiki_links - assert_equal '

His Way? ' + - 'would be My Way in kinda ' + - 'That Way in ' + - 'His Way? ' + - 'though My Way OverThere—see ' + - 'Smart Engine in that ' + - 'Smart Engine GUI' + - '?

', - @revision.display_content - end - - def test_markdown - set_web_property :markup, :markdown - - assert_markup_parsed_as( - %{

My Headline

\n\n

that } + - %{Smart Engine GUI?

}, - "My Headline\n===========\n\nthat SmartEngineGUI") - - code_block = [ - 'This is a code block:', - '', - ' def a_method(arg)', - ' return ThatWay', - '', - 'Nice!' - ].join("\n") - - assert_markup_parsed_as( - %{

This is a code block:

\n\n
def a_method(arg)\n} +
-        %{return ThatWay\n
\n\n

Nice!

}, - code_block) - end - - def test_markdown_hyperlink_with_slash - # in response to a bug, see http://dev.instiki.org/attachment/ticket/177 - set_web_property :markup, :markdown - - assert_markup_parsed_as( - '

text

', - '[text](http://example/with/slash)') - end - - def test_mixed_formatting - textile_and_markdown = [ - 'Markdown heading', - '================', - '', - 'h2. Textile heading', - '', - '*some* **text** _with_ -styles-', - '', - '* list 1', - '* list 2' - ].join("\n") - - set_web_property :markup, :markdown - assert_markup_parsed_as( - "

Markdown heading

\n\n" + - "

h2. Textile heading

\n\n" + - "

some text with -styles-

\n\n" + - "
    \n
  • list 1
  • \n
  • list 2
  • \n
", - textile_and_markdown) - - set_web_property :markup, :textile - assert_markup_parsed_as( - "

Markdown heading
================

\n\n\n\t

Textile heading

" + - "\n\n\n\t

some text with styles

" + - "\n\n\n\t
    \n\t
  • list 1
  • \n\t\t
  • list 2
  • \n\t
", - textile_and_markdown) - - set_web_property :markup, :mixed - assert_markup_parsed_as( - "

Markdown heading

\n\n\n\t

Textile heading

\n\n\n\t" + - "

some text with styles

\n\n\n\t" + - "
    \n\t
  • list 1
  • \n\t\t
  • list 2
  • \n\t
", - textile_and_markdown) - end - - def test_rdoc - set_web_property :markup, :rdoc - - @revision = Revision.new(:page => @page, :content => '+hello+ that SmartEngineGUI', - :author => Author.new('DavidHeinemeierHansson')) - - assert_equal "hello that Smart Engine GUI" + - "?\n\n", @revision.display_content - end - - def test_content_with_auto_links - assert_markup_parsed_as( - '

http://www.loudthinking.com/ ' + - 'points to That Way from ' + - 'david@loudthinking.com

', - 'http://www.loudthinking.com/ points to ThatWay from david@loudthinking.com') - - end - - def test_content_with_aliased_links - assert_markup_parsed_as( - '

Would a clever motor' + - ' go by any other name?

', - 'Would a [[SmartEngine|clever motor]] go by any other name?') - end - - def test_content_with_wikiword_in_em - assert_markup_parsed_as( - '

should we go ' + - 'That Way or This Way?' + - '

', - '_should we go ThatWay or ThisWay _') - end - - def test_content_with_wikiword_in_tag - assert_markup_parsed_as( - '

That is some Stylish Emphasis

', - 'That is some Stylish Emphasis') - end - - def test_content_with_escaped_wikiword - # there should be no wiki link - assert_markup_parsed_as('

WikiWord

', '\WikiWord') - end - - def test_content_with_pre_blocks - assert_markup_parsed_as( - '

A class SmartEngine end would not mark up

CodeBlocks

', - 'A class SmartEngine end would not mark up
CodeBlocks
') - end - - def test_content_with_autolink_in_parentheses - assert_markup_parsed_as( - '

The W3C body (' + - 'http://www.w3c.org) sets web standards

', - 'The W3C body (http://www.w3c.org) sets web standards') - end - - def test_content_with_link_in_parentheses - assert_markup_parsed_as( - '

(What is a wiki?)

', - '("What is a wiki?":http://wiki.org/wiki.cgi?WhatIsWiki)') - end - - def test_content_with_image_link - assert_markup_parsed_as( - '

This is a Textile image link.

', - 'This !http://hobix.com/sample.jpg! is a Textile image link.') - end - - def test_content_with_inlined_img_tag - assert_markup_parsed_as( - '

This is an inline image link.

', - 'This is an inline image link.') - - assert_markup_parsed_as( - '

This is an inline image link.

', - 'This is an inline image link.') - end - - def test_nowiki_tag - assert_markup_parsed_as( - '

Do not mark up [[this text]] or http://www.thislink.com.

', - 'Do not mark up [[this text]] ' + - 'or http://www.thislink.com.') - end - - def test_multiline_nowiki_tag - assert_markup_parsed_as( - "

Do not mark \n up [[this text]] \nand http://this.url.com but markup " + - 'this?

', - "Do not mark \n up [[this text]] \n" + - "and http://this.url.com but markup [[this]]") - end - - def test_content_with_bracketted_wiki_word - set_web_property :brackets_only, true - assert_markup_parsed_as( - '

This is a WikiWord and a tricky name ' + - 'Sperberg-McQueen?.

', - 'This is a WikiWord and a tricky name [[Sperberg-McQueen]].') - end - - def test_content_for_export - assert_equal '

His Way would be ' + - 'My Way in kinda ' + - 'That Way in ' + - 'His Way though ' + - 'My Way OverThere—see ' + - 'Smart Engine in that ' + - 'Smart Engine GUI

', - @revision.display_content_for_export - end - - def test_double_replacing - @revision.content = "VersionHistory\r\n\r\ncry VersionHistory" - assert_equal '

Version History' + - "?

\n\n\n\t

cry " + - 'Version History?' + - '

', - @revision.display_content - - @revision.clear_display_cache - - @revision.content = "f\r\nVersionHistory\r\n\r\ncry VersionHistory" - assert_equal "

f
Version History" + - "?

\n\n\n\t

cry " + - "Version History?" + - "

", - @revision.display_content - end - - def test_difficult_wiki_words - @revision.content = "[[It's just awesome GUI!]]" - assert_equal "

It's just awesome GUI!" + - "?

", - @revision.display_content - end - - def test_revisions_diff - Revision.create(:page => @page, :content => 'What a blue and lovely morning', - :author => Author.new('DavidHeinemeierHansson'), :revised_at => Time.now) - Revision.create(:page => @page, :content => 'What a red and lovely morning today', - :author => Author.new('DavidHeinemeierHansson'), :revised_at => Time.now) - - assert_equal "

What a blue red " + - "and lovely morningmorning " + - "today

", @page.revisions.last.display_diff - end - - def test_link_to_file - assert_markup_parsed_as( - '

doc.pdf?

', - '[[doc.pdf:file]]') - end - - def test_link_to_pic - FileUtils.mkdir_p "#{RAILS_ROOT}/storage/test/wiki1" - FileUtils.rm(Dir["#{RAILS_ROOT}/storage/test/wiki1/*"]) - @wiki.file_yard(@web).upload_file('square.jpg', StringIO.new('')) - assert_markup_parsed_as( - '

Square

', - '[[square.jpg|Square:pic]]') - assert_markup_parsed_as( - '

square.jpg

', - '[[square.jpg:pic]]') - end - - def test_link_to_non_existant_pic - assert_markup_parsed_as( - '

NonExistant?' + - '

', - '[[NonExistant.jpg|NonExistant:pic]]') - assert_markup_parsed_as( - '

NonExistant.jpg?' + - '

', - '[[NonExistant.jpg:pic]]') - end - - def test_wiki_link_with_colon - assert_markup_parsed_as( - '

With:Colon?

', - '[[With:Colon]]') - end - - # TODO Remove the leading underscores from this test when upgrading to RedCloth 3.0.1; - # also add a test for the "Unhappy Face" problem (another interesting RedCloth bug) - def test_list_with_tildas - list_with_tildas = <<-EOL - * "a":~b - * c~ d - EOL - - assert_markup_parsed_as( - "
    \n\t
  • a
  • \n\t\t
  • c~ d
  • \n\t
", - list_with_tildas) - end - - def test_textile_image_in_mixed_wiki - set_web_property :markup, :mixed - assert_markup_parsed_as( - "

\"\"\nss

", - "!http://google.com!\r\nss") - end - - def assert_markup_parsed_as(expected_output, input) - revision = Revision.new(:page => @page, :content => input, :author => Author.new('AnAuthor')) - assert_equal expected_output, revision.display_content, 'Textile output not as expected' - end -end +require File.expand_path(File.dirname(__FILE__) + '/../test_helper') + +class PageRendererTest < Test::Unit::TestCase + fixtures :webs, :pages, :revisions, :system + + def setup + @wiki = Wiki.new + @web = webs(:test_wiki) + @page = pages(:home_page) + @revision = revisions(:home_page_second_revision) + end + + def test_wiki_word_linking + @web.add_page('SecondPage', 'Yo, yo. Have you EverBeenHated', + Time.now, 'DavidHeinemeierHansson') + + assert_equal('

Yo, yo. Have you Ever Been Hated' + + '?

', + rendered_content(@web.page("SecondPage"))) + + @web.add_page('EverBeenHated', 'Yo, yo. Have you EverBeenHated', Time.now, + 'DavidHeinemeierHansson') + assert_equal('

Yo, yo. Have you Ever Been Hated

', + rendered_content(@web.page("SecondPage"))) + end + + def test_make_link + add_sample_pages + + existing_page_wiki_url = + 'Ever Been In Love' + existing_page_published_url = + 'Ever Been In Love' + existing_page_static_url = + 'Ever Been In Love' + new_page_wiki_url = + 'Unknown Word?' + new_page_published_url = new_page_static_url = 'Unknown Word' + + # no options + assert_equal existing_page_wiki_url, @web.make_link('EverBeenInLove') + + # :mode => :export + assert_equal existing_page_static_url, @web.make_link('EverBeenInLove', nil, :mode => :export) + + # :mode => :publish + assert_equal existing_page_published_url, + @web.make_link('EverBeenInLove', nil, :mode => :publish) + + # new page, no options + assert_equal new_page_wiki_url, @web.make_link('UnknownWord') + + # new page, :mode => :export + assert_equal new_page_static_url, @web.make_link('UnknownWord', nil, :mode => :export) + + # new page, :mode => :publish + assert_equal new_page_published_url, @web.make_link('UnknownWord', nil, :mode => :publish) + + # Escaping special characters in the name + assert_equal( + 'Smith & Wesson?', + @web.make_link('Smith & Wesson')) + + # optionally using text as the link text + assert_equal( + existing_page_published_url.sub(/>Ever Been In LoveHaven't you ever been in love?<"), + @web.make_link('EverBeenInLove', "Haven't you ever been in love?", :mode => :publish)) + + end + + def test_wiki_words + assert_equal %w( HisWay MyWay SmartEngine SmartEngineGUI ThatWay ), + PageRenderer.new(@revision).wiki_words.sort + + @wiki.write_page('wiki1', 'NoWikiWord', 'hey you!', Time.now, 'Me') + assert_equal [], PageRenderer.new(@wiki.read_page('wiki1', 'NoWikiWord').revisions.last).wiki_words + end + + def test_existing_pages + assert_equal %w( MyWay SmartEngine ThatWay ), PageRenderer.new(@revision).existing_pages.sort + end + + def test_unexisting_pages + assert_equal %w( HisWay SmartEngineGUI ), PageRenderer.new(@revision).unexisting_pages.sort + end + + def test_content_with_wiki_links + assert_equal '

His Way? ' + + 'would be My Way in kinda ' + + 'That Way in ' + + 'His Way? ' + + 'though My Way OverThere—see ' + + 'Smart Engine in that ' + + 'Smart Engine GUI' + + '?

', + PageRenderer.new(@revision).display_content + end + + def test_markdown + set_web_property :markup, :markdown + + assert_markup_parsed_as( + %{

My Headline

\n\n

that } + + %{Smart Engine GUI?

}, + "My Headline\n===========\n\nthat SmartEngineGUI") + + code_block = [ + 'This is a code block:', + '', + ' def a_method(arg)', + ' return ThatWay', + '', + 'Nice!' + ].join("\n") + + assert_markup_parsed_as( + %{

This is a code block:

\n\n
def a_method(arg)\n} +
+        %{return ThatWay\n
\n\n

Nice!

}, + code_block) + end + + def test_markdown_hyperlink_with_slash + # in response to a bug, see http://dev.instiki.org/attachment/ticket/177 + set_web_property :markup, :markdown + + assert_markup_parsed_as( + '

text

', + '[text](http://example/with/slash)') + end + + def test_mixed_formatting + textile_and_markdown = [ + 'Markdown heading', + '================', + '', + 'h2. Textile heading', + '', + '*some* **text** _with_ -styles-', + '', + '* list 1', + '* list 2' + ].join("\n") + + set_web_property :markup, :markdown + assert_markup_parsed_as( + "

Markdown heading

\n\n" + + "

h2. Textile heading

\n\n" + + "

some text with -styles-

\n\n" + + "
    \n
  • list 1
  • \n
  • list 2
  • \n
", + textile_and_markdown) + + set_web_property :markup, :textile + assert_markup_parsed_as( + "

Markdown heading
================

\n\n\n\t

Textile heading

" + + "\n\n\n\t

some text with styles

" + + "\n\n\n\t
    \n\t
  • list 1
  • \n\t\t
  • list 2
  • \n\t
", + textile_and_markdown) + + set_web_property :markup, :mixed + assert_markup_parsed_as( + "

Markdown heading

\n\n\n\t

Textile heading

\n\n\n\t" + + "

some text with styles

\n\n\n\t" + + "
    \n\t
  • list 1
  • \n\t\t
  • list 2
  • \n\t
", + textile_and_markdown) + end + + def test_rdoc + set_web_property :markup, :rdoc + + @revision = Revision.new(:page => @page, :content => '+hello+ that SmartEngineGUI', + :author => Author.new('DavidHeinemeierHansson')) + + assert_equal "hello that Smart Engine GUI" + + "?\n\n", + PageRenderer.new(@revision).display_content + end + + def test_content_with_auto_links + assert_markup_parsed_as( + '

http://www.loudthinking.com/ ' + + 'points to That Way from ' + + 'david@loudthinking.com

', + 'http://www.loudthinking.com/ points to ThatWay from david@loudthinking.com') + + end + + def test_content_with_aliased_links + assert_markup_parsed_as( + '

Would a clever motor' + + ' go by any other name?

', + 'Would a [[SmartEngine|clever motor]] go by any other name?') + end + + def test_content_with_wikiword_in_em + assert_markup_parsed_as( + '

should we go ' + + 'That Way or This Way?' + + '

', + '_should we go ThatWay or ThisWay _') + end + + def test_content_with_wikiword_in_tag + assert_markup_parsed_as( + '

That is some Stylish Emphasis

', + 'That is some Stylish Emphasis') + end + + def test_content_with_escaped_wikiword + # there should be no wiki link + assert_markup_parsed_as('

WikiWord

', '\WikiWord') + end + + def test_content_with_pre_blocks + assert_markup_parsed_as( + '

A class SmartEngine end would not mark up

CodeBlocks

', + 'A class SmartEngine end would not mark up
CodeBlocks
') + end + + def test_content_with_autolink_in_parentheses + assert_markup_parsed_as( + '

The W3C body (' + + 'http://www.w3c.org) sets web standards

', + 'The W3C body (http://www.w3c.org) sets web standards') + end + + def test_content_with_link_in_parentheses + assert_markup_parsed_as( + '

(What is a wiki?)

', + '("What is a wiki?":http://wiki.org/wiki.cgi?WhatIsWiki)') + end + + def test_content_with_image_link + assert_markup_parsed_as( + '

This is a Textile image link.

', + 'This !http://hobix.com/sample.jpg! is a Textile image link.') + end + + def test_content_with_inlined_img_tag + assert_markup_parsed_as( + '

This is an inline image link.

', + 'This is an inline image link.') + + assert_markup_parsed_as( + '

This is an inline image link.

', + 'This is an inline image link.') + end + + def test_nowiki_tag + assert_markup_parsed_as( + '

Do not mark up [[this text]] or http://www.thislink.com.

', + 'Do not mark up [[this text]] ' + + 'or http://www.thislink.com.') + end + + def test_multiline_nowiki_tag + assert_markup_parsed_as( + "

Do not mark \n up [[this text]] \nand http://this.url.com but markup " + + 'this?

', + "Do not mark \n up [[this text]] \n" + + "and http://this.url.com but markup [[this]]") + end + + def test_content_with_bracketted_wiki_word + set_web_property :brackets_only, true + assert_markup_parsed_as( + '

This is a WikiWord and a tricky name ' + + 'Sperberg-McQueen?.

', + 'This is a WikiWord and a tricky name [[Sperberg-McQueen]].') + end + + def test_content_for_export + assert_equal '

His Way would be ' + + 'My Way in kinda ' + + 'That Way in ' + + 'His Way though ' + + 'My Way OverThere—see ' + + 'Smart Engine in that ' + + 'Smart Engine GUI

', + PageRenderer.new(@revision).display_content_for_export + end + + def test_double_replacing + @revision.content = "VersionHistory\r\n\r\ncry VersionHistory" + assert_equal '

Version History' + + "?

\n\n\n\t

cry " + + 'Version History?' + + '

', + PageRenderer.new(@revision).display_content + + @revision.content = "f\r\nVersionHistory\r\n\r\ncry VersionHistory" + assert_equal "

f
Version History" + + "?

\n\n\n\t

cry " + + "Version History?" + + "

", + PageRenderer.new(@revision).display_content + end + + def test_difficult_wiki_words + @revision.content = "[[It's just awesome GUI!]]" + assert_equal "

It's just awesome GUI!" + + "?

", + PageRenderer.new(@revision).display_content + end + + def test_revisions_diff + Revision.create(:page => @page, :content => 'What a blue and lovely morning', + :author => Author.new('DavidHeinemeierHansson'), :revised_at => Time.now) + Revision.create(:page => @page, :content => 'What a red and lovely morning today', + :author => Author.new('DavidHeinemeierHansson'), :revised_at => Time.now) + + assert_equal "

What a blue red " + + "and lovely morningmorning " + + "today

", PageRenderer.new(@page.revisions.last).display_diff + end + + def test_link_to_file + assert_markup_parsed_as( + '

doc.pdf?

', + '[[doc.pdf:file]]') + end + + def test_link_to_pic + FileUtils.mkdir_p "#{RAILS_ROOT}/storage/test/wiki1" + FileUtils.rm(Dir["#{RAILS_ROOT}/storage/test/wiki1/*"]) + @wiki.file_yard(@web).upload_file('square.jpg', StringIO.new('')) + assert_markup_parsed_as( + '

Square

', + '[[square.jpg|Square:pic]]') + assert_markup_parsed_as( + '

square.jpg

', + '[[square.jpg:pic]]') + end + + def test_link_to_non_existant_pic + assert_markup_parsed_as( + '

NonExistant?' + + '

', + '[[NonExistant.jpg|NonExistant:pic]]') + assert_markup_parsed_as( + '

NonExistant.jpg?' + + '

', + '[[NonExistant.jpg:pic]]') + end + + def test_wiki_link_with_colon + assert_markup_parsed_as( + '

With:Colon?

', + '[[With:Colon]]') + end + + # TODO Remove the leading underscores from this test when upgrading to RedCloth 3.0.1; + # also add a test for the "Unhappy Face" problem (another interesting RedCloth bug) + def test_list_with_tildas + list_with_tildas = <<-EOL + * "a":~b + * c~ d + EOL + + assert_markup_parsed_as( + "
    \n\t
  • a
  • \n\t\t
  • c~ d
  • \n\t
", + list_with_tildas) + end + + def test_textile_image_in_mixed_wiki + set_web_property :markup, :mixed + assert_markup_parsed_as( + "

\"\"\nss

", + "!http://google.com!\r\nss") + end + + private + + def add_sample_pages + @in_love = @web.add_page('EverBeenInLove', 'Who am I me', + Time.local(2004, 4, 4, 16, 50), 'DavidHeinemeierHansson') + @hated = @web.add_page('EverBeenHated', 'I am me EverBeenHated', + Time.local(2004, 4, 4, 16, 51), 'DavidHeinemeierHansson') + end + + def assert_markup_parsed_as(expected_output, input) + revision = Revision.new(:page => @page, :content => input, :author => Author.new('AnAuthor')) + assert_equal expected_output, PageRenderer.new(revision).display_content, 'Rendering output not as expected' + end + + def rendered_content(page) + PageRenderer.new(page.revisions.last).display_content + end + +end \ No newline at end of file diff --git a/test/unit/web_test.rb b/test/unit/web_test.rb index 7e91bbed..bfa6edd7 100644 --- a/test/unit/web_test.rb +++ b/test/unit/web_test.rb @@ -7,21 +7,6 @@ class WebTest < Test::Unit::TestCase @web = webs(:instiki) end - def test_wiki_word_linking - @web.add_page('SecondPage', 'Yo, yo. Have you EverBeenHated', - Time.now, 'DavidHeinemeierHansson') - - assert_equal('

Yo, yo. Have you Ever Been Hated' + - '?

', - @web.page("SecondPage").display_content) - - @web.add_page('EverBeenHated', 'Yo, yo. Have you EverBeenHated', Time.now, - 'DavidHeinemeierHansson') - assert_equal('

Yo, yo. Have you Ever Been Hated

', - @web.page("SecondPage").display_content) - end - def test_pages_by_revision add_sample_pages assert_equal 'EverBeenHated', @web.select.by_revision.first.name @@ -47,52 +32,6 @@ class WebTest < Test::Unit::TestCase assert_equal 1, @web.pages(true).length end - def test_make_link - add_sample_pages - - existing_page_wiki_url = - 'Ever Been In Love' - existing_page_published_url = - 'Ever Been In Love' - existing_page_static_url = - 'Ever Been In Love' - new_page_wiki_url = - 'Unknown Word?' - new_page_published_url = - new_page_static_url = - 'Unknown Word' - - # no options - assert_equal existing_page_wiki_url, @web.make_link('EverBeenInLove') - - # :mode => :export - assert_equal existing_page_static_url, @web.make_link('EverBeenInLove', nil, :mode => :export) - - # :mode => :publish - assert_equal existing_page_published_url, - @web.make_link('EverBeenInLove', nil, :mode => :publish) - - # new page, no options - assert_equal new_page_wiki_url, @web.make_link('UnknownWord') - - # new page, :mode => :export - assert_equal new_page_static_url, @web.make_link('UnknownWord', nil, :mode => :export) - - # new page, :mode => :publish - assert_equal new_page_published_url, @web.make_link('UnknownWord', nil, :mode => :publish) - - # Escaping special characters in the name - assert_equal( - 'Smith & Wesson?', - @web.make_link('Smith & Wesson')) - - # optionally using text as the link text - assert_equal( - existing_page_published_url.sub(/>Ever Been In LoveHaven't you ever been in love?<"), - @web.make_link('EverBeenInLove', "Haven't you ever been in love?", :mode => :publish)) - - end - def test_initialize web = Web.new(:name => 'Wiki2', :address => 'wiki2', :password => '123') @@ -129,7 +68,7 @@ class WebTest < Test::Unit::TestCase @web.pages(true) assert_equal [home], @web.select.pages_that_link_to('AnotherPage') end - + def test_orphaned_pages add_sample_pages home = @web.add_page('HomePage',