summaryrefslogtreecommitdiff
path: root/eel/eel-xml-extensions.c
diff options
context:
space:
mode:
Diffstat (limited to 'eel/eel-xml-extensions.c')
-rw-r--r--eel/eel-xml-extensions.c199
1 files changed, 199 insertions, 0 deletions
diff --git a/eel/eel-xml-extensions.c b/eel/eel-xml-extensions.c
new file mode 100644
index 00000000..a2d3a3a2
--- /dev/null
+++ b/eel/eel-xml-extensions.c
@@ -0,0 +1,199 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+
+/* eel-xml-extensions.c - functions that extend mate-xml
+
+ Copyright (C) 2000 Eazel, Inc.
+
+ The Mate Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The Mate Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the Mate Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+
+ Authors: Darin Adler <[email protected]>
+*/
+
+#include <config.h>
+#include "eel-xml-extensions.h"
+
+#include "eel-string.h"
+#include "eel-i18n.h"
+#include <glib.h>
+
+#include <libxml/parser.h>
+#include <stdlib.h>
+
+xmlNodePtr
+eel_xml_get_children (xmlNodePtr parent)
+{
+ if (parent == NULL)
+ {
+ return NULL;
+ }
+ return parent->children;
+}
+
+xmlNodePtr
+eel_xml_get_root_children (xmlDocPtr document)
+{
+ return eel_xml_get_children (xmlDocGetRootElement (document));
+}
+
+xmlNodePtr
+eel_xml_get_child_by_name_and_property (xmlNodePtr parent,
+ const char *child_name,
+ const char *property_name,
+ const char *property_value)
+{
+ xmlNodePtr child;
+ xmlChar *property;
+ gboolean match;
+
+ if (parent == NULL)
+ {
+ return NULL;
+ }
+ for (child = eel_xml_get_children (parent); child != NULL; child = child->next)
+ {
+ if (strcmp (child->name, child_name) == 0)
+ {
+ property = xmlGetProp (child, property_name);
+ match = eel_strcmp (property, property_value) == 0;
+ xmlFree (property);
+ if (match)
+ {
+ return child;
+ }
+ }
+ }
+ return NULL;
+}
+
+/* return a child of the passed-in node with a matching name */
+
+xmlNodePtr
+eel_xml_get_child_by_name (xmlNodePtr parent,
+ const char *child_name)
+{
+ xmlNodePtr child;
+
+ if (parent == NULL)
+ {
+ return NULL;
+ }
+ for (child = eel_xml_get_children (parent); child != NULL; child = child->next)
+ {
+ if (strcmp (child->name, child_name) == 0)
+ {
+ return child;
+ }
+ }
+ return NULL;
+}
+
+
+xmlNodePtr
+eel_xml_get_root_child_by_name_and_property (xmlDocPtr document,
+ const char *child_name,
+ const char *property_name,
+ const char *property_value)
+{
+ return eel_xml_get_child_by_name_and_property
+ (xmlDocGetRootElement (document),
+ child_name,
+ property_name,
+ property_value);
+}
+
+/**
+ * eel_xml_get_property_for_children
+ *
+ * Returns a list of the values for the specified property for all
+ * children of the node that have the specified name.
+ *
+ * @parent: xmlNodePtr representing the node in question.
+ * @child_name: child element name to look for
+ * @property: name of propety to reutnr for matching children that have the property
+ *
+ * Returns: A list of keywords.
+ *
+ **/
+GList *
+eel_xml_get_property_for_children (xmlNodePtr parent,
+ const char *child_name,
+ const char *property_name)
+{
+ GList *properties;
+ xmlNode *child;
+ xmlChar *property;
+
+ properties = NULL;
+
+ for (child = eel_xml_get_children (parent);
+ child != NULL;
+ child = child->next)
+ {
+ if (strcmp (child->name, child_name) == 0)
+ {
+ property = xmlGetProp (child, property_name);
+ if (property != NULL)
+ {
+ properties = g_list_prepend (properties,
+ g_strdup (property));
+ xmlFree (property);
+ }
+ }
+ }
+
+ /* Reverse so you get them in the same order as the XML file. */
+ return g_list_reverse (properties);
+}
+
+xmlChar *
+eel_xml_get_property_translated (xmlNodePtr parent,
+ const char *property_name)
+{
+ xmlChar *property, *untranslated_property;
+ char *untranslated_property_name;
+ const char *translated_property;
+
+ /* Try for the already-translated version. */
+ property = xmlGetProp (parent, property_name);
+ if (property != NULL)
+ {
+ return property;
+ }
+
+ /* Try for the untranslated version. */
+ untranslated_property_name = g_strconcat ("_", property_name, NULL);
+ untranslated_property = xmlGetProp (parent, untranslated_property_name);
+ g_free (untranslated_property_name);
+ if (untranslated_property == NULL)
+ {
+ return NULL;
+ }
+
+ /* Try to translate. */
+ translated_property = gettext (untranslated_property);
+
+ /* If not translation is found, return untranslated property as-is. */
+ if (translated_property == (char *) untranslated_property)
+ {
+ return untranslated_property;
+ }
+
+ /* If a translation happened, make a copy to match the normal
+ * behavior of this function (returning a string you xmlFree).
+ */
+ xmlFree (untranslated_property);
+ return xmlStrdup (translated_property);
+}