let expander_of_file (path : string) : Doc_types.ts_tag -> (string * string) option =
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