Fixes #479 - Provide ability to relax required comma for certain tags such as the <import> tag

This commit is contained in:
Patrick Steele-Idem 2016-12-21 20:32:30 -07:00
parent 93a480a93a
commit b7b15e4eb1
5 changed files with 81 additions and 46 deletions

View File

@ -35,17 +35,23 @@ class HtmlJsParser {
handlers.handleCharacters(event.value, 'static-text');
},
onOpenTagName(event, parser) {
event.selfClosed = false; // Don't allow self-closed tags
var tagParseOptions = handlers.getTagParseOptions(event);
if (tagParseOptions) {
event.setParseOptions(tagParseOptions);
}
},
onOpenTag(event, parser) {
event.selfClosed = false; // Don't allow self-closed tags
handlers.handleStartElement(event, parser);
var newParserState = handlers.getParserStateForTag(event);
if (newParserState) {
if (newParserState === 'parsed-text') {
parser.enterParsedTextContentState();
} else if (newParserState === 'static-text') {
parser.enterStaticTextContentState();
}
var tagParseOptions = handlers.getTagParseOptions(event);
if (tagParseOptions) {
event.setParseOptions(tagParseOptions);
}
},

View File

@ -1,6 +1,7 @@
'use strict';
var ok = require('assert').ok;
var replacePlaceholderEscapeFuncs = require('./util/replacePlaceholderEscapeFuncs');
var extend = require('raptor-util/extend');
var COMPILER_ATTRIBUTE_HANDLERS = {
'preserve-whitespace': function(attr, context) {
@ -50,6 +51,48 @@ function mergeShorthandClassNames(el, shorthandClassNames, context) {
}
}
function getParserStateForTag(parser, el, tagDef) {
var attributes = el.attributes;
if (attributes) {
for (var i=0; i<attributes.length; i++) {
var attr = attributes[i];
var attrName = attr.name;
if (attrName === 'marko-body') {
var parseMode;
if (attr.literalValue) {
parseMode = attr.literalValue;
}
if (parseMode === 'static-text' ||
parseMode === 'parsed-text' ||
parseMode === 'html') {
return parseMode;
} else {
parser.context.addError({
message: 'Value for "marko-body" should be one of the following: "static-text", "parsed-text", "html"',
code: 'ERR_INVALID_ATTR'
});
return;
}
} else if (attrName === 'template-helpers') {
return 'static-text';
} else if (attrName === 'marko-init') {
return 'static-text';
}
}
}
if (tagDef) {
var body = tagDef.body;
if (body) {
return body; // 'parsed-text' | 'static-text' | 'html'
}
}
return null; // Default parse state
}
class Parser {
constructor(parserImpl, options) {
ok(parserImpl, '"parserImpl" is required');
@ -337,48 +380,27 @@ class Parser {
return last.node;
}
getParserStateForTag(el) {
var attributes = el.attributes;
for (var i=0; i<attributes.length; i++) {
var attr = attributes[i];
var attrName = attr.name;
if (attrName === 'marko-body') {
var parseMode;
if (attr.literalValue) {
parseMode = attr.literalValue;
}
if (parseMode === 'static-text' ||
parseMode === 'parsed-text' ||
parseMode === 'html') {
return parseMode;
} else {
this.context.addError({
message: 'Value for "marko-body" should be one of the following: "static-text", "parsed-text", "html"',
code: 'ERR_INVALID_ATTR'
});
return;
}
} else if (attrName === 'template-helpers') {
return 'static-text';
} else if (attrName === 'marko-init') {
return 'static-text';
}
}
getTagParseOptions(el) {
var tagName = el.tagName;
var tagDef = this.context.getTagDef(tagName);
if (tagDef) {
var body = tagDef.body;
if (body) {
return body; // 'parsed-text' | 'static-text' | 'html'
}
var state = getParserStateForTag(this, el, tagDef);
var parseOptions = tagDef && tagDef.parseOptions;
if (!state && !parseOptions) {
return;
}
return null; // Default parse state
if (parseOptions) {
if (state) {
// We need to merge in the state to the returned parse options
parseOptions = extend({ state: state }, parseOptions);
}
} else {
parseOptions = { state: state };
}
return parseOptions;
}
isOpenTagOnly(tagName) {

View File

@ -619,6 +619,10 @@ class TagLoader {
autocomplete(value) {
this.tag.autocomplete = value;
}
parseOptions(value) {
this.tag.parseOptions = value;
}
}
function isSupportedProperty(name) {

View File

@ -59,7 +59,7 @@
"events": "^1.0.2",
"events-light": "^1.0.0",
"he": "^1.1.0",
"htmljs-parser": "^1.5.3",
"htmljs-parser": "^2.0.0",
"lasso-modules-client": "^1.0.0",
"lasso-package-root": "^1.0.0",
"listener-tracker": "^2.0.0",

View File

@ -76,7 +76,10 @@
]
},
"<import>": {
"code-generator": "./import-tag"
"code-generator": "./import-tag",
"parse-options": {
"relaxRequireCommas": true
}
},
"<include>": {
"renderer": "./include-tag",