Testing GeSHi

This post is to test the Generic Syntax Highlighter (GeSHi) on Drupal.  Its a fairly simple script that is used across many open source content management systems.  Not long ago I setup a DokuWiki CMS site at work for managing our knowledgebase documents.  It is a really neat system and very versatile.  Like most CMS's it has the ability to run plugins.  One of them, which comes standard with the system, is the code highlighting engine GeSHi.  Drupal also has a plugin for this same system, and why not, its one of the better syntax highlighting engines out there.  The really cool thing about it is the autolinking feature which takes function names it recognizes and links you to their documentation.  How Cool!

 

So lets start with some C syntax highlighting, I will just steal some code from MSDN's site for this example: http://msdn.microsoft.com/en-us/library/kdzttdcb(VS.80).aspx

 

// crt_BEGTHRD.C
// compile with: /MT /D "_X86_" /c
// processor: x86
#include <windows.h>
#include <process.h>    /* _beginthread, _endthread */
#include <stddef.h>
#include <stdlib.h>
#include <conio.h>
 
void Bounce( void *ch );
void CheckKey( void *dummy );
 
/* GetRandom returns a random integer between min and max. */
#define GetRandom( min, max ) ((rand() % (int)(((max) + 1) - (min))) + (min))
 
BOOL repeat = TRUE;     /* Global repeat flag and video variable */
HANDLE hStdOut;         /* Handle for console window */
CONSOLE_SCREEN_BUFFER_INFO csbi;    /* Console information structure */
 
int main()
{
    CHAR    ch = 'A';
 
    hStdOut = GetStdHandle( STD_OUTPUT_HANDLE );
 
    /* Get display screen's text row and column information. */
   GetConsoleScreenBufferInfo( hStdOut, &csbi );
 
    /* Launch CheckKey thread to check for terminating keystroke. */
    _beginthread( CheckKey, 0, NULL );
 
    /* Loop until CheckKey terminates program. */
    while( repeat )
    {
        /* On first loops, launch character threads. */
        _beginthread( Bounce, 0, (void *) (ch++)  );
 
        /* Wait one second between loops. */
        Sleep( 1000L );
    }
}
 
/* CheckKey - Thread to wait for a keystroke, then clear repeat flag. */
void CheckKey( void *dummy )
{
    _getch();
    repeat = 0;    /* _endthread implied */
 
}
 
/* Bounce - Thread to create and and control a colored letter that moves
 * around on the screen.
 *
 * Params: ch - the letter to be moved
 */
void Bounce( void *ch )
{
    /* Generate letter and color attribute from thread argument. */
    char    blankcell = 0x20;
    char    blockcell = (char) ch;
    BOOL    first = TRUE;
   COORD   oldcoord, newcoord;
   DWORD   result;
 
 
    /* Seed random number generator and get initial location. */
    srand( _threadid );
    newcoord.X = GetRandom( 0, csbi.dwSize.X - 1 );
    newcoord.Y = GetRandom( 0, csbi.dwSize.Y - 1 );
    while( repeat )
    {
        /* Pause between loops. */
        Sleep( 100L );
 
        /* Blank out our old position on the screen, and draw new letter. */
        if( first )
            first = FALSE;
        else
         WriteConsoleOutputCharacter( hStdOut, &blankcell, 1, oldcoord, &result );
         WriteConsoleOutputCharacter( hStdOut, &blockcell, 1, newcoord, &result );
 
        /* Increment the coordinate for next placement of the block. */
        oldcoord.X = newcoord.X;
        oldcoord.Y = newcoord.Y;
        newcoord.X += GetRandom( -1, 1 );
        newcoord.Y += GetRandom( -1, 1 );
 
        /* Correct placement (and beep) if about to go off the screen. */
        if( newcoord.X < 0 )
            newcoord.X = 1;
        else if( newcoord.X == csbi.dwSize.X )
            newcoord.X = csbi.dwSize.X - 2;
        else if( newcoord.Y < 0 )
            newcoord.Y = 1;
        else if( newcoord.Y == csbi.dwSize.Y )
            newcoord.Y = csbi.dwSize.Y - 2;
 
        /* If not at a screen border, continue, otherwise beep. */
        else
            continue;
        Beep( ((char) ch - 'A') * 100, 175 );
    }
    /* _endthread given to terminate */
    _endthread();
}

Well GeSHi worked, however I was not happy that the WYSIWYG TinyMCE module I have installed for easy rich text editing since it did not work at all when enabled. What I did to get through it was disable the WYSIWYG TinyMCE editor for Full HTML Input pages. That way when I am doing anything code related I can just set the Full HTML Input mode and insert my code snippets.

I am so far overall happy with my Drupal experience. GeSHi Filter and TinyMCE are definitely great additions to the CMS and I highly recommend them.