Pull to refresh

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

Reading time4 min
Views2.8K
У меня в планах написание серии статей по программированию. Примеров кода на 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
    {
        /// <summary>
        /// An XML comment <see cref="System.String" />.
        /// </summary>
        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<Event<MouseEventArgs>> 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).
Tags:
Hubs:
Total votes 20: ↑13 and ↓7+6
Comments10

Articles