コード例 #1
0
        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;
        }
コード例 #2
0
        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();
        }
コード例 #3
0
        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;
        }