37#ifndef DRAIN_UTILS_XML
38#define DRAIN_UTILS_XML
41#include "SelectorXML.h"
58 template <
typename TX>
60 TX &
setType(TX & tree,
const typename TX::node_data_t::xml_tag_t & type){
65 template <
typename TX,
typename ...TT>
66 static TX& setTypeAndID(TX &tree,
const typename TX::node_data_t::xml_tag_t &type,
const TT & ...args);
76 typedef typename N::xml_default_elem_map_t map_t;
77 const typename map_t::const_iterator it = N::xml_default_elems.find(parentNode.getNativeType());
78 if (it != N::xml_default_elems.end()){
82 return static_cast<typename N::xml_tag_t
>(0);
93 if (
static_cast<int>(type) != 0){
106 template <
typename T>
114 assignNode(dst.data, src);
124 template <
typename TX>
126 TX &
assign(TX & dst,
const typename TX::xml_node_t & src){
127 assignNode(dst.data, src);
136 template <
typename T,
typename V>
147 template <
typename T>
150 T &
assign(T & tree, std::initializer_list<std::pair<const char *,const Variable> > l){
153 switch (tree->getType()){
155 for (
const auto & entry: l){
156 T & elem = tree[entry.first];
157 elem->setType(XML::STYLE_SELECT);
162 tree->setType(XML::STYLE_SELECT);
164 case XML::STYLE_SELECT:
181 template <
typename TX>
184 if (tree->isUndefined()){
185 tree->setType(XML::CTEXT);
191 template <
typename TX>
193 TX & appendString(TX & tree,
const std::string & s){
194 if (tree->isCText()){
198 else if (tree->isUndefined()){
199 tree->setType(XML::CTEXT);
206 TX & child = tree.addChild();
207 child->setType(XML::CTEXT);
214 template <
typename N>
216 DRAIN_XML_TREE(N) & getHeaderObject(DRAIN_XML_TREE(N) & root,
typename N::xml_tag_t tag,
217 const typename DRAIN_XML_TREE(N)::path_elem_t & key =
typename DRAIN_XML_TREE(N)::path_elem_t()){
219 const typename DRAIN_XML_TREE(N)::path_elem_t & finalKey = !key.empty() ? key : Enum<typename N::xml_tag_t>::getKey(tag);
221 if (!root.hasChild(finalKey)){
222 DRAIN_XML_TREE(N) & child = root.prependChild(finalKey);
227 return root[finalKey];
231 template <
typename N>
233 DRAIN_XML_TREE(N) & appendHeaderObject(DRAIN_XML_TREE(N) & root,
typename N::xml_tag_t tag,
234 const typename DRAIN_XML_TREE(N)::path_elem_t & key =
typename DRAIN_XML_TREE(N)::path_elem_t()){
236 const typename DRAIN_XML_TREE(N)::path_elem_t & finalKey = !key.empty() ? key : Enum<typename N::xml_tag_t>::getKey(tag);
238 if (!root.hasChild(finalKey)){
239 DRAIN_XML_TREE(N) & child = root.add(finalKey);
244 return root[finalKey];
289 template <
typename T>
292 if (elem->typeIs(T::node_data_t::xml_tag_t::STYLE)){
296 return getHeaderObject(elem, T::node_data_t::xml_tag_t::STYLE);
321 template <
typename T,
typename S>
323 T &
ensureStyle(T & elem,
const S & selector,
const std::initializer_list<std::pair<const char *,const Variable> > & styleDef){
329 if (styleEntry.empty()){
330 styleEntry = styleDef;
342template<
typename TX,
typename ...TT>
344TX& UtilsXML::setTypeAndID(TX &tree,
const typename TX::node_data_t::xml_tag_t &type,
const TT & ...args) {
368#define DRAIN_XML_DEFAULT_INIT(xml_tree) template <> inline void xml_tree::initChild(xml_tree & child) const { UtilsXML::initChildWithDefaultType(*this, child); }
385#define DRAIN_XML_EASY_TYPE(xml_tree) template <> template <> inline xml_tree & xml_tree::operator()(const xml_tree::node_data_t::tag_t & type){ return UtilsXML::setType(*this, type); }
Definition SelectorXML.h:75
Definition StringBuilder.h:58
Functions for manipulating XML structures.
Definition UtilsXML.h:49
static T & assign(T &tree, std::initializer_list< std::pair< const char *, const Variable > > l)
Tree.
Definition UtilsXML.h:150
static T & assign(T &tree, const V &arg)
Assign property to a XML tree node.
Definition UtilsXML.h:138
static T & assign(T &dst, const T &src)
Assign another tree structure to another.
Definition UtilsXML.h:108
static N::xml_tag_t retrieveDefaultType(const N &parentNode)
Find node type (tag id) from a predefined list of default types for (some) parent types.
Definition UtilsXML.h:75
static TX & setType(TX &tree, const typename TX::node_data_t::xml_tag_t &type)
Definition UtilsXML.h:60
static T & ensureStyleElem(T &elem)
If element is of type STYLE, return it. If not, return header object of type STYLE.
Definition UtilsXML.h:291
static TX & assign(TX &dst, const typename TX::xml_node_t &src)
Copy node data to tree.
Definition UtilsXML.h:126
static TX & assignString(TX &tree, const std::string &s)
When assigning a string, create new element unless the element itself is of type CTEXT.
Definition UtilsXML.h:183
static T & ensureStyle(T &elem, const S &selector, const std::initializer_list< std::pair< const char *, const Variable > > &styleDef)
Definition UtilsXML.h:323
static bool initChildWithDefaultType(const T &tree, T &child)
Definition UtilsXML.h:91