summaryrefslogtreecommitdiff
path: root/l10ntools
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2012-06-27 16:13:37 +0100
committerCaolán McNamara <caolanm@redhat.com>2012-09-28 08:48:33 +0100
commit941436645a3222ee07a7e348e38a34eca763eaea (patch)
treee582787c316ada91543d6a5da16808a6f4a872e7 /l10ntools
parent3752a7c1ada87c744d5b3fa5c4ceac05e477e1c5 (diff)
add a plausible .ui to .sdf extraction tool
Change-Id: Icd45e901ea9dd664fcbc0db0c71f555c4cc24a34
Diffstat (limited to 'l10ntools')
-rw-r--r--l10ntools/Executable_uiex.mk34
-rw-r--r--l10ntools/Module_l10ntools.mk1
-rw-r--r--l10ntools/source/localize.cxx3
-rw-r--r--l10ntools/source/uimerge.cxx194
4 files changed, 231 insertions, 1 deletions
diff --git a/l10ntools/Executable_uiex.mk b/l10ntools/Executable_uiex.mk
new file mode 100644
index 000000000000..4d3d245fec13
--- /dev/null
+++ b/l10ntools/Executable_uiex.mk
@@ -0,0 +1,34 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+$(eval $(call gb_Executable_Executable,uiex))
+
+$(eval $(call gb_Executable_set_include,uiex,\
+ -I$(SRCDIR)/l10ntools/inc \
+ $$(INCLUDE) \
+))
+
+$(eval $(call gb_Executable_use_libraries,uiex,\
+ sal \
+))
+
+$(eval $(call gb_Executable_use_static_libraries,uiex,\
+ transex \
+))
+
+$(eval $(call gb_Executable_add_exception_objects,uiex,\
+ l10ntools/source/uimerge \
+))
+
+$(eval $(call gb_Executable_use_externals,uiex,\
+ libxslt \
+ libxml2 \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/l10ntools/Module_l10ntools.mk b/l10ntools/Module_l10ntools.mk
index 06b2083073ae..6fe7dcb5d083 100644
--- a/l10ntools/Module_l10ntools.mk
+++ b/l10ntools/Module_l10ntools.mk
@@ -33,6 +33,7 @@ $(eval $(call gb_Module_add_targets,l10ntools,\
Executable_ulfex \
Executable_gsicheck \
Executable_cfgex \
+ Executable_uiex \
Executable_xrmex \
Executable_localize \
Executable_transex3 \
diff --git a/l10ntools/source/localize.cxx b/l10ntools/source/localize.cxx
index eaf9a135c796..daa314257005 100644
--- a/l10ntools/source/localize.cxx
+++ b/l10ntools/source/localize.cxx
@@ -270,7 +270,8 @@ void handleFile(
{ RTL_CONSTASCII_STRINGPARAM(".xrm"), "xrmex", false },
{ RTL_CONSTASCII_STRINGPARAM(".xml"), "xrmex", true },
{ RTL_CONSTASCII_STRINGPARAM(".xhp"), "helpex", false },
- { RTL_CONSTASCII_STRINGPARAM(".properties"), "propex", false } };
+ { RTL_CONSTASCII_STRINGPARAM(".properties"), "propex", false },
+ { RTL_CONSTASCII_STRINGPARAM(".ui"), "uiex", false } };
for (std::size_t i = 0; i != SAL_N_ELEMENTS(commands); ++i) {
if (url.endsWithAsciiL(
commands[i].extension, commands[i].extensionLength))
diff --git a/l10ntools/source/uimerge.cxx b/l10ntools/source/uimerge.cxx
new file mode 100644
index 000000000000..d84eaa654801
--- /dev/null
+++ b/l10ntools/source/uimerge.cxx
@@ -0,0 +1,194 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <sal/main.h>
+
+#include <libxslt/transform.h>
+#include <libxslt/xslt.h>
+#include <libxslt/xsltutils.h>
+
+#include <stdio.h>
+
+#include "common.hxx"
+#include "export.hxx"
+#include "xrmmerge.hxx"
+#include "tokens.h"
+#include <iostream>
+#include <fstream>
+#include <vector>
+
+#define STATE_NON 0x0001
+#define STATE_INPUT 0x0002
+#define STATE_OUTPUT 0x0003
+#define STATE_PRJ 0x0004
+#define STATE_ROOT 0x0005
+#define STATE_MERGESRC 0x0006
+#define STATE_ERRORLOG 0x0007
+#define STATE_LANGUAGES 0x000C
+
+sal_Bool bMergeMode;
+sal_Bool bErrorLog;
+sal_Bool bUTF8;
+sal_Bool bDisplayName;
+sal_Bool bExtensionDescription;
+rtl::OString sPrj;
+rtl::OString sPrjRoot;
+rtl::OString sInputFileName;
+rtl::OString sOutputFile;
+rtl::OString sMergeSrc;
+rtl::OString sLangAttribute;
+rtl::OString sResourceType;
+XRMResParser *pParser = NULL;
+
+void GetOutputFile( int argc, char* argv[])
+{
+ bMergeMode = sal_False;
+ bErrorLog = sal_True;
+ bUTF8 = sal_True;
+ bDisplayName = sal_False;
+ bExtensionDescription = sal_False;
+ sPrj = "";
+ sPrjRoot = "";
+ sInputFileName = "";
+ Export::sLanguages = "";
+ sal_uInt16 nState = STATE_NON;
+
+ // parse command line
+ for( int i = 1; i < argc; i++ ) {
+ if ( rtl::OString( argv[ i ] ).toAsciiUpperCase() == "-I" ) {
+ nState = STATE_INPUT; // next token specifies source file
+ }
+ else if ( rtl::OString( argv[ i ] ).toAsciiUpperCase() == "-O" ) {
+ nState = STATE_OUTPUT; // next token specifies the dest file
+ }
+ else if ( rtl::OString( argv[ i ] ).toAsciiUpperCase() == "-P" ) {
+ nState = STATE_PRJ; // next token specifies the cur. project
+ }
+ else if ( rtl::OString( argv[ i ] ).toAsciiUpperCase() == "-R" ) {
+ nState = STATE_ROOT; // next token specifies path to project root
+ }
+ else if ( rtl::OString( argv[ i ] ).toAsciiUpperCase() == "-M" ) {
+ nState = STATE_MERGESRC; // next token specifies the merge database
+ }
+ else if ( rtl::OString( argv[ i ] ).toAsciiUpperCase() == "-E" ) {
+ nState = STATE_ERRORLOG;
+ bErrorLog = sal_False;
+ }
+ else if ( rtl::OString( argv[ i ] ).toAsciiUpperCase() == "-L" ) {
+ nState = STATE_LANGUAGES;
+ }
+ else {
+ switch ( nState ) {
+ case STATE_NON: {
+ return; // no valid command line
+ }
+ case STATE_INPUT: {
+ sInputFileName = argv[ i ];
+ }
+ break;
+ case STATE_OUTPUT: {
+ sOutputFile = argv[ i ]; // the dest. file
+ }
+ break;
+ case STATE_PRJ: {
+ sPrj = rtl::OString( argv[ i ]);
+ }
+ break;
+ case STATE_ROOT: {
+ sPrjRoot = rtl::OString( argv[ i ]); // path to project root
+ }
+ break;
+ case STATE_MERGESRC: {
+ sMergeSrc = rtl::OString( argv[ i ]);
+ bMergeMode = sal_True; // activate merge mode, cause merge database found
+ }
+ break;
+ case STATE_LANGUAGES: {
+ Export::sLanguages = rtl::OString( argv[ i ]);
+ }
+ break;
+ }
+ }
+ }
+}
+
+SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv)
+{
+ int nRetValue = 0;
+ xsltStylesheetPtr stylesheet = 0;
+
+ GetOutputFile( argc, argv );
+
+ if (sOutputFile.isEmpty())
+ {
+ fprintf( stdout, "Syntax: UIEX[-p Prj][-r PrjRoot]-i FileIn [-o FileOut][-m DataBase][-e][-L l1,l2,...]\n" );
+ fprintf( stdout, " Prj: Project\n" );
+ fprintf( stdout, " PrjRoot: Path to project root (..\\.. etc.)\n" );
+ fprintf( stdout, " FileIn: Source files (*.src)\n" );
+ fprintf( stdout, " FileOut: Destination file (*.*)\n" );
+ fprintf( stdout, " DataBase: Mergedata (*.sdf)\n" );
+ fprintf( stdout, " -e: Disable writing errorlog\n" );
+ fprintf( stdout, " -b: Break when Token \"HelpText\" found in source\n" );
+ fprintf( stdout, " -L: Restrict the handled languages. l1,l2,... are elements of (de,en-US,es...)\n" );
+ return 1;
+ }
+
+ if (Export::sLanguages != "en-US")
+ {
+ fprintf(stderr, "can only extract en-US\n");
+ return 1;
+ }
+
+ FILE *pOutFile = fopen(sOutputFile.getStr(), "w");
+ if (!pOutFile)
+ {
+ fprintf(stderr, "cannot open %s\n", sOutputFile.getStr());
+ return 1;
+ }
+
+ rtl::OString sActFileName = common::pathnameToken(sInputFileName.getStr(), sPrjRoot.getStr());
+
+ rtl::OString sStyleSheet = rtl::OString(getenv("SRC_ROOT")) + rtl::OString("/solenv/bin/uilangfilter.xslt");
+
+ stylesheet = xsltParseStylesheetFile ((const xmlChar *)sStyleSheet.getStr());
+
+ xmlDocPtr doc = xmlParseFile(sInputFileName.getStr());
+
+ xmlDocPtr res = xsltApplyStylesheet(stylesheet, doc, NULL);
+
+ for( xmlNodePtr nodeLevel1 = res->children; nodeLevel1 != NULL; nodeLevel1 = nodeLevel1->next)
+ {
+ for( xmlNodePtr nodeLevel2 = nodeLevel1->children; nodeLevel2 != NULL; nodeLevel2 = nodeLevel2->next)
+ {
+ if (nodeLevel2->type == XML_ELEMENT_NODE)
+ {
+ fprintf(pOutFile, "%s\t%s\t0\t",sPrj.getStr(), sActFileName.getStr());
+ for(xmlAttrPtr attribute = nodeLevel2->properties; attribute != NULL; attribute = attribute->next)
+ {
+ xmlChar *content = xmlNodeListGetString(res, attribute->children, 1);
+ fprintf(pOutFile, "%s\t", content);
+ xmlFree(content);
+ }
+ fprintf(pOutFile, "\t\t0\ten-US\t%s\t\t\t\t\n", xmlNodeGetContent(nodeLevel2));
+ }
+ }
+ }
+
+ xmlFreeDoc(res);
+
+ xmlFreeDoc(doc);
+
+ xsltFreeStylesheet(stylesheet);
+
+ fclose(pOutFile);
+
+ return nRetValue;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */