Commit 1ac8939c authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Initial implementation of guide examples export.

parent e761273d
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ require 'jsduck/full_exporter'
require 'jsduck/app_exporter'
require 'jsduck/examples_exporter'
require 'jsduck/inline_examples'
require 'jsduck/guide_writer'
require 'fileutils'

module JsDuck
@@ -62,6 +63,10 @@ module JsDuck
        }
        cw = ClassWriter.new(exporters[@opts.export], @relations, @opts)
        cw.write(@opts.output_dir, ".json")
        if @opts.export == :examples
          gw = GuideWriter.new(exporters[@opts.export], @assets.guides, @opts)
          gw.write(@opts.output_dir, ".json")
        end
      else
        FileUtils.rm_rf(@opts.output_dir)
        TemplateDir.new(@opts).write
+14 −1
Original line number Diff line number Diff line
@@ -28,7 +28,20 @@ module JsDuck
      if examples.length > 0
        {
          :name => cls[:name],
          :examples => @inline_examples.extract(cls[:doc]),
          :examples => examples,
        }
      else
        nil
      end
    end

    # Returns hash of guide name and inline examples
    def export_guide(guide, html)
      examples = @inline_examples.extract(html)
      if examples.length > 0
        {
          :name => guide["name"],
          :examples => examples,
        }
      else
        nil
+61 −0
Original line number Diff line number Diff line
require 'jsduck/parallel_wrap'
require 'jsduck/logger'
require 'jsduck/json_duck'
require 'fileutils'

module JsDuck

  # Writes guide data into files in JSON or JSONP format or to STDOUT.
  class GuideWriter
    def initialize(exporter_class, guides, opts)
      @guides = guides
      @exporter = exporter_class.new(guides, opts)
      @parallel = ParallelWrap.new(:in_processes => opts.processes)
    end

    # Writes guide data into given directory or STDOUT when dir == :stdout.
    #
    # Extension is either ".json" for normal JSON output
    # or ".js" for JsonP output.
    def write(dir, extension)
      dir == :stdout ? write_stdout : write_dir(dir, extension)
    end

    private

    def write_stdout
      json = @parallel.map(all_guides) {|g| @exporter.export_guide(g[0], g[1]) }.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
        Logger.instance.log("Writing guide", filename)
        json = @exporter.export_guide(g[0], g[1])
        # 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)
          else
            throw "Unexpected file extension: #{extension}"
          end
        end
      end
    end

    def all_guides
      guides = []
      @guides.each_guide_with_html do |guide, html|
        guides << [guide, html]
      end
      guides
    end

  end

end