\n";
tag "td" "valign=top" begin
print_someone conf base (pget conf base ip);
end;
if max_lev > 0 then
match children_of conf base ip with
[ [] -> ()
| ipl ->
do {
Wserver.wprint "\n| ";
List.iter (print_table_person conf base (max_lev - 1)) ipl;
Wserver.wprint " | \n"
} ]
else ();
end
}
;
value display_descendant_with_table conf base max_lev a =
let title _ = Wserver.wprint "%s" (capitale (transl conf "descendants")) in
let max_lev = min (limit_desc conf) max_lev in
do {
header conf title;
print_table_person conf base max_lev a.cle_index;
trailer conf
}
;
value make_tree_hts conf base gv p =
let gv = min (limit_by_tree conf) gv in
let bd = match p_getint conf.env "bd" with [ Some x -> x | None -> 0 ] in
let td_prop =
match Util.p_getenv conf.env "td" with
[ Some x -> " " ^ x
| _ ->
match Util.p_getenv conf.env "color" with
[ None | Some "" -> ""
| Some x -> " bgcolor=" ^ x ] ]
in
let rec nb_column n v u =
if v == 0 then n + 1
else if Array.length u.family = 0 then n + 1
else
List.fold_left (fun n ifam -> fam_nb_column n v (doi base ifam)) n
(Array.to_list u.family)
and fam_nb_column n v des =
if Array.length des.children = 0 then n + 1
else
List.fold_left
(fun n iper -> nb_column n (v - 1) (uget conf base iper)) n
(Array.to_list des.children)
in
let vertical_bar_txt v tdl po =
let tdl =
if tdl = [] then [] else [(1, LeftA, TDstring " ") :: tdl]
in
let td =
match po with
[ Some (_, u, _) ->
let ncol = nb_column 0 (v - 1) u in
(2 * ncol - 1, CenterA, TDstring "|")
| None -> (1, LeftA, TDstring " ") ]
in
[td :: tdl]
in
let children_vertical_bars v gen =
let tdl = List.fold_left (vertical_bar_txt v) [] gen in
Array.of_list (List.rev tdl)
in
let spouses_vertical_bar_txt v tdl po =
let tdl =
if tdl = [] then [] else [(1, LeftA, TDstring " ") :: tdl]
in
match po with
[ Some (p, u, _) when Array.length u.family > 0 ->
fst
(List.fold_left
(fun (tdl, first) ifam ->
let tdl =
if first then tdl
else [(1, LeftA, TDstring " ") :: tdl]
in
let des = doi base ifam in
let td =
if Array.length des.children = 0 then
(1, LeftA, TDstring " ")
else
let ncol = fam_nb_column 0 (v - 1) des in
(2 * ncol - 1, CenterA, TDstring "|")
in
([td :: tdl], False))
(tdl, True) (Array.to_list u.family))
| _ -> [(1, LeftA, TDstring " ") :: tdl] ]
in
let spouses_vertical_bar v gen =
let tdl = List.fold_left (spouses_vertical_bar_txt v) [] gen in
Array.of_list (List.rev tdl)
in
let horizontal_bar_txt v tdl po =
let tdl =
if tdl = [] then [] else [(1, LeftA, TDstring " ") :: tdl]
in
match po with
[ Some (p, u, _) when Array.length u.family > 0 ->
fst
(List.fold_left
(fun (tdl, first) ifam ->
let tdl =
if first then tdl
else [(1, LeftA, TDstring " ") :: tdl]
in
let des = doi base ifam in
let tdl =
if Array.length des.children = 0 then
[(1, LeftA, TDstring " ") :: tdl]
else if Array.length des.children = 1 then
let u = uget conf base des.children.(0) in
let ncol = nb_column 0 (v - 1) u in
[(2 * ncol - 1, CenterA, TDstring "|") :: tdl]
else
let rec loop tdl i =
if i = Array.length des.children then tdl
else
let iper = des.children.(i) in
let u = uget conf base iper in
let tdl =
if i > 0 then
let align = CenterA in
[(1, align, TDhr align) :: tdl]
else tdl
in
let ncol = nb_column 0 (v - 1) u in
let align =
if i == 0 then RightA
else if i == Array.length des.children - 1 then
LeftA
else CenterA
in
let td = (2 * ncol - 1, align, TDhr align) in
loop [td :: tdl] (i + 1)
in
loop tdl 0
in
(tdl, False))
(tdl, True) (Array.to_list u.family))
| _ -> [(1, LeftA, TDstring " ") :: tdl] ]
in
let horizontal_bars v gen =
let tdl = List.fold_left (horizontal_bar_txt v) [] gen in
Array.of_list (List.rev tdl)
in
let person_txt v tdl po =
let tdl =
if tdl = [] then [] else [(1, LeftA, TDstring " ") :: tdl]
in
let td =
match po with
[ Some (p, u, auth) ->
let ncol = nb_column 0 (v - 1) u in
let txt =
if v = 1 then person_text_without_surname conf base p
else person_title_text conf base p
in
let txt = reference conf base p txt in
let txt =
if auth then txt ^ Date.short_dates_text conf base p else txt
in
let txt =
if bd > 0 || td_prop <> "" then
Printf.sprintf
""
bd td_prop txt
else txt
in
let txt = txt ^ Dag.image_txt conf base p in
(2 * ncol - 1, CenterA, TDstring txt)
| None -> (1, LeftA, TDstring " ") ]
in
[td :: tdl]
in
let spouses_txt v tdl po =
let tdl =
if tdl = [] then [] else [(1, LeftA, TDstring " ") :: tdl]
in
match po with
[ Some (p, u, auth) when Array.length u.family > 0 ->
let rec loop tdl i =
if i = Array.length u.family then tdl
else
let ifam = u.family.(i) in
let tdl =
if i > 0 then [(1, LeftA, TDstring "...") :: tdl] else tdl
in
let td =
let fam = foi base ifam in
let des = doi base ifam in
let ncol = fam_nb_column 0 (v - 1) des in
let s =
let sp = pget conf base (spouse p.cle_index (coi base ifam)) in
let txt = person_title_text conf base sp in
let txt = reference conf base sp txt in
let txt =
if auth then txt ^ Date.short_dates_text conf base sp
else txt
in
"&" ^
(if auth then
Date.short_marriage_date_text conf base fam p sp
else "") ^
" " ^ txt ^ Dag.image_txt conf base sp
in
let s =
if bd > 0 || td_prop <> "" then
Printf.sprintf
"" bd td_prop s
else s
in
(2 * ncol - 1, CenterA, TDstring s)
in
loop [td :: tdl] (i + 1)
in
loop tdl 0
| _ -> [(1, LeftA, TDstring " ") :: tdl] ]
in
let next_gen gen =
List.fold_right
(fun po gen ->
match po with
[ Some (p, u, auth) ->
if Array.length u.family = 0 then [None :: gen]
else
List.fold_right
(fun ifam gen ->
let des = doi base ifam in
if Array.length des.children = 0 then [None :: gen]
else
let age_auth =
List.for_all
(fun ip ->
authorized_age conf base (pget conf base ip))
(Array.to_list des.children)
in
List.fold_right
(fun iper gen ->
let g =
(pget conf base iper, uget conf base iper,
age_auth)
in
[Some g :: gen])
(Array.to_list des.children) gen)
(Array.to_list u.family) gen
| None -> [None :: gen] ])
gen []
in
let hts =
let tdal =
loop [] [] [Some (p, uget conf base p.cle_index, True)] (gv + 1)
where rec loop tdal prev_gen gen v =
let tdal =
if prev_gen <> [] then
[children_vertical_bars v gen; horizontal_bars v prev_gen;
spouses_vertical_bar (v + 1) prev_gen :: tdal]
else tdal
in
let tdal =
let tdl = List.fold_left (person_txt v) [] gen in
[Array.of_list (List.rev tdl) :: tdal]
in
if v > 1 then
let tdl = List.fold_left (spouses_txt v) [] gen in
let tdal = [Array.of_list (List.rev tdl) :: tdal] in
loop tdal gen (next_gen gen) (v - 1)
else tdal
in
Array.of_list (List.rev tdal)
in
hts
;
value print_tree conf base gv p =
let hts = make_tree_hts conf base gv p in
if p_getenv conf.env "slices" = Some "on" then
Dag.print_slices_menu conf base (Some hts)
else do {
let title _ =
Wserver.wprint "%s: %s" (capitale (transl conf "tree"))
(person_text_no_html conf base p)
in
header_no_page_title conf title;
Dag.print_html_table conf hts;
trailer conf
}
;
value print_aboville conf base max_level p =
let max_level = min (limit_desc conf) max_level in
do {
Util.header conf (descendants_title conf base p);
print_link_to_welcome conf True;
Wserver.wprint "%s.
" (capitale (text_to conf max_level));
let rec loop_ind lev lab p =
do {
Wserver.wprint "%s\n" lab;
Wserver.wprint "%s%s\n" (referenced_person_title_text conf base p)
(Date.short_dates_text conf base p);
let u = uget conf base p.cle_index in
if lev < max_level then
for i = 0 to Array.length u.family - 1 do {
let cpl = coi base u.family.(i) in
let spouse = pget conf base (Gutil.spouse p.cle_index cpl) in
let mdate =
if authorized_age conf base p &&
authorized_age conf base spouse then
let fam = foi base u.family.(i) in
match Adef.od_of_codate fam.marriage with
[ Some (Dgreg d _) ->
"" ^ Date.year_text d ^ ""
| _ -> "" ]
else ""
in
Wserver.wprint "&%s %s%s\n" mdate
(referenced_person_title_text conf base spouse)
(Date.short_dates_text conf base spouse)
}
else ();
Wserver.wprint "
\n";
if lev < max_level then
let rec loop_fam cnt_chil i =
if i == Array.length u.family then ()
else
let des = doi base u.family.(i) in
let rec loop_chil cnt_chil j =
if j == Array.length des.children then
loop_fam cnt_chil (i + 1)
else do {
loop_ind (lev + 1) (lab ^ string_of_int cnt_chil ^ ".")
(pget conf base des.children.(j));
loop_chil (cnt_chil + 1) (j + 1)
}
in
loop_chil cnt_chil 0
in
loop_fam 1 0
else ()
}
in
loop_ind 0 "" p;
Util.trailer conf
}
;
value print conf base p =
match (p_getenv conf.env "t", p_getint conf.env "v") with
[ (Some "A", Some v) -> print_aboville conf base v p
| (Some "L", Some v) -> display_descendants_upto conf base v p Neuter
| (Some "M", Some v) -> display_descendants_upto conf base v p Male
| (Some "F", Some v) -> display_descendants_upto conf base v p Female
| (Some "S", Some v) -> display_descendants_level conf base v p
| (Some "H", Some v) -> display_descendant_with_table conf base v p
| (Some "N", Some v) -> display_descendants_with_numbers conf base v p
| (Some "G", Some v) -> display_descendant_index conf base v p
| (Some "C", Some v) -> display_spouse_index conf base v p
| (Some "T", Some v) -> print_tree conf base v p
| _ -> display_descendant_menu conf base p ]
;