title: gulp-browserify error during compilation of jade in html
body: <p><strong>Sorry for possible mistakes in the writing - use the Google translator.</strong><br>
  I use the <a href="https://github.com/deepak1556/gulp-browserify" rel="nofollow"><strong>gulp-browserify</strong></a> </p>
  
  <p><strong>gulpfile.js</strong> -</p>
  
  <pre><code>gulp.task('jade', function(){
      gulp.src('app/src/*.jade')
      .pipe(plumber(/*{ErrorHandler: notify.onError("&lt;% error.massage %&gt;")}*/))
      .pipe(browserify({
          transform: ['jadeify'],
          extension: ['.jade']
      }))
      .pipe(rename('*.html'))
      .pipe(gulp.dest('app/dev'))
  })
  </code></pre>
  
  <p><strong>error</strong> -  </p>
  
  <blockquote>
    <p>[14:20:53] Plumber found unhandled error: SyntaxError in plugin 'gulp-browserify'
    /home/acopalipsis/proj/app/src/fake_723954d4.js:1<br>
     doctype html<br>
            ^ ParseError: Unexpected identifie</p>
  </blockquote>
  
  <p><strong>index.jade</strong> -</p>
  
  <pre><code>doctype html
  html(lang="en")
  head
      meta(charset="UTF-8")
          title Test
  body
  </code></pre>
  
  <p>Why the error? How to fix?</p>
  
  <p><strong>***********************************ADDED***********************************</strong><br>
   Made -  </p>
  
  <pre><code>gulp.task('jade', function(){
      browserify(['./app/src/index.jade'])
      .transform(jadeify)
      .bundle({debug:false})
      .pipe(source('index.html'))
      .pipe(gulp.dest('app/dev'))
  })
  </code></pre>
  
  <p>But the generated html consists of 224 js code... Why?<br>
  If you want to display this code, tell me, I'll show!<br>
  <strong>***********************************ADDED-PART-TWO***********************************</strong><br>
  index.html after the task execution -<br>
  And if I understand Your words, that this code is designed to display index.jade in the browser? But in the browser when opening index.html displays only the code is written below.</p>
  
  <pre><code>(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&amp;&amp;require;if(!u&amp;&amp;a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&amp;&amp;require;for(var o=0;o&lt;r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
  var jade = require("jade/runtime");
  
  module.exports = function template(locals) {
  var buf = [];
  var jade_mixins = {};
  var jade_interp;
  
  buf.push("&lt;!DOCTYPE html&gt;&lt;html lang=\"en\"&gt;&lt;/html&gt;&lt;head&gt;&lt;meta charset=\"UTF-8\"&gt;&lt;title&gt;Test&lt;/title&gt;&lt;/head&gt;&lt;body&gt;&lt;/body&gt;");;return buf.join("");
  };
  },{"jade/runtime":2}],2:[function(require,module,exports){
  (function (global){
  !function(e){if("object"==typeof exports)module.exports=e();else if("function"==typeof define&amp;&amp;define.amd)define(e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&amp;&amp;(f=self),f.jade=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&amp;&amp;require;if(!u&amp;&amp;a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&amp;&amp;require;for(var o=0;o&lt;r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
  'use strict';
  
  /**
   * Merge two attribute objects giving precedence
   * to values in object `b`. Classes are special-cased
   * allowing for arrays and merging/joining appropriately
   * resulting in a string.
   *
   * @param {Object} a
   * @param {Object} b
   * @return {Object} a
   * @api private
   */
  
  exports.merge = function merge(a, b) {
    if (arguments.length === 1) {
      var attrs = a[0];
      for (var i = 1; i &lt; a.length; i++) {
        attrs = merge(attrs, a[i]);
      }
      return attrs;
    }
    var ac = a['class'];
    var bc = b['class'];
  
    if (ac || bc) {
      ac = ac || [];
      bc = bc || [];
      if (!Array.isArray(ac)) ac = [ac];
      if (!Array.isArray(bc)) bc = [bc];
      a['class'] = ac.concat(bc).filter(nulls);
    }
  
    for (var key in b) {
      if (key != 'class') {
        a[key] = b[key];
      }
    }
  
    return a;
  };
  
  /**
   * Filter null `val`s.
   *
   * @param {*} val
   * @return {Boolean}
   * @api private
   */
  
  function nulls(val) {
    return val != null &amp;&amp; val !== '';
  }
  
  /**
   * join array as classes.
   *
   * @param {*} val
   * @return {String}
   */
  exports.joinClasses = joinClasses;
  function joinClasses(val) {
    return Array.isArray(val) ? val.map(joinClasses).filter(nulls).join(' ') : val;
  }
  
  /**
   * Render the given classes.
   *
   * @param {Array} classes
   * @param {Array.&lt;Boolean&gt;} escaped
   * @return {String}
   */
  exports.cls = function cls(classes, escaped) {
    var buf = [];
    for (var i = 0; i &lt; classes.length; i++) {
      if (escaped &amp;&amp; escaped[i]) {
        buf.push(exports.escape(joinClasses([classes[i]])));
      } else {
        buf.push(joinClasses(classes[i]));
      }
    }
    var text = joinClasses(buf);
    if (text.length) {
      return ' class="' + text + '"';
    } else {
      return '';
    }
  };
  
  /**
   * Render the given attribute.
   *
   * @param {String} key
   * @param {String} val
   * @param {Boolean} escaped
   * @param {Boolean} terse
   * @return {String}
   */
  exports.attr = function attr(key, val, escaped, terse) {
    if ('boolean' == typeof val || null == val) {
      if (val) {
        return ' ' + (terse ? key : key + '="' + key + '"');
      } else {
        return '';
      }
    } else if (0 == key.indexOf('data') &amp;&amp; 'string' != typeof val) {
      return ' ' + key + "='" + JSON.stringify(val).replace(/'/g, '&amp;apos;') + "'";
    } else if (escaped) {
      return ' ' + key + '="' + exports.escape(val) + '"';
    } else {
      return ' ' + key + '="' + val + '"';
    }
  };
  
  /**
   * Render the given attributes object.
   *
   * @param {Object} obj
   * @param {Object} escaped
   * @return {String}
   */
  exports.attrs = function attrs(obj, terse){
    var buf = [];
  
    var keys = Object.keys(obj);
  
    if (keys.length) {
      for (var i = 0; i &lt; keys.length; ++i) {
        var key = keys[i]
          , val = obj[key];
  
        if ('class' == key) {
          if (val = joinClasses(val)) {
            buf.push(' ' + key + '="' + val + '"');
          }
        } else {
          buf.push(exports.attr(key, val, false, terse));
        }
      }
    }
  
    return buf.join('');
  };
  
  /**
   * Escape the given string of `html`.
   *
   * @param {String} html
   * @return {String}
   * @api private
   */
  
  exports.escape = function escape(html){
    var result = String(html)
      .replace(/&amp;/g, '&amp;amp;')
      .replace(/&lt;/g, '&amp;lt;')
      .replace(/&gt;/g, '&amp;gt;')
      .replace(/"/g, '&amp;quot;');
    if (result === '' + html) return html;
    else return result;
  };
  
  /**
   * Re-throw the given `err` in context to the
   * the jade in `filename` at the given `lineno`.
   *
   * @param {Error} err
   * @param {String} filename
   * @param {String} lineno
   * @api private
   */
  
  exports.rethrow = function rethrow(err, filename, lineno, str){
    if (!(err instanceof Error)) throw err;
    if ((typeof window != 'undefined' || !filename) &amp;&amp; !str) {
      err.message += ' on line ' + lineno;
      throw err;
    }
    try {
      str = str || _dereq_('fs').readFileSync(filename, 'utf8')
    } catch (ex) {
      rethrow(err, null, lineno)
    }
    var context = 3
      , lines = str.split('\n')
      , start = Math.max(lineno - context, 0)
      , end = Math.min(lines.length, lineno + context);
  
    // Error context
    var context = lines.slice(start, end).map(function(line, i){
      var curr = i + start + 1;
      return (curr == lineno ? '  &gt; ' : '    ')
        + curr
        + '| '
        + line;
    }).join('\n');
  
    // Alter exception message
    err.path = filename;
    err.message = (filename || 'Jade') + ':' + lineno
      + '\n' + context + '\n\n' + err.message;
    throw err;
  };
  
  },{"fs":2}],2:[function(_dereq_,module,exports){
  
  },{}]},{},[1])
  (1)
  });
  }).call(this,typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
  },{}]},{},[1])
  </code></pre>