diff options
author | Caolán McNamara <caolanm@redhat.com> | 2012-06-27 16:13:37 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2012-09-28 08:48:33 +0100 |
commit | 941436645a3222ee07a7e348e38a34eca763eaea (patch) | |
tree | e582787c316ada91543d6a5da16808a6f4a872e7 /l10ntools/source | |
parent | 3752a7c1ada87c744d5b3fa5c4ceac05e477e1c5 (diff) |
add a plausible .ui to .sdf extraction tool
Change-Id: Icd45e901ea9dd664fcbc0db0c71f555c4cc24a34
Diffstat (limited to 'l10ntools/source')
-rw-r--r-- | l10ntools/source/localize.cxx | 3 | ||||
-rw-r--r-- | l10ntools/source/uimerge.cxx | 194 |
2 files changed, 196 insertions, 1 deletions
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: */ |