Skip to content

Commit

Permalink
WIP group directives
Browse files Browse the repository at this point in the history
  • Loading branch information
the-mikedavis committed Nov 12, 2022
1 parent 52b804b commit da2b726
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 31 deletions.
51 changes: 37 additions & 14 deletions grammar.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,15 @@ module.exports = grammar({
fragment: ($) => repeat($._node),

_node: ($) =>
choice($.doctype, $.tag, $.component, $.text, $.comment, $.directive),
choice(
$.doctype,
$.tag,
$.component,
$.text,
$.comment,
$.directive_group,
$.directive
),

doctype: ($) => seq("<!", "DOCTYPE", "html", ">"),

Expand Down Expand Up @@ -121,14 +129,21 @@ module.exports = grammar({
seq('"', optional(alias(/[^"]+/, $.attribute_value)), '"')
),

directive: ($) =>
directive_group: ($) =>
seq(
choice("<%", "<%=", "<%%", "<%%="),
prec.left(
seq(choice($.partial_expression_value, $.expression_value), "%>")
)
alias($._partial_directive, $.directive),
repeat(
prec.left(choice(alias($._partial_directive, $.directive), $._node))
),
alias($._ending_directive, $.directive)
),

_ending_directive: ($) => directive($.ending_expression_value),

_partial_directive: ($) => directive($.partial_expression_value),

directive: ($) => directive($.expression_value),

comment: ($) => choice($._html_comment, $._bang_comment, $._hash_comment),

_html_comment: ($) => seq("<!--", prec.left(seq(repeat(/[^-]+|-/), "-->"))),
Expand All @@ -140,16 +155,13 @@ module.exports = grammar({

expression_value: ($) => repeat1($._code),

ending_expression_value: ($) => seq(/end[\)\]\}]*/, repeat($._code)),

partial_expression_value: ($) =>
seq(
choice(
seq(/end[\)\]\}]*/, repeat($._code)),
seq(
repeat($._code),
choice("do", "->"),
optional(seq("#", repeat($._code)))
)
)
repeat($._code),
choice("do", "->"),
optional(seq("#", repeat($._code)))
),

component_name: ($) =>
Expand All @@ -168,3 +180,14 @@ module.exports = grammar({
text: ($) => /[^<>{}\s]([^<>{}]*[^<>{}\s])?/,
},
});

function directive(expression) {
return seq(
choice("<%", "<%=", "<%%", "<%%="),
prec.left(seq(expression, "%>"))
);
}

function sep1(rule, separator) {
return seq(rule, repeat(seq(separator, rule)));
}
58 changes: 41 additions & 17 deletions test/corpus/directives.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,13 @@ If expression spread between multiple directives
--------------------------------------------------------------------------------

(fragment
(directive
(partial_expression_value))
(directive
(expression_value))
(directive
(partial_expression_value)))
(directive_group
(directive
(partial_expression_value))
(directive
(expression_value))
(directive
(ending_expression_value))))

================================================================================
Case expression spread between multiple directives
Expand All @@ -28,15 +29,38 @@ Case expression spread between multiple directives
--------------------------------------------------------------------------------

(fragment
(directive_group
(directive
(partial_expression_value))
(directive
(partial_expression_value))
(text)
(directive
(expression_value))
(directive
(partial_expression_value))
(text)
(directive
(ending_expression_value))))

================================================================================
Nested if expressions
================================================================================

<%= if true do %>
<%= if true do %>
<% end %>
<% end %>

--------------------------------------------------------------------------------

(fragment
(directive_group
(directive
(partial_expression_value))
(directive
(partial_expression_value))
(directive
(ending_expression_value)))
(directive
(partial_expression_value))
(directive
(partial_expression_value))
(text)
(directive
(expression_value))
(directive
(partial_expression_value))
(text)
(directive
(partial_expression_value)))
(expression_value)))

0 comments on commit da2b726

Please sign in to comment.