| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- /*jshint node:true */
- /*
- The MIT License (MIT)
- Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.
- Permission is hereby granted, free of charge, to any person
- obtaining a copy of this software and associated documentation files
- (the "Software"), to deal in the Software without restriction,
- including without limitation the rights to use, copy, modify, merge,
- publish, distribute, sublicense, and/or sell copies of the Software,
- and to permit persons to whom the Software is furnished to do so,
- subject to the following conditions:
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
- */
- 'use strict';
- var Pattern = require('./pattern').Pattern;
- var template_names = {
- django: false,
- erb: false,
- handlebars: false,
- php: false
- };
- // This lets templates appear anywhere we would do a readUntil
- // The cost is higher but it is pay to play.
- function TemplatablePattern(input_scanner, parent) {
- Pattern.call(this, input_scanner, parent);
- this.__template_pattern = null;
- this._disabled = Object.assign({}, template_names);
- this._excluded = Object.assign({}, template_names);
- if (parent) {
- this.__template_pattern = this._input.get_regexp(parent.__template_pattern);
- this._excluded = Object.assign(this._excluded, parent._excluded);
- this._disabled = Object.assign(this._disabled, parent._disabled);
- }
- var pattern = new Pattern(input_scanner);
- this.__patterns = {
- handlebars_comment: pattern.starting_with(/{{!--/).until_after(/--}}/),
- handlebars_unescaped: pattern.starting_with(/{{{/).until_after(/}}}/),
- handlebars: pattern.starting_with(/{{/).until_after(/}}/),
- php: pattern.starting_with(/<\?(?:[=]|php)/).until_after(/\?>/),
- erb: pattern.starting_with(/<%[^%]/).until_after(/[^%]%>/),
- // django coflicts with handlebars a bit.
- django: pattern.starting_with(/{%/).until_after(/%}/),
- django_value: pattern.starting_with(/{{/).until_after(/}}/),
- django_comment: pattern.starting_with(/{#/).until_after(/#}/)
- };
- }
- TemplatablePattern.prototype = new Pattern();
- TemplatablePattern.prototype._create = function() {
- return new TemplatablePattern(this._input, this);
- };
- TemplatablePattern.prototype._update = function() {
- this.__set_templated_pattern();
- };
- TemplatablePattern.prototype.disable = function(language) {
- var result = this._create();
- result._disabled[language] = true;
- result._update();
- return result;
- };
- TemplatablePattern.prototype.read_options = function(options) {
- var result = this._create();
- for (var language in template_names) {
- result._disabled[language] = options.templating.indexOf(language) === -1;
- }
- result._update();
- return result;
- };
- TemplatablePattern.prototype.exclude = function(language) {
- var result = this._create();
- result._excluded[language] = true;
- result._update();
- return result;
- };
- TemplatablePattern.prototype.read = function() {
- var result = '';
- if (this._match_pattern) {
- result = this._input.read(this._starting_pattern);
- } else {
- result = this._input.read(this._starting_pattern, this.__template_pattern);
- }
- var next = this._read_template();
- while (next) {
- if (this._match_pattern) {
- next += this._input.read(this._match_pattern);
- } else {
- next += this._input.readUntil(this.__template_pattern);
- }
- result += next;
- next = this._read_template();
- }
- if (this._until_after) {
- result += this._input.readUntilAfter(this._until_pattern);
- }
- return result;
- };
- TemplatablePattern.prototype.__set_templated_pattern = function() {
- var items = [];
- if (!this._disabled.php) {
- items.push(this.__patterns.php._starting_pattern.source);
- }
- if (!this._disabled.handlebars) {
- items.push(this.__patterns.handlebars._starting_pattern.source);
- }
- if (!this._disabled.erb) {
- items.push(this.__patterns.erb._starting_pattern.source);
- }
- if (!this._disabled.django) {
- items.push(this.__patterns.django._starting_pattern.source);
- items.push(this.__patterns.django_value._starting_pattern.source);
- items.push(this.__patterns.django_comment._starting_pattern.source);
- }
- if (this._until_pattern) {
- items.push(this._until_pattern.source);
- }
- this.__template_pattern = this._input.get_regexp('(?:' + items.join('|') + ')');
- };
- TemplatablePattern.prototype._read_template = function() {
- var resulting_string = '';
- var c = this._input.peek();
- if (c === '<') {
- var peek1 = this._input.peek(1);
- //if we're in a comment, do something special
- // We treat all comments as literals, even more than preformatted tags
- // we just look for the appropriate close tag
- if (!this._disabled.php && !this._excluded.php && peek1 === '?') {
- resulting_string = resulting_string ||
- this.__patterns.php.read();
- }
- if (!this._disabled.erb && !this._excluded.erb && peek1 === '%') {
- resulting_string = resulting_string ||
- this.__patterns.erb.read();
- }
- } else if (c === '{') {
- if (!this._disabled.handlebars && !this._excluded.handlebars) {
- resulting_string = resulting_string ||
- this.__patterns.handlebars_comment.read();
- resulting_string = resulting_string ||
- this.__patterns.handlebars_unescaped.read();
- resulting_string = resulting_string ||
- this.__patterns.handlebars.read();
- }
- if (!this._disabled.django) {
- // django coflicts with handlebars a bit.
- if (!this._excluded.django && !this._excluded.handlebars) {
- resulting_string = resulting_string ||
- this.__patterns.django_value.read();
- }
- if (!this._excluded.django) {
- resulting_string = resulting_string ||
- this.__patterns.django_comment.read();
- resulting_string = resulting_string ||
- this.__patterns.django.read();
- }
- }
- }
- return resulting_string;
- };
- module.exports.TemplatablePattern = TemplatablePattern;
|