Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public static class StringMethodExtensions
- {
- private static string _paraBreak = "rnrn";
- private static string _link = "<a href="{0}">{1}</a>";
- private static string _linkNoFollow = "<a href="{0}" rel="nofollow">{1}</a>";
- /// <summary>
- /// Returns a copy of this string converted to HTML markup.
- /// </summary>
- public static string ToHtml(this string s)
- {
- return ToHtml(s, false);
- }
- /// <summary>
- /// Returns a copy of this string converted to HTML markup.
- /// </summary>
- /// <param name="nofollow">If true, links are given "nofollow"
- /// attribute</param>
- public static string ToHtml(this string s, bool nofollow)
- {
- StringBuilder sb = new StringBuilder();
- int pos = 0;
- while (pos < s.Length)
- {
- // Extract next paragraph
- int start = pos;
- pos = s.IndexOf(_paraBreak, start);
- if (pos < 0)
- pos = s.Length;
- string para = s.Substring(start, pos - start).Trim();
- // Encode non-empty paragraph
- if (para.Length > 0)
- EncodeParagraph(para, sb, nofollow);
- // Skip over paragraph break
- pos += _paraBreak.Length;
- }
- // Return result
- return sb.ToString();
- }
- /// <summary>
- /// Encodes a single paragraph to HTML.
- /// </summary>
- /// <param name="s">Text to encode</param>
- /// <param name="sb">StringBuilder to write results</param>
- /// <param name="nofollow">If true, links are given "nofollow"
- /// attribute</param>
- private static void EncodeParagraph(string s, StringBuilder sb, bool nofollow)
- {
- // Start new paragraph
- sb.AppendLine("<p>");
- // HTML encode text
- s = HttpUtility.HtmlEncode(s);
- // Convert single newlines to <br>
- s = s.Replace(Environment.NewLine, "<br />rn");
- // Encode any hyperlinks
- EncodeLinks(s, sb, nofollow);
- // Close paragraph
- sb.AppendLine("rn</p>");
- }
- /// <summary>
- /// Encodes [[URL]] and [[Text][URL]] links to HTML.
- /// </summary>
- /// <param name="text">Text to encode</param>
- /// <param name="sb">StringBuilder to write results</param>
- /// <param name="nofollow">If true, links are given "nofollow"
- /// attribute</param>
- private static void EncodeLinks(string s, StringBuilder sb, bool nofollow)
- {
- // Parse and encode any hyperlinks
- int pos = 0;
- while (pos < s.Length)
- {
- // Look for next link
- int start = pos;
- pos = s.IndexOf("[[", pos);
- if (pos < 0)
- pos = s.Length;
- // Copy text before link
- sb.Append(s.Substring(start, pos - start));
- if (pos < s.Length)
- {
- string label, link;
- start = pos + 2;
- pos = s.IndexOf("]]", start);
- if (pos < 0)
- pos = s.Length;
- label = s.Substring(start, pos - start);
- int i = label.IndexOf("][");
- if (i >= 0)
- {
- link = label.Substring(i + 2);
- label = label.Substring(0, i);
- }
- else
- {
- link = label;
- }
- // Append link
- sb.Append(String.Format(nofollow ? _linkNoFollow : _link, link, label));
- // Skip over closing "]]"
- pos += 2;
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement