From aaa41cd0953b5fb1f38b10b586a4f33dec178bef Mon Sep 17 00:00:00 2001 From: Stephan Sundermann Date: Wed, 9 Oct 2013 18:04:47 +0200 Subject: [PATCH] fixup: added copy-node metadata tag --- parser/gapi-fixup.cs | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/parser/gapi-fixup.cs b/parser/gapi-fixup.cs index 67a9d82bb..9203fb30a 100644 --- a/parser/gapi-fixup.cs +++ b/parser/gapi-fixup.cs @@ -1,8 +1,11 @@ // gapi-fixup.cs - xml alteration engine. // -// Author: Mike Kestner +// Authors: +// Mike Kestner +// Stephan Sundermann // // Copyright (c) 2003 Mike Kestner +// Copyright (c) 2013 Stephan Sundermann // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public @@ -92,6 +95,26 @@ namespace GtkSharp.Parsing { XPathNavigator meta_nav = meta_doc.CreateNavigator (); XPathNavigator api_nav = api_doc.CreateNavigator (); + XPathNodeIterator copy_iter = meta_nav.Select ("/metadata/copy-node"); + while (copy_iter.MoveNext ()) { + string path = copy_iter.Current.GetAttribute ("path", String.Empty); + XPathExpression expr = api_nav.Compile (path); + string parent = copy_iter.Current.Value; + XPathNodeIterator parent_iter = api_nav.Select (parent); + bool matched = false; + while (parent_iter.MoveNext ()) { + XmlNode parent_node = ((IHasXmlNode)parent_iter.Current).GetNode (); + XPathNodeIterator path_iter = parent_iter.Current.Clone ().Select (expr); + while (path_iter.MoveNext ()) { + XmlNode node = ((IHasXmlNode)path_iter.Current).GetNode (); + parent_node.AppendChild (node.Clone ()); + } + matched = true; + } + if (!matched) + Console.WriteLine ("Warning: matched no nodes", path); + } + XPathNodeIterator rmv_iter = meta_nav.Select ("/metadata/remove-node"); while (rmv_iter.MoveNext ()) { string path = rmv_iter.Current.GetAttribute ("path", "");