generators.cc

    /*
    ** Copyright (C) 1999, 2000, Lorenzo Bettini <lorenzo.bettini@penteres.it>
    **
    ** This program is free software; you can redistribute it and/or modify
    ** it under the terms of the GNU General Public License as published by
    ** the Free Software Foundation; either version 2 of the License, or
    ** (at your option) any later version.
    **
    ** This program is distributed in the hope that it will be useful,
    ** but WITHOUT ANY WARRANTY; without even the implied warranty of
    ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    ** GNU General Public License for more details.
    **
    ** You should have received a copy of the GNU General Public License
    ** along with this program; if not, write to the Free Software
    ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
    **
    */

    // generators.cc

    // generators and decorators

    #include "textgen.h"
    #include "decorators.h"
    #include "tags.h"
    #include "keys.h"

    #define GET_DECORATED( d ) ( d ? d : GlobalGenerator )

    TextGenerator *GlobalGenerator ;
    TextGenerator *KeywordGenerator ;
    TextGenerator *CommentGenerator ;
    TextGenerator *StringGenerator ;
    TextGenerator *TypeGenerator ;
    TextGenerator *NumberGenerator ;

    static TextGenerator *createGenerator( char *key ) ;

    void createGenerators()
    {
      GlobalGenerator = new TextGenerator ;
      KeywordGenerator = createGenerator( KEYWORD ) ;
      CommentGenerator = createGenerator( COMMENT ) ;
      StringGenerator = createGenerator( STRING ) ;
      TypeGenerator = createGenerator( TYPE ) ;
      NumberGenerator = createGenerator( NUMBER ) ;
    }

    void createGeneratorsForCSS()
    {
      GlobalGenerator = new TextGenerator ;
      KeywordGenerator = new SpanDecorator(GlobalGenerator, KEYWORD) ;
      CommentGenerator = new SpanDecorator(GlobalGenerator, COMMENT) ;
      StringGenerator = new SpanDecorator(GlobalGenerator, STRING) ;
      TypeGenerator = new SpanDecorator(GlobalGenerator, TYPE) ;
      NumberGenerator = new SpanDecorator(GlobalGenerator, NUMBER) ;
    }

    TextGenerator *createGenerator( char *key )
    {
      Tag *tag = getTag( key ) ;
      TextDecorator *dec = NULL ;

      if ( ! tag ) // no options
        return GlobalGenerator ;

      char * color = tag->GetColor() ;
      if ( color )
        dec = new ColorDecorator( GlobalGenerator, color ) ;

      if ( tag->IsBold() )
        dec = new TagDecorator( GET_DECORATED( dec ), BOLD_TAG ) ;
      if ( tag->IsItalic() )
        dec = new TagDecorator( GET_DECORATED( dec ), ITALIC_TAG ) ;
      if ( tag->IsUnderline() )
        dec = new TagDecorator( GET_DECORATED( dec ), UNDERLINE_TAG ) ;

      return GET_DECORATED( dec ) ;
      // There should be some options, but it's not ncessary ...
      // so this is just to be safe
    }