Update ooo320-m1
[ooovba.git] / sw / source / filter / html / parcss1.hxx
blob5e208805481bbd3e7e67aab3bd218436847fee25
1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: parcss1.hxx,v $
10 * $Revision: 1.4 $
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 ************************************************************************/
31 #ifndef _PARCSS1_HXX
32 #define _PARCSS1_HXX
34 #include <tools/string.hxx>
36 class Color;
38 /* \f */
40 // Die Tokens des CSS1-Parsers
41 enum CSS1Token
43 CSS1_NULL,
44 CSS1_UNKOWN,
46 CSS1_IDENT,
47 CSS1_STRING,
48 CSS1_NUMBER,
49 CSS1_PERCENTAGE,
50 CSS1_LENGTH, // eine absolute Groesse in 1/100 MM
51 CSS1_PIXLENGTH, // eine Pixel-Groesse
52 CSS1_EMS,
53 CSS1_EMX,
54 CSS1_HEXCOLOR,
56 CSS1_DOT_W_WS,
57 CSS1_DOT_WO_WS,
58 CSS1_COLON,
59 CSS1_SLASH,
60 CSS1_PLUS,
61 CSS1_MINUS,
62 CSS1_OBRACE,
63 CSS1_CBRACE,
64 CSS1_SEMICOLON,
65 CSS1_COMMA,
66 CSS1_HASH,
68 CSS1_IMPORT_SYM,
69 // Feature: PrintExt
70 CSS1_PAGE_SYM,
71 // /Feature: PrintExt
73 CSS1_IMPORTANT_SYM,
75 CSS1_URL,
76 CSS1_RGB
80 // die Zustaende des Parsers
81 enum CSS1ParserState
83 CSS1_PAR_ACCEPTED = 0,
84 CSS1_PAR_WORKING,
85 CSS1_PAR_ERROR
89 /* \f */
91 enum CSS1SelectorType
93 CSS1_SELTYPE_ELEMENT,
94 CSS1_SELTYPE_ELEM_CLASS,
95 CSS1_SELTYPE_CLASS,
96 CSS1_SELTYPE_ID,
97 CSS1_SELTYPE_PSEUDO,
98 // Feature: PrintExt
99 CSS1_SELTYPE_PAGE
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
109 // oder
110 // - ein Pseudo-Element
112 // Die Simple-Sektoren werden in einer Liste zu vollstaendigen
113 // Selektoren verkettet
114 class CSS1Selector
116 CSS1SelectorType eType; // Art des Selektors
117 String aSelector; // der Selektor selbst
118 CSS1Selector *pNext; // die naechste Komponente
120 public:
122 CSS1Selector( CSS1SelectorType eTyp, const String &rSel )
123 : eType(eTyp), aSelector( rSel ), pNext( 0 )
126 ~CSS1Selector();
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; }
136 /* \f */
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
145 // verknuepft ist.
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
155 public:
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)
162 ~CSS1Expression();
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 ));
198 /* \f */
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 }
207 // | | | |
208 // | | | DeclP( 'text-align', 'right' )
209 // | | DeclP( 'font-weight', 'bold' )
210 // | SelP( 'H2', sal_False )
211 // SelP( 'H1', sal_True )
213 class CSS1Parser
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
253 void ParseRule();
254 CSS1Selector *ParseSelector();
255 CSS1Expression *ParseDeclaration( String& rProperty );
257 protected:
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,
276 sal_Bool bFirst );
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 );
284 public:
286 CSS1Parser();
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;
296 nlLineNr = nlNum;
297 return nlOld;
300 inline sal_uInt32 CSS1Parser::SetLinePos( sal_uInt32 nlPos )
302 sal_uInt32 nlOld = nlLinePos;
303 nlLinePos = nlPos;
304 return nlOld;
308 #endif