@mpxjs/webpack-plugin
Version:
mpx compile core
41 lines (37 loc) • 1.06 kB
JavaScript
const Parser = require('fastparse')
const 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,
name,
tag: this.currentTag
})
}
const 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
}