|
|
- var assert = require('assert');
- var recast = require('recast');
- var types = recast.types;
- var PathVisitor = types.PathVisitor;
- var n = types.namedTypes;
- var b = types.builders;
-
- function Visitor() {
- PathVisitor.apply(this, arguments);
- }
- Visitor.prototype = Object.create(PathVisitor.prototype);
- Visitor.prototype.constructor = Visitor;
-
- /**
- * Visits a template literal, replacing it with a series of string
- * concatenations. For example, given:
- *
- * ```js
- * `1 + 1 = ${1 + 1}`
- * ```
- *
- * The following output will be generated:
- *
- * ```js
- * "1 + 1 = " + (1 + 1)
- * ```
- *
- * @param {NodePath} path
- * @returns {AST.Literal|AST.BinaryExpression}
- */
- Visitor.prototype.visitTemplateLiteral = function(path) {
- var node = path.node;
- var replacement = b.literal(node.quasis[0].value.cooked);
-
- for (var i = 1, length = node.quasis.length; i < length; i++) {
- replacement = b.binaryExpression(
- '+',
- b.binaryExpression(
- '+',
- replacement,
- node.expressions[i - 1]
- ),
- b.literal(node.quasis[i].value.cooked)
- );
- }
-
- return replacement;
- };
-
- /**
- * Visits the path wrapping a TaggedTemplateExpression node, which has the form
- *
- * ```js
- * htmlEncode `<span id=${id}>${text}</span>`
- * ```
- *
- * @param {NodePath} path
- * @returns {AST.CallExpression}
- */
- Visitor.prototype.visitTaggedTemplateExpression = function(path) {
- var node = path.node;
- var args = [];
- var strings = b.callExpression(
- b.functionExpression(
- null,
- [],
- b.blockStatement([
- b.variableDeclaration(
- 'var',
- [
- b.variableDeclarator(
- b.identifier('strings'),
- b.arrayExpression(node.quasi.quasis.map(function(quasi) {
- return b.literal(quasi.value.cooked);
- }))
- )
- ]
- ),
- b.expressionStatement(b.assignmentExpression(
- '=',
- b.memberExpression(b.identifier('strings'), b.identifier('raw'), false),
- b.arrayExpression(node.quasi.quasis.map(function(quasi) {
- return b.literal(quasi.value.raw);
- }))
- )),
- b.returnStatement(b.identifier('strings'))
- ])
- ),
- []
- );
-
- args.push(strings);
- args.push.apply(args, node.quasi.expressions);
-
- return b.callExpression(
- node.tag,
- args
- );
- };
-
- Visitor.visitor = new Visitor();
- module.exports = Visitor;
|