public override string MinifyFile(string fileContents, ClientDependencyType type)
        {
            switch (type)
            {
            case ClientDependencyType.Css:
                return(this.MinifyCss ? CssHelper.MinifyCss(fileContents) : fileContents);

            case ClientDependencyType.Javascript:
            {
                if (!this.MinifyJs)
                {
                    return(fileContents);
                }

                using (var ms = new MemoryStream())
                    using (var writer = new StreamWriter(ms))
                    {
                        writer.Write(fileContents);
                        writer.Flush();
                        return(JSMin.CompressJS(ms));
                    }
            }

            default:
                return(fileContents);
            }
        }
Example #2
0
        public void JsMinify_Handles_Regex()
        {
            var script1 = @"b.prototype._normalizeURL=function(a){return/^https?:\/\//.test(a)||(a=""http://""+a),a}";
            var script2 = @"var ex = +  /w$/.test(resizing),
    ey = +/^ n /.test(resizing); ";
            var script3 = @"return /["",\n]/.test(text)
      ? ""\"""" + text.replace(/\"" / g, ""\""\"""") + ""\""""
      : text; ";

            var minifier = new JSMin();

            //Act

            var output1 = minifier.Minify(script1);

            Assert.AreEqual("" + script1, output1);

            var output2 = minifier.Minify(script2);

            Assert.AreEqual("" + @"var ex=+/w$/.test(resizing),ey=+/^ n /.test(resizing);", output2);

            var output3 = minifier.Minify(script3);

            Assert.AreEqual("" + @"return /["",\n]/.test(text)?""\""""+text.replace(/\"" /g,""\""\"""")+""\"""":text;", output3);
        }
        public override string MinifyFile(Stream fileStream, ClientDependencyType type)
        {
            Func <Stream, string> streamToString = stream =>
            {
                if (!stream.CanRead)
                {
                    throw new InvalidOperationException("Cannot read input stream");
                }

                if (stream.CanSeek)
                {
                    stream.Position = 0;
                }

                var reader = new StreamReader(stream);
                return(reader.ReadToEnd());
            };

            switch (type)
            {
            case ClientDependencyType.Css:
                return(this.MinifyCss ? CssHelper.MinifyCss(fileStream) : streamToString(fileStream));

            case ClientDependencyType.Javascript:
                return(this.MinifyJs ? JSMin.CompressJS(fileStream) : streamToString(fileStream));

            default:
                return(streamToString(fileStream));
            }
        }
Example #4
0
        public void JsMinify_Minify()
        {
            //Arrange

            var script =
                @"var Messaging = {
    GetMessage: function(callback) {
        $.ajax({
            type: ""POST"",
            url: ""/Services/MessageService.asmx/HelloWorld"",
            data: ""{}"",
            contentType: ""application/json; charset=utf-8"",
            dataType: ""json"",
            success: function(msg) {
                callback.apply(this, [msg.d]);
            }
        });
    }
    var blah = 1;
    blah++;
    blah = blah + 2;
    var newBlah = ++blah;
    newBlah += 234 +4;
};";

            var minifier = new JSMin();

            //Act

            var output = minifier.Minify(script);

            Assert.AreEqual(
                "var Messaging={GetMessage:function(callback){$.ajax({type:\"POST\",url:\"/Services/MessageService.asmx/HelloWorld\",data:\"{}\",contentType:\"application/json; charset=utf-8\",dataType:\"json\",success:function(msg){callback.apply(this,[msg.d]);}});}\nvar blah=1;blah++;blah=blah+2;var newBlah=++blah;newBlah+=234+4;};",
                output);
        }
Example #5
0
        /// <summary>
        /// Minify the result if in release mode
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            base.OnResultExecuting(filterContext);

            if (filterContext.Result == null)
            {
                return;
            }
            var jsResult = filterContext.Result as JavaScriptResult;

            if (jsResult == null)
            {
                return;
            }
            if (filterContext.HttpContext.IsDebuggingEnabled)
            {
                return;
            }

            //minify the result
            var result   = jsResult.Script;
            var minifier = new JSMin();
            var minified = minifier.Minify(result);

            jsResult.Script = minified;
        }
Example #6
0
    public static string ScriptMinify(string script)
    {
        string openTag, jsContent;
        int    si, ei;

        si = script.IndexOf(S_TAG, 0, StringComparison.OrdinalIgnoreCase);
        if (si == -1)
        {
            return(script);
        }

        ei = script.IndexOf(">", si);
        if (ei == -1)
        {
            return(script);
        }

        openTag = script.Substring(0, ei);

        si = script.IndexOf(E_TAG, ei, StringComparison.OrdinalIgnoreCase);

        if (si == -1)
        {
            return(script);
        }

        ei++;
        IMinify min = new JSMin();

        jsContent = min.Minify(script.Substring(ei, si - ei));
        return(string.Concat(openTag, jsContent, script.Substring(si)));
    }
