diff options
Diffstat (limited to '')
-rw-r--r-- | stdlib/source/library/lux/data/format/css.lux | 204 | ||||
-rw-r--r-- | stdlib/source/library/lux/data/format/css/property.lux | 886 | ||||
-rw-r--r-- | stdlib/source/library/lux/data/format/css/query.lux | 194 | ||||
-rw-r--r-- | stdlib/source/library/lux/data/format/css/selector.lux | 340 | ||||
-rw-r--r-- | stdlib/source/library/lux/data/format/css/style.lux | 32 | ||||
-rw-r--r-- | stdlib/source/library/lux/data/format/css/value.lux | 2548 | ||||
-rw-r--r-- | stdlib/source/library/lux/data/format/html.lux | 974 | ||||
-rw-r--r-- | stdlib/source/library/lux/data/format/markdown.lux | 326 | ||||
-rw-r--r-- | stdlib/source/library/lux/data/format/tar.lux | 568 |
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 |