app/models/web.rb in instiki-0.9.2 vs app/models/web.rb in instiki-0.10.0
- old
+ new
@@ -1,89 +1,176 @@
-require "cgi"
-require "page"
-require "page_set"
-require "wiki_words"
-require "zip/zip"
-
-class Web
- attr_accessor :pages, :name, :address, :password
- attr_accessor :markup, :color, :safe_mode, :additional_style, :published, :brackets_only, :count_pages
-
- def initialize(name, address, password = nil)
- @name, @address, @password, @safe_mode = name, address, password, false
- @pages = {}
- 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(&accept)
- PageSet.new(self, @pages.values, accept)
- 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 = {})
- page = pages[name]
- text = text || WikiWords.separate(name)
- link = CGI.escape(name)
-
- case options[:mode]
- when :export
- if page then "<a class=\"existingWikiWord\" href=\"#{link}.html\">#{text}</a>"
- else "<span class=\"newWikiWord\">#{text}</span>" end
- when :publish
- if page then "<a class=\"existingWikiWord\" href=\"../show/#{link}\">#{text}</a>"
- else "<span class=\"newWikiWord\">#{text}</span>" end
- else
- if page then "<a class=\"existingWikiWord\" href=\"../show/#{link}\">#{text}</a>"
- else "<span class=\"newWikiWord\">#{text}<a href=\"../show/#{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
-
- # Default values
- def markup() @markup || :textile end
- def color() @color || "008B26" end
- def brackets_only() @brackets_only || false end
- def count_pages() @count_pages || false 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
\ No newline at end of file
+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