text: '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;