python-oracle-apex 0.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,27 @@
1
+ Metadata-Version: 2.3
2
+ Name: python-oracle-apex
3
+ Version: 0.0.0
4
+ Summary: Parsing files exported from Oracle APEX
5
+ Author: Maurice Koster
6
+ Author-email: Maurice Koster <maurice@mauricekoster.com>
7
+ Requires-Dist: parsimonious>=0.11.0
8
+ Requires-Dist: pyyaml>=6.0.3
9
+ Requires-Python: >=3.13
10
+ Description-Content-Type: text/markdown
11
+
12
+ # python-oracle-apex
13
+ Parsing an APEX lang export file into Objects
14
+
15
+ ## Oracle APEX
16
+
17
+ ## APEXLang - reading .apx files
18
+
19
+ ```python
20
+ page = parse_apex("examples/login.apx")
21
+ ```
22
+
23
+ ## Reading yaml files, pre APEX 26.1
24
+
25
+ ```python
26
+ page = parse_yaml("examples/login.yaml")
27
+ ```
@@ -0,0 +1,16 @@
1
+ # python-oracle-apex
2
+ Parsing an APEX lang export file into Objects
3
+
4
+ ## Oracle APEX
5
+
6
+ ## APEXLang - reading .apx files
7
+
8
+ ```python
9
+ page = parse_apex("examples/login.apx")
10
+ ```
11
+
12
+ ## Reading yaml files, pre APEX 26.1
13
+
14
+ ```python
15
+ page = parse_yaml("examples/login.yaml")
16
+ ```
@@ -0,0 +1,24 @@
1
+ [project]
2
+ name = "python-oracle-apex"
3
+ version = "0.0.0"
4
+ description = "Parsing files exported from Oracle APEX"
5
+ readme = "README.md"
6
+ requires-python = ">=3.13"
7
+ dependencies = [
8
+ "parsimonious>=0.11.0",
9
+ "pyyaml>=6.0.3",
10
+ ]
11
+
12
+ [[project.authors]]
13
+ name = "Maurice Koster"
14
+ email = "maurice@mauricekoster.com"
15
+
16
+ [project.scripts]
17
+ python-oracle-apex = "python_oracle_apex:main"
18
+
19
+ [build-system]
20
+ requires = ["uv_build>=0.12.7,<0.13.0"]
21
+ build-backend = "uv_build"
22
+
23
+ [dependency-groups]
24
+ dev = ["pytest>=9.1.1"]
@@ -0,0 +1,25 @@
1
+ [project]
2
+ name = "python-oracle-apex"
3
+ version = "0.0.0"
4
+ description = "Parsing files exported from Oracle APEX"
5
+ readme = "README.md"
6
+ authors = [
7
+ { name = "Maurice Koster", email = "maurice@mauricekoster.com" }
8
+ ]
9
+ requires-python = ">=3.13"
10
+ dependencies = [
11
+ "parsimonious>=0.11.0",
12
+ "pyyaml>=6.0.3",
13
+ ]
14
+
15
+ [project.scripts]
16
+ python-oracle-apex = "python_oracle_apex:main"
17
+
18
+ [build-system]
19
+ requires = ["uv_build>=0.12.7,<0.13.0"]
20
+ build-backend = "uv_build"
21
+
22
+ [dependency-groups]
23
+ dev = [
24
+ "pytest>=9.1.1",
25
+ ]
@@ -0,0 +1,6 @@
1
+ from .grammar import parse_apex_file, parse_apex
2
+ from .reader import parse_yaml_file
3
+ from .objects import *
4
+
5
+ def main() -> None:
6
+ print("Hello from python-oracle-apex!")
@@ -0,0 +1,387 @@
1
+ page_object = indent "page" (required_ws component_id)? ws "(" page_body_line* indent ")" line_end
2
+ page_body_line = page_direct_property_line
3
+ / page_group_block
4
+ / page_child_component
5
+ / blank_lines
6
+
7
+ page_direct_property_line = indent page_direct_property line_end
8
+ page_direct_property = "page" ":" ws number
9
+ / "name" ":" ws string_like_value
10
+ / "alias" ":" ws string_like_value
11
+ / "title" ":" ws string_like_value
12
+
13
+ page_group_block = page_appearance
14
+ / page_navigation
15
+ / page_css
16
+ / page_security
17
+ / page_advanced
18
+
19
+ page_appearance = indent "appearance" ws "{" line_end page_appearance_property_line* indent "}" line_end
20
+ page_appearance_property_line = indent page_appearance_property line_end
21
+ page_appearance_property = "pageMode" ":" ws ( "normal" / "modalDialog" / "nonModalDialog" )
22
+ / "pageTemplate" ":" ws reference
23
+ / "dialogTemplate" ":" ws reference
24
+ / "templateOptions" ":" ws ( array_of_string_like_value / string_like_value )
25
+ / "cssClasses" ":" ws array_of_string_like_value
26
+ / "mediaType" ":" ws string_like_value
27
+
28
+ page_navigation = indent "navigation" ws "{" line_end page_navigation_property_line* indent "}" line_end
29
+ page_navigation_property_line = indent page_navigation_property line_end
30
+ page_navigation_property = "cursorFocus" ":" ws ( "firstItemOnPage" / "doNotFocusCursor" )
31
+ / "warnOnUnsavedChanges" ":" ws boolean
32
+
33
+ page_css = indent "css" ws "{" line_end page_css_property_line* indent "}" line_end
34
+ page_css_property_line = indent page_css_property line_end
35
+ page_css_property = "fileUrls" ":" ws array_of_string_like_value
36
+ / "inline" ":" ws multiline_string
37
+ / "inline" ":" nl indent multiline_string
38
+
39
+ page_security = indent "security" ws "{" line_end page_security_property_line* indent "}" line_end
40
+ page_security_property_line = indent page_security_property line_end
41
+ page_security_property = "authorizationScheme" ":" ws reference
42
+ / "authentication" ":" ws ( "required" / "public" )
43
+ / "deepLinking" ":" ws boolean
44
+ / "pageAccessProtection" ":" ws ( "unrestricted" / "argumentsMustHaveChecksum" / "noArgumentsSupported" / "noUrlAccess" )
45
+ / "formAutoComplete" ":" ws boolean
46
+ / "browserCache" ":" ws boolean
47
+
48
+ page_advanced = indent "advanced" ws "{" line_end page_advanced_property_line* indent "}" line_end
49
+ page_advanced_property_line = indent page_advanced_property line_end
50
+ page_advanced_property = "enableMetaTags" ":" ws boolean
51
+ / "enableDuplicatePageSubmissions" ":" ws boolean
52
+ / "reloadOnSubmit" ":" ws ( "always" / "onlyForSuccess" )
53
+ / "duplicateSubmissionUrl" ":" ws string_like_value
54
+
55
+
56
+ page_child_component = region
57
+ / page_item
58
+ / button
59
+ / dynamic_action
60
+ / process
61
+
62
+ region = indent "region" (required_ws component_id)? ws "(" line_end region_body_line* indent ")" line_end
63
+ region_body_line = region_direct_property_line
64
+ / region_group_block
65
+ / blank_lines
66
+
67
+ region_direct_property_line = indent region_direct_property line_end
68
+ region_direct_property = "name" ":" ws string_like_value
69
+ / "title" ":" ws string_like_value
70
+ / "type" ":" ws string_like_value
71
+
72
+ region_group_block = region_layout
73
+ / region_appearance
74
+ / region_image
75
+ / region_advanced
76
+
77
+ region_layout = indent "layout" ws "{" line_end region_layout_property_line* indent "}" line_end
78
+ region_layout_property_line = indent region_layout_property line_end
79
+ region_layout_property = "sequence" ":" ws number
80
+ / "parentRegion" ":" ws reference
81
+ / "slot" ":" ws string_like_value
82
+ / "startNewLayout" ":" ws boolean
83
+ / "startNewRow" ":" ws boolean
84
+ / "rowCssClasses" ":" ws array_of_string_like_value
85
+ / "column" ":" ws string_like_value
86
+ / "newColumn" ":" ws boolean
87
+ / "columnSpan" ":" ws string_like_value
88
+ / "columnCssClasses" ":" ws array_of_string_like_value
89
+ / "columnAttributes" ":" ws array_of_string_like_value
90
+
91
+ region_appearance = indent "appearance" ws "{" line_end region_appearance_property_line* indent "}" line_end
92
+ region_appearance_property_line = indent region_appearance_property line_end
93
+ region_appearance_property = "template" ":" ws reference
94
+ / "templateOptions" ":" ws (array_of_string_like_value / string_like_value)
95
+ / "cssClasses" ":" ws array_of_string_like_value
96
+ / "icon" ":" ws string_like_value
97
+ / "renderComponents" ":" ws ( "aboveContent" / "belowContent" )
98
+
99
+ region_image = indent "image" ws "{" line_end region_image_property_line* indent "}" line_end
100
+ region_image_property_line = indent region_image_property line_end
101
+ region_image_property = "fileUrl" ":" ws string_like_value
102
+ / "accessibleDescription" ":" ws string_like_value
103
+ / "customAttributes" ":" ws string_like_value
104
+
105
+ region_advanced = indent "advanced" ws "{" line_end region_advanced_property_line* indent "}" line_end
106
+ region_advanced_property_line = indent region_advanced_property line_end
107
+ region_advanced_property = "savedReportMappingIdentifier" ":" ws string_like_value
108
+ / "htmlDomId" ":" ws string_like_value
109
+ / "customAttributes" ":" ws string_like_value
110
+ / "regionImage" ":" ws string_like_value
111
+ / "imageTagAttributes" ":" ws string_like_value
112
+ / "staticId" ":" ws string_like_value
113
+ / "regionDisplaySelector" ":" ws boolean
114
+ / "excludeTitleFromTranslation" ":" ws boolean
115
+ / "schemaOverrideItem" ":" ws string_like_value
116
+
117
+
118
+ page_item = indent "pageItem" (required_ws component_id)? ws "(" line_end page_item_body_line* indent ")" line_end
119
+ page_item_body_line = page_item_direct_property_line
120
+ / page_item_group_block
121
+ / blank_lines
122
+
123
+ page_item_direct_property_line = indent page_item_direct_property line_end
124
+ page_item_direct_property = "name" ":" ws string_like_value
125
+ / "type" ":" ws string_like_value
126
+
127
+ page_item_group_block = page_item_label
128
+ / page_item_settings
129
+ / page_item_layout
130
+ / page_item_appearance
131
+ / page_item_validation
132
+ / page_item_advanced
133
+ / page_item_security
134
+ / page_item_session_state
135
+
136
+ page_item_label = indent "label" ws "{" line_end page_item_label_property_line* indent "}" line_end
137
+ page_item_label_property_line = indent page_item_label_property line_end
138
+ page_item_label_property = "label" ":" ws string_like_value
139
+ / "alignment" ":" ws ( "above" / "below" / "center" / "centerBottom" / "centerCenter" / "centerTop" / "left" / "leftBottom" / "leftCenter" / "leftTop" / "right" / "rightBottom" / "rightCenter" / "rightTop" )
140
+ / "tableCellAttributes" ":" ws array_of_string_like_value
141
+
142
+ page_item_settings = indent "settings" ws "{" line_end page_item_settings_property_line* indent "}" line_end
143
+ page_item_settings_property_line = indent page_item_settings_property line_end
144
+ page_item_settings_property = "trimSpaces" ":" ws ( "none" / "something-else" )
145
+ / "dummy" ":" ws string_like_value
146
+
147
+
148
+ page_item_layout = indent "layout" ws "{" line_end page_item_layout_property_line* indent "}" line_end
149
+ page_item_layout_property_line = indent page_item_layout_property line_end
150
+ page_item_layout_property = "sequence" ":" ws number
151
+ / "region" ":" ws reference
152
+ / "slot" ":" ws string_like_value
153
+ / "alignment" ":" ws ( "center" / "centerBottom" / "centerCenter" / "centerTop" / "left" / "leftBottom" / "leftCenter" / "leftTop" / "right" / "rightBottom" / "rightCenter" / "rightTop" )
154
+ / "startNewLayout" ":" ws boolean
155
+ / "startNewRow" ":" ws boolean
156
+ / "rowCssClasses" ":" ws array_of_string_like_value
157
+ / "column" ":" ws string_like_value
158
+ / "newColumn" ":" ws boolean
159
+ / "columnSpan" ":" ws string_like_value
160
+ / "rowSpan" ":" ws number
161
+ / "labelColumnSpan" ":" ws string_like_value
162
+ / "columnCssClasses" ":" ws array_of_string_like_value
163
+ / "columnAttributes" ":" ws array_of_string_like_value
164
+
165
+ page_item_appearance = indent "appearance" ws "{" line_end page_item_appearance_property_line* indent "}" line_end
166
+ page_item_appearance_property_line = indent page_item_appearance_property line_end
167
+ page_item_appearance_property = "template" ":" ws reference
168
+ / "templateOptions" ":" ws ( array_of_string_like_value / string_like_value )
169
+ / "cssClasses" ":" ws ( array_of_string_like_value / string_like_value )
170
+ / "icon" ":" ws string_like_value
171
+ / "formatMask" ":" ws string_like_value
172
+ / "valuePlaceholder" ":" ws string_like_value
173
+ / "width" ":" ws number
174
+ / "height" ":" ws number
175
+
176
+ page_item_validation = indent "validation" ws "{" line_end page_item_validation_property_line* indent "}" line_end
177
+ page_item_validation_property_line = indent page_item_validation_property line_end
178
+ page_item_validation_property = "valueRequired" ":" ws boolean
179
+ / "maxLength" ":" ws number
180
+
181
+ page_item_advanced = indent "advanced" ws "{" line_end page_item_advanced_property_line* indent "}" line_end
182
+ page_item_advanced_property_line = indent page_item_advanced_property line_end
183
+ page_item_advanced_property = "cssClasses" ":" ws array_of_string_like_value
184
+ / "customAttributes" ":" ws string_like_value
185
+ / "optionHtmlAttributes" ":" ws array_of_string_like_value
186
+ / "preText" ":" ws ( string_like_value / multiline_string )
187
+ / "postText" ":" ws ( string_like_value / multiline_string )
188
+ / "warnOnUnsavedChanges" ":" ws ( "ignore" )
189
+ / "initJavaScriptFunction" ":" ws (string_like_value / multiline_string )
190
+
191
+ page_item_session_state = indent "sessionState" ws "{" line_end page_item_session_state_property_line* indent "}" line_end
192
+ page_item_session_state_property_line = indent page_item_session_state_property line_end
193
+ page_item_session_state_property = "dataType" ":" ws ( "varchar2" / "clob" / "boolean" / "number" )
194
+ / "storage" ":" ws ( "request" / "session" / "user" )
195
+
196
+ page_item_security = indent "security" ws "{" line_end page_item_security_property_line* indent "}" line_end
197
+ page_item_security_property_line = indent page_item_security_property line_end
198
+ page_item_security_property = "authorizationScheme" ":" ws reference
199
+ / "sessionStateProtection" ":" ws ( "unrestricted" / "checksumRequiredAppLevel" / "checksumRequiredUserLevel" / "checksumRequiredSessionLevel" / "restricted" )
200
+ / "encryptSessionState" ":" ws boolean
201
+ / "escapeSpecialChars" ":" ws boolean
202
+ / "restrictedChars" ":" ws ( "alphanumWithSpace" / "webSafe" / "noSpecialChar" / "noSpecialCharNoNewline" / "workspaceSchema" / "workspaceUserSchema" / "workspaceUserSchemaId" )
203
+
204
+
205
+
206
+ button = indent "button" (required_ws component_id)? ws "(" line_end button_body_line* indent ")" line_end
207
+ button_body_line = button_direct_property_line
208
+ / button_group_block
209
+ / blank_lines
210
+
211
+ button_direct_property_line = indent button_direct_property line_end
212
+ button_direct_property = "buttonName" ":" ws string_like_value
213
+ / "label" ":" ws string_like_value
214
+
215
+ button_group_block = button_layout
216
+ / button_appearance
217
+ / button_behavior
218
+
219
+ button_layout = indent "layout" ws "{" line_end button_layout_property_line* indent "}" line_end
220
+ button_layout_property_line = indent page_item_layout_property line_end
221
+ button_layout_property = "sequence" ":" ws number
222
+ / "region" ":" ws reference
223
+ / "slot" ":" ws string_like_value
224
+ / "startNewLayout" ":" ws boolean
225
+ / "startNewRow" ":" ws boolean
226
+ / "rowCssClasses" ":" ws array_of_string_like_value
227
+ / "column" ":" ws string_like_value
228
+ / "newColumn" ":" ws boolean
229
+ / "columnSpan" ":" ws string_like_value
230
+ / "rowSpan" ":" ws number
231
+ / "columnCssClasses" ":" ws array_of_string_like_value
232
+ / "columnAttributes" ":" ws array_of_string_like_value
233
+ / "horizontalAlignment" ":" ws ( "left" / "right" )
234
+ / "alignment" ":" ws ( "center" / "centerBottom" / "centerCenter" / "centerTop" / "left" / "leftBottom" / "leftCenter" / "leftTop" / "right" / "rightBottom" / "rightCenter" / "rightTop" )
235
+
236
+ button_appearance = indent "appearance" ws "{" line_end button_appearance_property_line* indent "}" line_end
237
+ button_appearance_property_line = indent button_appearance_property line_end
238
+ button_appearance_property = "buttonTemplate" ":" ws reference
239
+ / "hot" ":" ws boolean
240
+ / "showAsDisabled" ":" ws boolean
241
+ / "templateOptions" ":" ws ( array_of_string_like_value / string_like_value )
242
+ / "cssClasses" ":" ws ( array_of_string_like_value / string_like_value )
243
+ / "icon" ":" ws string_like_value
244
+
245
+ button_behavior = indent "behavior" ws "{" line_end button_behavior_property_line* indent "}" line_end
246
+ button_behavior_property_line = indent button_behavior_property line_end
247
+ button_behavior_property = "type" ":" ws string_like_value
248
+ / "action" ":" ws ( "submitPage" / "triggerAction" / "redirectThisApp" / "redirectOtherApp" / "redirectUrl" / "definedByDynamicAction" / "resetPage" / "nextPage" / "previousPage" )
249
+ / "target" ":" ws value
250
+ / "targetUrl" ":" ws string_like_value
251
+ / "executeValidations" ":" ws boolean
252
+ / "showProcessing" ":" ws boolean
253
+ / "warnOnUnsavedChanges" ":" ws ( "doNotCheck" )
254
+ / "databaseAction" ":" ws ( "insert" / "update" / "delete" )
255
+ / "requiresConfirmation" ":" ws boolean
256
+
257
+ process = indent "process" (required_ws component_id)? ws "(" line_end process_body_line* indent ")" line_end
258
+ process_body_line = process_direct_property_line
259
+ / process_group_block
260
+ / blank_lines
261
+
262
+ process_direct_property_line = indent process_direct_property line_end
263
+ process_direct_property = "name" ":" ws string_like_value
264
+ / "type" ":" ws string_like_value
265
+ / "executionChain" ":" ws string_like_value
266
+ / "formRegion" ":" ws reference
267
+ / "editableRegion" ":" ws reference
268
+
269
+ process_group_block = process_execution
270
+ / process_source
271
+ / process_advanced
272
+
273
+ process_source = "ERROR"
274
+ process_execution = "ERROR"
275
+ process_advanced = "ERROR"
276
+
277
+
278
+ dynamic_action = indent "dynamicAction" (required_ws component_id)? ws "(" line_end dynamic_action_body_line* indent ")" line_end
279
+ dynamic_action_body_line = dynamic_action_direct_property_line
280
+ / dynamic_action_group_block
281
+ / dynamic_action_child_component
282
+ / blank_lines
283
+
284
+ dynamic_action_direct_property_line = indent dynamic_action_direct_property line_end
285
+ dynamic_action_direct_property = "name" ":" ws string_like_value
286
+ / "???" ":" ws string_like_value
287
+
288
+ dynamic_action_group_block = dynamic_action_execution
289
+ / dynamic_action_when
290
+ / dynamic_action_client_side_condition
291
+
292
+ dynamic_action_execution = indent "execution" ws "{" line_end dynamic_action_execution_property_line* indent "}" line_end
293
+ dynamic_action_execution_property_line = indent dynamic_action_execution_property line_end
294
+ dynamic_action_execution_property = "sequence" ":" ws number
295
+ / "eventScope" ":" ws ( "static" / "dynamic" / "once" )
296
+ / "staticContainer" ":" ws string_like_value
297
+ / "type" ":" ws ( "immediate" / "debounce" / "throttle" )
298
+ / "time" ":" ws number
299
+ / "immediate" ":" ws boolean
300
+
301
+ dynamic_action_when = indent "when" ws "{" line_end dynamic_action_when_property_line* indent "}" line_end
302
+ dynamic_action_when_property_line = indent dynamic_action_when_property line_end
303
+ dynamic_action_when_property = "event" ":" ws string_like_value
304
+ / "customEvent" ":" ws string_like_value
305
+ / "selectionType" ":" ws ( "items" / "button" / "region" / "columns" / "domObject" / "jQuerySelector" / "jsExpression" )
306
+ / "region" ":" ws reference
307
+ / "interactiveGrid" ":" ws reference
308
+ / "columns" ":" ws array_of_string_like_value
309
+ / "button" ":" ws reference
310
+ / "items" ":" ws array_of_string_like_value
311
+ / "domObject" ":" ws string_like_value
312
+ / "jquerySelector" ":" ws string_like_value
313
+ / "javaScriptExpression" ":" ws multiline_string
314
+
315
+ dynamic_action_client_side_condition = indent "clientSideCondition" ws "{" line_end dynamic_action_client_side_condition_property_line* indent "}" line_end
316
+ dynamic_action_client_side_condition_property_line = indent dynamic_action_client_side_condition_property line_end
317
+ dynamic_action_client_side_condition_property = "type" ":" ws ( "item=value" / "item!=value" / "item>value" / "item>=value" / "item<value" / "item<=value" / "itemIsNull" / "itemIsNotNull" / "itemIsInList" / "itemIsNotInList" / "jsExpression" )
318
+ / "item" ":" ws string_like_value
319
+ / "value" ":" ws string_like_value
320
+ / "list" ":" ws array_of_string_like_value
321
+ / "javaScriptExpression" ":" ws code_block
322
+ / "type" ":" ws ( "itemColumn=value" / "itemColumn!=value" / "itemColumn>value" / "itemColumn>=value" / "itemColumn<value" / "itemColumn<=value" / "itemColumnIsNull" / "itemColumnIsNotNull" / "itemColumnIsInList" / "itemColumnIsNotInList" / "jsExpression" )
323
+ / "componentType" ":" ws ( "item" / "column" )
324
+ / "column" ":" ws string_like_value
325
+
326
+ dynamic_action_child_component = action_c
327
+
328
+
329
+ action_c = indent "action" (required_ws component_id)? ws "(" line_end action_c_body_line* indent ")" line_end
330
+ action_c_body_line = action_c_direct_property_line
331
+ / action_c_group_block
332
+ / blank_lines
333
+
334
+ action_c_direct_property_line = indent action_c_direct_property line_end
335
+ action_c_direct_property = "name" ":" ws string_like_value
336
+ / "action" ":" ws string_like_value
337
+
338
+ action_c_group_block = action_c_affected_elements
339
+ / action_c_execution
340
+
341
+ action_c_affected_elements = indent "affectedElements" ws "{" line_end action_c_affected_elements_property_line* indent "}" line_end
342
+ action_c_affected_elements_property_line = indent action_c_affected_elements_property line_end
343
+ action_c_affected_elements_property = "selectionType" ":" ws string_like_value
344
+ / "region" ":" ws reference
345
+ / "columns" ":" ws array_of_string_like_value
346
+ / "button" ":" ws reference
347
+ / "items" ":" ws ( array_of_string_like_value / string_like_value )
348
+ / "domObject" ":" ws string_like_value
349
+ / "jquerySelector" ":" ws string_like_value
350
+ / "javaScriptExpression" ":" ws code_block
351
+
352
+ action_c_execution = indent "execution" ws "{" line_end action_c_execution_property_line* indent "}" line_end
353
+ action_c_execution_property_line = indent action_c_execution_property line_end
354
+ action_c_execution_property = "sequence" ":" ws number
355
+ / "event" ":" ws reference
356
+ / "fireWhenEventResultIs" ":" ws string_like_value
357
+ / "fireOnInit" ":" ws boolean
358
+ / "stopExecutionOnError" ":" ws boolean
359
+ / "waitForResult" ":" ws boolean
360
+
361
+
362
+ reference = "@" reference_character*
363
+ component_id = string / identifier / number
364
+ code_block = multiline_string
365
+ / string_like_value
366
+ multiline_string = "```" ( any_character / nl )* "```"
367
+ blank_lines = (ws nl)*
368
+ ws = ~r"[ \t]*"
369
+ required_ws = ~r"[ \t]+"
370
+ line_end = nl
371
+ nl = "\n" / "\r\n"
372
+ indent = ~r"[ \t]*"
373
+ value = string / identifier / boolean / number / reference / multiline_string / array
374
+ array = array_of_value
375
+ array_separator = required_ws / line_end indent
376
+ array_of_value = "[" ( ws value ( array_separator value )* ws / line_end ( indent value line_end )? indent )? "]"
377
+ array_of_string_like_value = "[" (line_end indent string_like_value)+ line_end indent "]"
378
+ string_like_value = ~r"[^\[\]\n\r]+"
379
+ reference_character = ~r"[A-Za-z0-9_/#-]*"
380
+ string = ~r"\"[^\"]+\""
381
+ any_character = ~r"[^`\n\r]"
382
+ number = "-"? digit+ ( "." digit+ )?
383
+ digit = ~r"[0-9]"
384
+ identifier = identifier_start identifier_rest*
385
+ identifier_start = ~r"[A-Za-z0-9_]"
386
+ identifier_rest = identifier_start / "." / "-"
387
+ boolean = "true" / "false"