diff options
author | Matthias Clasen <mclasen@redhat.com> | 2014-05-27 15:54:38 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2014-05-27 17:28:10 -0400 |
commit | a28d2cb9233eff0983b7b3517a9dbb00b62fd357 (patch) | |
tree | d13aab55cfba3d005a3ed4ac214469fba0a4c6d3 /util | |
parent | ea2d20e3133dec009ea9e59a65ec85ffbce445a1 (diff) | |
download | gtk+-a28d2cb9233eff0983b7b3517a9dbb00b62fd357.tar.gz |
Move extract-strings to its own directory3.13.2
This will hopefully help resolve the circular dependency between
libgtk linking against inspector/libgtkinspector and inspector/
needing extract-strings from gtk/.
I didn't preserve the EXEEXT decorations in this operation -
automake gave me stern warnings about it, so I just dropped them
all. Somebody who cross-builds GTK+ will have to reconstruct this.
Diffstat (limited to 'util')
-rw-r--r-- | util/Makefile.am | 11 | ||||
-rw-r--r-- | util/extract-strings.c | 176 |
2 files changed, 187 insertions, 0 deletions
diff --git a/util/Makefile.am b/util/Makefile.am new file mode 100644 index 0000000000..f079800078 --- /dev/null +++ b/util/Makefile.am @@ -0,0 +1,11 @@ +# The extract_strings tool is a build utility that runs on the build system. +extract_strings_sources = extract-strings.c +extract_strings_cppflags = +extract_strings_cflags = $(GLIB_CFLAGS_FOR_BUILD) +extract_strings_ldadd = $(GLIB_LIBS_FOR_BUILD) + +extract-strings: $(extract_strings_sources) + @rm -f extract-strings + $(AM_V_CCLD)$(CC_FOR_BUILD) $(extract_strings_cppflags) $(CPPFLAGS_FOR_BUILD) $(extract_strings_cflags) $(CFLAGS_FOR_BUILD) $^ $(LDFLAGS_FOR_BUILD) $(extract_strings_ldadd) $(LIBS_FOR_BUILD) -o $@ + +noinst_PROGRAMS = extract-strings diff --git a/util/extract-strings.c b/util/extract-strings.c new file mode 100644 index 0000000000..183b99a4c4 --- /dev/null +++ b/util/extract-strings.c @@ -0,0 +1,176 @@ +/* GTK - The GIMP Toolkit + * Copyright (C) 2013 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <glib.h> + +typedef struct { + GString *output; + gboolean translatable; + gchar *context; + gchar *comments; + GString *text; +} ParserData; + +static void +start_element_handler (GMarkupParseContext *contexts, + const gchar *element_name, + const gchar **attribute_names, + const gchar **attribute_values, + gpointer user_data, + GError **error) +{ + ParserData *data = user_data; + + if (g_str_equal (element_name, "property") || + g_str_equal (element_name, "attribute") || + g_str_equal (element_name, "item")) + { + gboolean translatable; + gchar *context; + gchar *comments; + + g_markup_collect_attributes (element_name, + attribute_names, + attribute_values, + error, + G_MARKUP_COLLECT_STRING|G_MARKUP_COLLECT_OPTIONAL, "name", NULL, + G_MARKUP_COLLECT_STRING|G_MARKUP_COLLECT_OPTIONAL, "value", NULL, + G_MARKUP_COLLECT_TRISTATE, "translatable", &translatable, + G_MARKUP_COLLECT_STRDUP|G_MARKUP_COLLECT_OPTIONAL, "context", &context, + G_MARKUP_COLLECT_STRDUP|G_MARKUP_COLLECT_OPTIONAL, "comments", &comments, + G_MARKUP_COLLECT_STRING|G_MARKUP_COLLECT_OPTIONAL, "id", NULL, + G_MARKUP_COLLECT_INVALID); + + if (translatable == TRUE) + { + data->translatable = TRUE; + data->context = context; + data->comments = comments; + data->text = g_string_new (""); + } + } +} + +static void +end_element_handler (GMarkupParseContext *context, + const gchar *element_name, + gpointer user_data, + GError **error) +{ + ParserData *data = user_data; + gchar **lines; + gint i; + + if (!data->translatable) + return; + + lines = g_strsplit (data->text->str, "\n", -1); + + if (data->comments) + g_string_append_printf (data->output, "\n/* %s */\n", + data->comments); + + if (data->context) + g_string_append_printf (data->output, "C_(\"%s\", ", + data->context); + else + g_string_append (data->output, "N_("); + + for (i = 0; lines[i]; i++) + g_string_append_printf (data->output, "%s\"%s%s\"%s", + i > 0 ? " " : "", + lines[i], + lines[i+1] ? "\\n" : "", + lines[i+1] ? "\n" : ""); + + g_string_append (data->output, ");\n"); + + g_strfreev (lines); + + g_free (data->comments); + g_free (data->context); + g_string_free (data->text, TRUE); + + data->comments = NULL; + data->context = NULL; + data->text = NULL; + data->translatable = FALSE; +} + +static void +text_handler (GMarkupParseContext *context, + const gchar *text, + gsize text_len, + gpointer user_data, + GError **error) +{ + ParserData *data = user_data; + + if (!data->translatable) + return; + + g_string_append_len (data->text, text, text_len); +} + +static const GMarkupParser parser = { + start_element_handler, + end_element_handler, + text_handler, + NULL, + NULL +}; + +int +main (int argc, char *argv[]) +{ + gchar *contents; + gsize length; + GError *error; + GMarkupParseContext *context; + ParserData data; + + if (argc < 2) + { + g_printerr ("Expect a filename\n"); + return 1; + } + + error = NULL; + if (!g_file_get_contents (argv[1], &contents, &length, &error)) + { + g_printerr ("%s\n", error->message); + g_error_free (error); + return 1; + } + + data.output = g_string_new (""); + data.translatable = FALSE; + + context = g_markup_parse_context_new (&parser, 0, &data, NULL); + if (!g_markup_parse_context_parse (context, contents, length, &error)) + { + g_markup_parse_context_free (context); + g_free (contents); + g_printerr ("%s\n", error->message); + g_error_free (error); + return 1; + } + + g_print ("%s", g_string_free (data.output, FALSE)); + + return 0; +} |