Accept multiple assignment join regexps
authorDuncan Beevers <duncan@dweebd.com>
Sat, 26 Jul 2014 22:39:57 +0000 (17:39 -0500)
committerDuncan Beevers <duncan@dweebd.com>
Sat, 26 Jul 2014 23:08:30 +0000 (18:08 -0500)
src/htmlparser.js

index e33368f..ef0053b 100644 (file)
   'use strict';
 
   // Regular Expressions for parsing tags and attributes
-  var startTagOpen = /^<([\w:-]+)/,
-      startTagAttrs = /(?:\s*[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*/,
-      startTagClose = /\s*(\/?)>/,
-      endTag = /^<\/([\w:-]+)[^>]*>/,
-      endingSlash = /\/>$/,
-      singleAttrIdentifier = /([\w:-]+)/,
+  var singleAttrIdentifier = /([\w:-]+)/,
       singleAttrAssign = /=/,
+      singleAttrAssigns = [ singleAttrAssign ],
       singleAttrValues = [
         /"((?:\\.|[^"])*)"/.source, // attr value double quotes
         /'((?:\\.|[^'])*)'/.source, // attr value, single quotes
         /([^>\s]+)/.source          // attr value, no quotes
       ],
+      startTagOpen = /^<([\w:-]+)/,
+      startTagClose = /\s*(\/?)>/,
+      endTag = /^<\/([\w:-]+)[^>]*>/,
+      endingSlash = /\/>$/,
       doctype = /^<!DOCTYPE [^>]+>/i,
       startIgnore = /<(%|\?)/,
       endIgnore = /(%|\?)>/;
   function startTagForHandler( handler ) {
     var customStartTagAttrs;
 
+    var startTagAttrs = new RegExp(
+        '(?:\\s*[\\w:-]+'
+      +   '(?:\\s*'
+      +     '(?:' + joinSingleAttrAssigns(handler) + ')'
+      +     '\\s*(?:(?:"[^"]*")|(?:\'[^\']*\')|[^>\\s]+)'
+      +   ')?'
+      + ')*'
+    );
+
     if ( handler.customAttrSurround ) {
       var attrClauses = [];
 
     var singleAttr = new RegExp(
       singleAttrIdentifier.source
       + '(?:\\s*'
-      + '('
-      + singleAttrAssign.source
-      + ')'
+      + '(' + joinSingleAttrAssigns( handler ) + ')'
       + '\\s*'
       + '(?:'
       + singleAttrValues.join('|')
     }
   }
 
+  function joinSingleAttrAssigns( handler ) {
+    return singleAttrAssigns.concat(
+      handler.customAttrAssign || []
+    ).map(function (assign) {
+      return '(?:' + assign.source + ')';
+    }).join('|');
+  }
 
   var HTMLParser = global.HTMLParser = function( html, handler ) {
     var index, chars, match, stack = [], last = html, prevTag, nextTag;