Skip to content

Instantly share code, notes, and snippets.

@RichardD2
Created August 31, 2018 14:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save RichardD2/19d124e3a1c1bee2973a62823b090747 to your computer and use it in GitHub Desktop.
Save RichardD2/19d124e3a1c1bee2973a62823b090747 to your computer and use it in GitHub Desktop.
public sealed class AsIsBundleOrderer : IBundleOrderer
{
private AsIsBundleOrderer()
{
}
public static IBundleOrderer Instance { get; } = new AsIsBundleOrderer();
public IEnumerable<BundleFile> OrderFiles(BundleContext context, IEnumerable<BundleFile> files) => files;
}
public sealed class BetterStyleBundle : Bundle
{
public BetterStyleBundle(string virtualPath) : base(virtualPath)
{
}
public override IBundleOrderer Orderer
{
get { return AsIsBundleOrderer.Instance; }
set { }
}
public override Bundle Include(params string[] virtualPaths)
{
foreach (string path in virtualPaths)
{
Include(path, CssRewriteUrlTransformAppRelatve.Instance);
}
return this;
}
}
public sealed class CssRewriteUrlTransformAppRelatve : IItemTransform
{
private static readonly Regex UrlRegex = new Regex("url\\(['\"]?(?<url>[^)]+?)['\"]?\\)", RegexOptions.Compiled | RegexOptions.ExplicitCapture);
private CssRewriteUrlTransformAppRelatve()
{
}
public static IItemTransform Instance { get; } = new CssRewriteUrlTransformAppRelatve();
public string Process(string includedVirtualPath, string input)
{
if (includedVirtualPath == null) throw new ArgumentNullException(nameof(includedVirtualPath));
if (string.IsNullOrWhiteSpace(input)) return input;
string directory = VirtualPathUtility.GetDirectory(includedVirtualPath);
if (string.IsNullOrWhiteSpace(directory)) return input;
if (directory[directory.Length - 1] != '/') directory += "/";
return UrlRegex.Replace(input, RebaseUrl);
string RebaseUrl(Match match)
{
string url = match.Groups["url"].Value;
if (string.IsNullOrWhiteSpace(url)) return match.Value;
if (url.StartsWith("data:", StringComparison.Ordinal)) return match.Value;
if (url.StartsWith("https://", StringComparison.Ordinal)) return match.Value;
if (url.StartsWith("http://", StringComparison.Ordinal)) return match.Value;
if (url[0] == '/') return match.Value;
url = VirtualPathUtility.ToAbsolute(directory + url);
return "url(\"" + url + "\")";
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment