public static string WikiParse(this WikiSettings settings, string content) { using (HeavyProfiler.Log("Wiki")) using (var t = HeavyProfiler.LogNoStackTrace("SaveCodeRegions")) { string result = content; result = SaveCodeRegions(result, out Dictionary <string, string> codeRegions); if (settings.EncodeHtml) { t.Switch("HtmlEncode"); //1: Replace token delimiters which are different from their encoded string so that they are not encoded result = Regex.Replace(result, "'{2,}", m => "####" + m.Length + "####"); //2: Encode all text result = HttpUtility.HtmlEncode(result); //3: Replace encrypted tokens to original tokens result = Regex.Replace(result, "####(?<count>\\d+)####", m => new string('\'', int.Parse(m.Groups["count"].Value))); } t.Switch("ProcessTokens"); result = ProcessTokens(result, settings); t.Switch("ProcessFormat"); result = ProcessFormat(result, settings); t.Switch("WriteCodeRegions"); result = WriteCodeRegions(result, codeRegions, settings); return(result.Trim()); } }
static string ProcessFormat(string content, WikiSettings settings) { content = RegexBoldItalics.Replace(content, (settings.Strong && settings.Em) ? "<strong><em>${content}</em></strong>" : "${content}"); content = RegexBold.Replace(content, settings.Strong ? "<strong>${content}</strong>" : "${content}"); content = RegexItalics.Replace(content, settings.Em ? "<em>${content}</em>" : "${content}"); content = RegexUnderline.Replace(content, settings.Underlined ? "<u>${content}</u>" : "${content}"); content = RegexStrike.Replace(content, settings.Strike ? "<s>${content}</s>" : "${content}"); content = RegexLI.Replace(content, settings.Lists ? "<li>${content}</li>" : "${content} "); content = RegexOLI.Replace(content, settings.Lists ? "<oli>${content}</oli>" : "${content} "); content = RegexUL.Replace(content, settings.Lists ? "<ul>${content}</ul>" : "${content} "); content = RegexOL.Replace(content, settings.Lists ? "<ol>${content}</ol>" : "${content} "); content = RegexLIFin.Replace(content, "li>"); content = RegexTitles.Replace(content, m => settings.Titles ? ("<h" + m.Groups["begin"].Length + ">" + m.Groups["content"].ToString().Trim() + "</h" + m.Groups["end"].Length + ">") : m.Groups["content"].Value); //Remove multiple breakline if (settings.MaxTwoLineBreaks) { content = RegexMaxTwoLineBreaks.Replace(content, "\n\n"); } if (settings.LineBreaks) { content = RegexNewLine.Replace(content, "<br/>"); content = RegexCarrageReturn.Replace(content, ""); } return(content); }
static HelpWiki() { DefaultWikiSettings = new WikiSettings(true); DefaultWikiSettings.TokenParser += s => LinkParser(s)?.ToHtmlString(); DefaultWikiSettings.TokenParser += ProcessImages; NoLinkWikiSettings = new WikiSettings(false) { LineBreaks = false }; NoLinkWikiSettings.TokenParser += s => LinkParser(s)?.Text; NoLinkWikiSettings.TokenParser += RemoveImages; }
private static string WriteCodeRegions(string result, Dictionary<string, string> codeRegions, WikiSettings settings) { result = Regex.Replace(result, @"%%%CODE%(?<guid>.+?)%%%", m => { var value = codeRegions[m.Groups["guid"].Value]; return settings.CodeRegion ? "<pre><code>" + (settings.EncodeHtml ? HttpUtility.HtmlEncode(value) : value) + "</code></pre>" : codeRegions[m.Groups["guid"].Value]; }); return result; }
static string ProcessTokens(string content, WikiSettings settings) { return(TokenRegex.Replace(content, m => { string text = m.Groups["content"].Value.Replace("[[", "[").Replace("]]", "]"); try { return settings.TokenParser .GetInvocationListTyped() .Select(a => a(text)) .NotNull() .FirstEx(); } catch { return "<span class=\"sf-wiki-error\">{0}</span>".FormatWith(m.Value); } })); }
public static MvcHtmlString WikiParse(this HtmlHelper helper, string text, WikiSettings settings) { return MvcHtmlString.Create(settings.WikiParse(text ?? "").Replace("\n", "<p>")); }
static string ProcessFormat(string content, WikiSettings settings) { content = RegexBoldItalics.Replace(content,(settings.Strong && settings.Em) ? "<strong><em>${content}</em></strong>" : "${content}"); content = RegexBold.Replace(content, settings.Strong ? "<strong>${content}</strong>" : "${content}"); content = RegexItalics.Replace(content, settings.Em ? "<em>${content}</em>" : "${content}"); content = RegexUnderline.Replace(content, settings.Underlined ? "<u>${content}</u>" : "${content}"); content = RegexStrike.Replace(content, settings.Strike ? "<s>${content}</s>" : "${content}"); content = RegexLI.Replace(content, settings.Lists ? "<li>${content}</li>" : "${content} "); content = RegexOLI.Replace(content, settings.Lists ? "<oli>${content}</oli>" : "${content} "); content = RegexUL.Replace(content, settings.Lists ? "<ul>${content}</ul>" : "${content} "); content = RegexOL.Replace(content, settings.Lists ? "<ol>${content}</ol>" : "${content} "); content = RegexLIFin.Replace(content, "li>"); content = RegexTitles.Replace(content, m => settings.Titles ? ("<h" + m.Groups["begin"].Length + ">" + m.Groups["content"].ToString().Trim() + "</h" + m.Groups["end"].Length + ">") : m.Groups["content"].Value); //Remove multiple breakline if (settings.MaxTwoLineBreaks) { content = RegexMaxTwoLineBreaks.Replace(content, "\n\n"); } if (settings.LineBreaks) { content = RegexNewLine.Replace(content, "<br/>"); content = RegexCarrageReturn.Replace(content, ""); } return content; }
static string ProcessTokens(string content, WikiSettings settings) { return TokenRegex.Replace(content, m => { string text = m.Groups["content"].Value.Replace("[[", "[").Replace("]]", "]"); try { return settings.TokenParser .GetInvocationListTyped() .Select(a => a(text)) .NotNull() .FirstEx(); } catch { return "<span class=\"sf-wiki-error\">{0}</span>".FormatWith(m.Value); } }); }
private static string WriteCodeRegions(string result, Dictionary <string, string> codeRegions, WikiSettings settings) { result = Regex.Replace(result, @"%%%CODE%(?<guid>.+?)%%%", m => { var value = codeRegions[m.Groups["guid"].Value]; return(settings.CodeRegion ? "<pre><code>" + (settings.EncodeHtml ? HttpUtility.HtmlEncode(value) : value) + "</code></pre>" : codeRegions[m.Groups["guid"].Value]); }); return(result); }