Форматирование исходного кода из 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("&", "&amp;");
                currentSymbol = currentSymbol.Replace("<", "&lt;");
                currentSymbol = currentSymbol.Replace(">", "&gt;");
                htmlBuilder.Append(currentSymbol); // Move one symbol
            }
            htmlBuilder.AppendLine("</pre>"); // Close <pre> element

Исходный код этого простейшего, но полезного приложения можно скачать и использовать.