xref: /trunk/main/sw/source/filter/html/parcss1.hxx (revision 63e8b062)
1 /**************************************************************
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
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
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.
19  *
20  *************************************************************/
21 
22 #ifndef _PARCSS1_HXX
23 #define _PARCSS1_HXX
24 
25 #include <tools/string.hxx>
26 
27 class Color;
28 
29 // Die Tokens des CSS1-Parsers
30 enum CSS1Token
31 {
32 	CSS1_NULL,
33 	CSS1_UNKOWN,
34 
35 	CSS1_IDENT,
36 	CSS1_STRING,
37 	CSS1_NUMBER,
38 	CSS1_PERCENTAGE,
39 	CSS1_LENGTH,			// eine absolute Größe in 1/100 mm
40 	CSS1_PIXLENGTH,			// eine Pixel-Größe
41 	CSS1_EMS,
42 	CSS1_EMX,
43 	CSS1_HEXCOLOR,
44 
45 	CSS1_DOT_W_WS,
46 	CSS1_DOT_WO_WS,
47 	CSS1_COLON,
48 	CSS1_SLASH,
49 	CSS1_PLUS,
50 	CSS1_MINUS,
51 	CSS1_OBRACE,
52 	CSS1_CBRACE,
53 	CSS1_SEMICOLON,
54 	CSS1_COMMA,
55 	CSS1_HASH,
56 
57 	CSS1_IMPORT_SYM,
58 // Feature: PrintExt
59 	CSS1_PAGE_SYM,
60 // /Feature: PrintExt
61 
62 	CSS1_IMPORTANT_SYM,
63 
64 	CSS1_URL,
65 	CSS1_RGB
66 };
67 
68 
69 // die Zustände des Parsers
70 enum CSS1ParserState
71 {
72 	CSS1_PAR_ACCEPTED = 0,
73 	CSS1_PAR_WORKING,
74 	CSS1_PAR_ERROR
75 };
76 
77 
78 enum CSS1SelectorType
79 {
80 	CSS1_SELTYPE_ELEMENT,
81 	CSS1_SELTYPE_ELEM_CLASS,
82 	CSS1_SELTYPE_CLASS,
83 	CSS1_SELTYPE_ID,
84 	CSS1_SELTYPE_PSEUDO,
85 // Feature: PrintExt
86 	CSS1_SELTYPE_PAGE
87 // /Feature: PrintExt
88 
89 };
90 
91 // Die folgende Klasse beschreibt einen Simple-Selector, also
92 // - einen HTML-Element-Namen
93 // - einen HTML-Element-Namen mit Klasse (durch '.' getrennt)
94 // - eine Klasse (ohne Punkt)
95 // - eine mit ID=xxx gesetzte ID aus einem HTML-Dokument
96 // oder
97 // - ein Pseudo-Element
98 //
99 // Die Simple-Sektoren werden in einer Liste zu vollständigen
100 // Selektoren verkettet
101 class CSS1Selector
102 {
103 	CSS1SelectorType eType;		// Art des Selektors
104 	String aSelector;			// der Selektor selbst
105 	CSS1Selector *pNext;		// die nächste Komponente
106 
107 public:
108 
CSS1Selector(CSS1SelectorType eTyp,const String & rSel)109 	CSS1Selector( CSS1SelectorType eTyp, const String &rSel )
110 		: eType(eTyp), aSelector( rSel ), pNext( 0 )
111 	{}
112 
113 	~CSS1Selector();
114 
GetType() const115 	CSS1SelectorType GetType() const { return eType; }
GetString() const116 	const String& GetString() const { return aSelector; }
117 
SetNext(CSS1Selector * pNxt)118 	void SetNext( CSS1Selector *pNxt ) { pNext = pNxt; }
GetNext() const119 	const CSS1Selector *GetNext() const { return pNext; }
120 };
121 
122 
123 // Die folgende Klasse beschreibt einen Teil-Ausdruck einer
124 // CSS1-Deklaration sie besteht aus
125 //
126 // - dem Typ des Ausdrucks (entspricht dem Token)
127 // - dem eigentlichen Wert als String und ggf. double
128 //   der double-Wert enthält das Vorzeichen für NUMBER und LENGTH
129 // - und dem Operator, mit dem er mit dem *Vorgänger*-Ausdruck
130 //   verknüpft ist.
131 //
132 struct CSS1Expression
133 {
134 	sal_Unicode cOp;		// Art der Verknüpfung mit dem Vorgänger
135 	CSS1Token eType;		// der Typ des Wertes
136 	String aValue;			// und sein Wert als String
137 	double nValue;			// und als Zahl (TWIPs für LENGTH)
138 	CSS1Expression *pNext;	// die nächste Komponente
139 
140 public:
141 
CSS1ExpressionCSS1Expression142 	CSS1Expression( CSS1Token eTyp, const String &rVal,
143 					double nVal, sal_Unicode cO = 0 )
144 		: cOp(cO), eType(eTyp), aValue(rVal), nValue(nVal), pNext(0)
145 	{}
146 
147 	~CSS1Expression();
148 
149 	inline void Set( CSS1Token eTyp, const String &rVal, double nVal,
150 					 sal_Unicode cO = 0 );
151 
GetTypeCSS1Expression152 	CSS1Token GetType() const { return eType; }
GetStringCSS1Expression153 	const String& GetString() const { return aValue; }
GetNumberCSS1Expression154 	double GetNumber() const { return nValue; }
155 	inline sal_uInt32 GetULength() const;
156 	inline sal_Int32 GetSLength() const;
GetOpCSS1Expression157 	sal_Unicode GetOp() const { return cOp; }
158 
159 
160 	sal_Bool GetURL( String& rURL ) const;
161 	sal_Bool GetColor( Color &rRGB ) const;
162 
SetNextCSS1Expression163 	void SetNext( CSS1Expression *pNxt ) { pNext = pNxt; }
GetNextCSS1Expression164 	const CSS1Expression *GetNext() const { return pNext; }
165 };
166 
Set(CSS1Token eTyp,const String & rVal,double nVal,sal_Unicode cO)167 inline void CSS1Expression::Set( CSS1Token eTyp, const String &rVal,
168 								 double nVal, sal_Unicode cO )
169 {
170 	cOp = cO; eType = eTyp; aValue = rVal; nValue = nVal; pNext = 0;
171 }
172 
GetULength() const173 inline sal_uInt32 CSS1Expression::GetULength() const
174 {
175 	return nValue < 0. ? 0UL : (sal_uInt32)(nValue + .5);
176 }
177 
GetSLength() const178 inline sal_Int32 CSS1Expression::GetSLength() const
179 {
180 	return (sal_Int32)(nValue + (nValue < 0. ? -.5 : .5 ));
181 }
182 
183 // Diese Klasse parst den Inhalt eines Style-Elements oder eine Style-Option
184 // und bereitet ihn ein wenig auf.
185 //
186 // Das Ergebnis des Parsers wird durch die Methoden SelectorParsed()
187 // und DeclarationParsed() an abgeleitete Parser übergeben. Bsp:
188 //
189 // H1, H2 { font-weight: bold; text-align: right }
190 //  |  |				    | 				   |
191 //  |  |                    |                  DeclP( 'text-align', 'right' )
192 //  |  |				    DeclP( 'font-weight', 'bold' )
193 //  |  SelP( 'H2', sal_False )
194 //  SelP( 'H1', sal_True )
195 //
196 class CSS1Parser
197 {
198 	sal_Bool bWhiteSpace : 1;			// White-Space gelesen?
199 	sal_Bool bEOF : 1;					// Ende des "Files" ?
200 
201 	sal_Unicode cNextCh;				// nächstes Zeichen
202 
203 	xub_StrLen nInPos;					// aktuelle Position im Input-String
204 
205 	sal_uInt32 nlLineNr;				// akt. Zeilen Nummer
206 	sal_uInt32 nlLinePos;				// akt. Spalten Nummer
207 
208 	double nValue;					// der Wert des Tokens als Zahl
209 
210 	CSS1ParserState eState;			// der aktuelle Zustand der Parsers
211 	CSS1Token nToken;				// das aktuelle Token
212 
213 	String aIn;						// der zu parsende String
214 	String aToken;					// das Token als String
215 
216 	// Parsen vorbereiten
217 	void InitRead( const String& rIn );
218 
219 	// das nächste Zeichen holen
220 	sal_Unicode GetNextChar();
221 
222 	// das nächste Token holen
223 	CSS1Token GetNextToken();
224 
225 	// arbeitet der Parser noch?
IsParserWorking() const226 	sal_Bool IsParserWorking() const { return CSS1_PAR_WORKING == eState; }
227 
IsEOF() const228 	sal_Bool IsEOF() const { return bEOF; }
229 
IncLineNr()230 	sal_uInt32 IncLineNr() { return ++nlLineNr; }
IncLinePos()231 	sal_uInt32 IncLinePos() { return ++nlLinePos; }
232 	inline sal_uInt32 SetLineNr( sal_uInt32 nlNum );			// inline unten
233 	inline sal_uInt32 SetLinePos( sal_uInt32 nlPos );			// inline unten
234 
235 	// Parsen von Teilen der Grammatik
236 	void ParseRule();
237 	CSS1Selector *ParseSelector();
238 	CSS1Expression *ParseDeclaration( String& rProperty );
239 
240 protected:
241 
242 	void ParseStyleSheet();
243 
244 	// Den Inhalt eines HTML-Style-Elements parsen.
245 	// Für jeden Selektor und jede Deklaration wird
246 	// SelectorParsed() bzw. DeclarationParsed() aufgerufen.
247 	sal_Bool ParseStyleSheet( const String& rIn );
248 
249 	// Den Inhalt einer HTML-Style-Option parsen.
250 	// Für jede Deklaration wird DeclarationParsed() aufgerufen.
251 	sal_Bool ParseStyleOption( const String& rIn );
252 
253 	// Diese Methode wird aufgerufen, wenn ein Selektor geparsed wurde
254 	// Wenn 'bFirst' gesetzt ist, beginnt mit dem Selektor eine neue
255 	// Deklaration. Wird sal_True zurückgegeben, wird der Selektor
256 	// gelöscht, sonst nicht.
257 	// Die Implementierung dieser Methode gibt nur sal_True zurück.
258 	virtual sal_Bool SelectorParsed( const CSS1Selector *pSelector,
259 								 sal_Bool bFirst );
260 
261 	// Diese Methode wird für jede geparste Property aufgerufen. Wird
262 	// sal_True zurückgegeben wird der Selektor gelöscht, sonst nicht.
263 	// Die Implementierung dieser Methode gibt nur sal_True zurück.
264 	virtual sal_Bool DeclarationParsed( const String& rProperty,
265 									const CSS1Expression *pExpr );
266 
267 public:
268 
269 	CSS1Parser();
270 	virtual ~CSS1Parser();
271 
GetLineNr() const272 	inline sal_uInt32	GetLineNr() const		{ return nlLineNr; }
GetLinePos() const273 	inline sal_uInt32	GetLinePos() const		{ return nlLinePos; }
274 };
275 
SetLineNr(sal_uInt32 nlNum)276 inline sal_uInt32 CSS1Parser::SetLineNr( sal_uInt32 nlNum )
277 {
278 	sal_uInt32 nlOld = nlLineNr;
279 	nlLineNr = nlNum;
280 	return nlOld;
281 }
282 
SetLinePos(sal_uInt32 nlPos)283 inline sal_uInt32 CSS1Parser::SetLinePos( sal_uInt32 nlPos )
284 {
285 	sal_uInt32 nlOld = nlLinePos;
286 	nlLinePos = nlPos;
287 	return nlOld;
288 }
289 
290 
291 #endif
292 
293 /* vim: set noet sw=4 ts=4: */
294