diff options
Diffstat (limited to 'src/plugins')
| -rw-r--r-- | src/plugins/css/CSSParser.hpp | 10 | ||||
| -rw-r--r-- | src/plugins/html/DemoOutput.cpp | 185 | ||||
| -rw-r--r-- | src/plugins/html/DemoOutput.hpp | 85 | 
3 files changed, 279 insertions, 1 deletions
| diff --git a/src/plugins/css/CSSParser.hpp b/src/plugins/css/CSSParser.hpp index 6d84dbf..1ec54f5 100644 --- a/src/plugins/css/CSSParser.hpp +++ b/src/plugins/css/CSSParser.hpp @@ -15,7 +15,15 @@      You should have received a copy of the GNU General Public License      along with this program.  If not, see <http://www.gnu.org/licenses/>.  */ - +/** + * @file CSSParser.hpp + * + * Contains the classes needed to transform a CSS string to a CSS SelectorTree + * with attached RuleSets. The details are explained in the class + * documentations. + * + * @author Benjamin Paassen - bpaassen@techfak.uni-bielefeld.de + */  #ifndef _OUSIA_CSS_PARSER_HPP_  #define _OUSIA_CSS_PARSER_HPP_ diff --git a/src/plugins/html/DemoOutput.cpp b/src/plugins/html/DemoOutput.cpp new file mode 100644 index 0000000..463a5d2 --- /dev/null +++ b/src/plugins/html/DemoOutput.cpp @@ -0,0 +1,185 @@ +/* +    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 <http://www.gnu.org/licenses/>. +*/ + +#include <core/common/Exceptions.hpp> +#include <core/common/Rtti.hpp> + +#include "DemoOutput.hpp" + +namespace ousia { +namespace html { + +void DemoHTMLTransformer::writeHTML(Handle<model::Document> doc, +                                    std::ostream &out) +{ +	// write preamble +	out << "<?xml version=\" 1.0 \"?>\n"; +	out << "<html>\n"; +	out << "\t<head>\n"; +	out << "\t\t<title>Test HTML Output for " << doc->getName() << "</title>\n"; +	out << "\t</head>\n"; +	out << "\t<body>\n"; + +	// look for the book root node. +	Rooted<model::StructuredEntity> 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</body>\n"; +	out << "</html>\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<model::StructuredEntity> 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; +	} +	// check if we have a heading. +	if (sec->hasField("heading")) { +		Rooted<model::StructuredEntity> heading = sec->getField("heading")[0]; +		out << "\t\t"; +		switch (type) { +			case SectionType::BOOK: +				out << "<h1>"; +				break; +			case SectionType::CHAPTER: +				out << "<h2>"; +				break; +			case SectionType::SECTION: +				out << "<h3>"; +				break; +			case SectionType::SUBSECTION: +				out << "<h4>"; +				break; +			case SectionType::NONE: +				// this can not happen; +				break; +		} +		// the second field marks the heading. So let's write it. +		writeParagraph(heading, out, false); +		// close the heading tag. +		switch (type) { +			case SectionType::BOOK: +				out << "</h1>"; +				break; +			case SectionType::CHAPTER: +				out << "</h2>"; +				break; +			case SectionType::SECTION: +				out << "</h3>"; +				break; +			case SectionType::SUBSECTION: +				out << "</h4>"; +				break; +			case SectionType::NONE: +				// this can not happen; +				break; +		} +		out << "\n"; +	} + +	// then write the section content recursively. +	NodeVector<model::StructuredEntity> mainField = sec->getField(); +	for (auto &n : mainField) { +		/* +		 * 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<model::StructuredEntity> par, +                                         std::ostream &out, bool writePTags) +{ +	// validate descriptor. +	if (par->getDescriptor()->getName() != "paragraph") { +		throw OusiaException("Expected paragraph!"); +	} +	// check if we have a heading. +	if (par->hasField("heading")) { +		Rooted<model::StructuredEntity> heading = par->getField("heading")[0]; +		// start the heading tag +		out << "\t\t<h5>"; +		// the second field marks the heading. So let's write it. +		writeParagraph(heading, out, false); +		// close the heading tag. +		out << "</h5>\n"; +	} +	// write start tag +	if (writePTags) { +		out << "\t\t<p>"; +	} +	// write content +	// TODO: What about emphasis? +	for (auto &text : par->getField()) { +		if (text->getDescriptor()->getName() != "text") { +			throw OusiaException("Expected text!"); +		} +		Handle<model::DocumentPrimitive> primitive = +		    text->getField()[0].cast<model::DocumentPrimitive>(); +		if (primitive.isNull()) { +			throw OusiaException("Text field is not primitive!"); +		} +		out << primitive->getContent().asString(); +	} +	// write end tag +	if (writePTags) { +		out << "</p>\n"; +	} +} +} +} diff --git a/src/plugins/html/DemoOutput.hpp b/src/plugins/html/DemoOutput.hpp new file mode 100644 index 0000000..ca9bcd2 --- /dev/null +++ b/src/plugins/html/DemoOutput.hpp @@ -0,0 +1,85 @@ +/* +    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 <http://www.gnu.org/licenses/>. +*/ + +/** + * @file DemoOutput.hpp + * + * This implements a Demo HTML output for the following domains: + * * book + * * headings + * * emphasis + * * lists + * + * @author Benjamin Paassen - bpaassen@techfak.uni-bielefeld.de + */ +#ifndef _OUSIA_HTML_DEMO_OUTPUT_HPP_ +#define _OUSIA_HTML_DEMO_OUTPUT_HPP_ + +#include <ostream> + +#include <core/model/Document.hpp> + +namespace ousia { +namespace html { + +class DemoHTMLTransformer { +private: +	/** +	 * This method is to be called recursively to write a chapter, section or +	 * subsection to HTML. +	 */ +	void writeSection(Handle<model::StructuredEntity> sec, std::ostream& out); +	/** +	 * This method is to be called recursively to write a paragraph to HTML. +	 */ +	void writeParagraph(Handle<model::StructuredEntity> par, std::ostream& out, +	                    bool writePTags = true); +	/** +	 * This method is to be called recursively to write a list to HTML. +	 * TODO: Implement +	 */ +//	void writeList(Handle<StructuredEntity> sec, std::ostream& out, +//	               int tabdepth); + +	//TODO: Implement emphasis. + +public: +	/** +	 * This writes a HTML representation of the given document to the given +	 * output stream. Note that this method lacks the generality of our Ousia +	 * approach with respect to two important points: +	 * 1.) It hardcodes the dependency to a certain set of domains in the C++ +	 *     code. +	 * 2.) It does not use the proposed pipeline of first copying the document +	 *     graph, then attaching style attributes and then transforming it to a +	 *     specific output format but does all of these steps at once. +	 * 3.) It does not use different transformers for the different domains but +	 *     does all transformations at once. +	 * Therefore this is not an adequate model of our algorithms but only a +	 * Demo. +	 * +	 * @param doc is a Document using concepts of the book, headings, emphasis +	 *            and lists domains but no other. +	 * @param out is the output stream the data shall be written to. +	 */ +	void writeHTML(Handle<model::Document> doc, std::ostream& out); +}; +} +} + +#endif | 
