/// <summary> /// Add default file ordering for common popuular script and style libraries. /// </summary> /// <param name="list">A collection of <see cref="BundleFileSetOrdering"/> objects to populate with default values.</param> /// <remarks> /// The purpose for applying these default file ordering values is to ensure that common libraries such as jquery are always located /// at or close to the top within a bundle. These values can be all removed with <see cref="ResetAll"/>. /// /// The default ordering values are as follows: /// <list type="bullet"> /// <item><description>reset.css</description></item> /// <item><description>normalize.css</description></item> /// <item><description>jquery.js</description></item> /// <item><description>jquery-min.js</description></item> /// <item><description>jquery-*</description></item> /// <item><description>jquery-ui*</description></item> /// <item><description>jquery.ui*</description></item> /// <item><description>jquery.unobtrusive*</description></item> /// <item><description>jquery.validate*</description></item> /// <item><description>modernizr-*</description></item> /// <item><description>dojo.*</description></item> /// <item><description>mootools-core*</description></item> /// <item><description>mootools-*</description></item> /// <item><description>prototype.js</description></item> /// <item><description>prototype-*</description></item> /// <item><description>scriptaculous-*</description></item> /// <item><description>ext.js</description></item> /// <item><description>ext-*</description></item> /// </list> /// </remarks> public static void AddDefaultFileOrderings(IList <BundleFileSetOrdering> list) { if (list == null) { throw new ArgumentNullException("list"); } BundleFileSetOrdering css = new BundleFileSetOrdering("css"); css.Files.Add("reset.css"); css.Files.Add("normalize.css"); list.Add(css); BundleFileSetOrdering jquery = new BundleFileSetOrdering("jquery"); jquery.Files.Add("jquery.js"); jquery.Files.Add("jquery-min.js"); jquery.Files.Add("jquery-*"); jquery.Files.Add("jquery-ui*"); jquery.Files.Add("jquery.ui*"); jquery.Files.Add("jquery.unobtrusive*"); jquery.Files.Add("jquery.validate*"); list.Add(jquery); BundleFileSetOrdering mod = new BundleFileSetOrdering("modernizr"); mod.Files.Add("modernizr-*"); list.Add(mod); BundleFileSetOrdering dojo = new BundleFileSetOrdering("dojo"); dojo.Files.Add("dojo.*"); list.Add(dojo); BundleFileSetOrdering moo = new BundleFileSetOrdering("moo"); moo.Files.Add("mootools-core*"); moo.Files.Add("mootools-*"); list.Add(moo); BundleFileSetOrdering proto = new BundleFileSetOrdering("prototype"); proto.Files.Add("prototype.js"); proto.Files.Add("prototype-*"); proto.Files.Add("scriptaculous-*"); list.Add(proto); BundleFileSetOrdering ext = new BundleFileSetOrdering("ext"); ext.Files.Add("ext.js"); ext.Files.Add("ext-*"); list.Add(ext); }
private static void AddOrderingFiles(BundleFileSetOrdering ordering, IEnumerable <BundleFile> files, Dictionary <string, HashSet <BundleFile> > fileMap, HashSet <VirtualFile> foundFiles, List <BundleFile> result) { foreach (string fileName in ordering.Files) { // If the file ends in a wildcard we need to do special logic if (fileName.EndsWith("*", StringComparison.OrdinalIgnoreCase)) { // Adds all files that match the prefix of the filename (i.e. jquery-*) string prefix = fileName.Substring(0, fileName.Length - 1); // iterate thru all the files and add matches var matchedFiles = files.Where(f => !foundFiles.Contains(f.VirtualFile) && f.VirtualFile.Name.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)); foreach (BundleFile f in matchedFiles) { result.Add(f); foundFiles.Add(f.VirtualFile); } } else { if (fileMap.ContainsKey(fileName)) { // Sort the hashed files to guarantee an ordering List <BundleFile> sortedFiles = new List <BundleFile>(fileMap[fileName]); sortedFiles.Sort(BundleFileComparer.Instance); foreach (BundleFile fi in sortedFiles) { if (!foundFiles.Contains(fi.VirtualFile)) // Only add the file to the bundle once { result.Add(fi); foundFiles.Add(fi.VirtualFile); } } } } } }