docs: update annotation syntax definitions
This commit is contained in:
@@ -1,20 +1,8 @@
|
|||||||
identifier ::= '[a-zA-Z][a-zA-Z_]*'
|
Identifier ::= '[a-zA-Z][a-zA-Z_]*'
|
||||||
|
|
||||||
integer ::= '\d+'
|
TypeArgs ::= "[" (Type ("," Type)*)? "]"
|
||||||
number ::= integer ["." integer]
|
|
||||||
boolean ::= "False" | "True"
|
|
||||||
none ::= "None"
|
|
||||||
|
|
||||||
value ::= number | boolean | none
|
FrameColumn ::= ((Identifier | "_") ":")? Type
|
||||||
lambda-value ::= "_" | value
|
FrameSchema ::= "[" (FrameColumn ("," FrameColumn)*)? "]"
|
||||||
lambda-operator ::= ">" | "<" | ">=" | "<=" | "==" | "!="
|
|
||||||
lambda ::= lambda-value lambda-operator lambda-value
|
|
||||||
|
|
||||||
constraint ::= identifier | "(" lambda ")"
|
Type ::= "Frame" FrameSchema | Identifier TypeArgs?
|
||||||
base-type ::= identifier
|
|
||||||
type ::= base-type { "+" constraint }
|
|
||||||
|
|
||||||
column-type ::= type | "_"
|
|
||||||
column-def ::= [ identifier ":" ] column-type
|
|
||||||
|
|
||||||
frame-def ::= column-def { "," column-def }
|
|
||||||
|
|||||||
@@ -1,64 +1,72 @@
|
|||||||
#import "@preview/fervojo:0.1.1": render
|
#import "@preview/fervojo:0.1.1": default-css, render
|
||||||
|
|
||||||
#let value = ```
|
#let extra-css = ```css
|
||||||
{[`value` <
|
svg.railroad .terminal rect {
|
||||||
[`number` 'digit' * ! <!, ["." 'digit' * !]>],
|
fill: #F7DCD4;
|
||||||
[`boolean` <"False", "True">],
|
}
|
||||||
[`none` "None"]
|
```
|
||||||
|
#let css = default-css() + bytes(extra-css.text)
|
||||||
|
|
||||||
|
#let type-args = ```
|
||||||
|
{[`type-args` "[" <!, 'type'*","> "]"]}
|
||||||
|
```
|
||||||
|
|
||||||
|
#let frame-schema = ```
|
||||||
|
{[`frame-schema` "[" <!, [[<'identifier', "_"> ":"]? 'type']*","> "]"]}
|
||||||
|
```
|
||||||
|
|
||||||
|
#let type = ```
|
||||||
|
{[`type` <
|
||||||
|
["Frame" 'frame-schema'],
|
||||||
|
['identifier' <!, 'type-args'>]
|
||||||
>]}
|
>]}
|
||||||
```
|
```
|
||||||
|
|
||||||
#let constraint = ```
|
|
||||||
{[`constraint` <"_", 'value'> <">", "<", ">=", "<=", "==", "!="> <"_", 'value'>]}
|
|
||||||
```
|
|
||||||
|
|
||||||
#let type-with-constraints = ```
|
|
||||||
{[`type-with-constraints` 'identifier' <!, ["+" "(" 'constraint' ")"] * !>]}
|
|
||||||
```
|
|
||||||
|
|
||||||
#let column-def = ```
|
|
||||||
{[`column-def` <!, ['identifier' ":"]> <"_", 'type-with-constraints'>]}
|
|
||||||
```
|
|
||||||
|
|
||||||
#let frame-def = ```
|
|
||||||
{[`frame-def` 'column-def' * ","]}
|
|
||||||
```
|
|
||||||
|
|
||||||
#let annotation = ```
|
|
||||||
{[`annotation` 'identifier' <!, ["[" 'frame-def' "]"]>]}
|
|
||||||
```
|
|
||||||
|
|
||||||
#let rules = (
|
#let rules = (
|
||||||
value,
|
type-args: type-args,
|
||||||
constraint,
|
frame-schema: frame-schema,
|
||||||
type-with-constraints,
|
type: type,
|
||||||
column-def,
|
)
|
||||||
frame-def,
|
|
||||||
annotation,
|
#let inline = (
|
||||||
|
"type-args",
|
||||||
|
"frame-schema",
|
||||||
)
|
)
|
||||||
|
|
||||||
#set text(font: "Source Sans 3")
|
#set text(font: "Source Sans 3")
|
||||||
|
|
||||||
= Type annotation syntax
|
#title[Supported Python annotation syntax]
|
||||||
|
|
||||||
#for rule in rules {
|
= Outline
|
||||||
render(rule)
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
#box(
|
||||||
#let by-name = (
|
columns(
|
||||||
annotation: annotation,
|
2,
|
||||||
frame-def: frame-def,
|
outline(title: none),
|
||||||
column-def: column-def,
|
),
|
||||||
type-with-constraints: type-with-constraints,
|
height: 9cm,
|
||||||
constraint: constraint,
|
stroke: 1pt,
|
||||||
value: value,
|
inset: 1em,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
= Statements and expressions
|
||||||
|
|
||||||
|
#for (name, rule) in rules.pairs().rev() {
|
||||||
|
[== #name]
|
||||||
|
render(rule, css: css)
|
||||||
|
}
|
||||||
|
|
||||||
#let substitute(base-rule) = {
|
#let substitute(base-rule) = {
|
||||||
let new-rule = base-rule
|
let new-rule = base-rule
|
||||||
for (key, rule) in by-name.pairs() {
|
for name in inline {
|
||||||
new-rule = new-rule.replace("'" + key + "'", rule.text.slice(1, -1))
|
let rule = rules.at(name)
|
||||||
|
let replacement = rule.text.slice(1, -1).replace(regex("\[`.*?`"), "[")
|
||||||
|
replacement = "[" + replacement + "#`" + name + "`]"
|
||||||
|
new-rule = new-rule.replace(
|
||||||
|
"'" + name + "'",
|
||||||
|
replacement,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
if new-rule != base-rule {
|
if new-rule != base-rule {
|
||||||
new-rule = substitute(new-rule)
|
new-rule = substitute(new-rule)
|
||||||
@@ -66,9 +74,16 @@
|
|||||||
return new-rule
|
return new-rule
|
||||||
}
|
}
|
||||||
|
|
||||||
#let combined = raw(substitute(annotation.text))
|
|
||||||
|
|
||||||
|
|
||||||
#set page(flipped: true)
|
#set page(flipped: true)
|
||||||
#render(combined)
|
|
||||||
*/
|
|
||||||
|
= Combined rules
|
||||||
|
|
||||||
|
#for (name, rule) in rules.pairs() {
|
||||||
|
if not name in inline {
|
||||||
|
[== #name]
|
||||||
|
let combined = substitute(rule.text)
|
||||||
|
render(raw(combined), css: css)
|
||||||
|
//raw(block: true, combined)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user