mirror of
https://github.com/marko-js/marko.git
synced 2025-12-08 19:26:05 +00:00
Fixes #408 - Allow transformer to be registered at the template level
This commit is contained in:
parent
478211856e
commit
a35e6bdbc3
@ -45,6 +45,12 @@ function transformTreeHelper(node, context) {
|
||||
}
|
||||
|
||||
function transformTree(rootNode, context) {
|
||||
|
||||
context.taglibLookup.forEachTemplateTransformer((transformer) => {
|
||||
var transformFunc = transformer.getFunc();
|
||||
rootNode = transformFunc(rootNode, context) || rootNode;
|
||||
});
|
||||
|
||||
/*
|
||||
* The tree is continuously transformed until we go through an entire pass where
|
||||
* there were no new nodes that needed to be transformed. This loop makes sure that
|
||||
|
||||
@ -50,6 +50,7 @@ class Taglib {
|
||||
this.dirname = null;
|
||||
this.tags = {};
|
||||
this.textTransformers = [];
|
||||
this.transformers = [];
|
||||
this.attributes = {};
|
||||
this.patternAttributes = [];
|
||||
this.inputFilesLookup = {};
|
||||
@ -91,6 +92,9 @@ class Taglib {
|
||||
addTextTransformer(transformer) {
|
||||
this.textTransformers.push(transformer);
|
||||
}
|
||||
addTransformer(transformer) {
|
||||
this.transformers.push(transformer);
|
||||
}
|
||||
forEachTag(callback, thisObj) {
|
||||
forEachEntry(this.tags, function (key, tag) {
|
||||
callback.call(thisObj, tag);
|
||||
|
||||
@ -301,6 +301,33 @@ class TaglibLoader {
|
||||
var taglib = this.taglib;
|
||||
taglib.id = value;
|
||||
}
|
||||
|
||||
transformer(value) {
|
||||
// Marko allows a "text-transformer" to be registered. The provided
|
||||
// text transformer will be called for any static text found in a template.
|
||||
var taglib = this.taglib;
|
||||
var dirname = this.dirname;
|
||||
|
||||
var transformer = new Taglib.Transformer();
|
||||
|
||||
if (typeof value === 'string') {
|
||||
value = {
|
||||
path: value
|
||||
};
|
||||
}
|
||||
|
||||
propertyHandlers(value, {
|
||||
path(value) {
|
||||
var path = resolve(value, dirname);
|
||||
transformer.path = path;
|
||||
}
|
||||
|
||||
}, this.dependencyChain.append('transformer').toString());
|
||||
|
||||
ok(transformer.path, '"path" is required for transformer');
|
||||
|
||||
taglib.addTransformer(transformer);
|
||||
}
|
||||
}
|
||||
|
||||
exports.loadTaglib = function(filePath, taglib, dependencyChain) {
|
||||
|
||||
@ -143,6 +143,7 @@ class TaglibLookup {
|
||||
|
||||
merge(this.merged, {
|
||||
tags: taglib.tags,
|
||||
transformers: taglib.transformers,
|
||||
textTransformers: taglib.textTransformers,
|
||||
attributes: taglib.attributes,
|
||||
patternAttributes: taglib.patternAttributes
|
||||
@ -286,6 +287,13 @@ class TaglibLookup {
|
||||
return attrDef;
|
||||
}
|
||||
|
||||
forEachTemplateTransformer(callback, thisObj) {
|
||||
var transformers = this.merged.transformers;
|
||||
if (transformers && transformers.length) {
|
||||
transformers.forEach(callback, thisObj);
|
||||
}
|
||||
}
|
||||
|
||||
forEachNodeTransformer(node, callback, thisObj) {
|
||||
/*
|
||||
* Based on the type of node we have to choose how to transform it
|
||||
@ -332,7 +340,7 @@ class TaglibLookup {
|
||||
this.merged.tags[tagName].forEachTransformer(addTransformer);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (this.merged.tags['*']) {
|
||||
this.merged.tags['*'].forEachTransformer(addTransformer);
|
||||
}
|
||||
|
||||
6
test/autotests/render/template-transformer/expected.html
Normal file
6
test/autotests/render/template-transformer/expected.html
Normal file
@ -0,0 +1,6 @@
|
||||
<!--BEGIN: template.marko-->
|
||||
<div>
|
||||
<h1>Outer</h1>
|
||||
<!--BEGIN: template-a.marko--><div><h1>Template A</h1></div><!--END: template-a.marko-->
|
||||
<!--BEGIN: template-b.marko--><div><h1>Template B</h1></div><!--END: template-b.marko-->
|
||||
</div><!--END: template.marko-->
|
||||
3
test/autotests/render/template-transformer/marko.json
Normal file
3
test/autotests/render/template-transformer/marko.json
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"transformer": "./transformer"
|
||||
}
|
||||
@ -0,0 +1,3 @@
|
||||
<div>
|
||||
<h1>Template A</h1>
|
||||
</div>
|
||||
@ -0,0 +1,3 @@
|
||||
<div>
|
||||
<h1>Template B</h1>
|
||||
</div>
|
||||
@ -0,0 +1,6 @@
|
||||
<marko-compiler-options preserve-whitespace />
|
||||
<div>
|
||||
<h1>Outer</h1>
|
||||
<include('./template-a.marko')/>
|
||||
<include('./template-b.marko')/>
|
||||
</div>
|
||||
10
test/autotests/render/template-transformer/transformer.js
Normal file
10
test/autotests/render/template-transformer/transformer.js
Normal file
@ -0,0 +1,10 @@
|
||||
var path = require('path');
|
||||
|
||||
module.exports = function(rootNode, context) {
|
||||
var builder = context.builder;
|
||||
|
||||
var templateName = path.basename(context.filename);
|
||||
|
||||
rootNode.prependChild(builder.htmlComment(builder.literal('BEGIN: ' + templateName)));
|
||||
rootNode.appendChild(builder.htmlComment(builder.literal('END: ' + templateName)));
|
||||
};
|
||||
Loading…
x
Reference in New Issue
Block a user