You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by je...@apache.org on 2012/12/21 23:08:39 UTC

[2/2] git commit: THRIFT-1799 Option to generate HTML in "standalone mode" Patch: Jens Geyer

THRIFT-1799 Option to generate HTML in "standalone mode"
Patch: Jens Geyer


Project: http://git-wip-us.apache.org/repos/asf/thrift/repo
Commit: http://git-wip-us.apache.org/repos/asf/thrift/commit/c880b44c
Tree: http://git-wip-us.apache.org/repos/asf/thrift/tree/c880b44c
Diff: http://git-wip-us.apache.org/repos/asf/thrift/diff/c880b44c

Branch: refs/heads/master
Commit: c880b44c5d81ade7ceb897fd55af94c0a8e5b31a
Parents: 5bcf32b
Author: Jens Geyer <je...@apache.org>
Authored: Fri Dec 21 23:07:29 2012 +0100
Committer: Jens Geyer <je...@apache.org>
Committed: Fri Dec 21 23:07:29 2012 +0100

----------------------------------------------------------------------
 compiler/cpp/src/generate/t_html_generator.cc |  104 ++++++++++++++------
 1 files changed, 75 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/thrift/blob/c880b44c/compiler/cpp/src/generate/t_html_generator.cc
----------------------------------------------------------------------
diff --git a/compiler/cpp/src/generate/t_html_generator.cc b/compiler/cpp/src/generate/t_html_generator.cc
index 3633e62..59993ea 100644
--- a/compiler/cpp/src/generate/t_html_generator.cc
+++ b/compiler/cpp/src/generate/t_html_generator.cc
@@ -48,6 +48,11 @@ class t_html_generator : public t_generator {
     (void) parsed_options;
     (void) option_string;  
     out_dir_base_ = "gen-html";
+    
+    std::map<std::string, std::string>::const_iterator iter;
+    iter = parsed_options.find("standalone");
+    standalone_ = (iter != parsed_options.end());
+    
     escape_.clear();
     escape_['&']  = "&amp;";
     escape_['<']  = "&lt;";
@@ -63,7 +68,10 @@ class t_html_generator : public t_generator {
          std::vector<t_program*>& finished);
   void generate_index();
   void generate_css();
-
+  void generate_css_content(std::ofstream & f_target);
+  void generate_style_tag();
+  std::string make_file_link( std::string name);
+  
   /**
    * Program-level generation functions
    */
@@ -80,7 +88,11 @@ class t_html_generator : public t_generator {
   void print_const_value(t_const_value* tvalue);
   void print_fn_args_doc(t_function* tfunction);
 
+ private:
   std::ofstream f_out_;
+  std::string  current_file_;
+ 
+  bool standalone_; 
 };
 
 /**
@@ -127,7 +139,7 @@ void t_html_generator::generate_program_toc_row(t_program* tprog) {
     vector<t_service*>::iterator sv_iter;
     for (sv_iter = services.begin(); sv_iter != services.end(); ++sv_iter) {
       string name = get_service_name(*sv_iter);
-      f_out_ << "<a href=\"" << fname << "#Svc_" << name << "\">" << name
+      f_out_ << "<a href=\"" << make_file_link(fname) << "#Svc_" << name << "\">" << name
         << "</a><br/>" << endl;
       f_out_ << "<ul>" << endl;
       map<string,string> fn_html;
@@ -135,7 +147,7 @@ void t_html_generator::generate_program_toc_row(t_program* tprog) {
       vector<t_function*>::iterator fn_iter;
       for (fn_iter = functions.begin(); fn_iter != functions.end(); ++fn_iter) {
         string fn_name = (*fn_iter)->get_name();
-        string html = "<li><a href=\"" + fname + "#Fn_" + name + "_" +
+        string html = "<li><a href=\"" + make_file_link(fname) + "#Fn_" + name + "_" +
           fn_name + "\">" + fn_name + "</a></li>";
         fn_html.insert(pair<string,string>(fn_name, html));
       }
@@ -153,9 +165,9 @@ void t_html_generator::generate_program_toc_row(t_program* tprog) {
     vector<t_enum*>::iterator en_iter;
     for (en_iter = enums.begin(); en_iter != enums.end(); ++en_iter) {
       string name = (*en_iter)->get_name();
-      // f_out_ << "<a href=\"" << fname << "#Enum_" << name << "\">" << name
+      // f_out_ << "<a href=\"" << make_file_link(fname) << "#Enum_" << name << "\">" << name
       // <<  "</a><br/>" << endl;
-      string html = "<a href=\"" + fname + "#Enum_" + name + "\">" + name +
+      string html = "<a href=\"" + make_file_link(fname) + "#Enum_" + name + "\">" + name +
         "</a>";
       data_types.insert(pair<string,string>(name, html));
     }
@@ -165,9 +177,9 @@ void t_html_generator::generate_program_toc_row(t_program* tprog) {
     vector<t_typedef*>::iterator td_iter;
     for (td_iter = typedefs.begin(); td_iter != typedefs.end(); ++td_iter) {
       string name = (*td_iter)->get_symbolic();
-      // f_out_ << "<a href=\"" << fname << "#Typedef_" << name << "\">" << name
+      // f_out_ << "<a href=\"" << make_file_link(fname) << "#Typedef_" << name << "\">" << name
       // << "</a><br/>" << endl;
-      string html = "<a href=\"" + fname + "#Typedef_" + name + "\">" + name +
+      string html = "<a href=\"" + make_file_link(fname) + "#Typedef_" + name + "\">" + name +
         "</a>";
       data_types.insert(pair<string,string>(name, html));
     }
@@ -177,9 +189,9 @@ void t_html_generator::generate_program_toc_row(t_program* tprog) {
     vector<t_struct*>::iterator o_iter;
     for (o_iter = objects.begin(); o_iter != objects.end(); ++o_iter) {
       string name = (*o_iter)->get_name();
-      //f_out_ << "<a href=\"" << fname << "#Struct_" << name << "\">" << name
+      //f_out_ << "<a href=\"" << make_file_link(fname) << "#Struct_" << name << "\">" << name
       //<< "</a><br/>" << endl;
-      string html = "<a href=\"" + fname + "#Struct_" + name + "\">" + name +
+      string html = "<a href=\"" + make_file_link(fname) + "#Struct_" + name + "\">" + name +
         "</a>";
       data_types.insert(pair<string,string>(name, html));
     }
@@ -195,7 +207,7 @@ void t_html_generator::generate_program_toc_row(t_program* tprog) {
     vector<t_const*>::iterator con_iter;
     for (con_iter = consts.begin(); con_iter != consts.end(); ++con_iter) {
       string name = (*con_iter)->get_name();
-      string html ="<code><a href=\"" + fname + "#Const_" + name +
+      string html ="<code><a href=\"" + make_file_link(fname) + "#Const_" + name +
         "\">" + name + "</a></code>";
       const_html.insert(pair<string,string>(name, html));
     }
@@ -214,14 +226,15 @@ void t_html_generator::generate_program_toc_row(t_program* tprog) {
 void t_html_generator::generate_program() {
   // Make output directory
   MKDIR(get_out_dir().c_str());
-  string fname = get_out_dir() + program_->get_name() + ".html";
+  current_file_ =  program_->get_name() + ".html";
+  string fname = get_out_dir() + current_file_;
   f_out_.open(fname.c_str());
   f_out_ << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"" << endl;
   f_out_ << "    \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" << endl;
   f_out_ << "<html xmlns=\"http://www.w3.org/1999/xhtml\">" << endl;
   f_out_ << "<head>" << endl;
   f_out_ << "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />" << endl;
-  f_out_ << "<link href=\"style.css\" rel=\"stylesheet\" type=\"text/css\"/>" << endl;
+  generate_style_tag();
   f_out_ << "<title>Thrift module: " << program_->get_name()
    << "</title></head><body>" << endl
    << "<div class=\"container-fluid\">" << endl
@@ -293,15 +306,16 @@ void t_html_generator::generate_program() {
   generate_css();
 }
 
+
 /**
  * Emits the index.html file for the recursive set of Thrift programs
  */
 void t_html_generator::generate_index() {
-  string index_fname = get_out_dir() + "index.html";
+  current_file_ = "index.html";
+  string index_fname = get_out_dir() + current_file_;
   f_out_.open(index_fname.c_str());
   f_out_ << "<html><head>" << endl;
-  f_out_ << "<link href=\"style.css\" rel=\"stylesheet\" type=\"text/css\"/>"
-   << endl;
+  generate_style_tag();
   f_out_ << "<title>All Thrift declarations</title></head><body>"
    << endl << "<div class=\"container-fluid\">"
    << endl << "<h1>All Thrift declarations</h1>" << endl;
@@ -315,18 +329,48 @@ void t_html_generator::generate_index() {
 }
 
 void t_html_generator::generate_css() {
-  string css_fname = get_out_dir() + "style.css";
-  f_out_.open(css_fname.c_str());
-  f_out_ << BOOTSTRAP_CSS() << endl;
-  f_out_ << "/* Auto-generated CSS for generated Thrift docs */" << endl;
-  f_out_ << "h3, h4 { margin-bottom: 6px; }" << endl;
-  f_out_ << "div.definition { border: 1px solid #CCC; margin-bottom: 10px; padding: 10px; }" << endl;
-  f_out_ << "div.extends { margin: -0.5em 0 1em 5em }" << endl;
-  f_out_ << "td { vertical-align: top; }" << endl;
-  f_out_ << "table { empty-cells: show; }" << endl;
-  f_out_ << "code { line-height: 20px; }" << endl;
-  f_out_ << ".table-bordered th, .table-bordered td { border-bottom: 1px solid #DDDDDD; }" << endl;
-  f_out_.close();
+  if( ! standalone_) {
+    current_file_ = "style.css";
+    string css_fname = get_out_dir() + current_file_;
+    f_out_.open(css_fname.c_str());
+    generate_css_content( f_out_);
+    f_out_.close();
+  }
+}
+
+
+void t_html_generator::generate_css_content(std::ofstream & f_target) {
+  f_target << BOOTSTRAP_CSS() << endl;
+  f_target << "/* Auto-generated CSS for generated Thrift docs */" << endl;
+  f_target << "h3, h4 { margin-bottom: 6px; }" << endl;
+  f_target << "div.definition { border: 1px solid #CCC; margin-bottom: 10px; padding: 10px; }" << endl;
+  f_target << "div.extends { margin: -0.5em 0 1em 5em }" << endl;
+  f_target << "td { vertical-align: top; }" << endl;
+  f_target << "table { empty-cells: show; }" << endl;
+  f_target << "code { line-height: 20px; }" << endl;
+  f_target << ".table-bordered th, .table-bordered td { border-bottom: 1px solid #DDDDDD; }" << endl;
+}
+
+/**
+ * Generates the CSS tag. 
+ * Depending on "standalone", either a CSS file link (default), or the entire CSS is embedded inline.
+ */
+void t_html_generator::generate_style_tag() {
+  if( ! standalone_) {
+    f_out_ << "<link href=\"style.css\" rel=\"stylesheet\" type=\"text/css\"/>" << endl;
+  } else {
+    f_out_ << "<style type=\"text/css\"/><!--" << endl;
+    generate_css_content( f_out_);
+    f_out_ << "--></style>" << endl;
+  } 
+}
+
+/**
+ * Returns the target file for a <a href> link 
+ * The returned string is empty, whenever filename refers to the current file.
+ */
+std::string t_html_generator::make_file_link( std::string filename) {
+  return (current_file_.compare(filename) != 0)  ?  filename  :  "";
 }
 
 /**
@@ -693,5 +737,7 @@ void t_html_generator::generate_service(t_service* tservice) {
   }
 }
 
-THRIFT_REGISTER_GENERATOR(html, "HTML", "")
-
+THRIFT_REGISTER_GENERATOR(html, "HTML",
+"    standalone:      Self-contained mode, includes all CSS in the HTML files.\n"
+"                     Generates no style.css file, but HTML files will be larger.\n"
+)