simple-learning

Simple learning web program
git clone git://git.laack.co/simple-learning.git
Log | Files | Refs | README | LICENSE

commit 72b52a63f2bc456d639f2dcbab8dac3f17bc791a
parent 04397ece791d704087c211c641d7dd41b867399b
Author: Andrew Laack <andrew@laack.co>
Date:   Thu, 27 Aug 2026 16:52:07 -0500

Added video / image tags

Diffstat:
Mcourses/ocaml/0_ocaml.sl | 4+++-
Rcourses/ocaml/assets/sc.png -> courses/ocaml/assets/em.png | 0
Acourses/ocaml/assets/out.webm | 0
Mdocs/sl.sl | 4+++-
Mlearning/bin/main.ml | 10++++++----
Mlearning/templates/course_page.jingoo | 5++++-
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>