123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- /* eslint-disable new-cap */
- import Visitor from './visitor';
- export function print(ast) {
- return new PrintVisitor().accept(ast);
- }
- export function PrintVisitor() {
- this.padding = 0;
- }
- PrintVisitor.prototype = new Visitor();
- PrintVisitor.prototype.pad = function(string) {
- let out = '';
- for (let i = 0, l = this.padding; i < l; i++) {
- out += ' ';
- }
- out += string + '\n';
- return out;
- };
- PrintVisitor.prototype.Program = function(program) {
- let out = '',
- body = program.body,
- i,
- l;
- if (program.blockParams) {
- let blockParams = 'BLOCK PARAMS: [';
- for (i = 0, l = program.blockParams.length; i < l; i++) {
- blockParams += ' ' + program.blockParams[i];
- }
- blockParams += ' ]';
- out += this.pad(blockParams);
- }
- for (i = 0, l = body.length; i < l; i++) {
- out += this.accept(body[i]);
- }
- this.padding--;
- return out;
- };
- PrintVisitor.prototype.MustacheStatement = function(mustache) {
- return this.pad('{{ ' + this.SubExpression(mustache) + ' }}');
- };
- PrintVisitor.prototype.Decorator = function(mustache) {
- return this.pad('{{ DIRECTIVE ' + this.SubExpression(mustache) + ' }}');
- };
- PrintVisitor.prototype.BlockStatement = PrintVisitor.prototype.DecoratorBlock = function(
- block
- ) {
- let out = '';
- out += this.pad(
- (block.type === 'DecoratorBlock' ? 'DIRECTIVE ' : '') + 'BLOCK:'
- );
- this.padding++;
- out += this.pad(this.SubExpression(block));
- if (block.program) {
- out += this.pad('PROGRAM:');
- this.padding++;
- out += this.accept(block.program);
- this.padding--;
- }
- if (block.inverse) {
- if (block.program) {
- this.padding++;
- }
- out += this.pad('{{^}}');
- this.padding++;
- out += this.accept(block.inverse);
- this.padding--;
- if (block.program) {
- this.padding--;
- }
- }
- this.padding--;
- return out;
- };
- PrintVisitor.prototype.PartialStatement = function(partial) {
- let content = 'PARTIAL:' + partial.name.original;
- if (partial.params[0]) {
- content += ' ' + this.accept(partial.params[0]);
- }
- if (partial.hash) {
- content += ' ' + this.accept(partial.hash);
- }
- return this.pad('{{> ' + content + ' }}');
- };
- PrintVisitor.prototype.PartialBlockStatement = function(partial) {
- let content = 'PARTIAL BLOCK:' + partial.name.original;
- if (partial.params[0]) {
- content += ' ' + this.accept(partial.params[0]);
- }
- if (partial.hash) {
- content += ' ' + this.accept(partial.hash);
- }
- content += ' ' + this.pad('PROGRAM:');
- this.padding++;
- content += this.accept(partial.program);
- this.padding--;
- return this.pad('{{> ' + content + ' }}');
- };
- PrintVisitor.prototype.ContentStatement = function(content) {
- return this.pad("CONTENT[ '" + content.value + "' ]");
- };
- PrintVisitor.prototype.CommentStatement = function(comment) {
- return this.pad("{{! '" + comment.value + "' }}");
- };
- PrintVisitor.prototype.SubExpression = function(sexpr) {
- let params = sexpr.params,
- paramStrings = [],
- hash;
- for (let i = 0, l = params.length; i < l; i++) {
- paramStrings.push(this.accept(params[i]));
- }
- params = '[' + paramStrings.join(', ') + ']';
- hash = sexpr.hash ? ' ' + this.accept(sexpr.hash) : '';
- return this.accept(sexpr.path) + ' ' + params + hash;
- };
- PrintVisitor.prototype.PathExpression = function(id) {
- let path = id.parts.join('/');
- return (id.data ? '@' : '') + 'PATH:' + path;
- };
- PrintVisitor.prototype.StringLiteral = function(string) {
- return '"' + string.value + '"';
- };
- PrintVisitor.prototype.NumberLiteral = function(number) {
- return 'NUMBER{' + number.value + '}';
- };
- PrintVisitor.prototype.BooleanLiteral = function(bool) {
- return 'BOOLEAN{' + bool.value + '}';
- };
- PrintVisitor.prototype.UndefinedLiteral = function() {
- return 'UNDEFINED';
- };
- PrintVisitor.prototype.NullLiteral = function() {
- return 'NULL';
- };
- PrintVisitor.prototype.Hash = function(hash) {
- let pairs = hash.pairs,
- joinedPairs = [];
- for (let i = 0, l = pairs.length; i < l; i++) {
- joinedPairs.push(this.accept(pairs[i]));
- }
- return 'HASH{' + joinedPairs.join(', ') + '}';
- };
- PrintVisitor.prototype.HashPair = function(pair) {
- return pair.key + '=' + this.accept(pair.value);
- };
- /* eslint-enable new-cap */
|