Skip to content

Commit 66822f2

Browse files
committed
Added syntax for medias
Signed-off-by: Paul-Elliot <[email protected]>
1 parent cbbbc84 commit 66822f2

27 files changed

+626
-81
lines changed

src/document/comment.ml

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,9 @@ module Reference = struct
104104
in
105105
match Url.from_identifier ~stop_before:false id with
106106
| Ok url ->
107-
let target = InternalLink.Resolved url in
108-
let link = { InternalLink.target; content; tooltip } in
109-
[ inline @@ Inline.InternalLink link ]
107+
let target = Target.Internal (Resolved url) in
108+
let link = { Link.target; content; tooltip } in
109+
[ inline @@ Inline.Link link ]
110110
| Error (Not_linkable _) -> content
111111
| Error exn ->
112112
(* FIXME: better error message *)
@@ -120,9 +120,9 @@ module Reference = struct
120120
[ inline @@ Inline.Source s ]
121121
| Some content ->
122122
let link =
123-
{ InternalLink.target = Unresolved; content; tooltip = Some s }
123+
{ Link.target = Internal Unresolved; content; tooltip = Some s }
124124
in
125-
[ inline @@ Inline.InternalLink link ])
125+
[ inline @@ Inline.Link link ])
126126
end
127127

128128
let leaf_inline_element : Comment.leaf_inline_element -> Inline.one = function
@@ -167,7 +167,7 @@ let rec inline_element : Comment.inline_element -> Inline.t = function
167167
| [] -> [ inline @@ Text target ]
168168
| _ -> non_link_inline_element_list content
169169
in
170-
[ inline @@ Link (target, content) ]
170+
[ inline @@ Link { target = External target; content; tooltip = None } ]
171171

