[latexila] Autotools: handle the templates



commit 79bc0a92c92748c57c4fd0686d54eef3f584c67c
Author: SÃbastien Wilmet <swilmet gnome org>
Date:   Tue Sep 4 16:21:02 2012 +0200

    Autotools: handle the templates
    
    Instead of generating .tex templates for each language with ITS Tool,
    the XML files are directly read in Vala, and the chunks that must be
    translated, are translated there.
    
    The Vala code is more complicated, but the Autotools/CMake "code" is
    easier. Translating the CMake macro for the Autotools (a M4 macro for
    example) would have been more complicated I think (at least for me).

 configure.ac                           |    1 +
 data/Makefile.am                       |    2 +-
 data/templates/Makefile.am             |   11 +++
 data/templates/{C => }/article.xml     |    8 +-
 data/templates/{C => }/beamer.xml      |    8 +-
 data/templates/{C => }/book.xml        |    8 +-
 data/templates/gen_tex.sh              |   13 ----
 data/templates/{C => }/letter.xml      |    4 +-
 data/templates/{C => }/report.xml      |    8 +-
 data/templates/templates.its           |    5 +-
 data/templates/templates.pot           |   12 ++--
 data/templates/update_templates_pot.sh |    2 +-
 src/templates.vala                     |  114 +++++++++++++++++++++++--------
 13 files changed, 126 insertions(+), 70 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 48b28b4..b8c9aac 100644
