···
need_space := has_whitespace (Buffer.contents buffer) || Buffer.length buffer > 0
90
+
(* Process header with ID/anchor handling *)
91
+
let process_header level elem =
92
+
need_space := false;
94
+
(* Check if header contains a link with an ID fragment *)
95
+
let link_opt = Soup.select_one "a[href]" elem in
96
+
let anchor_id = match link_opt with
98
+
(match Soup.attribute "href" link with
100
+
(* Extract fragment from URL *)
101
+
let uri = Uri.of_string href in
107
+
(* Add anchor if we found an ID *)
108
+
(match anchor_id with
109
+
| Some id when id <> "" ->
110
+
Buffer.add_string buffer (Printf.sprintf "\n<a name=\"%s\"></a>\n" id)
113
+
(* Add the header marker *)
114
+
let marker = String.make level '#' in
115
+
Buffer.add_string buffer ("\n" ^ marker ^ " ");
117
+
(* Get text content, excluding link tags *)
118
+
let text = Soup.texts elem |> String.concat " " |> String.trim in
119
+
Buffer.add_string buffer text;
121
+
Buffer.add_string buffer "\n\n";
122
+
need_space := false
let rec process_node node =
match Soup.element node with
let tag = Soup.name elem in
(* Block elements - reset space tracking *)
97
-
need_space := false;
98
-
Buffer.add_string buffer "\n# ";
99
-
Soup.children elem |> Soup.iter process_node;
100
-
Buffer.add_string buffer "\n\n";
101
-
need_space := false
103
-
need_space := false;
104
-
Buffer.add_string buffer "\n## ";
105
-
Soup.children elem |> Soup.iter process_node;
106
-
Buffer.add_string buffer "\n\n";
107
-
need_space := false
109
-
need_space := false;
110
-
Buffer.add_string buffer "\n### ";
111
-
Soup.children elem |> Soup.iter process_node;
112
-
Buffer.add_string buffer "\n\n";
113
-
need_space := false
115
-
need_space := false;
116
-
Buffer.add_string buffer "\n#### ";
117
-
Soup.children elem |> Soup.iter process_node;
118
-
Buffer.add_string buffer "\n\n";
119
-
need_space := false
121
-
need_space := false;
122
-
Buffer.add_string buffer "\n##### ";
123
-
Soup.children elem |> Soup.iter process_node;
124
-
Buffer.add_string buffer "\n\n";
125
-
need_space := false
127
-
need_space := false;
128
-
Buffer.add_string buffer "\n###### ";
129
-
Soup.children elem |> Soup.iter process_node;
130
-
Buffer.add_string buffer "\n\n";
131
-
need_space := false
131
+
| "h1" -> process_header 1 elem
132
+
| "h2" -> process_header 2 elem
133
+
| "h3" -> process_header 3 elem
134
+
| "h4" -> process_header 4 elem
135
+
| "h5" -> process_header 5 elem
136
+
| "h6" -> process_header 6 elem
Soup.children elem |> Soup.iter process_node;