| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| #ifndef _PARCSS1_HXX |
| #define _PARCSS1_HXX |
| |
| #include <tools/string.hxx> |
| |
| class Color; |
| |
| /* */ |
| |
| // Die Tokens des CSS1-Parsers |
| enum CSS1Token |
| { |
| CSS1_NULL, |
| CSS1_UNKOWN, |
| |
| CSS1_IDENT, |
| CSS1_STRING, |
| CSS1_NUMBER, |
| CSS1_PERCENTAGE, |
| CSS1_LENGTH, // eine absolute Groesse in 1/100 MM |
| CSS1_PIXLENGTH, // eine Pixel-Groesse |
| CSS1_EMS, |
| CSS1_EMX, |
| CSS1_HEXCOLOR, |
| |
| CSS1_DOT_W_WS, |
| CSS1_DOT_WO_WS, |
| CSS1_COLON, |
| CSS1_SLASH, |
| CSS1_PLUS, |
| CSS1_MINUS, |
| CSS1_OBRACE, |
| CSS1_CBRACE, |
| CSS1_SEMICOLON, |
| CSS1_COMMA, |
| CSS1_HASH, |
| |
| CSS1_IMPORT_SYM, |
| // Feature: PrintExt |
| CSS1_PAGE_SYM, |
| // /Feature: PrintExt |
| |
| CSS1_IMPORTANT_SYM, |
| |
| CSS1_URL, |
| CSS1_RGB |
| }; |
| |
| |
| // die Zustaende des Parsers |
| enum CSS1ParserState |
| { |
| CSS1_PAR_ACCEPTED = 0, |
| CSS1_PAR_WORKING, |
| CSS1_PAR_ERROR |
| }; |
| |
| |
| /* */ |
| |
| enum CSS1SelectorType |
| { |
| CSS1_SELTYPE_ELEMENT, |
| CSS1_SELTYPE_ELEM_CLASS, |
| CSS1_SELTYPE_CLASS, |
| CSS1_SELTYPE_ID, |
| CSS1_SELTYPE_PSEUDO, |
| // Feature: PrintExt |
| CSS1_SELTYPE_PAGE |
| // /Feature: PrintExt |
| |
| }; |
| |
| // Die folegende Klasse beschreibt einen Simple-Selector, also |
| // - einen HTML-Element-Namen |
| // - einen HTML-Element-Namen mit Klasse (durch '.' getrennt) |
| // - eine Klasse (ohne Punkt) |
| // - eine mit ID=xxx gesetzte ID aus einem HTML-Dokument |
| // oder |
| // - ein Pseudo-Element |
| // |
| // Die Simple-Sektoren werden in einer Liste zu vollstaendigen |
| // Selektoren verkettet |
| class CSS1Selector |
| { |
| CSS1SelectorType eType; // Art des Selektors |
| String aSelector; // der Selektor selbst |
| CSS1Selector *pNext; // die naechste Komponente |
| |
| public: |
| |
| CSS1Selector( CSS1SelectorType eTyp, const String &rSel ) |
| : eType(eTyp), aSelector( rSel ), pNext( 0 ) |
| {} |
| |
| ~CSS1Selector(); |
| |
| CSS1SelectorType GetType() const { return eType; } |
| const String& GetString() const { return aSelector; } |
| |
| void SetNext( CSS1Selector *pNxt ) { pNext = pNxt; } |
| const CSS1Selector *GetNext() const { return pNext; } |
| }; |
| |
| |
| /* */ |
| |
| // Die folegende Klasse beschreibt einen Teil-Ausdruck einer |
| // CSS1-Deklaration sie besteht aus |
| // |
| // - dem Typ des Ausdrucks (entspricht dem Token) |
| // - dem eigentlichen Wert als String und ggf. double |
| // der double-Wert enthaelt das Vorzeichen fuer NUMBER und LENGTH |
| // - und dem Operator, mit dem er mit dem *Vorganger*-Ausdruck |
| // verknuepft ist. |
| // |
| struct CSS1Expression |
| { |
| sal_Unicode cOp; // Art der Verkuepfung mit dem Vorgaenger |
| CSS1Token eType; // der Typ des Wertes |
| String aValue; // und sein Wert als String |
| double nValue; // und als Zahl (TWIPs fuer LENGTH) |
| CSS1Expression *pNext; // die naechste Komponente |
| |
| public: |
| |
| CSS1Expression( CSS1Token eTyp, const String &rVal, |
| double nVal, sal_Unicode cO = 0 ) |
| : cOp(cO), eType(eTyp), aValue(rVal), nValue(nVal), pNext(0) |
| {} |
| |
| ~CSS1Expression(); |
| |
| inline void Set( CSS1Token eTyp, const String &rVal, double nVal, |
| sal_Unicode cO = 0 ); |
| |
| CSS1Token GetType() const { return eType; } |
| const String& GetString() const { return aValue; } |
| double GetNumber() const { return nValue; } |
| inline sal_uInt32 GetULength() const; |
| inline sal_Int32 GetSLength() const; |
| sal_Unicode GetOp() const { return cOp; } |
| |
| |
| sal_Bool GetURL( String& rURL ) const; |
| sal_Bool GetColor( Color &rRGB ) const; |
| |
| void SetNext( CSS1Expression *pNxt ) { pNext = pNxt; } |
| const CSS1Expression *GetNext() const { return pNext; } |
| }; |
| |
| inline void CSS1Expression::Set( CSS1Token eTyp, const String &rVal, |
| double nVal, sal_Unicode cO ) |
| { |
| cOp = cO; eType = eTyp; aValue = rVal; nValue = nVal; pNext = 0; |
| } |
| |
| inline sal_uInt32 CSS1Expression::GetULength() const |
| { |
| return nValue < 0. ? 0UL : (sal_uInt32)(nValue + .5); |
| } |
| |
| inline sal_Int32 CSS1Expression::GetSLength() const |
| { |
| return (sal_Int32)(nValue + (nValue < 0. ? -.5 : .5 )); |
| } |
| |
| /* */ |
| |
| // Diese Klasse parst den Inhalt eines Style-Elements oder eine Style-Option |
| // und bereitet ihn ein wenig auf. |
| // |
| // Das Ergebnis des Parsers wird durch die Mehtoden SelectorParsed() |
| // und DeclarationParsed() an abgeleitete Parser uebergeben. Bsp: |
| // |
| // H1, H2 { font-weight: bold; text-align: right } |
| // | | | | |
| // | | | DeclP( 'text-align', 'right' ) |
| // | | DeclP( 'font-weight', 'bold' ) |
| // | SelP( 'H2', sal_False ) |
| // SelP( 'H1', sal_True ) |
| // |
| class CSS1Parser |
| { |
| sal_Bool bWhiteSpace : 1; // White-Space gelesen? |
| sal_Bool bEOF : 1; // Ende des "Files" ? |
| |
| sal_Unicode cNextCh; // naechstes Zeichen |
| |
| xub_StrLen nInPos; // aktuelle Position im Input-String |
| |
| sal_uInt32 nlLineNr; // akt. Zeilen Nummer |
| sal_uInt32 nlLinePos; // akt. Spalten Nummer |
| |
| double nValue; // der Wert des Tokens als Zahl |
| |
| CSS1ParserState eState; // der akteulle Zustand der Parsers |
| CSS1Token nToken; // das aktuelle Token |
| |
| String aIn; // der zu parsende String |
| String aToken; // das Token als String |
| |
| // Parsen vorbereiten |
| void InitRead( const String& rIn ); |
| |
| // das naechste Zeichen holen |
| sal_Unicode GetNextChar(); |
| |
| // das naechste Token holen |
| CSS1Token GetNextToken(); |
| |
| // arbeitet der Parser noch? |
| sal_Bool IsParserWorking() const { return CSS1_PAR_WORKING == eState; } |
| |
| sal_Bool IsEOF() const { return bEOF; } |
| |
| sal_uInt32 IncLineNr() { return ++nlLineNr; } |
| sal_uInt32 IncLinePos() { return ++nlLinePos; } |
| inline sal_uInt32 SetLineNr( sal_uInt32 nlNum ); // inline unten |
| inline sal_uInt32 SetLinePos( sal_uInt32 nlPos ); // inline unten |
| |
| // Parsen von Teilen der Grammatik |
| void ParseRule(); |
| CSS1Selector *ParseSelector(); |
| CSS1Expression *ParseDeclaration( String& rProperty ); |
| |
| protected: |
| |
| void ParseStyleSheet(); |
| |
| // Den Inhalt eines HTML-Style-Elements parsen. |
| // Fuer jeden Selektor und jede Deklaration wird |
| // SelectorParsed() bzw. DeclarationParsed() aufgerufen. |
| sal_Bool ParseStyleSheet( const String& rIn ); |
| |
| // Den Inhalt einer HTML-Style-Option parsen. |
| // F�r jede Deklaration wird DeclarationParsed() aufgerufen. |
| sal_Bool ParseStyleOption( const String& rIn ); |
| |
| // Diese Methode wird aufgerufen, wenn ein Selektor geparsed wurde |
| // Wenn 'bFirst' gesetzt ist, beginnt mit dem Selektor eine neue |
| // Deklaration. Wird sal_True zurueckgegeben, wird der Selektor |
| // geloscht, sonst nicht. |
| // Die Implementierung dieser Methode gibt nur sal_True zuruck. |
| virtual sal_Bool SelectorParsed( const CSS1Selector *pSelector, |
| sal_Bool bFirst ); |
| |
| // Diese Methode wird fuer jede geparsete Property aufgerufen. Wird |
| // sal_True zurueckgegeben wird der Selektor geloscht, sonst nicht. |
| // Die Implementierung dieser Methode gibt nur sal_True zuruck. |
| virtual sal_Bool DeclarationParsed( const String& rProperty, |
| const CSS1Expression *pExpr ); |
| |
| public: |
| |
| CSS1Parser(); |
| virtual ~CSS1Parser(); |
| |
| inline sal_uInt32 GetLineNr() const { return nlLineNr; } |
| inline sal_uInt32 GetLinePos() const { return nlLinePos; } |
| }; |
| |
| inline sal_uInt32 CSS1Parser::SetLineNr( sal_uInt32 nlNum ) |
| { |
| sal_uInt32 nlOld = nlLineNr; |
| nlLineNr = nlNum; |
| return nlOld; |
| } |
| |
| inline sal_uInt32 CSS1Parser::SetLinePos( sal_uInt32 nlPos ) |
| { |
| sal_uInt32 nlOld = nlLinePos; |
| nlLinePos = nlPos; |
| return nlOld; |
| } |
| |
| |
| #endif |
| |
| |