Fibble/src/FibLib/constructorHelpers.fs
2026-03-31 13:36:22 +02:00

53 lines
1.6 KiB
FSharp

namespace Fibble.FibLib
open FSharp.Compiler.Text
open Fibble.FibLib.Ast
module Helpers =
let emptyAttr ={id=""; classes=[]; kvp=[]}
let ah cls kvp =
{id=""; classes = [cls]; kvp = Map.toList kvp }
let onlyChildren constructor : TagRenderer =
fun _ _ _ children -> constructor(children)
open Helpers
module ConstructionHelpers =
let linebreak _ _ _ _ = LineBreak
let softbreak _ _ _ _ = SoftBreak
let value : TagRenderer =
fun meta args _ _ ->
match Map.tryFind args.Head meta with
| Some(v) -> Text v
| None -> Text $"value {args.Head} not found in metadata"
let emph = onlyChildren Emph
let underline = onlyChildren Underline
let strong = onlyChildren Strong
let strikeout = onlyChildren Strikeout
let superscript = onlyChildren Superscript
let subscript = onlyChildren Subscript
let image : TagRenderer =
fun _ args kwargs children ->
let attributes = ah "inlineImage" kwargs
Image(attributes,children, args[0])
let code : TagRenderer =
fun _ _ kwargs children ->
let attributes = ah "inlineCode" kwargs
match children with
| [Text(c)] -> InlineNode.Code(attributes, c)
| _ -> failwith "Code tag was not Text,"
let link : TagRenderer =
fun _ args kwargs children ->
let attributes = ah "link" kwargs
Link(attributes,Target(args[0], children))
// blocks
let paragraph _ _ _ children = Paragraph(children)
let plain _ _ _ children = Plain(children)