mirror of
https://github.com/marko-js/marko.git
synced 2025-12-08 19:26:05 +00:00
85 lines
2.2 KiB
JavaScript
85 lines
2.2 KiB
JavaScript
'use strict';
|
|
|
|
var Node = require('../Node');
|
|
var Literal = require('../Literal');
|
|
var ok = require('assert').ok;
|
|
var compiler = require('../../');
|
|
var generateHTMLCode = require('./html/generateCode');
|
|
var generateVDOMCode = require('./vdom/generateCode');
|
|
var vdomUtil = require('../../util/vdom');
|
|
|
|
function beforeGenerateCode(event) {
|
|
event.codegen.isInAttribute = true;
|
|
}
|
|
|
|
function afterGenerateCode(event) {
|
|
event.codegen.isInAttribute = false;
|
|
}
|
|
|
|
class HtmlAttribute extends Node {
|
|
constructor(def) {
|
|
super('HtmlAttribute');
|
|
|
|
ok(def, 'Invalid attribute definition');
|
|
this.type = 'HtmlAttribute';
|
|
this.name = def.name;
|
|
this.value = def.value;
|
|
this.rawValue = def.rawValue;
|
|
this.escape = def.escape;
|
|
|
|
if (typeof this.value === 'string') {
|
|
this.value = compiler.builder.parseExpression(this.value);
|
|
}
|
|
|
|
if (this.value && !(this.value instanceof Node)) {
|
|
throw new Error('"value" should be a Node instance');
|
|
}
|
|
|
|
this.argument = def.argument;
|
|
|
|
this.def = def.def; // The attribute definition loaded from the taglib (if any)
|
|
|
|
this.on('beforeGenerateCode', beforeGenerateCode);
|
|
this.on('afterGenerateCode', afterGenerateCode);
|
|
}
|
|
|
|
generateHTMLCode(codegen) {
|
|
return generateHTMLCode(this, codegen);
|
|
}
|
|
|
|
generateVDOMCode(codegen) {
|
|
return generateVDOMCode(this, codegen, vdomUtil);
|
|
}
|
|
|
|
isLiteralValue() {
|
|
return this.value instanceof Literal;
|
|
}
|
|
|
|
isLiteralString() {
|
|
return this.isLiteralValue() &&
|
|
typeof this.value.value === 'string';
|
|
}
|
|
|
|
isLiteralBoolean() {
|
|
return this.isLiteralValue() &&
|
|
typeof this.value.value === 'boolean';
|
|
}
|
|
|
|
walk(walker) {
|
|
this.value = walker.walk(this.value);
|
|
}
|
|
|
|
get literalValue() {
|
|
if (this.isLiteralValue()) {
|
|
return this.value.value;
|
|
} else {
|
|
throw new Error('Attribute value is not a literal value. Actual: ' + JSON.stringify(this.value, null, 2));
|
|
}
|
|
}
|
|
}
|
|
|
|
HtmlAttribute.isHtmlAttribute = function(attr) {
|
|
return (attr instanceof HtmlAttribute);
|
|
};
|
|
|
|
module.exports = HtmlAttribute; |