Commit 4e90812a authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Refactor exporters.

Exporters now only deal with generation the data, ClassWriter
decides whether to write it into .json or .js files, or to STDOUT.
parent 74ca8742
Loading
Loading
Loading
Loading
+3 −10
Original line number Diff line number Diff line
@@ -24,16 +24,7 @@ module JsDuck
      # other exporters.
    end

    # Extension for filename
    def extension
      ".json"
    end

    # Writes full class data in JSON format to file
    def write(filename, cls)
      JsonDuck.write_json(filename, export(cls))
    end

    # Returns hash of class name and member names
    def export(cls)
      {
        :name => cls[:name],
@@ -42,6 +33,8 @@ module JsDuck
      }
    end

    private

    def export_members(cls, context)
      h = {}
      Class.default_members_hash.each_key do |type|
+6 −19
Original line number Diff line number Diff line
@@ -55,25 +55,12 @@ module JsDuck
      @examples = Examples.create(@opts.examples)
      @categories = Categories.create(@opts.categories_path, DocFormatter.new(@relations, @opts), @relations)

      if @opts.export == :json
      if @opts.export
        format_classes
        if @opts.output_dir == :stdout
          puts JsonDuck.generate(@relations.classes)
        else
          FileUtils.rm_rf(@opts.output_dir)
          cw = ClassWriter.new(JsonExporter, @relations, @opts)
          cw.write(@opts.output_dir)
        end
      elsif @opts.export == :api
        format_classes
        if @opts.output_dir == :stdout
          exporter = ApiExporter.new({}, {})
          puts JsonDuck.generate(@relations.classes.map {|cls| exporter.export(cls) })
        else
          FileUtils.rm_rf(@opts.output_dir)
          cw = ClassWriter.new(ApiExporter, @relations, @opts)
          cw.write(@opts.output_dir)
        end
        FileUtils.rm_rf(@opts.output_dir) unless @opts.output_dir == :stdout
        exporters = {:json => JsonExporter, :api => ApiExporter}
        cw = ClassWriter.new(exporters[@opts.export], @relations, @opts)
        cw.write(@opts.output_dir, ".json")
      else
        FileUtils.rm_rf(@opts.output_dir)
        TemplateDir.new(@opts).write
@@ -97,7 +84,7 @@ module JsDuck
        format_classes

        cw = ClassWriter.new(JsonPExporter, @relations, @opts)
        cw.write(@opts.output_dir+"/output")
        cw.write(@opts.output_dir+"/output", ".js")

        @guides.write(@opts.output_dir+"/guides")
        @videos.write(@opts.output_dir+"/videos")
+27 −5
Original line number Diff line number Diff line
require 'jsduck/parallel_wrap'
require 'jsduck/logger'
require 'jsduck/json_duck'
require 'fileutils'

module JsDuck

  # Writes class data into files
  # Writes class data into files in JSON or JSONP format or to STDOUT.
  class ClassWriter
    def initialize(exporter_class, relations, opts)
      @relations = relations
@@ -12,13 +13,34 @@ module JsDuck
      @parallel = ParallelWrap.new(:in_processes => opts.processes)
    end

    # Writes class data into given directory
    def write(dir)
    # Writes class 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(@relations.classes) {|cls| @exporter.export(cls) }
      puts JsonDuck.generate(json)
    end

    def write_dir(dir, extension)
      FileUtils.mkdir(dir)
      @parallel.each(@relations.classes) do |cls|
        filename = dir + "/" + cls[:name] + @exporter.extension
        filename = dir + "/" + cls[:name] + extension
        Logger.instance.log("Writing docs", filename)
        @exporter.write(filename, cls)
        json = @exporter.export(cls)
        if extension == ".json"
          JsonDuck.write_json(filename, json)
        elsif extension == ".js"
          JsonDuck.write_jsonp(filename, cls[:name].gsub(/\./, "_"), json)
        else
          throw "Unexpected file extension: #{extension}"
        end
      end
    end

+3 −9
Original line number Diff line number Diff line
require 'jsduck/exporter'
require 'jsduck/json_duck'

module JsDuck

@@ -9,14 +8,9 @@ module JsDuck
      @exporter = Exporter.new(relations)
    end

    # Extension for filename
    def extension
      ".json"
    end

    # Writes full class data in JSON format to file
    def write(filename, cls)
      JsonDuck.write_json(filename, @exporter.export(cls))
    # Returns full class data hash
    def export
      @exporter.export(cls)
    end

  end
+3 −10
Original line number Diff line number Diff line
require 'jsduck/exporter'
require 'jsduck/json_duck'
require 'jsduck/renderer'
require 'jsduck/doc_formatter'

@@ -17,17 +16,11 @@ module JsDuck
      renderer.meta_tags = @opts.meta_tags
    end

    # Extension for filename
    def extension
      ".js"
    end

    # Writes compacted class data in JsonP format to file
    def write(filename, cls)
    # Returns compacted class data hash
    def export(cls)
      data = @exporter.export(cls)
      data[:html] = @renderer.render(data)
      data = @exporter.compact(data)
      JsonDuck.write_jsonp(filename, cls[:name].gsub(/\./, "_"), data)
      return @exporter.compact(data)
    end

  end