module.exports = grammar({
name: 'html',
externals: $ => [
$._open_start_tag,
$._close_start_tag,
$._self_close_start_tag,
$.end_tag,
$._implicit_end_tag,
$._erroneous_end_tag,
],
rules: {
fragment: $ => repeat($._node),
_node: $ => choice(
$.text,
$._erroneous_end_tag,
$.element
),
element: $ => choice(
seq(
$.start_tag,
repeat($._node),
choice($.end_tag, $._implicit_end_tag)
),
$.self_closing_tag
),
start_tag: $ => seq(
$._open_start_tag,
repeat($.attribute),
$._close_start_tag
),
self_closing_tag: $ => seq(
$._open_start_tag,
repeat($.attribute),
$._self_close_start_tag
),
attribute: $ => seq(
alias($._attribute_part, $.attribute_name),
optional(seq(
'=',
choice(
alias($._attribute_part, $.attribute_value),
$.quoted_attribute_value
)
))
),
_attribute_part: $ => /[^<>"'/=\s]+/,
quoted_attribute_value: $ => choice(
seq("'", optional(alias(/[^']+/, $.attribute_value)), "'"),
seq('"', optional(alias(/[^"]+/, $.attribute_value)), '"')
),
text: $ => /[^<>]+/
}
});