/// <summary> /// Start tags handler /// </summary> /// <param name="context">Markup parsing context</param> /// <param name="tagName">Tag name</param> /// <param name="attributes">List of attributes</param> private void StartTagHandler(MarkupParsingContext context, string tagName, List <XmlAttribute> attributes) { XmlNodeType previousNodeType = _currentNodeType; _currentNodeType = XmlNodeType.StartTag; _currentText = string.Empty; XmlMinificationOutputWriter output = _output; if (_settings.MinifyWhitespace && previousNodeType == XmlNodeType.Text && (_startTagBeforeText || _endTagBeforeText || _emptyTagBeforeText || _ignoredFragmentBeforeText || _xmlDeclarationBeforeText || _processingInstructionBeforeText || _doctypeBeforeText)) { output.RemoveLastWhitespaceItems(); } output.Flush(); output.Write("<"); output.Write(tagName); WriteAttributes(attributes); output.Write(">"); }
/// <summary> /// End tags handler /// </summary> /// <param name="context">Markup parsing context</param> /// <param name="tagName">Tag name</param> private void EndTagHandler(MarkupParsingContext context, string tagName) { XmlNodeType previousNodeType = _currentNodeType; string previousText = _currentText; _currentNodeType = XmlNodeType.EndTag; _currentText = string.Empty; XmlMinificationOutputWriter output = _output; if (_settings.CollapseTagsWithoutContent && previousNodeType == XmlNodeType.StartTag && previousText.Length == 0) { if (output.TransformLastStartTagToEmptyTag(_settings.RenderEmptyTagsWithSpace)) { output.Flush(); return; } } if (_settings.MinifyWhitespace && previousNodeType == XmlNodeType.Text && (_endTagBeforeText || _emptyTagBeforeText)) { output.RemoveLastWhitespaceItems(); } // Add end tag to buffer output.Write("</"); output.Write(tagName); output.Write(">"); output.Flush(); }
/// <summary> /// CDATA sections handler /// </summary> /// <param name="context">Markup parsing context</param> /// <param name="cdataText">CDATA text</param> private void CdataSectionHandler(MarkupParsingContext context, string cdataText) { _currentNodeType = XmlNodeType.CdataSection; XmlMinificationOutputWriter output = _output; output.Write("<![CDATA["); output.Write(cdataText); output.Write("]]>"); }
/// <summary> /// Comments handler /// </summary> /// <param name="context">Markup parsing context</param> /// <param name="commentText">Comment text</param> private void CommentHandler(MarkupParsingContext context, string commentText) { if (!_settings.RemoveXmlComments) { _currentNodeType = XmlNodeType.Comment; XmlMinificationOutputWriter output = _output; output.Write("<!--"); output.Write(commentText); output.Write("-->"); } }
/// <summary> /// Writes a attributes to buffer /// </summary> /// <param name="attributes">List of attributes</param> private void WriteAttributes(List <XmlAttribute> attributes) { int attributeCount = attributes.Count; for (int attributeIndex = 0; attributeIndex < attributeCount; attributeIndex++) { XmlAttribute attribute = attributes[attributeIndex]; string encodedAttributeValue = XmlAttributeValueHelpers.Encode(attribute.Value); XmlMinificationOutputWriter output = _output; output.Write(" "); output.Write(attribute.Name); output.Write("=\""); output.Write(encodedAttributeValue); output.Write("\""); } }
/// <summary> /// XML declaration handler /// </summary> /// <param name="context">Markup parsing context</param> /// <param name="attributes">List of attributes</param> private void XmlDeclarationHandler(MarkupParsingContext context, List <XmlAttribute> attributes) { _currentNodeType = XmlNodeType.XmlDeclaration; XmlMinificationOutputWriter output = _output; if (_settings.MinifyWhitespace) { output.RemoveLastWhitespaceItems(); } output.Write("<?xml"); WriteAttributes(attributes); output.Write("?>"); output.Flush(); }
/// <summary> /// Processing instruction handler /// </summary> /// <param name="context">Markup parsing context</param> /// <param name="instructionName">Instruction name</param> /// <param name="attributes">List of attributes</param> private void ProcessingInstructionHandler(MarkupParsingContext context, string instructionName, List <XmlAttribute> attributes) { _currentNodeType = XmlNodeType.ProcessingInstruction; XmlMinificationOutputWriter output = _output; if (_settings.MinifyWhitespace) { output.RemoveLastWhitespaceItems(); } output.Write("<?"); output.Write(instructionName); WriteAttributes(attributes); output.Write("?>"); output.Flush(); }
/// <summary> /// Empty tags handler /// </summary> /// <param name="context">Markup parsing context</param> /// <param name="tagName">Tag name</param> /// <param name="attributes">List of attributes</param> private void EmptyTagHandler(MarkupParsingContext context, string tagName, List <XmlAttribute> attributes) { XmlNodeType previousNodeType = _currentNodeType; _currentNodeType = XmlNodeType.EmptyTag; _currentText = string.Empty; XmlMinificationOutputWriter output = _output; if (_settings.MinifyWhitespace && previousNodeType == XmlNodeType.Text && (_startTagBeforeText || _endTagBeforeText || _emptyTagBeforeText)) { output.RemoveLastWhitespaceItems(); } output.Write("<"); output.Write(tagName); WriteAttributes(attributes); output.Write(_settings.RenderEmptyTagsWithSpace ? " />" : "/>"); output.Flush(); }
/// <summary> /// Document type declaration handler /// </summary> /// <param name="context">Markup parsing context</param> /// <param name="doctype">Document type declaration</param> private void DoctypeDelegateHandler(MarkupParsingContext context, string doctype) { _currentNodeType = XmlNodeType.Doctype; XmlMinificationOutputWriter output = _output; if (_settings.MinifyWhitespace) { output.RemoveLastWhitespaceItems(); } output.Write(Utils.CollapseWhitespace(doctype)); output.Flush(); }
/// <summary> /// Ignored fragments handler /// </summary> /// <param name="context">Markup parsing context</param> /// <param name="fragment">Ignored fragment</param> private void IgnoredFragmentHandler(MarkupParsingContext context, string fragment) { _currentNodeType = XmlNodeType.IgnoredFragment; XmlMinificationOutputWriter output = _output; if (_settings.MinifyWhitespace) { output.RemoveLastWhitespaceItems(); } if (fragment.Length > 0) { output.Write(fragment); output.Flush(); } }
/// <summary> /// Text handler /// </summary> /// <param name="context">Markup parsing context</param> /// <param name="text">Text</param> private void TextHandler(MarkupParsingContext context, string text) { XmlNodeType previousNodeType = _currentNodeType; _currentNodeType = XmlNodeType.Text; XmlMinificationOutputWriter output = _output; if (previousNodeType == XmlNodeType.Text) { _currentText = text; output.Write(text); return; } _xmlDeclarationBeforeText = false; _processingInstructionBeforeText = false; _doctypeBeforeText = false; _startTagBeforeText = false; _endTagBeforeText = false; _emptyTagBeforeText = false; _ignoredFragmentBeforeText = false; switch (previousNodeType) { case XmlNodeType.StartTag: _startTagBeforeText = true; break; case XmlNodeType.EndTag: _endTagBeforeText = true; break; case XmlNodeType.EmptyTag: _emptyTagBeforeText = true; break; case XmlNodeType.IgnoredFragment: _ignoredFragmentBeforeText = true; break; case XmlNodeType.XmlDeclaration: _xmlDeclarationBeforeText = true; break; case XmlNodeType.ProcessingInstruction: _processingInstructionBeforeText = true; break; case XmlNodeType.Doctype: _doctypeBeforeText = true; break; } if (_settings.MinifyWhitespace) { if (context.Position == 0) { // Processing starting whitespace text = text.TrimStart(null); } else if (context.Position + text.Length == context.Length) { // Processing ending whitespace text = text.TrimEnd(null); } else if (_xmlDeclarationBeforeText || _processingInstructionBeforeText || _doctypeBeforeText) { // Processing whitespace, that followed after // the XML declaration, processing instruction // or document type declaration if (string.IsNullOrWhiteSpace(text)) { text = string.Empty; } } } _currentText = text; if (text.Length > 0) { output.Write(text); } }