Example #7
0
        public void JsMinify_TypeScript_Enum()
        {
            var script = @"$(""#TenderListType"").val(1 /* Calendar */.toString());";

            var minifier = new JSMin();
            var output   = minifier.Minify(script);

            Assert.AreEqual("$(\"#TenderListType\").val(1..toString());", output);
        }
Example #8
0
        public void JsMinify_Escaped_Quotes_In_String_Literal()
        {
            var script = "var asdf=\"Some string\\\'s with \\\"quotes\\\" in them\"";

            var minifier = new JSMin();

            //Act

            var output = minifier.Minify(script);

            Assert.AreEqual("var asdf=\"Some string\\\'s with \\\"quotes\\\" in them\"", output);
        }
        /// <summary>
        /// Minifies the file
        /// </summary>
        /// <param name="fileContents"></param>
        /// <param name="type"></param>
        /// <returns></returns>
        public virtual string MinifyFile(string fileContents, ClientDependencyType type)
        {
            switch (type)
            {
            case ClientDependencyType.Css:
                return(EnableCssMinify ? CssHelper.MinifyCss(fileContents) : fileContents);

            case ClientDependencyType.Javascript:
                return(EnableJsMinify ? JSMin.CompressJS(fileContents) : fileContents);

            default:
                return(fileContents);
            }
        }
        /// <summary>
        /// Minifies the file
        /// </summary>
        /// <param name="fileStream"></param>
        /// <param name="type"></param>
        /// <returns></returns>
        public virtual string MinifyFile(Stream fileStream, ClientDependencyType type)
        {
            switch (type)
            {
            case ClientDependencyType.Css:
                return(EnableCssMinify ? CssHelper.MinifyCss(fileStream) : StreamToString(fileStream));

            case ClientDependencyType.Javascript:
                return(EnableJsMinify ? JSMin.CompressJS(fileStream) : StreamToString(fileStream));

            default:
                return(StreamToString(fileStream));
            }
        }
        protected override string MinifyFile(string fileContents, ClientDependencyType type)
        {
            switch (type)
            {
            case ClientDependencyType.Css:
                return(MinifyCss ? CssMin.CompressCSS(fileContents) : fileContents);

            case ClientDependencyType.Javascript:
                return(MinifyJs ? JSMin.CompressJS(fileContents) : fileContents);

            default:
                return(fileContents);
            }
        }
Example #12
0
        public void JsMinify_Backslash_Line_Escapes()
        {
            var script = @"function Test() {
jQuery(this).append('<div>\
		<div>\
			<a href=""http://google.com"" /></a>\
		</div>\
	</div>');
}";

            var minifier = new JSMin();

            //Act

            var output = minifier.Minify(script);

            //Assert

            Assert.AreEqual("function Test(){jQuery(this).append('<div>  <div>   <a href=\"http://google.com\" /></a>  </div> </div>');}", output);
        }
        /// <summary>
        /// Minifies the file
        /// </summary>
        /// <param name="fileStream"></param>
        /// <param name="type"></param>
        /// <returns></returns>
        public virtual string MinifyFile(Stream fileStream, ClientDependencyType type)
        {
            Func <Stream, string> streamToString = stream =>
            {
                var reader = new StreamReader(stream);
                return(reader.ReadToEnd());
            };

            switch (type)
            {
            case ClientDependencyType.Css:
                return(EnableCssMinify ? CssHelper.MinifyCss(fileStream) : streamToString(fileStream));

            case ClientDependencyType.Javascript:
                return(EnableJsMinify ? JSMin.CompressJS(fileStream) : streamToString(fileStream));

            default:
                return(streamToString(fileStream));
            }
        }
Example #14
0
        public void JsMinify_Minify_With_Unary_Operator()
        {
            //see: http://clientdependency.codeplex.com/workitem/13162

            //Arrange

            var script =
                @"var c = {};
var c.name = 0;
var i = 1;
c.name=i+ +new Date;
alert(c.name);";

            var minifier = new JSMin();

            //Act

            var output = minifier.Minify(script);

            //Assert

            Assert.AreEqual("var c={};var c.name=0;var i=1;c.name=i+ +new Date;alert(c.name);", output);
        }
