Commit bfb3a014 authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Refactor guides parsing to separate class.

parent 175c5cdc
Loading
Loading
Loading
Loading
+4 −15
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@ require 'jsduck/exporter'
require 'jsduck/timer'
require 'jsduck/parallel_wrap'
require 'jsduck/logger'
require 'jsduck/guides'
require 'json'
require 'fileutils'

@@ -261,21 +262,9 @@ module JsDuck

    # Writes JsonP export file for each guide
    def write_guides(in_path, out_path, relations)
      formatter = get_doc_formatter(relations)
      FileUtils.mkdir(out_path)
      Dir.glob(in_path + "/*").each do |in_dir|
        if File.directory?(in_dir)
          guide_name = File.basename(in_dir)
          out_dir = out_path + "/" + guide_name
          Logger.instance.log("Creating guide #{out_dir} ...")
          FileUtils.cp_r(in_dir, out_dir)
          formatter.doc_context = {:filename => out_dir + "/README.md", :linenr => 0}
          guide = formatter.format(IO.read(out_dir + "/README.md"))
          guide.gsub!(/<img src="/, "<img src=\"guides/#{guide_name}/")
          write_jsonp_file(out_dir+"/README.js", guide_name, {:guide => guide})
          FileUtils.rm(out_dir + "/README.md")
        end
      end
      guides = Guides.new(get_doc_formatter(relations))
      guides.parse_dir(in_path)
      guides.write(out_path)
    end

    # Creates and initializes DocFormatter

lib/jsduck/guides.rb

0 → 100644
+69 −0
Original line number Diff line number Diff line
require 'jsduck/logger'
require 'fileutils'
require 'json'

module JsDuck

  # Reads in guides and converts them to JsonP files
  class Guides
    def initialize(formatter)
      @guides = []
      @formatter = formatter
    end

    # Looks for guide in each subdir of given directory
    def parse_dir(guides_dir)
      Dir.glob(guides_dir + "/*").each do |dir|
        if File.directory?(dir)
          parse_guide(dir)
        end
      end
    end

    def parse_guide(dir)
      guide_file = dir + "/README.md"
      unless File.exists?(guide_file)
        return Logger.instance.warn("README.md not found in #{dir}")
      end

      Logger.instance.log("Parsing guide #{guide_file} ...")
      markdown = IO.read(guide_file)
      name = File.basename(dir)
      # Treat the first line of file as title
      title = markdown.match(/^([^\n]*?)(\r?\n|$)/)[1],

      @formatter.doc_context = {:filename => guide_file, :linenr => 0}
      html = @formatter.format(markdown)
      html.gsub!(/<img src="/, "<img src=\"guides/#{name}/")

      @guides << {
        :dir => dir,
        :name => name,
        :title => title,
        :icon => File.exists?(dir+"/icon.png") ? dir+"/icon.png" : nil,
        :html => html,
      }
    end

    # Writes all guides to given dir in JsonP format
    def write(dir)
      FileUtils.mkdir(dir)
      @guides.each do |guide|
        out_dir = dir+"/"+guide[:name]
        FileUtils.cp_r(guide[:dir], out_dir)
        # Write the JsonP file and remove the original Markdown file
        write_jsonp_file(out_dir+"/README.js", guide[:name], {:guide => guide[:html]})
        FileUtils.rm(out_dir + "/README.md")
      end
    end

    # Turns hash into JSON and writes inside JavaScript that calls the
    # given callback name
    def write_jsonp_file(filename, callback_name, data)
      jsonp = "Ext.data.JsonP." + callback_name + "(" + JSON.pretty_generate(data) + ");"
      File.open(filename, 'w') {|f| f.write(jsonp) }
    end

  end

end