Skip to content

Commit 220e414

Browse files
committed
1.3.0 html fragment support
1 parent 374a281 commit 220e414

10 files changed

Lines changed: 438 additions & 385 deletions

File tree

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,14 @@
22

33
All notable changes to this project will be documented in this file.
44

5+
## [1.3.0] 2025-09-09
6+
7+
### Added
8+
9+
- `XmlNode.NodeList` to represent HTML fragments.
10+
- `Elem.createFragment` to create HTML fragments from a list of `XmlNode`.
11+
- `Elem.empty` leverages `Elem.createFragment` and `XmlNode.NodeList` to represent an empty HTML fragment.
12+
513
## [1.2.0] 2025-06-26
614

715
### Added

src/Falco.Markup/Elem.fs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@ module Elem =
99
let createSelfClosing (tag : string) (attr : XmlAttribute list) =
1010
SelfClosingNode (tag, attr)
1111

12+
let createFragment (nodes : XmlNode list) =
13+
NodeList nodes
14+
15+
let empty =
16+
NodeList []
17+
1218
//
1319
// Main root
1420

src/Falco.Markup/Falco.Markup.fsproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<PropertyGroup>
44
<AssemblyName>Falco.Markup</AssemblyName>
55
<RootNamespace>Falco</RootNamespace>
6-
<Version>1.2.0</Version>
6+
<Version>1.3.0</Version>
77

88
<!-- General info -->
99
<Description>An F# DSL for generating markup, including HTML, SVG and XML.</Description>

src/Falco.Markup/TestHelpers.fs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ module TestHelpers =
121121

122122
| ParentNode _
123123
| SelfClosingNode _
124+
| NodeList _
124125
| TextNode _ -> ()
125126

126127
// <option></option>
@@ -129,6 +130,7 @@ module TestHelpers =
129130

130131
| ParentNode _
131132
| SelfClosingNode _
133+
| NodeList _
132134
| TextNode _ -> () ]
133135

134136
if selected.Length = 0 then
@@ -141,6 +143,9 @@ module TestHelpers =
141143
for c in children do
142144
buildNameValues c
143145

146+
| NodeList nodes ->
147+
for node in nodes do
148+
buildNameValues node
144149
| SelfClosingNode _
145150
| TextNode _ -> ()
146151

@@ -158,4 +163,4 @@ module TestHelpers =
158163
let renderNameValues (tag : XmlNode) =
159164
let sb = StringBuilderCache.Acquire()
160165
let w = new StringWriter(sb, CultureInfo.InvariantCulture)
161-
XmlNodeSerializer.serializeNameValues(w, tag)
166+
XmlNodeSerializer.serializeNameValues(w, tag)

src/Falco.Markup/XmlNode.fs

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,10 @@ type XmlElement =
1616

1717
/// Describes the different XML-style node patterns
1818
type XmlNode =
19-
| ParentNode of XmlElement * XmlNode list
20-
| SelfClosingNode of XmlElement
2119
| TextNode of string
20+
| SelfClosingNode of XmlElement
21+
| NodeList of XmlNode list
22+
| ParentNode of XmlElement * XmlNode list
2223

2324
[<AbstractClass; Sealed>]
2425
type StringBuilderCache internal() =
@@ -80,18 +81,25 @@ module internal XmlNodeSerializer =
8081
w.Write attrValue
8182
w.Write _quote
8283

84+
let inline writeElement (tag : string, attrs) =
85+
w.Write _openChar
86+
w.Write tag
87+
writeAttributes attrs
88+
w.Write _space
89+
w.Write _term
90+
w.Write _closeChar
91+
8392
let rec buildXml tag =
8493
match tag with
8594
| TextNode text ->
8695
w.Write text
8796

88-
| SelfClosingNode (tag, attrs) ->
89-
w.Write _openChar
90-
w.Write tag
91-
writeAttributes attrs
92-
w.Write _space
93-
w.Write _term
94-
w.Write _closeChar
97+
| SelfClosingNode el ->
98+
writeElement el
99+
100+
| NodeList nodes ->
101+
for node in nodes do
102+
buildXml node
95103

96104
| ParentNode ((tag, attrs), children) ->
97105
w.Write _openChar
@@ -131,4 +139,4 @@ module XmlNodeRenderer =
131139
let sb = StringBuilderCache.Acquire()
132140
let w = new StringWriter(sb, CultureInfo.InvariantCulture)
133141
w.Write "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
134-
XmlNodeSerializer.serialize(w, tag)
142+
XmlNodeSerializer.serialize(w, tag)

test/Falco.Markup.Tests/AttrTests.fs

Lines changed: 224 additions & 224 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)