/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * e-xml-utils.c * Copyright (C) 2000 Helix Code, Inc. * Author: Chris Lahey * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program 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 * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include #include "e-xml-utils.h" #include #include #include #include #include #include "gal/util/e-i18n.h" xmlNode * e_xml_get_child_by_name (const xmlNode *parent, const xmlChar *child_name) { xmlNode *child; g_return_val_if_fail (parent != NULL, NULL); g_return_val_if_fail (child_name != NULL, NULL); for (child = parent->childs; child != NULL; child = child->next) { if (xmlStrcmp (child->name, child_name) == 0) { return child; } } return NULL; } /* Returns the first child with the name child_name and the "lang" * attribute that matches the current LC_MESSAGES, or else, the first * child with the name child_name and no "lang" attribute. */ xmlNode * e_xml_get_child_by_name_by_lang (const xmlNode *parent, const xmlChar *child_name, const gchar *lang) { xmlNode *child; /* This is the default version of the string. */ xmlNode *C = NULL; g_return_val_if_fail (parent != NULL, NULL); g_return_val_if_fail (child_name != NULL, NULL); if (lang == NULL) { #ifdef HAVE_LC_MESSAGES lang = setlocale (LC_MESSAGES, NULL); #else lang = setlocale (LC_CTYPE, NULL); #endif } for (child = parent->childs; child != NULL; child = child->next) { if (xmlStrcmp (child->name, child_name) == 0) { xmlChar *this_lang = xmlGetProp (child, "lang"); if (this_lang == NULL) { C = child; } else if (xmlStrcmp(this_lang, "lang") == 0) { return child; } } } return C; } static xmlNode * e_xml_get_child_by_name_by_lang_list_with_score (const xmlNode *parent, const gchar *name, GList *lang_list, gint *best_lang_score) { xmlNodePtr best_node = NULL, node; for (node = parent->childs; node != NULL; node = node->next) { xmlChar *lang; if (node->name == NULL || strcmp (node->name, name) != 0) { continue; } lang = xmlGetProp (node, "xml:lang"); if (lang != NULL) { GList *l; gint i; for (l = lang_list, i = 0; l != NULL && i < *best_lang_score; l = l->next, i++) { if (strcmp ((gchar *) l->data, lang) == 0) { best_node = node; *best_lang_score = i; } } } else { if (best_node == NULL) { best_node = node; } } xmlFree (lang); if (*best_lang_score == 0) { return best_node; } } return best_node; } /* * e_xml_get_child_by_name_by_lang_list: * */ xmlNode * e_xml_get_child_by_name_by_lang_list (const xmlNode *parent, const gchar *name, GList *lang_list) { gint best_lang_score = INT_MAX; g_return_val_if_fail (parent != NULL, NULL); g_return_val_if_fail (name != NULL, NULL); if (lang_list == NULL) { lang_list = gnome_i18n_get_language_list ("LC_MESSAGES"); } return e_xml_get_child_by_name_by_lang_list_with_score (parent,name, lang_list, &best_lang_score); } /* * e_xml_get_child_by_name_no_lang * */ xmlNode * e_xml_get_child_by_name_no_lang (const xmlNode *parent, const gchar *name) { xmlNodePtr node; g_return_val_if_fail (parent != NULL, NULL); g_return_val_if_fail (name != NULL, NULL); for (node = parent->childs; node != NULL; node = node->next) { xmlChar *lang; if (node->name == NULL || strcmp (node->name, name) != 0) { continue; } lang = xmlGetProp (node, "xml:lang"); if (lang == NULL) { return node; } xmlFree (lang); } return NULL; } gint e_xml_get_integer_prop_by_name (const xmlNode *parent, const xmlChar *prop_name) { g_return_val_if_fail (parent != NULL, 0); g_return_val_if_fail (prop_name != NULL, 0); return e_xml_get_integer_prop_by_name_with_default (parent, prop_name, 0); } gint e_xml_get_integer_prop_by_name_with_default (const xmlNode *parent, const xmlChar *prop_name, gint def) { xmlChar *prop; gint ret_val = def; g_return_val_if_fail (parent != NULL, 0); g_return_val_if_fail (prop_name != NULL, 0); prop = xmlGetProp ((xmlNode *) parent, prop_name); if (prop != NULL) { (void) sscanf (prop, "%d", &ret_val); xmlFree (prop); } return ret_val; } void e_xml_set_integer_prop_by_name (xmlNode *parent, const xmlChar *prop_name, gint value) { gchar *valuestr; g_return_if_fail (parent != NULL); g_return_if_fail (prop_name != NULL); valuestr = g_strdup_printf ("%d", value); xmlSetProp (parent, prop_name, valuestr); g_free (valuestr); } guint e_xml_get_uint_prop_by_name (const xmlNode *parent, const xmlChar *prop_name) { g_return_val_if_fail (parent != NULL, 0); g_return_val_if_fail (prop_name != NULL, 0); return e_xml_get_uint_prop_by_name_with_default (parent, prop_name, 0); } guint e_xml_get_uint_prop_by_name_with_default (const xmlNode *parent, const xmlChar *prop_name, guint def) { xmlChar *prop; guint ret_val = def; g_return_val_if_fail (parent != NULL, 0); g_return_val_if_fail (prop_name != NULL, 0); prop = xmlGetProp ((xmlNode *) parent, prop_name); if (prop != NULL) { (void) sscanf (prop, "%u", &ret_val); xmlFree (prop); } return ret_val; } void e_xml_set_uint_prop_by_name (xmlNode *parent, const xmlChar *prop_name, guint value) { gchar *valuestr; g_return_if_fail (parent != NULL); g_return_if_fail (prop_name != NULL); valuestr = g_strdup_printf ("%u", value); xmlSetProp (parent, prop_name, valuestr); g_free (valuestr); } gboolean e_xml_get_bool_prop_by_name (const xmlNode *parent, const xmlChar *prop_name) { g_return_val_if_fail (parent != NULL, 0); g_return_val_if_fail (prop_name != NULL, 0); return e_xml_get_bool_prop_by_name_with_default (parent, prop_name, FALSE); } gboolean e_xml_get_bool_prop_by_name_with_default(const xmlNode *parent, const xmlChar *prop_name, gboolean def) { xmlChar *prop; gboolean ret_val = def; g_return_val_if_fail (parent != NULL, 0); g_return_val_if_fail (prop_name != NULL, 0); prop = xmlGetProp ((xmlNode *) parent, prop_name); if (prop != NULL) { if (g_strcasecmp (prop, "true") == 0) { ret_val = TRUE; } else if (g_strcasecmp (prop, "false") == 0) { ret_val = FALSE; } xmlFree(prop); } return ret_val; } void e_xml_set_bool_prop_by_name (xmlNode *parent, const xmlChar *prop_name, gboolean value) { g_return_if_fail (parent != NULL); g_return_if_fail (prop_name != NULL); if (value) { xmlSetProp (parent, prop_name, "true"); } else { xmlSetProp (parent, prop_name, "false"); } } gdouble e_xml_get_double_prop_by_name (const xmlNode *parent, const xmlChar *prop_name) { g_return_val_if_fail (parent != NULL, 0); g_return_val_if_fail (prop_name != NULL, 0); return e_xml_get_double_prop_by_name_with_default (parent, prop_name, 0.0); } gdouble e_xml_get_double_prop_by_name_with_default (const xmlNode *parent, const xmlChar *prop_name, gdouble def) { xmlChar *prop; gdouble ret_val = def; g_return_val_if_fail (parent != NULL, 0); g_return_val_if_fail (prop_name != NULL, 0); prop = xmlGetProp ((xmlNode *) parent, prop_name); if (prop != NULL) { (void) sscanf (prop, "%lf", &ret_val); xmlFree (prop); } return ret_val; } void e_xml_set_double_prop_by_name(xmlNode *parent, const xmlChar *prop_name, gdouble value) { gchar *valuestr; g_return_if_fail (parent != NULL); g_return_if_fail (prop_name != NULL); if (fabs (value) < 1e9 && fabs (value) > 1e-5) { valuestr = g_strdup_printf ("%f", value); } else { valuestr = g_strdup_printf ("%.*g", DBL_DIG, value); } xmlSetProp (parent, prop_name, valuestr); g_free (valuestr); } gchar * e_xml_get_string_prop_by_name (const xmlNode *parent, const xmlChar *prop_name) { g_return_val_if_fail (parent != NULL, 0); g_return_val_if_fail (prop_name != NULL, 0); return e_xml_get_string_prop_by_name_with_default (parent, prop_name, NULL); } gchar * e_xml_get_string_prop_by_name_with_default (const xmlNode *parent, const xmlChar *prop_name, const gchar *def) { xmlChar *prop; gchar *ret_val; g_return_val_if_fail (parent != NULL, 0); g_return_val_if_fail (prop_name != NULL, 0); prop = xmlGetProp ((xmlNode *) parent, prop_name); if (prop != NULL) { ret_val = g_strdup (prop); xmlFree (prop); } else { ret_val = g_strdup (def); } return ret_val; } void e_xml_set_string_prop_by_name (xmlNode *parent, const xmlChar *prop_name, const gchar *value) { g_return_if_fail (parent != NULL); g_return_if_fail (prop_name != NULL); if (value != NULL) { xmlSetProp (parent, prop_name, value); } } gchar * e_xml_get_translated_string_prop_by_name (const xmlNode *parent, const xmlChar *prop_name) { xmlChar *prop; gchar *ret_val = NULL; gchar *combined_name; g_return_val_if_fail (parent != NULL, 0); g_return_val_if_fail (prop_name != NULL, 0); prop = xmlGetProp ((xmlNode *) parent, prop_name); if (prop != NULL) { ret_val = g_strdup (prop); xmlFree (prop); return ret_val; } combined_name = g_strdup_printf("_%s", prop_name); prop = xmlGetProp ((xmlNode *) parent, combined_name); if (prop != NULL) { ret_val = g_strdup (gettext(prop)); xmlFree (prop); } g_free(combined_name); return ret_val; } pan>/+340 * Remove tools/evolution-addressbook-export.c, whichEttore Perazzoli2003-04-082-1/+5 * Update Czech translationMiloslav Trmac2003-04-082-357/+364 * add tools/killev.cDan Winship2003-04-082-0/+5 * Finnish translation updated by Sami Pesonen (sampeson@iki.fi)Sami Pesonen2003-04-072-2213/+2103 * Updated italian translation.Marco Ciampa2003-04-062-5024/+5724 * Updated Spanish translation by Francisco Javier FernandezPablo Gonzalo del Campo2003-04-032-349/+422 * Updated Ukrainian translationYuri Syrota2003-04-021-2/+2 * Updated Ukrainian translationYuri Syrota2003-04-021-5/+5 * Updated Ukrainian translationYuri Syrota2003-04-021-22/+22 * Updated Ukrainian translationYuri Syrota2003-04-021-7/+7 * Updated Ukrainian translationYuri Syrota2003-04-021-281/+281 * updated translationMarco Ciampa2003-04-022-33/+37 * Updated Ukrainian translationYuri Syrota2003-04-021-3/+3 * Updated Ukrainian translationYuri Syrota2003-04-021-276/+286 * Updated Hungarian translation.Andras Timar2003-04-012-4335/+4339 * Updated Hungarian translation.Andras Timar2003-04-011-2926/+3192 * Updated Ukrainian translationYuri Syrota2003-03-311-80/+80 * Updated Ukrainian translationYuri Syrota2003-03-311-22/+15 * Updated Ukrainian translationYuri Syrota2003-03-311-4/+4 * Updated Ukrainian translationYuri Syrota2003-03-312-3570/+3176 * Update Czech translationMiloslav Trmac2003-03-302-475/+476 * Updated Brazilian Portuguese translation done by Gustavo Maciel DiasGustavo Maciel Dias Vieira2003-03-302-4904/+4832 * Updated Swedish translation.Christian Rose2003-03-292-216/+230 * Finished updating Portuguese translation.Duarte Loreto2003-03-292-5549/+4766 * Updated Spanish translation by Francisco Javier FernandezPablo Gonzalo del Campo2003-03-292-1305/+1371 * Updated German translation.Christian Neumair2003-03-292-663/+638 * Non-final update to Portuguese translation.Duarte Loreto2003-03-272-2991/+1321 * Updated Swedish translation.Christian Rose2003-03-272-1264/+1327 * Update Czech translationMiloslav Trmac2003-03-242-302/+227 * Non-final update to Portuguese translation.Duarte Loreto2003-03-242-952/+954 * Update Czech translationMiloslav Trmac2003-03-242-59/+94 * Remove vanished files. Updated traditional Chinese translation fromAbel Cheung2003-03-234-12679/+10110 * Added missing files. Updated German translation.Christian Neumair2003-03-214-781/+917 * Update Czech translationMiloslav Trmac2003-03-212-385/+425 * Remove mail-search-dialogue.cRodney Dawes2003-03-202-1/+4 * Fix errors in Czech translationMiloslav Trmac2003-03-182-469/+459 * Initial Portuguese translation update.Duarte Loreto2003-03-182-7183/+7342 * Updated Spanish translation by Francisco Javier FernandezPablo Gonzalo del Campo2003-03-182-77/+83 * More date fixesKjartan Maraas2003-03-181-4/+1 * More date format fixesKjartan Maraas2003-03-171-2/+2 * Updated Norwegian translation.Kjartan Maraas2003-03-173-4878/+5443 * Updated to msg 1100.Marco Ciampa2003-03-152-97/+101 * Update Czech translationMiloslav Trmac2003-03-142-79/+81 * Updated Spanish translation by Francisco Javier FernandezPablo Gonzalo del Campo2003-03-142-1594/+1654 * Updated Slovak translation.Stanislav Visnovsky2003-03-142-5149/+5216 * Update Czech translationMiloslav Trmac2003-03-142-181/+181 * Updated German translation.Christian Neumair2003-03-122-3217/+3484 * Updated revision to string 600Marco Ciampa2003-03-112-20/+24 * Updated Swedish translation.Christian Rose2003-03-082-937/+969 * Update Czech translationMiloslav Trmac2003-03-072-237/+253 * Update Czech translationMiloslav Trmac2003-03-062-1220/+1236 * Dutch translation updated by Kees van den Broek.Vincent van Adrighem2003-03-042-817/+820 * Finnish translation updated by Sami Pesonen (sampeson@iki.fi)Sami Pesonen2003-03-032-6452/+5938 * s/server.in$/server.in.in/Rodney Dawes2003-03-032-1/+5 * Updated Swedish translation.Christian Rose2003-02-272-2605/+2864 * Update Czech translationMiloslav Trmac2003-02-262-796/+808 * updated Vietnamese filePablo Saratxaga2003-02-262-4639/+5133 * Updated Ukrainian translationYuri Syrota2003-02-251-18/+12 * Updated Ukrainian translationYuri Syrota2003-02-241-64/+38 * Updated Ukrainian translationYuri Syrota2003-02-241-102/+102 * Updated Ukrainian translationYuri Syrota2003-02-241-310/+295 * Updated Ukrainian translationYuri Syrota2003-02-231-285/+291 * Updated Ukrainian translationYuri Syrota2003-02-231-88/+88 * Converted it.po in UTF-8 and updated.Marco Ciampa2003-02-222-451/+454 * Update Czech translationMiloslav Trmac2003-02-222-85/+89 * Updated Spanish translation from Francisco J FernandezPablo Gonzalo del Campo2003-02-222-1522/+1605 * Update Czech translationMiloslav Trmac2003-02-212-173/+181 * Artis Trops <hornet@navigator.lv> * lv.po: Updated Latvian translation by Pe...Peteris Krisjanis2003-02-202-6868/+5813 * ignore more generated stuffChris Toshok2003-02-201-0/+8 * Dutch translation updated by Vincent van Adrighem.Vincent van Adrighem2003-02-182-2640/+2866 * ru.po: Updated Russian translation from Russian team <gnome-cyr@gnome.org>.Dmitry Mastrukov2003-02-182-63/+88 * Updated Ukrainian translationYuri Syrota2003-02-141-1221/+1266 * Update Czech translationMiloslav Trmac2003-02-142-303/+307 * Add missing file(s) and remove non-existant one(s).Abel Cheung2003-02-132-2/+7 * ru.po: Updated Russian translation from Russian team <gnome-cyr@gnome.org>.Dmitry Mastrukov2003-02-122-4588/+4314 * Update Czech translation, remove some obsolete stringsMiloslav Trmac2003-02-092-883/+158 * Add missing files and remove non-existant one. Mark incorrectly translatedAbel Cheung2003-02-097-8/+18 * Updating Amharic translation.Daniel Yacob2003-02-082-2437/+2532 * Updated Czech translationMichal Bukovjan2003-02-072-687/+737 * Updated Czech translation.Michal Bukovjan2003-02-071-10622/+8641 * add cal-recur.cDan Winship2003-02-062-0/+5 * ru.po: Updated Russian translation from Russian team <gnome-cyr@gnome.org>.Dmitry Mastrukov2003-02-052-4899/+5161 * Updated it.po (style fixies)Marco Ciampa2003-02-052-67/+72 * Updating Amharic translation.Daniel Yacob2003-02-042-8/+12 * Updates evolution/po/ChangeLog evolution/po/da.poKeld Jørn Simonsen2003-02-022-1752/+1884 * Updated Spanish translation from Francisco J FernandezGerman Poo-Caaman~o2003-02-022-2528/+2589 * Uodates from Søren evolution/po/ChangeLog evolution/po/da.poKeld Jørn Simonsen2003-02-022-8260/+7000 * Small fix of it.poMarco Ciampa2003-02-022-12/+16 * some fix of it.po fileMarco Ciampa2003-02-012-3/+7 * Updated Hungarian translation.Andras Timar2003-01-302-2367/+2498 * Updated Ukrainian translationYuri Syrota2003-01-301-111/+77 * First time of all strings translated in it.po in 2003!Marco Ciampa2003-01-291-38/+18 * Updated Ukrainian translationYuri Syrota2003-01-291-5366/+5415 * Updated it.po (not yet finished)Marco Ciampa2003-01-292-191/+123 * Take overFatih Demir2003-01-282-1620/+1534 * Fixes file lists. Removed. This file has been present for 2.5 years.Abel Cheung2003-01-285-4847/+4732 * Updated Slovak translation.Stanislav Visnovsky2003-01-272-6019/+5823 * Updating Amharic translation.Daniel Yacob2003-01-262-1045/+1080 * Updated it.po (not yet finished)Marco Ciampa2003-01-252-934/+34 * Updated Amharic translation.Daniel Yacob2003-01-242-1066/+1039 * Fixed bug #84257Alessio Frusciante2003-01-242-4/+8 * Update for chinese translation from Yuedong Du <yuedong.du@sun.com>Not Zed2003-01-232-1/+6 * update it.po (not yet finisced)Marco Ciampa2003-01-232-168/+108 * Updated Slovenian translationAndraz Tori2003-01-221-1/+1 * Updated the Greek translationKostas Papadimas2003-01-222-119/+128 * Updated Slovenian translationAndraz Tori2003-01-211-8237/+5833 * updated de translation.Christian Meyer2003-01-202-1562/+1495 * Updated the Greek translationKostas Papadimas2003-01-192-12000/+10029 * Updated Swedish translation.Christian Rose2003-01-192-718/+723 * update...Marco Ciampa2003-01-191-149/+111 * update...Marco Ciampa2003-01-171-6/+3 * updating...Marco Ciampa2003-01-171-114/+87 * Update for renamed and removed files.Ettore Perazzoli2003-01-152-2/+5 * Updating Amharic translation.Daniel Yacob2003-01-152-71/+77 * Updated Spanish translation from Francisco J FernandezPablo Gonzalo del Campo2003-01-132-322/+312 * Updated Slovak translation.Stanislav Visnovsky2003-01-112-10440/+19921 * Removed non-existing file. Updated Swedish translation.Christian Rose2003-01-103-469/+480 * Updated Swedish translation.Christian Rose2003-01-092-1224/+925 * - 3092 translated messages, 761 fuzzy translations, 2471 untranslated messages.Andrew V. Samoilov2003-01-081-165/+110 * update...Marco Ciampa2003-01-081-126/+126 * update...Marco Ciampa2003-01-081-80/+63 * updating...Marco Ciampa2003-01-081-105/+68 * Adding Amharic translation.Daniel Yacob2003-01-072-0/+27335 * Updating...not completly done yet.Marco Ciampa2003-01-071-108/+72 * First commit of the new translator...Marco Ciampa2003-01-071-225/+203 * Updated Spanish translation by Fco. Javier FernandezPablo Gonzalo del Campo2003-01-072-7642/+6889 * Updated Hungarian translation.Andras Timar2003-01-062-4889/+5243 * Updated Swedish translation somewhat.Christian Rose2003-01-032-161/+172 * Dutch translation updated by "Last-Translator: \n".Vincent van Adrighem2003-01-032-5395/+5665 * Updated Swedish translation somewhat.Christian Rose2002-12-292-320/+267 * Updated Swedish translation somewhat.Christian Rose2002-12-282-4966/+5241 * - 3329 translated messages, 344 fuzzy translations, 2651 untranslated messages.Andrew V. Samoilov2002-12-261-156/+119 * fix broken entryTakuro Kitame2002-12-261-2/+6 * Update Japanese translationTakuro Kitame2002-12-262-585/+317 * - 3173 translated messages, 460 fuzzy translations, 2691 untranslated messages.Andrew V. Samoilov2002-12-252-342/+240 * *** empty log message ***Wang Jian2002-12-212-748/+484 * Updated German translation and POTFILES.in.Christian Neumair2002-12-163-11032/+8855 * Updated Spanish translation by Fco. Javier Fernandez <serrador@arrakis.es>Pablo Gonzalo del Campo2002-12-092-1215/+2046 * Spellchecking by Zdenko Podobny.Stanislav Visnovsky2002-12-032-20664/+10463 * Updated Brazilian Portuguese translation done by Gustavo Maciel DiasGustavo Maciel Dias Vieira2002-12-012-4042/+3928 * Joaquim Fellmann <joaquim@altern.org>jfell2002-11-283-4161/+4186 * Remove a ":" that shouldn't have been there (and abbreviate theDan Winship2002-11-272-2/+8 * Updated spanish translation.German Poo Caaman~o2002-11-152-2/+6 * Updated spanish translation.German Poo Caaman~o2002-11-152-1474/+384 * Sync for 1.1.90.Ettore Perazzoli2002-10-29