public void ProcessingDomTextComponentCommentsIsCorrect() { // Arrange var removingHtmlCommentsMinifier = new HtmlMinifier( new HtmlMinificationSettings(true) { RemoveHtmlComments = true }); const string input1 = "<a href=\"/tournament\" data-reactid=\"19\">" + "<!-- react-text: 20 --> <!-- /react-text -->" + "<span class=\"title\" data-reactid=\"21\">Кто станет победителем нашего турнира?</span>" + "</a>" ; const string input2 = "<span data-reactid=\"39\">" + "<!-- react-text: 40 -->— <!-- /react-text -->" + "<a href=\"/news/543/\" class=\"highlighted\" data-reactid=\"41\">читать далее</a>" + "</span>" ; const string input3 = "<div class=\"more-button\" data-reactid=\"87\">" + "<!-- react-text: 88 -->Ещё <!-- /react-text -->" + "<span class=\"caret-down\" data-reactid=\"89\"></span>" + "</div>" ; // Act string output1 = removingHtmlCommentsMinifier.Minify(input1).MinifiedContent; string output2 = removingHtmlCommentsMinifier.Minify(input2).MinifiedContent; string output3 = removingHtmlCommentsMinifier.Minify(input3).MinifiedContent; // Assert Assert.Equal(input1, output1); Assert.Equal(input2, output2); Assert.Equal(input3, output3); }
public void ProcessingCustomBooleanAttributesIsCorrect() { // Arrange var keepingBooleanAttributesMinifier = new HtmlMinifier( new HtmlMinificationSettings(true) { CollapseBooleanAttributes = false }); var collapsingBooleanAttributesMinifier = new HtmlMinifier( new HtmlMinificationSettings(true) { CollapseBooleanAttributes = true }); const string input1 = "<div custom-attribute></div>"; const string targetOutput1 = input1; const string input2 = "<div class></div>"; const string targetOutput2 = "<div class=\"\"></div>"; // Act string output1A = keepingBooleanAttributesMinifier.Minify(input1).MinifiedContent; string output1B = collapsingBooleanAttributesMinifier.Minify(input1).MinifiedContent; string output2A = keepingBooleanAttributesMinifier.Minify(input2).MinifiedContent; string output2B = collapsingBooleanAttributesMinifier.Minify(input2).MinifiedContent; // Assert Assert.Equal(targetOutput1, output1A); Assert.Equal(targetOutput1, output1B); Assert.Equal(targetOutput2, output2A); Assert.Equal(targetOutput2, output2B); }
public override void Flush() { if (memoryStream.Length == 0) { return; } try { if (response.ContentType.Equals("text/html", StringComparison.OrdinalIgnoreCase)) { var encoding = response.ContentEncoding; var htmlText = encoding.GetString(memoryStream.ToArray()); memoryStream.SetLength(0); htmlText = HtmlMinifier.Minify(htmlText, encoding); var bytes = encoding.GetBytes(htmlText); innerFilter.Write(bytes, 0, bytes.Length); } else { memoryStream.Position = 0; memoryStream.CopyTo(innerFilter); memoryStream.SetLength(0); } } finally { memoryStream.SetLength(0); } }
public void HandlingMinificationErrorsInContainerlessCommentsIsCorrect() { // Arrange var minifyingExpressionsMinifier = new HtmlMinifier( new HtmlMinificationSettings(true) { MinifyKnockoutBindingExpressions = true }); const string input = "<header>\n" + " <!--ko compose: { view: 'nav } --><!--/ko-->\n" + "</header>\n" + "<section id=\"content\" class=\"main container-fluid\">\n" + " <!--ko compose: { model: router.activeItem, \n" + " afterCompose: router.afterCompose, \n" + " transition: 'entrance'' } -->\n" + " <!--/ko-->\n" + "</section>\n" + "<footer>\n" + " <!--ko compose: { view: footer' } --><!--/ko-->\n" + "</footer>" ; // Act IList <MinificationErrorInfo> errors = minifyingExpressionsMinifier.Minify(input).Errors; // Assert Assert.Equal(3, errors.Count); Assert.Equal(2, errors[0].LineNumber); Assert.Equal(12, errors[0].ColumnNumber); Assert.Equal(5, errors[1].LineNumber); Assert.Equal(12, errors[1].ColumnNumber); Assert.Equal(11, errors[2].LineNumber); Assert.Equal(12, errors[2].ColumnNumber); }
public void HandlingMinificationErrorsInDataBindAttributesIsCorrect() { // Arrange var minifyingExpressionsMinifier = new HtmlMinifier( new HtmlMinificationSettings(true) { MinifyKnockoutBindingExpressions = true }); const string input = "<label for=\"ddlCountry\">Country:</label>\n" + "<select id=\"ddlCountry\" name=\"country\" data-bind=\"\n" + " options: availableCountries,\n"+ " optionsText: 'countryName,\n"+ " value: selectedCountry,\n"+ " optionsCaption: 'Choose...'\"></select>" ; // Act IList <MinificationErrorInfo> errors = minifyingExpressionsMinifier.Minify(input).Errors; // Assert Assert.Equal(1, errors.Count); Assert.Equal(2, errors[0].LineNumber); Assert.Equal(51, errors[0].ColumnNumber); }
public override string MinifyString(string source) { var weHtmlSettings = WESettings.Instance.Html; var settings = new HtmlMinificationSettings { // Tags RemoveOptionalEndTags = false, //EmptyTagRenderMode = HtmlEmptyTagRenderMode.Slash, // Attributes AttributeQuotesRemovalMode = weHtmlSettings.AttributeQuotesRemovalMode, RemoveRedundantAttributes = false, // JavaScript templating ProcessableScriptTypeList = weHtmlSettings.ProcessableScriptTypeList, MinifyKnockoutBindingExpressions = weHtmlSettings.MinifyKnockoutBindingExpressions, MinifyAngularBindingExpressions = weHtmlSettings.MinifyAngularBindingExpressions, CustomAngularDirectiveList = weHtmlSettings.CustomAngularDirectiveList }; var minifier = new HtmlMinifier(settings); MarkupMinificationResult result = minifier.Minify(source, generateStatistics: true); if (result.Errors.Count == 0) { WebEssentialsPackage.DTE.StatusBar.Text = "Web Essentials: HTML minified by " + result.Statistics.SavedInPercent + "%"; return(result.MinifiedContent); } else { WebEssentialsPackage.DTE.StatusBar.Text = "Web Essentials: Cannot minify the current selection. See Output Window for details."; Logger.ShowMessage("Cannot minify the selection:\r\n\r\n" + String.Join(Environment.NewLine, result.Errors.Select(e => e.Message))); return(null); } }
public void ParsingOfLocalVariablesIsCorrect() { // Arrange var minifier = new HtmlMinifier(new HtmlMinificationSettings(true) { PreserveCase = true }); const string input1 = "<video #moviePlayer>\n" + " <button (click)=\"moviePlayer.play()\"></button>\n" + "</video>" ; const string input2 = "<video var-moviePlayer>\n" + " <button (click)=\"moviePlayer.play()\"></button>\n" + "</video>" ; // Act string output1 = minifier.Minify(input1).MinifiedContent; string output2 = minifier.Minify(input2).MinifiedContent; // Assert Assert.Equal(input1, output1); Assert.Equal(input2, output2); }
public void ParsingOfEventBindingsIsCorrect() { // Arrange var minifier = new HtmlMinifier(new HtmlMinificationSettings(true) { PreserveCase = true }); const string input1 = "<button (click)=\"\t onSave() \t\">Save</button>"; const string input2 = "<button on-click=\"\t onSave() \t\">Save</button>"; const string input3 = "<div (myClick)=\"\t clickMessage = $event; \t\">click with myClick</div>"; const string input4 = "<div on-myClick=\"\t clickMessage = $event; \t\">click with myClick</div>"; const string input5 = "<hero-detail (deleteRequest)=\"\t deleteHero($event); \t\"></hero-detail>"; const string input6 = "<hero-detail on-deleteRequest=\"\t deleteHero($event); \t\"></hero-detail>"; // Act string output1 = minifier.Minify(input1).MinifiedContent; string output2 = minifier.Minify(input2).MinifiedContent; string output3 = minifier.Minify(input3).MinifiedContent; string output4 = minifier.Minify(input4).MinifiedContent; string output5 = minifier.Minify(input5).MinifiedContent; string output6 = minifier.Minify(input6).MinifiedContent; // Assert Assert.Equal(input1, output1); Assert.Equal(input2, output2); Assert.Equal(input3, output3); Assert.Equal(input4, output4); Assert.Equal(input5, output5); Assert.Equal(input6, output6); }
public void MinificationOfBindingExpressionsInCommentDirectivesIsCorrect() { // Arrange const string customAngularDirectiveList = "myDirective"; var keepingExpressionsMinifier = new HtmlMinifier( new HtmlMinificationSettings(true) { MinifyAngularBindingExpressions = false, CustomAngularDirectiveList = customAngularDirectiveList }); var minifyingExpressionsMinifier = new HtmlMinifier( new HtmlMinificationSettings(true) { MinifyAngularBindingExpressions = true, CustomAngularDirectiveList = customAngularDirectiveList }); const string input = "<!-- directive: my-directive 1 + 1 -->"; const string targetOutputA = "<!--directive:my-directive 1 + 1-->"; const string targetOutputB = "<!--directive:my-directive 1+1-->"; // Act string outputA = keepingExpressionsMinifier.Minify(input).MinifiedContent; string outputB = minifyingExpressionsMinifier.Minify(input).MinifiedContent; // Assert Assert.Equal(targetOutputA, outputA); Assert.Equal(targetOutputB, outputB); }
public void SpaceNormalizationBetweenAttributesIsCorrect() { // Arrange var minifier = new HtmlMinifier(new HtmlMinificationSettings(true)); const string input1 = "<p title=\"Some title...\">Some text...</p>"; const string input2 = "<p title = \"Some title...\">Some text...</p>"; const string targetOutput2 = "<p title=\"Some title...\">Some text...</p>"; const string input3 = "<p title\n\n\t =\n \"Some title...\">Some text...</p>"; const string targetOutput3 = "<p title=\"Some title...\">Some text...</p>"; const string input4 = "<input title=\"Some title...\" id=\"txtName\" value=\"Some text...\">"; const string targetOutput4 = "<input title=\"Some title...\" id=\"txtName\" value=\"Some text...\">"; // Act string output1 = minifier.Minify(input1).MinifiedContent; string output2 = minifier.Minify(input2).MinifiedContent; string output3 = minifier.Minify(input3).MinifiedContent; string output4 = minifier.Minify(input4).MinifiedContent; // Assert Assert.Equal(input1, output1); Assert.Equal(targetOutput2, output2); Assert.Equal(targetOutput3, output3); Assert.Equal(targetOutput4, output4); }
public override string MinifyString(string source) { var settings = new HtmlMinificationSettings { RemoveOptionalEndTags = false, AttributeQuotesRemovalMode = WESettings.Instance.Html.MinificationMode, RemoveRedundantAttributes = false, //EmptyTagRenderMode = HtmlEmptyTagRenderMode.Slash, }; var minifier = new HtmlMinifier(settings); MarkupMinificationResult result = minifier.Minify(source, generateStatistics: true); if (result.Errors.Count == 0) { WebEssentialsPackage.DTE.StatusBar.Text = "Web Essentials: HTML minified by " + result.Statistics.SavedInPercent + "%"; return(result.MinifiedContent); } else { WebEssentialsPackage.DTE.StatusBar.Text = "Web Essentials: Cannot minify the current selection. See Output Window for details."; Logger.ShowMessage("Cannot minify the selection:\r\n\r\n" + String.Join(Environment.NewLine, result.Errors.Select(e => e.Message))); return(null); } }
public void ProcessingCustomBooleanAttributesIsCorrect() { // Arrange var keepingBooleanAttributesMinifier = new HtmlMinifier( new HtmlMinificationSettings(true) { CollapseBooleanAttributes = false }); var collapsingBooleanAttributesMinifier = new HtmlMinifier( new HtmlMinificationSettings(true) { CollapseBooleanAttributes = true }); const string input = "<!doctype html>\n" + "<html>\n" + " <head>\n" + " <title>Aurelia</title>\n" + " <link rel=\"stylesheet\" href=\"styles/styles.css\">\n" + " <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n" + " </head>\n" + " <body aurelia-app>\n" + " <script src=\"jspm_packages/system.js\"></script>\n" + " <script src=\"config.js\"></script>\n" + " <script>\n" + " SystemJS.import('aurelia-bootstrapper');\n" + " </script>\n" + " </body>\n" + "</html>" ; // Act string outputA = keepingBooleanAttributesMinifier.Minify(input).MinifiedContent; string outputB = collapsingBooleanAttributesMinifier.Minify(input).MinifiedContent; // Assert Assert.Equal(input, outputA); Assert.Equal(input, outputB); }
public override string MinifyString(string source) { var settings = new HtmlMinificationSettings { RemoveOptionalEndTags = false, AttributeQuotesRemovalMode = WESettings.Instance.Html.MinificationMode, RemoveRedundantAttributes = false, //EmptyTagRenderMode = HtmlEmptyTagRenderMode.Slash, }; var minifier = new HtmlMinifier(settings); MarkupMinificationResult result = minifier.Minify(source, generateStatistics: true); if (result.Errors.Count == 0) { WebEssentialsPackage.DTE.StatusBar.Text = "Web Essentials: HTML minified by " + result.Statistics.SavedInPercent + "%"; return result.MinifiedContent; } else { WebEssentialsPackage.DTE.StatusBar.Text = "Web Essentials: Cannot minify the current selection. See Output Window for details."; Logger.ShowMessage("Cannot minify the selection:\r\n\r\n" + String.Join(Environment.NewLine, result.Errors.Select(e => e.Message))); return null; } }
/// <summary> /// Safely Attempts to minify the provided string. /// </summary> /// <param name="recording">The string to minify</param> /// <returns>Minified version of the string, or, if errors were encountered, returns the original string.</returns> private string Minify(string recording) { var settings = new HtmlMinificationSettings(); var cssMinifier = new KristensenCssMinifier(); var jsMinifier = new CrockfordJsMinifier(); var minifier = new HtmlMinifier(settings, cssMinifier, jsMinifier); MarkupMinificationResult result = minifier.Minify(recording); if (result.Errors.Count != 0) { var builder = new StringBuilder("Attempt to minify rendering failed"); foreach (var error in result.Errors) { builder.AppendLine(error.Category + " - " + error.Message); } Log.Warn(builder.ToString(), this); return recording; } return result.MinifiedContent; }
public override string MinifyString(string source) { var weHtmlSettings = WESettings.Instance.Html; var settings = new HtmlMinificationSettings { // Tags RemoveOptionalEndTags = false, //EmptyTagRenderMode = HtmlEmptyTagRenderMode.Slash, // Attributes AttributeQuotesRemovalMode = weHtmlSettings.AttributeQuotesRemovalMode, RemoveRedundantAttributes = false, // JavaScript templating ProcessableScriptTypeList = weHtmlSettings.ProcessableScriptTypeList, MinifyKnockoutBindingExpressions = weHtmlSettings.MinifyKnockoutBindingExpressions, MinifyAngularBindingExpressions = weHtmlSettings.MinifyAngularBindingExpressions, CustomAngularDirectiveList = weHtmlSettings.CustomAngularDirectiveList }; var minifier = new HtmlMinifier(settings); MarkupMinificationResult result = minifier.Minify(source, generateStatistics: true); if (result.Errors.Count == 0) { WebEssentialsPackage.DTE.StatusBar.Text = "Web Essentials: HTML minified by " + result.Statistics.SavedInPercent + "%"; return result.MinifiedContent; } else { WebEssentialsPackage.DTE.StatusBar.Text = "Web Essentials: Cannot minify the current selection. See Output Window for details."; Logger.ShowMessage("Cannot minify the selection:\r\n\r\n" + String.Join(Environment.NewLine, result.Errors.Select(e => e.Message))); return null; } }
private static string HtmlMinifierBytes(byte[] bytes) { var old = Encoding.UTF8.GetString(bytes); var tar = old; List <IJsMinifier> jsMinifiers = new List <IJsMinifier>() { new MsAjaxJsMinifier(), new NUglifyJsMinifier(), new YuiJsMinifier() }; List <ICssMinifier> cssMinifiers = new List <ICssMinifier>() { new MsAjaxCssMinifier(), new NUglifyCssMinifier(), new YuiCssMinifier() }; for (int i = 0; i < jsMinifiers.Count; i++) { for (int j = 0; j < cssMinifiers.Count; j++) { var js = jsMinifiers[i]; var css = cssMinifiers[i]; HtmlMinifier htmlMinifier = new HtmlMinifier(null, css, js, null); var html = htmlMinifier.Minify(old); if (html.Errors.Count == 0) { if (html.MinifiedContent.Length < tar.Length) { tar = html.MinifiedContent; } } } } return(tar); }
public NgTemplateCacheBuilder() { this._minifier = new HtmlMinifier(new HtmlMinificationSettings() { AttributeQuotesRemovalMode = WebMarkupMin.Core.HtmlAttributeQuotesRemovalMode.KeepQuotes, RemoveRedundantAttributes = false }); }
private static MinificationResult MinifyHtml(string file, bool produceGzipFile) { var settings = new HtmlMinificationSettings { RemoveOptionalEndTags = false, AttributeQuotesRemovalMode = WebMarkupMin.Core.HtmlAttributeQuotesRemovalMode.Html5, RemoveRedundantAttributes = false, }; string content = File.ReadAllText(file); string minFile = GetMinFileName(file); var minifier = new HtmlMinifier(settings); var minResult = new MinificationResult(file, null, null); try { MarkupMinificationResult result = minifier.Minify(content, generateStatistics: true); minResult.MinifiedContent = result.MinifiedContent; if (!result.Errors.Any()) { OnBeforeWritingMinFile(file, minFile); File.WriteAllText(minFile, result.MinifiedContent, new UTF8Encoding(true)); OnAfterWritingMinFile(file, minFile); if (produceGzipFile) { GzipFile(minFile); } } else { foreach (var error in result.Errors) { minResult.Errors.Add(new MinificationError { FileName = file, Message = error.Message, LineNumber = error.LineNumber, ColumnNumber = error.ColumnNumber }); } } } catch (Exception ex) { minResult.Errors.Add(new MinificationError { FileName = file, Message = ex.Message, LineNumber = 0, ColumnNumber = 0 }); } return(minResult); }
static void Main(string[] args) { const string htmlInput = @"<!DOCTYPE html> <html> <head> <meta charset=""utf-8"" /> <title>The test document</title> <link href=""favicon.ico"" rel=""shortcut icon"" type=""image/x-icon"" /> <meta name=""viewport"" content=""width=device-width"" /> <link rel=""stylesheet"" type=""text/css"" href=""/Content/Site.css"" /> </head> <body> <p>Lorem ipsum dolor sit amet...</p> <script src=""http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.9.1.min.js""></script> <script> (window.jquery) || document.write('<script src=""/Scripts/jquery-1.9.1.min.js""><\/script>'); </script> </body> </html>"; var htmlMinifier = new HtmlMinifier(); MarkupMinificationResult result = htmlMinifier.Minify(htmlInput, generateStatistics: true); if (result.Errors.Count == 0) { MinificationStatistics statistics = result.Statistics; if (statistics != null) { Console.WriteLine("Original size: {0:N0} Bytes", statistics.OriginalSize); Console.WriteLine("Minified size: {0:N0} Bytes", statistics.MinifiedSize); Console.WriteLine("Saved: {0:N2}%", statistics.SavedInPercent); } Console.WriteLine("Minified content:{0}{0}{1}", Environment.NewLine, result.MinifiedContent); } else { IList <MinificationErrorInfo> errors = result.Errors; Console.WriteLine("Found {0:N0} error(s):", errors.Count); Console.WriteLine(); foreach (var error in errors) { Console.WriteLine("Line {0}, Column {1}: {2}", error.LineNumber, error.ColumnNumber, error.Message); Console.WriteLine(); } } Console.ReadLine(); }
public void EditPost(ContentRegistrationPM contentPresentationModel, IEnumerable <string> tags) { var content = contentPresentationModel.GetContent(); content.Text = HtmlParser.Parse(content.Text); content.Text = HtmlMinifier.MinifyHtml(content.Text); ContentBiz.UpdateContent(content, tags); UnitOfWork.SaveChanges(); }
public void UpgradingToMetaCharsetTag() { // Arrange var originalMinifier = new HtmlMinifier( new HtmlMinificationSettings(true) { UseMetaCharsetTag = false }); var upgradingMinifier = new HtmlMinifier( new HtmlMinificationSettings(true) { UseMetaCharsetTag = true }); const string input1 = "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">"; const string targetOutput1A = input1; const string targetOutput1B = "<meta charset=\"utf-8\">"; const string input2 = "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=windows-1251\">"; const string targetOutput2A = input2; const string targetOutput2B = "<meta charset=\"windows-1251\">"; const string input3 = "<META http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\">"; const string targetOutput3A = "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\">"; const string targetOutput3B = "<meta charset=\"iso-8859-1\">"; const string input4 = "<meta http-equiv=\"Content-Type\" content=\"application/xhtml+xml;charset=UTF-8\"/>"; const string targetOutput4A = "<meta http-equiv=\"Content-Type\" content=\"application/xhtml+xml;charset=UTF-8\">"; const string targetOutput4B = "<meta charset=\"UTF-8\">"; // Act string output1A = originalMinifier.Minify(input1).MinifiedContent; string output1B = upgradingMinifier.Minify(input1).MinifiedContent; string output2A = originalMinifier.Minify(input2).MinifiedContent; string output2B = upgradingMinifier.Minify(input2).MinifiedContent; string output3A = originalMinifier.Minify(input3).MinifiedContent; string output3B = upgradingMinifier.Minify(input3).MinifiedContent; string output4A = originalMinifier.Minify(input4).MinifiedContent; string output4B = upgradingMinifier.Minify(input4).MinifiedContent; // Assert Assert.Equal(targetOutput1A, output1A); Assert.Equal(targetOutput1B, output1B); Assert.Equal(targetOutput2A, output2A); Assert.Equal(targetOutput2B, output2B); Assert.Equal(targetOutput3A, output3A); Assert.Equal(targetOutput3B, output3B); Assert.Equal(targetOutput4A, output4A); Assert.Equal(targetOutput4B, output4B); }
/// <summary> /// Creates a instance of HTML minifier /// </summary> /// <returns>Instance of HTML minifier</returns> public override IMarkupMinifier CreateMinifier() { HtmlMinificationSettings settings = MinificationSettings; ICssMinifier cssMinifier = CssMinifierFactory.CreateMinifier(); IJsMinifier jsMinifier = JsMinifierFactory.CreateMinifier(); var minifier = new HtmlMinifier(settings, cssMinifier, jsMinifier, _logger); return(minifier); }
public void CleaningClassAttributesIsCorrect() { // Arrange var cleaningAttributesMinifier = new HtmlMinifier(new HtmlMinificationSettings(true)); const string input1 = "<span class=\" label done-{{\t todo.done \t}} \">{{todo.text}}</span>"; const string targetOutput1 = "<span class=\"label done-{{\t todo.done \t}}\">{{todo.text}}</span>"; const string input2 = "<span class=\"ng-bind: 'Mr. ' + name;\"></span>"; const string targetOutput2 = "<span class=\"ng-bind:'Mr. ' + name\"></span>"; const string input3 = "<p class=\"ng-class: { strike: deleted, bold: important, red: error };\">" + "Map Syntax Example</p>"; const string targetOutput3 = "<p class=\"ng-class:{ strike: deleted, bold: important, red: error }\">" + "Map Syntax Example</p>"; const string input4 = "<div class=\"ng-cloak\">{{'hello IE7'}}</div>"; const string targetOutput4 = input4; const string input5 = "<div class=\"ng-form: 'frmMain';\"></div>"; const string targetOutput5 = "<div class=\"ng-form:'frmMain'\"></div>"; const string input6 = "<div class=\"ng-include: 'myPartialTemplate.html'; onload: childOnLoad();" + " autoscroll;\"></div>"; const string targetOutput6 = "<div class=\"ng-include:'myPartialTemplate.html';onload:childOnLoad();" + "autoscroll\"></div>"; const string input7 = "<span class=\"data-ng-bind: name; ng-cloak; " + "ng-style: { 'background-color': 'lime' };\"></span>"; const string targetOutput7 = "<span class=\"data-ng-bind:name;ng-cloak;" + "ng-style:{ 'background-color': 'lime' }\"></span>"; const string input8 = "<button class=\"btn data-ng-bind: buttonText; btn-primary btn-lg\"></button>"; const string targetOutput8 = "<button class=\"btn data-ng-bind:buttonText; btn-primary btn-lg\"></button>"; // Act string output1 = cleaningAttributesMinifier.Minify(input1).MinifiedContent; string output2 = cleaningAttributesMinifier.Minify(input2).MinifiedContent; string output3 = cleaningAttributesMinifier.Minify(input3).MinifiedContent; string output4 = cleaningAttributesMinifier.Minify(input4).MinifiedContent; string output5 = cleaningAttributesMinifier.Minify(input5).MinifiedContent; string output6 = cleaningAttributesMinifier.Minify(input6).MinifiedContent; string output7 = cleaningAttributesMinifier.Minify(input7).MinifiedContent; string output8 = cleaningAttributesMinifier.Minify(input8).MinifiedContent; // Assert Assert.Equal(targetOutput1, output1); Assert.Equal(targetOutput2, output2); Assert.Equal(targetOutput3, output3); Assert.Equal(targetOutput4, output4); Assert.Equal(targetOutput5, output5); Assert.Equal(targetOutput6, output6); Assert.Equal(targetOutput7, output7); Assert.Equal(targetOutput8, output8); }
public void ParsingOfPropertyBindingsIsCorrect() { // Arrange var minifier = new HtmlMinifier(new HtmlMinificationSettings(true) { PreserveCase = true }); const string input1 = "<input [value]=\"\t firstName \t\" [placeholder]=\"\t firstNamePlaceholder \t\">"; const string input2 = "<input bind-value=\"\t firstName \t\" bind-placeholder=\"\t firstNamePlaceholder \t\">"; const string input3 = "<div [ngClass]=\"{ selected: isSelected }\"></div>"; const string input4 = "<div bind-ngClass=\"{ selected: isSelected }\"></div>"; const string input5 = "<hero-detail prefix=\"You are my\" [hero]=\"\t currentHero \t\"></hero-detail>"; const string input6 = "<hero-detail prefix=\"You are my\" bind-hero=\"\t currentHero \t\"></hero-detail>"; const string input7 = "<div [textContent]=\"'News has the following title: ' + title\"></div>"; const string input8 = "<div bind-textContent=\"'News has the following title: ' + title\"></div>"; const string input9 = "<button [attr.aria-label]=\"\t actionName \t\">Perform action</button>"; const string input10 = "<button bind-attr.aria-label=\"\t actionName \t\">Perform action</button>"; const string input11 = "<div class=\"special\" [class.special]=\"\t !isSpecial \t\"></div>"; const string input12 = "<div class=\"special\" bind-class.special=\"\t !isSpecial \t\"></div>"; const string input13 = "<button [style.fontSize.%]=\"\t !isSpecial ? 150 : 50 \t\">Small</button>"; const string input14 = "<button bind-style.fontSize.%=\"\t !isSpecial ? 150 : 50 \t\">Small</button>"; // Act string output1 = minifier.Minify(input1).MinifiedContent; string output2 = minifier.Minify(input2).MinifiedContent; string output3 = minifier.Minify(input3).MinifiedContent; string output4 = minifier.Minify(input4).MinifiedContent; string output5 = minifier.Minify(input5).MinifiedContent; string output6 = minifier.Minify(input6).MinifiedContent; string output7 = minifier.Minify(input7).MinifiedContent; string output8 = minifier.Minify(input8).MinifiedContent; string output9 = minifier.Minify(input9).MinifiedContent; string output10 = minifier.Minify(input10).MinifiedContent; string output11 = minifier.Minify(input11).MinifiedContent; string output12 = minifier.Minify(input12).MinifiedContent; string output13 = minifier.Minify(input13).MinifiedContent; string output14 = minifier.Minify(input14).MinifiedContent; // Assert Assert.Equal(input1, output1); Assert.Equal(input2, output2); Assert.Equal(input3, output3); Assert.Equal(input4, output4); Assert.Equal(input5, output5); Assert.Equal(input6, output6); Assert.Equal(input7, output7); Assert.Equal(input8, output8); Assert.Equal(input9, output9); Assert.Equal(input10, output10); Assert.Equal(input11, output11); Assert.Equal(input12, output12); Assert.Equal(input13, output13); Assert.Equal(input14, output14); }
public void CleaningEventAttributesIsCorrect() { // Arrange var cleaningAttributesMinifier = new HtmlMinifier(new HtmlMinificationSettings(true)); const string input = "<button onclick=\" showMessageBox('Error', '\t {{\t message \t}} \t'); \">" + "Show message</button>"; const string targetOutput = "<button onclick=\"showMessageBox('Error', '\t {{\t message \t}} \t')\">" + "Show message</button>"; // Act string output = cleaningAttributesMinifier.Minify(input).MinifiedContent; // Assert Assert.Equal(targetOutput, output); }
protected string Minify(string content) { var settings = new HtmlMinificationSettings(); var cssMinifier = new KristensenCssMinifier(); var jsMinifier = new CrockfordJsMinifier(); var minifier = new HtmlMinifier(settings, cssMinifier, jsMinifier); MarkupMinificationResult result = minifier.Minify(content); if (result.Errors.Count != 0) { Log.Warn("Attempt to minify content failed", this); return content; } return result.MinifiedContent; }
public void RemovingTagsWithoutContentIsCorrect() { // Arrange var removingTagsWithoutContentMinifier = new HtmlMinifier( new HtmlMinificationSettings(true) { RemoveTagsWithoutContent = true }); const string input1 = "<div aurelia-app></div>"; const string input2 = "<router-view></router-view>"; // Act string output1 = removingTagsWithoutContentMinifier.Minify(input1).MinifiedContent; string output2 = removingTagsWithoutContentMinifier.Minify(input2).MinifiedContent; // Assert Assert.Equal(input1, output1); Assert.Equal(input2, output2); }
public void CaseNormalizationIsCorrect() { // Arrange var minifier = new HtmlMinifier(new HtmlMinificationSettings(true)); const string input1 = "<P>Some text...</p>"; const string targetOutput1 = "<p>Some text...</p>"; const string input2 = "<DIV>Some text..</DIV>"; const string targetOutput2 = "<div>Some text..</div>"; const string input3 = "<DIV title=\"Some title...\">Some text..</DiV>"; const string targetOutput3 = "<div title=\"Some title...\">Some text..</div>"; const string input4 = "<DIV TITLE=\"Some title...\">Some text..</DIV>"; const string targetOutput4 = "<div title=\"Some title...\">Some text..</div>"; const string input5 = "<DIV tItLe=\"Some title...\">Some text..</DIV>"; const string targetOutput5 = "<div title=\"Some title...\">Some text..</div>"; const string input6 = "<DiV tItLe=\"Some title...\">Some text..</DIV>"; const string targetOutput6 = "<div title=\"Some title...\">Some text..</div>"; // Act string output1 = minifier.Minify(input1).MinifiedContent; string output2 = minifier.Minify(input2).MinifiedContent; string output3 = minifier.Minify(input3).MinifiedContent; string output4 = minifier.Minify(input4).MinifiedContent; string output5 = minifier.Minify(input5).MinifiedContent; string output6 = minifier.Minify(input6).MinifiedContent; // Assert Assert.Equal(targetOutput1, output1); Assert.Equal(targetOutput2, output2); Assert.Equal(targetOutput3, output3); Assert.Equal(targetOutput4, output4); Assert.Equal(targetOutput5, output5); Assert.Equal(targetOutput6, output6); }
public void ParsingIsCorrect() { // Arrange var minifier = new HtmlMinifier(new HtmlMinificationSettings(true)); const string input1 = "<input type=\"text\" value.bind=\"firstName\">"; const string input2 = "<img src.bind=\"\t typeof data.thumbnail !== 'undefined' ? data.thumbnail : ''; \t\">"; const string input3 = "<ul>\n" + " <li repeat.for=\"post of posts\">\n" + " <img src.bind=\"post.data.thumbnail\">\n" + " </li>\n" + "</ul>" ; const string input4 = "<form submit.trigger=\"\t submit(); \t\"></form>"; const string input5 = "<ul>\n" + " <li repeat.for=\"navItem of router.navigation\" class=\"${\t navItem.isActive ? 'active' : ''; \t}\">\n" + " <a href=\"http://mysite.com${\t navItem.href \t}\">\n" + " ${\t navItem.title \t}\n" + " </a>\n" + " </li>\n" + "</ul>" ; // Act string output1 = minifier.Minify(input1).MinifiedContent; string output2 = minifier.Minify(input2).MinifiedContent; string output3 = minifier.Minify(input3).MinifiedContent; string output4 = minifier.Minify(input4).MinifiedContent; string output5 = minifier.Minify(input5).MinifiedContent; // Assert Assert.Equal(input1, output1); Assert.Equal(input2, output2); Assert.Equal(input3, output3); Assert.Equal(input4, output4); Assert.Equal(input5, output5); }
public void MinificationOfBindingExpressionsInElementDirectivesIsCorrect() { // Arrange var keepingExpressionsMinifier = new HtmlMinifier( new HtmlMinificationSettings(true) { MinifyAngularBindingExpressions = false }); var minifyingExpressionsMinifier = new HtmlMinifier( new HtmlMinificationSettings(true) { MinifyAngularBindingExpressions = true }); const string input1 = "<ng-pluralize count=\"\t personCount \t\"" + " when=\"{ '0': 'Nobody is viewing.',\n" + " 'one': '1 person is viewing.',\n" + " 'other': '{} people are viewing.'}\">\n" + "</ng-pluralize>" ; const string targetOutput1A = input1; const string targetOutput1B = "<ng-pluralize count=\"personCount\"" + " when=\"{'0':'Nobody is viewing.'," + "'one':'1 person is viewing.'," + "'other':'{} people are viewing.'}\">\n" + "</ng-pluralize>" ; const string input2 = "<ng:pluralize count=\"\t personCount \t\" offset=\"2\"" + " when=\"{'0': 'Nobody is viewing.',\n" + " '1': '{{person1}} is viewing.',\n" + " '2': '{{person1}} and {{person2}} are viewing.',\n" + " 'one': '{{person1}}, {{person2}} and one other person are viewing.',\n" + " 'other': '{{person1}}, {{person2}} and {} other people are viewing.'}\">\n" + "</ng:pluralize>" ; const string targetOutput2A = input2; const string targetOutput2B = "<ng:pluralize count=\"personCount\" offset=\"2\"" + " when=\"{'0':'Nobody is viewing.'," + "'1':'{{person1}} is viewing.'," + "'2':'{{person1}} and {{person2}} are viewing.'," + "'one':'{{person1}}, {{person2}} and one other person are viewing.'," + "'other':'{{person1}}, {{person2}} and {} other people are viewing.'}\">\n" + "</ng:pluralize>" ; const string input3 = "<form name=\"myForm\">\n" + " <input type=\"text\" ng-model=\"field\" name=\"myField\" required=\"required\" minlength=\"5\">\n" + " <ng-messages for=\"\t myForm.myField.$error \t\">\n" + " <ng-message when=\"required\">You did not enter a field</ng-message>\n" + " <ng-message when=\"minlength\">The value entered is too short</ng-message>\n" + " </ng-messages>\n" + "</form>" ; const string targetOutput3A = input3; const string targetOutput3B = "<form name=\"myForm\">\n" + " <input type=\"text\" ng-model=\"field\" name=\"myField\" required=\"required\" minlength=\"5\">\n" + " <ng-messages for=\"myForm.myField.$error\">\n" + " <ng-message when=\"required\">You did not enter a field</ng-message>\n" + " <ng-message when=\"minlength\">The value entered is too short</ng-message>\n" + " </ng-messages>\n" + "</form>" ; // Act string output1A = keepingExpressionsMinifier.Minify(input1).MinifiedContent; string output1B = minifyingExpressionsMinifier.Minify(input1).MinifiedContent; string output2A = keepingExpressionsMinifier.Minify(input2).MinifiedContent; string output2B = minifyingExpressionsMinifier.Minify(input2).MinifiedContent; string output3A = keepingExpressionsMinifier.Minify(input3).MinifiedContent; string output3B = minifyingExpressionsMinifier.Minify(input3).MinifiedContent; // Assert Assert.Equal(targetOutput1A, output1A); Assert.Equal(targetOutput1B, output1B); Assert.Equal(targetOutput2A, output2A); Assert.Equal(targetOutput2B, output2B); Assert.Equal(targetOutput3A, output3A); Assert.Equal(targetOutput3B, output3B); }
public void MinificationOfBindingExpressionsInCustomAttributeDirectivesIsCorrect() { // Arrange const string customAngularDirectiveList = "myDirective,myShowModalData"; var keepingExpressionsMinifier = new HtmlMinifier( new HtmlMinificationSettings(true) { MinifyAngularBindingExpressions = false, CustomAngularDirectiveList = customAngularDirectiveList }); var minifyingExpressionsMinifier = new HtmlMinifier( new HtmlMinificationSettings(true) { MinifyAngularBindingExpressions = true, CustomAngularDirectiveList = customAngularDirectiveList }); const string input1 = "<input my-directive=\"1 + 1\">"; const string targetOutput1A = input1; const string targetOutput1B = "<input my-directive=\"1+1\">"; const string input2 = "<a href=\"#\" my-show-modal-data=\"{ active: true }\">Link</a>"; const string targetOutput2A = input2; const string targetOutput2B = "<a href=\"#\" my-show-modal-data=\"{active:true}\">Link</a>"; // Act string output1A = keepingExpressionsMinifier.Minify(input1).MinifiedContent; string output1B = minifyingExpressionsMinifier.Minify(input1).MinifiedContent; string output2A = keepingExpressionsMinifier.Minify(input2).MinifiedContent; string output2B = minifyingExpressionsMinifier.Minify(input2).MinifiedContent; // Assert Assert.Equal(targetOutput1A, output1A); Assert.Equal(targetOutput1B, output1B); Assert.Equal(targetOutput2A, output2A); Assert.Equal(targetOutput2B, output2B); }
public void MinificationOfBindingExpressionsInClassDirectivesIsCorrect() { // Arrange var keepingExpressionsMinifier = new HtmlMinifier( new HtmlMinificationSettings(true) { MinifyAngularBindingExpressions = false }); var minifyingExpressionsMinifier = new HtmlMinifier( new HtmlMinificationSettings(true) { MinifyAngularBindingExpressions = true }); const string input1 = "<span class=\"ng-bind:'Mr. ' + name\"></span>"; const string targetOutput1A = input1; const string targetOutput1B = "<span class=\"ng-bind:'Mr. '+name\"></span>"; const string input2 = "<span class=\"ng_bind:'Mr. ' + name\"></span>"; const string targetOutput2A = input2; const string targetOutput2B = "<span class=\"ng_bind:'Mr. '+name\"></span>"; const string input3 = "<span class=\"x-ng-bind:'Mr. ' + name\"></span>"; const string targetOutput3A = input3; const string targetOutput3B = "<span class=\"x-ng-bind:'Mr. '+name\"></span>"; const string input4 = "<span class=\"data-ng-bind:'Mr. ' + name\"></span>"; const string targetOutput4A = input4; const string targetOutput4B = "<span class=\"data-ng-bind:'Mr. '+name\"></span>"; const string input5 = "<p class=\"ng-class:{ strike: deleted, bold: important, red: error }\">" + "Map Syntax Example</p>"; const string targetOutput5A = input5; const string targetOutput5B = "<p class=\"ng-class:{strike:deleted,bold:important,red:error}\">" + "Map Syntax Example</p>"; const string input6 = "<p class=\"ng-class:style\">Using String Syntax</p>"; const string targetOutput6A = input6; const string targetOutput6B = "<p class=\"ng-class:style\">Using String Syntax</p>"; const string input7 = "<p class=\"ng-class:[ style1, style2, style3 ]\">Using Array Syntax</p>"; const string targetOutput7A = input7; const string targetOutput7B = "<p class=\"ng-class:[style1,style2,style3]\">Using Array Syntax</p>"; const string input8 = "<div class=\"ng-init:count = 1\"></div>"; const string targetOutput8A = input8; const string targetOutput8B = "<div class=\"ng-init:count=1\"></div>"; const string input9 = "<span class=\"ng-style:{ 'background-color': 'blue' }\">Sample Text</span>"; const string targetOutput9A = input9; const string targetOutput9B = "<span class=\"ng-style:{'background-color':'blue'}\">Sample Text</span>"; // Act string output1A = keepingExpressionsMinifier.Minify(input1).MinifiedContent; string output1B = minifyingExpressionsMinifier.Minify(input1).MinifiedContent; string output2A = keepingExpressionsMinifier.Minify(input2).MinifiedContent; string output2B = minifyingExpressionsMinifier.Minify(input2).MinifiedContent; string output3A = keepingExpressionsMinifier.Minify(input3).MinifiedContent; string output3B = minifyingExpressionsMinifier.Minify(input3).MinifiedContent; string output4A = keepingExpressionsMinifier.Minify(input4).MinifiedContent; string output4B = minifyingExpressionsMinifier.Minify(input4).MinifiedContent; string output5A = keepingExpressionsMinifier.Minify(input5).MinifiedContent; string output5B = minifyingExpressionsMinifier.Minify(input5).MinifiedContent; string output6A = keepingExpressionsMinifier.Minify(input6).MinifiedContent; string output6B = minifyingExpressionsMinifier.Minify(input6).MinifiedContent; string output7A = keepingExpressionsMinifier.Minify(input7).MinifiedContent; string output7B = minifyingExpressionsMinifier.Minify(input7).MinifiedContent; string output8A = keepingExpressionsMinifier.Minify(input8).MinifiedContent; string output8B = minifyingExpressionsMinifier.Minify(input8).MinifiedContent; string output9A = keepingExpressionsMinifier.Minify(input9).MinifiedContent; string output9B = minifyingExpressionsMinifier.Minify(input9).MinifiedContent; // Assert Assert.Equal(targetOutput1A, output1A); Assert.Equal(targetOutput1B, output1B); Assert.Equal(targetOutput2A, output2A); Assert.Equal(targetOutput2B, output2B); Assert.Equal(targetOutput3A, output3A); Assert.Equal(targetOutput3B, output3B); Assert.Equal(targetOutput4A, output4A); Assert.Equal(targetOutput4B, output4B); Assert.Equal(targetOutput5A, output5A); Assert.Equal(targetOutput5B, output5B); Assert.Equal(targetOutput6A, output6A); Assert.Equal(targetOutput6B, output6B); Assert.Equal(targetOutput7A, output7A); Assert.Equal(targetOutput7B, output7B); Assert.Equal(targetOutput8A, output8A); Assert.Equal(targetOutput8B, output8B); Assert.Equal(targetOutput9A, output9A); Assert.Equal(targetOutput9B, output9B); }
public void CleaningOtherAttributesIsCorrect() { // Arrange var cleaningAttributesMinifier = new HtmlMinifier(new HtmlMinificationSettings(true)); const string input1 = "<input type=\"text\" value=\" {{\t text \t}} \">"; const string targetOutput1 = input1; const string input2 = "<pre ng-bind-template=\" {{\t salutation \t}} {{\t name \t}}! \"></pre>"; const string targetOutput2 = input2; // Act string output1 = cleaningAttributesMinifier.Minify(input1).MinifiedContent; string output2 = cleaningAttributesMinifier.Minify(input2).MinifiedContent; // Assert Assert.Equal(targetOutput1, output1); Assert.Equal(targetOutput2, output2); }
public void CleaningStyleAttributesIsCorrect() { // Arrange var cleaningAttributesMinifier = new HtmlMinifier(new HtmlMinificationSettings(true)); const string input = "<div style=\"\t height: 25px; width: 25px; background-color: {{\t color \t}}; \t\"></div>"; const string targetOutput = "<div style=\"height: 25px; width: 25px; background-color: {{\t color \t}}\"></div>"; // Act string output = cleaningAttributesMinifier.Minify(input).MinifiedContent; // Assert Assert.Equal(targetOutput, output); }
public void RemovingTagsWithoutContentIsCorrect() { // Arrange var removingTagsWithoutContentMinifier = new HtmlMinifier( new HtmlMinificationSettings(true) { RemoveTagsWithoutContent = true }); const string input = "<div ng-app></div>"; // Act string output = removingTagsWithoutContentMinifier.Minify(input).MinifiedContent; // Assert Assert.Equal(input, output); }
public void WhitespaceMinificationIsCorrect() { // Arrange var keepingWhitespaceMinifier = new HtmlMinifier( new HtmlMinificationSettings(true) { WhitespaceMinificationMode = WhitespaceMinificationMode.None }); var safeRemovingWhitespaceMinifier = new HtmlMinifier( new HtmlMinificationSettings(true) { WhitespaceMinificationMode = WhitespaceMinificationMode.Safe }); var mediumRemovingWhitespaceMinifier = new HtmlMinifier( new HtmlMinificationSettings(true) { WhitespaceMinificationMode = WhitespaceMinificationMode.Medium }); var aggressiveRemovingWhitespaceMinifier = new HtmlMinifier( new HtmlMinificationSettings(true) { WhitespaceMinificationMode = WhitespaceMinificationMode.Aggressive }); const string input = "<ul>\n" + " <li data-ng-repeat=\"customer in customers\"> " + "{{\t customer.name \t}}\t - \t{{\t customer.city \t}} " + "</li>\n" + "</ul>" ; const string targetOutputA = input; const string targetOutputB = "<ul>" + "<li data-ng-repeat=\"customer in customers\"> " + "{{\t customer.name \t}} - {{\t customer.city \t}} " + "</li>" + "</ul>" ; const string targetOutputC = "<ul>" + "<li data-ng-repeat=\"customer in customers\">" + "{{\t customer.name \t}} - {{\t customer.city \t}}" + "</li>" + "</ul>" ; const string targetOutputD = "<ul>" + "<li data-ng-repeat=\"customer in customers\">" + "{{\t customer.name \t}} - {{\t customer.city \t}}" + "</li>" + "</ul>" ; // Act string outputA = keepingWhitespaceMinifier.Minify(input).MinifiedContent; string outputB = safeRemovingWhitespaceMinifier.Minify(input).MinifiedContent; string outputC = mediumRemovingWhitespaceMinifier.Minify(input).MinifiedContent; string outputD = aggressiveRemovingWhitespaceMinifier.Minify(input).MinifiedContent; // Assert Assert.Equal(targetOutputA, outputA); Assert.Equal(targetOutputB, outputB); Assert.Equal(targetOutputC, outputC); Assert.Equal(targetOutputD, outputD); }
public void ProcessingHtmlCommentsInScriptsIsCorrect() { // Arrange var minifier = new HtmlMinifier(new HtmlMinificationSettings(true)); var removingWhitespaceMinifier = new HtmlMinifier( new HtmlMinificationSettings(true) { WhitespaceMinificationMode = WhitespaceMinificationMode.Medium }); var removingHtmlCommentsMinifier = new HtmlMinifier( new HtmlMinificationSettings(true) { RemoveHtmlCommentsFromScriptsAndStyles = true }); const string input = "<script type=\"text/ng-template\">\r\n" + " <!--directive:date-picker -->\r\n" + "</script>" ; // Act string outputA = minifier.Minify(input).MinifiedContent; string outputB = removingWhitespaceMinifier.Minify(input).MinifiedContent; string outputC = removingHtmlCommentsMinifier.Minify(input).MinifiedContent; // Assert Assert.Equal(input, outputA); Assert.Equal(input, outputB); Assert.Equal(input, outputC); }
public void ProcessingCustomBooleanAttributesIsCorrect() { // Arrange var keepingBooleanAttributesMinifier = new HtmlMinifier( new HtmlMinificationSettings(true) { CollapseBooleanAttributes = false }); var collapsingBooleanAttributesMinifier = new HtmlMinifier( new HtmlMinificationSettings(true) { CollapseBooleanAttributes = true }); const string input1 = "<html ng-app>\n" + " <body ng-controller=\"MyController\">\n" + " <input ng-model=\"foo\" value=\"bar\">\n" + " <button ng-click=\"changeFoo()\">{{buttonText}}</button>\n" + " <script src=\"angular.js\"></script>\n" + " </body>\n" + "</html>" ; const string input2 = "<div ng-include src=\"views/sidepanel.html\"></div>"; const string input3 = "<div ng:include src=\"views/sidepanel.html\"></div>"; const string input4 = "<div ng_include src=\"views/sidepanel.html\"></div>"; const string input5 = "<div x-ng-include src=\"views/sidepanel.html\"></div>"; const string input6 = "<div data-ng-include src=\"views/sidepanel.html\"></div>"; const string input7 = "<div ng-include=\"\" src=\"views/sidepanel.html\"></div>"; // Act string output1A = keepingBooleanAttributesMinifier.Minify(input1).MinifiedContent; string output1B = collapsingBooleanAttributesMinifier.Minify(input1).MinifiedContent; string output2A = keepingBooleanAttributesMinifier.Minify(input2).MinifiedContent; string output2B = collapsingBooleanAttributesMinifier.Minify(input2).MinifiedContent; string output3A = keepingBooleanAttributesMinifier.Minify(input3).MinifiedContent; string output3B = collapsingBooleanAttributesMinifier.Minify(input3).MinifiedContent; string output4A = keepingBooleanAttributesMinifier.Minify(input4).MinifiedContent; string output4B = collapsingBooleanAttributesMinifier.Minify(input4).MinifiedContent; string output5A = keepingBooleanAttributesMinifier.Minify(input5).MinifiedContent; string output5B = collapsingBooleanAttributesMinifier.Minify(input5).MinifiedContent; string output6A = keepingBooleanAttributesMinifier.Minify(input6).MinifiedContent; string output6B = collapsingBooleanAttributesMinifier.Minify(input6).MinifiedContent; string output7A = keepingBooleanAttributesMinifier.Minify(input7).MinifiedContent; string output7B = collapsingBooleanAttributesMinifier.Minify(input7).MinifiedContent; // Assert Assert.Equal(input1, output1A); Assert.Equal(input1, output1B); Assert.Equal(input2, output2A); Assert.Equal(input2, output2B); Assert.Equal(input3, output3A); Assert.Equal(input3, output3B); Assert.Equal(input4, output4A); Assert.Equal(input4, output4B); Assert.Equal(input5, output5A); Assert.Equal(input5, output5B); Assert.Equal(input6, output6A); Assert.Equal(input6, output6B); Assert.Equal(input7, output7A); Assert.Equal(input7, output7B); }
public void ProcessingCommentDirectivesIsCorrect() { // Arrange var removingHtmlCommentsMinifier = new HtmlMinifier( new HtmlMinificationSettings(true) { RemoveHtmlComments = true }); const string input1 = "<div ng-app=\"superhero\">\n" + " <!--\t directive: superman \t-->\n" + "</div>" ; const string targetOutput1 = "<div ng-app=\"superhero\">\n" + " <!--directive:superman -->\n" + "</div>" ; const string input2 = "<body ng-controller=\"MainCtrl\">\n" + " <!--directive:date-picker -->\n" + "</body>" ; const string targetOutput2 = input2; const string input3 = "<!-- directive: my-dir exp -->"; const string targetOutput3 = "<!--directive:my-dir exp-->"; // Act string output1 = removingHtmlCommentsMinifier.Minify(input1).MinifiedContent; string output2 = removingHtmlCommentsMinifier.Minify(input2).MinifiedContent; string output3 = removingHtmlCommentsMinifier.Minify(input3).MinifiedContent; // Assert Assert.Equal(targetOutput1, output1); Assert.Equal(targetOutput2, output2); Assert.Equal(targetOutput3, output3); }
public void CleaningNumericAttributesIsCorrect() { // Arrange var cleaningAttributesMinifier = new HtmlMinifier(new HtmlMinificationSettings(true)); const string input = "<select size=\" {{\t listSize \t}} \"></select>"; const string targetOutput = "<select size=\"{{\t listSize \t}}\"></select>"; // Act string output = cleaningAttributesMinifier.Minify(input).MinifiedContent; // Assert Assert.Equal(targetOutput, output); }
public void CleaningUriBasedAttributesIsCorrect() { // Arrange var cleaningAttributesMinifier = new HtmlMinifier(new HtmlMinificationSettings(true)); const string input = "<img src=\" /Content/images/icons/{{\t iconName \t}}.png \">"; const string targetOutput = "<img src=\"/Content/images/icons/{{\t iconName \t}}.png\">"; // Act string output = cleaningAttributesMinifier.Minify(input).MinifiedContent; // Assert Assert.Equal(targetOutput, output); }
public void MinificationOfBindingExpressionsInMustacheStyleTagsIsCorrect() { // Arrange var keepingExpressionsMinifier = new HtmlMinifier( new HtmlMinificationSettings(true) { MinifyAngularBindingExpressions = false }); var minifyingExpressionsMinifier = new HtmlMinifier( new HtmlMinificationSettings(true) { MinifyAngularBindingExpressions = true }); const string input1 = "<ul>\n" + " <li data-ng-repeat=\"customer in customers\">{{ customer.name | uppercase }} - {{ customer.city }}</li>\n" + "</ul>" ; const string targetOutput1A = input1; const string targetOutput1B = "<ul>\n" + " <li data-ng-repeat=\"customer in customers\">{{customer.name|uppercase}} - {{customer.city}}</li>\n" + "</ul>" ; const string input2 = "<ul>\n" + " <li data-ng-repeat=\"customer in customers\">{{ customer.name + \" - \" + customer.city }}</li>\n" + "</ul>" ; const string targetOutput2A = input2; const string targetOutput2B = "<ul>\n" + " <li data-ng-repeat=\"customer in customers\">{{customer.name+\" - \"+customer.city}}</li>\n" + "</ul>" ; const string input3 = "<strong>Price: </strong> {{ 3 * 10 | currency }}"; const string targetOutput3A = input3; const string targetOutput3B = "<strong>Price: </strong> {{3*10|currency}}"; const string input4 = "<div ng-controller=\"EventController\">\n" + " <button ng-click=\"clickMe($event)\">Event</button>\n" + " <p><code>$event</code>: <pre> {{ $event | json }}</pre></p>\n" + " <p><code>clickEvent</code>: <pre>{{ clickEvent | json }}</pre></p>" + "</div>" ; const string targetOutput4A = input4; const string targetOutput4B = "<div ng-controller=\"EventController\">\n" + " <button ng-click=\"clickMe($event)\">Event</button>\n" + " <p><code>$event</code>: <pre> {{$event|json}}</pre></p>\n" + " <p><code>clickEvent</code>: <pre>{{clickEvent|json}}</pre></p>" + "</div>"; const string input5 = "<p id=\"one-time-binding-example\">One time binding: {{ :: name }}</p>"; const string targetOutput5A = input5; const string targetOutput5B = "<p id=\"one-time-binding-example\">One time binding: {{::name}}</p>"; const string input6 = "<img src=\"/Content/images/icons/{{\t iconName + '.png' \t}}\">"; const string targetOutput6A = input6; const string targetOutput6B = "<img src=\"/Content/images/icons/{{iconName+'.png'}}\">"; const string input7 = "<select size=\"{{\t listSize \t}}\"></select>"; const string targetOutput7A = input7; const string targetOutput7B = "<select size=\"{{listSize}}\"></select>"; const string input8 = "<span class=\"label done-{{\t todo.done \t}}\">{{todo.text}}</span>"; const string targetOutput8A = input8; const string targetOutput8B = "<span class=\"label done-{{todo.done}}\">{{todo.text}}</span>"; const string input9 = "<div style=\"background-color: {{\t color \t}}\"></div>"; const string targetOutput9A = input9; const string targetOutput9B = "<div style=\"background-color: {{color}}\"></div>"; const string input10 = "<button onclick=\"showMessageBox('Error', '{{\t message \t}}')\">Show message</button>"; const string targetOutput10A = input10; const string targetOutput10B = input10; const string input11 = "<input type=\"text\" value=\"{{\t text \t}}\">"; const string targetOutput11A = input11; const string targetOutput11B = "<input type=\"text\" value=\"{{text}}\">"; const string input12 = "<pre ng-bind-template=\"{{\t salutation \t}} {{\t name \t}}!\"></pre>"; const string targetOutput12A = input12; const string targetOutput12B = "<pre ng-bind-template=\"{{salutation}} {{name}}!\"></pre>"; const string input13 = "<div>${{\t Price \t}}</div>"; const string targetOutput13A = input13; const string targetOutput13B = "<div>${{Price}}</div>"; // Act string output1A = keepingExpressionsMinifier.Minify(input1).MinifiedContent; string output1B = minifyingExpressionsMinifier.Minify(input1).MinifiedContent; string output2A = keepingExpressionsMinifier.Minify(input2).MinifiedContent; string output2B = minifyingExpressionsMinifier.Minify(input2).MinifiedContent; string output3A = keepingExpressionsMinifier.Minify(input3).MinifiedContent; string output3B = minifyingExpressionsMinifier.Minify(input3).MinifiedContent; string output4A = keepingExpressionsMinifier.Minify(input4).MinifiedContent; string output4B = minifyingExpressionsMinifier.Minify(input4).MinifiedContent; string output5A = keepingExpressionsMinifier.Minify(input5).MinifiedContent; string output5B = minifyingExpressionsMinifier.Minify(input5).MinifiedContent; string output6A = keepingExpressionsMinifier.Minify(input6).MinifiedContent; string output6B = minifyingExpressionsMinifier.Minify(input6).MinifiedContent; string output7A = keepingExpressionsMinifier.Minify(input7).MinifiedContent; string output7B = minifyingExpressionsMinifier.Minify(input7).MinifiedContent; string output8A = keepingExpressionsMinifier.Minify(input8).MinifiedContent; string output8B = minifyingExpressionsMinifier.Minify(input8).MinifiedContent; string output9A = keepingExpressionsMinifier.Minify(input9).MinifiedContent; string output9B = minifyingExpressionsMinifier.Minify(input9).MinifiedContent; string output10A = keepingExpressionsMinifier.Minify(input10).MinifiedContent; string output10B = minifyingExpressionsMinifier.Minify(input10).MinifiedContent; string output11A = keepingExpressionsMinifier.Minify(input11).MinifiedContent; string output11B = minifyingExpressionsMinifier.Minify(input11).MinifiedContent; string output12A = keepingExpressionsMinifier.Minify(input12).MinifiedContent; string output12B = minifyingExpressionsMinifier.Minify(input12).MinifiedContent; string output13A = keepingExpressionsMinifier.Minify(input13).MinifiedContent; string output13B = minifyingExpressionsMinifier.Minify(input13).MinifiedContent; // Assert Assert.Equal(targetOutput1A, output1A); Assert.Equal(targetOutput1B, output1B); Assert.Equal(targetOutput2A, output2A); Assert.Equal(targetOutput2B, output2B); Assert.Equal(targetOutput3A, output3A); Assert.Equal(targetOutput3B, output3B); Assert.Equal(targetOutput4A, output4A); Assert.Equal(targetOutput4B, output4B); Assert.Equal(targetOutput5A, output5A); Assert.Equal(targetOutput5B, output5B); Assert.Equal(targetOutput6A, output6A); Assert.Equal(targetOutput6B, output6B); Assert.Equal(targetOutput7A, output7A); Assert.Equal(targetOutput7B, output7B); Assert.Equal(targetOutput8A, output8A); Assert.Equal(targetOutput8B, output8B); Assert.Equal(targetOutput9A, output9A); Assert.Equal(targetOutput9B, output9B); Assert.Equal(targetOutput10A, output10A); Assert.Equal(targetOutput10B, output10B); Assert.Equal(targetOutput11A, output11A); Assert.Equal(targetOutput11B, output11B); Assert.Equal(targetOutput12A, output12A); Assert.Equal(targetOutput12B, output12B); Assert.Equal(targetOutput13A, output13A); Assert.Equal(targetOutput13B, output13B); }
public void MinificationOfBindingExpressionsInBuiltinAttributeDirectivesIsCorrect() { // Arrange var keepingExpressionsMinifier = new HtmlMinifier( new HtmlMinificationSettings(true) { MinifyAngularBindingExpressions = false }); var minifyingExpressionsMinifier = new HtmlMinifier( new HtmlMinificationSettings(true) { MinifyAngularBindingExpressions = true }); const string input1 = "<span ng-bind-html=\"\t name \t\"></span>"; const string targetOutput1A = input1; const string targetOutput1B = "<span ng-bind-html=\"name\"></span>"; const string input2 = "<span ng:bind-html=\"\t name \t\"></span>"; const string targetOutput2A = input2; const string targetOutput2B = "<span ng:bind-html=\"name\"></span>"; const string input3 = "<span ng_bind_html=\"\t name \t\"></span>"; const string targetOutput3A = input3; const string targetOutput3B = "<span ng_bind_html=\"name\"></span>"; const string input4 = "<span x-ng-bind-html=\"\t name \t\"></span>"; const string targetOutput4A = input4; const string targetOutput4B = "<span x-ng-bind-html=\"name\"></span>"; const string input5 = "<span data-ng-bind-html=\"\t name \t\"></span>"; const string targetOutput5A = input5; const string targetOutput5B = "<span data-ng-bind-html=\"name\"></span>"; const string input6 = "<p ng-class=\"{ strike: deleted, bold: important, red: error }\">" + "Map Syntax Example</p>"; const string targetOutput6A = input6; const string targetOutput6B = "<p ng-class=\"{strike:deleted,bold:important,red:error}\">" + "Map Syntax Example</p>"; const string input7 = "<p ng-class=\"\t style \t\">Using String Syntax</p>"; const string targetOutput7A = input7; const string targetOutput7B = "<p ng-class=\"style\">Using String Syntax</p>"; const string input8 = "<p ng-class=\"\t [ style1, style2, style3 ] \t\">Using Array Syntax</p>"; const string targetOutput8A = input8; const string targetOutput8B = "<p ng-class=\"[style1,style2,style3]\">Using Array Syntax</p>"; const string input9 = "<div ng-controller=\"\t SettingsController1 as settings \t\"></div>"; const string targetOutput9A = input9; const string targetOutput9B = "<div ng-controller=\"SettingsController1 as settings\"></div>"; const string input10 = "<button ng-click=\"showMessageBox('Error', message);\">Show message</button>"; const string targetOutput10A = input10; const string targetOutput10B = "<button ng-click=\"showMessageBox('Error',message)\">Show message</button>"; const string input11 = "<div ng-init=\" names = ['John', 'Mary', 'Cate', 'Suz'] \"></div>"; const string targetOutput11A = input11; const string targetOutput11B = "<div ng-init=\"names=['John','Mary','Cate','Suz']\"></div>"; const string input12 = "<input ng-model=\"\t user.name \t\"" + " ng-model-options=\"{ updateOn: 'default blur', debounce: {'default': 500, 'blur': 0} }\">"; const string targetOutput12A = input12; const string targetOutput12B = "<input ng-model=\"user.name\"" + " ng-model-options=\"{updateOn:'default blur',debounce:{'default':500,'blur':0}}\">"; const string input13 = "<li ng-repeat=\"\t item in items \t\">{{item}}</li>"; const string targetOutput13A = input13; const string targetOutput13B = "<li ng-repeat=\"item in items\">{{item}}</li>"; const string input14 = "<li ng-repeat=\"(name, age) in {'adam': 10, 'amalie': 12}\">{{name}}, {{age}}</li>"; const string targetOutput14A = input14; const string targetOutput14B = "<li ng-repeat=\"(name,age)in{'adam':10,'amalie':12}\">{{name}}, {{age}}</li>"; const string input15 = "<li ng-repeat=\"\t item in items track by $id( item ) \t\">{{item}}</li>"; const string targetOutput15A = input15; const string targetOutput15B = "<li ng-repeat=\"item in items track by $id(item)\">{{item}}</li>"; const string input16 = "<li data-ng-repeat=\"customer in customers | filter:nameText | orderBy:'name'\">\n" + " {{customer.name}} - {{customer.city}}\n" + "</li>" ; const string targetOutput16A = input16; const string targetOutput16B = "<li data-ng-repeat=\"customer in customers|filter:nameText|orderBy:'name'\">\n" + " {{customer.name}} - {{customer.city}}\n" + "</li>" ; const string input17 = "<li ng-repeat=\"\t item in ::items \t\">{{item.name}}</li>"; const string targetOutput17A = input17; const string targetOutput17B = "<li ng-repeat=\"item in ::items\">{{item.name}}</li>"; const string input18 = "<div ng-repeat=\"\t item in itemArray[myIndex] track by item.id \t\"></div>"; const string targetOutput18A = input18; const string targetOutput18B = "<div ng-repeat=\"item in itemArray[myIndex] track by item.id\"></div>"; const string input19 = "<header ng-repeat-start=\"\t item in items \t\">\n" + " Header {{item}}\n" + "</header>\n" + "<div class=\"body\">\n" + " Body {{item}}\n" + "</div>\n" + "<footer ng-repeat-end>\n" + " Footer {{item}}\n" + "</footer>" ; const string targetOutput19A = input19; const string targetOutput19B = "<header ng-repeat-start=\"item in items\">\n" + " Header {{item}}\n" + "</header>\n" + "<div class=\"body\">\n" + " Body {{item}}\n" + "</div>\n" + "<footer ng-repeat-end>\n" + " Footer {{item}}\n" + "</footer>" ; const string input20 = "<span ng-style=\"{ 'background-color': 'blue' }\">Sample Text</span>"; const string targetOutput20A = input20; const string targetOutput20B = "<span ng-style=\"{'background-color':'blue'}\">Sample Text</span>"; const string input21 = "<div ng-switch=\"\t selection \t\">\n" + " <div ng-switch-when=\"settings\">Settings Div</div>\n" + " <div ng-switch-when=\"home\">Home Span</div>\n" + " <div ng-switch-default>default</div>\n" + "</div>" ; const string targetOutput21A = input21; const string targetOutput21B = "<div ng-switch=\"selection\">\n" + " <div ng-switch-when=\"settings\">Settings Div</div>\n" + " <div ng-switch-when=\"home\">Home Span</div>\n" + " <div ng-switch-default>default</div>\n" + "</div>" ; const string input22 = "<label ng-repeat=\"name in names\" for=\"{{name}}\">\n" + " {{name}}\n" + " <input type=\"radio\" id=\"{{name}}\" name=\"favorite\" " + "ng-model=\"my.favorite\" ng-value=\"\t name \t\">\n" + "</label>" ; const string targetOutput22A = input22; const string targetOutput22B = "<label ng-repeat=\"name in names\" for=\"{{name}}\">\n" + " {{name}}\n" + " <input type=\"radio\" id=\"{{name}}\" name=\"favorite\" " + "ng-model=\"my.favorite\" ng-value=\"name\">\n" + "</label>" ; const string input23 = "<input type=\"checkbox\" ng-model=\"confirm\" " + "ng-true-value=\"\t 1 + ':Yes' \t\" ng-false-value=\"\t 0 + ':No' \t\">"; const string targetOutput23A = input23; const string targetOutput23B = "<input type=\"checkbox\" ng-model=\"confirm\" " + "ng-true-value=\"1+':Yes'\" ng-false-value=\"0+':No'\">"; const string input24 = "<input type=\"text\" ng-model=\"login\" name=\"login\" " + "ng-minlength=\"\t LOGIN_MIN_LENGTH \t\" ng-maxlength=\"\t LOGIN_MAX_LENGTH \t\">"; const string targetOutput24A = input24; const string targetOutput24B = "<input type=\"text\" ng-model=\"login\" name=\"login\" " + "ng-minlength=\"LOGIN_MIN_LENGTH\" ng-maxlength=\"LOGIN_MAX_LENGTH\">"; const string input25 = "<select ng-model=\"myColor\" " + "ng-options=\"\t color.name for color in colors \t\"></select>"; const string targetOutput25A = input25; const string targetOutput25B = "<select ng-model=\"myColor\" " + "ng-options=\"color.name for color in colors\"></select>"; const string input26 = "<select ng-model=\"myColor\" " + "ng-options=\"\t color.name group by color.shade for color in colors \t\"></select>"; const string targetOutput26A = input26; const string targetOutput26B = "<select ng-model=\"myColor\" " + "ng-options=\"color.name group by color.shade for color in colors\"></select>"; const string input27 = "<input type=\"text\" ng-model=\"login\" name=\"login\" " + "ng-pattern=\"\t /^[a-z0-9_-]+$/ \t\">"; const string targetOutput27A = input27; const string targetOutput27B = "<input type=\"text\" ng-model=\"login\" name=\"login\" " + "ng-pattern=\"/^[a-z0-9_-]+$/\">"; const string input28 = "<input type=\"text\" ng-model=\"login\" name=\"login\"" + " ng-pattern=\"\t LOGIN_PATTERN \t\">"; const string targetOutput28A = input28; const string targetOutput28B = "<input type=\"text\" ng-model=\"login\" name=\"login\"" + " ng-pattern=\"LOGIN_PATTERN\">"; const string input29 = "<label for=\"password\">Password:</label>\n" + "<input type=\"text\" id=\"password\" ng-model=\"password\">\n" + "<br>\n" + "<label for=\"confirmPassword\">Confirm password:</label>\n" + "<input type=\"text\" id=\"confirmPassword\" ng-model=\"confirmPassword\"" + " ng-required=\"password.trim().length > 0\">" ; const string targetOutput29A = input29; const string targetOutput29B = "<label for=\"password\">Password:</label>\n" + "<input type=\"text\" id=\"password\" ng-model=\"password\">\n" + "<br>\n" + "<label for=\"confirmPassword\">Confirm password:</label>\n" + "<input type=\"text\" id=\"confirmPassword\" ng-model=\"confirmPassword\"" + " ng-required=\"password.trim().length>0\">" ; const string input30 = "<form name=\"myForm\">\n" + " <input type=\"text\" ng-model=\"field\" name=\"myField\" required=\"required\" minlength=\"5\">\n" + " <div ng-messages=\"\t myForm.myField.$error \t\">\n" + " <div ng-message=\"required\">You did not enter a field</div>\n" + " <div ng-message=\"minlength\">The value entered is too short</div>\n" + " </div>\n" + "</form>" ; const string targetOutput30A = input30; const string targetOutput30B = "<form name=\"myForm\">\n" + " <input type=\"text\" ng-model=\"field\" name=\"myField\" required=\"required\" minlength=\"5\">\n" + " <div ng-messages=\"myForm.myField.$error\">\n" + " <div ng-message=\"required\">You did not enter a field</div>\n" + " <div ng-message=\"minlength\">The value entered is too short</div>\n" + " </div>\n" + "</form>" ; const string input31 = "<div ng-show=\"!showActions\" ng-swipe-left=\"showActions = true\">\n" + " Some list content, like an email in the inbox\n" + "</div>" ; const string targetOutput31A = input31; const string targetOutput31B = "<div ng-show=\"!showActions\" ng-swipe-left=\"showActions=true\">\n" + " Some list content, like an email in the inbox\n" + "</div>" ; const string input32 = "<div ng-show=\"showActions\" ng-swipe-right=\"showActions = false\">\n" + " <button ng-click=\"reply()\">Reply</button>\n" + " <button ng-click=\"delete()\">Delete</button>\n" + "</div>" ; const string targetOutput32A = input32; const string targetOutput32B = "<div ng-show=\"showActions\" ng-swipe-right=\"showActions=false\">\n" + " <button ng-click=\"reply()\">Reply</button>\n" + " <button ng-click=\"delete()\">Delete</button>\n" + "</div>" ; // Act string output1A = keepingExpressionsMinifier.Minify(input1).MinifiedContent; string output1B = minifyingExpressionsMinifier.Minify(input1).MinifiedContent; string output2A = keepingExpressionsMinifier.Minify(input2).MinifiedContent; string output2B = minifyingExpressionsMinifier.Minify(input2).MinifiedContent; string output3A = keepingExpressionsMinifier.Minify(input3).MinifiedContent; string output3B = minifyingExpressionsMinifier.Minify(input3).MinifiedContent; string output4A = keepingExpressionsMinifier.Minify(input4).MinifiedContent; string output4B = minifyingExpressionsMinifier.Minify(input4).MinifiedContent; string output5A = keepingExpressionsMinifier.Minify(input5).MinifiedContent; string output5B = minifyingExpressionsMinifier.Minify(input5).MinifiedContent; string output6A = keepingExpressionsMinifier.Minify(input6).MinifiedContent; string output6B = minifyingExpressionsMinifier.Minify(input6).MinifiedContent; string output7A = keepingExpressionsMinifier.Minify(input7).MinifiedContent; string output7B = minifyingExpressionsMinifier.Minify(input7).MinifiedContent; string output8A = keepingExpressionsMinifier.Minify(input8).MinifiedContent; string output8B = minifyingExpressionsMinifier.Minify(input8).MinifiedContent; string output9A = keepingExpressionsMinifier.Minify(input9).MinifiedContent; string output9B = minifyingExpressionsMinifier.Minify(input9).MinifiedContent; string output10A = keepingExpressionsMinifier.Minify(input10).MinifiedContent; string output10B = minifyingExpressionsMinifier.Minify(input10).MinifiedContent; string output11A = keepingExpressionsMinifier.Minify(input11).MinifiedContent; string output11B = minifyingExpressionsMinifier.Minify(input11).MinifiedContent; string output12A = keepingExpressionsMinifier.Minify(input12).MinifiedContent; string output12B = minifyingExpressionsMinifier.Minify(input12).MinifiedContent; string output13A = keepingExpressionsMinifier.Minify(input13).MinifiedContent; string output13B = minifyingExpressionsMinifier.Minify(input13).MinifiedContent; string output14A = keepingExpressionsMinifier.Minify(input14).MinifiedContent; string output14B = minifyingExpressionsMinifier.Minify(input14).MinifiedContent; string output15A = keepingExpressionsMinifier.Minify(input15).MinifiedContent; string output15B = minifyingExpressionsMinifier.Minify(input15).MinifiedContent; string output16A = keepingExpressionsMinifier.Minify(input16).MinifiedContent; string output16B = minifyingExpressionsMinifier.Minify(input16).MinifiedContent; string output17A = keepingExpressionsMinifier.Minify(input17).MinifiedContent; string output17B = minifyingExpressionsMinifier.Minify(input17).MinifiedContent; string output18A = keepingExpressionsMinifier.Minify(input18).MinifiedContent; string output18B = minifyingExpressionsMinifier.Minify(input18).MinifiedContent; string output19A = keepingExpressionsMinifier.Minify(input19).MinifiedContent; string output19B = minifyingExpressionsMinifier.Minify(input19).MinifiedContent; string output20A = keepingExpressionsMinifier.Minify(input20).MinifiedContent; string output20B = minifyingExpressionsMinifier.Minify(input20).MinifiedContent; string output21A = keepingExpressionsMinifier.Minify(input21).MinifiedContent; string output21B = minifyingExpressionsMinifier.Minify(input21).MinifiedContent; string output22A = keepingExpressionsMinifier.Minify(input22).MinifiedContent; string output22B = minifyingExpressionsMinifier.Minify(input22).MinifiedContent; string output23A = keepingExpressionsMinifier.Minify(input23).MinifiedContent; string output23B = minifyingExpressionsMinifier.Minify(input23).MinifiedContent; string output24A = keepingExpressionsMinifier.Minify(input24).MinifiedContent; string output24B = minifyingExpressionsMinifier.Minify(input24).MinifiedContent; string output25A = keepingExpressionsMinifier.Minify(input25).MinifiedContent; string output25B = minifyingExpressionsMinifier.Minify(input25).MinifiedContent; string output26A = keepingExpressionsMinifier.Minify(input26).MinifiedContent; string output26B = minifyingExpressionsMinifier.Minify(input26).MinifiedContent; string output27A = keepingExpressionsMinifier.Minify(input27).MinifiedContent; string output27B = minifyingExpressionsMinifier.Minify(input27).MinifiedContent; string output28A = keepingExpressionsMinifier.Minify(input28).MinifiedContent; string output28B = minifyingExpressionsMinifier.Minify(input28).MinifiedContent; string output29A = keepingExpressionsMinifier.Minify(input29).MinifiedContent; string output29B = minifyingExpressionsMinifier.Minify(input29).MinifiedContent; string output30A = keepingExpressionsMinifier.Minify(input30).MinifiedContent; string output30B = minifyingExpressionsMinifier.Minify(input30).MinifiedContent; string output31A = keepingExpressionsMinifier.Minify(input31).MinifiedContent; string output31B = minifyingExpressionsMinifier.Minify(input31).MinifiedContent; string output32A = keepingExpressionsMinifier.Minify(input32).MinifiedContent; string output32B = minifyingExpressionsMinifier.Minify(input32).MinifiedContent; // Assert Assert.Equal(targetOutput1A, output1A); Assert.Equal(targetOutput1B, output1B); Assert.Equal(targetOutput2A, output2A); Assert.Equal(targetOutput2B, output2B); Assert.Equal(targetOutput3A, output3A); Assert.Equal(targetOutput3B, output3B); Assert.Equal(targetOutput4A, output4A); Assert.Equal(targetOutput4B, output4B); Assert.Equal(targetOutput5A, output5A); Assert.Equal(targetOutput5B, output5B); Assert.Equal(targetOutput6A, output6A); Assert.Equal(targetOutput6B, output6B); Assert.Equal(targetOutput7A, output7A); Assert.Equal(targetOutput7B, output7B); Assert.Equal(targetOutput8A, output8A); Assert.Equal(targetOutput8B, output8B); Assert.Equal(targetOutput9A, output9A); Assert.Equal(targetOutput9B, output9B); Assert.Equal(targetOutput10A, output10A); Assert.Equal(targetOutput10B, output10B); Assert.Equal(targetOutput11A, output11A); Assert.Equal(targetOutput11B, output11B); Assert.Equal(targetOutput12A, output12A); Assert.Equal(targetOutput12B, output12B); Assert.Equal(targetOutput13A, output13A); Assert.Equal(targetOutput13B, output13B); Assert.Equal(targetOutput14A, output14A); Assert.Equal(targetOutput14B, output14B); Assert.Equal(targetOutput15A, output15A); Assert.Equal(targetOutput15B, output15B); Assert.Equal(targetOutput16A, output16A); Assert.Equal(targetOutput16B, output16B); Assert.Equal(targetOutput17A, output17A); Assert.Equal(targetOutput17B, output17B); Assert.Equal(targetOutput18A, output18A); Assert.Equal(targetOutput18B, output18B); Assert.Equal(targetOutput19A, output19A); Assert.Equal(targetOutput19B, output19B); Assert.Equal(targetOutput20A, output20A); Assert.Equal(targetOutput20B, output20B); Assert.Equal(targetOutput21A, output21A); Assert.Equal(targetOutput21B, output21B); Assert.Equal(targetOutput22A, output22A); Assert.Equal(targetOutput22B, output22B); Assert.Equal(targetOutput23A, output23A); Assert.Equal(targetOutput23B, output23B); Assert.Equal(targetOutput24A, output24A); Assert.Equal(targetOutput24B, output24B); Assert.Equal(targetOutput25A, output25A); Assert.Equal(targetOutput25B, output25B); Assert.Equal(targetOutput26A, output26A); Assert.Equal(targetOutput26B, output26B); Assert.Equal(targetOutput27A, output27A); Assert.Equal(targetOutput27B, output27B); Assert.Equal(targetOutput28A, output28A); Assert.Equal(targetOutput28B, output28B); Assert.Equal(targetOutput29A, output29A); Assert.Equal(targetOutput29B, output29B); Assert.Equal(targetOutput30A, output30A); Assert.Equal(targetOutput30B, output30B); Assert.Equal(targetOutput31A, output31A); Assert.Equal(targetOutput31B, output31B); Assert.Equal(targetOutput32A, output32A); Assert.Equal(targetOutput32B, output32B); }
public void ProcessingInvalidCharactersInStartTagIsCorrect() { // Arrange var minifier = new HtmlMinifier(new HtmlMinificationSettings(true)); const string input1 = "<img src=\"/images/39.gif\" width=80\" height=\"60\">"; const string input2 = "<span class=\"b-form-input_size_l i-bem\"\">Some text...</span>"; const string input3 = "<meta name=\"Description\" content=\"Информационно-аналитический портал про " + "недвижимость и квартиры в Москве и РФ \"Хата.ру\" – Аналитика и цены на недвижимость онлайн, " + "прогнозы, исследования, обзоры и статьи.\">" ; const string input4 = "<img src=\"http://files.example.com/img/88900173ct.jpg\" width=\"100\" " + "title=\"Программирование на COBOL, 14-е издание, I том (файл PDF) \" / " + "alt=\"Программирование на COBOL, 14-е издание, I том (файл PDF)\" />" ; const string input5 = "<A HREF='/cgi-bin/user.cgi?user=O'Connor'>O'Connor</A>"; const string input6 = "<noscript>\r" + " <div>\r" + " <img src=\"//mk.tyndex.ru/watch/6740060\" style=\"position:absolute; left:-9999px;\" alt=\"\"\" />\r" + " </div>\r" + "</noscript>" ; const string input7 = "<table class='grayblock' style='width:100%'>\r\n" + " <tbody>\r\n" + " <tr valign='middle'>\r\n" + " <td><a href='/r7165'><img width='55' border='0' height='55' " + "title=Материалы к годовому Общему собранию акционеров ОАО Рога и копыта' " + "alt='Материалы к годовому Общему собранию акционеров ОАО Рога и копыта'" + "src='/img/728/left-1.jpg' /></a></td>\r\n" + " <td><a href='/r7165'>Материалы к годовому Общему собранию акционеров ОАО Рога и копыта</a></td>\r\n" + " </tr>\r\n" + " </tbody>\r\n" + "</table>" ; const string input8 = "<li>\n" + " <a data-bind=\"href:'@Url.Action(\"GetInvoices\", \"ListUsers\")'+'/?eMail='+ Login\">Invoices</a>\n" + "</li>" ; const string input9 = "<header\"></header>"; const string input10 = "<table>\n" + " <tr>\n" + " <td></td>\n" + " </tr>\n" + "</table." ; const string input11 = "<link id=\"favicon\" rel=?\"shortcut icon\" type=?\"image/?png\" href=?\"#\">"; // Act IList<MinificationErrorInfo> errors1 = minifier.Minify(input1).Errors; IList<MinificationErrorInfo> errors2 = minifier.Minify(input2).Errors; IList<MinificationErrorInfo> errors3 = minifier.Minify(input3).Errors; IList<MinificationErrorInfo> errors4 = minifier.Minify(input4).Errors; IList<MinificationErrorInfo> errors5 = minifier.Minify(input5).Errors; IList<MinificationErrorInfo> errors6 = minifier.Minify(input6).Errors; IList<MinificationErrorInfo> errors7 = minifier.Minify(input7).Errors; IList<MinificationErrorInfo> errors8 = minifier.Minify(input8).Errors; IList<MinificationErrorInfo> errors9 = minifier.Minify(input9).Errors; IList<MinificationErrorInfo> errors10 = minifier.Minify(input10).Errors; IList<MinificationErrorInfo> errors11 = minifier.Minify(input11).Errors; // Assert Assert.Equal(1, errors1.Count); Assert.Equal(1, errors1[0].LineNumber); Assert.Equal(35, errors1[0].ColumnNumber); Assert.Equal(1, errors2.Count); Assert.Equal(1, errors2[0].LineNumber); Assert.Equal(40, errors2[0].ColumnNumber); Assert.Equal(1, errors3.Count); Assert.Equal(1, errors3[0].LineNumber); Assert.Equal(205, errors3[0].ColumnNumber); Assert.Equal(1, errors4.Count); Assert.Equal(1, errors4[0].LineNumber); Assert.Equal(135, errors4[0].ColumnNumber); Assert.Equal(1, errors5.Count); Assert.Equal(1, errors5[0].LineNumber); Assert.Equal(41, errors5[0].ColumnNumber); Assert.Equal(1, errors6.Count); Assert.Equal(3, errors6[0].LineNumber); Assert.Equal(90, errors6[0].ColumnNumber); Assert.Equal(1, errors7.Count); Assert.Equal(4, errors7[0].LineNumber); Assert.Equal(135, errors7[0].ColumnNumber); Assert.Equal(1, errors8.Count); Assert.Equal(2, errors8[0].LineNumber); Assert.Equal(80, errors8[0].ColumnNumber); Assert.Equal(1, errors9.Count); Assert.Equal(1, errors9[0].LineNumber); Assert.Equal(8, errors9[0].ColumnNumber); Assert.Equal(1, errors10.Count); Assert.Equal(5, errors10[0].LineNumber); Assert.Equal(1, errors10[0].ColumnNumber); Assert.Equal(1, errors11.Count); Assert.Equal(1, errors11[0].LineNumber); Assert.Equal(68, errors11[0].ColumnNumber); }
private static MinificationResult MinifyHtml(Bundle bundle) { string file = bundle.GetAbsoluteOutputFile(); string content = File.ReadAllText(file); var settings = HtmlOptions.GetSettings(bundle); string minFile = GetMinFileName(file); var minifier = new HtmlMinifier(settings); var minResult = new MinificationResult(file, null, null); try { MarkupMinificationResult result = minifier.Minify(content, generateStatistics: true); minResult.MinifiedContent = result.MinifiedContent; if (!result.Errors.Any()) { OnBeforeWritingMinFile(file, minFile, bundle); File.WriteAllText(minFile, result.MinifiedContent, new UTF8Encoding(true)); OnAfterWritingMinFile(file, minFile, bundle); GzipFile(minFile, bundle); } else { foreach (var error in result.Errors) { minResult.Errors.Add(new MinificationError { FileName = file, Message = error.Message, LineNumber = error.LineNumber, ColumnNumber = error.ColumnNumber }); } } } catch (Exception ex) { minResult.Errors.Add(new MinificationError { FileName = file, Message = ex.Message, LineNumber = 0, ColumnNumber = 0 }); } return minResult; }
//private IList<Reservation> GetFilteredReservations(GetReservationsParamVM options) //{ // IList<Reservation> reservations = new List<Reservation>(); // var clientDate = DateTime.UtcNow.ToClientTime().Date; // using (var dbContext = new UsersContext()) // { // reservations = dbContext.GetReservationByDate(options.Date) // .Where(r => (r.FloorTableId > 0) ? (!r.FloorTable.IsDeleted) : (!r.MergedFloorTable.OrigionalTables.Any(t => t.FloorTable.IsDeleted))).ToList(); // if (options.FloorPlanId.HasValue) // { // reservations = reservations.Where(r => r.FloorPlanId == options.FloorPlanId.Value).ToList(); // } // if (options.ShiftId.HasValue) // { // reservations = reservations.Where(r => r.FoodMenuShiftId == options.ShiftId.Value).ToList(); // } // DateTime? startTime = null; // string filter = string.Empty; // if (!string.IsNullOrEmpty(options.Filter) && !string.IsNullOrEmpty(options.Time)) // { // filter = options.Filter.Trim().ToUpper(); // switch (filter) // { // case "ALL": // { // break; // } // case "SEATED": // { // options.IncludeStatusIds.Add(ReservationStatus.Seated); // options.ExcludeStatusIds.AddRange( // new List<long> // { // ReservationStatus.Cancelled, // ReservationStatus.Finished // }); // options.Time = options.Time.Trim(); // startTime = clientDate.Add(Convert.ToDateTime(options.Time).TimeOfDay); // break; // } // case "UPCOMING": // { // options.ExcludeStatusIds.AddRange( // new List<long> // { // ReservationStatus.Seated, // ReservationStatus.Cancelled, // ReservationStatus.Finished // }); // options.Time = options.Time.Trim(); // startTime = clientDate.Add(Convert.ToDateTime(options.Time).TimeOfDay).AddMinutes(15); // break; // } // default: // break; // } // } // //var reservations = resList.ToList(); // if (options.IncludeStatusIds.Count > 0 && startTime.HasValue) // { // reservations = reservations.Where(r => options.IncludeStatusIds.Contains(r.StatusId.Value) || ((filter == "SEATED") ? (r.TimeForm <= startTime) : (r.TimeForm >= startTime))).ToList(); // } // else if (options.IncludeStatusIds.Count > 0) // { // reservations = reservations.Where(r => options.IncludeStatusIds.Contains(r.StatusId.Value)).ToList(); // } // else if (startTime.HasValue) // { // reservations = reservations.Where(r => ((filter == "SEATED") ? (r.TimeForm <= startTime) : (r.TimeForm >= startTime))).ToList(); // } // if (options.ExcludeStatusIds.Count > 0) // { // reservations = reservations.Where(r => !options.ExcludeStatusIds.Contains(r.StatusId.Value)).ToList(); // } // } // return reservations.OrderBy(r => r.TimeForm).ToList(); //} //private IList<ReservationListItemVM> GetFilteredReservations20150608(GetReservationsParamVM options) //{ // IList<Reservation> reservations = new List<Reservation>(); // var clientDate = DateTime.UtcNow.ToClientTime().Date; // using (var dbContext = new UsersContext()) // { // reservations = dbContext.GetReservationByDate(options.Date) // .Where(r => (r.FloorTableId > 0) ? (!r.FloorTable.IsDeleted) : (!r.MergedFloorTable.OrigionalTables.Any(t => t.FloorTable.IsDeleted))).ToList(); // if (options.FloorPlanId.HasValue) // { // reservations = reservations.Where(r => r.FloorPlanId == options.FloorPlanId.Value).ToList(); // } // if (options.ShiftId.HasValue) // { // reservations = reservations.Where(r => r.FoodMenuShiftId == options.ShiftId.Value).ToList(); // } // DateTime? startTime = null; // string filter = string.Empty; // if (!string.IsNullOrEmpty(options.Filter) && !string.IsNullOrEmpty(options.Time)) // { // filter = options.Filter.Trim().ToUpper(); // switch (filter) // { // case "ALL": // { // break; // } // case "SEATED": // { // options.IncludeStatusIds.Add(ReservationStatus.Seated); // options.ExcludeStatusIds.AddRange( // new List<long> // { // ReservationStatus.Cancelled, // ReservationStatus.Finished // }); // options.Time = options.Time.Trim(); // startTime = clientDate.Add(Convert.ToDateTime(options.Time).TimeOfDay); // break; // } // case "UPCOMING": // { // options.ExcludeStatusIds.AddRange( // new List<long> // { // ReservationStatus.Seated, // ReservationStatus.Cancelled, // ReservationStatus.Finished // }); // options.Time = options.Time.Trim(); // startTime = clientDate.Add(Convert.ToDateTime(options.Time).TimeOfDay).AddMinutes(15); // break; // } // default: // break; // } // } // //var reservations = resList.ToList(); // if (options.IncludeStatusIds.Count > 0 && startTime.HasValue) // { // reservations = reservations.Where(r => options.IncludeStatusIds.Contains(r.StatusId.Value) || ((filter == "SEATED") ? (r.TimeForm <= startTime) : (r.TimeForm >= startTime))).ToList(); // } // else if (options.IncludeStatusIds.Count > 0) // { // reservations = reservations.Where(r => options.IncludeStatusIds.Contains(r.StatusId.Value)).ToList(); // } // else if (startTime.HasValue) // { // reservations = reservations.Where(r => ((filter == "SEATED") ? (r.TimeForm <= startTime) : (r.TimeForm >= startTime))).ToList(); // } // if (options.ExcludeStatusIds.Count > 0) // { // reservations = reservations.Where(r => !options.ExcludeStatusIds.Contains(r.StatusId.Value)).ToList(); // } // } // return reservations.OrderBy(r => r.TimeForm).Select(r => new ReservationListItemVM // { // Reservation = r, // HTMLString = this.RenderPartialViewToString("~/Views/FloorPlan/ReservationListItemPartial.cshtml", r) // }).ToList(); //} private IList<ReservationListItemVM> GetFilteredReservations20150617(GetReservationsParamVM options) { IList<Reservation> reservations = new List<Reservation>(); //var clientDate = DateTime.UtcNow.ToClientTime().Date; var clientDate = DateTime.UtcNow.ToDefaultTimeZone(User.Identity.GetDatabaseName()).Date; using (var dbContext = new UsersContext()) { reservations = dbContext.GetReservationByDate(options.Date) .Where(r => (r.FloorTableId > 0) ? (!r.FloorTable.IsDeleted) : (!r.MergedFloorTable.OrigionalTables.Any(t => t.FloorTable.IsDeleted))).ToList(); if (options.FloorPlanId.HasValue) { reservations = reservations.Where(r => r.FloorPlanId == options.FloorPlanId.Value).ToList(); } if (options.ShiftId.HasValue) { reservations = reservations.Where(r => r.FoodMenuShiftId == options.ShiftId.Value).ToList(); } DateTime? startTime = null; string filter = string.Empty; if (!string.IsNullOrEmpty(options.Filter) && !string.IsNullOrEmpty(options.Time)) { filter = options.Filter.Trim().ToUpper(); if (!string.IsNullOrWhiteSpace(options.Time)) { options.Time = options.Time.Trim(); clientDate = clientDate.Add(Convert.ToDateTime(options.Time).TimeOfDay); } switch (filter) { case "ALL": { break; } case "SEATED": { options.IncludeStatusIds.AddRange(new List<long>{ ReservationStatus.Partially_Arrived, ReservationStatus.All_Arrived, ReservationStatus.Partially_Seated, ReservationStatus.Seated, ReservationStatus.Appetizer, ReservationStatus.Entree, ReservationStatus.Dessert, ReservationStatus.Table_Cleared, ReservationStatus.Check_Dropped, ReservationStatus.Check_Paid }); options.ExcludeStatusIds.AddRange(new List<long> { ReservationStatus.Finished, ReservationStatus.Cancelled, ReservationStatus.No_show }); //options.Time = options.Time.Trim(); startTime = clientDate; break; } case "UPCOMING": { options.ExcludeStatusIds.AddRange(new List<long> { ReservationStatus.Partially_Arrived, ReservationStatus.All_Arrived, ReservationStatus.Partially_Seated, ReservationStatus.Seated, ReservationStatus.Appetizer, ReservationStatus.Entree, ReservationStatus.Dessert, ReservationStatus.Table_Cleared, ReservationStatus.Check_Dropped, ReservationStatus.Check_Paid, ReservationStatus.Seated, ReservationStatus.Cancelled, ReservationStatus.Finished, ReservationStatus.No_show }); //options.Time = options.Time.Trim(); startTime = clientDate.AddMinutes(15); break; } default: break; } } //var reservations = resList.ToList(); if (options.IncludeStatusIds.Count > 0 && startTime.HasValue) { //reservations = reservations.Where(r => options.IncludeStatusIds.Contains(r.StatusId.Value) || ((filter == "SEATED") ? (r.TimeForm <= startTime) : (r.TimeForm >= startTime))).ToList(); reservations = reservations.Where(r => options.IncludeStatusIds.Contains(r.StatusId.Value) || ((filter == "SEATED") ? (r.TimeForm <= startTime && startTime <= r.TimeForm.AddMinutes(r.Duration.GetMinutesFromDuration())) : (r.TimeForm >= startTime))).ToList(); } else if (options.IncludeStatusIds.Count > 0) { reservations = reservations.Where(r => options.IncludeStatusIds.Contains(r.StatusId.Value)).ToList(); } else if (startTime.HasValue) { reservations = reservations.Where(r => ((filter == "SEATED") ? (r.TimeForm <= startTime) : (r.TimeForm >= startTime))).ToList(); } if (options.ExcludeStatusIds.Count > 0) { reservations = reservations.Where(r => !options.ExcludeStatusIds.Contains(r.StatusId.Value)).ToList(); } } reservations = reservations.OrderBy(r => r.TimeForm).ToList(); //if (options.Filter == "ALL") //{ // var currentTime = !string.IsNullOrWhiteSpace(options.Time) ? options.Date.Add(Convert.ToDateTime(options.Time).TimeOfDay) : clientDate; // var sortedList = new List<Reservation>(); // sortedList.AddRange(reservations.SkipWhile(r => r.TimeForm < currentTime)); // sortedList.AddRange(reservations.TakeWhile(r => r.TimeForm < currentTime)); // return sortedList.Select(r => new ReservationListItemVM // { // Reservation = r, // HTMLString = cache.Get<string>(string.Format(CacheKeys.RESERVATION_RIGHT_LIST_ITEM, r.ReservationId), () => // { // return this.RenderPartialViewToString("~/Views/FloorPlan/ReservationListItemPartial.cshtml", r); // }) // }).ToList(); //} //else //{ var htmlMinifier = new HtmlMinifier(); return reservations.Select(r => new ReservationListItemVM { Reservation = r, HTMLString = cache.Get<string>(string.Format(CacheKeys.RESERVATION_RIGHT_LIST_ITEM,db.Database.Connection.Database, r.ReservationId), () => { ModelState.Clear(); return htmlMinifier.Minify(this.RenderPartialViewToString("~/Views/FloorPlan/ReservationListItemPartial.cshtml", r), generateStatistics: false).MinifiedContent; //return this.RenderPartialViewToString("~/Views/FloorPlan/ReservationListItemPartial.cshtml", r); }) }).ToList(); //} }
public void ProcessingInvalidHtmlCommentsIsCorrect() { // Arrange var minifier = new HtmlMinifier(new HtmlMinificationSettings(true)); const string input1 = "<!-->"; // Act IList<MinificationErrorInfo> errors1 = minifier.Minify(input1).Errors; // Assert Assert.Equal(1, errors1.Count); Assert.Equal(1, errors1[0].LineNumber); Assert.Equal(1, errors1[0].ColumnNumber); }