From b2f1b7373a35d5bbc686ea78f365ccce3333f7c1 Mon Sep 17 00:00:00 2001
From: Odilitime <janesmith@airmail.cc>
Date: Thu, 24 Aug 2017 00:52:30 -0700
Subject: [PATCH] detect context-type, plain/text support

---
 src/WebResource.cpp | 16 +++++++++++++++-
 src/WebResource.h   |  3 ++-
 src/main.cpp        | 37 +++++++++++++++++++++++++++++--------
 3 files changed, 46 insertions(+), 10 deletions(-)

diff --git a/src/WebResource.cpp b/src/WebResource.cpp
index a6619ff5..81c33d70 100644
--- a/src/WebResource.cpp
+++ b/src/WebResource.cpp
@@ -16,6 +16,8 @@ namespace {
     // only used for local files atm
     std::map<std::string, ResourceType> strToRT = {
         {"html", ResourceType::HTML},
+        {"txt", ResourceType::TXT},
+        {"text", ResourceType::TXT},
         {"css", ResourceType::CSS},
         {"js", ResourceType::JS}
     };
@@ -114,7 +116,19 @@ WebResource getOnlineWebResource(URL const& url) {
             returnRes.raw = "Unsupported status code";
         } else {
             // TODO: Set resourceType based on Content-Type field.
-            returnRes.resourceType = ResourceType::HTML;
+            std::string contentType = "";
+            if (response.properties.find("Content-type") != response.properties.end()) {
+                contentType = response.properties.at("Content-type");
+            }
+            if (response.properties.find("Content-Type") != response.properties.end()) {
+                contentType = response.properties.at("Content-Type");
+            }
+            std::cout << "Content-type: " << contentType << std::endl;
+            if (contentType == "text/plain") {
+                returnRes.resourceType = ResourceType::TXT;
+            } else {
+                returnRes.resourceType = ResourceType::HTML;
+            }
             returnRes.raw = std::move(response.body);
         }
     });
diff --git a/src/WebResource.h b/src/WebResource.h
index 759fe314..64b8cd02 100644
--- a/src/WebResource.h
+++ b/src/WebResource.h
@@ -8,7 +8,8 @@ enum class ResourceType {
     INVALID,
     HTML,
     CSS,
-    JS
+    JS,
+    TXT
 };
 
 struct WebResource {
diff --git a/src/main.cpp b/src/main.cpp
index 6052c079..daee3e74 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -23,14 +23,35 @@ bool setWindowContent(URL const& url) {
     }
     
     // parse HTML
-    HTMLParser parser;
-    const std::clock_t begin = clock();
-    std::shared_ptr<Node> rootNode = parser.parse(res.raw);
-    const std::clock_t end = clock();
-    logDebug() << "main::setWindowContent - Parsed document in: " << std::fixed << ((static_cast<double>(end - begin)) / CLOCKS_PER_SEC) << std::scientific << " seconds" << std::endl;
-    
-    // send NodeTree to window
-    window->setDOM(rootNode);
+    if (res.resourceType == ResourceType::HTML) {
+        HTMLParser parser;
+        const std::clock_t begin = clock();
+        std::shared_ptr<Node> rootNode = parser.parse(res.raw);
+        const std::clock_t end = clock();
+        logDebug() << "main::setWindowContent - Parsed document in: " << std::fixed << ((static_cast<double>(end - begin)) / CLOCKS_PER_SEC) << std::scientific << " seconds" << std::endl;
+        
+        // send NodeTree to window
+        window->setDOM(rootNode);
+    } else if (res.resourceType == ResourceType::TXT) {
+        std::cout << "Rendering text document" << std::endl;
+        std::shared_ptr<Node> rootNode = std::make_shared<Node>(NodeType::ROOT);
+        std::shared_ptr<TagNode> tagNode = std::make_shared<TagNode>();
+        std::shared_ptr<TextNode> textNode = std::make_shared<TextNode>();
+        textNode->text = res.raw;
+        tagNode->tag="p";
+        
+        // bind text to tag
+        textNode->parent = tagNode;
+        tagNode->children.push_back(textNode);
+        
+        // bind tag to root
+        tagNode->parent = rootNode;
+        rootNode->children.push_back(tagNode);
+        // send NodeTree to window
+        window->setDOM(rootNode);
+    } else {
+        std::cout << "setWindowContent() - I don't know how to render non-html files" << std::endl;
+    }
     return true;
 }
 
-- 
GitLab