simple-learning

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

render.ml (2963B)


      1 open Jingoo
      2 
      3 (* TODO: Make rendering better in lynx. 
      4    There's some weirdness with how links are being displayed (not adding correct line spacing).
      5 *)
      6 
      7 let to_tval value = Jg_types.Tobj [ ("name", Jg_types.Tstr value) ]
      8 
      9 let get_pages_in_order course_name =
     10   if Shared.is_directory (Shared.course_dir ^ course_name) then (
     11     let arr = Sys.readdir (Shared.course_dir ^ course_name) in
     12     Array.sort compare arr;
     13     let lst : string list =
     14       List.filter Basic_functions.has_sl_postfix (Array.to_list arr)
     15     in
     16     lst)
     17   else []
     18 
     19 let get_course_home course_name =
     20   List.map to_tval (get_pages_in_order course_name)
     21 
     22 let get_course_array () =
     23   if Shared.is_directory Shared.course_dir then (
     24     let arr = Sys.readdir Shared.course_dir in
     25     Array.sort compare arr;
     26     arr)
     27   else Array.make 0 ""
     28 
     29 let get_courses () =
     30   let arr = get_course_array () in
     31   Jg_types.Tlist (Array.to_list (Array.map to_tval arr))
     32 
     33 let render_course_list () =
     34   Jg_template.from_string Templates.course_list_jingoo
     35     ~models:[ ("courses", get_courses ()) ]
     36 
     37 let render_sidebar s =
     38   Jg_template.from_string Templates.sidebar_jingoo
     39     ~models:[ ("courses", get_courses ()) ]
     40   ^ s
     41 
     42 let page_line_to_tobj (line : Parser.page_line) =
     43   Jg_types.Tobj
     44     [
     45       ("content", Jg_types.Tstr line.content);
     46       ("line_type", Jg_types.Tstr (Parser.line_format_str line.line_type));
     47     ]
     48 
     49 let render_course_home course_name =
     50   Jg_template.from_string Templates.course_home_jingoo
     51     ~models:[ ("pages", Jg_types.Tlist (get_course_home course_name)) ]
     52 
     53 let get_path_to_page course page = Shared.course_dir ^ course ^ "/" ^ page
     54 
     55 (* 
     56     These two functions are called together. This is inefficient bc they both find the current index and then 
     57     pull out  another page. A good revion would be to pull out the find current logic. 
     58     This could also be optimized to use an array instead of a list because there are random seeks happening in both,
     59     but perhaps that's not too consequential.
     60 *)
     61 
     62 let get_previous_page_link course page =
     63   let pages = get_pages_in_order course in
     64   match List.find_index (fun x -> x = page) pages with
     65   | Some current_idx when current_idx - 1 >= 0 ->
     66       List.nth pages (current_idx - 1)
     67   | _ -> ""
     68 
     69 let get_next_page_link course page =
     70   let pages = get_pages_in_order course in
     71   match List.find_index (fun x -> x = page) pages with
     72   | Some current_idx when current_idx + 1 < List.length pages ->
     73       List.nth pages (current_idx + 1)
     74   | _ -> ""
     75 
     76 let render_page course page =
     77   let page_lines : Parser.page_line list =
     78     Parser.read_simple_learning_file @@ get_path_to_page course page
     79   in
     80   Jg_template.from_string Templates.course_page_jingoo
     81     ~models:
     82       [
     83         ("lines", Jg_types.Tlist (List.map page_line_to_tobj page_lines));
     84         ( "previous_page_link",
     85           Jg_types.Tstr (get_previous_page_link course page) );
     86         ("next_page_link", Jg_types.Tstr (get_next_page_link course page));
     87       ]