class JsDuck::Web::Source

Writes HTML JavaScript/SCSS source into HTML files.

Public Class Methods

new(source_files) click to toggle source
# File lib/jsduck/web/source.rb, line 10
def initialize(source_files)
  @source_files = source_files
end

Public Instance Methods

write(destination) click to toggle source

Writes all source files as HTML files into destination dir.

# File lib/jsduck/web/source.rb, line 15
def write(destination)
  generate_html_filenames

  FileUtils.mkdir(destination)
  Util::Parallel.each(@source_files) do |file|
    Logger.log("Writing source", file.html_filename)
    write_single(destination + "/" + file.html_filename, file.to_html)
  end
end

Private Instance Methods

generate_html_filenames() click to toggle source

Generates unique HTML filenames for each file.

Can't be done in parallel for obvious reasons, but also because file.html_filename= method updates all the doc-objects related to the file.

# File lib/jsduck/web/source.rb, line 32
def generate_html_filenames
  filenames = {}
  @source_files.each do |file|
    i = 0
    begin
      name = html_filename(file.filename, i)
      ci_name = name.downcase # case insensitive name
      i += 1
    end while filenames.has_key?(ci_name)
    filenames[ci_name] = true
    file.html_filename = name
  end
end
html_filename(filename, nr=0) click to toggle source

Returns HTML filename for n'th file with given name.

html_filename(“Foo.js”, 0) => “Foo.html” html_filename(“Foo.js”, 1) => “Foo2.html” html_filename(“Foo.js”, 2) => “Foo3.html”

# File lib/jsduck/web/source.rb, line 52
def html_filename(filename, nr=0)
  ::File.basename(filename, ".js") + (nr > 0 ? (nr+1).to_s : "") + ".html"
end
wrap_page(source) click to toggle source

Returns source wrapped inside HTML page

# File lib/jsduck/web/source.rb, line 61
      def wrap_page(source)
        return <<-EOHTML
<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>The source code</title>
  <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />
  <script type="text/javascript" src="../resources/prettify/prettify.js"></script>
  <style type="text/css">
    .highlight { display: block; background-color: #ddd; }
  </style>
  <script type="text/javascript">
    function highlight() {
      document.getElementById(location.hash.replace(/#/, "")).className = "highlight";
    }
  </script>
</head>
<body onload="prettyPrint(); highlight();">
  <pre class="prettyprint lang-js">#{source}</pre>
</body>
</html>
      EOHTML
      end
write_single(filename, source) click to toggle source
# File lib/jsduck/web/source.rb, line 56
def write_single(filename, source)
  ::File.open(filename, 'w') {|f| f.write(wrap_page(source)) }
end