The TBB of this week is Resolve JS Images In Output, originally written by my colleague Eric Huiza. Basically, the TBB does what the name says. It looks for certain images in the Output item and publishes them.
The images have to be in TcmUri or WebDAV format and they must appear in the url('path') format. This is the format that a CSS background selector uses, for example, only that it appears in JavaScript.
The TB transforms something like:
where the util.LocalizeUri method is the following:
The images have to be in TcmUri or WebDAV format and they must appear in the url('path') format. This is the format that a CSS background selector uses, for example, only that it appears in JavaScript.
The TB transforms something like:
document.getElementById(openingTitleId).style.background=
"url('/webdav/Content/Building Blocks/Assets/images/titlebar.gif') no-repeat";
into this:
document.getElementById(openingTitleId).style.background=
"url('/assets/images/titlebar_tcm1-2.gif') no-repeat";
Description
Name
|
Resolve JS Images In Output TBB
|
Type
|
· Template in .NET Assembly
|
Description
|
Used to:
· Resolve references to Multimedia Components
TcmUris or WebDAV URLs inside JS syntax;
· Publishe the MMC and replaces the
TcmUri/WebDAV reference with the resolved URL;
Notes:
This generic TBB uses the Output item to search for
references to MMC TcmUris (or WebDav URLs) inside JavaScript references to
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
|
Code
[TcmTemplateTitle("Resolve
JS Images In Output TBB")]
public class ResolveJsImagesInOutput : ITemplate
{
public const string
JS_IMG_REG_EX = @"(url[\s]*\([\s]*(?<url>[^\)]*)[\s]*\))+";
public readonly Regex
cssBgRegEx = new Regex(JS_IMG_REG_EX,
RegexOptions.IgnoreCase);
public void Transform(Engine
engine, Package package) {
GenericUtils
utils = new GenericUtils();
Item
outputItem = package.GetByName(Package.OutputName);
string
js = outputItem.GetAsString();
foreach
(Match match in
GetUrlEntities(js)) {
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);
js = js.Replace(uri, binary.Url);
}
}
outputItem.SetAsString(js);
}
private IEnumerable<Match>
GetUrlEntities(string js) {
return
cssBgRegEx.Matches(js).Cast<Match>().
Where(w => w.Groups["url"].Value.StartsWith("\"/webdav") ||
w.Groups["url"].Value.StartsWith("'/webdav") ||
w.Groups["url"].Value.StartsWith("\"tcm:") ||
w.Groups["url"].Value.StartsWith("'tcm:"));
}
}
where the util.LocalizeUri method is the following:
public string
LocalizeUri(Engine engine, string tcmUri) {
if (TcmUri.IsValid(tcmUri)) {
return
engine.LocalizeUri(new TcmUri(tcmUri));
} else {
return
tcmUri;
}
}
Comments