172172
and inline_element_list elements =
173173
List.concat
@@ -305,7 +305,14 @@ let tag : Comment.tag -> Description.one =
305305
| `See (kind, target, content) ->
306306
let value =
307307
match kind with
308-
| `Url -> mk_value (Inline.Link (target, [ inline @@ Text target ]))
308+
| `Url ->
309+
mk_value
310+
(Inline.Link
311+
{
312+
target = External target;
313+
content = [ inline @@ Text target ];
314+
tooltip = None;
315+
})
309316
| `File -> mk_value (Inline.Source (source_of_code target))
310317
| `Document -> mk_value (Inline.Text target)
311318
in
@@ -327,6 +334,38 @@ let attached_block_element : Comment.attached_block_element -> Block.t =
327334
function
328335
| #Comment.nestable_block_element as e -> nestable_block_element e
329336
| `Tag t -> [ block ~attr:[ "at-tags" ] @@ Description [ tag t ] ]
337+
| `Media (href, media, content) ->
338+
let content =
339+
match (content, href) with
340+
| [], `Reference path ->
341+
let s = Reference.render_unresolved (path :> Comment.Reference.t) in
342+
[ inline @@ Inline.Source (source_of_code s) ]
343+
| [], `Link href -> [ inline @@ Inline.Source (source_of_code href) ]
344+
| _ -> inline_element_list content
345+
in
346+
let url =
347+
match href with
348+
| `Reference (`Resolved r) -> (
349+
let id =
350+
Odoc_model.Paths.Reference.Resolved.(identifier (r :> t))
351+
in
352+
match Url.from_identifier ~stop_before:false id with
353+
| Ok url -> Target.Internal (Resolved url)
354+
| Error exn ->
355+
(* FIXME: better error message *)
356+
Printf.eprintf "Id.href failed: %S\n%!"
357+
(Url.Error.to_string exn);
358+
Internal Unresolved)
359+
| `Reference _ -> Internal Unresolved
360+
| `Link href -> External href
361+
in
362+
let i =
363+
match media with
364+
| `Audio -> Block.Audio (url, content)
365+
| `Video -> Video (url, content)
366+
| `Image -> Image (url, content)
367+
in
368+
[ block i ]
330369

331370
(* TODO collaesce tags *)
332371

src/document/doctree.ml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,7 @@ end = struct
6565
| Entity _ as t -> return t
6666
| Linebreak as t -> return t
6767
| Styled (st, content) -> return (Styled (st, remove_links content))
68-
| Link (_, t) -> t
69-
| InternalLink { target = Resolved _; content = t; _ } -> t
70-
| InternalLink { target = Unresolved; content = t; _ } -> t
68+
| Link { target = _; content = t; _ } -> t
7169
| Source l ->
7270
let rec f = function
7371
| Source.Elt t -> Source.Elt (remove_links t)
@@ -382,6 +380,9 @@ end = struct
382380
fun x ->
383381
match x.desc with
384382
| Inline x -> inline x
383+
| Audio (_, x) -> inline x
384+
| Video (_, x) -> inline x
385+
| Image (_, x) -> inline x
385386
| Paragraph x -> inline x
386387
| List (_, x) -> List.exists block x
387388
| Table { data; align = _ } ->
@@ -400,8 +401,7 @@ end = struct
400401
fun x ->
401402
match x.desc with
402403
| Styled (_, x) -> inline x
403-
| Link (_, x) -> inline x
404-
| InternalLink x -> inline x.content
404+
| Link { content = t; _ } -> inline t
405405
| Math _ -> true
406406
| Text _ | Entity _ | Linebreak | Source _ | Raw_markup _ -> false
407407
in

src/document/generator.ml

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,14 @@ let type_var tv = tag "type-var" (O.txt tv)
3939
let enclose ~l ~r x = O.span (O.txt l ++ x ++ O.txt r)
4040

4141
let resolved p content =
42-
let link = { InternalLink.target = Resolved p; content; tooltip = None } in
43-
O.elt [ inline @@ InternalLink link ]
42+
let link = { Link.target = Internal (Resolved p); content; tooltip = None } in
43+
O.elt [ inline @@ Link link ]
4444

4545
let path p content = resolved (Url.from_path p) content
4646

4747
let unresolved content =
48-
let link = { InternalLink.target = Unresolved; content; tooltip = None } in
49-
O.elt [ inline @@ InternalLink link ]
48+
let link = { Link.target = Internal Unresolved; content; tooltip = None } in
49+
O.elt [ inline @@ Link link ]
5050

5151
let path_to_id path =
5252
match Url.Anchor.from_identifier (path :> Paths.Identifier.t) with
@@ -1835,8 +1835,7 @@ module Make (Syntax : SYNTAX) = struct
18351835
let li ?(attr = []) name url =
18361836
let link url desc =
18371837
let content = [ Inline.{ attr = []; desc } ] and tooltip = None in
1838-
Inline.InternalLink
1839-
{ InternalLink.target = Resolved url; content; tooltip }
1838+
Inline.Link { target = Internal (Resolved url); content; tooltip }
18401839
in
18411840
[ block ~attr @@ Block.Inline (inline @@ link url (Text name)) ]
18421841
in

src/document/types.ml

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,19 @@ module rec Class : sig
55
end =
66
Class
77

8-
and InternalLink : sig
9-
type target = Resolved of Url.t | Unresolved
8+
and Link : sig
9+
type t = { target : Target.t; content : Inline.t; tooltip : string option }
10+
end =
11+
Link
12+
13+
and Target : sig
14+
type internal = Resolved of Url.t | Unresolved
15+
16+
type href = string
1017

11-
type t = { target : target; content : Inline.t; tooltip : string option }
18+
type t = Internal of internal | External of href
1219
end =
13-
InternalLink
20+
Target
1421

1522
and Raw_markup : sig
1623
type target = Odoc_model.Comment.raw_markup_target
@@ -36,8 +43,6 @@ end =
3643
and Inline : sig
3744
type entity = string
3845

39-
type href = string
40-
4146
type t = one list
4247

4348
and one = { attr : Class.t; desc : desc }
@@ -47,8 +52,7 @@ and Inline : sig
4752
| Entity of entity
4853
| Linebreak
4954
| Styled of style * t
50-
| Link of href * t
51-
| InternalLink of InternalLink.t
55+
| Link of Link.t
5256
| Source of Source.t
5357
| Math of Math.t
5458
| Raw_markup of Raw_markup.t
@@ -90,6 +94,9 @@ and Block : sig
9094
| Verbatim of string
9195
| Raw_markup of Raw_markup.t
9296
| Table of t Table.t
97+
| Image of Target.t * Inline.t
98+
| Video of Target.t * Inline.t
99+
| Audio of Target.t * Inline.t
93100

94101
and list_type = Ordered | Unordered
95102
end =

src/document/utils.ml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,7 @@ and compute_length_inline (t : Types.Inline.t) : int =
3333
| Text s -> acc + String.length s
3434
| Entity _e -> acc + 1
3535
| Linebreak -> 0 (* TODO *)
36-
| Styled (_, t) | Link (_, t) | InternalLink { content = t; _ } ->
37-
acc + compute_length_inline t
36+
| Styled (_, t) | Link { content = t; _ } -> acc + compute_length_inline t
3837
| Source s -> acc + compute_length_source s
3938
| Math _ -> assert false
4039
| Raw_markup _ -> assert false

src/html/generator.ml

Lines changed: 77 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,12 @@
1313
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1414
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1515
*)
16-
16+
module HLink = Link
1717
open Odoc_document.Types
1818
module Html = Tyxml.Html
1919
module Doctree = Odoc_document.Doctree
2020
module Url = Odoc_document.Url
21+
module Link = HLink
2122

