[Libreoffice-commits] core.git: 7 commits - basctl/source helpcompiler/inc helpcompiler/Library_helplinker.mk helpcompiler/Package_inc.mk helpcompiler/source svtools/inc svtools/source

Andras Timar atimar at suse.com
Wed Feb 13 01:33:26 PST 2013


 basctl/source/basicide/baside2b.cxx           |    4 
 helpcompiler/Library_helplinker.mk            |    9 
 helpcompiler/Package_inc.mk                   |    1 
 helpcompiler/inc/BasCodeTagger.hxx            |   56 ++++++
 helpcompiler/inc/HelpCompiler.hxx             |    7 
 helpcompiler/source/BasCodeTagger.cxx         |  236 ++++++++++++++++++++++++++
 helpcompiler/source/HelpCompiler.cxx          |   56 +++++-
 helpcompiler/source/HelpLinker.cxx            |    2 
 svtools/inc/svtools/syntaxhighlight.hxx       |    8 
 svtools/source/edit/editsyntaxhighlighter.cxx |    2 
 svtools/source/edit/syntaxhighlight.cxx       |  235 ++++++-------------------
 11 files changed, 423 insertions(+), 193 deletions(-)

New commits:
commit b6eed8596485380484245a77344ad9a3bd476a73
Author: Andras Timar <atimar at suse.com>
Date:   Tue Feb 12 22:47:06 2013 +0100

    fix a Basic keyword in syntax highlighter: withevent -> withevents
    
    Change-Id: I47b527ad6e68dba83ebb253bcc55a2717c7dd0ca

diff --git a/svtools/source/edit/syntaxhighlight.cxx b/svtools/source/edit/syntaxhighlight.cxx
index 8d33ac3..920bac5 100644
--- a/svtools/source/edit/syntaxhighlight.cxx
+++ b/svtools/source/edit/syntaxhighlight.cxx
@@ -152,7 +152,7 @@ static const char* strListBasicKeyWords[] = {
     "wend",
     "while",
     "with",
-    "withevent",
+    "withevents",
     "write",
     "xor"
 };
commit 67b8c0339e90c42dca402a925a624fce67f8ea5c
Author: Andras Timar <atimar at suse.com>
Date:   Tue Feb 12 22:32:53 2013 +0100

    fdo#41737 syntax highlighting of Basic code examples in offline help
    
    Change-Id: I7dc5b189e98a0351bac0eab28c1161b5893f5ef1

diff --git a/helpcompiler/inc/BasCodeTagger.hxx b/helpcompiler/inc/BasCodeTagger.hxx
index 3cf9261..9ff376a 100644
--- a/helpcompiler/inc/BasCodeTagger.hxx
+++ b/helpcompiler/inc/BasCodeTagger.hxx
@@ -34,7 +34,6 @@ class L10N_DLLPUBLIC BasicCodeTagger
     BasicCodeTagger( xmlDocPtr rootDoc );
     ~BasicCodeTagger();
     void tagBasicCodes();
-    void saveTreeToFile( const std::string& filePath, const std::string& encoding );
 };
 
 //================LibXmlTreeWalker===========================================================
diff --git a/helpcompiler/inc/HelpCompiler.hxx b/helpcompiler/inc/HelpCompiler.hxx
index 034a629..8a5dda1 100644
--- a/helpcompiler/inc/HelpCompiler.hxx
+++ b/helpcompiler/inc/HelpCompiler.hxx
@@ -245,7 +245,8 @@ public:
                 const std::string &entryName, const Hashtable &bytesToAdd);
 private:
     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);
     StreamTable &streamTable;
     const fs::path inputFile, src, zipdir;
diff --git a/helpcompiler/source/BasCodeTagger.cxx b/helpcompiler/source/BasCodeTagger.cxx
index 339d96b..5852912 100644
--- a/helpcompiler/source/BasCodeTagger.cxx
+++ b/helpcompiler/source/BasCodeTagger.cxx
@@ -137,15 +137,9 @@ void BasicCodeTagger::tagParagraph( xmlNodePtr paragraph )
     }
 
     //3. create new paragraph content
-    String strLine(
-                    OUString(
-                                reinterpret_cast<const sal_Char*>(codeSnippet),
-                                strlen(
-                                    reinterpret_cast<const char*>(codeSnippet)
-                                ),
-                                RTL_TEXTENCODING_UTF8
-                                )
-                     ) ;
+    OUString strLine( reinterpret_cast<const sal_Char*>(codeSnippet),
+                                strlen(reinterpret_cast<const char*>(codeSnippet)),
+                                RTL_TEXTENCODING_UTF8 );
     m_Highlighter.notifyChange ( 0, 0, &strLine, 1 );
     HighlightPortions portions;
     m_Highlighter.getHighlightPortions( 0, strLine, portions );
@@ -155,7 +149,7 @@ void BasicCodeTagger::tagParagraph( xmlNodePtr paragraph )
     for ( size_t i=0; i<portions.size(); 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 );
         if ( r.tokenType != TT_WHITESPACE )
         {
@@ -185,7 +179,7 @@ void BasicCodeTagger::tagBasicCodes()
     {
         getBasicCodeContainerNodes();
     }
-    catch (TaggerException ex)
+    catch (TaggerException &ex)
     {
           std::cout << "BasCodeTagger error occured. Error code:" << ex << std::endl;
     }
@@ -229,7 +223,7 @@ xmlChar* BasicCodeTagger::getTypeString( TokenTypes tokenType )
             str = "operator";
             break;
         case TT_KEYWORDS :
-            str = "keywords";
+            str = "keyword";
             break;
         case TT_PARAMETER :
             str = "parameter";
@@ -240,12 +234,3 @@ xmlChar* BasicCodeTagger::getTypeString( TokenTypes tokenType )
     }
     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;
-}
diff --git a/helpcompiler/source/HelpCompiler.cxx b/helpcompiler/source/HelpCompiler.cxx
index 8c6f66b..3983f16 100644
--- a/helpcompiler/source/HelpCompiler.cxx
+++ b/helpcompiler/source/HelpCompiler.cxx
@@ -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" )
-        {
-            try
-            {
-                BasicCodeTagger bct( doc );
-                bct.tagBasicCodes();
-            }
-            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;
-        }
+        BasicCodeTagger bct( doc );
+        bct.tagBasicCodes();
+    }
+    catch ( BasicCodeTagger::TaggerException &ex )
+    {
+        if ( ex != BasicCodeTagger::EMPTY_DOCUMENT )
+            throw;
     }
 }
 
+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)
 {
-    static const char *params[4 + 1];
     static xsltStylesheetPtr cur = NULL;
 
     xmlDocPtr res;
@@ -99,22 +108,19 @@ xmlDocPtr HelpCompiler::getSourceDocument(const fs::path &filePath)
             impl_sleep( 3 );
             res = xmlParseFile(filePath.native_file_string().c_str());
         }