--- a/configure.ac
+++ b/configure.ac
@@ -131,6 +131,7 @@ AC_CONFIG_FILES([Makefile
 		 data/icons/192x192/Makefile
 		 data/images/Makefile
 		 data/images/app/Makefile
+		 data/templates/Makefile
 		 help/Makefile
 		 man/Makefile
 		 po/Makefile.in
diff --git a/data/Makefile.am b/data/Makefile.am
index a44272e..a89cbf5 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -1,4 +1,4 @@
-SUBDIRS = build_tools icons images
+SUBDIRS = build_tools icons images templates
 
 dist_pkgdata_DATA =	\
 	completion.xml	\
diff --git a/data/templates/Makefile.am b/data/templates/Makefile.am
new file mode 100644
index 0000000..da13109
--- /dev/null
+++ b/data/templates/Makefile.am
@@ -0,0 +1,11 @@
+templatesdir = $(pkgdatadir)/templates
+dist_templates_DATA =	\
+	article.xml	\
+	beamer.xml	\
+	book.xml	\
+	letter.xml	\
+	report.xml
+
+EXTRA_DIST = templates.pot
+
+-include $(top_srcdir)/git.mk
diff --git a/data/templates/C/article.xml b/data/templates/article.xml
similarity index 74%
rename from data/templates/C/article.xml
rename to data/templates/article.xml
index 9c2f81b..74915b6 100644
--- a/data/templates/C/article.xml
+++ b/data/templates/article.xml
@@ -1,14 +1,14 @@
 <template xmlns:its="http://www.w3.org/2005/11/its";>
-<chunk its:translate="no">
+<chunk>
 \documentclass[a4paper,11pt]{article}
 \usepackage[T1]{fontenc}
 \usepackage[utf8]{inputenc}
 \usepackage{lmodern}
 </chunk>
-<chunk its:locNote="This must be translated by a usepackage LaTeX command.">
+<babel its:locNote="This must be translated by a usepackage LaTeX command.">
 % babel package or equivalent
-</chunk>
-<chunk its:translate="no">
+</babel>
+<chunk>
 
 \title{}
 \author{}
diff --git a/data/templates/C/beamer.xml b/data/templates/beamer.xml
similarity index 81%
rename from data/templates/C/beamer.xml
rename to data/templates/beamer.xml
index bdf4829..f27d8bc 100644
--- a/data/templates/C/beamer.xml
+++ b/data/templates/beamer.xml
@@ -1,14 +1,14 @@
 <template xmlns:its="http://www.w3.org/2005/11/its";>
-<chunk its:translate="no">
+<chunk>
 \documentclass{beamer}
 \usepackage[T1]{fontenc}
 \usepackage[utf8]{inputenc}
 \usepackage{lmodern}
 </chunk>
-<chunk>
+<babel>
 % babel package or equivalent
-</chunk>
-<chunk its:translate="no">
+</babel>
+<chunk>
 
 \title{}
 \author{}
diff --git a/data/templates/C/book.xml b/data/templates/book.xml
similarity index 83%
rename from data/templates/C/book.xml
rename to data/templates/book.xml
index 1b5a898..d7687f6 100644
--- a/data/templates/C/book.xml
+++ b/data/templates/book.xml
@@ -1,14 +1,14 @@
 <template xmlns:its="http://www.w3.org/2005/11/its";>
-<chunk its:translate="no">
+<chunk>
 \documentclass[a4paper,11pt]{book}
 \usepackage[T1]{fontenc}
 \usepackage[utf8]{inputenc}
 \usepackage{lmodern}
 </chunk>
-<chunk>
+<babel>
 % babel package or equivalent
-</chunk>
-<chunk its:translate="no">
+</babel>
+<chunk>
 
 \title{}
 \author{}
diff --git a/data/templates/C/letter.xml b/data/templates/letter.xml
similarity index 83%
rename from data/templates/C/letter.xml
rename to data/templates/letter.xml
index 23fd8b2..ab8425b 100644
--- a/data/templates/C/letter.xml
+++ b/data/templates/letter.xml
@@ -1,5 +1,5 @@
 <template xmlns:its="http://www.w3.org/2005/11/its";>
-<chunk its:locNote="There is a helper script in data/templates/tex2po.sh">
+<translatableChunk its:locNote="There is a helper script in data/templates/tex2po.sh">
 \documentclass[a4paper,11pt]{letter}
 \usepackage[T1]{fontenc}
 \usepackage[utf8]{inputenc}
@@ -24,5 +24,5 @@
 
 \end{letter}
 \end{document}
-</chunk>
+</translatableChunk>
 </template>
diff --git a/data/templates/C/report.xml b/data/templates/report.xml
similarity index 85%
rename from data/templates/C/report.xml
rename to data/templates/report.xml
index 7e2d4f9..1f0363c 100644
--- a/data/templates/C/report.xml
+++ b/data/templates/report.xml
@@ -1,14 +1,14 @@
 <template xmlns:its="http://www.w3.org/2005/11/its";>
-<chunk its:translate="no">
+<chunk>
 \documentclass[a4paper,11pt]{report}
 \usepackage[T1]{fontenc}
 \usepackage[utf8]{inputenc}
 \usepackage{lmodern}
 </chunk>
-<chunk>
+<babel>
 % babel package or equivalent
-</chunk>
-<chunk its:translate="no">
+</babel>
+<chunk>
 
 \title{}
 \author{}
diff --git a/data/templates/templates.its b/data/templates/templates.its
index 60807c4..f7e4b3a 100644
--- a/data/templates/templates.its
+++ b/data/templates/templates.its
@@ -3,6 +3,9 @@
     xmlns:itst="http://itstool.org/extensions/";
     its:version="1.0">
 
-    <itst:preserveSpaceRule preserveSpace="yes" selector="//chunk" />
+    <itst:preserveSpaceRule preserveSpace="yes" selector="//babel" />
+    <itst:preserveSpaceRule preserveSpace="yes" selector="//translatableChunk" />
+
+    <its:translateRule translate="no" selector="//chunk" />
 
 </its:rules>
diff --git a/data/templates/templates.pot b/data/templates/templates.pot
index b5f0cab..f094da2 100644
--- a/data/templates/templates.pot
+++ b/data/templates/templates.pot
@@ -1,7 +1,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2011-08-04 00:52+0200\n"
+"POT-Creation-Date: 2012-09-04 16:39+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL ADDRESS>\n"
 "Language-Team: LANGUAGE <LL li org>\n"
@@ -10,10 +10,10 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 
 #. This must be translated by a usepackage LaTeX command.
-#: C/article.xml:8(template/chunk)
-#: C/beamer.xml:8(template/chunk)
-#: C/book.xml:8(template/chunk)
-#: C/report.xml:8(template/chunk)
+#: article.xml:8(template/babel)
+#: beamer.xml:8(template/babel)
+#: book.xml:8(template/babel)
+#: report.xml:8(template/babel)
 #, no-wrap
 msgid ""
 "\n"
@@ -22,7 +22,7 @@ msgid ""
 msgstr ""
 
 #. There is a helper script in data/templates/tex2po.sh
-#: C/letter.xml:2(template/chunk)
+#: letter.xml:2(template/translatableChunk)
 #, no-wrap
 msgid ""
 "\n"
diff --git a/data/templates/update_templates_pot.sh b/data/templates/update_templates_pot.sh
index 1507c46..7b25441 100755
--- a/data/templates/update_templates_pot.sh
+++ b/data/templates/update_templates_pot.sh
@@ -1,3 +1,3 @@
 #!/bin/sh
 
-itstool -o templates.pot -i templates.its C/*.xml
+itstool -o templates.pot -i templates.its *.xml
diff --git a/src/templates.vala b/src/templates.vala
index e32c0f4..9b21646 100644
--- a/src/templates.vala
+++ b/src/templates.vala
@@ -37,6 +37,9 @@ public class Templates : GLib.Object
     private File _data_dir;
     private File _rc_file;
 
+    // Used for the construction of a default template when reading its XML file.
+    private string _default_template;
+
     private enum TemplateColumn
     {
         PIXBUF,  // the theme icon name
@@ -71,11 +74,11 @@ public class Templates : GLib.Object
 
         add_template_from_string (_default_store, _("Empty"), "empty", "");
 
-        add_default_template (_("Article"), "article", "article.tex");
-        add_default_template (_("Report"), "report", "report.tex");
-        add_default_template (_("Book"), "book", "book.tex");
-        add_default_template (_("Letter"), "letter", "letter.tex");
-        add_default_template (_("Presentation"), "beamer", "beamer.tex");
+        add_default_template (_("Article"), "article", "article.xml");
+        add_default_template (_("Report"), "report", "report.xml");
+        add_default_template (_("Book"), "book", "book.xml");
+        add_default_template (_("Letter"), "letter", "letter.xml");
+        add_default_template (_("Presentation"), "beamer", "beamer.xml");
     }
 
     private void init_personal_templates ()
@@ -142,6 +145,82 @@ public class Templates : GLib.Object
 
 
     /*************************************************************************/
+    // Add a default template.
+    //
+    // A default template (or some chunks) can be translated. The templates
+    // are stored in XML files. ITS Tool is used to extract the translatable
+    // strings. Here the XML files are read, the chunks are joint, and the
+    // translatable chunks are translated.
+
+    private void add_default_template (string name, string icon_id, string filename)
+    {
+        string path = Path.build_filename (Config.DATA_DIR, "templates", filename);
+        File file = File.new_for_path (path);
+
+        if (! file.query_exists ())
+        {
+            warning ("The default template '%s' doesn't exist. Path: %s", name, path);
+            return;
+        }
+
+        string? contents = Utils.load_file (file);
+        return_if_fail (contents != null);
+
+        _default_template = "";
+
+        try
+        {
+            MarkupParser parser =
+                { null, null, parser_text, null, null };
+            MarkupParseContext context =
+                new MarkupParseContext (parser, 0, this, null);
+            context.parse (contents, -1);
+        }
+        catch (GLib.Error e)
+        {
+            warning ("Impossible to load the default template '%s': %s",
+                name, e.message);
+            return;
+        }
+
+        add_template_from_string (_default_store, name, icon_id, _default_template);
+    }
+
+    private void parser_text (MarkupParseContext context, string text, size_t text_len)
+        throws MarkupError
+    {
+        string chunk = null;
+
+        switch (context.get_element ())
+        {
+            case "chunk":
+                chunk = text;
+                break;
+
+            case "translatableChunk":
+                chunk = _(text);
+                break;
+
+            case "babel":
+                string translated_text = _(text);
+                if (translated_text != text)
+                    chunk = translated_text;
+                break;
+        }
+
+        if (chunk == null)
+            return;
+
+        // Remove the first '\n'. Without this, the XML files would be less
+        // well presented.
+        if (chunk[0] == '\n')
+            chunk = chunk[1 : chunk.length];
+
+        _default_template += chunk;
+    }
+
+
+    /*************************************************************************/
     // Add and delete templates, save rc file.
 
     private void add_template_from_string (ListStore store, string name,
@@ -169,31 +248,6 @@ public class Templates : GLib.Object
         return true;
     }
 
-    private void add_default_template (string name, string icon_id, string filename)
-    {
-        // The templates are translated, so we search first a translated template.
-
-        File[] files = {};
-
-        unowned string[] language_names = Intl.get_language_names ();
-        foreach (string language_name in language_names)
-        {
-            files += File.new_for_path (Path.build_filename (Config.DATA_DIR,
-                "templates", language_name, filename));
-        }
-
-        foreach (File file in files)
-        {
-            if (! file.query_exists ())
-                continue;
-
-            add_template_from_file (_default_store, name, icon_id, file);
-            return;
-        }
-
-        warning ("Template '%s' not found.", name);
-    }
-
     public void delete_personal_template (TreePath template_path)
     {
         /* Delete the template from the personal store */



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]