mirror of
https://github.com/marko-js/marko.git
synced 2025-12-08 19:26:05 +00:00
Fixes #479 - Provide ability to relax required comma for certain tags such as the <import> tag
This commit is contained in:
parent
93a480a93a
commit
b7b15e4eb1
@ -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);
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -619,6 +619,10 @@ class TagLoader {
|
||||
autocomplete(value) {
|
||||
this.tag.autocomplete = value;
|
||||
}
|
||||
|
||||
parseOptions(value) {
|
||||
this.tag.parseOptions = value;
|
||||
}
|
||||
}
|
||||
|
||||
function isSupportedProperty(name) {
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -76,7 +76,10 @@
|
||||
]
|
||||
},
|
||||
"<import>": {
|
||||
"code-generator": "./import-tag"
|
||||
"code-generator": "./import-tag",
|
||||
"parse-options": {
|
||||
"relaxRequireCommas": true
|
||||
}
|
||||
},
|
||||
"<include>": {
|
||||
"renderer": "./include-tag",
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user