Commit 9cee9e54 authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Producing print version using phantomjs.

Good news: no more duplicated code for rendering class docs.

Bad news: It's really-really slow at the moment.
parent 60689a17
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@ require 'jsduck/search_data'
require 'jsduck/relations'
require 'jsduck/aliases'
require 'jsduck/exporter'
require 'jsduck/renderer'
require 'jsduck/timer'
require 'jsduck/parallel_wrap'
require 'jsduck/logger'
@@ -169,6 +170,13 @@ module JsDuck
          JsonDuck.write_jsonp(filename, cls[:name].gsub(/\./, "_"), data)
        end
      end
      # Print export: needs to be done non-parallel
      if @opts.seo
        renderer = Renderer.new(@opts)
        @relations.classes.each do |cls|
          renderer.write(exporter.export(cls))
        end
      end
    end

    # Writes formatted HTML source code for each input file
+6 −0
Original line number Diff line number Diff line
@@ -26,6 +26,12 @@ module JsDuck
      File.open(filename, 'w') {|f| f.write(self.generate(data)) }
    end

    # Like write_jsonp, but instead of function call, writes assignment to a variable
    def self.write_assignment(filename, variable_name, data)
      jsonp = variable_name + "=" + self.generate(data) + ";"
      File.open(filename, 'w') {|f| f.write(jsonp) }
    end

    # Generates JSON from object
    def self.generate(data)
      @@pretty ? JSON.pretty_generate(data) : JSON.generate(data)

lib/jsduck/renderer.rb

0 → 100644
+25 −0
Original line number Diff line number Diff line
module JsDuck

  # Ruby-side implementation of class docs Renderer.
  # Uses PhantomJS to run Docs.Renderer JavaScript.
  class Renderer
    def initialize(opts)
      @opts = opts
      @basedir = @opts.output_dir + "/output-print"
      @tmp_filename = @basedir + "/data.js"
    end

    def write(classData)
      FileUtils.mkdir(@basedir) unless File.exists?(@basedir)
      # Write JSON to a file
      JsonDuck.write_assignment(@tmp_filename, "window.jsonData", classData)
      # Read it in with phantomJS and feed to Docs.Renderer
      html = IO.read("|phantomjs #{@opts.output_dir}/renderer.js #{@opts.output_dir}/print.html")
      # Write resulting HTML
      File.open("#{@basedir}/#{classData[:name]}.html", "w") {|f| f.write(html) }
      # clean up temporary file
      FileUtils.rm(@tmp_filename)
    end
  end

end
+3 −49
Original line number Diff line number Diff line
<?php

function format_members($title, $type, $members) {
  $html = '<div id="m-' . $type . '"><div class="definedBy">Defined By</div>';
  $html .=   '<h3 class="members-title">' . $title . '</h3>';
  $html .=   '<div class="subsection">';
  foreach ($members as $idx => $property) {
    $html .= '<div id="' . $property["tagname"] . '-' . $property["name"] . '" class="member open' . ($idx == 0 ? ' first-child' : '') . '">';
    $html .= '  <a class="side expandable"><span>&nbsp;</span></a>';
    $html .= '  <div class="title">';
    $html .= '    <div class="meta">';
    $html .= '      <a href="#!/api/' . $property["owner"] . '" class="definedIn">' . $property["owner"] . '</a>';
    $html .= '    </div>';
    $html .= '    <a href="#!/api/' . $property["owner"] . '-' . $property["tagname"] . '-' . $property["name"] . '" class="name">';
    $html .=        $property["name"];
    $html .=     '</a><span> : ' . $property["params"] . '</span>';
    $html .= '  </div>';
    $html .= '  <div class="description long">' . $property["doc"] . '</div>';
    $html .= '</div>';
  }
  $html .=   '</div>';
  $html .= '</div>';
  return $html;
}

function format_class($cls) {
  $html = "<h1>" . $cls["name"] . "</h1>";
  $html .= $cls["doc"];
  $html .= '<div class="members">';

  $sections = array(
    "cfg" => "Configs",
    "property" => "Properties",
    "method" => "Methods",
    "event" => "Events",
  );
  foreach ($sections as $key => $title) {
    if ($cls["members"][$key]) {
      $html .= format_members("Instance ".$title, $key, $cls["members"][$key]);
    }
    if ($cls["statics"][$key]) {
      $html .= format_members("Static ".$title, $key, $cls["statics"][$key]);
    }
  }

  $html .= '</div>';
  return $html;
}

function print_page($title, $body) {
  $html = file_get_contents('print-template.html');
  echo preg_replace(array('/\{title}/', '/\{body}/'), array($title, $body), $html);
@@ -75,8 +28,9 @@ if (isset($_GET["_escaped_fragment_"]) || isset($_GET["print"])) {
  $fragment = $_GET["_escaped_fragment_"] ? $_GET["_escaped_fragment_"] : $_GET["print"];
  try {
    if (preg_match('/^\/api\/([^-]+)/', $fragment, $m)) {
      $json = decode_file("output/".$m[1].".js");
      print_page($json["name"], format_class($json));
      $className = $m[1];
      $html = file_get_contents("output-print/".$className.".html");
      print_page($className, "<h1>" . $className . "</h1>\n" . $html);
    }
    elseif (preg_match('/^\/api\/?$/', $fragment, $m)) {
      print_index_page();

template/print.html

0 → 100644
+12 −0
Original line number Diff line number Diff line
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Print</title>
    <script type="text/javascript" src="extjs/ext-all.js"></script>
    <script type="text/javascript" src="app/Renderer.js"></script>
</head>
<body>

</body>
</html>
Loading