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

Move Docs app related ruby code to web/ subdir.

Cleaning up the top JSDuck namespace even more.

I always had some trouble finding all the different web-output-related
classes.
parent df2a465b
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -3,7 +3,7 @@ require 'jsduck/batch_processor'
require 'jsduck/assets'
require 'jsduck/tag_registry'
require 'jsduck/export_writer'
require 'jsduck/web_writer'
require 'jsduck/web/writer'

module JsDuck

@@ -47,7 +47,7 @@ module JsDuck
    end

    def generate_web_page
      WebWriter.new(@relations, @assets, @parsed_files, @opts).write
      Web::Writer.new(@relations, @assets, @parsed_files, @opts).write
    end

  end

lib/jsduck/app_data.rb

deleted100644 → 0
+0 −41
Original line number Diff line number Diff line
require 'jsduck/util/json'
require 'jsduck/icons'
require 'jsduck/search_data'
require 'jsduck/tag_registry'

module JsDuck

  # Creates big JS file with data for Docs app.
  class AppData
    def initialize(relations, assets, opts)
      @relations = relations
      @assets = assets
      @opts = opts
    end

    # Writes classes, guides, videos, and search data to one big .js file
    def write(filename)
      js = "Docs = " + Util::Json.generate({
        :data => {
          :classes => Icons.new.create(@relations.classes),
          :guides => @assets.guides.to_array,
          :videos => @assets.videos.to_array,
          :examples => @assets.examples.to_array,
          :search => SearchData.new.create(@relations.classes, @assets),
          :tests => @opts.tests,
          :signatures => TagRegistry.signatures,
          :memberTypes => TagRegistry.member_types,
          :localStorageDb => @opts.local_storage_db,
          :showPrintButton => @opts.seo,
          :touchExamplesUi => @opts.touch_examples_ui,
          :source => @opts.source,
          :commentsUrl => @opts.comments_url,
          :commentsDomain => @opts.comments_domain,
        }
      }) + ";\n"
      File.open(filename, 'w') {|f| f.write(js) }
    end

  end

end

lib/jsduck/icons.rb

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

  # Creates an array of small hashes documenting name, parent class
  # and icon of a class.
  class Icons
    def create(classes)
      classes.map do |cls|
        {
          :name => cls[:name],
          :extends => cls[:extends],
          :private => cls[:private],
          :icon => Icons::class_icon(cls),
        }
      end
    end

    # Returns CSS class name for an icon of class
    def self.class_icon(cls)
      if cls[:singleton]
        "icon-singleton"
      elsif cls.inherits_from?("Ext.Component")
        "icon-component"
      else
        "icon-class"
      end
    end
  end

end

lib/jsduck/index_html.rb

deleted100644 → 0
+0 −84
Original line number Diff line number Diff line
require 'jsduck/logger'
require 'jsduck/util/io'
require 'fileutils'

module JsDuck

  # Deals with creation of main HTML or PHP files.
  class IndexHtml
    def initialize(assets, opts)
      @assets = assets
      @opts = opts
    end

    # In normal mode creates index.html.
    #
    # When --seo enabled, creates index.php, template.html and print-template.html.
    def write
      if @opts.seo
        FileUtils.cp(@opts.template_dir+"/index.php", @opts.output_dir+"/index.php")
        create_template_html(@opts.template_dir+"/template.html", @opts.output_dir+"/template.html")
        create_print_template_html(@opts.template_dir+"/print-template.html", @opts.output_dir+"/print-template.html")
        create_index_template_html(@opts.template_dir+"/index-template.html", @opts.output_dir+"/index-template.html")
      else
        create_template_html(@opts.template_dir+"/template.html", @opts.output_dir+"/index.html")
      end
    end

    private

    def create_template_html(in_file, out_file)
      write_template(in_file, out_file, {
        "{title}" => @opts.title,
        "{mobile_redirect}" => @opts.seo ? include_script(@opts.template_dir+"/mobile-redirect.js") : "",
        "{header}" => @opts.header,
        "{footer}" => "<div id='footer-content' style='display: none'>#{@opts.footer}</div>",
        "{extjs_path}" => @opts.extjs_path,
        "{data_path}" => File.basename(@opts.data_path),
        "{welcome}" => @assets.welcome.to_html("display:none"),
        "{categories}" => @assets.categories.to_html("display:none"),
        "{guides}" => @assets.guides.to_html("display:none"),
        "{head_html}" => @opts.head_html,
        "{body_html}" => @opts.body_html,
        "{head_css}" => TagRegistry.css,
      })
    end

    def create_print_template_html(in_file, out_file)
      write_template(in_file, out_file, {
        "{title}" => @opts.title,
        "{header}" => @opts.header,
        "{head_css}" => TagRegistry.css,
      })
    end

    def create_index_template_html(in_file, out_file)
      categories = @assets.categories.to_html
      guides = @assets.guides.to_html

      write_template(in_file, out_file, {
        "{title}" => @opts.title,
        "{header}" => @opts.header,
        "{categories}" => categories ? "<h1>API Documentation</h1> #{categories}" : "",
        "{guides}" => guides ? "<h1>Guides</h1> #{guides}" : "",
        "{head_css}" => TagRegistry.css,
      })
    end

    def include_script(filename)
      "<script type='text/javascript'>\n" + Util::IO.read(filename) + "\n</script>"
    end

    # Opens in_file, replaces {keys} inside it, writes to out_file
    def write_template(in_file, out_file, replacements)
      Logger.log("Writing", out_file)
      html = Util::IO.read(in_file)
      html.gsub!(/\{\w+\}/) do |key|
        replacements[key] ? replacements[key] : key
      end
      File.open(out_file, 'w') {|f| f.write(html) }
    end

  end

