X-Git-Url: https://harishankar.org/repos/?p=biaweb2.git;a=blobdiff_plain;f=biawebdocument.hpp;h=40b0207a6f92e698c13496e16638a6dc4f600598;hp=0c0b74ca33027d64b8043480156ade99a14b8a9c;hb=fe9a0fef0b31ee3b94b3e73b7e319087a49a3054;hpb=abd61eb094efbfca05e6fe0f1dd34a3e8e7de7a2 diff --git a/biawebdocument.hpp b/biawebdocument.hpp index 0c0b74c..40b0207 100644 --- a/biawebdocument.hpp +++ b/biawebdocument.hpp @@ -5,15 +5,14 @@ #include #include #include +#include #include +#include +#include #include "biawebutil.hpp" #include "biawebsidebar.hpp" +#include "biawebstrings.hpp" -// "discount" markdown library is a C library and hence requires to be wrapped in -// extern "C" -extern "C" { - #include -} // class to represent a biaweb document which can have a file name, title, description, // keywords, content and sidebar items namespace biaweb { @@ -36,9 +35,9 @@ namespace biaweb { bool is_index = false, std::time_t cdate= std::time(nullptr), std::time_t mdate = std::time(nullptr)) { - this->title = title; - this->meta_desc = meta_desc; - this->meta_keywords = meta_keywords; + this->title = escape_html (title); + this->meta_desc = escape_html (meta_desc); + this->meta_keywords = escape_html (meta_keywords); this->content = content; this->is_index = is_index; if (! is_index) @@ -86,8 +85,8 @@ namespace biaweb { return this->cdate; } - // output the document to HTML using the template - void output_to_html (std::string path); + // output the document to HTML using the templates in templatedir + void output_to_html (std::string templatedir, std::string path); // set the content portion of document as raw HTML content void set_content (std::string content) { @@ -99,11 +98,11 @@ namespace biaweb { void set_markdown_content (std::string str); void set_meta_keywords(std::string meta_keywords) { - this->meta_keywords = meta_keywords; + this->meta_keywords = escape_html (meta_keywords); } void set_meta_desc(std::string meta_desc) { - this->meta_desc = meta_desc; + this->meta_desc = escape_html (meta_desc); } void set_title(std::string title) { @@ -136,72 +135,38 @@ namespace biaweb { }; void Document::set_markdown_content (std::string str) { - // discount is a C library and it doesn't work well with C++ streams - // and there seems no way to get the output of any of these functions - // into an std::string. - // the only option seems to be to write the output of the markdown() - // function to a temporary working file and then read it back into C++ - // with the normal std::ifstream and feed it into the std::string - // till a cleaner solution can be found. - MMIOT *doc; - doc = mkd_string (str.c_str(), str.size(), 0); - FILE *f = fopen (".biaweb.tmp", "w"); - markdown (doc, f, 0); - fclose (f); - std::ifstream ftmp (".biaweb.tmp"); - std::string tmpl ( (std::istreambuf_iterator (ftmp)), - (std::istreambuf_iterator ()) - ); - - while (! ftmp.eof ()) - { - std::string line; - ftmp >> line; - tmpl.append (line); - tmpl.append (" "); - } - ftmp.close (); - remove (".biaweb.tmp"); - this->content.append (tmpl); - mkd_cleanup (doc); + this->content = convert_to_markdown (str); } - void Document::output_to_html (std::string path) + void Document::output_to_html (std::string templatedir, std::string path) { - std::ifstream tpl; - tpl.open ("templates/main.tpl.html", std::ios_base::openmode::_S_in); - std::string main_tpl ( (std::istreambuf_iterator (tpl)), + std::ifstream tpl (templatedir + "/main.tpl.html"); + std::string templstr ( (std::istreambuf_iterator (tpl)), (std::istreambuf_iterator ()) ); tpl.close (); + std::ifstream style (templatedir + "/style.tpl.css"); + std::string stylesheet ( (std::istreambuf_iterator (style)), + (std::istreambuf_iterator ())); + style.close (); // first render the sidebars std::string sidebartext; for (SideBar bar : sidebars) { - sidebartext += bar.to_html (); + sidebartext += bar.to_html (templatedir); } - char ctm_str[100], mtm_str[100]; - std::time_t creat = this->cdate; - std::time_t modif = this->cdate; - std::strftime (ctm_str, sizeof (ctm_str), - "%d %b %Y, %H:%M", std::localtime (&creat)); - std::strftime (mtm_str, sizeof (mtm_str), - "%d %b %Y, %H:%M", std::localtime (&modif)); - - // Allocate enough space for the output buffer - std::unique_ptr final_templ( - new char[main_tpl.size()+ - this->title.size()+ - this->content.size() + - this->meta_desc.size() + - this->meta_keywords.size () + - 200 + - sidebartext.size()]); - std::sprintf (final_templ.get (), main_tpl.c_str(), this->title.c_str(), - ctm_str, mtm_str, - this->content.c_str(), sidebartext.c_str()); + std::string outputhtml = fmt::format (templstr, + fmt::arg ("title", this->title), + fmt::arg ("keywords", this->meta_keywords), + fmt::arg ("stylesheet", stylesheet), + fmt::arg ("description", this->meta_desc), + fmt::arg ("cdate", *std::localtime (&this->cdate)), + fmt::arg ("mdate", *std::localtime (&this->mdate)), + fmt::arg ("contents", this->content), + fmt::arg ("sidebar", sidebartext) + ); std::ofstream f (path + "/" + this->filename + ".html"); - f << final_templ.get (); + f << outputhtml; f.close (); } }