Example #15
0
    public static string HtmlTidy(string html,
                                  bool minifyHtml         = true,
                                  bool minifyJs           = true,
                                  bool minifyCss          = true,
                                  bool optimizeJsPostion  = true,
                                  bool optimizeCssPostion = true)
    {
        //return html;
        const string SCRIPT_TAG_START = "<script";
        const string SCRIPT_TAG_END   = "</script>";

        const string STYLE_TAG_START = "<style";
        const string STYLE_TAG_END   = "</style>";

        const string HEAD_TAG_END = "</head>";
        const string BODY_TAG_END = "</body>";

        int startLength = STYLE_TAG_START.Length;
        int endLength = SCRIPT_TAG_END.Length;
        int startIdx, endIdx, offset = 0;
        int headIdx    = html.IndexOf(HEAD_TAG_END, StringComparison.OrdinalIgnoreCase);
        int bodyEndIdx = -1;

        string          scriptStr = "";
        List <CodeItem> lsParts = new List <CodeItem>();
        List <CodeItem> lsResult = new List <CodeItem>();
        int             close, endblock;

        /*Javascript*/
        while ((startIdx = html.IndexOf(SCRIPT_TAG_START, offset, StringComparison.OrdinalIgnoreCase)) != -1)
        {
            if ((endIdx = html.IndexOf(SCRIPT_TAG_END, startIdx + startLength, StringComparison.OrdinalIgnoreCase)) == -1)
            {
                break;
            }

            lsParts.Add(CodeItem.NewItem(CodeType.Html, "", html.Substring(offset, startIdx - offset), "", offset, startIdx));

            scriptStr = html.Substring(startIdx, endIdx + endLength - startIdx);
            close     = scriptStr.IndexOf('>');
            if (close != -1)
            {
                endblock = endIdx - startIdx;
                lsParts.Add(CodeItem.NewItem(CodeType.Js,
                                             scriptStr.Substring(0, close + 1),
                                             scriptStr.Substring(close + 1, endblock - (close + 1)),
                                             scriptStr.Substring(endblock),
                                             startIdx,
                                             endIdx + endLength
                                             ));
            }
            offset = endIdx + endLength;
        }

        //if ((endIdx = html.IndexOf(BODY_TAG_END, offset, StringComparison.OrdinalIgnoreCase)) != -1)
        //{
        //    bodyEndIdx = endIdx;
        //    lsParts.Add(CodeItem.NewItem(CodeType.Html, "", html.Substring(offset, endIdx - offset), "", offset, endIdx));
        //    lsParts.Add(CodeItem.NewItem(CodeType.Html, "", html.Substring(endIdx), "", endIdx, html.Length - 1));  //tail
        //}
        //else
        //{
        lsParts.Add(CodeItem.NewItem(CodeType.Html, "", html.Substring(offset), "", offset, html.Length - 1));
        //}


        startLength = STYLE_TAG_START.Length;
        endLength   = STYLE_TAG_END.Length;
        int i;

        for (i = 0; i < lsParts.Count; i++)
        {
            var code = lsParts[i];
            if (code.ItemType == CodeType.Js)
            {
                lsResult.Add(code);
            }
            else
            {
                offset = 0;
                while ((startIdx = code.Content.IndexOf(STYLE_TAG_START, offset, StringComparison.OrdinalIgnoreCase)) != -1)
                {
                    if ((endIdx = code.Content.IndexOf(STYLE_TAG_END, startIdx + startLength, StringComparison.OrdinalIgnoreCase)) == -1)
                    {
                        break;
                    }

                    lsResult.Add(CodeItem.NewItem(CodeType.Html, "", code.Content.Substring(offset, startIdx - offset), "", code.StartIndex + offset, code.StartIndex + startIdx));

                    scriptStr = code.Content.Substring(startIdx, endIdx + endLength - startIdx);
                    close     = scriptStr.IndexOf('>');
                    if (close != -1)
                    {
                        endblock = endIdx - startIdx;
                        lsResult.Add(CodeItem.NewItem(CodeType.Css,
                                                      scriptStr.Substring(0, close + 1),
                                                      scriptStr.Substring(close + 1, endblock - (close + 1)),
                                                      scriptStr.Substring(endblock),
                                                      code.StartIndex + startIdx,
                                                      code.StartIndex + (endIdx + endLength)
                                                      ));
                    }
                    offset = endIdx + endLength;
                }
                lsResult.Add(CodeItem.NewItem(CodeType.Html, "", code.Content.Substring(offset), "", code.StartIndex + offset, code.StartIndex + code.Content.Length - 1));
            }
        }
        if (headIdx == -1 || bodyEndIdx == -1)
        {
            optimizeCssPostion = optimizeJsPostion = false;
        }

        StringBuilder sb       = new StringBuilder();
        HTMLMin       _htmlMin = new HTMLMin();
        CSSMin        _cssMin  = new CSSMin();
        JSMin         _jsMin   = new JSMin();

        for (i = 0; i < lsResult.Count; i++)
        {
            var code = lsResult[i];
            if (code.ItemType == CodeType.Html)
            {
                if (minifyHtml)
                {
                    code.Content = _htmlMin.Minify(code.Content);
                }
            }
            else if (code.ItemType == CodeType.Js)
            {
                if (minifyJs)
                {
                    code.Content = _jsMin.Minify(code.Content);
                }
            }
            if (code.ItemType == CodeType.Css)
            {
                if (minifyCss)
                {
                    code.Content = _cssMin.Minify(code.Content);
                }
            }
            //sb.Append("<hr>");
            //sb.AppendFormat("tt: {0} ({1}-{2})", i, code.StartIndex, code.EndIndex);
            //sb.Append("<hr>");
            sb.Append(code.OpenTag);
            sb.Append(code.Content);
            sb.Append(code.CloseTag);
        }
        return(sb.ToString());
    }
Example #16
0
    public static string JsMinify(string rawJs)
    {
        IMinify min = new JSMin();

        return(min.Minify(rawJs));
    }