This week's TBB is Resolve CSS Images in Output TBB. This template identifies unresolved image references inside CSS selectors "background: url('tcm:x-yy')", publishes the MMC and replaces the reference with the resolved URL.
I got this TBB from my colleague Eric Huiza, so he gets the credit for it ;)
I got this TBB from my colleague Eric Huiza, so he gets the credit for it ;)
Name
|
Render Css Images In Output TBB
|
Type
|
· Template in .NET Assembly
|
Description
|
Used to:
· Resolve references to Multimedia Components
TcmUris inside CSS syntax;
· Publish the MMC and replace the TcmUri
reference with the resolved URL;
Notes:
This generic TBB uses the Output item to search for
references to MMC TcmUris (or WebDav URLs) inside CSS ‘background’ selectors.
If such MMC TcmUri is identified, the MMC is published (to
the mapped Structure Group) and the returned URL replaces the TcmUri
reference.
The Output item is rewritten with the resolved URLs.
|
Parameters
|
n/a
|
Applicable to
|
Any template where an Item called
‘Output’ exists in the Package
|
The Code
[TcmTemplateTitle("Resolve
Css Images In Output TBB")]
public class ResolveCssImagesInOutput : ITemplate {
private const string
CSS_IMG_REG_EX = @"background(-image)?:(\s)*(transparent)?(\s)*(url[\s]*\([\s]*(?<url>[^\)]*)[\s]*\)[\s]*)+";
private readonly Regex
cssImgRegEx = new Regex(CSS_IMG_REG_EX,
RegexOptions.IgnoreCase);
public void Transform(Engine
engine, Package package) {
GenericUtils
utils = new GenericUtils();
Item
outputItem = package.GetByName(Package.OutputName);
string
css = outputItem.GetAsString();
foreach (Match
match in GetBackgroundEntities(css)) {
string
uri = match.Groups["url"].Value.Replace("\"", string.Empty).Replace("'", string.Empty);
string
localUri = utils.LocalizeUri(engine, uri);
Component
imgComponent = engine.GetObject(localUri) as Component;
if
(imgComponent != null) {
Binary
binary = utils.PublishBinary(engine, package, imgComponent);
css = css.Replace(uri,
binary.Url);
}
}
outputItem.SetAsString(css);
}
private IEnumerable<Match>
GetBackgroundEntities(string css) {
return
cssImgRegEx.Matches(css).Cast<Match>().
Where(w => w.Groups["url"].Value.StartsWith("\"/webdav") ||
w.Groups["url"].Value.StartsWith("'/webdav") ||
w.Groups["url"].Value.Contains("\"tcm:") ||
w.Groups["url"].Value.Contains("'tcm:"));
}
}
Comments