-        sourceDocumentPreWorks( res, filePath );
     }
     else
     {
+        static const char *params[2 + 1];
         if (!cur)
         {
             static std::string fsroot('\'' + src.toUTF8() + '\'');
-            static std::string esclang('\'' + lang + '\'');
 
             xmlSubstituteEntitiesDefault(1);
             xmlLoadExtDtdDefaultValue = 1;
             cur = xsltParseStylesheetFile((const xmlChar *)resEmbStylesheet.native_file_string().c_str());
 
             int nbparams = 0;
-            params[nbparams++] = "Language";
-            params[nbparams++] = esclang.c_str();
             params[nbparams++] = "fsroot";
             params[nbparams++] = fsroot.c_str();
             params[nbparams] = NULL;
@@ -125,8 +131,8 @@ xmlDocPtr HelpCompiler::getSourceDocument(const fs::path &filePath)
             impl_sleep( 3 );
             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);
         xmlFreeDoc(doc);
commit fb1f3db03df25bee8b17a85e26774e79483de791
Author: Andras Timar <atimar at suse.com>
Date:   Tue Feb 12 22:29:33 2013 +0100

    String to OUString
    
    Change-Id: Ibb0b1808532622ffb2dfc55d533428f6d72b890c

diff --git a/basctl/source/basicide/baside2b.cxx b/basctl/source/basicide/baside2b.cxx
index bbb7baf..b2a0182 100644
--- a/basctl/source/basicide/baside2b.cxx
+++ b/basctl/source/basicide/baside2b.cxx
@@ -787,7 +787,7 @@ void EditorWindow::ImpDoHighlight( sal_uLong nLine )
 {
     if ( bDoSyntaxHighlight )
     {
-        String aLine( pEditEngine->GetText( nLine ) );
+        OUString aLine( pEditEngine->GetText( nLine ) );
         Range aChanges = aHighlighter.notifyChange( nLine, 0, &aLine, 1 );
         if ( aChanges.Len() )
         {
@@ -935,7 +935,7 @@ void EditorWindow::ParagraphInsertedDeleted( sal_uLong nPara, bool bInserted )
 
         if ( bDoSyntaxHighlight )
         {
-            String aDummy;
+            OUString aDummy;
             aHighlighter.notifyChange( nPara, bInserted ? 1 : (-1), &aDummy, 1 );
         }
     }
diff --git a/svtools/inc/svtools/syntaxhighlight.hxx b/svtools/inc/svtools/syntaxhighlight.hxx
index 33d9149..60e917d 100644
--- a/svtools/inc/svtools/syntaxhighlight.hxx
+++ b/svtools/inc/svtools/syntaxhighlight.hxx
@@ -131,8 +131,8 @@ public:
     SimpleTokenizer_Impl( HighlighterLanguage aLang = HIGHLIGHT_BASIC );
     ~SimpleTokenizer_Impl( void );
 
-    sal_uInt16 parseLine( sal_uInt32 nLine, const String* aSource );
-    void getHighlightPortions( sal_uInt32 nParseLine, const String& rLine,
+    sal_uInt16 parseLine( sal_uInt32 nLine, const OUString* aSource );
+    void getHighlightPortions( sal_uInt32 nParseLine, const OUString& rLine,
                                                     /*out*/HighlightPortions& portions );
     void setKeyWords( const char** ppKeyWords, sal_uInt16 nCount );
 };
@@ -165,9 +165,9 @@ public:
     void initialize( HighlighterLanguage eLanguage_ );
 
     const Range notifyChange( sal_uInt32 nLine, sal_Int32 nLineCountDifference,
-                                const String* pChangedLines, sal_uInt32 nArrayLength);
+                                const OUString* pChangedLines, sal_uInt32 nArrayLength);
 
-    void getHighlightPortions( sal_uInt32 nLine, const String& rLine,
+    void getHighlightPortions( sal_uInt32 nLine, const OUString& rLine,
                                             HighlightPortions& pPortions );
 
     HighlighterLanguage GetLanguage() { return eLanguage;}
diff --git a/svtools/source/edit/editsyntaxhighlighter.cxx b/svtools/source/edit/editsyntaxhighlighter.cxx
index af68d05..62a7a25 100644
--- a/svtools/source/edit/editsyntaxhighlighter.cxx
+++ b/svtools/source/edit/editsyntaxhighlighter.cxx
@@ -167,7 +167,7 @@ void MultiLineEditSyntaxHighlight::UpdateData()
     sal_Bool bTempModified = GetTextEngine()->IsModified();
     for (unsigned int nLine=0; nLine < GetTextEngine()->GetParagraphCount(); nLine++)
     {
-        String aLine( GetTextEngine()->GetText( nLine ) );
+        OUString aLine( GetTextEngine()->GetText( nLine ) );
         aHighlighter.notifyChange( nLine, 0, &aLine, 1 );
 
         GetTextEngine()->RemoveAttribs( nLine, sal_True );
diff --git a/svtools/source/edit/syntaxhighlight.cxx b/svtools/source/edit/syntaxhighlight.cxx
index 0d261d6..8d33ac3 100644
--- a/svtools/source/edit/syntaxhighlight.cxx
+++ b/svtools/source/edit/syntaxhighlight.cxx
@@ -636,10 +636,10 @@ SimpleTokenizer_Impl* getSimpleTokenizer( void )
     return pSimpleTokenizer;
 }
 
-sal_uInt16 SimpleTokenizer_Impl::parseLine( sal_uInt32 nParseLine, const String* aSource )
+sal_uInt16 SimpleTokenizer_Impl::parseLine( sal_uInt32 nParseLine, const OUString* aSource )
 {
     // Set the position to the beginning of the source string
-    mpStringBegin = mpActualPos = aSource->GetBuffer();
+    mpStringBegin = mpActualPos = aSource->getStr();
 
     // Initialize row and column
     nLine = nParseLine;
@@ -658,11 +658,11 @@ sal_uInt16 SimpleTokenizer_Impl::parseLine( sal_uInt32 nParseLine, const String*
     return nTokenCount;
 }
 
-void SimpleTokenizer_Impl::getHighlightPortions( sal_uInt32 nParseLine, const String& rLine,
+void SimpleTokenizer_Impl::getHighlightPortions( sal_uInt32 nParseLine, const OUString& rLine,
                                                     /*out*/HighlightPortions& portions  )
 {
     // Set the position to the beginning of the source string
-    mpStringBegin = mpActualPos = rLine.GetBuffer();
+    mpStringBegin = mpActualPos = rLine.getStr();
 
     // Initialize row and column
     nLine = nParseLine;
@@ -722,7 +722,7 @@ void SyntaxHighlighter::initialize( HighlighterLanguage eLanguage_ )
 }
 
 const Range SyntaxHighlighter::notifyChange( sal_uInt32 nLine, sal_Int32 nLineCountDifference,
-                                const String* pChangedLines, sal_uInt32 nArrayLength)
+                                const OUString* pChangedLines, sal_uInt32 nArrayLength)
 {
     (void)nLineCountDifference;
 
@@ -732,7 +732,7 @@ const Range SyntaxHighlighter::notifyChange( sal_uInt32 nLine, sal_Int32 nLineCo
     return Range( nLine, nLine + nArrayLength-1 );
 }
 
-void SyntaxHighlighter::getHighlightPortions( sal_uInt32 nLine, const String& rLine,
+void SyntaxHighlighter::getHighlightPortions( sal_uInt32 nLine, const OUString& rLine,
                                             /*out*/HighlightPortions& portions )
 {
     m_pSimpleTokenizer->getHighlightPortions( nLine, rLine, portions );
commit d25486b5a909ff2b3bdd6369dba035ec8df4dff6
Author: Andras Timar <atimar at suse.com>
Date:   Tue Feb 12 15:49:31 2013 +0100

    remove rtl:: prefix
    
    Change-Id: I6b2c51c57a98046e30b2782dd2565ee02345379d

diff --git a/svtools/source/edit/syntaxhighlight.cxx b/svtools/source/edit/syntaxhighlight.cxx
index ce3fcf1..0d261d6 100644
--- a/svtools/source/edit/syntaxhighlight.cxx
+++ b/svtools/source/edit/syntaxhighlight.cxx
@@ -318,8 +318,8 @@ sal_Bool SimpleTokenizer_Impl::getNextToken( /*out*/TokenTypes& reType,
 
             if( bCanBeKeyword )
             {
-                rtl::OUString aKWString(rpStartPos, nCount);
-                rtl::OString aByteStr = rtl::OUStringToOString(aKWString,
+                OUString aKWString(rpStartPos, nCount);
+                OString aByteStr = OUStringToOString(aKWString,
                     RTL_TEXTENCODING_ASCII_US).toAsciiLowerCase();
                 if ( bsearch( aByteStr.getStr(), ppListKeyWords, nKeyWordCount, sizeof( char* ),
                                                                         compare_strings ) )
commit 6e4fd7ba9f4a02e130e817aadf0b977b8b8b6262
Author: Andras Timar <atimar at suse.com>
Date:   Tue Feb 12 15:39:09 2013 +0100

    use u_isalpha() from ICU instead of home-grown solution
    
    plus German comments were translated
    
    Change-Id: Id9ff5d4835e4ea224c9e6232a1762822aa833d37

diff --git a/svtools/source/edit/syntaxhighlight.cxx b/svtools/source/edit/syntaxhighlight.cxx
index 7db7b72..ce3fcf1 100644
--- a/svtools/source/edit/syntaxhighlight.cxx
+++ b/svtools/source/edit/syntaxhighlight.cxx
@@ -18,13 +18,12 @@
  */
 
 
+#include <unicode/uchar.h>
 #include <svtools/syntaxhighlight.hxx>
-
-#include <unotools/charclass.hxx>
 #include <comphelper/string.hxx>
 
 // ##########################################################################
-// ATTENTION: all these words needs to be in small caps
+// ATTENTION: all these words need to be in lower case
 // ##########################################################################
 static const char* strListBasicKeyWords[] = {
     "access",
@@ -232,111 +231,15 @@ extern "C" int CDECL compare_strings( const void *arg1, const void *arg2 )
 
 namespace
 {
-
-    class LetterTable
-    {
-        bool        IsLetterTab[256];
-
-    public:
-        LetterTable( void );
-
-        inline bool isLetter( sal_Unicode c )
-        {
-            bool bRet = (c < 256) ? IsLetterTab[c] : isLetterUnicode( c );
-            return bRet;
-        }
-        bool isLetterUnicode( sal_Unicode c );
-    };
-
     static bool isAlpha(sal_Unicode c)
     {
         if (comphelper::string::isalphaAscii(c))
             return true;
-        static LetterTable aLetterTable;
-        return aLetterTable.isLetter(c);
+        return u_isalpha(c);
     }
 }
 
-LetterTable::LetterTable( void )
-{
-    for( int i = 0 ; i < 256 ; ++i )
-        IsLetterTab[i] = false;
-
-    IsLetterTab[0xC0] = true;   // ?, CAPITAL LETTER A WITH GRAVE ACCENT
-    IsLetterTab[0xC1] = true;   // ?, CAPITAL LETTER A WITH ACUTE ACCENT
-    IsLetterTab[0xC2] = true;   // ?, CAPITAL LETTER A WITH CIRCUMFLEX ACCENT
-    IsLetterTab[0xC3] = true;   // ?, CAPITAL LETTER A WITH TILDE
-    IsLetterTab[0xC4] = true;   // ?, CAPITAL LETTER A WITH DIAERESIS
-    IsLetterTab[0xC5] = true;   // ?, CAPITAL LETTER A WITH RING ABOVE
-    IsLetterTab[0xC6] = true;   // ?, CAPITAL LIGATURE AE
-    IsLetterTab[0xC7] = true;   // ?, CAPITAL LETTER C WITH CEDILLA
-    IsLetterTab[0xC8] = true;   // ?, CAPITAL LETTER E WITH GRAVE ACCENT
-    IsLetterTab[0xC9] = true;   // ?, CAPITAL LETTER E WITH ACUTE ACCENT
-    IsLetterTab[0xCA] = true;   // ?, CAPITAL LETTER E WITH CIRCUMFLEX ACCENT
-    IsLetterTab[0xCB] = true;   // ?, CAPITAL LETTER E WITH DIAERESIS
-    IsLetterTab[0xCC] = true;   // ?, CAPITAL LETTER I WITH GRAVE ACCENT
-    IsLetterTab[0xCD] = true;   // ?, CAPITAL LETTER I WITH ACUTE ACCENT
-    IsLetterTab[0xCE] = true;   // ?, CAPITAL LETTER I WITH CIRCUMFLEX ACCENT
-    IsLetterTab[0xCF] = true;   // ?, CAPITAL LETTER I WITH DIAERESIS
-    IsLetterTab[0xD0] = true;   // ?, CAPITAL LETTER ETH
-    IsLetterTab[0xD1] = true;   // ?, CAPITAL LETTER N WITH TILDE
-    IsLetterTab[0xD2] = true;   // ?, CAPITAL LETTER O WITH GRAVE ACCENT
-    IsLetterTab[0xD3] = true;   // ?, CAPITAL LETTER O WITH ACUTE ACCENT
-    IsLetterTab[0xD4] = true;   // ?, CAPITAL LETTER O WITH CIRCUMFLEX ACCENT
-    IsLetterTab[0xD5] = true;   // ?, CAPITAL LETTER O WITH TILDE
-    IsLetterTab[0xD6] = true;   // ?, CAPITAL LETTER O WITH DIAERESIS
-    IsLetterTab[0xD8] = true;   // ?, CAPITAL LETTER O WITH STROKE
-    IsLetterTab[0xD9] = true;   // ?, CAPITAL LETTER U WITH GRAVE ACCENT
-    IsLetterTab[0xDA] = true;   // ?, CAPITAL LETTER U WITH ACUTE ACCENT
-    IsLetterTab[0xDB] = true;   // ?, CAPITAL LETTER U WITH CIRCUMFLEX ACCENT
-    IsLetterTab[0xDC] = true;   // ?, CAPITAL LETTER U WITH DIAERESIS
-    IsLetterTab[0xDD] = true;   // ?, CAPITAL LETTER Y WITH ACUTE ACCENT
-    IsLetterTab[0xDE] = true;   // ?, CAPITAL LETTER THORN
-    IsLetterTab[0xDF] = true;   // ?, SMALL LETTER SHARP S
-    IsLetterTab[0xE0] = true;   // ?, SMALL LETTER A WITH GRAVE ACCENT
-    IsLetterTab[0xE1] = true;   // ?, SMALL LETTER A WITH ACUTE ACCENT
-    IsLetterTab[0xE2] = true;   // ?, SMALL LETTER A WITH CIRCUMFLEX ACCENT
-    IsLetterTab[0xE3] = true;   // ?, SMALL LETTER A WITH TILDE
-    IsLetterTab[0xE4] = true;   // ?, SMALL LETTER A WITH DIAERESIS
-    IsLetterTab[0xE5] = true;   // ?, SMALL LETTER A WITH RING ABOVE
-    IsLetterTab[0xE6] = true;   // ?, SMALL LIGATURE AE
-    IsLetterTab[0xE7] = true;   // ?, SMALL LETTER C WITH CEDILLA
-    IsLetterTab[0xE8] = true;   // ?, SMALL LETTER E WITH GRAVE ACCENT
-    IsLetterTab[0xE9] = true;   // ?, SMALL LETTER E WITH ACUTE ACCENT
-    IsLetterTab[0xEA] = true;   // ?, SMALL LETTER E WITH CIRCUMFLEX ACCENT
-    IsLetterTab[0xEB] = true;   // ?, SMALL LETTER E WITH DIAERESIS
-    IsLetterTab[0xEC] = true;   // ?, SMALL LETTER I WITH GRAVE ACCENT
-    IsLetterTab[0xED] = true;   // ?, SMALL LETTER I WITH ACUTE ACCENT
-    IsLetterTab[0xEE] = true;   // ?, SMALL LETTER I WITH CIRCUMFLEX ACCENT
-    IsLetterTab[0xEF] = true;   // ?, SMALL LETTER I WITH DIAERESIS
-    IsLetterTab[0xF0] = true;   // ?, SMALL LETTER ETH
-    IsLetterTab[0xF1] = true;   // ?, SMALL LETTER N WITH TILDE
-    IsLetterTab[0xF2] = true;   // ?, SMALL LETTER O WITH GRAVE ACCENT
-    IsLetterTab[0xF3] = true;   // ?, SMALL LETTER O WITH ACUTE ACCENT
-    IsLetterTab[0xF4] = true;   // ?, SMALL LETTER O WITH CIRCUMFLEX ACCENT
-    IsLetterTab[0xF5] = true;   // ?, SMALL LETTER O WITH TILDE
-    IsLetterTab[0xF6] = true;   // ?, SMALL LETTER O WITH DIAERESIS
-    IsLetterTab[0xF8] = true;   // ?, SMALL LETTER O WITH OBLIQUE BAR
-    IsLetterTab[0xF9] = true;   // ?, SMALL LETTER U WITH GRAVE ACCENT
-    IsLetterTab[0xFA] = true;   // ?, SMALL LETTER U WITH ACUTE ACCENT
-    IsLetterTab[0xFB] = true;   // ?, SMALL LETTER U WITH CIRCUMFLEX ACCENT
-    IsLetterTab[0xFC] = true;   // ?, SMALL LETTER U WITH DIAERESIS
-    IsLetterTab[0xFD] = true;   // ?, SMALL LETTER Y WITH ACUTE ACCENT
-    IsLetterTab[0xFE] = true;   // ?, SMALL LETTER THORN
-    IsLetterTab[0xFF] = true;   // � , SMALL LETTER Y WITH DIAERESIS
-}
-
-bool LetterTable::isLetterUnicode( sal_Unicode c )
-{
-    static CharClass* pCharClass = NULL;
-    if( pCharClass == NULL )
-        pCharClass = new CharClass( Application::GetSettings().GetLanguageTag() );
-    rtl::OUString aStr( c );
-    bool bRet = pCharClass->isLetter( aStr, 0 );
-    return bRet;
-}
-
-// Hilfsfunktion: Zeichen-Flag Testen
+// Helper function: test character flag
 sal_Bool SimpleTokenizer_Impl::testCharFlags( sal_Unicode c, sal_uInt16 nTestFlags )
 {
     bool bRet = false;
@@ -358,24 +261,20 @@ void SimpleTokenizer_Impl::setKeyWords( const char** ppKeyWords, sal_uInt16 nCou
     nKeyWordCount = nCount;
 }
 
-// Neues Token holen
 sal_Bool SimpleTokenizer_Impl::getNextToken( /*out*/TokenTypes& reType,
     /*out*/const sal_Unicode*& rpStartPos, /*out*/const sal_Unicode*& rpEndPos )
 {
     reType = TT_UNKNOWN;
 
-    // Position merken
     rpStartPos = mpActualPos;
 
-    // Zeichen untersuchen
     sal_Unicode c = peekChar();
     if( c == CHAR_EOF )
         return sal_False;
 
-    // Zeichen lesen
     getChar();
 
-    //*** Alle Moeglichkeiten durchgehen ***
+    //*** Go through all possibilities ***
     // Space?
     if ( (testCharFlags( c, CHAR_SPACE ) == sal_True) )
     {
@@ -401,7 +300,7 @@ sal_Bool SimpleTokenizer_Impl::getNextToken( /*out*/TokenTypes& reType,
 
         reType = TT_IDENTIFIER;
 
-        // Schluesselwort-Tabelle
+        // Keyword table
         if (ppListKeyWords != NULL)
         {
             int nCount = mpActualPos - rpStartPos;
@@ -429,7 +328,7 @@ sal_Bool SimpleTokenizer_Impl::getNextToken( /*out*/TokenTypes& reType,
 
                     if (aByteStr.equalsL(RTL_CONSTASCII_STRINGPARAM("rem")))
                     {
-                        // Alle Zeichen bis Zeilen-Ende oder EOF entfernen
+                        // Remove all characters until end of line or EOF
                         sal_Unicode cPeek = peekChar();
                         while( cPeek != CHAR_EOF && testCharFlags( cPeek, CHAR_EOL ) == sal_False )
                         {
@@ -456,7 +355,7 @@ sal_Bool SimpleTokenizer_Impl::getNextToken( /*out*/TokenTypes& reType,
                 sal_Bool bIdentifierChar;
                 do
                 {
-                    // Naechstes Zeichen holen
+                    // Get next character
                     c = peekChar();
                     bIdentifierChar = isAlpha(c);
                     if( bIdentifierChar )
@@ -471,7 +370,7 @@ sal_Bool SimpleTokenizer_Impl::getNextToken( /*out*/TokenTypes& reType,
             sal_Unicode cPeekNext = peekChar();
             if (cPeekNext=='-')
             {
-                // Alle Zeichen bis Zeilen-Ende oder EOF entfernen
+                // Remove all characters until end of line or EOF
                 while( cPeekNext != CHAR_EOF && testCharFlags( cPeekNext, CHAR_EOL ) == sal_False )
                 {
                     getChar();
@@ -485,7 +384,7 @@ sal_Bool SimpleTokenizer_Impl::getNextToken( /*out*/TokenTypes& reType,
            sal_Unicode cPeekNext = peekChar();
            if (cPeekNext=='/')
            {
-               // Alle Zeichen bis Zeilen-Ende oder EOF entfernen
+               // Remove all characters until end of line or EOF
                while( cPeekNext != CHAR_EOF && testCharFlags( cPeekNext, CHAR_EOL ) == sal_False )
                {
                    getChar();
@@ -496,12 +395,12 @@ sal_Bool SimpleTokenizer_Impl::getNextToken( /*out*/TokenTypes& reType,
        }
         else
         {
-            // Kommentar ?
+            // Comment?
             if ( c == '\'' )
             {
-                c = getChar();  // '/' entfernen
+                c = getChar();
 
-                // Alle Zeichen bis Zeilen-Ende oder EOF entfernen
+                // Remove all characters until end of line or EOF
                 sal_Unicode cPeek = c;
                 while( cPeek != CHAR_EOF && testCharFlags( cPeek, CHAR_EOL ) == sal_False )
                 {
@@ -529,36 +428,36 @@ sal_Bool SimpleTokenizer_Impl::getNextToken( /*out*/TokenTypes& reType,
         reType = TT_OPERATOR;
     }
 
-    // Zahl?
+    // Number?
     else if( testCharFlags( c, CHAR_START_NUMBER ) == sal_True )
     {
         reType = TT_NUMBER;
 
-        // Zahlensystem, 10 = normal, wird bei Oct/Hex geaendert
+        // Number system, 10 = normal, it is changed for Oct/Hex
         int nRadix = 10;
 
-        // Ist es eine Hex- oder Oct-Zahl?
+        // Is it an Oct or a Hex number?
         if( c == '&' )
         {
             // Octal?
             if( peekChar() == 'o' || peekChar() == 'O' )
             {
-                // o entfernen
+                // remove o
                 getChar();
-                nRadix = 8;     // Octal-Basis
+                nRadix = 8;     // Octal base
 
-                // Alle Ziffern einlesen
+                // Read all numbers
                 while( testCharFlags( peekChar(), CHAR_IN_OCT_NUMBER ) )
                     c = getChar();
             }
-            // Hex?
+            // Hexadecimal?
             else if( peekChar() == 'h' || peekChar() == 'H' )
             {
-                // x entfernen
+                // remove x
                 getChar();
-                nRadix = 16;     // Hex-Basis
+                nRadix = 16;     // Hexadecimal base
 
-                // Alle Ziffern einlesen und puffern
+                // Read all numbers
                 while( testCharFlags( peekChar(), CHAR_IN_HEX_NUMBER ) )
                     c = getChar();
             }
@@ -568,38 +467,36 @@ sal_Bool SimpleTokenizer_Impl::getNextToken( /*out*/TokenTypes& reType,
             }
         }
 
-        // Wenn nicht Oct oder Hex als double ansehen
+        // When it is not Oct or Hex, then it is double
         if( reType == TT_NUMBER && nRadix == 10 )
         {
-            // Flag, ob das letzte Zeichen ein Exponent war
+            // Flag if the last character is an exponent
             sal_Bool bAfterExpChar = sal_False;
 
-            // Alle Ziffern einlesen
+            // Read all numbers
             while( testCharFlags( peekChar(), CHAR_IN_NUMBER ) ||
                     (bAfterExpChar && peekChar() == '+' ) ||
                     (bAfterExpChar && peekChar() == '-' ) )
-                    // Nach Exponent auch +/- OK
+                    // After exponent +/- are OK, too
             {
-                c = getChar();                  // Zeichen lesen
+                c = getChar();
                 bAfterExpChar = ( c == 'e' || c == 'E' );
             }
         }
-
-        // reType = TT_NUMBER;
     }
 
     // String?
     else if( testCharFlags( c, CHAR_START_STRING ) == sal_True )
     {
-        // Merken, welches Zeichen den String eroeffnet hat
+        // Remember which character has opened the string
         sal_Unicode cEndString = c;
         if( c == '[' )
             cEndString = ']';
 
-        // Alle Ziffern einlesen und puffern
+        // Read all characters
         while( peekChar() != cEndString )
         {
-            // #58846 EOF vor getChar() abfangen, damit EOF micht verloren geht
+            // Detect EOF before getChar(), so we do not loose EOF
             if( peekChar() == CHAR_EOF )
             {
                 // ERROR: unterminated string literal
@@ -615,7 +512,6 @@ sal_Bool SimpleTokenizer_Impl::getNextToken( /*out*/TokenTypes& reType,
             }
         }
 
-        //  Zeichen lesen
         if( reType != TT_ERROR )
         {
             getChar();
@@ -626,25 +522,24 @@ sal_Bool SimpleTokenizer_Impl::getNextToken( /*out*/TokenTypes& reType,
         }
     }
 
-    // Zeilenende?
+    // End of line?
     else if( testCharFlags( c, CHAR_EOL ) == sal_True )
     {
-        // Falls ein weiteres anderes EOL-Char folgt, weg damit
+        // If another EOL character comes, read it
         sal_Unicode cNext = peekChar();
         if( cNext != c && testCharFlags( cNext, CHAR_EOL ) == sal_True )
             getChar();
 
-        // Positions-Daten auf Zeilen-Beginn setzen
+        // Set position data at the line start
         nCol = 0;
         nLine++;
 
         reType = TT_EOL;
     }
 
-    // Alles andere bleibt TT_UNKNOWN
+    // All other will remain TT_UNKNOWN
 
-
-    // End-Position eintragen
+    // Save end position
     rpEndPos = mpActualPos;
     return sal_True;
 }
@@ -653,49 +548,47 @@ SimpleTokenizer_Impl::SimpleTokenizer_Impl( HighlighterLanguage aLang ): aLangua
 {
     memset( aCharTypeTab, 0, sizeof( aCharTypeTab ) );
 
-    // Zeichen-Tabelle fuellen
+    // Fill character table
     sal_uInt16 i;
 
-    // Zulaessige Zeichen fuer Identifier
+    // Allowed characters for identifiers
     sal_uInt16 nHelpMask = (sal_uInt16)( CHAR_START_IDENTIFIER | CHAR_IN_IDENTIFIER );
     for( i = 'a' ; i <= 'z' ; i++ )
         aCharTypeTab[i] |= nHelpMask;
     for( i = 'A' ; i <= 'Z' ; i++ )
         aCharTypeTab[i] |= nHelpMask;
-    // '_' extra eintragen
     aCharTypeTab[(int)'_'] |= nHelpMask;
-    // AB 23.6.97: '$' ist auch erlaubt
     aCharTypeTab[(int)'$'] |= nHelpMask;
 
-    // Ziffern (Identifier und Number ist moeglich)
+    // Digit (can be identifier and number)
     nHelpMask = (sal_uInt16)( CHAR_IN_IDENTIFIER | CHAR_START_NUMBER |
                          CHAR_IN_NUMBER | CHAR_IN_HEX_NUMBER );
     for( i = '0' ; i <= '9' ; i++ )
         aCharTypeTab[i] |= nHelpMask;
 
-    // e und E sowie . von Hand ergaenzen
+    // Add e, E, . and & here manually
     aCharTypeTab[(int)'e'] |= CHAR_IN_NUMBER;
     aCharTypeTab[(int)'E'] |= CHAR_IN_NUMBER;
     aCharTypeTab[(int)'.'] |= (sal_uInt16)( CHAR_IN_NUMBER | CHAR_START_NUMBER );
     aCharTypeTab[(int)'&'] |= CHAR_START_NUMBER;
 
-    // Hex-Ziffern
+    // Hexadecimal digit
     for( i = 'a' ; i <= 'f' ; i++ )
         aCharTypeTab[i] |= CHAR_IN_HEX_NUMBER;
     for( i = 'A' ; i <= 'F' ; i++ )
         aCharTypeTab[i] |= CHAR_IN_HEX_NUMBER;
 
-    // Oct-Ziffern
+    // Octal digit
     for( i = '0' ; i <= '7' ; i++ )
         aCharTypeTab[i] |= CHAR_IN_OCT_NUMBER;
 
-    // String-Beginn/End-Zeichen
+    // String literal start/end characters
     aCharTypeTab[(int)'\''] |= CHAR_START_STRING;
     aCharTypeTab[(int)'\"'] |= CHAR_START_STRING;
     aCharTypeTab[(int)'[']  |= CHAR_START_STRING;
     aCharTypeTab[(int)'`']  |= CHAR_START_STRING;
 
-    // Operator-Zeichen
+    // Operator characters
     aCharTypeTab[(int)'!'] |= CHAR_OPERATOR;
     aCharTypeTab[(int)'%'] |= CHAR_OPERATOR;
     // aCharTypeTab[(int)'&'] |= CHAR_OPERATOR;     Removed because of #i14140
@@ -724,7 +617,7 @@ SimpleTokenizer_Impl::SimpleTokenizer_Impl( HighlighterLanguage aLang ): aLangua
     aCharTypeTab[(int)' ' ] |= CHAR_SPACE;
     aCharTypeTab[(int)'\t'] |= CHAR_SPACE;
 
-    // Zeilen-Ende-Zeichen
+    // End of line characters
     aCharTypeTab[(int)'\r'] |= CHAR_EOL;
     aCharTypeTab[(int)'\n'] |= CHAR_EOL;
 
@@ -743,22 +636,21 @@ SimpleTokenizer_Impl* getSimpleTokenizer( void )
     return pSimpleTokenizer;
 }
 
-// Heraussuchen der jeweils naechsten Funktion aus einem JavaScript-Modul
 sal_uInt16 SimpleTokenizer_Impl::parseLine( sal_uInt32 nParseLine, const String* aSource )
 {
-    // Position auf den Anfang des Source-Strings setzen
+    // Set the position to the beginning of the source string
     mpStringBegin = mpActualPos = aSource->GetBuffer();
 
-    // Zeile und Spalte initialisieren
+    // Initialize row and column
     nLine = nParseLine;
     nCol = 0L;
 
-    // Variablen fuer die Out-Parameter
+    // Variables for the out parameter
     TokenTypes eType;
     const sal_Unicode* pStartPos;
     const sal_Unicode* pEndPos;
 
-    // Schleife ueber alle Tokens
+    // Loop over all the tokens
     sal_uInt16 nTokenCount = 0;
     while( getNextToken( eType, pStartPos, pEndPos ) )
         nTokenCount++;
@@ -769,19 +661,19 @@ sal_uInt16 SimpleTokenizer_Impl::parseLine( sal_uInt32 nParseLine, const String*
 void SimpleTokenizer_Impl::getHighlightPortions( sal_uInt32 nParseLine, const String& rLine,
                                                     /*out*/HighlightPortions& portions  )
 {
-    // Position auf den Anfang des Source-Strings setzen
+    // Set the position to the beginning of the source string
     mpStringBegin = mpActualPos = rLine.GetBuffer();
 
-    // Zeile und Spalte initialisieren
+    // Initialize row and column
     nLine = nParseLine;
     nCol = 0L;
 
-    // Variablen fuer die Out-Parameter
+    // Variables for the out parameter
     TokenTypes eType;
     const sal_Unicode* pStartPos;
     const sal_Unicode* pEndPos;
 
-    // Schleife ueber alle Tokens
+    // Loop over all the tokens
     while( getNextToken( eType, pStartPos, pEndPos ) )
     {
         HighlightPortion portion;
@@ -795,9 +687,6 @@ void SimpleTokenizer_Impl::getHighlightPortions( sal_uInt32 nParseLine, const St
 }
 
 
-//////////////////////////////////////////////////////////////////////////
-// Implementierung des SyntaxHighlighter
-
 SyntaxHighlighter::SyntaxHighlighter()
 {
     m_pSimpleTokenizer = 0;
commit 4ab3d5bb6f6f095375c2eaf200dd285be516feda
Author: Andras Timar <atimar at suse.com>
Date:   Mon Feb 11 19:08:01 2013 +0100

    WaE: warning C4101: 'ex' : unreferenced local variable
    
    Change-Id: I99a66ac3af8e391b5feaeafbb3abd63dcdd2bb2b

diff --git a/helpcompiler/source/BasCodeTagger.cxx b/helpcompiler/source/BasCodeTagger.cxx
index 858db82..339d96b 100644
--- a/helpcompiler/source/BasCodeTagger.cxx
+++ b/helpcompiler/source/BasCodeTagger.cxx
@@ -187,7 +187,7 @@ void BasicCodeTagger::tagBasicCodes()
     }
     catch (TaggerException ex)
     {
-          std::cout << "Some kind of error occured." << std::endl;
+          std::cout << "BasCodeTagger error occured. Error code:" << ex << std::endl;
     }
 
     //tag basic code paragraphs in <bascode> tag
commit d06c698b799e0e4ceaf3a3760c9589fe29dc29a9
Author: Dávid Vastag <davewwpublic at gmail.com>
Date:   Mon Feb 11 16:49:40 2013 +0100

    Basic code syntaxhighlighting added to LibreOffice help
    
    Change-Id: Id47172d0386e7aa28d82178f04b5f626f0c441fe

diff --git a/helpcompiler/Library_helplinker.mk b/helpcompiler/Library_helplinker.mk
index 6820c3b..0d9be0b 100644
--- a/helpcompiler/Library_helplinker.mk
+++ b/helpcompiler/Library_helplinker.mk
@@ -43,8 +43,16 @@ endif
 
 $(eval $(call gb_Library_use_libraries,helplinker,\
     sal \
+    svt \
+    tl \
 ))
 
+$(eval $(call gb_Library_use_internal_api,helplinker,\
+    udkapi \
+    offapi \
+))
+
+
 $(eval $(call gb_Library_use_externals,helplinker,\
     boost_headers \
     expat_utf8 \
@@ -58,6 +66,7 @@ $(eval $(call gb_Library_add_exception_objects,helplinker,\
     helpcompiler/source/LuceneHelper \
     helpcompiler/source/HelpIndexer \
     helpcompiler/source/HelpSearch \
+    helpcompiler/source/BasCodeTagger \
 ))
 
 ifeq ($(strip $(OS)$(CPU)$(COM)),MACOSXPGCC)
diff --git a/helpcompiler/Package_inc.mk b/helpcompiler/Package_inc.mk
index b0717b2..e532d95 100644
--- a/helpcompiler/Package_inc.mk
+++ b/helpcompiler/Package_inc.mk
@@ -15,5 +15,6 @@ $(eval $(call gb_Package_add_file,helpcompiler_inc,inc/helpcompiler/HelpCompiler
 $(eval $(call gb_Package_add_file,helpcompiler_inc,inc/helpcompiler/HelpIndexer.hxx,inc/HelpIndexer.hxx))
 $(eval $(call gb_Package_add_file,helpcompiler_inc,inc/helpcompiler/HelpLinker.hxx,inc/HelpLinker.hxx))
 $(eval $(call gb_Package_add_file,helpcompiler_inc,inc/helpcompiler/HelpSearch.hxx,inc/HelpSearch.hxx))
+$(eval $(call gb_Package_add_file,helpcompiler_inc,inc/helpcompiler/BasCodeTagger.hxx,inc/BasCodeTagger.hxx))
 
 # vim: set noet sw=4 ts=4:
diff --git a/helpcompiler/inc/BasCodeTagger.hxx b/helpcompiler/inc/BasCodeTagger.hxx
new file mode 100644
index 0000000..3cf9261
--- /dev/null
+++ b/helpcompiler/inc/BasCodeTagger.hxx
@@ -0,0 +1,57 @@
+#ifndef BASCODETAGGER_HXX
+#define BASCODETAGGER_HXX
+
+#include <iostream>
+#include <cstdlib>
+#include <string>
+#include <list>
+#include <libxml/xmlmemory.h>
+#include <libxml/parser.h>
+#include <rtl/ustring.hxx>
+#include <svtools/syntaxhighlight.hxx>
+#include <helpcompiler/dllapi.h>
+
+class BasicCodeTagger;
+class LibXmlTreeWalker;
+
+//!Tagger class.
+class L10N_DLLPUBLIC BasicCodeTagger
+{
+  private:
+    xmlDocPtr             m_pDocument;
+    std::list<xmlNodePtr> m_BasicCodeContainerTags;
+    LibXmlTreeWalker   *m_pXmlTreeWalker;
+    std::list<std::string>  m_BasicCodeStringList;
+    SyntaxHighlighter     m_Highlighter;
+    bool m_bTaggingCompleted;
+    void tagParagraph( xmlNodePtr paragraph );
+    xmlChar* getTypeString( TokenTypes tokenType );
+    void getBasicCodeContainerNodes();
+    void tagBasCodeParagraphs();
+
+  public:
+    enum TaggerException { FILE_WRITING, NULL_DOCUMENT, EMPTY_DOCUMENT };
+    BasicCodeTagger( xmlDocPtr rootDoc );
+    ~BasicCodeTagger();
+    void tagBasicCodes();
+    void saveTreeToFile( const std::string& filePath, const std::string& encoding );
+};
+
+//================LibXmlTreeWalker===========================================================
+
+class L10N_DLLPUBLIC LibXmlTreeWalker
+{
+  private:
+    xmlNodePtr            m_pCurrentNode;
+    std::list<xmlNodePtr> m_Queue; //!Queue for breath-first search
+
+  public:
+    LibXmlTreeWalker( xmlDocPtr doc );
+    ~LibXmlTreeWalker() {}
+    void nextNode();
+    xmlNodePtr currentNode();
+    bool end();
+    void ignoreCurrNodesChildren();
+};
+
+#endif
diff --git a/helpcompiler/inc/HelpCompiler.hxx b/helpcompiler/inc/HelpCompiler.hxx
index f0a4177..034a629 100644
--- a/helpcompiler/inc/HelpCompiler.hxx
+++ b/helpcompiler/inc/HelpCompiler.hxx
@@ -71,7 +71,6 @@ namespace fs
         {
             rtl::OUString sWorkingDir;
             osl_getProcessWorkingDir(&sWorkingDir.pData);
-
             rtl::OString tmp(in.c_str());
             rtl::OUString ustrSystemPath(rtl::OStringToOUString(tmp, getThreadTextEncoding()));
             osl::File::getFileURLFromSystemPath(ustrSystemPath, data);
@@ -230,6 +229,7 @@ public:
     HelpCompiler(StreamTable &streamTable,
                 const fs::path &in_inputFile,
                 const fs::path &in_src,
+                const fs::path &in_zipdir,
                 const fs::path &in_resEmbStylesheet,
                 const std::string &in_module,
                 const std::string &in_lang,
@@ -245,9 +245,10 @@ public:
                 const std::string &entryName, const Hashtable &bytesToAdd);
 private:
     xmlDocPtr getSourceDocument(const fs::path &filePath);
+    void sourceDocumentPreWorks( xmlDocPtr doc , const fs::path &filePath);
     xmlNodePtr clone(xmlNodePtr node, const std::string& appl);
     StreamTable &streamTable;
-    const fs::path inputFile, src;
+    const fs::path inputFile, src, zipdir;
     const std::string module, lang;
     const fs::path resEmbStylesheet;
     bool bExtensionMode;
@@ -260,5 +261,4 @@ inline char tocharlower(char c)
 }
 
 #endif
-
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/helpcompiler/source/BasCodeTagger.cxx b/helpcompiler/source/BasCodeTagger.cxx
new file mode 100644
index 0000000..858db82
--- /dev/null
+++ b/helpcompiler/source/BasCodeTagger.cxx
@@ -0,0 +1,251 @@
+#include <helpcompiler/BasCodeTagger.hxx>
+
+LibXmlTreeWalker::LibXmlTreeWalker( xmlDocPtr doc )
+{
+    if ( doc == NULL )
+        throw BasicCodeTagger::NULL_DOCUMENT;
+    m_pCurrentNode = xmlDocGetRootElement( doc );
+    if ( m_pCurrentNode == NULL )
+        throw BasicCodeTagger::EMPTY_DOCUMENT;
+    else if ( m_pCurrentNode->xmlChildrenNode != NULL )
+        m_Queue.push_back( m_pCurrentNode->xmlChildrenNode );
+    nextNode();
+}
+
+void LibXmlTreeWalker::nextNode()
+{
+
+      //next node
+    if ( m_pCurrentNode->next == NULL )
+    {
+        m_pCurrentNode = m_Queue.front();
+        m_Queue.pop_front();
+    }
+    else
+        m_pCurrentNode = m_pCurrentNode->next;
+    //queue chiledren if they exist
+    if ( m_pCurrentNode->xmlChildrenNode != NULL )
+        m_Queue.push_back( m_pCurrentNode->xmlChildrenNode );
+}
+
+void LibXmlTreeWalker::ignoreCurrNodesChildren()
+{
+    if ( m_pCurrentNode->xmlChildrenNode != NULL )
+          m_Queue.pop_back();
+}
+
+bool LibXmlTreeWalker::end()
+{
+    return m_pCurrentNode->next == NULL && m_Queue.empty();
+}
+
+xmlNodePtr LibXmlTreeWalker::currentNode()
+{
+    return m_pCurrentNode;
+}
+
+//======================================================
+
+BasicCodeTagger::BasicCodeTagger( xmlDocPtr rootDoc )
+{
+      if ( rootDoc == NULL )
+          throw NULL_DOCUMENT;
+      m_pDocument = rootDoc;
+    m_pXmlTreeWalker = NULL;
+    m_Highlighter.initialize( HIGHLIGHT_BASIC );
+    m_bTaggingCompleted = false;
+
+}
+
+BasicCodeTagger::~BasicCodeTagger()
+{
+    if ( m_pXmlTreeWalker != NULL )
+      delete m_pXmlTreeWalker;
+}
+//!Gathers all the <bascode> tag nodes from xml tree.
+/*!
+ *    Assumes m_pDocument is valid. Handles m_pXmlTreeWalker and m_BasicCodeContainerTags members.
+ */
+void BasicCodeTagger::getBasicCodeContainerNodes()
+{
+      xmlNodePtr currentNode;
+
+    m_BasicCodeContainerTags.clear();
+
+    if ( m_pXmlTreeWalker != NULL )
+      delete m_pXmlTreeWalker;
+    m_pXmlTreeWalker = new LibXmlTreeWalker( m_pDocument );
+
+    currentNode = m_pXmlTreeWalker->currentNode();
+    if ( !( xmlStrcmp( currentNode->name, (const xmlChar*) "bascode" ) ) )
+    { //Found <bascode>
+        m_BasicCodeContainerTags.push_back( currentNode ); //it goes to the end of the list
+    }
+    while ( !m_pXmlTreeWalker->end() )
+    {
+          m_pXmlTreeWalker->nextNode();
+        if ( !( xmlStrcmp( m_pXmlTreeWalker->currentNode()->name, (const xmlChar*) "bascode" ) ) )
+        { //Found <bascode>
+            m_BasicCodeContainerTags.push_back( m_pXmlTreeWalker->currentNode() ); //it goes to the end of the list
+            m_pXmlTreeWalker->ignoreCurrNodesChildren();
+        }
+    }
+}
+
+//! Extracts Basic Codes containted in <bascode> tags.
+/*!
+ *  For each <bascode> this method iterates trough it's <paragraph> tags and "inserts" <item> tags according
+ *  to the Basic code syntax found in that paragraph.
+ */
+void BasicCodeTagger::tagBasCodeParagraphs()
+{
+    //helper variables
+    xmlNodePtr currBascodeNode;
+    xmlNodePtr currParagraph;
+    while ( !m_BasicCodeContainerTags.empty() )
+    {
+        currBascodeNode = m_BasicCodeContainerTags.front();
+        currParagraph = currBascodeNode->xmlChildrenNode; //first <paragraph>
+        while ( currParagraph != NULL )
+        {
+            tagParagraph( currParagraph );
+            currParagraph=currParagraph->next;
+        }
+        m_BasicCodeContainerTags.pop_front(); //next element
+    }
+}
+
+//! Used by tagBasCodeParagraphs(). It does the work on the current paragraph containing Basic code.
+void BasicCodeTagger::tagParagraph( xmlNodePtr paragraph )
+{
+    //1. get paragraph text
+    xmlChar* codeSnippet;
+    codeSnippet = xmlNodeListGetString( m_pDocument, paragraph->xmlChildrenNode, 1 );
+    if ( codeSnippet == NULL )
+    {
+        return; //no text, nothing more to do here
+    }
+    //2. delete every child from paragraph (except attributes)
+    xmlNodePtr curNode = paragraph->xmlChildrenNode;
+    xmlNodePtr sibling;
+    while ( curNode != NULL )
+    {
+        sibling = curNode->next;
+        xmlUnlinkNode( curNode );
+        xmlFreeNode( curNode );
+        curNode = sibling;
+    }
+
+    //3. create new paragraph content
+    String strLine(
+                    OUString(
+                                reinterpret_cast<const sal_Char*>(codeSnippet),
+                                strlen(
+                                    reinterpret_cast<const char*>(codeSnippet)
+                                ),
+                                RTL_TEXTENCODING_UTF8
+                                )
+                     ) ;
+    m_Highlighter.notifyChange ( 0, 0, &strLine, 1 );
+    HighlightPortions portions;
+    m_Highlighter.getHighlightPortions( 0, strLine, portions );
+    xmlChar* subStr;
+    xmlChar* typeStr;
+    xmlNodePtr text;
+    for ( size_t i=0; i<portions.size(); i++ )
+    {
+        HighlightPortion& r = portions[i];
+        subStr = xmlStrsub( codeSnippet, r.nBegin, r.nEnd-r.nBegin );
+        text = xmlNewText( subStr );
+        if ( r.tokenType != TT_WHITESPACE )
+        {
+            typeStr = getTypeString( r.tokenType );
+            curNode = xmlNewTextChild( paragraph, 0, (xmlChar*)"item", 0 );
+            xmlNewProp( curNode, (xmlChar*)"type", typeStr );
+            xmlAddChild( curNode, text );
+            xmlFree( typeStr );
+        }
+        else
+            xmlAddChild( paragraph, text );
+        xmlFree( subStr );
+    }
+    xmlFree( codeSnippet );
+}
+
+//! Manages tagging process.
+/*!
+ *    This is the "main" function of BasicCodeTagger.
+ */
+void BasicCodeTagger::tagBasicCodes()
+{
+      if ( m_bTaggingCompleted )
+        return;
+    //gather <bascode> nodes
+    try
+    {
+        getBasicCodeContainerNodes();
+    }
+    catch (TaggerException ex)
+    {
+          std::cout << "Some kind of error occured." << std::endl;
+    }
+
+    //tag basic code paragraphs in <bascode> tag
+    tagBasCodeParagraphs();
+    m_bTaggingCompleted = true;
+}
+
+//! Converts SyntaxHighlighter's TokenTypes enum to a type string for <item type=... >
+xmlChar* BasicCodeTagger::getTypeString( TokenTypes tokenType )
+{
+    const char* str;
+    switch ( tokenType )
+    {
+        case TT_UNKNOWN :
+            str = "unknown";
+            break;
+        case TT_IDENTIFIER :
+            str = "identifier";
+            break;
+        case TT_WHITESPACE :
+            str = "whitespace";
+            break;
+        case TT_NUMBER :
+            str = "number";
+            break;
+        case TT_STRING :
+            str = "string";
+            break;
+        case TT_EOL :
+            str = "eol";
+            break;
+        case TT_COMMENT :
+            str = "comment";
+            break;
+        case TT_ERROR :
+            str = "error";
+            break;
+        case TT_OPERATOR :
+            str = "operator";
+            break;
+        case TT_KEYWORDS :
+            str = "keywords";
+            break;
+        case TT_PARAMETER :
+            str = "parameter";
+            break;
+        default :
+            str = "unknown";
+            break;
+    }
+    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;
+}
diff --git a/helpcompiler/source/HelpCompiler.cxx b/helpcompiler/source/HelpCompiler.cxx
index 74b29f5..8c6f66b 100644
--- a/helpcompiler/source/HelpCompiler.cxx
+++ b/helpcompiler/source/HelpCompiler.cxx
@@ -19,6 +19,7 @@
 
 
 #include <helpcompiler/HelpCompiler.hxx>
+#include <helpcompiler/BasCodeTagger.hxx>
 #include <limits.h>
 #include <stdlib.h>
 #include <string.h>
@@ -36,25 +37,55 @@ static void impl_sleep( sal_uInt32 nSec )
 
     osl::Thread::wait( aTime );
 }
-
 HelpCompiler::HelpCompiler(StreamTable &in_streamTable, const fs::path &in_inputFile,
-    const fs::path &in_src, const fs::path &in_resEmbStylesheet,
+    const fs::path &in_src, const fs::path &in_zipdir, const fs::path &in_resEmbStylesheet,
     const std::string &in_module, const std::string &in_lang, bool in_bExtensionMode)
     : streamTable(in_streamTable), inputFile(in_inputFile),
-    src(in_src), module(in_module), lang(in_lang), resEmbStylesheet(in_resEmbStylesheet),
+    src(in_src), zipdir(in_zipdir), module(in_module), lang(in_lang), resEmbStylesheet(in_resEmbStylesheet),
     bExtensionMode( in_bExtensionMode )
 {
     xmlKeepBlanksDefaultValue = 0;
     char* guitmp = getenv("GUI");
     if (guitmp)
     {
-        // WTF?
         gui = (strcmp(guitmp, "UNX") ? gui : "UNIX");
         gui = (strcmp(guitmp, "MAC") ? gui : "MAC");
         gui = (strcmp(guitmp, "WNT") ? gui : "WIN");
     }
 }
 
+void HelpCompiler::sourceDocumentPreWorks( xmlDocPtr doc, const fs::path &filePath )
+{
+    if ( doc )
+    {
+        if ( module == "sbasic" )
+        {
+            try
+            {
+                BasicCodeTagger bct( doc );
+                bct.tagBasicCodes();
+            }
+            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;
+        }
+    }
+}
+
 xmlDocPtr HelpCompiler::getSourceDocument(const fs::path &filePath)
 {
     static const char *params[4 + 1];
@@ -68,6 +99,7 @@ xmlDocPtr HelpCompiler::getSourceDocument(const fs::path &filePath)
             impl_sleep( 3 );
             res = xmlParseFile(filePath.native_file_string().c_str());
         }
+        sourceDocumentPreWorks( res, filePath );
     }
     else
     {
@@ -93,7 +125,7 @@ xmlDocPtr HelpCompiler::getSourceDocument(const fs::path &filePath)
             impl_sleep( 3 );
             doc = xmlParseFile(filePath.native_file_string().c_str());
         }
-
+        sourceDocumentPreWorks( doc, filePath );
         //???res = xmlParseFile(filePath.native_file_string().c_str());
 
         res = xsltApplyStylesheet(cur, doc, params);
diff --git a/helpcompiler/source/HelpLinker.cxx b/helpcompiler/source/HelpLinker.cxx
index 62d3645..4bbe2b6 100644
--- a/helpcompiler/source/HelpLinker.cxx
+++ b/helpcompiler/source/HelpLinker.cxx
@@ -377,7 +377,7 @@ void HelpLinker::link() throw( HelpProcessingException )
             xhpFile = fs::path(xhpFileName, fs::native);
         }
 
-        HelpCompiler hc( streamTable, xhpFile, langsourceRoot,
+        HelpCompiler hc( streamTable, xhpFile, langsourceRoot, zipdir,
             embeddStylesheet, module, lang, bExtensionMode );
 
         HCDBG(std::cerr << "before compile of " << xhpFileName << std::endl);


More information about the Libreoffice-commits mailing list