X-Git-Url: https://harishankar.org/repos/?p=biaweb2.git;a=blobdiff_plain;f=biawebdocument.hpp;h=221bc4f09b1273e2042f45317cbe958e5f5111dc;hp=40b0207a6f92e698c13496e16638a6dc4f600598;hb=26b38b4a38c24955293a7144f1e1d74676601caf;hpb=fe9a0fef0b31ee3b94b3e73b7e319087a49a3054 diff --git a/biawebdocument.hpp b/biawebdocument.hpp index 40b0207..221bc4f 100644 --- a/biawebdocument.hpp +++ b/biawebdocument.hpp @@ -48,6 +48,15 @@ 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 whether this is the index document void set_index (bool index = true) { this->is_index = index; @@ -134,16 +143,59 @@ 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; + std::getline (infile, line); + while (! infile.eof ()) { + contents.append (line + "\n"); + std::getline (infile, line); + } + this->set_markdown_content (contents); + } + void Document::set_markdown_content (std::string str) { this->content = convert_to_markdown (str); } + // output the document using the provided template void Document::output_to_html (std::string templatedir, std::string path) { + // read the main template file std::ifstream tpl (templatedir + "/main.tpl.html"); std::string templstr ( (std::istreambuf_iterator (tpl)), (std::istreambuf_iterator ()) ); tpl.close (); + // read the style template file std::ifstream style (templatedir + "/style.tpl.css"); std::string stylesheet ( (std::istreambuf_iterator (style)), (std::istreambuf_iterator ())); @@ -154,13 +206,19 @@ namespace biaweb { sidebartext += bar.to_html (templatedir); } + // 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 ("contents", this->content), fmt::arg ("sidebar", sidebartext) );