avalon-loader
Version:
A single-file webpack loader for avalon.js
45 lines (41 loc) • 1.16 kB
JavaScript
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var Parser = require( 'fastparse' );
var processMatch = function ( match, strUntilValue, name, value, index ) {
if ( !this.isRelevantTagAttr( this.currentTag, name ) ) {
return;
}
this.results.push( {
start: index + strUntilValue.length,
length: value.length,
value: value
} );
};
var parser = new Parser( {
outside: {
'<!--.*?-->': true,
'<![CDATA[.*?]]>': true,
'<[!\\?].*?>': true,
'<\/[^>]+>': true,
'<([a-zA-Z\\-:]+)\\s*': function ( match, tagName ) {
this.currentTag = tagName;
return 'inside';
}
},
inside: {
'\\s+': true, // eat up whitespace
'>': 'outside', // end of attributes
'(([0-9a-zA-Z\\-:\.]+)\\s*=\\s*")([^"]*)"': processMatch,
'(([0-9a-zA-Z\\-:\.]+)\\s*=\\s*\')([^\']*)\'': processMatch,
'(([0-9a-zA-Z\\-:\.]+)\\s*=\\s*)([^\\s>]+)': processMatch
}
} );
module.exports = function parse( html, isRelevantTagAttr ) {
return parser.parse( 'outside', html, {
currentTag: null,
results: [],
isRelevantTagAttr: isRelevantTagAttr
} ).results;
};