let expander_of_file (path : string) : Doc_types.ts_tag -> (string * string) option = (* TODO *) let file_string = IO.string_of_file path in let lines = String.split_on_char '\n' file_string in let rec collect_tags_singular (line_list : string list) (acc : (string*string*string) list) = match line_list with |[] -> acc |hd::tl -> match String.split_on_char '\t' hd with |""::_ -> collect_tags_singular tl acc |singular::(_::(exp_ref::(exp_lbl::_))) -> collect_tags_singular tl ((singular, exp_lbl, exp_ref)::acc) |_ -> collect_tags_singular tl acc in let tag_list_singular : (string * string * string) list = collect_tags_singular lines [] in let rec collect_tags_plural (line_list : string list) (acc : (string*string*string) list) = match line_list with |[] -> acc |hd::tl -> match String.split_on_char '\t' hd with |_::(""::_) -> collect_tags_plural tl acc |_::(plural::(_::(_::(exp_ref::(exp_lbl::_))))) -> collect_tags_plural tl ((plural, exp_lbl, exp_ref)::acc) |_ -> collect_tags_plural tl acc in let tag_list : (string * string * string) list = collect_tags_plural lines tag_list_singular in let rec match_tag_rec (tag_string : string) (lst : (string * string * string) list) : (string * string) option = match lst with |[] -> let _ : unit = IO.print_warning ("WARNING: undefined tag: " ^ tag_string) in None |(tag,exp_lbl,exp_ref)::tl -> if tag=tag_string then Some (exp_lbl, exp_ref) else match_tag_rec tag_string tl in let expand_tag (tag : Doc_types.ts_tag) : (string * string) option = if List.mem tag standard_tags then None else match tag with |Cs_tag tag_string -> match_tag_rec tag_string tag_list in expand_tag