2223
type any = Html_types.flow5
2324

@@ -92,12 +93,12 @@ and styled style ~emph_level =
9293
| `Superscript -> (emph_level, Html.sup ~a:[])
9394
| `Subscript -> (emph_level, Html.sub ~a:[])
9495

95-
let rec internallink ~config ~emph_level ~resolve ?(a = [])
96-
{ InternalLink.target; content; tooltip } =
96+
let rec internallink ~config ~emph_level ~resolve ?(a = []) target content
97+
tooltip =
9798
let a = match tooltip with Some s -> Html.a_title s :: a | None -> a in
9899
let elt =
99100
match target with
100-
| Resolved uri ->
101+
| Target.Resolved uri ->
101102
let href = Link.href ~config ~resolve uri in
102103
let a = (a :> Html_types.a_attrib Html.attrib list) in
103104
Html.a ~a:(Html.a_href href :: a) (inline_nolink ~emph_level content)
@@ -125,11 +126,12 @@ and inline ~config ?(emph_level = 0) ~resolve (l : Inline.t) :
125126
| Styled (style, c) ->
126127
let emph_level, app_style = styled style ~emph_level in
127128
[ app_style @@ inline ~config ~emph_level ~resolve c ]
128-
| Link (href, c) ->
129+
| Link { target = External href; content = c; _ } ->
129130
let a = (a :> Html_types.a_attrib Html.attrib list) in
130131
let content = inline_nolink ~emph_level c in
131132
[ Html.a ~a:(Html.a_href href :: a) content ]
132-
| InternalLink c -> internallink ~config ~emph_level ~resolve ~a c
133+
| Link { target = Internal t; content; tooltip } ->
134+
internallink ~config ~emph_level ~resolve ~a t content tooltip
133135
| Source c -> source (inline ~config ~emph_level ~resolve) ~a c
134136
| Math s -> [ inline_math s ]
135137
| Raw_markup r -> raw_markup r
@@ -151,7 +153,6 @@ and inline_nolink ?(emph_level = 0) (l : Inline.t) :
151153
let emph_level, app_style = styled style ~emph_level in
152154
[ app_style @@ inline_nolink ~emph_level c ]
153155
| Link _ -> assert false
154-
| InternalLink _ -> assert false
155156
| Source c -> source (inline_nolink ~emph_level) ~a c
156157
| Math s -> [ inline_math s ]
157158
| Raw_markup r -> raw_markup r
@@ -185,6 +186,26 @@ let text_align = function
185186

