Подсветка синтаксиса C# 3.0 в блогах

Dec 12, 2009 18:33

У меня в планах написание серии статей по программированию. Примеров кода на C# будет много. А чтобы код читался, его надо подсвечивать.

Если вы пробовали публиковать код в блоге, то уже столкнулись с тем, что подсветка синтаксиса пропадает. Нужно использовать специальные программы для генерации HTML с эквивалентной подсветкой. Я знаю про два таких проекта - Ookii.FormatC и Source Code Highlighter.

Однако функциональности и того и другого мне не хватило. Мне нужна была возможность публикации в ЖЖ и на Хабре (то есть без использования css) плюс подсветка LINQ. Я решил модифицировать Ookii.FormatC и написал свой подсветчик синтаксиса.

Бинарник: Syntax Highlighter.rar
Исходники: SyntaxHighlighter.src.rar
Требования: Установленный .NET Framework 3.5 SP1 (может и ниже, не проверял)


Пример:

using System;
// A single line comment starting at the beginning of the line
using System.IO;
/* A comment block starting at the beginning of the line */
using MyNamespace;

namespace CSharpTest
{
    // A comment containing what looks like a "string"
    // A comment containg /* what looks like */ a block comment
    /* A multiline comment
     * also containing a // regular comment
     * And containing what looks like a "string"
     */

public class Program
    {
        ///
        /// An XML comment .
        ///
        public static void Main()
        {
            int Int; // case sensitive test
            int @int; // escaping test
            Console.WriteLine("A string \" \\\" hello \t\\");
            Console.WriteLine("A string containing what // looks like a comment."); // followed by a real comment
            Console.WriteLine(@"An @ string"" \"); /* and another comment */
            Console.WriteLine(@"Another @ string """"");
            Console.WriteLine("{0} {1} {2}", "more than one\\", /* embedded comment */ @"string on ""the same", "line");
#if PREPROCESSORTEST
            for( int x = 0; x < 10; ++x )
            {
                Console.WriteLine('x');
                Console.WriteLine('\'');
                Console.WriteLine('\\');
            }
#endif
        }

public static void Linq()
        {
            IObservable> draggingEvent =
                from mouseLeftDownEvent in control.GetMouseLeftDown( )
                from mouseMoveEvent in control.GetMouseMove( ).Until( control.GetMouseLeftUp( ) )
                let comparer = new MouseEventComparer( mouseMoveEvent )
                group mouseMoveEvent by comparer into cluster
                select cluster;
        }
    }
}

Скриншот:



Отличия от Source Code Highlighter

- Подсветка LINQ синтаксиса.
- Корректная обработка строк и комментариев.
- Open Source.

Отличия от Ookii.FormatC

- Не использует css и тег pre.
- Заменяет ведущие пробелы на nbsp.

Примечания

Код Ookii.FormatC я модифицировал ровно настолько, насколько мне требовалось для работающей подсветки C# 3.0 в ЖЖ и на Хабре. В случае если проект окажется востребованным, возможно я:
- перенесу код на нормальный хост.
- займусь рефакторингом и реорганизацией кода.
- доделаю подсветку для остальных языков, поддерживаемых Ookii.FormatC библиотекой (C#, Visual Basic, C++, XML, HTML, Transact-SQL, PowerShell).

syntaxhighlighter, c#, program

Previous post Next post
Up