tagtest.cxx (74cbd1f1) | tagtest.cxx (f6675432) |
---|---|
1/************************************************************** | 1/************************************************************** |
2 * | 2 * |
3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at | 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at |
10 * | 10 * |
11 * http://www.apache.org/licenses/LICENSE-2.0 | 11 * http://www.apache.org/licenses/LICENSE-2.0 |
12 * | 12 * |
13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. | 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. |
19 * | 19 * |
20 *************************************************************/ 21 22 23 24// MARKER(update_precomp.py): autogen include statement, do not remove 25#include "precompiled_l10ntools.hxx" 26#include <tools/string.hxx> 27#include "tagtest.hxx" 28 29#if OSL_DEBUG_LEVEL > 1 30#include <stdio.h> 31#endif 32 33#include "gsicheck.hxx" 34 35#define HAS_FLAG( nFlags, nFlag ) ( ( nFlags & nFlag ) != 0 ) 36#define SET_FLAG( nFlags, nFlag ) ( nFlags |= nFlag ) | 20 *************************************************************/ 21 22 23 24// MARKER(update_precomp.py): autogen include statement, do not remove 25#include "precompiled_l10ntools.hxx" 26#include <tools/string.hxx> 27#include "tagtest.hxx" 28 29#if OSL_DEBUG_LEVEL > 1 30#include <stdio.h> 31#endif 32 33#include "gsicheck.hxx" 34 35#define HAS_FLAG( nFlags, nFlag ) ( ( nFlags & nFlag ) != 0 ) 36#define SET_FLAG( nFlags, nFlag ) ( nFlags |= nFlag ) |
37#define RESET_FLAG( nFlags, nFlag ) ( nFlags &= ~nFlag ) // ~ = Bitweises NOT | 37#define RESET_FLAG( nFlags, nFlag ) ( nFlags &= ~nFlag ) // ~ = bitwise NOT |
38 39 40 41TokenInfo::TokenInfo( TokenId pnId, sal_uInt16 nP, String paStr, ParserMessageList &rErrorList ) 42: bClosed(sal_False) 43, bCloseTag(sal_False) 44, bIsBroken(sal_False) 45, bHasBeenFixed(sal_False) 46, bDone(sal_False) 47, aTokenString( paStr ) 48, nId( pnId ) 49, nPos(nP) 50{ | 38 39 40 41TokenInfo::TokenInfo( TokenId pnId, sal_uInt16 nP, String paStr, ParserMessageList &rErrorList ) 42: bClosed(sal_False) 43, bCloseTag(sal_False) 44, bIsBroken(sal_False) 45, bHasBeenFixed(sal_False) 46, bDone(sal_False) 47, aTokenString( paStr ) 48, nId( pnId ) 49, nPos(nP) 50{ |
51 if ( nId == TAG_COMMONSTART || nId == TAG_COMMONEND ) 52 SplitTag( rErrorList ); | 51 if ( nId == TAG_COMMONSTART || nId == TAG_COMMONEND ) 52 SplitTag( rErrorList ); |
53} 54 55enum tagcheck { TC_START, TC_HAS_TAG_NAME, TC_HAS_PROP_NAME_EQ, TC_HAS_PROP_NAME_EQ_SP, TC_HAS_PROP_NAME_SP, TC_INSIDE_STRING, TC_PROP_FINISHED, TC_CLOSED, TC_CLOSED_SPACE, TC_CLOSETAG, TC_CLOSETAG_HAS_TAG_NAME, TC_FINISHED, TC_ERROR }; 56 57/* 58 \< link href = \"text\" name = \"C\" \> 59START ' ' -> HAS_TAG_NAME 60START '/' -> CLOSED --- 20 unchanged lines hidden (view full) --- 81 82CLOSETAG ' ' -> CLOSETAG_HAS_TAG_NAME 83CLOSETAG '>' -> FINISHED 84CLOSETAG_HAS_TAG_NAME '>' -> FINISHED 85 86*/ 87void TokenInfo::SplitTag( ParserMessageList &rErrorList ) 88{ | 53} 54 55enum tagcheck { TC_START, TC_HAS_TAG_NAME, TC_HAS_PROP_NAME_EQ, TC_HAS_PROP_NAME_EQ_SP, TC_HAS_PROP_NAME_SP, TC_INSIDE_STRING, TC_PROP_FINISHED, TC_CLOSED, TC_CLOSED_SPACE, TC_CLOSETAG, TC_CLOSETAG_HAS_TAG_NAME, TC_FINISHED, TC_ERROR }; 56 57/* 58 \< link href = \"text\" name = \"C\" \> 59START ' ' -> HAS_TAG_NAME 60START '/' -> CLOSED --- 20 unchanged lines hidden (view full) --- 81 82CLOSETAG ' ' -> CLOSETAG_HAS_TAG_NAME 83CLOSETAG '>' -> FINISHED 84CLOSETAG_HAS_TAG_NAME '>' -> FINISHED 85 86*/ 87void TokenInfo::SplitTag( ParserMessageList &rErrorList ) 88{ |
89 sal_uInt16 nLastPos = 2; // skip initial \< 90 sal_uInt16 nCheckPos = nLastPos; 91 String aDelims( String::CreateFromAscii( " \\=>/" ) ); 92 String aPortion; 93 String aValue; // store the value of a property 94 ByteString aName; // store the name of a property/tag 95 sal_Bool bCheckName = sal_False; 96 sal_Bool bCheckEmpty = sal_False; 97 sal_Unicode cDelim; 98 tagcheck aState = TC_START; | 89 sal_uInt16 nLastPos = 2; // skip initial \< 90 sal_uInt16 nCheckPos = nLastPos; 91 String aDelims( String::CreateFromAscii( " \\=>/" ) ); 92 String aPortion; 93 String aValue; // store the value of a property 94 ByteString aName; // store the name of a property/tag 95 sal_Bool bCheckName = sal_False; 96 sal_Bool bCheckEmpty = sal_False; 97 sal_Unicode cDelim; 98 tagcheck aState = TC_START; |
99 | 99 |
100 // skip blanks 101 while ( nLastPos < aTokenString.Len() && aTokenString.GetChar( nLastPos ) == ' ') 102 nLastPos++; | 100 // skip blanks 101 while ( nLastPos < aTokenString.Len() && aTokenString.GetChar( nLastPos ) == ' ') 102 nLastPos++; |
103 | 103 |
104 nCheckPos = aTokenString.SearchChar( aDelims.GetBuffer(), nLastPos ); 105 while ( nCheckPos != STRING_NOTFOUND && !( aState == TC_FINISHED || aState == TC_ERROR ) ) 106 { 107 aPortion = aTokenString.Copy( nLastPos, nCheckPos-nLastPos ); | 104 nCheckPos = aTokenString.SearchChar( aDelims.GetBuffer(), nLastPos ); 105 while ( nCheckPos != STRING_NOTFOUND && !( aState == TC_FINISHED || aState == TC_ERROR ) ) 106 { 107 aPortion = aTokenString.Copy( nLastPos, nCheckPos-nLastPos ); |
108 | 108 |
109 if ( aTokenString.GetChar( nCheckPos ) == '\\' ) 110 nCheckPos++; | 109 if ( aTokenString.GetChar( nCheckPos ) == '\\' ) 110 nCheckPos++; |
111 | 111 |
112 cDelim = aTokenString.GetChar( nCheckPos ); 113 nCheckPos++; | 112 cDelim = aTokenString.GetChar( nCheckPos ); 113 nCheckPos++; |
114 | 114 |
115 switch ( aState ) 116 { | 115 switch ( aState ) 116 { |
117// START ' ' -> HAS_TAG_NAME 118// START '/' -> CLOSED 119// START '>' -> FINISHED 120 case TC_START: 121 aTagName = aPortion; 122 switch ( cDelim ) 123 { 124 case ' ': aState = TC_HAS_TAG_NAME; 125 bCheckName = sal_True; 126 break; | 117// START ' ' -> HAS_TAG_NAME 118// START '/' -> CLOSED 119// START '>' -> FINISHED 120 case TC_START: 121 aTagName = aPortion; 122 switch ( cDelim ) 123 { 124 case ' ': aState = TC_HAS_TAG_NAME; 125 bCheckName = sal_True; 126 break; |
127 case '/': | 127 case '/': |
128 { 129 if ( aPortion.Len() == 0 ) 130 { 131 aState = TC_CLOSETAG; 132 } 133 else 134 { 135 aState = TC_CLOSED; --- 70 unchanged lines hidden (view full) --- 206 } 207 break; 208 209// INSIDE_STRING * -> INSIDE_STRING 210// INSIDE_STRING '"' -> PROP_FINISHED 211 case TC_INSIDE_STRING: 212 switch ( cDelim ) 213 { | 128 { 129 if ( aPortion.Len() == 0 ) 130 { 131 aState = TC_CLOSETAG; 132 } 133 else 134 { 135 aState = TC_CLOSED; --- 70 unchanged lines hidden (view full) --- 206 } 207 break; 208 209// INSIDE_STRING * -> INSIDE_STRING 210// INSIDE_STRING '"' -> PROP_FINISHED 211 case TC_INSIDE_STRING: 212 switch ( cDelim ) 213 { |
214 case '\"': | 214 case '\"': |
215 { 216 aState = TC_PROP_FINISHED; 217 aValue += aPortion; 218 if ( aProperties.find( aName ) == aProperties.end() ) 219 { 220 if ( !IsPropertyValueValid( aName, aValue ) ) 221 { 222 rErrorList.AddError( 25, ByteString("Property '").Append(aName).Append("' has invalid value '").Append(ByteString( aValue, RTL_TEXTENCODING_UTF8 )).Append("' "), *this ); 223 bIsBroken = sal_True; 224 } 225 aProperties[ aName ] = aValue; 226 } 227 else 228 { 229 rErrorList.AddError( 25, ByteString("Property '").Append(aName).Append("' defined twice "), *this ); 230 bIsBroken = sal_True; 231 } 232 } 233 break; | 215 { 216 aState = TC_PROP_FINISHED; 217 aValue += aPortion; 218 if ( aProperties.find( aName ) == aProperties.end() ) 219 { 220 if ( !IsPropertyValueValid( aName, aValue ) ) 221 { 222 rErrorList.AddError( 25, ByteString("Property '").Append(aName).Append("' has invalid value '").Append(ByteString( aValue, RTL_TEXTENCODING_UTF8 )).Append("' "), *this ); 223 bIsBroken = sal_True; 224 } 225 aProperties[ aName ] = aValue; 226 } 227 else 228 { 229 rErrorList.AddError( 25, ByteString("Property '").Append(aName).Append("' defined twice "), *this ); 230 bIsBroken = sal_True; 231 } 232 } 233 break; |
234 default: | 234 default: |
235 { 236 aState = TC_INSIDE_STRING; 237 aValue += aPortion; 238 aValue += cDelim; 239 } 240 } 241 break; 242 --- 83 unchanged lines hidden (view full) --- 326 if ( aPortion.Len() == 0 ) 327 { 328 rErrorList.AddError( 25, "Tag/Property name missing ", *this ); 329 bIsBroken = sal_True; 330 } 331 else 332 { 333 aName = ByteString( aPortion, RTL_TEXTENCODING_UTF8 ); | 235 { 236 aState = TC_INSIDE_STRING; 237 aValue += aPortion; 238 aValue += cDelim; 239 } 240 } 241 break; 242 --- 83 unchanged lines hidden (view full) --- 326 if ( aPortion.Len() == 0 ) 327 { 328 rErrorList.AddError( 25, "Tag/Property name missing ", *this ); 329 bIsBroken = sal_True; 330 } 331 else 332 { 333 aName = ByteString( aPortion, RTL_TEXTENCODING_UTF8 ); |
334 // "a-zA-Z_-.0-9" | 334 // "a-zA-Z_-.0-9" |
335 xub_StrLen nCount; 336 sal_Bool bBroken = sal_False; 337 const sal_Char* aBuf = aName.GetBuffer(); 338 for ( nCount = 0 ; !bBroken && nCount < aName.Len() ; nCount++ ) 339 { 340 bBroken = ! ( ( aBuf[nCount] >= 'a' && aBuf[nCount] <= 'z' ) 341 ||( aBuf[nCount] >= 'A' && aBuf[nCount] <= 'Z' ) 342 ||( aBuf[nCount] >= '0' && aBuf[nCount] <= '9' ) --- 43 unchanged lines hidden (view full) --- 386sal_Bool TokenInfo::IsPropertyRelevant( const ByteString &aName, const String &aValue ) const 387{ 388 if ( aTagName.EqualsAscii( "alt" ) && aName.Equals( "xml-lang" ) ) 389 return sal_False; 390 if ( aTagName.EqualsAscii( "ahelp" ) && aName.Equals( "visibility" ) && aValue.EqualsAscii("visible") ) 391 return sal_False; 392 if ( aTagName.EqualsAscii( "image" ) && (aName.Equals( "width" ) || aName.Equals( "height" )) ) 393 return sal_False; | 335 xub_StrLen nCount; 336 sal_Bool bBroken = sal_False; 337 const sal_Char* aBuf = aName.GetBuffer(); 338 for ( nCount = 0 ; !bBroken && nCount < aName.Len() ; nCount++ ) 339 { 340 bBroken = ! ( ( aBuf[nCount] >= 'a' && aBuf[nCount] <= 'z' ) 341 ||( aBuf[nCount] >= 'A' && aBuf[nCount] <= 'Z' ) 342 ||( aBuf[nCount] >= '0' && aBuf[nCount] <= '9' ) --- 43 unchanged lines hidden (view full) --- 386sal_Bool TokenInfo::IsPropertyRelevant( const ByteString &aName, const String &aValue ) const 387{ 388 if ( aTagName.EqualsAscii( "alt" ) && aName.Equals( "xml-lang" ) ) 389 return sal_False; 390 if ( aTagName.EqualsAscii( "ahelp" ) && aName.Equals( "visibility" ) && aValue.EqualsAscii("visible") ) 391 return sal_False; 392 if ( aTagName.EqualsAscii( "image" ) && (aName.Equals( "width" ) || aName.Equals( "height" )) ) 393 return sal_False; |
394 | 394 |
395 return sal_True; 396} 397 398sal_Bool TokenInfo::IsPropertyValueValid( const ByteString &aName, const String &aValue ) const 399{ 400/* removed due to i56740 401 if ( aTagName.EqualsAscii( "switchinline" ) && aName.Equals( "select" ) ) 402 { 403 return aValue.EqualsAscii("sys") || 404 aValue.EqualsAscii("appl") || 405 aValue.EqualsAscii("distrib"); 406 } */ 407 if ( aTagName.EqualsAscii( "caseinline" ) && aName.Equals( "select" ) ) 408 { | 395 return sal_True; 396} 397 398sal_Bool TokenInfo::IsPropertyValueValid( const ByteString &aName, const String &aValue ) const 399{ 400/* removed due to i56740 401 if ( aTagName.EqualsAscii( "switchinline" ) && aName.Equals( "select" ) ) 402 { 403 return aValue.EqualsAscii("sys") || 404 aValue.EqualsAscii("appl") || 405 aValue.EqualsAscii("distrib"); 406 } */ 407 if ( aTagName.EqualsAscii( "caseinline" ) && aName.Equals( "select" ) ) 408 { |
409 return /*!aValue.EqualsAscii("OS2") && removed due to i56740 */ | 409 return /*!aValue.EqualsAscii("OS2") && removed due to i56740 */ |
410 !aValue.EqualsAscii(""); 411 } 412 413 // we don't know any better so we assume it to be OK 414 return sal_True; 415} 416 417sal_Bool TokenInfo::IsPropertyInvariant( const ByteString &aName, const String &aValue ) const --- 10 unchanged lines hidden (view full) --- 428 return sal_True; 429 } 430 return sal_True; 431} 432 433sal_Bool TokenInfo::IsPropertyFixable( const ByteString &aName ) const 434{ 435 // name everything that is allowed to be fixed automatically here | 410 !aValue.EqualsAscii(""); 411 } 412 413 // we don't know any better so we assume it to be OK 414 return sal_True; 415} 416 417sal_Bool TokenInfo::IsPropertyInvariant( const ByteString &aName, const String &aValue ) const --- 10 unchanged lines hidden (view full) --- 428 return sal_True; 429 } 430 return sal_True; 431} 432 433sal_Bool TokenInfo::IsPropertyFixable( const ByteString &aName ) const 434{ 435 // name everything that is allowed to be fixed automatically here |
436 if ( (aTagName.EqualsAscii( "ahelp" ) && aName.Equals( "hid" )) 437 || (aTagName.EqualsAscii( "link" ) && aName.Equals( "href" )) 438 || (aTagName.EqualsAscii( "alt" ) && aName.Equals( "id" )) 439 || (aTagName.EqualsAscii( "variable" ) && aName.Equals( "id" )) | 436 if ( (aTagName.EqualsAscii( "ahelp" ) && aName.Equals( "hid" )) 437 || (aTagName.EqualsAscii( "link" ) && aName.Equals( "href" )) 438 || (aTagName.EqualsAscii( "alt" ) && aName.Equals( "id" )) 439 || (aTagName.EqualsAscii( "variable" ) && aName.Equals( "id" )) |
440 || (aTagName.EqualsAscii( "image" ) && aName.Equals( "src" )) 441 || (aTagName.EqualsAscii( "image" ) && aName.Equals( "id" ) )) 442 return sal_True; 443 return sal_False; 444} 445 446sal_Bool TokenInfo::MatchesTranslation( TokenInfo& rInfo, sal_Bool bGenErrors, ParserMessageList &rErrorList, sal_Bool bFixTags ) const 447{ 448 // check if tags are equal 449 // check if all existing properties are in the translation as well and 450 // whether they have a matching content (the same in most cases) 451 452 if ( nId != rInfo.nId ) 453 return sal_False; 454 455 if ( !aTagName.Equals( rInfo.aTagName ) ) 456 return sal_False; 457 | 440 || (aTagName.EqualsAscii( "image" ) && aName.Equals( "src" )) 441 || (aTagName.EqualsAscii( "image" ) && aName.Equals( "id" ) )) 442 return sal_True; 443 return sal_False; 444} 445 446sal_Bool TokenInfo::MatchesTranslation( TokenInfo& rInfo, sal_Bool bGenErrors, ParserMessageList &rErrorList, sal_Bool bFixTags ) const 447{ 448 // check if tags are equal 449 // check if all existing properties are in the translation as well and 450 // whether they have a matching content (the same in most cases) 451 452 if ( nId != rInfo.nId ) 453 return sal_False; 454 455 if ( !aTagName.Equals( rInfo.aTagName ) ) 456 return sal_False; 457 |
458 // If one of the tags has formating errors already it does make no sense to check here, so return right away | 458 // If one of the tags has formatting errors already it does make no sense to check here, so return right away |
459 if ( bGenErrors && ( bIsBroken || rInfo.bIsBroken ) ) 460 return sal_True; 461 462 StringHashMap::const_iterator iProp; 463 for( iProp = aProperties.begin() ; iProp != aProperties.end(); ++iProp ) 464 { 465 if ( rInfo.aProperties.find( iProp->first ) != rInfo.aProperties.end() ) 466 { --- 37 unchanged lines hidden (view full) --- 504 { 505 if ( bGenErrors ) 506 rErrorList.AddError( 25, ByteString("Extra Property '").Append(iProp->first).Append("' in Translation "), rInfo ); 507 else return sal_False; 508 } 509 } 510 } 511 | 459 if ( bGenErrors && ( bIsBroken || rInfo.bIsBroken ) ) 460 return sal_True; 461 462 StringHashMap::const_iterator iProp; 463 for( iProp = aProperties.begin() ; iProp != aProperties.end(); ++iProp ) 464 { 465 if ( rInfo.aProperties.find( iProp->first ) != rInfo.aProperties.end() ) 466 { --- 37 unchanged lines hidden (view full) --- 504 { 505 if ( bGenErrors ) 506 rErrorList.AddError( 25, ByteString("Extra Property '").Append(iProp->first).Append("' in Translation "), rInfo ); 507 else return sal_False; 508 } 509 } 510 } 511 |
512 // if we reach here eather | 512 // if we reach here either |
513 // the tags match completely or 514 // the tags match but not the properties and we generated errors for that 515 return sal_True; 516} 517 518String TokenInfo::GetTagName() const 519{ 520 return aTagName; --- 20 unchanged lines hidden (view full) --- 541 aRet.AppendAscii("/"); 542 aRet.AppendAscii("\\>"); 543 return aRet; 544} 545 546 547void ParserMessageList::AddError( sal_uInt16 nErrorNr, ByteString aErrorText, const TokenInfo &rTag ) 548{ | 513 // the tags match completely or 514 // the tags match but not the properties and we generated errors for that 515 return sal_True; 516} 517 518String TokenInfo::GetTagName() const 519{ 520 return aTagName; --- 20 unchanged lines hidden (view full) --- 541 aRet.AppendAscii("/"); 542 aRet.AppendAscii("\\>"); 543 return aRet; 544} 545 546 547void ParserMessageList::AddError( sal_uInt16 nErrorNr, ByteString aErrorText, const TokenInfo &rTag ) 548{ |
549 Insert( new ParserError( nErrorNr, aErrorText, rTag ), LIST_APPEND ); | 549 Insert( new ParserError( nErrorNr, aErrorText, rTag ), LIST_APPEND ); |
550} 551 552void ParserMessageList::AddWarning( sal_uInt16 nErrorNr, ByteString aErrorText, const TokenInfo &rTag ) 553{ | 550} 551 552void ParserMessageList::AddWarning( sal_uInt16 nErrorNr, ByteString aErrorText, const TokenInfo &rTag ) 553{ |
554 Insert( new ParserWarning( nErrorNr, aErrorText, rTag ), LIST_APPEND ); | 554 Insert( new ParserWarning( nErrorNr, aErrorText, rTag ), LIST_APPEND ); |
555} 556 557sal_Bool ParserMessageList::HasErrors() 558{ | 555} 556 557sal_Bool ParserMessageList::HasErrors() 558{ |
559 sal_uInt16 i; 560 for ( i=0 ; i < Count() ; i++ ) 561 if ( GetObject( i )->IsError() ) 562 return sal_True; 563 return sal_False; | 559 sal_uInt16 i; 560 for ( i=0 ; i < Count() ; i++ ) 561 if ( GetObject( i )->IsError() ) 562 return sal_True; 563 return sal_False; |
564} 565 566struct Tag 567{ | 564} 565 566struct Tag 567{ |
568 String GetName() const { return String::CreateFromAscii( pName ); }; | 568 String GetName() const { return String::CreateFromAscii( pName ); }; |
569 const char* pName; 570 TokenId nTag; 571}; 572 573 574static const Tag aKnownTags[] = 575{ 576/* commenting oldstyle tags --- 21 unchanged lines hidden (view full) --- 598 { "<#KEY>", TAG_KEY }, 599 { "<#INDEX>", TAG_INDEX }, 600 601 { "<#REFSTART>", TAG_REFSTART }, 602 603 { "<#GRAPHIC>", TAG_GRAPHIC }, 604 { "<#NEXTVERSION>", TAG_NEXTVERSION }, 605 | 569 const char* pName; 570 TokenId nTag; 571}; 572 573 574static const Tag aKnownTags[] = 575{ 576/* commenting oldstyle tags --- 21 unchanged lines hidden (view full) --- 598 { "<#KEY>", TAG_KEY }, 599 { "<#INDEX>", TAG_INDEX }, 600 601 { "<#REFSTART>", TAG_REFSTART }, 602 603 { "<#GRAPHIC>", TAG_GRAPHIC }, 604 { "<#NEXTVERSION>", TAG_NEXTVERSION }, 605 |
606 // { "<#GROUP_SYSSWITCH>", TAG_GROUP_SYSSWITCH }, | 606 // { "<#GROUP_SYSSWITCH>", TAG_GROUP_SYSSWITCH }, |
607 { "<#WIN>", TAG_WIN }, 608 { "<#UNIX>", TAG_UNIX }, 609 { "<#MAC>", TAG_MAC }, 610 { "<#OS2>", TAG_OS2 }, 611 612// { "<#GROUP_PROGSWITCH>", TAG_GROUP_PROGSWITCH }, 613 { "<#WRITER>", TAG_WRITER }, 614 { "<#CALC>", TAG_CALC }, --- 22 unchanged lines hidden (view full) --- 637// { "<#GROUP_MULTI>", TAG_GROUP_MULTI }, 638 { "<#END>", TAG_END }, 639 { "<#ELSE>", TAG_ELSE }, 640 { "<#VERSIONEND>", TAG_VERSIONEND }, 641 { "<#ENDGRAPHIC>", TAG_ENDGRAPHIC },*/ 642 { "<Common Tag>", TAG_COMMONSTART }, 643 { "</Common Tag>", TAG_COMMONEND }, 644 | 607 { "<#WIN>", TAG_WIN }, 608 { "<#UNIX>", TAG_UNIX }, 609 { "<#MAC>", TAG_MAC }, 610 { "<#OS2>", TAG_OS2 }, 611 612// { "<#GROUP_PROGSWITCH>", TAG_GROUP_PROGSWITCH }, 613 { "<#WRITER>", TAG_WRITER }, 614 { "<#CALC>", TAG_CALC }, --- 22 unchanged lines hidden (view full) --- 637// { "<#GROUP_MULTI>", TAG_GROUP_MULTI }, 638 { "<#END>", TAG_END }, 639 { "<#ELSE>", TAG_ELSE }, 640 { "<#VERSIONEND>", TAG_VERSIONEND }, 641 { "<#ENDGRAPHIC>", TAG_ENDGRAPHIC },*/ 642 { "<Common Tag>", TAG_COMMONSTART }, 643 { "</Common Tag>", TAG_COMMONEND }, 644 |
645 { "<no more tags>", TAG_NOMORETAGS }, | 645 { "<no more tags>", TAG_NOMORETAGS }, |
646 { "", TAG_UNKNOWN_TAG }, 647}; 648 649 650SimpleParser::SimpleParser() 651: nPos( 0 ) 652, aNextTag( TAG_NOMORETAGS, TOK_INVALIDPOS ) 653{ 654} 655 656void SimpleParser::Parse( String PaSource ) 657{ | 646 { "", TAG_UNKNOWN_TAG }, 647}; 648 649 650SimpleParser::SimpleParser() 651: nPos( 0 ) 652, aNextTag( TAG_NOMORETAGS, TOK_INVALIDPOS ) 653{ 654} 655 656void SimpleParser::Parse( String PaSource ) 657{ |
658 aSource = PaSource; | 658 aSource = PaSource; |
659 nPos = 0; 660 aLastToken.Erase(); | 659 nPos = 0; 660 aLastToken.Erase(); |
661 aNextTag = TokenInfo( TAG_NOMORETAGS, TOK_INVALIDPOS ); | 661 aNextTag = TokenInfo( TAG_NOMORETAGS, TOK_INVALIDPOS ); |
662 aTokenList.Clear(); 663}; 664 665TokenInfo SimpleParser::GetNextToken( ParserMessageList &rErrorList ) 666{ 667 TokenInfo aResult; 668 sal_uInt16 nTokenStartPos = 0; 669 if ( aNextTag.nId != TAG_NOMORETAGS ) --- 9 unchanged lines hidden (view full) --- 679 680 // do we have a \< ... \> style tag? 681 if ( aLastToken.Copy(0,2).EqualsAscii( "\\<" ) ) 682 { 683 // check for paired \" \" 684 bool bEven = true; 685 sal_uInt16 nQuotePos = 0; 686 sal_uInt16 nQuotedQuotesPos = aLastToken.SearchAscii( "\\\"" ); | 662 aTokenList.Clear(); 663}; 664 665TokenInfo SimpleParser::GetNextToken( ParserMessageList &rErrorList ) 666{ 667 TokenInfo aResult; 668 sal_uInt16 nTokenStartPos = 0; 669 if ( aNextTag.nId != TAG_NOMORETAGS ) --- 9 unchanged lines hidden (view full) --- 679 680 // do we have a \< ... \> style tag? 681 if ( aLastToken.Copy(0,2).EqualsAscii( "\\<" ) ) 682 { 683 // check for paired \" \" 684 bool bEven = true; 685 sal_uInt16 nQuotePos = 0; 686 sal_uInt16 nQuotedQuotesPos = aLastToken.SearchAscii( "\\\"" ); |
687 sal_uInt16 nQuotedBackPos = aLastToken.SearchAscii( "\\\\" ); // this is only to kick out quoted backslashes | 687 sal_uInt16 nQuotedBackPos = aLastToken.SearchAscii( "\\\\" ); // this is only to kick out quoted backslashes |
688 while ( nQuotedQuotesPos != STRING_NOTFOUND ) 689 { 690 if ( nQuotedBackPos <= nQuotedQuotesPos ) 691 nQuotePos = nQuotedBackPos+2; 692 else 693 { 694 nQuotePos = nQuotedQuotesPos+2; 695 bEven = !bEven; 696 } 697 nQuotedQuotesPos = aLastToken.SearchAscii( "\\\"", nQuotePos ); | 688 while ( nQuotedQuotesPos != STRING_NOTFOUND ) 689 { 690 if ( nQuotedBackPos <= nQuotedQuotesPos ) 691 nQuotePos = nQuotedBackPos+2; 692 else 693 { 694 nQuotePos = nQuotedQuotesPos+2; 695 bEven = !bEven; 696 } 697 nQuotedQuotesPos = aLastToken.SearchAscii( "\\\"", nQuotePos ); |
698 nQuotedBackPos = aLastToken.SearchAscii( "\\\\", nQuotePos ); // this is only to kick out quoted backslashes | 698 nQuotedBackPos = aLastToken.SearchAscii( "\\\\", nQuotePos ); // this is only to kick out quoted backslashes |
699 } 700 if ( !bEven ) 701 { 702 rErrorList.AddError( 24, "Missing quotes ( \\\" ) in Tag", TokenInfo( TAG_UNKNOWN_TAG, nTokenStartPos, aLastToken ) ); 703 } 704 705 // check if we have an end-tag or a start-tag 706 sal_uInt16 nNonBlankStartPos,nNonBlankEndPos; --- 28 unchanged lines hidden (view full) --- 735 return aResult; 736} 737 738String SimpleParser::GetNextTokenString( ParserMessageList &rErrorList, sal_uInt16 &rTagStartPos ) 739{ 740// sal_uInt16 nStyle1StartPos = aSource.SearchAscii( "<#", nPos ); 741 sal_uInt16 nStyle2StartPos = aSource.SearchAscii( "$[", nPos ); 742 sal_uInt16 nStyle3StartPos = aSource.SearchAscii( "\\<", nPos ); | 699 } 700 if ( !bEven ) 701 { 702 rErrorList.AddError( 24, "Missing quotes ( \\\" ) in Tag", TokenInfo( TAG_UNKNOWN_TAG, nTokenStartPos, aLastToken ) ); 703 } 704 705 // check if we have an end-tag or a start-tag 706 sal_uInt16 nNonBlankStartPos,nNonBlankEndPos; --- 28 unchanged lines hidden (view full) --- 735 return aResult; 736} 737 738String SimpleParser::GetNextTokenString( ParserMessageList &rErrorList, sal_uInt16 &rTagStartPos ) 739{ 740// sal_uInt16 nStyle1StartPos = aSource.SearchAscii( "<#", nPos ); 741 sal_uInt16 nStyle2StartPos = aSource.SearchAscii( "$[", nPos ); 742 sal_uInt16 nStyle3StartPos = aSource.SearchAscii( "\\<", nPos ); |
743 sal_uInt16 nStyle4StartPos = aSource.SearchAscii( "\\\\", nPos ); // this is only to kick out quoted backslashes | 743 sal_uInt16 nStyle4StartPos = aSource.SearchAscii( "\\\\", nPos ); // this is only to kick out quoted backslashes |
744 745 rTagStartPos = 0; 746 747/* removing since a \<... is not likely 748 // check if the tag starts with a letter to avoid things like <> <= ... > 749 while ( STRING_NOTFOUND != nStyle3StartPos && !( aSource.Copy( nStyle3StartPos+2, 1 ).IsAlphaAscii() || aSource.GetChar( nStyle3StartPos+2 ) == '/' ) ) 750 nStyle3StartPos = aSource.SearchAscii( "\\<", nStyle3StartPos+1 ); 751*/ 752 if ( STRING_NOTFOUND == nStyle2StartPos && STRING_NOTFOUND == nStyle3StartPos ) | 744 745 rTagStartPos = 0; 746 747/* removing since a \<... is not likely 748 // check if the tag starts with a letter to avoid things like <> <= ... > 749 while ( STRING_NOTFOUND != nStyle3StartPos && !( aSource.Copy( nStyle3StartPos+2, 1 ).IsAlphaAscii() || aSource.GetChar( nStyle3StartPos+2 ) == '/' ) ) 750 nStyle3StartPos = aSource.SearchAscii( "\\<", nStyle3StartPos+1 ); 751*/ 752 if ( STRING_NOTFOUND == nStyle2StartPos && STRING_NOTFOUND == nStyle3StartPos ) |
753 return String(); // no more tokens | 753 return String(); // no more tokens |
754 | 754 |
755 if ( nStyle4StartPos < nStyle2StartPos && nStyle4StartPos <= nStyle3StartPos ) // <= to make sure \\ is always handled first | 755 if ( nStyle4StartPos < nStyle2StartPos && nStyle4StartPos <= nStyle3StartPos ) // <= to make sure \\ is always handled first |
756 { // Skip quoted Backslash 757 nPos = nStyle4StartPos +2; 758 return GetNextTokenString( rErrorList, rTagStartPos ); 759 } 760 | 756 { // Skip quoted Backslash 757 nPos = nStyle4StartPos +2; 758 return GetNextTokenString( rErrorList, rTagStartPos ); 759 } 760 |
761/* if ( nStyle1StartPos < nStyle2StartPos && nStyle1StartPos <= nStyle3StartPos ) // <= to make sure our spechial tags are recognized before all others | 761/* if ( nStyle1StartPos < nStyle2StartPos && nStyle1StartPos <= nStyle3StartPos ) // <= to make sure our special tags are recognized before all others |
762 { // test for <# ... > style tokens 763 sal_uInt16 nEndPos = aSource.SearchAscii( ">", nStyle1StartPos ); 764 if ( nEndPos == STRING_NOTFOUND ) 765 { // Token is incomplete. Skip start and search for better ones 766 nPos = nStyle1StartPos +2; 767 return GetNextTokenString( rErrorList, rTagStartPos ); 768 } 769 nPos = nEndPos; --- 10 unchanged lines hidden (view full) --- 780 } 781 nPos = nEndPos; 782 rTagStartPos = nStyle2StartPos; 783 return aSource.Copy( nStyle2StartPos, nEndPos-nStyle2StartPos +1 ); 784 } 785 else 786 { // test for \< ... \> style tokens 787 sal_uInt16 nEndPos = aSource.SearchAscii( "\\>", nStyle3StartPos); | 762 { // test for <# ... > style tokens 763 sal_uInt16 nEndPos = aSource.SearchAscii( ">", nStyle1StartPos ); 764 if ( nEndPos == STRING_NOTFOUND ) 765 { // Token is incomplete. Skip start and search for better ones 766 nPos = nStyle1StartPos +2; 767 return GetNextTokenString( rErrorList, rTagStartPos ); 768 } 769 nPos = nEndPos; --- 10 unchanged lines hidden (view full) --- 780 } 781 nPos = nEndPos; 782 rTagStartPos = nStyle2StartPos; 783 return aSource.Copy( nStyle2StartPos, nEndPos-nStyle2StartPos +1 ); 784 } 785 else 786 { // test for \< ... \> style tokens 787 sal_uInt16 nEndPos = aSource.SearchAscii( "\\>", nStyle3StartPos); |
788 sal_uInt16 nQuotedBackPos = aSource.SearchAscii( "\\\\", nStyle3StartPos ); // this is only to kick out quoted backslashes | 788 sal_uInt16 nQuotedBackPos = aSource.SearchAscii( "\\\\", nStyle3StartPos ); // this is only to kick out quoted backslashes |
789 while ( nQuotedBackPos <= nEndPos && nQuotedBackPos != STRING_NOTFOUND ) 790 { 791 nEndPos = aSource.SearchAscii( "\\>", nQuotedBackPos +2); | 789 while ( nQuotedBackPos <= nEndPos && nQuotedBackPos != STRING_NOTFOUND ) 790 { 791 nEndPos = aSource.SearchAscii( "\\>", nQuotedBackPos +2); |
792 nQuotedBackPos = aSource.SearchAscii( "\\\\", nQuotedBackPos +2 ); // this is only to kick out quoted backslashes | 792 nQuotedBackPos = aSource.SearchAscii( "\\\\", nQuotedBackPos +2 ); // this is only to kick out quoted backslashes |
793 } 794 if ( nEndPos == STRING_NOTFOUND ) 795 { // Token is incomplete. Skip start and search for better ones 796 nPos = nStyle3StartPos +2; 797 ByteString sTmp( "Tag Start '\\<' without Tag End '\\>': " ); 798 rErrorList.AddError( 24, "Tag Start '\\<' without Tag End '\\>'", TokenInfo( TAG_UNKNOWN_TAG, nStyle3StartPos, aSource.Copy( nStyle3StartPos-10, 20 ) ) ); 799 return GetNextTokenString( rErrorList, rTagStartPos ); 800 } --- 21 unchanged lines hidden (view full) --- 822} 823 824TokenParser::TokenParser() 825: pErrorList( NULL ) 826{} 827 828void TokenParser::Parse( const String &aCode, ParserMessageList* pList ) 829{ | 793 } 794 if ( nEndPos == STRING_NOTFOUND ) 795 { // Token is incomplete. Skip start and search for better ones 796 nPos = nStyle3StartPos +2; 797 ByteString sTmp( "Tag Start '\\<' without Tag End '\\>': " ); 798 rErrorList.AddError( 24, "Tag Start '\\<' without Tag End '\\>'", TokenInfo( TAG_UNKNOWN_TAG, nStyle3StartPos, aSource.Copy( nStyle3StartPos-10, 20 ) ) ); 799 return GetNextTokenString( rErrorList, rTagStartPos ); 800 } --- 21 unchanged lines hidden (view full) --- 822} 823 824TokenParser::TokenParser() 825: pErrorList( NULL ) 826{} 827 828void TokenParser::Parse( const String &aCode, ParserMessageList* pList ) 829{ |
830 pErrorList = pList; | 830 pErrorList = pList; |
831 832 //Scanner initialisieren 833 aParser.Parse( aCode ); 834 835 //erstes Symbol holen 836 aTag = aParser.GetNextToken( *pErrorList ); 837 838 nPfCaseOptions = 0; 839 nAppCaseOptions = 0; 840 bPfCaseActive = sal_False; 841 bAppCaseActive = sal_False; 842 843 nActiveRefTypes = 0; 844 | 831 832 //Scanner initialisieren 833 aParser.Parse( aCode ); 834 835 //erstes Symbol holen 836 aTag = aParser.GetNextToken( *pErrorList ); 837 838 nPfCaseOptions = 0; 839 nAppCaseOptions = 0; 840 bPfCaseActive = sal_False; 841 bAppCaseActive = sal_False; 842 843 nActiveRefTypes = 0; 844 |
845 //Ausfuehren der Start-Produktion | 845 //Ausfuehren der Start-Produktion |
846 Paragraph(); 847 848 //Es wurde nicht die ganze Kette abgearbeitet, bisher ist aber 849 //kein Fehler aufgetreten 850 //=> es wurde ein einleitendes Tag vergessen 851 if ( aTag.nId != TAG_NOMORETAGS ) 852 { 853 switch ( aTag.nId ) --- 39 unchanged lines hidden (view full) --- 893 } 894 break; 895 default: 896 { 897 ParseError( 6, "unexpected Tag", aTag ); 898 } 899 } 900 } | 846 Paragraph(); 847 848 //Es wurde nicht die ganze Kette abgearbeitet, bisher ist aber 849 //kein Fehler aufgetreten 850 //=> es wurde ein einleitendes Tag vergessen 851 if ( aTag.nId != TAG_NOMORETAGS ) 852 { 853 switch ( aTag.nId ) --- 39 unchanged lines hidden (view full) --- 893 } 894 break; 895 default: 896 { 897 ParseError( 6, "unexpected Tag", aTag ); 898 } 899 } 900 } |
901 pErrorList = NULL; | 901 pErrorList = NULL; |
902} 903 904void TokenParser::Paragraph() 905{ 906 switch ( aTag.nId ) 907 { 908 case TAG_GRAPHIC: 909 case TAG_NEXTVERSION: --- 300 unchanged lines hidden (view full) --- 1210 { 1211 match( aTag, TAG_UNDERLINEON ); 1212 Paragraph(); 1213 match( aTag, TAG_UNDERLINEOFF ); 1214 } 1215 break; 1216 case TAG_COMMONSTART: 1217 { | 902} 903 904void TokenParser::Paragraph() 905{ 906 switch ( aTag.nId ) 907 { 908 case TAG_GRAPHIC: 909 case TAG_NEXTVERSION: --- 300 unchanged lines hidden (view full) --- 1210 { 1211 match( aTag, TAG_UNDERLINEON ); 1212 Paragraph(); 1213 match( aTag, TAG_UNDERLINEOFF ); 1214 } 1215 break; 1216 case TAG_COMMONSTART: 1217 { |
1218 //remember tag so we can give the original tag in case of an error 1219 TokenInfo aEndTag( aTag ); 1220 aEndTag.nId = TAG_COMMONEND; | 1218 // remember tag so we can give the original tag in case of an error 1219 TokenInfo aEndTag( aTag ); 1220 aEndTag.nId = TAG_COMMONEND; |
1221 match( aTag, TAG_COMMONSTART ); 1222 Paragraph(); 1223 match( aTag, aEndTag ); 1224 } 1225 break; 1226 default: 1227 ParseError( 10, "<#BOLD>, <#ITALIC>, <#UNDER> expected.", aTag ); 1228 } 1229} 1230 1231 1232void TokenParser::TagRef() 1233{ 1234 switch ( aTag.nId ) 1235 { 1236 case TAG_GRAPHIC: 1237 case TAG_NEXTVERSION: | 1221 match( aTag, TAG_COMMONSTART ); 1222 Paragraph(); 1223 match( aTag, aEndTag ); 1224 } 1225 break; 1226 default: 1227 ParseError( 10, "<#BOLD>, <#ITALIC>, <#UNDER> expected.", aTag ); 1228 } 1229} 1230 1231 1232void TokenParser::TagRef() 1233{ 1234 switch ( aTag.nId ) 1235 { 1236 case TAG_GRAPHIC: 1237 case TAG_NEXTVERSION: |
1238 { | 1238 { |
1239 if ( !HAS_FLAG( nActiveRefTypes, TAG_NOGROUP( aTag.nId ) ) ) 1240 { 1241 TokenId aThisToken = aTag.nId; 1242 SET_FLAG( nActiveRefTypes, TAG_NOGROUP( aThisToken ) ); 1243 match( aTag, aTag ); 1244 Paragraph(); | 1239 if ( !HAS_FLAG( nActiveRefTypes, TAG_NOGROUP( aTag.nId ) ) ) 1240 { 1241 TokenId aThisToken = aTag.nId; 1242 SET_FLAG( nActiveRefTypes, TAG_NOGROUP( aThisToken ) ); 1243 match( aTag, aTag ); 1244 Paragraph(); |
1245 if ( aThisToken == TAG_GRAPHIC ) | 1245 if ( aThisToken == TAG_GRAPHIC ) |
1246 match( aTag, TAG_ENDGRAPHIC ); | 1246 match( aTag, TAG_ENDGRAPHIC ); |
1247 else | 1247 else |
1248 match( aTag, TAG_VERSIONEND ); | 1248 match( aTag, TAG_VERSIONEND ); |
1249 // don't reset since allowed only once per paragraph | 1249 // don't reset since allowed only once per paragraph |
1250 // RESET_FLAG( nActiveRefTypes, TAG_NOGROUP( aThisToken ) ); 1251 } 1252 else 1253 { 1254 ParseError( 11, "Tags <#GRAPHIC>,<#NEXTVERSION> allowed only once per paragraph at", aTag ); 1255 } | 1250 // RESET_FLAG( nActiveRefTypes, TAG_NOGROUP( aThisToken ) ); 1251 } 1252 else 1253 { 1254 ParseError( 11, "Tags <#GRAPHIC>,<#NEXTVERSION> allowed only once per paragraph at", aTag ); 1255 } |
1256 } | 1256 } |
1257 break; 1258 case TAG_AVIS: 1259 case TAG_AHID: 1260 { 1261 if ( !HAS_FLAG( nActiveRefTypes, TAG_NOGROUP( aTag.nId ) ) ) 1262 { 1263 TokenId aThisToken = aTag.nId; 1264 SET_FLAG( nActiveRefTypes, TAG_NOGROUP( aThisToken ) ); --- 12 unchanged lines hidden (view full) --- 1277 case TAG_NAME: 1278 { 1279 1280 } 1281 // NOBREAK 1282 case TAG_KEY: 1283 case TAG_INDEX: 1284 case TAG_TITEL: | 1257 break; 1258 case TAG_AVIS: 1259 case TAG_AHID: 1260 { 1261 if ( !HAS_FLAG( nActiveRefTypes, TAG_NOGROUP( aTag.nId ) ) ) 1262 { 1263 TokenId aThisToken = aTag.nId; 1264 SET_FLAG( nActiveRefTypes, TAG_NOGROUP( aThisToken ) ); --- 12 unchanged lines hidden (view full) --- 1277 case TAG_NAME: 1278 { 1279 1280 } 1281 // NOBREAK 1282 case TAG_KEY: 1283 case TAG_INDEX: 1284 case TAG_TITEL: |
1285 case TAG_REFSTART: | 1285 case TAG_REFSTART: |
1286 { 1287 if ( !HAS_FLAG( nActiveRefTypes, TAG_NOGROUP( aTag.nId ) ) ) 1288 { 1289 TokenId aThisToken = aTag.nId; 1290 match( aTag, aTag ); 1291 if ( aThisToken != TAG_NAME ) 1292 { // TAG_NAME has no TAG_END 1293 SET_FLAG( nActiveRefTypes, TAG_NOGROUP( aThisToken ) ); --- 10 unchanged lines hidden (view full) --- 1304 break; 1305 default: 1306 ParseError( 12, "<#HREF>,<#NAME> or <#KEY> expected.", aTag ); 1307 } 1308} 1309 1310sal_Bool TokenParser::match( const TokenInfo &aCurrentToken, const TokenId &aExpectedToken ) 1311{ | 1286 { 1287 if ( !HAS_FLAG( nActiveRefTypes, TAG_NOGROUP( aTag.nId ) ) ) 1288 { 1289 TokenId aThisToken = aTag.nId; 1290 match( aTag, aTag ); 1291 if ( aThisToken != TAG_NAME ) 1292 { // TAG_NAME has no TAG_END 1293 SET_FLAG( nActiveRefTypes, TAG_NOGROUP( aThisToken ) ); --- 10 unchanged lines hidden (view full) --- 1304 break; 1305 default: 1306 ParseError( 12, "<#HREF>,<#NAME> or <#KEY> expected.", aTag ); 1307 } 1308} 1309 1310sal_Bool TokenParser::match( const TokenInfo &aCurrentToken, const TokenId &aExpectedToken ) 1311{ |
1312 return match( aCurrentToken, TokenInfo( aExpectedToken, TOK_INVALIDPOS ) ); | 1312 return match( aCurrentToken, TokenInfo( aExpectedToken, TOK_INVALIDPOS ) ); |
1313} 1314 1315sal_Bool TokenParser::match( const TokenInfo &aCurrentToken, const TokenInfo &rExpectedToken ) 1316{ | 1313} 1314 1315sal_Bool TokenParser::match( const TokenInfo &aCurrentToken, const TokenInfo &rExpectedToken ) 1316{ |
1317 TokenInfo aExpectedToken( rExpectedToken ); | 1317 TokenInfo aExpectedToken( rExpectedToken ); |
1318 if ( aCurrentToken.nId == aExpectedToken.nId ) 1319 { | 1318 if ( aCurrentToken.nId == aExpectedToken.nId ) 1319 { |
1320 if ( ( aCurrentToken.nId == TAG_COMMONEND | 1320 if ( ( aCurrentToken.nId == TAG_COMMONEND |
1321 && aCurrentToken.GetTagName().Equals( aExpectedToken.GetTagName() ) ) 1322 || aCurrentToken.nId != TAG_COMMONEND ) | 1321 && aCurrentToken.GetTagName().Equals( aExpectedToken.GetTagName() ) ) 1322 || aCurrentToken.nId != TAG_COMMONEND ) |
1323 { 1324 aTag = aParser.GetNextToken( *pErrorList ); 1325 return sal_True; 1326 } | 1323 { 1324 aTag = aParser.GetNextToken( *pErrorList ); 1325 return sal_True; 1326 } |
1327 } 1328 | 1327 } 1328 |
1329 if ( aExpectedToken.nId == TAG_COMMONEND ) 1330 { 1331 aExpectedToken.aTokenString.Insert( String::CreateFromAscii( "Close tag for " ), 0 ); 1332 } | 1329 if ( aExpectedToken.nId == TAG_COMMONEND ) 1330 { 1331 aExpectedToken.aTokenString.Insert( String::CreateFromAscii( "Close tag for " ), 0 ); 1332 } |
1333 | 1333 |
1334 ByteString sTmp( "Expected Symbol" ); 1335 if ( aCurrentToken.nId == TAG_NOMORETAGS ) 1336 { | 1334 ByteString sTmp( "Expected Symbol" ); 1335 if ( aCurrentToken.nId == TAG_NOMORETAGS ) 1336 { |
1337 ParseError( 7, sTmp, aExpectedToken ); | 1337 ParseError( 7, sTmp, aExpectedToken ); |
1338 } 1339 else 1340 { | 1338 } 1339 else 1340 { |
1341 sTmp += ": "; 1342 sTmp += ByteString( aParser.GetLexem( aExpectedToken ), RTL_TEXTENCODING_UTF8 ); 1343 sTmp += " near "; 1344 ParseError( 7, sTmp, aCurrentToken ); | 1341 sTmp += ": "; 1342 sTmp += ByteString( aParser.GetLexem( aExpectedToken ), RTL_TEXTENCODING_UTF8 ); 1343 sTmp += " near "; 1344 ParseError( 7, sTmp, aCurrentToken ); |
1345 } | 1345 } |
1346 return sal_False; 1347} 1348 1349void TokenParser::ParseError( sal_uInt16 nErrNr, ByteString aErrMsg, const TokenInfo &rTag ) 1350{ 1351 pErrorList->AddError( nErrNr, aErrMsg, rTag); 1352 | 1346 return sal_False; 1347} 1348 1349void TokenParser::ParseError( sal_uInt16 nErrNr, ByteString aErrMsg, const TokenInfo &rTag ) 1350{ 1351 pErrorList->AddError( nErrNr, aErrMsg, rTag); 1352 |
1353 // Das Fehlerhafte Tag ueberspringen | 1353 // Das Fehlerhafte Tag ueberspringen |
1354 aTag = aParser.GetNextToken( *pErrorList ); 1355} 1356 1357 1358ParserMessage::ParserMessage( sal_uInt16 PnErrorNr, ByteString PaErrorText, const TokenInfo &rTag ) 1359 : nErrorNr( PnErrorNr ) 1360 , aErrorText( PaErrorText ) 1361 , nTagBegin( 0 ) 1362 , nTagLength( 0 ) 1363{ | 1354 aTag = aParser.GetNextToken( *pErrorList ); 1355} 1356 1357 1358ParserMessage::ParserMessage( sal_uInt16 PnErrorNr, ByteString PaErrorText, const TokenInfo &rTag ) 1359 : nErrorNr( PnErrorNr ) 1360 , aErrorText( PaErrorText ) 1361 , nTagBegin( 0 ) 1362 , nTagLength( 0 ) 1363{ |
1364 String aLexem( SimpleParser::GetLexem( rTag ) ); 1365 aErrorText.Append(": "); | 1364 String aLexem( SimpleParser::GetLexem( rTag ) ); 1365 aErrorText.Append(": "); |
1366 aErrorText += ByteString( aLexem, RTL_TEXTENCODING_UTF8 ); | 1366 aErrorText += ByteString( aLexem, RTL_TEXTENCODING_UTF8 ); |
1367 if ( rTag.nId == TAG_NOMORETAGS ) 1368 aErrorText.Append(" at end of line "); 1369 else if ( rTag.nPos != TOK_INVALIDPOS ) 1370 { 1371 aErrorText.Append(" at Position "); 1372 aErrorText.Append( ByteString::CreateFromInt32( rTag.nPos ) ); 1373 } 1374 nTagBegin = rTag.nPos; | 1367 if ( rTag.nId == TAG_NOMORETAGS ) 1368 aErrorText.Append(" at end of line "); 1369 else if ( rTag.nPos != TOK_INVALIDPOS ) 1370 { 1371 aErrorText.Append(" at Position "); 1372 aErrorText.Append( ByteString::CreateFromInt32( rTag.nPos ) ); 1373 } 1374 nTagBegin = rTag.nPos; |
1375 nTagLength = aLexem.Len(); 1376} 1377 1378ParserError::ParserError( sal_uInt16 ErrorNr, ByteString ErrorText, const TokenInfo &rTag ) 1379: ParserMessage( ErrorNr, ErrorText, rTag ) 1380{} 1381 1382ParserWarning::ParserWarning( sal_uInt16 ErrorNr, ByteString ErrorText, const TokenInfo &rTag ) --- 8 unchanged lines hidden (view full) --- 1391 || TAG_REFINSERT == aTokenId 1392 || TAG_REFSTART == aTokenId 1393 || TAG_NAME == aTokenId 1394 || TAG_HREF == aTokenId 1395 || TAG_AVIS == aTokenId 1396 || TAG_AHID == aTokenId 1397 || TAG_GRAPHIC == aTokenId 1398 || TAG_NEXTVERSION == aTokenId | 1375 nTagLength = aLexem.Len(); 1376} 1377 1378ParserError::ParserError( sal_uInt16 ErrorNr, ByteString ErrorText, const TokenInfo &rTag ) 1379: ParserMessage( ErrorNr, ErrorText, rTag ) 1380{} 1381 1382ParserWarning::ParserWarning( sal_uInt16 ErrorNr, ByteString ErrorText, const TokenInfo &rTag ) --- 8 unchanged lines hidden (view full) --- 1391 || TAG_REFINSERT == aTokenId 1392 || TAG_REFSTART == aTokenId 1393 || TAG_NAME == aTokenId 1394 || TAG_HREF == aTokenId 1395 || TAG_AVIS == aTokenId 1396 || TAG_AHID == aTokenId 1397 || TAG_GRAPHIC == aTokenId 1398 || TAG_NEXTVERSION == aTokenId |
1399 || ( TAG_GROUP_META == aTokenGroup && (aMetaTokens & aTokenId) == aTokenId ) ) 1400 { 1401 if ( TAG_GROUP_META == aTokenGroup ) 1402 aMetaTokens |= aTokenId; 1403 return sal_True; 1404 } 1405 else if ( TAG_COMMONSTART == aTokenId 1406 || TAG_COMMONEND == aTokenId ) 1407 { 1408 String aTagName = aToken.GetTagName(); 1409 return !(aTagName.EqualsIgnoreCaseAscii( "comment" ) | 1399 || ( TAG_GROUP_META == aTokenGroup && (aMetaTokens & aTokenId) == aTokenId ) ) 1400 { 1401 if ( TAG_GROUP_META == aTokenGroup ) 1402 aMetaTokens |= aTokenId; 1403 return sal_True; 1404 } 1405 else if ( TAG_COMMONSTART == aTokenId 1406 || TAG_COMMONEND == aTokenId ) 1407 { 1408 String aTagName = aToken.GetTagName(); 1409 return !(aTagName.EqualsIgnoreCaseAscii( "comment" ) |
1410 || aTagName.EqualsIgnoreCaseAscii( "bookmark_value" ) 1411 || aTagName.EqualsIgnoreCaseAscii( "emph" ) 1412 || aTagName.EqualsIgnoreCaseAscii( "item" ) 1413 || aTagName.EqualsIgnoreCaseAscii( "br" ) ); | 1410 || aTagName.EqualsIgnoreCaseAscii( "bookmark_value" ) 1411 || aTagName.EqualsIgnoreCaseAscii( "emph" ) 1412 || aTagName.EqualsIgnoreCaseAscii( "item" ) 1413 || aTagName.EqualsIgnoreCaseAscii( "br" ) ); |
1414 } 1415 return sal_False; | 1414 } 1415 return sal_False; |
1416} 1417 1418void LingTest::CheckTags( TokenList &aReference, TokenList &aTestee, sal_Bool bFixTags ) 1419{ 1420 sal_uLong i=0,j=0; 1421 // Clean old Warnings 1422 while ( aCompareWarningList.Count() ) 1423 { 1424 delete aCompareWarningList.GetCurObject(); 1425 aCompareWarningList.Remove(); 1426 } 1427 | 1416} 1417 1418void LingTest::CheckTags( TokenList &aReference, TokenList &aTestee, sal_Bool bFixTags ) 1419{ 1420 sal_uLong i=0,j=0; 1421 // Clean old Warnings 1422 while ( aCompareWarningList.Count() ) 1423 { 1424 delete aCompareWarningList.GetCurObject(); 1425 aCompareWarningList.Remove(); 1426 } 1427 |
1428 /* in xml tags, do not require the following tags 1429 comment 1430 bookmark_value 1431 emph 1432 item 1433 br 1434 */ | 1428 /* in xml tags, do not require the following tags 1429 comment 1430 bookmark_value 1431 emph 1432 item 1433 br 1434 */ |
1435 | 1435 |
1436 // filter uninteresting Tags 1437 TokenId aMetaTokens = 0; | 1436 // filter uninteresting Tags 1437 TokenId aMetaTokens = 0; |
1438 for ( i=0 ; i < aReference.Count() ; i++ ) 1439 { 1440 if ( !IsTagMandatory( aReference.GetObject( i ), aMetaTokens ) ) 1441 aReference.GetObject( i ).SetDone(); 1442 } 1443 | 1438 for ( i=0 ; i < aReference.Count() ; i++ ) 1439 { 1440 if ( !IsTagMandatory( aReference.GetObject( i ), aMetaTokens ) ) 1441 aReference.GetObject( i ).SetDone(); 1442 } 1443 |
1444 aMetaTokens = 0; | 1444 aMetaTokens = 0; |
1445 for ( i=0 ; i < aTestee.Count() ; i++ ) 1446 { 1447 if ( !IsTagMandatory( aTestee.GetObject( i ), aMetaTokens ) ) 1448 aTestee.GetObject( i ).SetDone(); 1449 } 1450 | 1445 for ( i=0 ; i < aTestee.Count() ; i++ ) 1446 { 1447 if ( !IsTagMandatory( aTestee.GetObject( i ), aMetaTokens ) ) 1448 aTestee.GetObject( i ).SetDone(); 1449 } 1450 |
1451 // remove all matching tags | 1451 // remove all matching tags |
1452 for ( i=0 ; i < aReference.Count() ; i++ ) | 1452 for ( i=0 ; i < aReference.Count() ; i++ ) |
1453 { 1454 if ( aReference.GetObject( i ).IsDone() ) 1455 continue; | 1453 { 1454 if ( aReference.GetObject( i ).IsDone() ) 1455 continue; |
1456 | 1456 |
1457 sal_Bool bTagFound = sal_False; 1458 for ( j=0 ; j < aTestee.Count() && !bTagFound ; j++ ) 1459 { 1460 if ( aTestee.GetObject( j ).IsDone() ) 1461 continue; | 1457 sal_Bool bTagFound = sal_False; 1458 for ( j=0 ; j < aTestee.Count() && !bTagFound ; j++ ) 1459 { 1460 if ( aTestee.GetObject( j ).IsDone() ) 1461 continue; |
1462 | 1462 |
1463 if ( aReference.GetObject( i ).MatchesTranslation( aTestee.GetObject( j ), sal_False, aCompareWarningList ) ) 1464 { 1465 aReference.GetObject( i ).SetDone(); 1466 aTestee.GetObject( j ).SetDone(); 1467 bTagFound = sal_True; 1468 } 1469 } 1470 } | 1463 if ( aReference.GetObject( i ).MatchesTranslation( aTestee.GetObject( j ), sal_False, aCompareWarningList ) ) 1464 { 1465 aReference.GetObject( i ).SetDone(); 1466 aTestee.GetObject( j ).SetDone(); 1467 bTagFound = sal_True; 1468 } 1469 } 1470 } |
1471 | 1471 |
1472 sal_Bool bCanFix = sal_True; | 1472 sal_Bool bCanFix = sal_True; |
1473 | 1473 |
1474 if ( bFixTags ) 1475 { | 1474 if ( bFixTags ) 1475 { |
1476 // we fix only if its a really simple case 1477 sal_uInt16 nTagCount = 0; 1478 for ( i=0 ; i < aReference.Count() ; i++ ) 1479 if ( !aReference.GetObject( i ).IsDone() ) 1480 nTagCount++; 1481 if ( nTagCount > 1 ) 1482 bCanFix = sal_False; 1483 --- 79 unchanged lines hidden (view full) --- 1563 if ( bFixesDone ) 1564 { 1565 aTestee->SetUText( aFixedTestee ); 1566 aTestee->SetFixed(); 1567 } 1568 } 1569} 1570 | 1476 // we fix only if its a really simple case 1477 sal_uInt16 nTagCount = 0; 1478 for ( i=0 ; i < aReference.Count() ; i++ ) 1479 if ( !aReference.GetObject( i ).IsDone() ) 1480 nTagCount++; 1481 if ( nTagCount > 1 ) 1482 bCanFix = sal_False; 1483 --- 79 unchanged lines hidden (view full) --- 1563 if ( bFixesDone ) 1564 { 1565 aTestee->SetUText( aFixedTestee ); 1566 aTestee->SetFixed(); 1567 } 1568 } 1569} 1570 |
1571 |
|