require 'stringsupport' class AbstractUrlGenerator def initialize(controller) raise 'Controller cannot be nil' if controller.nil? @controller = controller end # Create a link for the given page (or file) name and link text based # on the render mode in options and whether the page (file) exists # in the web. def make_link(name, web, text = nil, options = {}) mode = (options[:mode] || :show).to_sym link_type = (options[:link_type] || :show).to_sym if (link_type == :show) known_page = web.has_page?(name) else known_page = web.has_file?(name) description = web.description(name) description = description.unescapeHTML.escapeHTML if description end if (text == name) text = description || text else text = text || description end text = (text || WikiWords.separate(name)).unescapeHTML.escapeHTML case link_type when :show page_link(mode, name, text, web.address, known_page) when :file file_link(mode, name, text, web.address, known_page, description) when :pic pic_link(mode, name, text, web.address, known_page) when :video video_link(mode, name, text, web.address, known_page) when :delete delete_link(mode, name, web.address, known_page) else raise "Unknown link type: #{link_type}" end end end class UrlGenerator < AbstractUrlGenerator private def file_link(mode, name, text, web_address, known_file, description) case mode when :export if known_file %{#{text}} else %{#{text}} end when :publish if known_file href = @controller.url_for :controller => 'file', :web => web_address, :action => 'file', :id => name %{#{text}} else %{#{text}} end else href = @controller.url_for :controller => 'file', :web => web_address, :action => 'file', :id => name if known_file %{#{text}} else %{#{text}?} end end end def page_link(mode, name, text, web_address, known_page) case mode when :export if known_page %{#{text}} else %{#{text}} end when :publish if known_page href = @controller.url_for :controller => 'wiki', :web => web_address, :action => 'published', :id => name %{#{text}} else %{#{text}} end when :show if known_page href = @controller.url_for :controller => 'wiki', :web => web_address, :action => 'show', :id => name %{#{text}} else href = @controller.url_for :controller => 'wiki', :web => web_address, :action => 'new', :id => name %{#{text}?} end else if known_page web = Web.find_by_address(web_address) action = web.published? ? 'published' : 'show' href = @controller.url_for :controller => 'wiki', :web => web_address, :action => action, :id => name %{#{text}} else href = @controller.url_for :controller => 'wiki', :web => web_address, :action => 'new', :id => name %{#{text}?} end end end def pic_link(mode, name, text, web_address, known_pic) href = @controller.url_for :controller => 'file', :web => web_address, :action => 'file', :id => name case mode when :export if known_pic %{#{text}} else %{#{text}} end when :publish if known_pic %{#{text}} else %{#{text}} end else if known_pic %{#{text}} else %{#{text}?} end end end def video_link(mode, name, text, web_address, known_vid) href = @controller.url_for :controller => 'file', :web => web_address, :action => 'file', :id => name case mode when :export if known_vid %{} else text end when :publish if known_vid %{} else %{#{text}} end else if known_vid %{} else %{#{text}?} end end end def delete_link(mode, name, web_address, known_file) href = @controller.url_for :controller => 'file', :web => web_address, :action => 'delete', :id => name if mode == :show and known_file %{Delete #{name}} else %{[[#{name}:delete]]} end end end