require 'haml' require 'rdiscount' module Soywiki module Html include Template_Substitution HTML_DIR = 'html-export' INDEX_PAGE_TEMPLATE = File.read(File.join(File.dirname(__FILE__), '..', 'index_template.html.haml')) def self.href_wiki_links(text) text = text.gsub(WIKI_WORD) {|match| href = if match =~ /\w\./ # namespace "../#{match.gsub(".", "/")}.html" else match + '.html' end %{#{match}} } return text end def self.href_hyperlinks(text) text = text.gsub(HYPERLINK) {|match| %{#{match}} } return text end def self.process(t) href_hyperlinks(href_wiki_links(t)) end PAGE_TEMPLATE = File.read(File.join(File.dirname(__FILE__), '..', 'page_template.html.haml')) def self.generate_page(text, namespace, pages, namespaces) text = text.split("\n") title = text.shift || '' body = if text.empty? '' elsif @markdown RDiscount.new(text.join("\n").strip).to_html.gsub("
","
\n") 
             else
               process(text.join("\n").strip)
             end

      page_template = if defined?(PAGE_TEMPLATE_SUB)
                        PAGE_TEMPLATE_SUB
                      else
                        PAGE_TEMPLATE
                      end
      Haml::Engine.new(page_template).render(nil, :body => body,
                                             :title => title,
                                             :namespace => namespace,
                                             :namespaces => namespaces,
                                             :pages => pages,
                                             :markdown => @markdown)
    end



    def self.wiki_page?(file)
      file.gsub("/", '.') =~ WIKI_WORD
    end

    def self.make_index_page(dir, pages, namespaces)
      index_page_template = if defined?(INDEX_PAGE_TEMPLATE_SUB)
                              INDEX_PAGE_TEMPLATE_SUB
                            else
                              INDEX_PAGE_TEMPLATE
                            end
      outfile = File.join(HTML_DIR, dir, 'index.html')
      html = Haml::Engine.new(index_page_template).render(nil, 
                                             :namespace => dir, 
                                             :root => false,
                                             :pages => pages.map {|p| p.split('/')[1]}.sort, 
                                             :namespaces => namespaces)
      File.open(outfile, 'w') {|f| f.write html}
      # puts "=> Writing #{outfile}"
    end

    def self.make_pages(dir, namespaces)
      `mkdir -p #{HTML_DIR}/#{dir}`
      pages = Dir["#{dir}/*"].select {|file| wiki_page? file} 
      # make pages
      pages.each do |file|
        outfile =  File.join(HTML_DIR, file + '.html')
        html = Soywiki::Html.generate_page(File.read(file), 
                                           dir, 
                                           pages.map {|p| p.split('/')[1]}.sort, 
                                           namespaces)
        File.open(outfile, 'w') {|f| f.write html}
        # puts "Writing #{outfile}"
      end
      make_index_page(dir, pages, namespaces)
    end

    def self.make_root_index_page(namespaces)
      outfile = File.join(HTML_DIR, 'index.html')
      index_page_template = if defined?(INDEX_PAGE_TEMPLATE_SUB)
                              INDEX_PAGE_TEMPLATE_SUB
                            else
                              INDEX_PAGE_TEMPLATE
                            end
      html = Haml::Engine.new(index_page_template).render(nil, 
                                             :namespace => nil, 
                                             :pages => [], 
                                             :root => true,
                                             :namespaces => namespaces)
      File.open(outfile, 'w') {|f| f.write html}
      # puts "=> Writing #{outfile}"
    end

    def self.export(markdown)
      @markdown = markdown

      `rm -rf #{HTML_DIR}/*`
      namespaces = Dir["*"].select {|f| 
        File.directory?(f) && f != HTML_DIR
      }.sort.map {|namespace|
        count = Dir["#{namespace}/*"].select {|f| wiki_page?(f)}.size
        [namespace, count]
      }
      namespaces.each do |namespace_dir, count|
        make_pages namespace_dir, namespaces
      end
      # make root index page
      make_root_index_page namespaces
      puts "HTML files written to #{HTML_DIR}/"
    end


  end
end