X-Git-Url: https://harishankar.org/repos/?p=biaweb2.git;a=blobdiff_plain;f=biawebdocument.hpp;h=39721076dbe33eca14b68e7bf67e3b13e51788d5;hp=40b0207a6f92e698c13496e16638a6dc4f600598;hb=HEAD;hpb=fe9a0fef0b31ee3b94b3e73b7e319087a49a3054 diff --git a/biawebdocument.hpp b/biawebdocument.hpp index 40b0207..3972107 100644 --- a/biawebdocument.hpp +++ b/biawebdocument.hpp @@ -8,10 +8,11 @@ #include #include #include -#include #include "biawebutil.hpp" #include "biawebsidebar.hpp" #include "biawebstrings.hpp" +#include "biawebnavigationbit.hpp" +#include "biawebtemplate.hpp" // class to represent a biaweb document which can have a file name, title, description, // keywords, content and sidebar items @@ -24,7 +25,8 @@ namespace biaweb { std::string meta_desc; std::string meta_keywords; std::string content; - std::list sidebars; + std::list sidebars; + NavigationBit navbit; std::time_t cdate; std::time_t mdate; bool is_index; @@ -48,6 +50,20 @@ namespace biaweb { this->mdate = mdate; } + // Constructor to parse the document from a stream instead of manually creating it + // File should be of the format + // first line: title + // second line: Description + // third line: Keywords + // fourth line: (creation date) YYYY-MM-DD HH:II TZ format + // fourth line onwards: Markdown contents + Document (std::istream &file) ; + + // set the navigation bit + void set_navigation_bit (NavigationBit navbit) { + this->navbit = navbit; + } + // set whether this is the index document void set_index (bool index = true) { this->is_index = index; @@ -85,8 +101,8 @@ namespace biaweb { return this->cdate; } - // output the document to HTML using the templates in templatedir - void output_to_html (std::string templatedir, std::string path); + // output the document to HTML using the template specified + void output_to_html (Template *t, std::string path); // set the content portion of document as raw HTML content void set_content (std::string content) { @@ -134,33 +150,79 @@ namespace biaweb { } }; + // Parse and construct a document from a stream instead of individual fields + Document::Document (std::istream &infile) { + infile.seekg (0); + // parse the title, description, keywords, creation time and and contents + std::string title, description, keywords, creattime, contents; + // read the title + std::getline (infile, title); + if (infile.eof ()) return; + this->title = escape_html (title); + this->filename = convert_title (title); + // read description + std::getline (infile, description); + if (infile.eof ()) return; + this->meta_desc = escape_html (description); + // read the keywords + std::getline (infile, keywords); + if (infile.eof ()) return; + this->meta_keywords = escape_html (keywords); + // read the creation date/time and also set the modification time + // to creation date/time by default + std::getline (infile, creattime); + if (infile.eof ()) return; + std::stringstream s (creattime); + std::tm t; + s >> std::get_time (&t, DATE_IN_FORMAT); + if (s.fail ()) + std::cout << WARNING_PARSE_FAILED << this->filename << "\n"; + + this->cdate = mktime (&t); + this->mdate = this->cdate; + // read the rest of contents + std::string line; + while (! infile.eof ()) { + std::getline (infile, line); + contents.append (line + "\n"); + } + this->set_markdown_content (contents); + } + void Document::set_markdown_content (std::string str) { this->content = convert_to_markdown (str); } - void Document::output_to_html (std::string templatedir, std::string path) + // output the document using the provided template + void Document::output_to_html (Template *t, std::string path) { - 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 (); + std::string templstr = t->get_main_tpl (); + + // read the style template file + std::string stylesheet = t->get_style_tpl (); // first render the sidebars std::string sidebartext; for (SideBar bar : sidebars) { - sidebartext += bar.to_html (templatedir); + sidebartext += bar.to_html (t); } + // render the navigation bit + std::string navbit_str = this->navbit.to_html (t); + + // time of creation and modification + struct std::tm c, m; + c = *std::localtime (&this->cdate); + m = *std::localtime (&this->mdate); + + // format the template with the values 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 ("cdate", c), + fmt::arg ("mdate", m), + fmt::arg ("navbit", navbit_str), fmt::arg ("contents", this->content), fmt::arg ("sidebar", sidebartext) );