@@ -27,6 +27,11 @@ class Grammar < Parslet::Parser
2727 ( word_char >> ( word_char | str ( ':' ) >> word_char . present? ) . repeat ) . as ( :word )
2828 end
2929
30+ # Bracketed text (treated as plain text, not dependent conditions)
31+ rule ( :bracketed_text ) do
32+ str ( '[' ) >> ( str ( ']' ) . absent? >> any ) . repeat . as ( :bracketed_content ) >> str ( ']' )
33+ end
34+
3035 # Selector keywords - IMPORTANT: longer strings must come before shorter prefixes
3136 # e.g., "reading" before "read", "messages_after" before "messages"
3237 rule ( :selector_key ) do
@@ -99,6 +104,7 @@ class Grammar < Parslet::Parser
99104 rule ( :atom ) do
100105 selector . as ( :selector ) |
101106 grouped |
107+ bracketed_text . as ( :bracketed_text ) |
102108 double_quoted . as ( :quoted_text ) |
103109 word . as ( :plain_text )
104110 end
@@ -155,6 +161,14 @@ class Transform < Parslet::Transform
155161 { type : :text , value : c . to_s , negated : false , quoted : true }
156162 end
157163
164+ # Bracketed text node
165+ rule ( bracketed_text : { bracketed_content : simple ( :c ) } ) do
166+ { type : :text , value : "[#{ c } ]" , negated : false , quoted : false }
167+ end
168+ rule ( bracketed_text : { bracketed_content : sequence ( :c ) } ) do
169+ { type : :text , value : "[#{ c . map ( &:to_s ) . join } ]" , negated : false , quoted : false }
170+ end
171+
158172 # Selector with value and optional conditions
159173 rule ( selector : { selector_key : simple ( :k ) , selector_value : subtree ( :v ) , conditions : subtree ( :conds ) } ) do
160174 val = case v
0 commit comments