示例#1
0
        static void Main(string[] args)
        {
            var path    = args[0].Replace("/", "\\");
            var type    = args[1];
            var outPath = args[2].Replace("/", "\\");

            var assetLoader = new AssetLoader(new FakeFileSystem());

            // load asset
            var assetFormat = (AssetFormat)Enum.Parse(typeof(AssetFormat), type, true);
            var asset       = assetLoader.GetAsset(path, assetFormat);

            if (string.IsNullOrWhiteSpace(asset))
            {
                return;
            }

            if (assetFormat == AssetFormat.Css)
            {
                var lessCssPreprocessor = new LessCssPreprocessor();
                var result = lessCssPreprocessor.Process(asset);
                if (result.Status != AssetProcessingResult.CompilationStatus.Success)
                {
                    Console.WriteLine(result.Message);
                    Environment.Exit(-1);
                }

                asset = result.Result;
            }
            else if (assetFormat == AssetFormat.Js)
            {
                var yuiJavascriptCompressor = new YuiJavascriptCompressor();
                var result = yuiJavascriptCompressor.Compress(asset);
                // TODO: handle failure
                asset = result;
            }

            // calc md5 and output
            var md5 = CalculateMd5Hash(asset);

            Console.Write(md5);

            var outFile = Path.Combine(outPath, md5 + '.' + assetFormat.ToString().ToLowerInvariant());

            File.WriteAllText(outFile, asset);
        }
示例#2
0
        public static void Compile(string inPath, string outPath, string assemblyName)
        {
            var binPath       = Path.Combine(inPath, "bin");
            var webConfigPath = Path.Combine(inPath, "web.config");

            AssemblyRepository.Initialize();
            AssemblyRepository.LoadAssembliesFromPath(binPath);

            var razorConfiguration = new RazorConfiguration(webConfigPath, outPath);
            var cssPreprocessor    = new LessCssPreprocessor();
            var fileSystem         = new BasicFileSystem(inPath);
            var razorViewCompiler  = new AssetEnrichedRazorViewCompiler(razorConfiguration, new YuiJavascriptCompressor(), cssPreprocessor, fileSystem, new AssetLoader(fileSystem));

            var views = Directory.GetFiles(inPath, "*.cshtml", SearchOption.AllDirectories).ToList();

            if (!views.Any())
            {
                Console.WriteLine($"No views found in path '{inPath}'");
                return;
            }

            // Find all primary (non-component) view paths which need compiling
            views = views.Select(v =>
            {
                var path = Path.GetDirectoryName(v);
                var name = Path.GetFileNameWithoutExtension(v);
                var ext  = Path.GetExtension(v);
                if (name.IndexOf(".", StringComparison.Ordinal) > -1)
                {
                    return(path + "\\" + name.Substring(0, name.IndexOf(".", StringComparison.Ordinal)) + ext);
                }
                return(v);
            }).Distinct().ToList();

            var viewData = new List <RazorViewCompilationData>(views.Count);

            foreach (var view in views)
            {
                var viewPaths = razorViewCompiler.GetViewComponentPaths(view, ".cshtml");
                var jsPaths   = razorViewCompiler.GetViewComponentPaths(view, ".js").Where(p => !p.EndsWith(".test.js")).ToArray();
                var cssPaths  = razorViewCompiler.GetViewComponentPaths(view, ".less").Union(razorViewCompiler.GetViewComponentPaths(view, ".css"));

                var viewVirtualPath = view.Substring(inPath.Length + 1);
                var name            = RazorViewCompiler.GetTypeName(viewVirtualPath);

                var areaStartIndex = viewVirtualPath.IndexOf("areas\\", StringComparison.InvariantCultureIgnoreCase) + 6;
                var areaName       = viewVirtualPath.Substring(areaStartIndex, viewVirtualPath.IndexOf("\\", areaStartIndex) - areaStartIndex);

                var viewContents = new StringBuilder();

                foreach (var viewFile in viewPaths)
                {
                    using (var reader = new StreamReader(new FileStream(viewFile, FileMode.Open, FileAccess.Read)))
                    {
                        string line;
                        while ((line = reader.ReadLine()) != null)
                        {
                            var trimmedLine = line.Trim();
                            if (!string.IsNullOrEmpty(trimmedLine))
                            {
                                if (trimmedLine.IndexOf("@inherits") == -1 && trimmedLine.EndsWith(">"))
                                {
                                    viewContents.Append(trimmedLine);
                                }
                                else
                                {
                                    viewContents.AppendLine(trimmedLine);
                                }
                            }
                        }
                    }
                }

                if (jsPaths.Any())
                {
                    var jsBuilder = new StringBuilder();
                    foreach (var jsFile in jsPaths)
                    {
                        jsBuilder.AppendLine(File.ReadAllText(jsFile));
                    }

                    viewContents.Insert(0, razorViewCompiler.PrepareJsForRazorCompilation(jsBuilder.ToString(), true));
                }

                if (cssPaths.Any())
                {
                    var cssBuilder = new StringBuilder();
                    foreach (var cssFile in cssPaths)
                    {
                        cssBuilder.AppendLine(File.ReadAllText(cssFile));
                    }

                    viewContents.Insert(0, razorViewCompiler.PrepareCssForRazorCompilation(cssBuilder.ToString(), areaName));
                }

                viewData.Add(new RazorViewCompilationData
                {
                    Name         = name,
                    ViewContents = viewContents.ToString()
                });
            }

            razorViewCompiler.CompileAndMergeFiles(viewData, assemblyName);
        }