diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/core/XML.cpp | 7 | ||||
-rw-r--r-- | src/core/XML.hpp | 23 | ||||
-rw-r--r-- | src/core/managed/Manager.cpp | 8 | ||||
-rw-r--r-- | src/core/model/Document.cpp | 157 | ||||
-rw-r--r-- | src/core/model/Document.hpp | 109 | ||||
-rw-r--r-- | src/plugins/html/DemoOutput.cpp | 36 |
6 files changed, 52 insertions, 288 deletions
diff --git a/src/core/XML.cpp b/src/core/XML.cpp index 7f03b35..affa75f 100644 --- a/src/core/XML.cpp +++ b/src/core/XML.cpp @@ -45,4 +45,11 @@ void Text::doSerialize(std::ostream &out, unsigned int tabdepth) out << text << '\n'; } } + +namespace RttiTypes { +const Rtti<xml::Node> XMLNode = RttiBuilder("XMLNode"); +const Rtti<xml::Element> XMLElement = + RttiBuilder("XMLElement").parent(&XMLNode).composedOf(&XMLNode); +const Rtti<xml::Text> XMLText = RttiBuilder("XMLText").parent(&XMLNode); +} } diff --git a/src/core/XML.hpp b/src/core/XML.hpp index b4b803d..25c8dae 100644 --- a/src/core/XML.hpp +++ b/src/core/XML.hpp @@ -45,6 +45,7 @@ #include <ostream> #include <vector> +#include <core/common/Rtti.hpp> #include <core/managed/Managed.hpp> #include <core/managed/ManagedContainer.hpp> @@ -101,19 +102,22 @@ public: * Additionally it might have other Nodes as children. */ class Element : public Node { +private: + ManagedVector<Node> children; + public: const std::string name; std::map<std::string, std::string> attributes; - ManagedVector<Node> children; Element(Manager &mgr, Handle<Element> parent, std::string name) - : Node(mgr, parent), name(std::move(name)) + : Node(mgr, parent), children(this), name(std::move(name)) { } Element(Manager &mgr, Handle<Element> parent, std::string name, std::map<std::string, std::string> attributes) : Node(mgr, parent), + children(this), name(std::move(name)), attributes(std::move(attributes)) { @@ -127,6 +131,15 @@ public: * */ void doSerialize(std::ostream &out, unsigned int tabdepth) override; + + const ManagedVector<Node> &getChildren() const { return children; } + + void addChild(Handle<Node> child) { children.push_back(child); } + + void addChildren(std::vector<Handle<Node>> c) + { + children.insert(children.end(), c.begin(), c.end()); + } }; class Text : public Node { @@ -145,5 +158,11 @@ public: void doSerialize(std::ostream &out, unsigned int tabdepth) override; }; } + +namespace RttiTypes { +extern const Rtti<xml::Node> XMLNode; +extern const Rtti<xml::Element> XMLElement; +extern const Rtti<xml::Text> XMLText; +} } #endif diff --git a/src/core/managed/Manager.cpp b/src/core/managed/Manager.cpp index 5428ea1..3950ce2 100644 --- a/src/core/managed/Manager.cpp +++ b/src/core/managed/Manager.cpp @@ -26,8 +26,9 @@ #if defined(MANAGER_DEBUG_PRINT) || defined(MANAGER_GRAPHVIZ_EXPORT) #include <iostream> #include <fstream> -#include "core/common/Rtti.hpp" -#include "core/model/Node.hpp" +#include <core/common/Rtti.hpp> +#include <core/model/Node.hpp> +#include <core/XML.hpp> #endif namespace ousia { @@ -598,6 +599,9 @@ void Manager::exportGraphviz(const char *filename) if (type.isa(RttiTypes::Node)) { name = dynamic_cast<const Node *>(objectPtr)->getName(); } + if (type.isa(RttiTypes::XMLElement)) { + name = dynamic_cast<const xml::Element *>(objectPtr)->name; + } // Print the node uintptr_t p = reinterpret_cast<uintptr_t>(objectPtr); diff --git a/src/core/model/Document.cpp b/src/core/model/Document.cpp index 5386525..912a04e 100644 --- a/src/core/model/Document.cpp +++ b/src/core/model/Document.cpp @@ -89,163 +89,6 @@ NodeVector<StructuredEntity> &DocumentEntity::getField( "node."); } -/* Class StructuredEntity */ - -static Rooted<Descriptor> resolveDescriptor(std::vector<Handle<Domain>> domains, - const std::string &className, - const RttiBase &type) -{ - // iterate over all domains. - for (auto &d : domains) { - // use the actual resolve method. - std::vector<ResolutionResult> resolved = d->resolve(className, type); - // if we don't find anything, continue. - if (resolved.size() == 0) { - continue; - } - // Otherwise take the first valid result. - for (auto &r : resolved) { - return r.node.cast<Descriptor>(); - } - } - return {nullptr}; -} - -Rooted<StructuredEntity> StructuredEntity::buildRootEntity( - Handle<Document> document, std::vector<Handle<Domain>> domains, - const std::string &className, Variant attributes, std::string name) -{ - // If the parent is not set, we can not build the entity. - if (document == nullptr) { - return {nullptr}; - } - // If we can not find the correct descriptor, we can not build the entity - // either. - Rooted<Descriptor> descriptor = - resolveDescriptor(domains, className, RttiTypes::StructuredClass); - if (descriptor == nullptr) { - return {nullptr}; - } - // Then construct the StructuredEntity itself. - Rooted<StructuredEntity> root{new StructuredEntity( - document->getManager(), document, descriptor.cast<StructuredClass>(), - attributes, std::move(name))}; - // append it to the document. - document->setRoot(root); - // and return it. - return root; -} - -Rooted<StructuredEntity> StructuredEntity::buildEntity( - Handle<DocumentEntity> parent, std::vector<Handle<Domain>> domains, - const std::string &className, const std::string &fieldName, - Variant attributes, std::string name) -{ - // If the parent is not set, we can not build the entity. - if (parent == nullptr) { - return {nullptr}; - } - // If we can not find the correct descriptor, we can not build the entity - // either. - Rooted<Descriptor> descriptor = - resolveDescriptor(domains, className, RttiTypes::StructuredClass); - if (descriptor == nullptr) { - return {nullptr}; - } - // Then construct the StructuredEntity itself. - Rooted<StructuredEntity> entity{new StructuredEntity( - parent->getManager(), parent, descriptor.cast<StructuredClass>(), - attributes, std::move(name))}; - // if the field does not exist, return null handle as well. - if (!parent->hasField(fieldName)) { - return {nullptr}; - } - // append the new entity to the right field. - if (!parent->hasField(fieldName)) { - return {nullptr}; - } - NodeVector<StructuredEntity> &field = parent->getField(fieldName); - field.push_back(entity); - - // and return it. - return entity; -} - -/* Class DocumentPrimitive */ - -Rooted<DocumentPrimitive> DocumentPrimitive::buildEntity( - Handle<DocumentEntity> parent, Variant content, - const std::string &fieldName) -{ - // If the parent is not set, we can not build the entity. - if (parent == nullptr) { - return {nullptr}; - } - // Then construct the StructuredEntity itself. - Rooted<DocumentPrimitive> entity{ - new DocumentPrimitive(parent->getManager(), parent, content)}; - // if the field does not exist, return null handle as well. - if (!parent->hasField(fieldName)) { - return {nullptr}; - } - // append the new entity to the right field. - if (!parent->hasField(fieldName)) { - return {nullptr}; - } - NodeVector<StructuredEntity> &field = parent->getField(fieldName); - field.push_back(entity); - // and return it. - return entity; -} - -/* Class AnnotationEntity */ - -Rooted<AnnotationEntity::Anchor> AnnotationEntity::buildAnchor( - Handle<DocumentEntity> parent, std::string id, const std::string &fieldName) -{ - // If the parent is not set, we can not build the anchor. - if (parent == nullptr) { - return {nullptr}; - } - // Then construct the Anchor itself - Rooted<Anchor> anchor{ - new AnnotationEntity::Anchor(parent->getManager(), parent, id)}; - // append the new entity to the right field. - if (!parent->hasField(fieldName)) { - return {nullptr}; - } - NodeVector<StructuredEntity> &field = parent->getField(fieldName); - field.push_back(anchor); - // and return it. - return anchor; -} - -Rooted<AnnotationEntity> AnnotationEntity::buildEntity( - Handle<Document> parent, std::vector<Handle<Domain>> domains, - const std::string &className, Handle<AnnotationEntity::Anchor> start, - Handle<AnnotationEntity::Anchor> end, Variant attributes, std::string name) -{ - // If the parent is not set, we can not build the AnnotationEntity. - if (parent == nullptr) { - return {nullptr}; - } - // If we can not find the correct descriptor, we can not build the entity - // either. - Rooted<Descriptor> descriptor = - resolveDescriptor(domains, className, RttiTypes::AnnotationClass); - if (descriptor == nullptr) { - return {nullptr}; - } - // Then construct the AnnotationEntity itself - Rooted<AnnotationEntity> anno{new AnnotationEntity( - parent->getManager(), parent, descriptor.cast<AnnotationClass>(), - attributes, start, end, name)}; - // append the new entity to the document - parent->getAnnotations().push_back(anno); - // and return it. - return anno; -} - /* Class Document */ void Document::continueResolve(ResolutionState &state) diff --git a/src/core/model/Document.hpp b/src/core/model/Document.hpp index 466185b..c367e50 100644 --- a/src/core/model/Document.hpp +++ b/src/core/model/Document.hpp @@ -215,57 +215,6 @@ public: std::move(name)) { } - - /** - * This builds the root StructuredEntity for the given document. It - * automatically appends the newly build entity to the given document. - * - * @param document is the document this entity shall be build for. The - * resulting entity will automatically be appended to that - * document. Also the manager of that document will be - * used to register the new node. - * @param domains are the domains that are used to find the - * StructuredClass for the new node. The domains will be - * searched in the given order. - * @param className is the name of the StructuredClass. - * @param attributes are the attributes of the new node in terms of a Struct - * variant (empty per default). - * @param name is the name of this StructuredEntity (empty per - * default). - * @return the newly created StructuredEntity or a nullptr if some - * input handle was empty or the given domains did not - * contain a StructuredClass with the given name. - */ - static Rooted<StructuredEntity> buildRootEntity( - Handle<Document> document, std::vector<Handle<Domain>> domains, - const std::string &className, Variant attributes = Variant(), - std::string name = ""); - - /** - * This builds a StructuredEntity as child of the given DocumentEntity. It - * automatically appends the newly build entity to its parent. - * - * @param parent is the parent DocumentEntity. The newly constructed - * StructuredEntity will automatically be appended to it. - * @param domains are the domains that are used to find the - * StructuredClass for the new node. The domains will be - * searched in the given order. - * @param className is the name of the StructuredClass. - * @param fieldName is the name of the field where the newly constructed - * StructuredEntity shall be appended. - * @param attributes are the attributes of the new node in terms of a Struct - * variant (empty per default). - * @param name is the name of this StructuredEntity (empty per - * default). - * - * @return the newly created StructuredEntity or a nullptr if some - * input handle was empty or the given domains did not - * contain a StructuredClass with the given name. - */ - static Rooted<StructuredEntity> buildEntity( - Handle<DocumentEntity> parent, std::vector<Handle<Domain>> domains, - const std::string &className, const std::string &fieldName = "", - Variant attributes = Variant(), std::string name = ""); }; /** @@ -284,25 +233,6 @@ public: Variant getContent() const { return getAttributes(); } // TODO: Override such methods like "getField" to disable them? - - /** - * This builds a DocumentPrimitive as child of the given DocumentEntity. It - * automatically appends the newly build entity to its parent. - * - * @param parent is the parent DocumentEntity. The newly constructed - * DocumentPrimitive will automatically be appended to it. - * @param content is the primitive content of the new node in terms of a - * Struct variant. - * @param fieldName is the name of the field where the newly constructed - * StructuredEntity shall be appended. - * - * @return the newly created StructuredEntity or a nullptr if some - * input handle was empty or the given domains did not - * contain a StructuredClass with the given name. - */ - static Rooted<DocumentPrimitive> buildEntity( - Handle<DocumentEntity> parent, Variant content, - const std::string &fieldName = ""); }; /** @@ -365,45 +295,6 @@ public: Rooted<Anchor> getStart() { return start; } Rooted<Anchor> getEnd() { return end; } - - /** - * This builds an Anchor as child of the given DocumentEntity. It - * automatically appends the newly build Anchor to its parent. - * - * @param parent is the parent DocumentEntity. The newly constructed - * Anchor will automatically be appended to it. - * @param id is the id of this Anchor. - * @param fieldName is the name of the field where the newly constructed - * Anchor shall be appended. - * - * @return the newly created Anchor or a nullptr if some - * input handle was empty. - */ - static Rooted<Anchor> buildAnchor(Handle<DocumentEntity> parent, - std::string id, - const std::string &fieldName = ""); - /** - * This builds an AnnotationEntity as child of the given DocumentEntity. It - * automatically appends the newly build entity to its parent. - * - * @param parent is the document the newly constructed AnnotationEntity - * will be appended to. - * @param domains are the domains that are used to find the - * AnnotationClass for the new node. The domains will be - * searched in the given order. - * @param className is the name of the AnnotationClass. - * @param attributes are the attributes of the new node in terms of a Struct - * variant (empty per default). - * @param name is the name of this AnnotationEntity (empty per - * default). - * @return the newly created AnnotationEntity or a nullptr if some - * input handle was empty or the given domains did not - * contain a AnnotationClass with the given name. - */ - static Rooted<AnnotationEntity> buildEntity(Handle<Document> parent, std::vector<Handle<Domain>> domains, - const std::string &className, - Handle<Anchor> start, Handle<Anchor> end, - Variant attributes = Variant(), std::string name = ""); }; /** diff --git a/src/plugins/html/DemoOutput.cpp b/src/plugins/html/DemoOutput.cpp index 3bd5918..5413b1f 100644 --- a/src/plugins/html/DemoOutput.cpp +++ b/src/plugins/html/DemoOutput.cpp @@ -37,7 +37,7 @@ void DemoHTMLTransformer::writeHTML(Handle<model::Document> doc, mgr, {nullptr}, "html", {{"xlmns", "http://www.w3.org/1999/xhtml"}}}}; // add the head Element Rooted<xml::Element> head{new xml::Element{mgr, html, "head"}}; - html->children.push_back(head); + html->addChild(head); // add the meta element. Rooted<xml::Element> meta{ new xml::Element{mgr, @@ -45,15 +45,15 @@ void DemoHTMLTransformer::writeHTML(Handle<model::Document> doc, "meta", {{"http-equiv", "Content-Type"}, {"content", "text/html; charset=utf-8"}}}}; - head->children.push_back(meta); + head->addChild(meta); // add the title Element with Text Rooted<xml::Element> title{new xml::Element{mgr, head, "title"}}; - head->children.push_back(title); - title->children.push_back( + head->addChild(title); + title->addChild( new xml::Text(mgr, title, "Test HTML Output for " + doc->getName())); // add the body Element Rooted<xml::Element> body{new xml::Element{mgr, html, "body"}}; - html->children.push_back(body); + html->addChild(body); // So far was the "preamble". No we have to get to the document content. @@ -75,7 +75,7 @@ void DemoHTMLTransformer::writeHTML(Handle<model::Document> doc, // transform the book node. Rooted<xml::Element> book = transformSection(body, root, startMap, endMap); // add it as child to the body node. - body->children.push_back(book); + body->addChild(book); // After the content has been transformed, we serialize it. html->serialize( @@ -138,14 +138,14 @@ Rooted<xml::Element> DemoHTMLTransformer::transformSection( break; } Rooted<xml::Element> h{new xml::Element{mgr, sec, headingclass}}; - sec->children.push_back(h); + sec->addChild(h); // extract the heading text, enveloped in a paragraph Element. Rooted<xml::Element> h_content = transformParagraph(h, heading, startMap, endMap); // We omit the paragraph Element and add the children directly to the // heading Element - for (auto &n : h_content->children) { - h->children.push_back(n); + for (auto &n : h_content->getChildren()) { + h->addChild(n); } } @@ -169,7 +169,7 @@ Rooted<xml::Element> DemoHTMLTransformer::transformSection( child = transformSection(sec, n, startMap, endMap); } if (!child.isNull()) { - sec->children.push_back(child); + sec->addChild(child); } } return sec; @@ -189,14 +189,14 @@ Rooted<xml::Element> DemoHTMLTransformer::transformList( if (itDescrName == "item") { // create the list item. Rooted<xml::Element> li{new xml::Element{mgr, l, "li"}}; - l->children.push_back(li); + l->addChild(li); // extract the item text, enveloped in a paragraph Element. Rooted<xml::Element> li_content = transformParagraph(li, item, startMap, endMap); // We omit the paragraph Element and add the children directly to // the list item - for (auto &n : li_content->children) { - li->children.push_back(n); + for (auto &n : li_content->getChildren()) { + li->addChild(n); } } } @@ -220,7 +220,7 @@ static Rooted<xml::Element> openAnnotation( } // create the new XML element representing the annotation Rooted<xml::Element> tmp{new xml::Element{mgr, current, elemName}}; - current->children.push_back(tmp); + current->addChild(tmp); // and return it. return tmp; } @@ -265,14 +265,14 @@ Rooted<xml::Element> DemoHTMLTransformer::transformParagraph( Rooted<model::StructuredEntity> heading = par->getField("heading")[0]; // put the heading in a strong xml::Element. Rooted<xml::Element> strong{new xml::Element{mgr, p, "strong"}}; - p->children.push_back(strong); + p->addChild(strong); // extract the heading text, enveloped in a paragraph Element. Rooted<xml::Element> h_content = transformParagraph(strong, heading, startMap, endMap); // We omit the paragraph Element and add the children directly to the // heading Element - for (auto &n : h_content->children) { - strong->children.push_back(n); + for (auto &n : h_content->getChildren()) { + strong->addChild(n); } } @@ -346,7 +346,7 @@ Rooted<xml::Element> DemoHTMLTransformer::transformParagraph( // here we need to do some escaping with the string content. std::string escaped = escapePredefinedEntities(primitive->getContent().asString()); - current->children.push_back(new xml::Text(mgr, current, escaped)); + current->addChild(new xml::Text(mgr, current, escaped)); } } return p; |