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

Refactor 3 exporters back into main App class.

Didn't quite work out this way. Instead now separating out the
different tasks in output. For start the source code export is
now fully done inside SourceWriter class, which got a write_all
static method.

The main chunk of the normal HTML output is done by TemplateDir
class that at the moment does a bit too many things.
parent 33bc2d40
Loading
Loading
Loading
Loading
+40 −17
Original line number Diff line number Diff line
@@ -16,9 +16,10 @@ require 'jsduck/categories'
require 'jsduck/images'
require 'jsduck/json_duck'
require 'jsduck/lint'
require 'jsduck/stdout_exporter'
require 'jsduck/json_exporter'
require 'jsduck/html_exporter'
require 'jsduck/template_dir'
require 'jsduck/class_writer'
require 'jsduck/source_writer'
require 'fileutils'

module JsDuck

@@ -42,23 +43,45 @@ module JsDuck
      InheritDoc.new(@relations).resolve_all
      Lint.new(@relations).run

      @resources = {
        :parsed_files => parsed_files,
        :images => Images.new(@opts.images),
        :welcome => Welcome.create(@opts.welcome),
        :guides => Guides.create(@opts.guides, DocFormatter.new(@relations, @opts)),
        :videos => Videos.create(@opts.videos),
        :examples => Examples.create(@opts.examples),
        :categories => Categories.create(@opts.categories_path, DocFormatter.new(@relations, @opts), @relations),
      }

      @images = Images.new(@opts.images)
      @welcome = Welcome.create(@opts.welcome)
      @guides = Guides.create(@opts.guides, DocFormatter.new(@relations, @opts))
      @videos = Videos.create(@opts.videos)
      @examples = Examples.create(@opts.examples)
      @categories = Categories.create(@opts.categories_path, DocFormatter.new(@relations, @opts), @relations)

      if @opts.export == :stdout
        StdoutExporter.new(@relations, @opts).run { format_classes }
        format_classes
        puts JsonDuck.generate(@relations.classes)
      elsif @opts.export == :json
        JsonExporter.new(@relations, @opts).run { format_classes }
        format_classes
        FileUtils.rm_rf(@opts.output_dir)
        cw = ClassWriter.new(@relations, @opts)
        cw.write(@opts.output_dir, ".json")
      else
        HtmlExporter.new(@relations, @resources, @opts).run { format_classes }
        FileUtils.rm_rf(@opts.output_dir)

        template = TemplateDir.new(@relations, @opts)
        template.welcome = @welcome
        template.categories = @categories
        template.guides = @guides
        template.videos = @videos
        template.examples = @examples
        template.write

        # class-formatting is done in parallel which breaks the links
        # between source files and classes. Therefore it MUST to be done
        # after writing sources which needs the links to work.
        SourceWriter.write_all(parsed_files, @opts.output_dir + "/source")
        format_classes

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

        @guides.write(@opts.output_dir+"/guides")
        @videos.write(@opts.output_dir+"/videos")
        @examples.write(@opts.output_dir+"/examples")
        @images.copy(@opts.output_dir+"/images")
      end
    end

@@ -120,7 +143,7 @@ module JsDuck
      # Then merge the data back to classes sequentially
      formatted_classes.each do |cls|
        @relations[cls[:doc][:name]].internal_doc = cls[:doc]
        cls[:images].each {|img| @resources[:images].add(img) }
        cls[:images].each {|img| @images.add(img) }
      end
    end

+2 −0
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ require 'jsduck/renderer'
require 'jsduck/doc_formatter'
require 'jsduck/logger'
require 'jsduck/json_duck'
require 'fileutils'

module JsDuck

@@ -24,6 +25,7 @@ module JsDuck
      @opts.meta_tags.each {|tag| tag.formatter = doc_formatter }
      renderer.meta_tags = @opts.meta_tags

      FileUtils.mkdir(dir)
      @parallel.each(@relations.classes) do |cls|
        filename = dir + "/" + cls[:name] + extension
        Logger.instance.log("Writing docs", filename)

lib/jsduck/json_exporter.rb

deleted100644 → 0
+0 −22
Original line number Diff line number Diff line
require 'jsduck/class_writer'
require 'fileutils'

module JsDuck

  # Performs JSON export of class data
  class JsonExporter
    def initialize(relations, opts)
      @relations = relations
      @opts = opts
    end

    def run(&format_classes)
      format_classes.call
      FileUtils.rm_rf(@opts.output_dir)
      FileUtils.mkdir(@opts.output_dir)
      cw = ClassWriter.new(@relations, @opts)
      cw.write(@opts.output_dir, ".json")
    end
  end

end
+19 −6
Original line number Diff line number Diff line
require 'jsduck/logger'
require 'fileutils'

module JsDuck

  # Writes HTML JavaScript/CSS source into HTML file.
  class SourceWriter

    # Writes all source files as HTML files into destination dir.
    #
    # Can't be done in parallel, because file.html_filename= method
    # updates all the doc-objects related to the file
    def self.write_all(files, destination)
      FileUtils.mkdir(destination)
      src = SourceWriter.new(destination)
      files.each do |file|
        html_filename = src.write(file.to_html, file.filename)
        Logger.instance.log("Writing source", html_filename)
        file.html_filename = File.basename(html_filename)
      end
    end

    # Initializes SourceFormatter to the directory where
    # HTML-formatted source files will be placed.
    #
    # Wrapper can be either :page or nil; with the first one the whole
    # HTML page is created, otherwise source is left as is.
    def initialize(output_dir, wrapper = :page)
    def initialize(output_dir)
      @output_dir = output_dir
      @wrapper = wrapper
    end

    # Writes HTML into file in output directory.  It returns the name
@@ -18,7 +31,7 @@ module JsDuck
    def write(source, filename)
      fname = uniq_html_filename(filename)
      File.open(fname, 'w') do |f|
        f.write(@wrapper ? wrap_page(source) : source)
        f.write(wrap_page(source))
      end
      fname
    end

lib/jsduck/stdout_exporter.rb

deleted100644 → 0
+0 −16
Original line number Diff line number Diff line
module JsDuck

  # Writes JSON data to stdout
  class StdoutExporter
    def initialize(relations, opts)
      @relations = relations
      @opts = opts
    end

    def run(&format_classes)
      format_classes.call
      puts JsonDuck.generate(@relations.classes)
    end
  end

end
Loading