|
Оформление программного кода: синтаксис и подсветка ключевых слов
Задача:
На своем сайте необходимо сделать оформление программного кода
Проблемы
- Форматирование - отступы вложенных блоков
- Подсветка синтаксиса: Ключевые (зарезервированные) слова, комментарии, значения строковых переменных
Исходные данные
Имеем строку, в которой
1. разделители строк - <BR>
2. разделители слов - пробелы
3. кавычки - "e;
Решение
Первая проблема появилась собственно из-за того, что сколько бы пробелов или табуляций не стояло бы между словами, любой броузер склеивает их в один пробел
при этом форматирования типа
if (1==1)
{
MessageBox.Show("True");
}
else
{
MessageBox.Show("False");
}
|
превращается в
if (1==1)
{
MessageBox.Show("True");
}
else
{
MessageBox.Show("False");
}
|
Что же делать?
Необходимо заменить все пробелы на спец. символы HTML. Для пробела это
string tmp = code.Replace(" ", " ");
|
Теперь первая часть второй проблемы - подсветка ключевых слов.
Во-первых создадим массив, в котором будут содержаться все ключевые слова, которые мы хотим выделить другим светом
string[] KeyWords = new string[] { "abstract","do","in","protected","true","as","double","int","public","try","base","else","interface","readonly","typeof",
"bool","enum","internal","ref","uint","break","event","is","return","ulong","byte","explicit","lock","sbyte","unchecked",
"case","extern","long","sealed","unsafe","catch","false","namespace","short","ushort","char","finally","new","sizeof","using",
"checked","fixed","null","stackalloc","virtual","class","float","object","static","void","const","for","operator","string","volatile",
"continue","foreach","out","struct","while","decimal","goto","override","switch","default","if","params","this","delegate","implicit","private","throw" };
|
Далее в цикле проверяем есть ключевое слово в нашей входной строке или нет, если есть то оборачиваем его в тэг font нужного нам цвета.
Для замены (обертки) используем регулярные выражения
foreach (string word in KeyWords)
{
if (code.Contains(word))
{
// Оборачиваем если ключевое слово начинается не с буквы и заканчивается не буквой
// Иначе это просто вхождение ключевого слова в другое слово
tmp = Regex.Replace(tmp, @"(\W)(" + word + @")(\W)", "$1$2$3");
}
}
|
Подсветка значений строковых переменных (заключаются в кавычки либо в апострофы) как и комментариев (начинаются с // или заключены в /* */)
решаются тем же самым способом - регулярными выражениями
Строковые значения
// подсвечиваем то что в кавычках
tmp = Regex.Replace(tmp, @"(".+?")", "$1");
// подсвечиваем то что в апострафах
tmp = Regex.Replace(tmp, @"('.+?')", "$1");
|
Комментарии
// подсвечиваем от начала где встретились два слэша до конца HTML-ной строки
tmp = Regex.Replace(tmp, @"(//.+?<(BR|br)>)", "$1");
// подсвечиваем все что внутри /* */
tmp = Regex.Replace(tmp, @"(/\*.+?\*/)", "$1");
|
Примечание
К сожалению подсветить ключевые слова в регистронезависимых языках (например: SQL) таким образом не получиться.
Необходимо еще добавить приведение регистров слов
Предыдущая стр.   
Оглавление   
Средняя оценка:     (5 - 1 голосов) Для оценки необходимо зарегистрироваться
Только зарегистрировавшиеся пользователи могут оставлять комментарии
Комментирует OlechkaLuckyGirl 24.10.2010 10:56:31
|
|