end

lib/jsduck/search_data.rb

deleted100644 → 0
+0 −146
Original line number Diff line number Diff line
require 'jsduck/icons'
require 'jsduck/class_name'
require 'jsduck/tag_registry'

module JsDuck

  # Creates list of all members in all classes that is used by the
  # searching feature in UI.
  class SearchData
    # Given list of classes and other assets, returns an array of
    # hashes describing the search data.
    def create(classes, assets)
      list = []

      classes.each do |cls|
        list << class_node(cls)

        cls[:alternateClassNames].each do |name|
          list << alt_node(name, cls)
        end

        cls[:aliases].each_pair do |key, items|
          items.each do |name|
            list << alias_node(key, name, cls)
          end
        end

        # add all local members, but skip constructors
        cls[:members].each do |m|
          list << member_node(m, cls) unless m[:name] == ClassName.short(cls[:name])
        end
      end

      assets.guides.each_item {|g| list << guide_node(g) }

      assets.videos.each_item {|v| list << video_node(v) }

      assets.examples.each_item {|e| list << example_node(e) }

      list
    end

    private

    def alias_node(key, name, cls)
      return {
        :name => name,
        :fullName => alias_display_name(key)+": "+name,
        :icon => Icons::class_icon(cls) + "-redirect",
        :url => "#!/api/" + cls[:name],
        :meta => combine_meta(cls),
        :sort => 0,
      }
    end

    def class_node(cls)
      return {
        :name => ClassName.short(cls[:name]),
        :fullName => cls[:name],
        :icon => Icons::class_icon(cls),
        :url => "#!/api/" + cls[:name],
        :meta => combine_meta(cls),
        :sort => 1,
      }
    end

    def alt_node(name, cls)
      return {
        :name => ClassName.short(name),
        :fullName => name,
        :type => :class,
        :icon => Icons::class_icon(cls) + "-redirect",
        :url => "#!/api/" + cls[:name],
        :meta => combine_meta(cls),
        :sort => 2,
      }
    end

    def member_node(member, cls)
      return {
        :name => member[:name],
        :fullName => cls[:name] + "." + member[:name],
        :icon => "icon-" + member[:tagname].to_s,
        :url => "#!/api/" + cls[:name] + "-" + member[:id],
        :meta => combine_meta(member),
        :sort => 3,
      }
    end

    def guide_node(guide)
      return {
        :name => guide["title"],
        :fullName => "guide: " + guide["title"],
        :icon => "icon-guide",
        :url => "#!/guide/" + guide["name"],
        :meta => {},
        :sort => 4,
      }
    end

    def video_node(video)
      return {
        :name => video["title"],
        :fullName => "video: " + video["title"],
        :icon => "icon-video",
        :url => "#!/video/" + video["name"],
        :meta => {},
        :sort => 4,
      }
    end

    def example_node(example)
      return {
        :name => example["title"],
        :fullName => "example: " + example["title"],
        :icon => "icon-example",
        :url => "#!/example/" + example["name"],
        :meta => {},
        :sort => 4,
      }
    end

    # Add data for builtin tags with signatures to :meta field.
    def combine_meta(hash)
      meta = {}
      TagRegistry.signatures.each do |s|
        name = s[:tagname]
        meta[name] = hash[name] if hash[name]
      end
      meta
    end

    # Some alias types are shown differently.
    # e.g. instead of "widget:" we show "xtype:"
    def alias_display_name(key)
      titles = {
        "widget" => "xtype",
        "plugin" => "ptype",
        "feature" => "ftype",
      }
      titles[key] || key
    end

  end

end
Loading