將 C#、VB.NET、JavaScript、ASPX 原始碼轉換為帶語法高亮的 HTML,支援關鍵字著色、註解辨識、字串常數、ASPX 標記標籤等,適用於程式碼分享網站、文件產生器、部落格編輯器。
TranslateCode (進入點)
├── Render(string input) → string HTML
│ ├── 偵測語言 (副檔名 / @Page Language / ");
private bool IsMultiLineTagStart(string line) =>
Regex.IsMatch(HttpUtility.HtmlEncode(line), @"(?:?)(?:ASP:|asp:|template|property|ibuyspy:).*"); // 未閉合
private bool IsMultiLineTagEnd(string line) =>
Regex.IsMatch(HttpUtility.HtmlEncode(line), @">");
}
public class TranslateCode
{
public bool ShowFileName { get; set; } = false;
public int FontSize { get; set; } = 3;
public string Language { get; set; } = ""; // 自動偵測
public string Render(string input)
{
var sb = new StringBuilder();
using (var writer = new StringWriter(sb))
{
writer.WriteLine($"");
string lang = Language.Trim().ToLower();
var lines = input.Split(new[] { '\r', '\n' }, StringSplitOptions.None);
if (lang == "c#")
{
var hl = new CSharpHighlighter();
foreach (var line in lines) writer.WriteLine(hl.HighlightLine(line));
}
else if (lang == "js" || lang == "javascript")
{
var hl = new JavaScriptHighlighter();
foreach (var line in lines) writer.WriteLine(hl.HighlightLine(line));
}
else if (lang == "vb" || lang == "vb.net")
{
var hl = new VbNetHighlighter();
foreach (var line in lines) writer.WriteLine(hl.HighlightLine(line));
}
else
{
// ASPX 混合模式:逐行偵測語言
var aspx = new AspxHighlighter();
foreach (var line in lines) writer.WriteLine(aspx.HighlightLine(line));
}
writer.WriteLine("");
}
return sb.ToString();
}
public string RenderFile(string path)
{
SetLanguageFromFileName(path);
return Render(File.ReadAllText(path));
}
public void RenderFile(string inputPath, string outputPath)
{
SetLanguageFromFileName(inputPath);
File.WriteAllText(outputPath, Render(File.ReadAllText(inputPath)));
}
private void SetLanguageFromFileName(string path)
{
if (string.IsNullOrEmpty(Language))
{
string ext = Path.GetExtension(path).ToLowerInvariant();
Language = ext switch
{
".cs" => "c#",
".vb" => "vb",
".js" => "js",
".aspx" or ".ascx" or ".master" => "aspx",
_ => ""
};
}
}
}
// 1. 字串轉換
string csharpCode = @"
public class Hello {
// 問候方法
public void SayHi() {
Console.WriteLine(""Hello World""); // 輸出
}
}";
var converter = new TranslateCode { Language = "c#", FontSize = 2 };
string html = converter.Render(csharpCode);
// 輸出含 public // 問候方法 等
// 2. 檔案轉換
converter.RenderFile(@"C:\Code\Program.cs", @"C:\Output\Program.html");
// 3. ASPX 混合模式
string aspxCode = @"
<%@ Page Language=""C#"" %>
";
converter.Language = ""; // 自動模式
html = converter.Render(aspxCode);
public class Hello {
// 問候方法
public void SayHi() {
Console.WriteLine("Hello World"); // 輸出
}
}
程式碼轉 HTML 高亮看似簡單,實則涉及詞法分析狀態機 (ASPX 混合模式)、正則表達式優先序衝突 (關鍵字 vs 註解 vs 字串常數)、HTML 編碼時機 (高亮前 vs 後)、效能與記憶體平衡。本文實作展示了從零建構高亮引擎的核心邏輯,現代專案建議直接採用 Roslyn 或成熟庫 (Highlight.js, Prism, Chroma) 以獲得完整語言支援與維護性。