# class WikiCloth::WikiCloth

### Public Class Methods

new(opt={}) click to toggle source

    # File lib/wikicloth.rb, line 24
    def initialize(opt={})
      self.options.merge!(opt)
      self.options[:extensions] ||= []
      self.options[:link_handler] = opt[:link_handler] unless opt[:link_handler].nil?
      self.load(opt[:data],opt[:params]) unless opt[:data].nil?
      @current_line = 1
      @current_row = 0
    end

### Public Instance Methods

link_handler() click to toggle source

    # File lib/wikicloth.rb, line 112
    def link_handler
      self.options[:link_handler] ||= WikiLinkHandler.new
    end

load(data,p={}) click to toggle source

    # File lib/wikicloth.rb, line 33
    def load(data,p={})
      depth = 1
      count = 0
      root = [self.sections]

      # parse wiki document into sections
      data.each_line do |line|
        if line =~ /^([=]{1,6})\s*(.*?)\s*(\1)/
          root << root.last[-1].children if $1.length > depth
          root.pop if $1.length < depth
          depth = $1.length
          root.last << Section.new(line, get_id_for($2.gsub(/\s+/,'_')))
          count += 1
        else
          root.last[-1] << line
        end
      end

      # if we find template variables assume document is
      # a template
      self.sections.first.template = true if data =~ /\{\{\{\s*([A-Za-z0-9]+)\s*\}\}\}/

      # If there are more than four sections enable automatic
      # table of contents
      self.sections.first.auto_toc = true unless count < 4 || data =~ /__(NO|)TOC__/

      self.params = p
    end

method_missing(method, *args) click to toggle source
Calls superclass method

    # File lib/wikicloth.rb, line 124
    def method_missing(method, *args)
      if self.link_handler.respond_to?(method)
        self.link_handler.send(method, *args)
      else
        super(method, *args)
      end
    end

options() click to toggle source

    # File lib/wikicloth.rb, line 120
    def options
      @options ||= {}
    end

params() click to toggle source

    # File lib/wikicloth.rb, line 116
    def params
      @page_params ||= {}
    end

render(opt={}) click to toggle source

    # File lib/wikicloth.rb, line 62
    def render(opt={})
      self.options = { :noedit => false, :fast => true, :output => :html, :link_handler => self.link_handler,
        :params => self.params, :sections => self.sections }.merge(self.options).merge(opt)
      self.options[:link_handler].params = options[:params]

      locale = self.options[:locale] || I18n.locale

      I18n.with_locale(locale) do
        data = self.sections.collect { |s| s.render(self.options) }.join
        data.gsub!(/<!--(.|\s)*?-->/,"")
        data << "\n" if data.last(1) != "\n"
        data << "garbage"

        buffer = WikiBuffer.new("",options)

        begin
          if self.options[:fast]
            until data.empty?
              case data
              when /\A\w+/
                data = $'
                @current_row += $&.length
                buffer.add_word($&)
              when /\A[^\w]+(\w|)/m
                data = $'
                $&.each_char { |c| add_current_char(buffer,c) }
              end
            end
          else
            data.each_char { |c| add_current_char(buffer,c) }
          end
        rescue => err
          debug_tree = buffer.buffers.collect { |b| b.debug }.join("-->")
          puts I18n.t("unknown error on line", :line => @current_line, :row => @current_row, :tree => debug_tree)
          raise err
        end

        buffer.eof()
        buffer.send("to_#{self.options[:output]}")
      end
    end

sections() click to toggle source

    # File lib/wikicloth.rb, line 104
    def sections
      @sections ||= [Section.new]
    end

to_html(opt={}) click to toggle source

    # File lib/wikicloth.rb, line 108
    def to_html(opt={})
      self.render(opt.merge(:output => :html))
    end

### Protected Instance Methods

add_current_char(buffer,c) click to toggle source

    # File lib/wikicloth.rb, line 133
    def add_current_char(buffer,c)
      if c == "\n"
        @current_line += 1
        @current_row = 1
      else
        @current_row += 1
      end
      buffer.add_char(c)
    end

get_id_for(val) click to toggle source

    # File lib/wikicloth.rb, line 147
    def get_id_for(val)
      val.gsub!(/[^A-Za-z0-9_]+/,'')
      @idmap ||= {}
      @idmap[val] ||= 0
      @idmap[val] += 1
      @idmap[val] == 1 ? val : "#{val}-#{@idmap[val]}"
    end

options=(val) click to toggle source

    # File lib/wikicloth.rb, line 155
    def options=(val)
      @options = val
    end

params=(val) click to toggle source

    # File lib/wikicloth.rb, line 159
    def params=(val)
      @page_params = val
    end

sections=(val) click to toggle source

    # File lib/wikicloth.rb, line 143
    def sections=(val)
      @sections = val
    end