Skip to content

JST array for templates #319

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
customize JavaScriptArrayHtmlTemplatePipeline
  • Loading branch information
prabirshrestha committed Oct 4, 2012
commit 8973556d781d23cae48ce880395204692fce6f99
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,27 @@ namespace Cassette.HtmlTemplates
public class AddHtmlTemplateToJavaScriptArrayTransformers : IBundleProcessor<HtmlTemplateBundle>
{
readonly HtmlTemplateToJavaScriptTransformer.Factory createTransformer;
readonly string variableName;

public AddHtmlTemplateToJavaScriptArrayTransformers(HtmlTemplateToJavaScriptTransformer.Factory createTransformer, string variableName)
{
if (string.IsNullOrEmpty(variableName))
variableName = "JST";
/// <summary>
/// The name of the JavaScript variable to store compiled templates in.
/// For example, the default is "JST", so a template will be registered as <code>JST['my-template'] = ...;</code>.
/// </summary>
public string JavaScriptVariableName { get; set; }

public AddHtmlTemplateToJavaScriptArrayTransformers(HtmlTemplateToJavaScriptTransformer.Factory createTransformer)
{
this.createTransformer = createTransformer;
this.variableName = variableName;
}

public void Process(HtmlTemplateBundle bundle)
{
var transformer = createTransformer(this.variableName + "[{0}]={1};", bundle);
var javaScriptVariableName = JavaScriptVariableName;
if(string.IsNullOrEmpty(javaScriptVariableName))
{
javaScriptVariableName = "JST";
}

var transformer = createTransformer(javaScriptVariableName + "[{0}]={1};", bundle);
foreach (var asset in bundle.Assets)
{
asset.AddAssetTransformer(transformer);
Expand Down
20 changes: 18 additions & 2 deletions src/Cassette/HtmlTemplates/JavaScriptArrayHtmlTemplatePipeline.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,27 @@ public class JavaScriptArrayHtmlTemplatePipeline : BundlePipeline<HtmlTemplateBu
{
readonly TinyIoCContainer container;
readonly CassetteSettings settings;
readonly string javaScriptVariableName;
readonly AddHtmlTemplateToJavaScriptArrayTransformers transformer;

public JavaScriptArrayHtmlTemplatePipeline(TinyIoCContainer container, CassetteSettings settings)
: this(container, settings, "JST")
{
}

public JavaScriptArrayHtmlTemplatePipeline(TinyIoCContainer container, CassetteSettings settings, string javascriptVariableName)
: base(container)
{
if (string.IsNullOrEmpty(javascriptVariableName))
{
throw new ArgumentNullException("javascriptVariableName");
}

this.container = container;
this.settings = settings;
this.javaScriptVariableName = javascriptVariableName;
this.transformer = container.Resolve<AddHtmlTemplateToJavaScriptArrayTransformers>();

BuildPipeline();
}

Expand All @@ -31,7 +46,8 @@ void BuildPipeline()

void TransformHtmlTemplatesIntoJavaScript()
{
Add<AddHtmlTemplateToJavaScriptArrayTransformers>();
transformer.JavaScriptVariableName = javaScriptVariableName;
Add(transformer);
}

void Concatenate()
Expand All @@ -41,7 +57,7 @@ void Concatenate()

void WrapJavaScriptHtmlTemplates()
{
Add(new WrapJavaScriptArrayHtmlTemplates());
Add(new WrapJavaScriptArrayHtmlTemplates(javaScriptVariableName));
}

void MinifyIfNotDebugging()
Expand Down
14 changes: 13 additions & 1 deletion src/Cassette/HtmlTemplates/WrapJavaScriptArrayHtmlTemplates.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,24 @@ namespace Cassette.HtmlTemplates
{
public class WrapJavaScriptArrayHtmlTemplates : IBundleProcessor<HtmlTemplateBundle>
{
readonly string javaScriptVariableName;

public WrapJavaScriptArrayHtmlTemplates(string javaScriptVariableName)
{
if (string.IsNullOrEmpty(javaScriptVariableName))
{
javaScriptVariableName = "JST";
}

this.javaScriptVariableName = javaScriptVariableName;
}

public void Process(HtmlTemplateBundle bundle)
{
if (bundle.Assets.Count == 0) return;
if (bundle.Assets.Count > 1) throw new ArgumentException("WrapJavaScriptArrayHtmlTemplates should only process a bundle where the assets have been concatenated.", "bundle");

var transformer = new WrapJavaScriptArrayHtmlTemplatesTransformer(bundle.ContentType);
var transformer = new WrapJavaScriptArrayHtmlTemplatesTransformer(javaScriptVariableName);
bundle.Assets[0].AddAssetTransformer(transformer);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,37 +7,26 @@ namespace Cassette.HtmlTemplates
{
public class WrapJavaScriptArrayHtmlTemplatesTransformer : IAssetTransformer
{
readonly string contentType;
readonly string javascriptVariableName;

public WrapJavaScriptArrayHtmlTemplatesTransformer(string contentType)
public WrapJavaScriptArrayHtmlTemplatesTransformer(string javascriptVariableName)
{
this.contentType = contentType;
if (string.IsNullOrEmpty(javascriptVariableName))
{
javascriptVariableName = "JST";
}

this.javascriptVariableName = javascriptVariableName;
}

public Func<Stream> Transform(Func<Stream> openSourceStream, IAsset asset)
{
return () =>
{

var addTemplateCalls = openSourceStream().ReadToEnd();

var output = string.Format(
@"(function(d) {{
var addTemplate = function(id, content) {{
var script = d.createElement('script');
script.type = '{0}';
script.id = id;
if (typeof script.textContent !== 'undefined') {{
script.textContent = content;
}} else {{
script.innerText = content;
}}
var x = d.getElementsByTagName('script')[0];
x.parentNode.insertBefore(script, x);
}};
{1}
}}(document));",
contentType,
addTemplateCalls);
var output = string.Format(@"window.{0}=window.{0} || {{}};{1}", javascriptVariableName, addTemplateCalls);

return new MemoryStream(Encoding.UTF8.GetBytes(output));
};
Expand Down