Kaydet (Commit) 67b8c033 authored tarafından Andras Timar's avatar Andras Timar

fdo#41737 syntax highlighting of Basic code examples in offline help

Change-Id: I7dc5b189e98a0351bac0eab28c1161b5893f5ef1
üst fb1f3db0
...@@ -34,7 +34,6 @@ class L10N_DLLPUBLIC BasicCodeTagger ...@@ -34,7 +34,6 @@ class L10N_DLLPUBLIC BasicCodeTagger
BasicCodeTagger( xmlDocPtr rootDoc ); BasicCodeTagger( xmlDocPtr rootDoc );
~BasicCodeTagger(); ~BasicCodeTagger();
void tagBasicCodes(); void tagBasicCodes();
void saveTreeToFile( const std::string& filePath, const std::string& encoding );
}; };
//================LibXmlTreeWalker=========================================================== //================LibXmlTreeWalker===========================================================
......
...@@ -245,7 +245,8 @@ public: ...@@ -245,7 +245,8 @@ public:
const std::string &entryName, const Hashtable &bytesToAdd); const std::string &entryName, const Hashtable &bytesToAdd);
private: private:
xmlDocPtr getSourceDocument(const fs::path &filePath); xmlDocPtr getSourceDocument(const fs::path &filePath);
void sourceDocumentPreWorks( xmlDocPtr doc , const fs::path &filePath); void tagBasicCodeExamples(xmlDocPtr doc);
void saveXhpForJar(xmlDocPtr doc, const fs::path &filePath);
xmlNodePtr clone(xmlNodePtr node, const std::string& appl); xmlNodePtr clone(xmlNodePtr node, const std::string& appl);
StreamTable &streamTable; StreamTable &streamTable;
const fs::path inputFile, src, zipdir; const fs::path inputFile, src, zipdir;
......
...@@ -137,15 +137,9 @@ void BasicCodeTagger::tagParagraph( xmlNodePtr paragraph ) ...@@ -137,15 +137,9 @@ void BasicCodeTagger::tagParagraph( xmlNodePtr paragraph )
} }
//3. create new paragraph content //3. create new paragraph content
String strLine( OUString strLine( reinterpret_cast<const sal_Char*>(codeSnippet),
OUString( strlen(reinterpret_cast<const char*>(codeSnippet)),
reinterpret_cast<const sal_Char*>(codeSnippet), RTL_TEXTENCODING_UTF8 );
strlen(
reinterpret_cast<const char*>(codeSnippet)
),
RTL_TEXTENCODING_UTF8
)
) ;
m_Highlighter.notifyChange ( 0, 0, &strLine, 1 ); m_Highlighter.notifyChange ( 0, 0, &strLine, 1 );
HighlightPortions portions; HighlightPortions portions;
m_Highlighter.getHighlightPortions( 0, strLine, portions ); m_Highlighter.getHighlightPortions( 0, strLine, portions );
...@@ -155,7 +149,7 @@ void BasicCodeTagger::tagParagraph( xmlNodePtr paragraph ) ...@@ -155,7 +149,7 @@ void BasicCodeTagger::tagParagraph( xmlNodePtr paragraph )
for ( size_t i=0; i<portions.size(); i++ ) for ( size_t i=0; i<portions.size(); i++ )
{ {
HighlightPortion& r = portions[i]; HighlightPortion& r = portions[i];
subStr = xmlStrsub( codeSnippet, r.nBegin, r.nEnd-r.nBegin ); subStr = (xmlChar*) OUStringToOString( strLine.copy( r.nBegin, r.nEnd-r.nBegin ), RTL_TEXTENCODING_UTF8 ).getStr();
text = xmlNewText( subStr ); text = xmlNewText( subStr );
if ( r.tokenType != TT_WHITESPACE ) if ( r.tokenType != TT_WHITESPACE )
{ {
...@@ -185,7 +179,7 @@ void BasicCodeTagger::tagBasicCodes() ...@@ -185,7 +179,7 @@ void BasicCodeTagger::tagBasicCodes()
{ {
getBasicCodeContainerNodes(); getBasicCodeContainerNodes();
} }
catch (TaggerException ex) catch (TaggerException &ex)
{ {
std::cout << "BasCodeTagger error occured. Error code:" << ex << std::endl; std::cout << "BasCodeTagger error occured. Error code:" << ex << std::endl;
} }
...@@ -229,7 +223,7 @@ xmlChar* BasicCodeTagger::getTypeString( TokenTypes tokenType ) ...@@ -229,7 +223,7 @@ xmlChar* BasicCodeTagger::getTypeString( TokenTypes tokenType )
str = "operator"; str = "operator";
break; break;
case TT_KEYWORDS : case TT_KEYWORDS :
str = "keywords"; str = "keyword";
break; break;
case TT_PARAMETER : case TT_PARAMETER :
str = "parameter"; str = "parameter";
...@@ -240,12 +234,3 @@ xmlChar* BasicCodeTagger::getTypeString( TokenTypes tokenType ) ...@@ -240,12 +234,3 @@ xmlChar* BasicCodeTagger::getTypeString( TokenTypes tokenType )
} }
return xmlCharStrdup( str ); return xmlCharStrdup( str );
} }
//! Saves the current xml DOM to file with the provided libxml2 encoding string in an unformatted way.
void BasicCodeTagger::saveTreeToFile( const std::string& filePath, const std::string& encoding )
{
//saveDocument
int ret = xmlSaveFormatFileEnc( filePath.c_str(), m_pDocument, encoding.c_str(), 0 );
if ( ret == -1 )
throw FILE_WRITING;
}
...@@ -54,41 +54,50 @@ HelpCompiler::HelpCompiler(StreamTable &in_streamTable, const fs::path &in_input ...@@ -54,41 +54,50 @@ HelpCompiler::HelpCompiler(StreamTable &in_streamTable, const fs::path &in_input
} }
} }
void HelpCompiler::sourceDocumentPreWorks( xmlDocPtr doc, const fs::path &filePath ) void HelpCompiler::tagBasicCodeExamples( xmlDocPtr doc )
{ {
if ( doc ) try
{ {
if ( module == "sbasic" ) BasicCodeTagger bct( doc );
{ bct.tagBasicCodes();
try }
{ catch ( BasicCodeTagger::TaggerException &ex )
BasicCodeTagger bct( doc ); {
bct.tagBasicCodes(); if ( ex != BasicCodeTagger::EMPTY_DOCUMENT )
} throw;
catch ( BasicCodeTagger::TaggerException ex )
{
if ( ex != BasicCodeTagger::EMPTY_DOCUMENT )
throw;
}
//save document in ziptmp<modul>_<lang>/text directory
//1. construct new path
const std::string& pth = filePath.native_file_string();
std::string sourceNativeXhpPath = pth.substr( pth.rfind( lang+"/text/" ) ).substr( lang.length() );
std::string xhpFileName = sourceNativeXhpPath.substr( sourceNativeXhpPath.rfind( '/' ) + 1 );
sourceNativeXhpPath = sourceNativeXhpPath.substr( 0, sourceNativeXhpPath.rfind( '/' ) );
//2. save xml doc with the new path
// -create directory hierachy
fs::create_directory( fs::path( zipdir.native_file_string() + sourceNativeXhpPath, fs::native ) );
// -save document
if ( -1 == xmlSaveFormatFileEnc( (zipdir.native_file_string() + sourceNativeXhpPath + '/' + xhpFileName).c_str(), doc, "utf-8", 0 ) )
throw BasicCodeTagger::FILE_WRITING;
}
} }
} }
void HelpCompiler::saveXhpForJar( xmlDocPtr doc, const fs::path &filePath )
{
//save processed xhp document in ziptmp<module>_<lang>/text directory
#ifdef WNT
std::string pathSep = "\\";
#else
std::string pathSep = "/";
#endif
const std::string& sourceXhpPath = filePath.native_file_string();
std::string zipdirPath = zipdir.native_file_string();
std::string jarXhpPath = sourceXhpPath.substr( sourceXhpPath.rfind( lang + pathSep + "text" + pathSep ) ).substr( lang.length() );
std::string xhpFileName = jarXhpPath.substr( jarXhpPath.rfind( pathSep ) + 1 );
jarXhpPath = jarXhpPath.substr( 0, jarXhpPath.rfind( pathSep ) );
if ( !jarXhpPath.compare( 1, 11, "text" + pathSep + "sbasic" ) )
{
tagBasicCodeExamples( doc );
}
if ( !jarXhpPath.compare( 1, 11, "text" + pathSep + "shared" ) )
{
size_t pos = zipdirPath.find( "ziptmp" ) + 6;
zipdirPath.replace( pos, module.length(), "shared" );
}
fs::create_directory( fs::path( zipdirPath + jarXhpPath, fs::native ) );
if ( -1 == xmlSaveFormatFileEnc( (zipdirPath + jarXhpPath + pathSep + xhpFileName).c_str(), doc, "utf-8", 0 ) )
std::cerr << "Error saving file to " << (zipdirPath + jarXhpPath + pathSep + xhpFileName).c_str() << std::endl;
}
xmlDocPtr HelpCompiler::getSourceDocument(const fs::path &filePath) xmlDocPtr HelpCompiler::getSourceDocument(const fs::path &filePath)
{ {
static const char *params[4 + 1];
static xsltStylesheetPtr cur = NULL; static xsltStylesheetPtr cur = NULL;
xmlDocPtr res; xmlDocPtr res;
...@@ -99,22 +108,19 @@ xmlDocPtr HelpCompiler::getSourceDocument(const fs::path &filePath) ...@@ -99,22 +108,19 @@ xmlDocPtr HelpCompiler::getSourceDocument(const fs::path &filePath)
impl_sleep( 3 ); impl_sleep( 3 );
res = xmlParseFile(filePath.native_file_string().c_str()); res = xmlParseFile(filePath.native_file_string().c_str());
} }
sourceDocumentPreWorks( res, filePath );
} }
else else
{ {
static const char *params[2 + 1];
if (!cur) if (!cur)
{ {
static std::string fsroot('\'' + src.toUTF8() + '\''); static std::string fsroot('\'' + src.toUTF8() + '\'');
static std::string esclang('\'' + lang + '\'');
xmlSubstituteEntitiesDefault(1); xmlSubstituteEntitiesDefault(1);
xmlLoadExtDtdDefaultValue = 1; xmlLoadExtDtdDefaultValue = 1;
cur = xsltParseStylesheetFile((const xmlChar *)resEmbStylesheet.native_file_string().c_str()); cur = xsltParseStylesheetFile((const xmlChar *)resEmbStylesheet.native_file_string().c_str());
int nbparams = 0; int nbparams = 0;
params[nbparams++] = "Language";
params[nbparams++] = esclang.c_str();
params[nbparams++] = "fsroot"; params[nbparams++] = "fsroot";
params[nbparams++] = fsroot.c_str(); params[nbparams++] = fsroot.c_str();
params[nbparams] = NULL; params[nbparams] = NULL;
...@@ -125,8 +131,8 @@ xmlDocPtr HelpCompiler::getSourceDocument(const fs::path &filePath) ...@@ -125,8 +131,8 @@ xmlDocPtr HelpCompiler::getSourceDocument(const fs::path &filePath)
impl_sleep( 3 ); impl_sleep( 3 );
doc = xmlParseFile(filePath.native_file_string().c_str()); doc = xmlParseFile(filePath.native_file_string().c_str());
} }
sourceDocumentPreWorks( doc, filePath );
//???res = xmlParseFile(filePath.native_file_string().c_str()); saveXhpForJar( doc, filePath );
res = xsltApplyStylesheet(cur, doc, params); res = xsltApplyStylesheet(cur, doc, params);
xmlFreeDoc(doc); xmlFreeDoc(doc);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment