@@ -44,20 +44,22 @@ inductive LayoutKind where
4444namespace Jsx
4545open Parser PrettyPrinter
4646
47- declare_syntax_cat jsxElement
48- declare_syntax_cat jsxChild
49- declare_syntax_cat jsxAttr
50- declare_syntax_cat jsxAttrVal
51-
52- scoped syntax str : jsxAttrVal
47+ -- Verbose names to avoid conflicts with other packages that define HTML syntax
48+ -- (parser categories are not scoped).
49+ declare_syntax_cat proofWidgetsJsxElement
50+ declare_syntax_cat proofWidgetsJsxChild
51+ declare_syntax_cat proofWidgetsJsxAttr
52+ declare_syntax_cat proofWidgetsJsxAttrVal
53+
54+ scoped syntax str : proofWidgetsJsxAttrVal
5355/-- Interpolates an expression into a JSX attribute literal. -/
54- scoped syntax group("{" term "}" ) : jsxAttrVal
55- scoped syntax ident "=" jsxAttrVal : jsxAttr
56+ scoped syntax group("{" term "}" ) : proofWidgetsJsxAttrVal
57+ scoped syntax ident "=" proofWidgetsJsxAttrVal : proofWidgetsJsxAttr
5658/-- Interpolates a collection into a JSX attribute literal.
5759For HTML tags, this should have type `Array (String × Json)`.
5860For `ProofWidgets.Component`s, it can be any structure `$t` whatsoever:
5961it is interpolated into the component's props using `{ $t with ... }` notation. -/
60- scoped syntax group(" {..." term "}" ) : jsxAttr
62+ scoped syntax group(" {..." term "}" ) : proofWidgetsJsxAttr
6163
6264/-- Characters not allowed inside JSX plain text. -/
6365def jsxTextForbidden : String := "{<>}$"
@@ -66,7 +68,7 @@ def jsxText : Parser :=
6668 withAntiquot (mkAntiquot "jsxText" `ProofWidgets.Jsx.jsxText) {
6769 fn := fun c s =>
6870 let startPos := s.pos
69- let s := takeWhile1Fn (not ∘ ( fun c => jsxTextForbidden.contains c) ) "expected JSX text" c s
71+ let s := takeWhile1Fn (fun c => ! jsxTextForbidden.contains c) "expected JSX text" c s
7072 mkNodeToken `ProofWidgets.Jsx.jsxText startPos true c s }
7173
7274def getJsxText : TSyntax ``jsxText → String
@@ -79,20 +81,21 @@ def jsxText.formatter : Formatter :=
7981def jsxText.parenthesizer : Parenthesizer :=
8082 Parenthesizer.visitToken
8183
82- scoped syntax "<" ident jsxAttr* "/>" : jsxElement
83- scoped syntax "<" ident jsxAttr* ">" jsxChild* "</" ident ">" : jsxElement
84+ scoped syntax "<" ident proofWidgetsJsxAttr* "/>" : proofWidgetsJsxElement
85+ scoped syntax "<" ident proofWidgetsJsxAttr* ">" proofWidgetsJsxChild* "</" ident ">" :
86+ proofWidgetsJsxElement
8487
85- scoped syntax jsxText : jsxChild
88+ scoped syntax jsxText : proofWidgetsJsxChild
8689/-- Interpolates an array of elements into a JSX literal -/
87- scoped syntax "{..." term "}" : jsxChild
90+ scoped syntax "{..." term "}" : proofWidgetsJsxChild
8891/-- Interpolates an expression into a JSX literal -/
89- scoped syntax "{" term "}" : jsxChild
90- scoped syntax jsxElement : jsxChild
92+ scoped syntax "{" term "}" : proofWidgetsJsxChild
93+ scoped syntax proofWidgetsJsxElement : proofWidgetsJsxChild
9194
92- scoped syntax :max jsxElement : term
95+ scoped syntax :max proofWidgetsJsxElement : term
9396
94- def transformTag (tk : Syntax) (n m : Ident) (vs : Array (TSyntax `jsxAttr ))
95- (cs : Array (TSyntax `jsxChild )) : MacroM Term := do
97+ def transformTag (tk : Syntax) (n m : Ident) (vs : Array (TSyntax `proofWidgetsJsxAttr ))
98+ (cs : Array (TSyntax `proofWidgetsJsxChild )) : MacroM Term := do
9699 let nId := n.getId.eraseMacroScopes
97100 let mId := m.getId.eraseMacroScopes
98101 if nId != mId then
@@ -105,22 +108,22 @@ def transformTag (tk : Syntax) (n m : Ident) (vs : Array (TSyntax `jsxAttr))
105108
106109 -- Whitespace appearing before the current child.
107110 let mut wsBefore := trailingWs tk
108- -- This loop transforms (for example) `` `(jsxChild *| {a} text {...cs} {d})``
111+ -- This loop transforms (for example) `` `(proofWidgetsJsxChild *| {a} text {...cs} {d})``
109112 -- into ``children ← `(term| #[a, Html.text " text "] ++ cs ++ #[d])``.
110113 let mut csArrs := #[]
111114 let mut csArr := #[]
112115 for c in cs do
113116 match c with
114- | `(jsxChild | $t:jsxText) =>
117+ | `(proofWidgetsJsxChild | $t:jsxText) =>
115118 csArr ← csArr.push <$> `(Html.text $(quote <| wsBefore ++ getJsxText t))
116119 wsBefore := ""
117- | `(jsxChild | { $t }%$tk) =>
120+ | `(proofWidgetsJsxChild | { $t }%$tk) =>
118121 csArr := csArr.push t
119122 wsBefore := trailingWs tk
120- | `(jsxChild | $e:jsxElement ) =>
121- csArr ← csArr.push <$> `(term| $e:jsxElement )
123+ | `(proofWidgetsJsxChild | $e:proofWidgetsJsxElement ) =>
124+ csArr ← csArr.push <$> `(term| $e:proofWidgetsJsxElement )
122125 wsBefore := trailingWs e
123- | `(jsxChild | {... $t }%$tk) =>
126+ | `(proofWidgetsJsxChild | {... $t }%$tk) =>
124127 if !csArr.isEmpty then
125128 csArrs ← csArrs.push <$> `(term| #[$csArr,*])
126129 csArr := #[]
@@ -132,9 +135,9 @@ def transformTag (tk : Syntax) (n m : Ident) (vs : Array (TSyntax `jsxAttr))
132135 let children ← joinArrays csArrs
133136
134137 let vs : Array ((Ident × Term) ⊕ Term) ← vs.mapM fun
135- | `(jsxAttr | $attr:ident = $s:str) => Sum.inl <$> pure (attr, s)
136- | `(jsxAttr | $attr:ident = { $t:term }) => Sum.inl <$> pure (attr, t)
137- | `(jsxAttr | {... $t:term }) => Sum.inr <$> pure t
138+ | `(proofWidgetsJsxAttr | $attr:ident = $s:str) => Sum.inl <$> pure (attr, s)
139+ | `(proofWidgetsJsxAttr | $attr:ident = { $t:term }) => Sum.inl <$> pure (attr, t)
140+ | `(proofWidgetsJsxAttr | {... $t:term }) => Sum.inr <$> pure t
138141 | stx => Macro.throwErrorAt stx "unknown syntax"
139142 let tag := toString nId
140143
@@ -166,8 +169,8 @@ enabled using `open scoped ProofWidgets.Jsx`.
166169Lowercase tags are interpreted as standard HTML
167170whereas uppercase ones are expected to be `ProofWidgets.Component`s. -/
168171macro_rules
169- | `(<$n:ident $[$attrs:jsxAttr ]* />%$tk) => transformTag tk n n attrs #[]
170- | `(<$n:ident $[$attrs:jsxAttr ]* >%$tk $cs*</$m>) => transformTag tk n m attrs cs
172+ | `(<$n:ident $[$attrs:proofWidgetsJsxAttr ]* />%$tk) => transformTag tk n n attrs #[]
173+ | `(<$n:ident $[$attrs:proofWidgetsJsxAttr ]* >%$tk $cs*</$m>) => transformTag tk n m attrs cs
171174
172175section delaborator
173176
@@ -185,7 +188,7 @@ partial def delabHtmlText : DelabM (TSyntax ``jsxText) := do
185188
186189mutual
187190
188- partial def delabHtmlElement' : DelabM (TSyntax `jsxElement ) := do
191+ partial def delabHtmlElement' : DelabM (TSyntax `proofWidgetsJsxElement ) := do
189192 let_expr Html.element tag _attrs _children := ← getExpr | failure
190193
191194 let .lit (.strVal s) := tag | failure
@@ -207,21 +210,21 @@ partial def delabHtmlElement' : DelabM (TSyntax `jsxElement) := do
207210 | .app (.const ``Json.str _) (.lit (.strVal v)) =>
208211 -- TODO: this annotation doesn't seem to work in infoview
209212 let val ← annotateTermLikeInfo <| Syntax.mkStrLit v
210- `(jsxAttr | $attr:ident=$val:str)
213+ `(proofWidgetsJsxAttr | $attr:ident=$val:str)
211214 | _ =>
212215 let val ← delab
213- `(jsxAttr | $attr:ident={ $val })
216+ `(proofWidgetsJsxAttr | $attr:ident={ $val })
214217 catch _ =>
215218 let vs ← delab
216- return #[← `(jsxAttr | {... $vs })]
219+ return #[← `(proofWidgetsJsxAttr | {... $vs })]
217220
218221 let children ← withAppArg delabJsxChildren
219222 if children.isEmpty then
220- `(jsxElement | < $tag $[$attrs]* />)
223+ `(proofWidgetsJsxElement | < $tag $[$attrs]* />)
221224 else
222- `(jsxElement | < $tag $[$attrs]* > $[$children]* </ $tag >)
225+ `(proofWidgetsJsxElement | < $tag $[$attrs]* > $[$children]* </ $tag >)
223226
224- partial def delabHtmlOfComponent' : DelabM (TSyntax `jsxElement ) := do
227+ partial def delabHtmlOfComponent' : DelabM (TSyntax `proofWidgetsJsxElement ) := do
225228 let_expr Html.ofComponent _Props _inst _c _props _children := ← getExpr | failure
226229 let c ← withNaryArg 2 delab
227230 unless c.raw.isIdent do failure
@@ -230,38 +233,38 @@ partial def delabHtmlOfComponent' : DelabM (TSyntax `jsxElement) := do
230233 -- TODO: handle `Props` that do not delaborate to `{ }`, such as `Prod`, by parsing the `Expr`
231234 -- instead.
232235 let attrDelab ← withNaryArg 3 delab
233- let attrs : Array (TSyntax `jsxAttr ) ← do
236+ let attrs : Array (TSyntax `proofWidgetsJsxAttr ) ← do
234237 let `(term| { $[$ns:ident := $vs],* } ) := attrDelab |
235- pure #[← `(jsxAttr | {...$attrDelab})]
238+ pure #[← `(proofWidgetsJsxAttr | {...$attrDelab})]
236239 ns.zip vs |>.mapM fun (n, v) => do
237- `(jsxAttr | $n:ident={ $v })
240+ `(proofWidgetsJsxAttr | $n:ident={ $v })
238241 let children ← withNaryArg 4 delabJsxChildren
239242 if children.isEmpty then
240- `(jsxElement | < $tag $[$attrs]* />)
243+ `(proofWidgetsJsxElement | < $tag $[$attrs]* />)
241244 else
242- `(jsxElement | < $tag $[$attrs]* > $[$children]* </ $tag >)
245+ `(proofWidgetsJsxElement | < $tag $[$attrs]* > $[$children]* </ $tag >)
243246
244- partial def delabJsxChildren : DelabM (Array (TSyntax `jsxChild )) := do
247+ partial def delabJsxChildren : DelabM (Array (TSyntax `proofWidgetsJsxChild )) := do
245248 try
246249 delabArrayLiteral (withAnnotateTermLikeInfo do
247250 try
248251 match_expr ← getExpr with
249252 | Html.text _ =>
250253 let html ← delabHtmlText
251- return ← `(jsxChild | $html:jsxText)
254+ return ← `(proofWidgetsJsxChild | $html:jsxText)
252255 | Html.element _ _ _ =>
253256 let html ← delabHtmlElement'
254- return ← `(jsxChild | $html:jsxElement )
257+ return ← `(proofWidgetsJsxChild | $html:proofWidgetsJsxElement )
255258 | Html.ofComponent _ _ _ _ _ =>
256259 let comp ← delabHtmlOfComponent'
257- return ← `(jsxChild | $comp:jsxElement )
260+ return ← `(proofWidgetsJsxChild | $comp:proofWidgetsJsxElement )
258261 | _ => failure
259262 catch _ =>
260263 let fallback ← delab
261- return ← `(jsxChild | { $fallback }))
264+ return ← `(proofWidgetsJsxChild | { $fallback }))
262265 catch _ =>
263266 let vs ← delab
264- return #[← `(jsxChild | {... $vs })]
267+ return #[← `(proofWidgetsJsxChild | {... $vs })]
265268
266269end
267270
@@ -270,12 +273,12 @@ end
270273@ [delab app.ProofWidgets.Html.element]
271274def delabHtmlElement : Delab := do
272275 let t ← delabHtmlElement'
273- `(term| $t:jsxElement )
276+ `(term| $t:proofWidgetsJsxElement )
274277
275278@ [delab app.ProofWidgets.Html.ofComponent]
276279def delabHtmlOfComponent : Delab := do
277280 let t ← delabHtmlOfComponent'
278- `(term| $t:jsxElement )
281+ `(term| $t:proofWidgetsJsxElement )
279282
280283end delaborator
281284
0 commit comments