Changed the rendering code for templating output
[biaweb2.git] / biawebdocument.hpp
index f001373..40b0207 100644 (file)
@@ -5,15 +5,14 @@
 #include <string>
 #include <list>
 #include <memory>
+#include <iomanip>
 #include <ctime>
+#include <fmt/format.h>
+#include <fmt/chrono.h>
 #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 <mkdio.h>
-}
 // class to represent a biaweb document which can have a file name, title, description, 
 // keywords, content and sidebar items
 namespace biaweb {
@@ -36,12 +35,12 @@ 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)
+            if (is_index)
                 this->filename = convert_title (title);
             else 
                 this->filename = "index";
@@ -52,6 +51,8 @@ namespace biaweb {
         // set whether this is the index document
         void set_index (bool index = true) {
             this->is_index = index; 
+            index == true ? this->filename = "index" : 
+                            this->filename = convert_title (this->title);
         }
 
         // get whether this is the index document
@@ -59,6 +60,11 @@ namespace biaweb {
             return this->is_index;
         }
 
+        // get the file name
+        std::string get_filename () {
+            return this->filename;
+        }
+
         // set the document modification date
         void set_modified_date (std::time_t modif) {
             this->mdate = modif;
@@ -79,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) {
@@ -92,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) {
@@ -129,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<char> (ftmp)),
-                            (std::istreambuf_iterator<char> ())
-                                );
-
-        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<char> (tpl)),
+        std::ifstream tpl (templatedir + "/main.tpl.html");
+        std::string templstr ( (std::istreambuf_iterator<char> (tpl)),
                                 (std::istreambuf_iterator<char> ()) );
         tpl.close ();
+        std::ifstream style (templatedir + "/style.tpl.css");
+        std::string stylesheet ( (std::istreambuf_iterator<char> (style)),
+                                (std::istreambuf_iterator<char> ()));
+        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<char[]> 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 ();
     }
 }