public void SaveTranslation(string path) { IAsset file = new Asset(path); LessTranslator lessTranslator = new LessTranslator(); var compiled = lessTranslator.Translate(file); var normalCSS = path.Replace("." + FileExtension, ".css"); using (var compiledCSS = File.CreateText(HostingEnvironment.MapPath(normalCSS))) { compiledCSS.Write(compiled.Content); compiledCSS.Close(); } }
public IEnumerable <Exception> ValidateTranslation(string path) { var retVal = new List <Exception>(); try { IAsset file = new Asset(path); LessTranslator lessTranslator = new LessTranslator(); lessTranslator.Translate(file); } catch (AssetTranslationException ex) { retVal.Add(ex); } return(retVal); }
public static void RegisterBundles(BundleCollection bundles) { var nullBuilder = new NullBuilder(); var nullOrderer = new NullOrderer(); var lessTranslator = new LessTranslator { GlobalVariables = "my-variable='Hurrah!'", ModifyVariables = "font-family-base='Comic Sans MS';body-bg=lime;font-size-h1=50px" }; var cssTransformer = new CssTransformer(new List <ITranslator> { lessTranslator }); var commonStylesBundle = new Bundle("~/Bundles/BootstrapStyles"); commonStylesBundle.Include( "~/Content/less/bootstrap-3.1.1/bootstrap.less"); commonStylesBundle.Builder = nullBuilder; commonStylesBundle.Transforms.Add(cssTransformer); commonStylesBundle.Orderer = nullOrderer; bundles.Add(commonStylesBundle); }
public void FillingOfDependenciesIsCorrect() { // Arrange var virtualFileSystemMock = new Mock <IVirtualFileSystemWrapper>(); string testLessLessAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH, "TestLess.less"); virtualFileSystemMock .Setup(fs => fs.ToAbsolutePath(testLessLessAssetVirtualPath)) .Returns(testLessLessAssetVirtualPath) ; virtualFileSystemMock .Setup(fs => fs.FileExists(testLessLessAssetVirtualPath)) .Returns(true) ; virtualFileSystemMock .Setup(fs => fs.GetFileTextContent(testLessLessAssetVirtualPath)) .Returns(@"@import (once) ""Mixins.less""; @import (reference) ""Variables.less""; @import (css) url(""data:text/css;base64,Ym9keSB7IGJhY2tncm91bmQtY29sb3I6IGxpbWUgIWltcG9ydGFudDsgfQ==""); .translators #less { float: left; .visible(); padding: 0.2em 0.5em 0.2em 0.5em; background-color: @bg-color; color: @caption-color; font-weight: bold; border: 1px solid @bg-color; .border-radius(5px); } .icon-monitor { display: inline; background-image: url(""@{icons-path}monitor.png""); } @import (once) ""TestLessImport.less"";") ; string mixinsLessAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH, "Mixins.less"); virtualFileSystemMock .Setup(fs => fs.ToAbsolutePath(mixinsLessAssetVirtualPath)) .Returns(mixinsLessAssetVirtualPath) ; virtualFileSystemMock .Setup(fs => fs.FileExists(mixinsLessAssetVirtualPath)) .Returns(true) ; virtualFileSystemMock .Setup(fs => fs.GetFileTextContent(mixinsLessAssetVirtualPath)) .Returns(@"// Border Radius .border-radius(@radius) { -webkit-border-radius: @radius; -moz-border-radius: @radius; border-radius: @radius; } // Visible .visible { display: block; }") ; string variablesLessAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH, "Variables.less"); virtualFileSystemMock .Setup(fs => fs.ToAbsolutePath(variablesLessAssetVirtualPath)) .Returns(variablesLessAssetVirtualPath) ; virtualFileSystemMock .Setup(fs => fs.FileExists(variablesLessAssetVirtualPath)) .Returns(true) ; virtualFileSystemMock .Setup(fs => fs.GetFileTextContent(variablesLessAssetVirtualPath)) .Returns(@"@bg-color: #7AC0DA; @caption-color: #FFFFFF; @stylesheets-path: ""/Content/""; @icons-path: ""/Content/images/icons/"";") ; string testLessImportLessAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH, "TestLessImport.less"); virtualFileSystemMock .Setup(fs => fs.ToAbsolutePath(testLessImportLessAssetVirtualPath)) .Returns(testLessImportLessAssetVirtualPath) ; virtualFileSystemMock .Setup(fs => fs.FileExists(testLessImportLessAssetVirtualPath)) .Returns(true) ; virtualFileSystemMock .Setup(fs => fs.GetFileTextContent(testLessImportLessAssetVirtualPath)) .Returns(@"@alt-bg-color: #143352; .translators #less { background-color: @alt-bg-color; } .icon-headphone { display: inline; background-image: data-uri('@{icons-path}headphone.gif'); } .icon-google-plus { display: inline; background-image: data-uri('google-plus.svg'); } @import (multiple) url( ""TestLessImport.Sub1.less"" ); .singleline-comment { content: ""//"" } .triple-slash-directive { content: '///' } @import '@{stylesheets-path}TestLessImport.Sub2'; /*@import 'TestLessImport.Sub3.less'; @import 'TestLessImport.Sub4.less';*/ // @import ""TestLessImport.Sub5.less""; // Obsolete import //@import ""TestLessImport.Sub6.less""; .icon-bean { background-image: url(http://taritsyn.files.wordpress.com/2013/08/bean.png); } //@import ""TestLessImport.Sub7.less""; // @import ""TestLessImport.Sub8.less""; @import ""TestLessImport.Sub9.less""; ") ; string headphoneGifAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH, "images/icons/headphone.gif"); virtualFileSystemMock .Setup(fs => fs.ToAbsolutePath(headphoneGifAssetVirtualPath)) .Returns(headphoneGifAssetVirtualPath) ; virtualFileSystemMock .Setup(fs => fs.FileExists(headphoneGifAssetVirtualPath)) .Returns(true) ; virtualFileSystemMock .Setup(fs => fs.GetFileBinaryContent(headphoneGifAssetVirtualPath)) .Returns(new byte[0]) ; string googlePlusSvgAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH, "google-plus.svg"); virtualFileSystemMock .Setup(fs => fs.ToAbsolutePath(googlePlusSvgAssetVirtualPath)) .Returns(googlePlusSvgAssetVirtualPath) ; virtualFileSystemMock .Setup(fs => fs.FileExists(googlePlusSvgAssetVirtualPath)) .Returns(true) ; virtualFileSystemMock .Setup(fs => fs.GetFileTextContent(googlePlusSvgAssetVirtualPath)) .Returns(string.Empty) ; string testLessImportSub1LessAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH, "TestLessImport.Sub1.less"); virtualFileSystemMock .Setup(fs => fs.ToAbsolutePath(testLessImportSub1LessAssetVirtualPath)) .Returns(testLessImportSub1LessAssetVirtualPath) ; virtualFileSystemMock .Setup(fs => fs.FileExists(testLessImportSub1LessAssetVirtualPath)) .Returns(true) ; virtualFileSystemMock .Setup(fs => fs.GetFileTextContent(testLessImportSub1LessAssetVirtualPath)) .Returns(@"@import (css) url(http://fonts.googleapis.com/css?family=Limelight&subset=latin,latin-ext); @border-color: #143352; .translators #less { border-color: @border-color; } .icon-network { display: inline; background-image: data-uri('image/png;base64', ""@network.png""); } @import url(""TagIcon.css"");") ; string networkPngAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH, "@network.png"); virtualFileSystemMock .Setup(fs => fs.ToAbsolutePath(networkPngAssetVirtualPath)) .Returns(networkPngAssetVirtualPath) ; virtualFileSystemMock .Setup(fs => fs.FileExists(networkPngAssetVirtualPath)) .Returns(true) ; virtualFileSystemMock .Setup(fs => fs.GetFileBinaryContent(networkPngAssetVirtualPath)) .Returns(new byte[0]) ; string tagIconCssAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH, "TagIcon.css"); virtualFileSystemMock .Setup(fs => fs.ToAbsolutePath(tagIconCssAssetVirtualPath)) .Returns(tagIconCssAssetVirtualPath) ; virtualFileSystemMock .Setup(fs => fs.FileExists(tagIconCssAssetVirtualPath)) .Returns(true) ; virtualFileSystemMock .Setup(fs => fs.GetFileTextContent(tagIconCssAssetVirtualPath)) .Returns(@".icon-tag { display: inline; background-image: url(tag.png) !important; }") ; string testLessImportSub2LessAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH, "TestLessImport.Sub2.less"); virtualFileSystemMock .Setup(fs => fs.ToAbsolutePath(testLessImportSub2LessAssetVirtualPath)) .Returns(testLessImportSub2LessAssetVirtualPath) ; virtualFileSystemMock .Setup(fs => fs.FileExists(testLessImportSub2LessAssetVirtualPath)) .Returns(true) ; virtualFileSystemMock .Setup(fs => fs.GetFileTextContent(testLessImportSub2LessAssetVirtualPath)) .Returns(@"@import (css) 'http://fonts.googleapis.com/css?family=Limelight&subset=latin,latin-ext'; @import (css) ""UsbFlashDriveIcon.css""; @import (less) ""ValidationIcon.css""; @import (inline) ""MicroformatsIcon.css""; @import (inline, css) 'NodeIcon.less'; @import (css) ""OpenIdIcon.less""; @import (optional) ""PrinterIcon.less""; @import (optional) ""NonExistentIcon.less""; @import ""~/Content/XfnIcon.less""; @import ""~/Content/YahooIcon.css"";") ; string usbFlashDriveIconCssAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH, "UsbFlashDriveIcon.css"); virtualFileSystemMock .Setup(fs => fs.ToAbsolutePath(usbFlashDriveIconCssAssetVirtualPath)) .Returns(usbFlashDriveIconCssAssetVirtualPath) ; virtualFileSystemMock .Setup(fs => fs.FileExists(usbFlashDriveIconCssAssetVirtualPath)) .Returns(true) ; virtualFileSystemMock .Setup(fs => fs.GetFileTextContent(usbFlashDriveIconCssAssetVirtualPath)) .Returns(@".icon-usb-flash-drive { display: inline; background-image: ""usb-flash-drive.png"" !important; }") ; string validationIconCssAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH, "ValidationIcon.css"); virtualFileSystemMock .Setup(fs => fs.ToAbsolutePath(validationIconCssAssetVirtualPath)) .Returns(validationIconCssAssetVirtualPath) ; virtualFileSystemMock .Setup(fs => fs.FileExists(validationIconCssAssetVirtualPath)) .Returns(true) ; virtualFileSystemMock .Setup(fs => fs.GetFileTextContent(validationIconCssAssetVirtualPath)) .Returns(@".icon-validation { display: inline; background-image: url('validation.png') !important; }") ; string microformatsIconCssAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH, "MicroformatsIcon.css"); virtualFileSystemMock .Setup(fs => fs.ToAbsolutePath(microformatsIconCssAssetVirtualPath)) .Returns(microformatsIconCssAssetVirtualPath) ; virtualFileSystemMock .Setup(fs => fs.FileExists(microformatsIconCssAssetVirtualPath)) .Returns(true) ; virtualFileSystemMock .Setup(fs => fs.GetFileTextContent(microformatsIconCssAssetVirtualPath)) .Returns(@".icon-microformats { display: inline; background-image: url(microformats.png) !important; }") ; string nodeIconLessAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH, "NodeIcon.less"); virtualFileSystemMock .Setup(fs => fs.ToAbsolutePath(nodeIconLessAssetVirtualPath)) .Returns(nodeIconLessAssetVirtualPath) ; virtualFileSystemMock .Setup(fs => fs.FileExists(nodeIconLessAssetVirtualPath)) .Returns(true) ; virtualFileSystemMock .Setup(fs => fs.GetFileTextContent(nodeIconLessAssetVirtualPath)) .Returns(@".icon-node { display: inline; background-image: url(node.png) !important; }") ; string openIdIconLessAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH, "OpenIdIcon.less"); virtualFileSystemMock .Setup(fs => fs.ToAbsolutePath(openIdIconLessAssetVirtualPath)) .Returns(openIdIconLessAssetVirtualPath) ; virtualFileSystemMock .Setup(fs => fs.FileExists(openIdIconLessAssetVirtualPath)) .Returns(true) ; virtualFileSystemMock .Setup(fs => fs.GetFileTextContent(openIdIconLessAssetVirtualPath)) .Returns(@".icon-openid { display: inline; background-image: url(openid.png) !important; }") ; string printerIconLessAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH, "PrinterIcon.less"); virtualFileSystemMock .Setup(fs => fs.ToAbsolutePath(printerIconLessAssetVirtualPath)) .Returns(printerIconLessAssetVirtualPath) ; virtualFileSystemMock .Setup(fs => fs.FileExists(printerIconLessAssetVirtualPath)) .Returns(true) ; virtualFileSystemMock .Setup(fs => fs.GetFileTextContent(printerIconLessAssetVirtualPath)) .Returns(@".icon-printer { display: inline; background-image: url(printer.png) !important; }") ; string nonExistentIconLessAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH, "NonExistentIcon.less"); virtualFileSystemMock .Setup(fs => fs.ToAbsolutePath(nonExistentIconLessAssetVirtualPath)) .Returns(nonExistentIconLessAssetVirtualPath) ; virtualFileSystemMock .Setup(fs => fs.FileExists(nonExistentIconLessAssetVirtualPath)) .Returns(false) ; string xfnIconLessAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH, "XfnIcon.less"); virtualFileSystemMock .Setup(fs => fs.ToAbsolutePath("~" + xfnIconLessAssetVirtualPath)) .Returns(xfnIconLessAssetVirtualPath) ; virtualFileSystemMock .Setup(fs => fs.FileExists(xfnIconLessAssetVirtualPath)) .Returns(true) ; virtualFileSystemMock .Setup(fs => fs.GetFileTextContent(xfnIconLessAssetVirtualPath)) .Returns(@".icon-xfn { display: inline; background-image: url(""~/Content/xfn.png""); }") ; string xfnPngAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH, "xfn.png"); virtualFileSystemMock .Setup(fs => fs.ToAbsolutePath("~" + xfnPngAssetVirtualPath)) .Returns(xfnPngAssetVirtualPath) ; string yahooIconCssAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH, "YahooIcon.css"); virtualFileSystemMock .Setup(fs => fs.ToAbsolutePath("~" + yahooIconCssAssetVirtualPath)) .Returns(yahooIconCssAssetVirtualPath) ; virtualFileSystemMock .Setup(fs => fs.FileExists(yahooIconCssAssetVirtualPath)) .Returns(true) ; virtualFileSystemMock .Setup(fs => fs.GetFileTextContent(yahooIconCssAssetVirtualPath)) .Returns(@".icon-yahoo { display: inline; background-image: url(""/Content/yahoo.ico"") !important; }") ; Func <IJsEngine> createJsEngineInstance = () => JsEngineSwitcher.Instance.CreateDefaultEngine(); IVirtualFileSystemWrapper virtualFileSystemWrapper = virtualFileSystemMock.Object; var lessConfig = new LessSettings(); var lessTranslator = new LessTranslator(createJsEngineInstance, virtualFileSystemWrapper, lessConfig); IAsset asset = new Asset(testLessLessAssetVirtualPath, virtualFileSystemWrapper); // Act asset = lessTranslator.Translate(asset); IList <string> dependencies = asset.VirtualPathDependencies; // Assert Assert.Equal(14, dependencies.Count); Assert.Equal(mixinsLessAssetVirtualPath, dependencies[0]); Assert.Equal(variablesLessAssetVirtualPath, dependencies[1]); Assert.Equal(testLessImportLessAssetVirtualPath, dependencies[2]); Assert.Equal(testLessImportSub1LessAssetVirtualPath, dependencies[3]); Assert.Equal(testLessImportSub2LessAssetVirtualPath, dependencies[4]); Assert.Equal(validationIconCssAssetVirtualPath, dependencies[5]); Assert.Equal(microformatsIconCssAssetVirtualPath, dependencies[6]); Assert.Equal(nodeIconLessAssetVirtualPath, dependencies[7]); Assert.Equal(printerIconLessAssetVirtualPath, dependencies[8]); Assert.Equal(nonExistentIconLessAssetVirtualPath, dependencies[9]); Assert.Equal(xfnIconLessAssetVirtualPath, dependencies[10]); Assert.Equal(headphoneGifAssetVirtualPath, dependencies[11]); Assert.Equal(googlePlusSvgAssetVirtualPath, dependencies[12]); Assert.Equal(networkPngAssetVirtualPath, dependencies[13]); }
public static void RegisterBundles(BundleCollection bundles) { // bundles.IgnoreList.Clear(); // AddDefaultIgnorePatterns(bundles.IgnoreList); //NOTE: it's bundles.DirectoryFilter in Microsoft.AspNet.Web.Optimization.1.1.3 and not bundles.IgnoreList var engine = new V8JsEngine(); var uglySettings = new UglifySettings(); uglySettings.Js.CodeGeneration.Beautify = true; bundles.UseCdn = false; var uglifyJsMinifier = new UglifyJsMinifier(() => engine, uglySettings) { CompressionOptions = { Angular = true }, ParsingOptions = new ParsingOptions { Strict = true }, CodeGenerationOptions = new CodeGenerationOptions() }; var lessTranslator = new LessTranslator(); var cssTransformer = new CssTransformer(new CleanCssMinifier(), new ITranslator[] { lessTranslator }); var tsTranslater = new TypeScriptTranslator(); var jsTransformer = new JsTransformer(uglifyJsMinifier, new List <ITranslator> { tsTranslater }); var jsBundle = new CustomScriptBundle("~/bundles/js"); jsBundle.IncludeDirectory("~/scripts", "*.js", true); jsBundle.IncludeDirectory("~/scripts", "*.map", true); bundles.IgnoreList.Ignore("angular-mocks.js"); bundles.IgnoreList.Ignore("angular-scenario.js"); // jsBundle.IncludeDirectory("~/scripts/angular-dialog-service-5.1.2", "*.js", true); jsBundle.Builder = new DefaultBundleBuilder(); jsBundle.Orderer = new JsBundlerOrderer(); jsBundle.Transforms.Add(jsTransformer); bundles.Add(jsBundle); var typeScriptBundle = new CustomScriptBundle("~/bundles/ts"); //// Typescript generatred locally via visual studio and checked in - not done on the fly typeScriptBundle.IncludeDirectory("~/app", "*.js", true); typeScriptBundle.Transforms.Add(jsTransformer); typeScriptBundle.Builder = new DefaultBundleBuilder(); typeScriptBundle.Orderer = new JsBundlerOrderer(); bundles.Add(typeScriptBundle); var lessCssBundle = new Bundle("~/bundles/less"); lessCssBundle.Include("~/Content/bootstrap/bootstrap.less"); lessCssBundle.Builder = new DefaultBundleBuilder(); lessCssBundle.Transforms.Add(cssTransformer); lessCssBundle.Orderer = new DefaultBundleOrderer(); bundles.Add(lessCssBundle); var cssBundle = new StyleBundle("~/bundles/css"); cssBundle.IncludeDirectory("~/Content/Bootstrap", "*.css", false); cssBundle.IncludeDirectory("~/Content/", "*.css", false); cssBundle.IncludeDirectory("~/Content/css", "*.css", false); cssBundle.Builder = new DefaultBundleBuilder(); cssBundle.Transforms.Add(cssTransformer); cssBundle.Orderer = new PushToTopOrderer("bootstrap"); bundles.Add(cssBundle); var publicCssBundle = new StyleBundle("~/bundles/public/css"); publicCssBundle.IncludeDirectory("~/Content/public", "*.css", true); publicCssBundle.Builder = new DefaultBundleBuilder(); publicCssBundle.Transforms.Add(cssTransformer); publicCssBundle.Orderer = new PushToTopOrderer("bootstrap"); bundles.Add(publicCssBundle); }