commit 72b52a63f2bc456d639f2dcbab8dac3f17bc791a
parent 04397ece791d704087c211c641d7dd41b867399b
Author: Andrew Laack <andrew@laack.co>
Date: Thu, 27 Aug 2026 16:52:07 -0500
Added video / image tags
Diffstat:
6 files changed, 16 insertions(+), 7 deletions(-)
diff --git a/courses/ocaml/0_ocaml.sl b/courses/ocaml/0_ocaml.sl
@@ -76,4 +76,6 @@ In OCaml we use the 'let' keyword to bind a expressions to names (variables). Sh
let x = 10
```
-=> sc.png
+=>i em.png
+
+=>v out.webm
diff --git a/courses/ocaml/assets/sc.png b/courses/ocaml/assets/em.png
Binary files differ.
diff --git a/courses/ocaml/assets/out.webm b/courses/ocaml/assets/out.webm
Binary files differ.
diff --git a/docs/sl.sl b/docs/sl.sl
@@ -13,7 +13,9 @@ A parser of sl files must track one bit of state: whether the current line is co
Outside of preformatted blocks, there are seven line types:
- Text lines
-- Link lines
+- Text link lines
+- Video link lines
+- Image link lines
- Heading lines
- List items
- Quote lines
diff --git a/learning/bin/main.ml b/learning/bin/main.ml
@@ -13,13 +13,15 @@ let countPrefix char data =
type page_line = {
header_level: int;
content: string;
- is_embedded: bool;
+ is_embedded_video: bool;
+ is_embedded_image: bool;
}
let parse_simple_line line =
let hash_count = countPrefix '#' line in
- let embedded = if String.length(line) > 2 && line.[0] = '=' && line.[1] = '>' then true else false in
- {header_level = hash_count; content = (if embedded then (String.sub line 3 (String.length(line) - 3)) else line); is_embedded = embedded}
+ let embedded_video = if String.length(line) > 3 && line.[0] = '=' && line.[1] = '>' && line.[2] = 'v' then true else false in
+ let embedded_image = if String.length(line) > 3 && line.[0] = '=' && line.[1] = '>' && line.[2] = 'i' then true else false in
+ {header_level = hash_count; content = (if embedded_video || embedded_image then (String.sub line 4 (String.length(line) - 4)) else line); is_embedded_image = embedded_image; is_embedded_video = embedded_video}
let read_simple_learning_file fileName =
let ic = open_in fileName in
@@ -50,7 +52,7 @@ let to_tval value =
Jg_types.Tobj [("name", Jg_types.Tstr value);]
let page_line_to_tobj line =
- Jg_types.Tobj [("header_level", Jg_types.Tint line.header_level); ("content", Jg_types.Tstr line.content); ("is_embedded", Jg_types.Tbool line.is_embedded)]
+ Jg_types.Tobj [("header_level", Jg_types.Tint line.header_level); ("content", Jg_types.Tstr line.content); ("is_embedded_video", Jg_types.Tbool line.is_embedded_video); ("is_embedded_image", Jg_types.Tbool line.is_embedded_image)]
let get_courses =
let arr = Sys.readdir course_dir in
diff --git a/learning/templates/course_page.jingoo b/learning/templates/course_page.jingoo
@@ -14,8 +14,11 @@
{% if line.header_level == 0 %}
<content-block>{{line.content}}</content-block>
{% endif %}
- {% if line.is_embedded %}
+ {% if line.is_embedded_image %}
<img src=assets/{{line.content}}> </img>
{% endif %}
+ {% if line.is_embedded_video %}
+ <video> <source src="assets/{{line.content}}"> Your browser does not support the video tag. </video>
+ {% endif %}
{% endfor %}
</div>