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