1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: parcss1.hxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
34 #include <tools/string.hxx>
40 // Die Tokens des CSS1-Parsers
50 CSS1_LENGTH
, // eine absolute Groesse in 1/100 MM
51 CSS1_PIXLENGTH
, // eine Pixel-Groesse
80 // die Zustaende des Parsers
83 CSS1_PAR_ACCEPTED
= 0,
94 CSS1_SELTYPE_ELEM_CLASS
,
100 // /Feature: PrintExt
104 // Die folegende Klasse beschreibt einen Simple-Selector, also
105 // - einen HTML-Element-Namen
106 // - einen HTML-Element-Namen mit Klasse (durch '.' getrennt)
107 // - eine Klasse (ohne Punkt)
108 // - eine mit ID=xxx gesetzte ID aus einem HTML-Dokument
110 // - ein Pseudo-Element
112 // Die Simple-Sektoren werden in einer Liste zu vollstaendigen
113 // Selektoren verkettet
116 CSS1SelectorType eType
; // Art des Selektors
117 String aSelector
; // der Selektor selbst
118 CSS1Selector
*pNext
; // die naechste Komponente
122 CSS1Selector( CSS1SelectorType eTyp
, const String
&rSel
)
123 : eType(eTyp
), aSelector( rSel
), pNext( 0 )
128 CSS1SelectorType
GetType() const { return eType
; }
129 const String
& GetString() const { return aSelector
; }
131 void SetNext( CSS1Selector
*pNxt
) { pNext
= pNxt
; }
132 const CSS1Selector
*GetNext() const { return pNext
; }
138 // Die folegende Klasse beschreibt einen Teil-Ausdruck einer
139 // CSS1-Deklaration sie besteht aus
141 // - dem Typ des Ausdrucks (entspricht dem Token)
142 // - dem eigentlichen Wert als String und ggf. double
143 // der double-Wert enthaelt das Vorzeichen fuer NUMBER und LENGTH
144 // - und dem Operator, mit dem er mit dem *Vorganger*-Ausdruck
147 struct CSS1Expression
149 sal_Unicode cOp
; // Art der Verkuepfung mit dem Vorgaenger
150 CSS1Token eType
; // der Typ des Wertes
151 String aValue
; // und sein Wert als String
152 double nValue
; // und als Zahl (TWIPs fuer LENGTH)
153 CSS1Expression
*pNext
; // die naechste Komponente
157 CSS1Expression( CSS1Token eTyp
, const String
&rVal
,
158 double nVal
, sal_Unicode cO
= 0 )
159 : cOp(cO
), eType(eTyp
), aValue(rVal
), nValue(nVal
), pNext(0)
164 inline void Set( CSS1Token eTyp
, const String
&rVal
, double nVal
,
165 sal_Unicode cO
= 0 );
167 CSS1Token
GetType() const { return eType
; }
168 const String
& GetString() const { return aValue
; }
169 double GetNumber() const { return nValue
; }
170 inline sal_uInt32
GetULength() const;
171 inline sal_Int32
GetSLength() const;
172 sal_Unicode
GetOp() const { return cOp
; }
175 sal_Bool
GetURL( String
& rURL
) const;
176 sal_Bool
GetColor( Color
&rRGB
) const;
178 void SetNext( CSS1Expression
*pNxt
) { pNext
= pNxt
; }
179 const CSS1Expression
*GetNext() const { return pNext
; }
182 inline void CSS1Expression::Set( CSS1Token eTyp
, const String
&rVal
,
183 double nVal
, sal_Unicode cO
)
185 cOp
= cO
; eType
= eTyp
; aValue
= rVal
; nValue
= nVal
; pNext
= 0;
188 inline sal_uInt32
CSS1Expression::GetULength() const
190 return nValue
< 0. ? 0UL : (sal_uInt32
)(nValue
+ .5);
193 inline sal_Int32
CSS1Expression::GetSLength() const
195 return (sal_Int32
)(nValue
+ (nValue
< 0. ? -.5 : .5 ));
200 // Diese Klasse parst den Inhalt eines Style-Elements oder eine Style-Option
201 // und bereitet ihn ein wenig auf.
203 // Das Ergebnis des Parsers wird durch die Mehtoden SelectorParsed()
204 // und DeclarationParsed() an abgeleitete Parser uebergeben. Bsp:
206 // H1, H2 { font-weight: bold; text-align: right }
208 // | | | DeclP( 'text-align', 'right' )
209 // | | DeclP( 'font-weight', 'bold' )
210 // | SelP( 'H2', sal_False )
211 // SelP( 'H1', sal_True )
215 sal_Bool bWhiteSpace
: 1; // White-Space gelesen?
216 sal_Bool bEOF
: 1; // Ende des "Files" ?
218 sal_Unicode cNextCh
; // naechstes Zeichen
220 xub_StrLen nInPos
; // aktuelle Position im Input-String
222 sal_uInt32 nlLineNr
; // akt. Zeilen Nummer
223 sal_uInt32 nlLinePos
; // akt. Spalten Nummer
225 double nValue
; // der Wert des Tokens als Zahl
227 CSS1ParserState eState
; // der akteulle Zustand der Parsers
228 CSS1Token nToken
; // das aktuelle Token
230 String aIn
; // der zu parsende String
231 String aToken
; // das Token als String
233 // Parsen vorbereiten
234 void InitRead( const String
& rIn
);
236 // das naechste Zeichen holen
237 sal_Unicode
GetNextChar();
239 // das naechste Token holen
240 CSS1Token
GetNextToken();
242 // arbeitet der Parser noch?
243 sal_Bool
IsParserWorking() const { return CSS1_PAR_WORKING
== eState
; }
245 sal_Bool
IsEOF() const { return bEOF
; }
247 sal_uInt32
IncLineNr() { return ++nlLineNr
; }
248 sal_uInt32
IncLinePos() { return ++nlLinePos
; }
249 inline sal_uInt32
SetLineNr( sal_uInt32 nlNum
); // inline unten
250 inline sal_uInt32
SetLinePos( sal_uInt32 nlPos
); // inline unten
252 // Parsen von Teilen der Grammatik
254 CSS1Selector
*ParseSelector();
255 CSS1Expression
*ParseDeclaration( String
& rProperty
);
259 void ParseStyleSheet();
261 // Den Inhalt eines HTML-Style-Elements parsen.
262 // Fuer jeden Selektor und jede Deklaration wird
263 // SelectorParsed() bzw. DeclarationParsed() aufgerufen.
264 sal_Bool
ParseStyleSheet( const String
& rIn
);
266 // Den Inhalt einer HTML-Style-Option parsen.
267 // F�r jede Deklaration wird DeclarationParsed() aufgerufen.
268 sal_Bool
ParseStyleOption( const String
& rIn
);
270 // Diese Methode wird aufgerufen, wenn ein Selektor geparsed wurde
271 // Wenn 'bFirst' gesetzt ist, beginnt mit dem Selektor eine neue
272 // Deklaration. Wird sal_True zurueckgegeben, wird der Selektor
273 // geloscht, sonst nicht.
274 // Die Implementierung dieser Methode gibt nur sal_True zuruck.
275 virtual sal_Bool
SelectorParsed( const CSS1Selector
*pSelector
,
278 // Diese Methode wird fuer jede geparsete Property aufgerufen. Wird
279 // sal_True zurueckgegeben wird der Selektor geloscht, sonst nicht.
280 // Die Implementierung dieser Methode gibt nur sal_True zuruck.
281 virtual sal_Bool
DeclarationParsed( const String
& rProperty
,
282 const CSS1Expression
*pExpr
);
287 virtual ~CSS1Parser();
289 inline sal_uInt32
GetLineNr() const { return nlLineNr
; }
290 inline sal_uInt32
GetLinePos() const { return nlLinePos
; }
293 inline sal_uInt32
CSS1Parser::SetLineNr( sal_uInt32 nlNum
)
295 sal_uInt32 nlOld
= nlLineNr
;
300 inline sal_uInt32
CSS1Parser::SetLinePos( sal_uInt32 nlPos
)
302 sal_uInt32 nlOld
= nlLinePos
;