HTML_Generator/RB_HTML_Generate_Extra [ Functions ]
FUNCTION
Do some additional processing to detect HTML extra's like file references and other kind of links for the documentation body of an item.
SYNOPSIS
int RB_HTML_Generate_Extra( FILE *dest_doc, enum ItemType item_type, char *cur_char, char prev_char )
INPUTS
- dest_doc -- the file to write to.
- item_type -- the kind of item the body belongs to.
- cur_char -- pointer to a substring of the item's body
- prev_char -- the character just before cur char (zero if none)
RESULTS
Number of characters produced.
SOURCE
{ char link[1024], *str; int res = -1; unsigned int i; static int incomment = 0; /* are we in comment? */ static int quote = 0; /* double quote */ static int squote = 0; /* single quote */ // Reset comment and quote state machine if not source item if ( !Works_Like_SourceItem( item_type ) ) { quote = 0; squote = 0; incomment = 0; in_linecomment = 0; } // else check for quotations and string literals else if ( !( incomment || in_linecomment ) ) { switch ( *cur_char ) { // Check for quoted string literals ("string") case '\"': if ( !squote && course_of_action.do_quotes ) { if ( prev_char != '\\' ) { quote = !quote; RB_HTML_Color_String( dest_doc, quote, QUOTE_CLASS, "\"" ); return 0; } else if ( quote && *( ( char * ) ( cur_char - 2 ) ) == '\\' ) { quote = !quote; /* case "... \\" */ RB_HTML_Color_String( dest_doc, quote, QUOTE_CLASS, "\"" ); return 0; } } break; // Check for single quoted string literals ('string') case '\'': if ( !quote && course_of_action.do_squotes ) { if ( prev_char != '\\' ) { squote = !squote; RB_HTML_Color_String( dest_doc, squote, SQUOTE_CLASS, "\'" ); return 0; } else if ( squote && *( ( char * ) ( cur_char - 2 ) ) == '\\' ) { squote = !squote; /* case '\\' */ RB_HTML_Color_String( dest_doc, squote, SQUOTE_CLASS, "\'" ); return 0; } } break; default: break; } } // Recognise line comments if ( Works_Like_SourceItem( item_type ) && !incomment && !quote && !squote && course_of_action.do_line_comments ) { // check for line comment start if ( !in_linecomment ) { str = Find_Parameter_Partial( & ( configuration. source_line_comments ), cur_char ); if ( str ) { in_linecomment = 1; RB_HTML_Color_String( dest_doc, in_linecomment, COMMENT_CLASS, str ); // We found it, so exit return strlen( str ) - 1; } } // The end of line comments are generated in // RB_HTML_Generate_Line_Comment_End() } // Recognise block comments if ( Works_Like_SourceItem( item_type ) && !in_linecomment && !quote && !squote && course_of_action.do_block_comments ) { // Check for block comment start if ( !incomment ) { str = Find_Parameter_Partial( & ( configuration. remark_begin_markers ), cur_char ); if ( str ) { incomment = 1; RB_HTML_Color_String( dest_doc, incomment, COMMENT_CLASS, str ); // We found it, so exit return strlen( str ) - 1; } } // Check for block comment end else { str = Find_Parameter_Partial( &( configuration.remark_end_markers ), cur_char ); if ( str ) { incomment = 0; RB_HTML_Color_String( dest_doc, incomment, COMMENT_CLASS, str ); // We found it, so exit return strlen( str ) - 1; } } } // Do further source formating if ( Works_Like_SourceItem( item_type ) && !in_linecomment && !incomment && !quote && !squote ) { // Check for keywords if ( configuration.keywords.number && course_of_action.do_keywords ) { char *keyword; // Check if we are at the beginning of a word if ( !utf8_isalnum( prev_char ) && ( prev_char != '_' ) ) { // Count word length for ( i = 1; // A word should have at least one character... utf8_isalnum( cur_char[i] ) || ( cur_char[i] == '_' ); i++ ); // Check if it is a keyword if ( ( keyword = Find_Keyword( cur_char, i ) ) ) { RB_HTML_Color_String( dest_doc, 2, KEYWORD_CLASS, keyword ); // Exit function return i - 1; } } } // Do some fancy coloration for non-alphanumeric chars if ( !utf8_isalnum( *cur_char ) && *cur_char != '_' && *cur_char != ' ' && course_of_action.do_non_alpha ) { RB_HTML_Color_String( dest_doc, 3, SIGN_CLASS, cur_char ); return 0; } } // Check for links, etc... if ( incomment || in_linecomment || !Works_Like_SourceItem( item_type ) ) { if ( strncmp( "http://", cur_char, 7 ) == 0 ) { sscanf( cur_char, "%s", link ); RB_Say( "found link %s\n", SAY_DEBUG, link ); res = ( strlen( link ) - 1 ); /* [ 697247 ] http://body. does not skip the '.' */ if ( link[( strlen( link ) - 1 )] == '.' ) { link[( strlen( link ) - 1 )] = '\0'; fprintf( dest_doc, "<a href=\"%s\">%s</a>.", link, link ); } else { fprintf( dest_doc, "<a href=\"%s\">%s</a>", link, link ); } } else if ( strncmp( "href:", cur_char, 5 ) == 0 ) { /* * handy in relative hyperlink paths, e.g. * ../../modulex/ */ sscanf( ( cur_char + 5 ), "%s", link ); RB_Say( "found link %s\n", SAY_DEBUG, link ); res = ( strlen( link ) + 4 ); fprintf( dest_doc, "<a href=\"%s\">%s</a>", link, link ); } else if ( strncmp( "file:/", cur_char, strlen( "file:/" ) ) == 0 ) { sscanf( cur_char, "%s", link ); RB_Say( "found link %s\n", SAY_DEBUG, link ); res = ( strlen( link ) - 1 ); fprintf( dest_doc, "<a href=\"%s\">%s</a>", link, link ); } else if ( strncmp( "mailto:", cur_char, 7 ) == 0 ) { sscanf( ( cur_char + 7 ), "%s", link ); RB_Say( "found mail to %s\n", SAY_DEBUG, link ); res = ( strlen( link ) + 6 ); fprintf( dest_doc, "<a href=\"mailto:%s\">%s</a>", link, link ); } else if ( strncmp( "image:", cur_char, 6 ) == 0 ) { sscanf( ( cur_char + 6 ), "%s", link ); RB_Say( "found image %s\n", SAY_DEBUG, link ); res = ( strlen( link ) + 5 ); fprintf( dest_doc, "<img src=\"%s\">", link ); } } return res; }