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 ]