Форматирование исходного кода из Visual Studio в HTML
Мне в блоге периодически приходится писать какой-то исходный код на C#. При этом хочется, чтобы код был красиво раскрашен так, как я вижу его в Visual Studio. Первое время мучался с парой каких-то средств форматирования, но они мне не нравились. Вставлять в Word, а потом экспортировать как HTML – ужас и кошмар, получаются многокилометровые куски абсолютно нечитаемой разметки. Поэтому решил написать по-быстрому соответствующую утилитку.
Решил использовать тот факт, что в Visual Studio можно скопировать кусок кода и при этом в буфере обмена он будет красивенький, с форматированием. Получить кусок из буфера обмена, вставить его в RichTextBox и пробежаться по символам, отслеживая изменение цвета – дело несложное:
MemoryStream stream = new MemoryStream(ASCIIEncoding.Default.GetBytes(str)); richTextBox.LoadFile(stream, RichTextBoxStreamType.RichText); Color lastColor = Color.Black; // Black font by default StringBuilder htmlBuilder = new StringBuilder(); // Result HTML htmlBuilder.AppendLine("<pre style=\"color:black\">"); // Open <pre>-element for source code for(int i=0; i< richTextBox.Text.Length; i++) { richTextBox.Select(i, 1); Color currentColor = richTextBox.SelectionColor; if (lastColor != currentColor) { if (lastColor != Color.Black) // There was open colo span, we need to close it { htmlBuilder.Append("</span>"); } lastColor = currentColor; // Store color value if (currentColor != Color.Black) // Black color is default. Don't mark it { // Open span element with color specified htmlBuilder.Append ( string.Format ("<span style=\"color:{0};\">", currentColor.IsKnownColor ? currentColor.Name : string.Format("#{0:X}{1:X}{2:X}", currentColor.R, currentColor.G, currentColor.B) ) ); } } string currentSymbol = richTextBox.SelectedText; // Simple HTMLEncode currentSymbol = currentSymbol.Replace("&", "&"); currentSymbol = currentSymbol.Replace("<", "<"); currentSymbol = currentSymbol.Replace(">", ">"); htmlBuilder.Append(currentSymbol); // Move one symbol } htmlBuilder.AppendLine("</pre>"); // Close <pre> element
Исходный код этого простейшего, но полезного приложения можно скачать и использовать.