示例#1
0
        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);
        }
示例#3
0
 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);
     }
 }
示例#4
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);
        }
示例#5
0
        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);
        }
示例#6
0
        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);
        }
示例#9
0
        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);
        }
示例#11
0
        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);
            }
        }
示例#12
0
        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;
            }
        }
示例#16
0
        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);
        }
示例#17
0
 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);
        }
示例#22
0
        /// <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);
        }
示例#23
0
        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);
        }
示例#25
0
        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);
        }
示例#26
0
        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;
		}
示例#28
0
        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);
        }
示例#30
0
        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);
        }
示例#31
0
        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);
        }
示例#32
0
        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);
        }
示例#33
0
        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);
        }
示例#34
0
        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);
        }
示例#35
0
        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);
        }
示例#36
0
        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);
        }
示例#37
0
        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);
        }
示例#38
0
        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);
        }
示例#39
0
        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);
        }
示例#40
0
        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);
        }
示例#41
0
        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);
        }
示例#42
0
        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);
        }
示例#43
0
        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);
        }
示例#44
0
        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);
        }
示例#45
0
        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);
        }
示例#46
0
        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();
            //}
        }
示例#49
0
        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);
        }