internal override void AppendOuterHtmlHeadTo(StringBuilder accum, int depth, DocumentOutputSettings @out) { if (@out.PrettyPrint) { Indent(accum, depth, @out); } accum.Append("<!--").Append(Data).Append("-->"); }
internal void AppendHtmlTo(StringBuilder accum, DocumentOutputSettings @out) { accum.Append(key); if (!ShouldCollapseAttribute(@out)) { accum.Append("=\""); Entities.Escape(accum, value, Convert(@out.EscapeMode), @out.Charset, true, false, false); accum.Append('"'); } }
internal void AppendHtmlTo(StringBuilder accum, DocumentOutputSettings @out) { if (attributes == null) { return; } foreach (KeyValuePair <string, Attribute> entry in attributes) { Attribute attribute = (Attribute)entry.Value; accum.Append(" "); attribute.AppendHtmlTo(accum, @out); } }
internal override void AppendOuterHtmlHeadTo(StringBuilder accum, int depth, DocumentOutputSettings @out) { accum.Append("<!DOCTYPE"); if (!string.IsNullOrEmpty(Attr("name"))) { accum.Append(" ").Append(Attr("name")); } if (!string.IsNullOrEmpty(Attr("publicId"))) { accum.Append(" PUBLIC \"").Append(Attr("publicId")).Append('"'); } if (!string.IsNullOrEmpty(Attr("systemId"))) { accum.Append(" \"").Append(Attr("systemId")).Append('"'); } accum.Append('>'); }
internal override void AppendOuterHtmlHeadTo(StringBuilder accum, int depth, DocumentOutputSettings @out) { if (@out.PrettyPrint && ((SiblingIndex == 0 && parentNode is Element && ((Element)parentNode).Tag.IsFormattedAsBlock && !IsBlank) || (@out.Outline && SiblingNodes.Count > 0 && !IsBlank))) { Indent(accum, depth, @out); } bool normaliseWhite = @out.PrettyPrint && Parent is Element && !Element.PreserveWhitespace((Element)Parent); Entities.Escape(accum, WholeText, Convert(@out.EscapeMode), @out.Charset, false, normaliseWhite, false); }
internal void Indent(StringBuilder accum, int depth, DocumentOutputSettings @out) { accum.Append("\n").Append(StringUtil.Padding(depth * @out.IndentAmount)); }
internal override void AppendOuterHtmlHeadTo(StringBuilder accum, int depth, DocumentOutputSettings @out) { accum.Append("<").Append(isProcessingInstruction ? "!" : "?").Append(WholeDeclaration).Append(">"); }
internal override void AppendOuterHtmlTailTo(StringBuilder accum, int depth, DocumentOutputSettings @out) { }
internal override void AppendOuterHtmlHeadTo(StringBuilder accum, int depth, DocumentOutputSettings @out) { accum.Append(WholeData); // data is not escaped in return from data nodes, so " in script, style is plain }
/// <summary> /// Collapsible if it's a boolean attribute and value is empty or same as name /// </summary> internal bool ShouldCollapseAttribute(DocumentOutputSettings @out) { return (string.Empty.Equals(value) || string.Equals(value, key, StringComparison.OrdinalIgnoreCase)) && @out.Syntax == DocumentSyntax.Html && Array.BinarySearch(booleanAttributes, key) >= 0; }
internal override void AppendOuterHtmlHeadTo(StringBuilder accum, int depth, DocumentOutputSettings @out) { if (accum.Length > 0 && @out.PrettyPrint && (tag.IsFormattedAsBlock || (Parent != null && Parent.Tag.IsFormattedAsBlock) || @out.Outline)) { Indent(accum, depth, @out); } accum.Append("<").Append(TagName); attributes.AppendHtmlTo(accum, @out); // selfclosing includes unknown tags, isEmpty defines tags that are always empty if (childNodes.Count == 0 && tag.IsSelfClosing) { if (@out.Syntax == DocumentSyntax.Html && tag.IsEmpty) { accum.Append('>'); } else { accum.Append(" />"); } } else { // <img> in html, <img /> in xml accum.Append(">"); } }
internal abstract void AppendOuterHtmlTailTo(StringBuilder accum, int depth, DocumentOutputSettings @out);
internal OuterHtmlVisitor(StringBuilder accum, DocumentOutputSettings @out) { this.accum = accum; this.@out = @out; }
public void SupplyOutputSettings() { // test that one can override the default document output settings DocumentOutputSettings os = new DocumentOutputSettings(); os.PrettyPrint = false; os.EscapeMode = DocumentEscapeMode.Extended; os.Charset = Encoding.ASCII; string html = "<div><p>ℬ</p></div>"; string customOut = Dcsoup.Clean(html, "http://foo.com/", Whitelist.Relaxed, os); string defaultOut = Dcsoup.Clean(html, "http://foo.com/", Whitelist.Relaxed); Assert.AreNotEqual(defaultOut, customOut); Assert.AreEqual("<div><p>ℬ</p></div>", customOut); Assert.AreEqual("<div>\n" + " <p>ℬ</p>\n" + "</div>", defaultOut); os.Charset = Encoding.ASCII; os.EscapeMode = DocumentEscapeMode.Base; string customOut2 = Dcsoup.Clean(html, "http://foo.com/", Whitelist.Relaxed, os); Assert.AreEqual("<div><p>ℬ</p></div>", customOut2); }
internal override void AppendOuterHtmlTailTo(StringBuilder accum, int depth, DocumentOutputSettings @out) { if (!(childNodes.Count == 0 && tag.IsSelfClosing)) { if (@out.PrettyPrint && (childNodes.Count > 0 && (tag.IsFormattedAsBlock || (@out.Outline && (childNodes.Count > 1 || (childNodes.Count == 1 && !(childNodes[0] is TextNode))))))) { Indent(accum, depth, @out); } accum.Append("</").Append(TagName).Append(">"); } }
/// <summary> /// Set the specified document's current output settings, and returns the document itself. /// </summary> /// <param name="self"> /// The input <see cref="Document"/>, /// which acts as the <b>this</b> instance for the extension method. /// </param> /// <param name="outputSettings">new output settings</param> /// <returns>The input <see cref="Document"/>, for method chaining.</returns> /// <seealso cref="Document.OutputSettings">Document.OutputSettings</seealso> public static Document OutputSettings(this Document self, DocumentOutputSettings outputSettings) { self.OutputSettings = outputSettings; return self; }
/// <summary> /// Collapsible if it's a boolean attribute and value is empty or same as name /// </summary> internal bool ShouldCollapseAttribute(DocumentOutputSettings @out) { return((string.Empty.Equals(value) || string.Equals(value, key, StringComparison.OrdinalIgnoreCase)) && @out.Syntax == DocumentSyntax.Html && Array.BinarySearch(booleanAttributes, key) >= 0); }
/// <summary> /// Get safe HTML from untrusted input HTML, /// by parsing input HTML and filtering it through a white-list of permitted tags and attributes. /// </summary> /// <param name="bodyHtml">input untrusted HTML (body fragment)</param> /// <param name="baseUri">URL to resolve relative URLs against</param> /// <param name="whitelist">white-list of permitted HTML elements</param> /// <param name="outputSettings">document output settings; use to control pretty-printing and entity escape modes</param> /// <returns>safe HTML (body fragment)</returns> /// <seealso cref="Supremes.Safety.Cleaner.Clean(Supremes.Nodes.Document)">Supremes.Safety.Cleaner.Clean(Supremes.Nodes.Document)</seealso> public static string Clean(string bodyHtml, string baseUri, Whitelist whitelist, DocumentOutputSettings outputSettings) { Document dirty = ParseBodyFragment(bodyHtml, baseUri); Cleaner cleaner = new Cleaner(whitelist); Document clean = cleaner.Clean(dirty); clean.OutputSettings = outputSettings; return clean.Body.Html; }