app/models/web.rb in instiki-0.10.0 vs app/models/web.rb in instiki-0.10.1
- old
+ new
@@ -1,176 +1,182 @@
-require 'cgi'
-require 'page'
-require 'page_set'
-require 'wiki_words'
-require 'zip/zip'
-
-class Web
- attr_accessor :name, :password, :markup, :color, :safe_mode, :pages
- attr_accessor :additional_style, :published, :brackets_only, :count_pages, :allow_uploads
- attr_accessor :max_upload_size
-
- attr_reader :address
-
- def initialize(parent_wiki, name, address, password = nil)
- self.address = address
- @wiki, @name, @password = parent_wiki, name, password
-
- # default values
- @markup = :textile
- @color = '008B26'
- @safe_mode = false
- @pages = {}
- @allow_uploads = true
- @additional_style = nil
- @published = false
- @brackets_only = false
- @count_pages = false
- @allow_uploads = true
- @max_upload_size = 100
- end
-
- def add_page(page)
- @pages[page.name] = page
- end
-
- def address=(the_address)
- if the_address != CGI.escape(the_address)
- raise Instiki::ValidationError.new('Web name should contain only valid URI characters')
- end
- @address = the_address
- end
-
- def authors
- select.authors
- end
-
- def categories
- select.map { |page| page.categories }.flatten.uniq.sort
- end
-
- def has_page?(name)
- pages[name]
- end
-
- def has_file?(name)
- wiki.file_yard(self).has_file?(name)
- end
-
- def make_file_link(mode, name, text, base_url)
- link = CGI.escape(name)
- case mode
- when :export
- if has_file?(name) then "<a class=\"existingWikiWord\" href=\"#{link}.html\">#{text}</a>"
- else "<span class=\"newWikiWord\">#{text}</span>" end
- when :publish
- if has_file?(name) then "<a class=\"existingWikiWord\" href=\"#{base_url}/published/#{link}\">#{text}</a>"
- else "<span class=\"newWikiWord\">#{text}</span>" end
- else
- if has_file?(name)
- "<a class=\"existingWikiWord\" href=\"#{base_url}/file/#{link}\">#{text}</a>"
- else
- "<span class=\"newWikiWord\">#{text}<a href=\"#{base_url}/file/#{link}\">?</a></span>"
- end
- end
- 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.
- # The links a relative, and will work only if displayed on another WikiPage.
- # It should not be used in menus, templates and such - instead, use link_to_page helper
- def make_link(name, text = nil, options = {})
- text = CGI.escapeHTML(text || WikiWords.separate(name))
- mode = options[:mode] || :show
- base_url = options[:base_url] || '..'
- link_type = options[:link_type] || :show
- case link_type.to_sym
- when :show
- make_page_link(mode, name, text, base_url)
- when :file
- make_file_link(mode, name, text, base_url)
- when :pic
- make_pic_link(mode, name, text, base_url)
- else
- raise "Unknown link type: #{link_type}"
- end
- end
-
- def make_page_link(mode, name, text, base_url)
- link = CGI.escape(name)
- case mode.to_sym
- when :export
- if has_page?(name) then %{<a class="existingWikiWord" href="#{link}.html">#{text}</a>}
- else %{<span class="newWikiWord">#{text}</span>} end
- when :publish
- if has_page?(name) then %{<a class="existingWikiWord" href="#{base_url}/published/#{link}">#{text}</a>}
- else %{<span class="newWikiWord">#{text}</span>} end
- else
- if has_page?(name)
- %{<a class="existingWikiWord" href="#{base_url}/show/#{link}">#{text}</a>}
- else
- %{<span class="newWikiWord">#{text}<a href="#{base_url}/show/#{link}">?</a></span>}
- end
- end
- end
-
- def make_pic_link(mode, name, text, base_url)
- link = CGI.escape(name)
- case mode.to_sym
- when :export
- if has_file?(name) then %{<img alt="#{text}" src="#{link}" />}
- else %{<img alt="#{text}" src="no image" />} end
- when :publish
- if has_file?(name) then %{<img alt="#{text}" src="#{link}" />}
- else %{<span class="newWikiWord">#{text}</span>} end
- else
- if has_file?(name) then %{<img alt="#{text}" src="#{base_url}/pic/#{link}" />}
- else %{<span class="newWikiWord">#{text}<a href="#{base_url}/pic/#{link}">?</a></span>} end
- end
- end
-
- def max_upload_size
- @max_upload_size || 100
- 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.delete_if { |page_name, page| pages_to_be_removed.include?(page) }
- end
-
- def revised_on
- select.most_recent_revision
- end
-
- def select(&condition)
- PageSet.new(self, @pages.values, condition)
- end
-
- # This ensures compatibility with 0.9 storages
- def wiki
- @wiki ||= WikiService.instance
- 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
-
-end
+require 'cgi'
+require 'page'
+require 'page_set'
+require 'wiki_words'
+require 'zip/zip'
+
+class Web
+ attr_accessor :name, :password, :safe_mode, :pages
+ attr_accessor :additional_style, :allow_uploads, :published
+ attr_reader :address
+
+ # there are getters for all these attributes, too
+ attr_writer :markup, :color, :brackets_only, :count_pages, :max_upload_size
+
+ def initialize(parent_wiki, name, address, password = nil)
+ self.address = address
+ @wiki, @name, @password = parent_wiki, name, password
+
+ set_compatible_defaults
+
+ @pages = {}
+ @allow_uploads = true
+ @additional_style = nil
+ @published = false
+ @count_pages = false
+ @allow_uploads = true
+ end
+
+ # Explicitly sets value of some web attributes to defaults, unless they are already set
+ def set_compatible_defaults
+ @markup = markup()
+ @color = color()
+ @safe_mode = safe_mode()
+ @brackets_only = brackets_only()
+ @max_upload_size = max_upload_size()
+ @wiki = wiki
+ end
+ # All below getters know their default values. This is necessary to ensure compatibility with
+ # 0.9 storages, where they were not defined.
+ def brackets_only() @brackets_only || false end
+ def color() @color ||= '008B26' end
+ def count_pages() @count_pages || false end
+ def markup() @markup ||= :textile end
+ def max_upload_size() @max_upload_size || 100; end
+ def wiki() @wiki ||= WikiService.instance; end
+
+ def add_page(page)
+ @pages[page.name] = page
+ end
+
+ def address=(the_address)
+ if the_address != CGI.escape(the_address)
+ raise Instiki::ValidationError.new('Web name should contain only valid URI characters')
+ end
+ @address = the_address
+ end
+
+ def authors
+ select.authors
+ end
+
+ def categories
+ select.map { |page| page.categories }.flatten.uniq.sort
+ end
+
+ def has_page?(name)
+ pages[name]
+ end
+
+ def has_file?(name)
+ wiki.file_yard(self).has_file?(name)
+ end
+
+ def make_file_link(mode, name, text, base_url)
+ link = CGI.escape(name)
+ case mode
+ when :export
+ if has_file?(name) then "<a class=\"existingWikiWord\" href=\"#{link}.html\">#{text}</a>"
+ else "<span class=\"newWikiWord\">#{text}</span>" end
+ when :publish
+ if has_file?(name) then "<a class=\"existingWikiWord\" href=\"#{base_url}/published/#{link}\">#{text}</a>"
+ else "<span class=\"newWikiWord\">#{text}</span>" end
+ else
+ if has_file?(name)
+ "<a class=\"existingWikiWord\" href=\"#{base_url}/file/#{link}\">#{text}</a>"
+ else
+ "<span class=\"newWikiWord\">#{text}<a href=\"#{base_url}/file/#{link}\">?</a></span>"
+ end
+ end
+ 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.
+ # The links a relative, and will work only if displayed on another WikiPage.
+ # It should not be used in menus, templates and such - instead, use link_to_page helper
+ def make_link(name, text = nil, options = {})
+ text = CGI.escapeHTML(text || WikiWords.separate(name))
+ mode = options[:mode] || :show
+ base_url = options[:base_url] || '..'
+ link_type = options[:link_type] || :show
+ case link_type.to_sym
+ when :show
+ make_page_link(mode, name, text, base_url)
+ when :file
+ make_file_link(mode, name, text, base_url)
+ when :pic
+ make_pic_link(mode, name, text, base_url)
+ else
+ raise "Unknown link type: #{link_type}"
+ end
+ end
+
+ def make_page_link(mode, name, text, base_url)
+ link = CGI.escape(name)
+ case mode.to_sym
+ when :export
+ if has_page?(name) then %{<a class="existingWikiWord" href="#{link}.html">#{text}</a>}
+ else %{<span class="newWikiWord">#{text}</span>} end
+ when :publish
+ if has_page?(name) then %{<a class="existingWikiWord" href="#{base_url}/published/#{link}">#{text}</a>}
+ else %{<span class="newWikiWord">#{text}</span>} end
+ else
+ if has_page?(name)
+ %{<a class="existingWikiWord" href="#{base_url}/show/#{link}">#{text}</a>}
+ else
+ %{<span class="newWikiWord">#{text}<a href="#{base_url}/show/#{link}">?</a></span>}
+ end
+ end
+ end
+
+ def make_pic_link(mode, name, text, base_url)
+ link = CGI.escape(name)
+ case mode.to_sym
+ when :export
+ if has_file?(name) then %{<img alt="#{text}" src="#{link}" />}
+ else %{<img alt="#{text}" src="no image" />} end
+ when :publish
+ if has_file?(name) then %{<img alt="#{text}" src="#{link}" />}
+ else %{<span class="newWikiWord">#{text}</span>} end
+ else
+ if has_file?(name) then %{<img alt="#{text}" src="#{base_url}/pic/#{link}" />}
+ else %{<span class="newWikiWord">#{text}<a href="#{base_url}/pic/#{link}">?</a></span>} end
+ 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.delete_if { |page_name, page| pages_to_be_removed.include?(page) }
+ end
+
+ def revised_on
+ select.most_recent_revision
+ end
+
+ def select(&condition)
+ PageSet.new(self, @pages.values, condition)
+ 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
+
+end