summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorMarc-André Lureau <marcandre.lureau@gmail.com>2013-01-11 16:55:04 +0100
committerMarc-André Lureau <marcandre.lureau@gmail.com>2013-01-11 16:55:04 +0100
commit70668336cc5ab2f7b8e695171fadae976a8bf1e3 (patch)
tree95ead7f324897595b7cba50bb915b2e40dfe53c6 /tools
parent22dd8fdf21f8ef2649ec696c52d0ca0997bb9883 (diff)
downloadmsitools-70668336cc5ab2f7b8e695171fadae976a8bf1e3.tar.gz
msitools-70668336cc5ab2f7b8e695171fadae976a8bf1e3.tar.xz
msitools-70668336cc5ab2f7b8e695171fadae976a8bf1e3.zip
wixl: preprocessor learn include
Diffstat (limited to 'tools')
-rw-r--r--tools/wixl/preprocessor.vala50
1 files changed, 42 insertions, 8 deletions
diff --git a/tools/wixl/preprocessor.vala b/tools/wixl/preprocessor.vala
index c825e35..460f46b 100644
--- a/tools/wixl/preprocessor.vala
+++ b/tools/wixl/preprocessor.vala
@@ -75,12 +75,7 @@ namespace Wixl {
return result + str[end:str.length];
}
- public Xml.Doc preprocess (string data, File? file) throws GLib.Error {
- Xml.Doc doc;
- var writer = new Xml.TextWriter.doc (out doc);
- var reader = new Xml.TextReader.for_doc (data, "");
-
- writer.start_document ();
+ void preprocess_xml (Xml.TextReader reader, Xml.TextWriter writer, File? file, bool is_include = false) throws GLib.Error {
while (reader.read () > 0) {
switch (reader.node_type ()) {
case Xml.ReaderType.PROCESSING_INSTRUCTION:
@@ -95,6 +90,14 @@ namespace Wixl {
} else
throw new Wixl.Error.FAILED ("invalid define");
break;
+ case "include":
+ var value = eval (reader.const_value (), file).strip ();
+ foreach (var inc in new string[] {
+ value,
+ file.get_parent ().get_child (value).get_path () })
+ if (include (inc, writer))
+ break;
+ break;
case "warning":
warning (eval (reader.const_value (), file));
break;
@@ -107,6 +110,9 @@ namespace Wixl {
break;
case Xml.ReaderType.ELEMENT:
var empty = reader.is_empty_element () > 0;
+ if (is_include && reader.depth () == 0 &&
+ reader.const_name () == "Include")
+ break;
writer.start_element (reader.const_name ());
while (reader.move_to_next_attribute () > 0) {
@@ -118,16 +124,44 @@ namespace Wixl {
writer.end_element ();
break;
case Xml.ReaderType.END_ELEMENT:
+ if (is_include && reader.depth () == 0 &&
+ reader.const_name () == "Include")
+ break;
+
writer.end_element ();
break;
case Xml.ReaderType.TEXT:
- writer.write_string (eval (reader.const_value(), file));
+ writer.write_string (eval (reader.const_value (), file));
break;
case Xml.ReaderType.CDATA:
- writer.write_cdata (eval (reader.const_value(), file));
+ writer.write_cdata (eval (reader.const_value (), file));
break;
}
}
+ }
+
+ bool include (string filename, Xml.TextWriter writer) throws GLib.Error {
+ string data;
+ var file = File.new_for_path (filename);
+
+ try {
+ FileUtils.get_contents (filename, out data);
+ } catch (GLib.FileError error) {
+ return false;
+ }
+
+ var reader = new Xml.TextReader.for_doc (data, "");
+ preprocess_xml (reader, writer, file, true);
+ return true;
+ }
+
+ public Xml.Doc preprocess (string data, File? file) throws GLib.Error {
+ Xml.Doc doc;
+ Xml.TextWriter writer = new Xml.TextWriter.doc (out doc);
+ var reader = new Xml.TextReader.for_doc (data, "");
+
+ writer.start_document ();
+ preprocess_xml (reader, writer, file);
writer.end_document ();
return doc;