public WriteText ( char buffer, int index, int count ) : void | ||
buffer | char | The text buffer. |
index | int | The index of the first character to write. |
count | int | The number of characters to write. |
return | void |
void WriteText(HtmlWriter htmlWriter, string text) { var callback = HtmlTagCallback ?? DefaultHtmlTagCallback; var content = text.ToCharArray(); int endIndex = content.Length; int startIndex = 0; UrlMatch match; int count; do { count = endIndex - startIndex; if (scanner.Scan(content, startIndex, count, out match)) { count = match.EndIndex - match.StartIndex; if (match.StartIndex > startIndex) { // write everything up to the match htmlWriter.WriteText(content, startIndex, match.StartIndex - startIndex); } var href = match.Prefix + new string (content, match.StartIndex, count); var ctx = new FlowedToHtmlTagContext(HtmlTagId.A, new HtmlAttribute(HtmlAttributeId.Href, href)); callback(ctx, htmlWriter); if (!ctx.SuppressInnerContent) { htmlWriter.WriteText(content, match.StartIndex, count); } if (!ctx.DeleteEndTag) { ctx.SetIsEndTag(true); if (ctx.InvokeCallbackForEndTag) { callback(ctx, htmlWriter); } else { ctx.WriteTag(htmlWriter); } } startIndex = match.EndIndex; } else { htmlWriter.WriteText(content, startIndex, count); break; } } while (startIndex < endIndex); }
void WriteText (HtmlWriter htmlWriter, string text) { var callback = HtmlTagCallback ?? DefaultHtmlTagCallback; var content = text.ToCharArray (); int endIndex = content.Length; int startIndex = 0; UrlMatch match; int count; do { count = endIndex - startIndex; if (scanner.Scan (content, startIndex, count, out match)) { count = match.EndIndex - match.StartIndex; if (match.StartIndex > startIndex) { // write everything up to the match htmlWriter.WriteText (content, startIndex, match.StartIndex - startIndex); } var href = match.Prefix + new string (content, match.StartIndex, count); var ctx = new FlowedToHtmlTagContext (HtmlTagId.A, new HtmlAttribute (HtmlAttributeId.Href, href)); callback (ctx, htmlWriter); if (!ctx.SuppressInnerContent) htmlWriter.WriteText (content, match.StartIndex, count); if (!ctx.DeleteEndTag) { ctx.SetIsEndTag (true); if (ctx.InvokeCallbackForEndTag) callback (ctx, htmlWriter); else ctx.WriteTag (htmlWriter); } startIndex = match.EndIndex; } else { htmlWriter.WriteText (content, startIndex, count); break; } } while (startIndex < endIndex); }
public void TestHtmlWriter () { const string expected = "<html ltr=\"true\"><head/><body><p class=\"paragraph\">" + "special characters in this text should get encoded: <>'&\n" + "special characters should not get encoded: <>" + "</p></body></html>"; var actual = new StringBuilder (); using (var html = new HtmlWriter (new StringWriter (actual))) { Assert.AreEqual (HtmlWriterState.Default, html.WriterState); // make sure we can't start by writing an attribute since we are in the wrong state Assert.Throws<InvalidOperationException> (() => html.WriteAttribute (new HtmlAttribute (HtmlAttributeId.Action, "invalid state"))); Assert.Throws<InvalidOperationException> (() => html.WriteAttribute (HtmlAttributeId.Action, "invalid state")); Assert.Throws<InvalidOperationException> (() => html.WriteAttribute ("action", "invalid state")); // write a tag html.WriteStartTag (HtmlTagId.Html); Assert.AreEqual (HtmlWriterState.Tag, html.WriterState); // *now* we should be able to write an attribute html.WriteAttribute (new HtmlAttribute ("ltr", "true")); // write en empty element tag, this should change the state to Default html.WriteEmptyElementTag (HtmlTagId.Head); Assert.AreEqual (HtmlWriterState.Tag, html.WriterState); html.WriteStartTag ("body"); Assert.AreEqual (HtmlWriterState.Tag, html.WriterState); html.WriteStartTag (HtmlTagId.P); Assert.AreEqual (HtmlWriterState.Tag, html.WriterState); // make sure that we can't write an attribute value yet Assert.Throws<InvalidOperationException> (() => html.WriteAttributeValue ("attrValue")); Assert.Throws<InvalidOperationException> (() => html.WriteAttributeValue ("attrValue".ToCharArray (), 0, 9)); html.WriteAttributeName (HtmlAttributeId.Class); Assert.AreEqual (HtmlWriterState.Attribute, html.WriterState); html.WriteAttributeValue ("paragraph"); Assert.AreEqual (HtmlWriterState.Tag, html.WriterState); html.WriteText ("special characters in this text should get encoded: <>'&\n"); html.WriteMarkupText ("special characters should not get encoded: <>"); Assert.AreEqual (HtmlWriterState.Default, html.WriterState); html.WriteEndTag (HtmlTagId.P); html.WriteEndTag (HtmlTagId.Body); html.WriteEndTag ("html"); } Assert.AreEqual (expected, actual.ToString ()); }
void HtmlTagCallback (HtmlTagContext ctx, HtmlWriter htmlWriter) { if (ctx.TagId == HtmlTagId.Body && !ctx.IsEmptyElementTag) { if (ctx.IsEndTag) { // end our opening <blockquote> htmlWriter.WriteEndTag (HtmlTagId.BlockQuote); // pass the </body> tag through to the output ctx.WriteTag (htmlWriter, true); } else { // pass the <body> tag through to the output ctx.WriteTag (htmlWriter, true); // prepend the HTML reply with "On {DATE}, {SENDER} wrote:" htmlWriter.WriteStartTag (HtmlTagId.P); htmlWriter.WriteText (GetOnDateSenderWrote (message)); htmlWriter.WriteEndTag (HtmlTagId.P); // Wrap the original content in a <blockquote> htmlWriter.WriteStartTag (HtmlTagId.BlockQuote); htmlWriter.WriteAttribute (HtmlAttributeId.Style, "border-left: 1px #ccc solid; margin: 0 0 0 .8ex; padding-left: 1ex;"); ctx.InvokeCallbackForEndTag = true; } } else { // pass the tag through to the output ctx.WriteTag (htmlWriter, true); } }
public void TestArgumentExceptions () { Assert.Throws<ArgumentNullException> (() => new HtmlWriter (null, Encoding.UTF8)); Assert.Throws<ArgumentNullException> (() => new HtmlWriter (new MemoryStream (), null)); Assert.Throws<ArgumentNullException> (() => new HtmlWriter (null)); using (var html = new HtmlWriter (new StringWriter ())) { Assert.Throws<ArgumentNullException> (() => html.WriteAttribute (null)); Assert.Throws<ArgumentNullException> (() => html.WriteAttribute (null, string.Empty)); Assert.Throws<ArgumentNullException> (() => html.WriteAttribute ("name", null)); Assert.Throws<ArgumentException> (() => html.WriteAttribute (string.Empty, null)); Assert.Throws<ArgumentException> (() => html.WriteAttribute ("a b c", null)); Assert.Throws<ArgumentNullException> (() => html.WriteAttribute (null, new char[1], 0, 1)); Assert.Throws<ArgumentNullException> (() => html.WriteAttribute ("name", null, 0, 0)); Assert.Throws<ArgumentOutOfRangeException> (() => html.WriteAttribute ("name", new char[0], -1, 0)); Assert.Throws<ArgumentOutOfRangeException> (() => html.WriteAttribute ("name", new char[0], 0, 1)); Assert.Throws<ArgumentException> (() => html.WriteAttribute (HtmlAttributeId.Unknown, new char[1], 0, 1)); Assert.Throws<ArgumentNullException> (() => html.WriteAttribute (HtmlAttributeId.Alt, null, 0, 0)); Assert.Throws<ArgumentOutOfRangeException> (() => html.WriteAttribute (HtmlAttributeId.Alt, new char[0], -1, 0)); Assert.Throws<ArgumentOutOfRangeException> (() => html.WriteAttribute (HtmlAttributeId.Alt, new char[0], 0, 1)); Assert.Throws<ArgumentException> (() => html.WriteAttributeName (HtmlAttributeId.Unknown)); Assert.Throws<ArgumentNullException> (() => html.WriteAttributeName (null)); Assert.Throws<ArgumentNullException> (() => html.WriteAttributeValue (null)); Assert.Throws<ArgumentNullException> (() => html.WriteAttributeValue (null, 0, 0)); Assert.Throws<ArgumentOutOfRangeException> (() => html.WriteAttributeValue (new char[0], -1, 0)); Assert.Throws<ArgumentOutOfRangeException> (() => html.WriteAttributeValue (new char[0], 0, 1)); Assert.Throws<ArgumentException> (() => html.WriteEmptyElementTag (HtmlTagId.Unknown)); Assert.Throws<ArgumentNullException> (() => html.WriteEmptyElementTag (null)); Assert.Throws<ArgumentException> (() => html.WriteEmptyElementTag (string.Empty)); Assert.Throws<ArgumentException> (() => html.WriteEmptyElementTag ("a b c")); Assert.Throws<ArgumentException> (() => html.WriteEndTag (HtmlTagId.Unknown)); Assert.Throws<ArgumentNullException> (() => html.WriteEndTag (null)); Assert.Throws<ArgumentException> (() => html.WriteEndTag (string.Empty)); Assert.Throws<ArgumentException> (() => html.WriteEndTag ("a b c")); Assert.Throws<ArgumentNullException> (() => html.WriteMarkupText (null)); Assert.Throws<ArgumentNullException> (() => html.WriteMarkupText (null, 0, 0)); Assert.Throws<ArgumentOutOfRangeException> (() => html.WriteMarkupText (new char[0], -1, 0)); Assert.Throws<ArgumentOutOfRangeException> (() => html.WriteMarkupText (new char[0], 0, 1)); Assert.Throws<ArgumentException> (() => html.WriteStartTag (HtmlTagId.Unknown)); Assert.Throws<ArgumentNullException> (() => html.WriteStartTag (null)); Assert.Throws<ArgumentException> (() => html.WriteStartTag (string.Empty)); Assert.Throws<ArgumentException> (() => html.WriteStartTag ("a b c")); Assert.Throws<ArgumentNullException> (() => html.WriteText (null)); Assert.Throws<ArgumentNullException> (() => html.WriteText (null, 0, 0)); Assert.Throws<ArgumentOutOfRangeException> (() => html.WriteText (new char[0], -1, 0)); Assert.Throws<ArgumentOutOfRangeException> (() => html.WriteText (new char[0], 0, 1)); Assert.Throws<ArgumentNullException> (() => html.WriteToken (null)); } }