private static string XHtmlMinifierBytes(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]; XhtmlMinifier htmlMinifier = new XhtmlMinifier(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 void ProcessingCustomBooleanAttributesIsCorrect() { // Arrange var minifier = new XhtmlMinifier(new XhtmlMinificationSettings(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 targetOutput1 = "<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 targetOutput2 = "<div ng-include=\"\" src=\"views/sidepanel.html\"></div>"; const string input3 = "<div ng:include src=\"views/sidepanel.html\"></div>"; const string targetOutput3 = "<div ng:include=\"\" src=\"views/sidepanel.html\"></div>"; const string input4 = "<div ng_include src=\"views/sidepanel.html\"></div>"; const string targetOutput4 = "<div ng_include=\"\" src=\"views/sidepanel.html\"></div>"; const string input5 = "<div x-ng-include src=\"views/sidepanel.html\"></div>"; const string targetOutput5 = "<div x-ng-include=\"\" src=\"views/sidepanel.html\"></div>"; const string input6 = "<div data-ng-include src=\"views/sidepanel.html\"></div>"; const string targetOutput6 = "<div data-ng-include=\"\" src=\"views/sidepanel.html\"></div>"; const string input7 = "<div ng-include=\"\" src=\"views/sidepanel.html\"></div>"; const string targetOutput7 = input7; // 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; // 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); }
public void ProcessingCustomBooleanAttributesIsCorrect() { // Arrange var minifier = new XhtmlMinifier(new XhtmlMinificationSettings(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 targetOutput1 = "<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 targetOutput2 = "<div ng-include=\"\" src=\"views/sidepanel.html\"></div>"; const string input3 = "<div ng:include src=\"views/sidepanel.html\"></div>"; const string targetOutput3 = "<div ng:include=\"\" src=\"views/sidepanel.html\"></div>"; const string input4 = "<div ng_include src=\"views/sidepanel.html\"></div>"; const string targetOutput4 = "<div ng_include=\"\" src=\"views/sidepanel.html\"></div>"; const string input5 = "<div x-ng-include src=\"views/sidepanel.html\"></div>"; const string targetOutput5 = "<div x-ng-include=\"\" src=\"views/sidepanel.html\"></div>"; const string input6 = "<div data-ng-include src=\"views/sidepanel.html\"></div>"; const string targetOutput6 = "<div data-ng-include=\"\" src=\"views/sidepanel.html\"></div>"; const string input7 = "<div ng-include=\"\" src=\"views/sidepanel.html\"></div>"; const string targetOutput7 = input7; // 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; // 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); }
/// <summary> /// Creates a instance of XHTML minifier /// </summary> /// <returns>Instance of XHTML minifier</returns> public override IMarkupMinifier CreateMinifier() { XhtmlMinificationSettings settings = MinificationSettings; ICssMinifier cssMinifier = CssMinifierFactory.CreateMinifier(); IJsMinifier jsMinifier = JsMinifierFactory.CreateMinifier(); var minifier = new XhtmlMinifier(settings, cssMinifier, jsMinifier, _logger); return(minifier); }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); // ×¢Òâ ÇëÏÈÇåÒ»ÏÂä¯ÀÀÆ÷»º´æ //¿ª·¢Ä£Ê½ //HtmlStaticFileAttribute.IsDevelopmentMode = true; //ÉèÖûº´æÎļþ¼Ð HtmlStaticFileAttribute.OutputFolder = @"D:\html"; //ʹÓÃѹËõ HtmlStaticFileAttribute.UseBrCompress = true; HtmlStaticFileAttribute.UseGzipCompress = true; //ÉèÖÃÒ³Ã滺´æʱ¼ä 3·ÖÖÓ HtmlStaticFileAttribute.ExpireMinutes = 3; // ¿ªÆôhtmlѹËõ HtmlStaticFileAttribute.MiniFunc += (string html) => { var js = new NUglifyJsMinifier(); var css = new NUglifyCssMinifier(); XhtmlMinifier htmlMinifier = new XhtmlMinifier(null, css, js, null); var result = htmlMinifier.Minify(html); if (result.Errors.Count == 0) { return(result.MinifiedContent); } return(html); }; app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); }
public XhtmlMinificationViewModel Minify(XhtmlMinificationViewModel model) { string cssMinifierName = model.Settings.CssMinifierName; string jsMinifierName = model.Settings.JsMinifierName; var settings = Mapper.Map <XhtmlMinificationSettings>(model.Settings); ICssMinifier cssMinifier = _cssMinifierFactory.CreateMinifier(cssMinifierName); IJsMinifier jsMinifier = _jsMinifierFactory.CreateMinifier(jsMinifierName); var xhtmlMinifier = new XhtmlMinifier(settings, cssMinifier, jsMinifier); var result = xhtmlMinifier.Minify(model.SourceCode, true); model.Result = Mapper.Map <MarkupMinificationResultViewModel>(result); return(model); }
public static string MinifyString(string extension, string content) { if (extension == ".css") { Minifier minifier = new Minifier(); CssSettings settings = new CssSettings(); settings.CommentMode = CssComment.None; if (WESettings.GetBoolean(WESettings.Keys.KeepImportantComments)) { settings.CommentMode = CssComment.Important; } return(minifier.MinifyStyleSheet(content, settings)); } else if (extension == ".js") { Minifier minifier = new Minifier(); CodeSettings settings = new CodeSettings() { EvalTreatment = EvalTreatment.MakeImmediateSafe, PreserveImportantComments = WESettings.GetBoolean(WESettings.Keys.KeepImportantComments) }; return(minifier.MinifyJavaScript(content, settings)); } else if (_htmlExt.Contains(extension.ToLowerInvariant())) { var minifyer = new XhtmlMinifier(); MarkupMinificationResult result = minifyer.Minify(content, generateStatistics: true); if (result.Errors.Count == 0) { EditorExtensionsPackage.DTE.StatusBar.Text = "Web Essentials: HTML minified by " + result.Statistics.SavedInPercent + "%"; return(result.MinifiedContent); } else { EditorExtensionsPackage.DTE.StatusBar.Text = "Web Essentials: Cannot minify the current selection"; return(content); } } return(null); }
public void ShorteningDoctypeIsCorrect() { // Arrange var minifier = new XhtmlMinifier(new XhtmlMinificationSettings(true) { UseShortDoctype = true }); const string input = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\r\n" + " \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">"; const string targetOutput = "<!DOCTYPE html>"; // Act string output = minifier.Minify(input).MinifiedContent; // Assert Assert.Equal(targetOutput, output); }
public void ProcessingCustomBooleanAttributesIsCorrect() { // Arrange var minifier = new XhtmlMinifier(new XhtmlMinificationSettings(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>" ; const string targetOutput = "<!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 output = minifier.Minify(input).MinifiedContent; // Assert Assert.Equal(targetOutput, output); }
public void ProcessingCustomBooleanAttributesIsCorrect() { // Arrange var minifier = new XhtmlMinifier(new XhtmlMinificationSettings(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>" ; const string targetOutput = "<!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 output = minifier.Minify(input).MinifiedContent; // Assert Assert.Equal(targetOutput, output); }
public void ProcessingCustomBooleanAttributesIsCorrect() { // Arrange var minifier = new XhtmlMinifier(new XhtmlMinificationSettings(true)); const string input1 = "<div custom-attribute></div>"; const string targetOutput1 = "<div custom-attribute=\"\"></div>"; const string input2 = "<div class></div>"; const string targetOutput2 = "<div class=\"\"></div>"; // Act string output1 = minifier.Minify(input1).MinifiedContent; string output2 = minifier.Minify(input2).MinifiedContent; // Assert Assert.Equal(targetOutput1, output1); Assert.Equal(targetOutput2, output2); }
public void ProcessingInvalidCharactersInXmlDeclarationIsCorrect() { // Arrange var minifier = new XhtmlMinifier(new XhtmlMinificationSettings(true)); const string input1 = "\n\n\t<?xml version=\"1.0\" encoding=\"windows-1251 standalone=\"no\"?>\n"; const string input2 = "\r\n <?xml version=\"1.1\" ;$%? encoding=\"windows-1251\" ?>\r\n"; // Act IList <MinificationErrorInfo> errors1 = minifier.Minify(input1).Errors; IList <MinificationErrorInfo> errors2 = minifier.Minify(input2).Errors; // Assert Assert.Equal(1, errors1.Count); Assert.Equal(3, errors1[0].LineNumber); Assert.Equal(57, errors1[0].ColumnNumber); Assert.Equal(1, errors2.Count); Assert.Equal(2, errors2[0].LineNumber); Assert.Equal(23, errors2[0].ColumnNumber); }
public static string MinifyString(string extension, string content) { if (extension == ".css") { Minifier minifier = new Minifier(); CssSettings settings = new CssSettings(); settings.CommentMode = CssComment.None; if (WESettings.GetBoolean(WESettings.Keys.KeepImportantComments)) { settings.CommentMode = CssComment.Important; } return minifier.MinifyStyleSheet(content, settings); } else if (extension == ".js") { Minifier minifier = new Minifier(); CodeSettings settings = new CodeSettings() { EvalTreatment = EvalTreatment.MakeImmediateSafe, PreserveImportantComments = WESettings.GetBoolean(WESettings.Keys.KeepImportantComments) }; return minifier.MinifyJavaScript(content, settings); } else if (_htmlExt.Contains(extension.ToLowerInvariant())){ var minifyer = new XhtmlMinifier(); MarkupMinificationResult result = minifyer.Minify(content, generateStatistics: true); if (result.Errors.Count == 0) { EditorExtensionsPackage.DTE.StatusBar.Text = "Web Essentials: HTML minified by " + result.Statistics.SavedInPercent + "%"; return result.MinifiedContent; } else { EditorExtensionsPackage.DTE.StatusBar.Text = "Web Essentials: Cannot minify the current selection"; return content; } } return null; }
public void ProcessingXmlNodesIsCorrect() { // Arrange var minifier = new XhtmlMinifier(new XhtmlMinificationSettings(true)); const string input1 = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" + "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n" + " \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n" + "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" " + "xmlns:bi=\"urn:schemas-microsoft-com:mscom:bi\">\n" + " <head>\n" + " <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n"+ " <title>Some title...</title>\n"+ " </head>\n" + " <body>\n" + " <div id=\"content\">\n"+ " <p>Some text...</p>\n"+ " </div>\n"+ " </body>\n" + "</html>" ; const string targetOutput1 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" " + "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n" + "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" " + "xmlns:bi=\"urn:schemas-microsoft-com:mscom:bi\">\n" + " <head>\n"+ " <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n"+ " <title>Some title...</title>\n"+ " </head>\n"+ " <body>\n"+ " <div id=\"content\">\n"+ " <p>Some text...</p>\n"+ " </div>\n"+ " </body>\n"+ "</html>" ; const string input2 = "<svg version=\"1.1\" baseProfile=\"full\" " + "xmlns=\"http://www.w3.org/2000/svg\" " + "xmlns:xlink=\"http://www.w3.org/1999/xlink\" " + "xmlns:ev=\"http://www.w3.org/2001/xml-events\" " + "width=\"100%\" height=\"100%\">\n" + " <rect fill=\"white\" x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" />\n" + " <rect fill=\"silver\" x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" rx=\"1em\" />\n" + "</svg>" ; const string input3 = "<math xmlns=\"http://www.w3.org/1998/Math/MathML\">\n" + " <infinity />\n" + "</math>" ; // Act MarkupMinificationResult result1 = minifier.Minify(input1); string output1 = result1.MinifiedContent; IList <MinificationErrorInfo> warnings1 = result1.Warnings; MarkupMinificationResult result2 = minifier.Minify(input2); string output2 = result2.MinifiedContent; IList <MinificationErrorInfo> warnings2 = result2.Warnings; MarkupMinificationResult result3 = minifier.Minify(input3); string output3 = result3.MinifiedContent; IList <MinificationErrorInfo> warnings3 = result3.Warnings; // Assert Assert.Equal(targetOutput1, output1); Assert.Equal(0, warnings1.Count); Assert.Equal(input2, output2); Assert.Equal(0, warnings2.Count); Assert.Equal(input3, output3); Assert.Equal(0, warnings3.Count); }
public void ProcessingXmlNodesIsCorrect() { // Arrange var minifier = new XhtmlMinifier(new XhtmlMinificationSettings(true)); const string input1 = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" + "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n" + " \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n" + "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" " + "xmlns:bi=\"urn:schemas-microsoft-com:mscom:bi\">\n" + " <head>\n" + " <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n" + " <title>Some title...</title>\n" + " </head>\n" + " <body>\n" + " <div id=\"content\">\n" + " <p>Some text...</p>\n" + " </div>\n" + " </body>\n" + "</html>" ; const string targetOutput1 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" " + "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n" + "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" " + "xmlns:bi=\"urn:schemas-microsoft-com:mscom:bi\">\n" + " <head>\n" + " <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n" + " <title>Some title...</title>\n" + " </head>\n" + " <body>\n" + " <div id=\"content\">\n" + " <p>Some text...</p>\n" + " </div>\n" + " </body>\n" + "</html>" ; const string input2 = "<svg version=\"1.1\" baseProfile=\"full\" " + "xmlns=\"http://www.w3.org/2000/svg\" " + "xmlns:xlink=\"http://www.w3.org/1999/xlink\" " + "xmlns:ev=\"http://www.w3.org/2001/xml-events\" " + "width=\"100%\" height=\"100%\">\n" + " <rect fill=\"white\" x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" />\n" + " <rect fill=\"silver\" x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" rx=\"1em\" />\n" + "</svg>" ; const string input3 = "<math xmlns=\"http://www.w3.org/1998/Math/MathML\">\n" + " <infinity />\n" + "</math>" ; // Act MarkupMinificationResult result1 = minifier.Minify(input1); string output1 = result1.MinifiedContent; IList<MinificationErrorInfo> warnings1 = result1.Warnings; MarkupMinificationResult result2 = minifier.Minify(input2); string output2 = result2.MinifiedContent; IList<MinificationErrorInfo> warnings2 = result2.Warnings; MarkupMinificationResult result3 = minifier.Minify(input3); string output3 = result3.MinifiedContent; IList<MinificationErrorInfo> warnings3 = result3.Warnings; // Assert Assert.Equal(targetOutput1, output1); Assert.Equal(0, warnings1.Count); Assert.Equal(input2, output2); Assert.Equal(0, warnings2.Count); Assert.Equal(input3, output3); Assert.Equal(0, warnings3.Count); }
/// <inheritdoc /> public IEnumerable <IDocument> Execute(IReadOnlyList <IDocument> inputs, IExecutionContext context) { XhtmlMinifier minifier = new XhtmlMinifier(_minificationSettings); return(Minify(inputs, context, minifier.Minify, "XHTML")); }
/// <inheritdoc /> public async Task <IEnumerable <IDocument> > ExecuteAsync(IExecutionContext context) { XhtmlMinifier minifier = new XhtmlMinifier(_minificationSettings); return(await MinifyAsync(context, minifier.Minify, "XHTML")); }
public void ProcessingDoctypeIsCorrect() { // Arrange var minifier = new XhtmlMinifier(new XhtmlMinificationSettings(true)); const string input1 = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n" + " \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">"; const string targetOutput1 = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"" + " \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">"; const string input2 = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"" + " \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">"; const string targetOutput2 = input2; const string input3 = "<!DOCTYPE\n" + " html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\"\n" + " \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">" ; const string targetOutput3 = "<!DOCTYPE" + " html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\"" + " \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">" ; const string input4 = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\r\n" + " \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">"; const string targetOutput4 = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"" + " \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">"; const string input5 = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \n" + " \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">"; const string targetOutput5 = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\"" + " \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">"; const string input6 = "<!DOCTYPE html>"; const string targetOutput6 = input6; const string input7 = "<!DOCTYPE\r\nhtml>"; const string targetOutput7 = "<!DOCTYPE html>"; const string input8 = "<!DOCTYPE\thtml>"; const string targetOutput8 = "<!DOCTYPE html>"; // 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; // 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); }