diff options
Diffstat (limited to 'src/plugins/xml')
| -rw-r--r-- | src/plugins/xml/XmlOutput.cpp | 63 | ||||
| -rw-r--r-- | src/plugins/xml/XmlOutput.hpp | 2 | 
2 files changed, 49 insertions, 16 deletions
diff --git a/src/plugins/xml/XmlOutput.cpp b/src/plugins/xml/XmlOutput.cpp index 85885bc..8af29fd 100644 --- a/src/plugins/xml/XmlOutput.cpp +++ b/src/plugins/xml/XmlOutput.cpp @@ -16,6 +16,8 @@      along with this program.  If not, see <http://www.gnu.org/licenses/>.  */ +#include <cassert> +  #include "XmlOutput.hpp"  #include <core/common/Variant.hpp> @@ -94,7 +96,7 @@ static std::string toString(Variant v, bool pretty)  	if (v.isString()) {  		return v.asString();  	} else { -		return VariantWriter::writeJsonToString(v, pretty); +		return VariantWriter::writeOusiaToString(v, pretty);  	}  } @@ -142,20 +144,35 @@ void XmlTransformer::transformChildren(DocumentEntity *parentEntity,  			    Rooted<Element>{new Element(mgr, parent, fieldDesc->getName())};  			parent->addChild(par);  		} -		for (auto c : field) { -			// transform each child. -			Rooted<Node> child; -			if (c->isa(&RttiTypes::StructuredEntity)) { -				child = transformStructuredEntity( -				    par, c.cast<StructuredEntity>(), logger, pretty); -			} else if (c->isa(&RttiTypes::DocumentPrimitive)) { -				child = transformPrimitive(par, c.cast<DocumentPrimitive>(), -				                           logger, pretty); -			} else { -				child = transformAnchor(par, c.cast<Anchor>(), logger, pretty); +		if (!fieldDesc->isPrimitive()) { +			for (auto c : field) { +				// transform each child. +				Rooted<Element> child; +				if (c->isa(&RttiTypes::StructuredEntity)) { +					child = transformStructuredEntity( +					    par, c.cast<StructuredEntity>(), logger, pretty); +				} else { +					assert(c->isa(&RttiTypes::Anchor)); +					child = +					    transformAnchor(par, c.cast<Anchor>(), logger, pretty); +				} +				if (child != nullptr) { +					par->addChild(child); +				} +			} + +		} else { +			// if the field is primitive we expect a single child. +			if (field.empty()) { +				continue;  			} -			if (child != nullptr) { -				par->addChild(child); +			assert(field.size() == 1); +			assert(field[0]->isa(&RttiTypes::DocumentPrimitive)); +			Rooted<DocumentPrimitive> prim = field[0].cast<DocumentPrimitive>(); +			// transform the primitive content. +			Rooted<Text> text = transformPrimitive(par, fieldDesc->getPrimitiveType(), prim, logger, pretty); +			if(text != nullptr){ +				par->addChild(text);  			}  		}  	} @@ -216,12 +233,28 @@ Rooted<Element> XmlTransformer::transformAnchor(Handle<Element> parent,  }  Rooted<Text> XmlTransformer::transformPrimitive(Handle<Element> parent, +                                                Handle<Type> type,                                                  Handle<DocumentPrimitive> p,                                                  Logger &logger, bool pretty)  {  	Manager &mgr = parent->getManager();  	// transform the primitive content. -	Rooted<Text> text{new Text(mgr, parent, toString(p->getContent(), pretty))}; +	Variant content = p->getContent(); +	if(!type->build(content, logger)){ +		return nullptr; +	} +	// special treatment for struct types because they get built as arrays, +	// which is not so nice for output purposes. +	if(type->isa(&RttiTypes::StructType)){ +		Variant::mapType map; +		Variant::arrayType arr = content.asArray(); +		size_t a = 0; +		for(Handle<Attribute> attr : type.cast<StructType>()->getAttributes()){ +			map.emplace(attr->getName(), arr[a++]); +		} +		content = std::move(map); +	} +	Rooted<Text> text{new Text(mgr, parent, toString(content, pretty))};  	return text;  }  } diff --git a/src/plugins/xml/XmlOutput.hpp b/src/plugins/xml/XmlOutput.hpp index 24f2d49..d0caf62 100644 --- a/src/plugins/xml/XmlOutput.hpp +++ b/src/plugins/xml/XmlOutput.hpp @@ -53,7 +53,7 @@ private:  	Rooted<Element> transformAnchor(Handle<Element> parent, Handle<Anchor> a,  	                                Logger &logger, bool pretty); -	Rooted<Text> transformPrimitive(Handle<Element> parent, +	Rooted<Text> transformPrimitive(Handle<Element> parent,Handle<Type> type,  	                                Handle<DocumentPrimitive> p, Logger &logger,  	                                bool pretty);  | 
