#include #include #include "BBDocument.h" namespace bbcpp { BBNode::BBNode(NodeType nodeType, const std::string& name) : _name(name), _nodeType(nodeType) { // nothing to do } BBText &BBDocument::newText(const std::string &text) { // first try to append this text to the item on top of the stack // if that is a BBText object, if not, then see if the last element // pushed to BBDocument is a text item, and if so append this to that // text if (_stack.size() > 0 && _stack.top()->getChildren().size() > 0) { auto totalChildCnt = _stack.top()->getChildren().size(); auto textnode = _stack.top()->getChildren().at(totalChildCnt - 1)->downCast(false); if (textnode) { textnode->append(text); return *textnode; } } else if (_children.size() > 0) { auto textnode = _children.back()->downCast(false); if (textnode) { textnode->append(text); return *textnode; } } // ok, there was no previous text element so we wil either add this text // element as a child of the top item OR we'll add it to the BBDocucment // object auto textNode = std::make_shared(text); if (_stack.size() > 0) { _stack.top()->appendChild(textNode); } else { // add this node to the document-node if needed appendChild(textNode); } return *textNode; } BBElement& BBDocument::newElement(const std::string &name) { auto newNode = std::make_shared(name); if (_stack.size() > 0) { _stack.top()->appendChild(newNode); } else { // add this node to the document-node if needed appendChild(newNode); } _stack.push(newNode); return *newNode; } BBElement& BBDocument::newClosingElement(const std::string& name) { auto newNode = std::make_shared(name, BBElement::CLOSING); if (_stack.size() > 0) { _stack.top()->appendChild(newNode); _stack.pop(); } else { appendChild(newNode); } return *newNode; } BBElement& BBDocument::newKeyValueElement(const std::string& name, const ParameterMap& pairs) { auto newNode = std::make_shared(name, BBElement::PARAMETER); if (_stack.size() > 0) { _stack.top()->appendChild(newNode); } else { // add this node to the document-node if needed appendChild(newNode); } for (const auto& kv : pairs) { newNode->setOrAddParameter(kv.first, kv.second); } _stack.push(newNode); return *newNode; } } // namespace