Commit 0dc0fd55 authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Refactor guide examples export.

Guides HTML is now placed inside guide hashes and can be easily accessed
from there when looping over with guides.each_item.  But when calling
the #to_array method, :html keys are filtered out, so it behaves like
before and can be placed inside Docs.data.guides.
parent 1ac8939c
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -36,8 +36,8 @@ module JsDuck
    end

    # Returns hash of guide name and inline examples
    def export_guide(guide, html)
      examples = @inline_examples.extract(html)
    def export_guide(guide)
      examples = @inline_examples.extract(guide[:html] || "")
      if examples.length > 0
        {
          :name => guide["name"],
+8 −11
Original line number Diff line number Diff line
@@ -24,23 +24,22 @@ module JsDuck
    private

    def write_stdout
      json = @parallel.map(all_guides) {|g| @exporter.export_guide(g[0], g[1]) }.compact
      json = @parallel.map(all_guides) {|guide| @exporter.export_guide(guide) }.compact
      puts JsonDuck.generate(json)
    end

    def write_dir(dir, extension)
      FileUtils.mkdir(dir) unless File.exists?(dir)
      @parallel.each(all_guides) do |g|
        name = g[0]["name"]
        filename = dir + "/" + name + extension
      @parallel.each(all_guides) do |guide|
        filename = dir + "/" + guide["name"] + extension
        Logger.instance.log("Writing guide", filename)
        json = @exporter.export_guide(g[0], g[1])
        json = @exporter.export_guide(guide)
        # skip file if exporter returned nil
        if json
          if extension == ".json"
            JsonDuck.write_json(filename, json)
          elsif extension == ".js"
            JsonDuck.write_jsonp(filename, name, json)
            JsonDuck.write_jsonp(filename, guide["name"], json)
          else
            throw "Unexpected file extension: #{extension}"
          end
@@ -49,11 +48,9 @@ module JsDuck
    end

    def all_guides
      guides = []
      @guides.each_guide_with_html do |guide, html|
        guides << [guide, html]
      end
      guides
      arr = []
      @guides.each_item {|g| arr << g }
      arr
    end

  end
+28 −16
Original line number Diff line number Diff line
@@ -26,18 +26,37 @@ module JsDuck
      build_map_by_name("Two guides have the same name")
      @formatter = formatter
      @opts = opts
      @loaded_guides = {}
    end

    # Writes all guides to given dir in JsonP format
    def write(dir)
      FileUtils.mkdir(dir) unless File.exists?(dir)
      each_guide_with_html {|guide, html| write_guide(guide, dir, html) }
      each_item {|guide| write_guide(guide, dir) }
    end

    def load_guide(guide)
      return @loaded_guides[guide["name"]] if @loaded_guides[guide["name"]]
    # Modified each_item that also loads HTML for each guide
    def each_item(&block)
      unless @loaded
        super do |guide|
          guide[:html] = load_guide(guide)
        end
        @loaded = true
      end

      super(&block)
    end

    # Modified to_array that excludes the :html from guide nodes
    def to_array
      @groups.map do |group|
        {
          "title" => group["title"],
          "items" => group["items"].map {|g| g.select {|k, v| k != :html } }
        }
      end
    end

    def load_guide(guide)
      in_dir = @path + "/guides/" + guide["name"]
      return Logger.instance.warn(:guide, "Guide #{in_dir} not found") unless File.exists?(in_dir)

@@ -48,10 +67,12 @@ module JsDuck
      name = File.basename(in_dir)
      @formatter.img_path = "guides/#{name}"

      return @loaded_guides[guide["name"]] = add_toc(guide, @formatter.format(JsDuck::IO.read(guide_file)))
      return add_toc(guide, @formatter.format(JsDuck::IO.read(guide_file)))
    end

    def write_guide(guide, dir, html)
    def write_guide(guide, dir)
      return unless guide[:html]

      in_dir = @path + "/guides/" + guide["name"]
      out_dir = dir + "/" + guide["name"]

@@ -62,16 +83,7 @@ module JsDuck
      # Ensure the guide has an icon
      fix_icon(out_dir)

      JsonDuck.write_jsonp(out_dir+"/README.js", guide["name"], {:guide => html, :title => guide["title"]})
    end

    # Loops over all guides calling the block with guide and its
    # processed HTML contents
    def each_guide_with_html
      each_item do |guide|
        html = load_guide(guide)
        yield guide, html if html
      end
      JsonDuck.write_jsonp(out_dir+"/README.js", guide["name"], {:guide => guide[:html], :title => guide["title"]})
    end

    # Ensures the guide dir contains icon.png.
+2 −2
Original line number Diff line number Diff line
@@ -30,8 +30,8 @@ module JsDuck

    # Extracts inline examples from guides
    def add_guides(guides)
      guides.each_guide_with_html do |guide, html|
        extract(html).each_with_index do |ex, i|
      guides.each_item do |guide|
        extract(guide[:html]).each_with_index do |ex, i|
          @examples << {
            :id => guide["name"] + "-" + i.to_s,
            :name => guide["title"] + " example #" + (i+1).to_s,