#include "TessesFramework/TessesFramework.hpp" using namespace Tesses::Framework::Streams; using namespace Tesses::Framework::Serialization; using namespace Tesses::Framework::TextStreams; Json::JToken Html2JToken(std::shared_ptr node) { if (node->isText) { return node->text_or_tag; } else { Json::JObject obj; obj.SetValue("Tag", node->text_or_tag); Json::JArray attrs; for (auto &item : node->attributes) { if (item.second) attrs.Add(Json::JObject( {{"Key", item.first}, {"Value", item.second.value()}})); else attrs.Add( Json::JObject({{"Key", item.first}, {"Value", nullptr}})); } obj.SetValue("Attributes", attrs); Json::JArray childern; for (auto &item : node->children) childern.Add(Html2JToken(item)); obj.SetValue("Children", childern); return obj; } } std::shared_ptr OpenWrite(std::string dest) { if (dest == "-") { return std::make_shared(stdout, false, "w"); } else { auto strm = std::make_shared(dest, "w"); if (!strm->CanWrite()) { return nullptr; } return strm; } } std::shared_ptr OpenRead(std::string src) { if (src == "-") { return std::make_shared(stdin, false, "r"); } else { auto strm = std::make_shared(src, "r"); if (!strm->CanRead()) { return nullptr; } return strm; } } int main(int argc, char **argv) { if (argc < 3) { std::cout << "USAGE: " << argv[0] << " SRC DEST" << std::endl; std::cout << "SRC: html file or - for stdin to convert to json doc" << std::endl; std::cout << "DEST: json file or - for stdout" << std::endl; return 0; } auto src = OpenRead(argv[1]); auto dest = OpenWrite(argv[2]); if (src == nullptr) { std::cerr << "ERROR: Input could not be read" << std::endl; return 1; } if (dest == nullptr) { std::cerr << "ERROR: Output could not be read" << std::endl; return 1; } StreamWriter writer(dest); auto html = Html::Parse(std::make_shared(src)); writer.WriteLine(Json::Json::Encode(Html2JToken(html))); return 0; }