From: Jens Geyer Date: Fri, 21 Dec 2012 22:07:29 +0000 (+0100) Subject: THRIFT-1799 Option to generate HTML in "standalone mode" X-Git-Tag: 0.9.1~220 X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=c880b44c5d81ade7ceb897fd55af94c0a8e5b31a;p=common%2Fthrift.git THRIFT-1799 Option to generate HTML in "standalone mode" Patch: Jens Geyer --- diff --git a/compiler/cpp/src/generate/t_html_generator.cc b/compiler/cpp/src/generate/t_html_generator.cc index 3633e623..59993eab 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::const_iterator iter; + iter = parsed_options.find("standalone"); + standalone_ = (iter != parsed_options.end()); + escape_.clear(); escape_['&'] = "&"; escape_['<'] = "<"; @@ -63,7 +68,10 @@ class t_html_generator : public t_generator { std::vector& 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::iterator sv_iter; for (sv_iter = services.begin(); sv_iter != services.end(); ++sv_iter) { string name = get_service_name(*sv_iter); - f_out_ << "" << name + f_out_ << "" << name << "
" << endl; f_out_ << "
    " << endl; map fn_html; @@ -135,7 +147,7 @@ void t_html_generator::generate_program_toc_row(t_program* tprog) { vector::iterator fn_iter; for (fn_iter = functions.begin(); fn_iter != functions.end(); ++fn_iter) { string fn_name = (*fn_iter)->get_name(); - string html = "
  • " + fn_name + "
  • "; fn_html.insert(pair(fn_name, html)); } @@ -153,9 +165,9 @@ void t_html_generator::generate_program_toc_row(t_program* tprog) { vector::iterator en_iter; for (en_iter = enums.begin(); en_iter != enums.end(); ++en_iter) { string name = (*en_iter)->get_name(); - // f_out_ << "" << name + // f_out_ << "" << name // << "
    " << endl; - string html = "" + name + + string html = "" + name + ""; data_types.insert(pair(name, html)); } @@ -165,9 +177,9 @@ void t_html_generator::generate_program_toc_row(t_program* tprog) { vector::iterator td_iter; for (td_iter = typedefs.begin(); td_iter != typedefs.end(); ++td_iter) { string name = (*td_iter)->get_symbolic(); - // f_out_ << "" << name + // f_out_ << "" << name // << "
    " << endl; - string html = "" + name + + string html = "" + name + ""; data_types.insert(pair(name, html)); } @@ -177,9 +189,9 @@ void t_html_generator::generate_program_toc_row(t_program* tprog) { vector::iterator o_iter; for (o_iter = objects.begin(); o_iter != objects.end(); ++o_iter) { string name = (*o_iter)->get_name(); - //f_out_ << "" << name + //f_out_ << "" << name //<< "
    " << endl; - string html = "" + name + + string html = "" + name + ""; data_types.insert(pair(name, html)); } @@ -195,7 +207,7 @@ void t_html_generator::generate_program_toc_row(t_program* tprog) { vector::iterator con_iter; for (con_iter = consts.begin(); con_iter != consts.end(); ++con_iter) { string name = (*con_iter)->get_name(); - string html ="" + name + ""; const_html.insert(pair(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_ << "" << endl; f_out_ << "" << endl; f_out_ << "" << endl; f_out_ << "" << endl; - f_out_ << "" << endl; + generate_style_tag(); f_out_ << "Thrift module: " << program_->get_name() << "" << endl << "
    " << 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_ << "" << endl; - f_out_ << "" - << endl; + generate_style_tag(); f_out_ << "All Thrift declarations" << endl << "
    " << endl << "

    All Thrift declarations

    " << 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_ << "" << endl; + } else { + f_out_ << "" << endl; + } +} + +/** + * Returns the target file for a 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" +)