aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/library/lux/data/format
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--stdlib/source/library/lux/data/format/css.lux204
-rw-r--r--stdlib/source/library/lux/data/format/css/property.lux886
-rw-r--r--stdlib/source/library/lux/data/format/css/query.lux194
-rw-r--r--stdlib/source/library/lux/data/format/css/selector.lux340
-rw-r--r--stdlib/source/library/lux/data/format/css/style.lux32
-rw-r--r--stdlib/source/library/lux/data/format/css/value.lux2548
-rw-r--r--stdlib/source/library/lux/data/format/html.lux974
-rw-r--r--stdlib/source/library/lux/data/format/markdown.lux326
-rw-r--r--stdlib/source/library/lux/data/format/tar.lux568
9 files changed, 3013 insertions, 3059 deletions
diff --git a/stdlib/source/library/lux/data/format/css.lux b/stdlib/source/library/lux/data/format/css.lux
index 8f0cc2f06..a0d849ccf 100644
--- a/stdlib/source/library/lux/data/format/css.lux
+++ b/stdlib/source/library/lux/data/format/css.lux
@@ -22,114 +22,112 @@
["[1][0]" style {"+" [Style]}]
["[1][0]" query {"+" [Query]}]])
-(abstract: .public Common {} Any)
-(abstract: .public Special {} Any)
+(abstract: .public Common Any [])
+(abstract: .public Special Any [])
(abstract: .public (CSS brand)
- {}
-
Text
- (def: .public css
- (-> (CSS Any) Text)
- (|>> :representation))
-
- (def: .public empty
- (CSS Common)
- (:abstraction ""))
+ [(def: .public css
+ (-> (CSS Any) Text)
+ (|>> :representation))
+
+ (def: .public empty
+ (CSS Common)
+ (:abstraction ""))
+
+ (def: .public (rule selector style)
+ (-> (Selector Any) Style (CSS Common))
+ (:abstraction (format (/selector.selector selector) "{" (/style.inline style) "}")))
+
+ (def: .public char_set
+ (-> Encoding (CSS Special))
+ (|>> encoding.name
+ %.text
+ (text.enclosed ["@charset " ";"])
+ :abstraction))
+
+ (def: .public (font font)
+ (-> Font (CSS Special))
+ (let [with_unicode (case (value@ #/font.unicode_range font)
+ (#.Some unicode_range)
+ (let [unicode_range' (format "U+" (\ nat.hex encoded (value@ #/font.start unicode_range))
+ "-" (\ nat.hex encoded (value@ #/font.end unicode_range)))]
+ (list ["unicode-range" unicode_range']))
+
+ #.None
+ (list))]
+ (|> (list& ["font-family" (value@ #/font.family font)]
+ ["src" (format "url(" (value@ #/font.source font) ")")]
+ ["font-stretch" (|> font (value@ #/font.stretch) (maybe.else /value.normal_stretch) /value.value)]
+ ["font-style" (|> font (value@ #/font.style) (maybe.else /value.normal_style) /value.value)]
+ ["font-weight" (|> font (value@ #/font.weight) (maybe.else /value.normal_weight) /value.value)]
+ with_unicode)
+ (list\each (function (_ [property value])
+ (format property ": " value ";")))
+ (text.interposed /style.separator)
+ (text.enclosed ["{" "}"])
+ (format "@font-face")
+ :abstraction)))
+
+ (def: .public (import url query)
+ (-> URL (Maybe Query) (CSS Special))
+ (:abstraction (format (format "@import url(" (%.text url) ")")
+ (case query
+ (#.Some query)
+ (format " " (/query.query query))
+
+ #.None
+ "")
+ ";")))
+
+ (def: css_separator
+ text.new_line)
+
+ (type: .public Frame
+ (Record
+ [#when Percentage
+ #what Style]))
+
+ (def: .public (key_frames animation frames)
+ (-> (Value Animation) (List Frame) (CSS Special))
+ (:abstraction (format "@keyframes " (/value.value animation) " {"
+ (|> frames
+ (list\each (function (_ frame)
+ (format (/value.percentage (value@ #when frame)) " {"
+ (/style.inline (value@ #what frame))
+ "}")))
+ (text.interposed ..css_separator))
+ "}")))
+
+ (template: (!composite <pre> <post>)
+ (:abstraction (format (:representation <pre>) ..css_separator
+ (:representation <post>))))
+
+ (def: .public (and pre post)
+ (-> (CSS Any) (CSS Any) (CSS Any))
+ (!composite pre post))
+
+ (def: .public (alter combinator selector css)
+ (-> Combinator (Selector Any) (CSS Common) (CSS Common))
+ (|> css
+ :representation
+ (text.all_split_by ..css_separator)
+ (list\each (|>> (format (/selector.selector (|> selector (combinator (/selector.tag "")))))))
+ (text.interposed ..css_separator)
+ :abstraction))
- (def: .public (rule selector style)
- (-> (Selector Any) Style (CSS Common))
- (:abstraction (format (/selector.selector selector) "{" (/style.inline style) "}")))
+ (def: .public (dependent combinator selector style inner)
+ (-> Combinator (Selector Any) Style (CSS Common) (CSS Common))
+ (!composite (..rule selector style)
+ (..alter combinator selector inner)))
- (def: .public char_set
- (-> Encoding (CSS Special))
- (|>> encoding.name
- %.text
- (text.enclosed ["@charset " ";"])
- :abstraction))
+ (template [<name> <combinator>]
+ [(def: .public <name>
+ (-> (Selector Any) Style (CSS Common) (CSS Common))
+ (..dependent <combinator>))]
- (def: .public (font font)
- (-> Font (CSS Special))
- (let [with_unicode (case (value@ #/font.unicode_range font)
- (#.Some unicode_range)
- (let [unicode_range' (format "U+" (\ nat.hex encoded (value@ #/font.start unicode_range))
- "-" (\ nat.hex encoded (value@ #/font.end unicode_range)))]
- (list ["unicode-range" unicode_range']))
-
- #.None
- (list))]
- (|> (list& ["font-family" (value@ #/font.family font)]
- ["src" (format "url(" (value@ #/font.source font) ")")]
- ["font-stretch" (|> font (value@ #/font.stretch) (maybe.else /value.normal_stretch) /value.value)]
- ["font-style" (|> font (value@ #/font.style) (maybe.else /value.normal_style) /value.value)]
- ["font-weight" (|> font (value@ #/font.weight) (maybe.else /value.normal_weight) /value.value)]
- with_unicode)
- (list\each (function (_ [property value])
- (format property ": " value ";")))
- (text.interposed /style.separator)
- (text.enclosed ["{" "}"])
- (format "@font-face")
- :abstraction)))
-
- (def: .public (import url query)
- (-> URL (Maybe Query) (CSS Special))
- (:abstraction (format (format "@import url(" (%.text url) ")")
- (case query
- (#.Some query)
- (format " " (/query.query query))
-
- #.None
- "")
- ";")))
-
- (def: css_separator
- text.new_line)
-
- (type: .public Frame
- (Record
- [#when Percentage
- #what Style]))
-
- (def: .public (key_frames animation frames)
- (-> (Value Animation) (List Frame) (CSS Special))
- (:abstraction (format "@keyframes " (/value.value animation) " {"
- (|> frames
- (list\each (function (_ frame)
- (format (/value.percentage (value@ #when frame)) " {"
- (/style.inline (value@ #what frame))
- "}")))
- (text.interposed ..css_separator))
- "}")))
-
- (template: (!composite <pre> <post>)
- (:abstraction (format (:representation <pre>) ..css_separator
- (:representation <post>))))
-
- (def: .public (and pre post)
- (-> (CSS Any) (CSS Any) (CSS Any))
- (!composite pre post))
-
- (def: .public (alter combinator selector css)
- (-> Combinator (Selector Any) (CSS Common) (CSS Common))
- (|> css
- :representation
- (text.all_split_by ..css_separator)
- (list\each (|>> (format (/selector.selector (|> selector (combinator (/selector.tag "")))))))
- (text.interposed ..css_separator)
- :abstraction))
-
- (def: .public (dependent combinator selector style inner)
- (-> Combinator (Selector Any) Style (CSS Common) (CSS Common))
- (!composite (..rule selector style)
- (..alter combinator selector inner)))
-
- (template [<name> <combinator>]
- [(def: .public <name>
- (-> (Selector Any) Style (CSS Common) (CSS Common))
- (..dependent <combinator>))]
-
- [with_descendants /selector.in]
- [with_children /selector.sub]
- )
+ [with_descendants /selector.in]
+ [with_children /selector.sub]
+ )]
)
diff --git a/stdlib/source/library/lux/data/format/css/property.lux b/stdlib/source/library/lux/data/format/css/property.lux
index 19b11209c..27c5a880c 100644
--- a/stdlib/source/library/lux/data/format/css/property.lux
+++ b/stdlib/source/library/lux/data/format/css/property.lux
@@ -56,450 +56,448 @@
(in (list (code.local_identifier (text.replaced "-" "_" identifier)))))
(abstract: .public (Property brand)
- {}
-
Text
- (def: .public name
- (-> (Property Any) Text)
- (|>> :representation))
-
- (template [<brand> <alias>+ <property>+]
- [(`` (template [<alias> <property>]
- [(def: .public <alias>
- (Property <brand>)
- (:abstraction <property>))]
-
- (~~ (template.spliced <alias>+))))
-
- (with_expansions [<rows> (template.spliced <property>+)]
- (template [<property>]
- [(`` (def: .public (~~ (text_identifier <property>))
- (Property <brand>)
- (:abstraction <property>)))]
-
- <rows>))]
-
- [All
- []
- [["all"]]]
-
- [Length
- []
- [["border-image-outset"]
- ["border-image-width"]
- ["bottom"]
- ["column-gap"]
- ["column-width"]
- ["flex-basis"]
- ["grid-column-gap"]
- ["grid-gap"]
- ["grid-row-gap"]
- ["height"]
- ["left"]
- ["letter-spacing"]
- ["line-height"]
- ["margin"]
- ["margin-bottom"]
- ["margin-left"]
- ["margin-right"]
- ["margin-top"]
- ["max-height"]
- ["max-width"]
- ["min-height"]
- ["min-width"]
- ["outline-offset"]
- ["padding"]
- ["padding-bottom"]
- ["padding-left"]
- ["padding-right"]
- ["padding-top"]
- ["perspective"]
- ["right"]
- ["text-indent"]
- ["top"]
- ["width"]
- ["word-spacing"]]]
-
- [Time
- []
- [["animation-delay"]
- ["animation-duration"]
- ["transition-delay"]
- ["transition-duration"]]]
-
- [Slice
- []
- [["border-image-slice"]]]
-
- [Color
- [[text_color "color"]]
- [["background-color"]
- ["border-color"]
- ["border-bottom-color"]
- ["border-left-color"]
- ["border-right-color"]
- ["border-top-color"]
- ["caret-color"]
- ["column-rule-color"]
- ["outline-color"]
- ["text-decoration-color"]]]
-
- [Alignment
- []
- [["align-content"]
- ["align-items"]
- ["align-self"]
- ["justify-content"]]]
-
- [Animation
- []
- [["animation-name"]]]
-
- [Animation_Direction
- []
- [["animation-direction"]]]
-
- [Animation_Fill
- []
- [["animation-fill-mode"]]]
-
- [Column_Fill
- []
- [["column-fill"]]]
-
- [Column_Span
- []
- [["column-span"]]]
-
- [Iteration
- []
- [["animation-iteration-count"]]]
-
- [Count
- []
- [["column-count"]
- ["flex-grow"]
- ["flex-shrink"]
- ["order"]
- ["tab-size"]]]
-
- [Play
- []
- [["animation-play-state"]]]
-
- [Timing
- []
- [["animation-timing-function"]
- ["transition-timing-function"]]]
-
- [Visibility
- []
- [["backface-visibility"]
- ["visibility"]]]
-
- [Attachment
- []
- [["background-attachment"]]]
-
- [Blend
- []
- [["background-blend-mode"]
- ["mix-blend-mode"]]]
-
- [Image
- []
- [["background-image"]
- ["border-image-source"]
- ["list-style-image"]]]
-
- [Span
- []
- [["background-clip"]
- ["background-origin"]
- ["box-sizing"]]]
-
- [Location
- []
- [["background-position"]
- ["object-position"]
- ["perspective-origin"]]]
-
- [Repeat
- []
- [["background-repeat"]
- ["border-image-repeat"]]]
-
- [Fit
- []
- [["background-size"]
- ["border-radius"]
- ["border-bottom-left-radius"]
- ["border-bottom-right-radius"]
- ["border-top-left-radius"]
- ["border-top-right-radius"]
- ["border-spacing"]
- ["object-fit"]]]
-
- [Border
- []
- [["border-style"]
- ["border-bottom-style"]
- ["border-left-style"]
- ["border-right-style"]
- ["border-top-style"]
- ["column-rule-style"]
- ["outline-style"]]]
-
- [Thickness
- []
- [["border-width"]
- ["border-bottom-width"]
- ["border-left-width"]
- ["border-right-width"]
- ["border-top-width"]
- ["column-rule-width"]
- ["outline-width"]]]
-
- [Collapse
- []
- [["border-collapse"]]]
-
- [Box_Decoration_Break
- []
- [["box-decoration-break"]]]
-
- [Caption
- []
- [["caption-side"]]]
-
- [Clear
- []
- [["clear"]]]
-
- [Shadow
- []
- [["box-shadow"]
- ["text-shadow"]]]
-
- [Clip
- []
- [["clip"]]]
-
- [Content
- []
- [["counter-reset"]
- ["counter-increment"]]]
-
- [Cursor
- []
- [["cursor"]]]
-
- [Text_Direction
- [[text_direction "direction"]]
- []]
-
- [Display
- []
- [["display"]]]
-
- [Empty
- []
- [["empty-cells"]]]
-
- [Filter
- []
- [["filter"]]]
-
- [Flex_Direction
- []
- [["flex-direction"]]]
-
- [Flex_Wrap
- []
- [["flex-wrap"]]]
-
- [Float
- []
- [["float"]]]
-
- [Font
- []
- [["font-family"]]]
-
- [Font_Kerning
- []
- [["font-kerning"]]]
-
- [Font_Size
- []
- [["font-size"]]]
-
- [Number
- []
- [["font-size-adjust"]
- ["opacity"]]]
-
- [Font_Variant
- []
- [["font-variant"]]]
-
- [Grid
- []
- [["grid-area"]]]
-
- [Grid_Content
- []
- [["grid-auto-columns"]
- ["grid-auto-rows"]
- ["grid-template-columns"]
- ["grid-template-rows"]]]
-
- [Grid_Flow
- []
- [["grid-auto-flow"]]]
-
- [Grid_Span
- []
- [["grid-column-end"]
- ["grid-column-start"]
- ["grid-row-end"]
- ["grid-row-start"]]]
-
- [Grid_Template
- []
- [["grid-template-areas"]]]
-
- [Hanging_Punctuation
- []
- [["hanging-punctuation"]]]
-
- [Hyphens
- []
- [["hyphens"]]]
-
- [Isolation
- []
- [["isolation"]]]
-
- [List_Style_Position
- []
- [["list-style-position"]]]
-
- [List_Style_Type
- []
- [["list-style-type"]]]
-
- [Overflow
- []
- [["overflow"]
- ["overflow-x"]
- ["overflow-y"]]]
-
- [Page_Break
- []
- [["page-break-after"]
- ["page-break-before"]
- ["page-break-inside"]]]
-
- [Pointer_Events
- []
- [["pointer-events"]]]
-
- [Position
- []
- [["position"]]]
-
- [Quotes
- []
- [["quotes"]]]
-
- [Resize
- []
- [["resize"]]]
-
- [Scroll_Behavior
- []
- [["scroll-behavior"]]]
-
- [Table_Layout
- []
- [["table-layout"]]]
-
- [Text_Align
- []
- [["text-align"]]]
-
- [Text_Align_Last
- []
- [["text-align-last"]]]
-
- [Text_Decoration_Line
- []
- [["text-decoration-line"]]]
-
- [Text_Decoration_Style
- []
- [["text-decoration-style"]]]
-
- [Text_Justification
- []
- [["text-justify"]]]
-
- [Text_Overflow
- []
- [["text-overflow"]]]
-
- [Text_Transform
- []
- [["text-transform"]]]
-
- [Transform
- []
- [["transform"]]]
-
- [Transform_Origin
- []
- [["transform-origin"]]]
-
- [Transform_Style
- []
- [["transform-style"]]]
-
- [Transition
- []
- [["transition-property"]]]
-
- [Bidi
- []
- [["unicode-bidi"]]]
-
- [User_Select
- []
- [["user-select"]]]
-
- [Vertical_Align
- []
- [["vertical-align"]]]
-
- [White_Space
- []
- [["white-space"]]]
-
- [Word_Break
- []
- [["word-break"]]]
-
- [Word_Wrap
- []
- [["word-wrap"]]]
-
- [Writing_Mode
- []
- [["writing-mode"]]]
-
- [Z_Index
- []
- [["z-index"]]]
- )
+ [(def: .public name
+ (-> (Property Any) Text)
+ (|>> :representation))
+
+ (template [<brand> <alias>+ <property>+]
+ [(`` (template [<alias> <property>]
+ [(def: .public <alias>
+ (Property <brand>)
+ (:abstraction <property>))]
+
+ (~~ (template.spliced <alias>+))))
+
+ (with_expansions [<rows> (template.spliced <property>+)]
+ (template [<property>]
+ [(`` (def: .public (~~ (text_identifier <property>))
+ (Property <brand>)
+ (:abstraction <property>)))]
+
+ <rows>))]
+
+ [All
+ []
+ [["all"]]]
+
+ [Length
+ []
+ [["border-image-outset"]
+ ["border-image-width"]
+ ["bottom"]
+ ["column-gap"]
+ ["column-width"]
+ ["flex-basis"]
+ ["grid-column-gap"]
+ ["grid-gap"]
+ ["grid-row-gap"]
+ ["height"]
+ ["left"]
+ ["letter-spacing"]
+ ["line-height"]
+ ["margin"]
+ ["margin-bottom"]
+ ["margin-left"]
+ ["margin-right"]
+ ["margin-top"]
+ ["max-height"]
+ ["max-width"]
+ ["min-height"]
+ ["min-width"]
+ ["outline-offset"]
+ ["padding"]
+ ["padding-bottom"]
+ ["padding-left"]
+ ["padding-right"]
+ ["padding-top"]
+ ["perspective"]
+ ["right"]
+ ["text-indent"]
+ ["top"]
+ ["width"]
+ ["word-spacing"]]]
+
+ [Time
+ []
+ [["animation-delay"]
+ ["animation-duration"]
+ ["transition-delay"]
+ ["transition-duration"]]]
+
+ [Slice
+ []
+ [["border-image-slice"]]]
+
+ [Color
+ [[text_color "color"]]
+ [["background-color"]
+ ["border-color"]
+ ["border-bottom-color"]
+ ["border-left-color"]
+ ["border-right-color"]
+ ["border-top-color"]
+ ["caret-color"]
+ ["column-rule-color"]
+ ["outline-color"]
+ ["text-decoration-color"]]]
+
+ [Alignment
+ []
+ [["align-content"]
+ ["align-items"]
+ ["align-self"]
+ ["justify-content"]]]
+
+ [Animation
+ []
+ [["animation-name"]]]
+
+ [Animation_Direction
+ []
+ [["animation-direction"]]]
+
+ [Animation_Fill
+ []
+ [["animation-fill-mode"]]]
+
+ [Column_Fill
+ []
+ [["column-fill"]]]
+
+ [Column_Span
+ []
+ [["column-span"]]]
+
+ [Iteration
+ []
+ [["animation-iteration-count"]]]
+
+ [Count
+ []
+ [["column-count"]
+ ["flex-grow"]
+ ["flex-shrink"]
+ ["order"]
+ ["tab-size"]]]
+
+ [Play
+ []
+ [["animation-play-state"]]]
+
+ [Timing
+ []
+ [["animation-timing-function"]
+ ["transition-timing-function"]]]
+
+ [Visibility
+ []
+ [["backface-visibility"]
+ ["visibility"]]]
+
+ [Attachment
+ []
+ [["background-attachment"]]]
+
+ [Blend
+ []
+ [["background-blend-mode"]
+ ["mix-blend-mode"]]]
+
+ [Image
+ []
+ [["background-image"]
+ ["border-image-source"]
+ ["list-style-image"]]]
+
+ [Span
+ []
+ [["background-clip"]
+ ["background-origin"]
+ ["box-sizing"]]]
+
+ [Location
+ []
+ [["background-position"]
+ ["object-position"]
+ ["perspective-origin"]]]
+
+ [Repeat
+ []
+ [["background-repeat"]
+ ["border-image-repeat"]]]
+
+ [Fit
+ []
+ [["background-size"]
+ ["border-radius"]
+ ["border-bottom-left-radius"]
+ ["border-bottom-right-radius"]
+ ["border-top-left-radius"]
+ ["border-top-right-radius"]
+ ["border-spacing"]
+ ["object-fit"]]]
+
+ [Border
+ []
+ [["border-style"]
+ ["border-bottom-style"]
+ ["border-left-style"]
+ ["border-right-style"]
+ ["border-top-style"]
+ ["column-rule-style"]
+ ["outline-style"]]]
+
+ [Thickness
+ []
+ [["border-width"]
+ ["border-bottom-width"]
+ ["border-left-width"]
+ ["border-right-width"]
+ ["border-top-width"]
+ ["column-rule-width"]
+ ["outline-width"]]]
+
+ [Collapse
+ []
+ [["border-collapse"]]]
+
+ [Box_Decoration_Break
+ []
+ [["box-decoration-break"]]]
+
+ [Caption
+ []
+ [["caption-side"]]]
+
+ [Clear
+ []
+ [["clear"]]]
+
+ [Shadow
+ []
+ [["box-shadow"]
+ ["text-shadow"]]]
+
+ [Clip
+ []
+ [["clip"]]]
+
+ [Content
+ []
+ [["counter-reset"]
+ ["counter-increment"]]]
+
+ [Cursor
+ []
+ [["cursor"]]]
+
+ [Text_Direction
+ [[text_direction "direction"]]
+ []]
+
+ [Display
+ []
+ [["display"]]]
+
+ [Empty
+ []
+ [["empty-cells"]]]
+
+ [Filter
+ []
+ [["filter"]]]
+
+ [Flex_Direction
+ []
+ [["flex-direction"]]]
+
+ [Flex_Wrap
+ []
+ [["flex-wrap"]]]
+
+ [Float
+ []
+ [["float"]]]
+
+ [Font
+ []
+ [["font-family"]]]
+
+ [Font_Kerning
+ []
+ [["font-kerning"]]]
+
+ [Font_Size
+ []
+ [["font-size"]]]
+
+ [Number
+ []
+ [["font-size-adjust"]
+ ["opacity"]]]
+
+ [Font_Variant
+ []
+ [["font-variant"]]]
+
+ [Grid
+ []
+ [["grid-area"]]]
+
+ [Grid_Content
+ []
+ [["grid-auto-columns"]
+ ["grid-auto-rows"]
+ ["grid-template-columns"]
+ ["grid-template-rows"]]]
+
+ [Grid_Flow
+ []
+ [["grid-auto-flow"]]]
+
+ [Grid_Span
+ []
+ [["grid-column-end"]
+ ["grid-column-start"]
+ ["grid-row-end"]
+ ["grid-row-start"]]]
+
+ [Grid_Template
+ []
+ [["grid-template-areas"]]]
+
+ [Hanging_Punctuation
+ []
+ [["hanging-punctuation"]]]
+
+ [Hyphens
+ []
+ [["hyphens"]]]
+
+ [Isolation
+ []
+ [["isolation"]]]
+
+ [List_Style_Position
+ []
+ [["list-style-position"]]]
+
+ [List_Style_Type
+ []
+ [["list-style-type"]]]
+
+ [Overflow
+ []
+ [["overflow"]
+ ["overflow-x"]
+ ["overflow-y"]]]
+
+ [Page_Break
+ []
+ [["page-break-after"]
+ ["page-break-before"]
+ ["page-break-inside"]]]
+
+ [Pointer_Events
+ []
+ [["pointer-events"]]]
+
+ [Position
+ []
+ [["position"]]]
+
+ [Quotes
+ []
+ [["quotes"]]]
+
+ [Resize
+ []
+ [["resize"]]]
+
+ [Scroll_Behavior
+ []
+ [["scroll-behavior"]]]
+
+ [Table_Layout
+ []
+ [["table-layout"]]]
+
+ [Text_Align
+ []
+ [["text-align"]]]
+
+ [Text_Align_Last
+ []
+ [["text-align-last"]]]
+
+ [Text_Decoration_Line
+ []
+ [["text-decoration-line"]]]
+
+ [Text_Decoration_Style
+ []
+ [["text-decoration-style"]]]
+
+ [Text_Justification
+ []
+ [["text-justify"]]]
+
+ [Text_Overflow
+ []
+ [["text-overflow"]]]
+
+ [Text_Transform
+ []
+ [["text-transform"]]]
+
+ [Transform
+ []
+ [["transform"]]]
+
+ [Transform_Origin
+ []
+ [["transform-origin"]]]
+
+ [Transform_Style
+ []
+ [["transform-style"]]]
+
+ [Transition
+ []
+ [["transition-property"]]]
+
+ [Bidi
+ []
+ [["unicode-bidi"]]]
+
+ [User_Select
+ []
+ [["user-select"]]]
+
+ [Vertical_Align
+ []
+ [["vertical-align"]]]
+
+ [White_Space
+ []
+ [["white-space"]]]
+
+ [Word_Break
+ []
+ [["word-break"]]]
+
+ [Word_Wrap
+ []
+ [["word-wrap"]]]
+
+ [Writing_Mode
+ []
+ [["writing-mode"]]]
+
+ [Z_Index
+ []
+ [["z-index"]]]
+ )]
)
diff --git a/stdlib/source/library/lux/data/format/css/query.lux b/stdlib/source/library/lux/data/format/css/query.lux
index adaed39ab..fe4c8f7d4 100644
--- a/stdlib/source/library/lux/data/format/css/query.lux
+++ b/stdlib/source/library/lux/data/format/css/query.lux
@@ -25,117 +25,111 @@
(in (list (code.local_identifier (text.replaced "-" "_" identifier)))))
(abstract: .public Media
- {}
-
Text
- (def: .public media
- (-> Media Text)
- (|>> :representation))
+ [(def: .public media
+ (-> Media Text)
+ (|>> :representation))
- (template [<media>]
- [(`` (def: .public (~~ (text_identifier <media>))
- Media
- (:abstraction <media>)))]
+ (template [<media>]
+ [(`` (def: .public (~~ (text_identifier <media>))
+ Media
+ (:abstraction <media>)))]
- ["all"]
- ["print"]
- ["screen"]
- ["speech"]
- ))
+ ["all"]
+ ["print"]
+ ["screen"]
+ ["speech"]
+ )])
(abstract: .public Feature
- {}
-
Text
- (def: .public feature
- (-> Feature Text)
- (|>> :representation))
-
- (template [<feature> <brand>]
- [(`` (def: .public ((~~ (text_identifier <feature>)) input)
- (-> (Value <brand>) Feature)
- (:abstraction (format "(" <feature> ": " (//value.value input) ")"))))]
-
- ["min-color" Count]
- ["color" Count]
- ["max-color" Count]
-
- ["min-color-index" Count]
- ["color-index" Count]
- ["max-color-index" Count]
-
- ["min-monochrome" Count]
- ["monochrome" Count]
- ["max-monochrome" Count]
-
- ["min-height" Length]
- ["height" Length]
- ["max-height" Length]
-
- ["min-width" Length]
- ["width" Length]
- ["max-width" Length]
-
- ["min-resolution" Resolution]
- ["resolution" Resolution]
- ["max-resolution" Resolution]
-
- ["aspect-ratio" Ratio]
- ["max-aspect-ratio" Ratio]
- ["min-aspect-ratio" Ratio]
-
- ["display-mode" Display_Mode]
- ["color-gamut" Color_Gamut]
- ["grid" Boolean]
- ["orientation" Orientation]
- ["overflow-block" Block_Overflow]
- ["overflow-inline" Inline_Overflow]
- ["scan" Scan]
- ["update" Update]
- ["inverted-colors" Inverted_Colors]
- ["pointer" Pointer]
- ["any-pointer" Pointer]
- ["hover" Hover]
- ["any-hover" Hover]
- ["light-level" Light]
- ["scripting" Scripting]
- ["prefers-reduced-motion" Motion]
- ["prefers-color-scheme" Color_Scheme]
- )
+ [(def: .public feature
+ (-> Feature Text)
+ (|>> :representation))
+
+ (template [<feature> <brand>]
+ [(`` (def: .public ((~~ (text_identifier <feature>)) input)
+ (-> (Value <brand>) Feature)
+ (:abstraction (format "(" <feature> ": " (//value.value input) ")"))))]
+
+ ["min-color" Count]
+ ["color" Count]
+ ["max-color" Count]
+
+ ["min-color-index" Count]
+ ["color-index" Count]
+ ["max-color-index" Count]
+
+ ["min-monochrome" Count]
+ ["monochrome" Count]
+ ["max-monochrome" Count]
+
+ ["min-height" Length]
+ ["height" Length]
+ ["max-height" Length]
+
+ ["min-width" Length]
+ ["width" Length]
+ ["max-width" Length]
+
+ ["min-resolution" Resolution]
+ ["resolution" Resolution]
+ ["max-resolution" Resolution]
+
+ ["aspect-ratio" Ratio]
+ ["max-aspect-ratio" Ratio]
+ ["min-aspect-ratio" Ratio]
+
+ ["display-mode" Display_Mode]
+ ["color-gamut" Color_Gamut]
+ ["grid" Boolean]
+ ["orientation" Orientation]
+ ["overflow-block" Block_Overflow]
+ ["overflow-inline" Inline_Overflow]
+ ["scan" Scan]
+ ["update" Update]
+ ["inverted-colors" Inverted_Colors]
+ ["pointer" Pointer]
+ ["any-pointer" Pointer]
+ ["hover" Hover]
+ ["any-hover" Hover]
+ ["light-level" Light]
+ ["scripting" Scripting]
+ ["prefers-reduced-motion" Motion]
+ ["prefers-color-scheme" Color_Scheme]
+ )]
)
(abstract: .public Query
- {}
-
Text
- (def: .public query
- (-> Query Text)
- (|>> :representation))
-
- (template [<name> <operator>]
- [(def: .public <name>
- (-> Media Query)
- (|>> ..media (format <operator>) :abstraction))]
-
- [except "not "]
- [only "only "]
- )
-
- (def: .public not
- (-> Feature Query)
- (|>> ..feature (format "not ") :abstraction))
-
- (template [<name> <operator>]
- [(def: .public (<name> left right)
- (-> Query Query Query)
- (:abstraction (format (:representation left)
- <operator>
- (:representation right))))]
-
- [and " and "]
- [or " or "]
- )
+ [(def: .public query
+ (-> Query Text)
+ (|>> :representation))
+
+ (template [<name> <operator>]
+ [(def: .public <name>
+ (-> Media Query)
+ (|>> ..media (format <operator>) :abstraction))]
+
+ [except "not "]
+ [only "only "]
+ )
+
+ (def: .public not
+ (-> Feature Query)
+ (|>> ..feature (format "not ") :abstraction))
+
+ (template [<name> <operator>]
+ [(def: .public (<name> left right)
+ (-> Query Query Query)
+ (:abstraction (format (:representation left)
+ <operator>
+ (:representation right))))]
+
+ [and " and "]
+ [or " or "]
+ )]
)
diff --git a/stdlib/source/library/lux/data/format/css/selector.lux b/stdlib/source/library/lux/data/format/css/selector.lux
index c2742f93a..38eda4881 100644
--- a/stdlib/source/library/lux/data/format/css/selector.lux
+++ b/stdlib/source/library/lux/data/format/css/selector.lux
@@ -19,192 +19,188 @@
(type: .public Class Label)
(type: .public Attribute Label)
-(abstract: .public (Generic brand) {} Any)
+(abstract: .public (Generic brand) Any [])
(template [<generic> <brand>]
- [(abstract: <brand> {} Any)
+ [(abstract: <brand> Any [])
(type: .public <generic> (Generic <brand>))]
[Can_Chain Can_Chain']
[Cannot_Chain Cannot_Chain']
)
-(abstract: .public Unique {} Any)
-(abstract: .public Specific {} Any)
-(abstract: .public Composite {} Any)
+(abstract: .public Unique Any [])
+(abstract: .public Specific Any [])
+(abstract: .public Composite Any [])
(abstract: .public (Selector kind)
- {}
-
Text
- (def: .public selector
- (-> (Selector Any) Text)
- (|>> :representation))
-
- (def: .public any
- (Selector Cannot_Chain)
- (:abstraction "*"))
-
- (def: .public tag
- (-> Tag (Selector Cannot_Chain))
- (|>> :abstraction))
-
- (template [<name> <type> <prefix> <kind>]
- [(def: .public <name>
- (-> <type> (Selector <kind>))
- (|>> (format <prefix>) :abstraction))]
-
- [id ID "#" Unique]
- [class Class "." Can_Chain]
- )
-
- (template [<right> <left> <combo> <combinator>+]
- [(`` (template [<combinator> <name>]
- [(def: .public (<name> right left)
- (-> (Selector <right>) (Selector <left>) (Selector <combo>))
- (:abstraction (format (:representation left)
- <combinator>
- (:representation right))))]
-
- (~~ (template.spliced <combinator>+))))]
-
- [Can_Chain (Generic Any) Can_Chain
- [["" and]]]
- [Unique (Generic Any) Composite
- [["" for]]]
- [Specific (Generic Any) Composite
- [["" at]]]
- [Any Any Composite
- [["," or]
- [" " in]
- [">" sub]
- ["+" next]
- ["~" later]]]
- )
-
- (type: .public Combinator
- (-> (Selector Any) (Selector Any) (Selector Composite)))
-
- (def: .public (with? attribute)
- (-> Attribute (Selector Can_Chain))
- (:abstraction (format "[" attribute "]")))
-
- (template [<check> <name>]
- [(def: .public (<name> attribute value)
- (-> Attribute Text (Selector Can_Chain))
- (:abstraction (format "[" attribute <check> value "]")))]
-
- ["=" same?]
- ["~=" has?]
- ["|=" has_start?]
- ["^=" starts?]
- ["$=" ends?]
- ["*=" contains?]
- )
-
- (template [<kind> <pseudo>+]
- [(`` (template [<name> <pseudo>]
- [(def: .public <name>
- (Selector Can_Chain)
- (:abstraction <pseudo>))]
-
- (~~ (template.spliced <pseudo>+))))]
-
- [Can_Chain
- [[active ":active"]
- [checked ":checked"]
- [default ":default"]
- [disabled ":disabled"]
- [empty ":empty"]
- [enabled ":enabled"]
- [first_child ":first-child"]
- [first_of_type ":first-of-type"]
- [focused ":focus"]
- [hovered ":hover"]
- [in_range ":in-range"]
- [indeterminate ":indeterminate"]
- [invalid ":invalid"]
- [last_child ":last-child"]
- [last_of_type ":last-of-type"]
- [link ":link"]
- [only_of_type ":only-of-type"]
- [only_child ":only-child"]
- [optional ":optional"]
- [out_of_range ":out-of-range"]
- [read_only ":read-only"]
- [read_write ":read-write"]
- [required ":required"]
- [root ":root"]
- [target ":target"]
- [valid ":valid"]
- [visited ":visited"]]]
-
- [Specific
- [[after "::after"]
- [before "::before"]
- [first_letter "::first-letter"]
- [first_line "::first-line"]
- [placeholder "::placeholder"]
- [selection "::selection"]]]
- )
-
- (def: .public (language locale)
- (-> Locale (Selector Can_Chain))
- (|> locale
- locale.code
- (text.enclosed ["(" ")"])
- (format ":lang")
- :abstraction))
-
- (def: .public not
- (-> (Selector Any) (Selector Can_Chain))
- (|>> :representation
+ [(def: .public selector
+ (-> (Selector Any) Text)
+ (|>> :representation))
+
+ (def: .public any
+ (Selector Cannot_Chain)
+ (:abstraction "*"))
+
+ (def: .public tag
+ (-> Tag (Selector Cannot_Chain))
+ (|>> :abstraction))
+
+ (template [<name> <type> <prefix> <kind>]
+ [(def: .public <name>
+ (-> <type> (Selector <kind>))
+ (|>> (format <prefix>) :abstraction))]
+
+ [id ID "#" Unique]
+ [class Class "." Can_Chain]
+ )
+
+ (template [<right> <left> <combo> <combinator>+]
+ [(`` (template [<combinator> <name>]
+ [(def: .public (<name> right left)
+ (-> (Selector <right>) (Selector <left>) (Selector <combo>))
+ (:abstraction (format (:representation left)
+ <combinator>
+ (:representation right))))]
+
+ (~~ (template.spliced <combinator>+))))]
+
+ [Can_Chain (Generic Any) Can_Chain
+ [["" and]]]
+ [Unique (Generic Any) Composite
+ [["" for]]]
+ [Specific (Generic Any) Composite
+ [["" at]]]
+ [Any Any Composite
+ [["," or]
+ [" " in]
+ [">" sub]
+ ["+" next]
+ ["~" later]]]
+ )
+
+ (type: .public Combinator
+ (-> (Selector Any) (Selector Any) (Selector Composite)))
+
+ (def: .public (with? attribute)
+ (-> Attribute (Selector Can_Chain))
+ (:abstraction (format "[" attribute "]")))
+
+ (template [<check> <name>]
+ [(def: .public (<name> attribute value)
+ (-> Attribute Text (Selector Can_Chain))
+ (:abstraction (format "[" attribute <check> value "]")))]
+
+ ["=" same?]
+ ["~=" has?]
+ ["|=" has_start?]
+ ["^=" starts?]
+ ["$=" ends?]
+ ["*=" contains?]
+ )
+
+ (template [<kind> <pseudo>+]
+ [(`` (template [<name> <pseudo>]
+ [(def: .public <name>
+ (Selector Can_Chain)
+ (:abstraction <pseudo>))]
+
+ (~~ (template.spliced <pseudo>+))))]
+
+ [Can_Chain
+ [[active ":active"]
+ [checked ":checked"]
+ [default ":default"]
+ [disabled ":disabled"]
+ [empty ":empty"]
+ [enabled ":enabled"]
+ [first_child ":first-child"]
+ [first_of_type ":first-of-type"]
+ [focused ":focus"]
+ [hovered ":hover"]
+ [in_range ":in-range"]
+ [indeterminate ":indeterminate"]
+ [invalid ":invalid"]
+ [last_child ":last-child"]
+ [last_of_type ":last-of-type"]
+ [link ":link"]
+ [only_of_type ":only-of-type"]
+ [only_child ":only-child"]
+ [optional ":optional"]
+ [out_of_range ":out-of-range"]
+ [read_only ":read-only"]
+ [read_write ":read-write"]
+ [required ":required"]
+ [root ":root"]
+ [target ":target"]
+ [valid ":valid"]
+ [visited ":visited"]]]
+
+ [Specific
+ [[after "::after"]
+ [before "::before"]
+ [first_letter "::first-letter"]
+ [first_line "::first-line"]
+ [placeholder "::placeholder"]
+ [selection "::selection"]]]
+ )
+
+ (def: .public (language locale)
+ (-> Locale (Selector Can_Chain))
+ (|> locale
+ locale.code
(text.enclosed ["(" ")"])
- (format ":not")
+ (format ":lang")
:abstraction))
- (abstract: .public Index
- {}
-
- Text
-
- (def: .public index
- (-> Nat Index)
- (|>> %.nat :abstraction))
-
- (template [<name> <index>]
- [(def: .public <name> Index (:abstraction <index>))]
+ (def: .public not
+ (-> (Selector Any) (Selector Can_Chain))
+ (|>> :representation
+ (text.enclosed ["(" ")"])
+ (format ":not")
+ :abstraction))
+
+ (abstract: .public Index
+ Text
+
+ [(def: .public index
+ (-> Nat Index)
+ (|>> %.nat :abstraction))
+
+ (template [<name> <index>]
+ [(def: .public <name> Index (:abstraction <index>))]
+
+ [odd "odd"]
+ [even "even"]
+ )
+
+ (type: .public Formula
+ (Record
+ [#constant Int
+ #variable Int]))
+
+ (def: .public (formula input)
+ (-> Formula Index)
+ (let [(^slots [#constant #variable]) input]
+ (:abstraction (format (if (i.< +0 variable)
+ (%.int variable)
+ (%.nat (.nat variable)))
+ (%.int constant)))))
- [odd "odd"]
- [even "even"]
- )
-
- (type: .public Formula
- (Record
- [#constant Int
- #variable Int]))
-
- (def: .public (formula input)
- (-> Formula Index)
- (let [(^slots [#constant #variable]) input]
- (:abstraction (format (if (i.< +0 variable)
- (%.int variable)
- (%.nat (.nat variable)))
- (%.int constant)))))
-
- (template [<name> <pseudo>]
- [(def: .public (<name> index)
- (-> Index (Selector Can_Chain))
- (|> (:representation index)
- (text.enclosed ["(" ")"])
- (format <pseudo>)
- (:abstraction Selector)))]
-
- [nth_child ":nth-child"]
- [nth_last_child ":nth-last-child"]
- [nth_last_of_type ":nth-last-of-type"]
- [nth_of_type ":nth-of-type"]
- )
- )
+ (template [<name> <pseudo>]
+ [(def: .public (<name> index)
+ (-> Index (Selector Can_Chain))
+ (|> (:representation index)
+ (text.enclosed ["(" ")"])
+ (format <pseudo>)
+ (:abstraction Selector)))]
+
+ [nth_child ":nth-child"]
+ [nth_last_child ":nth-last-child"]
+ [nth_last_of_type ":nth-last-of-type"]
+ [nth_of_type ":nth-of-type"]
+ )]
+ )]
)
diff --git a/stdlib/source/library/lux/data/format/css/style.lux b/stdlib/source/library/lux/data/format/css/style.lux
index 8fe761893..37b80b4ce 100644
--- a/stdlib/source/library/lux/data/format/css/style.lux
+++ b/stdlib/source/library/lux/data/format/css/style.lux
@@ -11,26 +11,24 @@
["[1][0]" property {"+" [Property]}]])
(abstract: .public Style
- {#.doc "The style associated with a CSS selector."}
-
Text
- (def: .public empty
- Style
- (:abstraction ""))
+ [(def: .public empty
+ Style
+ (:abstraction ""))
- (def: .public separator
- " ")
+ (def: .public separator
+ " ")
- (def: .public (with [property value])
- (All (_ brand)
- (-> [(Property brand) (Value brand)]
- (-> Style Style)))
- (|>> :representation
- (format (//property.name property) ": " (//value.value value) ";" ..separator)
- :abstraction))
+ (def: .public (with [property value])
+ (All (_ brand)
+ (-> [(Property brand) (Value brand)]
+ (-> Style Style)))
+ (|>> :representation
+ (format (//property.name property) ": " (//value.value value) ";" ..separator)
+ :abstraction))
- (def: .public inline
- (-> Style Text)
- (|>> :representation))
+ (def: .public inline
+ (-> Style Text)
+ (|>> :representation))]
)
diff --git a/stdlib/source/library/lux/data/format/css/value.lux b/stdlib/source/library/lux/data/format/css/value.lux
index 9569c445b..ae4393448 100644
--- a/stdlib/source/library/lux/data/format/css/value.lux
+++ b/stdlib/source/library/lux/data/format/css/value.lux
@@ -33,21 +33,19 @@
(template: (enumeration: <abstraction> <representation> <out> <sample>+ <definition>+)
(abstract: .public <abstraction>
- {}
-
<representation>
- (def: .public <out>
- (-> <abstraction> <representation>)
- (|>> :representation))
+ [(def: .public <out>
+ (-> <abstraction> <representation>)
+ (|>> :representation))
- (`` (template [<name> <value>]
- [(def: .public <name> <abstraction> (:abstraction <value>))]
+ (`` (template [<name> <value>]
+ [(def: .public <name> <abstraction> (:abstraction <value>))]
- (~~ (template.spliced <sample>+))
- ))
+ (~~ (template.spliced <sample>+))
+ ))
- (template.spliced <definition>+)))
+ (template.spliced <definition>+)]))
(template: (multi: <multi> <type> <separator>)
(def: .public (<multi> pre post)
@@ -64,1281 +62,1271 @@
(|> raw (text.split_at 1) maybe.trusted product.right))))
(abstract: .public (Value brand)
- {}
-
Text
- (def: .public value
- (-> (Value Any) Text)
- (|>> :representation))
-
- (template [<name> <value>]
- [(def: .public <name> Value (:abstraction <value>))]
-
- [initial "initial"]
- [inherit "inherit"]
- [unset "unset"]
- )
-
- (template [<brand> <alias>+ <value>+]
- [(abstract: .public <brand> {} Any)
-
- (`` (template [<name> <value>]
- [(def: .public <name>
- (Value <brand>)
- (:abstraction <value>))]
-
- (~~ (template.spliced <alias>+))))
-
- (with_expansions [<rows> (template.spliced <value>+)]
- (template [<value>]
- [(`` (def: .public (~~ (..text_identifier <value>))
- (Value <brand>)
- (:abstraction <value>)))]
-
- <rows>))]
-
- [All
- []
- []]
-
- [Number
- []
- []]
-
- [Length
- []
- []]
-
- [Time
- []
- []]
-
- [Thickness
- []
- [["medium"]
- ["thin"]
- ["thick"]]]
-
- [Slice
- [[full_slice "fill"]]
- []]
-
- [Alignment
- [[auto_alignment "auto"]]
- [["stretch"]
- ["center"]
- ["flex-start"]
- ["flex-end"]
- ["baseline"]
- ["space-between"]
- ["space-around"]]]
-
- [Animation
- []
- []]
-
- [Animation_Direction
- [[normal_direction "normal"]]
- [["reverse"]
- ["alternate"]
- ["alternate-reverse"]]]
-
- [Animation_Fill
- [[fill_forwards "forwards"]
- [fill_backwards "backwards"]
- [fill_both "both"]]
- []]
-
- [Column_Fill
- []
- [["balance"]
- ["auto"]]]
-
- [Column_Span
- []
- [["all"]]]
-
- [Iteration
- []
- [["infinite"]]]
-
- [Count
- []
- []]
-
- [Play
- []
- [["paused"]
- ["running"]]]
-
- [Timing
- []
- [["linear"]
- ["ease"]
- ["ease-in"]
- ["ease-out"]
- ["ease-in-out"]
- ["step-start"]
- ["step-end"]]]
-
- [Visibility
- [[invisible "hidden"]
- [collapse_visibility "collapse"]]
- [["visible"]]]
-
- [Attachment
- [[scroll_attachment "scroll"]
- [fixed_attachment "fixed"]
- [local_attachment "local"]]
- []]
-
- [Blend
- [[normal_blend "normal"]]
- [["multiply"]
- ["screen"]
- ["overlay"]
- ["darken"]
- ["lighten"]
- ["color-dodge"]
- ["color-burn"]
- ["difference"]
- ["exclusion"]
- ["hue"]
- ["saturation"]
- ["color"]
- ["luminosity"]]]
-
- [Span
- []
- [["border-box"]
- ["padding-box"]
- ["content-box"]]]
-
- [Image
- [[no_image "none"]]
- []]
-
- [Repeat
- [[stretch_repeat "stretch"]]
- [["repeat"]
- ["repeat-x"]
- ["repeat-y"]
- ["no-repeat"]
- ["space"]
- ["round"]]]
-
- [Location
- [[left_top "left top"]
- [left_center "left center"]
- [left_bottom "left bottom"]
- [right_top "right top"]
- [right_center "right center"]
- [right_bottom "right bottom"]
- [center_top "center top"]
- [center_center "center center"]
- [center_bottom "center bottom"]]
- []]
-
- [Fit
- [[no_fit "none"]]
- [["fill"]
- ["cover"]
- ["contain"]
- ["scale-down"]]]
-
- [Border
- []
- [["hidden"]
- ["dotted"]
- ["dashed"]
- ["solid"]
- ["double"]
- ["groove"]
- ["ridge"]
- ["inset"]
- ["outset"]]]
-
- [Collapse
- []
- [["separate"]
- ["collapse"]]]
-
- [Box_Decoration_Break
- []
- [["slice"]
- ["clone"]]]
-
- [Caption
- []
- [["top"]
- ["bottom"]]]
-
- [Float
- [[float_left "left"]
- [float_right "right"]]
- []]
-
- [Clear
- [[clear_left "left"]
- [clear_right "right"]
- [clear_both "both"]]
- []]
-
- [Counter
- []
- []]
-
- [Content
- []
- [["open-quote"]
- ["close-quote"]
- ["no-open-quote"]
- ["no-close-quote"]]]
-
- [Cursor
- [[horizontal_text "text"]
- [no_cursor "none"]]
- [["alias"]
- ["all-scroll"]
- ["cell"]
- ["context-menu"]
- ["col-resize"]
- ["copy"]
- ["crosshair"]
- ["default"]
- ["e-resize"]
- ["ew-resize"]
- ["grab"]
- ["grabbing"]
- ["help"]
- ["move"]
- ["n-resize"]
- ["ne-resize"]
- ["nesw-resize"]
- ["ns-resize"]
- ["nw-resize"]
- ["nwse-resize"]
- ["no-drop"]
- ["not-allowed"]
- ["pointer"]
- ["progress"]
- ["row-resize"]
- ["s-resize"]
- ["se-resize"]
- ["sw-resize"]
- ["vertical-text"]
- ["w-resize"]
- ["wait"]
- ["zoom-in"]
- ["zoom-out"]]]
-
- [Shadow
- []
- []]
-
- [Clip
- []
- []]
-
- [Text_Direction
- [[left_to_right "ltr"]
- [right_to_left "rtl"]]
- []]
-
- [Display
- [[grid_display "grid"]
- [no_display "none"]]
- [["inline"]
- ["block"]
- ["contents"]
- ["flex"]
- ["inline-block"]
- ["inline-flex"]
- ["inline-grid"]
- ["inline-table"]
- ["list-item"]
- ["run-in"]
- ["table"]
- ["table-caption"]
- ["table-column-group"]
- ["table-header-group"]
- ["table-footer-group"]
- ["table-row-group"]
- ["table-cell"]
- ["table-column"]
- ["table-row"]]]
-
- [Empty
- []
- [["show"]
- ["hide"]]]
-
- [Filter
- []
- []]
-
- [Flex_Direction
- []
- [["row"]
- ["row-reverse"]
- ["column"]
- ["column-reverse"]]]
-
- [Flex_Wrap
- [[no_wrap "nowrap"]]
- [["wrap"]
- ["wrap_reverse"]]]
-
- [Font_Kerning
- [[auto_kerning "auto"]
- [normal_kerning "normal"]
- [no_kerning "none"]]
- []]
-
- [Font_Size
- [[medium_size "medium"]
- [xx_small_size "xx-small"]
- [x_small_size "x-small"]
- [small_size "small"]
- [large_size "large"]
- [x_large_size "x-large"]
- [xx_large_size "xx-large"]
- [smaller_size "smaller"]
- [larger_size "larger"]]
- []]
-
- [Font_Stretch
- [[normal_stretch "normal"]]
- [["condensed"]
- ["ultra-condensed"]
- ["extra-condensed"]
- ["semi-condensed"]
- ["expanded"]
- ["semi-expanded"]
- ["extra-expanded"]
- ["ultra-expanded"]]]
-
- [Font_Style
- [[normal_style "normal"]]
- [["italic"]
- ["oblique"]]]
-
- [Font_Weight
- [[normal_weight "normal"]
- [weight_100 "100"]
- [weight_200 "200"]
- [weight_300 "300"]
- [weight_400 "400"]
- [weight_500 "500"]
- [weight_600 "600"]
- [weight_700 "700"]
- [weight_800 "800"]
- [weight_900 "900"]]
- [["bold"]]]
-
- [Font_Variant
- [[normal_font "normal"]]
- [["small-caps"]]]
-
- [Grid
- []
- []]
-
- [Grid_Content
- [[auto_content "auto"]]
- [["max-content"]
- ["min-content"]]]
-
- [Grid_Flow
- [[row_flow "row"]
- [column_flow "column"]
- [dense_flow "dense"]
- [row_dense_flow "row dense"]
- [column_dense_flow "column dense"]]
- []]
-
- [Grid_Span
- [[auto_span "auto"]]
- []]
-
- [Grid_Template
- []
- []]
-
- [Hanging_Punctuation
- [[no_hanging_punctuation "none"]]
- [["first"]
- ["last"]
- ["allow-end"]
- ["force-end"]]]
-
- [Hyphens
- [[no_hyphens "none"]
- [manual_hyphens "manual"]
- [auto_hyphens "auto"]]
- []]
-
- [Orientation
- []
- [["portrait"]
- ["landscape"]]]
-
- [Resolution
- []
- []]
-
- [Scan
- []
- [["interlace"]
- ["progressive"]]]
-
- [Boolean
- [[false "0"]
- [true "1"]]
- []]
-
- [Update
- [[no_update "none"]
- [slow_update "slow"]
- [fast_update "fast"]]
- []]
-
- [Block_Overflow
- [[no_block_overflow "none"]
- [scroll_block_overflow "scroll"]
- [optional_paged_block_overflow "optional-paged"]
- [paged_block_overflow "paged"]]
- []]
-
- [Inline_Overflow
- [[no_inline_overflow "none"]
- [scroll_inline_overflow "scroll"]]
- []]
-
- [Display_Mode
- []
- [["fullscreen"]
- ["standalone"]
- ["minimal-ui"]
- ["browser"]]]
-
- [Color_Gamut
- []
- [["srgb"]
- ["p3"]
- ["rec2020"]]]
-
- [Inverted_Colors
- [[no_inverted_colors "none"]
- [inverted_colors "inverted"]]
- []]
-
- [Pointer
- [[no_pointer "none"]
- [coarse_pointer "coarse"]
- [fine_pointer "fine"]]
- []]
-
- [Hover
- [[no_hover "none"]]
- [["hover"]]]
-
- [Light
- [[dim_light "dim"]
- [normal_light "normal"]
- [washed_light "washed"]]
- []]
-
- [Ratio
- []
- []]
-
- [Scripting
- [[no_scripting "none"]
- [initial_scripting_only "initial-only"]
- [scripting_enabled "enabled"]]
- []]
-
- [Motion
- [[no_motion_preference "no-preference"]
- [reduced_motion "reduce"]]
- []]
-
- [Color_Scheme
- [[no_color_scheme_preference "no-preference"]
- [light_color_scheme "light"]
- [dark_color_scheme "dark"]]
- []]
-
- [Isolation
- [[auto_isolation "auto"]]
- [["isolate"]]]
-
- [List_Style_Position
- []
- [["inside"]
- ["outside"]]]
-
- [List_Style_Type
- [[no_list_style "none"]]
- [["disc"]
- ["armenian"]
- ["circle"]
- ["cjk-ideographic"]
- ["decimal"]
- ["decimal-leading-zero"]
- ["georgian"]
- ["hebrew"]
- ["hiragana"]
- ["hiragana-iroha"]
- ["katakana"]
- ["katakana-iroha"]
- ["lower-alpha"]
- ["lower-greek"]
- ["lower-latin"]
- ["lower-roman"]
- ["square"]
- ["upper-alpha"]
- ["upper-greek"]
- ["upper-latin"]
- ["upper-roman"]]]
-
- [Color
- []
- []]
-
- [Overflow
- [[visible_overflow "visible"]
- [hidden_overflow "hidden"]
- [scroll_overflow "scroll"]
- [auto_overflow "auto"]]
- []]
-
- [Page_Break
- [[auto_page_break "auto"]
- [always_page_break "always"]
- [avoid_page_break "avoid"]
- [left_page_break "left"]
- [right_page_break "right"]]
- []]
-
- [Pointer_Events
- [[auto_pointer_events "auto"]
- [no_pointer_events "none"]]
- []]
-
- [Position
- []
- [["static"]
- ["absolute"]
- ["fixed"]
- ["relative"]
- ["sticky"]]]
-
- [Quotes
- [[no_quotes "none"]]
- []]
-
- [Resize
- [[resize_none "none"]
- [resize_both "both"]
- [resize_horizontal "horizontal"]
- [resize_vertical "vertical"]]
- []]
-
- [Scroll_Behavior
- [[auto_scroll_behavior "auto"]
- [smooth_scroll_behavior "smooth"]]
- []]
-
- [Table_Layout
- [[auto_table_layout "auto"]
- [fixed_table_layout "fixed"]]
- []]
-
- [Text_Align
- [[left_text_align "left"]
- [right_text_align "right"]
- [center_text_align "center"]
- [justify_text_align "justify"]]
- []]
-
- [Text_Align_Last
- [[auto_text_align_last "auto"]
- [left_text_align_last "left"]
- [right_text_align_last "right"]
- [center_text_align_last "center"]
- [justify_text_align_last "justify"]
- [start_text_align_last "start"]
- [end_text_align_last "end"]]
- []]
-
- [Text_Decoration_Line
- [[no_text_decoration_line "none"]
- [underline_text_decoration_line "underline"]
- [overline_text_decoration_line "overline"]
- [line_through_text_decoration_line "line-through"]]
- []]
-
- [Text_Decoration_Style
- [[solid_text_decoration_style "solid"]
- [double_text_decoration_style "double"]
- [dotted_text_decoration_style "dotted"]
- [dashed_text_decoration_style "dashed"]
- [wavy_text_decoration_style "wavy"]]
- []]
-
- [Text_Justification
- [[auto_text_justification "auto"]
- [inter_word_text_justification "inter-word"]
- [inter_character_text_justification "inter-character"]
- [no_text_justification "none"]]
- []]
-
- [Text_Overflow
- [[clip_text_overflow "clip"]
- [ellipsis_text_overflow "ellipsis"]]
- []]
-
- [Text_Transform
- [[no_text_transform "none"]]
- [["capitalize"]
- ["uppercase"]
- ["lowercase"]]]
-
- [Transform
- [[no_transform "none"]]
- []]
-
- [Transform_Origin
- []
- []]
-
- [Transform_Style
- []
- [["flat"]
- ["preserve_3d"]]]
-
- [Transition
- [[transition_none "none"]
- [transition_all "all"]]
- []]
-
- [Bidi
- [[bidi_normal "normal"]
- [bidi_embed "embed"]
- [bidi_isolate "isolate"]
- [bidi_isolate_override "isolate-override"]
- [bidi_plaintext "plaintext"]]
- [["bidi-override"]]]
-
- [User_Select
- [[user_select_auto "auto"]
- [user_select_none "none"]
- [user_select_text "text"]
- [user_select_all "all"]]
- []]
-
- [Vertical_Align
- [[vertical_align_baseline "baseline"]
- [vertical_align_sub "sub"]
- [vertical_align_super "super"]
- [vertical_align_top "top"]
- [vertical_align_text_top "text-top"]
- [vertical_align_middle "middle"]
- [vertical_align_bottom "bottom"]
- [vertical_align_text_bottom "text-bottom"]]
- []]
-
- [White_Space
- [[normal_white_space "normal"]
- [no_wrap_white_space "nowrap"]
- [pre_white_space "pre"]
- [pre_line_white_space "pre-line"]
- [pre_wrap_white_space "pre-wrap"]]
- []]
-
- [Word_Break
- [[normal_word_break "normal"]]
- [["break-all"]
- ["keep-all"]
- ["break-word"]]]
-
- [Word_Wrap
- [[normal_word_wrap "normal"]
- [break_word_word_wrap "break-word"]]
- []]
-
- [Writing_Mode
- [[top_to_bottom_writing_mode "horizontal-tb"]
- [left_to_right_writing_mode "vertical-rl"]
- [right_to_left_writing_mode "vertical-lr"]]
- []]
-
- [Z_Index
- []
- []]
- )
-
- (def: value_separator ",")
-
- (def: (apply name inputs)
- (-> Text (List Text) Value)
- (|> inputs
- (text.interposed ..value_separator)
- (text.enclosed ["(" ")"])
- (format name)
- :abstraction))
-
- (enumeration: Step Text
- step
- [[start "start"]
- [end "end"]]
- [])
-
- (def: .public (steps intervals step)
- (-> Nat Step (Value Timing))
- (..apply "steps" (list (%.nat intervals) (..step step))))
-
- (def: .public (cubic_bezier p0 p1 p2 p3)
- (-> Frac Frac Frac Frac (Value Timing))
- (|> (list p0 p1 p2 p3)
- (list\each %number)
- (..apply "cubic-bezier")))
-
- (template [<name> <brand>]
- [(def: .public <name>
- (-> Nat (Value <brand>))
- (|>> %.nat :abstraction))]
-
- [iteration Iteration]
- [count Count]
- [slice_number/1 Slice]
- [span_line Grid_Span]
- )
-
- (def: .public animation
- (-> Label (Value Animation))
- (|>> :abstraction))
-
- (def: .public (rgb color)
- (-> color.Color (Value Color))
- (let [[red green blue] (color.rgb color)]
- (..apply "rgb" (list (%.nat red)
- (%.nat green)
- (%.nat blue)))))
-
- (def: .public (rgba pigment)
- (-> color.Pigment (Value Color))
- (let [(^slots [#color.color #color.alpha]) pigment
- [red green blue] (color.rgb color)]
- (..apply "rgba" (list (%.nat red)
- (%.nat green)
- (%.nat blue)
- (if (r.= (\ r.interval top) alpha)
- "1.0"
- (format "0" (%.rev alpha)))))))
-
- (template [<name> <suffix>]
- [(def: .public (<name> value)
- (-> Frac (Value Length))
- (:abstraction (format (%number value) <suffix>)))]
-
- [em "em"]
- [ex "ex"]
- [rem "rem"]
- [ch "ch"]
- [vw "vw"]
- [vh "vh"]
- [vmin "vmin"]
- [vmax "vmax"]
- [% "%"]
- [cm "cm"]
- [mm "mm"]
- [in "in"]
- [px "px"]
- [pt "pt"]
- [pc "pc"]
- [fr "fr"]
- )
-
- (def: (%int value)
- (Format Int)
- (if (i.< +0 value)
- (%.int value)
- (%.nat (.nat value))))
-
- (template [<name> <suffix>]
- [(def: .public (<name> value)
- (-> Int (Value Time))
- (:abstraction (format (if (i.< +0 value)
- (%.int value)
- (%.nat (.nat value)))
- <suffix>)))]
-
-
- [seconds "s"]
- [milli_seconds "ms"]
- )
-
- (def: .public thickness
- (-> (Value Length) (Value Thickness))
- (|>> :transmutation))
-
- (def: slice_separator " ")
-
- (def: .public (slice_number/2 horizontal vertical)
- (-> Nat Nat (Value Slice))
- (:abstraction (format (%.nat horizontal) ..slice_separator
- (%.nat vertical))))
-
- (abstract: .public Stop
- {}
-
- Text
-
- (def: .public stop
- (-> (Value Color) Stop)
- (|>> (:representation Value) (:abstraction Stop)))
-
- (def: stop_separator " ")
-
- (def: .public (single_stop length color)
- (-> (Value Length) (Value Color) Stop)
- (:abstraction (format (:representation Value color) ..stop_separator
- (:representation Value length))))
-
- (def: .public (double_stop start end color)
- (-> (Value Length) (Value Length) (Value Color) Stop)
- (:abstraction (format (:representation Value color) ..stop_separator
- (:representation Value start) ..stop_separator
- (:representation Value end))))
-
- (abstract: .public Hint
- {}
-
- Text
-
- (def: .public hint
- (-> (Value Length) Hint)
- (|>> (:representation Value) (:abstraction Hint)))
-
- (def: (with_hint [hint stop])
- (-> [(Maybe Hint) Stop] Text)
- (case hint
- #.None
- (:representation Stop stop)
+ [(def: .public value
+ (-> (Value Any) Text)
+ (|>> :representation))
+
+ (template [<name> <value>]
+ [(def: .public <name> Value (:abstraction <value>))]
+
+ [initial "initial"]
+ [inherit "inherit"]
+ [unset "unset"]
+ )
+
+ (template [<brand> <alias>+ <value>+]
+ [(abstract: .public <brand> Any [])
+
+ (`` (template [<name> <value>]
+ [(def: .public <name>
+ (Value <brand>)
+ (:abstraction <value>))]
+
+ (~~ (template.spliced <alias>+))))
+
+ (with_expansions [<rows> (template.spliced <value>+)]
+ (template [<value>]
+ [(`` (def: .public (~~ (..text_identifier <value>))
+ (Value <brand>)
+ (:abstraction <value>)))]
- (#.Some hint)
- (format (:representation Hint hint) ..value_separator (:representation Stop stop))))))
-
- (type: .public (List/1 a)
- [a (List a)])
-
- (abstract: .public Angle
- {}
-
- Text
-
- (def: .public angle
- (-> Angle Text)
- (|>> :representation))
-
- (def: .public (turn value)
- (-> Rev Angle)
- (:abstraction (format (%.rev value) "turn")))
-
- (def: degree_limit Nat 360)
-
- (def: .public (degree value)
- (-> Nat Angle)
- (:abstraction (format (%.nat (n.% ..degree_limit value)) "deg")))
-
- (template [<degree> <name>]
- [(def: .public <name>
- Angle
- (..degree <degree>))]
+ <rows>))]
+
+ [All
+ []
+ []]
+
+ [Number
+ []
+ []]
+
+ [Length
+ []
+ []]
+
+ [Time
+ []
+ []]
+
+ [Thickness
+ []
+ [["medium"]
+ ["thin"]
+ ["thick"]]]
+
+ [Slice
+ [[full_slice "fill"]]
+ []]
+
+ [Alignment
+ [[auto_alignment "auto"]]
+ [["stretch"]
+ ["center"]
+ ["flex-start"]
+ ["flex-end"]
+ ["baseline"]
+ ["space-between"]
+ ["space-around"]]]
+
+ [Animation
+ []
+ []]
+
+ [Animation_Direction
+ [[normal_direction "normal"]]
+ [["reverse"]
+ ["alternate"]
+ ["alternate-reverse"]]]
+
+ [Animation_Fill
+ [[fill_forwards "forwards"]
+ [fill_backwards "backwards"]
+ [fill_both "both"]]
+ []]
+
+ [Column_Fill
+ []
+ [["balance"]
+ ["auto"]]]
+
+ [Column_Span
+ []
+ [["all"]]]
+
+ [Iteration
+ []
+ [["infinite"]]]
+
+ [Count
+ []
+ []]
+
+ [Play
+ []
+ [["paused"]
+ ["running"]]]
+
+ [Timing
+ []
+ [["linear"]
+ ["ease"]
+ ["ease-in"]
+ ["ease-out"]
+ ["ease-in-out"]
+ ["step-start"]
+ ["step-end"]]]
+
+ [Visibility
+ [[invisible "hidden"]
+ [collapse_visibility "collapse"]]
+ [["visible"]]]
+
+ [Attachment
+ [[scroll_attachment "scroll"]
+ [fixed_attachment "fixed"]
+ [local_attachment "local"]]
+ []]
+
+ [Blend
+ [[normal_blend "normal"]]
+ [["multiply"]
+ ["screen"]
+ ["overlay"]
+ ["darken"]
+ ["lighten"]
+ ["color-dodge"]
+ ["color-burn"]
+ ["difference"]
+ ["exclusion"]
+ ["hue"]
+ ["saturation"]
+ ["color"]
+ ["luminosity"]]]
+
+ [Span
+ []
+ [["border-box"]
+ ["padding-box"]
+ ["content-box"]]]
+
+ [Image
+ [[no_image "none"]]
+ []]
+
+ [Repeat
+ [[stretch_repeat "stretch"]]
+ [["repeat"]
+ ["repeat-x"]
+ ["repeat-y"]
+ ["no-repeat"]
+ ["space"]
+ ["round"]]]
+
+ [Location
+ [[left_top "left top"]
+ [left_center "left center"]
+ [left_bottom "left bottom"]
+ [right_top "right top"]
+ [right_center "right center"]
+ [right_bottom "right bottom"]
+ [center_top "center top"]
+ [center_center "center center"]
+ [center_bottom "center bottom"]]
+ []]
+
+ [Fit
+ [[no_fit "none"]]
+ [["fill"]
+ ["cover"]
+ ["contain"]
+ ["scale-down"]]]
+
+ [Border
+ []
+ [["hidden"]
+ ["dotted"]
+ ["dashed"]
+ ["solid"]
+ ["double"]
+ ["groove"]
+ ["ridge"]
+ ["inset"]
+ ["outset"]]]
+
+ [Collapse
+ []
+ [["separate"]
+ ["collapse"]]]
+
+ [Box_Decoration_Break
+ []
+ [["slice"]
+ ["clone"]]]
+
+ [Caption
+ []
+ [["top"]
+ ["bottom"]]]
+
+ [Float
+ [[float_left "left"]
+ [float_right "right"]]
+ []]
+
+ [Clear
+ [[clear_left "left"]
+ [clear_right "right"]
+ [clear_both "both"]]
+ []]
+
+ [Counter
+ []
+ []]
+
+ [Content
+ []
+ [["open-quote"]
+ ["close-quote"]
+ ["no-open-quote"]
+ ["no-close-quote"]]]
+
+ [Cursor
+ [[horizontal_text "text"]
+ [no_cursor "none"]]
+ [["alias"]
+ ["all-scroll"]
+ ["cell"]
+ ["context-menu"]
+ ["col-resize"]
+ ["copy"]
+ ["crosshair"]
+ ["default"]
+ ["e-resize"]
+ ["ew-resize"]
+ ["grab"]
+ ["grabbing"]
+ ["help"]
+ ["move"]
+ ["n-resize"]
+ ["ne-resize"]
+ ["nesw-resize"]
+ ["ns-resize"]
+ ["nw-resize"]
+ ["nwse-resize"]
+ ["no-drop"]
+ ["not-allowed"]
+ ["pointer"]
+ ["progress"]
+ ["row-resize"]
+ ["s-resize"]
+ ["se-resize"]
+ ["sw-resize"]
+ ["vertical-text"]
+ ["w-resize"]
+ ["wait"]
+ ["zoom-in"]
+ ["zoom-out"]]]
+
+ [Shadow
+ []
+ []]
+
+ [Clip
+ []
+ []]
+
+ [Text_Direction
+ [[left_to_right "ltr"]
+ [right_to_left "rtl"]]
+ []]
+
+ [Display
+ [[grid_display "grid"]
+ [no_display "none"]]
+ [["inline"]
+ ["block"]
+ ["contents"]
+ ["flex"]
+ ["inline-block"]
+ ["inline-flex"]
+ ["inline-grid"]
+ ["inline-table"]
+ ["list-item"]
+ ["run-in"]
+ ["table"]
+ ["table-caption"]
+ ["table-column-group"]
+ ["table-header-group"]
+ ["table-footer-group"]
+ ["table-row-group"]
+ ["table-cell"]
+ ["table-column"]
+ ["table-row"]]]
+
+ [Empty
+ []
+ [["show"]
+ ["hide"]]]
+
+ [Filter
+ []
+ []]
+
+ [Flex_Direction
+ []
+ [["row"]
+ ["row-reverse"]
+ ["column"]
+ ["column-reverse"]]]
+
+ [Flex_Wrap
+ [[no_wrap "nowrap"]]
+ [["wrap"]
+ ["wrap_reverse"]]]
+
+ [Font_Kerning
+ [[auto_kerning "auto"]
+ [normal_kerning "normal"]
+ [no_kerning "none"]]
+ []]
+
+ [Font_Size
+ [[medium_size "medium"]
+ [xx_small_size "xx-small"]
+ [x_small_size "x-small"]
+ [small_size "small"]
+ [large_size "large"]
+ [x_large_size "x-large"]
+ [xx_large_size "xx-large"]
+ [smaller_size "smaller"]
+ [larger_size "larger"]]
+ []]
+
+ [Font_Stretch
+ [[normal_stretch "normal"]]
+ [["condensed"]
+ ["ultra-condensed"]
+ ["extra-condensed"]
+ ["semi-condensed"]
+ ["expanded"]
+ ["semi-expanded"]
+ ["extra-expanded"]
+ ["ultra-expanded"]]]
+
+ [Font_Style
+ [[normal_style "normal"]]
+ [["italic"]
+ ["oblique"]]]
+
+ [Font_Weight
+ [[normal_weight "normal"]
+ [weight_100 "100"]
+ [weight_200 "200"]
+ [weight_300 "300"]
+ [weight_400 "400"]
+ [weight_500 "500"]
+ [weight_600 "600"]
+ [weight_700 "700"]
+ [weight_800 "800"]
+ [weight_900 "900"]]
+ [["bold"]]]
+
+ [Font_Variant
+ [[normal_font "normal"]]
+ [["small-caps"]]]
+
+ [Grid
+ []
+ []]
+
+ [Grid_Content
+ [[auto_content "auto"]]
+ [["max-content"]
+ ["min-content"]]]
+
+ [Grid_Flow
+ [[row_flow "row"]
+ [column_flow "column"]
+ [dense_flow "dense"]
+ [row_dense_flow "row dense"]
+ [column_dense_flow "column dense"]]
+ []]
+
+ [Grid_Span
+ [[auto_span "auto"]]
+ []]
+
+ [Grid_Template
+ []
+ []]
+
+ [Hanging_Punctuation
+ [[no_hanging_punctuation "none"]]
+ [["first"]
+ ["last"]
+ ["allow-end"]
+ ["force-end"]]]
+
+ [Hyphens
+ [[no_hyphens "none"]
+ [manual_hyphens "manual"]
+ [auto_hyphens "auto"]]
+ []]
+
+ [Orientation
+ []
+ [["portrait"]
+ ["landscape"]]]
+
+ [Resolution
+ []
+ []]
+
+ [Scan
+ []
+ [["interlace"]
+ ["progressive"]]]
+
+ [Boolean
+ [[false "0"]
+ [true "1"]]
+ []]
+
+ [Update
+ [[no_update "none"]
+ [slow_update "slow"]
+ [fast_update "fast"]]
+ []]
+
+ [Block_Overflow
+ [[no_block_overflow "none"]
+ [scroll_block_overflow "scroll"]
+ [optional_paged_block_overflow "optional-paged"]
+ [paged_block_overflow "paged"]]
+ []]
+
+ [Inline_Overflow
+ [[no_inline_overflow "none"]
+ [scroll_inline_overflow "scroll"]]
+ []]
+
+ [Display_Mode
+ []
+ [["fullscreen"]
+ ["standalone"]
+ ["minimal-ui"]
+ ["browser"]]]
+
+ [Color_Gamut
+ []
+ [["srgb"]
+ ["p3"]
+ ["rec2020"]]]
+
+ [Inverted_Colors
+ [[no_inverted_colors "none"]
+ [inverted_colors "inverted"]]
+ []]
+
+ [Pointer
+ [[no_pointer "none"]
+ [coarse_pointer "coarse"]
+ [fine_pointer "fine"]]
+ []]
+
+ [Hover
+ [[no_hover "none"]]
+ [["hover"]]]
+
+ [Light
+ [[dim_light "dim"]
+ [normal_light "normal"]
+ [washed_light "washed"]]
+ []]
+
+ [Ratio
+ []
+ []]
+
+ [Scripting
+ [[no_scripting "none"]
+ [initial_scripting_only "initial-only"]
+ [scripting_enabled "enabled"]]
+ []]
+
+ [Motion
+ [[no_motion_preference "no-preference"]
+ [reduced_motion "reduce"]]
+ []]
+
+ [Color_Scheme
+ [[no_color_scheme_preference "no-preference"]
+ [light_color_scheme "light"]
+ [dark_color_scheme "dark"]]
+ []]
+
+ [Isolation
+ [[auto_isolation "auto"]]
+ [["isolate"]]]
+
+ [List_Style_Position
+ []
+ [["inside"]
+ ["outside"]]]
+
+ [List_Style_Type
+ [[no_list_style "none"]]
+ [["disc"]
+ ["armenian"]
+ ["circle"]
+ ["cjk-ideographic"]
+ ["decimal"]
+ ["decimal-leading-zero"]
+ ["georgian"]
+ ["hebrew"]
+ ["hiragana"]
+ ["hiragana-iroha"]
+ ["katakana"]
+ ["katakana-iroha"]
+ ["lower-alpha"]
+ ["lower-greek"]
+ ["lower-latin"]
+ ["lower-roman"]
+ ["square"]
+ ["upper-alpha"]
+ ["upper-greek"]
+ ["upper-latin"]
+ ["upper-roman"]]]
+
+ [Color
+ []
+ []]
+
+ [Overflow
+ [[visible_overflow "visible"]
+ [hidden_overflow "hidden"]
+ [scroll_overflow "scroll"]
+ [auto_overflow "auto"]]
+ []]
+
+ [Page_Break
+ [[auto_page_break "auto"]
+ [always_page_break "always"]
+ [avoid_page_break "avoid"]
+ [left_page_break "left"]
+ [right_page_break "right"]]
+ []]
+
+ [Pointer_Events
+ [[auto_pointer_events "auto"]
+ [no_pointer_events "none"]]
+ []]
+
+ [Position
+ []
+ [["static"]
+ ["absolute"]
+ ["fixed"]
+ ["relative"]
+ ["sticky"]]]
+
+ [Quotes
+ [[no_quotes "none"]]
+ []]
+
+ [Resize
+ [[resize_none "none"]
+ [resize_both "both"]
+ [resize_horizontal "horizontal"]
+ [resize_vertical "vertical"]]
+ []]
+
+ [Scroll_Behavior
+ [[auto_scroll_behavior "auto"]
+ [smooth_scroll_behavior "smooth"]]
+ []]
+
+ [Table_Layout
+ [[auto_table_layout "auto"]
+ [fixed_table_layout "fixed"]]
+ []]
+
+ [Text_Align
+ [[left_text_align "left"]
+ [right_text_align "right"]
+ [center_text_align "center"]
+ [justify_text_align "justify"]]
+ []]
+
+ [Text_Align_Last
+ [[auto_text_align_last "auto"]
+ [left_text_align_last "left"]
+ [right_text_align_last "right"]
+ [center_text_align_last "center"]
+ [justify_text_align_last "justify"]
+ [start_text_align_last "start"]
+ [end_text_align_last "end"]]
+ []]
+
+ [Text_Decoration_Line
+ [[no_text_decoration_line "none"]
+ [underline_text_decoration_line "underline"]
+ [overline_text_decoration_line "overline"]
+ [line_through_text_decoration_line "line-through"]]
+ []]
+
+ [Text_Decoration_Style
+ [[solid_text_decoration_style "solid"]
+ [double_text_decoration_style "double"]
+ [dotted_text_decoration_style "dotted"]
+ [dashed_text_decoration_style "dashed"]
+ [wavy_text_decoration_style "wavy"]]
+ []]
+
+ [Text_Justification
+ [[auto_text_justification "auto"]
+ [inter_word_text_justification "inter-word"]
+ [inter_character_text_justification "inter-character"]
+ [no_text_justification "none"]]
+ []]
+
+ [Text_Overflow
+ [[clip_text_overflow "clip"]
+ [ellipsis_text_overflow "ellipsis"]]
+ []]
+
+ [Text_Transform
+ [[no_text_transform "none"]]
+ [["capitalize"]
+ ["uppercase"]
+ ["lowercase"]]]
+
+ [Transform
+ [[no_transform "none"]]
+ []]
+
+ [Transform_Origin
+ []
+ []]
+
+ [Transform_Style
+ []
+ [["flat"]
+ ["preserve_3d"]]]
+
+ [Transition
+ [[transition_none "none"]
+ [transition_all "all"]]
+ []]
+
+ [Bidi
+ [[bidi_normal "normal"]
+ [bidi_embed "embed"]
+ [bidi_isolate "isolate"]
+ [bidi_isolate_override "isolate-override"]
+ [bidi_plaintext "plaintext"]]
+ [["bidi-override"]]]
+
+ [User_Select
+ [[user_select_auto "auto"]
+ [user_select_none "none"]
+ [user_select_text "text"]
+ [user_select_all "all"]]
+ []]
+
+ [Vertical_Align
+ [[vertical_align_baseline "baseline"]
+ [vertical_align_sub "sub"]
+ [vertical_align_super "super"]
+ [vertical_align_top "top"]
+ [vertical_align_text_top "text-top"]
+ [vertical_align_middle "middle"]
+ [vertical_align_bottom "bottom"]
+ [vertical_align_text_bottom "text-bottom"]]
+ []]
+
+ [White_Space
+ [[normal_white_space "normal"]
+ [no_wrap_white_space "nowrap"]
+ [pre_white_space "pre"]
+ [pre_line_white_space "pre-line"]
+ [pre_wrap_white_space "pre-wrap"]]
+ []]
+
+ [Word_Break
+ [[normal_word_break "normal"]]
+ [["break-all"]
+ ["keep-all"]
+ ["break-word"]]]
+
+ [Word_Wrap
+ [[normal_word_wrap "normal"]
+ [break_word_word_wrap "break-word"]]
+ []]
+
+ [Writing_Mode
+ [[top_to_bottom_writing_mode "horizontal-tb"]
+ [left_to_right_writing_mode "vertical-rl"]
+ [right_to_left_writing_mode "vertical-lr"]]
+ []]
+
+ [Z_Index
+ []
+ []]
+ )
+
+ (def: value_separator ",")
+
+ (def: (apply name inputs)
+ (-> Text (List Text) Value)
+ (|> inputs
+ (text.interposed ..value_separator)
+ (text.enclosed ["(" ")"])
+ (format name)
+ :abstraction))
+
+ (enumeration: Step Text
+ step
+ [[start "start"]
+ [end "end"]]
+ [])
+
+ (def: .public (steps intervals step)
+ (-> Nat Step (Value Timing))
+ (..apply "steps" (list (%.nat intervals) (..step step))))
+
+ (def: .public (cubic_bezier p0 p1 p2 p3)
+ (-> Frac Frac Frac Frac (Value Timing))
+ (|> (list p0 p1 p2 p3)
+ (list\each %number)
+ (..apply "cubic-bezier")))
+
+ (template [<name> <brand>]
+ [(def: .public <name>
+ (-> Nat (Value <brand>))
+ (|>> %.nat :abstraction))]
+
+ [iteration Iteration]
+ [count Count]
+ [slice_number/1 Slice]
+ [span_line Grid_Span]
+ )
+
+ (def: .public animation
+ (-> Label (Value Animation))
+ (|>> :abstraction))
+
+ (def: .public (rgb color)
+ (-> color.Color (Value Color))
+ (let [[red green blue] (color.rgb color)]
+ (..apply "rgb" (list (%.nat red)
+ (%.nat green)
+ (%.nat blue)))))
+
+ (def: .public (rgba pigment)
+ (-> color.Pigment (Value Color))
+ (let [(^slots [#color.color #color.alpha]) pigment
+ [red green blue] (color.rgb color)]
+ (..apply "rgba" (list (%.nat red)
+ (%.nat green)
+ (%.nat blue)
+ (if (r.= (\ r.interval top) alpha)
+ "1.0"
+ (format "0" (%.rev alpha)))))))
+
+ (template [<name> <suffix>]
+ [(def: .public (<name> value)
+ (-> Frac (Value Length))
+ (:abstraction (format (%number value) <suffix>)))]
+
+ [em "em"]
+ [ex "ex"]
+ [rem "rem"]
+ [ch "ch"]
+ [vw "vw"]
+ [vh "vh"]
+ [vmin "vmin"]
+ [vmax "vmax"]
+ [% "%"]
+ [cm "cm"]
+ [mm "mm"]
+ [in "in"]
+ [px "px"]
+ [pt "pt"]
+ [pc "pc"]
+ [fr "fr"]
+ )
+
+ (def: (%int value)
+ (Format Int)
+ (if (i.< +0 value)
+ (%.int value)
+ (%.nat (.nat value))))
+
+ (template [<name> <suffix>]
+ [(def: .public (<name> value)
+ (-> Int (Value Time))
+ (:abstraction (format (if (i.< +0 value)
+ (%.int value)
+ (%.nat (.nat value)))
+ <suffix>)))]
+
+
+ [seconds "s"]
+ [milli_seconds "ms"]
+ )
+
+ (def: .public thickness
+ (-> (Value Length) (Value Thickness))
+ (|>> :transmutation))
+
+ (def: slice_separator " ")
+
+ (def: .public (slice_number/2 horizontal vertical)
+ (-> Nat Nat (Value Slice))
+ (:abstraction (format (%.nat horizontal) ..slice_separator
+ (%.nat vertical))))
+
+ (abstract: .public Stop
+ Text
+
+ [(def: .public stop
+ (-> (Value Color) Stop)
+ (|>> (:representation Value) (:abstraction Stop)))
+
+ (def: stop_separator " ")
+
+ (def: .public (single_stop length color)
+ (-> (Value Length) (Value Color) Stop)
+ (:abstraction (format (:representation Value color) ..stop_separator
+ (:representation Value length))))
+
+ (def: .public (double_stop start end color)
+ (-> (Value Length) (Value Length) (Value Color) Stop)
+ (:abstraction (format (:representation Value color) ..stop_separator
+ (:representation Value start) ..stop_separator
+ (:representation Value end))))
+
+ (abstract: .public Hint
+ Text
+
+ [(def: .public hint
+ (-> (Value Length) Hint)
+ (|>> (:representation Value) (:abstraction Hint)))
+
+ (def: (with_hint [hint stop])
+ (-> [(Maybe Hint) Stop] Text)
+ (case hint
+ #.None
+ (:representation Stop stop)
+
+ (#.Some hint)
+ (format (:representation Hint hint) ..value_separator (:representation Stop stop))))])])
+
+ (type: .public (List/1 a)
+ [a (List a)])
+
+ (abstract: .public Angle
+ Text
+
+ [(def: .public angle
+ (-> Angle Text)
+ (|>> :representation))
+
+ (def: .public (turn value)
+ (-> Rev Angle)
+ (:abstraction (format (%.rev value) "turn")))
+
+ (def: degree_limit Nat 360)
- [000 to_top]
- [090 to_right]
- [180 to_bottom]
- [270 to_left]
- )
-
- (template [<name> <function>]
- [(def: .public (<name> angle start next)
- (-> Angle Stop (List/1 [(Maybe Hint) Stop]) (Value Image))
- (let [[now after] next]
- (..apply <function> (list& (:representation Angle angle)
- (with_hint now)
- (list\each with_hint after)))))]
-
- [linear_gradient "linear-gradient"]
- [repeating_linear_gradient "repeating-linear-gradient"]
- )
- )
-
- (abstract: .public Percentage
- {}
-
- Text
-
- (def: .public percentage
- (-> Percentage Text)
- (|>> :representation))
-
- (def: percentage_limit Nat (.++ 100))
-
- (def: .public (%% value)
- (-> Nat Percentage)
- (:abstraction (format (%.nat (n.% percentage_limit value)) "%")))
-
- (def: .public slice_percent/1
- (-> Percentage (Value Slice))
- (|>> :representation (:abstraction Value)))
-
- (def: .public (slice_percent/2 horizontal vertical)
- (-> Percentage Percentage (Value Slice))
- (:abstraction Value (format (:representation horizontal) ..slice_separator
- (:representation vertical))))
-
- (template [<input> <pre> <function>+]
- [(`` (template [<name> <function>]
- [(def: .public <name>
- (-> <input> (Value Filter))
- (|>> <pre> (list) (..apply <function>)))]
-
- (~~ (template.spliced <function>+))))]
-
- [Nat (<| (:representation Value) ..px n.frac)
- [[blur "blur"]]]
- [Nat (<| ..angle ..degree)
- [[hue_rotate "hue-rotate"]]]
- [Percentage (:representation Percentage)
- [[brightness "brightness"]
- [contrast "contrast"]
- [grayscale "grayscale"]
- [invert "invert"]
- [opacity "opacity"]
- [saturate "saturate"]
- [sepia "sepia"]]]
- )
- )
-
- (def: .public svg_filter
- (-> URL (Value Filter))
- (|>> (list) (..apply "url")))
-
- (def: default_shadow_length (px +0.0))
-
- (def: .public (drop_shadow horizontal vertical blur spread color)
- (-> (Value Length) (Value Length)
- (Maybe (Value Length)) (Maybe (Value Length))
- (Value Color)
- (Value Filter))
- (|> (list (:representation horizontal)
- (:representation vertical)
- (|> blur (maybe.else ..default_shadow_length) :representation)
- (|> spread (maybe.else ..default_shadow_length) :representation)
- (:representation color))
- (text.interposed " ")
- (list)
- (..apply "drop-shadow")))
-
- (def: length_separator " ")
-
- (template [<name> <type>]
- [(def: .public (<name> horizontal vertical)
- (-> (Value Length) (Value Length) (Value <type>))
- (:abstraction (format (:representation horizontal)
- ..length_separator
- (:representation vertical))))]
-
- [location Location]
- [fit Fit]
- )
-
- (def: .public (fit/1 length)
- (-> (Value Length) (Value Fit))
- (..fit length length))
-
- (def: .public image
- (-> URL (Value Image))
- (|>> %.text
+ (def: .public (degree value)
+ (-> Nat Angle)
+ (:abstraction (format (%.nat (n.% ..degree_limit value)) "deg")))
+
+ (template [<degree> <name>]
+ [(def: .public <name>
+ Angle
+ (..degree <degree>))]
+
+ [000 to_top]
+ [090 to_right]
+ [180 to_bottom]
+ [270 to_left]
+ )
+
+ (template [<name> <function>]
+ [(def: .public (<name> angle start next)
+ (-> Angle Stop (List/1 [(Maybe Hint) Stop]) (Value Image))
+ (let [[now after] next]
+ (..apply <function> (list& (:representation Angle angle)
+ (with_hint now)
+ (list\each with_hint after)))))]
+
+ [linear_gradient "linear-gradient"]
+ [repeating_linear_gradient "repeating-linear-gradient"]
+ )]
+ )
+
+ (abstract: .public Percentage
+ Text
+
+ [(def: .public percentage
+ (-> Percentage Text)
+ (|>> :representation))
+
+ (def: percentage_limit Nat (.++ 100))
+
+ (def: .public (%% value)
+ (-> Nat Percentage)
+ (:abstraction (format (%.nat (n.% percentage_limit value)) "%")))
+
+ (def: .public slice_percent/1
+ (-> Percentage (Value Slice))
+ (|>> :representation (:abstraction Value)))
+
+ (def: .public (slice_percent/2 horizontal vertical)
+ (-> Percentage Percentage (Value Slice))
+ (:abstraction Value (format (:representation horizontal) ..slice_separator
+ (:representation vertical))))
+
+ (template [<input> <pre> <function>+]
+ [(`` (template [<name> <function>]
+ [(def: .public <name>
+ (-> <input> (Value Filter))
+ (|>> <pre> (list) (..apply <function>)))]
+
+ (~~ (template.spliced <function>+))))]
+
+ [Nat (<| (:representation Value) ..px n.frac)
+ [[blur "blur"]]]
+ [Nat (<| ..angle ..degree)
+ [[hue_rotate "hue-rotate"]]]
+ [Percentage (:representation Percentage)
+ [[brightness "brightness"]
+ [contrast "contrast"]
+ [grayscale "grayscale"]
+ [invert "invert"]
+ [opacity "opacity"]
+ [saturate "saturate"]
+ [sepia "sepia"]]]
+ )]
+ )
+
+ (def: .public svg_filter
+ (-> URL (Value Filter))
+ (|>> (list) (..apply "url")))
+
+ (def: default_shadow_length (px +0.0))
+
+ (def: .public (drop_shadow horizontal vertical blur spread color)
+ (-> (Value Length) (Value Length)
+ (Maybe (Value Length)) (Maybe (Value Length))
+ (Value Color)
+ (Value Filter))
+ (|> (list (:representation horizontal)
+ (:representation vertical)
+ (|> blur (maybe.else ..default_shadow_length) :representation)
+ (|> spread (maybe.else ..default_shadow_length) :representation)
+ (:representation color))
+ (text.interposed " ")
(list)
- (..apply "url")))
-
- (enumeration: Shape Text
- shape
- [[ellipse_shape "ellipse"]
- [circle_shape "circle"]]
- [])
-
- (enumeration: Extent Text
- extent
- [[closest_side "closest-side"]
- [closest_corner "closest-corner"]
- [farthest_side "farthest-side"]
- [farthest_corner "farthest-corner"]]
- [])
-
- (template [<name> <function>]
- [(def: .public (<name> shape extent location start next)
- (-> Shape (Maybe Extent) (Value Location)
- Stop (List/1 [(Maybe Hint) Stop])
- (Value Image))
- (let [after_extent (format "at " (:representation location))
- with_extent (case extent
- (#.Some extent)
- (format (..extent extent) " " after_extent)
-
- #.None
- after_extent)
- where (format (..shape shape) " " with_extent)
- [now after] next]
- (..apply <function> (list& (..shape shape)
- (with_hint now)
- (list\each with_hint after)))))]
-
- [radial_gradient "radial-gradient"]
- [repeating_radial_gradient "repeating-radial-gradient"]
- )
-
- (def: .public (shadow horizontal vertical blur spread color inset?)
- (-> (Value Length) (Value Length)
- (Maybe (Value Length)) (Maybe (Value Length))
- (Value Color) Bit
- (Value Shadow))
- (let [with_inset (if inset?
- (list "inset")
- (list))]
- (|> (list& (:representation horizontal)
- (:representation vertical)
- (|> blur (maybe.else ..default_shadow_length) :representation)
- (|> spread (maybe.else ..default_shadow_length) :representation)
- (:representation color)
- with_inset)
- (text.interposed " ")
- :abstraction)))
-
- (type: .public Rectangle
- (Record
- [#top (Value Length)
- #right (Value Length)
- #bottom (Value Length)
- #left (Value Length)]))
-
- (def: .public (clip rectangle)
- (-> Rectangle (Value Clip))
- (`` (..apply "rect" (list (~~ (template [<side>]
- [(:representation (value@ <side> rectangle))]
-
- [#top] [#right] [#bottom] [#left]))))))
-
- (def: .public counter
- (-> Label (Value Counter))
- (|>> :abstraction))
-
- (def: .public current_count
- (-> (Value Counter) (Value Content))
- (|>> :representation (list) (..apply "counter")))
-
- (def: .public text
- (-> Text (Value Content))
- (|>> %.text :abstraction))
-
- (def: .public attribute
- (-> Label (Value Content))
- (|>> (list) (..apply "attr")))
-
- (def: .public media
- (-> URL (Value Content))
- (|>> (list) (..apply "url")))
-
- (enumeration: Font Text
- font_name
- [[serif "serif"]
- [sans_serif "sans-serif"]
- [cursive "cursive"]
- [fantasy "fantasy"]
- [monospace "monospace"]]
- [(def: .public font
- (-> Text Font)
- (|>> %.text :abstraction))
-
- (def: .public (font_family options)
- (-> (List Font) (Value Font))
- (case options
- (#.Item _)
- (|> options
- (list\each ..font_name)
- (text.interposed ",")
- (:abstraction Value))
-
- #.End
- ..initial))])
-
- (def: .public font_size
- (-> (Value Length) (Value Font_Size))
- (|>> :transmutation))
-
- (def: .public number
- (-> Frac (Value Number))
- (|>> %number :abstraction))
-
- (def: .public grid
- (-> Label (Value Grid))
- (|>> :abstraction))
-
- (def: .public fit_content
- (-> (Value Length) (Value Grid_Content))
- (|>> :representation (list) (..apply "fit-content")))
-
- (def: .public (min_max min max)
- (-> (Value Grid_Content) (Value Grid_Content) (Value Grid_Content))
- (..apply "minmax" (list (:representation min)
- (:representation max))))
-
- (def: .public grid_span
- (-> Nat (Value Grid_Span))
- (|>> %.nat (format "span ") :abstraction))
-
- (def: grid_column_separator " ")
- (def: grid_row_separator " ")
-
- (def: .public grid_template
- (-> (List (List (Maybe (Value Grid)))) (Value Grid_Template))
- (let [empty (: (Value Grid)
- (:abstraction "."))]
- (|>> (list\each (|>> (list\each (|>> (maybe.else empty)
- :representation))
- (text.interposed ..grid_column_separator)
- (text.enclosed ["'" "'"])))
- (text.interposed ..grid_row_separator)
+ (..apply "drop-shadow")))
+
+ (def: length_separator " ")
+
+ (template [<name> <type>]
+ [(def: .public (<name> horizontal vertical)
+ (-> (Value Length) (Value Length) (Value <type>))
+ (:abstraction (format (:representation horizontal)
+ ..length_separator
+ (:representation vertical))))]
+
+ [location Location]
+ [fit Fit]
+ )
+
+ (def: .public (fit/1 length)
+ (-> (Value Length) (Value Fit))
+ (..fit length length))
+
+ (def: .public image
+ (-> URL (Value Image))
+ (|>> %.text
+ (list)
+ (..apply "url")))
+
+ (enumeration: Shape Text
+ shape
+ [[ellipse_shape "ellipse"]
+ [circle_shape "circle"]]
+ [])
+
+ (enumeration: Extent Text
+ extent
+ [[closest_side "closest-side"]
+ [closest_corner "closest-corner"]
+ [farthest_side "farthest-side"]
+ [farthest_corner "farthest-corner"]]
+ [])
+
+ (template [<name> <function>]
+ [(def: .public (<name> shape extent location start next)
+ (-> Shape (Maybe Extent) (Value Location)
+ Stop (List/1 [(Maybe Hint) Stop])
+ (Value Image))
+ (let [after_extent (format "at " (:representation location))
+ with_extent (case extent
+ (#.Some extent)
+ (format (..extent extent) " " after_extent)
+
+ #.None
+ after_extent)
+ where (format (..shape shape) " " with_extent)
+ [now after] next]
+ (..apply <function> (list& (..shape shape)
+ (with_hint now)
+ (list\each with_hint after)))))]
+
+ [radial_gradient "radial-gradient"]
+ [repeating_radial_gradient "repeating-radial-gradient"]
+ )
+
+ (def: .public (shadow horizontal vertical blur spread color inset?)
+ (-> (Value Length) (Value Length)
+ (Maybe (Value Length)) (Maybe (Value Length))
+ (Value Color) Bit
+ (Value Shadow))
+ (let [with_inset (if inset?
+ (list "inset")
+ (list))]
+ (|> (list& (:representation horizontal)
+ (:representation vertical)
+ (|> blur (maybe.else ..default_shadow_length) :representation)
+ (|> spread (maybe.else ..default_shadow_length) :representation)
+ (:representation color)
+ with_inset)
+ (text.interposed " ")
:abstraction)))
- (def: .public (resolution dpi)
- (-> Nat (Value Resolution))
- (:abstraction (format (%.nat dpi) "dpi")))
-
- (def: .public (ratio numerator denominator)
- (-> Nat Nat (Value Ratio))
- (:abstraction (format (%.nat numerator) "/" (%.nat denominator))))
-
- (enumeration: Quote Text
- quote_text
- [[double_quote "\0022"]
- [single_quote "\0027"]
- [single_left_angle_quote "\2039"]
- [single_right_angle_quote "\203A"]
- [double_left_angle_quote "\00AB"]
- [double_right_angle_quote "\00BB"]
- [single_left_quote "\2018"]
- [single_right_quote "\2019"]
- [double_left_quote "\201C"]
- [double_right_quote "\201D"]
- [low_double_quote "\201E"]]
- [(def: .public quote
- (-> Text Quote)
- (|>> :abstraction))])
-
- (def: quote_separator " ")
-
- (def: .public (quotes [left0 right0] [left1 right1])
- (-> [Quote Quote] [Quote Quote] (Value Quotes))
- (|> (list left0 right0 left1 right1)
- (list\each (|>> ..quote_text %.text))
- (text.interposed ..quote_separator)
- :abstraction))
-
- (def: .public (matrix_2d [a b] [c d] [tx ty])
- (-> [Frac Frac]
- [Frac Frac]
- [Frac Frac]
- (Value Transform))
- (|> (list a b c d tx ty)
- (list\each %number)
- (..apply "matrix")))
-
- (def: .public (matrix_3d [a0 b0 c0 d0] [a1 b1 c1 d1] [a2 b2 c2 d2] [a3 b3 c3 d3])
- (-> [Frac Frac Frac Frac]
- [Frac Frac Frac Frac]
- [Frac Frac Frac Frac]
- [Frac Frac Frac Frac]
- (Value Transform))
- (|> (list a0 b0 c0 d0 a1 b1 c1 d1 a2 b2 c2 d2 a3 b3 c3 d3)
- (list\each %number)
- (..apply "matrix3d")))
-
- (template [<name> <function> <input_types> <input_values>]
- [(`` (def: .public (<name> [(~~ (template.spliced <input_values>))])
- (-> [(~~ (template.spliced <input_types>))] (Value Transform))
- (|> (list (~~ (template.spliced <input_values>)))
- (list\each %number)
- (..apply <function>))))]
-
- [translate_2d "translate" [Frac Frac] [x y]]
- [translate_3d "translate3d" [Frac Frac Frac] [x y z]]
- [translate_x "translateX" [Frac] [value]]
- [translate_y "translateY" [Frac] [value]]
- [translate_z "translateZ" [Frac] [value]]
-
- [scale_2d "scale" [Frac Frac] [x y]]
- [scale_3d "scale3d" [Frac Frac Frac] [x y z]]
- [scale_x "scaleX" [Frac] [value]]
- [scale_y "scaleY" [Frac] [value]]
- [scale_z "scaleZ" [Frac] [value]]
-
- [perspective "perspective" [Frac] [value]]
- )
-
- (template [<name> <function> <input_types> <input_values>]
- [(`` (def: .public (<name> [(~~ (template.spliced <input_values>))])
- (-> [(~~ (template.spliced <input_types>))] (Value Transform))
- (|> (list (~~ (template.spliced <input_values>)))
- (list\each ..angle)
- (..apply <function>))))]
-
- [rotate_2d "rotate" [Angle] [angle]]
- [rotate_x "rotateX" [Angle] [angle]]
- [rotate_y "rotateY" [Angle] [angle]]
- [rotate_z "rotateZ" [Angle] [angle]]
-
- [skew "skew" [Angle Angle] [x_angle y_angle]]
- [skew_x "skewX" [Angle] [angle]]
- [skew_y "skewY" [Angle] [angle]]
- )
-
- (def: .public (rotate_3d [x y z angle])
- (-> [Frac Frac Frac Angle] (Value Transform))
- (..apply "rotate3d"
- (list (%number x) (%number y) (%number z) (..angle angle))))
-
- (def: origin_separator " ")
-
- (def: .public (origin_2d x y)
- (-> (Value Length) (Value Length) (Value Transform_Origin))
- (:abstraction (format (:representation x) ..origin_separator
- (:representation y))))
-
- (def: .public (origin_3d x y z)
- (-> (Value Length) (Value Length) (Value Length) (Value Transform_Origin))
- (:abstraction (format (:representation x) ..origin_separator
- (:representation y) ..origin_separator
- (:representation z))))
-
- (def: .public vertical_align
- (-> (Value Length) (Value Vertical_Align))
- (|>> :transmutation))
-
- (def: .public (z_index index)
- (-> Int (Value Z_Index))
- (:abstraction (if (i.< +0 index)
- (%.int index)
- (%.nat (.nat index)))))
-
- (multi: multi_image Image ",")
- (multi: multi_shadow Shadow ",")
- (multi: multi_content Content " ")
+ (type: .public Rectangle
+ (Record
+ [#top (Value Length)
+ #right (Value Length)
+ #bottom (Value Length)
+ #left (Value Length)]))
+
+ (def: .public (clip rectangle)
+ (-> Rectangle (Value Clip))
+ (`` (..apply "rect" (list (~~ (template [<side>]
+ [(:representation (value@ <side> rectangle))]
+
+ [#top] [#right] [#bottom] [#left]))))))
+
+ (def: .public counter
+ (-> Label (Value Counter))
+ (|>> :abstraction))
+
+ (def: .public current_count
+ (-> (Value Counter) (Value Content))
+ (|>> :representation (list) (..apply "counter")))
+
+ (def: .public text
+ (-> Text (Value Content))
+ (|>> %.text :abstraction))
+
+ (def: .public attribute
+ (-> Label (Value Content))
+ (|>> (list) (..apply "attr")))
+
+ (def: .public media
+ (-> URL (Value Content))
+ (|>> (list) (..apply "url")))
+
+ (enumeration: Font Text
+ font_name
+ [[serif "serif"]
+ [sans_serif "sans-serif"]
+ [cursive "cursive"]
+ [fantasy "fantasy"]
+ [monospace "monospace"]]
+ [(def: .public font
+ (-> Text Font)
+ (|>> %.text :abstraction))
+
+ (def: .public (font_family options)
+ (-> (List Font) (Value Font))
+ (case options
+ (#.Item _)
+ (|> options
+ (list\each ..font_name)
+ (text.interposed ",")
+ (:abstraction Value))
+
+ #.End
+ ..initial))])
+
+ (def: .public font_size
+ (-> (Value Length) (Value Font_Size))
+ (|>> :transmutation))
+
+ (def: .public number
+ (-> Frac (Value Number))
+ (|>> %number :abstraction))
+
+ (def: .public grid
+ (-> Label (Value Grid))
+ (|>> :abstraction))
+
+ (def: .public fit_content
+ (-> (Value Length) (Value Grid_Content))
+ (|>> :representation (list) (..apply "fit-content")))
+
+ (def: .public (min_max min max)
+ (-> (Value Grid_Content) (Value Grid_Content) (Value Grid_Content))
+ (..apply "minmax" (list (:representation min)
+ (:representation max))))
+
+ (def: .public grid_span
+ (-> Nat (Value Grid_Span))
+ (|>> %.nat (format "span ") :abstraction))
+
+ (def: grid_column_separator " ")
+ (def: grid_row_separator " ")
+
+ (def: .public grid_template
+ (-> (List (List (Maybe (Value Grid)))) (Value Grid_Template))
+ (let [empty (: (Value Grid)
+ (:abstraction "."))]
+ (|>> (list\each (|>> (list\each (|>> (maybe.else empty)
+ :representation))
+ (text.interposed ..grid_column_separator)
+ (text.enclosed ["'" "'"])))
+ (text.interposed ..grid_row_separator)
+ :abstraction)))
+
+ (def: .public (resolution dpi)
+ (-> Nat (Value Resolution))
+ (:abstraction (format (%.nat dpi) "dpi")))
+
+ (def: .public (ratio numerator denominator)
+ (-> Nat Nat (Value Ratio))
+ (:abstraction (format (%.nat numerator) "/" (%.nat denominator))))
+
+ (enumeration: Quote Text
+ quote_text
+ [[double_quote "\0022"]
+ [single_quote "\0027"]
+ [single_left_angle_quote "\2039"]
+ [single_right_angle_quote "\203A"]
+ [double_left_angle_quote "\00AB"]
+ [double_right_angle_quote "\00BB"]
+ [single_left_quote "\2018"]
+ [single_right_quote "\2019"]
+ [double_left_quote "\201C"]
+ [double_right_quote "\201D"]
+ [low_double_quote "\201E"]]
+ [(def: .public quote
+ (-> Text Quote)
+ (|>> :abstraction))])
+
+ (def: quote_separator " ")
+
+ (def: .public (quotes [left0 right0] [left1 right1])
+ (-> [Quote Quote] [Quote Quote] (Value Quotes))
+ (|> (list left0 right0 left1 right1)
+ (list\each (|>> ..quote_text %.text))
+ (text.interposed ..quote_separator)
+ :abstraction))
+
+ (def: .public (matrix_2d [a b] [c d] [tx ty])
+ (-> [Frac Frac]
+ [Frac Frac]
+ [Frac Frac]
+ (Value Transform))
+ (|> (list a b c d tx ty)
+ (list\each %number)
+ (..apply "matrix")))
+
+ (def: .public (matrix_3d [a0 b0 c0 d0] [a1 b1 c1 d1] [a2 b2 c2 d2] [a3 b3 c3 d3])
+ (-> [Frac Frac Frac Frac]
+ [Frac Frac Frac Frac]
+ [Frac Frac Frac Frac]
+ [Frac Frac Frac Frac]
+ (Value Transform))
+ (|> (list a0 b0 c0 d0 a1 b1 c1 d1 a2 b2 c2 d2 a3 b3 c3 d3)
+ (list\each %number)
+ (..apply "matrix3d")))
+
+ (template [<name> <function> <input_types> <input_values>]
+ [(`` (def: .public (<name> [(~~ (template.spliced <input_values>))])
+ (-> [(~~ (template.spliced <input_types>))] (Value Transform))
+ (|> (list (~~ (template.spliced <input_values>)))
+ (list\each %number)
+ (..apply <function>))))]
+
+ [translate_2d "translate" [Frac Frac] [x y]]
+ [translate_3d "translate3d" [Frac Frac Frac] [x y z]]
+ [translate_x "translateX" [Frac] [value]]
+ [translate_y "translateY" [Frac] [value]]
+ [translate_z "translateZ" [Frac] [value]]
+
+ [scale_2d "scale" [Frac Frac] [x y]]
+ [scale_3d "scale3d" [Frac Frac Frac] [x y z]]
+ [scale_x "scaleX" [Frac] [value]]
+ [scale_y "scaleY" [Frac] [value]]
+ [scale_z "scaleZ" [Frac] [value]]
+
+ [perspective "perspective" [Frac] [value]]
+ )
+
+ (template [<name> <function> <input_types> <input_values>]
+ [(`` (def: .public (<name> [(~~ (template.spliced <input_values>))])
+ (-> [(~~ (template.spliced <input_types>))] (Value Transform))
+ (|> (list (~~ (template.spliced <input_values>)))
+ (list\each ..angle)
+ (..apply <function>))))]
+
+ [rotate_2d "rotate" [Angle] [angle]]
+ [rotate_x "rotateX" [Angle] [angle]]
+ [rotate_y "rotateY" [Angle] [angle]]
+ [rotate_z "rotateZ" [Angle] [angle]]
+
+ [skew "skew" [Angle Angle] [x_angle y_angle]]
+ [skew_x "skewX" [Angle] [angle]]
+ [skew_y "skewY" [Angle] [angle]]
+ )
+
+ (def: .public (rotate_3d [x y z angle])
+ (-> [Frac Frac Frac Angle] (Value Transform))
+ (..apply "rotate3d"
+ (list (%number x) (%number y) (%number z) (..angle angle))))
+
+ (def: origin_separator " ")
+
+ (def: .public (origin_2d x y)
+ (-> (Value Length) (Value Length) (Value Transform_Origin))
+ (:abstraction (format (:representation x) ..origin_separator
+ (:representation y))))
+
+ (def: .public (origin_3d x y z)
+ (-> (Value Length) (Value Length) (Value Length) (Value Transform_Origin))
+ (:abstraction (format (:representation x) ..origin_separator
+ (:representation y) ..origin_separator
+ (:representation z))))
+
+ (def: .public vertical_align
+ (-> (Value Length) (Value Vertical_Align))
+ (|>> :transmutation))
+
+ (def: .public (z_index index)
+ (-> Int (Value Z_Index))
+ (:abstraction (if (i.< +0 index)
+ (%.int index)
+ (%.nat (.nat index)))))
+
+ (multi: multi_image Image ",")
+ (multi: multi_shadow Shadow ",")
+ (multi: multi_content Content " ")]
)
diff --git a/stdlib/source/library/lux/data/format/html.lux b/stdlib/source/library/lux/data/format/html.lux
index 6b662a38d..5dfe95fce 100644
--- a/stdlib/source/library/lux/data/format/html.lux
+++ b/stdlib/source/library/lux/data/format/html.lux
@@ -80,496 +80,494 @@
(text.enclosed ["</" ">"]))
(abstract: .public (HTML brand)
- {}
-
Text
- (template [<name> <brand>]
- [(abstract: .public <brand> {} Any)
- (type: .public <name> (HTML <brand>))]
-
- [Meta Meta']
- [Head Head']
- [Item Item']
- [Option Option']
- [Input Input']
- [Cell Cell']
- [Header Header']
- [Row Row']
- [Column Column']
- [Parameter Parameter']
- [Body Body']
- [Document Document']
- )
-
- (template [<super> <super_raw> <sub>+]
- [(abstract: .public (<super_raw> brand) {} Any)
- (type: .public <super> (HTML (<super_raw> Any)))
-
- (`` (template [<sub> <sub_raw>]
- [(abstract: .public <sub_raw> {} Any)
- (type: .public <sub> (HTML (<super_raw> <sub_raw>)))]
-
- (~~ (template.spliced <sub>+))))]
-
- [Element Element'
- [[Content Content']
- [Image Image']]]
-
- [Media Media'
- [[Source Source']
- [Track Track']]]
- )
-
- (def: .public html
- (-> Document Text)
- (|>> :representation))
-
- (def: .public (and pre post)
- (All (_ brand) (-> (HTML brand) (HTML brand) (HTML brand)))
- (:abstraction (format (:representation pre) (:representation post))))
-
- (def: .public (comment content node)
- (All (_ brand) (-> Text (HTML brand) (HTML brand)))
- (:abstraction
- (format (text.enclosed ["<!--" "-->"] content)
- (:representation node))))
-
- (def: (empty name attributes)
- (-> Tag Attributes HTML)
- (:abstraction
- (format (..open name attributes)
- (..close name))))
-
- (def: (simple tag attributes)
- (-> Tag Attributes HTML)
- (|> attributes
- (..open tag)
- :abstraction))
-
- (def: (tag name attributes content)
- (-> Tag Attributes (HTML Any) HTML)
- (:abstraction
- (format (..open name attributes)
- (:representation content)
- (..close name))))
-
- (def: (raw tag attributes content)
- (-> Text Attributes Text HTML)
- (:abstraction
- (format (..open tag attributes)
- content
- (..close tag))))
-
- (template [<name> <tag> <brand>]
- [(def: .public <name>
- (-> Attributes <brand>)
- (..simple <tag>))]
-
- [link "link" Meta]
- [meta "meta" Meta]
- [input "input" Input]
- [embedded "embed" Element]
- [column "col" Column]
- [parameter "param" Parameter]
- )
-
- (def: .public (base href target)
- (-> URL (Maybe Target) Meta)
- (let [partial (list ["href" href])
- full (case target
- (#.Some target)
- (list& ["target" (..target target)] partial)
-
- #.None
- partial)]
- (..simple "base" full)))
-
- (def: .public style
- (-> Style Meta)
- (|>> style.inline (..raw "style" (list))))
-
- (def: .public (script attributes inline)
- (-> Attributes (Maybe Script) Meta)
- (|> inline
- (maybe\each js.code)
- (maybe.else "")
- (..raw "script" attributes)))
-
- (def: .public text
- (-> Text Content)
- (|>> ..safe
+ [(template [<name> <brand>]
+ [(abstract: .public <brand> Any [])
+ (type: .public <name> (HTML <brand>))]
+
+ [Meta Meta']
+ [Head Head']
+ [Item Item']
+ [Option Option']
+ [Input Input']
+ [Cell Cell']
+ [Header Header']
+ [Row Row']
+ [Column Column']
+ [Parameter Parameter']
+ [Body Body']
+ [Document Document']
+ )
+
+ (template [<super> <super_raw> <sub>+]
+ [(abstract: .public (<super_raw> brand) Any [])
+ (type: .public <super> (HTML (<super_raw> Any)))
+
+ (`` (template [<sub> <sub_raw>]
+ [(abstract: .public <sub_raw> Any [])
+ (type: .public <sub> (HTML (<super_raw> <sub_raw>)))]
+
+ (~~ (template.spliced <sub>+))))]
+
+ [Element Element'
+ [[Content Content']
+ [Image Image']]]
+
+ [Media Media'
+ [[Source Source']
+ [Track Track']]]
+ )
+
+ (def: .public html
+ (-> Document Text)
+ (|>> :representation))
+
+ (def: .public (and pre post)
+ (All (_ brand) (-> (HTML brand) (HTML brand) (HTML brand)))
+ (:abstraction (format (:representation pre) (:representation post))))
+
+ (def: .public (comment content node)
+ (All (_ brand) (-> Text (HTML brand) (HTML brand)))
+ (:abstraction
+ (format (text.enclosed ["<!--" "-->"] content)
+ (:representation node))))
+
+ (def: (empty name attributes)
+ (-> Tag Attributes HTML)
+ (:abstraction
+ (format (..open name attributes)
+ (..close name))))
+
+ (def: (simple tag attributes)
+ (-> Tag Attributes HTML)
+ (|> attributes
+ (..open tag)
:abstraction))
- (template [<tag> <alias> <name>]
- [(def: .public <name>
- Element
- (..simple <tag> (list)))
-
- (def: .public <alias> <name>)]
- ["br" br line_break]
- ["wbr" wbr word_break]
- ["hr" hr separator]
- )
-
- (def: .public (image source attributes)
- (-> URL Attributes Image)
- (|> attributes
- (#.Item ["src" source])
- (..simple "img")))
-
- (def: .public (svg attributes content)
- (-> Attributes XML Element)
- (|> content
- (\ xml.codec encoded)
- (..raw "svg" attributes)))
-
- (type: .public Coord
- (Record
- [#horizontal Nat
- #vertical Nat]))
-
- (def: metric_separator ",")
- (def: coord_separator ",")
-
- (def: (%coord [horizontal vertical])
- (Format Coord)
- (format (%.nat horizontal) ..metric_separator (%.nat vertical)))
-
- (type: .public Rectangle
- (Record
- [#start Coord
- #end Coord]))
-
- (type: .public Circle
- (Record
- [#center Coord
- #radius Nat]))
-
- (type: .public Polygon
- (Record
- [#first Coord
- #second Coord
- #third Coord
- #extra (List Coord)]))
-
- (def: (%rectangle [start end])
- (Format Rectangle)
- (format (%coord start) ..coord_separator (%coord end)))
-
- (def: (%circle [center radius])
- (Format Circle)
- (format (%coord center) ..metric_separator (%.nat radius)))
-
- (def: (%polygon [first second third extra])
- (Format Polygon)
- (|> (list& first second third extra)
- (list\each %coord)
- (text.interposed ..coord_separator)))
-
- (type: .public Shape
- (Variant
- (#Rectangle Rectangle)
- (#Circle Circle)
- (#Polygon Polygon)))
-
- (template [<name> <shape> <type> <format>]
- [(def: (<name> attributes shape)
- (-> Attributes <type> (HTML Any))
- (..simple "area" (list& ["shape" <shape>]
- ["coords" (<format> shape)]
- attributes)))]
-
- [rectangle "rect" Rectangle ..%rectangle]
- [circle "circle" Circle ..%circle]
- [polygon "poly" Polygon ..%polygon]
- )
-
- (def: (area attributes shape)
- (-> Attributes Shape (HTML Any))
- (case shape
- (#Rectangle rectangle)
- (..rectangle attributes rectangle)
-
- (#Circle circle)
- (..circle attributes circle)
-
- (#Polygon polygon)
- (..polygon attributes polygon)))
-
- (def: .public (each attributes areas for)
- (-> Attributes (List [Attributes Shape]) Image Image)
- ($_ ..and
- for
- (case (list\each (product.uncurried ..area) areas)
- #.End
- (..empty "map" attributes)
-
- (#.Item head tail)
- (..tag "map" attributes
- (list\mix (function.flipped ..and) head tail)))))
-
- (template [<name> <tag> <type>]
- [(def: .public <name>
- (-> Attributes <type>)
- (..empty <tag>))]
-
- [canvas "canvas" Element]
- [progress "progress" Element]
- [output "output" Input]
- [source "source" Source]
- [track "track" Track]
- )
-
- (template [<name> <tag>]
- [(def: .public (<name> attributes media on_unsupported)
- (-> Attributes Media (Maybe Content) Element)
- (..tag <tag> attributes
- (|> on_unsupported
- (maybe.else (..text ""))
- (..and media))))]
-
- [audio "audio"]
- [video "video"]
- )
-
- (def: .public (picture attributes sources image)
- (-> Attributes Source Image Element)
- (..tag "picture" attributes (..and sources image)))
-
- (def: .public (anchor href attributes content)
- (-> URL Attributes Element Element)
- (..tag "a" (list& ["href" href] attributes) content))
-
- (def: .public label
- (-> ID Input)
- (|>> ["for"] list (..empty "label")))
-
- (template [<name> <container_tag> <description_tag> <type>]
- [(def: .public (<name> description attributes content)
- (-> (Maybe Content) Attributes <type> <type>)
- (..tag <container_tag> attributes
- (case description
- (#.Some description)
- ($_ ..and
- (..tag <description_tag> (list) description)
- content)
-
- #.None
- content)))]
-
- [details "details" "summary" Element]
- [field_set "fieldset" "legend" Input]
- [figure "figure" "figcaption" Element]
- )
-
- (template [<name> <tag> <type>]
- [(def: .public (<name> attributes content)
- (-> Attributes (Maybe Content) <type>)
- (|> content
- (maybe.else (..text ""))
- (..tag <tag> attributes)))]
-
- [text_area "textarea" Input]
- [iframe "iframe" Element]
- )
-
- (type: .public Phrase
- (-> Attributes Content Element))
-
- (template [<name> <tag>]
- [(def: .public <name>
- Phrase
- (..tag <tag>))]
-
- [abbrebiation "abbr"]
- [block_quote "blockquote"]
- [bold "b"]
- [cite "cite"]
- [code "code"]
- [definition "dfn"]
- [deleted "del"]
- [emphasized "em"]
- [h1 "h1"]
- [h2 "h2"]
- [h3 "h3"]
- [h4 "h4"]
- [h5 "h5"]
- [h6 "h6"]
- [inserted "ins"]
- [italic "i"]
- [keyboard "kbd"]
- [marked "mark"]
- [meter "meter"]
- [pre "pre"]
- [quote "q"]
- [sample "samp"]
- [struck "s"]
- [small "small"]
- [sub "sub"]
- [super "sup"]
- [strong "strong"]
- [time "time"]
- [underlined "u"]
- [variable "var"]
- )
-
- (def: .public incorrect ..struck)
-
- (def: (ruby_pronunciation pronunciation)
- (-> Content (HTML Any))
- (..tag "rt" (list)
- ($_ ..and
- (..tag "rp" (list) (..text "("))
- pronunciation
- (..tag "rp" (list) (..text ")")))))
-
- (def: .public (ruby attributes content pronunciation)
- (-> Attributes Content Content Element)
- (..tag "ruby" attributes
- ($_ ..and
- content
- (ruby_pronunciation pronunciation))))
-
- (type: .public Composite
- (-> Attributes Element Element))
-
- (template [<name> <tag>]
- [(def: .public <name>
- Composite
- (..tag <tag>))]
-
- [article "article"]
- [aside "aside"]
- [dialog "dialog"]
- [div "div"]
- [footer "footer"]
- [header "header"]
- [main "main"]
- [navigation "nav"]
- [paragraph "p"]
- [section "section"]
- [span "span"]
- )
-
- (template [<tag> <name> <input>]
- [(def: <name>
- (-> <input> (HTML Any))
- (..tag <tag> (list)))]
-
- ["dt" term Content]
- ["dd" description Element]
- )
-
- (def: .public (description_list attributes descriptions)
- (-> Attributes (List [Content Element]) Element)
- (case (list\each (function (_ [term description])
- ($_ ..and
- (..term term)
- (..description description)))
- descriptions)
- #.End
- (..empty "dl" attributes)
-
- (#.Item head tail)
- (..tag "dl" attributes
- (list\mix (function.flipped ..and) head tail))))
-
- (def: .public p ..paragraph)
-
- (template [<name> <tag> <input> <output>]
- [(def: .public <name>
- (-> Attributes <input> <output>)
- (..tag <tag>))]
-
- [button "button" Element Input]
- [item "li" Element Item]
- [ordered_list "ol" Item Element]
- [unordered_list "ul" Item Element]
- [option "option" Content Option]
- [option_group "optgroup" Option Option]
- [data_list "datalist" Option Element]
- [select "select" Option Input]
- [address "address" Element Element]
- [form "form" Input Element]
- [data "data" Element Element]
- [object "object" Parameter Element]
- )
-
- (template [<name> <tag> <input> <output>]
- [(def: .public <name>
- (-> <input> <output>)
- (..tag <tag> (list)))]
-
- [title "title" Content Meta]
- [no_script "noscript" Content Meta]
- [template "template" (HTML Any) (HTML Nothing)]
- [table_header "th" Element Header]
- [table_cell "td" Element Cell]
- [head "head" Meta Head]
- [body "body" Element Body]
- )
-
- (template [<name> <tag> <input> <output>]
- [(def: <name>
- (-> <input> <output>)
- (..tag <tag> (list)))]
-
- [table_row "tr" (HTML Any) Row]
- [table_head "thead" Row HTML]
- [table_body "tbody" Row HTML]
- [table_foot "tfoot" Row HTML]
- [columns_group "colgroup" Column HTML]
- )
-
- (def: .public (table attributes caption columns headers rows footer)
- (-> Attributes (Maybe Content) (Maybe Column) Header (List Cell) (Maybe Cell) Element)
- (let [head (..table_head (..table_row headers))
- content (case (list\each table_row rows)
- #.End
- head
-
- (#.Item first rest)
- (..and head
- (..table_body
- (list\mix (function.flipped ..and) first rest))))
- content (case footer
- #.None
- content
-
- (#.Some footer)
- (..and content
- (..table_foot (..table_row footer))))
- content (case columns
- #.None
- content
-
- (#.Some columns)
- (..and (..columns_group columns)
- content))
- content (case caption
- #.None
- content
-
- (#.Some caption)
- (..and (:as HTML caption)
- content))]
- (..tag "table" attributes
- content)))
-
- (template [<name> <doc_type>]
- [(def: .public <name>
- (-> Head Body Document)
- (let [doc_type <doc_type>]
- (function (_ head body)
- (|> (..tag "html" (list) (..and head body))
- :representation
- (format doc_type)
- :abstraction))))]
-
- [html/5 "<!DOCTYPE html>"]
- [html/4_01 (format "<!DOCTYPE HTML PUBLIC " text.double_quote "-//W3C//DTD HTML 4.01//EN" text.double_quote " " text.double_quote "http://www.w3.org/TR/html4/strict.dtd" text.double_quote ">")]
- [xhtml/1_0 (format "<!DOCTYPE html PUBLIC " text.double_quote "-//W3C//DTD XHTML 1.0 Strict//EN" text.double_quote " " text.double_quote "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" text.double_quote ">")]
- [xhtml/1_1 (format "<!DOCTYPE html PUBLIC " text.double_quote "-//W3C//DTD XHTML 1.1//EN" text.double_quote " " text.double_quote "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" text.double_quote ">")]
- )
+ (def: (tag name attributes content)
+ (-> Tag Attributes (HTML Any) HTML)
+ (:abstraction
+ (format (..open name attributes)
+ (:representation content)
+ (..close name))))
+
+ (def: (raw tag attributes content)
+ (-> Text Attributes Text HTML)
+ (:abstraction
+ (format (..open tag attributes)
+ content
+ (..close tag))))
+
+ (template [<name> <tag> <brand>]
+ [(def: .public <name>
+ (-> Attributes <brand>)
+ (..simple <tag>))]
+
+ [link "link" Meta]
+ [meta "meta" Meta]
+ [input "input" Input]
+ [embedded "embed" Element]
+ [column "col" Column]
+ [parameter "param" Parameter]
+ )
+
+ (def: .public (base href target)
+ (-> URL (Maybe Target) Meta)
+ (let [partial (list ["href" href])
+ full (case target
+ (#.Some target)
+ (list& ["target" (..target target)] partial)
+
+ #.None
+ partial)]
+ (..simple "base" full)))
+
+ (def: .public style
+ (-> Style Meta)
+ (|>> style.inline (..raw "style" (list))))
+
+ (def: .public (script attributes inline)
+ (-> Attributes (Maybe Script) Meta)
+ (|> inline
+ (maybe\each js.code)
+ (maybe.else "")
+ (..raw "script" attributes)))
+
+ (def: .public text
+ (-> Text Content)
+ (|>> ..safe
+ :abstraction))
+
+ (template [<tag> <alias> <name>]
+ [(def: .public <name>
+ Element
+ (..simple <tag> (list)))
+
+ (def: .public <alias> <name>)]
+ ["br" br line_break]
+ ["wbr" wbr word_break]
+ ["hr" hr separator]
+ )
+
+ (def: .public (image source attributes)
+ (-> URL Attributes Image)
+ (|> attributes
+ (#.Item ["src" source])
+ (..simple "img")))
+
+ (def: .public (svg attributes content)
+ (-> Attributes XML Element)
+ (|> content
+ (\ xml.codec encoded)
+ (..raw "svg" attributes)))
+
+ (type: .public Coord
+ (Record
+ [#horizontal Nat
+ #vertical Nat]))
+
+ (def: metric_separator ",")
+ (def: coord_separator ",")
+
+ (def: (%coord [horizontal vertical])
+ (Format Coord)
+ (format (%.nat horizontal) ..metric_separator (%.nat vertical)))
+
+ (type: .public Rectangle
+ (Record
+ [#start Coord
+ #end Coord]))
+
+ (type: .public Circle
+ (Record
+ [#center Coord
+ #radius Nat]))
+
+ (type: .public Polygon
+ (Record
+ [#first Coord
+ #second Coord
+ #third Coord
+ #extra (List Coord)]))
+
+ (def: (%rectangle [start end])
+ (Format Rectangle)
+ (format (%coord start) ..coord_separator (%coord end)))
+
+ (def: (%circle [center radius])
+ (Format Circle)
+ (format (%coord center) ..metric_separator (%.nat radius)))
+
+ (def: (%polygon [first second third extra])
+ (Format Polygon)
+ (|> (list& first second third extra)
+ (list\each %coord)
+ (text.interposed ..coord_separator)))
+
+ (type: .public Shape
+ (Variant
+ (#Rectangle Rectangle)
+ (#Circle Circle)
+ (#Polygon Polygon)))
+
+ (template [<name> <shape> <type> <format>]
+ [(def: (<name> attributes shape)
+ (-> Attributes <type> (HTML Any))
+ (..simple "area" (list& ["shape" <shape>]
+ ["coords" (<format> shape)]
+ attributes)))]
+
+ [rectangle "rect" Rectangle ..%rectangle]
+ [circle "circle" Circle ..%circle]
+ [polygon "poly" Polygon ..%polygon]
+ )
+
+ (def: (area attributes shape)
+ (-> Attributes Shape (HTML Any))
+ (case shape
+ (#Rectangle rectangle)
+ (..rectangle attributes rectangle)
+
+ (#Circle circle)
+ (..circle attributes circle)
+
+ (#Polygon polygon)
+ (..polygon attributes polygon)))
+
+ (def: .public (each attributes areas for)
+ (-> Attributes (List [Attributes Shape]) Image Image)
+ ($_ ..and
+ for
+ (case (list\each (product.uncurried ..area) areas)
+ #.End
+ (..empty "map" attributes)
+
+ (#.Item head tail)
+ (..tag "map" attributes
+ (list\mix (function.flipped ..and) head tail)))))
+
+ (template [<name> <tag> <type>]
+ [(def: .public <name>
+ (-> Attributes <type>)
+ (..empty <tag>))]
+
+ [canvas "canvas" Element]
+ [progress "progress" Element]
+ [output "output" Input]
+ [source "source" Source]
+ [track "track" Track]
+ )
+
+ (template [<name> <tag>]
+ [(def: .public (<name> attributes media on_unsupported)
+ (-> Attributes Media (Maybe Content) Element)
+ (..tag <tag> attributes
+ (|> on_unsupported
+ (maybe.else (..text ""))
+ (..and media))))]
+
+ [audio "audio"]
+ [video "video"]
+ )
+
+ (def: .public (picture attributes sources image)
+ (-> Attributes Source Image Element)
+ (..tag "picture" attributes (..and sources image)))
+
+ (def: .public (anchor href attributes content)
+ (-> URL Attributes Element Element)
+ (..tag "a" (list& ["href" href] attributes) content))
+
+ (def: .public label
+ (-> ID Input)
+ (|>> ["for"] list (..empty "label")))
+
+ (template [<name> <container_tag> <description_tag> <type>]
+ [(def: .public (<name> description attributes content)
+ (-> (Maybe Content) Attributes <type> <type>)
+ (..tag <container_tag> attributes
+ (case description
+ (#.Some description)
+ ($_ ..and
+ (..tag <description_tag> (list) description)
+ content)
+
+ #.None
+ content)))]
+
+ [details "details" "summary" Element]
+ [field_set "fieldset" "legend" Input]
+ [figure "figure" "figcaption" Element]
+ )
+
+ (template [<name> <tag> <type>]
+ [(def: .public (<name> attributes content)
+ (-> Attributes (Maybe Content) <type>)
+ (|> content
+ (maybe.else (..text ""))
+ (..tag <tag> attributes)))]
+
+ [text_area "textarea" Input]
+ [iframe "iframe" Element]
+ )
+
+ (type: .public Phrase
+ (-> Attributes Content Element))
+
+ (template [<name> <tag>]
+ [(def: .public <name>
+ Phrase
+ (..tag <tag>))]
+
+ [abbrebiation "abbr"]
+ [block_quote "blockquote"]
+ [bold "b"]
+ [cite "cite"]
+ [code "code"]
+ [definition "dfn"]
+ [deleted "del"]
+ [emphasized "em"]
+ [h1 "h1"]
+ [h2 "h2"]
+ [h3 "h3"]
+ [h4 "h4"]
+ [h5 "h5"]
+ [h6 "h6"]
+ [inserted "ins"]
+ [italic "i"]
+ [keyboard "kbd"]
+ [marked "mark"]
+ [meter "meter"]
+ [pre "pre"]
+ [quote "q"]
+ [sample "samp"]
+ [struck "s"]
+ [small "small"]
+ [sub "sub"]
+ [super "sup"]
+ [strong "strong"]
+ [time "time"]
+ [underlined "u"]
+ [variable "var"]
+ )
+
+ (def: .public incorrect ..struck)
+
+ (def: (ruby_pronunciation pronunciation)
+ (-> Content (HTML Any))
+ (..tag "rt" (list)
+ ($_ ..and
+ (..tag "rp" (list) (..text "("))
+ pronunciation
+ (..tag "rp" (list) (..text ")")))))
+
+ (def: .public (ruby attributes content pronunciation)
+ (-> Attributes Content Content Element)
+ (..tag "ruby" attributes
+ ($_ ..and
+ content
+ (ruby_pronunciation pronunciation))))
+
+ (type: .public Composite
+ (-> Attributes Element Element))
+
+ (template [<name> <tag>]
+ [(def: .public <name>
+ Composite
+ (..tag <tag>))]
+
+ [article "article"]
+ [aside "aside"]
+ [dialog "dialog"]
+ [div "div"]
+ [footer "footer"]
+ [header "header"]
+ [main "main"]
+ [navigation "nav"]
+ [paragraph "p"]
+ [section "section"]
+ [span "span"]
+ )
+
+ (template [<tag> <name> <input>]
+ [(def: <name>
+ (-> <input> (HTML Any))
+ (..tag <tag> (list)))]
+
+ ["dt" term Content]
+ ["dd" description Element]
+ )
+
+ (def: .public (description_list attributes descriptions)
+ (-> Attributes (List [Content Element]) Element)
+ (case (list\each (function (_ [term description])
+ ($_ ..and
+ (..term term)
+ (..description description)))
+ descriptions)
+ #.End
+ (..empty "dl" attributes)
+
+ (#.Item head tail)
+ (..tag "dl" attributes
+ (list\mix (function.flipped ..and) head tail))))
+
+ (def: .public p ..paragraph)
+
+ (template [<name> <tag> <input> <output>]
+ [(def: .public <name>
+ (-> Attributes <input> <output>)
+ (..tag <tag>))]
+
+ [button "button" Element Input]
+ [item "li" Element Item]
+ [ordered_list "ol" Item Element]
+ [unordered_list "ul" Item Element]
+ [option "option" Content Option]
+ [option_group "optgroup" Option Option]
+ [data_list "datalist" Option Element]
+ [select "select" Option Input]
+ [address "address" Element Element]
+ [form "form" Input Element]
+ [data "data" Element Element]
+ [object "object" Parameter Element]
+ )
+
+ (template [<name> <tag> <input> <output>]
+ [(def: .public <name>
+ (-> <input> <output>)
+ (..tag <tag> (list)))]
+
+ [title "title" Content Meta]
+ [no_script "noscript" Content Meta]
+ [template "template" (HTML Any) (HTML Nothing)]
+ [table_header "th" Element Header]
+ [table_cell "td" Element Cell]
+ [head "head" Meta Head]
+ [body "body" Element Body]
+ )
+
+ (template [<name> <tag> <input> <output>]
+ [(def: <name>
+ (-> <input> <output>)
+ (..tag <tag> (list)))]
+
+ [table_row "tr" (HTML Any) Row]
+ [table_head "thead" Row HTML]
+ [table_body "tbody" Row HTML]
+ [table_foot "tfoot" Row HTML]
+ [columns_group "colgroup" Column HTML]
+ )
+
+ (def: .public (table attributes caption columns headers rows footer)
+ (-> Attributes (Maybe Content) (Maybe Column) Header (List Cell) (Maybe Cell) Element)
+ (let [head (..table_head (..table_row headers))
+ content (case (list\each table_row rows)
+ #.End
+ head
+
+ (#.Item first rest)
+ (..and head
+ (..table_body
+ (list\mix (function.flipped ..and) first rest))))
+ content (case footer
+ #.None
+ content
+
+ (#.Some footer)
+ (..and content
+ (..table_foot (..table_row footer))))
+ content (case columns
+ #.None
+ content
+
+ (#.Some columns)
+ (..and (..columns_group columns)
+ content))
+ content (case caption
+ #.None
+ content
+
+ (#.Some caption)
+ (..and (:as HTML caption)
+ content))]
+ (..tag "table" attributes
+ content)))
+
+ (template [<name> <doc_type>]
+ [(def: .public <name>
+ (-> Head Body Document)
+ (let [doc_type <doc_type>]
+ (function (_ head body)
+ (|> (..tag "html" (list) (..and head body))
+ :representation
+ (format doc_type)
+ :abstraction))))]
+
+ [html/5 "<!DOCTYPE html>"]
+ [html/4_01 (format "<!DOCTYPE HTML PUBLIC " text.double_quote "-//W3C//DTD HTML 4.01//EN" text.double_quote " " text.double_quote "http://www.w3.org/TR/html4/strict.dtd" text.double_quote ">")]
+ [xhtml/1_0 (format "<!DOCTYPE html PUBLIC " text.double_quote "-//W3C//DTD XHTML 1.0 Strict//EN" text.double_quote " " text.double_quote "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" text.double_quote ">")]
+ [xhtml/1_1 (format "<!DOCTYPE html PUBLIC " text.double_quote "-//W3C//DTD XHTML 1.1//EN" text.double_quote " " text.double_quote "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" text.double_quote ">")]
+ )]
)
diff --git a/stdlib/source/library/lux/data/format/markdown.lux b/stdlib/source/library/lux/data/format/markdown.lux
index da6a5d7c6..93ec06334 100644
--- a/stdlib/source/library/lux/data/format/markdown.lux
+++ b/stdlib/source/library/lux/data/format/markdown.lux
@@ -31,172 +31,170 @@
(text.replaced "." "\.")
(text.replaced "!" "\!")))
-(abstract: .public Span {} Any)
-(abstract: .public Block {} Any)
+(abstract: .public Span Any [])
+(abstract: .public Block Any [])
(abstract: .public (Markdown brand)
- {}
-
Text
- (def: .public empty
- Markdown
- (:abstraction ""))
-
- (def: .public text
- (-> Text (Markdown Span))
- (|>> ..safe :abstraction))
-
- (def: blank_line
- (format text.new_line text.new_line))
-
- (template [<name> <prefix>]
- [(def: .public (<name> content)
- (-> Text (Markdown Block))
- (:abstraction (format <prefix> " " (..safe content) ..blank_line)))]
-
- [heading/1 "#"]
- [heading/2 "##"]
- [heading/3 "###"]
- [heading/4 "####"]
- [heading/5 "#####"]
- [heading/6 "######"]
- )
-
- (def: (block content)
- (-> Text (Markdown Block))
- (:abstraction (format content ..blank_line)))
-
- (def: .public paragraph
- (-> (Markdown Span) (Markdown Block))
- (|>> :representation ..block))
-
- (def: .public break
- (Markdown Span)
- (:abstraction (format " " text.new_line)))
-
- (template [<name> <wrapper>]
- [(def: .public <name>
- (-> (Markdown Span) (Markdown Span))
- (|>> :representation
- (text.enclosed [<wrapper> <wrapper>])
- :abstraction))]
-
- [bold "**"]
- [italic "_"]
- )
-
- (def: (prefix with)
- (-> Text (-> Text Text))
- (|>> (text.all_split_by text.new_line)
- (list\each (function (_ line)
- (if (text.empty? line)
- line
- (format with line))))
- (text.interposed text.new_line)))
-
- (def: indent
- (-> Text Text)
- (..prefix text.tab))
-
- (def: .public quote
- (-> (Markdown Block) (Markdown Block))
- (|>> :representation
- (..prefix "> ")
- :abstraction))
-
- (def: .public numbered_list
- (-> (List [(Markdown Span) (Maybe (Markdown Block))])
- (Markdown Block))
- (|>> list.enumeration
- (list\each (function (_ [idx [summary detail]])
- (format "1. " (:representation summary)
- (case detail
- (#.Some detail)
- (|> detail
- :representation
- ..indent
- (text.enclosed [text.new_line text.new_line])
- (format text.new_line))
-
- #.None
- ""))))
- (text.interposed text.new_line)
- ..block))
-
- (def: .public bullet_list
- (-> (List [(Markdown Span) (Maybe (Markdown Block))])
- (Markdown Block))
- (|>> (list\each (function (_ [summary detail])
- (format "* " (:representation summary)
- (case detail
- (#.Some detail)
- (|> detail
- :representation
- ..indent
- (text.enclosed [text.new_line text.new_line])
- (format text.new_line))
-
- #.None
- ""))))
- (text.interposed text.new_line)
- ..block))
-
- (def: .public snippet
- {#.doc "A snippet of code."}
- (-> Text (Markdown Span))
- (|>> (text.enclosed ["`` " " ``"]) :abstraction))
-
- (def: .public generic_code
- {#.doc "A (generic) block of code."}
- (-> Text (Markdown Block))
- (let [open (format "```" text.new_line)
- close (format text.new_line "```")]
- (|>> (text.enclosed [open close]) ..block)))
-
- (def: .public (code language block)
- {#.doc "A block of code of a specific language."}
- (-> Text Text (Markdown Block))
- (let [open (format "```" language text.new_line)
- close (format text.new_line "```")]
- (|> block
- (text.enclosed [open close])
- ..block)))
-
- (def: .public (image description url)
- (-> Text URL (Markdown Span))
- (:abstraction (format "![" (..safe description) "](" url ")")))
-
- (def: .public horizontal_rule
- (Markdown Block)
- (..block "___"))
-
- (def: .public (link description url)
- (-> (Markdown Span) URL (Markdown Span))
- (:abstraction (format "[" (:representation description) "](" url ")")))
-
- (type: .public Email
- Text)
-
- (template [<name> <type>]
- [(def: .public <name>
- (-> <type> (Markdown Span))
- (|>> (text.enclosed ["<" ">"]) :abstraction))]
-
- [url URL]
- [email Email]
- )
-
- (template [<name> <brand> <infix>]
- [(def: .public (<name> pre post)
- (-> (Markdown <brand>) (Markdown <brand>) (Markdown <brand>))
- (:abstraction (format (:representation pre) <infix> (:representation post))))]
-
- [and Span " "]
- [then Block ""]
- )
-
- (def: .public markdown
- (All (_ a) (-> (Markdown a) Text))
- (|>> :representation))
+ [(def: .public empty
+ Markdown
+ (:abstraction ""))
+
+ (def: .public text
+ (-> Text (Markdown Span))
+ (|>> ..safe :abstraction))
+
+ (def: blank_line
+ (format text.new_line text.new_line))
+
+ (template [<name> <prefix>]
+ [(def: .public (<name> content)
+ (-> Text (Markdown Block))
+ (:abstraction (format <prefix> " " (..safe content) ..blank_line)))]
+
+ [heading/1 "#"]
+ [heading/2 "##"]
+ [heading/3 "###"]
+ [heading/4 "####"]
+ [heading/5 "#####"]
+ [heading/6 "######"]
+ )
+
+ (def: (block content)
+ (-> Text (Markdown Block))
+ (:abstraction (format content ..blank_line)))
+
+ (def: .public paragraph
+ (-> (Markdown Span) (Markdown Block))
+ (|>> :representation ..block))
+
+ (def: .public break
+ (Markdown Span)
+ (:abstraction (format " " text.new_line)))
+
+ (template [<name> <wrapper>]
+ [(def: .public <name>
+ (-> (Markdown Span) (Markdown Span))
+ (|>> :representation
+ (text.enclosed [<wrapper> <wrapper>])
+ :abstraction))]
+
+ [bold "**"]
+ [italic "_"]
+ )
+
+ (def: (prefix with)
+ (-> Text (-> Text Text))
+ (|>> (text.all_split_by text.new_line)
+ (list\each (function (_ line)
+ (if (text.empty? line)
+ line
+ (format with line))))
+ (text.interposed text.new_line)))
+
+ (def: indent
+ (-> Text Text)
+ (..prefix text.tab))
+
+ (def: .public quote
+ (-> (Markdown Block) (Markdown Block))
+ (|>> :representation
+ (..prefix "> ")
+ :abstraction))
+
+ (def: .public numbered_list
+ (-> (List [(Markdown Span) (Maybe (Markdown Block))])
+ (Markdown Block))
+ (|>> list.enumeration
+ (list\each (function (_ [idx [summary detail]])
+ (format "1. " (:representation summary)
+ (case detail
+ (#.Some detail)
+ (|> detail
+ :representation
+ ..indent
+ (text.enclosed [text.new_line text.new_line])
+ (format text.new_line))
+
+ #.None
+ ""))))
+ (text.interposed text.new_line)
+ ..block))
+
+ (def: .public bullet_list
+ (-> (List [(Markdown Span) (Maybe (Markdown Block))])
+ (Markdown Block))
+ (|>> (list\each (function (_ [summary detail])
+ (format "* " (:representation summary)
+ (case detail
+ (#.Some detail)
+ (|> detail
+ :representation
+ ..indent
+ (text.enclosed [text.new_line text.new_line])
+ (format text.new_line))
+
+ #.None
+ ""))))
+ (text.interposed text.new_line)
+ ..block))
+
+ (def: .public snippet
+ {#.doc "A snippet of code."}
+ (-> Text (Markdown Span))
+ (|>> (text.enclosed ["`` " " ``"]) :abstraction))
+
+ (def: .public generic_code
+ {#.doc "A (generic) block of code."}
+ (-> Text (Markdown Block))
+ (let [open (format "```" text.new_line)
+ close (format text.new_line "```")]
+ (|>> (text.enclosed [open close]) ..block)))
+
+ (def: .public (code language block)
+ {#.doc "A block of code of a specific language."}
+ (-> Text Text (Markdown Block))
+ (let [open (format "```" language text.new_line)
+ close (format text.new_line "```")]
+ (|> block
+ (text.enclosed [open close])
+ ..block)))
+
+ (def: .public (image description url)
+ (-> Text URL (Markdown Span))
+ (:abstraction (format "![" (..safe description) "](" url ")")))
+
+ (def: .public horizontal_rule
+ (Markdown Block)
+ (..block "___"))
+
+ (def: .public (link description url)
+ (-> (Markdown Span) URL (Markdown Span))
+ (:abstraction (format "[" (:representation description) "](" url ")")))
+
+ (type: .public Email
+ Text)
+
+ (template [<name> <type>]
+ [(def: .public <name>
+ (-> <type> (Markdown Span))
+ (|>> (text.enclosed ["<" ">"]) :abstraction))]
+
+ [url URL]
+ [email Email]
+ )
+
+ (template [<name> <brand> <infix>]
+ [(def: .public (<name> pre post)
+ (-> (Markdown <brand>) (Markdown <brand>) (Markdown <brand>))
+ (:abstraction (format (:representation pre) <infix> (:representation post))))]
+
+ [and Span " "]
+ [then Block ""]
+ )
+
+ (def: .public markdown
+ (All (_ a) (-> (Markdown a) Text))
+ (|>> :representation))]
)
diff --git a/stdlib/source/library/lux/data/format/tar.lux b/stdlib/source/library/lux/data/format/tar.lux
index bb8228146..7a5d8106b 100644
--- a/stdlib/source/library/lux/data/format/tar.lux
+++ b/stdlib/source/library/lux/data/format/tar.lux
@@ -71,35 +71,33 @@
["Maximum" (%.nat (-- <limit>))]))
(abstract: .public <type>
- {}
-
Nat
- (def: .public (<in> value)
- (-> Nat (Try <type>))
- (if (n.< <limit> value)
- (#try.Success (:abstraction value))
- (exception.except <exception> [value])))
-
- (def: .public <out>
- (-> <type> Nat)
- (|>> :representation))
-
- (def: <writer>
- (Writer <type>)
- (let [suffix <suffix>
- padded_size (n.+ (text.size suffix) <size>)]
- (|>> :representation
- (\ n.octal encoded)
- (..octal_padding <size>)
- (text.suffix suffix)
- (\ utf8.codec encoded)
- (format.segment padded_size))))
-
- (def: <coercion>
- (-> Nat <type>)
- (|>> (n.% <limit>)
- :abstraction))
+ [(def: .public (<in> value)
+ (-> Nat (Try <type>))
+ (if (n.< <limit> value)
+ (#try.Success (:abstraction value))
+ (exception.except <exception> [value])))
+
+ (def: .public <out>
+ (-> <type> Nat)
+ (|>> :representation))
+
+ (def: <writer>
+ (Writer <type>)
+ (let [suffix <suffix>
+ padded_size (n.+ (text.size suffix) <size>)]
+ (|>> :representation
+ (\ n.octal encoded)
+ (..octal_padding <size>)
+ (text.suffix suffix)
+ (\ utf8.codec encoded)
+ (format.segment padded_size))))
+
+ (def: <coercion>
+ (-> Nat <type>)
+ (|>> (n.% <limit>)
+ :abstraction))]
)]
[not_a_small_number small_limit ..small_size
@@ -156,59 +154,57 @@
(..big value)))))
(abstract: Checksum
- {}
-
Text
- (def: from_checksum
- (-> Checksum Text)
- (|>> :representation))
-
- (def: dummy_checksum
- Checksum
- (:abstraction " "))
-
- (def: checksum_suffix
- (format ..blank ..null))
-
- (def: checksum
- (-> Binary Nat)
- (binary.aggregate n.+ 0))
-
- (def: checksum_checksum
- (|> ..dummy_checksum
- :representation
- (\ utf8.codec encoded)
- ..checksum))
-
- (def: checksum_code
- (-> Binary Checksum)
- (|>> ..checksum
- ..as_small
- ..from_small
- (\ n.octal encoded)
- (..octal_padding ..small_size)
- (text.suffix ..checksum_suffix)
- :abstraction))
-
- (def: checksum_writer
- (Writer Checksum)
- (let [padded_size (n.+ (text.size ..checksum_suffix)
- ..small_size)]
- (|>> :representation
- (\ utf8.codec encoded)
- (format.segment padded_size))))
-
- (def: checksum_parser
- (Parser [Nat Checksum])
- (do <>.monad
- [ascii (<binary>.segment ..small_size)
- digits (<>.lifted (\ utf8.codec decoded ascii))
- _ ..small_suffix
- value (<>.lifted
- (\ n.octal decoded digits))]
- (in [value
- (:abstraction (format digits ..checksum_suffix))])))
+ [(def: from_checksum
+ (-> Checksum Text)
+ (|>> :representation))
+
+ (def: dummy_checksum
+ Checksum
+ (:abstraction " "))
+
+ (def: checksum_suffix
+ (format ..blank ..null))
+
+ (def: checksum
+ (-> Binary Nat)
+ (binary.aggregate n.+ 0))
+
+ (def: checksum_checksum
+ (|> ..dummy_checksum
+ :representation
+ (\ utf8.codec encoded)
+ ..checksum))
+
+ (def: checksum_code
+ (-> Binary Checksum)
+ (|>> ..checksum
+ ..as_small
+ ..from_small
+ (\ n.octal encoded)
+ (..octal_padding ..small_size)
+ (text.suffix ..checksum_suffix)
+ :abstraction))
+
+ (def: checksum_writer
+ (Writer Checksum)
+ (let [padded_size (n.+ (text.size ..checksum_suffix)
+ ..small_size)]
+ (|>> :representation
+ (\ utf8.codec encoded)
+ (format.segment padded_size))))
+
+ (def: checksum_parser
+ (Parser [Nat Checksum])
+ (do <>.monad
+ [ascii (<binary>.segment ..small_size)
+ digits (<>.lifted (\ utf8.codec decoded ascii))
+ _ ..small_suffix
+ value (<>.lifted
+ (\ n.octal decoded digits))]
+ (in [value
+ (:abstraction (format digits ..checksum_suffix))])))]
)
(def: last_ascii
@@ -248,57 +244,55 @@
(template [<type> <representation> <size> <exception> <in> <out> <writer> <parser> <none>]
[(abstract: .public <type>
- {}
-
<representation>
- (exception: .public (<exception> {value Text})
- (exception.report
- ["Value" (%.text value)]
- ["Size" (%.nat (text.size value))]
- ["Maximum" (%.nat <size>)]))
-
- (def: .public (<in> value)
- (-> <representation> (Try <type>))
- (if (..ascii? value)
- (if (|> value
- (\ utf8.codec encoded)
- binary.size
- (n.> <size>))
- (exception.except <exception> [value])
- (#try.Success (:abstraction value)))
- (exception.except ..not_ascii [value])))
-
- (def: .public <out>
- (-> <type> <representation>)
- (|>> :representation))
-
- (def: <writer>
- (Writer <type>)
- (let [suffix ..null
- padded_size (n.+ (text.size suffix) <size>)]
- (|>> :representation
- (text.suffix suffix)
- (\ utf8.codec encoded)
- (format.segment padded_size))))
-
- (def: <parser>
- (Parser <type>)
- (do <>.monad
- [string (<binary>.segment <size>)
- end <binary>.bits/8
- .let [expected (`` (char (~~ (static ..null))))]
- _ (<>.assertion (exception.error ..wrong_character [expected end])
- (n.= expected end))]
- (<>.lifted
- (do [! try.monad]
- [ascii (..un_padded string)
- text (\ utf8.codec decoded ascii)]
- (<in> text)))))
-
- (def: .public <none>
- <type>
- (try.trusted (<in> "")))
+ [(exception: .public (<exception> {value Text})
+ (exception.report
+ ["Value" (%.text value)]
+ ["Size" (%.nat (text.size value))]
+ ["Maximum" (%.nat <size>)]))
+
+ (def: .public (<in> value)
+ (-> <representation> (Try <type>))
+ (if (..ascii? value)
+ (if (|> value
+ (\ utf8.codec encoded)
+ binary.size
+ (n.> <size>))
+ (exception.except <exception> [value])
+ (#try.Success (:abstraction value)))
+ (exception.except ..not_ascii [value])))
+
+ (def: .public <out>
+ (-> <type> <representation>)
+ (|>> :representation))
+
+ (def: <writer>
+ (Writer <type>)
+ (let [suffix ..null
+ padded_size (n.+ (text.size suffix) <size>)]
+ (|>> :representation
+ (text.suffix suffix)
+ (\ utf8.codec encoded)
+ (format.segment padded_size))))
+
+ (def: <parser>
+ (Parser <type>)
+ (do <>.monad
+ [string (<binary>.segment <size>)
+ end <binary>.bits/8
+ .let [expected (`` (char (~~ (static ..null))))]
+ _ (<>.assertion (exception.error ..wrong_character [expected end])
+ (n.= expected end))]
+ (<>.lifted
+ (do [! try.monad]
+ [ascii (..un_padded string)
+ text (\ utf8.codec decoded ascii)]
+ (<in> text)))))
+
+ (def: .public <none>
+ <type>
+ (try.trusted (<in> "")))]
)]
[Name Text ..name_size name_is_too_long name from_name name_writer name_parser anonymous]
@@ -308,35 +302,33 @@
(def: magic_size Size 7)
(abstract: Magic
- {}
-
Text
- (def: ustar (:abstraction "ustar "))
-
- (def: from_magic
- (-> Magic Text)
- (|>> :representation))
-
- (def: magic_writer
- (Writer Magic)
- (let [padded_size (n.+ (text.size ..null)
- ..magic_size)]
- (|>> :representation
- (\ utf8.codec encoded)
- (format.segment padded_size))))
-
- (def: magic_parser
- (Parser Magic)
- (do <>.monad
- [string (<binary>.segment ..magic_size)
- end <binary>.bits/8
- .let [expected (`` (char (~~ (static ..null))))]
- _ (<>.assertion (exception.error ..wrong_character [expected end])
- (n.= expected end))]
- (<>.lifted
- (\ try.monad each (|>> :abstraction)
- (\ utf8.codec decoded string)))))
+ [(def: ustar (:abstraction "ustar "))
+
+ (def: from_magic
+ (-> Magic Text)
+ (|>> :representation))
+
+ (def: magic_writer
+ (Writer Magic)
+ (let [padded_size (n.+ (text.size ..null)
+ ..magic_size)]
+ (|>> :representation
+ (\ utf8.codec encoded)
+ (format.segment padded_size))))
+
+ (def: magic_parser
+ (Parser Magic)
+ (do <>.monad
+ [string (<binary>.segment ..magic_size)
+ end <binary>.bits/8
+ .let [expected (`` (char (~~ (static ..null))))]
+ _ (<>.assertion (exception.error ..wrong_character [expected end])
+ (n.= expected end))]
+ (<>.lifted
+ (\ try.monad each (|>> :abstraction)
+ (\ utf8.codec decoded string)))))]
)
(def: block_size Size 512)
@@ -396,137 +388,133 @@
(..small_number ..device_size)))
(abstract: Link_Flag
- {}
-
Char
- (def: link_flag
- (-> Link_Flag Char)
- (|>> :representation))
-
- (def: link_flag_writer
- (Writer Link_Flag)
- (|>> :representation
- format.bits/8))
-
- (with_expansions [<options> (as_is [0 old_normal]
- [(char "0") normal]
- [(char "1") link]
- [(char "2") symbolic_link]
- [(char "3") character]
- [(char "4") block]
- [(char "5") directory]
- [(char "6") fifo]
- [(char "7") contiguous])]
- (template [<flag> <name>]
- [(def: <name>
- Link_Flag
- (:abstraction <flag>))]
-
- <options>
- )
-
- (exception: .public (invalid_link_flag {value Nat})
- (exception.report
- ["Value" (%.nat value)]))
-
- (def: link_flag_parser
- (Parser Link_Flag)
- (do <>.monad
- [linkflag <binary>.bits/8]
- (case (.nat linkflag)
- (^template [<value> <link_flag>]
- [(^ <value>)
- (in <link_flag>)])
- (<options>)
-
- _
- (<>.lifted
- (exception.except ..invalid_link_flag [(.nat linkflag)]))))))
+ [(def: link_flag
+ (-> Link_Flag Char)
+ (|>> :representation))
+
+ (def: link_flag_writer
+ (Writer Link_Flag)
+ (|>> :representation
+ format.bits/8))
+
+ (with_expansions [<options> (as_is [0 old_normal]
+ [(char "0") normal]
+ [(char "1") link]
+ [(char "2") symbolic_link]
+ [(char "3") character]
+ [(char "4") block]
+ [(char "5") directory]
+ [(char "6") fifo]
+ [(char "7") contiguous])]
+ (template [<flag> <name>]
+ [(def: <name>
+ Link_Flag
+ (:abstraction <flag>))]
+
+ <options>
+ )
+
+ (exception: .public (invalid_link_flag {value Nat})
+ (exception.report
+ ["Value" (%.nat value)]))
+
+ (def: link_flag_parser
+ (Parser Link_Flag)
+ (do <>.monad
+ [linkflag <binary>.bits/8]
+ (case (.nat linkflag)
+ (^template [<value> <link_flag>]
+ [(^ <value>)
+ (in <link_flag>)])
+ (<options>)
+
+ _
+ (<>.lifted
+ (exception.except ..invalid_link_flag [(.nat linkflag)]))))))]
)
(abstract: .public Mode
- {}
-
Nat
- (def: .public mode
- (-> Mode Nat)
- (|>> :representation))
-
- (def: .public (and left right)
- (-> Mode Mode Mode)
- (:abstraction
- (i64.or (:representation left)
- (:representation right))))
-
- (def: mode_writer
- (Writer Mode)
- (|>> :representation
- ..small
- try.trusted
- ..small_writer))
-
- (exception: .public (invalid_mode {value Nat})
- (exception.report
- ["Value" (%.nat value)]))
-
- (with_expansions [<options> (as_is ["0000" none]
-
- ["0001" execute_by_other]
- ["0002" write_by_other]
- ["0004" read_by_other]
-
- ["0010" execute_by_group]
- ["0020" write_by_group]
- ["0040" read_by_group]
-
- ["0100" execute_by_owner]
- ["0200" write_by_owner]
- ["0400" read_by_owner]
-
- ["1000" save_text]
- ["2000" set_group_id_on_execution]
- ["4000" set_user_id_on_execution])]
- (template [<code> <name>]
- [(def: .public <name>
- Mode
- (:abstraction (number.oct <code>)))]
-
- <options>
- )
-
- (def: maximum_mode
- Mode
- ($_ and
- ..none
-
- ..execute_by_other
- ..write_by_other
- ..read_by_other
-
- ..execute_by_group
- ..write_by_group
- ..read_by_group
-
- ..execute_by_owner
- ..write_by_owner
- ..read_by_owner
-
- ..save_text
- ..set_group_id_on_execution
- ..set_user_id_on_execution
- ))
-
- (def: mode_parser
- (Parser Mode)
- (do [! <>.monad]
- [value (\ ! each ..from_small ..small_parser)]
- (if (n.> (:representation ..maximum_mode)
- value)
- (<>.lifted
- (exception.except ..invalid_mode [value]))
- (in (:abstraction value))))))
+ [(def: .public mode
+ (-> Mode Nat)
+ (|>> :representation))
+
+ (def: .public (and left right)
+ (-> Mode Mode Mode)
+ (:abstraction
+ (i64.or (:representation left)
+ (:representation right))))
+
+ (def: mode_writer
+ (Writer Mode)
+ (|>> :representation
+ ..small
+ try.trusted
+ ..small_writer))
+
+ (exception: .public (invalid_mode {value Nat})
+ (exception.report
+ ["Value" (%.nat value)]))
+
+ (with_expansions [<options> (as_is ["0000" none]
+
+ ["0001" execute_by_other]
+ ["0002" write_by_other]
+ ["0004" read_by_other]
+
+ ["0010" execute_by_group]
+ ["0020" write_by_group]
+ ["0040" read_by_group]
+
+ ["0100" execute_by_owner]
+ ["0200" write_by_owner]
+ ["0400" read_by_owner]
+
+ ["1000" save_text]
+ ["2000" set_group_id_on_execution]
+ ["4000" set_user_id_on_execution])]
+ (template [<code> <name>]
+ [(def: .public <name>
+ Mode
+ (:abstraction (number.oct <code>)))]
+
+ <options>
+ )
+
+ (def: maximum_mode
+ Mode
+ ($_ and
+ ..none
+
+ ..execute_by_other
+ ..write_by_other
+ ..read_by_other
+
+ ..execute_by_group
+ ..write_by_group
+ ..read_by_group
+
+ ..execute_by_owner
+ ..write_by_owner
+ ..read_by_owner
+
+ ..save_text
+ ..set_group_id_on_execution
+ ..set_user_id_on_execution
+ ))
+
+ (def: mode_parser
+ (Parser Mode)
+ (do [! <>.monad]
+ [value (\ ! each ..from_small ..small_parser)]
+ (if (n.> (:representation ..maximum_mode)
+ value)
+ (<>.lifted
+ (exception.except ..invalid_mode [value]))
+ (in (:abstraction value))))))]
)
(def: maximum_content_size
@@ -536,23 +524,21 @@
(list\mix n.* 1)))
(abstract: .public Content
- {}
-
[Big Binary]
- (def: .public (content content)
- (-> Binary (Try Content))
- (do try.monad
- [size (..big (binary.size content))]
- (in (:abstraction [size content]))))
+ [(def: .public (content content)
+ (-> Binary (Try Content))
+ (do try.monad
+ [size (..big (binary.size content))]
+ (in (:abstraction [size content]))))
- (def: from_content
- (-> Content [Big Binary])
- (|>> :representation))
+ (def: from_content
+ (-> Content [Big Binary])
+ (|>> :representation))
- (def: .public data
- (-> Content Binary)
- (|>> :representation product.right))
+ (def: .public data
+ (-> Content Binary)
+ (|>> :representation product.right))]
)
(type: .public ID