У меня в планах написание серии статей по программированию. Примеров кода на 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).