public List<HighlightPiece> Process(string code, LanguageBase lang) { var regexes = lang.Regexes.Keys.ToArray(); var matches = new Match[regexes.Length]; int index = 0; var codePieces = new List<HighlightPiece>(); while (index < code.Length) { int i = 0; for (; i < matches.Length; i++) { // 是否需要匹配 if (matches[i] != null && matches[i].Index >= index) continue; matches[i] = regexes[i].Match(code, index); } // 取最前的匹配 i = GetFirstMatch(matches); if (i == -1) break; // 添加到代码片段 codePieces.Add( new HighlightPiece(lang.Regexes[regexes[i]], matches[i]) ); // 更新Index,继续迭代 index = matches[i].Index + matches[i].Length; } return codePieces; }
void ShowCodeForUbb(string code, List<HighlightPiece> pieces, LanguageBase lang) { int index = 0; var sb = new StringBuilder(); sb.Append("[font=Consolas]"); for (int i = 0; i < pieces.Count; i++) { var piece = pieces[i]; // 每个高亮之前的部分 var pieceCur = ProcessUbbTag(code.Substring(index, piece.Index - index)); sb.Append(pieceCur); // 高亮的代码块 var color = lang.ColorPlans[piece.Style]; pieceCur = ProcessUbbTag(code.Substring(piece.Index, piece.Length)); sb.Append(string.Format( "[color=#{0:x2}{1:x2}{2:x2}]{3}[/color]", color.R, color.G, color.B, pieceCur) ); index = piece.Index + piece.Length; // 最后的部分 if (i == pieces.Count - 1) { pieceCur = ProcessUbbTag(code.Substring(index, code.Length - index)); sb.Append(pieceCur); } } sb.Append("[/font]"); _codeDiscuz = sb.ToString(); }
void RenderCode(string code, List<HighlightPiece> pieces, LanguageBase lang) { var paragraph = new Paragraph(); int index = 0; for (int i = 0; i < pieces.Count; i++) { var piece = pieces[i]; // 每个高亮之前的部分 var pieceCur = code.Substring(index, piece.Index - index); paragraph.Inlines.Add(pieceCur); // 高亮的代码块 var span = new Span(); span.Foreground = new SolidColorBrush(lang.ColorPlans[piece.Style]); pieceCur = code.Substring(piece.Index, piece.Length); span.Inlines.Add(pieceCur); paragraph.Inlines.Add(span); index = piece.Index + piece.Length; // 最后的部分 if (i == pieces.Count - 1) { pieceCur = code.Substring(index, code.Length - index); paragraph.Inlines.Add(pieceCur); } } _codeParagraph = paragraph; }