public virtual StringBuffer Render(MarkdownEngine engine, MarkdownParagraphBlockToken token, MarkdownBlockContext context) { StringBuffer result = "<p>"; var c = engine.SwitchContext(context.InlineContext); result += engine.Mark(token.Content); engine.SwitchContext(c); result += "</p>\n"; return(result); }
protected virtual StringBuffer ApplyInline(MarkdownEngine engine, StringBuffer content, MarkdownBlockContext context) { if (content == StringBuffer.Empty) { return(StringBuffer.Empty); } var c = engine.SwitchContext(context.InlineContext); var result = engine.Mark(content.ToString()); engine.SwitchContext(c); return(result); }
public virtual StringBuffer Render(MarkdownEngine engine, MarkdownTableBlockToken token, MarkdownBlockContext context) { StringBuffer result = "<table>\n<thead>\n"; // header result += "<tr>\n"; var cell = StringBuffer.Empty; var c = engine.SwitchContext(context.InlineContext); for (int i = 0; i < token.Header.Length; i++) { if (i < token.Align.Length && token.Align[i] != Align.NotSpec) { result += "<th style=\"text-align:"; result += token.Align[i].ToString().ToLower(); result += "\">"; } else { result += "<th>"; } result += engine.Mark(token.Header[i]); result += "</th>\n"; } result += "</tr>\n"; result += "</thead>\n"; result += "<tbody>\n"; // body for (int i = 0; i < token.Cells.Length; i++) { var row = token.Cells[i]; result += "<tr>\n"; for (int j = 0; j < row.Length; j++) { if (j < token.Align.Length && token.Align[j] != Align.NotSpec) { result += "<td style=\"text-align:"; result += token.Align[j].ToString().ToLower(); result += "\">"; } else { result += "<td>"; } result += engine.Mark(row[j]); result += "</td>\n"; } result += "</tr>\n"; } engine.SwitchContext(c); return(result + "</tbody>\n" + "</table>\n"); }
public virtual StringBuffer Render(MarkdownEngine engine, MarkdownHtmlBlockToken token, MarkdownBlockContext context) { if (!token.Pre && !engine.Options.Pedantic) { var c = engine.SwitchContext(context.InlineContext); var result = engine.Mark(token.Content); engine.SwitchContext(c); return(result); } else { return(token.Content); } }
public virtual StringBuffer Render(MarkdownEngine engine, MarkdownHeadingBlockToken token, MarkdownBlockContext context) { string level = token.Depth.ToString(); var result = (StringBuffer)"<h" + level + " id=\"" + engine.Options.HeaderPrefix + Regex.Replace(token.Content.ToLower(), @"[^\w]+", "-") + "\">"; var c = engine.SwitchContext(context.InlineContext); result += engine.Mark(token.Content); engine.SwitchContext(c); result += "</h"; result += level; result += ">\n"; return result; }
public virtual StringBuffer Render(MarkdownEngine engine, MarkdownHeadingBlockToken token, MarkdownBlockContext context) { string level = token.Depth.ToString(); var result = (StringBuffer)"<h" + level + " id=\"" + engine.Options.HeaderPrefix + Regex.Replace(token.Content.ToLower(), @"[^\w]+", "-") + "\">"; var c = engine.SwitchContext(context.InlineContext); result += engine.Mark(token.Content); engine.SwitchContext(c); result += "</h"; result += level; result += ">\n"; return(result); }
public virtual StringBuffer Render(MarkdownEngine engine, MarkdownLinkInlineToken token, MarkdownInlineContext context) { if (engine.Options.Sanitize) { string prot = null; try { prot = Regex.Replace(StringHelper.DecodeURIComponent(StringHelper.Unescape(token.Href)), @"[^\w:]", string.Empty).ToLower(); } catch (Exception) { return(string.Empty); } if (prot.IndexOf("javascript:") == 0 || prot.IndexOf("vbscript:") == 0) { return(string.Empty); } } var result = (StringBuffer)"<a href=\"" + token.Href + "\""; if (!string.IsNullOrEmpty(token.Title)) { result = result + " title=\"" + token.Title + "\""; } result += ">"; if (token.ShouldApplyInlineRule) { engine.SwitchContext(MarkdownInlineContext.IsInLink, true); result += engine.Mark(token.Text); engine.SwitchContext(MarkdownInlineContext.IsInLink, false); } else { result += token.Text; } result += "</a>"; return(result); }
public virtual IMarkdownToken TryMatch(MarkdownEngine engine, ref string source) { var match = Tag.Match(source); if (match.Length == 0) { return null; } source = source.Substring(match.Length); var context = engine.Context; var inLink = (bool)context.Variables[MarkdownInlineContext.IsInLink]; if (!inLink && Regexes.Lexers.StartHtmlLink.IsMatch(match.Value)) { engine.SwitchContext(MarkdownInlineContext.IsInLink, true); } else if (inLink && Regexes.Lexers.EndHtmlLink.IsMatch(match.Value)) { engine.SwitchContext(MarkdownInlineContext.IsInLink, false); } return new MarkdownTagInlineToken(this, match.Value); }
public virtual IMarkdownToken TryMatch(MarkdownEngine engine, ref string source) { var match = Tag.Match(source); if (match.Length == 0) { return(null); } source = source.Substring(match.Length); var context = engine.Context; var inLink = (bool)context.Variables[MarkdownInlineContext.IsInLink]; if (!inLink && Regexes.Lexers.StartHtmlLink.IsMatch(match.Value)) { engine.SwitchContext(MarkdownInlineContext.IsInLink, true); } else if (inLink && Regexes.Lexers.EndHtmlLink.IsMatch(match.Value)) { engine.SwitchContext(MarkdownInlineContext.IsInLink, false); } return(new MarkdownTagInlineToken(this, match.Value)); }
public virtual IMarkdownToken TryMatch(MarkdownEngine engine, ref string source) { var match = Regexes.Block.List.Match(source); if (match.Length == 0) { return(null); } source = source.Substring(match.Length); var bull = match.Groups[2].Value; var cap = match.Groups[0].Value.Match(Item); var next = false; var l = cap.Length; int i = 0; var tokens = new List <IMarkdownToken>(); for (; i < l; i++) { var item = cap[i]; // Remove the list item's bullet // so it is seen as the next token. var space = item.Length; item = item.ReplaceRegex(Regexes.Lexers.LeadingBullet, string.Empty); // Outdent whatever the // list item contains. Hacky. if (item.IndexOf("\n ") > -1) { space -= item.Length; item = !engine.Options.Pedantic ? Regex.Replace(item, "^ {1," + space + "}", "", RegexOptions.Multiline) : Regex.Replace(item, @"^ {1,4}", "", RegexOptions.Multiline); } // Determine whether the next list item belongs here. // Backpedal if it does not belong in this list. if (engine.Options.SmartLists && i != l - 1) { var b = Bullet.Apply(cap[i + 1])[0]; // !!!!!!!!!!! if (bull != b && !(bull.Length > 1 && b.Length > 1)) { source = string.Join("\n", cap.Skip(i + 1)) + source; i = l - 1; } } // Determine whether item is loose or not. // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/ // for discount behavior. var loose = next || Regex.IsMatch(item, @"\n\n(?!\s*$)"); if (i != l - 1 && item.Length != 0) { next = item[item.Length - 1] == '\n'; if (!loose) { loose = next; } } var c = engine.SwitchContext(MarkdownBlockContext.IsTop, false); tokens.Add(new MarkdownListItemBlockToken(this, engine.Tokenize(item), loose)); engine.SwitchContext(c); } return(new MarkdownListBlockToken(this, tokens.ToImmutableArray(), bull.Length > 1)); }
public virtual StringBuffer Render(MarkdownEngine engine, MarkdownLinkInlineToken token, MarkdownInlineContext context) { if (engine.Options.Sanitize) { string prot = null; try { prot = Regex.Replace(StringHelper.DecodeURIComponent(StringHelper.Unescape(token.Href)), @"[^\w:]", string.Empty).ToLower(); } catch (Exception) { return string.Empty; } if (prot.IndexOf("javascript:") == 0 || prot.IndexOf("vbscript:") == 0) { return string.Empty; } } var result = (StringBuffer)"<a href=\"" + token.Href + "\""; if (!string.IsNullOrEmpty(token.Title)) { result = result + " title=\"" + token.Title + "\""; } result += ">"; if (token.ShouldApplyInlineRule) { engine.SwitchContext(MarkdownInlineContext.IsInLink, true); result += engine.Mark(token.Text); engine.SwitchContext(MarkdownInlineContext.IsInLink, false); } else { result += token.Text; } result += "</a>"; return result; }
public virtual StringBuffer Render(MarkdownEngine engine, MarkdownTableBlockToken token, MarkdownBlockContext context) { StringBuffer result = "<table>\n<thead>\n"; // header result += "<tr>\n"; var cell = StringBuffer.Empty; var c = engine.SwitchContext(context.InlineContext); for (int i = 0; i < token.Header.Length; i++) { if (i < token.Align.Length && token.Align[i] != Align.NotSpec) { result += "<th style=\"text-align:"; result += token.Align[i].ToString().ToLower(); result += "\">"; } else { result += "<th>"; } result += engine.Mark(token.Header[i]); result += "</th>\n"; } result += "</tr>\n"; result += "</thead>\n"; result += "<tbody>\n"; // body for (int i = 0; i < token.Cells.Length; i++) { var row = token.Cells[i]; result += "<tr>\n"; for (int j = 0; j < row.Length; j++) { if (j < token.Align.Length && token.Align[j] != Align.NotSpec) { result += "<td style=\"text-align:"; result += token.Align[j].ToString().ToLower(); result += "\">"; } else { result += "<td>"; } result += engine.Mark(row[j]); result += "</td>\n"; } result += "</tr>\n"; } engine.SwitchContext(c); return result + "</tbody>\n" + "</table>\n"; }
public virtual StringBuffer Render(MarkdownEngine engine, MarkdownParagraphBlockToken token, MarkdownBlockContext context) { StringBuffer result = "<p>"; var c = engine.SwitchContext(context.InlineContext); result += engine.Mark(token.Content); engine.SwitchContext(c); result += "</p>\n"; return result; }
public virtual StringBuffer Render(MarkdownEngine engine, MarkdownHtmlBlockToken token, MarkdownBlockContext context) { if (!token.Pre && !engine.Options.Pedantic) { var c = engine.SwitchContext(context.InlineContext); var result = engine.Mark(token.Content); engine.SwitchContext(c); return result; } else { return token.Content; } }
protected virtual StringBuffer ApplyInline(MarkdownEngine engine, StringBuffer content, MarkdownBlockContext context) { if (content == StringBuffer.Empty) { return StringBuffer.Empty; } var c = engine.SwitchContext(context.InlineContext); var result = engine.Mark(content.ToString()); engine.SwitchContext(c); return result; }
public virtual IMarkdownToken TryMatch(MarkdownEngine engine, ref string source) { var match = Regexes.Block.List.Match(source); if (match.Length == 0) { return null; } source = source.Substring(match.Length); var bull = match.Groups[2].Value; var cap = match.Groups[0].Value.Match(Item); var next = false; var l = cap.Length; int i = 0; var tokens = new List<IMarkdownToken>(); for (; i < l; i++) { var item = cap[i]; // Remove the list item's bullet // so it is seen as the next token. var space = item.Length; item = item.ReplaceRegex(Regexes.Lexers.LeadingBullet, string.Empty); // Outdent whatever the // list item contains. Hacky. if (item.IndexOf("\n ") > -1) { space -= item.Length; item = !engine.Options.Pedantic ? Regex.Replace(item, "^ {1," + space + "}", "", RegexOptions.Multiline) : Regex.Replace(item, @"^ {1,4}", "", RegexOptions.Multiline); } // Determine whether the next list item belongs here. // Backpedal if it does not belong in this list. if (engine.Options.SmartLists && i != l - 1) { var b = Bullet.Apply(cap[i + 1])[0]; // !!!!!!!!!!! if (bull != b && !(bull.Length > 1 && b.Length > 1)) { source = string.Join("\n", cap.Skip(i + 1)) + source; i = l - 1; } } // Determine whether item is loose or not. // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/ // for discount behavior. var loose = next || Regex.IsMatch(item, @"\n\n(?!\s*$)"); if (i != l - 1 && item.Length != 0) { next = item[item.Length - 1] == '\n'; if (!loose) loose = next; } var c = engine.SwitchContext(MarkdownBlockContext.IsTop, false); tokens.Add(new MarkdownListItemBlockToken(this, engine.Tokenize(item), loose)); engine.SwitchContext(c); } return new MarkdownListBlockToken(this, tokens.ToImmutableArray(), bull.Length > 1); }