diff options
author | Nikolai Pretzell <np@openoffice.org> | 2010-11-17 19:19:29 +0100 |
---|---|---|
committer | Nikolai Pretzell <np@openoffice.org> | 2010-11-17 19:19:29 +0100 |
commit | e279d0d774edb89b54f2ddc83eb4c89c83bd71fd (patch) | |
tree | 17ee763f6445a8fb891a55543297f367be2e8151 /autodoc | |
parent | 8f8a8ba23033cdb5b2849a0ada36356e2d30fe51 (diff) |
#115368# Force since tag format.
Diffstat (limited to 'autodoc')
-rw-r--r-- | autodoc/source/parser_i/idoc/docu_pe2.cxx | 126 | ||||
-rw-r--r-- | autodoc/source/parser_i/inc/s2_dsapi/docu_pe2.hxx | 9 |
2 files changed, 114 insertions, 21 deletions
diff --git a/autodoc/source/parser_i/idoc/docu_pe2.cxx b/autodoc/source/parser_i/idoc/docu_pe2.cxx index 084dbbf0660c..64f18f4ee39c 100644 --- a/autodoc/source/parser_i/idoc/docu_pe2.cxx +++ b/autodoc/source/parser_i/idoc/docu_pe2.cxx @@ -30,6 +30,7 @@ // NOT FULLY DEFINED SERVICES +#include <cctype> #include <ary/doc/d_oldidldocu.hxx> #include <ary_i/d_token.hxx> #include <parser/parserinfo.hxx> @@ -128,7 +129,7 @@ SapiDocu_PE::Process_AtTag( const Tok_AtTag & i_rToken ) else if (i_rToken.Id() == Tok_AtTag::since) { pCurAtTag = new DT_SinceAtTag; - fCurTokenAddFunction = &SapiDocu_PE::SetCurSinceAtTagVersion; + fCurTokenAddFunction = &SapiDocu_PE::SetCurSinceAtTagVersion_OOo; } else { @@ -495,10 +496,11 @@ SapiDocu_PE::SetCurSeeAlsoAtTagLinkText_3( DYN ary::inf::DocuToken & let_drNewTo fCurTokenAddFunction = &SapiDocu_PE::AddDocuToken2CurAtTag; } - +const String + C_sSinceFormat("Correct version format: \"OOo <major>.<minor>[.<micro> if micro is not 0]\"."); void -SapiDocu_PE::SetCurSinceAtTagVersion( DYN ary::inf::DocuToken & let_drNewToken ) +SapiDocu_PE::SetCurSinceAtTagVersion_OOo( DYN ary::inf::DocuToken & let_drNewToken ) { csv_assert(pCurAtTag); @@ -511,26 +513,62 @@ SapiDocu_PE::SetCurSinceAtTagVersion( DYN ary::inf::DocuToken & let_drNewToken ) const String sVersion(pToken->GetText()); - const char - cFirst = *sVersion.begin(); - const char - cCiphersend = '9' + 1; + if (NOT CheckVersionSyntax_OOo(sVersion)) + { + Cerr() << "Version information in @since tag has incorrect format.\n" + << "Found: \"" << sVersion << "\"\n" + << C_sSinceFormat + << Endl(); + exit(1); + } + const autodoc::CommandLine & rCommandLine = autodoc::CommandLine::Get_(); + if (NOT rCommandLine.DoesTransform_SinceTag()) + pCurAtTag->AddToken(let_drNewToken); + fCurTokenAddFunction = &SapiDocu_PE::SetCurSinceAtTagVersion_Number; +} - if ( rCommandLine.DoesTransform_SinceTag()) - { - // The @since version number shall be interpreted, +void +SapiDocu_PE::SetCurSinceAtTagVersion_Number( DYN ary::inf::DocuToken & let_drNewToken ) +{ + csv_assert(pCurAtTag); - if ( NOT csv::in_range('0', cFirst, cCiphersend) ) + DT_TextToken * pToken = dynamic_cast< DT_TextToken* >(&let_drNewToken); + if (pToken == 0) + { + if (dynamic_cast< DT_White* >(&let_drNewToken) != 0) { - // But this is a non-number-part, so we wait for - // the next one. - delete &let_drNewToken; - return; + String & + sValue = pCurAtTag->Access_Text().Access_TextOfFirstToken(); + StreamLock + sHelp(1000); + sValue = sHelp() << sValue << " " << c_str; } - else if (rCommandLine.DisplayOf_SinceTagValue(sVersion).empty()) + + delete &let_drNewToken; + return; + } + + const String + sVersion(pToken->GetText()); + if (NOT CheckVersionSyntax_Number(sVersion)) + { + Cerr() << "Version information in @since tag has incorrect format.\n" + << "Found: \"" << sVersion << "\"\n" + << C_sSinceFormat + << Endl(); + exit(1); + } + + const autodoc::CommandLine & + rCommandLine = autodoc::CommandLine::Get_(); + if ( rCommandLine.DoesTransform_SinceTag()) + { + pCurAtTag->AddToken(let_drNewToken); + + if (rCommandLine.DisplayOf_SinceTagValue(sVersion).empty()) { // This is the numbered part, but we don't know it. delete &let_drNewToken; @@ -544,10 +582,10 @@ SapiDocu_PE::SetCurSinceAtTagVersion( DYN ary::inf::DocuToken & let_drNewToken ) throw X_Docu("since", sl().c_str()); } } - - // Either since tags are not specially interpreted, or - // we got a known one. - pCurAtTag->AddToken(let_drNewToken); + else + { + AddDocuToken2SinceAtTag(let_drNewToken); + } fCurTokenAddFunction = &SapiDocu_PE::AddDocuToken2SinceAtTag; } @@ -573,6 +611,54 @@ SapiDocu_PE::AddDocuToken2SinceAtTag( DYN ary::inf::DocuToken & let_drNewToken ) delete &let_drNewToken; } +bool +SapiDocu_PE::CheckVersionSyntax_OOo(const String & i_versionPart1) +{ + return i_versionPart1 == "OOo" + OR i_versionPart1 == "OpenOffice.org"; +} + +bool +SapiDocu_PE::CheckVersionSyntax_Number(const String & i_versionPart2) +{ + if (i_versionPart2.length () == 0) + return false; + + const char + pt = '.'; + int countDigit = 0; + int countPoint = 0; + const char * + pFirstPoint = 0; + const char * + pLastPoint = 0; + + for ( const char * p = i_versionPart2.begin(); + *p != 0; + ++p ) + { + if ( std::isdigit(*p) ) + ++countDigit; + else if (*p == pt) + { + if (countPoint == 0) + pFirstPoint = p; + pLastPoint = p; + ++countPoint; + } + } + + if ( countDigit + countPoint == i_versionPart2.length() // only digits and points + AND pFirstPoint != 0 AND countPoint < 3 // 1 or 2 points + AND pFirstPoint + 1 != pLastPoint // there are digits between two points + AND *i_versionPart2.begin() != pt AND *(pLastPoint + 1) != 0 // points are surrounded by digits + AND (*(pLastPoint + 1) != '0' OR pLastPoint == pFirstPoint) ) // the first micro-digit is not 0 + { + return true; + } + return false; +} + const char * AtTagTitle( const Tok_AtTag & i_rToken ) { diff --git a/autodoc/source/parser_i/inc/s2_dsapi/docu_pe2.hxx b/autodoc/source/parser_i/inc/s2_dsapi/docu_pe2.hxx index 2d1757bbb308..89bf5b504b0f 100644 --- a/autodoc/source/parser_i/inc/s2_dsapi/docu_pe2.hxx +++ b/autodoc/source/parser_i/inc/s2_dsapi/docu_pe2.hxx @@ -144,13 +144,20 @@ class SapiDocu_PE : public TokenInterpreter void SetCurSeeAlsoAtTagLinkText_3( DYN ary::inf::DocuToken & let_drNewToken ); - void SetCurSinceAtTagVersion( + void SetCurSinceAtTagVersion_OOo( + DYN ary::inf::DocuToken & + let_drNewToken ); + void SetCurSinceAtTagVersion_Number( DYN ary::inf::DocuToken & let_drNewToken ); void AddDocuToken2SinceAtTag( DYN ary::inf::DocuToken & let_drNewToken ); + bool CheckVersionSyntax_OOo( + const String & i_versionPart1 ); + bool CheckVersionSyntax_Number( + const String & i_versionPart2 ); // DATA Dyn<ary::doc::OldIdlDocu> pDocu; |