require "cgi" require "page" require "page_set" require "wiki_words" require "zip/zip" class Web attr_accessor :name, :address, :password, :markup, :color, :safe_mode, :pages attr_accessor :additional_style, :published, :brackets_only, :count_pages def initialize(parent_wiki, name, address, password = nil) @name, @address, @password, @safe_mode = name, address, password, false @pages = {} @wiki = parent_wiki # assign default values @color = '008B26' @markup = :textile end def add_page(page) @pages[page.name] = page end def remove_pages(pages_to_be_removed) pages.delete_if { |page_name, page| pages_to_be_removed.include?(page) } end def select(&condition) PageSet.new(self, @pages.values, condition) end def revised_on select.most_recent_revision end def authors select.authors end def categories select.map { |page| page.categories }.flatten.uniq.sort end # Create a link for the given page name and link text based # on the render mode in options and whether the page exists # in the this web. def make_link(name, text = nil, options = {}) text = CGI.escapeHTML(text || WikiWords.separate(name)) mode = options[:mode] link_type = options[:link_type] || 'show' case link_type when 'show' make_page_link(mode, name, text) when 'file' make_file_link(mode, name, text) when 'pic' make_pic_link(mode, name, text) else raise "Unknown link type: #{link_type}" end end def make_page_link(mode, name, text) link = CGI.escape(name) case mode when :export if has_page?(name) then "#{text}" else "#{text}" end when :publish if has_page?(name) then "#{text}" else "#{text}" end else if has_page?(name) "#{text}" else "#{text}?" end end end def make_file_link(mode, name, text) link = CGI.escape(name) case mode when :export if has_file?(name) then "#{text}" else "#{text}" end when :publish if has_file?(name) then "#{text}" else "#{text}" end else if has_file?(name) "#{text}" else "#{text}?" end end end def make_pic_link(mode, name, text) link = CGI.escape(name) case mode when :export if has_file?(name) then "\"#{text}\"" else "\"#{text}\"" end when :publish if has_file?(name) then "\"#{text}\"" else "#{text}" end else if has_file?(name) then "\"#{text}\"" else "#{text}?" end end end def has_page?(name) pages[name] end def has_file?(name) wiki.file_yard(self).has_file?(name) 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 private # Returns an array of all the wiki words in any current revision def wiki_words pages.values.inject([]) { |wiki_words, page| wiki_words << page.wiki_words }.flatten.uniq end # Returns an array of all the page names on this web def page_names pages.keys end # This ensures compatibility with 0.9 storages def wiki @wiki ||= WikiService.instance end end