Compare commits

...

9 Commits

Author SHA1 Message Date
Kevin
bea927e9b6 Supprt simple inline set statements 2024-05-22 13:19:25 -04:00
Kevin
fa3618f817 Add support for set block statement 2024-05-22 13:09:12 -04:00
Kevin
74a488e35e Basic support for filter block statement 2024-05-22 12:50:21 -04:00
Kevin
a7374b4dad Baisc support for blocks 2024-05-22 12:27:59 -04:00
Kevin
86202c7d4a Document the from statement 2024-05-22 12:16:13 -04:00
Kevin
f634f20e11 Describe import statement 2024-05-22 12:10:26 -04:00
Kevin
e8fd8ee882 Support variable names and lists 2024-05-22 12:03:19 -04:00
Kevin
c8225418fa Support basic include inline statement 2024-05-22 11:33:20 -04:00
Kevin
72ab9b5015 Initial OHM grammar for extends tag
OHM is a PEG-based grammar parser generator which seems to be more
compatible with the Jinja language. We are not making use of their
automatic space handling since in Jinja whitespace is significant.
2024-05-22 11:25:40 -04:00

180
grammar/jinja.ohm Normal file
View File

@ -0,0 +1,180 @@
Jinja {
Template
= expressions
expressions
= expression*
expression
= content
| inlineStatement
| blockStatement
blockStatement
= blockStatement_open expressions blockStatement_close
blockStatement_open
= statementOpen sp? blockStatementOpenContent sp? statementClose
blockStatementOpenContent
= statement_block
| statement_filter
| statement_setBlock
blockStatement_close
= statementOpen sp? blockStatementCloseContent sp? statementClose
blockStatementCloseContent
= statementEnd_block
| blockStatementCloseContent_generic
blockStatementCloseContent_generic
= blockStatementId_end blockStatementId_list
inlineStatement
= statementOpen sp? inlineStatementContent sp? statementClose
inlineStatementContent
= statement_extends
| statement_from
| statement_import
| statement_include
| statement_setInline
statement_block
= statementId_block sp identifier (sp contextModifier_scoped)? (sp contextModifier_required)?
statementEnd_block
= blockStatementId_end statementId_block (sp identifier)?
statement_extends
= statementId_extends sp statementExtends_file
statementExtends_file
= stringLiteral
| variableName
statement_filter
= statementId_filter sp filterExpression
statement_from
= statementId_from sp statementImport_file sp statementId_import sp statementFrom_variables (sp importOptions_contextManagement)?
statementFrom_variables
= (statementFrom_variable sp? comma sp?)* statementFrom_variable
statementFrom_variable = variableName (sp statementModifier_as sp variableName)?
statement_import
= statementId_import sp statementImport_file sp statementModifier_as sp variableName
statementImport_file
= stringLiteral
| variableName
statement_include
= statementId_include sp statementInclude_file (sp importOptions_ignoreMissing)? (sp importOptions_contextManagement)?
statementInclude_file
= stringLiteral
| listLiteral
| variableName
statement_setInline
= statementId_set sp variableName sp? equals sp? statementSet_value
statementSet_value
= stringLiteral
| variableName
| listLiteral
| explicitTupleLiteral
statement_setBlock
= statementId_set sp variableName (sp verticalBar sp filterExpression)*
content
= (~statementOpen any)+
variableName = identifier
filterExpression
= filter_center
| filter_upper
| filter_wordWrap
filter_center = filterId_center (parenthesis_left sp? filterCenter_parameters? sp? parenthesis_right)?
filterCenter_parameters = digit+
filter_upper = filterId_upper
filter_wordWrap = filterId_wordWrap
filterId_center = "center"
filterId_upper = "upper"
filterId_wordWrap = "wordwrap"
statementOpen = "{%"
statementClose = "%}"
statementId_block = "block"
statementId_extends = "extends"
statementId_filter = "filter"
statementId_from = "from"
statementId_import = "import"
statementId_include = "include"
statementId_set = "set"
blockStatementId_list
= statementId_block
| statementId_filter
| statementId_set
blockStatementId_end = "end"
statementModifier_as = "as"
contextModifier_scoped = "scoped"
contextModifier_required = "required"
importOptions_ignoreMissing = "ignore missing"
importOptions_contextManagement = importOptions_withContext | importOptions_withoutContext
importOptions_withContext = "with context"
importOptions_withoutContext = "without context"
listLiteral = bracket_left listLiteral_values? bracket_right
listLiteral_values = sp? (listLiteral_value sp? comma sp?)* listLiteral_value sp?
listLiteral_value
= stringLiteral
| explicitTupleLiteral
| variableName
stringLiteral = stringLiteral_single | stringLiteral_double
stringLiteral_single = quote_single (~quote_single any)* quote_single
stringLiteral_double = quote_double (~quote_double any)* quote_double
explicitTupleLiteral = parenthesis_left sp? tupleLiteral_values sp? parenthesis_right
tupleLiteral_values = (sp? tupleLiteral_value sp? comma sp?)* tupleLiteral_value
tupleLiteral_value
= stringLiteral
quote_single = "'"
quote_double = "\""
comma = ","
equals = "="
verticalBar = "|"
bracket_left = "["
bracket_right = "]"
brace_left = "{"
brace_right = "}"
parenthesis_left = "("
parenthesis_right = ")"
identifier = identifierStart identifierContinue*
identifierStart = letter
identifierContinue = letter | digit | "_"
sp = (" " | "\t")+
}