예제 #1
0
        public JsMinifier(ILoggerFactory loggerFactory)
        {
            if (loggerFactory == null)
            {
                throw new ArgumentNullException(nameof(loggerFactory));
            }

            _logger   = loggerFactory.CreateLogger <CssMinifier>();
            _minifier = new CrockfordJsMinifier();
        }
예제 #2
0
        private static Dictionary <string, Tuple <string, byte[]> > LoadCache(string basePath, string[] extensions = null)
        {
            //put static files minificated in a memory store -> cache
            var staticFilesStorage = new Dictionary <string, Tuple <string, byte[]> >();
            //read all static files and load into mmemory
            var files = Directory.GetFiles(basePath, "*", SearchOption.AllDirectories).ToList();

            if (extensions != null)
            {
                files = files.Where(f => extensions.Contains(Path.GetExtension(f))).ToList();
            }
            var minifyJs   = new WebMarkupMin.Core.CrockfordJsMinifier();
            var minifyCss  = new WebMarkupMin.Core.KristensenCssMinifier();
            var minifyHtml = new WebMarkupMin.Core.HtmlMinifier();

            files.ForEach(file =>
            {
                var content = File.ReadAllBytes(file);
                var ext     = Path.GetExtension(file);
                //compress or minify
                if (Environment.GetEnvironmentVariable("minifyResponse") != "false")
                {
                    switch (ext)
                    {
                    case ".js":
                        //javascript minify
                        var js         = System.Text.UTF8Encoding.Default.GetString(content);
                        var minifiedJs = minifyJs.Minify(js, false);
                        if (!minifiedJs.Errors.Any())
                        {
                            content = System.Text.UTF8Encoding.Default.GetBytes(minifiedJs.MinifiedContent);
                        }
                        break;

                    case ".css":
                        //css minify
                        var css         = System.Text.UTF8Encoding.Default.GetString(content);
                        var minifiedCss = minifyCss.Minify(css, false);
                        if (!minifiedCss.Errors.Any())
                        {
                            content = System.Text.UTF8Encoding.Default.GetBytes(minifiedCss.MinifiedContent);
                        }
                        break;

                    case ".html":
                        //html minify
                        var html         = System.Text.UTF8Encoding.Default.GetString(content);
                        var minifiedHtml = minifyHtml.Minify(html, false);
                        if (!minifiedHtml.Errors.Any())
                        {
                            content = System.Text.UTF8Encoding.Default.GetBytes(minifiedHtml.MinifiedContent);
                        }
                        break;
                    }
                }
                staticFilesStorage.Add(file, new Tuple <string, byte[]>(MimeMapping.MimeUtility.GetMimeMapping(file), content));
            });

            var usedMemory = Math.Round(staticFilesStorage.Select(s => s.Value).Sum(s => s.Item2.Length) / 1024.0 / 1024.0);

            Console.WriteLine($"{staticFilesStorage.Count} static files loaded into memory using {usedMemory} MB");
            return(staticFilesStorage);
        }
예제 #3
0
        public static void Run(
            AbsolutePath scriptsDirectory,
            AbsolutePath componentsDirectory,
            string bundleFileName)
        {
            var componentsFolderPath    = componentsDirectory;
            var componentsPathForBundle = GetRelativePath(scriptsDirectory, componentsDirectory).Replace('\\', '/').Trim('/');
            var componentsFolder        = new DirectoryInfo(componentsFolderPath);

            var jsMinifier   = new WebMarkupMin.Core.CrockfordJsMinifier();
            var htmlMinifier = new WebMarkupMin.Core.HtmlMinifier(jsMinifier: jsMinifier);

            var bundleParts = componentsFolder.EnumerateDirectories().SelectMany(x =>
                                                                                 x.EnumerateFiles().Select(y =>
            {
                var name        = y.Name.Replace(y.Extension, string.Empty);
                var path        = string.Empty;
                var contentType = ContentType.Unknown;
                var content     = string.Empty;

                if (string.Equals(y.Extension, ".js", StringComparison.InvariantCultureIgnoreCase))
                {
                    path        = $"{componentsPathForBundle}/{x.Name}/{name}";
                    contentType = ContentType.Js;
                }
                else if (string.Equals(y.Extension, ".html", StringComparison.InvariantCultureIgnoreCase))
                {
                    path        = $"text!{componentsPathForBundle}/{x.Name}/{y.Name}";
                    contentType = ContentType.Html;
                }
                else
                {
                    return(ContentType: contentType, ModuleName: x.Name, ContentPath: y.FullName, Content: string.Empty);
                }

                using (var stream = File.OpenRead(y.FullName))
                    using (var reader = new StreamReader(stream))
                    {
                        content = reader.ReadToEnd();
                        switch (contentType)
                        {
                        case ContentType.Js:
                            content = jsMinifier.Minify(content, false).MinifiedContent;
                            break;

                        case ContentType.Html:
                            content = htmlMinifier.Minify(content).MinifiedContent.Replace("\r", "").Replace("\n", "").Replace("\'", "\\'");
                            break;

                        default:
                            break;
                        }
                    }
                return(ContentType: contentType, ModuleName: x.Name, ContentPath: path.Replace("\\", "/"), Content: content);
            })).ToList();

            var part1 = string.Join(string.Empty, bundleParts.SelectMany(x => x.ContentType == ContentType.Html ? new[] { $"define('{x.ContentPath}', [], function () {{ return '{x.Content}';}});" } : new string[] { }));
            var part2 = string.Join(string.Empty, bundleParts.SelectMany(x => x.ContentType == ContentType.Js ? new[] { x.Content } : new string[] { }));
            var moduleDescriptions = bundleParts.GroupBy(x => x.ModuleName);
            var part3 = $"define('components', [{string.Join(",", moduleDescriptions.Select(x => "'" + x.Key + "'"))}]);";
            var part4 = string.Join(string.Empty, moduleDescriptions.Select(x => $"define('{x.Key}', [{string.Join(",", x.Select(y => "'" + y.ContentPath + "'"))}]);"));

            using (var stream = File.Create(componentsFolderPath / bundleFileName))
                using (var writer = new StreamWriter(stream))
                {
                    writer.Write(string.Join(Environment.NewLine, new[] { part1, part2, part3, part4 }));
                }
            Console.WriteLine("Bundle assembled!");
        }