app/models/chunks/wiki.rb in instiki-0.10.0 vs app/models/chunks/wiki.rb in instiki-0.10.1

- old
+ new

@@ -1,141 +1,141 @@ -require 'wiki_words' -require 'chunks/chunk' -require 'chunks/wiki' -require 'cgi' - -# Contains all the methods for finding and replacing wiki related links. -module WikiChunk - include Chunk - - # A wiki reference is the top-level class for anything that refers to - # another wiki page. - class WikiReference < Chunk::Abstract - - # Name of the referenced page - attr_reader :page_name - - # the referenced page - def refpage - @content.web.pages[@page_name] - end - - end - - # A wiki link is the top-level class for links that refers to - # another wiki page. - class WikiLink < WikiReference - - attr_reader :link_text, :link_type - - def initialize(match_data, content) - super - @link_type = :show - end - - def self.apply_to(content) - content.gsub!( self.pattern ) do |matched_text| - chunk = self.new($~, content) - if chunk.textile_url? - # do not substitute - matched_text - else - content.add_chunk(chunk) - chunk.mask - end - end - end - - # the referenced page - def refpage - @content.web.pages[@page_name] - end - - def textile_url? - not @textile_link_suffix.nil? - end - - end - - # This chunk matches a WikiWord. WikiWords can be escaped - # by prepending a '\'. When this is the case, the +escaped_text+ - # method will return the WikiWord instead of the usual +nil+. - # The +page_name+ method returns the matched WikiWord. - class Word < WikiLink - - attr_reader :escaped_text - - unless defined? WIKI_WORD - WIKI_WORD = Regexp.new('(":)?(\\\\)?(' + WikiWords::WIKI_WORD_PATTERN + ')\b', 0, "utf-8") - end - - def self.pattern - WIKI_WORD - end - - def initialize(match_data, content) - super - @textile_link_suffix, @escape, @page_name = match_data[1..3] - if @escape - @unmask_mode = :escape - @escaped_text = @page_name - else - @escaped_text = nil - end - @link_text = WikiWords.separate(@page_name) - @unmask_text = (@escaped_text || @content.page_link(@page_name, @link_text, @link_type)) - end - - end - - # This chunk handles [[bracketted wiki words]] and - # [[AliasedWords|aliased wiki words]]. The first part of an - # aliased wiki word must be a WikiWord. If the WikiWord - # is aliased, the +link_text+ field will contain the - # alias, otherwise +link_text+ will contain the entire - # contents within the double brackets. - # - # NOTE: This chunk must be tested before WikiWord since - # a WikiWords can be a substring of a WikiLink. - class Link < WikiLink - - unless defined? WIKI_LINK - WIKI_LINK = /(":)?\[\[([^\]]+)\]\]/ - LINK_TYPE_SEPARATION = Regexp.new('^(.+):((file)|(pic))$', 0, 'utf-8') - ALIAS_SEPARATION = Regexp.new('^(.+)\|(.+)$', 0, 'utf-8') - end - - def self.pattern() WIKI_LINK end - - def initialize(match_data, content) - super - @textile_link_suffix, @page_name = match_data[1..2] - @link_text = @page_name - separate_link_type - separate_alias - @unmask_text = @content.page_link(@page_name, @link_text, @link_type) - end - - private - - # if link wihin the brackets has a form of [[filename:file]] or [[filename:pic]], - # this means a link to a picture or a file - def separate_link_type - link_type_match = LINK_TYPE_SEPARATION.match(@page_name) - if link_type_match - @link_text = @page_name = link_type_match[1] - @link_type = link_type_match[2..3].compact[0].to_sym - end - end - - # link text may be different from page name. this will look like [[actual page|link text]] - def separate_alias - alias_match = ALIAS_SEPARATION.match(@page_name) - if alias_match - @page_name, @link_text = alias_match[1..2] - end - # note that [[filename|link text:file]] is also supported - end - - end - -end +require 'wiki_words' +require 'chunks/chunk' +require 'chunks/wiki' +require 'cgi' + +# Contains all the methods for finding and replacing wiki related links. +module WikiChunk + include Chunk + + # A wiki reference is the top-level class for anything that refers to + # another wiki page. + class WikiReference < Chunk::Abstract + + # Name of the referenced page + attr_reader :page_name + + # the referenced page + def refpage + @content.web.pages[@page_name] + end + + end + + # A wiki link is the top-level class for links that refers to + # another wiki page. + class WikiLink < WikiReference + + attr_reader :link_text, :link_type + + def initialize(match_data, content) + super + @link_type = :show + end + + def self.apply_to(content) + content.gsub!( self.pattern ) do |matched_text| + chunk = self.new($~, content) + if chunk.textile_url? + # do not substitute + matched_text + else + content.add_chunk(chunk) + chunk.mask + end + end + end + + # the referenced page + def refpage + @content.web.pages[@page_name] + end + + def textile_url? + not @textile_link_suffix.nil? + end + + end + + # This chunk matches a WikiWord. WikiWords can be escaped + # by prepending a '\'. When this is the case, the +escaped_text+ + # method will return the WikiWord instead of the usual +nil+. + # The +page_name+ method returns the matched WikiWord. + class Word < WikiLink + + attr_reader :escaped_text + + unless defined? WIKI_WORD + WIKI_WORD = Regexp.new('(":)?(\\\\)?(' + WikiWords::WIKI_WORD_PATTERN + ')\b', 0, "utf-8") + end + + def self.pattern + WIKI_WORD + end + + def initialize(match_data, content) + super + @textile_link_suffix, @escape, @page_name = match_data[1..3] + if @escape + @unmask_mode = :escape + @escaped_text = @page_name + else + @escaped_text = nil + end + @link_text = WikiWords.separate(@page_name) + @unmask_text = (@escaped_text || @content.page_link(@page_name, @link_text, @link_type)) + end + + end + + # This chunk handles [[bracketted wiki words]] and + # [[AliasedWords|aliased wiki words]]. The first part of an + # aliased wiki word must be a WikiWord. If the WikiWord + # is aliased, the +link_text+ field will contain the + # alias, otherwise +link_text+ will contain the entire + # contents within the double brackets. + # + # NOTE: This chunk must be tested before WikiWord since + # a WikiWords can be a substring of a WikiLink. + class Link < WikiLink + + unless defined? WIKI_LINK + WIKI_LINK = /(":)?\[\[([^\]]+)\]\]/ + LINK_TYPE_SEPARATION = Regexp.new('^(.+):((file)|(pic))$', 0, 'utf-8') + ALIAS_SEPARATION = Regexp.new('^(.+)\|(.+)$', 0, 'utf-8') + end + + def self.pattern() WIKI_LINK end + + def initialize(match_data, content) + super + @textile_link_suffix, @page_name = match_data[1..2] + @link_text = @page_name + separate_link_type + separate_alias + @unmask_text = @content.page_link(@page_name, @link_text, @link_type) + end + + private + + # if link wihin the brackets has a form of [[filename:file]] or [[filename:pic]], + # this means a link to a picture or a file + def separate_link_type + link_type_match = LINK_TYPE_SEPARATION.match(@page_name) + if link_type_match + @link_text = @page_name = link_type_match[1] + @link_type = link_type_match[2..3].compact[0].to_sym + end + end + + # link text may be different from page name. this will look like [[actual page|link text]] + def separate_alias + alias_match = ALIAS_SEPARATION.match(@page_name) + if alias_match + @page_name, @link_text = alias_match[1..2] + end + # note that [[filename|link text:file]] is also supported + end + + end + +end