29#include <rtl/strbuf.hxx>
43std::unique_ptr< CfgParser >
parser;
56 std::exit(EXIT_FAILURE);
60 FILE * pFile = std::fopen(global::inputPathname.getStr(),
"r");
61 if (pFile ==
nullptr) {
63 stderr,
"Error: Cannot open file \"%s\"\n",
64 global::inputPathname.getStr() );
65 std::exit(EXIT_FAILURE);
83 global::parser->Execute( nTyp, pTokenText );
107 OStringBuffer sReturn;
108 for (
size_t i = 0;
i <=
nPos; ++
i)
112 sReturn.append(
maList[
i]->GetIdentifier());
115 return sReturn.makeStringAndClear();
130 : pStackData( nullptr ),
156 return rToken[rToken.size() - 2] ==
'/';
161 const OString &rIsoLang,
162 const OString &rResTyp )
164 rText = rText.replaceAll(OString(
'\n'), OString()).
165 replaceAll(OString(
'\r'), OString()).
166 replaceAll(OString(
'\t'), OString());
173#pragma warning(disable: 4702)
177 OString sToken( pToken );
179 if ( sToken ==
" " || sToken ==
"\t" )
197 sTokenName = sToken.getToken(1,
'<').getToken(0,
'>').
204 sSearch =
"package-id=";
207 sSearch =
"component-id=";
210 sSearch =
"template-id=";
213 sSearch =
"cfg:name=";
216 sSearch =
"oor:name=";
220 sSearch =
"oor:value=";
228 OString sTemp = sToken.copy( sToken.indexOf(
"xml:lang=" ));
241 if ( !sSearch.isEmpty())
243 OString sTemp = sToken.copy( sToken.indexOf( sSearch ));
244 sTokenId = sTemp.getToken(1,
'"');
248 if ( sSearch ==
"cfg:name=" ) {
249 OString sTemp( sToken.toAsciiUpperCase() );
250 bLocalize = sTemp.indexOf(
"CFG:TYPE=\"STRING\"")>=0
251 && sTemp.indexOf(
"CFG:LOCALIZED=\"TRUE\"" )>=0;
254 else if ( sTokenName ==
"label" ) {
264 sTokenName = sToken.getToken(1,
'/').getToken(0,
'>').
275 const OString sError{
"Misplaced close tag: " + sToken +
" in file " + global::inputPathname };
277 std::exit(EXIT_FAILURE);
303 if ( sToken !=
" " && sToken !=
"\t" )
313 OString sToken( pToken );
317 if ( sToken.indexOf(
"package-id=" ) != -1 ) {
320 }
else if ( sToken.indexOf(
"component-id=" ) != -1 ) {
323 }
else if ( sToken.indexOf(
"template-id=" ) != -1 ) {
326 }
else if ( sToken.indexOf(
"cfg:name=" ) != -1 ) {
329 }
else if ( sToken.indexOf(
"oor:name=" ) != -1 ) {
332 }
else if ( sToken.indexOf(
"oor:value=" ) != -1 ) {
345 const OString &rOutputFile,
347 : sPath(
std::move( sFilePath ))
352 std::cerr <<
"ERROR: Unable to open output file: " << rOutputFile <<
"\n";
353 std::exit(EXIT_FAILURE);
388 sGroupId, sLocalId, sXComment, sText);
393 const OString &rIsoLang
403 const OString &rMergeSource,
const OString &rOutputFile,
404 OString _sFilename,
const OString &rLanguage )
405 : sFilename(
std::move( _sFilename )),
409 rOutputFile.getStr(), std::ios_base::out | std::ios_base::trunc);
412 std::cerr <<
"ERROR: Unable to open output file: " << rOutputFile <<
"\n";
413 std::exit(EXIT_FAILURE);
416 if (!rMergeSource.isEmpty())
419 rMergeSource, global::inputPathname,
true ));
420 if (rLanguage.equalsIgnoreAsciiCase(
"ALL") )
456 if (rLangIndex.equalsIgnoreAsciiCase(
"en-US"))
477 pEntrys->
GetText( sContent, sCur,
true );
479 ( !sCur.equalsIgnoreAsciiCase(
"en-US") ) && !sContent.isEmpty())
482 const sal_Int32 nLangAttributeStart{ sTextTag.indexOf(
"xml:lang=" ) };
483 const sal_Int32 nLangStart{ sTextTag.indexOf(
'"', nLangAttributeStart )+1 };
484 const sal_Int32 nLangEnd{ sTextTag.indexOf(
'"', nLangStart ) };
485 OString sAdditionalLine{
"\t"
486 + sTextTag.replaceAt(nLangStart, nLangEnd-nLangStart, sCur)
491 Output( sAdditionalLine );
void yyerror(const char *s)
void workOnTokenSet(int nTyp, char *pTokenText)
FILE * init(int argc, char **argv)
Export strings from *.xcu files.
virtual void WorkOnText(OString &rText, const OString &rIsoLang) override
virtual ~CfgExport() override
void Output(const OString &rOutput) override
void WorkOnResourceEnd() override
CfgExport(const OString &rOutputFile, OString sFilePath)
Merge strings to *.xcu files.
std::vector< OString > aLanguages
virtual void WorkOnText(OString &rText, const OString &rLangIndex) override
CfgMerge(const OString &rMergeSource, const OString &rOutputFile, OString sFilename, const OString &rLanguage)
virtual ~CfgMerge() override
void Output(const OString &rOutput) override
std::unique_ptr< ResData > pResData
std::ofstream pOutputStream
std::unique_ptr< MergeDataFile > pMergeDataFile
void WorkOnResourceEnd() override
void ExecuteAnalyzedToken(int nToken, char *pToken)
virtual void WorkOnText(OString &rText, const OString &rLangIndex)=0
virtual void Output(const OString &rOutput)=0
CfgStackData * pStackData
static bool IsTokenClosed(std::string_view rToken)
virtual void WorkOnResourceEnd()=0
void AddText(OString &rText, const OString &rIsoLang, const OString &rResTyp)
void Execute(int nToken, char *pToken)
const OString & GetTagType() const
CfgStackData * GetStackData()
OString GetAccessPath(size_t nPos)
std::vector< CfgStackData * > maList
CfgStackData * Push(const OString &rTag, const OString &rId)
Purpose: holds information of data to merge, read from PO file.
Purpose: holds information of data to merge.
bool GetText(OString &rReturn, const OString &nLangIndex, bool bDel=false)
void open(const OString &rFileName, OpenMode aMode=TRUNC)
Purpose: holds mandatory data to export a single res.
sal_Int32 getToken(const Context &rContext, const char *pToken)
void writeUsage(const OString &rName, const OString &rFileType)
Write out a help about usage.
void writePoEntry(const OString &rExecutable, PoOfstream &rPoStream, const OString &rSourceFile, std::string_view rResType, const OString &rGroupId, const OString &rLocalId, const OString &rHelpText, const OString &rText, const PoEntry::TYPE eType)
Write out a PoEntry with attention to exceptions.
bool handleArguments(int argc, char *argv[], HandledArgs &o_aHandledArgs)
Handle command line parameters.
OString QuotHTML(std::string_view rString)
Convert special characters to XML entity references.
OString UnQuotHTML(std::string_view rString)
Convert XML entity references to single characters.
Result type of handleArguments()
#define CFG_TOKEN_OORVALUE
#define CFG_TOKEN_COMPONENT
#define CFG_TOKEN_PACKAGE
#define CFG_TOKEN_TEMPLATE
#define CFG_TOKEN_CONFIGNAME
#define CFG_TOKEN_OORNAME
#define CFG_TOKEN_NO_TRANSLATE