From 1f4b48537f52646f9e4d520c2b2c2425f3565fa2 Mon Sep 17 00:00:00 2001 From: Benjamin Paassen Date: Sun, 4 Jan 2015 17:41:53 +0100 Subject: first draft for HTML Demo Output (still a lot of todos). --- src/plugins/html/DemoOutput.cpp | 187 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 187 insertions(+) create mode 100644 src/plugins/html/DemoOutput.cpp (limited to 'src/plugins/html/DemoOutput.cpp') diff --git a/src/plugins/html/DemoOutput.cpp b/src/plugins/html/DemoOutput.cpp new file mode 100644 index 0000000..6b9b3a4 --- /dev/null +++ b/src/plugins/html/DemoOutput.cpp @@ -0,0 +1,187 @@ +/* + Ousía + Copyright (C) 2014 Benjamin Paaßen, Andreas Stöckel + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include + +#include "DemoOutput.hpp" + +namespace ousia { +namespace html { + +void DemoHTMLTransformer::writeHTML(Handle doc, + std::ostream &out) +{ + // write preamble + out << "\n"; + out << "\n"; + out << "\t\n"; + out << "\t\tTest HTML Output for" << doc->getName() << "\n"; + out << "\t\n"; + out << "\t\n"; + + // look for the book root node. + Rooted root = doc->getRoot(); + if (root->getDescriptor()->getName() != "book") { + throw OusiaException("The given documents root is no book node!"); + } + // write it to HTML. + writeSection(root, out); + // write end + out << "\t\n"; + out << "\n"; +} + +/** + * This is just for easier internal handling. + */ +enum class SectionType { BOOK, CHAPTER, SECTION, SUBSECTION, NONE }; + +SectionType getSectionType(const std::string &name) +{ + if (name == "book") { + return SectionType::BOOK; + } else if (name == "chapter") { + return SectionType::CHAPTER; + } else if (name == "section") { + return SectionType::SECTION; + } else if (name == "subsection") { + return SectionType::SUBSECTION; + } else { + return SectionType::NONE; + } +} + +void DemoHTMLTransformer::writeSection(Handle sec, + std::ostream &out) +{ + // check the section type. + SectionType type = getSectionType(sec->getDescriptor()->getName()); + if (type == SectionType::NONE) { + // if the input node is no section, we ignore it. + return; + } + // get the fields. + std::vector> &fields = sec->getFields(); + // check if we have a heading. + if (fields.size() > 1 && fields[1].size() > 0) { + out << "\t\t"; + switch (type) { + case SectionType::BOOK: + out << "

"; + break; + case SectionType::CHAPTER: + out << "

"; + break; + case SectionType::SECTION: + out << "

"; + break; + case SectionType::SUBSECTION: + out << "

"; + break; + case SectionType::NONE: + // this can not happen; + break; + } + // the second field marks the heading. So let's write it. + writeParagraph(fields[1][0], out, false); + // close the heading tag. + switch (type) { + case SectionType::BOOK: + out << "

"; + break; + case SectionType::CHAPTER: + out << ""; + break; + case SectionType::SECTION: + out << ""; + break; + case SectionType::SUBSECTION: + out << ""; + break; + case SectionType::NONE: + // this can not happen; + break; + } + out << "\n"; + } + + // then write the section content recursively. + for (auto &n : fields[0]) { + /* + * Strictly speaking this is the wrong mechanism, because we would have + * to make an "isa" call here because we can not rely on our knowledge + * that paragraphs can only be paragraphs or lists. There would have + * to be a listener structure of transformations that check if they can + * transform this specific node. + */ + std::string childDescriptorName = n->getDescriptor()->getName(); + if (childDescriptorName == "paragraph") { + writeParagraph(n, out); + // TODO: Implement + // } else if(childDescriptorName == "ul"){ + // writeList(n, out); + } else { + writeSection(n, out); + } + } +} + +void DemoHTMLTransformer::writeParagraph(Handle par, + std::ostream &out, bool writePTags) +{ + // validate descriptor. + if (par->getDescriptor()->getName() != "paragraph") { + throw OusiaException("Expected paragraph!"); + } + // get the fields. + std::vector> &fields = par->getFields(); + // write heading if its there. + // check if we have a heading. + if (fields.size() > 1 && fields[1].size() > 0) { + // start the heading tag + out << "\t\t
"; + // the second field marks the heading. So let's write it. + writeParagraph(fields[1][0], out, false); + // close the heading tag. + out << "
\n"; + } + // write start tag + if (writePTags) { + out << "\t\t

"; + } + // write content + // TODO: What about emphasis? + for (auto &text : fields[0]) { + if (text->getDescriptor()->getName() != "text") { + throw OusiaException("Expected text!"); + } + Handle primitive = + text->getFields()[0][0].cast(); + if (primitive == nullptr) { + throw OusiaException("Text field is not primitive!"); + } + out << primitive->getContent().asString(); + } + // write end tag + if (writePTags) { + out << "

\n"; + } +} +} +} -- cgit v1.2.3