186187
let cell_kind = function `Header -> Html.th | `Data -> Html.td
187188

189+
(* Turns an inline into a string, for use as alternative text in
190+
images *)
191+
let rec alt_of_inline (i : Inline.t) =
192+
let rec alt_of_source s =
193+
List.map
194+
(function
195+
| Source.Elt i -> alt_of_inline i | Tag (_, t) -> alt_of_source t)
196+
s
197+
|> String.concat ""
198+
in
199+
let alt_of_one (o : Inline.one) =
200+
match o.desc with
201+
| Text t | Math t | Entity t -> t
202+
| Linebreak -> "\n"
203+
| Styled (_, i) | Link { content = i; _ } -> alt_of_inline i
204+
| Source s -> alt_of_source s
205+
| Raw_markup _ -> ""
206+
in
207+
List.map alt_of_one i |> String.concat ""
208+
188209
let rec block ~config ~resolve (l : Block.t) : flow Html.elt list =
189210
let as_flow x = (x : phrasing Html.elt list :> flow Html.elt list) in
190211
let one (t : Block.one) =
@@ -222,6 +243,55 @@ let rec block ~config ~resolve (l : Block.t) : flow Html.elt list =
222243
let extra_class = [ "language-" ^ lang_tag ] in
223244
mk_block ~extra_class Html.pre (source (inline ~config ~resolve) c)
224245
| Math s -> mk_block Html.div [ block_math s ]
246+
| Audio (target, content) ->
247+
let content = inline ~config ~resolve content in
248+
let audio src = [ Html.audio ~src ~a:[ Html.a_controls () ] [] ] in
249+
let block =
250+
match target with
251+
| External url -> audio url
252+
| Internal (Resolved uri) ->
253+
let url = Link.href ~config ~resolve uri in
254+
audio url
255+
| Internal Unresolved ->
256+
let a = Html.a_class [ "xref-unresolved" ] :: [] in
257+
[ Html.span ~a content ]
258+
in
259+
mk_block Html.div block
260+
| Video (target, content) ->
261+
let content = inline ~config ~resolve content in
262+
let video src = [ Html.video ~src ~a:[ Html.a_controls () ] [] ] in
263+
let block =
264+
match target with
265+
| External url -> video url
266+
| Internal (Resolved uri) ->
267+
let url = Link.href ~config ~resolve uri in
268+
video url
269+
| Internal Unresolved ->
270+
let a = [ Html.a_class [ "xref-unresolved" ] ] in
271+
[ Html.span ~a content ]
272+
in
273+
mk_block Html.div block
274+
| Image (target, alt) ->
275+
let image src =
276+
let alt = alt_of_inline alt in
277+
let img =
278+
Html.a
279+
~a:[ Html.a_href src; Html.a_class [ "img-link" ] ]
280+
[ Html.img ~src ~alt () ]
281+
in
282+
[ img ]
283+
in
284+
let block =
285+
match target with
286+
| External url -> image url
287+
| Internal (Resolved uri) ->
288+
let url = Link.href ~config ~resolve uri in
289+
image url
290+
| Internal Unresolved ->
291+
let a = [ Html.a_class [ "xref-unresolved" ] ] in
292+
[ Html.span ~a (inline ~config ~resolve alt) ]
293+
in
294+
mk_block Html.div block
225295
in
226296
Utils.list_concat_map l ~f:one
227297

src/html/html_source.ml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
module HLink = Link
12
open Odoc_document.Types
23
open Tyxml
4+
module Link = HLink
35

46
let html_of_doc ~config ~resolve docs =
57
let open Html in

src/html_support_files/odoc.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ a {
341341
color: inherit;
342342
}
343343

344-
a:hover {
344+
a:hover:not(.img-link) {
345345
box-shadow: 0 1px 0 0 var(--link-color);
346346
}
347347

0 commit comments

Comments
 (0)