From b6f77f46bcc139a8af1c23c6db13fe6d4e97f61f Mon Sep 17 00:00:00 2001 From: Steven de Oliveira Date: Thu, 2 Dec 2021 16:21:40 +0100 Subject: [PATCH 01/73] Adding mlis to libraries in bin/ --- bin/gwexport/gwexport.ml | 73 ++++++++++++++++++++++++++++++++++----- bin/gwexport/gwexport.mli | 54 +++++++++++++++++++++++++++++ bin/wserver/wserver.mli | 35 +++++++++++++------ 3 files changed, 142 insertions(+), 20 deletions(-) create mode 100644 bin/gwexport/gwexport.mli diff --git a/bin/gwexport/gwexport.ml b/bin/gwexport/gwexport.ml index d516de149b..de1d0b7d26 100644 --- a/bin/gwexport/gwexport.ml +++ b/bin/gwexport/gwexport.ml @@ -106,7 +106,12 @@ let speclist c = module IPS = Util.IperSet module IFS = Util.IfamSet -(**/**) +(** [is_censored_person max_year person_name] + Returns [true] iff the person has a birth date that is after max_year and + its visibility is not public +*) +(* S: Does it mean private persons whose birth year is before 'max_year' + are uncensored? *) let is_censored_person threshold p = match Adef.od_of_cdate (get_birth p) with | None -> false @@ -115,15 +120,32 @@ let is_censored_person threshold p = | Adef.Dgreg (dmy, _) -> dmy.Adef.year >= threshold && get_access p != Def.Public | _ -> false +(** [is_censored_couple base max_year family] + Returns [true] if either the father or the mother of a given family in the + base is censored +*) let is_censored_couple base threshold cpl = is_censored_person threshold @@ poi base (get_father cpl) || is_censored_person threshold @@ poi base (get_mother cpl) + +(* The following functions are utils set people as "censored" by marking them. + Censoring a person consists in setting a mark defined as: + `Marker.get pmark p lor flag` + + This gets the current mark, being 0 or 1, and `lor`s it with `flag` which is `1`. + TODO: replace integer markers by booleans +*) + +(** Marks a censored person *) let censor_person base pmark flag threshold p no_check = let ps = poi base p in if no_check || is_censored_person threshold ps then Marker.set pmark p (Marker.get pmark p lor flag) +(** Marks all the members of a family that are censored. + If a couple is censored, its parents and all its descendants are marked. +*) let rec censor_family base pmark fmark flag threshold i no_check = let censor_unions p = let uni = poi base p in @@ -148,6 +170,7 @@ let rec censor_family base pmark fmark flag threshold i no_check = let censor_spouse iper = if all_families_censored iper then Marker.set pmark iper (Marker.get pmark iper lor flag) + (* S: Replace this line by `censor_person`? *) in if Marker.get fmark i = 0 then let fam = foi base i in @@ -158,6 +181,7 @@ let rec censor_family base pmark fmark flag threshold i no_check = censor_descendants i end +(** Marks all the families that are censored in the given base. *) let censor_base base pmark fmark flag threshold = Collection.iter begin fun i -> censor_family base pmark fmark flag threshold i false @@ -166,27 +190,34 @@ let censor_base base pmark fmark flag threshold = censor_person base pmark flag threshold i false end (ipers base) +(** Set non visible persons and families as censored *) let restrict_base base per_tab fam_tab flag = + (* Starts by censoring non visible persons of the base *) Collection.iter begin fun i -> if base_visible_get base (fun _ -> false) i - then Marker.set per_tab i (Marker.get per_tab i lor flag) + then Marker.set per_tab i (Marker.get per_tab i lor flag) (* S: replace by `censor_person` ? *) end (ipers base) ; + Collection.iter begin fun i -> let fam = foi base i in - let des_visible = + let des_visible = (* There exists a children of the family that is not censored *) (* FIXME: replace with exists *) Array.fold_left (fun check iper -> check || Marker.get per_tab iper = 0) false (get_children fam) in - let cpl_not_visible = + let cpl_not_visible = (* Father or mother is censored *) Marker.get per_tab (get_father fam) <> 0 || Marker.get per_tab (get_mother fam) <> 0 in + (* If all the children, father and mother are censored, then censor family *) if not des_visible && cpl_not_visible then Marker.set fam_tab i (Marker.get fam_tab i lor flag) end (ifams base) +(** [select_asc conf base max_gen ips] + Returns all the ancestors of persons in the list `ips` up to the `max_gen` + generation. *) let select_asc conf base max_gen ips = let rec loop_asc (gen : int) set ip = if not @@ IPS.mem ip set then begin @@ -203,6 +234,12 @@ let select_asc conf base max_gen ips = in List.fold_left (loop_asc 0) IPS.empty ips +(** [select_surname nase pmark fmark surname] + Sets a `true` marker to families whose mother or father that + match the given surname. Propagates the mark to children + that have this surname. +*) +(* S: only used by `select_surnames` in a List.iter *) (* Should it use search engine functions? *) let select_surname base pmark fmark surname = let surname = Name.strip_lower surname in @@ -226,6 +263,12 @@ let select_surname base pmark fmark surname = end end (ifams base) +(** [select_surnames base surnames] + Calls `select_surname` on every family that have the given surnames. + Returns two functions: + * the first takes a person and returns `true` iff it has been selected + * the second takes a family and returns `false` iff it has been selected +*) let select_surnames base surnames : (iper -> bool) * (ifam -> bool) = let pmark = Gwdb.iper_marker (Gwdb.ipers base) false in let fmark = Gwdb.ifam_marker (Gwdb.ifams base) false in @@ -234,11 +277,14 @@ let select_surnames base surnames : (iper -> bool) * (ifam -> bool) = , (fun i -> Gwdb.Marker.get fmark i) ) (**/**) +(** [select_parentship base ip1 ip2] + Returns the set of common descendants of ip1 and the + ancestors of ip2 and the set of their families. *) let select_parentship base ip1 ip2 = let conf = Config.{ empty with wizard = true ; bname = Gwdb.bname base } in let asc = select_asc conf base max_int [ ip1 ] in let desc = Util.select_desc conf base (-max_int) [ ip2, 0 ] in - let ipers = + let ipers = (* S: The intersection of asc and desc *) if IPS.cardinal asc > Hashtbl.length desc then Hashtbl.fold @@ -249,11 +295,12 @@ let select_parentship base ip1 ip2 = (fun k acc -> if Hashtbl.mem desc k then IPS.add k acc else acc) asc IPS.empty in - let ifams = + let ifams = (* S: families *) IPS.fold begin fun iper acc -> Array.fold_left begin fun acc ifam -> - if IFS.mem ifam acc - || not (IPS.mem (Gutil.spouse iper @@ foi base ifam) ipers) + if IFS.mem ifam acc (* S: useless test? *) + || not (IPS.mem (Gutil.spouse iper @@ foi base ifam) ipers) (* S: is the partner of the + person not in ipers? *) then acc else IFS.add ifam acc end acc (get_family (poi base iper)) @@ -261,7 +308,12 @@ let select_parentship base ip1 ip2 = in ipers, ifams -let select_from_set ipers ifams = +(** [select_from_set ipers ifams] + Returns two functions : + * the first returns true if its input is in ipers + * the second returns true if its input is in ifams +*) +let select_from_set (ipers : IPS.t) (ifams : IFS.t) = let sel_per i = IPS.mem i ipers in let sel_fam i = IFS.mem i ifams in (sel_per, sel_fam) @@ -294,6 +346,8 @@ let select opts ips = in let conf = Config.{ empty with wizard = true } in let sel_per, sel_fam = + (* S: a lot of redundant tests are done here, would be simpler with + pattern matchings and factorization. *) if opts.ascdesc <> None || opts.desc <> None then begin assert (opts.censor = 0) ; let asc = @@ -334,6 +388,7 @@ let select opts ips = let sel_fam i = IFS.mem i ifams in (sel_per, sel_fam) end else match opts.asc with + (* opts.ascdesc = None && opts.desc = None *) | Some asc -> let ipers = select_asc conf base asc ips in let per_sel i = IPS.mem i ipers in diff --git a/bin/gwexport/gwexport.mli b/bin/gwexport/gwexport.mli new file mode 100644 index 0000000000..40c319b850 --- /dev/null +++ b/bin/gwexport/gwexport.mli @@ -0,0 +1,54 @@ +type gwexport_charset = Ansel | Ansi | Ascii | Utf8 + +type gwexport_opts = { + asc : int option; (* Maximum generation of the root's ascendants *) + ascdesc : int option; (* Maximum generation of the root's ascendants descendants *) + base : (string * Gwdb.base) option; (* The base analyzed *) + censor : int; (* Censors the base for 'n' years *) + charset : gwexport_charset; (* The charset of the export *) + desc : int option; (* Maximum generation of the root's descendants *) + img_base_path : string; (* Unused by this module (and not set by options) *) + keys : string list; (* Key reference of additional persons to select *) + mem : bool; (* Unused by this module *) + no_notes : [ `nn | `nnn | `none ]; (* Unused by this module + S: Consider simple ADTs *) + no_picture : bool; (* Unused by this module *) + oc : string * (string -> unit) * (unit -> unit); (* Unused by this module *) + parentship : bool; (* If asc, ascdesc and desc are not set & parenting = true, then + select individuals involved in parentship between pair of keys + (/!\ assumes the input are pairs of keys) *) + picture_path : bool; (* Unused by this module *) + source : string option; (* Unused by this module *) + surnames : string list; (* Used to select persons by their surname *) + verbose : bool; (* Unused by this module *) +} + +(** Default set of options *) +val default_opts : gwexport_opts + +(** Given a set of options, returns default command line arguments for selecting + elements from a base. The output of this function is the first input of + Arg.parse. +*) +val speclist : gwexport_opts ref -> (Arg.key * Arg.spec * Arg.doc) list +(* Used for gwd2ged and gwu. *) + +(** [anonfun opts = fun base_name -> ...] + Given a set of options `opts` where `!opts.base` is uninitialized, + opens the dir `base_name` and initializes !opts.base with the base name. + The output of this function is the second argument of Arg.parse. +*) +val anonfun : gwexport_opts ref -> Arg.anon_fun +(* Arg.anon_fun = string -> unit *) + +(** Default error message. + This is the third argument of Arg.parse. *) +val errmsg : Arg.usage_msg + +(** [select opts ips] + Return filters for [iper] and [ifam] to be used when exporting a (portion of a) base. +*) +val select : + gwexport_opts -> + Gwdb.iper list -> (Gwdb.iper -> bool) * (Gwdb.ifam -> bool) + diff --git a/bin/wserver/wserver.mli b/bin/wserver/wserver.mli index 68c6a0711b..258662dd83 100644 --- a/bin/wserver/wserver.mli +++ b/bin/wserver/wserver.mli @@ -30,43 +30,56 @@ val f -> (Unix.sockaddr * string list -> string -> string -> unit) -> unit +(** Closes the current socket *) val close_connection : unit -> unit +(** Formatter printing in the out channel associated to the connected socket *) val printf : ('a, out_channel, unit) format -> 'a (* To be called to print page contents. *) +(** Prints a string in the out channel associated to the socket *) val print_string : string -> unit (* To be called to print page contents. *) +(** Prints a header; cannot be called if status or content already has been sent *) val header : string -> unit (* To print an http header line *) +(** Flushes the content of the current *) val wflush : unit -> unit (* To flush page contents print. *) + +(** [Output.status conf answer] sends the http header where [answer] + represents the answer status. *) val http : Def.httpStatus -> unit - (* [Output.status conf answer] sends the http header where [answer] - represents the answer status. If empty string, "200 OK" is assumed. *) +(** [Output.status conf_redirect url] sends the http header where [url] + represents the Location where the request needs to be redirected. *) val http_redirect_temporarily : string -> unit - (* [Output.status conf_redirect url] sends the http header where [url] - represents the Location where the request needs to be redirected. *) +(** Returns the request from a stream read from a socket. *) val get_request_and_content : char Stream.t -> string list * string +(** Returns the last used socket *) val wsocket : unit -> Unix.file_descr + +(** Return the out_channel associated to the socket *) val woc : unit -> out_channel +(** Names of the files used in windows implementation to communicate + http requests and html answers. Default "wserver.sin" and + "wserver.sou". Can have relative or absolute paths. *) val sock_in : string ref val sock_out : string ref - (* Names of the files used in windows implementation to communicate - http requests and html answers. Default "wserver.sin" and - "wserver.sou". Can have relative or absolute paths. *) + +(** Name of the file whose presence tells the server to stop (at least + one request is necessary to unfreeze the server to make it check + that this file exits. Default "STOP_SERVER". Can have relative + or absolute path. *) val stop_server : string ref - (* Name of the file whose presence tells the server to stop (at least - one request is necessary to unfreeze the server to make it check - that this file exits. Default "STOP_SERVER". Can have relative - or absolute path. *) + +(** CGI (Common Gateway Interface) mode (default false). *) val cgi : bool ref (* Example: From c51e01a7c2e9c719a28cf8c89648df8b2b4f68e0 Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed Date: Thu, 2 Dec 2021 17:28:35 +0100 Subject: [PATCH 02/73] Util.Utf8 documentation --- lib/util/utf8.ml | 27 ++++---------------------- lib/util/utf8.mli | 49 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 23 deletions(-) create mode 100644 lib/util/utf8.mli diff --git a/lib/util/utf8.ml b/lib/util/utf8.ml index 069de3933f..fa4638c94f 100644 --- a/lib/util/utf8.ml +++ b/lib/util/utf8.ml @@ -1,6 +1,5 @@ (* TODO: replace with Unidecode.nbc when version constraint [= 0.2.0] will be removed *) -(** Return the number of bytes composing the UTF8 character starting with [c] *) let nbc c = if Char.code c < 0x80 then 1 else if Char.code c < 0xC0 then invalid_arg "nbc" @@ -11,24 +10,15 @@ let nbc c = else if Char.code c < 0xFE then 6 else invalid_arg "nbc" -(** [Utf8.next s i] returns the index of the character comming after - the one which starts at [i]. -*) let next s i = i + nbc s.[i] -(** [Utf8.get s n] returns the index where the [n]-th character - starts in string [s]. -*) let get s i = let rec loop i k = if k = 0 then i else loop (next s i) (pred k) in loop 0 i -(** Return the length (number of characters, not bytes) - of the given string. -*) let length s = let rec loop i len = if i < String.length s @@ -36,11 +26,6 @@ let length s = else len in loop 0 0 -(** [sub ?pad s start len] - Return a fresh UTF8-friendly substring of [len] characters, padded if needed. - Be careful [start] is the index of the byte where to start in [s], - not the [start-th] UTF8-character. -*) let sub ?pad str start len = let strlen = String.length str in let n, i = @@ -97,6 +82,8 @@ module C = struct type t = Str of string | Chr of char | Empty + (* Creates [t] from the UTF-8 character that starts at position [i] in [s]. + If characher isn't the one that exists in ASCII char set, use unidecode library *) let unaccent trimmed s i0 len = let rec loop i = if i < len then match @@ -159,6 +146,7 @@ module C = struct let m = Char.code (String.unsafe_get s (i + 3)) in n' lsl 6 lor (0x7f land m) + (* compare bytes (UTF-8 charachter) delimited by intevals [i1,j1] and [i2,j2] *) let cmp_substring s1 i1 j1 s2 i2 j2 = let l1 = j1 - i1 in let l2 = j2 - i2 in @@ -175,6 +163,7 @@ module C = struct let c2 = match Uucp.Case.Fold.fold c2 with `Self -> [c2] | `Uchars us -> us in Stdlib.compare c1 c2 + (* See [Utf8.compare] *) let compare n1 n2 = let trimmed1 = ref false in let trimmed2 = ref false in @@ -215,12 +204,4 @@ module C = struct end -(** [compare a b] compare normalized version of [a] and [b] - It is case insensitive. - It starts with unaccented comparison of [a] and [b], - and refine the result with accents comparison. - - Here is an exemple of how letters would be sorted: - [A À Á  B C Ç Č D E É L Ł Ô Ö Ø Œ P Q R * . ?] - *) let compare = C.compare diff --git a/lib/util/utf8.mli b/lib/util/utf8.mli new file mode 100644 index 0000000000..3ecbabf25b --- /dev/null +++ b/lib/util/utf8.mli @@ -0,0 +1,49 @@ + +(** Return the number of bytes composing the UTF8 character starting with [c] *) +val nbc : char -> int + +(** [Utf8.next s i] returns the index of the character comming after + the one which starts at [i]. *) +val next : string -> int -> int + +(** [Utf8.get s n] returns the index where the [n]-th character + starts in string [s]. *) +val get : string -> int -> int + +(** Return the length (number of characters, not bytes) + of the given string. *) +val length : string -> int + +(** [sub ?pad s start len] + Return a fresh UTF8-friendly substring of [len] characters, padded if needed. + Be careful [start] is the index of the byte where to start in [s], + not the [start-th] UTF8-character. *) +val sub : ?pad:char -> string -> int -> int -> string + +(** [cmap_utf_8 cmap s] returns the UTF-8 encoded string + resulting from applying the character map [cmap] to every character + of the UTF-8 encoded string [s]. *) +val cmap_utf_8 : + (Uchar.t -> [< `Self | `Uchars of Uchar.t list ]) -> string -> string + +(** Returns UTF-8 encoded string with all uppercase letters translated to lowercase *) +val lowercase : string -> string + +(** Returns UTF-8 encoded string with all lowercase letters translated to uppercase *) +val uppercase : string -> string + +(** Returns UTF-8 encoded string where the first letter is capitalised *) +val capitalize_fst : string -> string + +(** Returns UTF-8 encoded string where the first letter is capitalised and others minimalised *) +val capitalize : string -> string + +(** [compare a b] compare normalized version of [a] and [b] + It is case insensitive. + It starts with unaccented comparison of [a] and [b], + and refine the result with accents comparison. + + Here is an exemple of how letters would be sorted: + [A À Á  B C Ç Č D E É L Ł Ô Ö Ø Œ P Q R * . ?] + *) +val compare : string -> string -> int \ No newline at end of file From b7674e31ef0e52e9fec360c04e5f3123a10a06ed Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed Date: Thu, 2 Dec 2021 23:16:44 +0100 Subject: [PATCH 03/73] Utils.Name documentation --- lib/util/name.ml | 36 +++++++++++++++++-- lib/util/name.mli | 92 ++++++++++++++++++++++++++--------------------- 2 files changed, 85 insertions(+), 43 deletions(-) diff --git a/lib/util/name.ml b/lib/util/name.ml index 745c440fd6..55386a4c32 100644 --- a/lib/util/name.ml +++ b/lib/util/name.ml @@ -28,6 +28,12 @@ let next_chars_if_equiv s i t j = let (t1, j1) = unaccent_utf_8 true t j in if s1 = t1 then Some (i1, j1) else None +(* Name.lower: + - uppercase -> lowercase + - no accents + - chars no letters and no numbers (except '.') => spaces (stripped) + Key comparison (first name, surname, number) applies "lower" equality + on first names and surnames *) let lower s = let rec copy special i len = if i = String.length s then Buff.get len @@ -57,11 +63,15 @@ let title s = (* Name.abbrev *) +(* List of abbreviations. If abbreviation is mapped to [Some s] should be remplaced by + [s]. If mapped to None, it should be removed from name. *) let abbrev_list = ["a", None; "af", None; "d", None; "de", None; "di", None; "ier", Some "i"; "of", None; "saint", Some "st"; "sainte", Some "ste"; "van", None; "von", None; "zu", None; "zur", None] +(* Checks if words are the same (starting from given position for both of them). + In [s] word should end with space. *) let rec is_word s i p ip = if ip = String.length p then if i = String.length s then true else if s.[i] = ' ' then true else false @@ -69,6 +79,7 @@ let rec is_word s i p ip = else if s.[i] = p.[ip] then is_word s (i + 1) p (ip + 1) else false +(* Checks if word that starts at position [i] in [s] is one of abbreviation *) let rec search_abbrev s i = function (w, a) :: pl -> @@ -76,6 +87,7 @@ let rec search_abbrev s i = else search_abbrev s i pl | [] -> None +(* Name.abbrev: suppress lowercase particles, shorten "saint" into "st" *) let abbrev s = let rec copy can_start_abbrev i len = if i >= String.length s then Buff.get len @@ -94,6 +106,7 @@ let abbrev s = (* Name.strip *) +(* Name.strip_c = name without the charater c given as parameter *) let strip_c s c = let rec copy i len = if i = String.length s then Buff.get len @@ -104,7 +117,7 @@ let strip_c s c = let strip s = strip_c s ' ' - +(* String without any forbidden caracters defined in forbidden_char *) (* ******************************************************************** *) (* [Fonc] purge : string -> string *) (** [Description] : Supprime tous les caractères interdits (défini par @@ -116,11 +129,13 @@ let strip s = strip_c s ' ' - string : retourne la chaîne délestée des caractères interdits [Rem] : Exporté en clair hors de ce module. *) (* ******************************************************************** *) -let purge s = List.fold_left (fun s c -> strip_c s c) s forbidden_char +let purge s = List.fold_left strip_c s forbidden_char (* Name.crush *) +(* If string starting from [i] contains roman number then returns the next position, + else returns None. *) let roman_number s i = let rec loop i = if i = String.length s then Some i @@ -132,6 +147,18 @@ let roman_number s i = in if i = 0 || s.[i-1] = ' ' then loop i else None +(*Name.crush: + - no spaces + - roman numbers are keeped + - vowels are suppressed, except in words starting with a vowel, + where this vowel is converted into "e" + - "k" and "q" replaced by "c" + - "y" replaced by "i" + - "z" replaced by "s" + - "ph" replaced by "f" + - others "h" deleted + - s at end of words are deleted + - no double lowercase consons *) let crush s = let rec copy i len first_vowel = if i = String.length s then Buff.get len @@ -185,12 +212,17 @@ let crush s = (* strip_lower *) +(* strip_lower = strip o lower, as first comparison of names. + First names and Surnames comparison is strip_lower equality. *) let strip_lower s = strip (lower s) (* crush_lower *) +(* crush_lower = crush o abbrev o lower, as second comparison of names. + In index by names, the "names" are crush_lowers *) let crush_lower s = crush (abbrev (lower s)) +(* concat two strings using Bytes module *) let concat_aux fn l1 sn l2 = let b = Bytes.create (l1 + l2 + 1) in Bytes.blit_string fn 0 b 0 l1 ; diff --git a/lib/util/name.mli b/lib/util/name.mli index 3dafa7bd59..9f62a78e12 100644 --- a/lib/util/name.mli +++ b/lib/util/name.mli @@ -1,24 +1,42 @@ (* Copyright (c) 1998-2007 INRIA *) -(** Apply uppercasing to the first letter of each name part, +(** List of forbidden to use characters *) +val forbidden_char : char list + +(** [unaccent_utf_8 lower s i] checks UTF-8 characher that starts at position [i] inside [s] + and returns couple (cs,np) where [cs] is ASCII representation of this character (characters + between 0x00 and 0x7F) and [np] it's a position of next utf8 character inside [s]. If [lower] + is true then [cs] will contain only lowercase letters. + Example : unaccent_utf_8 "aÈa" 1 -> ("e",3) *) +val unaccent_utf_8 : bool -> string -> int -> string * int + +(** [next_chars_if_equiv s1 i1 s2 i2] checks if UTF-8 characters that start at position + [i1] inside [s1] and at [i2] inside [s2] are equivalent (have the same ASCII representation). + In this case returns position of the next charecter for each of them. Otherwise, returns None. *) +val next_chars_if_equiv : string -> int -> string -> int -> (int * int) option + +(** Convert every letter to lowercase and use *unidecode* library to + represent unicode characters with ASCII. Non-alphanumeric characters + (except '.') are remplaced by space. *) +val lower : string -> string + +(** Apply uppercasing to the first letter of each name (sequence of alphabetic characters) part, and lowercasing to the rest of the text. *) val title : string -> string -val lower : string -> string - (* Name.lower: - - uppercase -> lowercase - - no accents - - chars no letters and no numbers (except '.') => spaces (stripped) - Key comparison (first name, surname, number) applies "lower" equality - on first names and surnames *) +(** Remplace by an abbreviation or remove particles inside the name *) val abbrev : string -> string - (* Name.abbrev: suppress lowercase particles, shorten "saint" into "st" *) + +(** Removes all the spaces inside the name *) val strip : string -> string - (* Name.strip = name without spaces *) + +(** [strip_c s c] removes all the occurences of [c] inside the name *) val strip_c : string -> char -> string - (* Name.strip_c = name without the charater c given as parameter *) -val crush : string -> string - (* Name.crush: + +(** Removes all the forbiden characters from [forbidden_char] inside the name *) +val purge : string -> string + +(** Converts name to the following format: - no spaces - roman numbers are keeped - vowels are suppressed, except in words starting with a vowel, @@ -28,46 +46,38 @@ val crush : string -> string - "z" replaced by "s" - "ph" replaced by "f" - others "h" deleted - - s at end of words are deleted + - s at thr end of words are deleted - no double lowercase consons *) - +val crush : string -> string + +(* Equivalent to [strip o lower]. Used as: + - First comparison of names. + - Comparison for first names and surnames. *) val strip_lower : string -> string - (* strip_lower = strip o lower, as first comparison of names. - First names and Surnames comparison is strip_lower equality. *) - -val purge : string -> string - (* String without any forbidden caracters defined in forbidden_char *) +(* Equivalent to [crush o abbrev o lower]. Used as: + - Second comparison of names. + - Key when index by names *) val crush_lower : string -> string - (* crush_lower = crush o abbrev o lower, as second comparison of names. - In index by names, the "names" are crush_lowers *) - -val next_chars_if_equiv : string -> int -> string -> int -> (int * int) option - -val unaccent_utf_8 : bool -> string -> int -> string * int - -val forbidden_char : char list (** [concat fn sn] is [fn ^ " " ^ sn] but faster. *) val concat : string -> string -> string -(** [split_sname s] split the surname [s] in parts composing it. - e.g. [split_sname base "Foo-Bar"] is [[ "Foo" ; "Bar"]] *) -val split_sname : string -> string list - -(** [split_fname s] split the string [s] representing multiple first names - into this list of firstname. - e.g. [split_fname base "Foo-Bar Baz"] is [[ "Foo-Bar" ; "Baz"]] *) -val split_fname : string -> string list - (** [split_sname_callback fn s] Same as [split_sname], but call [fn] with substring indices instead of building - a list -*) + a list *) val split_sname_callback : (int -> int -> unit) -> string -> unit (** [split_fname_callback fn s] Same as [split_fname], but call [fn] with substring indices instead of building - a list -*) + a list *) val split_fname_callback : (int -> int -> unit) -> string -> unit + +(** [split_sname s] split the surname [s] in parts composing it. + e.g. [split_sname base "Foo-Bar"] is [[ "Foo" ; "Bar"]] *) +val split_sname : string -> string list + +(** [split_fname s] split the string [s] representing multiple first names + into this list of firstname. + e.g. [split_fname base "Foo-Bar Baz"] is [[ "Foo-Bar" ; "Baz"]] *) +val split_fname : string -> string list \ No newline at end of file From 605d35e2b0df4b8982b0b91977d9d1c6952668c5 Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed Date: Fri, 3 Dec 2021 14:22:56 +0100 Subject: [PATCH 04/73] Util.Buff documentation --- lib/util/buff.ml | 19 ++++++++++++++++--- lib/util/buff.mli | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 lib/util/buff.mli diff --git a/lib/util/buff.ml b/lib/util/buff.ml index 2b42d59045..520a70c5d6 100644 --- a/lib/util/buff.ml +++ b/lib/util/buff.ml @@ -2,12 +2,16 @@ module Make () = struct + let buff = ref (Bytes.create 80) + let store len x = if len >= Bytes.length !buff then buff := Bytes.extend !buff 0 (Bytes.length !buff); Bytes.set !buff len x; succ len + + (* gstore and mstore axillary function *) let unsafe_gstore len s si slen = let newlen = len + slen in if newlen > Bytes.length !buff then @@ -16,16 +20,25 @@ module Make () = end; Bytes.blit_string s si !buff len slen; newlen + let mstore len s = unsafe_gstore len s 0 (String.length s) + let gstore len s si slen = unsafe_gstore len s si (min slen (String.length s - si)) + let get len = Bytes.sub_string !buff 0 len + end +(* Global buffer *) module BB = Make (struct end) -let get = BB.get +let buff = BB.buff + let store = BB.store -let gstore = BB.gstore + let mstore = BB.mstore -let buff = BB.buff + +let gstore = BB.gstore + +let get = BB.get diff --git a/lib/util/buff.mli b/lib/util/buff.mli new file mode 100644 index 0000000000..af07d67f3b --- /dev/null +++ b/lib/util/buff.mli @@ -0,0 +1,46 @@ + +(** Functor building a local implementation of the buffer. *) +module Make : + functor () -> + sig + (** Internal representation of the buffer *) + val buff : bytes ref + + (** [store i c] stores a character [c] at the position [i] inside the buffer. + Automatically extends buffer if needed. Returns the position that follows + inserted character ([i+1]) in buffer. Should be used either with position + 0 or with position returned by previous calls of store functions. *) + val store : int -> char -> int + + (** [mstore i s] stores a string [s] starting from the postion [i] inside the + buffer. Automatically extends buffer if needed. Returns the position that + follows inserted string in buffer. Should be used either with position 0 + or with position returned by previous calls of store functions.*) + val mstore : int -> string -> int + + (** [gstore i s si len] stores substring of [s] from [si] position with length + [len] inside the buffer starting from the postion [i]. Automatically extends + buffer if needed. Returns the position that follows inserted substring in + buffer. Should be used either with position 0 or with position returned + by previous calls of store functions.*) + val gstore : int -> string -> int -> int -> int + + (** [get len] returns buffer's content until position [len] *) + val get : int -> string + + end + +(** Variable [buff] for the global buffer *) +val buff : bytes ref + +(** Function [get] for the global buffer. *) +val get : int -> string + +(** Function [store] for the global buffer. *) +val store : int -> char -> int + +(** Function [mstore] for the global buffer. *) +val mstore : int -> string -> int + +(** Function [gstore] for the global buffer. *) +val gstore : int -> string -> int -> int -> int From 6049131a1ae0e80a095531fcf18cf4ff1020a312 Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed Date: Tue, 7 Dec 2021 17:18:06 +0100 Subject: [PATCH 05/73] [WIP] Def library documentation --- lib/def/adef.ml | 2 ++ lib/def/adef.mli | 54 +++++++++++++++++++++++++++++++++++++-------- lib/def/def.ml | 56 ++++++++++++++++++++++++++++++++++++----------- lib/util/name.mli | 4 ++-- 4 files changed, 92 insertions(+), 24 deletions(-) diff --git a/lib/def/adef.ml b/lib/def/adef.ml index a277107f0a..db3e23068c 100644 --- a/lib/def/adef.ml +++ b/lib/def/adef.ml @@ -35,6 +35,7 @@ type cdate = | Cdate of date | Cnone +(* compress concrete date if it's possible *) let compress d = let simple = match d.prec with @@ -70,6 +71,7 @@ let cdate_of_date d = end | Dtext t -> Ctext t +(* uncompress concrete date *) let uncompress x = let (year, x) = x mod 2500, x / 2500 in let (month, x) = x mod 13, x / 13 in diff --git a/lib/def/adef.mli b/lib/def/adef.mli index b603c4b81d..2c20dfd8ef 100644 --- a/lib/def/adef.mli +++ b/lib/def/adef.mli @@ -1,17 +1,40 @@ (* $Id: adef.mli,v 5.6 2007-02-21 18:14:01 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) +(** Consanguinity degree *) type fix -type cdate -type 'person gen_couple +(** Returns float coefficient of consanguinity degree *) +val float_of_fix : fix -> float + +(** Returns consanguinity degree from its float coefficient *) +val fix_of_float : float -> fix + +(** [fix] from int *) +external fix : int -> fix = "%identity" + +(** [fix] to int *) +external fix_repr : fix -> int = "%identity" + +(** No consanguinity degree *) +val no_consang : fix + +(** Date data type that can be either concrete date associated to a calendar or a textual form of the date. *) type date = Dgreg of dmy * calendar | Dtext of string + +(** Supported calendars *) and calendar = Dgregorian | Djulian | Dfrench | Dhebrew + +(** Concrete date with precision. *) and dmy = { day : int; month : int; year : int; prec : precision; delta : int } + +(** Concrete date without precision. *) and dmy2 = { day2 : int; month2 : int; year2 : int; delta2 : int } + +(** Precision attached to the concrete date. *) and precision = Sure | About @@ -21,25 +44,38 @@ and precision = | OrYear of dmy2 | YearInt of dmy2 -val float_of_fix : fix -> float -val fix_of_float : float -> fix -external fix : int -> fix = "%identity" -external fix_repr : fix -> int = "%identity" - -val no_consang : fix +(** Compressed date *) +type cdate +(** Convert [cdate] to [date] *) val date_of_cdate : cdate -> date + +(** Convert [date] to [cdate] *) val cdate_of_date : date -> cdate +(** Absent compressed date *) val cdate_None : cdate + +(** Optional date from [cdate] *) val od_of_cdate : cdate -> date option + +(** Optional date to [cdate] *) val cdate_of_od : date option -> cdate +(** Polymorphic type to represent a couple of persons. Couple consists of the father and of the mother. *) +type 'person gen_couple + +(** Get father from couple *) val father : 'a gen_couple -> 'a + +(** Get mother from couple *) val mother : 'a gen_couple -> 'a + +(** [couple f m] creates a couple from father [f] and mother [m] *) val couple : 'a -> 'a -> 'a gen_couple + +(** TODO: doc *) val parent : 'a array -> 'a gen_couple val parent_array : 'a gen_couple -> 'a array - val multi_couple : 'a -> 'a -> 'a gen_couple val multi_parent : 'a array -> 'a gen_couple diff --git a/lib/def/def.ml b/lib/def/def.ml index aa91f1b539..29d2a5daf7 100644 --- a/lib/def/def.ml +++ b/lib/def/def.ml @@ -1,5 +1,6 @@ (* Copyright (c) 1998-2007 INRIA *) +(** Http response status *) type httpStatus = | OK (* 200 *) | Moved_Temporarily (* 302 *) @@ -11,21 +12,32 @@ type httpStatus = | Internal_Server_Error (* 500 *) | Service_Unavailable (* 503 *) +(** Type that represents 2 possible choices *) type ('a, 'b) choice = Left of 'a | Right of 'b +(** Alias to [Adef.cdate] *) type cdate = Adef.cdate +(** Alias to [Adef.date] *) type date = Adef.date = Dgreg of dmy * calendar | Dtext of string + +(** Alias to [Adef.calendar] *) and calendar = Adef.calendar = Dgregorian | Djulian | Dfrench | Dhebrew + +(** Alias to [Adef.dmy] *) and dmy = Adef.dmy = { day : int; month : int; year : int; prec : precision; delta : int } + +(** Alias to [Adef.dmy2] *) and dmy2 = Adef.dmy2 = { day2 : int; month2 : int; year2 : int; delta2 : int } + +(** Alias to [Adef.precision] *) and precision = Adef.precision = Sure @@ -36,6 +48,7 @@ and precision = | OrYear of dmy2 | YearInt of dmy2 +(** Relation kind between couple in the familly *) type relation_kind = | Married | NotMarried @@ -49,12 +62,16 @@ type relation_kind = | Pacs | Residence +(** Divorce status *) type divorce = | NotDivorced | Divorced of cdate | Separated +(** Death reason *) type death_reason = Killed | Murdered | Executed | Disappeared | Unspecified + +(** Death status *) type death = NotDead | Death of death_reason * cdate @@ -63,17 +80,22 @@ type death = | DontKnowIfDead | OfCourseDead +(** Burial information *) type burial = UnknownBurial | Buried of cdate | Cremated of cdate +(** Rules for access to the personal data *) type access = IfTitles | Public | Private +(** Title name *) type 'string gen_title_name = Tmain | Tname of 'string | Tnone + +(** Type that represents information nobility title of a person *) type 'string gen_title = { t_name : 'string gen_title_name; t_ident : 'string; @@ -82,8 +104,10 @@ type 'string gen_title = t_date_end : cdate; t_nth : int } +(** Witness kind for an event *) type witness_kind = Witness | Witness_GodParent | Witness_Officer +(** Personal event name. *) type 'string gen_pers_event_name = Epers_Birth | Epers_Baptism @@ -136,6 +160,8 @@ type 'string gen_pers_event_name = | Epers_VenteBien | Epers_Will | Epers_Name of 'string + +(** Personal event information *) type ('person, 'string) gen_pers_event = { epers_name : 'string gen_pers_event_name; epers_date : cdate; @@ -145,6 +171,7 @@ type ('person, 'string) gen_pers_event = epers_src : 'string; epers_witnesses : ('person * witness_kind) array } +(** Event name pertaining a familly. *) type 'string gen_fam_event_name = Efam_Marriage | Efam_NoMarriage @@ -159,6 +186,8 @@ type 'string gen_fam_event_name = | Efam_PACS | Efam_Residence | Efam_Name of 'string + +(** Event information pertaining a familly. *) type ('person, 'string) gen_fam_event = { efam_name : 'string gen_fam_event_name; efam_date : cdate; @@ -168,18 +197,21 @@ type ('person, 'string) gen_fam_event = efam_src : 'string; efam_witnesses : ('person * witness_kind) array } - +(** Relation type with parent *) type relation_type = Adoption | Recognition | CandidateParent | GodParent | FosterParent +(** Relation information with parents *) type ('person, 'string) gen_relation = { r_type : relation_type; r_fath : 'person option; r_moth : 'person option; r_sources : 'string } +(** Sex of person *) type sex = Male | Female | Neuter +(** Place information *) type place = { other : string; town : string; @@ -190,8 +222,7 @@ type place = region : string; country : string } -(* person *) - +(** Polymorphic type describing information about person. *) type ('iper, 'person, 'string) gen_person = { first_name : 'string; surname : 'string; @@ -229,13 +260,12 @@ type ('iper, 'person, 'string) gen_person = psources : 'string; key_index : 'iper } - +(* TODO: doc *) type 'family gen_ascend = { parents : 'family option; consang : Adef.fix } - type 'family gen_union = { family : 'family array } +type 'person gen_descend = { children : 'person array } -(* family *) - +(** Polymorphic type describing information about familly. *) type ('person, 'ifam, 'string) gen_family = { marriage : cdate; marriage_place : 'string; @@ -250,15 +280,16 @@ type ('person, 'ifam, 'string) gen_family = fsources : 'string; fam_index : 'ifam } +(** Alias to [Adef.gen_couple] *) type 'person gen_couple = 'person Adef.gen_couple -type 'person gen_descend = { children : 'person array } - +(** Error describing bad specification of the person *) type 'person error = AlreadyDefined of 'person | OwnAncestor of 'person | BadSexOfMarriedPerson of 'person +(** Warnings attached to the specification of the person, familly, relation, etc. *) type ('iper, 'person, 'family, 'descend, 'title, 'pevent, 'fevent) warning = | BigAgeBetweenSpouses of 'person * 'person * dmy | BirthAfterDeath of 'person @@ -291,18 +322,16 @@ type ('iper, 'person, 'family, 'descend, 'title, 'pevent, 'fevent) warning = | YoungForMarriage of 'person * dmy * 'family | OldForMarriage of 'person * dmy * 'family +(* TODO:doc *) type ('person, 'descend, 'title) misc = MissingSources - type rn_mode = RnAll | Rn1Ln | RnDeg - type base_notes = { nread : string -> rn_mode -> string ; norigin_file : string ; efiles : unit -> string list } -(* Historique des modifications *) - +(** Update history *) type ('iper, 'person, 'family, 'string) base_changed = U_Add_person of ('iper, 'person, 'string) gen_person | U_Modify_person of @@ -334,6 +363,7 @@ type ('iper, 'person, 'family, 'string) base_changed = ('iper, 'person, 'string) gen_person * ('iper, 'person, 'string) gen_person * bool | U_Notes of int option * string +(** TODO : doc *) module NLDB = struct type ('a, 'b) page = | PgInd of 'a diff --git a/lib/util/name.mli b/lib/util/name.mli index 9f62a78e12..6bb97613d9 100644 --- a/lib/util/name.mli +++ b/lib/util/name.mli @@ -50,12 +50,12 @@ val purge : string -> string - no double lowercase consons *) val crush : string -> string -(* Equivalent to [strip o lower]. Used as: +(** Equivalent to [strip o lower]. Used as: - First comparison of names. - Comparison for first names and surnames. *) val strip_lower : string -> string -(* Equivalent to [crush o abbrev o lower]. Used as: +(** Equivalent to [crush o abbrev o lower]. Used as: - Second comparison of names. - Key when index by names *) val crush_lower : string -> string From 19ddd2373fd93ba58b45b67022fbec2f93fd496d Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed Date: Wed, 8 Dec 2021 16:14:06 +0100 Subject: [PATCH 06/73] Util.Secure documentation --- lib/util/opt.mli | 5 +++++ lib/util/secure.ml | 14 ++++++++++++++ lib/util/secure.mli | 17 ++++++++++++++++- 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 lib/util/opt.mli diff --git a/lib/util/opt.mli b/lib/util/opt.mli new file mode 100644 index 0000000000..6493ae3584 --- /dev/null +++ b/lib/util/opt.mli @@ -0,0 +1,5 @@ +val iter : ('a -> unit) -> 'a option -> unit +val map : ('a -> 'b) -> 'a option -> 'b option +val map_default : 'a -> ('b -> 'a) -> 'b option -> 'a +val default : 'a -> 'a option -> 'a +val to_string : string option -> string \ No newline at end of file diff --git a/lib/util/secure.ml b/lib/util/secure.ml index a59c2f58c1..f2a27e7eef 100644 --- a/lib/util/secure.ml +++ b/lib/util/secure.ml @@ -22,17 +22,26 @@ let decompose = in loop [] +(* add asset to the list of allowed to acces assets *) let add_assets d = assets_r := d :: !assets_r ; ok_r := decompose d :: !ok_r +(* set base dir to which acces could be allowed *) let set_base_dir d = let ok = decompose d in bd_r := d ; ok_r := ok :: (List.filter ((<>) ok)) !ok_r +(* get all assets *) let assets () = !assets_r +<<<<<<< HEAD let bd () = !bd_r +======= + +(* get base dir *) +let base_dir () = !bd_r +>>>>>>> f419bfa4e... Util.Secure documentation let suffix d df = let rec loop = @@ -60,7 +69,12 @@ let check fname = in loop !ok_r +<<<<<<< HEAD let check_open fname = +======= +(* Print error message if fname didn't pass the check. else open fname with do_open *) +let check_open do_open fname = +>>>>>>> f419bfa4e... Util.Secure documentation if not (check fname) then begin if Sys.unix then begin diff --git a/lib/util/secure.mli b/lib/util/secure.mli index 7a35f3ea3a..6883b37a12 100644 --- a/lib/util/secure.mli +++ b/lib/util/secure.mli @@ -1,9 +1,15 @@ (* Copyright (c) 1998-2007 INRIA *) +(** Returns list of allowed to acces assets *) val assets : unit -> string list -val bd : unit -> string +(** Returns base directory to which acces is allowed *) +val base_dir : unit -> string + +(** Add new asset to the [assets] list *) val add_assets : string -> unit + +(** Set base directory *) val set_base_dir : string -> unit (** Check if a filename is safe to read or not @@ -11,8 +17,17 @@ val set_base_dir : string -> unit *) val check : string -> bool +(** Secured version of [open_in] *) val open_in : string -> in_channel + +(** Secured version of [open_in_bin] *) val open_in_bin : string -> in_channel + +(** Secured version of [open_out] *) val open_out : string -> out_channel + +(** Secured version of [open_out_bin] *) val open_out_bin : string -> out_channel + +(** Secured version of [open_out_gen] *) val open_out_gen : open_flag list -> int -> string -> out_channel From ef997a0da7e6bf6b4ff21e1426298fe250b96c4c Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed Date: Wed, 8 Dec 2021 16:19:39 +0100 Subject: [PATCH 07/73] Def.Adef documentation --- lib/def/adef.mli | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/def/adef.mli b/lib/def/adef.mli index 2c20dfd8ef..4719afcd06 100644 --- a/lib/def/adef.mli +++ b/lib/def/adef.mli @@ -74,8 +74,14 @@ val mother : 'a gen_couple -> 'a (** [couple f m] creates a couple from father [f] and mother [m] *) val couple : 'a -> 'a -> 'a gen_couple -(** TODO: doc *) +(** Create [gen_couple] from array. First element of array should be father, second - mother *) val parent : 'a array -> 'a gen_couple + +(** Returns array from [gen_couple]. First element of array is father, second - mother *) val parent_array : 'a gen_couple -> 'a array + +(** DEPRECATED, use [couple] instead *) val multi_couple : 'a -> 'a -> 'a gen_couple + +(** DEPRECATED, use [parent] instead *) val multi_parent : 'a array -> 'a gen_couple From 48fbc358b7d50cc10148e873baeb8815f0cc2c81 Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed Date: Wed, 8 Dec 2021 18:04:55 +0100 Subject: [PATCH 08/73] Util.Opt documentatio --- lib/util/opt.mli | 9 +++++++++ lib/util/secure.ml | 11 ----------- lib/util/secure.mli | 2 +- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/lib/util/opt.mli b/lib/util/opt.mli index 6493ae3584..4dc6645a74 100644 --- a/lib/util/opt.mli +++ b/lib/util/opt.mli @@ -1,5 +1,14 @@ +(** [iter f o] if [o=Some x] then executes [f x]. *) val iter : ('a -> unit) -> 'a option -> unit + +(** [map f o] if [o=Some x] then returns [Some (f x)] otherwise returns None. *) val map : ('a -> 'b) -> 'a option -> 'b option + +(** [map_default d f o] if [o=Some x] then returns [(f x)] otherwise returns [d]. *) val map_default : 'a -> ('b -> 'a) -> 'b option -> 'a + +(** [default d o] if [o=Some x] then returns [x] otherwise returns [d]. *) val default : 'a -> 'a option -> 'a + +(** [to_string so] if [so=Some s] then returns [s] otherwise returns empty string. *) val to_string : string option -> string \ No newline at end of file diff --git a/lib/util/secure.ml b/lib/util/secure.ml index f2a27e7eef..d0345f42c6 100644 --- a/lib/util/secure.ml +++ b/lib/util/secure.ml @@ -35,13 +35,7 @@ let set_base_dir d = (* get all assets *) let assets () = !assets_r -<<<<<<< HEAD let bd () = !bd_r -======= - -(* get base dir *) -let base_dir () = !bd_r ->>>>>>> f419bfa4e... Util.Secure documentation let suffix d df = let rec loop = @@ -69,12 +63,7 @@ let check fname = in loop !ok_r -<<<<<<< HEAD let check_open fname = -======= -(* Print error message if fname didn't pass the check. else open fname with do_open *) -let check_open do_open fname = ->>>>>>> f419bfa4e... Util.Secure documentation if not (check fname) then begin if Sys.unix then begin diff --git a/lib/util/secure.mli b/lib/util/secure.mli index 6883b37a12..a6df02ce3d 100644 --- a/lib/util/secure.mli +++ b/lib/util/secure.mli @@ -4,7 +4,7 @@ val assets : unit -> string list (** Returns base directory to which acces is allowed *) -val base_dir : unit -> string +val bd : unit -> string (** Add new asset to the [assets] list *) val add_assets : string -> unit From 2b3788a1fddf19e81affc843b512645cfe98be5e Mon Sep 17 00:00:00 2001 From: Fabrice Le Fessant Date: Sat, 4 Dec 2021 12:35:36 +0100 Subject: [PATCH 09/73] Document lib/util/secure.ml and bin/gwrepl/data.ml --- .gitignore | 2 + bin/gwd/gwd.ml | 4 +- bin/gwrepl/data.mli | 12 ++++++ bin/gwrepl/mk_data.ml | 71 ++++++++++++++++++++------------ lib/GWPARAM.ml | 4 +- lib/gwdb-legacy/iovalue.mli | 20 ++++++--- lib/util.ml | 4 +- lib/util/secure.ml | 35 +++++++++++----- lib/util/secure.mli | 9 ++-- plugins/v7_im/v7_im_sendImage.ml | 2 +- 10 files changed, 110 insertions(+), 53 deletions(-) create mode 100644 bin/gwrepl/data.mli diff --git a/.gitignore b/.gitignore index 405d29eb60..f9b549bd2e 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,5 @@ lib/gwlib.ml # generated by Makefile hd/etc/version.txt +*~ +/_opam diff --git a/bin/gwd/gwd.ml b/bin/gwd/gwd.ml index 6f5b92d632..257f354d1b 100644 --- a/bin/gwd/gwd.ml +++ b/bin/gwd/gwd.ml @@ -659,7 +659,7 @@ let allowed_denied_titles key extra_line env base_env () = if fname = "" then [] else let ic = - Secure.open_in (Filename.concat (Secure.bd ()) fname) + Secure.open_in (Filename.concat (Secure.base_dir ()) fname) in let rec loop set = let (line, eof) = @@ -1930,7 +1930,7 @@ let main () = images_url := "file://" ^ slashify abs_dir end; if !(Util.cnt_dir) = Filename.current_dir_name then - Util.cnt_dir := Secure.bd (); + Util.cnt_dir := Secure.base_dir (); Wserver.stop_server := List.fold_left Filename.concat !(Util.cnt_dir) ["cnt"; "STOP_SERVER"]; let (query, cgi) = diff --git a/bin/gwrepl/data.mli b/bin/gwrepl/data.mli new file mode 100644 index 0000000000..4bb9336351 --- /dev/null +++ b/bin/gwrepl/data.mli @@ -0,0 +1,12 @@ +(* the array of etc/lib/XXX where XXX are either dependencies of geneweb or + geneweb/COMPONENT *) +val directories: string array + +(* associations between file names and their (generated) contents: *) +val cmas : ( string * string ) array (* .cma *) +val cmis : ( string * string ) array (* .cmi *) +val shared : ( string * string ) array (* .so *) + +(* An md5 of all the names of the files in [cmis] and [cmas] (not + their contents). *) +val md5 : string diff --git a/bin/gwrepl/mk_data.ml b/bin/gwrepl/mk_data.ml index df29494b67..36c8c5bc8a 100644 --- a/bin/gwrepl/mk_data.ml +++ b/bin/gwrepl/mk_data.ml @@ -1,3 +1,10 @@ +(* This file is used to generate the file 'data.ml', containing all + the files (cmis, cmas, .so) that could be used at runtime by + a geneweb interpreter. + + See 'data.mli' for the signature of the generated file. *) + + let read_lines p = let rec loop () = match input_line p with | exception End_of_file -> close_in p ; [] @@ -30,34 +37,40 @@ let partition_map p l = let (//) = Filename.concat let () = - let ic = open_in ".depend" in - let lines = read_lines ic in - close_in ic ; - let dune_root = List.hd lines in - let out = List.tl lines in - let root = dune_root // "_build" // "default" // "lib" in let opam_swich_prefix = Sys.getenv "OPAM_SWITCH_PREFIX" in let opam_swich_prefix_lib = opam_swich_prefix // "lib" in - let aux fn = - let aux prefix = - if String.length fn > String.length prefix - && String.sub fn 0 (String.length prefix) = prefix - then Some (String.sub fn (String.length prefix) (String.length fn - String.length prefix)) - else None + + let dune_root, root, ( directories0, files0 ) = + + let ic = open_in ".depend" in + let lines = read_lines ic in + close_in ic ; + let dune_root, out = match lines with + | [] -> assert false + | dune_root :: out -> dune_root, out in - match aux opam_swich_prefix_lib with - | Some x -> Some (`opam x) - | None -> match aux root with - | Some x -> Some (`root x) - | None -> None - in - let directories0, files0 = + let root = dune_root // "_build" // "default" // "lib" in + let aux fn = + let aux prefix = + if String.length fn > String.length prefix + && String.sub fn 0 (String.length prefix) = prefix + then Some (String.sub fn (String.length prefix) (String.length fn - String.length prefix)) + else None + in + match aux opam_swich_prefix_lib with + | Some x -> Some (`opam x) + | None -> match aux root with + | Some x -> Some (`root x) + | None -> None + in + dune_root, root, partition_map begin fun s -> try Scanf.sscanf s {|#directory "%[^"]";;|} (fun s -> match aux s with Some s -> Some (Either.Left s) | _ -> None) with _ -> try Scanf.sscanf s {|#load "%[^"]";;|} (fun s -> match aux s with Some s -> Some (Either.Right s) | _ -> None) with _ -> failwith s end out + in let directories = ("etc" // "lib" // "ocaml") @@ -85,7 +98,13 @@ let () = if Filename.check_suffix (Filename.concat dir s) "cmi" then (Filename.concat dir s, "etc" // "lib" // "geneweb" // Filename.concat (Filename.basename dir) s) :: cmis else cmis - end cmis (Sys.readdir dir) + end cmis ( + try + Sys.readdir dir + with exn -> + Printf.eprintf "Error in Sys.readdir(%S)\n%!" dir; + raise exn + ) in (cmas, cmis) end files0 ([], []) @@ -122,12 +141,12 @@ let () = aux "cmas" cmas end ; begin - Printf.fprintf out {|let shared=[||} ; - if Sys.unix then (* FIXME: what is the windows version? *) - List.iter begin fun s -> - Printf.fprintf out {blob|Filename.(concat "etc" (concat "lib" {|%s|})),[%%blob {|%s|}];|blob} s (opam_swich_prefix_lib // s) ; - end [ "ocaml" // "stublibs" // "dllcamlstr.so" ; "ocaml" // "stublibs" // "dllunix.so"] ; - Printf.fprintf out {||];;|} + Printf.fprintf out {|let shared=[||} ; + if Sys.unix then (* FIXME: what is the windows version? *) + List.iter begin fun s -> + Printf.fprintf out {blob|Filename.(concat "etc" (concat "lib" {|%s|})),[%%blob {|%s|}];|blob} s (opam_swich_prefix_lib // s) ; + end [ "ocaml" // "stublibs" // "dllcamlstr.so" ; "ocaml" // "stublibs" // "dllunix.so"] ; + Printf.fprintf out {||];;|} end ; begin let b = Buffer.create 1024 in diff --git a/lib/GWPARAM.ml b/lib/GWPARAM.ml index 1991ac58dc..93bc58e7b8 100644 --- a/lib/GWPARAM.ml +++ b/lib/GWPARAM.ml @@ -23,9 +23,9 @@ module Default = struct Secure.add_assets Filename.current_dir_name let base_path = fun pref bname -> - List.fold_right Filename.concat (Secure.bd () :: pref) bname + List.fold_right Filename.concat (Secure.base_dir () :: pref) bname - let bpath = fun bname -> Filename.concat (Secure.bd ()) bname + let bpath = fun bname -> Filename.concat (Secure.base_dir ()) bname (** [output_error ?headers ?content conf code] Send the http status [code], [headers] and diff --git a/lib/gwdb-legacy/iovalue.mli b/lib/gwdb-legacy/iovalue.mli index 79ffe28195..e870521cbd 100644 --- a/lib/gwdb-legacy/iovalue.mli +++ b/lib/gwdb-legacy/iovalue.mli @@ -1,19 +1,25 @@ (* $Id: iovalue.mli,v 5.5 2012-01-27 08:53:53 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) +val sizeof_long : int val input : in_channel -> 'a val output : out_channel -> 'a -> unit -val sizeof_long : int -val sign_extend : int -> int - -(* making a header for input_value like output_value does *) - type header_pos + val create_output_value_header : out_channel -> header_pos +val output_block_header : out_channel -> int -> int -> unit + +(* + +val sign_extend : int -> int + +(* making a header for input_value like output_value does *) +*) val patch_output_value_header : out_channel -> header_pos -> int +(* (* generic functions *) type 'a in_funs = @@ -28,8 +34,10 @@ type 'a out_funs = output : 'a -> string -> int -> int -> unit } val gen_output : 'a out_funs -> 'a -> 'b -> unit -val output_block_header : out_channel -> int -> int -> unit val size_32 : int ref val size_64 : int ref + +*) + val output_array_access : out_channel -> (int -> 'a) -> int -> int -> int diff --git a/lib/util.ml b/lib/util.ml index c7a842f198..7ceec8dec9 100644 --- a/lib/util.ml +++ b/lib/util.ml @@ -1890,13 +1890,13 @@ let source_image_file_name bname str = List.fold_right Filename.concat [base_path ["src"] bname; "images"] str in let fname2 = - List.fold_right Filename.concat [Secure.bd (); "src"; "images"] str + List.fold_right Filename.concat [Secure.base_dir (); "src"; "images"] str in if Sys.file_exists fname1 then fname1 else fname2 let image_file_name str = let fname1 = - List.fold_right Filename.concat [Secure.bd (); "images"] str + List.fold_right Filename.concat [Secure.base_dir (); "images"] str in if Sys.file_exists fname1 then fname1 else search_in_assets (Filename.concat "images" str) diff --git a/lib/util/secure.ml b/lib/util/secure.ml index d0345f42c6..5e8021bce1 100644 --- a/lib/util/secure.ml +++ b/lib/util/secure.ml @@ -9,6 +9,8 @@ let ok_r = ref [] let assets_r = ref [] let bd_r = ref Filename.current_dir_name +(* [decompose: string -> string list] decompose a path into a list of + directory and a basename. "a/b/c" -> [ "a" ; "b"; "c" ] *) let decompose = let rec loop r s = let b = Filename.basename s in @@ -35,9 +37,11 @@ let set_base_dir d = (* get all assets *) let assets () = !assets_r -let bd () = !bd_r +let base_dir () = !bd_r -let suffix d df = +(* [list_check_prefix d df] returns either [None] if [d] is not a prefix of + [df], or [Some suffix], where [df = d @ suffix] *) +let list_check_prefix d df = let rec loop = function x :: xl, y :: yl -> if x = y then loop (xl, yl) else None @@ -46,13 +50,19 @@ let suffix d df = in loop (d, df) +(** Check if a filename is safe to read: + * it must not contain the '\000' character + * it must either be relative to the local directory OR + included in one of the allowed directories (base_dir or assets) + * the relative part does not contain the '..' directory +*) let check fname = if String.contains fname '\000' then false else let df = decompose fname in let rec loop = function | d :: dl -> - begin match suffix d df with + begin match list_check_prefix d df with | Some bf -> not (List.mem Filename.parent_dir_name bf) | None -> loop dl end @@ -63,7 +73,7 @@ let check fname = in loop !ok_r -let check_open fname = +let check_open do_open fname = if not (check fname) then begin if Sys.unix then begin @@ -71,11 +81,14 @@ let check_open fname = flush stderr end; raise (Sys_error "invalid access") - end + end ; + do_open fname -let open_in fname = check_open fname; Stdlib.open_in fname -let open_in_bin fname = check_open fname; Stdlib.open_in_bin fname -let open_out fname = check_open fname; Stdlib.open_out fname -let open_out_bin fname = check_open fname; Stdlib.open_out_bin fname -let open_out_gen mode perm fname = - check_open fname; Stdlib.open_out_gen mode perm fname +(* The following functions perform a [check] before opening the file, + preventing potential attacks on the system. +*) +let open_in = check_open Stdlib.open_in +let open_in_bin = check_open Stdlib.open_in_bin +let open_out = check_open Stdlib.open_out +let open_out_bin = check_open Stdlib.open_out_bin +let open_out_gen mode perm = check_open (Stdlib.open_out_gen mode perm) diff --git a/lib/util/secure.mli b/lib/util/secure.mli index a6df02ce3d..bf948e2026 100644 --- a/lib/util/secure.mli +++ b/lib/util/secure.mli @@ -4,7 +4,7 @@ val assets : unit -> string list (** Returns base directory to which acces is allowed *) -val bd : unit -> string +val base_dir : unit -> string (** Add new asset to the [assets] list *) val add_assets : string -> unit @@ -12,8 +12,11 @@ val add_assets : string -> unit (** Set base directory *) val set_base_dir : string -> unit -(** Check if a filename is safe to read or not - (i.e. will not read in a location it is not supposed to read). +(** Check if a filename is safe to read: + * it must not contain the '\000' character + * it must either be relative to the local directory OR + included in one of the allowed directories (base_dir or assets) + * the relative part does not contain the '..' directory *) val check : string -> bool diff --git a/plugins/v7_im/v7_im_sendImage.ml b/plugins/v7_im/v7_im_sendImage.ml index d52ad91f72..7dd4642348 100644 --- a/plugins/v7_im/v7_im_sendImage.ml +++ b/plugins/v7_im/v7_im_sendImage.ml @@ -297,7 +297,7 @@ let effective_send_ok conf base p file = let bfdir = Util.base_path ["images"] conf.bname in if Sys.file_exists bfdir then bfdir else - let d = Filename.concat (Secure.bd ()) "images" in + let d = Filename.concat (Secure.base_dir ()) "images" in let d1 = Filename.concat d conf.bname in (try Unix.mkdir d 0o777 with Unix.Unix_error (_, _, _) -> ()); (try Unix.mkdir d1 0o777 with Unix.Unix_error (_, _, _) -> ()); From 25a5d35384d6870f4222f03d6ea87ff70afb1406 Mon Sep 17 00:00:00 2001 From: Steven de Oliveira Date: Wed, 8 Dec 2021 16:46:12 +0100 Subject: [PATCH 10/73] Adding mlis and documentation --- bin/ged2gwb/ged2gwb.ml | 4 +- bin/gwb2ged/gwb2gedLib.mli | 11 +++++ bin/gwc/db1link.mli | 21 ++++++++++ bin/gwd/gwdLog.mli | 28 +++++++++++++ bin/gwd/gwdPlugin.mli | 15 +++++++ bin/gwd/gwdPluginDep.mli | 10 +++++ bin/gwd/gwdPluginMD5.mli | 1 + bin/gwd/gwdPluginMETA.mli | 7 ++++ bin/gwd/request.mli | 1 - bin/gwd/robot.mli | 52 +++++++++++++++++++++++ bin/gwdiff/gwdiff.ml | 85 +++++++++++++++++++++++++++++++++++++- 11 files changed, 231 insertions(+), 4 deletions(-) create mode 100644 bin/gwb2ged/gwb2gedLib.mli create mode 100644 bin/gwc/db1link.mli create mode 100644 bin/gwd/gwdLog.mli create mode 100644 bin/gwd/gwdPlugin.mli create mode 100644 bin/gwd/gwdPluginDep.mli create mode 100644 bin/gwd/gwdPluginMD5.mli create mode 100644 bin/gwd/gwdPluginMETA.mli create mode 100644 bin/gwd/robot.mli diff --git a/bin/ged2gwb/ged2gwb.ml b/bin/ged2gwb/ged2gwb.ml index 0c93aeab4f..4e72f4d7e7 100644 --- a/bin/ged2gwb/ged2gwb.ml +++ b/bin/ged2gwb/ged2gwb.ml @@ -2786,10 +2786,10 @@ let pass3 gen fname = Some ('1'..'9') -> Stream.junk strm__; let (_ : string) = get_to_eoln 0 strm in loop () - | Some _ -> + | Some c -> Stream.junk strm__; print_location !line_cnt; - Printf.fprintf !log_oc "Strange input.\n"; + Printf.fprintf !log_oc "Strange input '%c' (%i).\n" c (Char.code c); flush !log_oc; let (_ : string) = get_to_eoln 0 strm in loop () | _ -> () diff --git a/bin/gwb2ged/gwb2gedLib.mli b/bin/gwb2ged/gwb2gedLib.mli new file mode 100644 index 0000000000..902f929141 --- /dev/null +++ b/bin/gwb2ged/gwb2gedLib.mli @@ -0,0 +1,11 @@ +(** [gwb2ged with_indexes opts sel] + Converts a Geneweb database to a GEDCOM file. + * `with_indexes` specifies if indexes are printed or not; + * `opts` are the export options + * `sel` is a pair of selectors returned by the database export +*) +val gwb2ged : + bool -> + Gwexport.gwexport_opts -> + (Gwdb.iper -> bool) * (Gwdb.ifam -> bool) + -> unit diff --git a/bin/gwc/db1link.mli b/bin/gwc/db1link.mli new file mode 100644 index 0000000000..496f0c04ae --- /dev/null +++ b/bin/gwc/db1link.mli @@ -0,0 +1,21 @@ +val default_source : string ref + +val do_check : bool ref + +val do_consang : bool ref + +val pr_stats : bool ref + +val particules_file : string ref + +type file_info = { + mutable f_curr_src_file : string; + mutable f_curr_gwo_file : string; + mutable f_separate : bool; + mutable f_bnotes : [ `drop | `erase | `first | `merge ]; + mutable f_shift : int; + mutable f_local_names : (int * int, int) Hashtbl.t; +} + +val link : + (file_info -> unit -> Gwcomp.gw_syntax option) -> string -> bool diff --git a/bin/gwd/gwdLog.mli b/bin/gwd/gwdLog.mli new file mode 100644 index 0000000000..4f47e6af0f --- /dev/null +++ b/bin/gwd/gwdLog.mli @@ -0,0 +1,28 @@ +(** Verbosity level: defines the verbosity level that will + allow the `syslog` function to print anything. *) +val verbosity : int ref + +(** If set to `true`, prints backtrace when printng log. *) +val debug : bool ref + +(** The output channel in which log is written. *) +val oc : out_channel option ref + +(** Prints on `oc` *) +val log : (out_channel -> unit) -> unit + +(** The level of log. *) +type level = [ + | `LOG_EMERG (** Print if `!verbosity >= 0` *) + | `LOG_ALERT (** Print if `!verbosity >= 1` *) + | `LOG_CRIT (** Print if `!verbosity >= 2` *) + | `LOG_ERR (** Print if `!verbosity >= 3` *) + | `LOG_WARNING (** Print if `!verbosity >= 4` *) + | `LOG_NOTICE (** Print if `!verbosity >= 5` *) + | `LOG_INFO (** Print if `!verbosity >= 6` *) + | `LOG_DEBUG (** Print if `!verbosity >= 7` *) + ] + +(** [syslog level msg] + Prints `msg` on `!oc` depending on the verbosity. *) +val syslog : level -> string -> unit diff --git a/bin/gwd/gwdPlugin.mli b/bin/gwd/gwdPlugin.mli new file mode 100644 index 0000000000..5c2d0c6295 --- /dev/null +++ b/bin/gwd/gwdPlugin.mli @@ -0,0 +1,15 @@ +val assets : string ref + +val ht : (string, (string * (Geneweb.Config.config -> Gwdb.base option -> bool))) Hashtbl.t + +val register : + ns:string -> + (string * (string -> Geneweb.Config.config -> Gwdb.base option -> bool)) list -> + unit + +val se : (string * (Geneweb.Config.config -> Gwdb.base option -> unit)) list ref + +val register_se : + ns:string -> + (string -> Geneweb.Config.config -> Gwdb.base option -> unit) -> + unit diff --git a/bin/gwd/gwdPluginDep.mli b/bin/gwd/gwdPluginDep.mli new file mode 100644 index 0000000000..10ecf8bd83 --- /dev/null +++ b/bin/gwd/gwdPluginDep.mli @@ -0,0 +1,10 @@ +type 'a sort_result = Sorted of 'a list | ErrorCycle of 'a list + +(** Given a list of elements (in this case, plugins) and their dependencies, + tries to compute a valid order `l` and return `Sorted l` . + If there is a cycle, returns `ErrorCycle l'` where `l'` is a dependency + cycle. + Uses Kahn's algorithm for cycle detection. + *) +val sort : ('a * 'a list) list -> 'a sort_result + diff --git a/bin/gwd/gwdPluginMD5.mli b/bin/gwd/gwdPluginMD5.mli new file mode 100644 index 0000000000..54fb7b60e4 --- /dev/null +++ b/bin/gwd/gwdPluginMD5.mli @@ -0,0 +1 @@ +val allowed : string -> bool diff --git a/bin/gwd/gwdPluginMETA.mli b/bin/gwd/gwdPluginMETA.mli new file mode 100644 index 0000000000..d38fc780f1 --- /dev/null +++ b/bin/gwd/gwdPluginMETA.mli @@ -0,0 +1,7 @@ +type meta = + { version : string + ; maintainers : string list + ; depends : string list + } + +val parse : string -> meta diff --git a/bin/gwd/request.mli b/bin/gwd/request.mli index a93f050550..98a0d43b21 100644 --- a/bin/gwd/request.mli +++ b/bin/gwd/request.mli @@ -48,7 +48,6 @@ val w_person (**/**) (* Used internally by [gwd]. Not intended to be used by other programs. *) -val special_vars : string list val treat_request : Config.config -> unit (**/**) diff --git a/bin/gwd/robot.mli b/bin/gwd/robot.mli new file mode 100644 index 0000000000..14b13d72da --- /dev/null +++ b/bin/gwd/robot.mli @@ -0,0 +1,52 @@ +(** A module handling robots requests *) +(* S: This module seems obsolete *) + +val magic_robot : string + +module W : Map.S with type key = string + +type norfriwiz = Normal | Friend of string | Wizard of string + +type who = private { + acc_times : float list; (** The timings of the connexion attempts *) + oldest_time : float; (** The first connection in the specified window + (check option -robot-xcl) of time in which successive + connections are attempted. *) + nb_connect : int; (** The number of connection in the specified window. *) + nbase : string; (** Always be equal to conf.bname *) + utype : norfriwiz; (** The kind of robot *) +} + +(** A collection of robots: the list contains forbidden robots and + the map contains accepted (under conditions) robots. *) +type excl = { + mutable excl : (string * int ref) list; + mutable who : who W.t; + mutable max_conn : int * string; +} + +(** Prints an error "Access refuned" in HTML and raises an `Exit` exception. *) +val robot_error : Geneweb.Config.config -> int -> int -> 'a + +(** Reads the content of the admin file managing robots and returns its content + and the full file name. *) +val robot_excl : unit -> excl * string + +val min_disp_req : int ref + +(** [check tm from max_call sec conf suicide] + Returns a tuple containing: + * the number of robots who attempted to connect twice + * the number of wizard robots who attempted to connect twice + * the number of friend robots who attempted to connect twice + * the wizards list and their last connection attempt. + It also updates the robot file by blocking robots who did too many attempts. +*) +val check : + float -> + string -> + int -> + int -> + Geneweb.Config.config -> + bool -> + int * int * int * (string * float) list diff --git a/bin/gwdiff/gwdiff.ml b/bin/gwdiff/gwdiff.ml index edb6ebe916..0fd4ca6c00 100644 --- a/bin/gwdiff/gwdiff.ml +++ b/bin/gwdiff/gwdiff.ml @@ -15,6 +15,8 @@ let html = ref false let root = ref "" let cr = ref "" +(* Messages are printed when there is a difference between a person + present in the two bases explored. *) type messages = MsgBadChild of iper | MsgBirthDate @@ -34,6 +36,9 @@ type messages = | MsgSpouses of iper | MsgSurname +(* [person_string base iper] + Returns the string associated to the person with id `iper` in the base + `base`. *) let person_string base iper = let p = poi base iper in let fn = sou base (get_first_name p) in @@ -42,12 +47,15 @@ let person_string base iper = fn ^ " " ^ sn ^ " (#" ^ string_of_iper iper ^ ")" else fn ^ "." ^ string_of_int (get_occ p) ^ " " ^ sn +(* Returns the string associated to a person in HTML if the html option is set, + otherwise it has the same effect tja, `person_string`. *) let person_link bname base iper target = if !html then Printf.sprintf "%s" !root bname (string_of_iper iper) target (person_string base iper) else person_string base iper +(* Prints a message *) let print_message base1 msg = Printf.printf " "; begin match msg with @@ -81,6 +89,7 @@ let print_message base1 msg = end; Printf.printf "%s" !cr +(* Prints messages associates to the two families identifiers in argument *) let print_f_messages base1 base2 ifam1 ifam2 res = let f1 = foi base1 ifam1 in let f2 = foi base2 ifam2 in @@ -91,19 +100,30 @@ let print_f_messages base1 base2 ifam1 ifam2 res = (person_link !in_file2 base2 (get_father f2) "base2") !cr; List.iter (print_message base1) res +(* Same, but for persons *) let print_p_messages base1 base2 iper1 iper2 res = Printf.printf "%s / %s%s" (person_link !in_file1 base1 iper1 "base1") (person_link !in_file2 base2 iper2 "base2") !cr; List.iter (print_message base1) res +(* [compatible_names src_name dest_name_list] + Returns true if `src_name` is in `dest_name_list` (case insensitive) *) let compatible_names src_name dest_name_list = let src_name = Name.lower src_name in let dest_name_list = List.map Name.lower dest_name_list in List.mem src_name dest_name_list +(* [compatible_str_field istr1 istr2] + Checks the compatibility of two string identifiers, i.e. + if istr1 is not the empty string identifier, then istr2 + must not be. *) let compatible_str_field istr1 istr2 = is_empty_string istr1 || not (is_empty_string istr2) +(* Returns a list of intervals of SDN (SDN 1 is November 25, 4714 BC Gregorian + calendar) of the date in argument. An interval has the format (b, b'), + where b is an optional lower bound (None => no bound), and b' an optional + upper bound. *) let dmy_to_sdn_range_l dmy = let sdn_of_dmy dmy = let sdn = Calendar.sdn_of_gregorian dmy in @@ -130,6 +150,7 @@ let dmy_to_sdn_range_l dmy = in sdn, sdn2 in + (* S: calls to sdn_of_dmy dmy can be factorized *) match dmy.prec with Sure -> let (sdn1, sdn2) = sdn_of_dmy dmy in [Some sdn1, Some sdn2] | Maybe -> @@ -149,9 +170,13 @@ let dmy_to_sdn_range_l dmy = let (_sdn21, sdn22) = sdn_of_dmy (Date.dmy_of_dmy2 dmy2) in [Some sdn11, Some sdn22] +(* [compatible_sdn i1 i2] + Checks if two intervals `i1` and `i2` (as described for `dmy_to_sdn_range_l`) + are compatible, i.e. if i2 is a sub interval of i1. *) let compatible_sdn (sdn11, sdn12) (sdn21, sdn22) = if (sdn21, sdn22) = (None, None) then true else + (* S: Add unit argument to bool2 to make good use of OCaml laziness *) let bool1 = match sdn11, sdn21 with Some sdn1, Some sdn2 -> sdn1 <= sdn2 @@ -166,15 +191,27 @@ let compatible_sdn (sdn11, sdn12) (sdn21, sdn22) = in bool1 && bool2 +(* [compatible_sdn_l l i] + Checks if there exists an interval in `l` that is compatible with `i` *) let compatible_sdn_l sdn1_l sdn2 = + (* S: replace by List.exists *) List.fold_left (fun r sdn1 -> r || compatible_sdn sdn1 sdn2) false sdn1_l +(* [compatible_sdn_l l1 l2] + Checks if for all intervals `i2` in `l2`, there exists an interval `i1` in + `l1` such that `i1` is compatible with `i2` *) let compatible_sdn_ll sdn1_l sdn2_l = List.fold_left (fun r sdn2 -> r && compatible_sdn_l sdn1_l sdn2) true sdn2_l +(* [compatible_dmys d1 d2] + Checks if `d1` is compatible with `d2`, i.e. if despite a potential lack + of precision in the dates, d2 is more precise than d1. *) let compatible_dmys dmy1 dmy2 = compatible_sdn_ll (dmy_to_sdn_range_l dmy1) (dmy_to_sdn_range_l dmy2) +(* [compatible_dates date1 date2] + Same than before, but also checks the kind of date (Dgreg or Dtext) + and, in the first case, if calendars are compatible. *) let compatible_dates date1 date2 = let compatible_cals cal1 cal2 = match cal1, cal2 with @@ -189,6 +226,7 @@ let compatible_dates date1 date2 = | Dgreg (_, _), Dtext _ -> false | Dtext _, _ -> true +(* Same than before, but for Adef.ctype. *) let compatible_cdates cdate1 cdate2 = let od1 = Adef.od_of_cdate cdate1 in let od2 = Adef.od_of_cdate cdate2 in @@ -197,6 +235,12 @@ let compatible_cdates cdate1 cdate2 = | Some _, None -> false | None, _ -> true +(* Checks if birth between two persons are compatible, i.e. if their birth date + (baptism date if birth date not provided) and place are compatible, and + returns a list of messages. + If birth is not provided, checks bathism date instead. + If birth/bathism date are not compatible, the returned list will have MsgBirthDate + If birth place are not compatible, the returned list will have MsgBirthPlace *) let compatible_birth p1 p2 = let get_birth person = if person.birth = Adef.cdate_None then person.baptism else person.birth @@ -212,6 +256,8 @@ let compatible_birth p1 p2 = in res1 @ res2 +(* Same than before, but for death. Messages returned are + MsgDeathDate and MsgDeathPlace *) let compatible_death p1 p2 = let bool1 = p1.death = p2.death || @@ -223,7 +269,7 @@ let compatible_death p1 p2 = DeadDontKnowWhen, (Death (_, _) | DeadYoung | DeadDontKnowWhen) | DontKnowIfDead, _ -> true - | _ -> false) + | _ -> (* S: avoid non-exhaustive pattern matching *) false) in let res1 = if bool1 then [] else [MsgDeathDate] in let res2 = @@ -232,13 +278,21 @@ let compatible_death p1 p2 = in res1 @ res2 +(* [compatible_sexes p1 p2] + Returns [] if `p1` and `p2` have the same sex, [MsgSex] otherwise. *) let compatible_sexes p1 p2 = if p1.sex = p2.sex then [] else [MsgSex] +(* [compatible_occupations p1 p2] + Returns [] if `p1` and `p2` have compatible occupations, [MsgOccupation] otherwise. *) let compatible_occupations p1 p2 = if compatible_str_field p1.occupation p2.occupation then [] else [MsgOccupation] +(* Checks if two persons' names are compatible wrt. their eventual aliases and returns a + list of messages. + If first names are not compatible, the returned list will have MsgFirstName. + If surnames are not compatible, the returned list will have MsgSurname. *) let compatible_persons_ligth base1 base2 p1 p2 = let fn1 = sou base1 p1.first_name in let fn2 = sou base2 p2.first_name in @@ -250,13 +304,19 @@ let compatible_persons_ligth base1 base2 p1 p2 = let res2 = if compatible_names sn1 asn2 then [] else [MsgSurname] in res1 @ res2 +(* Checks if two persons are compatible and returns all the messages associated + to the compatiblity of their name, sex, birth, death and occupation. *) let compatible_persons base1 base2 p1 p2 = compatible_persons_ligth base1 base2 p1 p2 @ compatible_sexes p1 p2 @ compatible_birth p1 p2 @ compatible_death p1 p2 @ compatible_occupations p1 p2 +(* [find_compatible_persons_ligth base1 base2 iper1 iper2_list] + Returns the sublist of persons of `iper2_list` that are compatible with + `iper1` (only checking names). *) let rec find_compatible_persons_ligth base1 base2 iper1 iper2_list = + (* S: not tail recursive, could be *) match iper2_list with [] -> [] | head :: rest -> @@ -266,6 +326,8 @@ let rec find_compatible_persons_ligth base1 base2 iper1 iper2_list = if compatible_persons_ligth base1 base2 p1 p2 = [] then head :: c_rest else c_rest +(* Same than before, but with full compatibility ( name, sex, birth, death and + occupation) *) let rec find_compatible_persons base1 base2 iper1 iper2_list = match iper2_list with [] -> [] @@ -276,6 +338,8 @@ let rec find_compatible_persons base1 base2 iper1 iper2_list = if compatible_persons base1 base2 p1 p2 = [] then head :: c_rest else c_rest +(* Checks if the spouse of the persons (whose id are in argument) are + compatible (only checking names) and returns the associated messages list. *) let compatible_unions base1 base2 iper1 iper2 ifam1 ifam2 = let get_spouse base iper ifam = let f = foi base ifam in @@ -286,6 +350,9 @@ let compatible_unions base1 base2 iper1 iper2 ifam1 ifam2 = let spouse2 = gen_person_of_person (get_spouse base2 iper2 ifam2) in compatible_persons_ligth base1 base2 spouse1 spouse2 +(* [find_compatible_unions base1 base2 iper1 iper2_list ifam1 ifam2_list] + Returns the sublist of families of `ifam2_list` whose union is compatible + (in the sense of `compatible_unions`). *) let rec find_compatible_unions base1 base2 iper1 iper2 ifam1 ifam2_list = match ifam2_list with [] -> [] @@ -297,12 +364,18 @@ let rec find_compatible_unions base1 base2 iper1 iper2 ifam1 ifam2_list = head :: c_rest else c_rest +(* [compatible_divorces d1 d2] + Returns true if divorces are compatible, i.e. if both divorced, then + checking date compatibility, if d1 is a divorce and d2 is not returns + false, otherwise returns true. *) let compatible_divorces d1 d2 = match d1, d2 with Divorced cdate1, Divorced cdate2 -> compatible_cdates cdate1 cdate2 | Divorced _, _ -> false | _ -> true +(* Checks the compatibility of marriages (mariage date, divorce + and mariage place), then print the list of messages calculated. *) let compatible_marriages base1 base2 ifam1 ifam2 = let f1 = gen_family_of_family (foi base1 ifam1) in let f2 = gen_family_of_family (foi base2 ifam2) in @@ -320,12 +393,16 @@ let compatible_marriages base1 base2 ifam1 ifam2 = let res = res1 @ res2 @ res3 in if res = [] then () else print_f_messages base1 base2 ifam1 ifam2 res +(* Calculates the compatibility of two persons and prints the associated + messages *) let pdiff base1 base2 iper1 iper2 = let p1 = gen_person_of_person (poi base1 iper1) in let p2 = gen_person_of_person (poi base2 iper2) in let res = compatible_persons base1 base2 p1 p2 in if res = [] then () else print_p_messages base1 base2 iper1 iper2 res +(* Calculates the compatibility of two persons' families and prints the + associated messages. *) let compatible_parents base1 base2 iper1 iper2 = let a1 = get_parents (poi base1 iper1) in let a2 = get_parents (poi base2 iper2) in @@ -340,7 +417,11 @@ let compatible_parents base1 base2 iper1 iper2 = | Some _, None -> print_p_messages base1 base2 iper1 iper2 [MsgParentsMissing] +(* Checks che compatibility of two persons and their families, and prints it. + This is performed recursively through their descendants *) let rec ddiff base1 base2 iper1 iper2 d_tab = + (* S: Simplify with statement: + let ddiff iper1 iper2 = ddiff base1 base2 iper1 iper2 d_tab *) let d_check = Gwdb.Marker.get d_tab iper1 in if List.mem iper2 d_check then () else @@ -385,6 +466,7 @@ let rec ddiff base1 base2 iper1 iper2 d_tab = let u2 = Array.to_list (get_family (poi base2 iper2)) in pdiff base1 base2 iper1 iper2; List.iter (fu base1 base2 u2) u1 +(* Returns the eldest persons on the base starting from the persons in argument. *) let rec find_top base1 base2 iper1 iper2 = let p1 = gen_person_of_person (poi base1 iper1) in let p2 = gen_person_of_person (poi base2 iper2) in @@ -411,6 +493,7 @@ let rec find_top base1 base2 iper1 iper2 = [] end +(* Same than ddiff, but starting from the eldest ancestors from the persons in argument *) let addiff base1 base2 iper1 iper2 d_tab = let topdiff (iper1, iper2) = Printf.printf "==> %s / %s%s" (person_link !in_file1 base1 iper1 "base1") From 1287ad07a447b962882b663a22ec8627978bf908 Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed Date: Thu, 9 Dec 2021 01:30:46 +0100 Subject: [PATCH 11/73] Util.Lock documentation --- lib/util/lock.mli | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/util/lock.mli b/lib/util/lock.mli index d35152a046..65749472ba 100644 --- a/lib/util/lock.mli +++ b/lib/util/lock.mli @@ -1,12 +1,20 @@ +(** Flag that indicates if the lock should be used. *) val no_lock_flag : bool ref +(** Print lock error message and terminate program. *) val print_error_and_exit : unit -> unit +(** Print message about locked database. *) val print_try_again : unit -> unit +(** [control ~onerror lname wait f] opens file [lname], puts a write lock on it and then calls [f]. + If [wait] is true then if it tries to access locked file it will be blocked until these lock is removed. Otherwise + it will fail, and function [onerror] will be called. If flag [no_lock_flag] is set then returns [f ()] immediatly. *) val control : onerror:(unit -> 'a) -> string -> bool -> (unit -> 'a) -> 'a +(** Tries to call [control] without blocking. If it fail (lock is put) then call again [control] + and waits untill lock is removed. If it fails with another reason calls [onerror]. *) val control_retry : onerror:(unit -> 'a) -> string -> (unit -> 'a) -> 'a From ee4955f03b8eda8757362b15e0b8643cf14cd80d Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed Date: Fri, 10 Dec 2021 16:47:29 +0100 Subject: [PATCH 12/73] Util.ProgrBar documentation --- lib/util/progrBar.ml | 2 ++ lib/util/progrBar.mli | 19 ++++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/lib/util/progrBar.ml b/lib/util/progrBar.ml index 960e57fcd1..e5dd04b35b 100644 --- a/lib/util/progrBar.ml +++ b/lib/util/progrBar.ml @@ -1,6 +1,8 @@ (* $Id: progrBar.ml,v 5.4 2007-02-01 10:28:55 ddr Exp $ *) +(* bar size in characters *) let size = 60 + let draw_rep = 5 let draw = "|/-\\" let empty = ref '.' diff --git a/lib/util/progrBar.mli b/lib/util/progrBar.mli index 9250acb386..eee0f1c99a 100644 --- a/lib/util/progrBar.mli +++ b/lib/util/progrBar.mli @@ -1,11 +1,24 @@ (* $Id: progrBar.mli,v 5.3 2007-02-01 10:28:55 ddr Exp $ *) +(** Character that represents not passed part of progression bar *) +val empty : char ref + +(** Character that represents passed part of progression bar *) +val full : char ref + +(** Prints empty bar with carriage return. *) val start : unit -> unit + +(** [run i len] modifies progression bar that is now filled proportionally to + [i] by comparison with [len]. *) val run : int -> int -> unit + +(** Stop printing progression bar and prints a new line. *) val finish : unit -> unit +(** Stop printing progression bar and prints a new line. *) val suspend : unit -> unit -val restart : int -> int -> unit -val empty : char ref -val full : char ref +(** [restart i len] restart progression bar. It's equivalent to call successively + [run] from 0 to [i]. *) +val restart : int -> int -> unit From a24df824c7d09bb67c9f117f110a06900a259255 Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed Date: Tue, 14 Dec 2021 00:55:38 +0100 Subject: [PATCH 13/73] Util.Mutil documentation --- lib/def/adef.mli | 4 +-- lib/util/mutil.ml | 3 ++ lib/util/mutil.mli | 78 +++++++++++++++++++++++++++++++++++++++------ lib/util/secure.mli | 6 ++-- 4 files changed, 76 insertions(+), 15 deletions(-) diff --git a/lib/def/adef.mli b/lib/def/adef.mli index 4719afcd06..0c35d0b6a4 100644 --- a/lib/def/adef.mli +++ b/lib/def/adef.mli @@ -80,8 +80,8 @@ val parent : 'a array -> 'a gen_couple (** Returns array from [gen_couple]. First element of array is father, second - mother *) val parent_array : 'a gen_couple -> 'a array -(** DEPRECATED, use [couple] instead *) +(** @deprecated Use [couple] instead *) val multi_couple : 'a -> 'a -> 'a gen_couple -(** DEPRECATED, use [parent] instead *) +(** @deprecated Use [parent] instead *) val multi_parent : 'a array -> 'a gen_couple diff --git a/lib/util/mutil.ml b/lib/util/mutil.ml index 24efefba4c..3b78fb99bb 100644 --- a/lib/util/mutil.ml +++ b/lib/util/mutil.ml @@ -472,6 +472,7 @@ let input_lexicon lang ht open_fname = || (String.unsafe_get a i = String.unsafe_get b i && aux a b (i - 1) ) in + (* find header *) let rec key () = match input_line ic with | exception End_of_file -> close_in ic @@ -484,6 +485,7 @@ let input_lexicon lang ht open_fname = && String.unsafe_get line 3 = ' ' then trad (String.sub line 4 (len - 4)) else key () + (* find a line corresponding to a language *) and trad k = match input_line ic with | exception End_of_file -> close_in ic @@ -1023,6 +1025,7 @@ let rev_input_line ic pos (rbuff, rpos) = decr rpos; Bytes.unsafe_get !rbuff !rpos in + (* reverse buffer *) let get_n_reset () = let s = Buffer.to_bytes rev in let n = Bytes.length s in diff --git a/lib/util/mutil.mli b/lib/util/mutil.mli index d985d309e6..d67a9064a4 100644 --- a/lib/util/mutil.mli +++ b/lib/util/mutil.mli @@ -1,14 +1,32 @@ (* Copyright (c) 2006-2007 INRIA *) -val int_size : int +(** Global variable that indicates either + servers should be in verbose mode. *) val verbose : bool ref +(** [list_iter_first f l] iter over first element with [f true] and over others with [f false]. *) val list_iter_first : (bool -> 'a -> unit) -> 'a list -> unit + +(** Remove all trailing spaces in string *) val strip_all_trailing_spaces : string -> string +(* [decline dform dformat] encode name that could be declined (like in the czech language) + and its declination form in more comprehensible for computer format. + Declination form [dform] is one of the follows: + - 'n' for nominative + - 'a' for accusative + - 'g' for genitif + Declination format [dformat] describes how does a name changes throughout different + declination forms comparing to the nominative form. + See {{: https://geneweb.tuxfamily.org/wiki/declension }Declination in Geneweb} for more details. + Example 1: [decline 'a' "Vladana:a:Vladanu:g:Vladany"] returns encoding "@(@(a)@(a?Vladanu:g?Vladany:Vladana))." + Example 2: [decline 'a' "Vladana:a:-u:g:-y"] returns encoding "@(@(a)Vladan@(a?u:g?y:a))" + @deprecated *) val decline : char -> string -> string -val nominative : string -> string +(** Encodes name for nominative declination format. + @deprecated *) +val nominative : string -> string (** [mkdir_p ?perm dir] Create the directory [dir]. @@ -16,23 +34,48 @@ val nominative : string -> string *) val mkdir_p : ?perm:int -> string -> unit +(** Remove every file in the directory and then remove the directory itself *) val remove_dir : string -> unit + +(** Create a lock file (with extension .lck). Result is generally used as an + argument for [Lock.control] function. *) val lock_file : string -> string -val name_key : string -> string +(** Returns position of first capital letter in the name (0 if no capitals). *) val initial : string -> int + +(** [input_particles fname] read file and returns list of lines. + Empty lines are skipped. *) val input_particles : string -> string list + +(** Divide surnames on pieces. Every separated word that contains at least 4 character + forms one piece. Words that contains less than 4 characters or words "saint" and "sainte" + are considered as the particles and are attached to the another word to form a piece. + If string contains less than two pieces, returns an empty list. *) val surnames_pieces : string -> string list +(** Convert encoded string with ISO 8859-1 to UTF 8 *) val utf_8_of_iso_8859_1 : string -> string + +(** Convert encoded string with UTF 8 to ISO 8859-1 *) val iso_8859_1_of_utf_8 : string -> string +(** Convert arabic number (int) to roman (string). Number should be < 4000. *) val roman_of_arabian : int -> string + +(** Convert roman number (string) to arabic (int). Number should be less or equal + to MMMCMXCIX (3999). *) val arabian_of_roman : string -> int +(** [input_lexicon lang ht open_file] open {i lexicon.txt} file with [open_file ()], + parse it and fill [ht] where key is a section name (in english) and value is + a coresponding traduction associated to a [lang] language code. If traduction + line has a form [->: sect] it associates to the current section name the value + associated to [sect] section name inside [ht]. *) val input_lexicon : string -> (string, string) Hashtbl.t -> (unit -> in_channel) -> unit +(** Set of strings *) module StrSet : Set.S with type elt = string (** [tr c1 c2 str] @@ -44,7 +87,7 @@ module StrSet : Set.S with type elt = string val tr : char -> char -> string -> string (** [unsafe_tr c1 c2 str] - Update [str] in place. Replace all occurences of [c1] replaced by [c2]. + Update [str] in place. Replace all occurences of [c1] by [c2]. *) val unsafe_tr : char -> char -> string -> string @@ -99,7 +142,9 @@ val compile_particles : string list -> Re.re If no such [p] exists, empty string [""] is returned. *) val get_particle : Re.re -> string -> string -(** [compare_after_particle particles s1 s2] *) +(** [compare_after_particle particles s1 s2] + compare strings [s1] [s2] starting from the first character after + particle's match. If they are equal, compare particles. *) val compare_after_particle : Re.re -> string -> string -> int (** [rm fname] @@ -153,7 +198,8 @@ val list_slice : int -> int -> 'a list -> 'a list *) val check_magic : string -> in_channel -> bool -(** Magic string generated from the md5sum of the running executable. +(** Magic string are either get from {i GW_EXECUTABLE_MAGIC} environement variable + either generated from the md5sum of the running executable. It can be used for volatile files which can be easily corrupted by any change in program or data representation. *) @@ -187,7 +233,9 @@ val array_forall2 : ('a -> 'b -> bool) -> 'a array -> 'b array -> bool *) val list_replace : 'a -> 'a -> 'a list -> 'a list -(** [list_except old_v new_v list] *) +(** [list_except x list] + Return a list containing all the elements from [list] + except the first occurence of [x]. *) val list_except : 'a -> 'a list -> 'a list (** [list_index element list] @@ -220,8 +268,12 @@ val input_file_ic : in_channel -> string *) val normalize_utf_8 : string -> string +(** [list_map_sort_uniq f l] apply [f] to every element and return + sorted with Merge Sort algorithm list where every element is unique. *) val list_map_sort_uniq : ('a -> 'b) -> 'a list -> 'b list +(** [list_rev_map_append f l1 l2] apply [f] to every element in [l1], reverse it and + concat with [l2]. *) val list_rev_map_append : ('a -> 'b) -> 'a list -> 'b list -> 'b list (** [read_or_create_channel ?magic fname read write] @@ -267,6 +319,7 @@ val read_or_create_value *) val bench : string -> (unit -> 'a) -> 'a +(** Prints call stack on stderr with at most [max] entries. *) val print_callstack : ?max:int -> unit -> unit (** [encode s] @@ -297,7 +350,8 @@ val gen_decode : bool -> string -> string Answers the empty string if the parameter is not found. *) val extract_param : string -> char -> string list -> string -(** Print a date using "%04d-%02d-%02d %02d:%02d:%02d" format. *) +(** Print a date using "%04d-%02d-%02d %02d:%02d:%02d" format + Example : 2021-12-13 22:35:08. *) val sprintf_date : Unix.tm -> string (** [rev_input_line ic pos (rbytes, rpos)] @@ -307,7 +361,11 @@ val sprintf_date : Unix.tm -> string character at the end, and the position of the first character of the returned line (to be used with next [rev_input_line] call). - [rpos] and [rbytes] must be the same in each subsequents calls + [rpos] and [rbytes] are intermediate between [ic] and reading functions. + At the beginig when [!rpos = 0] and [rbytes] is empty, initialise buffer with + the size = 1024, then reads last 1024 characters from [ci]. When [rpos] comes + down to 0, resize buffer *2 and reads 2048 characters before 1024 last + characters. [rpos] and [rbytes] must be the same in each subsequents calls Raises [End_of_file] if the beginning of the file is reached at the beginning of line. @@ -330,7 +388,7 @@ val search_asset_opt : string -> string option *) val eq_key : (string * string * int) -> (string * string * int) -> bool -(** [ls_rs dirs] +(** [ls_r dirs] List directories (and subdirectories) contents of [dirs], including [dirs] themselves. *) val ls_r : string list -> string list diff --git a/lib/util/secure.mli b/lib/util/secure.mli index bf948e2026..38a767dace 100644 --- a/lib/util/secure.mli +++ b/lib/util/secure.mli @@ -13,10 +13,10 @@ val add_assets : string -> unit val set_base_dir : string -> unit (** Check if a filename is safe to read: - * it must not contain the '\000' character - * it must either be relative to the local directory OR + - it must not contain the '\000' character + - it must either be relative to the local directory OR included in one of the allowed directories (base_dir or assets) - * the relative part does not contain the '..' directory + - the relative part does not contain the '..' directory *) val check : string -> bool From ea9be183ebca2cf725747467796c4d92b6dedd93 Mon Sep 17 00:00:00 2001 From: Steven de Oliveira Date: Tue, 14 Dec 2021 14:06:57 +0100 Subject: [PATCH 14/73] Adding types of hashtable in gwu --- bin/gwu/gwuLib.ml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/bin/gwu/gwuLib.ml b/bin/gwu/gwuLib.ml index 7f992ffff7..e3081459d5 100644 --- a/bin/gwu/gwuLib.ml +++ b/bin/gwu/gwuLib.ml @@ -12,6 +12,12 @@ let raw_output = ref false let sep_limit = ref 21 let separate_list = ref [] +(* Returns true if `old_gw` is `true` and there exist an event associated to a + person that: + * is either a birth, baptism, death, burial or a cremation and is associated to + a note or a witness; + * is any other event. + Otherwise, returns false *) let put_events_in_notes base p = (* Si on est en mode old_gw, on mets tous les évènements *) (* dans les notes. *) @@ -33,9 +39,9 @@ let put_events_in_notes base p = loop (get_pevents p) else false -let ht_dup_occ = Hashtbl.create 20001 +let (ht_dup_occ : (Gwdb.iper, int) Hashtbl.t) = Hashtbl.create 20001 -let ht_orig_occ = Hashtbl.create 20001 +let (ht_orig_occ : (string, int list) Hashtbl.t) = Hashtbl.create 20001 let prepare_free_occ ?(select = fun _ -> true) base = (* Parce qu'on est obligé ... *) From f227e708829249af4f310fb0a163cc59688f7bcb Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed Date: Tue, 14 Dec 2021 15:07:28 +0100 Subject: [PATCH 15/73] Util.Calendar documentation --- lib/util/calendar.ml | 3 +++ lib/util/calendar.mli | 31 +++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/lib/util/calendar.ml b/lib/util/calendar.ml index efc8344d66..01cfe1924b 100644 --- a/lib/util/calendar.ml +++ b/lib/util/calendar.ml @@ -1,5 +1,8 @@ +(** Convert [Adef.date] to Calendars.d *) let to_calendars : Def.dmy -> Calendars.d = fun { Def.day ; month ; year ; delta ; _ } -> { Calendars.day ; month ; year ; delta } + +(** Convert Calendars.d to [Adef.date] *) let of_calendars : ?prec:Def.precision -> Calendars.d -> Def.dmy = fun ?(prec = Def.Sure) { Calendars.day ; month ; year ; delta } -> { Def.day ; month ; year ; delta ; prec } diff --git a/lib/util/calendar.mli b/lib/util/calendar.mli index 3430d0a5b2..e52a50a545 100644 --- a/lib/util/calendar.mli +++ b/lib/util/calendar.mli @@ -1,20 +1,51 @@ +(** Returns date of gregorian calendar from SDN and specified precision. *) val gregorian_of_sdn : Def.precision -> int -> Def.dmy + +(** Returns date of julian calendar from SDN and specified precision. *) val julian_of_sdn : Def.precision -> int -> Def.dmy + +(** Returns date of french calendar from SDN and specified precision. *) val french_of_sdn : Def.precision -> int -> Def.dmy + +(** Returns date of hebrew calendar from SDN and specified precision. *) val hebrew_of_sdn : Def.precision -> int -> Def.dmy +(** Returns SDN of the date of gregorian calendar. *) val sdn_of_gregorian : Def.dmy -> int + +(** Returns SDN of the date of julian calendar. *) val sdn_of_julian : Def.dmy -> int + +(** Returns SDN of the date of french calendar. *) val sdn_of_french : Def.dmy -> int + +(** Returns SDN of the date of hebrew calendar. *) val sdn_of_hebrew : Def.dmy -> int +(** Converts julian calendar's date to gregorian. *) val gregorian_of_julian : Def.dmy -> Def.dmy + +(** Converts gregorian calendar's date to julian date. *) val julian_of_gregorian : Def.dmy -> Def.dmy + +(** Converts french calendar's date to gregorian date. *) val gregorian_of_french : Def.dmy -> Def.dmy + +(** Converts gregorian calendar's date to french date. *) val french_of_gregorian : Def.dmy -> Def.dmy + +(** Converts hebrew calendar's date to gregorian date. *) val gregorian_of_hebrew : Def.dmy -> Def.dmy + +(** Converts gregorian calendar's date to hebrew date. *) val hebrew_of_gregorian : Def.dmy -> Def.dmy +(** Moon phases *) type moon_phase = NewMoon | FirstQuarter | FullMoon | LastQuarter +(** Returns information about moon phase from the given SDN. + Result [(Some (mph,h,m), day)] describes moon phase [mph], hour [h] and minute + [m] when this phase appears and days [day] since last New Moon phase (moon's age). + If result is [(None,_)], it tells that there wasn't any moon's phase (one + of the mentionned in [moon_phase]) this day. *) val moon_phase_of_sdn : int -> (moon_phase * int * int) option * int From 59f0326f487d66542b0e906e33429ede88ee56a2 Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed Date: Wed, 15 Dec 2021 14:32:01 +0100 Subject: [PATCH 16/73] Util.Date documentation --- lib/util/date.mli | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/util/date.mli b/lib/util/date.mli index 08ffaab717..a5cc588a0b 100644 --- a/lib/util/date.mli +++ b/lib/util/date.mli @@ -2,8 +2,11 @@ open Def +(** Says if the given year is a leap year. *) val leap_year : int -> bool +(** Returns number of days for the given month and year for + gregorian calendar. Takes into account leap years. *) val nb_days_in_month : int -> int -> int (** [time_elapsed start stop] @@ -15,6 +18,7 @@ val nb_days_in_month : int -> int -> int - [Before] for "less than" duration - [After] for "more than" duration - [Maybe] for other cases + Used to compare only gregorian calendar's dates. *) val time_elapsed : Def.dmy -> Def.dmy -> Def.dmy @@ -23,6 +27,7 @@ val time_elapsed : Def.dmy -> Def.dmy -> Def.dmy (e.g. time_elapsed_opt /1839 /1859). *) val time_elapsed_opt : Def.dmy -> Def.dmy -> Def.dmy option +(** Returns date of death if present. *) val date_of_death : Def.death -> Adef.date option (** [dmy_of_dmy2 dmy2] @@ -31,8 +36,8 @@ val dmy_of_dmy2 : dmy2 -> dmy (** [Not_comparable] is raised by [compare_dmy] and [compare_date] when [strict] mode is used and precision of dates are incompatibles to - have a reliable result - (e.g. is [compare_dmy 2019 07/2019]) *) + have a reliable result (e.g. is [compare_dmy 2019 07/2019]) or when + one of the date in [compare_date] is [Dtext]. *) exception Not_comparable (** [compare_dmy ?strict d1 d2] From 24f8b4b2aa6642940880a0f0a534d9c3070b4fac Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed Date: Wed, 15 Dec 2021 16:19:24 +0100 Subject: [PATCH 17/73] Util.Pqueue documentation --- lib/util/pqueue.mli | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/util/pqueue.mli b/lib/util/pqueue.mli index fb9f9d930a..76f14743b4 100644 --- a/lib/util/pqueue.mli +++ b/lib/util/pqueue.mli @@ -5,7 +5,7 @@ (** This module implements priority queues, given a total ordering function over the elements inserted. All operations are purely applicative (no side effects). - The implementation uses binomial queues from Chris Okasak. + The implementation uses binomial queues from Chris Okasaki. "add", "take" and "union" are in o(log n) in the worst case. *) (** The input signature of the functor [Pqueue.Make]. @@ -15,6 +15,7 @@ first argument is less or equal to the second one. *) module type OrderedType = sig type t val leq : t -> t -> bool end +(** Output signature for priority queue *) module type S = sig (** Type of elementes contained in priority queues. *) @@ -36,8 +37,10 @@ module type S = sig raises [Not_found] when [x] is empty. *) val take : t -> elt * t + (** [union q1 q2] returns heap constructed by union of [q1] [q2] *) val union : t -> t -> t end +(** Functor that creates instance of priority queue from given element type. *) module Make (Ord : OrderedType) : S with type elt = Ord.t From 482a6f50f2a32e82e01e7f8abee20d371b7875d1 Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed Date: Wed, 15 Dec 2021 21:03:37 +0100 Subject: [PATCH 18/73] Util.Futil documentation --- lib/def/def.ml | 2 +- lib/util/futil.mli | 52 ++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/lib/def/def.ml b/lib/def/def.ml index 29d2a5daf7..2d7cfa8841 100644 --- a/lib/def/def.ml +++ b/lib/def/def.ml @@ -95,7 +95,7 @@ type 'string gen_title_name = | Tname of 'string | Tnone -(** Type that represents information nobility title of a person *) +(** Type that represents information about nobility title of a person *) type 'string gen_title = { t_name : 'string gen_title_name; t_ident : 'string; diff --git a/lib/util/futil.mli b/lib/util/futil.mli index 5a74d5c54d..25be248989 100644 --- a/lib/util/futil.mli +++ b/lib/util/futil.mli @@ -2,12 +2,19 @@ open Def +(** Convert generic type used to represent name, id and the place of [Def.gen_title] into + another one. If [fd] is present, apply it on the date of the start and date of the end of a title *) val map_title_strings : ?fd:(Def.date -> Def.date) -> ('a -> 'b) -> 'a gen_title -> 'b gen_title +(** Convert: + - Generic type used to represent witnesses of [Def.gen_pers_event] into another one. + - Generic type used to represent name, place, reason, note and source of [Def.gen_pers_event] + into another one. + If [fd] is present, apply it on date of the personal event. *) val map_pers_event : ?fd:(Def.date -> Def.date) -> ('a -> 'c) @@ -15,6 +22,11 @@ val map_pers_event -> ('a, 'b) gen_pers_event -> ('c, 'd) gen_pers_event +(** Convert: + - Generic type used to represent witnesses of [Def.gen_fam_event] into another one. + - Generic type used to represent name, place, reason, note and source of [Def.gen_fam_event] + into another one. + If [fd] is present, apply it on date of the familial event. *) val map_fam_event : ?fd:(Def.date -> Def.date) -> ('a -> 'c) @@ -22,9 +34,19 @@ val map_fam_event -> ('a, 'b) gen_fam_event -> ('c, 'd) gen_fam_event +(** Convert: + - Generic type used to represent father and mother inside [Def.gen_relation] into another one. + - Generic type used to represent sources of [Def.gen_relation] into another one. *) val map_relation_ps : ('a -> 'c) -> ('b -> 'd) -> ('a, 'b) gen_relation -> ('c, 'd) gen_relation +(** Convert: + - Generic type used to represent related persons (parents, witnesses of a personal event, etc.) + of [Def.gen_person] into another one. + - Generic type used to represent another large part of information of [Def.gen_person] + into another one. + If [fd] is present, apply it on every date (birth, death, titles,, personal events, etc.). + Generic type that is used to represent indexation key isn't converted. *) val map_person_ps : ?fd:(Def.date -> Def.date) -> ('b -> 'd) @@ -32,9 +54,21 @@ val map_person_ps -> ('a, 'b, 'c) gen_person -> ('a, 'd, 'e) gen_person +(** Convert generic type used to represent familly inside [Def.gen_ascend] into + another one. *) val map_ascend_f : ('a -> 'b) -> 'a gen_ascend -> 'b gen_ascend + +(** Convert generic type used to represent one of the famillies inside [Def.gen_union] into + another one. *) val map_union_f : ('a -> 'b) -> 'a gen_union -> 'b gen_union +(** Convert: + - Generic type used to represent faimily indexation key into another one. + - Generic type used to represent witnesses (of the marriage or of a famillial events, etc.) + of [Def.gen_family] into another one. + - Generic type used to represent another large part of information of [Def.gen_family] + into another one. + If [fd] is present, apply it on it on every date (marriage, divorce, famillial events, etc.).*) val map_family_ps : ?fd:(Def.date -> Def.date) -> ('a -> 'b) @@ -43,16 +77,30 @@ val map_family_ps -> ('a, 'c, 'e) gen_family -> ('b, 'd, 'f) gen_family +(** Convert generic type used to represent father and mother inside [Def.gen_couple] into + another one. If first argument is true then use multi-parent functionality. *) val map_couple_p : bool -> ('a -> 'b) -> 'a gen_couple -> 'b gen_couple + +(** @deprecated Use [Adef.parent] instead. *) +val parent : bool -> 'a array -> 'a gen_couple + +(** Convert generic type used to represent children inside [Def.gen_descend] into + another one.*) val map_descend_p : ('a -> 'b) -> 'a gen_descend -> 'b gen_descend +(** Says if two lists with different element's type are equal with given comparison + function. *) val eq_lists : ('a -> 'b -> bool) -> 'a list -> 'b list -> bool + +(** Says if two titles with different types are equal with given comparison + function. *) val eq_titles : ('a -> 'b -> bool) -> 'a gen_title -> 'b gen_title -> bool + +(** Says if two title names with different types are equal with given comparison + function. *) val eq_title_names : ('a -> 'b -> bool) -> 'a gen_title_name -> 'b gen_title_name -> bool -val parent : bool -> 'a array -> 'a gen_couple - (** Return a list of string corresponding to various mix between all kind of names. It can contain duplicates. Strings are used raw (not lowered). From 37c489b9189194c57865b53fa168dee4e1eb73ff Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed Date: Thu, 16 Dec 2021 00:28:05 +0100 Subject: [PATCH 19/73] Gwdb-legacy.Btree documentation --- lib/gwdb-legacy/btree.mli | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 lib/gwdb-legacy/btree.mli diff --git a/lib/gwdb-legacy/btree.mli b/lib/gwdb-legacy/btree.mli new file mode 100644 index 0000000000..22f93bdec8 --- /dev/null +++ b/lib/gwdb-legacy/btree.mli @@ -0,0 +1,34 @@ + +(** Input signature of the functor [Btree.Make]. *) +module type OrderedType = sig type t val compare : t -> t -> int end + +(** Output signature of the functor [Btree.Make]. *) +module type S = + sig + + (** Same as {!Stdlib.Map.S.key} *) + type key + + (** Same as {!Stdlib.Map.S.t} *) + type +'a t + + (** Same as {!Stdlib.Map.S.mem} *) + val mem : key -> 'a t -> bool + + (** Same as {!Stdlib.Map.S.add} *) + val add : key -> 'a -> 'a t -> 'a t + + (** Same as {!Stdlib.Map.S.find} *) + val find : key -> 'a t -> 'a + + (** [key_after f_compare m] browse map [m] to find the key [k] which + gives [f_compare k = 0]. Raise [Not_found] if such key doesn't exists. *) + val key_after : (key -> int) -> 'a t -> key + + (** [next k bt] returns the smallest key that is bigger then [k] inside [bt]. *) + val next : key -> 'a t -> key + end + +(** Functor building an implementation of the map structure given a + totally ordered type. *) +module Make : functor (Ord : OrderedType) -> S \ No newline at end of file From 113fe80215d9bce7b212e72309ba0c3bd8e7aed5 Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed Date: Thu, 16 Dec 2021 01:22:24 +0100 Subject: [PATCH 20/73] mend --- lib/gwdb-legacy/btree.mli | 2 +- lib/gwdb-legacy/database.ml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/gwdb-legacy/btree.mli b/lib/gwdb-legacy/btree.mli index 22f93bdec8..ac58e45f7d 100644 --- a/lib/gwdb-legacy/btree.mli +++ b/lib/gwdb-legacy/btree.mli @@ -31,4 +31,4 @@ module type S = (** Functor building an implementation of the map structure given a totally ordered type. *) -module Make : functor (Ord : OrderedType) -> S \ No newline at end of file +module Make : functor (Ord : OrderedType) -> S with type key = Ord.t \ No newline at end of file diff --git a/lib/gwdb-legacy/database.ml b/lib/gwdb-legacy/database.ml index ba849c8316..3d23af6c51 100644 --- a/lib/gwdb-legacy/database.ml +++ b/lib/gwdb-legacy/database.ml @@ -595,12 +595,12 @@ let make_visible_record_access bname persons = (* Synchro: - - synchro_person contient la liste des ip des personnes patches. - - synchro_family contient la liste des ifam des familles patches. + - synchro_person contient la liste des ip des personnes patch�es. + - synchro_family contient la liste des ifam des familles patch�es. - synchro_patch contient : * le timestamp de la modification - * la liste des personnes modifies - * la liste des familles modifies + * la liste des personnes modifi�es + * la liste des familles modifi�es *) let synchro_person = ref [] let synchro_family = ref [] From 5e4156e0cf00ddcd6564be7c48cf4730e14233c6 Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed Date: Mon, 20 Dec 2021 02:09:05 +0100 Subject: [PATCH 21/73] Gwc full documentation --- bin/gwc/db1link.ml | 323 ++++++++++++++++++++++++++++++++++++++++++-- bin/gwc/db1link.mli | 7 + bin/gwc/gwc.ml | 13 ++ bin/gwc/gwcomp.ml | 202 ++++++++++++++++++++++++--- bin/gwc/gwcomp.mli | 76 +++++++++-- lib/def/adef.mli | 3 +- lib/def/def.ml | 44 ++++-- lib/util/futil.mli | 2 +- lib/util/mutil.mli | 2 +- 9 files changed, 615 insertions(+), 57 deletions(-) diff --git a/bin/gwc/db1link.ml b/bin/gwc/db1link.ml index cbcd9f9d50..fef834900c 100644 --- a/bin/gwc/db1link.ml +++ b/bin/gwc/db1link.ml @@ -7,18 +7,37 @@ open Def (* From OCaml manual, integer in binary format is 4 bytes long. *) let sizeof_long = 4 +(** Default source field for persons and families without source data *) let default_source = ref "" + +(** Base consistency check *) let do_check = ref true + +(** Compute consanguinity *) let do_consang = ref false + +(** Print base's statistics *) let pr_stats = ref false +(** Extended person's entry in the base *) type person = (int, int, int) Def.gen_person + +(** Person's ascendants entry in the base *) type ascend = int Def.gen_ascend + +(** Person's union entry in the base *) type union = int Def.gen_union + +(** Family's entry in the base *) type family = (int, int, int) Def.gen_family + +(** Family's couple entry in the base *) type couple = int Def.gen_couple + +(** Family's descendants entry in the base *) type descend = int Def.gen_descend +(** Restricted to the minimum [Def.gen_person] data type. *) type ('person, 'string) gen_min_person = { mutable m_first_name : 'string; mutable m_surname : 'string; @@ -29,83 +48,159 @@ type ('person, 'string) gen_min_person = mutable m_sex : sex; mutable m_notes : 'string } +(** Person's entry in the base *) type min_person = (int, int) gen_min_person +(** State of the base collecting all information at link time used to + create further Geneweb database *) type cbase = - { mutable c_persons : min_person array + { + (* Array of persons. Person at position [i] has corresponding to him [ascend] + and [union] at position [i] in [c_ascends] and [c_unions] respectively. *) + mutable c_persons : min_person array + (* Array of ascendants of persons *) ; mutable c_ascends : ascend array + (* Array of unions of persons *) ; mutable c_unions : union array + (* Array of families. Family at position [i] has corresponding to it [couple] + and [descend] at position [i] in [c_couples] and [c_descends] respectively. *) ; mutable c_families : family array + (** Array of couples of families *) ; mutable c_couples : couple array + (* Array of descendants of families *) ; mutable c_descends : descend array + (* Array of unique strings. Stores every string encoded information + (like person's name, bithplace, etc.) for other entries in the base. *) ; mutable c_strings : string array + (* Data base notes and extended page structure *) ; mutable c_bnotes : Def.base_notes } +(** Information about current .gwo file. *) type file_info = - { mutable f_curr_src_file : string + { + (* current .gw filename *) + mutable f_curr_src_file : string + (* current .gwo filename *) ; mutable f_curr_gwo_file : string - ; mutable f_separate : bool + (* all persons from current file should be separated *) + ; mutable f_separate : bool + (* behavior for base notes from current file *) ; mutable f_bnotes : [ `merge | `erase | `first | `drop ] + (* shift all persons from the current file with the given number *) ; mutable f_shift : int + (* Table that associates person's names hash and its occurence number + with the index of person's entry inside the [base]. Contains only + persons from the local file. *) ; mutable f_local_names : (int * int, int) Hashtbl.t } +(** Global linker state *) type gen = - { mutable g_strings : (string, int) Hashtbl.t; + { + (* Table that associates unique string to its position inside + [g_base]'s unique string array *) + mutable g_strings : (string, int) Hashtbl.t; + (* Table that associates person's names hash with the index of + person's entry inside the [g_base].*) mutable g_names : (int, int) Hashtbl.t; + (* Counter of persons inside [g_base] *) mutable g_pcnt : int; + (* Counter of families inside [g_base] *) mutable g_fcnt : int; + (* Counter of unique strings inside [g_base] *) mutable g_scnt : int; + (* Current file info *) g_file_info : file_info; + (* Base of collected information *) g_base : cbase; + (* Wizard notes (wizard id and note's content) *) mutable g_wiznotes : (string * string) list; g_patch_p : (int, person) Hashtbl.t; + (** Array that for every person from [g_base] says if he + was defined before *) mutable g_def : bool array; + (* Table that associates person's first and last name with + the next availiable occurence number for the person with + the same names.*) g_first_av_occ : (string * string, int) Hashtbl.t; + (* Indicates if an error was occured *) mutable g_errored : bool; + (* Temprary output chanel containing [g_pcnt] integers where [i]nth integer + corresponds to the position in [g_per] where [i]nth person is defined. *) g_per_index : out_channel; + (* Temprary output chanel containing person's definition (or non-definition + marker) *) g_per : out_channel; + (* Temprary output chanel containing [g_fcnt] integers where [i]nth integer + corresponds to the position in [g_fam] where [i]nth family is defined. *) g_fam_index : out_channel; + (* Temprary output chanel containing family's definition *) g_fam : out_channel } +(** Set [gen.g_errored] telling that an error was occured *) let check_error gen = gen.g_errored <- true +(** Function that will be called if base's checker will find an error *) let set_error base gen x = Printf.printf "\nError: " ; Check.print_base_error stdout base x ; check_error gen +(** Function that will be called if base's checker will find a warning *) let set_warning base x = Printf.printf "Warning: " ; Check.print_base_warning stdout base x +(** Returns person's entry from [base] at position [i] *) let poi base i = base.c_persons.(i) + +(** Returns ascendant's entry from [base] at position [i] *) let aoi base i = base.c_ascends.(i) + +(** Returns union's entry from [base] at position [i] *) let uoi base i = base.c_unions.(i) + +(** Returns couple's entry from [base] at position [i] *) let coi base i = base.c_couples.(i) + +(** Returns string in [base]'s unque string array at position [i] *) let sou base i = base.c_strings.(i) + +(** Returns first name of a [base]'s person entry [p]. [p.m_first_name] contains + index where first name string representation is stored. *) let p_first_name base p = Mutil.nominative (sou base p.m_first_name) + +(** Returns surname of a [base]'s person entry [p]. [p.m_first_name] contains + index where surname string representation is stored. *) let p_surname base p = Mutil.nominative (sou base p.m_surname) + +(** Returns string designation of person {i firstname.occ surname}. *) let designation base p = let prenom = p_first_name base p in let nom = p_surname base p in prenom ^ "." ^ string_of_int p.m_occ ^ " " ^ nom +(** Same as [Marshal.to_channel oc v [Marshal.No_sharing]] *) let output_item_value oc v = Marshal.to_channel oc v [Marshal.No_sharing] +(** Same as [input_value] *) let input_item_value ic = input_value ic -(**) - +(** Empty string *) let no_string = "" +(** Stores unique string (if not already present) inside the base's string array and + associate this string to its index in mentioned array. Extens array if needed. + Returns associated index. *) let unique_string gen x = try Hashtbl.find gen.g_strings x with Not_found -> + (* string not found *) if gen.g_scnt = Array.length gen.g_base.c_strings then + (* extend arrray of strings and copy previus elements *) begin let arr = gen.g_base.c_strings in let new_size = 2 * Array.length arr + 1 in let new_arr = Array.make new_size no_string in @@ -118,6 +213,7 @@ let unique_string gen x = Hashtbl.add gen.g_strings x u; u +(** Dummy [family] with its empty [couple] and [descendants]. *) let no_family gen = let empty_string = unique_string gen "" in let fam = @@ -138,7 +234,10 @@ let no_family gen = let des = {children = [| |]} in fam, cpl, des -let make_person gen p n occ = +(** Initialises [min_person] with occurence number and index of [p] for first name and + index of [n] for surname in [base]. Other fields are initialised with default value. + Returns also empty [ascend] and [union] attached to the considered person. *) +let make_person gen p n occ : min_person * ascend * union = let empty_string = unique_string gen "" in let p = {m_first_name = unique_string gen p; m_surname = unique_string gen n; @@ -148,8 +247,11 @@ let make_person gen p n occ = and u = {family = [| |]} in p, a, u +(** Dummy [min_person] with its empty [ascend] and [union]. *) let no_person gen = make_person gen "" "" 0 +(** Extends person's acendant's and union's arrays inside [gen.g_base] + if needed. *) let new_iper gen = if gen.g_pcnt = Array.length gen.g_base.c_persons then let per_arr = gen.g_base.c_persons in @@ -170,6 +272,8 @@ let new_iper gen = Array.blit gen.g_def 0 new_def 0 (Array.length gen.g_def); gen.g_def <- new_def +(** Extends family's couple's and decendant's arrays inside [gen.g_base] + if needed. *) let new_ifam gen = if gen.g_fcnt = Array.length gen.g_base.c_families then let fam_arr = gen.g_base.c_families in @@ -187,23 +291,31 @@ let new_ifam gen = Array.blit des_arr 0 new_des_arr 0 (Array.length des_arr); gen.g_base.c_descends <- new_des_arr +(** Convert [string Def.gen_title_name] to [int Def.gen_title_name]. + If title is [Tname] stores title name as a string in the base. *) let title_name_unique_string gen = function Tmain -> Tmain | Tname n -> Tname (unique_string gen n) | Tnone -> Tnone +(** Convert [(string Def.gen_title] to [int Def.gen_title] and insert + all related to title information in the base. *) let title_unique_string gen t = {t_name = title_name_unique_string gen t.t_name; t_ident = unique_string gen t.t_ident; t_place = unique_string gen t.t_place; t_date_start = t.t_date_start; t_date_end = t.t_date_end; t_nth = t.t_nth} +(** Hash of person's first and last names. *) let person_hash first_name surname = let first_name = Mutil.nominative first_name in let surname = Mutil.nominative surname in let s = Name.crush_lower (first_name ^ " " ^ surname) in Hashtbl.hash s +(** Returns index of a person's entry inside the [gen.base] that has the same + first name, surname and occurence number. Raises [Not_found] if person + is not found. *) let find_person_by_global_name gen first_name surname occ = let first_name = Mutil.nominative first_name in let surname = Mutil.nominative surname in @@ -217,6 +329,8 @@ let find_person_by_global_name gen first_name surname occ = [] -> raise Not_found | ip :: ipl -> let p = poi gen.g_base ip in + (* refine search by fullnames comparison (without crushlower) and with + occurence comparison *) if p.m_occ = occ && Name.lower (p_first_name gen.g_base p) = first_name && Name.lower (p_surname gen.g_base p) = surname @@ -226,6 +340,9 @@ let find_person_by_global_name gen first_name surname occ = in loop ipl +(** Returns index of a person's entry inside the [gen.base] that has the same + first name, surname and occurence number. Searches only persons defined + in the current file. Raises [Not_found] if person is not found. *) let find_person_by_local_name gen first_name surname occ = let first_name = Mutil.nominative first_name in let surname = Mutil.nominative surname in @@ -239,6 +356,7 @@ let find_person_by_local_name gen first_name surname occ = [] -> raise Not_found | ip :: ipl -> let p = poi gen.g_base ip in + (* refine search by fullnames comparison (without crushlower) *) if Name.lower (p_first_name gen.g_base p) = first_name && Name.lower (p_surname gen.g_base p) = surname then @@ -247,15 +365,24 @@ let find_person_by_local_name gen first_name surname occ = in loop ipl +(** Returns index of a person's entry inside the [gen.base] that has the same + first name, surname and occurence number. Calls [find_person_by_local_name] + if option [f_separate] is enabled for the current file, otherwise calls + [find_person_by_global_name]. Raises [Not_found] if person is not found. *) let find_person_by_name gen first_name surname occ = if gen.g_file_info.f_separate then find_person_by_local_name gen first_name surname occ else find_person_by_global_name gen first_name surname occ +(** Add entry in the global names table [gen.g_names] for the giving + first and last names associated to the index of their person's entry + in [base]. *) let add_person_by_name gen first_name surname int = let s = Name.crush_lower (Mutil.nominative (first_name ^ " " ^ surname)) in let key = Hashtbl.hash s in Hashtbl.add gen.g_names key int +(** Returns first available occurence number that is >= [occ] for the person + with the giving information. *) let find_first_available_occ gen fn sn occ = let occ = try max occ (Hashtbl.find gen.g_first_av_occ (fn, sn)) with @@ -271,8 +398,31 @@ let find_first_available_occ gen fn sn occ = in loop occ +(** Insert person's reference in the base and modifies all coresponding + fields in [gen] and returns its entry and entry's index in the base. + In details: + + - if considered person doesn't exists in the base (wasn't defined or + referenced before) then function: + + - maps its key (names and occurence number) within the varius + hash tables + - creates entry (of type [min_gen]) for the giving person and his + ascendants and union in the base. + - initialises its entry (with key information) + - stores marker in the [gen.g_per] channel telling that person + wasn't defined. + - stores in [gen.g_per_index] position where marker was stored in + [gen.g_per]. + + - if considered person was referenced or defined before then doesn't do + anything (just returns its entry and entry's index in the base) + + *) let insert_undefined gen key = + (* shift person's occurence *) let occ = key.pk_occ + gen.g_file_info.f_shift in + (* person with its position in the base *) let (x, ip) = try if key.pk_first_name = "?" || key.pk_surname = "?" then raise Not_found @@ -281,7 +431,9 @@ let insert_undefined gen key = find_person_by_name gen key.pk_first_name key.pk_surname occ in poi gen.g_base ip, ip + (* if person not found *) with Not_found -> + (* abailable occurence number *) let new_occ = if gen.g_file_info.f_separate && key.pk_first_name <> "?" && key.pk_surname <> "?" @@ -289,28 +441,37 @@ let insert_undefined gen key = find_first_available_occ gen key.pk_first_name key.pk_surname occ else occ in + (* person's entry index *) let i = gen.g_pcnt in let (x, a, u) = make_person gen key.pk_first_name key.pk_surname new_occ in + (* strore names globally *) if key.pk_first_name <> "?" && key.pk_surname <> "?" then add_person_by_name gen key.pk_first_name key.pk_surname (i) else if !(Gwcomp.create_all_keys) then add_person_by_name gen key.pk_first_name key.pk_surname (i); + (* extend arrays if needed *) new_iper gen; + (* add person to array *) gen.g_base.c_persons.(i) <- x; + (* add associated to person ascendants to array *) gen.g_base.c_ascends.(i) <- a; + (* add associated to person union to array *) gen.g_base.c_unions.(i) <- u; gen.g_pcnt <- gen.g_pcnt + 1; + (* strore names locally *) if key.pk_first_name <> "?" && key.pk_surname <> "?" then begin let h = person_hash key.pk_first_name key.pk_surname in Hashtbl.add gen.g_file_info.f_local_names (h, occ) (i) end; + (* write start position of person in [g_per] *) seek_out gen.g_per_index (sizeof_long * i); output_binary_int gen.g_per_index (pos_out gen.g_per); + (* write marker *) output_char gen.g_per 'U'; x, i in @@ -335,15 +496,49 @@ let insert_undefined gen key = end; x, ip +(** Insert person's definition in the base and modifies all coresponding + fields in [gen] and returns its entry and entry's index in the base. + In details: + + - if considered person doesn't exists in the base (wasn't defined or + referenced before) then function: + + - maps its key (names and occurence number) within the varius + hash tables + - creates entry (of type [min_gen]) for the giving person and his + ascendants and union in the base. + - initialises its entry (with key information) + - marks it as defined + - convert [(_,_,string) gen_person] to [person] (sex, events, titles + and related persons stays uninitialised) and stores it in the + [gen.g_per] channel. + - stores in [gen.g_per_index] position where person was stored in + [gen.g_per]. + + - if considered person was referenced before (but not defined) then + function: + + - get person's entry and its index from the base + - marks it as defined + - convert [(_,_,string) gen_person] to [person] (sex, events and + related persons stays uninitialised) and stores it in the + [gen.g_per] channel. + - updates previus index in [gen.g_per_index] in order to point to + the definition instead of pointing to the reference. +*) let insert_person gen so = + (* shift person's occurence *) let occ = so.occ + gen.g_file_info.f_shift in + (* person with its position in the base *) let (x, ip) = try if so.first_name = "?" || so.surname = "?" then raise Not_found else let ip = find_person_by_name gen so.first_name so.surname occ in poi gen.g_base ip, ip + (* if person not found *) with Not_found -> + (* abailable occurence number *) let new_occ = if gen.g_file_info.f_separate && so.first_name <> "?" && so.surname <> "?" @@ -351,19 +546,26 @@ let insert_person gen so = find_first_available_occ gen so.first_name so.surname occ else occ in + (* person's entry index *) let i = gen.g_pcnt in let (x, a, u) = make_person gen so.first_name so.surname new_occ in + (* strore names globally *) if so.first_name <> "?" && so.surname <> "?" then add_person_by_name gen so.first_name so.surname (i) else if !(Gwcomp.create_all_keys) then add_person_by_name gen so.first_name so.surname (i); + (* extend arrays if needed *) new_iper gen; + (* add person to array *) gen.g_base.c_persons.(i) <- x; + (* add associated to person ascendants to array *) gen.g_base.c_ascends.(i) <- a; + (* add associated to person union to array *) gen.g_base.c_unions.(i) <- u; gen.g_pcnt <- gen.g_pcnt + 1; + (* strore names locally *) if so.first_name <> "?" && so.surname <> "?" then begin let h = person_hash so.first_name so.surname in Hashtbl.add gen.g_file_info.f_local_names (h, occ) @@ -371,8 +573,10 @@ let insert_person gen so = end; x, i in + (* if person wad defined before (not just referenced) *) if gen.g_def.(ip) then begin + (* print error about person beeing already defined *) Printf.printf "\nPerson already defined: \"%s%s %s\"\n" so.first_name (match x.m_occ with 0 -> "" @@ -389,11 +593,13 @@ let insert_person gen so = flush stdout; check_error gen end + (* else set it as defined *) else gen.g_def.(ip) <- true; if not gen.g_errored then if sou gen.g_base x.m_first_name <> so.first_name || sou gen.g_base x.m_surname <> so.surname then + (* print error about person defined with two spellings *) begin Printf.printf "\nPerson defined with two spellings:\n"; Printf.printf " \"%s%s %s\"\n" so.first_name @@ -411,6 +617,7 @@ let insert_person gen so = end; if not gen.g_errored then begin let empty_string = unique_string gen "" in + (* Convert [(_,_,string) gen_person] to [person]. Save all strings in base *) let x = {first_name = empty_string; surname = empty_string; occ = 0; image = unique_string gen so.image; @@ -441,18 +648,24 @@ let insert_person gen so = (if so.psources = "" then !default_source else so.psources); key_index = ip} in + (* write/update start position of person in [g_per] *) seek_out gen.g_per_index (sizeof_long * ip); output_binary_int gen.g_per_index (pos_out gen.g_per); + (* write person *) output_char gen.g_per 'D'; output_item_value gen.g_per (x : person) end; x, ip +(** Insert definition or reference in [gen] and returns its entry and + entry's index in the [gen.g_base]. Calls [insert_person] for definition + and [insert_undefined] for reference. *) let insert_somebody gen = function Undefined key -> insert_undefined gen key | Defined so -> insert_person gen so +(** Checks if childran [ix] doesn't have another parents *) let check_parents_not_already_defined gen ix fath moth = let x = poi gen.g_base ix in match (aoi gen.g_base ix).parents with @@ -478,12 +691,16 @@ let check_parents_not_already_defined gen ix fath moth = check_error gen | _ -> () +(** Assign sex to the person's entry if it's unitialised. + Print message if sexes are different. *) let notice_sex gen p s = if p.m_sex = Neuter then p.m_sex <- s else if p.m_sex <> s && s <> Neuter then Printf.printf "\nInconsistency about the sex of\n %s %s\n" (p_first_name gen.g_base p) (p_surname gen.g_base p) +(** Convert [string Def.gen_fam_event_name] to [int Def.gen_fam_event_name]. + If event is [Efam_Name] stores event name as a string in the base. *) let fevent_name_unique_string gen = function Efam_Marriage | Efam_NoMarriage | Efam_NoMention | Efam_Engage | @@ -493,6 +710,7 @@ let fevent_name_unique_string gen = evt | Efam_Name n -> Efam_Name (unique_string gen n) +(** Update family by looking up information inferred from family events *) let update_family_with_fevents gen fam = let found_marriage = ref false in let found_divorce = ref false in @@ -595,6 +813,7 @@ let update_family_with_fevents gen fam = in loop (List.rev fam.fevents) fam +(** Update family event list by looking up inferred family information. *) let update_fevents_with_family gen fam = let empty_string = 0 in let evt_marr = @@ -654,6 +873,24 @@ let update_fevents_with_family gen fam = in {fam with fevents = fevents} +(** Insert family in the base and modifies all coresponding + fields in [gen] and returns its entry and entry's index in the base. + In details function does: + + - inserts father and mother in the person's base + - insert every witness in the person's base and associate father + as a related person. + - order, convert, adjust and insert events + - insert every childran in the person's base + - creates entry (of type [family]) for the giving family and its + couple and descendants in the base. + - associate father's and mother's union to the current family + - associate every childran's ascendants to the current family + (current couple, since it has the same index) + - stores family in the [gen.g_fam] channel. + - stores in [gen.g_fam_index] position where person was stored in + [gen.g_index]. +*) let insert_family gen co fath_sex moth_sex witl fevtl fo deo = let fath, ifath, moth, imoth = match insert_somebody gen (Adef.father co), insert_somebody gen (Adef.mother co) with @@ -662,23 +899,29 @@ let insert_family gen co fath_sex moth_sex witl fevtl fo deo = (moth, imoth, fath, ifath) | ((fath, ifath), (moth, imoth)) -> (fath, ifath, moth, imoth) in + (* insert all family witnesses *) let witl = List.map (fun (wit, sex) -> let (p, ip) = insert_somebody gen wit in - notice_sex gen p sex; p.m_related <- ifath :: p.m_related; ip) + notice_sex gen p sex; + (* add father to witness' related persons *) + p.m_related <- ifath :: p.m_related; + ip) witl in - (* On tri les évènements pour être sûr. *) + (* Events are sorted by chronological order (if equal then by alphabetical order) *) let fevents = CheckItem.sort_events (fun (name, _, _, _, _, _, _) -> CheckItem.Fsort name) (fun (_, date, _, _, _, _, _) -> date) fevtl in + (* Create [int Def.gen_fam_event_name] list from [fevents]*) let fevents = List.map (fun (name, date, place, reason, src, notes, witl) -> + (* insert all event witnesses *) let witnesses = List.map (fun (wit, sex, wk) -> @@ -696,19 +939,25 @@ let insert_family gen co fath_sex moth_sex witl fevtl fo deo = efam_witnesses = Array.of_list witnesses}) fevents in + (* insert all children *) let children = Array.map (fun key -> let (e, ie) = insert_person gen key in notice_sex gen e key.sex; ie) deo.children in + (* insert family comment *) let comment = unique_string gen fo.comment in + (* insert sources comment *) let fsources = unique_string gen (if fo.fsources = "" then !default_source else fo.fsources) in + (* extend arrays if needed *) new_ifam gen; + (* family's entry index *) let i = gen.g_fcnt in + (* Convert [(_,_,string) gen_family] to [family]. Save all strings in base *) let fam = {marriage = fo.marriage; marriage_place = unique_string gen fo.marriage_place; @@ -718,22 +967,32 @@ let insert_family gen co fath_sex moth_sex witl fevtl fo deo = divorce = fo.divorce; fevents = fevents; comment = comment; origin_file = unique_string gen fo.origin_file; fsources = fsources; fam_index = i} + (* create couple *) and cpl = Adef.couple ifath imoth + (* created descandants *) and des = {children = children} in (* On mets à jour les fevents et events normaux *) let fam = if fevents <> [] then update_family_with_fevents gen fam else update_fevents_with_family gen fam in + (* father's union *) let fath_uni = uoi gen.g_base ifath in + (* mother's union *) let moth_uni = uoi gen.g_base imoth in + (* write start position of family in [g_fam] *) seek_out gen.g_fam_index (sizeof_long * i); output_binary_int gen.g_fam_index (pos_out gen.g_fam); + (* write family *) output_item_value gen.g_fam (fam : family); + (* add family to array *) gen.g_base.c_families.(gen.g_fcnt) <- fam; + (* add couple to array *) gen.g_base.c_couples.(gen.g_fcnt) <- cpl; + (* add descendants to array *) gen.g_base.c_descends.(gen.g_fcnt) <- des; gen.g_fcnt <- gen.g_fcnt + 1; + (* append this family to father's and mother's union *) let fath_uni = {family = Array.append fath_uni.family [| i |]} in @@ -744,14 +1003,18 @@ let insert_family gen co fath_sex moth_sex witl fevtl fo deo = gen.g_base.c_unions.(imoth) <- moth_uni; notice_sex gen fath fath_sex; notice_sex gen moth moth_sex; + (* Append familly to the childran's ascendant *) Array.iter (fun ix -> let a = gen.g_base.c_ascends.(ix) in + (* check if childran has no another parents *) check_parents_not_already_defined gen ix fath moth; let a = {a with parents = Some (i)} in gen.g_base.c_ascends.(ix) <- a) children +(** Convert [string Def.gen_pers_event_name] to [int Def.gen_pers_event_name]. + If event is [Epers_Name] stores event name as a string in the base. *) let pevent_name_unique_string gen = function Epers_Birth | Epers_Baptism | Epers_Death | Epers_Burial | @@ -773,7 +1036,10 @@ let pevent_name_unique_string gen = evt | Epers_Name n -> Epers_Name (unique_string gen n) +(** Insert all related to the event information and add it to the person's entry + in the [gen.g_base] *) let insert_pevents fname gen sb pevtl = + (* insert concered person *) let (p, ip) = insert_somebody gen sb in if p.m_pevents <> [] then begin @@ -785,20 +1051,24 @@ let insert_pevents fname gen sb pevtl = check_error gen end else + (* sort evenets *) let pevents = CheckItem.sort_events (fun (name, _, _, _, _, _, _) -> CheckItem.Psort name) (fun (_, date, _, _, _, _, _) -> date) pevtl in + (* convert evenets. Insert all related to evenet information in the base *) let pevents = List.map (fun (name, date, place, reason, src, notes, witl) -> let witnesses = List.map (fun (wit, sex, wk) -> + (* insert witnesses *) let (wp, wip) = insert_somebody gen wit in notice_sex gen wp sex; + (* add concerned person as witness' relation *) wp.m_related <- ip :: wp.m_related; wip, wk) witl @@ -811,8 +1081,11 @@ let insert_pevents fname gen sb pevtl = epers_witnesses = Array.of_list witnesses}) pevents in + (* add events to the person's entry in the base *) p.m_pevents <- pevents +(** Insert person's notes in the base and associate it to the referenced + with [key] person *) let insert_notes fname gen key str = let occ = key.pk_occ + gen.g_file_info.f_shift in match @@ -836,9 +1109,14 @@ let insert_notes fname gen key str = (if occ = 0 then "" else "." ^ string_of_int occ) key.pk_surname; flush stdout +(** Changes [gen.g_base.c_bnotes] to take into account [nfname] page + and its content [str] that is treated by the way mentioned in + [gen.g_file_info.f_bnotes]. *) let insert_bnotes fname gen nfname str = if gen.g_file_info.f_bnotes <> `drop then begin let old_nread = gen.g_base.c_bnotes.nread in + (* Convert path notation from 'dir1:dir2:file' to 'dir1/dir2/file' + (if a valid path) *) let nfname = if nfname = "" then "" else @@ -868,6 +1146,7 @@ let insert_bnotes fname gen nfname str = gen.g_base.c_bnotes <- bnotes end +(** Add wizard and his note to the [gen] *) let insert_wiznote gen wizid str = gen.g_wiznotes <- (wizid, str) :: gen.g_wiznotes @@ -876,19 +1155,27 @@ let map_option f = Some x -> Some (f x) | None -> None +(** Insert parent in the base and adjust his sex if needed. Concerned + person is added in the list of parent's related persons. *) let insert_relation_parent gen ip s k = let (par, ipar) = insert_somebody gen k in par.m_related <- ip :: par.m_related; if par.m_sex = Neuter then par.m_sex <- s; ipar +(** Convert [(Dune__exe.Gwcomp.somebody, string) Def.gen_relation] to + [(int, int) Def.gen_relation] and insert all related to relation + information in the base. *) let insert_relation gen ip r = {r_type = r.r_type; r_fath = map_option (insert_relation_parent gen ip Male) r.r_fath; r_moth = map_option (insert_relation_parent gen ip Female) r.r_moth; r_sources = unique_string gen r.r_sources} +(** Insert all information related to the person's relations and add those + relations to the person's list of related parents. *) let insert_relations fname gen sb sex rl = + (* insert concerned person *) let (p, ip) = insert_somebody gen sb in if p.m_rparents <> [] then begin @@ -905,6 +1192,7 @@ let insert_relations fname gen sb sex rl = let rl = List.map (insert_relation gen ip) rl in p.m_rparents <- rl end +(** Insert syntax element read from .gwo file. *) let insert_syntax fname gen = function | Family (cpl, fs, ms, witl, fevents, fam, des) -> insert_family gen cpl fs ms witl fevents fam des @@ -914,6 +1202,7 @@ let insert_syntax fname gen = function | Bnotes (nfname, str) -> insert_bnotes fname gen nfname str | Wnotes (wizid, str) -> insert_wiznote gen wizid str +(** Update person by looking up information inferred from person events *) let update_person_with_pevents p = let found_birth = ref false in let found_baptism = ref false in @@ -987,6 +1276,7 @@ let update_person_with_pevents p = in loop p.pevents p +(** Update person's event list by looking up inferred personal information. *) let update_pevents_with_person p = let empty_string = 0 in let evt_birth = @@ -1113,6 +1403,9 @@ let update_pevents_with_person p = in {p with pevents = pevents} +(** Returns list of persons from [min_person list] where some absent information + was extracted from file [per_ic]. Adjusts person with inffered information + from events or inversely. *) let convert_persons per_index_ic per_ic persons = Array.mapi begin fun i mp -> let p = @@ -1124,7 +1417,9 @@ let convert_persons per_index_ic per_ic persons = with End_of_file -> 'U' in match c with + (* if person is defined read person *) | 'D' -> (input_item_value per_ic : person) + (* if read person is undefined then create dummy person *) | 'U' -> let empty_string = 0 in {first_name = empty_string; surname = empty_string; occ = 0; @@ -1155,6 +1450,7 @@ let convert_persons per_index_ic per_ic persons = else update_pevents_with_person p end persons +(** File containing the particles to use *) let particules_file = ref "" let convert_families fam_index_ic fam_ic len = @@ -1165,10 +1461,13 @@ let convert_families fam_index_ic fam_ic len = (input_item_value fam_ic : family) end +(** Returns list of particles from the file. If filename is empty string + then returns default particles list *) let input_particles = function | "" -> Mutil.default_particles | file -> Mutil.input_particles file +(** Empty base *) let empty_base : cbase = { c_persons = [| |] ; c_ascends = [| |] @@ -1181,12 +1480,14 @@ let empty_base : cbase = ; norigin_file = "" ; efiles = fun _ -> [] } } +(** Extend information from the [gen.g_base] and create database *) let make_base bname gen per_index_ic per_ic = let _ = Printf.eprintf "pcnt %d persons %d\n" gen.g_pcnt (Array.length gen.g_base.c_persons); flush stderr in + (* get full persons information *) let persons = let a = Array.sub gen.g_base.c_persons 0 gen.g_pcnt in gen.g_base.c_persons <- [| |]; @@ -1230,9 +1531,11 @@ let make_base bname gen per_index_ic per_ic = ((persons, ascends, unions), (families, couples, descends), strings , gen.g_base.c_bnotes) +(** Write content in the file *) let write_file_contents fname text = let oc = open_out fname in output_string oc text; close_out oc +(** Create and fill a file for every wizard note *) let output_wizard_notes bdir wiznotes = let wizdir = Filename.concat bdir "wiznotes" in if wiznotes <> [] then begin @@ -1244,6 +1547,7 @@ let output_wizard_notes bdir wiznotes = end wiznotes end +(** Create file with command used to call this program *) let output_command_line bdir = let oc = open_out (Filename.concat bdir "command.txt") in Printf.fprintf oc "%s" Sys.argv.(0); @@ -1253,6 +1557,7 @@ let output_command_line bdir = Printf.fprintf oc "\n"; close_out oc +(** Link .gwo files and create a database. *) let link next_family_fun bdir = let tmp_dir = Filename.concat "gw_tmp" bdir in Mutil.mkdir_p tmp_dir ; diff --git a/bin/gwc/db1link.mli b/bin/gwc/db1link.mli index 496f0c04ae..86988b40ab 100644 --- a/bin/gwc/db1link.mli +++ b/bin/gwc/db1link.mli @@ -1,13 +1,19 @@ +(** Default source field for persons and families without source data *) val default_source : string ref +(** Base consistency check *) val do_check : bool ref +(** Compute consanguinity *) val do_consang : bool ref +(** Print base's statistics *) val pr_stats : bool ref +(** File containing the particles to use *) val particules_file : string ref +(** Information about current .gwo file. *) type file_info = { mutable f_curr_src_file : string; mutable f_curr_gwo_file : string; @@ -17,5 +23,6 @@ type file_info = { mutable f_local_names : (int * int, int) Hashtbl.t; } +(** Link .gwo files and create a database. *) val link : (file_info -> unit -> Gwcomp.gw_syntax option) -> string -> bool diff --git a/bin/gwc/gwc.ml b/bin/gwc/gwc.ml index ecfb8ab8c3..c6025c9b98 100644 --- a/bin/gwc/gwc.ml +++ b/bin/gwc/gwc.ml @@ -3,6 +3,7 @@ open Geneweb open Gwcomp +(** Checks a .gwo header and prints fails if header is absent or not compatible. *) let check_magic fname ic = let b = really_input_string ic (String.length magic_gwo) in if b <> magic_gwo then @@ -14,6 +15,17 @@ let check_magic fname ic = ("\"" ^ fname ^ "\" is not a GeneWeb object file, or it is a very old version") +(** [next_family_fun_templ gwo_list fi] creates a function that read + sucessivly a [Gwcomp.gw_syntax] for all .gwo files. In details it does : + + - Switch to the next element in the [gwo_list] if reached the end + of the current file. Each element is [(gwo,separate, bnotes, shift)] + where [gwo] is .gwo filename and [separate], [bnotes], [shift] are + captured options from command line related to the giving file. + - Modify [fi] with mentioned previusly information if needed. + - Start/continue to read current .gwo file content and return + [Gwcomp.gw_syntax]. [None] is returned when reading of the last + .gwo file reaches end of file *) let next_family_fun_templ gwo_list fi = let ngwo = List.length gwo_list in let run = @@ -49,6 +61,7 @@ let next_family_fun_templ gwo_list fi = match r with Some fam -> Some fam | None -> + (* switch to the next .gwo file *) match !gwo_list with (x, separate, bnotes, shift) :: rest -> run (); diff --git a/bin/gwc/gwcomp.ml b/bin/gwc/gwcomp.ml index f99efc8f48..402060736e 100644 --- a/bin/gwc/gwcomp.ml +++ b/bin/gwc/gwcomp.ml @@ -4,38 +4,77 @@ open Geneweb open Def open Gwdb +(** .gwo file header *) let magic_gwo = "GnWo000o" (* Option qui force a créé les clés des individus. De fait, *) (* si la clé est incomplète, on l'enregistre tout de même. *) let create_all_keys = ref false +(** Key to refer a person's definition *) type key = { pk_first_name : string; pk_surname : string; pk_occ : int } +(** Represents a person in .gw file. It could be either reference to a person + (only key elements provided) or definition (all information provided). *) type somebody = - Undefined of key + (** Reference to person *) + | Undefined of key + (** Person's definition *) | Defined of (iper, iper, string) gen_person +(** Blocks that could appear in .gw file. *) type gw_syntax = - Family of - somebody gen_couple * sex * sex * (somebody * sex) list * - (string gen_fam_event_name * cdate * string * string * string * - string * (somebody * sex * witness_kind) list) - list * - ((iper, iper, string) gen_person, ifam, string) gen_family * - (iper, iper, string) gen_person gen_descend + (** Family definition block. Contains: + - Family couple (father's and mother's definition/reference) + - Father's sex + - Mother's sex + - List of witnesses definition/reference with their sex. + - List of information about every family event (name, date, + place, reason, source, notes and witnesses) + - Family definition + - Children (descendants) *) + | Family of + somebody gen_couple + * sex + * sex + * (somebody * sex) list + * (string gen_fam_event_name * cdate * string * string * string * + string * (somebody * sex * witness_kind) list) list + * ((iper, iper, string) gen_person, ifam, string) gen_family + * (iper, iper, string) gen_person gen_descend + (** Block that defines personal notes. First element represents + reference to person. Second is note's content. *) | Notes of key * string + (** Block that defines relations of a person with someone outisde of + family block (like foster parents) (field {i rparents}). Contains: + - Concerned person definition/reference + - Sex of person + - List of his relations. *) | Relations of somebody * sex * (somebody, string) gen_relation list + (** Block that defines events of a person. Specific to gwplus format. Contains: + - Concerned person's definition/reference + - Sex of person + - List of information about every personal event (name, date, + place, reason, source, notes and witnesses)*) | Pevent of - somebody * sex * - (string gen_pers_event_name * cdate * string * string * string * - string * (somebody * sex * witness_kind) list) - list + somebody + * sex + * (string gen_pers_event_name * cdate * string * string * string * + string * (somebody * sex * witness_kind) list) list + (** Block that defines database notes and extended pages. + First string represents name of extended page ("" for + database notes, only one for file). Second is note's + or page's content. *) | Bnotes of string * string + (** Block that defines wizard notes. First string represents + First string represents wizard's id. Second is note's content. *) | Wnotes of string * string +(** {i .gw} file encoding *) type encoding = E_utf_8 | E_iso_8859_1 +(** [copy_decode s i1 i2] decode the word delimited by [i1] and [i2] inside [s] + by remplacing "\\" -> '\' and '_' -> ' ' *) let copy_decode s i1 i2 = let len = let rec loop len i = @@ -61,6 +100,7 @@ let copy_decode s i1 i2 = in loop_copy (Bytes.create len) i1 0 +(** Return list of words inside the [str] *) let fields str = let rec loop beg i = if i < String.length str then @@ -74,6 +114,7 @@ let fields str = in loop 0 0 +(** Removes spaces at the begining an at the end of string. *) let cut_space x = let len = String.length x in if len = 0 then x @@ -83,11 +124,14 @@ let cut_space x = let stop = if x.[len-1] = ' ' then len - 1 else len in if start = 0 && stop = len then x else String.sub x start (stop - start) +(** Returns field if its label [lab] is first element of [l] *) let get_field lab l = match l with lab1 :: x :: l' when lab1 = lab -> cut_space x, l' | _ -> "", l +(** Parses [Def.date] from string that starts at pos [i] + inside [s] *) let date_of_string s i = let champ i = let (neg, i) = @@ -229,10 +273,17 @@ let date_of_string s i = Some (dt, i) -> if i = String.length s then Some dt else error 5 | None -> None +(** Line counter while reading .gw file *) let line_cnt = ref 0 + +(** Do not raise exception if syntax error occured. + Instead print error information on stdout *) let no_fail = ref false + +(** Save path to the images *) let no_picture = ref false +(** Read line from input channel. *) let input_line0 ic = let line = input_line ic in incr line_cnt; @@ -240,16 +291,19 @@ let input_line0 ic = String.sub line 0 (String.length line - 1) else line +(** Read a line and convert it to [encoding]. *) let input_a_line (ic, encoding) = let line = input_line0 ic in match encoding with E_utf_8 -> line | E_iso_8859_1 -> Mutil.utf_8_of_iso_8859_1 line +(** Read a line. If line is empty or only contains a comment, then read next line *) let rec input_real_line ic = let x = input_a_line ic in if x = "" || x.[0] = '#' then input_real_line ic else x +(** Parses person's birthdate if it is present. *) let get_optional_birthdate l = match l with x :: l' -> @@ -263,6 +317,7 @@ let get_optional_birthdate l = end | _ -> None, l +(** Parses person's babtization date if it is present. *) let get_optional_baptdate l = match l with x :: l' -> @@ -276,6 +331,7 @@ let get_optional_baptdate l = else None, l | _ -> None, l +(** Parse death information if present. *) let get_optional_deathdate l = match l with "?" :: l' -> Some DontKnowIfDead, l' @@ -304,6 +360,7 @@ let get_optional_deathdate l = else None, l | _ -> None, l +(** Parse burial information if present. *) let get_burial l = match l with "#buri" :: l -> @@ -332,12 +389,15 @@ let get_burial l = end | _ -> UnknownBurial, l +(** Parse sex of person *) let get_optional_sexe = function "h" :: l -> Male, l | "f" :: l -> Female, l | l -> Neuter, l +(** Parses int from that starts at the position [i] inside [x]. + Raises [Not_found] if integer isn't found. *) let make_int x = let rec loop found n i = if i = String.length x then if found then n else raise Not_found @@ -349,6 +409,8 @@ let make_int x = in loop false 0 +(** Parses person's first name and occurence number. Returns 0 if occurence + number isn't present. *) let get_fst_name str l = match l with x :: l' -> @@ -366,10 +428,11 @@ let get_fst_name str l = | None -> x, 0 in x, occ, l' - | _ -> failwith str + | _ -> failwith str end - | _ -> failwith str + | _ -> failwith str +(** Parses person's first name aliases if they are present *) let rec get_fst_names_aliases str l = match l with x :: l' -> @@ -379,24 +442,31 @@ let rec get_fst_names_aliases str l = else [], l | [] -> [], l +(** Parses person's surname aliases if they are present *) let rec get_surnames_aliases str l = match l with "#salias" :: x :: l' -> let (nl, l) = get_surnames_aliases str l' in cut_space x :: nl, l | _ -> [], l +(** Parses person's qualifiers if they are present *) let rec get_qualifiers str l = match l with "#nick" :: x :: l' -> let (nl, l) = get_qualifiers str l' in cut_space x :: nl, l | _ -> [], l +(** Parses person's aliases if they are present *) let rec get_aliases str l = match l with "#alias" :: x :: l' -> let (nl, l) = get_aliases str l' in cut_space x :: nl, l | _ -> [], l +(** [get_name l] parses a last name. Looks up first element of the list and returns a + [(name,rest)] couple where [name] is a person's last name and [rest] is a tail of + the list. If first element is [#nick], [#alias] start with '{' returns empty string + and list unchanged. *) let get_name l = match l with | "#nick" :: _ | "#alias" :: _ -> "", l @@ -411,6 +481,7 @@ let get_name l = end | _ -> "", l +(** Parses person's public name if present *) let get_pub_name l = match l with | x :: l' -> @@ -419,28 +490,33 @@ let get_pub_name l = else "", l | _ -> "", l +(** Parses person's image path if present *) let get_image l = match l with | ("#image" | "#photo") :: x :: l' -> if !no_picture then "", l' else cut_space x, l' | _ -> "", l +(** Parses person's occupation if present *) let get_occu l = match l with | "#occu" :: x :: l' -> cut_space x, l' | _ -> "", l +(** Parses person's source if present *) let get_sources l = match l with "#src" :: x :: l' -> cut_space x, l' | _ -> "", l +(** Parses person's acces rights *) let get_access l = match l with "#apubl" :: l' -> Public, l' | "#apriv" :: l' -> Private, l' | _ -> IfTitles, l +(** Create [gen_title] from string *) let scan_title t = let next_field i = let rec loop s i = @@ -485,6 +561,7 @@ let scan_title t = t_date_start = Adef.cdate_of_od date_start; t_date_end = Adef.cdate_of_od date_end; t_nth = nth} +(** Parses list of titles ([gen_title]) if they are present. *) let rec get_titles str l = match l with x :: l' -> @@ -496,6 +573,7 @@ let rec get_titles str l = else [], l | _ -> [], l +(** Parses person's event name *) let get_pevent_name str l = match l with "#birt" :: l' -> Epers_Birth, l' @@ -554,6 +632,7 @@ let get_pevent_name str l = else failwith str | _ -> failwith str +(** Parses family event name *) let get_fevent_name str l = match l with | "#marr" :: l' -> Efam_Marriage, l' @@ -573,6 +652,7 @@ let get_fevent_name str l = else failwith str | _ -> failwith str +(** Parses event date if it is present. *) let get_optional_event_date l = match l with x :: l' -> @@ -586,12 +666,21 @@ let get_optional_event_date l = end | _ -> None, l +(** Parse witness kind *) let get_event_witness_kind l = match l with "#godp" :: l' -> Witness_GodParent, l' | "#offi" :: l' -> Witness_Officer, l' | _ -> Witness, l +(** Parses the line containing an information about relationship between parents within family + and returns [((relk, fath_sex, moth_sex), mar, place, note, src, divorce, rest)]. + [relk] i a relation kind between parents ([Def.relation_kind]), [fath_sex] and [moth_sex] + is a sex of each parent, [mar] is a optional mariage date (if married), [place] is a + marriage place if present, [note] is a mariage note if present, [src] is a mariage source + if present, [divorce] is a divorce status [Def.divorce], [rest] is the rest of the line to + parse +*) let get_mar_date str = function x :: l -> @@ -657,10 +746,13 @@ let get_mar_date str = relation, mar, place, note, src, divorce, l | [] -> failwith str +(** Read and return a line with list of words that appears on this line. If + reading raises [Enf_of_file] returns [None] *) let read_line ic = try let str = input_real_line ic in Some (str, fields str) with End_of_file -> None +(** Create a dummy [gen_person]. *) let create_person () = {first_name = ""; surname = ""; occ = 0; image = ""; public_name = ""; qualifiers = []; aliases = []; first_names_aliases = []; @@ -673,8 +765,18 @@ let create_person () = burial_note = ""; burial_src = ""; pevents = []; notes = ""; psources = ""; key_index = Gwdb.dummy_iper} +(** Person is unknown (bogus definition) *) let bogus_def p n = p = "?" || n = "?" +(** Parse the line and create person's [gen_person] definition. + Doesn't modify folowing personal information: + - Key + - Parents + - Related persons + - Events + - Notes + If can't parse person's sources use [comm_psources] instead. + If can't parse bithdate use [comm_birth_place] instead. *) let set_infos fn sn occ sex comm_psources comm_birth_place str u l = let (first_names_aliases, l) = get_fst_names_aliases str l in let (surnames_aliases, l) = get_surnames_aliases str l in @@ -693,6 +795,7 @@ let set_infos fn sn occ sex comm_psources comm_birth_place str u l = let (baptism, l) = get_optional_baptdate l in let (baptism_place, l) = let (pp, l) = get_field "#pp" l in + (* if no baptization place then it's equals to birth place *) if pp = "" then get_field "#bp" l else pp, l in let (bapt_note, l) = get_field "#pn" l in @@ -744,9 +847,16 @@ let set_infos fn sn occ sex comm_psources comm_birth_place str u l = in u, l +(** Parses the line containing a parent and returns [(somebody,np,rest)]. [somebody] is either [Defined p] if + person's definiton was parsed ([p] regroups all personal information) either [Undefined k] if a reference + to a person already defined was parsed ([k] is a key to find corresponding definition). [np] is a person's + surname. [rest] is a rest of line to parse. Could be used to parse familial witnesses. *) let parse_parent str l = + (* last name *) let (np, l) = get_name l in + (* first name and occurence number *) let (pp, op, l) = get_fst_name str l in + (* person is not defined as a child elsewhere (is defined here) *) let defined = if bogus_def pp np then true else @@ -762,6 +872,10 @@ let parse_parent str l = let u = create_person () in let (u, l) = set_infos pp np op u.sex "" "" str u l in Defined u, np, l +(** Parses the line containing a childran and returns a person [gen_person] containing + all extracted information. If a childran definition doesn't provide + surname then father's surname is used. ALso if it doesn't provide a childran's + birth place and source then it uses information provided by family definiton. *) let parse_child str surname sex csrc cbp l = let u = create_person () in let (prenom, occ, l) = get_fst_name str l in @@ -779,6 +893,8 @@ let parse_child str surname sex csrc cbp l = in set_infos prenom nom occ sex csrc cbp str u l +(** Parse relation type [Def.gen_relation] with a person outside of family block + (foster parents, god parent, etc.). *) let get_relation str = function "-" :: x :: l -> @@ -815,6 +931,8 @@ let get_relation str = end | _ -> failwith str +(** Read notes of a person inside [note] block across multiple lines and + concat them. *) let read_notes ic = let notes = try @@ -829,6 +947,8 @@ let read_notes ic = Mutil.strip_all_trailing_spaces notes (* from version 5.00 *) +(** Read database notes across multiple lines and concat them. Stop reading when + encounter [end_text] *) let read_notes_db ic end_txt = let notes = try @@ -848,13 +968,20 @@ let read_notes_db ic end_txt = in Mutil.strip_all_trailing_spaces notes +(** Parsing status of .gw block *) type 'a read_family = - F_some of 'a + (** Read block inside .gw file *) + | F_some of 'a + (** Read block that defines that file use utf-8 encoding *) | F_enc_utf_8 + (** Read block that defines that the file uses gwplus syntax *) | F_gw_plus + (** Read end of the file *) | F_none + (** Exception while reading *) | F_fail of string +(** Read succesive family note lines and concat it. *) let loop_note line ic = let rec loop_note acc str = match fields str with @@ -872,6 +999,9 @@ let loop_note line ic = in loop_note [] line +(** Parse witnesses across the lines and returns list of [(wit,wsex,wk)] + where wit is a witness definition/reference, [wsex] is a sex of witness + and [wk] is a kind of witness relationship to the family. *) let loop_witn line ic = let rec loop_witn acc str = match fields str with @@ -890,20 +1020,29 @@ let loop_witn line ic = in loop_witn [] line +(** Read and parse a gw file block from [ic]. Returns also next line if it's + not the end of the file. *) let read_family ic fname = function - Some (_, ["encoding:"; "utf-8"]) -> F_enc_utf_8 + (* Block that defines that file use utf-8 encoding *) + | Some (_, ["encoding:"; "utf-8"]) -> F_enc_utf_8 + (* Block that defines that the file uses gwplus syntax *) | Some (_, ["gwplus"]) -> F_gw_plus + (* Family block *) | Some (str, "fam" :: l) -> + (* read father *) let (fath_key, surname, l) = parse_parent str l in + (* read relation between parents *) let (relation_ss, marriage, marr_place, marr_note, marr_src, divorce, l) = get_mar_date str l in let (relation, fath_sex, moth_sex) = relation_ss in + (* read mother *) let (moth_key, _, l) = parse_parent str l in if l <> [] then failwith str; let line = read_line ic in + (* read list of witnesses with their sex (if exists) *) let (witn, line) = let rec loop = function @@ -922,25 +1061,30 @@ let read_family ic fname = in loop line in + (* read familial source if present *) let (fsrc, line) = match line with Some (_, ["src"; x]) -> cut_space x, read_line ic | Some (str, "src" :: _) -> failwith str | _ -> "", line in + (* read common children source if present *) let (csrc, line) = match line with Some (_, ["csrc"; x]) -> cut_space x, read_line ic | Some (str, "csrc" :: _) -> failwith str | _ -> "", line in + (* read common children birth place if present *) let (cbp, line) = match line with Some (_, ["cbp"; x]) -> cut_space x, read_line ic | Some (str, "cbp" :: _) -> failwith str | _ -> "", line in + (* create a couple *) let co = Adef.couple fath_key moth_key in + (* read a family comments *) let (comm, line) = match line with Some (str, "comm" :: _) -> @@ -948,6 +1092,7 @@ let read_family ic fname = comm, read_line ic | _ -> "", line in + (* read family events *) let (fevents, line) = match line with Some (_, "fevt" :: _) -> @@ -983,7 +1128,8 @@ let read_family ic fname = | _ -> [], line in begin match line with - Some (_, ["beg"]) -> + (* have children *) + | Some (_, ["beg"]) -> let cles_enfants = let rec loop children = match read_line ic with @@ -997,6 +1143,7 @@ let read_family ic fname = in List.rev (loop []) in + (* create a family definition (without witnesses, events and family index) *) let fo = {marriage = marriage; marriage_place = marr_place; marriage_note = marr_note; marriage_src = marr_src; @@ -1008,6 +1155,7 @@ let read_family ic fname = F_some (Family (co, fath_sex, moth_sex, witn, fevents, fo, deo), read_line ic) + (* no children *) | line -> let fo = {marriage = marriage; marriage_place = marr_place; @@ -1020,9 +1168,11 @@ let read_family ic fname = F_some (Family (co, fath_sex, moth_sex, witn, fevents, fo, deo), line) end + (* Database notes block *) | Some (_, ["notes-db"]) -> let notes = read_notes_db ic "end notes-db" in F_some (Bnotes ("", notes), read_line ic) + (* Extended page block *) | Some (str, ["page-ext"; _]) -> let p = let len = String.length "page-ext" + 1 in @@ -1030,9 +1180,10 @@ let read_family ic fname = in let notes = read_notes_db ic "end page-ext" in F_some (Bnotes (p, notes), read_line ic) + (* Used before version 5.00. Notes block *) | Some (_, ["notes"]) -> - (* used before version 5.00 *) let notes = read_notes ic in F_some (Bnotes ("", notes), read_line ic) + (* Notes block *) | Some (str, "notes" :: l) -> let (surname, l) = get_name l in let (first_name, occ, l) = get_fst_name str l in @@ -1048,6 +1199,7 @@ let read_family ic fname = | Some (str, _) -> failwith str | None -> failwith "end of file" end + (* Wizard note block *) | Some (str, "wizard-note" :: _) -> let wizid = let len = String.length "wizard-note " in @@ -1055,8 +1207,11 @@ let read_family ic fname = in let notes = read_notes_db ic "end wizard-note" in F_some (Wnotes (wizid, notes), read_line ic) + (* Personal relation block *) | Some (str, "rel" :: l) -> + (* get considered person *) let (sb, _, l) = parse_parent str l in + let (sex, l) = match l with "#h" :: l -> Male, l @@ -1066,7 +1221,8 @@ let read_family ic fname = if l <> [] then failwith "str" else begin match read_line ic with - Some (_, ["beg"]) -> + (* Read list of relations *) + | Some (_, ["beg"]) -> let rl = try let rec loop = @@ -1081,7 +1237,9 @@ let read_family ic fname = | Some (str, _) -> failwith str | None -> failwith "end of file" end + (* Person's events block *) | Some (str, "pevt" :: l) -> + (* get considered person *) let (sb, _, l) = parse_parent str l in if l <> [] then failwith str else @@ -1116,20 +1274,26 @@ let read_family ic fname = let pevents = List.rev pevents in F_some (Pevent (sb, Neuter, pevents), read_line ic) | Some (str, _) -> failwith str + (* End of the file *) | None -> F_none +(** Read and return a block of .gw file. If [!no_fail] is disabled raises + [Failure] exception. *) let read_family_1 ic fname line = if !no_fail then try read_family ic fname line with Failure str -> F_fail str else read_family ic fname line +(** Compile .gw file and save result to corresponding .gwo *) let comp_families x = let out_file = Filename.chop_suffix x ".gw" ^ ".gwo" in line_cnt := 0; let oc = open_out_bin out_file in begin try let ic = open_in x in + (* write header *) output_string oc magic_gwo; + (* write source filename *) output_value oc (x : string); let rec loop line encoding = match read_family_1 (ic, encoding) x line with diff --git a/bin/gwc/gwcomp.mli b/bin/gwc/gwcomp.mli index 6dc1eecf10..e94cf30852 100644 --- a/bin/gwc/gwcomp.mli +++ b/bin/gwc/gwcomp.mli @@ -4,35 +4,85 @@ open Geneweb open Def open Gwdb +(** Key to refer a person's definition *) type key = { pk_first_name : string; pk_surname : string; pk_occ : int } + +(** Represents a person in .gw file. It could be either reference to a person + (only key elements provided) or definition (all information provided). *) type somebody = - Undefined of key + (** Reference to person *) + | Undefined of key + (** Person's definition *) | Defined of (iper, iper, string) gen_person +(** Blocks that could appear in .gw file. *) type gw_syntax = - Family of - somebody gen_couple * sex * sex * (somebody * sex) list * - (string gen_fam_event_name * cdate * string * string * string * - string * (somebody * sex * witness_kind) list) - list * - ((iper, iper, string) gen_person, ifam, string) gen_family * - (iper, iper, string) gen_person gen_descend + (** Family definition block. Contains: + - Family couple (father's and mother's definition/reference) + - Father's sex + - Mother's sex + - List of witnesses definition/reference with their sex. + - List of information about every family event (name, date, + place, reason, source, notes and witnesses) + - Family definition + - Children (descendants) *) + | Family of + somebody gen_couple + * sex + * sex + * (somebody * sex) list + * (string gen_fam_event_name * cdate * string * string * string * + string * (somebody * sex * witness_kind) list) list + * ((iper, iper, string) gen_person, ifam, string) gen_family + * (iper, iper, string) gen_person gen_descend + (** Block that defines personal notes. First element represents + reference to person. Second is note's content. *) | Notes of key * string + (** Block that defines relations of a person with someone outisde of + family block. Contains: + - Concerned person definition/reference + - Sex of person + - List of his relations. *) | Relations of somebody * sex * (somebody, string) gen_relation list + (** Block that defines events of a person. Specific to gwplus format. Contains: + - Concerned person definition/reference + - Sex of person + - List of information about every personal event (name, date, + place, reason, source, notes and witnesses)*) | Pevent of - somebody * sex * - (string gen_pers_event_name * cdate * string * string * string * - string * (somebody * sex * witness_kind) list) - list + somebody + * sex + * (string gen_pers_event_name * cdate * string * string * string * + string * (somebody * sex * witness_kind) list) list + (** Block that defines database notes and extended pages. + First string represents name of extended page ("" for + database notes, only one for file). Second is note's + or page's content. *) | Bnotes of string * string + (** Block that defines wizard notes. First string represents + First string represents wizard's id. Second is note's content. *) | Wnotes of string * string +(** .gwo file header *) val magic_gwo : string + +(** Line counter while reading .gw file *) val line_cnt : int ref + +(** Do not raise exception if syntax error occured. + Instead print error information on stdout *) val no_fail : bool ref -val comp_families : string -> unit + +(** Save path to the images *) val no_picture : bool ref + +(** Forces to create all the keys for every persons (even for ? ?). + Enabled for gwplus format. *) val create_all_keys : bool ref +(** Compile .gw file and save result to corresponding .gwo *) +val comp_families : string -> unit + (* Ajout pour l'API *) +(** Parses [Def.date] from string that starts at pos [i] inside [s] *) val date_of_string : string -> int -> date option diff --git a/lib/def/adef.mli b/lib/def/adef.mli index 0c35d0b6a4..9d2298d448 100644 --- a/lib/def/adef.mli +++ b/lib/def/adef.mli @@ -62,7 +62,8 @@ val od_of_cdate : cdate -> date option (** Optional date to [cdate] *) val cdate_of_od : date option -> cdate -(** Polymorphic type to represent a couple of persons. Couple consists of the father and of the mother. *) +(** Polymorphic type to represent a family's couple. + Couple consists of the father and of the mother. *) type 'person gen_couple (** Get father from couple *) diff --git a/lib/def/def.ml b/lib/def/def.ml index 2d7cfa8841..309aa7fd62 100644 --- a/lib/def/def.ml +++ b/lib/def/def.ml @@ -23,7 +23,8 @@ type cdate = Adef.cdate (** Alias to [Adef.date] *) type date = Adef.date = - Dgreg of dmy * calendar + Dgreg of dmy * calendar + (* textual form of the date *) | Dtext of string (** Alias to [Adef.calendar] *) @@ -46,9 +47,10 @@ and precision = | Before | After | OrYear of dmy2 + (* inteval *) | YearInt of dmy2 -(** Relation kind between couple in the familly *) +(** Relation kind between couple in the family *) type relation_kind = | Married | NotMarried @@ -171,7 +173,7 @@ type ('person, 'string) gen_pers_event = epers_src : 'string; epers_witnesses : ('person * witness_kind) array } -(** Event name pertaining a familly. *) +(** Event name pertaining a family. *) type 'string gen_fam_event_name = Efam_Marriage | Efam_NoMarriage @@ -187,7 +189,7 @@ type 'string gen_fam_event_name = | Efam_Residence | Efam_Name of 'string -(** Event information pertaining a familly. *) +(** Event information pertaining a family. *) type ('person, 'string) gen_fam_event = { efam_name : 'string gen_fam_event_name; efam_date : cdate; @@ -197,11 +199,11 @@ type ('person, 'string) gen_fam_event = efam_src : 'string; efam_witnesses : ('person * witness_kind) array } -(** Relation type with parent *) +(** Relation type with parent (if not native) *) type relation_type = Adoption | Recognition | CandidateParent | GodParent | FosterParent -(** Relation information with parents *) +(** Relation information with parents (if not native) *) type ('person, 'string) gen_relation = { r_type : relation_type; r_fath : 'person option; @@ -234,7 +236,10 @@ type ('iper, 'person, 'string) gen_person = first_names_aliases : 'string list; surnames_aliases : 'string list; titles : 'string gen_title list; + (* relations with not native parents *) rparents : ('person, 'string) gen_relation list; + (* related persons like (father of winessed family, + concerned person of wintessed event, adopted child, etc.) *) related : 'person list; occupation : 'string; sex : sex; @@ -260,12 +265,16 @@ type ('iper, 'person, 'string) gen_person = psources : 'string; key_index : 'iper } -(* TODO: doc *) +(** Person's ascendants with their consangunity degree *) type 'family gen_ascend = { parents : 'family option; consang : Adef.fix } + +(* TODOOCP : doc *) type 'family gen_union = { family : 'family array } + +(** Children of the family *) type 'person gen_descend = { children : 'person array } -(** Polymorphic type describing information about familly. *) +(** Polymorphic type describing information about family. *) type ('person, 'ifam, 'string) gen_family = { marriage : cdate; marriage_place : 'string; @@ -276,20 +285,20 @@ type ('person, 'ifam, 'string) gen_family = divorce : divorce; fevents : ('person, 'string) gen_fam_event list; comment : 'string; - origin_file : 'string; + origin_file : 'string; (* .gw filename where family is defined *) fsources : 'string; fam_index : 'ifam } (** Alias to [Adef.gen_couple] *) type 'person gen_couple = 'person Adef.gen_couple -(** Error describing bad specification of the person *) +(** Database errors describing bad specification of the person *) type 'person error = AlreadyDefined of 'person | OwnAncestor of 'person | BadSexOfMarriedPerson of 'person -(** Warnings attached to the specification of the person, familly, relation, etc. *) +(** Database warnings attached to the specification of the person, family, relation, etc. *) type ('iper, 'person, 'family, 'descend, 'title, 'pevent, 'fevent) warning = | BigAgeBetweenSpouses of 'person * 'person * dmy | BirthAfterDeath of 'person @@ -322,12 +331,21 @@ type ('iper, 'person, 'family, 'descend, 'title, 'pevent, 'fevent) warning = | YoungForMarriage of 'person * dmy * 'family | OldForMarriage of 'person * dmy * 'family -(* TODO:doc *) +(* TODOOCP: doc *) type ('person, 'descend, 'title) misc = MissingSources + +(** Database note/page reading mode *) type rn_mode = RnAll | Rn1Ln | RnDeg + +(** Database note/page information structure *) type base_notes = - { nread : string -> rn_mode -> string + { + (* read content of the page with giving mode. + Page '' represent database note *) + nread : string -> rn_mode -> string + (* origin file where page is stored *) ; norigin_file : string + (* returns list of all pages and database note *) ; efiles : unit -> string list } diff --git a/lib/util/futil.mli b/lib/util/futil.mli index 25be248989..07530030e1 100644 --- a/lib/util/futil.mli +++ b/lib/util/futil.mli @@ -54,7 +54,7 @@ val map_person_ps -> ('a, 'b, 'c) gen_person -> ('a, 'd, 'e) gen_person -(** Convert generic type used to represent familly inside [Def.gen_ascend] into +(** Convert generic type used to represent family inside [Def.gen_ascend] into another one. *) val map_ascend_f : ('a -> 'b) -> 'a gen_ascend -> 'b gen_ascend diff --git a/lib/util/mutil.mli b/lib/util/mutil.mli index d67a9064a4..45d10c150b 100644 --- a/lib/util/mutil.mli +++ b/lib/util/mutil.mli @@ -37,7 +37,7 @@ val mkdir_p : ?perm:int -> string -> unit (** Remove every file in the directory and then remove the directory itself *) val remove_dir : string -> unit -(** Create a lock file (with extension .lck). Result is generally used as an +(** Returns the name of a lock file (with extension .lck). Result is generally used as an argument for [Lock.control] function. *) val lock_file : string -> string From d3c52818cb5e213513876373c0746af984c72f28 Mon Sep 17 00:00:00 2001 From: Steven de Oliveira Date: Tue, 21 Dec 2021 11:53:31 +0100 Subject: [PATCH 22/73] Adding mli to GwuLib module --- bin/gwu/gwuLib.mli | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 bin/gwu/gwuLib.mli diff --git a/bin/gwu/gwuLib.mli b/bin/gwu/gwuLib.mli new file mode 100644 index 0000000000..15047572c2 --- /dev/null +++ b/bin/gwu/gwuLib.mli @@ -0,0 +1,21 @@ + +val out_dir : string ref +val old_gw : bool ref +val raw_output : bool ref +val separate_list : string list ref +val only_file : string ref +val sep_limit : int ref + +(** Initializes the internal hashtables. Person whose identifier is + not selected (`select p = false`) are ignored. *) +val prepare_free_occ : ?select:(Gwdb.iper -> bool) -> Gwdb.base -> unit + +(** Prints the `.gw` file. *) +val gwu : + Gwexport.gwexport_opts -> + bool -> + Gwdb.base -> + string -> + string -> + (string, (string -> unit) * bool ref * (unit -> unit)) Hashtbl.t -> + (Gwdb.iper -> bool) * (Gwdb.ifam -> bool) -> unit From af70073f1af43acf7f37ab0f5d2453a25ecd17f1 Mon Sep 17 00:00:00 2001 From: Steven de Oliveira Date: Tue, 21 Dec 2021 12:19:58 +0100 Subject: [PATCH 23/73] WiznotesDisplay documentation --- lib/wiznotesDisplay.ml | 1 + lib/wiznotesDisplay.mli | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/lib/wiznotesDisplay.ml b/lib/wiznotesDisplay.ml index 1853862077..3b7730ce96 100644 --- a/lib/wiznotesDisplay.ml +++ b/lib/wiznotesDisplay.ml @@ -461,6 +461,7 @@ let print_mod conf base = else Hutil.incorrect_request conf | None -> Hutil.incorrect_request conf +(* S: merge with print_mod *) let print_view conf base = let auth_file = match diff --git a/lib/wiznotesDisplay.mli b/lib/wiznotesDisplay.mli index ff67aeccb4..99421eb5be 100644 --- a/lib/wiznotesDisplay.mli +++ b/lib/wiznotesDisplay.mli @@ -4,13 +4,34 @@ open Config open Gwdb +(** Returns the path to the wizard notes files associated to the base. *) val dir : config -> base -> string +(** Prints the HTML page displaying the wizard notes. + Fails if wizard authentification is incorrect *) val print : config -> base -> unit + +(** Prints the HTML page displaying editable wizard notes. + Fails if wizard authentification is incorrect or if current user cannot + edit. *) val print_mod : config -> base -> unit + +(** Commits the modification and displays the `OK` page. + Fails if wizard authentification is incorrect *) val print_mod_ok : config -> base -> unit + +(** Same as `print_mod`, but works even if user cannot edit. + It still fails in case of wrong authentification. *) val print_view : config -> base -> unit + +(** Same as `print` but highlights HTML with the speficied + string searched (environment key of search is `s`). + If no search is specified, just prints the wizard notes. *) val print_search : config -> base -> unit +(** Displays the connected wizards. *) val connected_wizards : config -> base -> unit + +(** Same as `connected_wizards`, but starts by updating the wizard + visibility. *) val change_wizard_visibility : config -> base -> unit From 479e0843c34aa4fb6cdc446195ff2055cc701142 Mon Sep 17 00:00:00 2001 From: Steven de Oliveira Date: Tue, 21 Dec 2021 15:04:13 +0100 Subject: [PATCH 24/73] Documenting the Wiki module --- lib/wiki.ml | 43 ++++++++++++++++++++++++++++------------ lib/wiki.mli | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 85 insertions(+), 14 deletions(-) diff --git a/lib/wiki.ml b/lib/wiki.ml index 74119a3ffc..002fdfe50a 100644 --- a/lib/wiki.ml +++ b/lib/wiki.ml @@ -61,7 +61,7 @@ let notes_aliases conf = let rec loop list = match try Some (input_line ic) with End_of_file -> None with Some s -> - let list = + let list = (* S: is it replacable by `String.split_on_char ' '` s? *) try let i = String.index s ' ' in (String.sub s 0 i, @@ -565,22 +565,38 @@ let html_with_summary_of_tlsw conf wi edit_opt s = let s2 = string_of_modify_link conf 0 (s = "") edit_opt in s2 ^ s else s -let rev_extract_sub_part s v = +(* v = 0 -> keeps the last lines until a title occurs, discards the rest *) +(* v = 1 -> *) +let rev_extract_sub_part (s : string) (v : int) : string list = let (lines, _) = lines_list_of_string s in - let rec loop lines lev cnt = - function + let rec loop + (lines : string list) (* The accumulator of lines *) + (lev : int) (* The section level *) + (cnt : int) (* A counter of titles *) + : string list -> string list + = function s :: sl -> - let len = String.length s in - if len > 2 && s.[0] = '=' && s.[len-1] = '=' then - if v = first_cnt - 1 then lines + let len = String.length s in + if len > 2 && s.[0] = '=' && s.[len-1] = '=' then + (* This line is a title *) + if v = first_cnt - 1 then lines + (* S: previous condition is a strange way to write `if v = 0` *) + else + let nlev = section_level s len in + if cnt = v (* *) + then loop (s :: lines) nlev (cnt + 1) sl else - let nlev = section_level s len in - if cnt = v then loop (s :: lines) nlev (cnt + 1) sl - else if cnt > v then - if nlev > lev then loop (s :: lines) lev (cnt + 1) sl else lines + if cnt > v + then + if nlev > lev + then loop (s :: lines) lev (cnt + 1) sl + else lines else loop lines lev (cnt + 1) sl - else if cnt <= v then loop lines lev cnt sl - else loop (s :: lines) lev cnt sl + else + (* This line is not a title *) + if cnt <= v + then loop lines lev cnt sl (* Line is in an ignored section *) + else loop (s :: lines) lev cnt sl (* Keeping the line *) | [] -> lines in loop [] 0 first_cnt lines @@ -744,6 +760,7 @@ let insert_sub_part s v sub_part = in String.concat "\n" (List.rev_append lines sl) +(* TODO: simplify with Str *) let rec find_env s i = match try Some (String.index_from s i '=', String.index_from s i '\n') with diff --git a/lib/wiki.mli b/lib/wiki.mli index 5400383686..54b98cb278 100644 --- a/lib/wiki.mli +++ b/lib/wiki.mli @@ -3,6 +3,35 @@ open Config +(* TLSW: Text Language Stolen to Wikipedia + = title level 1 = + == title level 2 == + ... + ====== title level 6 ====== + * list ul/li item + * list ul/li item + ** list ul/li item 2nd level + ** list ul/li item 2nd level + ... + # list ol/li item + : indentation list dl/dd item + ; list dl dt item ; dd item + ''italic'' + '''bold''' + '''''bold+italic''''' + [[first_name/surname/oc/text]] link; 'text' displayed + [[first_name/surname/text]] link (oc = 0); 'text' displayed + [[first_name/surname]] link (oc = 0); 'first_name surname' displayed + [[[notes_subfile/text]]] link to a sub-file; 'text' displayed + [[[notes_subfile]]] link to a sub-file; 'notes_subfile' displayed + empty line : new paragraph + lines starting with space : displayed as they are (providing 1/ there + are at least two 2/ there is empty lines before and after the group + of lines). + __TOC__ : summary + __SHORT_TOC__ : short summary (unnumbered) + __NOTOC__ : no (automatic) numbered summary *) + type wiki_info = { wi_mode : string; wi_file_path : string -> string; @@ -11,24 +40,49 @@ type wiki_info = val syntax_links : config -> wiki_info -> string -> string +(** Parses a whole TLSW text to a list of strings *) val html_of_tlsw : config -> string -> string list + +(** HTML displaying a table of content for a TLSW file *) val html_with_summary_of_tlsw : config -> wiki_info -> (bool * string * string) option -> string -> string +(** [extract_sub_part tlsw i] + Extracts the `i`th first TLSW sections of `tlsw` *) val extract_sub_part : string -> int -> string list + +(** + The argument is expected to have the form "KEY=value\n"... + This function calculates each Key/value pair and puts it in a list; + except for the key TITLE, that is the second element of the returned tuple. + If there is no title defined, checks if the first line is not empty and does + not start with '=' nor contains '<' nor '[', in which case it is choosen as a + first line. Otherwise, the title is the empty string. +*) val split_title_and_text : string -> (string * string) list * string +(** Prints an exctracted sub part *) val print_sub_part : config -> wiki_info -> bool -> string -> string -> int -> string list -> - unit + unit + +(** Prints an editable part *) val print_mod_view_page : config -> bool -> string -> string -> (bool -> unit) -> (string * string) list -> string -> unit + +(** Commits the changes of a page *) val print_mod_ok : config -> wiki_info -> (string -> string option) -> (string option -> string) -> (string -> (string * string) list * string) -> (string -> string -> unit) -> (string -> string) -> bool -> unit +(*S: shouldn't the following functions be defined elsewhere? *) + +(** Reads the notes alias file (conf.base_env.notes_alias_file or base_path/notes.alias). + File format is "KEY value\n...", returns the list of (KEY,value) *) val notes_aliases : config -> (string * string) list + +(** Given an alias list, finds the corresponding alias for a given string *) val map_notes : (string * string) list -> string -> string From a374534a03b6c89388e0bc0fda7c937b5b789dbf Mon Sep 17 00:00:00 2001 From: Steven de Oliveira Date: Tue, 21 Dec 2021 15:14:50 +0100 Subject: [PATCH 25/73] Documenting UpdateDataDisplay --- lib/updateDataDisplay.mli | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 lib/updateDataDisplay.mli diff --git a/lib/updateDataDisplay.mli b/lib/updateDataDisplay.mli new file mode 100644 index 0000000000..7979016ec8 --- /dev/null +++ b/lib/updateDataDisplay.mli @@ -0,0 +1,7 @@ + +(** Displays a menu for updating Geneweb's dictionary of names, last names, + locations, sources and professions. *) +val print_mod : Config.config -> Gwdb.base -> unit + +(** Updates persons linked to the updated data. *) +val print_mod_ok : Config.config -> Gwdb.base -> unit From 7e3dcaa8df8e4f8e50e67a0b130731266dc40de9 Mon Sep 17 00:00:00 2001 From: Steven de Oliveira Date: Wed, 22 Dec 2021 16:21:51 +0100 Subject: [PATCH 26/73] Documentation of UpdateIndOk --- lib/updateIndOk.mli | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/updateIndOk.mli b/lib/updateIndOk.mli index bac392e1af..4c9db3817d 100644 --- a/lib/updateIndOk.mli +++ b/lib/updateIndOk.mli @@ -2,8 +2,10 @@ open Config open Def open Gwdb +(** Removes a person from the base *) val effective_del_no_commit : base -> (iper, iper, string) gen_person -> unit +(** Adds to the diff the deletion of a person *) val effective_del_commit : config -> base -> (iper, iper, string) gen_person -> unit (** [effective_del] applies [effective_del_no_commit] and [effective_del_commit] *) @@ -18,21 +20,33 @@ val effective_mod -> (iper, Update.key, string) gen_person -> (iper, iper, istr) gen_person +(** Tries to modifies a person and displays a success page if successful *) val print_mod : ?prerr:(config -> base -> Update.update_error -> unit) -> config -> base -> unit +(** Patches the informations of a person by checking the order of events: + for example, a birth should happen before the death of a mother. *) val all_checks_person : base -> (iper, iper, istr) gen_person -> ifam gen_ascend -> - ifam gen_union -> CheckItem.base_warning list + ifam gen_union -> CheckItem.base_warning list + val print_mod_aux : config -> base -> ((iper, Update.key, string) gen_person -> unit) -> unit +(** Renames the image associated to a person *) val rename_image_file : config -> base -> person -> (iper, iper, string) gen_person -> unit +(** Tries to add a person to the base and displays a success HTML page if + successful *) val print_add : config -> base -> unit + +(** Tries to remove a person from the base and displays a success HTML page if + successful *) val print_del : config -> base -> unit +(** Tries to change the order of events for a person and displays a success HTML + page if successful *) val print_change_event_order : config -> base -> unit (* Ajout pour l'API *) From 3391d803e969a5a583e25612c59bb04894902940 Mon Sep 17 00:00:00 2001 From: Steven de Oliveira Date: Wed, 22 Dec 2021 16:22:34 +0100 Subject: [PATCH 27/73] Documentation of UpdateFam --- lib/updateFam.ml | 8 +++++++- lib/updateFam.mli | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/lib/updateFam.ml b/lib/updateFam.ml index 27e339d238..3333d51792 100644 --- a/lib/updateFam.ml +++ b/lib/updateFam.ml @@ -840,7 +840,13 @@ let change_order u ifam n = [] -> if i = n then [ifam] else [] | fam :: faml -> if ifam = fam then - if i = n then ifam :: loop (i + 1) (fam :: faml) else loop i faml + (* S: The following code is strange: if i=n, fam is added to the iterated list; + at the next iteration, we reach the same block and i = n+1, hence fam is removed *) + if i = n + then ifam :: loop (i + 1) (fam :: faml) + else loop i faml + + (* S: Same remark than before: fam is added to the iterated list, hence discarded after *) else if i = n then ifam :: loop (i + 1) (fam :: faml) else fam :: loop (i + 1) faml in diff --git a/lib/updateFam.mli b/lib/updateFam.mli index f1276c67ec..94a6fb655b 100644 --- a/lib/updateFam.mli +++ b/lib/updateFam.mli @@ -5,22 +5,40 @@ open Config open Def open Gwdb +(** Returns the update key associated to a person *) val person_key : base -> iper -> Update.key +(** The main page for updating families. *) val print_update_fam : config -> base -> (Update.key, ifam, string) gen_family * Update.key gen_couple * Update.key gen_descend -> string -> unit +(** Displays the form for adding families *) val print_add : config -> base -> unit + +(** Displays a form for updating a family *) val print_mod : config -> base -> unit + +(** Displays a page for validating the deletion of the family in argument *) val print_del : config -> base -> unit + +(** Displays a menu for inverting the order of two families *) val print_inv : config -> base -> unit + +(** Associates parents to a person *) val print_add_parents : config -> base -> unit +(** [change_order p f i] + Returns the families of `p` where `f` is at the ith position. + `i` must not be 0. *) val change_order : person -> ifam -> int -> ifam list + +(** Displays a menu to change the family order *) val print_change_order : config -> base -> unit + +(** Displays the form for changing the order of events for a family *) val print_change_event_order : config -> base -> unit val string_family_of : From ca44eaf2ae39f80fed6ea0287851187ee897d003 Mon Sep 17 00:00:00 2001 From: Steven de Oliveira Date: Wed, 22 Dec 2021 16:23:04 +0100 Subject: [PATCH 28/73] Beginning of documentation of Util --- lib/util.mli | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/lib/util.mli b/lib/util.mli index 4f24f71848..9bb124be0d 100644 --- a/lib/util.mli +++ b/lib/util.mli @@ -4,17 +4,32 @@ open Config open Def open Gwdb +(** Returns the current dir + (changed by `gwd` if geneweb is running on windows) *) val cnt_dir : string ref + +(** Returns the image prefix (conf.image_prefix) *) val image_prefix : config -> string + +(** Alias for !GWPARAM.base_path *) val base_path : string list -> string -> string + +(** Alias for !GWPARAM.bpath *) val bpath : string -> string +(** Checks that the file in argument belong to one of the asserts dir + (defined in the Secure module *) val search_in_assets : string -> string +(** Returns the path to the template file in parameter *) val etc_file_name : config -> string -> string +(** Returns the date of the base directory last update *) val escache_value : base -> string + +(** Commits the patches and logs the modification *) val commit_patches : config -> base -> unit + val update_wf_trace : config -> string -> unit val get_referer : config -> string From d0c6218d0529bc1d7b32574e42ae4d85da3ca9af Mon Sep 17 00:00:00 2001 From: Steven de Oliveira Date: Thu, 23 Dec 2021 13:47:15 +0100 Subject: [PATCH 29/73] Doc of updateInd --- lib/updateInd.ml | 1 + lib/updateInd.mli | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/lib/updateInd.ml b/lib/updateInd.ml index 763dea9107..fdedd65984 100644 --- a/lib/updateInd.ml +++ b/lib/updateInd.ml @@ -759,6 +759,7 @@ let print_foreach print_ast _eval_expr = in print_foreach +(* S: check on `m` should be made beforehand; what about plugins? *) let print_update_ind conf base p digest = match p_getenv conf.env "m" with Some ("MRG_IND_OK" | "MRG_MOD_IND_OK") | Some ("MOD_IND" | "MOD_IND_OK") | diff --git a/lib/updateInd.mli b/lib/updateInd.mli index 419fa93077..2928552470 100644 --- a/lib/updateInd.mli +++ b/lib/updateInd.mli @@ -7,11 +7,20 @@ open Gwdb val string_person_of : base -> person -> (iper, Update.key, string) gen_person +(** The main HTML page displayed after an update. + Based on template updind.txt *) val print_update_ind : config -> base -> (iper, Update.key, string) gen_person -> string -> unit +(** Displays an HTML form with empty fields for adding a person *) val print_add : config -> base -> unit + +(** Displays a page for validating the deletion of a person *) val print_del : config -> base -> unit + +(** Displays a form for updating a person *) val print_mod : config -> base -> unit + +(** Displays the form for changing the order of events for a person *) val print_change_event_order : config -> base -> unit From ca8fa526ef30efffbcf7c1c793002387315196b1 Mon Sep 17 00:00:00 2001 From: Steven de Oliveira Date: Thu, 23 Dec 2021 14:05:05 +0100 Subject: [PATCH 30/73] Documentation of BirthdayDisplay --- lib/birthdayDisplay.mli | 46 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 lib/birthdayDisplay.mli diff --git a/lib/birthdayDisplay.mli b/lib/birthdayDisplay.mli new file mode 100644 index 0000000000..6a519eb9c2 --- /dev/null +++ b/lib/birthdayDisplay.mli @@ -0,0 +1,46 @@ + +val gen_print : + Config.config -> + Gwdb.base -> + int -> + (unit -> + Gwdb.person * + (Config.config -> Gwdb.base -> Gwdb.person -> string)) -> + bool -> unit + +(** Displays birthdays for a given month *) +val print_birth : Config.config -> Gwdb.base -> int -> unit + +(** Displays death anniversaries for a given month *) +val print_dead : Config.config -> Gwdb.base -> int -> unit + +(** Displays marriage anniversaries for a given month *) +val print_marriage : Config.config -> Gwdb.base -> int -> unit + +val gen_print_menu_birth : + Config.config -> + Gwdb.base -> + (unit -> + Gwdb.person * + (Config.config -> Gwdb.base -> Gwdb.person -> string)) -> + (unit -> 'a) -> unit + +(** Displays the main anniversaries menu *) +val print_menu_birth : Config.config -> Gwdb.base -> unit + +val gen_print_menu_dead : + Config.config -> + Gwdb.base -> + (unit -> + Gwdb.person * + (Config.config -> Gwdb.base -> Gwdb.person -> string)) -> + (unit -> 'a) -> unit + +(** Displays the main death anniversaries menu *) +val print_menu_dead : Config.config -> Gwdb.base -> unit + +(** Displays the main marriage anniversaries menu *) +val print_menu_marriage : Config.config -> Gwdb.base -> unit + +(** Displays the menu of anniversaries modification *) +val print_anniversaries : Config.config -> unit From 1e5713dfa7116fa4a5d26bcd32745e77f9290944 Mon Sep 17 00:00:00 2001 From: Steven de Oliveira Date: Thu, 23 Dec 2021 14:22:18 +0100 Subject: [PATCH 31/73] Documentation of AdvSearchOkDisplay --- lib/advSearchOkDisplay.mli | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 lib/advSearchOkDisplay.mli diff --git a/lib/advSearchOkDisplay.mli b/lib/advSearchOkDisplay.mli new file mode 100644 index 0000000000..6969845bc5 --- /dev/null +++ b/lib/advSearchOkDisplay.mli @@ -0,0 +1,4 @@ + +(** Displays the results of an advanced search *) +val print : Config.config -> Gwdb.base -> unit + From b0c860b80311a5fdb9bc47ebe142b6550917a6b9 Mon Sep 17 00:00:00 2001 From: Steven de Oliveira Date: Thu, 23 Dec 2021 14:22:29 +0100 Subject: [PATCH 32/73] Documentation of CousinsDisplay --- lib/cousinsDisplay.mli | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 lib/cousinsDisplay.mli diff --git a/lib/cousinsDisplay.mli b/lib/cousinsDisplay.mli new file mode 100644 index 0000000000..3380290682 --- /dev/null +++ b/lib/cousinsDisplay.mli @@ -0,0 +1,3 @@ + +(** Displays the cousins menu *) +val print : Config.config -> Gwdb.base -> Gwdb.person -> unit From ba3227e39ebd6607f86ed037931b8ce6e5d546f5 Mon Sep 17 00:00:00 2001 From: Steven de Oliveira Date: Thu, 23 Dec 2021 14:39:47 +0100 Subject: [PATCH 33/73] Documentation of DescendDisplay --- lib/descendDisplay.mli | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 lib/descendDisplay.mli diff --git a/lib/descendDisplay.mli b/lib/descendDisplay.mli new file mode 100644 index 0000000000..5730b55bc3 --- /dev/null +++ b/lib/descendDisplay.mli @@ -0,0 +1,29 @@ + +(** Displays the descendants of the selected person *) +val print : Config.config -> Gwdb.base -> Gwdb.person -> unit + +(* Public functions for API (plugin v7_descend) *) +val display_descendants_level : + Config.config -> Gwdb.base -> int -> Gwdb.person -> unit + +val display_descendants_with_numbers : + Config.config -> Gwdb.base -> int -> Gwdb.person -> unit + +val display_descendant_index : + Config.config -> Gwdb.base -> int -> Gwdb.person -> unit + +val display_spouse_index : + Config.config -> Gwdb.base -> int -> Gwdb.person -> unit + +val display_descendant_with_table : + Config.config -> Gwdb.base -> int -> Gwdb.person -> unit + +val print_tree : + Config.config -> Gwdb.base -> int -> Gwdb.person -> unit + +val print_aboville : + Config.config -> Gwdb.base -> int -> Gwdb.person -> unit + +val desmenu_print : + Config.config -> Gwdb.base -> Gwdb.person -> unit + From 99598988ed5870c412c1547dbd97d8e28a7416c8 Mon Sep 17 00:00:00 2001 From: Steven de Oliveira Date: Thu, 23 Dec 2021 15:18:13 +0100 Subject: [PATCH 34/73] Documentation of HistoryDiffDisplay --- lib/historyDiffDisplay.mli | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 lib/historyDiffDisplay.mli diff --git a/lib/historyDiffDisplay.mli b/lib/historyDiffDisplay.mli new file mode 100644 index 0000000000..297c7b6a7f --- /dev/null +++ b/lib/historyDiffDisplay.mli @@ -0,0 +1,9 @@ + +(** Displays the history list associated to the history file in argument *) +val print_clean : Config.config -> unit + +(** Cleans the history associated to the history file in argument *) +val print_clean_ok : Config.config -> unit + +(** Intepretation of the template file updhist_diff.txt *) +val print : Config.config -> Gwdb.base -> unit From c91baed9682f7e84830320d4aced6310fef871b6 Mon Sep 17 00:00:00 2001 From: Steven de Oliveira Date: Thu, 23 Dec 2021 15:19:36 +0100 Subject: [PATCH 35/73] Adding miscellaneous documentation --- lib/history.mli | 3 ++ lib/hutil.mli | 2 ++ lib/perso.mli | 5 +++ lib/updateFamOk.ml | 21 ++++++++++-- lib/updateFamOk.mli | 79 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 107 insertions(+), 3 deletions(-) create mode 100644 lib/updateFamOk.mli diff --git a/lib/history.mli b/lib/history.mli index 9a395a7a35..48c9458174 100644 --- a/lib/history.mli +++ b/lib/history.mli @@ -10,7 +10,10 @@ val file_name : config -> string val record : config -> base -> (iper, iper, ifam, string) base_changed -> string -> unit val notify : config -> base -> string -> unit +(** Displays an history of updates *) val print : config -> base -> unit + +(** Same as `print`, but with a default search*) val print_search : config -> base -> unit diff --git a/lib/hutil.mli b/lib/hutil.mli index e1b2fca737..1e8d75ae92 100644 --- a/lib/hutil.mli +++ b/lib/hutil.mli @@ -25,4 +25,6 @@ val interp : val interp_no_header : config -> string -> ('a, 'b) Templ.interp_fun -> 'a Templ.env -> 'b -> unit +(** Displays the calendar; if no key is set, it will use today's date =. + Based on template file calendar.txt *) val print_calendar : config -> unit diff --git a/lib/perso.mli b/lib/perso.mli index 4a4c2f2dd6..fb8dd441ea 100644 --- a/lib/perso.mli +++ b/lib/perso.mli @@ -18,8 +18,13 @@ val interp_templ_with_menu : val interp_notempl_with_menu : (bool -> unit) -> string -> config -> base -> person -> unit +(** Displays the HTML page of a person *) val print : ?no_headers:bool -> config -> base -> person -> unit + +(** Displays the ascendants of the selected person *) val print_ascend : config -> base -> person -> unit + +(** Displays links to pages associated to the person *) val print_what_links : config -> base -> person -> unit val links_to_ind diff --git a/lib/updateFamOk.ml b/lib/updateFamOk.ml index cb8f3ef974..b516dc02df 100644 --- a/lib/updateFamOk.ml +++ b/lib/updateFamOk.ml @@ -24,6 +24,7 @@ let raw_get conf key = Some v -> v | None -> failwith (key ^ " unbound") +(* This is exactly the same function than before! *) let get conf key = match p_getenv conf.env key with Some v -> v @@ -325,15 +326,29 @@ let rec reconstitute_sorted_fevents conf cnt = let el = reconstitute_sorted_fevents conf (cnt + 1) in (id, pos) :: el | _ -> [] -let reconstitute_from_fevents nsck empty_string fevents = +(* S: + * why is marriage record transformed into a tuple? + *) +let reconstitute_from_fevents + (nsck : bool) + (empty_string : 'string) + (fevents : ('person, 'string) Def.gen_fam_event list) = (* On tri les évènements pour être sûr. *) let fevents = CheckItem.sort_events (fun evt -> CheckItem.Fsort evt.efam_name) (fun evt -> evt.efam_date) fevents in - let found_marriage = ref None in - let found_divorce = ref None in + let found_marriage : ( + Def.relation_kind + * Def.cdate + * 'string + * 'string + * 'string + * ('person * Def.witness_kind) array + ) option ref = ref None in + + let found_divorce : Def.divorce option ref = ref None in let mk_marr evt kind = let e = Some (kind, evt.efam_date, evt.efam_place, evt.efam_note, evt.efam_src, evt.efam_witnesses) in match !found_marriage with diff --git a/lib/updateFamOk.mli b/lib/updateFamOk.mli new file mode 100644 index 0000000000..e6a0e933b8 --- /dev/null +++ b/lib/updateFamOk.mli @@ -0,0 +1,79 @@ + +(** [reconstitute_from_fevents nsck empty_string family_events] + Returns a tuple with: + * marriage information (relation kind, date, place, notes, source); + * divorce information; + * marriage witnesses; + Boolean `nsck' is true if no check have been made on the married + persons sex. + *) +val reconstitute_from_fevents : + bool -> + 'string -> + ('person, 'string) Def.gen_fam_event list -> + (Def.relation_kind * Def.cdate * 'string * 'string * 'string) * Def.divorce * + ('person * Def.witness_kind) array + +val effective_mod : + Config.config -> + Gwdb.base -> + bool -> + (Update.key, Gwdb.ifam, string) Def.gen_family -> + Update.key Def.gen_couple -> + Update.key Def.gen_descend -> + Gwdb.ifam * (Gwdb.iper, Gwdb.ifam, Gwdb.istr) Def.gen_family * + Gwdb.iper Def.gen_couple * Gwdb.iper Def.gen_descend + +(** Removes a family from the base *) +val effective_del : + Config.config -> Gwdb.base -> Gwdb.iper -> Gwdb.family -> unit + +val all_checks_family : + Config.config -> + Gwdb.base -> + Gwdb.ifam -> + (Gwdb.iper, Gwdb.ifam, Gwdb.istr) Def.gen_family -> + Gwdb.iper Def.gen_couple -> + Gwdb.iper Def.gen_descend -> + Update.key Def.gen_couple * + Update.key Def.gen_descend * + (('i array * 'j array) * ('i array * 'j array)) option -> + CheckItem.base_warning list * CheckItem.base_misc list + +(** Displays a family page in HTML after an update. + Used by MergeFamOk *) +val print_family : + Config.config -> + Gwdb.base -> + CheckItem.base_warning list * CheckItem.base_misc list -> + Gwdb.iper Adef.gen_couple -> Gwdb.iper Def.gen_descend -> unit + +(** Deletes a family and displays a page confirming its deletion *) +val print_del : Config.config -> Gwdb.base -> unit + +(** Displays the page after validating the addition of a family in the base *) +val print_add : Config.config -> Gwdb.base -> unit + +val print_add_parents : Config.config -> Gwdb.base -> unit + +val print_mod_aux : + Config.config -> + Gwdb.base -> + ((string * string * int * Update.create * string, Gwdb.ifam, + string) + Def.gen_family -> + (string * string * int * Update.create * string) Def.gen_couple -> + (string * string * int * Update.create * string) Def.gen_descend -> + unit) -> + unit + +val print_mod : Config.config -> Gwdb.base -> unit + +val print_inv : Config.config -> Gwdb.base -> unit + +(** Changes the family order for a person *) +val print_change_order_ok : Config.config -> Gwdb.base -> unit + +(** Changes the evenements order fo a family *) +val print_change_event_order : Config.config -> Gwdb.base -> unit + From bdafb2dbf5656a133946ac83f465e821f70788eb Mon Sep 17 00:00:00 2001 From: Steven de Oliveira Date: Thu, 23 Dec 2021 15:36:19 +0100 Subject: [PATCH 36/73] Documentation of MergeIndDisplay --- lib/mergeIndDisplay.mli | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 lib/mergeIndDisplay.mli diff --git a/lib/mergeIndDisplay.mli b/lib/mergeIndDisplay.mli new file mode 100644 index 0000000000..5ec15e9208 --- /dev/null +++ b/lib/mergeIndDisplay.mli @@ -0,0 +1,6 @@ + +(** Displays a form for merging two persons *) +val print : Config.config -> Gwdb.base -> unit + +(** Displays the page for killing ancestors (undocumented feature) *) +val print_kill_ancestors : Config.config -> Gwdb.base -> unit From 4588b70cff784626a35618cbe7e8157af6874eb7 Mon Sep 17 00:00:00 2001 From: Steven de Oliveira Date: Thu, 23 Dec 2021 15:46:20 +0100 Subject: [PATCH 37/73] Documentation of BirthDeathDisplay --- lib/birthDeathDisplay.mli | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 lib/birthDeathDisplay.mli diff --git a/lib/birthDeathDisplay.mli b/lib/birthDeathDisplay.mli new file mode 100644 index 0000000000..3a50d8e5ef --- /dev/null +++ b/lib/birthDeathDisplay.mli @@ -0,0 +1,27 @@ + +(** Lists the last births *) +val print_birth : Config.config -> Gwdb.base -> unit + +(** Lists tje last deaths *) +val print_death : Config.config -> Gwdb.base -> unit + +(** Lists the persons who lived the longest *) +val print_longest_lived : Config.config -> Gwdb.base -> unit + +(** Displays the list of the oldest persons that are still alive or, if unknown, + whose death are not probable *) +val print_oldest_alive : Config.config -> Gwdb.base -> unit + +(** Lists the last marriages *) +val print_marriage : Config.config -> Gwdb.base -> unit + +(** Displays the list of the oldest couples that still exist *) +val print_oldest_engagements : Config.config -> Gwdb.base -> unit + +(** Displays several links for statistics: latest births, death, marriages, the + oldest couples, persons that are alive and who lived the longest, as well as + a population pyramid *) +val print_statistics : Config.config -> unit + +(** Displays a population pyramid from the base data *) +val print_population_pyramid : Config.config -> Gwdb.base -> unit From 085a631d4fedf45c413381b47a2800cdd5ec5122 Mon Sep 17 00:00:00 2001 From: Steven de Oliveira Date: Thu, 23 Dec 2021 15:53:38 +0100 Subject: [PATCH 38/73] Documentation of NotesDisplay --- lib/notesDisplay.mli | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 lib/notesDisplay.mli diff --git a/lib/notesDisplay.mli b/lib/notesDisplay.mli new file mode 100644 index 0000000000..16a193f718 --- /dev/null +++ b/lib/notesDisplay.mli @@ -0,0 +1,21 @@ + +(** Displays the page list in argument *) +val print_linked_list : + Config.config -> + Gwdb.base -> + (Gwdb.iper, Gwdb.ifam) Def.NLDB.page list -> unit + +(** Displays the base notes *) +val print : Config.config -> Gwdb.base -> unit + +(** Displays a text form for writing notes *) +val print_mod : Config.config -> Gwdb.base -> unit + +(** Updates notes *) +val print_mod_ok : Config.config -> Gwdb.base -> unit + +(** Displays a menu to search in notes *) +val print_misc_notes : Config.config -> Gwdb.base -> unit + +(** Same as `print_misc_notes`, with a default search *) +val print_misc_notes_search : Config.config -> Gwdb.base -> unit From 2a5872b9b78abaf2ca7578a448e94aa19aed9b30 Mon Sep 17 00:00:00 2001 From: Steven de Oliveira Date: Thu, 23 Dec 2021 16:05:03 +0100 Subject: [PATCH 39/73] Documentation of MergeDupDisplay --- lib/mergeDupDisplay.mli | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 lib/mergeDupDisplay.mli diff --git a/lib/mergeDupDisplay.mli b/lib/mergeDupDisplay.mli new file mode 100644 index 0000000000..48d38173d7 --- /dev/null +++ b/lib/mergeDupDisplay.mli @@ -0,0 +1,10 @@ + +(** Displays a menu for merging possible duplications of persons *) +val main_page : Config.config -> Gwdb.base -> unit + +(** Either displays the merge dupliate menu if `answer_y` is not a key of the + request, or a form for merging two persons *) +val answ_ind_y_n : Config.config -> Gwdb.base -> unit + +(** Same than `answ_ind_y_n` but for families *) +val answ_fam_y_n : Config.config -> Gwdb.base -> unit From c8c5700062c4924fbc84aa52f5a8e9a3083cca92 Mon Sep 17 00:00:00 2001 From: Steven de Oliveira Date: Thu, 23 Dec 2021 16:14:46 +0100 Subject: [PATCH 40/73] Documenting MergeFamDisplay --- lib/mergeFamDisplay.mli | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 lib/mergeFamDisplay.mli diff --git a/lib/mergeFamDisplay.mli b/lib/mergeFamDisplay.mli new file mode 100644 index 0000000000..6352aec467 --- /dev/null +++ b/lib/mergeFamDisplay.mli @@ -0,0 +1,11 @@ + +(** Displays differences between couples ; relation kind, marriage, marriage place + and divorce. *) +val print_differences : + Config.config -> + Gwdb.base -> + (Gwdb.iper * Gwdb.iper) list -> + Gwdb.ifam * Gwdb.family -> Gwdb.ifam * Gwdb.family -> unit + +(** Displays a menu for merging families. Couples must be identical (modulo reversion). *) +val print : Config.config -> Gwdb.base -> unit From 10762635bcace56864956f26ebfd230baa16a255 Mon Sep 17 00:00:00 2001 From: Steven de Oliveira Date: Thu, 23 Dec 2021 16:23:30 +0100 Subject: [PATCH 41/73] Miscellanesous files and doc --- lib/mergeDisplay.mli | 2 ++ lib/some.mli | 30 ++++++++++++++++++++++++++++++ lib/updateFamOk.mli | 1 + 3 files changed, 33 insertions(+) create mode 100644 lib/some.mli diff --git a/lib/mergeDisplay.mli b/lib/mergeDisplay.mli index 040532b435..df45105261 100644 --- a/lib/mergeDisplay.mli +++ b/lib/mergeDisplay.mli @@ -5,6 +5,8 @@ open Gwdb open Config val print_someone : config -> base -> person -> unit + +(** Displays a menu for merging two persons *) val print : config -> base -> person -> unit val print_possible_continue_merging : config -> base -> unit diff --git a/lib/some.mli b/lib/some.mli new file mode 100644 index 0000000000..c57fef7f6a --- /dev/null +++ b/lib/some.mli @@ -0,0 +1,30 @@ + +val surname_not_found : Config.config -> string -> unit + +val persons_of_fsname : + Config.config -> + Gwdb.base -> + (Gwdb.base -> string -> Gwdb.istr list) -> + (Gwdb.istr -> Gwdb.iper list) -> + (Gwdb.person -> Gwdb.istr) -> + string -> (string * Gwdb.istr * Gwdb.iper list) list * (string -> string) + +val first_name_print : Config.config -> Gwdb.base -> string -> unit + +val surname_print : + Config.config -> + Gwdb.base -> (Config.config -> string -> unit) -> string -> unit + +val search_surname : + Config.config -> Gwdb.base -> string -> Gwdb.iper list + +val search_surname_print : + Config.config -> + Gwdb.base -> (Config.config -> string -> unit) -> string -> unit + +val search_first_name : + Config.config -> + Gwdb.base -> string -> (string * (Mutil.StrSet.t * Gwdb.iper list)) list + +val search_first_name_print : + Config.config -> Gwdb.base -> string -> unit diff --git a/lib/updateFamOk.mli b/lib/updateFamOk.mli index e6a0e933b8..4e1f2a976c 100644 --- a/lib/updateFamOk.mli +++ b/lib/updateFamOk.mli @@ -69,6 +69,7 @@ val print_mod_aux : val print_mod : Config.config -> Gwdb.base -> unit +(** Reverses families *) val print_inv : Config.config -> Gwdb.base -> unit (** Changes the family order for a person *) From afec298effe04ce18762f147065a1051e094be44 Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed Date: Mon, 27 Dec 2021 01:55:38 +0100 Subject: [PATCH 42/73] Gwdb-legacy Documentation --- bin/gwc/db1link.ml | 4 +- lib/def/def.ml | 25 +- lib/gwdb-legacy/database.ml | 49 ++-- lib/gwdb-legacy/database.mli | 13 ++ lib/gwdb-legacy/dbdisk.mli | 179 ++++++++++---- lib/gwdb-legacy/dutil.ml | 3 +- lib/gwdb-legacy/dutil.mli | 36 ++- lib/gwdb-legacy/gwdb_driver.ml | 2 +- lib/gwdb-legacy/gwdb_gc.ml | 3 + lib/gwdb-legacy/gwdb_gc.mli | 7 + lib/gwdb-legacy/iovalue.ml | 1 + lib/gwdb-legacy/iovalue.mli | 45 +--- lib/gwdb-legacy/outbase.ml | 16 +- lib/gwdb-legacy/outbase.mli | 29 +++ lib/gwdb_driver.mli/gwdb_driver.mli | 348 +++++++++++++++++++++++++++- lib/util/futil.mli | 5 + lib/util/name.mli | 4 +- 17 files changed, 649 insertions(+), 120 deletions(-) create mode 100644 lib/gwdb-legacy/gwdb_gc.mli create mode 100644 lib/gwdb-legacy/outbase.mli diff --git a/bin/gwc/db1link.ml b/bin/gwc/db1link.ml index fef834900c..c437fdf6ef 100644 --- a/bin/gwc/db1link.ml +++ b/bin/gwc/db1link.ml @@ -1480,7 +1480,7 @@ let empty_base : cbase = ; norigin_file = "" ; efiles = fun _ -> [] } } -(** Extend information from the [gen.g_base] and create database *) +(** Extract information from the [gen.g_base] and create database *) let make_base bname gen per_index_ic per_ic = let _ = Printf.eprintf "pcnt %d persons %d\n" gen.g_pcnt @@ -1547,7 +1547,7 @@ let output_wizard_notes bdir wiznotes = end wiznotes end -(** Create file with command used to call this program *) +(** Create file that contains command used to call this program *) let output_command_line bdir = let oc = open_out (Filename.concat bdir "command.txt") in Printf.fprintf oc "%s" Sys.argv.(0); diff --git a/lib/def/def.ml b/lib/def/def.ml index 309aa7fd62..b94c5f578e 100644 --- a/lib/def/def.ml +++ b/lib/def/def.ml @@ -88,7 +88,7 @@ type burial = | Buried of cdate | Cremated of cdate -(** Rules for access to the personal data *) +(** Rights for access to the personal data *) type access = IfTitles | Public | Private (** Title name *) @@ -238,8 +238,8 @@ type ('iper, 'person, 'string) gen_person = titles : 'string gen_title list; (* relations with not native parents *) rparents : ('person, 'string) gen_relation list; - (* related persons like (father of winessed family, - concerned person of wintessed event, adopted child, etc.) *) + (* related persons like (father of witnessed family, + concerned person of witnessed event, adopted child, etc.) *) related : 'person list; occupation : 'string; sex : sex; @@ -268,7 +268,7 @@ type ('iper, 'person, 'string) gen_person = (** Person's ascendants with their consangunity degree *) type 'family gen_ascend = { parents : 'family option; consang : Adef.fix } -(* TODOOCP : doc *) +(* Person's families to which he belongs (union of families) *) type 'family gen_union = { family : 'family array } (** Children of the family *) @@ -335,21 +335,24 @@ type ('iper, 'person, 'family, 'descend, 'title, 'pevent, 'fevent) warning = type ('person, 'descend, 'title) misc = MissingSources (** Database note/page reading mode *) -type rn_mode = RnAll | Rn1Ln | RnDeg +type rn_mode = + | RnAll (** Read all content *) + | Rn1Ln (** Read first line *) + | RnDeg (** If file isn't empty returns a space *) -(** Database note/page information structure *) +(** Database note/page explorer structure *) type base_notes = { (* read content of the page with giving mode. - Page '' represent database note *) + Page "" represent database note *) nread : string -> rn_mode -> string - (* origin file where page is stored *) + (* origin .gw filename *) ; norigin_file : string - (* returns list of all pages and database note *) + (* returns list of extended pages *) ; efiles : unit -> string list } -(** Update history *) +(** Update database history *) type ('iper, 'person, 'family, 'string) base_changed = U_Add_person of ('iper, 'person, 'string) gen_person | U_Modify_person of @@ -381,7 +384,7 @@ type ('iper, 'person, 'family, 'string) base_changed = ('iper, 'person, 'string) gen_person * ('iper, 'person, 'string) gen_person * bool | U_Notes of int option * string -(** TODO : doc *) +(** TODOOCP : doc *) module NLDB = struct type ('a, 'b) page = | PgInd of 'a diff --git a/lib/gwdb-legacy/database.ml b/lib/gwdb-legacy/database.ml index 3d23af6c51..f1b3c87210 100644 --- a/lib/gwdb-legacy/database.ml +++ b/lib/gwdb-legacy/database.ml @@ -51,20 +51,22 @@ let move_with_backup src dst = names.inx - index for names, strings of first names and surnames offset to sindex : binary_int offset to findex : binary_int - 1st index (names) : value + 1st index (mixes between names) : value array, length = "table_size", associating: - a hash value of a "crushed" (module "Name") name (modulo length) - to the array of indexes of the corresponding persons - 2nd index (surnames strings) : value + 2nd index (surnames sub-strings) : value array, length = "table_size", associating: - - a hash value of the "crushed" (module "Name") first name or - surname (modulo length) - - to the array of the corresponding string indexes - 3rd index (surnames strings) : value + - a hash value of the "crushed" (module "Name") surname sub-string + (modulo length) + - to the array of the corresponding surnnames (string indexes) that contains + giving surname substring + 3rd index (first name sub-strings) : value array, length = "table_size", associating: - - a hash value of the "crushed" (module "Name") first name or - surname (modulo length) - - to the array of the corresponding string indexes + - a hash value of the "crushed" (module "Name") first name sub-string + (modulo length) + - to the array of the corresponding string indexes that contains + giving fiest name substring names.acc - direct accesses to arrays inside names.inx @@ -76,10 +78,10 @@ let move_with_backup src dst = - to its index in the string array strings list array (length = string array length) - associating a string index - - to the index of the next index holding the same hash value + - to the index of the next index (previus value) holding the same hash value snames.inx - index for surnames - binary tree + array ordered by surname - associating the string index of a surname - to a pointer (int) to snames.dat @@ -87,19 +89,29 @@ let move_with_backup src dst = table of list of persons holding a surname fnames.inx - index for first names - binary tree + array ordered by first name - associating the string index of a first name - to a pointer (int) to fnames.dat fnames.dat - data associated with fnames.inx table of list of persons holding a first name -the corresponding list of persons holding this surname + notes - text file containing data base notes. + + notes_d - directory containing .txt for each extended page + + particles.txt - text file with autorised name's particles patches - patches When updated, none of the previous files are modified. Only this one is written and rewritten. It holds a record of type "patches", composed of association lists "index" - "new value". + + nb_persons - number of real persons (with those added by patches) + + synchro_patches - timestamped history of base's modification. + + restrict - defines visibility of each person in the base *) exception Found of int @@ -275,6 +287,7 @@ let binary_search_next arr cmp = let new_persons_of_first_name_or_surname cmp_str cmp_istr base_data params = let (proj, person_patches, names_inx, names_dat, bname) = params in let fname_dat = Filename.concat bname names_dat in + (* content of "snames.inx" *) let bt = lazy begin let fname_inx = Filename.concat bname names_inx in @@ -284,6 +297,7 @@ let new_persons_of_first_name_or_surname cmp_str cmp_istr base_data params = bt end in + (* ordered by string name's ids attached to the patched persons *) let patched = (* This is not useful to keep the list of ipers here because [patched] is not used by [find] but only by [cursor] and [next] *) @@ -829,6 +843,7 @@ let opendb bname = flush stderr; None in + (* skipping array length *) let ic2_string_start_pos = match version with | GnWb0024 | GnWb0023 | GnWb0022 -> Dutil.int_size @@ -931,6 +946,8 @@ let opendb bname = close_out oc ; !cnt in + (* read person number without considering pended patches from the "nb_persons". If + file doesn't exists then count and write it to the file *) let nbp_read () = if Sys.file_exists nbp_fname then begin @@ -941,6 +958,7 @@ let opendb bname = end else npb_init () in let commit_patches () = + (* read real person number (considering pending patches) *) let nbp = Hashtbl.fold begin fun ip p acc -> try @@ -966,6 +984,7 @@ let opendb bname = Hashtbl.iter (Hashtbl.replace ht) ht' ; Hashtbl.clear ht' ; in + (* commit every pending patch *) aux patches.h_person pending.h_person ; aux patches.h_ascend pending.h_ascend ; aux patches.h_union pending.h_union ; @@ -973,6 +992,7 @@ let opendb bname = aux patches.h_couple pending.h_couple ; aux patches.h_descend pending.h_descend ; aux patches.h_string pending.h_string ; + (* update "pathes" file *) let tmp_fname = Filename.concat bname "1patches" in let fname = Filename.concat bname "patches" in let oc9 = Secure.open_out_bin tmp_fname in @@ -1155,6 +1175,7 @@ let opendb bname = ; func = base_func ; version } +(* record_acces of the given table (already present in the memory) *) let record_access_of tab = { Dbdisk.load_array = (fun () -> ()) ; get = (fun i -> tab.(i)) @@ -1188,6 +1209,8 @@ let make bname particles ((persons, families, strings, bnotes) as _arrays) : Dbd ; bnotes = bnotes ; bdir = bdir } in + (* since this function as called exclusively to create a database, it doesn't + needs for functionalities over arays *) let func : Dbdisk.base_func = { person_of_key = (fun _ -> assert false) ; persons_of_name = (fun _ -> assert false) diff --git a/lib/gwdb-legacy/database.mli b/lib/gwdb-legacy/database.mli index 9bd4aae06e..f4fb9940e0 100644 --- a/lib/gwdb-legacy/database.mli +++ b/lib/gwdb-legacy/database.mli @@ -1,7 +1,15 @@ (* Copyright (c) 1998-2007 INRIA *) +(** Initialise [dsk_base] from the database situated in the specified directory. + Initialises both data and functionallity part. *) val opendb : string -> Dbdisk.dsk_base +(** [make bname particles ((persons, ascendants, unions) (families, couples, + descendants) strings base_notes)] returns initialised with giving data + [dsk_base]. This function is called exclusively for database creating + purpose. It means that, it contains only data without functionalities. + Either call [opendb] on existing database or call [Gwdb.make], if you + want to make requests. *) val make : string -> string list @@ -16,6 +24,11 @@ val make -> Dbdisk.dsk_base (* Ajout pour l'API *) + +(** List of commited modifications inside the database. First element is a timestamp of a commit, + second - changed/added by considered commit person ids, third - changed/added by considered commit families ids. *) type synchro_patch = { mutable synch_list : (string * int list * int list) list } + +(** Get [synchro_patch] from the giving database directory. *) val input_synchro : string -> synchro_patch diff --git a/lib/gwdb-legacy/dbdisk.mli b/lib/gwdb-legacy/dbdisk.mli index ed749012e9..8c951ecfb4 100644 --- a/lib/gwdb-legacy/dbdisk.mli +++ b/lib/gwdb-legacy/dbdisk.mli @@ -1,3 +1,5 @@ +(** {1 Aliases to [Def] and [Adef]} *) + type fix = Adef.fix (* FIXME: expose its type *) type cdate = Def.cdate (* FIXME: expose its type *) @@ -241,74 +243,167 @@ type 'person gen_couple = 'person Def.gen_couple (* FIXME: expose its type *) type 'person gen_descend = 'person Def.gen_descend = { children : 'person array } +(** Extended person's entry in the base *) type dsk_person = (int, int, int) gen_person + +(** Person's ascendants entry in the base *) type dsk_ascend = int gen_ascend + +(** Person's union entry in the base *) type dsk_union = int gen_union + +(** Family's entry in the base *) type dsk_family = (int, int, int) gen_family + +(** Family's couple entry in the base *) type dsk_couple = int gen_couple + +(** Family's descendants entry in the base *) type dsk_descend = int gen_descend +(** Nobility title in the base *) type dsk_title = int gen_title +(** Type that define the functions to use to access and manipulate with + database arrays. *) type 'a record_access = - { load_array : unit -> unit - ; get : int -> 'a - ; get_nopending : int -> 'a - ; set : int -> 'a -> unit - ; mutable len : int - ; output_array : out_channel -> unit - ; clear_array : unit -> unit + { + (* Load array in the memory and cache it so it could be accessed + instantly by other functions unless [clear_array] is called. *) + load_array : unit -> unit; + (* Get the nth element of array. In details, it searches for an element in + the following order: + - Search inside the pending patches + - Search inside the commited patches + - Search insede the loaded in memory array + - Search inside the "base" file *) + get : int -> 'a; + (* Same as [get] but doesn't consider pending patches *) + get_nopending : int -> 'a; + (* Set the nth element of array *) + set : int -> 'a -> unit; + (* Return length of an array that by default takes into account + commited patches *) + mutable len : int; + (* Output array with applied commited patches to the giving chanel *) + output_array : out_channel -> unit; + (* Remove array from the memory *) + clear_array : unit -> unit } +(** Data structure for optimised search throughout index by name + (surname or first name). Considers also patched persons. *) type string_person_index = - { find : int -> int list - ; cursor : string -> int - ; next : int -> int + { + (* Find all person's ids that has giving surname/first name. *) + find : int -> int list; + (* Return surname's/first name's id. If it doen't present return id of the next + name by alphabetical order *) + cursor : string -> int; + (* Return surname's/first name's id. If it doen't present return id of the next + name by alphabetical order *) + next : int -> int } +(* unused *) type visible_record_access = { v_write : unit -> unit; v_get : (dsk_person -> bool) -> int -> bool } +(** Data part of database *) type base_data = - { persons : dsk_person record_access - ; ascends : dsk_ascend record_access - ; unions : dsk_union record_access - ; visible : visible_record_access - ; families : dsk_family record_access - ; couples : dsk_couple record_access - ; descends : dsk_descend record_access - ; strings : string record_access - ; particles_txt : string list - ; particles : Re.re Lazy.t - ; bnotes : Def.base_notes - ; bdir : string + { + (* Array of persons *) + persons : dsk_person record_access; + (* Array of persons' ascendants *) + ascends : dsk_ascend record_access; + (* Array of persons' unions *) + unions : dsk_union record_access; + (* unused *) + visible : visible_record_access; + (* Array of families *) + families : dsk_family record_access; + (* Array of families' couples *) + couples : dsk_couple record_access; + (* Array of families' descendants *) + descends : dsk_descend record_access; + (* Array of strings *) + strings : string record_access; + (* Array of autorised to use surname's particles *) + particles_txt : string list; + (* Regular expression that matches particles in [particles_txt] *) + particles : Re.re Lazy.t; + (* Data base notes and extended page structure *) + bnotes : Def.base_notes; + (* Directory where database's files are stored *) + bdir : string } +(** Functioallity part of database. Every modification of the base is stored in {i patches} file. + Note that, every modification firstly is pendent and should be commited + to apply them and to update {i patches} file with [commit_patches]. *) type base_func = - { person_of_key : string -> string -> int -> int option - ; persons_of_name : string -> int list - ; strings_of_sname : string -> int list - ; strings_of_fname : string -> int list - ; persons_of_surname : string_person_index - ; persons_of_first_name : string_person_index - ; patch_person : int -> dsk_person -> unit - ; patch_ascend : int -> dsk_ascend -> unit - ; patch_union : int -> dsk_union -> unit - ; patch_family : int -> dsk_family -> unit - ; patch_couple : int -> dsk_couple -> unit - ; patch_descend : int -> dsk_descend -> unit - ; patch_name : string -> int -> unit - ; insert_string : string -> int - ; commit_patches : unit -> unit - ; commit_notes : string -> string -> unit - ; cleanup : unit -> unit - ; nb_of_real_persons : unit -> int - ; iper_exists : int -> bool - ; ifam_exists : int -> bool + { + (* Return person's id from the giving key (first name, surname and occurene number). + If person doesn't exists return None. Doesn't consider pending patches *) + person_of_key : string -> string -> int -> int option; + (* Return list of person ids that have giving name + (could be one of the mix). Doesn't consider pending patches *) + persons_of_name : string -> int list; + (* Return list of surnames (string ids) that contain giving person's surname or surname substring. + Consider also surnames of pathed persons. Doesn't consider pending patches *) + strings_of_sname : string -> int list; + (* Return list of first names (string ids) that contain giving person's first name or first name's + substring. Consider also first names of pathed persons. Doesn't consider pending patches *) + strings_of_fname : string -> int list; + (* Search functionalities throughout index by surname *) + persons_of_surname : string_person_index; + (* Search functionalities throughout index by first name *) + persons_of_first_name : string_person_index; + (* Insert or modify person with a giving id. Added inside pending patches. *) + patch_person : int -> dsk_person -> unit; + (* Insert or modify ascendants of a person with a giving id. + Added inside pending patches. *) + patch_ascend : int -> dsk_ascend -> unit; + (* Insert or modify union of a person with a giving id. + Added inside pending patches. *) + patch_union : int -> dsk_union -> unit; + (* Insert or modify family with a giving id. Added inside pending patches. *) + patch_family : int -> dsk_family -> unit; + (* Insert or modify couple of a family with a giving id. + Added inside pending patches. *) + patch_couple : int -> dsk_couple -> unit; + (* Insert or modify descendants of a family with a giving id. + Added inside pending patches. *) + patch_descend : int -> dsk_descend -> unit; + (* Associate person to the another name inside the index. + Added directly inside commited patches. *) + patch_name : string -> int -> unit; + (* Insert new string inside the pending patches and returns its id. + If string already exists return its id. *) + insert_string : string -> int; + (* Commit pending patches and write a patches' new state inside "patches" + file. "nb_persons" are also updated. *) + commit_patches : unit -> unit; + (* Update content (second arg) of the notes' file (first arg) if exists. *) + commit_notes : string -> string -> unit; + (* Close every opened channel. *) + cleanup : unit -> unit; + (* Returns real number of persons inside the base + (without bogus ? ? definition). Pendent patches aren't considered. *) + nb_of_real_persons : unit -> int; + (* Tells if person with giving id exists in the base. + Pendent patches are also considered *) + iper_exists : int -> bool; + (* Tells if family with giving id exists in the base. + Pendent patches are also considered *) + ifam_exists : int -> bool } +(** Geneweb database version *) type base_version = GnWb0020 | GnWb0021 | GnWb0022 | GnWb0023 | GnWb0024 +(** Database represntation in the memory that regroups + data and basic requests over this data. *) type dsk_base = { data : base_data ; func : base_func ; version : base_version } diff --git a/lib/gwdb-legacy/dutil.ml b/lib/gwdb-legacy/dutil.ml index 3342b8cc4e..6e74720394 100644 --- a/lib/gwdb-legacy/dutil.ml +++ b/lib/gwdb-legacy/dutil.ml @@ -72,12 +72,13 @@ let int_size = 4 let output_value_no_sharing oc v = Marshal.to_channel oc v [Marshal.No_sharing] +(* (*UNUSED*) let output_array_no_sharing oc arr_get arr_len = let header_pos = Iovalue.create_output_value_header oc in Iovalue.output_block_header oc 0 arr_len; for i = 0 to arr_len - 1 do Iovalue.output oc (arr_get i) done; let pos_end = Iovalue.patch_output_value_header oc header_pos in - seek_out oc pos_end + seek_out oc pos_end*) module IntHT = Hashtbl.Make (struct type t = int diff --git a/lib/gwdb-legacy/dutil.mli b/lib/gwdb-legacy/dutil.mli index 2b860369c1..5b34a8c908 100644 --- a/lib/gwdb-legacy/dutil.mli +++ b/lib/gwdb-legacy/dutil.mli @@ -2,34 +2,66 @@ open Dbdisk +(** Index for all kind of mix between person's names (first index inside {i names.inx}) *) type name_index_data = int array array + +(** Index for sub-strings of person's surame and first name (second and third index respectively inside {i names.inx}) *) type strings_of_fsname = int array array +(** Header for the {i base} file (version 0020) *) val magic_GnWb0020 : string + +(** Header for the {i base} file (version 0021) *) val magic_GnWb0021 : string + +(** Header for the {i base} file (version 0022) *) val magic_GnWb0022 : string + +(** Header for the {i base} file (version 0023) *) val magic_GnWb0023 : string + +(** Header for the latest version of {i base} file *) val magic_GnWb0024 : string + +(** Maximal size of hash table for name indexation (inside {i names.inx}) *) val table_size : int +(** [compare_fnames_i base i1 i2] compare two first names that have indexes [i1] and [i2] inside the [base]. *) val compare_fnames_i : Dbdisk.base_data -> int -> int -> int + +(** [compare_fnames] compare two first names. *) val compare_fnames : string -> string -> int +(** [compare_snames_i base i1 i2] compare two surnames that have indexes [i1] and [i2] inside the [base]. *) val compare_snames_i : Dbdisk.base_data -> int -> int -> int + +(** [compare_snames_i base s1 s2] compare two surnames according to the principe specified by [Mutil.compare_after_particle]. *) val compare_snames : Dbdisk.base_data -> string -> string -> int +(** [dsk_person_misc_names base p nobtit] computes various mix between all kind of names of a person's entry [p] + from the database [base]. [nobtit] is used to return a title entries for passed in argument person. *) val dsk_person_misc_names : dsk_base -> dsk_person -> (dsk_person -> dsk_title list) -> string list +(** [poi base i] returns person's entry with index [i] from [base]. *) val poi : dsk_base -> int -> dsk_person + +(** [poi base i] returns string with index [i] from [base]. *) val sou : dsk_base -> int -> string + +(** Returns person's first name from the given person's entry. *) val p_first_name : dsk_base -> dsk_person -> string + +(** Returns person's surname from the given person's entry. *) val p_surname : dsk_base -> dsk_person -> string +(** Output given value to the channel. Uses [Marshall.to_channel] with [No_sharing] flag. *) val output_value_no_sharing : out_channel -> _ -> unit -val output_array_no_sharing : out_channel -> (int -> _) -> int -> unit + +(** Size of integer value inside the Geneweb's binary files *) val int_size : int +(** Hastable that has unhashed int as a key. *) module IntHT : sig include module type of Hashtbl.Make (struct type t = int @@ -40,6 +72,6 @@ end (** [name_index s] Compute the index of crush_lowered version of s - in an array of size {!val:table_size}. + in an array of size [table_size]. *) val name_index : string -> int diff --git a/lib/gwdb-legacy/gwdb_driver.ml b/lib/gwdb-legacy/gwdb_driver.ml index 1b5c0d328e..711fa12a1f 100644 --- a/lib/gwdb-legacy/gwdb_driver.ml +++ b/lib/gwdb-legacy/gwdb_driver.ml @@ -536,7 +536,7 @@ module Marker = struct ; set : 'k -> 'v -> unit } - let make (k : 'a -> 'k) (c : 'a Collection.t) (i : 'v) : ('a, 'v) t = + let make (k : 'a -> int) (c : 'a Collection.t) (i : 'v) : ('a, 'v) t = let a = Array.make c.Collection.length i in { get = (fun x -> Array.get a (k x) ) ; set = (fun x v -> Array.set a (k x) v) } diff --git a/lib/gwdb-legacy/gwdb_gc.ml b/lib/gwdb-legacy/gwdb_gc.ml index 214a5200a7..02b2ff6d8c 100644 --- a/lib/gwdb-legacy/gwdb_gc.ml +++ b/lib/gwdb-legacy/gwdb_gc.ml @@ -71,6 +71,7 @@ let gc ?(dry_run = true) base = for i = 0 to base.data.families.len - 1 do if Array.get mf i then begin let f = base.data.families.get i in + (* if family wasn't deleted *) if f.fam_index <> dummy_ifam then begin let _ = Futil.map_family_ps markp markf marks f in let _ = Futil.map_couple_p false markp @@ base.data.couples.get i in @@ -79,12 +80,14 @@ let gc ?(dry_run = true) base = end end done ; + (* [p1;p2:p3;p4] [true;false;true;false] -> [0;0;1;1] *) let dst_i src m = let off = ref 0 in Array.init src.len begin fun i -> if Array.get m i then i - !off else begin incr off ; i - !off end end in + (* 2 [true;false;true;false] -> [0;2] *) let src_i len m = let off = ref 0 in let a = Array.make len (-1) in diff --git a/lib/gwdb-legacy/gwdb_gc.mli b/lib/gwdb-legacy/gwdb_gc.mli new file mode 100644 index 0000000000..4755c0dbff --- /dev/null +++ b/lib/gwdb-legacy/gwdb_gc.mli @@ -0,0 +1,7 @@ +(** [gc ~dry_run base] launch garbage collector over that analyse database [base] that detects + all deleted or empty elements that aren't referenced by anyone (unmarked element). If [dry_run] + is unset then performs memory compacting by eliminating all unmarked elements from all database + arrays and update corresponding database on the disk. Otherwise, it just perform computing stage + without database update. Returns [(deletedp,deletedf,deleteds)] where [deletedp] is ids of all unmarked + persons, [deletedf] is ids of all unmarked families and [deleteds] is ids of all unmarked strings *) +val gc : ?dry_run:bool -> Dbdisk.dsk_base -> int list * int list * int list \ No newline at end of file diff --git a/lib/gwdb-legacy/iovalue.ml b/lib/gwdb-legacy/iovalue.ml index c5df073604..50fbaedea3 100644 --- a/lib/gwdb-legacy/iovalue.ml +++ b/lib/gwdb-legacy/iovalue.ml @@ -242,6 +242,7 @@ let create_output_value_header oc = size_64 := 0; pos_header, pos_out oc +(* making a header for input_value like output_value does *) let patch_output_value_header oc (pos_header, pos_start) = let pos_end = pos_out oc in if Sys.word_size = 64 && diff --git a/lib/gwdb-legacy/iovalue.mli b/lib/gwdb-legacy/iovalue.mli index e870521cbd..67d6af8b45 100644 --- a/lib/gwdb-legacy/iovalue.mli +++ b/lib/gwdb-legacy/iovalue.mli @@ -1,43 +1,18 @@ (* $Id: iovalue.mli,v 5.5 2012-01-27 08:53:53 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) +(** Size of long integer value inside the Geneweb's binary files *) val sizeof_long : int -val input : in_channel -> 'a -val output : out_channel -> 'a -> unit - -type header_pos - - -val create_output_value_header : out_channel -> header_pos -val output_block_header : out_channel -> int -> int -> unit - -(* - -val sign_extend : int -> int - -(* making a header for input_value like output_value does *) -*) -val patch_output_value_header : out_channel -> header_pos -> int - -(* -(* generic functions *) - -type 'a in_funs = - { input_byte : 'a -> int; - input_binary_int : 'a -> int; - input : 'a -> bytes -> int -> int -> unit } -val gen_input : 'a in_funs -> 'a -> 'b - -type 'a out_funs = - { output_byte : 'a -> int -> unit; - output_binary_int : 'a -> int -> unit; - output : 'a -> string -> int -> int -> unit } -val gen_output : 'a out_funs -> 'a -> 'b -> unit - -val size_32 : int ref -val size_64 : int ref +(** Input a value from the giving channel. Identical to [Marshal.from_channel]. *) +val input : in_channel -> 'a -*) +(** Output a value to the giving channel. Identical to [Marshal.to_channel] with [No_sharing] flag. *) +val output : out_channel -> 'a -> unit +(** [output_array_acces oc getf arr_get arr_len pos] prints to the channel + [oc] position for each element (that could be obtained with [arr_get]) + in the binary file where marshalled array is stored. Array should be + of length [arr_len] and should start at the position [pos] inside the + binary file. Returns a position just after the end of array. *) val output_array_access : out_channel -> (int -> 'a) -> int -> int -> int diff --git a/lib/gwdb-legacy/outbase.ml b/lib/gwdb-legacy/outbase.ml index 147fe7397c..03440dc485 100644 --- a/lib/gwdb-legacy/outbase.ml +++ b/lib/gwdb-legacy/outbase.ml @@ -22,6 +22,7 @@ let count_error computed found = let output_index_aux oc_inx oc_inx_acc ni = let bpos = pos_out oc_inx in + (* output name index (circular hash table) in the "names.inx" and position for hashed value in the "names.acc" *) Dutil.output_value_no_sharing oc_inx ni ; let epos = Iovalue.output_array_access oc_inx_acc (Array.get ni) (Array.length ni) @@ -33,6 +34,7 @@ let make_name_index base = let t = Array.make Dutil.table_size [] in for i = 0 to base.data.persons.len - 1 do let p = base.data.persons.get i in + (* not ? ? *) if p.first_name <> 1 && p.first_name <> 1 then begin List.iter (fun i -> Array.set t i @@ p.key_index :: Array.get t i) @@ @@ -108,7 +110,9 @@ let output_strings_hash tmp_strings_inx base = let tabl = Array.make strings_array.len (-1) in for i = 0 to strings_array.len - 1 do let ia = Hashtbl.hash (base.data.strings.get i) mod Array.length taba in - tabl.(i) <- taba.(ia); taba.(ia) <- i + (* store last associated value associated to the same hash *) + tabl.(i) <- taba.(ia); + taba.(ia) <- i done; output_binary_int oc (Array.length taba); for i = 0 to Array.length taba - 1 do output_binary_int oc taba.(i) done; @@ -129,14 +133,15 @@ let output_name_index_aux cmp get base names_inx names_dat = done ; let a = Array.make (Dutil.IntHT.length ht) (0, []) in ignore @@ Dutil.IntHT.fold (fun k v i -> Array.set a i (k, v) ; succ i) ht 0 ; + (* sort by name behind the int order *) Array.sort (fun (k, _) (k', _) -> cmp k k') a ; let oc_n_dat = Secure.open_out_bin names_dat in let bt2 = - Array.map begin fun (i, ipl) -> + Array.map begin fun (k, ipl) -> let off = pos_out oc_n_dat in output_binary_int oc_n_dat (List.length ipl) ; List.iter (output_binary_int oc_n_dat) ipl ; - (i, off) + (k, off) end a in close_out oc_n_dat ; @@ -166,8 +171,10 @@ let output_particles_file particles fname = close_out oc let output base = + (* create database directory *) let bname = base.data.bdir in if not (Sys.file_exists bname) then Unix.mkdir bname 0o755 ; + (* temporary files *) let tmp_particles = Filename.concat bname "1particles.txt" in let tmp_base = Filename.concat bname "1base" in let tmp_base_acc = Filename.concat bname "1base.acc" in @@ -196,6 +203,7 @@ let output base = if epos <> pos_out oc then count_error epos (pos_out oc) in begin try + (* output header of "base" *) output_string oc Dutil.magic_GnWb0024; output_binary_int oc base.data.persons.len; output_binary_int oc base.data.families.len; @@ -209,6 +217,7 @@ let output base = output_binary_int oc 0; output_binary_int oc 0; Dutil.output_value_no_sharing oc (base.data.bnotes.Def.norigin_file : string); + (* output arrays in the "base" and position for each element in the "base.acc" *) let persons_array_pos = pos_out oc in output_array "persons" base.data.persons; let ascends_array_pos = pos_out oc in @@ -223,6 +232,7 @@ let output base = output_array "descends" base.data.descends; let strings_array_pos = pos_out oc in output_array "strings" base.data.strings; + (* output arrays position in the header *) seek_out oc array_start_indexes; output_binary_int oc persons_array_pos; output_binary_int oc ascends_array_pos; diff --git a/lib/gwdb-legacy/outbase.mli b/lib/gwdb-legacy/outbase.mli new file mode 100644 index 0000000000..c39e1b72cd --- /dev/null +++ b/lib/gwdb-legacy/outbase.mli @@ -0,0 +1,29 @@ + +(** Flag that enables memory saving by calling gc sometimes *) +val save_mem : bool ref + +(** [output base] uses data section of the [base] to store database on the disk in the files: + + - {i base} main file that stores all the arrays of the database + - {i base.acc} direct accesses to arrays inside {i base} (list of offsets for every array) + - {i names.inx} 3 different name indexes : + + - For all kind of mix between person's names. Associate hash value + of the name to the array of persons (index of its entry) containing the given name + - sub-strings of surname. Associate hash value of the sub-string to + the array of string indexes of the names that contains mentionned sub string. + - sub-strings of first name. Same storage principe as for surname sub-strings. + - {i names.acc} direct accesses to arrays inside {i names.inx}. + - {i strings.inx} strings index. Associate hash of the string to the index + of its entry in the base's string array. Save also previus value in the case of + collision of hash. + - {i snames.inx} ordered index for surnames. Associate index of surname to its offset in + {i snames.dat}. + - {i snames.dat} For a giving surname give associated list of perosons (index of its entry) + - {i fnames.inx} and {i fnames.dat} same as for {i snames.inx} and {i snames.dat} but deals + with first names + - {i notes} text file containing data base notes. + - {i notes_d} directory containing .txt for each extended page. + - {i particles.txt} text file with autorised name's particles. + *) +val output : Dbdisk.dsk_base -> unit \ No newline at end of file diff --git a/lib/gwdb_driver.mli/gwdb_driver.mli b/lib/gwdb_driver.mli/gwdb_driver.mli index 3e57869890..d7b181fc40 100644 --- a/lib/gwdb_driver.mli/gwdb_driver.mli +++ b/lib/gwdb_driver.mli/gwdb_driver.mli @@ -1,211 +1,529 @@ (* Copyright (c) 1998-2007 INRIA *) -type iper -type ifam +(** String id *) type istr +(** Family id *) +type ifam + +(** Person id *) +type iper + +(** Convert [iper] to string *) val string_of_iper : iper -> string + +(** Convert [ifam] to string *) val string_of_ifam : ifam -> string + +(** Convert [istr] to string *) val string_of_istr : istr -> string +(** Convert [iper] from string *) val iper_of_string : string -> iper + +(** Convert [ifam] from string *) val ifam_of_string : string -> ifam + +(** Convert [istr] from string *) val istr_of_string : string -> istr +(** Person data structure *) type person + +(** Family data structure *) type family +(** Database implementation for [Def.gen_relation] *) type relation = (iper, istr) Def.gen_relation + +(** Database implementation for [Def.gen_title] *) type title = istr Def.gen_title + +(** Database implementation for [Def.pers_event] *) type pers_event = (iper, istr) Def.gen_pers_event + +(** Database implementation for [Def.fam_event] *) type fam_event = (iper, istr) Def.gen_fam_event +(** Data structure for optimised search throughout index by name + (surname or first name). *) type string_person_index +(** Database represntation in the memory that regroups + data and basic requests over this data. *) type base +(** Open database situated in the specified directory. *) val open_base : string -> base + +(** Close database memory representation. *) val close_base : base -> unit +(** Dummy person id *) val dummy_iper : iper + +(** Dummy family id *) val dummy_ifam : ifam +(** Says if strings with the giving ids are equal *) val eq_istr : istr -> istr -> bool + +(** Says if string with the giving id is empty ("") *) val is_empty_string : istr -> bool + +(** Says if string with the giving id is a question mark ("?") *) val is_quest_string : istr -> bool + +(** Id of the empty string ("") *) val empty_string : istr + +(** Id of the question mark ("?") *) val quest_string : istr + +(** Returns unitialised person with the giving id. *) val empty_person : base -> iper -> person + +(** Returns unitialised family with the giving id. *) val empty_family : base -> ifam -> family +(** Tells if person with giving id exists in the base. *) val iper_exists : base -> iper -> bool + +(** Tells if family with giving id exists in the base. *) val ifam_exists : base -> ifam -> bool +(** {2 Getters} + Getters are used to extract information about person and family. + If corresponding information part isn't present, driver load it from + the disk and cache it so further gets will return result immediately. *) + +(** Get rights to access person's data *) val get_access : person -> Def.access + +(** Get person's aliases ids *) val get_aliases : person -> istr list + +(** Get person's baptism date *) val get_baptism : person -> Def.cdate + +(** Get person's baptism note id *) val get_baptism_note : person -> istr + +(** Get person's baptism place id *) val get_baptism_place : person -> istr + +(** Get person's baptism source id *) val get_baptism_src : person -> istr + +(** Get person's birth date *) val get_birth : person -> Def.cdate + +(** Get person's birth note id *) val get_birth_note : person -> istr + +(** Get person's birth place id *) val get_birth_place : person -> istr + +(** Get person's birth source id *) val get_birth_src : person -> istr + +(** Get information about person's burial *) val get_burial : person -> Def.burial + +(** Get person's burial note id *) val get_burial_note : person -> istr + +(** Get person's burial place id *) val get_burial_place : person -> istr + +(** Get person's burial source id *) val get_burial_src : person -> istr + +(** Get array of family's children ids *) val get_children : family -> iper array + +(** Get family's comment id *) val get_comment : family -> istr + +(** Get person's consanguinity degree with his ascendants *) val get_consang : person -> Adef.fix + +(** Get person's death status *) val get_death : person -> Def.death + +(** Get person's death note id *) val get_death_note : person -> istr + +(** Get person's death place id *) val get_death_place : person -> istr + +(** Get person's death source id *) val get_death_src : person -> istr + +(** Get family's divorce status *) val get_divorce : family -> Def.divorce + +(** Get array of family's ids to which a person belongs (person's union) *) val get_family : person -> ifam array + +(** Get family's father id (from the family's couple) *) val get_father : family -> iper + +(** Get family's event list *) val get_fevents : family -> fam_event list + +(** Get person's first name id *) val get_first_name : person -> istr + +(** Get list of person's first name aliases ids *) val get_first_names_aliases : person -> istr list + +(** Get family's sources id *) val get_fsources : family -> istr + +(** Get family's id *) val get_ifam : family -> ifam + +(** Get id of path to person's image *) val get_image : person -> istr + +(** Get person's id *) val get_iper : person -> iper + +(** Get family's marriage date *) val get_marriage : family -> Def.cdate + +(** Get family's marriage note id *) val get_marriage_note : family -> istr + +(** Get family's marriage place id *) val get_marriage_place : family -> istr + +(** Get family's marriage source id *) val get_marriage_src : family -> istr + +(** Get family's mother id (from the family's couple) *) val get_mother : family -> iper + +(** Get person's notes id *) val get_notes : person -> istr + +(** Get person's occurence number *) val get_occ : person -> int + +(** Get person's occupation id *) val get_occupation : person -> istr + +(** Get family's origin file (.gw filename where family is defined) id *) val get_origin_file : family -> istr + +(** Get family's parents ids (father and mother from family's couple) *) val get_parent_array : family -> iper array + +(** Get person's family id to which his parents belong (as family's couple) *) val get_parents : person -> ifam option + +(** Get person's event list *) val get_pevents : person -> pers_event list + +(** Get person's sources id *) val get_psources : person -> istr + +(** Get person's public name id *) val get_public_name : person -> istr + +(** Get list of person's qualifiers ids *) val get_qualifiers : person -> istr list + +(** Get person's related persons ids *) val get_related : person -> iper list + +(** Get relation kind between couple in the family *) val get_relation : family -> Def.relation_kind + +(** Get person's relations with not native parents *) val get_rparents : person -> relation list + +(** Get person's sex *) val get_sex : person -> Def.sex + +(** Get person's surname id *) val get_surname : person -> istr + +(** Get person's surname aliases ids *) val get_surnames_aliases : person -> istr list + +(** Get list of person's nobility titles *) val get_titles : person -> title list + +(** Get array of family's witnesses ids *) val get_witnesses : family -> iper array +(** Extract [gen_couple] from [family]. *) val gen_couple_of_family : family -> iper Def.gen_couple + +(** Extract [gen_descend] from [family]. *) val gen_descend_of_family : family -> iper Def.gen_descend + +(** Extract [gen_family] from [family]. *) val gen_family_of_family : family -> (iper, ifam, istr) Def.gen_family + +(** Extract [gen_person] from [person]. *) val gen_person_of_person : person -> (iper, iper, istr) Def.gen_person + +(** Extract [gen_ascend] from [person]. *) val gen_ascend_of_person : person -> ifam Def.gen_ascend + +(** Extract [gen_union] from [person]. *) val gen_union_of_person : person -> ifam Def.gen_union +(** Create [family] from associated values. *) val family_of_gen_family : base -> (iper, ifam, istr) Def.gen_family * iper Def.gen_couple * iper Def.gen_descend -> family + +(** Create [person] from associated values. *) val person_of_gen_person : base -> (iper, iper, istr) Def.gen_person * ifam Def.gen_ascend * ifam Def.gen_union -> person +(** Create uninitialised person with giving id *) val poi : base -> iper -> person + +(** Create uninitialised family with giving id *) val foi : base -> ifam -> family + +(** Returns string that has giving id from the base *) val sou : base -> istr -> string +(** Returns unitialised [gen_person] with giving id *) val no_person : iper -> (iper, iper, istr) Def.gen_person + +(** Returns unitialised [gen_ascend] *) val no_ascend : ifam Def.gen_ascend + +(** Returns unitialised [gen_union] *) val no_union : ifam Def.gen_union + +(** Returns unitialised [gen_family] with giving id *) val no_family : ifam -> (iper, ifam, istr) Def.gen_family + +(** Returns unitialised [gen_descend] *) val no_descend :iper Def.gen_descend + +(** Returns unitialised [gen_couple] *) val no_couple : iper Def.gen_couple +(** Returns number of persons inside the database *) val nb_of_persons : base -> int + +(** Returns number of defined persons (without bogus definition "? ?") + inside the database *) val nb_of_real_persons : base -> int + +(** Returns number of families inside the database *) val nb_of_families : base -> int + +(** Returns database name *) val bname : base -> string +(** Modify/add person with the giving id in the base. New names are added + to the name index for the cosidered person and for evey member of family to + which he belongs. Modification stay blocked until call of [commit_patches]. *) val patch_person : base -> iper -> (iper, iper, istr) Def.gen_person -> unit + +(** Modify/add ascendants of a person with a giving id. Modification stay blocked until + call of [commit_patches]. *) val patch_ascend : base -> iper -> ifam Def.gen_ascend -> unit + +(** Modify/add union of a person with a giving id. Modification stay blocked until + call of [commit_patches]. *) val patch_union : base -> iper -> ifam Def.gen_union -> unit + +(** Modify/add family with a giving id. Modification stay blocked until + call of [commit_patches]. *) val patch_family : base -> ifam -> (iper, ifam, istr) Def.gen_family -> unit + +(** Modify/add descendants of a family with a giving id. Modification stay blocked until + call of [commit_patches]. *) val patch_descend : base -> ifam -> iper Def.gen_descend -> unit + +(** Modify/add couple of a family with a giving id. Modification stay blocked until + call of [commit_patches]. *) val patch_couple : base -> ifam -> iper Def.gen_couple -> unit +(** Modify/add string with a giving id. If string already exists return its id. + Modification stay blocked until call of [commit_patches]. *) val insert_string : base -> string -> istr + +(** Commit blocked modifications (patches) and update database files in order to + apply modifications on the disk. *) val commit_patches : base -> unit + +(** [commit_notes fname s] Update content of the notes/extended page file [fname] if exists. *) val commit_notes : base -> string -> string -> unit +(** Retruns new unused person's id *) val new_iper : base -> iper + +(** Retruns new unused family's id *) val new_ifam : base -> ifam +(** Same as [patch_person] *) val insert_person : base -> iper -> (iper, iper, istr) Def.gen_person -> unit + +(** Same as [patch_ascend] *) val insert_ascend : base -> iper -> ifam Def.gen_ascend -> unit + +(** Same as [patch_union] *) val insert_union : base -> iper -> ifam Def.gen_union -> unit + +(** Same as [patch_family] *) val insert_family : base -> ifam -> (iper, ifam, istr) Def.gen_family -> unit + +(** Same as [patch_couple] *) val insert_descend : base -> ifam -> iper Def.gen_descend -> unit + +(** Same as [patch_descend] *) val insert_couple : base -> ifam -> iper Def.gen_couple -> unit +(** Remplace person with the giving id by bogus definition and clear + person's data structure. *) val delete_person : base -> iper -> unit + +(** Clear person's ascendants data structure *) val delete_ascend : base -> iper -> unit + +(** Clear person's union data structure *) val delete_union : base -> iper -> unit + +(** Remplace family with the giving id by dummy family and clear + family's data structure. *) val delete_family : base -> ifam -> unit + +(** Clear family's descendants data structure *) val delete_descend : base -> ifam -> unit + +(** Clear family's couple data structure *) val delete_couple : base -> ifam -> unit (** [person_of_key first_name surname occ] *) val person_of_key : base -> string -> string -> int -> iper option + +(** Return list of person ids that have giving name (could be one of the mix). *) val persons_of_name : base -> string -> iper list + +(** Returns data structure that allows to make optimised search throughout + index by first name *) val persons_of_first_name : base -> string_person_index + +(** Returns data structure that allows to make optimised search throughout + index by surname *) val persons_of_surname : base -> string_person_index -(** first [first/sur]name starting with that string *) +(** Returns first [first/sur]name id starting with that string *) val spi_first : string_person_index -> string -> istr -(** next [first/sur]name by Gutil.alphabetical order *) +(** Retruns next [first/sur]name id that follows giving name's id by + Gutil.alphabetical order *) val spi_next : string_person_index -> istr -> istr -(** all persons having that [first/sur]name *) +(** Retruns all persons id having that [first/sur]name id as the [first/sur]name *) val spi_find : string_person_index -> istr -> iper list +(** [base_visible_get base fct ip] get visibility of person [ip] ([true] for visible) + from the [base]. If file {i restrict} is present then get read it to get visibility information. + If person's visibility isn't known, then set it with [fct]. *) val base_visible_get : base -> (person -> bool) -> iper -> bool + +(** Write updated visibility information to the {i restricted} file. *) val base_visible_write : base -> unit + +(** Return regular expression that matches all defined in the [base] particles. *) val base_particles : base -> Re.re (** [base_strings_of_first_name base x] - Return the list of first names (as [istr]) being equal to [x] - using {!val:Name.crush_lower} comparison. + Return the list of first names (as [istr]) being equal or to [x] + using {!val:Name.crush_lower} comparison. [x] could be also a substring + of the matched first name. *) val base_strings_of_first_name : base -> string -> istr list (** [base_strings_of_surname base x] Return the list of surnames (as [istr]) being equal to [x] - using {!val:Name.crush_lower} comparison. + using {!val:Name.crush_lower} comparison. [x] could be also a substring + of the matched surname. *) val base_strings_of_surname : base -> string -> istr list +(** Load array of ascendants in the memory and cache it so it could be accessed + instantly by other functions unless [clear_ascends_array] is called. *) val load_ascends_array : base -> unit + +(** Load array of unions in the memory and cache it so it could be accessed + instantly by other functions unless [clear_unions_array] is called. *) val load_unions_array : base -> unit + +(** Load array of couples in the memory and cache it so it could be accessed + instantly by other functions unless [clear_couples_array] is called. *) val load_couples_array : base -> unit + +(** Load array of descendants in the memory and cache it so it could be accessed + instantly by other functions unless [clear_descends_array] is called. *) val load_descends_array : base -> unit + +(** Load array of strings in the memory and cache it so it could be accessed + instantly by other functions unless [clear_strings_array] is called. *) val load_strings_array : base -> unit + +(** Load array of persons in the memory and cache it so it could be accessed + instantly by other functions unless [clear_persons_array] is called. *) val load_persons_array : base -> unit + +(** Load array of families in the memory and cache it so it could be accessed + instantly by other functions unless [clear_families_array] is called. *) val load_families_array : base -> unit +(** Remove array of ascendants from the memory *) val clear_ascends_array : base -> unit + +(** Remove array of unions from the memory *) val clear_unions_array : base -> unit + +(** Remove array of couples from the memory *) val clear_couples_array : base -> unit + +(** Remove array of descendants from the memory *) val clear_descends_array : base -> unit + +(** Remove array of strings from the memory *) val clear_strings_array : base -> unit + +(** Remove array of persons from the memory *) val clear_persons_array : base -> unit + +(** Remove array of families from the memory *) val clear_families_array : base -> unit +(** [base_notes_read base fname] read and return content of [fname] note + (either database note either extended page). *) val base_notes_read : base -> string -> string + +(** [base_notes_read base fname] read and return first line of [fname] note *) val base_notes_read_first_line : base -> string -> string + +(** Says if note has empty content *) val base_notes_are_empty : base -> string -> bool + +(** Retruns origin file (.gw file) of the note *) val base_notes_origin_file : base -> string + +(** Directory where extended pages are stored *) val base_notes_dir : base -> string + +(** Directory where wizard notes are stored *) val base_wiznotes_dir : base -> string +(** Returns last modification time of the database on disk *) val date_of_last_change : base -> float +(** Collections of elemetns *) module Collection : sig (** Collections are sets of elements you want to traverse. *) @@ -254,6 +572,7 @@ module Collection : sig end +(** Markers for elements inside [Collection.t] *) module Marker : sig (** Markers are way to annotate (add extra information to) elements of a {!val:Collection.t}. *) @@ -273,9 +592,16 @@ end (** {2 Useful collections} *) +(** Collection of person's ids *) val ipers : base -> iper Collection.t + +(** Collection of persons *) val persons : base -> person Collection.t + +(** Collection of family's ids *) val ifams : ?select:(ifam -> bool) -> base -> ifam Collection.t + +(** Collection of families *) val families : ?select:(family -> bool) -> base -> family Collection.t (** [dummy_collection x] create a dummy collection with no element. @@ -285,7 +611,12 @@ val dummy_collection : 'a -> 'a Collection.t (** {2 Useful markers} *) +(** [iper_marker c v] create marker over collection of person's ids and initialise it + for every element with [v] *) val iper_marker : iper Collection.t -> 'a -> (iper, 'a) Marker.t + +(** [ifam_marker c v] create marker over collection of family's ids and initialise it + for every element with [v] *) val ifam_marker : ifam Collection.t -> 'a -> (ifam, 'a) Marker.t (** [dummy_marker k v] create a dummy collection with no element. @@ -309,6 +640,7 @@ val make * Def.base_notes ) -> base +(** TODOOCP : doc *) val read_nldb : base -> (iper, ifam) Def.NLDB.t val write_nldb : base -> (iper, ifam) Def.NLDB.t -> unit diff --git a/lib/util/futil.mli b/lib/util/futil.mli index 07530030e1..4edc345197 100644 --- a/lib/util/futil.mli +++ b/lib/util/futil.mli @@ -11,6 +11,7 @@ val map_title_strings -> 'b gen_title (** Convert: + - Generic type used to represent witnesses of [Def.gen_pers_event] into another one. - Generic type used to represent name, place, reason, note and source of [Def.gen_pers_event] into another one. @@ -23,6 +24,7 @@ val map_pers_event -> ('c, 'd) gen_pers_event (** Convert: + - Generic type used to represent witnesses of [Def.gen_fam_event] into another one. - Generic type used to represent name, place, reason, note and source of [Def.gen_fam_event] into another one. @@ -35,12 +37,14 @@ val map_fam_event -> ('c, 'd) gen_fam_event (** Convert: + - Generic type used to represent father and mother inside [Def.gen_relation] into another one. - Generic type used to represent sources of [Def.gen_relation] into another one. *) val map_relation_ps : ('a -> 'c) -> ('b -> 'd) -> ('a, 'b) gen_relation -> ('c, 'd) gen_relation (** Convert: + - Generic type used to represent related persons (parents, witnesses of a personal event, etc.) of [Def.gen_person] into another one. - Generic type used to represent another large part of information of [Def.gen_person] @@ -63,6 +67,7 @@ val map_ascend_f : ('a -> 'b) -> 'a gen_ascend -> 'b gen_ascend val map_union_f : ('a -> 'b) -> 'a gen_union -> 'b gen_union (** Convert: + - Generic type used to represent faimily indexation key into another one. - Generic type used to represent witnesses (of the marriage or of a famillial events, etc.) of [Def.gen_family] into another one. diff --git a/lib/util/name.mli b/lib/util/name.mli index 6bb97613d9..e504dd3905 100644 --- a/lib/util/name.mli +++ b/lib/util/name.mli @@ -64,12 +64,12 @@ val crush_lower : string -> string val concat : string -> string -> string (** [split_sname_callback fn s] - Same as [split_sname], but call [fn] with substring indices instead of building + Same as [split_sname], but call [fn] with substring indexes instead of building a list *) val split_sname_callback : (int -> int -> unit) -> string -> unit (** [split_fname_callback fn s] - Same as [split_fname], but call [fn] with substring indices instead of building + Same as [split_fname], but call [fn] with substring indexes instead of building a list *) val split_fname_callback : (int -> int -> unit) -> string -> unit From b60c350c0766956cf3a97f9ea167261a88420137 Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed Date: Mon, 27 Dec 2021 23:54:49 +0100 Subject: [PATCH 43/73] Gwdb documentation --- lib/changeChildrenDisplay.ml | 2 +- lib/def/def.ml | 2 +- lib/gwdb/gutil.ml | 2 +- lib/gwdb/gutil.mli | 44 +++++++++++++++++++++++++++-- lib/gwdb/gwdb.ml | 34 ++++++++++++++++------ lib/gwdb_driver.mli/gwdb_driver.mli | 5 ++-- lib/update.ml | 2 +- lib/updateData.ml | 4 +-- lib/updateFamOk.ml | 2 +- lib/updateIndOk.ml | 2 +- 10 files changed, 77 insertions(+), 22 deletions(-) diff --git a/lib/changeChildrenDisplay.ml b/lib/changeChildrenDisplay.ml index 5b376f633f..ce72f980a5 100644 --- a/lib/changeChildrenDisplay.ml +++ b/lib/changeChildrenDisplay.ml @@ -148,7 +148,7 @@ let print_conflict conf base ip_var p = Hutil.rheader conf title; Update.print_error conf base @@ Update.UERR_already_defined (base, p, ""); let free_n = - Gutil.find_free_occ base (p_first_name base p) (p_surname base p) 0 + Gutil.find_free_occ base (p_first_name base p) (p_surname base p) in Output.print_string conf "
    \n"; Output.print_string conf "
  • "; diff --git a/lib/def/def.ml b/lib/def/def.ml index b94c5f578e..245553baf5 100644 --- a/lib/def/def.ml +++ b/lib/def/def.ml @@ -268,7 +268,7 @@ type ('iper, 'person, 'string) gen_person = (** Person's ascendants with their consangunity degree *) type 'family gen_ascend = { parents : 'family option; consang : Adef.fix } -(* Person's families to which he belongs (union of families) *) +(* Person's families to which he belongs as parent (union of families) *) type 'family gen_union = { family : 'family array } (** Children of the family *) diff --git a/lib/gwdb/gutil.ml b/lib/gwdb/gutil.ml index 6c8d0ab2e6..b84d09ca6d 100644 --- a/lib/gwdb/gutil.ml +++ b/lib/gwdb/gutil.ml @@ -258,7 +258,7 @@ let sort_person_list = sort_person_list_aux List.sort let sort_uniq_person_list = sort_person_list_aux List.sort_uniq -let find_free_occ base f s _i = +let find_free_occ base f s = let ipl = persons_of_name base (f ^ " " ^ s) in let first_name = Name.lower f in let surname = Name.lower s in diff --git a/lib/gwdb/gutil.mli b/lib/gwdb/gutil.mli index edde5e00e2..faafdaabca 100644 --- a/lib/gwdb/gutil.mli +++ b/lib/gwdb/gutil.mli @@ -3,33 +3,71 @@ open Def open Gwdb +(** [spouse p f] returns spouse of giving person inside the family. *) val spouse : iper -> family -> iper +(** Returns list of persons having the giving name as one of the misc names. *) val person_not_a_key_find_all : base -> string -> iper list + +(** Returns list of persons from the giving key. If key has form {i "firstname.occ surname"} + then returns list of one corresponding person. Otherwise calls [person_not_a_key_find_all] *) val person_ht_find_all : base -> string -> iper list + +(** [person_of_string_key base key] try to find a key inside [key] string of + the form {i "firstname.occ surname"} and returns a corresponding person. + If person doesn't exists or key isn't found then returns [None] *) val person_of_string_key : base -> string -> iper option + +(** Returns list of persons having the same first name and surname + as the specified person *) val find_same_name : base -> person -> person list -(* Pour les personnes avec plein de '.' dans le prénom ou le nom. *) -val person_of_string_dot_key : base -> string -> iper option +(** Returns person's key that has form {i "firstname.occ surname"} *) val designation : base -> person -> string +(** Trim at the end of string *) val trim_trailing_spaces : string -> string + +(** Compare two UTF-8 encoded strings by alphabetic order *) val alphabetic_utf_8 : string -> string -> int + +(** Compare two ISO-8859-1 encoded strings by alphabetic order *) val alphabetic : string -> string -> int + +(** Same as [alphabetic_utf_8] *) val alphabetic_order : string -> string -> int +(** Parse line and extract separated arguments ("" and '' are used to indlude spaces + inside the argument) *) val arg_list_of_string : string -> string list +(** Sort list of persons by comparison with following order: + - Compare by birth and death date + - Compare by surname + - Compare by first name + - Compare by occurence number + - Compare by id *) val sort_person_list : base -> person list -> person list + +(** Same as [sort_person_list] but also remove duplicates *) val sort_uniq_person_list : base -> person list -> person list +(** Same as [Adef.father] *) val father : 'a gen_couple -> 'a + +(** Same as [Adef.mother] *) val mother : 'a gen_couple -> 'a + +(** [couple multi f m] creates a couple from father [f] and mother [m]. If + [multi] true uses multiparent functionality *) val couple : bool -> 'a -> 'a -> 'a gen_couple + +(** Same as [Adef.parent_array] *) val parent_array : 'a gen_couple -> 'a array -val find_free_occ : base -> string -> string -> int -> int +(** Find first free occurence number for the person with specified first name + and surname. *) +val find_free_occ : base -> string -> string -> int (** [get_birth_death p] diff --git a/lib/gwdb/gwdb.ml b/lib/gwdb/gwdb.ml index 77b2462ca6..762225c472 100644 --- a/lib/gwdb/gwdb.ml +++ b/lib/gwdb/gwdb.ml @@ -2,10 +2,10 @@ open Def include Gwdb_driver -(** [insert_person base per] - Add a new person with the same properties as [per] in [base], - returning the fresh new {!type:iper} for this person. - [per] SHOULD be defined using [dummy_iper]. +(** [insert_person base p a u] + Add a new person with its union and ascendants in the [base]. + Allocate and returns the fresh new id for this person. + [p] SHOULD be defined using [dummy_iper]. *) let insert_person base p a u = let iper = Gwdb_driver.new_iper base in @@ -15,10 +15,10 @@ let insert_person base p a u = Gwdb_driver.insert_person base iper p ; iper -(** [insert_family base fam] - Add a new family with the same properties as [fam] in [base], - returning the fresh new {!type:ifam} for this family. - [fam] SHOULD be defined using [dummy_ifam]. +(** [insert_family base f c d] + Add a new family with its couple and descendants the in the [base]. + Allocate and returns the fresh new id for this family. + [f] SHOULD be defined using [dummy_ifam]. *) let insert_family base f c d = let ifam = Gwdb_driver.new_ifam base in @@ -50,10 +50,13 @@ let rec delete_person excl base ip = ^ "])" ) ; let a = get_gen_ascend base ip in + (* if person is the single childran ad his parents are empty persons then [ipers] contains father and mother and [ifams] contains family *) let ipers, ifams = match a.parents with | Some ifam -> + (* delete ascendants *) Gwdb_driver.delete_ascend base ip ; + (* remove person id from family descendants *) let children = (get_gen_descend base ifam).children |> Mutil.array_except ip @@ -181,6 +184,9 @@ let delete_family base ifam = ignore @@ delete_family ([], []) base ifam (**/**) (** Misc *) +(** [nobtit base allowed_titles denied_titles p] returns list of titles of a person [p] + that apprears in [allowed_titles] and doesn't appears in [denied_titles]. If [allowed_titles] + is empty the every title is allowed *) let nobtit base allowed_titles denied_titles p = let list = get_titles p in match Lazy.force allowed_titles with @@ -215,9 +221,14 @@ let nobtit base allowed_titles denied_titles p = else true) list +(** Returns first name of person with giving id *) let p_first_name base p = Mutil.nominative (sou base (get_first_name p)) + +(** Returns surname of person with giving id *) let p_surname base p = Mutil.nominative (sou base (get_surname p)) +(** Returns array of surnames of person's husbands. First element of a couple in the array is husband's surname, + second - is a husband's surname aliases *) let husbands base gp = let p = poi base gp.key_index in Array.map begin fun ifam -> @@ -228,7 +239,9 @@ let husbands base gp = husband_surname, husband_surnames_aliases end (get_family p) -let father_titles_places base p nobtit = + +(** Return person's father titles *) +let father_titles_places base p (nobtit : person -> title list) = match get_parents (poi base p.key_index) with | Some ifam -> let fam = foi base ifam in @@ -246,9 +259,12 @@ let gen_gen_person_misc_names base p nobtit nobtit_fun = (father_titles_places base p nobtit_fun) |> List.map Name.lower +(** [person_misc_names base p nobtit] computes various mix between all kind of names of a person's entry [p] + from the database [base]. [nobtit] is used to return a title entries for passed in argument person. *) let person_misc_names base p nobtit = gen_gen_person_misc_names base (gen_person_of_person p) (nobtit p) nobtit +(** Returns list of children ids for every family for giving person *) let children_of_p base p = Array.fold_right (fun ifam -> Array.fold_right List.cons (get_children @@ foi base ifam) ) diff --git a/lib/gwdb_driver.mli/gwdb_driver.mli b/lib/gwdb_driver.mli/gwdb_driver.mli index d7b181fc40..43d50c3bf0 100644 --- a/lib/gwdb_driver.mli/gwdb_driver.mli +++ b/lib/gwdb_driver.mli/gwdb_driver.mli @@ -163,7 +163,7 @@ val get_death_src : person -> istr (** Get family's divorce status *) val get_divorce : family -> Def.divorce -(** Get array of family's ids to which a person belongs (person's union) *) +(** Get array of family's ids to which a person belongs as parent (person's union) *) val get_family : person -> ifam array (** Get family's father id (from the family's couple) *) @@ -403,7 +403,8 @@ val delete_descend : base -> ifam -> unit (** Clear family's couple data structure *) val delete_couple : base -> ifam -> unit -(** [person_of_key first_name surname occ] *) +(** [person_of_key first_name surname occ] returns person from his key information + (first name, surname and occurence number) *) val person_of_key : base -> string -> string -> int -> iper option (** Return list of person ids that have giving name (could be one of the mix). *) diff --git a/lib/update.ml b/lib/update.ml index fc99ec41e5..5f1944b9aa 100644 --- a/lib/update.ml +++ b/lib/update.ml @@ -1096,7 +1096,7 @@ let print_create_conflict conf base p var = prerr conf err @@ fun () -> Output.print_string conf (string_of_error conf err) ; let free_n = - Gutil.find_free_occ base (p_first_name base p) (p_surname base p) 0 + Gutil.find_free_occ base (p_first_name base p) (p_surname base p) in Output.printf conf "
    \n" conf.command; List.iter diff --git a/lib/updateData.ml b/lib/updateData.ml index 9462377b8b..7257626695 100644 --- a/lib/updateData.ml +++ b/lib/updateData.ml @@ -237,7 +237,7 @@ let update_person conf base old new_input p = else if old = s_first_name then new_istr, Gutil.find_free_occ base (sou base new_istr) - (sou base (get_surname p)) 0 + (sou base (get_surname p)) else first_name, get_occ p in let first_names_aliases = get_first_names_aliases p in @@ -268,7 +268,7 @@ let update_person conf base old new_input p = else if old = s_surname then new_istr, Gutil.find_free_occ base (sou base (get_first_name p)) - (sou base new_istr) 0 + (sou base new_istr) else surname, get_occ p in let surnames_aliases = get_surnames_aliases p in diff --git a/lib/updateFamOk.ml b/lib/updateFamOk.ml index b516dc02df..1733b482b4 100644 --- a/lib/updateFamOk.ml +++ b/lib/updateFamOk.ml @@ -594,7 +594,7 @@ let print_err_parents conf base p = (Update.string_of_error conf err) (Utf8.capitalize_fst (transl conf "first free number")) (Util.transl conf ":") - (Gutil.find_free_occ base (p_first_name base p) (p_surname base p) 0); + (Gutil.find_free_occ base (p_first_name base p) (p_surname base p)); Update.print_return conf let print_err_sex conf base p = diff --git a/lib/updateIndOk.ml b/lib/updateIndOk.ml index 56d79be8f3..7bc6db8a77 100644 --- a/lib/updateIndOk.ml +++ b/lib/updateIndOk.ml @@ -766,7 +766,7 @@ let print_conflict conf base p = Update.prerr conf err @@ fun () -> Update.print_error conf base (Update.UERR_already_defined (base, p, "")); let free_n = - Gutil.find_free_occ base (p_first_name base p) (p_surname base p) 0 + Gutil.find_free_occ base (p_first_name base p) (p_surname base p) in Output.print_string conf "
      \n"; Output.print_string conf "
    • "; From a1d8938bdc956aabae338bff31c168e468260240 Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed Date: Wed, 29 Dec 2021 00:06:04 +0100 Subject: [PATCH 44/73] Core documentation --- lib/core/consang.ml | 6 +++- lib/core/consang.mli | 18 ++++++++++- lib/core/consangAll.ml | 70 +++++++++++++++++++++++------------------ lib/core/consangAll.mli | 3 +- lib/def/adef.mli | 8 ++--- lib/def/def.ml | 2 +- 6 files changed, 68 insertions(+), 39 deletions(-) diff --git a/lib/core/consang.ml b/lib/core/consang.ml index 202f359480..344a1e55f1 100644 --- a/lib/core/consang.ml +++ b/lib/core/consang.ml @@ -38,7 +38,10 @@ type relationship_info = let half x = x *. 0.5 -type visit = NotVisited | BeingVisited | Visited +type visit = + | NotVisited (* not visited person *) + | BeingVisited (* visited person but visit of ascendants haven't been terminated *) + | Visited (* visited person and his ascendants *) let rec noloop_aux base error tab i = match Gwdb.Marker.get tab i with @@ -94,6 +97,7 @@ let topological_sort base poi = | _ -> () ) persons ; + (* starting from the leaf vertex of graph (persons without childs) *) let todo = Gwdb.Collection.fold (fun acc i -> if Gwdb.Marker.get tab i = 0 then i :: acc else acc diff --git a/lib/core/consang.mli b/lib/core/consang.mli index f3126c7482..f6dadabf61 100644 --- a/lib/core/consang.mli +++ b/lib/core/consang.mli @@ -3,6 +3,8 @@ open Def open Gwdb +(* TODOOCP: doc *) + type anc_stat type relationship = @@ -17,23 +19,37 @@ type relationship = mutable anc_stat2 : anc_stat } type relationship_info = - { tstab : (Gwdb.iper, int) Gwdb.Marker.t + { + (* Information about topological rank for each person *) + tstab : (Gwdb.iper, int) Gwdb.Marker.t ; reltab : (Gwdb.iper, relationship) Gwdb.Marker.t ; mutable queue : Gwdb.iper list array } +(** Error that could occure while topological sorting, and raised when person is ancestor of himself. *) exception TopologicalSortError of person +(** Returns result of topological sort of persons. Result is represented as marker that associates to every person in the base his + topologic rank (let's suppose [r]). Global rule is : if person p1 is ancestor of p2 then r(p1) > r(p2). For example, all leaf + persons (without children) have rank 0, their parents (if no another child that has child themself) - rank 1, parents of their + parents - rank 2, etc. Raises [TopologicalSortError] if person is directly or undirectly is ancestor of himself (cycle). *) val topological_sort : Gwdb.base -> (Gwdb.base -> Gwdb.iper -> Gwdb.person) -> (Gwdb.iper, int) Gwdb.Marker.t +(** Initialise relationship info *) val make_relationship_info : base -> (Gwdb.iper, int) Gwdb.Marker.t -> relationship_info +(* TODOOCP: doc *) val relationship_and_links : base -> relationship_info -> bool -> Gwdb.iper -> Gwdb.iper -> float * Gwdb.iper list +(** [check_noloop base onerror] scans database person's oriented graph (vertex is a person and edge is parenthood from child to parent). If + cycle is found (person is directly or undirectly is ancestor of himself) calls [onerror] with [OwnAncestor] error. Array of + ascendants should be load in the memory. *) val check_noloop : base -> (person error -> unit) -> unit + +(** Same as [check_noloop] but scans only specified list of persons and their ancestors instead of entire database. *) val check_noloop_for_person_list : base -> (person error -> unit) -> Gwdb.iper list -> unit diff --git a/lib/core/consangAll.ml b/lib/core/consangAll.ml index 51e0328064..a62a69c216 100644 --- a/lib/core/consangAll.ml +++ b/lib/core/consangAll.ml @@ -68,6 +68,7 @@ let compute ?(verbosity = 2) base from_scratch = Opt.iter (fun ifam -> Gwdb.Marker.set consang_tab ifam cg) (fget i) ; if cg = Adef.no_consang then incr cnt end persons ; + (* number of persons which need consanguinity to be computed *) let max_cnt = !cnt in let most = ref None in if verbosity >= 1 then Printf.eprintf "To do: %d persons\n" max_cnt; @@ -81,39 +82,46 @@ let compute ?(verbosity = 2) base from_scratch = while !running do running := false ; Gwdb.Collection.iter (fun i -> + (* if person's consanguinity wasn't calculated *) if cget i = Adef.no_consang then match fget i with - Some ifam -> - let pconsang = Gwdb.Marker.get consang_tab ifam in - if pconsang = Adef.no_consang then - let cpl = foi base ifam in - let ifath = get_father cpl in - let imoth = get_mother cpl in - if cget ifath != Adef.no_consang - && cget imoth != Adef.no_consang - then - let consang = relationship base tab ifath imoth in - trace verbosity !cnt max_cnt; - decr cnt; - let cg = Adef.fix_of_float consang in - cset i cg; - Gwdb.Marker.set consang_tab ifam cg; - (if verbosity >= 2 then - if match !most with Some m -> cg > cget m | None -> true then - begin - Printf.eprintf "\nMax consanguinity %g for %s... " - consang - (Gutil.designation base (poi base i)); - flush stderr; - most := Some i - end) - else running := true - else - begin trace verbosity !cnt max_cnt; decr cnt; cset i pconsang end - | None -> - trace verbosity !cnt max_cnt; - decr cnt; - cset i (Adef.fix_of_float 0.0) + (* if person has parents *) + | Some ifam -> + let pconsang = Gwdb.Marker.get consang_tab ifam in + (* if parent's family's consanguinity wasn't calculated *) + if pconsang = Adef.no_consang then + let cpl = foi base ifam in + let ifath = get_father cpl in + let imoth = get_mother cpl in + (* if parent's consanguinity was calculated *) + if cget ifath != Adef.no_consang + && cget imoth != Adef.no_consang + then + let consang = relationship base tab ifath imoth in + trace verbosity !cnt max_cnt; + decr cnt; + let cg = Adef.fix_of_float consang in + cset i cg; + Gwdb.Marker.set consang_tab ifam cg; + (if verbosity >= 2 then + if match !most with Some m -> cg > cget m | None -> true then + begin + Printf.eprintf "\nMax consanguinity %g for %s... " + consang + (Gutil.designation base (poi base i)); + flush stderr; + most := Some i + end) + (* if it wasn't makes further another run over persons *) + else running := true + (* if it was then set to person his family's consanguinity *) + else + begin trace verbosity !cnt max_cnt; decr cnt; cset i pconsang end + (* if he doesn't then set his consanguinity to 0 *) + | None -> + trace verbosity !cnt max_cnt; + decr cnt; + cset i (Adef.fix_of_float 0.0) ) persons ; done; if max_cnt <> 0 then diff --git a/lib/core/consangAll.mli b/lib/core/consangAll.mli index 06c86e96f3..0296ad396f 100644 --- a/lib/core/consangAll.mli +++ b/lib/core/consangAll.mli @@ -4,7 +4,8 @@ open Gwdb (** [compute base from_scratch] [?verbosity] may be 0, 1 or 2 (default is 2) - + Compute consanguinity for each person in the base. If [from_scratch] is set then recompute + consanguinity for entire database. Return [true] if base has been patched, [false] otherwise. *) val compute : ?verbosity:int -> base -> bool -> bool diff --git a/lib/def/adef.mli b/lib/def/adef.mli index 9d2298d448..471b8827f7 100644 --- a/lib/def/adef.mli +++ b/lib/def/adef.mli @@ -1,13 +1,13 @@ (* $Id: adef.mli,v 5.6 2007-02-21 18:14:01 ddr Exp $ *) (* Copyright (c) 1998-2007 INRIA *) -(** Consanguinity degree *) +(** Consanguinity rate *) type fix -(** Returns float coefficient of consanguinity degree *) +(** Returns float coefficient of consanguinity rate *) val float_of_fix : fix -> float -(** Returns consanguinity degree from its float coefficient *) +(** Returns consanguinity rate from its float coefficient *) val fix_of_float : float -> fix (** [fix] from int *) @@ -16,7 +16,7 @@ external fix : int -> fix = "%identity" (** [fix] to int *) external fix_repr : fix -> int = "%identity" -(** No consanguinity degree *) +(** No consanguinity *) val no_consang : fix (** Date data type that can be either concrete date associated to a calendar or a textual form of the date. *) diff --git a/lib/def/def.ml b/lib/def/def.ml index 245553baf5..1bcb99ba77 100644 --- a/lib/def/def.ml +++ b/lib/def/def.ml @@ -265,7 +265,7 @@ type ('iper, 'person, 'string) gen_person = psources : 'string; key_index : 'iper } -(** Person's ascendants with their consangunity degree *) +(** Person's ascendants with its consangunity rate (equal to relationship betwen his parents) *) type 'family gen_ascend = { parents : 'family option; consang : Adef.fix } (* Person's families to which he belongs as parent (union of families) *) From 2047cced58b1b9235ab5c2c31991c5cde0b8d0a0 Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed Date: Wed, 29 Dec 2021 00:50:42 +0100 Subject: [PATCH 45/73] Show documentation --- lib/show/def_show.mli | 609 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 609 insertions(+) create mode 100644 lib/show/def_show.mli diff --git a/lib/show/def_show.mli b/lib/show/def_show.mli new file mode 100644 index 0000000000..e42edf495f --- /dev/null +++ b/lib/show/def_show.mli @@ -0,0 +1,609 @@ +type date = Adef.date = Dgreg of dmy * calendar | Dtext of string +and calendar = Adef.calendar = Dgregorian | Djulian | Dfrench | Dhebrew +and dmy = + Adef.dmy = { + day : int; + month : int; + year : int; + prec : precision; + delta : int; +} +and dmy2 = + Adef.dmy2 = { + day2 : int; + month2 : int; + year2 : int; + delta2 : int; +} +and precision = + Adef.precision = + Sure + | About + | Maybe + | Before + | After + | OrYear of dmy2 + | YearInt of dmy2 + +(** Printer for [date] *) +val pp_date : Format.formatter -> date -> unit + +(** Convert [date] to string. *) +val show_date : date -> string + +(** Printer for [calendar] *) +val pp_calendar : + Format.formatter -> + calendar -> unit + +(** Convert [calendar] to string *) +val show_calendar : calendar -> string + +(** Printer for [dmy] *) +val pp_dmy : + Format.formatter -> dmy -> unit + +(** Convert [dmy] to string *) +val show_dmy : dmy -> string + +(** Printer for [dmy2] *) +val pp_dmy2 : + Format.formatter -> dmy2 -> unit + +(** Convert [dmy2] to string *) +val show_dmy2 : dmy2 -> string + +(** Printer for [precision] *) +val pp_precision : + Format.formatter -> + precision -> unit + +(** Convert [precision] to string *) +val show_precision : precision -> string + +type cdate = Adef.cdate + +(** Printer for [cdate] *) +val pp_cdate : + Format.formatter -> + Adef.cdate -> unit + +(** Convert [cdate] to string *) +val show_cdate : Adef.cdate -> string + +type relation_kind = + Def.relation_kind = + Married + | NotMarried + | Engaged + | NoSexesCheckNotMarried + | NoMention + | NoSexesCheckMarried + | MarriageBann + | MarriageContract + | MarriageLicense + | Pacs + | Residence + +(** Printer for [relation_kind] *) +val pp_relation_kind : + Format.formatter -> + relation_kind -> unit + +(** Convert [relation_kind] to string *) +val show_relation_kind : relation_kind -> string + +type divorce = Def.divorce = NotDivorced | Divorced of cdate | Separated + +(** Printer for [divorce] *) +val pp_divorce : + Format.formatter -> + divorce -> unit + +(** Convert [divorce] to string *) +val show_divorce : divorce -> string + +type death_reason = + Def.death_reason = + Killed + | Murdered + | Executed + | Disappeared + | Unspecified + +(** Printer for [death_reason] *) +val pp_death_reason : + Format.formatter -> + death_reason -> unit + +(** Convert [death_reason] to string *) +val show_death_reason : death_reason -> string + +type death = + Def.death = + NotDead + | Death of death_reason * cdate + | DeadYoung + | DeadDontKnowWhen + | DontKnowIfDead + | OfCourseDead + +(** Printer for [death] *) +val pp_death : + Format.formatter -> death -> unit + +(** Convert [death] to string *) +val show_death : death -> string + +type burial = + Def.burial = + UnknownBurial + | Buried of cdate + | Cremated of cdate + +(** Printer for [burial] *) +val pp_burial : + Format.formatter -> + burial -> unit + +(** Convert [burial] to string *) +val show_burial : burial -> string + +type access = Def.access = IfTitles | Public | Private + +(** Printer for [access] *) +val pp_access : + Format.formatter -> + access -> unit + +(** Convert [access] to string *) +val show_access : access -> string + +type 'string gen_title_name = + 'string Def.gen_title_name = + Tmain + | Tname of 'string + | Tnone + +(** Printer for [gen_title_name] *) +val pp_gen_title_name : + (Format.formatter -> + 'string -> unit) -> + Format.formatter -> + 'string gen_title_name -> unit + +(** Convert [gen_title_name] to string *) +val show_gen_title_name : + (Format.formatter -> + 'string -> unit) -> + 'string gen_title_name -> string + +type 'string gen_title = + 'string Def.gen_title = { + t_name : 'string gen_title_name; + t_ident : 'string; + t_place : 'string; + t_date_start : cdate; + t_date_end : cdate; + t_nth : int; +} + +(** Printer for [gen_title] *) +val pp_gen_title : + (Format.formatter -> + 'string -> unit) -> + Format.formatter -> + 'string gen_title -> unit + +(** Convert [gen_title] to string *) +val show_gen_title : + (Format.formatter -> + 'string -> unit) -> + 'string gen_title -> string + +type witness_kind = + Def.witness_kind = + Witness + | Witness_GodParent + | Witness_Officer + +(** Printer for [witness_kind] *) +val pp_witness_kind : + Format.formatter -> + witness_kind -> unit + +(** Convert [witness_kind] to string *) +val show_witness_kind : witness_kind -> string + +type 'string gen_pers_event_name = + 'string Def.gen_pers_event_name = + Epers_Birth + | Epers_Baptism + | Epers_Death + | Epers_Burial + | Epers_Cremation + | Epers_Accomplishment + | Epers_Acquisition + | Epers_Adhesion + | Epers_BaptismLDS + | Epers_BarMitzvah + | Epers_BatMitzvah + | Epers_Benediction + | Epers_ChangeName + | Epers_Circumcision + | Epers_Confirmation + | Epers_ConfirmationLDS + | Epers_Decoration + | Epers_DemobilisationMilitaire + | Epers_Diploma + | Epers_Distinction + | Epers_Dotation + | Epers_DotationLDS + | Epers_Education + | Epers_Election + | Epers_Emigration + | Epers_Excommunication + | Epers_FamilyLinkLDS + | Epers_FirstCommunion + | Epers_Funeral + | Epers_Graduate + | Epers_Hospitalisation + | Epers_Illness + | Epers_Immigration + | Epers_ListePassenger + | Epers_MilitaryDistinction + | Epers_MilitaryPromotion + | Epers_MilitaryService + | Epers_MobilisationMilitaire + | Epers_Naturalisation + | Epers_Occupation + | Epers_Ordination + | Epers_Property + | Epers_Recensement + | Epers_Residence + | Epers_Retired + | Epers_ScellentChildLDS + | Epers_ScellentParentLDS + | Epers_ScellentSpouseLDS + | Epers_VenteBien + | Epers_Will + | Epers_Name of 'string + +(** Printer for [gen_pers_event_name] *) +val pp_gen_pers_event_name : + (Format.formatter -> + 'string -> unit) -> + Format.formatter -> + 'string gen_pers_event_name -> unit + +(** Convert [gen_pers_event_name] to string *) +val show_gen_pers_event_name : + (Format.formatter -> + 'string -> unit) -> + 'string gen_pers_event_name -> string + +type ('person, 'string) gen_pers_event = + ('person, 'string) Def.gen_pers_event = { + epers_name : 'string gen_pers_event_name; + epers_date : cdate; + epers_place : 'string; + epers_reason : 'string; + epers_note : 'string; + epers_src : 'string; + epers_witnesses : ('person * witness_kind) array; +} + +(** Printer for [gen_pers_event] *) +val pp_gen_pers_event : + (Format.formatter -> + 'person -> unit) -> + (Format.formatter -> + 'string -> unit) -> + Format.formatter -> + ('person, 'string) gen_pers_event -> unit + +(** Convert [gen_pers_event] to string *) +val show_gen_pers_event : + (Format.formatter -> + 'person -> unit) -> + (Format.formatter -> + 'string -> unit) -> + ('person, 'string) gen_pers_event -> string + +type 'string gen_fam_event_name = + 'string Def.gen_fam_event_name = + Efam_Marriage + | Efam_NoMarriage + | Efam_NoMention + | Efam_Engage + | Efam_Divorce + | Efam_Separated + | Efam_Annulation + | Efam_MarriageBann + | Efam_MarriageContract + | Efam_MarriageLicense + | Efam_PACS + | Efam_Residence + | Efam_Name of 'string + +(** Printer for [gen_fam_event_name] *) +val pp_gen_fam_event_name : + (Format.formatter -> + 'string -> unit) -> + Format.formatter -> + 'string gen_fam_event_name -> unit + +(** Convert [gen_fam_event_name] to string *) +val show_gen_fam_event_name : + (Format.formatter -> + 'string -> unit) -> + 'string gen_fam_event_name -> string + +type ('person, 'string) gen_fam_event = + ('person, 'string) Def.gen_fam_event = { + efam_name : 'string gen_fam_event_name; + efam_date : cdate; + efam_place : 'string; + efam_reason : 'string; + efam_note : 'string; + efam_src : 'string; + efam_witnesses : ('person * witness_kind) array; +} + +(** Printer for [gen_fam_event] *) +val pp_gen_fam_event : + (Format.formatter -> + 'person -> unit) -> + (Format.formatter -> + 'string -> unit) -> + Format.formatter -> + ('person, 'string) gen_fam_event -> unit + +(** Convert [gen_fam_event] to string *) +val show_gen_fam_event : + (Format.formatter -> + 'person -> unit) -> + (Format.formatter -> + 'string -> unit) -> + ('person, 'string) gen_fam_event -> string + +type relation_type = + Def.relation_type = + Adoption + | Recognition + | CandidateParent + | GodParent + | FosterParent + +(** Printer for [relation_type] *) +val pp_relation_type : + Format.formatter -> + relation_type -> unit + +(** Convert [relation_type] to string *) +val show_relation_type : relation_type -> string + +type ('person, 'string) gen_relation = + ('person, 'string) Def.gen_relation = { + r_type : relation_type; + r_fath : 'person option; + r_moth : 'person option; + r_sources : 'string; +} + +(** Printer for [gen_relation] *) +val pp_gen_relation : + (Format.formatter -> + 'person -> unit) -> + (Format.formatter -> + 'string -> unit) -> + Format.formatter -> + ('person, 'string) gen_relation -> unit + +(** Convert [gen_relation] to string *) +val show_gen_relation : + (Format.formatter -> + 'person -> unit) -> + (Format.formatter -> + 'string -> unit) -> + ('person, 'string) gen_relation -> string + +type sex = Def.sex = Male | Female | Neuter + +(** Printer for [sex] *) +val pp_sex : + Format.formatter -> sex -> unit + +(** Convert [sex] to string *) +val show_sex : sex -> string + +type place = + Def.place = { + other : string; + town : string; + township : string; + canton : string; + district : string; + county : string; + region : string; + country : string; +} + +(** Printer for [place] *) +val pp_place : + Format.formatter -> place -> unit + +(** Convert [place] to string *) +val show_place : place -> string + +type ('iper, 'person, 'string) gen_person = + ('iper, 'person, 'string) Def.gen_person = { + first_name : 'string; + surname : 'string; + occ : int; + image : 'string; + public_name : 'string; + qualifiers : 'string list; + aliases : 'string list; + first_names_aliases : 'string list; + surnames_aliases : 'string list; + titles : 'string gen_title list; + rparents : ('person, 'string) gen_relation list; + related : 'person list; + occupation : 'string; + sex : sex; + access : access; + birth : cdate; + birth_place : 'string; + birth_note : 'string; + birth_src : 'string; + baptism : cdate; + baptism_place : 'string; + baptism_note : 'string; + baptism_src : 'string; + death : death; + death_place : 'string; + death_note : 'string; + death_src : 'string; + burial : burial; + burial_place : 'string; + burial_note : 'string; + burial_src : 'string; + pevents : ('person, 'string) gen_pers_event list; + notes : 'string; + psources : 'string; + key_index : 'iper; +} + +(** Printer for [gen_person] *) +val pp_gen_person : + (Format.formatter -> + 'iper -> unit) -> + (Format.formatter -> + 'person -> unit) -> + (Format.formatter -> + 'string -> unit) -> + Format.formatter -> + ('iper, 'person, 'string) gen_person -> unit + +(** Convert [gen_person] to string *) +val show_gen_person : + (Format.formatter -> + 'iper -> unit) -> + (Format.formatter -> + 'person -> unit) -> + (Format.formatter -> + 'string -> unit) -> + ('iper, 'person, 'string) gen_person -> string + +type fix = Adef.fix + +(** Printer for [fix] *) +val pp_fix : Format.formatter -> Adef.fix -> unit + +(** Convert [fix] to string *) +val show_fix : Adef.fix -> string + +type 'family gen_ascend = + 'family Def.gen_ascend = { + parents : 'family option; + consang : fix; +} + +(** Printer for [gen_ascend] *) +val pp_gen_ascend : + (Format.formatter -> + 'family -> unit) -> + Format.formatter -> + 'family gen_ascend -> unit + +(** Convert [gen_ascend] to string *) +val show_gen_ascend : + (Format.formatter -> + 'family -> unit) -> + 'family gen_ascend -> string + +type 'family gen_union = 'family Def.gen_union = { family : 'family array; } + +(** Printer for [gen_union] *) +val pp_gen_union : + (Format.formatter -> + 'family -> unit) -> + Format.formatter -> + 'family gen_union -> unit + +(** Convert [gen_union] to string *) +val show_gen_union : + (Format.formatter -> + 'family -> unit) -> + 'family gen_union -> string + +type ('person, 'ifam, 'string) gen_family = + ('person, 'ifam, 'string) Def.gen_family = { + marriage : cdate; + marriage_place : 'string; + marriage_note : 'string; + marriage_src : 'string; + witnesses : 'person array; + relation : relation_kind; + divorce : divorce; + fevents : ('person, 'string) gen_fam_event list; + comment : 'string; + origin_file : 'string; + fsources : 'string; + fam_index : 'ifam; +} + +(** Printer for [gen_family] *) +val pp_gen_family : + (Format.formatter -> + 'person -> unit) -> + (Format.formatter -> + 'ifam -> unit) -> + (Format.formatter -> + 'string -> unit) -> + Format.formatter -> + ('person, 'ifam, 'string) gen_family -> unit + +(** Convert [gen_family] to string *) +val show_gen_family : + (Format.formatter -> + 'person -> unit) -> + (Format.formatter -> + 'ifam -> unit) -> + (Format.formatter -> + 'string -> unit) -> + ('person, 'ifam, 'string) gen_family -> string + +type 'person gen_couple = 'person Adef.gen_couple + +(** Printer for [gen_couple] *) +val pp_gen_couple : + (Format.formatter -> + 'person -> unit) -> + Format.formatter -> + 'person gen_couple -> unit + +(** Convert [gen_couple] to string *) +val show_gen_couple : + (Format.formatter -> + 'person -> unit) -> + 'person gen_couple -> string + +type 'person gen_descend = + 'person Def.gen_descend = { + children : 'person array; +} + +(** Printer for [gen_descend] *) +val pp_gen_descend : + (Format.formatter -> + 'person -> unit) -> + Format.formatter -> + 'person gen_descend -> unit + +(** Convert [gen_descend] to string *) +val show_gen_descend : + (Format.formatter -> + 'person -> unit) -> + 'person gen_descend -> string \ No newline at end of file From 5fdcd48939c42109fb99f05b98fa1f202b6c9020 Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed Date: Wed, 29 Dec 2021 01:13:28 +0100 Subject: [PATCH 46/73] Ansel documentation --- lib/ansel.mli | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 lib/ansel.mli diff --git a/lib/ansel.mli b/lib/ansel.mli new file mode 100644 index 0000000000..98ddac176e --- /dev/null +++ b/lib/ansel.mli @@ -0,0 +1,6 @@ + +(** Convert ISO-8859-1 encoded string to ANSEL encoding used inside gedcom files *) +val of_iso_8859_1 : string -> string + +(** Convert ANSEL used inside gedcom files to ISO-8859-1 encoding *) +val to_iso_8859_1 : string -> string \ No newline at end of file From a53e3db0d907749507cff5bc7ead83fd4cec1d8c Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed Date: Wed, 29 Dec 2021 01:31:58 +0100 Subject: [PATCH 47/73] Base64 documentation --- lib/base64.mli | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 lib/base64.mli diff --git a/lib/base64.mli b/lib/base64.mli new file mode 100644 index 0000000000..e8e7a5c2b4 --- /dev/null +++ b/lib/base64.mli @@ -0,0 +1,3 @@ + +(** Decode {i Base64} binary-to-text encoding used at the moment of basic autorization *) +val decode : string -> string From ce50f75d99edeb89cda7097e20904cf53134b063 Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed Date: Thu, 30 Dec 2021 15:39:58 +0100 Subject: [PATCH 48/73] Check and CheckItem documentation --- lib/check.ml | 1 + lib/check.mli | 6 +++++ lib/checkItem.ml | 16 ++++++++++++ lib/checkItem.mli | 35 ++++++++++++++++++++++++-- lib/def/def.ml | 62 +++++++++++++++++++++++------------------------ 5 files changed, 87 insertions(+), 33 deletions(-) diff --git a/lib/check.ml b/lib/check.ml index 44c2f57e57..02d703bb4e 100644 --- a/lib/check.ml +++ b/lib/check.ml @@ -227,6 +227,7 @@ let min_year_of p = let dummy_date = CheckInfered (CheckOther max_int) +(* check ad print warning if ancestors is born before person *) let rec check_ancestors base warning year year_tab ip ini_p = let infer = function | CheckBefore i -> CheckInfered (CheckBefore (pred i)) diff --git a/lib/check.mli b/lib/check.mli index 69343c20d1..45c92cb7a0 100644 --- a/lib/check.mli +++ b/lib/check.mli @@ -4,9 +4,15 @@ open Gwdb +(** Print database specification error on the giving channel *) val print_base_error : out_channel -> base -> CheckItem.base_error -> unit + +(** Print database specification warning on the giving channel *) val print_base_warning : out_channel -> base -> CheckItem.base_warning -> unit +(** [check_base base onwarning onerror _] makes full database proprety check. Checks every person and family separetely + with corresponding function inside [CheckItem] module. Checks also person's graph in order to find cycles (if person + is own ancestor). *) val check_base : ?verbose:bool -> ?mem:bool diff --git a/lib/checkItem.ml b/lib/checkItem.ml index 9027683d6f..a2eb12de42 100644 --- a/lib/checkItem.ml +++ b/lib/checkItem.ml @@ -644,8 +644,11 @@ let check_person_dates_as_witness base warning p = end related_pers let check_pevents base warning p = + (* check order of events *) check_order_pevents warning p ; + (* check person's witnesses *) check_witness_pevents base warning p; + (* check another witness dates where person is a witness *) check_person_dates_as_witness base warning p let check_siblings ?(onchange = true) base warning (ifam, fam) callback = @@ -785,31 +788,44 @@ let check_parent_marriage_age warning fam p = loop (get_fevents fam) let check_parents warning fam fath moth = + (* check father's marriage date *) check_parent_marriage_age warning fam fath ; + (* check mother's marriage date *) check_parent_marriage_age warning fam moth ; + (* check age difference between spouses *) check_difference_age_between_cpl warning fath moth (* main *) let person ?(onchange = true) base warning p = + (* check personal events *) check_pevents base warning p; + (* check person's age *) check_person_age warning p; + (* check titles dates *) List.iter (title_dates warning p) (get_titles p); + (* check order of personal events *) if onchange then changed_pevents_order warning p ; related_sex_is_coherent base warning p let family ?(onchange = true) base warning ifam fam = let fath = poi base @@ get_father fam in let moth = poi base @@ get_mother fam in + (* check order of familial events *) check_order_fevents base warning fam ; + (* check family's witnesses *) check_witness_fevents base warning fam ; + (* check parents marraige *) check_parents warning fam fath moth ; + (* check children *) check_children ~onchange base warning (ifam, fam) fath moth ; if onchange then begin changed_fevents_order warning (ifam, fam); let father = poi base (get_father fam) in let mother = poi base (get_mother fam) in + (* change order of father's families *) changed_marriages_order base warning father; + (* change order of mother's families *) changed_marriages_order base warning mother end diff --git a/lib/checkItem.mli b/lib/checkItem.mli index ae8b94898f..1b5b9e0e1e 100644 --- a/lib/checkItem.mli +++ b/lib/checkItem.mli @@ -3,17 +3,25 @@ open Gwdb +(** Database specification error *) type base_error = person Def.error + +(** Database specification warning *) type base_warning = (iper, person, ifam, family, title, pers_event, fam_event) Def.warning + +(* *) type base_misc = (person, family, title) Def.misc +(** Event name that unites personal and familial event names *) type 'string event_name = - Psort of 'string Def.gen_pers_event_name - | Fsort of 'string Def.gen_fam_event_name + | Psort of 'string Def.gen_pers_event_name (** Personal event name *) + | Fsort of 'string Def.gen_fam_event_name (** Familial event name *) +(** Sort events (both peronal and familial) by their date and their name *) val sort_events : ('a -> 'string event_name) -> ('a -> Adef.cdate) -> 'a list -> 'a list +(** Merge two sorted event lists (returns sorted list) *) val merge_events : ('a -> 'string event_name) -> ('a -> Adef.cdate) -> 'a list -> 'a list -> 'a list @@ -29,6 +37,14 @@ val check_siblings : -> (person -> unit) -> unit +(** [person onchange base warn p] checks person's properties: + + - personal events + - person's age + - person's titles dates + - etc. + If [onchange] is set then sort person's events + Calls [warn] on corresponding [base_warning] when find some inconsistencies. *) val person : ?onchange:bool -> base @@ -36,6 +52,14 @@ val person -> person -> (iper * person * Def.sex option * relation list option) list option +(** [family onchange base warn f] checks family properties like : + + - familial events + - parents marraige + - children age gap and birth + - etc. + If [onchange] is set then sort family's events + Calls [warn] on corresponding [base_warning] when find some inconsistencies. *) val family : ?onchange:bool -> base @@ -44,14 +68,21 @@ val family -> family -> unit +(** Unlike [person] who checks directly the properties of a person, checks the properties + of a person in relation to other people (his children, parents, spouses, witnesses, etc). + Calls [warn] on corresponding [base_warning] when find some inconsistencies. + *) val on_person_update : base -> (base_warning -> unit) -> person -> unit +(** Sort array of children by their birth date from oldest to youngest. + Returns old array and sorted version. *) val sort_children : base -> iper array -> (iper array * iper array) option +(** Cheks if family, father and mother have sources. Otherwise call [misc] on [base_misc] *) val check_other_fields : base -> (base_misc -> unit) -> ifam -> family -> unit diff --git a/lib/def/def.ml b/lib/def/def.ml index 1bcb99ba77..2a8fa7c7d8 100644 --- a/lib/def/def.ml +++ b/lib/def/def.ml @@ -294,42 +294,42 @@ type 'person gen_couple = 'person Adef.gen_couple (** Database errors describing bad specification of the person *) type 'person error = - AlreadyDefined of 'person - | OwnAncestor of 'person + | AlreadyDefined of 'person + | OwnAncestor of 'person (** Person is his own ancestor *) | BadSexOfMarriedPerson of 'person (** Database warnings attached to the specification of the person, family, relation, etc. *) type ('iper, 'person, 'family, 'descend, 'title, 'pevent, 'fevent) warning = - | BigAgeBetweenSpouses of 'person * 'person * dmy - | BirthAfterDeath of 'person - | IncoherentSex of 'person * int * int - | ChangedOrderOfChildren of 'family * 'descend * 'iper array * 'iper array - | ChangedOrderOfMarriages of 'person * 'family array * 'family array - | ChangedOrderOfFamilyEvents of 'family * 'fevent list * 'fevent list - | ChangedOrderOfPersonEvents of 'person * 'pevent list * 'pevent list - | ChildrenNotInOrder of 'family * 'descend * 'person * 'person - | CloseChildren of 'family * 'person * 'person - | DeadOld of 'person * dmy - | DeadTooEarlyToBeFather of 'person * 'person - | DistantChildren of 'family * 'person * 'person - | FEventOrder of 'person * 'fevent * 'fevent - | FWitnessEventAfterDeath of 'person * 'fevent * 'family - | FWitnessEventBeforeBirth of 'person * 'fevent * 'family - | IncoherentAncestorDate of 'person * 'person - | MarriageDateAfterDeath of 'person - | MarriageDateBeforeBirth of 'person - | MotherDeadBeforeChildBirth of 'person * 'person - | ParentBornAfterChild of 'person * 'person - | ParentTooOld of 'person * dmy * 'person - | ParentTooYoung of 'person * dmy * 'person - | PEventOrder of 'person * 'pevent * 'pevent + | BigAgeBetweenSpouses of 'person * 'person * dmy (* Age differece between couples is greater then 50 years *) + | BirthAfterDeath of 'person (** Person is born after his death *) + | IncoherentSex of 'person * int * int (** Incoherent sex of person *) + | ChangedOrderOfChildren of 'family * 'descend * 'iper array * 'iper array (** Children order has been modified *) + | ChangedOrderOfMarriages of 'person * 'family array * 'family array (** Person's marriages order has been modified *) + | ChangedOrderOfFamilyEvents of 'family * 'fevent list * 'fevent list (** Family's events order has been modified *) + | ChangedOrderOfPersonEvents of 'person * 'pevent list * 'pevent list (** Person's events order has been modified *) + | ChildrenNotInOrder of 'family * 'descend * 'person * 'person (** Children aren't ordered *) + | CloseChildren of 'family * 'person * 'person (** Age difference between two child is less then 7 month (except for twins) *) + | DeadOld of 'person * dmy (** Dead old (at the age older then 109 after 1900 year and older then 100 before) *) + | DeadTooEarlyToBeFather of 'person * 'person (** Childran is born in more then 1 year after his father's death *) + | DistantChildren of 'family * 'person * 'person (** Age gap between two of siblings greater then 50 years *) + | FEventOrder of 'person * 'fevent * 'fevent (** Familial events haven't been ordered correctly *) + | FWitnessEventAfterDeath of 'person * 'fevent * 'family (** Witness is dead before familial event date *) + | FWitnessEventBeforeBirth of 'person * 'fevent * 'family (** Witness is born after familial event date *) + | IncoherentAncestorDate of 'person * 'person (** Ancestor is born after person's birth *) + | MarriageDateAfterDeath of 'person (** Person is married after his death *) + | MarriageDateBeforeBirth of 'person (** Person is married before his birth *) + | MotherDeadBeforeChildBirth of 'person * 'person (** Childran is born after his mother's death *) + | ParentBornAfterChild of 'person * 'person (** Parent is born after one of his childran *) + | ParentTooOld of 'person * dmy * 'person (** Person became a parent at age older then 55 years for mother and 70 for father *) + | ParentTooYoung of 'person * dmy * 'person (** Person became a parent at age younger then 11 years old *) + | PEventOrder of 'person * 'pevent * 'pevent (** Personal events haven't been ordered correctly *) | PossibleDuplicateFam of 'family * 'family - | PWitnessEventAfterDeath of 'person * 'pevent * 'person - | PWitnessEventBeforeBirth of 'person * 'pevent * 'person - | TitleDatesError of 'person * 'title - | UndefinedSex of 'person - | YoungForMarriage of 'person * dmy * 'family - | OldForMarriage of 'person * dmy * 'family + | PWitnessEventAfterDeath of 'person * 'pevent * 'person (** Witness is dead before personal event date *) + | PWitnessEventBeforeBirth of 'person * 'pevent * 'person (** Witness is born after personal event date *) + | TitleDatesError of 'person * 'title (** Title's start date is after end date or person is born after title dates *) + | UndefinedSex of 'person (** Person has undefined sex (Neuter) *) + | YoungForMarriage of 'person * dmy * 'family (** Person is married before he was 12 years old *) + | OldForMarriage of 'person * dmy * 'family (** Person is married after he was 100 years old *) (* TODOOCP: doc *) type ('person, 'descend, 'title) misc = MissingSources From 7e8e8d0c1cccd4f24a27eca910ee70f2888bfc50 Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed Date: Thu, 30 Dec 2021 15:42:51 +0100 Subject: [PATCH 49/73] Version documentation --- lib/version.mli | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 lib/version.mli diff --git a/lib/version.mli b/lib/version.mli new file mode 100644 index 0000000000..bb8f6545ac --- /dev/null +++ b/lib/version.mli @@ -0,0 +1,6 @@ + +(** Current Geneweb version *) +val txt : string + +(** List of all supported by Geneweb languages (abbreviations). *) +val available_languages : string list \ No newline at end of file From 9dd66581da158197a04b9c0c90ad165e20c812fb Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed Date: Thu, 30 Dec 2021 20:23:00 +0100 Subject: [PATCH 50/73] Stats documentation --- lib/stats.mli | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 lib/stats.mli diff --git a/lib/stats.mli b/lib/stats.mli new file mode 100644 index 0000000000..351c458cdc --- /dev/null +++ b/lib/stats.mli @@ -0,0 +1,30 @@ + +(** Statistic about persons in database *) +type stats = { + (* Number of men *) + mutable men : int; + (* Number of women *) + mutable women : int; + (* Number of persons with neuter sex *) + mutable neutre : int; + (* Number of persons with unknown first name and surname *) + mutable noname : int; + (* Oldest father with age when he became father *) + mutable oldest_father : int * Gwdb.person; + (* Oldest mother with age when she became mother *) + mutable oldest_mother : int * Gwdb.person; + (* Youngest father with age when he became father *) + mutable youngest_father : int * Gwdb.person; + (* Youngest mother with age when he became mother *) + mutable youngest_mother : int * Gwdb.person; + (* Oldest dead person with his age when he died *) + mutable oldest_dead : int * Gwdb.person; + (* Oldest person that is still alive with his age *) + mutable oldest_still_alive : int * Gwdb.person; +} + +(** Compute [stats] from the database's persons *) +val stat_base : Gwdb.base -> stats + +(** Prints statistic [stats] on stdout *) +val print_stats : Gwdb.base -> stats -> unit \ No newline at end of file From bf8963bef386ba95b8d00da082ecb7745dd41379 Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed Date: Thu, 30 Dec 2021 22:44:34 +0100 Subject: [PATCH 51/73] Fixbase documentation --- lib/def/def.ml | 3 ++- lib/fixbase.ml | 2 +- lib/fixbase.mli | 18 +++++++++++++++++- lib/updateFamOk.mli | 12 +++++++----- 4 files changed, 27 insertions(+), 8 deletions(-) diff --git a/lib/def/def.ml b/lib/def/def.ml index 2a8fa7c7d8..192b9128de 100644 --- a/lib/def/def.ml +++ b/lib/def/def.ml @@ -265,7 +265,8 @@ type ('iper, 'person, 'string) gen_person = psources : 'string; key_index : 'iper } -(** Person's ascendants with its consangunity rate (equal to relationship betwen his parents) *) +(** Person's ascendants (family where he is a childran) with its consangunity rate + (equal to relationship betwen his parents). *) type 'family gen_ascend = { parents : 'family option; consang : Adef.fix } (* Person's families to which he belongs as parent (union of families) *) diff --git a/lib/fixbase.ml b/lib/fixbase.ml index e00a84ce28..0ee8fd77ed 100644 --- a/lib/fixbase.ml +++ b/lib/fixbase.ml @@ -193,7 +193,7 @@ let check_persons_parents ?report progress base = let ip = get_iper p in let fam = Gwdb.foi base ifam in if get_ifam fam = dummy_ifam then begin - patch_ascend base ip {parents = None; consang = Adef.fix (-1)}; + patch_ascend base ip {parents = None; consang = Adef.no_consang}; match report with | Some fn -> fn (Fix_ParentDeleted ip) | None -> () diff --git a/lib/fixbase.mli b/lib/fixbase.mli index 9de62f5ca4..7f02a04038 100644 --- a/lib/fixbase.mli +++ b/lib/fixbase.mli @@ -11,7 +11,8 @@ [Gwdb.commit_patches] *) - +(** All possible patches that could be automatically deducted from incontinent + or absent information in the database *) type patch = | Fix_NBDS of Gwdb.iper | Fix_AddedUnion of Gwdb.iper @@ -27,24 +28,39 @@ type patch = | Fix_WrongUTF8Encoding of Gwdb.ifam option * Gwdb.iper option * (Gwdb.istr * Gwdb.istr) option | Fix_UpdatedOcc of Gwdb.iper * int * int +(** For every person in the base synchronise his birth, death, baptism and burial events with + his fields and vice versa. *) val check_NBDS : ?report:(patch -> unit) -> (int -> int -> unit) -> Gwdb.base -> unit +(** For every family's parent in the base add current family to the parent's union (if absent). *) val check_families_parents : ?report:(patch -> unit) -> (int -> int -> unit) -> Gwdb.base -> unit +(** For every family's childran in the base add current family to the childran's ascendants (if absent). + Doesn't modify consanguinity rate. *) val check_families_children : ?report:(patch -> unit) -> (int -> int -> unit) -> Gwdb.base -> unit +(** For every person checks it ascendants. If it references to the dummy family, then remove this reference. + Otherwise add person to the family's children if he is absent. *) val check_persons_parents : ?report:(patch -> unit) -> (int -> int -> unit) -> Gwdb.base -> unit +(** For every person in the base removes all duplicate families and families where person isn't a parent *) val check_persons_families : ?report:(patch -> unit) -> (int -> int -> unit) -> Gwdb.base -> unit +(** For every person's event's witness add current person to the list of related persons if absent. *) val check_pevents_witnesses : ?report:(patch -> unit) -> (int -> int -> unit) -> Gwdb.base -> unit +(** For every family's event's witness add family's father to the list of related persons if absent. *) val check_fevents_witnesses : ?report:(patch -> unit) -> (int -> int -> unit) -> Gwdb.base -> unit +(** For every family in the base synchronise its fields with marriage and divorce events. *) val fix_marriage_divorce : ?report:(patch -> unit) -> (int -> int -> unit) -> Gwdb.base -> unit +(** For every family's missing parent (or spouse) fix his id and add current family to the parent's union *) val fix_missing_spouses : ?report:(patch -> unit) -> (int -> int -> unit) -> Gwdb.base -> unit +(** For every person's and family's string remplace it with normalized UTF8 version *) val fix_utf8_sequence : ?report:(patch -> unit) -> (int -> int -> unit) -> Gwdb.base -> unit +(** For every person in the base update his occurence number if someone with same name and same occurence + number already exists in the base. *) val fix_key : ?report:(patch -> unit) -> (int -> int -> unit) -> Gwdb.base -> unit diff --git a/lib/updateFamOk.mli b/lib/updateFamOk.mli index 4e1f2a976c..ce912a8921 100644 --- a/lib/updateFamOk.mli +++ b/lib/updateFamOk.mli @@ -1,9 +1,11 @@ (** [reconstitute_from_fevents nsck empty_string family_events] - Returns a tuple with: - * marriage information (relation kind, date, place, notes, source); - * divorce information; - * marriage witnesses; + Iterate over family's events and returns a tuple with: + + - marriage information (relation kind, date, place, notes, source); + - divorce information; + - marriage witnesses; + Boolean `nsck' is true if no check have been made on the married persons sex. *) @@ -75,6 +77,6 @@ val print_inv : Config.config -> Gwdb.base -> unit (** Changes the family order for a person *) val print_change_order_ok : Config.config -> Gwdb.base -> unit -(** Changes the evenements order fo a family *) +(** Changes the evenements order for a family *) val print_change_event_order : Config.config -> Gwdb.base -> unit From b0b8a39759d038f7085ad230167f3faac0ab1aa6 Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed Date: Fri, 31 Dec 2021 13:16:37 +0100 Subject: [PATCH 52/73] Json_converter documentation --- lib/json_export/json_converter.mli | 86 ++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 lib/json_export/json_converter.mli diff --git a/lib/json_export/json_converter.mli b/lib/json_export/json_converter.mli new file mode 100644 index 0000000000..c3ab3a61c4 --- /dev/null +++ b/lib/json_export/json_converter.mli @@ -0,0 +1,86 @@ + +(** Json converter driver *) +module type ConverterDriver = sig + + (** Json value *) + type t + + (** Convert to JSON string *) + val str : string -> t + + (** Convert to JSON integer *) + val int : int -> t + + (** Convert to JSON object *) + val obj : (string * t) array -> t + + (** Convert to JSON null value *) + val null : t + + (** Convert array to JSON list *) + val array : 't array -> t + + (** Convert list to JSON list *) + val list : 't list -> t + + (** Convert to JSON boolean *) + val bool : bool -> t +end + +(** Functor building JSON convertion functions of the Geneweb data types. *) +module Make : + functor (D : ConverterDriver) -> + sig + + (** Convert [dmy] to JSON *) + val conv_dmy : Def.dmy -> D.t + + (** Convert [dmy2] to JSON *) + val conv_dmy2 : Def.dmy2 -> D.t + + (** Convert [cdate] to JSON *) + val conv_cdate : Def.cdate -> D.t + + (** Convert [gen_pers_event_name] to JSON *) + val conv_pevent_name : string Def.gen_pers_event_name -> D.t + + (** Convert [witness_kind] to JSON *) + val conv_event_witness_kind : Def.witness_kind -> D.t + + (** Convert [gen_pers_event] to JSON *) + val conv_pevent : (Gwdb_driver.iper, string) Def.gen_pers_event -> D.t + + (** Convert [gen_title_name] to JSON *) + val conv_title_name : string Def.gen_title_name -> D.t + + (** Convert [gen_title] to JSON *) + val conv_title : string Def.gen_title -> D.t + + (** Convert [relation_kind] to JSON *) + val conv_relation_kind : Def.relation_kind -> D.t + + (** Convert [gen_fam_event_name] to JSON *) + val conv_fevent_name : string Def.gen_fam_event_name -> D.t + + (** Convert [gen_fam_event] to JSON *) + val conv_fevent : (Gwdb_driver.iper, string) Def.gen_fam_event -> D.t + + (** Convert [divorce] to JSON *) + val conv_divorce : Def.divorce -> D.t + + (** Convert [relation_type] to JSON *) + val conv_relation_type : Def.relation_type -> D.t + + (** Convert [gen_relation] to JSON *) + val conv_rparent : (Gwdb_driver.iper, string) Def.gen_relation -> D.t + + (** Convert [death] to JSON *) + val conv_death : Def.death -> D.t + + (** Convert [person] to JSON *) + val conv_person : Gwdb.base -> Gwdb.person -> D.t + + (** Convert [family] to JSON *) + val conv_family : Gwdb.base -> Gwdb.family -> D.t + + end \ No newline at end of file From 8b7e10035a76d271374e22d642f8c2969a9f65cc Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed Date: Sun, 2 Jan 2022 20:58:46 +0100 Subject: [PATCH 53/73] Config and Output full documentation, almost finished GWPARAM, Hutil, ImageDisplay and Search_name, partly documented Util, SrcfileDisplay, Some --- bin/gwd/request.ml | 1 + bin/wserver/wserver.mli | 4 +- lib/GWPARAM.mli | 27 +++++++++++++ lib/config.ml | 14 ++++++- lib/core/consang.mli | 5 ++- lib/gwdb_driver.mli/gwdb_driver.mli | 9 +++-- lib/hutil.mli | 36 +++++++++++++++-- lib/imageDisplay.ml | 6 +++ lib/imageDisplay.mli | 11 ++---- lib/output.mli | 17 ++++++++ lib/searchName.mli | 15 ++++++- lib/some.mli | 9 +++++ lib/srcfileDisplay.mli | 1 + lib/util.mli | 61 +++++++++++++++++++++++++---- lib/util/secure.mli | 2 +- 15 files changed, 189 insertions(+), 29 deletions(-) create mode 100644 lib/GWPARAM.mli create mode 100644 lib/output.mli diff --git a/bin/gwd/request.ml b/bin/gwd/request.ml index 3c2055604d..3b5c63dce6 100644 --- a/bin/gwd/request.ml +++ b/bin/gwd/request.ml @@ -211,6 +211,7 @@ let very_unknown conf _ = Hutil.trailer conf | None -> incorrect_request conf +(* Print Not found page *) let unknown = begin fun conf n -> let title _ = Output.printf conf "%s: \"%s\"" (Utf8.capitalize_fst (transl conf "not found")) diff --git a/bin/wserver/wserver.mli b/bin/wserver/wserver.mli index 258662dd83..3259abe142 100644 --- a/bin/wserver/wserver.mli +++ b/bin/wserver/wserver.mli @@ -41,11 +41,11 @@ val printf : ('a, out_channel, unit) format -> 'a val print_string : string -> unit (* To be called to print page contents. *) -(** Prints a header; cannot be called if status or content already has been sent *) +(** Prints a header; cannot be called if part of content part already has been sent *) val header : string -> unit (* To print an http header line *) -(** Flushes the content of the current *) +(** Flushes the content of the current socket *) val wflush : unit -> unit (* To flush page contents print. *) diff --git a/lib/GWPARAM.mli b/lib/GWPARAM.mli new file mode 100644 index 0000000000..67b11bb6eb --- /dev/null +++ b/lib/GWPARAM.mli @@ -0,0 +1,27 @@ +type syslog_level = + [ `LOG_ALERT + | `LOG_CRIT + | `LOG_DEBUG + | `LOG_EMERG + | `LOG_ERR + | `LOG_INFO + | `LOG_NOTICE + | `LOG_WARNING ] + +(** Inititialise assets for gwd server (one in current directory one in /usr/share/geneweb) *) +val init : (unit -> unit) ref + +(** [!base_path pref fname] default function that returns path to [fname] inside base directory where [pref] + is a list of subdirectories between base directory and [fname]. *) +val base_path : (string list -> string -> string) ref + +(** [!bpath fname] default function that returns path to [fname] inside base directory *) +val bpath : (string -> string) ref +val output_error : + (?headers:string list -> + ?content:string -> Config.config -> Def.httpStatus -> unit) + ref +val p_auth : (Config.config -> Gwdb.base -> Gwdb.person -> bool) ref +val syslog : (syslog_level -> string -> unit) ref +val wrap_output : + (Config.config -> string -> (unit -> unit) -> unit) ref \ No newline at end of file diff --git a/lib/config.ml b/lib/config.ml index 291ce680aa..e22d32f433 100644 --- a/lib/config.ml +++ b/lib/config.ml @@ -3,16 +3,25 @@ open Def open Gwdb +(** Authentication scheme data type *) type auth_scheme_kind = NoAuth | TokenAuth of token_auth_scheme | HttpAuth of http_auth_scheme + +(** Authentication via security token *) and token_auth_scheme = { ts_user : string; ts_pass : string } + +(** Authentication via HTTP *) and http_auth_scheme = Basic of basic_auth_scheme | Digest of digest_auth_scheme + +(** Basic authentication scheme inside {i Autorization} HTTP header *) and basic_auth_scheme = { bs_realm : string; bs_user : string; bs_pass : string } + +(** Digest authentication scheme inside {i Autorization} HTTP header *) and digest_auth_scheme = { ds_username : string; ds_realm : string; @@ -24,6 +33,7 @@ and digest_auth_scheme = ds_cnonce : string; ds_response : string } +(** HTTP printer, that prints and sends requests on the user's socket *) type output_conf = { status : Def.httpStatus -> unit ; header : string -> unit @@ -31,6 +41,7 @@ type output_conf = ; flush : unit -> unit } +(** Geneweb configuration data type *) type config = { from : string; api_mode : bool; @@ -66,6 +77,7 @@ type config = env : (string * string) list; mutable senv : (string * string) list; mutable henv : (string * string) list; + (* content of .gwf file *) base_env : (string * string) list; allowed_titles : string list Lazy.t; denied_titles : string list Lazy.t; @@ -82,13 +94,13 @@ type config = today_wd : int; time : int * int * int; ctime : float; + (* HTTP printer *) mutable output_conf : output_conf ; (* prefix for image urls: the value of argument -images_url if specified, otherwise command ^ "?m=IM&v=" in CGI mode "images" otherwise *) image_prefix : string; - (* if true, the base name is in the b argument of the query string: ?b=BASE&... if false, the base name is the last element of the uri path: .../base?... *) cgi : bool diff --git a/lib/core/consang.mli b/lib/core/consang.mli index f6dadabf61..bae0c4d152 100644 --- a/lib/core/consang.mli +++ b/lib/core/consang.mli @@ -5,8 +5,10 @@ open Gwdb (* TODOOCP: doc *) +(** Relation with ancestor status *) type anc_stat +(** Consanguinity information attached to person (relationship between parents) *) type relationship = { mutable weight1 : float; mutable weight2 : float; @@ -18,6 +20,7 @@ type relationship = mutable anc_stat1 : anc_stat; mutable anc_stat2 : anc_stat } +(** Computation consanguinity state for every person in the base *) type relationship_info = { (* Information about topological rank for each person *) @@ -38,7 +41,7 @@ val topological_sort -> (Gwdb.base -> Gwdb.iper -> Gwdb.person) -> (Gwdb.iper, int) Gwdb.Marker.t -(** Initialise relationship info *) +(** Initialise relationship info. *) val make_relationship_info : base -> (Gwdb.iper, int) Gwdb.Marker.t -> relationship_info (* TODOOCP: doc *) diff --git a/lib/gwdb_driver.mli/gwdb_driver.mli b/lib/gwdb_driver.mli/gwdb_driver.mli index 43d50c3bf0..2028f25826 100644 --- a/lib/gwdb_driver.mli/gwdb_driver.mli +++ b/lib/gwdb_driver.mli/gwdb_driver.mli @@ -425,12 +425,13 @@ val spi_first : string_person_index -> string -> istr Gutil.alphabetical order *) val spi_next : string_person_index -> istr -> istr -(** Retruns all persons id having that [first/sur]name id as the [first/sur]name *) +(** Retruns all persons id having that [first/sur]name. *) val spi_find : string_person_index -> istr -> iper list -(** [base_visible_get base fct ip] get visibility of person [ip] ([true] for visible) - from the [base]. If file {i restrict} is present then get read it to get visibility information. - If person's visibility isn't known, then set it with [fct]. *) +(** [base_visible_get base fct ip] get visibility of person [ip] ([true] for not visible + (restrited)) from the [base]. If file {i restrict} is present then read it to get + visibility information. If person's visibility isn't known, then set it with [fct]. + Used when mode `use_restrict` is ativated *) val base_visible_get : base -> (person -> bool) -> iper -> bool (** Write updated visibility information to the {i restricted} file. *) diff --git a/lib/hutil.mli b/lib/hutil.mli index 1e8d75ae92..6861837b16 100644 --- a/lib/hutil.mli +++ b/lib/hutil.mli @@ -3,18 +3,46 @@ open Config +(** [header_without_http conf title] pritns HTML page header in the body of the current response on the socket. + HTML page header consists of : + + - Declaration + - tag where : + + - content of tag is get with [title true] + - <meta> and <link> tags are filled due to [conf] + - content of <style> tag is evaluated and send by interpretation of template {i etc/css.txt} + + - Opening <body> tag with its attributes + - If user is a wizard or a friend, then includes all messages send to him. *) +val header_without_http : config -> (bool -> unit) -> unit + +(** Calls for [Util.html] to print HTTP header and for [header_without_http] to print HTML page header. Additionaly + prints opening container <div> tag on the socket. *) +val header_without_page_title : config -> (bool -> unit) -> unit + +val header_no_page_title : config -> (bool -> unit) -> unit + +(** [header conf title] calls for [header_without_page_title] to print HTTP header and HTML page header. Additionaly + prints page title with [title true] (false to print browser tab title). *) val header : config -> (bool -> unit) -> unit val header_fluid : config -> (bool -> unit) -> unit val header_link_welcome : config -> (bool -> unit) -> unit -val print_link_to_welcome : config -> bool -> unit val trailer : config -> unit -val header_without_page_title : config -> (bool -> unit) -> unit -val header_without_http : config -> (bool -> unit) -> unit -val header_no_page_title : config -> (bool -> unit) -> unit +(** Same as [header] except page's title informs about an occured error. *) val rheader : config -> (bool -> unit) -> unit + +(** Returns the HTML link to the previous (referer) page *) val link_to_referer : config -> string + +(** [gen_print_link_to_welcome f conf right_alined] prints links to previous and to home page. [f] is used to print additional + content. *) val gen_print_link_to_welcome : (unit -> unit) -> config -> bool -> unit + +(** Calls [gen_print_link_to_welcome] with empty function [f]. *) +val print_link_to_welcome : config -> bool -> unit + val gen_trailer : bool -> config -> unit val incorrect_request : config -> unit diff --git a/lib/imageDisplay.ml b/lib/imageDisplay.ml index 9a25f0de2d..391a37962d 100644 --- a/lib/imageDisplay.ml +++ b/lib/imageDisplay.ml @@ -56,6 +56,12 @@ let print_image_type conf fname ctype = (* ************************************************************************** *) (* [Fonc] print_image_file : string -> bool *) +(** [Description] : Affiche une image (avec ses en-têtes) en réponse HTTP en + utilisant Wserver. Le type MIME de l'image est deviné à + partir de l'extension contenu dans le nom du fichier. + [Args] : + - fname : le nom du fichier image + [Retour] : True si l'image a pu être affichée *) (* ************************************************************************** *) let print_image_file conf fname = List.exists diff --git a/lib/imageDisplay.mli b/lib/imageDisplay.mli index 0b53050f83..a28fc3864a 100644 --- a/lib/imageDisplay.mli +++ b/lib/imageDisplay.mli @@ -1,10 +1,7 @@ -(** [Description] : Affiche une image (avec ses en-têtes) en réponse HTTP en - utilisant Wserver. Le type MIME de l'image est deviné à - partir de l'extension contenu dans le nom du fichier. - [Args] : - - fname : le nom du fichier image - [Retour] : True si l'image a pu être affichée *) -val print_image_file : Config.config -> string -> bool +(** [print_image_file conf fname] send HTTP respose with content of an image file at the path [fname]. + MIME type of an image is deducted from [fname] extension. Returns [false] if image + wasn't found or couldn't be send. *) +val print_image_file : Config.config -> string -> bool (** [Description] : Traite une requête image. [Args] : diff --git a/lib/output.mli b/lib/output.mli new file mode 100644 index 0000000000..bfad54a75c --- /dev/null +++ b/lib/output.mli @@ -0,0 +1,17 @@ + +(** [status conf answer] print HTTP status line to the socket where [answer] is a HTTP status. *) +val status : Config.config -> Def.httpStatus -> unit + +(** Formatter printing of the HTTP header (header line) to the socket. If used without seting HTTP status with [status], + it is set OK. *) +val header : Config.config -> ('a, unit, string, unit) format4 -> 'a + +(** Printing the part of HTTP response body on the socket. If used without seting HTTP status with [status], it is set OK. *) +val print_string : Config.config -> string -> unit + +(** Formatter printing of the part of HTTP response body on the socket. If used without seting HTTP status with [status], + it is set OK. *) +val printf : Config.config -> ('a, unit, string, unit) format4 -> 'a + +(** Flushes (send) printed previously content of the buffer on the socket. *) +val flush : Config.config -> unit \ No newline at end of file diff --git a/lib/searchName.mli b/lib/searchName.mli index 4f81d72517..d714745a0c 100644 --- a/lib/searchName.mli +++ b/lib/searchName.mli @@ -3,14 +3,27 @@ open Config open Gwdb - +(** [search_key_aux aux conf base str] search persons by misc name [str] (could be one of the mix). If result is empty tries to + it search names with roman number instead of numerals (if they are present in the name). Applies [aux] on the result and removes + all dublicates. Empty persons, persons with private names or persons to which there are no rights to access are not listed. *) val search_key_aux : (config -> base -> person list -> string -> person list) -> config -> base -> string -> person list + +(** Search persons by name that has format {i "firstname surname"}. Dublicates are possible. Empty persons, persons with private + names or persons to which there are no rights to access are not listed. *) val search_by_name : config -> base -> string -> person list + +(** Calls [search_key_aux] with [aux] fonction that makes calls to [search_by_name] if result is empty. *) val search_partial_key : config -> base -> string -> person list + val search_by_sosa : config -> base -> string -> person list + +(** Same as [search_by_name] but search by key that has format {i "firstname.occ surname"}. *) val search_by_key : config -> base -> string -> person list + +(** Calls [search_key_aux] with [aux] fonction that filter result list and only persons whose + [fname^sname] or one of their misc names are equal to key. *) val search_approx_key : config -> base -> string -> person list val print : diff --git a/lib/some.mli b/lib/some.mli index c57fef7f6a..f772104666 100644 --- a/lib/some.mli +++ b/lib/some.mli @@ -1,6 +1,15 @@ val surname_not_found : Config.config -> string -> unit +(** [persons_of_fsname conf base base_strings_of_fsname find proj x] function where: + + - [base_strings_of_fsname base x] is a function that returns the list of first/surnames (as istr) being equal to [x] + - [find istr] is a function that returns the list of persons having [istr] as a first/surname id + - [proj iper] is a function that returns first/surname id from the giving person id. + - [x] is a first/surname or its substring. + + Returns [(l,inj)] where [l] is a list of [(str,istr,iperl)] where [istr] is id of [str] and [iperl] is a list of persons + found that has [istr] as a first/surname such that [str = inj x]*) val persons_of_fsname : Config.config -> Gwdb.base -> diff --git a/lib/srcfileDisplay.mli b/lib/srcfileDisplay.mli index 927675e299..604e0df010 100644 --- a/lib/srcfileDisplay.mli +++ b/lib/srcfileDisplay.mli @@ -12,6 +12,7 @@ val print_start : config -> base -> unit val incr_welcome_counter : config -> (int * int * string) option val incr_request_counter : config -> (int * int * string) option +(** Compute administration file path with giving name (search inside {i cnt} directory) *) val adm_file : string -> string val source_file_name : config -> string -> string diff --git a/lib/util.mli b/lib/util.mli index 9bb124be0d..fa8acaeb7b 100644 --- a/lib/util.mli +++ b/lib/util.mli @@ -18,7 +18,7 @@ val base_path : string list -> string -> string val bpath : string -> string (** Checks that the file in argument belong to one of the asserts dir - (defined in the Secure module *) + (defined in the Secure module) *) val search_in_assets : string -> string (** Returns the path to the template file in parameter *) @@ -32,12 +32,15 @@ val commit_patches : config -> base -> unit val update_wf_trace : config -> string -> unit +(** Get referer (the page you came from to the current page) page from HTTP request *) val get_referer : config -> string val no_html_tags : string -> string val clean_html_tags : string -> string list -> string +(** Prints HTTP response headers with giving content type (default : {i text/html}) on the socket. *) val html : ?content_type:string -> config -> unit + val unauthorized : config -> string -> unit val string_of_ctime : config -> string @@ -49,9 +52,14 @@ val prefix_base_2 : config -> string val prefix_base_password_2 : config -> string val hidden_env : config -> unit +(** [nobtit conf base p] returns list of titles of [p] from the [base] + that respects constraints imposed by [conf.allowed_titles] and + [conf.denied_titles] *) val nobtit : config -> base -> person -> title list val strictly_after_private_years : config -> dmy -> bool + +(** Alias to !GWPARAM.p_auth *) val authorized_age : config -> base -> person -> bool val is_old_person : config -> (iper, iper, istr) gen_person -> bool @@ -65,10 +73,15 @@ val accessible_by_key : config -> base -> person -> string -> string -> bool val geneweb_link : config -> string -> string -> string val wprint_geneweb_link : config -> string -> string -> unit +(** Tells if person is restrited to acccess. If mode `use_restrict` is + disabled returns always [false]. *) val is_restricted : config -> base -> iper -> bool val is_hidden : person -> bool +(** Returns person with giving id from the base. If person is restrited to +acccess returns empty person with giving id. *) val pget : config -> base -> iper -> person + val string_gen_person : base -> (iper, iper, istr) gen_person -> (iper, iper, string) gen_person val string_gen_family : @@ -112,18 +125,37 @@ val referenced_person_text_without_surname : val update_family_loop : config -> base -> person -> string -> string +(** Returns value associated to the label in environnement *) val p_getenv : (string * string) list -> string -> string option + +(** Returns integer value associated to the label in environnement *) val p_getint : (string * string) list -> string -> int option + +(** Create association list from two types of string. First has format : [[k1=v1;k2=v2]]. Second : [[k1=v1&k2=v2]]. + For both returns list [[("k1","v1"); ("k2","v2")]]. *) val create_env : string -> (string * string) list +(** [open_etc_file fname] search for template {i etc/fname.txt} inside the base directory or inside one of assets directories. + Returns input channel and the path to giving template. *) val open_etc_file : string -> (in_channel * string) option val open_hed_trl : config -> string -> in_channel option -val open_templ : config -> string -> in_channel option + +(** [open_etc_file fname] search for template {i etc/fname.txt} using [config] or inside one of assets directories. + Returns input channel and the path to giving template. *) val open_templ_fname : config -> string -> (in_channel * string) option + +(** Same as [open_templ_fname] but returns only input channel of the giving template file *) +val open_templ : config -> string -> in_channel option val string_of_place : config -> string -> string val place_of_string : config -> string -> place option val allowed_tags_file : string ref + +(** Returns additional attributes for <body> tag from [config]. *) val body_prop : config -> string + +(** Prints all messages send to wizard (or friend) on the socket. Messages are located in + {i <basename>/etc/mess_wizzard.txt} (messages destinated to all wizards) and in + {i <basename>/etc/mess_wizzard_<user>.txt} (messages destinated to considered wizard). *) val message_to_wizard : config -> unit val of_course_died : config -> person -> bool @@ -151,6 +183,7 @@ type ('a, 'b) format2 = ('a, unit, string, 'b) format4 val check_format : ('a, 'b) format2 -> string -> ('a, 'b) format2 option val valid_format : ('a, 'b) format2 -> string -> ('a, 'b) format2 +(** Find translation of given english word in [conf.lexicon] *) val transl : config -> string -> string val transl_nth : config -> string -> int -> string val transl_decline : config -> string -> string -> string @@ -217,7 +250,11 @@ val default_sosa_ref : config -> base -> person option val find_sosa_ref : config -> base -> person option val update_gwf_sosa : config -> base -> iper * (string * string * int) -> unit +(** Returns server host name with its port number (if different from 80). *) val get_server_string : config -> string + +(** Returns request string. Request string has format {i scriptname?querystring} where + scriptname is a path to the script in URI. *) val get_request_string : config -> string val create_topological_sort : config -> base -> (iper, int) Gwdb.Marker.t @@ -246,6 +283,9 @@ val old_branch_of_sosa : config -> base -> iper -> Sosa.t -> (iper * sex) list o val old_sosa_of_branch : config -> base -> (iper * sex) list -> Sosa.t val has_image : config -> base -> person -> bool + +(** [image_file_name fname] search for image {i images/fname} inside the base and assets directories. + Retrun the path to found file or [fname] if file isn't found. *) val image_file_name : string -> string val source_image_file_name : string -> string -> string @@ -290,10 +330,13 @@ val short_f_month : int -> string (* Reading password file *) +(** Authenticated user from from authorization file. *) type auth_user = { au_user : string; au_passwd : string; au_info : string } +(** Read all authenticated users with their passwords from authorization file (associated to {i "wizard_passwd_file"} in [conf.base_env]) *) val read_gen_auth_file : string -> auth_user list +(** [is_that_user_and_password auth_sheme user paswd] verify if given user with his password correspond to the authentication scheme. *) val is_that_user_and_password : auth_scheme_kind -> string -> string -> bool (* Searching *) @@ -306,7 +349,7 @@ val html_highlight : bool -> string -> string -> string val wprint_in_columns : config -> ('a -> string) -> ('a -> unit) -> 'a list -> unit -(* Variable that use also private flag of person *) +(** Tells if person's names are hiden (if person's access is [Private] or if mode [conf.hide_names] is enabled). *) val is_hide_names : config -> person -> bool val reduce_list : int -> 'a list -> 'a list @@ -374,16 +417,18 @@ module IperSet : sig include Set.S with type elt = iper end module IfamSet : sig include Set.S with type elt = ifam end (**/**) -(* [copy_from_templ_ref] is for internal usage only. Use copy_from_templ *) + +(** Reference by default [Templ.copy_from_templ] *) val copy_from_templ_ref : (config -> (string * string) list -> in_channel -> unit) ref + (* [copy_from_templ_ref] is for internal usage only. Use copy_from_templ *) (**/**) -(** [include_template failure conf env fname] - Search [fname] in templates path en interpret it with [env] provided. - - If the file can not be found, failure is called. +(** [include_template conf env fname failure] + Search [fname] in templates path and interpret it with global environnement [env] provided. + Interpretation of template write directly its results in the socket. + If the file can not be found, [failure] is called. *) val include_template : config diff --git a/lib/util/secure.mli b/lib/util/secure.mli index 38a767dace..e308501868 100644 --- a/lib/util/secure.mli +++ b/lib/util/secure.mli @@ -3,7 +3,7 @@ (** Returns list of allowed to acces assets *) val assets : unit -> string list -(** Returns base directory to which acces is allowed *) +(** Returns directory where databases are installed to which acces is allowed *) val base_dir : unit -> string (** Add new asset to the [assets] list *) From 50074412c0c67a2fc0426d25374a00c335c82760 Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed <mohamed.hernouf@ocamlpro.com> Date: Mon, 3 Jan 2022 23:05:36 +0100 Subject: [PATCH 54/73] Added documentation to Util, Templ, GWPARAM, Hutil; started AdvSearchOk --- lib/GWPARAM.mli | 8 ++++++++ lib/advSearchOk.ml | 4 ---- lib/advSearchOk.mli | 7 +++++++ lib/advSearchOkDisplay.mli | 1 - lib/core/consang.mli | 2 +- lib/def/def.ml | 2 +- lib/hutil.mli | 28 +++++++++++++++++++++------- lib/templ.mli | 4 ++++ lib/util.mli | 11 +++++++++++ 9 files changed, 53 insertions(+), 14 deletions(-) create mode 100644 lib/advSearchOk.mli diff --git a/lib/GWPARAM.mli b/lib/GWPARAM.mli index 67b11bb6eb..9fdc2f6515 100644 --- a/lib/GWPARAM.mli +++ b/lib/GWPARAM.mli @@ -1,3 +1,4 @@ +(** The level of log gravity (`LOG_WARNING the lightest). *) type syslog_level = [ `LOG_ALERT | `LOG_CRIT @@ -17,11 +18,18 @@ val base_path : (string list -> string -> string) ref (** [!bpath fname] default function that returns path to [fname] inside base directory *) val bpath : (string -> string) ref + +(** [!output_error ?headers ?content conf status] default function that send the http status [status], [headers] and + [content] if provided. Otherwise send default content from {/etc/<status-code>-<lang>.html} *) val output_error : (?headers:string list -> ?content:string -> Config.config -> Def.httpStatus -> unit) ref + val p_auth : (Config.config -> Gwdb.base -> Gwdb.person -> bool) ref + +(** [!syslog level log] log message [log] with gravity level [level] on stderr. *) val syslog : (syslog_level -> string -> unit) ref + val wrap_output : (Config.config -> string -> (unit -> unit) -> unit) ref \ No newline at end of file diff --git a/lib/advSearchOk.ml b/lib/advSearchOk.ml index 27daad7f45..866bdb3a4c 100644 --- a/lib/advSearchOk.ml +++ b/lib/advSearchOk.ml @@ -442,10 +442,6 @@ let advanced_search conf base max_answers = in List.rev list, len -(* - Returns a description string for the current advanced search results in the correct language. - e.g. "Search all Pierre, born in Paris, died in Paris" -*) let searching_fields conf base = let test_date x = reconstitute_date conf (x ^ "1") <> None diff --git a/lib/advSearchOk.mli b/lib/advSearchOk.mli new file mode 100644 index 0000000000..a6748c5f82 --- /dev/null +++ b/lib/advSearchOk.mli @@ -0,0 +1,7 @@ + +val advanced_search : + Config.config -> Gwdb.base -> int -> Gwdb.person list * int + +(** Returns a description string for the current advanced search results in the correct language. + e.g. "Search all Pierre, born in Paris, died in Paris" *) +val searching_fields : Config.config -> Gwdb.base -> string \ No newline at end of file diff --git a/lib/advSearchOkDisplay.mli b/lib/advSearchOkDisplay.mli index 6969845bc5..39c6ef750f 100644 --- a/lib/advSearchOkDisplay.mli +++ b/lib/advSearchOkDisplay.mli @@ -1,4 +1,3 @@ (** Displays the results of an advanced search *) val print : Config.config -> Gwdb.base -> unit - diff --git a/lib/core/consang.mli b/lib/core/consang.mli index bae0c4d152..b684c26540 100644 --- a/lib/core/consang.mli +++ b/lib/core/consang.mli @@ -44,7 +44,7 @@ val topological_sort (** Initialise relationship info. *) val make_relationship_info : base -> (Gwdb.iper, int) Gwdb.Marker.t -> relationship_info -(* TODOOCP: doc *) +(* Returns relationship rate between two person and common ancestors (is exists). *) val relationship_and_links : base -> relationship_info -> bool -> Gwdb.iper -> Gwdb.iper -> float * Gwdb.iper list diff --git a/lib/def/def.ml b/lib/def/def.ml index 192b9128de..d16bcd7198 100644 --- a/lib/def/def.ml +++ b/lib/def/def.ml @@ -332,7 +332,7 @@ type ('iper, 'person, 'family, 'descend, 'title, 'pevent, 'fevent) warning = | YoungForMarriage of 'person * dmy * 'family (** Person is married before he was 12 years old *) | OldForMarriage of 'person * dmy * 'family (** Person is married after he was 100 years old *) -(* TODOOCP: doc *) +(** Missing sources warning *) type ('person, 'descend, 'title) misc = MissingSources (** Database note/page reading mode *) diff --git a/lib/hutil.mli b/lib/hutil.mli index 6861837b16..6a20856785 100644 --- a/lib/hutil.mli +++ b/lib/hutil.mli @@ -17,34 +17,48 @@ open Config - If user is a wizard or a friend, then includes all messages send to him. *) val header_without_http : config -> (bool -> unit) -> unit +(** [gen_trailer with_logo] prints HTML page trailer in the body of the current response on the socket. + HTML page header consists of : + + - Copyright message from template {i etc/copyr.txt} with inserted logo if [with_logo] is true + - Scripts JS from template {i etc/js.txt} + - Closing <body> and <html> tags *) +val gen_trailer : bool -> config -> unit + (** Calls for [Util.html] to print HTTP header and for [header_without_http] to print HTML page header. Additionaly prints opening container <div> tag on the socket. *) val header_without_page_title : config -> (bool -> unit) -> unit -val header_no_page_title : config -> (bool -> unit) -> unit - (** [header conf title] calls for [header_without_page_title] to print HTTP header and HTML page header. Additionaly prints page title with [title true] (false to print browser tab title). *) val header : config -> (bool -> unit) -> unit + +(** Same as [header] but takes page title from [conf.env]. *) +val header_no_page_title : config -> (bool -> unit) -> unit + +(** Pritns HTML page header (without HTTP headers) and opens fluid container <div> (see Bootstrap). *) val header_fluid : config -> (bool -> unit) -> unit + +(** Same as [header] but insert links to previous and home pages (with [print_link_to_welcome]) before page title. *) val header_link_welcome : config -> (bool -> unit) -> unit + +(** Same as [gen_trailer true]. *) val trailer : config -> unit -(** Same as [header] except page's title informs about an occured error. *) +(** Same as [header] except page's title informs about an occured error (red title). *) val rheader : config -> (bool -> unit) -> unit (** Returns the HTML link to the previous (referer) page *) val link_to_referer : config -> string -(** [gen_print_link_to_welcome f conf right_alined] prints links to previous and to home page. [f] is used to print additional - content. *) +(** [gen_print_link_to_welcome f conf right_alined] prints links to previous and to home pages. [f] is used to print additional + content before links. *) val gen_print_link_to_welcome : (unit -> unit) -> config -> bool -> unit (** Calls [gen_print_link_to_welcome] with empty function [f]. *) val print_link_to_welcome : config -> bool -> unit -val gen_trailer : bool -> config -> unit - +(** Sends {Bad Request} HTTP response (same as [GWPARAM.output_error conf Bad_Request]) *) val incorrect_request : config -> unit val interp : diff --git a/lib/templ.mli b/lib/templ.mli index fd2d66f14a..6705e11305 100644 --- a/lib/templ.mli +++ b/lib/templ.mli @@ -25,7 +25,11 @@ val interp_ast : (**) val input_templ : config -> string -> ast list option + +(** Evaluates and prints content of {i cpr} template. If template wasn't found prints basic copyrigth HTML structure. *) val print_copyright : config -> unit + +(** Calls [print_copyright] with config where variable {i with_logo} is set to "yes" *) val print_copyright_with_logo : config -> unit val include_hed_trl : config -> string -> unit val copy_from_templ : config -> string env -> in_channel -> unit diff --git a/lib/util.mli b/lib/util.mli index fa8acaeb7b..76d763500c 100644 --- a/lib/util.mli +++ b/lib/util.mli @@ -41,6 +41,7 @@ val clean_html_tags : string -> string list -> string (** Prints HTTP response headers with giving content type (default : {i text/html}) on the socket. *) val html : ?content_type:string -> config -> unit +(** Prints HTTP response with code 401 (Unauthorized) and error page with giving message *) val unauthorized : config -> string -> unit val string_of_ctime : config -> string @@ -185,12 +186,21 @@ val valid_format : ('a, 'b) format2 -> string -> ('a, 'b) format2 (** Find translation of given english word in [conf.lexicon] *) val transl : config -> string -> string + +(** [transl_nth conf w n] returns translation for [n]'th word (with [nth_field]). *) val transl_nth : config -> string -> int -> string val transl_decline : config -> string -> string -> string val ftransl : config -> ('a, 'b) format2 -> ('a, 'b) format2 val ftransl_nth : config -> ('a, 'b) format2 -> int -> ('a, 'b) format2 val fdecline : ('a, 'b) format2 -> string -> ('a, 'b) format2 val fcapitale : ('a, 'b) format2 -> ('a, 'b) format2 + +(** [nth_field str n] gets [n]'th field of string that separate its fields with "/". + Example : + - nth_field "a/b/</c>/d" 0 = a + - nth_field "a/b/</c>/d" 1 = b + - nth_field "a/b/</c>/d" 2 = </c> + - nth_field "a/b/</c>/d" 3 = d *) val nth_field : string -> int -> string val cftransl : config -> string -> string list -> string val translate_eval : string -> string @@ -352,6 +362,7 @@ val wprint_in_columns : (** Tells if person's names are hiden (if person's access is [Private] or if mode [conf.hide_names] is enabled). *) val is_hide_names : config -> person -> bool +(** [reduce_list n l] takes [n] first elements from the list [l] *) val reduce_list : int -> 'a list -> 'a list val print_reference : config -> string -> int -> string -> unit From c680da0a4d07ac105ad1748f2234a43fd9c97d60 Mon Sep 17 00:00:00 2001 From: Steven de Oliveira <de.oliveira.steven@gmail.com> Date: Fri, 7 Jan 2022 10:50:00 +0100 Subject: [PATCH 55/73] Check of secure.ml should stop only when all prefixes have failed --- lib/util/secure.ml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/util/secure.ml b/lib/util/secure.ml index 5e8021bce1..bdabcb0866 100644 --- a/lib/util/secure.ml +++ b/lib/util/secure.ml @@ -63,8 +63,8 @@ let check fname = let rec loop = function | d :: dl -> begin match list_check_prefix d df with - | Some bf -> not (List.mem Filename.parent_dir_name bf) - | None -> loop dl + | Some bf when not (List.mem Filename.parent_dir_name bf) -> true + | _ -> loop dl end | [] -> if Filename.is_relative fname From 639f2899044f1e1672320a8eb5f48f119f5f5c08 Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed <mohamed.hernouf@ocamlpro.com> Date: Fri, 7 Jan 2022 17:12:04 +0100 Subject: [PATCH 56/73] AdvSearchOk documentation --- lib/advSearchOk.mli | 3 +++ lib/gwdb_driver.mli/gwdb_driver.mli | 2 +- lib/util/secure.ml | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/advSearchOk.mli b/lib/advSearchOk.mli index a6748c5f82..48f5900d7a 100644 --- a/lib/advSearchOk.mli +++ b/lib/advSearchOk.mli @@ -1,4 +1,7 @@ +(** [advanced_search conf base max_answers] extracts advaced request fields from environement [conf.env] and + returns at most [max_answers] persons from the [base] that match conditions described by those fields. Seond result + represents real number of matches (if less then [max_answers]). *) val advanced_search : Config.config -> Gwdb.base -> int -> Gwdb.person list * int diff --git a/lib/gwdb_driver.mli/gwdb_driver.mli b/lib/gwdb_driver.mli/gwdb_driver.mli index 2028f25826..e17db7be51 100644 --- a/lib/gwdb_driver.mli/gwdb_driver.mli +++ b/lib/gwdb_driver.mli/gwdb_driver.mli @@ -324,7 +324,7 @@ val nb_of_families : base -> int val bname : base -> string (** Modify/add person with the giving id in the base. New names are added - to the name index for the cosidered person and for evey member of family to + to the patched name index for the cosidered person and for evey member of family to which he belongs. Modification stay blocked until call of [commit_patches]. *) val patch_person : base -> iper -> (iper, iper, istr) Def.gen_person -> unit diff --git a/lib/util/secure.ml b/lib/util/secure.ml index 5e8021bce1..2b1b5bdee8 100644 --- a/lib/util/secure.ml +++ b/lib/util/secure.ml @@ -63,7 +63,7 @@ let check fname = let rec loop = function | d :: dl -> begin match list_check_prefix d df with - | Some bf -> not (List.mem Filename.parent_dir_name bf) + | Some bf -> if not (List.mem Filename.parent_dir_name bf) then true else loop dl | None -> loop dl end | [] -> From 6263c2a8a7e8ac31e9118d485791c1147a1f6025 Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed <mohamed.hernouf@ocamlpro.com> Date: Fri, 7 Jan 2022 22:24:00 +0100 Subject: [PATCH 57/73] Alln and AllnDisplay documentation --- lib/alln.ml | 6 ------ lib/alln.mli | 36 ++++++++++++++++++++++++++++++++++++ lib/allnDisplay.mli | 13 +++++++++++++ lib/hutil.mli | 2 +- lib/util.mli | 10 ++++++++++ 5 files changed, 60 insertions(+), 7 deletions(-) create mode 100644 lib/alln.mli create mode 100644 lib/allnDisplay.mli diff --git a/lib/alln.ml b/lib/alln.ml index f39eda7e3c..663f4f74d0 100644 --- a/lib/alln.ml +++ b/lib/alln.ml @@ -33,12 +33,6 @@ let first_letters base is_surnames = in loop (spi_first iii "") [] with Not_found -> [] -(** [select_names conf base is_surnames ini limit] - Select up to [limit] first names/surnames starting with [ini]. - If more values are available, return [Specify] with different - possible prefixes. - Otherwise, return the list of values as (key * text * person count). - *) let select_names conf base is_surnames ini limit = let inilen = Utf8.length ini + 1 in let cut k = Utf8.sub k 0 (min (Utf8.length k) inilen) in diff --git a/lib/alln.mli b/lib/alln.mli new file mode 100644 index 0000000000..4d01d25751 --- /dev/null +++ b/lib/alln.mli @@ -0,0 +1,36 @@ +(** Default number of names that could be printed simultaneously on the page *) +val default_max_cnt : int + +(** Type that represents result of name selection *) +type t = + | Result of (string * string * int) list (** Exhaustive result with the list of names + (key and printable name) with number of + persons that have giving name*) + | Specify of string list (** Not exhaustive result that specifies all existing names + prefixes (their length depends on initial searched prefix) *) + +(** Returns list of all first name's first letter present in the base (UTF8 encoded). + Used for fast access for base's names *) +val first_letters : Gwdb.base -> bool -> string list + +(** [select_names conf base is_surnames ini limit] + Select up to [limit] first names/surnames starting with [ini]. + If more values are available, return [Specify] with different + possible prefixes with the length at most equal to the length of [ini]+1 + (for empty [ini] specifies all first letters of existing names). + Otherwise, return the list of values [Result] with all first names + and number of persons that have giving name. *) +val select_names : + Geneweb.Config.config -> Gwdb.base -> bool -> string -> int -> t * int + +(** Returns prefix of length [len] of UTF8 encoded name *) +val ini : int -> string -> string + +(** [groupby_ini len results] returns alphabeticaly ordered list of grouped by name prefix (with length [len]) + results. *) +val groupby_ini : + int -> (string * 'a * 'b) list -> (string * ('a * 'b) list) list + +(** Returns ordered (from bigest to smallest) list of grouped by name frequency (number of persons + having the name) results. Shouldn't be used when results are represented with [Specify]. *) +val groupby_count : t -> (int * string list) list \ No newline at end of file diff --git a/lib/allnDisplay.mli b/lib/allnDisplay.mli new file mode 100644 index 0000000000..5e6553037d --- /dev/null +++ b/lib/allnDisplay.mli @@ -0,0 +1,13 @@ +(** Displays all persons surnames present in the base. Display could be different depending + on environement [conf.env]. These variables affect the display: + + - tri : "F" to display surnames by frequency, "S" to display + surnames regrouped by first letter (depends on variable "k") + otherwsise display surnames just ordered alphabeticaly + - k : Defines common prefix for surnames (empty for all) + - o : "A" to print all surnames (if less then [Alln.default_max_cnt]) + otherwise prints links to access different type of displaying *) +val print_surnames : Config.config -> Gwdb.base -> unit + +(** Same as [print_surnames] but dealing with first names. *) +val print_first_names : Config.config -> Gwdb.base -> unit \ No newline at end of file diff --git a/lib/hutil.mli b/lib/hutil.mli index 6a20856785..0c3fc79c98 100644 --- a/lib/hutil.mli +++ b/lib/hutil.mli @@ -58,7 +58,7 @@ val gen_print_link_to_welcome : (unit -> unit) -> config -> bool -> unit (** Calls [gen_print_link_to_welcome] with empty function [f]. *) val print_link_to_welcome : config -> bool -> unit -(** Sends {Bad Request} HTTP response (same as [GWPARAM.output_error conf Bad_Request]) *) +(** Sends [Bad Request] HTTP response (same as [GWPARAM.output_error conf Bad_Request]) *) val incorrect_request : config -> unit val interp : diff --git a/lib/util.mli b/lib/util.mli index 76d763500c..8b00345571 100644 --- a/lib/util.mli +++ b/lib/util.mli @@ -45,7 +45,13 @@ val html : ?content_type:string -> config -> unit val unauthorized : config -> string -> unit val string_of_ctime : config -> string +(** Returns link to the current command (database name after domain name and port in url) with query string + that containts bindings from [conf.henv] and [conf.senv]. Doesn't add binding [(k,v)] when: + - k = "oc" or "ocz" and v = "0" + - v = "" *) val commd : config -> string + +(** Same as [commd] but returns without separator '&' at the end. *) val commd_2 : config -> string val prefix_base : config -> string val prefix_base_password : config -> string @@ -71,7 +77,11 @@ val acces : config -> base -> person -> string val wprint_hidden_person : config -> base -> string -> person -> unit val accessible_by_key : config -> base -> person -> string -> string -> bool +(** [geneweb_link conf href s] Returns HTML link to actual geneweb's command (database name) with additional (to those defind by [commd]) + argument [href] and [s] as textual content of the link. *) val geneweb_link : config -> string -> string -> string + +(** Prints on the socket link created by [geneweb_link]. *) val wprint_geneweb_link : config -> string -> string -> unit (** Tells if person is restrited to acccess. If mode `use_restrict` is From e395d74853ecfd44ada38e990fc5d1283bd530d9 Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed <mohamed.hernouf@ocamlpro.com> Date: Fri, 7 Jan 2022 22:32:38 +0100 Subject: [PATCH 58/73] Remove reference to Geneweb in mli --- lib/alln.mli | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/alln.mli b/lib/alln.mli index 4d01d25751..2abb2b49e7 100644 --- a/lib/alln.mli +++ b/lib/alln.mli @@ -21,7 +21,7 @@ val first_letters : Gwdb.base -> bool -> string list Otherwise, return the list of values [Result] with all first names and number of persons that have giving name. *) val select_names : - Geneweb.Config.config -> Gwdb.base -> bool -> string -> int -> t * int + Config.config -> Gwdb.base -> bool -> string -> int -> t * int (** Returns prefix of length [len] of UTF8 encoded name *) val ini : int -> string -> string From 3fb1619dd262f8f754f17d12d9dcc0543d236e89 Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed <mohamed.hernouf@ocamlpro.com> Date: Sun, 9 Jan 2022 18:06:31 +0100 Subject: [PATCH 59/73] Completing documentation for BirtdayDisplay, BirthDeathDisplay. Documenation of BirthDeath. Added documentation for GWPARAM and Util --- lib/GWPARAM.mli | 18 +++++++ lib/birthDeath.mli | 43 +++++++++++++++ lib/birthDeathDisplay.mli | 2 +- lib/birthdayDisplay.mli | 32 ++++++++--- lib/gwdb_driver.mli/gwdb_driver.mli | 2 +- lib/util.mli | 83 +++++++++++++++++++++++++++-- 6 files changed, 167 insertions(+), 13 deletions(-) create mode 100644 lib/birthDeath.mli diff --git a/lib/GWPARAM.mli b/lib/GWPARAM.mli index 9fdc2f6515..b475e68b4d 100644 --- a/lib/GWPARAM.mli +++ b/lib/GWPARAM.mli @@ -26,6 +26,24 @@ val output_error : ?content:string -> Config.config -> Def.httpStatus -> unit) ref +(** Calculate the access rights to the person's information in + according to his age. + Returns (in the order of the tests) : + - True if : requester is wizard or friend or person is public + - True if : person has at least one title and {i public_if_title} + is set to {i yes} in gwf config file + - False if : person is alive and {i private_years} > 0 + - True if : person is older (depending on the date of + birth or baptism date) then {i privates_years} + - False if : person is younger (depending on the date of + birth or baptism date) then {i privates_years} + - True if : person has been deceased for more than {i privates_years} + - False if : person has been deceased for less than {i privates_years} + - True if : person is between 80 and 120 years old and he is not beeing + private and {i public_if_no_date} is set to {i yes} in + gwf config file + - True if : person has been married for more than {i private_years} + - False otherwise *) val p_auth : (Config.config -> Gwdb.base -> Gwdb.person -> bool) ref (** [!syslog level log] log message [log] with gravity level [level] on stderr. *) diff --git a/lib/birthDeath.mli b/lib/birthDeath.mli new file mode 100644 index 0000000000..0d60c61f63 --- /dev/null +++ b/lib/birthDeath.mli @@ -0,0 +1,43 @@ + + +(** [select_person conf base get_date find_oldest] select 20 persons + from the base according to the one of their date (birth, death, + marriage, specific event, etc.) that could be get with [get_date]. + Returns sorted by date persons that have the latest (if [find_oldest] + is false) or oldest (otherwise) date. Selection could be different depending + on environement [conf.env]. These variables affect the selection: + k - allows to modify default value (20) of selected persons + by,bm,bd - allows to set reference date (all dates after the reference + one aren't selected) + Returns also the number of selected persons *) +val select_person : + Config.config -> + Gwdb.base -> + (Gwdb.person -> Def.date option) -> + bool -> (Gwdb.person * Def.dmy * Def.calendar) list * int + + +(** Same as [select_person] but dealing with families *) +val select_family : + Config.config -> + Gwdb.base -> + (Gwdb.family -> Def.date option) -> + bool -> (Gwdb.family * Def.dmy * Def.calendar) list * int + +(** Returns person's death date (if exists) *) +val death_date : Gwdb.person -> Adef.date option + +(** [make_population_pyramid nb_intervals interval interval at_date conf base] + Calculates population pyramid of all perons in the base. Population pyramid + consists of two separated arrays that regroups number of men's and women's born + in each time interval. One array has a size [nb_intervals + 1] and every element + is a number of persons born in the giving time interval that represents [interval] years. + Calculation starts at the date [at_date] and persons that are considered + in pyramid should be alive at this date. [limit] allows to limit persons + by age (those that has age greater then limit aren't taken into the account) *) +val make_population_pyramid : + nb_intervals:int -> + interval:int -> + limit:int -> + at_date:Def.dmy -> + Config.config -> Gwdb.base -> int array * int array \ No newline at end of file diff --git a/lib/birthDeathDisplay.mli b/lib/birthDeathDisplay.mli index 3a50d8e5ef..3b2ea9ac82 100644 --- a/lib/birthDeathDisplay.mli +++ b/lib/birthDeathDisplay.mli @@ -2,7 +2,7 @@ (** Lists the last births *) val print_birth : Config.config -> Gwdb.base -> unit -(** Lists tje last deaths *) +(** Lists the last deaths *) val print_death : Config.config -> Gwdb.base -> unit (** Lists the persons who lived the longest *) diff --git a/lib/birthdayDisplay.mli b/lib/birthdayDisplay.mli index 6a519eb9c2..58d67c9257 100644 --- a/lib/birthdayDisplay.mli +++ b/lib/birthdayDisplay.mli @@ -1,4 +1,8 @@ +(** [gen_print conf base month (next,txt_of) dead_people] displays anniversaries for a given month separated by day. + If [dead_people] is true then displays birth/death anniversaries for dead people with death reason. + Otherwise displays birthdays for alive people. [next] is function that returns next person from iterator and [txt_of] + text/link that describes person's information *) val gen_print : Config.config -> Gwdb.base -> @@ -8,15 +12,23 @@ val gen_print : (Config.config -> Gwdb.base -> Gwdb.person -> string)) -> bool -> unit -(** Displays birthdays for a given month *) +(** Displays birthdays for alive people for a given month *) val print_birth : Config.config -> Gwdb.base -> int -> unit -(** Displays death anniversaries for a given month *) +(** Displays anniversaries for dead people for a given month *) val print_dead : Config.config -> Gwdb.base -> int -> unit (** Displays marriage anniversaries for a given month *) val print_marriage : Config.config -> Gwdb.base -> int -> unit +(** [gen_print_menu_birth conf base (next,txt_of) mode] displays the main birthdays menu for alive people + that contains: + - Persons that has their birthdays today + - Persons that has their birthdays tomorrow + - Persons that has their birthdays after today + - Form to select the month of birthdays we want to see. + [next] is function that returns next person from iterator, [txt_of] text/link that + describes person's information and [mode] that add some additional hidden inputs in the month form *) val gen_print_menu_birth : Config.config -> Gwdb.base -> @@ -25,9 +37,17 @@ val gen_print_menu_birth : (Config.config -> Gwdb.base -> Gwdb.person -> string)) -> (unit -> 'a) -> unit -(** Displays the main anniversaries menu *) +(** Displays the main birthdays menu considering all alive people *) val print_menu_birth : Config.config -> Gwdb.base -> unit +(** [gen_print_menu_dead conf base (next,txt_of) mode] displays the main anniversaries menu for dead people + that contains: + - Persons that has their anniversaries today + - Persons that has their anniversaries tomorrow + - Persons that has their anniversaries after today + - Form to select the month of anniversaries we want to see. + [next] is function that returns next person from iterator, [txt_of] text/link that + describes person's information and [mode] that add some additional hidden inputs in the month form *) val gen_print_menu_dead : Config.config -> Gwdb.base -> @@ -36,11 +56,11 @@ val gen_print_menu_dead : (Config.config -> Gwdb.base -> Gwdb.person -> string)) -> (unit -> 'a) -> unit -(** Displays the main death anniversaries menu *) +(** Displays the main anniversaries menu considering all dead people *) val print_menu_dead : Config.config -> Gwdb.base -> unit -(** Displays the main marriage anniversaries menu *) +(** Displays the main wedding anniversaries menu *) val print_menu_marriage : Config.config -> Gwdb.base -> unit -(** Displays the menu of anniversaries modification *) +(** Displays the menu of anniversaries selection *) val print_anniversaries : Config.config -> unit diff --git a/lib/gwdb_driver.mli/gwdb_driver.mli b/lib/gwdb_driver.mli/gwdb_driver.mli index e17db7be51..e7e2007cb0 100644 --- a/lib/gwdb_driver.mli/gwdb_driver.mli +++ b/lib/gwdb_driver.mli/gwdb_driver.mli @@ -97,7 +97,7 @@ val ifam_exists : base -> ifam -> bool If corresponding information part isn't present, driver load it from the disk and cache it so further gets will return result immediately. *) -(** Get rights to access person's data *) +(** Get rights that defines access to person's data *) val get_access : person -> Def.access (** Get person's aliases ids *) diff --git a/lib/util.mli b/lib/util.mli index 8b00345571..361429b6d5 100644 --- a/lib/util.mli +++ b/lib/util.mli @@ -57,6 +57,9 @@ val prefix_base : config -> string val prefix_base_password : config -> string val prefix_base_2 : config -> string val prefix_base_password_2 : config -> string + +(** Creates a hidden HTML input for every key and value in [conf.henv] and [conf.senv]. + Used to include immutable environement bindings in the HTML form. *) val hidden_env : config -> unit (** [nobtit conf base p] returns list of titles of [p] from the [base] @@ -75,6 +78,8 @@ val start_with_vowel : string -> bool val acces_n : config -> base -> string -> person -> string val acces : config -> base -> person -> string val wprint_hidden_person : config -> base -> string -> person -> unit + +(** Tells if person could be accessed by his first name and surname *) val accessible_by_key : config -> base -> person -> string -> string -> bool (** [geneweb_link conf href s] Returns HTML link to actual geneweb's command (database name) with additional (to those defind by [commd]) @@ -87,6 +92,8 @@ val wprint_geneweb_link : config -> string -> string -> unit (** Tells if person is restrited to acccess. If mode `use_restrict` is disabled returns always [false]. *) val is_restricted : config -> base -> iper -> bool + +(** Tells if person is hiden (if his surname is empty) *) val is_hidden : person -> bool (** Returns person with giving id from the base. If person is restrited to @@ -98,39 +105,100 @@ val string_gen_person : val string_gen_family : base -> (iper, ifam, istr) gen_family -> (iper, ifam, string) gen_family +(** Type that defines couple of functions allowing to access to person's first name + and surname. *) type p_access = (base -> person -> string) * (base -> person -> string) + +(** Standard access (p_first_name, p_surname). *) val std_access : p_access + +(** Raw access (sou + get_name). *) val raw_access : p_access -(* Fonctions d'écriture du nom et prénom d'un individu en fonction de : *) -(* - son/ses titre de noblesse *) -(* - son/ses nom public *) -(* - son/ses sobriquets ... *) +(** Returns person's first name and surname HTML description depending on : + - his public name + - his qualifiers + If person is hiden returns ".....". If person's names are hiden + or access to them is denied returns "x x" *) val gen_person_text : p_access -> config -> base -> person -> string + +(** Same as [gen_person_text] but doesn't encapsulates description in HTML + tag <em>. *) val gen_person_text_no_html : p_access -> config -> base -> person -> string + +(** Returns either person's first name and surname either title and qualifiers + HTML description *) val gen_person_text_without_title : p_access -> config -> base -> person -> string + +(** [gen_person_title_text reference paccess conf base p] returns HTML structure + of person that describes person's first name surname and main title. [reference] + is used to either encapsulate structure in the link (or other type + of maniplations). *) val gen_person_title_text : (config -> base -> person -> string -> string) -> p_access -> config -> base -> person -> string + +(** Makes call to [gen_person_text] with [std_access] *) val person_text : config -> base -> person -> string + +(** Makes call to [gen_person_text_no_html] with [std_access] *) val person_text_no_html : config -> base -> person -> string + +(** Same as [gen_person_text] but doesn't display surname *) val person_text_without_surname : config -> base -> person -> string + +(** Same as [gen_person_text] but : + - doesn't display surname + - returns HTML description even if person's names are hiden + or access to them is denied (don't print "x x") *) val person_text_no_surn_no_acc_chk : config -> base -> person -> string + +(** Makes call to [gen_person_text_without_title] with [std_access] *) val person_text_without_title : config -> base -> person -> string + +(** Returns main person's title. If person doesn't have it, then returns first title + from the list. *) val main_title : config -> base -> person -> title option + +(** Returns person's first name and surname text description depending on + person's title *) val titled_person_text : config -> base -> person -> title -> string + +(** Returns HTML representation of title's identifier with its place (if exists) *) val one_title_text : base -> title -> string + +(** Returns HTML structure of person that describes person's first name surname + and main title. Calls [gen_person_title_text] with [no_reference]. *) val person_title_text : config -> base -> person -> string + +(** Returns HTML representation of person's main title (or first title if + main doesn't exists). If person doesn't have a title or if access to + person isn't granted returns empty string *) val person_title : config -> base -> person -> string val child_of_parent : config -> base -> person -> string +(** [reference conf base p desc] returns HTML link to the person + where [desc] is content of the link (generaly his first name and + surname description). If person is hidden returns [desc] (do not + create link). *) val reference : config -> base -> person -> string -> string + +(** Same as [reference] but link doesn't has "id" field *) val reference_noid : config -> base -> person -> string -> string + +(** [reference conf base p desc] returns [desc] without creating a link *) val no_reference : config -> base -> person -> string -> string + +(** Retruns HTML link to the person that contains its first name, surname and person's + nobility title. Calls [gen_person_title_text] with [reference]. *) val referenced_person_title_text : config -> base -> person -> string + +(** Returns HTML link to the person that contains its first name and surname. *) val referenced_person_text : config -> base -> person -> string + +(** Returns HTML link to the person that contains its first name. *) val referenced_person_text_without_surname : config -> base -> person -> string @@ -223,8 +291,10 @@ val translate_eval : string -> string val transl_a_of_b : config -> string -> string -> string -> string val transl_a_of_gr_eq_gen_lev : config -> string -> string -> string -> string +(** Colorise HTML element with [conf.highlight] color. *) val std_color : config -> string -> string +(** Sex index (0 for male, 1 for female, 2 for neuter) *) val index_of_sex : sex -> int val string_of_pevent_name : @@ -255,7 +325,7 @@ val husband_wife : config -> base -> person -> bool -> string (** [find_person_in_env conf base suff] Reconstitutes the key of a person from [conf.env], - using ["i" ^ suff] or ["n" ^ suffix] + ["p" ^ suff] + ["oc" ^ suff] + using ["i" ^ suff] or ["n" ^ suff] + ["p" ^ suff] + ["oc" ^ suff] *) val find_person_in_env : config -> base -> string -> person option @@ -333,7 +403,10 @@ val browser_doesnt_have_tables : config -> bool val doctype : config -> string +(** Prints on the socket beginning of the <table> tag untill first opened <td> where the text is centred *) val begin_centered : config -> unit + +(** Prints on the socket end of the column and table opened by [begin_centered] *) val end_centered : config -> unit val print_alphab_list From c8672e6cfab6399a45363adfb9b3d344791e8de8 Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed <mohamed.hernouf@ocamlpro.com> Date: Sun, 9 Jan 2022 21:00:10 +0100 Subject: [PATCH 60/73] ChangeChildren and ChangeChildrenDisplay documentation --- lib/changeChildren.mli | 26 ++++++++++++++++++++++++++ lib/changeChildrenDisplay.mli | 9 +++++++++ lib/util.mli | 10 ++++++++++ lib/util/mutil.mli | 4 +--- 4 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 lib/changeChildren.mli create mode 100644 lib/changeChildrenDisplay.mli diff --git a/lib/changeChildren.mli b/lib/changeChildren.mli new file mode 100644 index 0000000000..74431c6c9e --- /dev/null +++ b/lib/changeChildren.mli @@ -0,0 +1,26 @@ + +(** Returns digest (using md5 algorithm) of concatenated for every childran first name, surname and occurence number *) +val digest_children : Gwdb.base -> Gwdb.iper list -> string + +(** Checks if children digest in environement [conf.env] corresponds to specified digest. Other print error page. *) +val check_digest : Config.config -> string -> unit + +(** Exception raised when childran change defines a new childran information (new first name, new surname and new occurence number) are in + conflict with another person already existing in the base *) +exception ChangeChildrenConflict of Gwdb.person * Gwdb.person + +(** Exception raised when childran change removes it first name *) +exception FirstNameMissing of Gwdb.iper + +(** Change all person's children by looking up information to update inside [conf.env] that was send by the form. + Changes also childran's personal image name. Could raise [ChangeChildrenConflict] if new childran's key + is in conflict with another and [FirstNameMissing] if new childran's first name is empty. If surname modification is + requested but absent then childran takes parent's surname. Returns informations used by [Update] module to record + children's update operation. *) +val change_children : + Config.config -> + Gwdb.base -> + string -> + Gwdb.iper list -> + ((string * string * int * Gwdb.iper) * (string * string * int * Gwdb.iper)) + list \ No newline at end of file diff --git a/lib/changeChildrenDisplay.mli b/lib/changeChildrenDisplay.mli new file mode 100644 index 0000000000..81e466171f --- /dev/null +++ b/lib/changeChildrenDisplay.mli @@ -0,0 +1,9 @@ + +(** Displays a form where all person's children with their first names, surnames and occurence numbers are listed + and could be modified on submit. Id of person should be mentionned in environement [conf.env] with binding {i "ip"=id} + otherwise displays Bad request page. *) +val print : Config.config -> Gwdb.base -> unit + +(** Performs and displays results of children modification requested by form submiting. If changes of one of children raises an error + displays corresponding error page that either just informs user about error source either propose to fix up solution. *) +val print_ok : Config.config -> Gwdb.base -> unit \ No newline at end of file diff --git a/lib/util.mli b/lib/util.mli index 361429b6d5..e3f449a552 100644 --- a/lib/util.mli +++ b/lib/util.mli @@ -387,11 +387,21 @@ val image_and_size : (string -> (int * int) option -> (int * int) option) -> (bool * string * (int * int) option) option +(** Returns default image name calculated from person's first name, surname + and occurence number. For example : Jean Claude DUPOND 3 => jean_claude.3.dupond *) val default_image_name_of_key : string -> string -> int -> string + +(** Returns default image name calculated from person's key. *) val default_image_name : base -> person -> string + +(** Searchs personal image (portrait) inside the base directory by looking up its default name + and tryig to deduce its extension. Returns path to the image if found. *) val auto_image_file : config -> base -> person -> string option +(** Trims and remplaces all non-printable characters by spaces in the given string. *) val only_printable : string -> string + +(** Same as [only_printable] but also accepts '\n'. *) val only_printable_or_nl : string -> string val relation_type_text : config -> relation_type -> int -> string diff --git a/lib/util/mutil.mli b/lib/util/mutil.mli index 45d10c150b..2ba13d16a6 100644 --- a/lib/util/mutil.mli +++ b/lib/util/mutil.mli @@ -80,9 +80,7 @@ module StrSet : Set.S with type elt = string (** [tr c1 c2 str] Return a new string which is the same as [str] with all occurences of [c1] - replaced by [c2]. - If [str] does not contain [c1]. [str] is returned intouched. - + replaced by [c2]. If [str] does not contain [c1] [str] is returned untouched. *) val tr : char -> char -> string -> string From 8289a4021a5b320d36aa4dded126f80f0cff18cc Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed <mohamed.hernouf@ocamlpro.com> Date: Sun, 9 Jan 2022 21:06:15 +0100 Subject: [PATCH 61/73] Transfer Config documentation to mli file --- lib/config.ml | 14 +----- lib/config.mli | 115 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 117 insertions(+), 12 deletions(-) create mode 100644 lib/config.mli diff --git a/lib/config.ml b/lib/config.ml index e22d32f433..54d4d17bd1 100644 --- a/lib/config.ml +++ b/lib/config.ml @@ -3,25 +3,17 @@ open Def open Gwdb -(** Authentication scheme data type *) type auth_scheme_kind = NoAuth | TokenAuth of token_auth_scheme | HttpAuth of http_auth_scheme -(** Authentication via security token *) and token_auth_scheme = { ts_user : string; ts_pass : string } - -(** Authentication via HTTP *) and http_auth_scheme = Basic of basic_auth_scheme | Digest of digest_auth_scheme - -(** Basic authentication scheme inside {i Autorization} HTTP header *) and basic_auth_scheme = { bs_realm : string; bs_user : string; bs_pass : string } - -(** Digest authentication scheme inside {i Autorization} HTTP header *) and digest_auth_scheme = { ds_username : string; ds_realm : string; @@ -33,7 +25,6 @@ and digest_auth_scheme = ds_cnonce : string; ds_response : string } -(** HTTP printer, that prints and sends requests on the user's socket *) type output_conf = { status : Def.httpStatus -> unit ; header : string -> unit @@ -41,7 +32,6 @@ type output_conf = ; flush : unit -> unit } -(** Geneweb configuration data type *) type config = { from : string; api_mode : bool; @@ -109,8 +99,8 @@ type config = } (**/**) -(** A dummy {!type:config} value, with uninitialized fields. - Used for testing purpose *) +(** A dummy {!type:config} value, with uninitialized fields. + Used for testing purpose *) let empty = { from = "" ; manitou = false diff --git a/lib/config.mli b/lib/config.mli new file mode 100644 index 0000000000..230a9b1412 --- /dev/null +++ b/lib/config.mli @@ -0,0 +1,115 @@ +open Def +open Gwdb + +(** Authentication scheme data type *) +type auth_scheme_kind = + NoAuth + | TokenAuth of token_auth_scheme + | HttpAuth of http_auth_scheme + +(** Authentication via security token *) +and token_auth_scheme = { ts_user : string; ts_pass : string; } + +(** Authentication via HTTP *) +and http_auth_scheme = + Basic of basic_auth_scheme + | Digest of digest_auth_scheme + +(** Basic authentication scheme inside {i Autorization} HTTP header *) +and basic_auth_scheme = { + bs_realm : string; + bs_user : string; + bs_pass : string; +} + +(** Digest authentication scheme inside {i Autorization} HTTP header *) +and digest_auth_scheme = { + ds_username : string; + ds_realm : string; + ds_nonce : string; + ds_meth : string; + ds_uri : string; + ds_qop : string; + ds_nc : string; + ds_cnonce : string; + ds_response : string; +} + +(** HTTP printer, that prints and sends requests on the user's socket *) +type output_conf = { + status : Def.httpStatus -> unit; + header : string -> unit; + body : string -> unit; + flush : unit -> unit; +} + +(** Geneweb configuration data type *) +type config = + { from : string; + api_mode : bool; + manitou : bool; + supervisor : bool; + wizard : bool; + is_printed_by_template : bool; + debug : bool; + friend : bool; + just_friend_wizard : bool; + user : string; + username : string; + auth_scheme : auth_scheme_kind; + command : string; + indep_command : string; + highlight : string; + lang : string; + default_lang : string; + default_sosa_ref : iper * Gwdb.person option; + multi_parents : bool; + authorized_wizards_notes : bool; + public_if_titles : bool; + public_if_no_date : bool; + mutable setup_link : bool; + access_by_key : bool; + private_years : int; + hide_names : bool; + use_restrict : bool; + no_image : bool; + no_note : bool; + bname : string; + cgi_passwd : string; + env : (string * string) list; + mutable senv : (string * string) list; + mutable henv : (string * string) list; + (* content of .gwf file *) + base_env : (string * string) list; + allowed_titles : string list Lazy.t; + denied_titles : string list Lazy.t; + request : string list; + lexicon : (string, string) Hashtbl.t; + mutable charset : string; + is_rtl : bool; + left : string; + right : string; + auth_file : string; + border : int; + mutable n_connect : (int * int * int * (string * float) list) option; + today : dmy; + today_wd : int; + time : int * int * int; + ctime : float; + (* HTTP printer *) + mutable output_conf : output_conf ; + (* prefix for image urls: + the value of argument -images_url if specified, otherwise + command ^ "?m=IM&v=" in CGI mode + "images" otherwise *) + image_prefix : string; + (* if true, the base name is in the b argument of the query string: ?b=BASE&... + if false, the base name is the last element of the uri path: .../base?... *) + cgi : bool + ; forced_plugins : string list + ; plugins : string list +} + +(** A dummy {!type:config} value, with uninitialized fields. + Used for testing purpose *) +val empty : config \ No newline at end of file From 9bb071704a0a28327b055e79c8e6c5917562e1c3 Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed <mohamed.hernouf@ocamlpro.com> Date: Tue, 11 Jan 2022 19:06:57 +0100 Subject: [PATCH 62/73] Documentation for Cousins and CousinsDisplay --- lib/cousins.mli | 28 ++++++++++++++++++++++++++++ lib/cousinsDisplay.mli | 14 +++++++++++++- lib/perso.mli | 7 +++++++ lib/sosa.mli/sosa.mli | 21 +++++++++++++++++++++ lib/util.mli | 6 +++++- 5 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 lib/cousins.mli diff --git a/lib/cousins.mli b/lib/cousins.mli new file mode 100644 index 0000000000..d3a9251317 --- /dev/null +++ b/lib/cousins.mli @@ -0,0 +1,28 @@ +(** Default number of relatives that could be listed at the same page *) +val default_max_cnt : int + +(** Retruns list of children of the giving family *) +val children_of_fam : Gwdb.base -> Gwdb.ifam -> Gwdb.iper list + +(** Returns list of person's siblings that includes also half-blood siblings. Every sibling + is annotated with parent's id and parent's sex. For common father's and mother's + childran father's annotation is preserved. *) +val siblings : + Config.config -> + Gwdb.base -> Gwdb.iper -> (Gwdb.iper * (Gwdb.iper * Def.sex)) list + +(** [has_desc_lev conf base lev p] tells if person [p] has descendants at the level [lev]. + [lev] 2 represents his children, 3 represents grandchildren, etc. *) +val has_desc_lev : + Config.config -> Gwdb.base -> int -> Gwdb.person -> bool + +(** Tells if two family branches don't itersect *) +val br_inter_is_empty : ('a * 'b) list -> ('a * 'c) list -> bool + +(** Same as [has_desc_lev] but used for a person's sibling as returned by [siblings]. *) +val sibling_has_desc_lev : + Config.config -> Gwdb.base -> int -> Gwdb.iper * 'a -> bool + +(** Returns sosa number calculated from the giving ancestors list. *) +val sosa_of_persons : + Config.config -> Gwdb.base -> Gwdb.iper list -> int \ No newline at end of file diff --git a/lib/cousinsDisplay.mli b/lib/cousinsDisplay.mli index 3380290682..8c105a9efc 100644 --- a/lib/cousinsDisplay.mli +++ b/lib/cousinsDisplay.mli @@ -1,3 +1,15 @@ -(** Displays the cousins menu *) +(** Displays the menu that lists all person's relatives depending on ancestor and his descandant levels + specified by [conf.env] variables {i v1} (for ancestor) and {i v2} for his descandant. For exemple : + + "v1" = 1, "v2" = 1 - Displays all person's siblings (mount to the person's parent (ancestor of level 1) + and lists all his children (descandant of level 1)); + "v1" = 2, "v2" = 2 - Displays all cousins; + "v1" = 2, "v2" = 1 - Displays all uncles/aunts; + "v1" = 1, "v2" = 2 - Displays all nieces/nephews; + etc. + + Variable "t" is used to display anniversaries for relatives like [BirthdayDisplay.gen_print]. + If nor of those variables are defined, prints menu that allows to access the most common relatives (except for direct relatives) + like cousins, siblings, uncles/aunts, etc. *) val print : Config.config -> Gwdb.base -> Gwdb.person -> unit diff --git a/lib/perso.mli b/lib/perso.mli index fb8dd441ea..8bcf58077b 100644 --- a/lib/perso.mli +++ b/lib/perso.mli @@ -34,8 +34,15 @@ val links_to_ind -> string * string * int -> (iper, ifam) Def.NLDB.page list +(** Construts from the giving person sosa table strored in the cache. Sosa table contains association + {i person_id -> sosa number} for each person in the base. Person has sosa [Sosa.one] and his ancestors have sosa > [Sosa.one]. + For non ancestor person sosa number is set to [Sosa.zero]. *) val build_sosa_tree_ht : config -> base -> person -> unit + +(** Extract referenced person from environement and constructs for him sosa table wiht [build_sosa_tree_ht]. *) val build_sosa_ht : config -> base -> unit + + val get_sosa_person : person -> Sosa.t val get_single_sosa : config -> base -> person -> Sosa.t val print_sosa : config -> base -> person -> bool -> unit diff --git a/lib/sosa.mli/sosa.mli b/lib/sosa.mli/sosa.mli index 4487c1d01c..7633332c9f 100644 --- a/lib/sosa.mli/sosa.mli +++ b/lib/sosa.mli/sosa.mli @@ -2,15 +2,36 @@ type t +(** Initial sosa value *) val zero : t + +(** Sosa number describing the subject itself *) val one : t + +(** Equality between 2 sosa *) val eq : t -> t -> bool + +(** Tells if one sosa number is greater then another *) val gt : t -> t -> bool + +(** Comparison function between sosa numbers *) val compare : t -> t -> int + +(** Addition of 2 sosa numbers *) val add : t -> t -> t + +(** Substraction of 2 sosa numbers *) val sub : t -> t -> t + +(** Returns sosa number multiplied by 2. Represents father's sosa number of + person with the giving sosa. *) val twice : t -> t + +(** Returns sosa number divided by 2. If person has a child then result number + will be child's sosa number. *) val half : t -> t + +(** Tells if sosa number is even. Even numbers describe fathers, odd - mothers for each generation. *) val even : t -> bool val inc : t -> int -> t val mul : t -> int -> t diff --git a/lib/util.mli b/lib/util.mli index e3f449a552..2c6bbbb0f9 100644 --- a/lib/util.mli +++ b/lib/util.mli @@ -75,6 +75,7 @@ val is_old_person : config -> (iper, iper, istr) gen_person -> bool val start_with_vowel : string -> bool +(** Returns URL query string to access nth person *) val acces_n : config -> base -> string -> person -> string val acces : config -> base -> person -> string val wprint_hidden_person : config -> base -> string -> person -> unit @@ -355,7 +356,7 @@ val create_topological_sort : config -> base -> (iper, int) Gwdb.Marker.t val p_of_sosa : config -> base -> Sosa.t -> person -> person option (** [branch_of_sosa conf base sosa p0] - Get all the lineage to go from [p0]'s sosa [sosa] to [p0] + Get all the lineage to go from [p0]'s ancestor with sosa number [sosa] to [p0] *) val branch_of_sosa : config -> base -> Sosa.t -> person -> person list option @@ -460,7 +461,10 @@ val reduce_list : int -> 'a list -> 'a list val print_reference : config -> string -> int -> string -> unit +(** Print a tip with the specified text *) val gen_print_tips : config -> string -> unit + +(** Print a tip that tells to {i Click an individual below to calculate the family link.} *) val print_tips_relationship : config -> unit val print_image_sex : config -> person -> int -> unit From 1938ec132477b56e75db4afd44ab32c22010a21f Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed <mohamed.hernouf@ocamlpro.com> Date: Tue, 11 Jan 2022 19:32:34 +0100 Subject: [PATCH 63/73] DAGs mlis --- lib/dag.mli | 18 ++++++++++++++++++ lib/dag2html.mli | 3 +++ lib/dagDisplay.mli | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+) create mode 100644 lib/dag.mli create mode 100644 lib/dagDisplay.mli diff --git a/lib/dag.mli b/lib/dag.mli new file mode 100644 index 0000000000..3b0fe0cd7e --- /dev/null +++ b/lib/dag.mli @@ -0,0 +1,18 @@ +module Pset : + sig + type t = Gwdb.iper list + type elt = Gwdb.iper + val add : 'a -> 'a list -> 'a list + val empty : 'a list + val elements : 'a list -> 'a list + val mem : 'a -> 'a list -> bool + end + +val get_dag_elems : Config.config -> Gwdb.base -> Gwdb.iper list + +type ('a, 'b) sum = ('a, 'b) Def.choice + +val make_dag : + Config.config -> + Gwdb.base -> + Gwdb.iper list -> (Gwdb.iper, int) Def.choice Dag2html.dag \ No newline at end of file diff --git a/lib/dag2html.mli b/lib/dag2html.mli index fafd587fb2..14cad91bc5 100644 --- a/lib/dag2html.mli +++ b/lib/dag2html.mli @@ -18,13 +18,16 @@ and span_id and ghost_id type align = LeftA | CenterA | RightA + type ('a, 'b) table_data = TDitem of 'a | TDtext of string | TDhr of align | TDbar of 'b option | TDnothing + type ('a, 'b) html_table_line = (int * align * ('a, 'b) table_data) array + type ('a, 'b) html_table = ('a, 'b) html_table_line array val html_table_struct : diff --git a/lib/dagDisplay.mli b/lib/dagDisplay.mli new file mode 100644 index 0000000000..8e4d285e18 --- /dev/null +++ b/lib/dagDisplay.mli @@ -0,0 +1,38 @@ + +val image_txt : Config.config -> Gwdb.base -> Gwdb.person -> string + +type item = Item of Gwdb.person * string + +val make_tree_hts : + Config.config -> + Gwdb.base -> + (Gwdb.person -> item) -> + (Gwdb.iper -> string) -> + bool -> + Gwdb.iper list -> + (Gwdb.iper * (Gwdb.iper * Gwdb.ifam option)) list -> + (Gwdb.iper, 'a) Def.choice Dag2html.dag -> + (int * Dag2html.align * + (string, string) Dag2html.table_data) + array array + +type dag_item = string + +val print_slices_menu_or_dag_page : + Config.config -> + string -> + (int * Dag2html.align * + (dag_item, string) Dag2html.table_data) + array array -> string -> unit + +val make_and_print_dag : + Config.config -> + Gwdb.base -> + (Gwdb.person -> item) -> + (Gwdb.iper -> string) -> + bool -> + Gwdb.iper list -> + (Gwdb.iper * (Gwdb.iper * Gwdb.ifam option)) list -> + string -> string -> unit + +val print : Config.config -> Gwdb.base -> unit \ No newline at end of file From 8d4f14046cbded82be7890c4292cb97d2ed0b6f1 Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed <mohamed.hernouf@ocamlpro.com> Date: Tue, 11 Jan 2022 21:47:09 +0100 Subject: [PATCH 64/73] DateDisplay documentation --- lib/dateDisplay.mli | 52 +++++++++++++++++++++++++++++++++++---------- lib/util.mli | 2 +- 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/lib/dateDisplay.mli b/lib/dateDisplay.mli index 1903bcc8d3..6f89067ede 100644 --- a/lib/dateDisplay.mli +++ b/lib/dateDisplay.mli @@ -8,19 +8,53 @@ open Gwdb Return the day of the week for this [date] *) val get_wday : config -> date -> string +(** Returns textual representation of the date translated to the current language. Uses different encodings depending on day's, + month's and year's accessibility. Doesn't consider precision. *) val code_dmy : config -> dmy -> string -val string_of_ondate : ?link:bool -> config -> date -> string + +(** Converts and translate date to the textual representation for the giving language. Considers precision. *) +val string_of_dmy : Config.config -> Def.dmy -> string + +(** If date is [Dgreg] calls for [string_of_dmy] to convert date to the string else returns content of [Dtext]. + Difference between calendars is not taken into the acount. *) val string_of_date : config -> date -> string + +(** Converts and translate date with considering different calendars with prefix "on" before dates (changes for other languages). + Date precision is much more verbose then with [string_of_date]. Decline phrase if needed. + If [link] is true then encapsulates result in HTML link to the page calendar's date converter. *) +val string_of_ondate : ?link:bool -> config -> date -> string + +(** Returns date in format dd/mm/yyyy. Format could be different for other languages (defined by [!dates order] + keyword in the lexicon). *) val string_slash_of_date : config -> date -> string + +(** Returns textual representation of the age represented by [dmy]. *) val string_of_age : config -> dmy -> string + +(** Returns textual representation of date's precision and year. *) val prec_year_text : config -> dmy -> string + +(** Returns textual representation of date's precision *) val prec_text : config -> dmy -> string -val day_text : dmy -> string + +(** Returns textual representation of date's month number. *) val month_text : dmy -> string + +(** Returns textual representation of date's year. *) val year_text : dmy -> string + +(** Returns concatenation of person's birth and death dates (if exists). Precision is mentionned for each date. + For example : + + * 1700-1780 (birth - death) + * 1700- (birth - death but don't know when) + * 1700 (birth - alive) + * †1780 (unknown birth date - death) + * † (unknown birth date - death but don't know when) *) val short_dates_text : config -> base -> person -> string + +(** Retruns year of marriage for given spouses with its precision. *) val short_marriage_date_text : config -> base -> family -> person -> person -> string -val print_dates : config -> base -> person -> unit (** [death_symbol conf] Return the value associated to ["death_symbol"] in [.gwf] file @@ -28,16 +62,12 @@ val print_dates : config -> base -> person -> unit *) val death_symbol : config -> string -val string_of_dmy : config -> dmy -> string -val string_of_on_french_dmy : config -> dmy -> string -val string_of_on_hebrew_dmy : config -> dmy -> string -val string_of_prec_dmy : config -> string -> string -> dmy -> string -val gregorian_precision : config -> dmy -> string -val french_month : config -> int -> string +(** Returns roman number of the year of French calendar *) val code_french_year : config -> int -> string -val code_hebrew_date : config -> int -> int -> int -> string -(** [string_of_date_aux ~dmy:string_of_dmy ~sep:" " conf d] *) +(** Same as [string_of_ondate] except : + - Conversion function for [Def.dmy] could be passed in in [dmy] argument + - Doesn't consider phrase declination as [string_of_ondate] does. *) val string_of_date_aux : ?link:bool -> ?dmy:(Config.config -> Def.dmy -> string) diff --git a/lib/util.mli b/lib/util.mli index 2c6bbbb0f9..7a92b9db4e 100644 --- a/lib/util.mli +++ b/lib/util.mli @@ -266,7 +266,7 @@ val valid_format : ('a, 'b) format2 -> string -> ('a, 'b) format2 (** Find translation of given english word in [conf.lexicon] *) val transl : config -> string -> string -(** [transl_nth conf w n] returns translation for [n]'th word (with [nth_field]). *) +(** [transl_nth conf w n] translate word [w] and returns [n]'th field of its translation (with [nth_field]). *) val transl_nth : config -> string -> int -> string val transl_decline : config -> string -> string -> string val ftransl : config -> ('a, 'b) format2 -> ('a, 'b) format2 From ce3cb4c497999f40a95ae85582d49dce5551424c Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed <mohamed.hernouf@ocamlpro.com> Date: Tue, 11 Jan 2022 23:53:03 +0100 Subject: [PATCH 65/73] DescendDisplay documentation --- lib/descendDisplay.mli | 47 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/lib/descendDisplay.mli b/lib/descendDisplay.mli index 5730b55bc3..4e52854cd6 100644 --- a/lib/descendDisplay.mli +++ b/lib/descendDisplay.mli @@ -1,29 +1,70 @@ -(** Displays the descendants of the selected person *) -val print : Config.config -> Gwdb.base -> Gwdb.person -> unit - (* Public functions for API (plugin v7_descend) *) + +(** Displays only descendants for specified level in unordered lists *) val display_descendants_level : Config.config -> Gwdb.base -> int -> Gwdb.person -> unit +(** Displays descendants with numerated by letter list. Title links to descendats index *) val display_descendants_with_numbers : Config.config -> Gwdb.base -> int -> Gwdb.person -> unit +(** Displays index of descendants *) val display_descendant_index : Config.config -> Gwdb.base -> int -> Gwdb.person -> unit +(** Displays index of descendant's spouses *) val display_spouse_index : Config.config -> Gwdb.base -> int -> Gwdb.person -> unit +(** Displays descendants in the table where rows are ordered by D'Aboville number. *) val display_descendant_with_table : Config.config -> Gwdb.base -> int -> Gwdb.person -> unit +(** Displays tree of descendants *) val print_tree : Config.config -> Gwdb.base -> int -> Gwdb.person -> unit +(** Displays descendants as follows : + + person + | desc1 + | desc2 + | | desc21 + | desc3 + + *) val print_aboville : Config.config -> Gwdb.base -> int -> Gwdb.person -> unit +(** Prints form that allows to customise display of descendants *) val desmenu_print : Config.config -> Gwdb.base -> Gwdb.person -> unit +(** Displays the descendants of the selected in [conv.env] person. Descendants could be displayed by different ways + depending on variable {i t} in [conv.env] environement: + + - "L" dispalying descendants in unordered list + - "F" same as "L" but displays only female line + - "M" same as "L" but displays only female line + - "H" table dispalying + - "I" table dispalying with spouses information + - "A" numerated list (d'Aboville) + - "V" displaying a tree of descendants + + Previous dispalyings are done by template evaluation. Next ones are done by functions inside this module: + + - "B" for [print_aboville] + - "S" for [display_descendants_level] + - "K" for [display_descendant_with_table] + - "N" for [display_descendants_with_numbers] + - "G" for [display_descendant_index] + - "C" for [display_spouse_index] + - "T" for [print_tree] + + Variable {i v} is used to select maximal level to descend for descendant displaying (1 for children, 2 for + grandchildren, etc). If {i t} variable isn't defined, then displays the form that allows + customising of display. + + *) +val print : Config.config -> Gwdb.base -> Gwdb.person -> unit From 45efdf7d1a52ce9b83baac6f2d5cbea4fb02d563 Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed <mohamed.hernouf@ocamlpro.com> Date: Wed, 12 Jan 2022 17:23:17 +0100 Subject: [PATCH 66/73] History, HistoryDiff and HistoryDiffDisplay documentation --- lib/def/def.ml | 4 +++- lib/history.mli | 16 ++++++++++++++-- lib/historyDiff.mli | 23 +++++++++++++++++++++++ lib/historyDiffDisplay.mli | 5 +++-- lib/util.mli | 3 +++ 5 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 lib/historyDiff.mli diff --git a/lib/def/def.ml b/lib/def/def.ml index d16bcd7198..34becdcc28 100644 --- a/lib/def/def.ml +++ b/lib/def/def.ml @@ -353,7 +353,7 @@ type base_notes = ; efiles : unit -> string list } -(** Update database history *) +(** Update modification used for history tracking *) type ('iper, 'person, 'family, 'string) base_changed = U_Add_person of ('iper, 'person, 'string) gen_person | U_Modify_person of @@ -381,6 +381,8 @@ type ('iper, 'person, 'family, 'string) base_changed = | U_Add_parent of ('iper, 'person, 'string) gen_person * ('person, 'family, 'string) gen_family | U_Kill_ancestors of ('iper, 'person, 'string) gen_person + (* Modification U_Multi used when multiple persons are modified successively. Separation with U_Modify_person is necessary to inform foreign notify_change script + about database change without creating process for every person. *) | U_Multi of ('iper, 'person, 'string) gen_person * ('iper, 'person, 'string) gen_person * bool | U_Notes of int option * string diff --git a/lib/history.mli b/lib/history.mli index 48c9458174..170352bddb 100644 --- a/lib/history.mli +++ b/lib/history.mli @@ -5,17 +5,29 @@ open Config open Def open Gwdb +(** Retruns path to the file where history of updates is stored *) val file_name : config -> string +(** [record conf change action] records new modification in the history files (global file and specific for each concerned by modification person). + Additionaly it does: + + - Updates [conf.default_sosa_ref] if concered by modification person is referenced by default_sosa_ref + - Notify foreign {i notify_change} about modification on the base (doesn't notify if multiple modifications are done succesively) *) val record : config -> base -> (iper, iper, ifam, string) base_changed -> string -> unit + +(** [notify conf base action] Explicit notification of foreign script {i notify_change} that modification action [action] was executed on the database. + Since [record] already does notify script about unary modification on the base, this function is used exclusively to send notification about multiple + modifications and avoid creating indefinite amount of processes for each modification (for example for each concerned person in the list of modified persons). *) val notify : config -> base -> string -> unit (** Displays an history of updates *) val print : config -> base -> unit -(** Same as `print`, but with a default search*) +(** Same as `print`, but simultaneously searches for text inside the history and higlhight all found matches. + Search pattern is available with {i s} variable in environement [conf.env]. *) val print_search : config -> base -> unit - (* Ajout pour l'API *) + +(** Parses one line of history file that delimits one modification record. *) val line_fields : string -> (string * string * string * string option) option diff --git a/lib/historyDiff.mli b/lib/historyDiff.mli new file mode 100644 index 0000000000..3e65f1a346 --- /dev/null +++ b/lib/historyDiff.mli @@ -0,0 +1,23 @@ +(** Type that represnets one update record stored in the history file for concerned person. *) +type gen_record = { + date : string; + wizard : string; + gen_p : (Gwdb.iper, Gwdb.iper, string) Def.gen_person; + gen_f : (Gwdb.iper, Gwdb.ifam, string) Def.gen_family list; + gen_c : Gwdb.iper array list; +} + +(** Returns history filename for the person with the given key. Has format : {i firstname.occ.surname} *) +val history_file : string -> string -> int -> string + +(** Returns path to the history file inside {i history_d} with given filename *) +val history_path : Config.config -> string -> string + +(** [record_diff conf base change] records new updated information [change] inside the history files of concerned by [change] persons. *) +val record_diff : + Config.config -> + Gwdb.base -> + (Gwdb.iper, Gwdb.iper, Gwdb.ifam, string) Def.base_changed -> unit + +(** Loadlist of modification records for a giving person's history file. The most recent modification is at the head of the list *) +val load_person_history : Config.config -> string -> gen_record list \ No newline at end of file diff --git a/lib/historyDiffDisplay.mli b/lib/historyDiffDisplay.mli index 297c7b6a7f..433d0fe8e8 100644 --- a/lib/historyDiffDisplay.mli +++ b/lib/historyDiffDisplay.mli @@ -1,9 +1,10 @@ -(** Displays the history list associated to the history file in argument *) +(** Displays page that allows to select all revision of the history file in argument that user may want to clean *) val print_clean : Config.config -> unit (** Cleans the history associated to the history file in argument *) val print_clean_ok : Config.config -> unit -(** Intepretation of the template file updhist_diff.txt *) +(** Displays the page that allows to select (with variable {i t} = "SUM") and to view (with variable {i t} = "DIFF") the difference between all revisions of + history file of concerned person in variable {i f}. Intepretate the template file {i updhist_diff.txt} *) val print : Config.config -> Gwdb.base -> unit diff --git a/lib/util.mli b/lib/util.mli index 7a92b9db4e..b97ddd2c7e 100644 --- a/lib/util.mli +++ b/lib/util.mli @@ -101,8 +101,11 @@ val is_hidden : person -> bool acccess returns empty person with giving id. *) val pget : config -> base -> iper -> person +(** Remplaces string ids inside person's entry by real strings *) val string_gen_person : base -> (iper, iper, istr) gen_person -> (iper, iper, string) gen_person + +(** Remplaces string ids inside family's entry by real strings *) val string_gen_family : base -> (iper, ifam, istr) gen_family -> (iper, ifam, string) gen_family From 1657d5085ea4fb96fd5a82d1cc85326f50a584c6 Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed <mohamed.hernouf@ocamlpro.com> Date: Wed, 12 Jan 2022 21:18:42 +0100 Subject: [PATCH 67/73] ImageDisplay documentation --- lib/hutil.mli | 4 ++-- lib/imageDisplay.mli | 11 +++-------- lib/util.mli | 10 ++++++++++ 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/lib/hutil.mli b/lib/hutil.mli index 0c3fc79c98..68c7693b83 100644 --- a/lib/hutil.mli +++ b/lib/hutil.mli @@ -61,12 +61,12 @@ val print_link_to_welcome : config -> bool -> unit (** Sends [Bad Request] HTTP response (same as [GWPARAM.output_error conf Bad_Request]) *) val incorrect_request : config -> unit +(* TODOOCP *) val interp : config -> string -> ('a, 'b) Templ.interp_fun -> 'a Templ.env -> 'b -> unit - val interp_no_header : config -> string -> ('a, 'b) Templ.interp_fun -> 'a Templ.env -> 'b -> unit -(** Displays the calendar; if no key is set, it will use today's date =. +(** Displays the calendar; if no key is set, it will use today's date. Based on template file calendar.txt *) val print_calendar : config -> unit diff --git a/lib/imageDisplay.mli b/lib/imageDisplay.mli index a28fc3864a..82bdb10c2f 100644 --- a/lib/imageDisplay.mli +++ b/lib/imageDisplay.mli @@ -3,14 +3,9 @@ wasn't found or couldn't be send. *) val print_image_file : Config.config -> string -> bool -(** [Description] : Traite une requête image. - [Args] : - - config : configuration de la requête - - base : base de donnée sélectionnée *) +(** Searhes image's filename in the environement [conf.env] and sends HTTP respose with its content on the socket. If filename isn't presented, looks up + personal image for person's mentionned in [conf.env] *) val print : Config.config -> Gwdb.base -> unit -(** [Description] : Affiche une image seule dans une page HTML. - [Args] : - - conf : configuration de la requête - - base : argument non utilisé *) +(** Sends HTTP respose with HTML page containg just image specified in arguments. *) val print_html : Config.config -> unit diff --git a/lib/util.mli b/lib/util.mli index b97ddd2c7e..8189c76095 100644 --- a/lib/util.mli +++ b/lib/util.mli @@ -381,11 +381,21 @@ val has_image : config -> base -> person -> bool (** [image_file_name fname] search for image {i images/fname} inside the base and assets directories. Retrun the path to found file or [fname] if file isn't found. *) val image_file_name : string -> string + +(** Returns path to the image file with the giving name in directory {i sources}. *) val source_image_file_name : string -> string -> string +(** Returns width and height of an image. *) val image_size : string -> (int * int) option + +(** [limited_image_size max_wid max_hei fname defsize] returns image size of [fname]. If width and height are greater + then their limits [max_wid] and [max_hei] then returns reduced size with the same proportions. [defsize] is returned + if image filename is empty. *) val limited_image_size : int -> int -> string -> (int * int) option -> (int * int) option + +(** Returns path to the personal image. In details, returns [(is_filename,source,size)] where [is_filename] tells if [source] + is a filename or URL and [size] is a size of image (width x height). *) val image_and_size : config -> base -> person -> (string -> (int * int) option -> (int * int) option) -> From 2c3b9780a55247ae5933dca0bde5e68a7ca1d743 Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed <mohamed.hernouf@ocamlpro.com> Date: Wed, 12 Jan 2022 21:41:33 +0100 Subject: [PATCH 68/73] MergeDisplay documentation --- lib/mergeDisplay.mli | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/mergeDisplay.mli b/lib/mergeDisplay.mli index df45105261..257f3207be 100644 --- a/lib/mergeDisplay.mli +++ b/lib/mergeDisplay.mli @@ -4,9 +4,11 @@ open Gwdb open Config +(** Prints person's key on the socket *) val print_someone : config -> base -> person -> unit (** Displays a menu for merging two persons *) val print : config -> base -> person -> unit +(** Prints link on the page to continue merging two persons (or two duplications). *) val print_possible_continue_merging : config -> base -> unit From 60713ff3efdf46d5ec6480918a92cc4f0dcd4555 Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed <mohamed.hernouf@ocamlpro.com> Date: Wed, 12 Jan 2022 22:35:13 +0100 Subject: [PATCH 69/73] Interface to merge modules, Undocumented interfaces marked with TODOOCP --- lib/dag.mli | 3 +-- lib/dag2html.mli | 9 +-------- lib/dagDisplay.mli | 8 +------- lib/mergeFamOk.mli | 4 ++++ lib/mergeInd.mli | 25 +++++++++++++++++++++++++ lib/mergeIndOk.mli | 24 ++++++++++++++++++++++++ lib/mergeIndOkDisplay.mli | 3 +++ 7 files changed, 59 insertions(+), 17 deletions(-) create mode 100644 lib/mergeFamOk.mli create mode 100644 lib/mergeInd.mli create mode 100644 lib/mergeIndOk.mli create mode 100644 lib/mergeIndOkDisplay.mli diff --git a/lib/dag.mli b/lib/dag.mli index 3b0fe0cd7e..e200903a7f 100644 --- a/lib/dag.mli +++ b/lib/dag.mli @@ -1,3 +1,4 @@ +(* TODOCP *) module Pset : sig type t = Gwdb.iper list @@ -9,9 +10,7 @@ module Pset : end val get_dag_elems : Config.config -> Gwdb.base -> Gwdb.iper list - type ('a, 'b) sum = ('a, 'b) Def.choice - val make_dag : Config.config -> Gwdb.base -> diff --git a/lib/dag2html.mli b/lib/dag2html.mli index 14cad91bc5..30e85a4e81 100644 --- a/lib/dag2html.mli +++ b/lib/dag2html.mli @@ -1,13 +1,12 @@ (* $Id: dag2html.mli,v 5.0 2005-12-13 11:51:26 ddr Exp $ *) +(* TODOCP *) type 'a dag = { mutable dag : 'a node array } and 'a node = { mutable pare : idag list; valu : 'a; mutable chil : idag list } and idag - external int_of_idag : idag -> int = "%identity" external idag_of_int : int -> idag = "%identity" - type 'a table = { mutable table : 'a data array array } and 'a data = { mutable elem : 'a elem; mutable span : span_id } and 'a elem = @@ -16,23 +15,17 @@ and 'a elem = | Nothing and span_id and ghost_id - type align = LeftA | CenterA | RightA - type ('a, 'b) table_data = TDitem of 'a | TDtext of string | TDhr of align | TDbar of 'b option | TDnothing - type ('a, 'b) html_table_line = (int * align * ('a, 'b) table_data) array - type ('a, 'b) html_table = ('a, 'b) html_table_line array - val html_table_struct : ('a node -> 'b) -> ('a node -> 'c) -> ('a node -> bool) -> 'a dag -> idag table -> (int * align * ('b, 'c) table_data) array array - val table_of_dag : ('a node -> bool) -> bool -> bool -> bool -> 'a dag -> idag table diff --git a/lib/dagDisplay.mli b/lib/dagDisplay.mli index 8e4d285e18..b8fea7d37e 100644 --- a/lib/dagDisplay.mli +++ b/lib/dagDisplay.mli @@ -1,8 +1,6 @@ - +(* TODOOCP *) val image_txt : Config.config -> Gwdb.base -> Gwdb.person -> string - type item = Item of Gwdb.person * string - val make_tree_hts : Config.config -> Gwdb.base -> @@ -15,16 +13,13 @@ val make_tree_hts : (int * Dag2html.align * (string, string) Dag2html.table_data) array array - type dag_item = string - val print_slices_menu_or_dag_page : Config.config -> string -> (int * Dag2html.align * (dag_item, string) Dag2html.table_data) array array -> string -> unit - val make_and_print_dag : Config.config -> Gwdb.base -> @@ -34,5 +29,4 @@ val make_and_print_dag : Gwdb.iper list -> (Gwdb.iper * (Gwdb.iper * Gwdb.ifam option)) list -> string -> string -> unit - val print : Config.config -> Gwdb.base -> unit \ No newline at end of file diff --git a/lib/mergeFamOk.mli b/lib/mergeFamOk.mli new file mode 100644 index 0000000000..78606b56c7 --- /dev/null +++ b/lib/mergeFamOk.mli @@ -0,0 +1,4 @@ + +(* TODOOCP *) +val print_merge : Config.config -> Gwdb.base -> unit +val print_mod_merge : Config.config -> Gwdb.base -> unit \ No newline at end of file diff --git a/lib/mergeInd.mli b/lib/mergeInd.mli new file mode 100644 index 0000000000..6dc7c489e1 --- /dev/null +++ b/lib/mergeInd.mli @@ -0,0 +1,25 @@ + +(* TODOOCP *) +val reparent_ind : + Gwdb.base -> + (CheckItem.base_warning -> unit) -> Gwdb.iper -> Gwdb.iper -> unit +exception Error_loop of Gwdb.person +exception Same_person +exception Different_sexes of Gwdb.person * Gwdb.person +val merge : + Config.config -> + Gwdb.base -> + Gwdb.person -> + Gwdb.person -> + (Config.config -> + Gwdb.base -> + (Gwdb.iper * Gwdb.iper) list -> Gwdb.person -> Gwdb.person -> 'a) -> + (Config.config -> + Gwdb.base -> + (Gwdb.iper * Gwdb.iper) list -> + Gwdb.ifam * Gwdb.family -> + Gwdb.ifam * Gwdb.family -> Gwdb.person -> Gwdb.person -> 'b) -> + bool * CheckItem.base_warning list +val kill_ancestors : + Config.config -> + Gwdb.base -> bool -> Gwdb.person -> int ref -> int ref -> unit \ No newline at end of file diff --git a/lib/mergeIndOk.mli b/lib/mergeIndOk.mli new file mode 100644 index 0000000000..14ab5dfe2a --- /dev/null +++ b/lib/mergeIndOk.mli @@ -0,0 +1,24 @@ +(* TODOOCP *) +val reconstitute : + Config.config -> + Gwdb.base -> + Gwdb.person -> + Gwdb.person -> + (Gwdb.iper, string * string * int * Update.create * string, string) + Def.gen_person +val effective_mod_merge : + Config.config -> + Gwdb.base -> + (Gwdb.iper, Gwdb.iper, string) Def.gen_person -> + (Gwdb.iper, Gwdb.iper, string) Def.gen_person -> + (Gwdb.iper, Update.key, string) Def.gen_person -> + (Config.config -> + Gwdb.base -> + CheckItem.base_warning list -> + (Gwdb.iper, Gwdb.iper, Gwdb.istr) Def.gen_person -> + (Gwdb.iper, Gwdb.ifam) Def.NLDB.page list -> + string -> + string -> + int -> + (Gwdb.iper, Gwdb.ifam) Def.NLDB.page list -> string -> string -> int -> 'a) -> + 'a \ No newline at end of file diff --git a/lib/mergeIndOkDisplay.mli b/lib/mergeIndOkDisplay.mli new file mode 100644 index 0000000000..654c25ea44 --- /dev/null +++ b/lib/mergeIndOkDisplay.mli @@ -0,0 +1,3 @@ +(* TODOOCP *) +val print_merge : Config.config -> Gwdb.base -> unit +val print_mod_merge : Config.config -> Gwdb.base -> unit \ No newline at end of file From fb3f19d194baadf101a95ca74cfc6db49cc32c3c Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed <mohamed.hernouf@ocamlpro.com> Date: Sun, 16 Jan 2022 19:28:19 +0100 Subject: [PATCH 70/73] Sosa documentation --- lib/sosa.mli/sosa.mli | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/lib/sosa.mli/sosa.mli b/lib/sosa.mli/sosa.mli index 7633332c9f..84f1be95e0 100644 --- a/lib/sosa.mli/sosa.mli +++ b/lib/sosa.mli/sosa.mli @@ -33,11 +33,23 @@ val half : t -> t (** Tells if sosa number is even. Even numbers describe fathers, odd - mothers for each generation. *) val even : t -> bool + +(** Addition of sosa number with a integer *) val inc : t -> int -> t + +(** Multiply sosa number with an integer *) val mul : t -> int -> t + +(** The power of the sosa number *) val exp : t -> int -> t + +(** Divide sosa number by an integer *) val div : t -> int -> t + +(** Calculate module of sosa number comparing to integer *) val modl : t -> int -> t + +(** Retruns generation of sosa number. *) val gen : t -> int (** [branches sosa] @@ -47,8 +59,13 @@ val gen : t -> int *) val branches : t -> int list +(** Converts sosa from integer *) val of_int : int -> t + +(** Converts sosa from string *) val of_string : string -> t + +(** Converts sosa to string *) val to_string : t -> string (** See {!val:Mutil.string_of_int_sep} *) From 3f14ff2e27e7acd09c600dd78b6a4066275b1856 Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed <mohamed.hernouf@ocamlpro.com> Date: Tue, 18 Jan 2022 16:58:21 +0100 Subject: [PATCH 71/73] Developer documentation available with Generating hd/etc/version.txt... Done! dune build @doc if [ ! -d static/doc ] ; then \ mkdir -p static/doc ; \ cp -r _build/default/_doc/_html/* static/doc ; \ fi xdg-open static/html/dev-doc/index.html --- Makefile | 14 +- static/doc/geneweb/Adef/.dune-keep | 0 static/doc/geneweb/Adef/index.html | 2 + static/doc/geneweb/Buff/.dune-keep | 0 static/doc/geneweb/Buff/Make/index.html | 2 + static/doc/geneweb/Buff/index.html | 2 + static/doc/geneweb/Calendar/.dune-keep | 0 static/doc/geneweb/Calendar/index.html | 2 + static/doc/geneweb/Consang/.dune-keep | 0 static/doc/geneweb/Consang/index.html | 2 + static/doc/geneweb/ConsangAll/.dune-keep | 0 static/doc/geneweb/ConsangAll/index.html | 2 + static/doc/geneweb/Date/.dune-keep | 0 static/doc/geneweb/Date/index.html | 2 + static/doc/geneweb/Def/.dune-keep | 0 static/doc/geneweb/Def/NLDB/index.html | 2 + static/doc/geneweb/Def/index.html | 2 + static/doc/geneweb/Def_show/.dune-keep | 0 static/doc/geneweb/Def_show/index.html | 2 + static/doc/geneweb/Futil/.dune-keep | 0 static/doc/geneweb/Futil/index.html | 4 + static/doc/geneweb/Geneweb/.dune-keep | 0 .../geneweb/Geneweb/AdvSearchOk/index.html | 2 + .../Geneweb/AdvSearchOkDisplay/index.html | 2 + static/doc/geneweb/Geneweb/Alln/index.html | 2 + .../geneweb/Geneweb/AllnDisplay/index.html | 2 + static/doc/geneweb/Geneweb/Ansel/index.html | 2 + static/doc/geneweb/Geneweb/Base64/index.html | 2 + .../doc/geneweb/Geneweb/BirthDeath/index.html | 3 + .../Geneweb/BirthDeathDisplay/index.html | 2 + .../Geneweb/BirthdayDisplay/index.html | 2 + .../geneweb/Geneweb/ChangeChildren/index.html | 2 + .../Geneweb/ChangeChildrenDisplay/index.html | 2 + static/doc/geneweb/Geneweb/Check/index.html | 3 + .../doc/geneweb/Geneweb/CheckItem/index.html | 3 + static/doc/geneweb/Geneweb/Config/index.html | 2 + static/doc/geneweb/Geneweb/Cousins/index.html | 2 + .../geneweb/Geneweb/CousinsDisplay/index.html | 2 + .../doc/geneweb/Geneweb/Dag/Pset/index.html | 2 + static/doc/geneweb/Geneweb/Dag/index.html | 2 + .../doc/geneweb/Geneweb/Dag2html/index.html | 2 + .../doc/geneweb/Geneweb/DagDisplay/index.html | 2 + .../geneweb/Geneweb/DateDisplay/index.html | 3 + .../geneweb/Geneweb/DescendDisplay/index.html | 2 + .../doc/geneweb/Geneweb/Difference/index.html | 2 + static/doc/geneweb/Geneweb/Fixbase/index.html | 2 + static/doc/geneweb/Geneweb/GWPARAM/index.html | 2 + .../geneweb/Geneweb/GWPARAM_ITL/index.html | 2 + static/doc/geneweb/Geneweb/Gwlib/index.html | 2 + static/doc/geneweb/Geneweb/History/index.html | 2 + .../geneweb/Geneweb/HistoryDiff/index.html | 2 + .../Geneweb/HistoryDiffDisplay/index.html | 2 + static/doc/geneweb/Geneweb/Hutil/index.html | 2 + .../geneweb/Geneweb/ImageDisplay/index.html | 2 + .../geneweb/Geneweb/MergeDisplay/index.html | 2 + .../Geneweb/MergeDupDisplay/index.html | 2 + .../Geneweb/MergeFamDisplay/index.html | 2 + .../doc/geneweb/Geneweb/MergeFamOk/index.html | 2 + .../doc/geneweb/Geneweb/MergeInd/index.html | 2 + .../Geneweb/MergeIndDisplay/index.html | 2 + .../doc/geneweb/Geneweb/MergeIndOk/index.html | 2 + .../Geneweb/MergeIndOkDisplay/index.html | 2 + static/doc/geneweb/Geneweb/Notes/index.html | 2 + .../geneweb/Geneweb/NotesDisplay/index.html | 2 + .../doc/geneweb/Geneweb/NotesLinks/index.html | 2 + static/doc/geneweb/Geneweb/Output/index.html | 2 + static/doc/geneweb/Geneweb/Perso/index.html | 3 + static/doc/geneweb/Geneweb/Place/index.html | 4 + .../geneweb/Geneweb/PlaceDisplay/index.html | 6 + .../doc/geneweb/Geneweb/Relation/index.html | 2 + .../Geneweb/RelationDisplay/index.html | 2 + .../geneweb/Geneweb/RelationLink/index.html | 2 + .../doc/geneweb/Geneweb/SearchName/index.html | 2 + static/doc/geneweb/Geneweb/Some/index.html | 2 + .../geneweb/Geneweb/SrcfileDisplay/index.html | 2 + static/doc/geneweb/Geneweb/Stats/index.html | 2 + static/doc/geneweb/Geneweb/Templ/index.html | 2 + .../doc/geneweb/Geneweb/TemplAst/index.html | 2 + .../doc/geneweb/Geneweb/TemplDate/index.html | 2 + .../geneweb/Geneweb/Templ_parser/index.html | 2 + static/doc/geneweb/Geneweb/Title/index.html | 4 + .../geneweb/Geneweb/TitleDisplay/index.html | 2 + .../doc/geneweb/Geneweb/Translate/index.html | 2 + static/doc/geneweb/Geneweb/Update/index.html | 2 + .../Geneweb/UpdateData/IstrSet/index.html | 2 + .../Geneweb/UpdateData/PersMap/index.html | 2 + .../Geneweb/UpdateData/PersSet/index.html | 2 + .../Geneweb/UpdateData/StringSet/index.html | 2 + .../doc/geneweb/Geneweb/UpdateData/index.html | 2 + .../Geneweb/UpdateDataDisplay/index.html | 2 + .../doc/geneweb/Geneweb/UpdateFam/index.html | 2 + .../geneweb/Geneweb/UpdateFamOk/index.html | 2 + .../doc/geneweb/Geneweb/UpdateInd/index.html | 2 + .../geneweb/Geneweb/UpdateIndOk/index.html | 3 + .../geneweb/Geneweb/Util/IfamSet/index.html | 2 + .../geneweb/Geneweb/Util/IperSet/index.html | 2 + static/doc/geneweb/Geneweb/Util/index.html | 2 + static/doc/geneweb/Geneweb/Version/index.html | 2 + static/doc/geneweb/Geneweb/Wiki/index.html | 4 + .../Geneweb/WiznotesDisplay/index.html | 2 + static/doc/geneweb/Geneweb/index.html | 2 + .../geneweb/Geneweb__AdvSearchOk/.dune-keep | 0 .../geneweb/Geneweb__AdvSearchOk/index.html | 2 + .../Geneweb__AdvSearchOkDisplay/.dune-keep | 0 .../Geneweb__AdvSearchOkDisplay/index.html | 2 + static/doc/geneweb/Geneweb__Alln/.dune-keep | 0 static/doc/geneweb/Geneweb__Alln/index.html | 2 + .../geneweb/Geneweb__AllnDisplay/.dune-keep | 0 .../geneweb/Geneweb__AllnDisplay/index.html | 2 + static/doc/geneweb/Geneweb__Ansel/.dune-keep | 0 static/doc/geneweb/Geneweb__Ansel/index.html | 2 + static/doc/geneweb/Geneweb__Base64/.dune-keep | 0 static/doc/geneweb/Geneweb__Base64/index.html | 2 + .../geneweb/Geneweb__BirthDeath/.dune-keep | 0 .../geneweb/Geneweb__BirthDeath/index.html | 2 + .../Geneweb__BirthDeathDisplay/.dune-keep | 0 .../Geneweb__BirthDeathDisplay/index.html | 2 + .../Geneweb__BirthdayDisplay/.dune-keep | 0 .../Geneweb__BirthdayDisplay/index.html | 2 + .../Geneweb__ChangeChildren/.dune-keep | 0 .../Geneweb__ChangeChildren/index.html | 2 + .../Geneweb__ChangeChildrenDisplay/.dune-keep | 0 .../Geneweb__ChangeChildrenDisplay/index.html | 2 + static/doc/geneweb/Geneweb__Check/.dune-keep | 0 static/doc/geneweb/Geneweb__Check/index.html | 2 + .../doc/geneweb/Geneweb__CheckItem/.dune-keep | 0 .../doc/geneweb/Geneweb__CheckItem/index.html | 2 + static/doc/geneweb/Geneweb__Config/.dune-keep | 0 static/doc/geneweb/Geneweb__Config/index.html | 2 + .../doc/geneweb/Geneweb__Cousins/.dune-keep | 0 .../doc/geneweb/Geneweb__Cousins/index.html | 2 + .../Geneweb__CousinsDisplay/.dune-keep | 0 .../Geneweb__CousinsDisplay/index.html | 2 + static/doc/geneweb/Geneweb__Dag/.dune-keep | 0 static/doc/geneweb/Geneweb__Dag/index.html | 2 + .../doc/geneweb/Geneweb__Dag2html/.dune-keep | 0 .../doc/geneweb/Geneweb__Dag2html/index.html | 2 + .../geneweb/Geneweb__DagDisplay/.dune-keep | 0 .../geneweb/Geneweb__DagDisplay/index.html | 2 + .../geneweb/Geneweb__DateDisplay/.dune-keep | 0 .../geneweb/Geneweb__DateDisplay/index.html | 2 + .../Geneweb__DescendDisplay/.dune-keep | 0 .../Geneweb__DescendDisplay/index.html | 2 + .../geneweb/Geneweb__Difference/.dune-keep | 0 .../geneweb/Geneweb__Difference/index.html | 2 + .../doc/geneweb/Geneweb__Fixbase/.dune-keep | 0 .../doc/geneweb/Geneweb__Fixbase/index.html | 2 + .../doc/geneweb/Geneweb__GWPARAM/.dune-keep | 0 .../doc/geneweb/Geneweb__GWPARAM/index.html | 2 + .../geneweb/Geneweb__GWPARAM_ITL/.dune-keep | 0 .../geneweb/Geneweb__GWPARAM_ITL/index.html | 2 + static/doc/geneweb/Geneweb__Gwlib/.dune-keep | 0 static/doc/geneweb/Geneweb__Gwlib/index.html | 2 + .../doc/geneweb/Geneweb__History/.dune-keep | 0 .../doc/geneweb/Geneweb__History/index.html | 2 + .../geneweb/Geneweb__HistoryDiff/.dune-keep | 0 .../geneweb/Geneweb__HistoryDiff/index.html | 2 + .../Geneweb__HistoryDiffDisplay/.dune-keep | 0 .../Geneweb__HistoryDiffDisplay/index.html | 2 + static/doc/geneweb/Geneweb__Hutil/.dune-keep | 0 static/doc/geneweb/Geneweb__Hutil/index.html | 2 + .../geneweb/Geneweb__ImageDisplay/.dune-keep | 0 .../geneweb/Geneweb__ImageDisplay/index.html | 2 + .../geneweb/Geneweb__MergeDisplay/.dune-keep | 0 .../geneweb/Geneweb__MergeDisplay/index.html | 2 + .../Geneweb__MergeDupDisplay/.dune-keep | 0 .../Geneweb__MergeDupDisplay/index.html | 2 + .../Geneweb__MergeFamDisplay/.dune-keep | 0 .../Geneweb__MergeFamDisplay/index.html | 2 + .../geneweb/Geneweb__MergeFamOk/.dune-keep | 0 .../geneweb/Geneweb__MergeFamOk/index.html | 2 + .../doc/geneweb/Geneweb__MergeInd/.dune-keep | 0 .../doc/geneweb/Geneweb__MergeInd/index.html | 2 + .../Geneweb__MergeIndDisplay/.dune-keep | 0 .../Geneweb__MergeIndDisplay/index.html | 2 + .../geneweb/Geneweb__MergeIndOk/.dune-keep | 0 .../geneweb/Geneweb__MergeIndOk/index.html | 2 + .../Geneweb__MergeIndOkDisplay/.dune-keep | 0 .../Geneweb__MergeIndOkDisplay/index.html | 2 + static/doc/geneweb/Geneweb__Notes/.dune-keep | 0 static/doc/geneweb/Geneweb__Notes/index.html | 2 + .../geneweb/Geneweb__NotesDisplay/.dune-keep | 0 .../geneweb/Geneweb__NotesDisplay/index.html | 2 + .../geneweb/Geneweb__NotesLinks/.dune-keep | 0 .../geneweb/Geneweb__NotesLinks/index.html | 2 + static/doc/geneweb/Geneweb__Output/.dune-keep | 0 static/doc/geneweb/Geneweb__Output/index.html | 2 + static/doc/geneweb/Geneweb__Perso/.dune-keep | 0 static/doc/geneweb/Geneweb__Perso/index.html | 2 + static/doc/geneweb/Geneweb__Place/.dune-keep | 0 static/doc/geneweb/Geneweb__Place/index.html | 2 + .../geneweb/Geneweb__PlaceDisplay/.dune-keep | 0 .../geneweb/Geneweb__PlaceDisplay/index.html | 2 + .../doc/geneweb/Geneweb__Relation/.dune-keep | 0 .../doc/geneweb/Geneweb__Relation/index.html | 2 + .../Geneweb__RelationDisplay/.dune-keep | 0 .../Geneweb__RelationDisplay/index.html | 2 + .../geneweb/Geneweb__RelationLink/.dune-keep | 0 .../geneweb/Geneweb__RelationLink/index.html | 2 + .../geneweb/Geneweb__SearchName/.dune-keep | 0 .../geneweb/Geneweb__SearchName/index.html | 2 + static/doc/geneweb/Geneweb__Some/.dune-keep | 0 static/doc/geneweb/Geneweb__Some/index.html | 2 + .../Geneweb__SrcfileDisplay/.dune-keep | 0 .../Geneweb__SrcfileDisplay/index.html | 2 + static/doc/geneweb/Geneweb__Stats/.dune-keep | 0 static/doc/geneweb/Geneweb__Stats/index.html | 2 + static/doc/geneweb/Geneweb__Templ/.dune-keep | 0 static/doc/geneweb/Geneweb__Templ/index.html | 2 + .../doc/geneweb/Geneweb__TemplAst/.dune-keep | 0 .../doc/geneweb/Geneweb__TemplAst/index.html | 2 + .../doc/geneweb/Geneweb__TemplDate/.dune-keep | 0 .../doc/geneweb/Geneweb__TemplDate/index.html | 2 + .../geneweb/Geneweb__Templ_parser/.dune-keep | 0 .../geneweb/Geneweb__Templ_parser/index.html | 2 + static/doc/geneweb/Geneweb__Title/.dune-keep | 0 static/doc/geneweb/Geneweb__Title/index.html | 2 + .../geneweb/Geneweb__TitleDisplay/.dune-keep | 0 .../geneweb/Geneweb__TitleDisplay/index.html | 2 + .../doc/geneweb/Geneweb__Translate/.dune-keep | 0 .../doc/geneweb/Geneweb__Translate/index.html | 2 + static/doc/geneweb/Geneweb__Update/.dune-keep | 0 static/doc/geneweb/Geneweb__Update/index.html | 2 + .../geneweb/Geneweb__UpdateData/.dune-keep | 0 .../geneweb/Geneweb__UpdateData/index.html | 2 + .../Geneweb__UpdateDataDisplay/.dune-keep | 0 .../Geneweb__UpdateDataDisplay/index.html | 2 + .../doc/geneweb/Geneweb__UpdateFam/.dune-keep | 0 .../doc/geneweb/Geneweb__UpdateFam/index.html | 2 + .../geneweb/Geneweb__UpdateFamOk/.dune-keep | 0 .../geneweb/Geneweb__UpdateFamOk/index.html | 2 + .../doc/geneweb/Geneweb__UpdateInd/.dune-keep | 0 .../doc/geneweb/Geneweb__UpdateInd/index.html | 2 + .../geneweb/Geneweb__UpdateIndOk/.dune-keep | 0 .../geneweb/Geneweb__UpdateIndOk/index.html | 2 + static/doc/geneweb/Geneweb__Util/.dune-keep | 0 static/doc/geneweb/Geneweb__Util/index.html | 2 + .../doc/geneweb/Geneweb__Version/.dune-keep | 0 .../doc/geneweb/Geneweb__Version/index.html | 2 + static/doc/geneweb/Geneweb__Wiki/.dune-keep | 0 static/doc/geneweb/Geneweb__Wiki/index.html | 2 + .../Geneweb__WiznotesDisplay/.dune-keep | 0 .../Geneweb__WiznotesDisplay/index.html | 2 + static/doc/geneweb/Geneweb_export/.dune-keep | 0 .../Make/argument-1-D/index.html | 2 + .../Json_converter/Make/index.html | 2 + .../Geneweb_export/Json_converter/index.html | 2 + .../module-type-ConverterDriver/index.html | 2 + static/doc/geneweb/Geneweb_export/index.html | 2 + .../Geneweb_export__Json_converter/.dune-keep | 0 .../Geneweb_export__Json_converter/index.html | 2 + static/doc/geneweb/Gutil/.dune-keep | 0 static/doc/geneweb/Gutil/index.html | 2 + static/doc/geneweb/Gwb2gedLib/.dune-keep | 0 static/doc/geneweb/Gwb2gedLib/index.html | 2 + static/doc/geneweb/Gwd_lib/.dune-keep | 0 static/doc/geneweb/Gwd_lib/GwdLog/index.html | 2 + .../doc/geneweb/Gwd_lib/GwdPlugin/index.html | 2 + static/doc/geneweb/Gwd_lib/Request/index.html | 2 + static/doc/geneweb/Gwd_lib/index.html | 2 + static/doc/geneweb/Gwd_lib__GwdLog/.dune-keep | 0 static/doc/geneweb/Gwd_lib__GwdLog/index.html | 2 + .../doc/geneweb/Gwd_lib__GwdPlugin/.dune-keep | 0 .../doc/geneweb/Gwd_lib__GwdPlugin/index.html | 2 + .../doc/geneweb/Gwd_lib__Request/.dune-keep | 0 .../doc/geneweb/Gwd_lib__Request/index.html | 2 + static/doc/geneweb/Gwdb/.dune-keep | 0 static/doc/geneweb/Gwdb/index.html | 2 + static/doc/geneweb/Gwdb_driver/.dune-keep | 0 .../geneweb/Gwdb_driver/Collection/index.html | 2 + .../doc/geneweb/Gwdb_driver/Marker/index.html | 2 + static/doc/geneweb/Gwdb_driver/index.html | 2 + static/doc/geneweb/Gwexport/.dune-keep | 0 static/doc/geneweb/Gwexport/index.html | 2 + static/doc/geneweb/GwuLib/.dune-keep | 0 static/doc/geneweb/GwuLib/index.html | 2 + static/doc/geneweb/Lock/.dune-keep | 0 static/doc/geneweb/Lock/index.html | 2 + static/doc/geneweb/Mutil/.dune-keep | 0 static/doc/geneweb/Mutil/index.html | 3 + static/doc/geneweb/Name/.dune-keep | 0 static/doc/geneweb/Name/index.html | 2 + static/doc/geneweb/Opt/.dune-keep | 0 static/doc/geneweb/Opt/index.html | 2 + .../doc/geneweb/Plugin_gwxjg_lib/.dune-keep | 0 .../Gwxjg_data/Yojson_write/index.html | 2 + .../Plugin_gwxjg_lib/Gwxjg_data/index.html | 2 + .../Gwxjg_ezgw/Event/index.html | 2 + .../Gwxjg_ezgw/Family/index.html | 2 + .../Gwxjg_ezgw/Person/index.html | 2 + .../Plugin_gwxjg_lib/Gwxjg_ezgw/index.html | 2 + .../Gwxjg_lexicon_parser/index.html | 2 + .../Plugin_gwxjg_lib/Gwxjg_trans/index.html | 14 + .../doc/geneweb/Plugin_gwxjg_lib/index.html | 2 + .../Plugin_gwxjg_lib__Gwxjg_data/.dune-keep | 0 .../Plugin_gwxjg_lib__Gwxjg_data/index.html | 2 + .../Plugin_gwxjg_lib__Gwxjg_ezgw/.dune-keep | 0 .../Plugin_gwxjg_lib__Gwxjg_ezgw/index.html | 2 + .../.dune-keep | 0 .../index.html | 2 + .../Plugin_gwxjg_lib__Gwxjg_trans/.dune-keep | 0 .../Plugin_gwxjg_lib__Gwxjg_trans/index.html | 2 + static/doc/geneweb/Pqueue/.dune-keep | 0 .../Pqueue/Make/argument-1-Ord/index.html | 2 + static/doc/geneweb/Pqueue/Make/index.html | 2 + static/doc/geneweb/Pqueue/index.html | 2 + .../Pqueue/module-type-OrderedType/index.html | 2 + .../geneweb/Pqueue/module-type-S/index.html | 2 + static/doc/geneweb/ProgrBar/.dune-keep | 0 static/doc/geneweb/ProgrBar/index.html | 2 + static/doc/geneweb/Secure/.dune-keep | 0 static/doc/geneweb/Secure/index.html | 2 + static/doc/geneweb/Sosa/.dune-keep | 0 static/doc/geneweb/Sosa/index.html | 2 + static/doc/geneweb/Utf8/.dune-keep | 0 static/doc/geneweb/Utf8/index.html | 2 + static/doc/geneweb/Wserver/.dune-keep | 0 static/doc/geneweb/Wserver/index.html | 2 + static/doc/geneweb/index.html | 2 + static/doc/highlight.pack.js | 2 + static/doc/index.html | 19 + static/doc/odoc.css | 782 ++ static/html/.buildinfo | 4 + static/html/_images/diagram.png | Bin 0 -> 118635 bytes .../_sources/dev-doc/binaries/bench.md.txt | 5 + .../html/_sources/dev-doc/binaries/cgl.md.txt | 4 + .../_sources/dev-doc/binaries/connex.md.txt | 23 + .../_sources/dev-doc/binaries/consang.md.txt | 19 + .../_sources/dev-doc/binaries/export.md.txt | 4 + .../dev-doc/binaries/fixbase_plugin.md.txt | 4 + .../_sources/dev-doc/binaries/forum.md.txt | 5 + .../_sources/dev-doc/binaries/ged2gwb.md.txt | 48 + .../_sources/dev-doc/binaries/gwb2ged.md.txt | 29 + .../html/_sources/dev-doc/binaries/gwc.md.txt | 30 + .../html/_sources/dev-doc/binaries/gwd.md.txt | 318 + .../_sources/dev-doc/binaries/gwdiff.md.txt | 17 + .../dev-doc/binaries/gwfixbase.md.txt | 29 + .../_sources/dev-doc/binaries/gwgc.md.txt | 11 + .../_sources/dev-doc/binaries/gwrepl.md.txt | 12 + .../html/_sources/dev-doc/binaries/gwu.md.txt | 41 + .../_sources/dev-doc/binaries/gwxjg.md.txt | 5 + .../_sources/dev-doc/binaries/index.rst.txt | 9 + .../_sources/dev-doc/binaries/jingoo.md.txt | 3 + .../_sources/dev-doc/binaries/lib_show.md.txt | 3 + .../_sources/dev-doc/binaries/no_index.md.txt | 1 + .../binaries/official_binaries.rst.txt | 24 + .../_sources/dev-doc/binaries/plugins.rst.txt | 22 + .../_sources/dev-doc/binaries/setup.md.txt | 15 + .../_sources/dev-doc/binaries/test.md.txt | 38 + .../_sources/dev-doc/binaries/tests.rst.txt | 9 + .../dev-doc/binaries/update_nldb.md.txt | 1 + .../html/_sources/dev-doc/binaries/v7.md.txt | 4 + .../_sources/dev-doc/binaries/v7_im.md.txt | 4 + .../_sources/dev-doc/binaries/welcome.md.txt | 4 + .../_sources/dev-doc/binaries/xhtml.md.txt | 3 + .../_sources/dev-doc/geneweb-lib/index.md.txt | 112 + static/html/_sources/dev-doc/index.rst.txt | 23 + .../dev-doc/installation/build-system.md.txt | 1 + .../dev-doc/installation/index.md.txt | 824 ++ .../_sources/dev-doc/overview/database.md.txt | 146 + .../_sources/dev-doc/overview/index.rst.txt | 167 + static/html/_sources/index.rst.txt | 38 + static/html/_static/alabaster.css | 701 + static/html/_static/basic.css | 856 ++ static/html/_static/custom.css | 1 + static/html/_static/doctools.js | 321 + static/html/_static/documentation_options.js | 12 + static/html/_static/file.png | Bin 0 -> 286 bytes static/html/_static/jquery-3.5.1.js | 10872 ++++++++++++++++ static/html/_static/jquery.js | 2 + static/html/_static/language_data.js | 297 + static/html/_static/minus.png | Bin 0 -> 90 bytes static/html/_static/plus.png | Bin 0 -> 90 bytes static/html/_static/pygments.css | 77 + static/html/_static/searchtools.js | 522 + static/html/_static/underscore-1.12.0.js | 2027 +++ static/html/_static/underscore.js | 6 + static/html/dev-doc/binaries/bench.html | 124 + static/html/dev-doc/binaries/cgl.html | 127 + static/html/dev-doc/binaries/connex.html | 148 + static/html/dev-doc/binaries/consang.html | 142 + static/html/dev-doc/binaries/export.html | 128 + .../html/dev-doc/binaries/fixbase_plugin.html | 124 + static/html/dev-doc/binaries/forum.html | 129 + static/html/dev-doc/binaries/ged2gwb.html | 163 + static/html/dev-doc/binaries/gwb2ged.html | 154 + static/html/dev-doc/binaries/gwc.html | 156 + static/html/dev-doc/binaries/gwd.html | 363 + static/html/dev-doc/binaries/gwdiff.html | 142 + static/html/dev-doc/binaries/gwfixbase.html | 145 + static/html/dev-doc/binaries/gwgc.html | 137 + static/html/dev-doc/binaries/gwrepl.html | 137 + static/html/dev-doc/binaries/gwu.html | 156 + static/html/dev-doc/binaries/gwxjg.html | 128 + static/html/dev-doc/binaries/index.html | 163 + static/html/dev-doc/binaries/jingoo.html | 123 + static/html/dev-doc/binaries/lib_show.html | 123 + static/html/dev-doc/binaries/no_index.html | 122 + .../dev-doc/binaries/official_binaries.html | 189 + static/html/dev-doc/binaries/plugins.html | 144 + static/html/dev-doc/binaries/setup.html | 134 + static/html/dev-doc/binaries/test.html | 156 + static/html/dev-doc/binaries/tests.html | 126 + static/html/dev-doc/binaries/update_nldb.html | 122 + static/html/dev-doc/binaries/v7.html | 128 + static/html/dev-doc/binaries/v7_im.html | 128 + static/html/dev-doc/binaries/welcome.html | 128 + static/html/dev-doc/binaries/xhtml.html | 122 + static/html/dev-doc/index.html | 151 + .../dev-doc/installation/build-system.html | 102 + static/html/dev-doc/installation/index.html | 1211 ++ static/html/dev-doc/overview/database.html | 267 + static/html/dev-doc/overview/index.html | 263 + static/html/genindex.html | 104 + static/html/objects.inv | Bin 0 -> 1054 bytes static/html/search.html | 114 + static/html/searchindex.js | 1 + 417 files changed, 25744 insertions(+), 1 deletion(-) create mode 100644 static/doc/geneweb/Adef/.dune-keep create mode 100644 static/doc/geneweb/Adef/index.html create mode 100644 static/doc/geneweb/Buff/.dune-keep create mode 100644 static/doc/geneweb/Buff/Make/index.html create mode 100644 static/doc/geneweb/Buff/index.html create mode 100644 static/doc/geneweb/Calendar/.dune-keep create mode 100644 static/doc/geneweb/Calendar/index.html create mode 100644 static/doc/geneweb/Consang/.dune-keep create mode 100644 static/doc/geneweb/Consang/index.html create mode 100644 static/doc/geneweb/ConsangAll/.dune-keep create mode 100644 static/doc/geneweb/ConsangAll/index.html create mode 100644 static/doc/geneweb/Date/.dune-keep create mode 100644 static/doc/geneweb/Date/index.html create mode 100644 static/doc/geneweb/Def/.dune-keep create mode 100644 static/doc/geneweb/Def/NLDB/index.html create mode 100644 static/doc/geneweb/Def/index.html create mode 100644 static/doc/geneweb/Def_show/.dune-keep create mode 100644 static/doc/geneweb/Def_show/index.html create mode 100644 static/doc/geneweb/Futil/.dune-keep create mode 100644 static/doc/geneweb/Futil/index.html create mode 100644 static/doc/geneweb/Geneweb/.dune-keep create mode 100644 static/doc/geneweb/Geneweb/AdvSearchOk/index.html create mode 100644 static/doc/geneweb/Geneweb/AdvSearchOkDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb/Alln/index.html create mode 100644 static/doc/geneweb/Geneweb/AllnDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb/Ansel/index.html create mode 100644 static/doc/geneweb/Geneweb/Base64/index.html create mode 100644 static/doc/geneweb/Geneweb/BirthDeath/index.html create mode 100644 static/doc/geneweb/Geneweb/BirthDeathDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb/BirthdayDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb/ChangeChildren/index.html create mode 100644 static/doc/geneweb/Geneweb/ChangeChildrenDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb/Check/index.html create mode 100644 static/doc/geneweb/Geneweb/CheckItem/index.html create mode 100644 static/doc/geneweb/Geneweb/Config/index.html create mode 100644 static/doc/geneweb/Geneweb/Cousins/index.html create mode 100644 static/doc/geneweb/Geneweb/CousinsDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb/Dag/Pset/index.html create mode 100644 static/doc/geneweb/Geneweb/Dag/index.html create mode 100644 static/doc/geneweb/Geneweb/Dag2html/index.html create mode 100644 static/doc/geneweb/Geneweb/DagDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb/DateDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb/DescendDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb/Difference/index.html create mode 100644 static/doc/geneweb/Geneweb/Fixbase/index.html create mode 100644 static/doc/geneweb/Geneweb/GWPARAM/index.html create mode 100644 static/doc/geneweb/Geneweb/GWPARAM_ITL/index.html create mode 100644 static/doc/geneweb/Geneweb/Gwlib/index.html create mode 100644 static/doc/geneweb/Geneweb/History/index.html create mode 100644 static/doc/geneweb/Geneweb/HistoryDiff/index.html create mode 100644 static/doc/geneweb/Geneweb/HistoryDiffDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb/Hutil/index.html create mode 100644 static/doc/geneweb/Geneweb/ImageDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb/MergeDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb/MergeDupDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb/MergeFamDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb/MergeFamOk/index.html create mode 100644 static/doc/geneweb/Geneweb/MergeInd/index.html create mode 100644 static/doc/geneweb/Geneweb/MergeIndDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb/MergeIndOk/index.html create mode 100644 static/doc/geneweb/Geneweb/MergeIndOkDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb/Notes/index.html create mode 100644 static/doc/geneweb/Geneweb/NotesDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb/NotesLinks/index.html create mode 100644 static/doc/geneweb/Geneweb/Output/index.html create mode 100644 static/doc/geneweb/Geneweb/Perso/index.html create mode 100644 static/doc/geneweb/Geneweb/Place/index.html create mode 100644 static/doc/geneweb/Geneweb/PlaceDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb/Relation/index.html create mode 100644 static/doc/geneweb/Geneweb/RelationDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb/RelationLink/index.html create mode 100644 static/doc/geneweb/Geneweb/SearchName/index.html create mode 100644 static/doc/geneweb/Geneweb/Some/index.html create mode 100644 static/doc/geneweb/Geneweb/SrcfileDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb/Stats/index.html create mode 100644 static/doc/geneweb/Geneweb/Templ/index.html create mode 100644 static/doc/geneweb/Geneweb/TemplAst/index.html create mode 100644 static/doc/geneweb/Geneweb/TemplDate/index.html create mode 100644 static/doc/geneweb/Geneweb/Templ_parser/index.html create mode 100644 static/doc/geneweb/Geneweb/Title/index.html create mode 100644 static/doc/geneweb/Geneweb/TitleDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb/Translate/index.html create mode 100644 static/doc/geneweb/Geneweb/Update/index.html create mode 100644 static/doc/geneweb/Geneweb/UpdateData/IstrSet/index.html create mode 100644 static/doc/geneweb/Geneweb/UpdateData/PersMap/index.html create mode 100644 static/doc/geneweb/Geneweb/UpdateData/PersSet/index.html create mode 100644 static/doc/geneweb/Geneweb/UpdateData/StringSet/index.html create mode 100644 static/doc/geneweb/Geneweb/UpdateData/index.html create mode 100644 static/doc/geneweb/Geneweb/UpdateDataDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb/UpdateFam/index.html create mode 100644 static/doc/geneweb/Geneweb/UpdateFamOk/index.html create mode 100644 static/doc/geneweb/Geneweb/UpdateInd/index.html create mode 100644 static/doc/geneweb/Geneweb/UpdateIndOk/index.html create mode 100644 static/doc/geneweb/Geneweb/Util/IfamSet/index.html create mode 100644 static/doc/geneweb/Geneweb/Util/IperSet/index.html create mode 100644 static/doc/geneweb/Geneweb/Util/index.html create mode 100644 static/doc/geneweb/Geneweb/Version/index.html create mode 100644 static/doc/geneweb/Geneweb/Wiki/index.html create mode 100644 static/doc/geneweb/Geneweb/WiznotesDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb/index.html create mode 100644 static/doc/geneweb/Geneweb__AdvSearchOk/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__AdvSearchOk/index.html create mode 100644 static/doc/geneweb/Geneweb__AdvSearchOkDisplay/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__AdvSearchOkDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb__Alln/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__Alln/index.html create mode 100644 static/doc/geneweb/Geneweb__AllnDisplay/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__AllnDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb__Ansel/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__Ansel/index.html create mode 100644 static/doc/geneweb/Geneweb__Base64/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__Base64/index.html create mode 100644 static/doc/geneweb/Geneweb__BirthDeath/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__BirthDeath/index.html create mode 100644 static/doc/geneweb/Geneweb__BirthDeathDisplay/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__BirthDeathDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb__BirthdayDisplay/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__BirthdayDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb__ChangeChildren/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__ChangeChildren/index.html create mode 100644 static/doc/geneweb/Geneweb__ChangeChildrenDisplay/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__ChangeChildrenDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb__Check/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__Check/index.html create mode 100644 static/doc/geneweb/Geneweb__CheckItem/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__CheckItem/index.html create mode 100644 static/doc/geneweb/Geneweb__Config/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__Config/index.html create mode 100644 static/doc/geneweb/Geneweb__Cousins/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__Cousins/index.html create mode 100644 static/doc/geneweb/Geneweb__CousinsDisplay/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__CousinsDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb__Dag/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__Dag/index.html create mode 100644 static/doc/geneweb/Geneweb__Dag2html/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__Dag2html/index.html create mode 100644 static/doc/geneweb/Geneweb__DagDisplay/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__DagDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb__DateDisplay/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__DateDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb__DescendDisplay/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__DescendDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb__Difference/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__Difference/index.html create mode 100644 static/doc/geneweb/Geneweb__Fixbase/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__Fixbase/index.html create mode 100644 static/doc/geneweb/Geneweb__GWPARAM/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__GWPARAM/index.html create mode 100644 static/doc/geneweb/Geneweb__GWPARAM_ITL/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__GWPARAM_ITL/index.html create mode 100644 static/doc/geneweb/Geneweb__Gwlib/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__Gwlib/index.html create mode 100644 static/doc/geneweb/Geneweb__History/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__History/index.html create mode 100644 static/doc/geneweb/Geneweb__HistoryDiff/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__HistoryDiff/index.html create mode 100644 static/doc/geneweb/Geneweb__HistoryDiffDisplay/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__HistoryDiffDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb__Hutil/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__Hutil/index.html create mode 100644 static/doc/geneweb/Geneweb__ImageDisplay/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__ImageDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb__MergeDisplay/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__MergeDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb__MergeDupDisplay/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__MergeDupDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb__MergeFamDisplay/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__MergeFamDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb__MergeFamOk/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__MergeFamOk/index.html create mode 100644 static/doc/geneweb/Geneweb__MergeInd/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__MergeInd/index.html create mode 100644 static/doc/geneweb/Geneweb__MergeIndDisplay/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__MergeIndDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb__MergeIndOk/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__MergeIndOk/index.html create mode 100644 static/doc/geneweb/Geneweb__MergeIndOkDisplay/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__MergeIndOkDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb__Notes/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__Notes/index.html create mode 100644 static/doc/geneweb/Geneweb__NotesDisplay/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__NotesDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb__NotesLinks/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__NotesLinks/index.html create mode 100644 static/doc/geneweb/Geneweb__Output/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__Output/index.html create mode 100644 static/doc/geneweb/Geneweb__Perso/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__Perso/index.html create mode 100644 static/doc/geneweb/Geneweb__Place/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__Place/index.html create mode 100644 static/doc/geneweb/Geneweb__PlaceDisplay/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__PlaceDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb__Relation/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__Relation/index.html create mode 100644 static/doc/geneweb/Geneweb__RelationDisplay/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__RelationDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb__RelationLink/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__RelationLink/index.html create mode 100644 static/doc/geneweb/Geneweb__SearchName/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__SearchName/index.html create mode 100644 static/doc/geneweb/Geneweb__Some/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__Some/index.html create mode 100644 static/doc/geneweb/Geneweb__SrcfileDisplay/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__SrcfileDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb__Stats/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__Stats/index.html create mode 100644 static/doc/geneweb/Geneweb__Templ/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__Templ/index.html create mode 100644 static/doc/geneweb/Geneweb__TemplAst/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__TemplAst/index.html create mode 100644 static/doc/geneweb/Geneweb__TemplDate/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__TemplDate/index.html create mode 100644 static/doc/geneweb/Geneweb__Templ_parser/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__Templ_parser/index.html create mode 100644 static/doc/geneweb/Geneweb__Title/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__Title/index.html create mode 100644 static/doc/geneweb/Geneweb__TitleDisplay/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__TitleDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb__Translate/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__Translate/index.html create mode 100644 static/doc/geneweb/Geneweb__Update/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__Update/index.html create mode 100644 static/doc/geneweb/Geneweb__UpdateData/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__UpdateData/index.html create mode 100644 static/doc/geneweb/Geneweb__UpdateDataDisplay/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__UpdateDataDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb__UpdateFam/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__UpdateFam/index.html create mode 100644 static/doc/geneweb/Geneweb__UpdateFamOk/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__UpdateFamOk/index.html create mode 100644 static/doc/geneweb/Geneweb__UpdateInd/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__UpdateInd/index.html create mode 100644 static/doc/geneweb/Geneweb__UpdateIndOk/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__UpdateIndOk/index.html create mode 100644 static/doc/geneweb/Geneweb__Util/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__Util/index.html create mode 100644 static/doc/geneweb/Geneweb__Version/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__Version/index.html create mode 100644 static/doc/geneweb/Geneweb__Wiki/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__Wiki/index.html create mode 100644 static/doc/geneweb/Geneweb__WiznotesDisplay/.dune-keep create mode 100644 static/doc/geneweb/Geneweb__WiznotesDisplay/index.html create mode 100644 static/doc/geneweb/Geneweb_export/.dune-keep create mode 100644 static/doc/geneweb/Geneweb_export/Json_converter/Make/argument-1-D/index.html create mode 100644 static/doc/geneweb/Geneweb_export/Json_converter/Make/index.html create mode 100644 static/doc/geneweb/Geneweb_export/Json_converter/index.html create mode 100644 static/doc/geneweb/Geneweb_export/Json_converter/module-type-ConverterDriver/index.html create mode 100644 static/doc/geneweb/Geneweb_export/index.html create mode 100644 static/doc/geneweb/Geneweb_export__Json_converter/.dune-keep create mode 100644 static/doc/geneweb/Geneweb_export__Json_converter/index.html create mode 100644 static/doc/geneweb/Gutil/.dune-keep create mode 100644 static/doc/geneweb/Gutil/index.html create mode 100644 static/doc/geneweb/Gwb2gedLib/.dune-keep create mode 100644 static/doc/geneweb/Gwb2gedLib/index.html create mode 100644 static/doc/geneweb/Gwd_lib/.dune-keep create mode 100644 static/doc/geneweb/Gwd_lib/GwdLog/index.html create mode 100644 static/doc/geneweb/Gwd_lib/GwdPlugin/index.html create mode 100644 static/doc/geneweb/Gwd_lib/Request/index.html create mode 100644 static/doc/geneweb/Gwd_lib/index.html create mode 100644 static/doc/geneweb/Gwd_lib__GwdLog/.dune-keep create mode 100644 static/doc/geneweb/Gwd_lib__GwdLog/index.html create mode 100644 static/doc/geneweb/Gwd_lib__GwdPlugin/.dune-keep create mode 100644 static/doc/geneweb/Gwd_lib__GwdPlugin/index.html create mode 100644 static/doc/geneweb/Gwd_lib__Request/.dune-keep create mode 100644 static/doc/geneweb/Gwd_lib__Request/index.html create mode 100644 static/doc/geneweb/Gwdb/.dune-keep create mode 100644 static/doc/geneweb/Gwdb/index.html create mode 100644 static/doc/geneweb/Gwdb_driver/.dune-keep create mode 100644 static/doc/geneweb/Gwdb_driver/Collection/index.html create mode 100644 static/doc/geneweb/Gwdb_driver/Marker/index.html create mode 100644 static/doc/geneweb/Gwdb_driver/index.html create mode 100644 static/doc/geneweb/Gwexport/.dune-keep create mode 100644 static/doc/geneweb/Gwexport/index.html create mode 100644 static/doc/geneweb/GwuLib/.dune-keep create mode 100644 static/doc/geneweb/GwuLib/index.html create mode 100644 static/doc/geneweb/Lock/.dune-keep create mode 100644 static/doc/geneweb/Lock/index.html create mode 100644 static/doc/geneweb/Mutil/.dune-keep create mode 100644 static/doc/geneweb/Mutil/index.html create mode 100644 static/doc/geneweb/Name/.dune-keep create mode 100644 static/doc/geneweb/Name/index.html create mode 100644 static/doc/geneweb/Opt/.dune-keep create mode 100644 static/doc/geneweb/Opt/index.html create mode 100644 static/doc/geneweb/Plugin_gwxjg_lib/.dune-keep create mode 100644 static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_data/Yojson_write/index.html create mode 100644 static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_data/index.html create mode 100644 static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_ezgw/Event/index.html create mode 100644 static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_ezgw/Family/index.html create mode 100644 static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_ezgw/Person/index.html create mode 100644 static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_ezgw/index.html create mode 100644 static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_lexicon_parser/index.html create mode 100644 static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_trans/index.html create mode 100644 static/doc/geneweb/Plugin_gwxjg_lib/index.html create mode 100644 static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_data/.dune-keep create mode 100644 static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_data/index.html create mode 100644 static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_ezgw/.dune-keep create mode 100644 static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_ezgw/index.html create mode 100644 static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_lexicon_parser/.dune-keep create mode 100644 static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_lexicon_parser/index.html create mode 100644 static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_trans/.dune-keep create mode 100644 static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_trans/index.html create mode 100644 static/doc/geneweb/Pqueue/.dune-keep create mode 100644 static/doc/geneweb/Pqueue/Make/argument-1-Ord/index.html create mode 100644 static/doc/geneweb/Pqueue/Make/index.html create mode 100644 static/doc/geneweb/Pqueue/index.html create mode 100644 static/doc/geneweb/Pqueue/module-type-OrderedType/index.html create mode 100644 static/doc/geneweb/Pqueue/module-type-S/index.html create mode 100644 static/doc/geneweb/ProgrBar/.dune-keep create mode 100644 static/doc/geneweb/ProgrBar/index.html create mode 100644 static/doc/geneweb/Secure/.dune-keep create mode 100644 static/doc/geneweb/Secure/index.html create mode 100644 static/doc/geneweb/Sosa/.dune-keep create mode 100644 static/doc/geneweb/Sosa/index.html create mode 100644 static/doc/geneweb/Utf8/.dune-keep create mode 100644 static/doc/geneweb/Utf8/index.html create mode 100644 static/doc/geneweb/Wserver/.dune-keep create mode 100644 static/doc/geneweb/Wserver/index.html create mode 100644 static/doc/geneweb/index.html create mode 100644 static/doc/highlight.pack.js create mode 100644 static/doc/index.html create mode 100644 static/doc/odoc.css create mode 100644 static/html/.buildinfo create mode 100644 static/html/_images/diagram.png create mode 100644 static/html/_sources/dev-doc/binaries/bench.md.txt create mode 100644 static/html/_sources/dev-doc/binaries/cgl.md.txt create mode 100644 static/html/_sources/dev-doc/binaries/connex.md.txt create mode 100644 static/html/_sources/dev-doc/binaries/consang.md.txt create mode 100644 static/html/_sources/dev-doc/binaries/export.md.txt create mode 100644 static/html/_sources/dev-doc/binaries/fixbase_plugin.md.txt create mode 100644 static/html/_sources/dev-doc/binaries/forum.md.txt create mode 100644 static/html/_sources/dev-doc/binaries/ged2gwb.md.txt create mode 100644 static/html/_sources/dev-doc/binaries/gwb2ged.md.txt create mode 100644 static/html/_sources/dev-doc/binaries/gwc.md.txt create mode 100644 static/html/_sources/dev-doc/binaries/gwd.md.txt create mode 100644 static/html/_sources/dev-doc/binaries/gwdiff.md.txt create mode 100644 static/html/_sources/dev-doc/binaries/gwfixbase.md.txt create mode 100644 static/html/_sources/dev-doc/binaries/gwgc.md.txt create mode 100644 static/html/_sources/dev-doc/binaries/gwrepl.md.txt create mode 100644 static/html/_sources/dev-doc/binaries/gwu.md.txt create mode 100644 static/html/_sources/dev-doc/binaries/gwxjg.md.txt create mode 100644 static/html/_sources/dev-doc/binaries/index.rst.txt create mode 100644 static/html/_sources/dev-doc/binaries/jingoo.md.txt create mode 100644 static/html/_sources/dev-doc/binaries/lib_show.md.txt create mode 100644 static/html/_sources/dev-doc/binaries/no_index.md.txt create mode 100644 static/html/_sources/dev-doc/binaries/official_binaries.rst.txt create mode 100644 static/html/_sources/dev-doc/binaries/plugins.rst.txt create mode 100644 static/html/_sources/dev-doc/binaries/setup.md.txt create mode 100644 static/html/_sources/dev-doc/binaries/test.md.txt create mode 100644 static/html/_sources/dev-doc/binaries/tests.rst.txt create mode 100644 static/html/_sources/dev-doc/binaries/update_nldb.md.txt create mode 100644 static/html/_sources/dev-doc/binaries/v7.md.txt create mode 100644 static/html/_sources/dev-doc/binaries/v7_im.md.txt create mode 100644 static/html/_sources/dev-doc/binaries/welcome.md.txt create mode 100644 static/html/_sources/dev-doc/binaries/xhtml.md.txt create mode 100644 static/html/_sources/dev-doc/geneweb-lib/index.md.txt create mode 100644 static/html/_sources/dev-doc/index.rst.txt create mode 100644 static/html/_sources/dev-doc/installation/build-system.md.txt create mode 100644 static/html/_sources/dev-doc/installation/index.md.txt create mode 100644 static/html/_sources/dev-doc/overview/database.md.txt create mode 100644 static/html/_sources/dev-doc/overview/index.rst.txt create mode 100644 static/html/_sources/index.rst.txt create mode 100644 static/html/_static/alabaster.css create mode 100644 static/html/_static/basic.css create mode 100644 static/html/_static/custom.css create mode 100644 static/html/_static/doctools.js create mode 100644 static/html/_static/documentation_options.js create mode 100644 static/html/_static/file.png create mode 100644 static/html/_static/jquery-3.5.1.js create mode 100644 static/html/_static/jquery.js create mode 100644 static/html/_static/language_data.js create mode 100644 static/html/_static/minus.png create mode 100644 static/html/_static/plus.png create mode 100644 static/html/_static/pygments.css create mode 100644 static/html/_static/searchtools.js create mode 100644 static/html/_static/underscore-1.12.0.js create mode 100644 static/html/_static/underscore.js create mode 100644 static/html/dev-doc/binaries/bench.html create mode 100644 static/html/dev-doc/binaries/cgl.html create mode 100644 static/html/dev-doc/binaries/connex.html create mode 100644 static/html/dev-doc/binaries/consang.html create mode 100644 static/html/dev-doc/binaries/export.html create mode 100644 static/html/dev-doc/binaries/fixbase_plugin.html create mode 100644 static/html/dev-doc/binaries/forum.html create mode 100644 static/html/dev-doc/binaries/ged2gwb.html create mode 100644 static/html/dev-doc/binaries/gwb2ged.html create mode 100644 static/html/dev-doc/binaries/gwc.html create mode 100644 static/html/dev-doc/binaries/gwd.html create mode 100644 static/html/dev-doc/binaries/gwdiff.html create mode 100644 static/html/dev-doc/binaries/gwfixbase.html create mode 100644 static/html/dev-doc/binaries/gwgc.html create mode 100644 static/html/dev-doc/binaries/gwrepl.html create mode 100644 static/html/dev-doc/binaries/gwu.html create mode 100644 static/html/dev-doc/binaries/gwxjg.html create mode 100644 static/html/dev-doc/binaries/index.html create mode 100644 static/html/dev-doc/binaries/jingoo.html create mode 100644 static/html/dev-doc/binaries/lib_show.html create mode 100644 static/html/dev-doc/binaries/no_index.html create mode 100644 static/html/dev-doc/binaries/official_binaries.html create mode 100644 static/html/dev-doc/binaries/plugins.html create mode 100644 static/html/dev-doc/binaries/setup.html create mode 100644 static/html/dev-doc/binaries/test.html create mode 100644 static/html/dev-doc/binaries/tests.html create mode 100644 static/html/dev-doc/binaries/update_nldb.html create mode 100644 static/html/dev-doc/binaries/v7.html create mode 100644 static/html/dev-doc/binaries/v7_im.html create mode 100644 static/html/dev-doc/binaries/welcome.html create mode 100644 static/html/dev-doc/binaries/xhtml.html create mode 100644 static/html/dev-doc/index.html create mode 100644 static/html/dev-doc/installation/build-system.html create mode 100644 static/html/dev-doc/installation/index.html create mode 100644 static/html/dev-doc/overview/database.html create mode 100644 static/html/dev-doc/overview/index.html create mode 100644 static/html/genindex.html create mode 100644 static/html/objects.inv create mode 100644 static/html/search.html create mode 100644 static/html/searchindex.js diff --git a/Makefile b/Makefile index 944b5a1db7..adb713c9a7 100644 --- a/Makefile +++ b/Makefile @@ -13,8 +13,10 @@ endif # Variables for packagers. PREFIX=/usr DISTRIB_DIR=distribution - BUILD_DIR=_build/default +ODOC_DIR=$(BUILD_DIR)/_doc/_html + +DOC_DIR=static ###### [BEGIN] Generated files section @@ -174,8 +176,17 @@ distrib: build doc: | $(GENERATED_FILES_DEP) dune build @doc + if [ ! -d $(DOC_DIR)/doc ] ; then \ + mkdir -p $(DOC_DIR)/doc ; \ + cp -r $(ODOC_DIR)/* $(DOC_DIR)/doc ; \ + fi .PHONY: doc +opendoc : doc + xdg-open $(DOC_DIR)/html/dev-doc/index.html +.PHONY: opendoc + + test: | $(GENERATED_FILES_DEP) dune build @runtest .PHONY: test @@ -202,6 +213,7 @@ clean: @echo -n "Cleaning..." @$(RM) $(GENERATED_FILES_DEP) lib/*_piqi*.ml @$(RM) -r $(DISTRIB_DIR) + @$(RM) -r $(DOC_DIR)/doc @dune clean @echo " Done!" .PHONY: clean diff --git a/static/doc/geneweb/Adef/.dune-keep b/static/doc/geneweb/Adef/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Adef/index.html b/static/doc/geneweb/Adef/index.html new file mode 100644 index 0000000000..f0758b6d14 --- /dev/null +++ b/static/doc/geneweb/Adef/index.html @@ -0,0 +1,2 @@ +<!DOCTYPE html> +<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Adef (geneweb.Adef)

      Module Adef

      type fix

      Consanguinity rate

      val float_of_fix : fix -> float

      Returns float coefficient of consanguinity rate

      val fix_of_float : float -> fix

      Returns consanguinity rate from its float coefficient

      val fix : int -> fix

      fix from int

      val fix_repr : fix -> int

      fix to int

      val no_consang : fix

      No consanguinity

      type date =
      | Dgreg of dmy * calendar
      | Dtext of string

      Date data type that can be either concrete date associated to a calendar or a textual form of the date.

      and calendar =
      | Dgregorian
      | Djulian
      | Dfrench
      | Dhebrew

      Supported calendars

      and dmy = {
      day : int;
      month : int;
      year : int;
      prec : precision;
      delta : int;
      }

      Concrete date with precision.

      and dmy2 = {
      day2 : int;
      month2 : int;
      year2 : int;
      delta2 : int;
      }

      Concrete date without precision.

      and precision =
      | Sure
      | About
      | Maybe
      | Before
      | After
      | OrYear of dmy2
      | YearInt of dmy2

      Precision attached to the concrete date.

      type cdate

      Compressed date

      val date_of_cdate : cdate -> date

      Convert cdate to date

      val cdate_of_date : date -> cdate

      Convert date to cdate

      val cdate_None : cdate

      Absent compressed date

      val od_of_cdate : cdate -> date option

      Optional date from cdate

      val cdate_of_od : date option -> cdate

      Optional date to cdate

      type 'person gen_couple

      Polymorphic type to represent a family's couple. Couple consists of the father and of the mother.

      val father : 'a gen_couple -> 'a

      Get father from couple

      val mother : 'a gen_couple -> 'a

      Get mother from couple

      val couple : 'a -> 'a -> 'a gen_couple

      couple f m creates a couple from father f and mother m

      val parent : 'a array -> 'a gen_couple

      Create gen_couple from array. First element of array should be father, second - mother

      val parent_array : 'a gen_couple -> 'a array

      Returns array from gen_couple. First element of array is father, second - mother

      val multi_couple : 'a -> 'a -> 'a gen_couple
      • deprecated

        Use couple instead

      val multi_parent : 'a array -> 'a gen_couple
      • deprecated

        Use parent instead

      \ No newline at end of file diff --git a/static/doc/geneweb/Buff/.dune-keep b/static/doc/geneweb/Buff/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Buff/Make/index.html b/static/doc/geneweb/Buff/Make/index.html new file mode 100644 index 0000000000..326b5c8c80 --- /dev/null +++ b/static/doc/geneweb/Buff/Make/index.html @@ -0,0 +1,2 @@ + +Make (geneweb.Buff.Make)

      Module Buff.Make

      Functor building a local implementation of the buffer.

      Parameters

      Signature

      val buff : bytes Stdlib.ref

      Internal representation of the buffer

      val store : int -> char -> int

      store i c stores a character c at the position i inside the buffer. Automatically extends buffer if needed. Returns the position that follows inserted character (i+1) in buffer. Should be used either with position 0 or with position returned by previous calls of store functions.

      val mstore : int -> string -> int

      mstore i s stores a string s starting from the postion i inside the buffer. Automatically extends buffer if needed. Returns the position that follows inserted string in buffer. Should be used either with position 0 or with position returned by previous calls of store functions.

      val gstore : int -> string -> int -> int -> int

      gstore i s si len stores substring of s from si position with length len inside the buffer starting from the postion i. Automatically extends buffer if needed. Returns the position that follows inserted substring in buffer. Should be used either with position 0 or with position returned by previous calls of store functions.

      val get : int -> string

      get len returns buffer's content until position len

      \ No newline at end of file diff --git a/static/doc/geneweb/Buff/index.html b/static/doc/geneweb/Buff/index.html new file mode 100644 index 0000000000..7ec14ff526 --- /dev/null +++ b/static/doc/geneweb/Buff/index.html @@ -0,0 +1,2 @@ + +Buff (geneweb.Buff)

      Module Buff

      module Make () : sig ... end

      Functor building a local implementation of the buffer.

      val buff : bytes Stdlib.ref

      Variable buff for the global buffer

      val get : int -> string

      Function get for the global buffer.

      val store : int -> char -> int

      Function store for the global buffer.

      val mstore : int -> string -> int

      Function mstore for the global buffer.

      val gstore : int -> string -> int -> int -> int

      Function gstore for the global buffer.

      \ No newline at end of file diff --git a/static/doc/geneweb/Calendar/.dune-keep b/static/doc/geneweb/Calendar/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Calendar/index.html b/static/doc/geneweb/Calendar/index.html new file mode 100644 index 0000000000..bd6e619b95 --- /dev/null +++ b/static/doc/geneweb/Calendar/index.html @@ -0,0 +1,2 @@ + +Calendar (geneweb.Calendar)

      Module Calendar

      val gregorian_of_sdn : Def.precision -> int -> Def.dmy

      Returns date of gregorian calendar from SDN and specified precision.

      val julian_of_sdn : Def.precision -> int -> Def.dmy

      Returns date of julian calendar from SDN and specified precision.

      val french_of_sdn : Def.precision -> int -> Def.dmy

      Returns date of french calendar from SDN and specified precision.

      val hebrew_of_sdn : Def.precision -> int -> Def.dmy

      Returns date of hebrew calendar from SDN and specified precision.

      val sdn_of_gregorian : Def.dmy -> int

      Returns SDN of the date of gregorian calendar.

      val sdn_of_julian : Def.dmy -> int

      Returns SDN of the date of julian calendar.

      val sdn_of_french : Def.dmy -> int

      Returns SDN of the date of french calendar.

      val sdn_of_hebrew : Def.dmy -> int

      Returns SDN of the date of hebrew calendar.

      val gregorian_of_julian : Def.dmy -> Def.dmy

      Converts julian calendar's date to gregorian.

      val julian_of_gregorian : Def.dmy -> Def.dmy

      Converts gregorian calendar's date to julian date.

      val gregorian_of_french : Def.dmy -> Def.dmy

      Converts french calendar's date to gregorian date.

      val french_of_gregorian : Def.dmy -> Def.dmy

      Converts gregorian calendar's date to french date.

      val gregorian_of_hebrew : Def.dmy -> Def.dmy

      Converts hebrew calendar's date to gregorian date.

      val hebrew_of_gregorian : Def.dmy -> Def.dmy

      Converts gregorian calendar's date to hebrew date.

      type moon_phase =
      | NewMoon
      | FirstQuarter
      | FullMoon
      | LastQuarter

      Moon phases

      val moon_phase_of_sdn : int -> (moon_phase * int * int) option * int

      Returns information about moon phase from the given SDN. Result (Some (mph,h,m), day) describes moon phase mph, hour h and minute m when this phase appears and days day since last New Moon phase (moon's age). If result is (None,_), it tells that there wasn't any moon's phase (one of the mentionned in moon_phase) this day.

      \ No newline at end of file diff --git a/static/doc/geneweb/Consang/.dune-keep b/static/doc/geneweb/Consang/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Consang/index.html b/static/doc/geneweb/Consang/index.html new file mode 100644 index 0000000000..fa00ab7b14 --- /dev/null +++ b/static/doc/geneweb/Consang/index.html @@ -0,0 +1,2 @@ + +Consang (geneweb.Consang)

      Module Consang

      type anc_stat

      Relation with ancestor status

      type relationship = {
      mutable weight1 : float;
      mutable weight2 : float;
      mutable relationship : float;
      mutable lens1 : (int * int * Gwdb.iper list) list;
      mutable lens2 : (int * int * Gwdb.iper list) list;
      mutable inserted : int;
      mutable elim_ancestors : bool;
      mutable anc_stat1 : anc_stat;
      mutable anc_stat2 : anc_stat;
      }

      Consanguinity information attached to person (relationship between parents)

      type relationship_info = {
      tstab : (Gwdb.iper, int) Gwdb.Marker.t;
      reltab : (Gwdb.iperrelationship) Gwdb.Marker.t;
      mutable queue : Gwdb.iper list array;
      }

      Computation consanguinity state for every person in the base

      exception TopologicalSortError of Gwdb.person

      Error that could occure while topological sorting, and raised when person is ancestor of himself.

      val topological_sort : Gwdb.base -> (Gwdb.base -> Gwdb.iper -> Gwdb.person) -> (Gwdb.iper, int) Gwdb.Marker.t

      Returns result of topological sort of persons. Result is represented as marker that associates to every person in the base his topologic rank (let's suppose r). Global rule is : if person p1 is ancestor of p2 then r(p1) > r(p2). For example, all leaf persons (without children) have rank 0, their parents (if no another child that has child themself) - rank 1, parents of their parents - rank 2, etc. Raises TopologicalSortError if person is directly or undirectly is ancestor of himself (cycle).

      val make_relationship_info : Gwdb.base -> (Gwdb.iper, int) Gwdb.Marker.t -> relationship_info

      Initialise relationship info.

      val check_noloop : Gwdb.base -> (Gwdb.person Def.error -> unit) -> unit

      check_noloop base onerror scans database person's oriented graph (vertex is a person and edge is parenthood from child to parent). If cycle is found (person is directly or undirectly is ancestor of himself) calls onerror with OwnAncestor error. Array of ascendants should be load in the memory.

      val check_noloop_for_person_list : Gwdb.base -> (Gwdb.person Def.error -> unit) -> Gwdb.iper list -> unit

      Same as check_noloop but scans only specified list of persons and their ancestors instead of entire database.

      \ No newline at end of file diff --git a/static/doc/geneweb/ConsangAll/.dune-keep b/static/doc/geneweb/ConsangAll/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/ConsangAll/index.html b/static/doc/geneweb/ConsangAll/index.html new file mode 100644 index 0000000000..07e754611a --- /dev/null +++ b/static/doc/geneweb/ConsangAll/index.html @@ -0,0 +1,2 @@ + +ConsangAll (geneweb.ConsangAll)

      Module ConsangAll

      val compute : ?verbosity:int -> Gwdb.base -> bool -> bool

      compute base from_scratch ?verbosity may be 0, 1 or 2 (default is 2) Compute consanguinity for each person in the base. If from_scratch is set then recompute consanguinity for entire database. Return true if base has been patched, false otherwise.

      \ No newline at end of file diff --git a/static/doc/geneweb/Date/.dune-keep b/static/doc/geneweb/Date/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Date/index.html b/static/doc/geneweb/Date/index.html new file mode 100644 index 0000000000..b26cdf40f2 --- /dev/null +++ b/static/doc/geneweb/Date/index.html @@ -0,0 +1,2 @@ + +Date (geneweb.Date)

      Module Date

      val leap_year : int -> bool

      Says if the given year is a leap year.

      val nb_days_in_month : int -> int -> int

      Returns number of days for the given month and year for gregorian calendar. Takes into account leap years.

      val time_elapsed : Def.dmy -> Def.dmy -> Def.dmy

      time_elapsed start stop Compute the time elapsed between start and stop. If stop is prior to start, resulting dmy's field are negative (but correct). Resulting prec can be:

      • Sure for exact duration
      • Before for "less than" duration
      • After for "more than" duration
      • Maybe for other cases Used to compare only gregorian calendar's dates.
      val time_elapsed_opt : Def.dmy -> Def.dmy -> Def.dmy option

      Same as time_elapsed, but will return None if computation is not possible (e.g. time_elapsed_opt /1839 /1859).

      val date_of_death : Def.death -> Adef.date option

      Returns date of death if present.

      val dmy_of_dmy2 : Def.dmy2 -> Def.dmy

      dmy_of_dmy2 dmy2 Convert a dmy2 to dmy using Sure as precision.

      exception Not_comparable

      Not_comparable is raised by compare_dmy and compare_date when strict mode is used and precision of dates are incompatibles to have a reliable result (e.g. is compare_dmy 2019 07/2019) or when one of the date in compare_date is Dtext.

      val compare_dmy : ?strict:bool -> Def.dmy -> Def.dmy -> int

      compare_dmy ?strict d1 d2 Return a negative integer if d1 is prior to d2, 0 if d1 is equal to d2, and a positive integer if d2 is prior to d1. strict parameter enable or disable strict mode, and is false by default (see Not_comparable)

      val compare_dmy_opt : ?strict:bool -> Def.dmy -> Def.dmy -> int option

      compare_dmy_opt ?strict d1 d2 Same as compare_dmy, but do not raise an exception

      val compare_date : ?strict:bool -> Def.date -> Def.date -> int

      compare_date d1 d2 If both d1 and d2 are Dgreg date, uses compare_dmy to compare them. Dtext dates are always considered prior to any Dgreg date, and equal to any other Dtext date. strict parameter enable or disable strict mode, and is false by default (see Not_comparable)

      \ No newline at end of file diff --git a/static/doc/geneweb/Def/.dune-keep b/static/doc/geneweb/Def/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Def/NLDB/index.html b/static/doc/geneweb/Def/NLDB/index.html new file mode 100644 index 0000000000..fa58189e9f --- /dev/null +++ b/static/doc/geneweb/Def/NLDB/index.html @@ -0,0 +1,2 @@ + +NLDB (geneweb.Def.NLDB)

      Module Def.NLDB

      TODOOCP : doc

      type ('a, 'b) page =
      | PgInd of 'a
      | PgFam of 'b
      | PgNotes
      | PgMisc of string
      | PgWizard of string
      type key = string * string * int
      type ind = {
      lnTxt : string option;
      lnPos : int;
      }
      type ('a, 'b) t = (('a'b) page * (string list * (key * ind) list)) list
      \ No newline at end of file diff --git a/static/doc/geneweb/Def/index.html b/static/doc/geneweb/Def/index.html new file mode 100644 index 0000000000..2e6fd2454f --- /dev/null +++ b/static/doc/geneweb/Def/index.html @@ -0,0 +1,2 @@ + +Def (geneweb.Def)

      Module Def

      type httpStatus =
      | OK
      | Moved_Temporarily
      | Bad_Request
      | Unauthorized
      | Forbidden
      | Not_Found
      | Conflict
      | Internal_Server_Error
      | Service_Unavailable

      Http response status

      type ('a, 'b) choice =
      | Left of 'a
      | Right of 'b

      Type that represents 2 possible choices

      type cdate = Adef.cdate

      Alias to Adef.cdate

      type date = Adef.date =
      | Dgreg of dmy * calendar
      | Dtext of string

      Alias to Adef.date

      and calendar = Adef.calendar =
      | Dgregorian
      | Djulian
      | Dfrench
      | Dhebrew

      Alias to Adef.calendar

      and dmy = Adef.dmy = {
      day : int;
      month : int;
      year : int;
      prec : precision;
      delta : int;
      }

      Alias to Adef.dmy

      and dmy2 = Adef.dmy2 = {
      day2 : int;
      month2 : int;
      year2 : int;
      delta2 : int;
      }

      Alias to Adef.dmy2

      and precision = Adef.precision =
      | Sure
      | About
      | Maybe
      | Before
      | After
      | OrYear of dmy2
      | YearInt of dmy2

      Alias to Adef.precision

      type relation_kind =
      | Married
      | NotMarried
      | Engaged
      | NoSexesCheckNotMarried
      | NoMention
      | NoSexesCheckMarried
      | MarriageBann
      | MarriageContract
      | MarriageLicense
      | Pacs
      | Residence

      Relation kind between couple in the family

      type divorce =
      | NotDivorced
      | Divorced of cdate
      | Separated

      Divorce status

      type death_reason =
      | Killed
      | Murdered
      | Executed
      | Disappeared
      | Unspecified

      Death reason

      type death =
      | NotDead
      | Death of death_reason * cdate
      | DeadYoung
      | DeadDontKnowWhen
      | DontKnowIfDead
      | OfCourseDead

      Death status

      type burial =
      | UnknownBurial
      | Buried of cdate
      | Cremated of cdate

      Burial information

      type access =
      | IfTitles
      | Public
      | Private

      Rights for access to the personal data

      type 'string gen_title_name =
      | Tmain
      | Tname of 'string
      | Tnone

      Title name

      type 'string gen_title = {
      t_name : 'string gen_title_name;
      t_ident : 'string;
      t_place : 'string;
      t_date_start : cdate;
      t_date_end : cdate;
      t_nth : int;
      }

      Type that represents information about nobility title of a person

      type witness_kind =
      | Witness
      | Witness_GodParent
      | Witness_Officer

      Witness kind for an event

      type 'string gen_pers_event_name =
      | Epers_Birth
      | Epers_Baptism
      | Epers_Death
      | Epers_Burial
      | Epers_Cremation
      | Epers_Accomplishment
      | Epers_Acquisition
      | Epers_Adhesion
      | Epers_BaptismLDS
      | Epers_BarMitzvah
      | Epers_BatMitzvah
      | Epers_Benediction
      | Epers_ChangeName
      | Epers_Circumcision
      | Epers_Confirmation
      | Epers_ConfirmationLDS
      | Epers_Decoration
      | Epers_DemobilisationMilitaire
      | Epers_Diploma
      | Epers_Distinction
      | Epers_Dotation
      | Epers_DotationLDS
      | Epers_Education
      | Epers_Election
      | Epers_Emigration
      | Epers_Excommunication
      | Epers_FamilyLinkLDS
      | Epers_FirstCommunion
      | Epers_Funeral
      | Epers_Graduate
      | Epers_Hospitalisation
      | Epers_Illness
      | Epers_Immigration
      | Epers_ListePassenger
      | Epers_MilitaryDistinction
      | Epers_MilitaryPromotion
      | Epers_MilitaryService
      | Epers_MobilisationMilitaire
      | Epers_Naturalisation
      | Epers_Occupation
      | Epers_Ordination
      | Epers_Property
      | Epers_Recensement
      | Epers_Residence
      | Epers_Retired
      | Epers_ScellentChildLDS
      | Epers_ScellentParentLDS
      | Epers_ScellentSpouseLDS
      | Epers_VenteBien
      | Epers_Will
      | Epers_Name of 'string

      Personal event name.

      type ('person, 'string) gen_pers_event = {
      epers_name : 'string gen_pers_event_name;
      epers_date : cdate;
      epers_place : 'string;
      epers_reason : 'string;
      epers_note : 'string;
      epers_src : 'string;
      epers_witnesses : ('person * witness_kind) array;
      }

      Personal event information

      type 'string gen_fam_event_name =
      | Efam_Marriage
      | Efam_NoMarriage
      | Efam_NoMention
      | Efam_Engage
      | Efam_Divorce
      | Efam_Separated
      | Efam_Annulation
      | Efam_MarriageBann
      | Efam_MarriageContract
      | Efam_MarriageLicense
      | Efam_PACS
      | Efam_Residence
      | Efam_Name of 'string

      Event name pertaining a family.

      type ('person, 'string) gen_fam_event = {
      efam_name : 'string gen_fam_event_name;
      efam_date : cdate;
      efam_place : 'string;
      efam_reason : 'string;
      efam_note : 'string;
      efam_src : 'string;
      efam_witnesses : ('person * witness_kind) array;
      }

      Event information pertaining a family.

      type relation_type =
      | Adoption
      | Recognition
      | CandidateParent
      | GodParent
      | FosterParent

      Relation type with parent (if not native)

      type ('person, 'string) gen_relation = {
      r_type : relation_type;
      r_fath : 'person option;
      r_moth : 'person option;
      r_sources : 'string;
      }

      Relation information with parents (if not native)

      type sex =
      | Male
      | Female
      | Neuter

      Sex of person

      type place = {
      other : string;
      town : string;
      township : string;
      canton : string;
      district : string;
      county : string;
      region : string;
      country : string;
      }

      Place information

      type ('iper, 'person, 'string) gen_person = {
      first_name : 'string;
      surname : 'string;
      occ : int;
      image : 'string;
      public_name : 'string;
      qualifiers : 'string list;
      aliases : 'string list;
      first_names_aliases : 'string list;
      surnames_aliases : 'string list;
      titles : 'string gen_title list;
      rparents : ('person'string) gen_relation list;
      related : 'person list;
      occupation : 'string;
      sex : sex;
      access : access;
      birth : cdate;
      birth_place : 'string;
      birth_note : 'string;
      birth_src : 'string;
      baptism : cdate;
      baptism_place : 'string;
      baptism_note : 'string;
      baptism_src : 'string;
      death : death;
      death_place : 'string;
      death_note : 'string;
      death_src : 'string;
      burial : burial;
      burial_place : 'string;
      burial_note : 'string;
      burial_src : 'string;
      pevents : ('person'string) gen_pers_event list;
      notes : 'string;
      psources : 'string;
      key_index : 'iper;
      }

      Polymorphic type describing information about person.

      type 'family gen_ascend = {
      parents : 'family option;
      consang : Adef.fix;
      }

      Person's ascendants (family where he is a childran) with its consangunity rate (equal to relationship betwen his parents).

      type 'family gen_union = {
      family : 'family array;
      }
      type 'person gen_descend = {
      children : 'person array;
      }

      Children of the family

      type ('person, 'ifam, 'string) gen_family = {
      marriage : cdate;
      marriage_place : 'string;
      marriage_note : 'string;
      marriage_src : 'string;
      witnesses : 'person array;
      relation : relation_kind;
      divorce : divorce;
      fevents : ('person'string) gen_fam_event list;
      comment : 'string;
      origin_file : 'string;
      fsources : 'string;
      fam_index : 'ifam;
      }

      Polymorphic type describing information about family.

      type 'person gen_couple = 'person Adef.gen_couple

      Alias to Adef.gen_couple

      type 'person error =
      | AlreadyDefined of 'person
      | OwnAncestor of 'person(*

      Person is his own ancestor

      *)
      | BadSexOfMarriedPerson of 'person

      Database errors describing bad specification of the person

      type ('iper, 'person, 'family, 'descend, 'title, 'pevent, 'fevent) warning =
      | BigAgeBetweenSpouses of 'person * 'person * dmy
      | BirthAfterDeath of 'person(*

      Person is born after his death

      *)
      | IncoherentSex of 'person * int * int(*

      Incoherent sex of person

      *)
      | ChangedOrderOfChildren of 'family * 'descend * 'iper array * 'iper array(*

      Children order has been modified

      *)
      | ChangedOrderOfMarriages of 'person * 'family array * 'family array(*

      Person's marriages order has been modified

      *)
      | ChangedOrderOfFamilyEvents of 'family * 'fevent list * 'fevent list(*

      Family's events order has been modified

      *)
      | ChangedOrderOfPersonEvents of 'person * 'pevent list * 'pevent list(*

      Person's events order has been modified

      *)
      | ChildrenNotInOrder of 'family * 'descend * 'person * 'person(*

      Children aren't ordered

      *)
      | CloseChildren of 'family * 'person * 'person(*

      Age difference between two child is less then 7 month (except for twins)

      *)
      | DeadOld of 'person * dmy(*

      Dead old (at the age older then 109 after 1900 year and older then 100 before)

      *)
      | DeadTooEarlyToBeFather of 'person * 'person(*

      Childran is born in more then 1 year after his father's death

      *)
      | DistantChildren of 'family * 'person * 'person(*

      Age gap between two of siblings greater then 50 years

      *)
      | FEventOrder of 'person * 'fevent * 'fevent(*

      Familial events haven't been ordered correctly

      *)
      | FWitnessEventAfterDeath of 'person * 'fevent * 'family(*

      Witness is dead before familial event date

      *)
      | FWitnessEventBeforeBirth of 'person * 'fevent * 'family(*

      Witness is born after familial event date

      *)
      | IncoherentAncestorDate of 'person * 'person(*

      Ancestor is born after person's birth

      *)
      | MarriageDateAfterDeath of 'person(*

      Person is married after his death

      *)
      | MarriageDateBeforeBirth of 'person(*

      Person is married before his birth

      *)
      | MotherDeadBeforeChildBirth of 'person * 'person(*

      Childran is born after his mother's death

      *)
      | ParentBornAfterChild of 'person * 'person(*

      Parent is born after one of his childran

      *)
      | ParentTooOld of 'person * dmy * 'person(*

      Person became a parent at age older then 55 years for mother and 70 for father

      *)
      | ParentTooYoung of 'person * dmy * 'person(*

      Person became a parent at age younger then 11 years old

      *)
      | PEventOrder of 'person * 'pevent * 'pevent(*

      Personal events haven't been ordered correctly

      *)
      | PossibleDuplicateFam of 'family * 'family
      | PWitnessEventAfterDeath of 'person * 'pevent * 'person(*

      Witness is dead before personal event date

      *)
      | PWitnessEventBeforeBirth of 'person * 'pevent * 'person(*

      Witness is born after personal event date

      *)
      | TitleDatesError of 'person * 'title(*

      Title's start date is after end date or person is born after title dates

      *)
      | UndefinedSex of 'person(*

      Person has undefined sex (Neuter)

      *)
      | YoungForMarriage of 'person * dmy * 'family(*

      Person is married before he was 12 years old

      *)
      | OldForMarriage of 'person * dmy * 'family(*

      Person is married after he was 100 years old

      *)

      Database warnings attached to the specification of the person, family, relation, etc.

      type ('person, 'descend, 'title) misc =
      | MissingSources

      Missing sources warning

      type rn_mode =
      | RnAll(*

      Read all content

      *)
      | Rn1Ln(*

      Read first line

      *)
      | RnDeg(*

      If file isn't empty returns a space

      *)

      Database note/page reading mode

      type base_notes = {
      nread : string -> rn_mode -> string;
      norigin_file : string;
      efiles : unit -> string list;
      }

      Database note/page explorer structure

      type ('iper, 'person, 'family, 'string) base_changed =
      | U_Add_person of ('iper'person'string) gen_person
      | U_Modify_person of ('iper'person'string) gen_person * ('iper'person'string) gen_person
      | U_Delete_person of ('iper'person'string) gen_person
      | U_Merge_person of ('iper'person'string) gen_person * ('iper'person'string) gen_person * ('iper'person'string) gen_person
      | U_Send_image of ('iper'person'string) gen_person
      | U_Delete_image of ('iper'person'string) gen_person
      | U_Add_family of ('iper'person'string) gen_person * ('person'family'string) gen_family
      | U_Modify_family of ('iper'person'string) gen_person * ('person'family'string) gen_family * ('person'family'string) gen_family
      | U_Delete_family of ('iper'person'string) gen_person * ('person'family'string) gen_family
      | U_Invert_family of ('iper'person'string) gen_person * 'family
      | U_Merge_family of ('iper'person'string) gen_person * ('person'family'string) gen_family * ('person'family'string) gen_family * ('person'family'string) gen_family
      | U_Change_children_name of ('iper'person'string) gen_person * ((string * string * int * 'person) * (string * string * int * 'person)) list
      | U_Add_parent of ('iper'person'string) gen_person * ('person'family'string) gen_family
      | U_Kill_ancestors of ('iper'person'string) gen_person
      | U_Multi of ('iper'person'string) gen_person * ('iper'person'string) gen_person * bool
      | U_Notes of int option * string

      Update modification used for history tracking

      module NLDB : sig ... end

      TODOOCP : doc

      \ No newline at end of file diff --git a/static/doc/geneweb/Def_show/.dune-keep b/static/doc/geneweb/Def_show/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Def_show/index.html b/static/doc/geneweb/Def_show/index.html new file mode 100644 index 0000000000..0d63b354ef --- /dev/null +++ b/static/doc/geneweb/Def_show/index.html @@ -0,0 +1,2 @@ + +Def_show (geneweb.Def_show)

      Module Def_show

      type date = Adef.date =
      | Dgreg of dmy * calendar
      | Dtext of string
      and calendar = Adef.calendar =
      | Dgregorian
      | Djulian
      | Dfrench
      | Dhebrew
      and dmy = Adef.dmy = {
      day : int;
      month : int;
      year : int;
      prec : precision;
      delta : int;
      }
      and dmy2 = Adef.dmy2 = {
      day2 : int;
      month2 : int;
      year2 : int;
      delta2 : int;
      }
      and precision = Adef.precision =
      | Sure
      | About
      | Maybe
      | Before
      | After
      | OrYear of dmy2
      | YearInt of dmy2
      val pp_date : Stdlib.Format.formatter -> date -> unit

      Printer for date

      val show_date : date -> string

      Convert date to string.

      val pp_calendar : Stdlib.Format.formatter -> calendar -> unit

      Printer for calendar

      val show_calendar : calendar -> string

      Convert calendar to string

      val pp_dmy : Stdlib.Format.formatter -> dmy -> unit

      Printer for dmy

      val show_dmy : dmy -> string

      Convert dmy to string

      val pp_dmy2 : Stdlib.Format.formatter -> dmy2 -> unit

      Printer for dmy2

      val show_dmy2 : dmy2 -> string

      Convert dmy2 to string

      val pp_precision : Stdlib.Format.formatter -> precision -> unit

      Printer for precision

      val show_precision : precision -> string

      Convert precision to string

      type cdate = Adef.cdate
      val pp_cdate : Stdlib.Format.formatter -> Adef.cdate -> unit

      Printer for cdate

      val show_cdate : Adef.cdate -> string

      Convert cdate to string

      type relation_kind = Def.relation_kind =
      | Married
      | NotMarried
      | Engaged
      | NoSexesCheckNotMarried
      | NoMention
      | NoSexesCheckMarried
      | MarriageBann
      | MarriageContract
      | MarriageLicense
      | Pacs
      | Residence
      val pp_relation_kind : Stdlib.Format.formatter -> relation_kind -> unit

      Printer for relation_kind

      val show_relation_kind : relation_kind -> string

      Convert relation_kind to string

      type divorce = Def.divorce =
      | NotDivorced
      | Divorced of cdate
      | Separated
      val pp_divorce : Stdlib.Format.formatter -> divorce -> unit

      Printer for divorce

      val show_divorce : divorce -> string

      Convert divorce to string

      type death_reason = Def.death_reason =
      | Killed
      | Murdered
      | Executed
      | Disappeared
      | Unspecified
      val pp_death_reason : Stdlib.Format.formatter -> death_reason -> unit

      Printer for death_reason

      val show_death_reason : death_reason -> string

      Convert death_reason to string

      type death = Def.death =
      | NotDead
      | Death of death_reason * cdate
      | DeadYoung
      | DeadDontKnowWhen
      | DontKnowIfDead
      | OfCourseDead
      val pp_death : Stdlib.Format.formatter -> death -> unit

      Printer for death

      val show_death : death -> string

      Convert death to string

      type burial = Def.burial =
      | UnknownBurial
      | Buried of cdate
      | Cremated of cdate
      val pp_burial : Stdlib.Format.formatter -> burial -> unit

      Printer for burial

      val show_burial : burial -> string

      Convert burial to string

      type access = Def.access =
      | IfTitles
      | Public
      | Private
      val pp_access : Stdlib.Format.formatter -> access -> unit

      Printer for access

      val show_access : access -> string

      Convert access to string

      type 'string gen_title_name = 'string Def.gen_title_name =
      | Tmain
      | Tname of 'string
      | Tnone
      val pp_gen_title_name : (Stdlib.Format.formatter -> 'string -> unit) -> Stdlib.Format.formatter -> 'string gen_title_name -> unit

      Printer for gen_title_name

      val show_gen_title_name : (Stdlib.Format.formatter -> 'string -> unit) -> 'string gen_title_name -> string

      Convert gen_title_name to string

      type 'string gen_title = 'string Def.gen_title = {
      t_name : 'string gen_title_name;
      t_ident : 'string;
      t_place : 'string;
      t_date_start : cdate;
      t_date_end : cdate;
      t_nth : int;
      }
      val pp_gen_title : (Stdlib.Format.formatter -> 'string -> unit) -> Stdlib.Format.formatter -> 'string gen_title -> unit

      Printer for gen_title

      val show_gen_title : (Stdlib.Format.formatter -> 'string -> unit) -> 'string gen_title -> string

      Convert gen_title to string

      type witness_kind = Def.witness_kind =
      | Witness
      | Witness_GodParent
      | Witness_Officer
      val pp_witness_kind : Stdlib.Format.formatter -> witness_kind -> unit

      Printer for witness_kind

      val show_witness_kind : witness_kind -> string

      Convert witness_kind to string

      type 'string gen_pers_event_name = 'string Def.gen_pers_event_name =
      | Epers_Birth
      | Epers_Baptism
      | Epers_Death
      | Epers_Burial
      | Epers_Cremation
      | Epers_Accomplishment
      | Epers_Acquisition
      | Epers_Adhesion
      | Epers_BaptismLDS
      | Epers_BarMitzvah
      | Epers_BatMitzvah
      | Epers_Benediction
      | Epers_ChangeName
      | Epers_Circumcision
      | Epers_Confirmation
      | Epers_ConfirmationLDS
      | Epers_Decoration
      | Epers_DemobilisationMilitaire
      | Epers_Diploma
      | Epers_Distinction
      | Epers_Dotation
      | Epers_DotationLDS
      | Epers_Education
      | Epers_Election
      | Epers_Emigration
      | Epers_Excommunication
      | Epers_FamilyLinkLDS
      | Epers_FirstCommunion
      | Epers_Funeral
      | Epers_Graduate
      | Epers_Hospitalisation
      | Epers_Illness
      | Epers_Immigration
      | Epers_ListePassenger
      | Epers_MilitaryDistinction
      | Epers_MilitaryPromotion
      | Epers_MilitaryService
      | Epers_MobilisationMilitaire
      | Epers_Naturalisation
      | Epers_Occupation
      | Epers_Ordination
      | Epers_Property
      | Epers_Recensement
      | Epers_Residence
      | Epers_Retired
      | Epers_ScellentChildLDS
      | Epers_ScellentParentLDS
      | Epers_ScellentSpouseLDS
      | Epers_VenteBien
      | Epers_Will
      | Epers_Name of 'string
      val pp_gen_pers_event_name : (Stdlib.Format.formatter -> 'string -> unit) -> Stdlib.Format.formatter -> 'string gen_pers_event_name -> unit

      Printer for gen_pers_event_name

      val show_gen_pers_event_name : (Stdlib.Format.formatter -> 'string -> unit) -> 'string gen_pers_event_name -> string

      Convert gen_pers_event_name to string

      type ('person, 'string) gen_pers_event = ('person'string) Def.gen_pers_event = {
      epers_name : 'string gen_pers_event_name;
      epers_date : cdate;
      epers_place : 'string;
      epers_reason : 'string;
      epers_note : 'string;
      epers_src : 'string;
      epers_witnesses : ('person * witness_kind) array;
      }
      val pp_gen_pers_event : (Stdlib.Format.formatter -> 'person -> unit) -> (Stdlib.Format.formatter -> 'string -> unit) -> Stdlib.Format.formatter -> ('person'string) gen_pers_event -> unit

      Printer for gen_pers_event

      val show_gen_pers_event : (Stdlib.Format.formatter -> 'person -> unit) -> (Stdlib.Format.formatter -> 'string -> unit) -> ('person'string) gen_pers_event -> string

      Convert gen_pers_event to string

      type 'string gen_fam_event_name = 'string Def.gen_fam_event_name =
      | Efam_Marriage
      | Efam_NoMarriage
      | Efam_NoMention
      | Efam_Engage
      | Efam_Divorce
      | Efam_Separated
      | Efam_Annulation
      | Efam_MarriageBann
      | Efam_MarriageContract
      | Efam_MarriageLicense
      | Efam_PACS
      | Efam_Residence
      | Efam_Name of 'string
      val pp_gen_fam_event_name : (Stdlib.Format.formatter -> 'string -> unit) -> Stdlib.Format.formatter -> 'string gen_fam_event_name -> unit

      Printer for gen_fam_event_name

      val show_gen_fam_event_name : (Stdlib.Format.formatter -> 'string -> unit) -> 'string gen_fam_event_name -> string

      Convert gen_fam_event_name to string

      type ('person, 'string) gen_fam_event = ('person'string) Def.gen_fam_event = {
      efam_name : 'string gen_fam_event_name;
      efam_date : cdate;
      efam_place : 'string;
      efam_reason : 'string;
      efam_note : 'string;
      efam_src : 'string;
      efam_witnesses : ('person * witness_kind) array;
      }
      val pp_gen_fam_event : (Stdlib.Format.formatter -> 'person -> unit) -> (Stdlib.Format.formatter -> 'string -> unit) -> Stdlib.Format.formatter -> ('person'string) gen_fam_event -> unit

      Printer for gen_fam_event

      val show_gen_fam_event : (Stdlib.Format.formatter -> 'person -> unit) -> (Stdlib.Format.formatter -> 'string -> unit) -> ('person'string) gen_fam_event -> string

      Convert gen_fam_event to string

      type relation_type = Def.relation_type =
      | Adoption
      | Recognition
      | CandidateParent
      | GodParent
      | FosterParent
      val pp_relation_type : Stdlib.Format.formatter -> relation_type -> unit

      Printer for relation_type

      val show_relation_type : relation_type -> string

      Convert relation_type to string

      type ('person, 'string) gen_relation = ('person'string) Def.gen_relation = {
      r_type : relation_type;
      r_fath : 'person option;
      r_moth : 'person option;
      r_sources : 'string;
      }
      val pp_gen_relation : (Stdlib.Format.formatter -> 'person -> unit) -> (Stdlib.Format.formatter -> 'string -> unit) -> Stdlib.Format.formatter -> ('person'string) gen_relation -> unit

      Printer for gen_relation

      val show_gen_relation : (Stdlib.Format.formatter -> 'person -> unit) -> (Stdlib.Format.formatter -> 'string -> unit) -> ('person'string) gen_relation -> string

      Convert gen_relation to string

      type sex = Def.sex =
      | Male
      | Female
      | Neuter
      val pp_sex : Stdlib.Format.formatter -> sex -> unit

      Printer for sex

      val show_sex : sex -> string

      Convert sex to string

      type place = Def.place = {
      other : string;
      town : string;
      township : string;
      canton : string;
      district : string;
      county : string;
      region : string;
      country : string;
      }
      val pp_place : Stdlib.Format.formatter -> place -> unit

      Printer for place

      val show_place : place -> string

      Convert place to string

      type ('iper, 'person, 'string) gen_person = ('iper'person'string) Def.gen_person = {
      first_name : 'string;
      surname : 'string;
      occ : int;
      image : 'string;
      public_name : 'string;
      qualifiers : 'string list;
      aliases : 'string list;
      first_names_aliases : 'string list;
      surnames_aliases : 'string list;
      titles : 'string gen_title list;
      rparents : ('person'string) gen_relation list;
      related : 'person list;
      occupation : 'string;
      sex : sex;
      access : access;
      birth : cdate;
      birth_place : 'string;
      birth_note : 'string;
      birth_src : 'string;
      baptism : cdate;
      baptism_place : 'string;
      baptism_note : 'string;
      baptism_src : 'string;
      death : death;
      death_place : 'string;
      death_note : 'string;
      death_src : 'string;
      burial : burial;
      burial_place : 'string;
      burial_note : 'string;
      burial_src : 'string;
      pevents : ('person'string) gen_pers_event list;
      notes : 'string;
      psources : 'string;
      key_index : 'iper;
      }
      val pp_gen_person : (Stdlib.Format.formatter -> 'iper -> unit) -> (Stdlib.Format.formatter -> 'person -> unit) -> (Stdlib.Format.formatter -> 'string -> unit) -> Stdlib.Format.formatter -> ('iper'person'string) gen_person -> unit

      Printer for gen_person

      val show_gen_person : (Stdlib.Format.formatter -> 'iper -> unit) -> (Stdlib.Format.formatter -> 'person -> unit) -> (Stdlib.Format.formatter -> 'string -> unit) -> ('iper'person'string) gen_person -> string

      Convert gen_person to string

      type fix = Adef.fix
      val pp_fix : Stdlib.Format.formatter -> Adef.fix -> unit

      Printer for fix

      val show_fix : Adef.fix -> string

      Convert fix to string

      type 'family gen_ascend = 'family Def.gen_ascend = {
      parents : 'family option;
      consang : fix;
      }
      val pp_gen_ascend : (Stdlib.Format.formatter -> 'family -> unit) -> Stdlib.Format.formatter -> 'family gen_ascend -> unit

      Printer for gen_ascend

      val show_gen_ascend : (Stdlib.Format.formatter -> 'family -> unit) -> 'family gen_ascend -> string

      Convert gen_ascend to string

      type 'family gen_union = 'family Def.gen_union = {
      family : 'family array;
      }
      val pp_gen_union : (Stdlib.Format.formatter -> 'family -> unit) -> Stdlib.Format.formatter -> 'family gen_union -> unit

      Printer for gen_union

      val show_gen_union : (Stdlib.Format.formatter -> 'family -> unit) -> 'family gen_union -> string

      Convert gen_union to string

      type ('person, 'ifam, 'string) gen_family = ('person'ifam'string) Def.gen_family = {
      marriage : cdate;
      marriage_place : 'string;
      marriage_note : 'string;
      marriage_src : 'string;
      witnesses : 'person array;
      relation : relation_kind;
      divorce : divorce;
      fevents : ('person'string) gen_fam_event list;
      comment : 'string;
      origin_file : 'string;
      fsources : 'string;
      fam_index : 'ifam;
      }
      val pp_gen_family : (Stdlib.Format.formatter -> 'person -> unit) -> (Stdlib.Format.formatter -> 'ifam -> unit) -> (Stdlib.Format.formatter -> 'string -> unit) -> Stdlib.Format.formatter -> ('person'ifam'string) gen_family -> unit

      Printer for gen_family

      val show_gen_family : (Stdlib.Format.formatter -> 'person -> unit) -> (Stdlib.Format.formatter -> 'ifam -> unit) -> (Stdlib.Format.formatter -> 'string -> unit) -> ('person'ifam'string) gen_family -> string

      Convert gen_family to string

      type 'person gen_couple = 'person Adef.gen_couple
      val pp_gen_couple : (Stdlib.Format.formatter -> 'person -> unit) -> Stdlib.Format.formatter -> 'person gen_couple -> unit

      Printer for gen_couple

      val show_gen_couple : (Stdlib.Format.formatter -> 'person -> unit) -> 'person gen_couple -> string

      Convert gen_couple to string

      type 'person gen_descend = 'person Def.gen_descend = {
      children : 'person array;
      }
      val pp_gen_descend : (Stdlib.Format.formatter -> 'person -> unit) -> Stdlib.Format.formatter -> 'person gen_descend -> unit

      Printer for gen_descend

      val show_gen_descend : (Stdlib.Format.formatter -> 'person -> unit) -> 'person gen_descend -> string

      Convert gen_descend to string

      \ No newline at end of file diff --git a/static/doc/geneweb/Futil/.dune-keep b/static/doc/geneweb/Futil/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Futil/index.html b/static/doc/geneweb/Futil/index.html new file mode 100644 index 0000000000..12a39da3bb --- /dev/null +++ b/static/doc/geneweb/Futil/index.html @@ -0,0 +1,4 @@ + +Futil (geneweb.Futil)

      Module Futil

      val map_title_strings : ?fd:(Def.date -> Def.date) -> ('a -> 'b) -> 'a Def.gen_title -> 'b Def.gen_title

      Convert generic type used to represent name, id and the place of Def.gen_title into another one. If fd is present, apply it on the date of the start and date of the end of a title

      val map_pers_event : ?fd:(Def.date -> Def.date) -> ('a -> 'c) -> ('b -> 'd) -> ('a'b) Def.gen_pers_event -> ('c'd) Def.gen_pers_event

      Convert:

      • Generic type used to represent witnesses of Def.gen_pers_event into another one.
      • Generic type used to represent name, place, reason, note and source of Def.gen_pers_event into another one. If fd is present, apply it on date of the personal event.
      val map_fam_event : ?fd:(Def.date -> Def.date) -> ('a -> 'c) -> ('b -> 'd) -> ('a'b) Def.gen_fam_event -> ('c'd) Def.gen_fam_event

      Convert:

      • Generic type used to represent witnesses of Def.gen_fam_event into another one.
      • Generic type used to represent name, place, reason, note and source of Def.gen_fam_event into another one. If fd is present, apply it on date of the familial event.
      val map_relation_ps : ('a -> 'c) -> ('b -> 'd) -> ('a'b) Def.gen_relation -> ('c'd) Def.gen_relation

      Convert:

      • Generic type used to represent father and mother inside Def.gen_relation into another one.
      • Generic type used to represent sources of Def.gen_relation into another one.
      val map_person_ps : ?fd:(Def.date -> Def.date) -> +('b -> 'd) -> ('c -> 'e) -> ('a'b'c) Def.gen_person -> ('a'd'e) Def.gen_person

      Convert:

      • Generic type used to represent related persons (parents, witnesses of a personal event, etc.) of Def.gen_person into another one.
      • Generic type used to represent another large part of information of Def.gen_person into another one. If fd is present, apply it on every date (birth, death, titles,, personal events, etc.). Generic type that is used to represent indexation key isn't converted.
      val map_ascend_f : ('a -> 'b) -> 'a Def.gen_ascend -> 'b Def.gen_ascend

      Convert generic type used to represent family inside Def.gen_ascend into another one.

      val map_union_f : ('a -> 'b) -> 'a Def.gen_union -> 'b Def.gen_union

      Convert generic type used to represent one of the famillies inside Def.gen_union into another one.

      val map_family_ps : ?fd:(Def.date -> Def.date) -> +('a -> 'b) -> ('c -> 'd) -> ('e -> 'f) -> ('a'c'e) Def.gen_family -> ('b'd'f) Def.gen_family

      Convert:

      • Generic type used to represent faimily indexation key into another one.
      • Generic type used to represent witnesses (of the marriage or of a famillial events, etc.) of Def.gen_family into another one.
      • Generic type used to represent another large part of information of Def.gen_family into another one. If fd is present, apply it on it on every date (marriage, divorce, famillial events, etc.).
      val map_couple_p : bool -> ('a -> 'b) -> 'a Def.gen_couple -> 'b Def.gen_couple

      Convert generic type used to represent father and mother inside Def.gen_couple into another one. If first argument is true then use multi-parent functionality.

      val parent : bool -> 'a array -> 'a Def.gen_couple
      • deprecated

        Use Adef.parent instead.

      val map_descend_p : ('a -> 'b) -> 'a Def.gen_descend -> 'b Def.gen_descend

      Convert generic type used to represent children inside Def.gen_descend into another one.

      val eq_lists : ('a -> 'b -> bool) -> 'a list -> 'b list -> bool

      Says if two lists with different element's type are equal with given comparison function.

      val eq_titles : ('a -> 'b -> bool) -> 'a Def.gen_title -> 'b Def.gen_title -> bool

      Says if two titles with different types are equal with given comparison function.

      val eq_title_names : ('a -> 'b -> bool) -> 'a Def.gen_title_name -> 'b Def.gen_title_name -> bool

      Says if two title names with different types are equal with given comparison function.

      val gen_person_misc_names : ('a -> string) -> 'a -> 'a -> 'a -> 'a -> 'a -> 'a list -> 'a list -> 'a list -> 'a list -> 'a Def.gen_title list -> ('a * 'a list) array -> 'a Def.gen_title list -> string list

      Return a list of string corresponding to various mix between all kind of names. It can contain duplicates. Strings are used raw (not lowered).

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/.dune-keep b/static/doc/geneweb/Geneweb/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb/AdvSearchOk/index.html b/static/doc/geneweb/Geneweb/AdvSearchOk/index.html new file mode 100644 index 0000000000..fb10b9742d --- /dev/null +++ b/static/doc/geneweb/Geneweb/AdvSearchOk/index.html @@ -0,0 +1,2 @@ + +AdvSearchOk (geneweb.Geneweb.AdvSearchOk)

      Module Geneweb.AdvSearchOk

      advanced_search conf base max_answers extracts advaced request fields from environement conf.env and returns at most max_answers persons from the base that match conditions described by those fields. Seond result represents real number of matches (if less then max_answers).

      val searching_fields : Config.config -> Gwdb.base -> string

      Returns a description string for the current advanced search results in the correct language. e.g. "Search all Pierre, born in Paris, died in Paris"

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/AdvSearchOkDisplay/index.html b/static/doc/geneweb/Geneweb/AdvSearchOkDisplay/index.html new file mode 100644 index 0000000000..cb80329075 --- /dev/null +++ b/static/doc/geneweb/Geneweb/AdvSearchOkDisplay/index.html @@ -0,0 +1,2 @@ + +AdvSearchOkDisplay (geneweb.Geneweb.AdvSearchOkDisplay)

      Module Geneweb.AdvSearchOkDisplay

      val print : Config.config -> Gwdb.base -> unit

      Displays the results of an advanced search

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Alln/index.html b/static/doc/geneweb/Geneweb/Alln/index.html new file mode 100644 index 0000000000..4df68452fb --- /dev/null +++ b/static/doc/geneweb/Geneweb/Alln/index.html @@ -0,0 +1,2 @@ + +Alln (geneweb.Geneweb.Alln)

      Module Geneweb.Alln

      val default_max_cnt : int

      Default number of names that could be printed simultaneously on the page

      type t =
      | Result of (string * string * int) list(*

      Exhaustive result with the list of names (key and printable name) with number of persons that have giving name

      *)
      | Specify of string list(*

      Not exhaustive result that specifies all existing names prefixes (their length depends on initial searched prefix)

      *)

      Type that represents result of name selection

      val first_letters : Gwdb.base -> bool -> string list

      Returns list of all first name's first letter present in the base (UTF8 encoded). Used for fast access for base's names

      val select_names : Config.config -> Gwdb.base -> bool -> string -> int -> t * int

      select_names conf base is_surnames ini limit Select up to limit first names/surnames starting with ini. If more values are available, return Specify with different possible prefixes with the length at most equal to the length of ini+1 (for empty ini specifies all first letters of existing names). Otherwise, return the list of values Result with all first names and number of persons that have giving name.

      val ini : int -> string -> string

      Returns prefix of length len of UTF8 encoded name

      val groupby_ini : int -> (string * 'a * 'b) list -> (string * ('a * 'b) list) list

      groupby_ini len results returns alphabeticaly ordered list of grouped by name prefix (with length len) results.

      val groupby_count : t -> (int * string list) list

      Returns ordered (from bigest to smallest) list of grouped by name frequency (number of persons having the name) results. Shouldn't be used when results are represented with Specify.

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/AllnDisplay/index.html b/static/doc/geneweb/Geneweb/AllnDisplay/index.html new file mode 100644 index 0000000000..0276bddc62 --- /dev/null +++ b/static/doc/geneweb/Geneweb/AllnDisplay/index.html @@ -0,0 +1,2 @@ + +AllnDisplay (geneweb.Geneweb.AllnDisplay)

      Module Geneweb.AllnDisplay

      val print_surnames : Config.config -> Gwdb.base -> unit

      Displays all persons surnames present in the base. Display could be different depending on environement conf.env. These variables affect the display:

      • tri : "F" to display surnames by frequency, "S" to display surnames regrouped by first letter (depends on variable "k") otherwsise display surnames just ordered alphabeticaly
      • k : Defines common prefix for surnames (empty for all)
      • o : "A" to print all surnames (if less then Alln.default_max_cnt) otherwise prints links to access different type of displaying
      val print_first_names : Config.config -> Gwdb.base -> unit

      Same as print_surnames but dealing with first names.

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Ansel/index.html b/static/doc/geneweb/Geneweb/Ansel/index.html new file mode 100644 index 0000000000..635d7618ac --- /dev/null +++ b/static/doc/geneweb/Geneweb/Ansel/index.html @@ -0,0 +1,2 @@ + +Ansel (geneweb.Geneweb.Ansel)

      Module Geneweb.Ansel

      val of_iso_8859_1 : string -> string

      Convert ISO-8859-1 encoded string to ANSEL encoding used inside gedcom files

      val to_iso_8859_1 : string -> string

      Convert ANSEL used inside gedcom files to ISO-8859-1 encoding

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Base64/index.html b/static/doc/geneweb/Geneweb/Base64/index.html new file mode 100644 index 0000000000..74987b279d --- /dev/null +++ b/static/doc/geneweb/Geneweb/Base64/index.html @@ -0,0 +1,2 @@ + +Base64 (geneweb.Geneweb.Base64)

      Module Geneweb.Base64

      val decode : string -> string

      Decode Base64 binary-to-text encoding used at the moment of basic autorization

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/BirthDeath/index.html b/static/doc/geneweb/Geneweb/BirthDeath/index.html new file mode 100644 index 0000000000..288ab9ba28 --- /dev/null +++ b/static/doc/geneweb/Geneweb/BirthDeath/index.html @@ -0,0 +1,3 @@ + +BirthDeath (geneweb.Geneweb.BirthDeath)

      Module Geneweb.BirthDeath

      val select_person : Config.config -> Gwdb.base -> (Gwdb.person -> Def.date option) -> bool -> (Gwdb.person * Def.dmy * Def.calendar) list * int

      select_person conf base get_date find_oldest select 20 persons from the base according to the one of their date (birth, death, marriage, specific event, etc.) that could be get with get_date. Returns sorted by date persons that have the latest (if find_oldest is false) or oldest (otherwise) date. Selection could be different depending on environement conf.env. These variables affect the selection: k - allows to modify default value (20) of selected persons by,bm,bd - allows to set reference date (all dates after the reference one aren't selected) Returns also the number of selected persons

      val select_family : Config.config -> Gwdb.base -> (Gwdb.family -> Def.date option) -> bool -> (Gwdb.family * Def.dmy * Def.calendar) list * int

      Same as select_person but dealing with families

      val death_date : Gwdb.person -> Adef.date option

      Returns person's death date (if exists)

      val make_population_pyramid : nb_intervals:int -> interval:int -> limit:int -> +at_date:Def.dmy -> Config.config -> Gwdb.base -> int array * int array

      make_population_pyramid nb_intervals interval interval at_date conf base Calculates population pyramid of all perons in the base. Population pyramid consists of two separated arrays that regroups number of men's and women's born in each time interval. One array has a size nb_intervals + 1 and every element is a number of persons born in the giving time interval that represents interval years. Calculation starts at the date at_date and persons that are considered in pyramid should be alive at this date. limit allows to limit persons by age (those that has age greater then limit aren't taken into the account)

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/BirthDeathDisplay/index.html b/static/doc/geneweb/Geneweb/BirthDeathDisplay/index.html new file mode 100644 index 0000000000..dd5e326d7f --- /dev/null +++ b/static/doc/geneweb/Geneweb/BirthDeathDisplay/index.html @@ -0,0 +1,2 @@ + +BirthDeathDisplay (geneweb.Geneweb.BirthDeathDisplay)

      Module Geneweb.BirthDeathDisplay

      val print_birth : Config.config -> Gwdb.base -> unit

      Lists the last births

      val print_death : Config.config -> Gwdb.base -> unit

      Lists the last deaths

      val print_longest_lived : Config.config -> Gwdb.base -> unit

      Lists the persons who lived the longest

      val print_oldest_alive : Config.config -> Gwdb.base -> unit

      Displays the list of the oldest persons that are still alive or, if unknown, whose death are not probable

      val print_marriage : Config.config -> Gwdb.base -> unit

      Lists the last marriages

      val print_oldest_engagements : Config.config -> Gwdb.base -> unit

      Displays the list of the oldest couples that still exist

      val print_statistics : Config.config -> unit

      Displays several links for statistics: latest births, death, marriages, the oldest couples, persons that are alive and who lived the longest, as well as a population pyramid

      val print_population_pyramid : Config.config -> Gwdb.base -> unit

      Displays a population pyramid from the base data

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/BirthdayDisplay/index.html b/static/doc/geneweb/Geneweb/BirthdayDisplay/index.html new file mode 100644 index 0000000000..69b21320dc --- /dev/null +++ b/static/doc/geneweb/Geneweb/BirthdayDisplay/index.html @@ -0,0 +1,2 @@ + +BirthdayDisplay (geneweb.Geneweb.BirthdayDisplay)

      Module Geneweb.BirthdayDisplay

      val gen_print : Config.config -> Gwdb.base -> int -> (unit -> Gwdb.person * (Config.config -> Gwdb.base -> Gwdb.person -> string)) -> bool -> unit

      gen_print conf base month (next,txt_of) dead_people displays anniversaries for a given month separated by day. If dead_people is true then displays birth/death anniversaries for dead people with death reason. Otherwise displays birthdays for alive people. next is function that returns next person from iterator and txt_of text/link that describes person's information

      val print_birth : Config.config -> Gwdb.base -> int -> unit

      Displays birthdays for alive people for a given month

      val print_dead : Config.config -> Gwdb.base -> int -> unit

      Displays anniversaries for dead people for a given month

      val print_marriage : Config.config -> Gwdb.base -> int -> unit

      Displays marriage anniversaries for a given month

      val gen_print_menu_birth : Config.config -> Gwdb.base -> (unit -> Gwdb.person * (Config.config -> Gwdb.base -> Gwdb.person -> string)) -> (unit -> 'a) -> unit

      gen_print_menu_birth conf base (next,txt_of) mode displays the main birthdays menu for alive people that contains:

      • Persons that has their birthdays today
      • Persons that has their birthdays tomorrow
      • Persons that has their birthdays after today
      • Form to select the month of birthdays we want to see. next is function that returns next person from iterator, txt_of text/link that describes person's information and mode that add some additional hidden inputs in the month form
      val print_menu_birth : Config.config -> Gwdb.base -> unit

      Displays the main birthdays menu considering all alive people

      val gen_print_menu_dead : Config.config -> Gwdb.base -> (unit -> Gwdb.person * (Config.config -> Gwdb.base -> Gwdb.person -> string)) -> (unit -> 'a) -> unit

      gen_print_menu_dead conf base (next,txt_of) mode displays the main anniversaries menu for dead people that contains:

      • Persons that has their anniversaries today
      • Persons that has their anniversaries tomorrow
      • Persons that has their anniversaries after today
      • Form to select the month of anniversaries we want to see. next is function that returns next person from iterator, txt_of text/link that describes person's information and mode that add some additional hidden inputs in the month form
      val print_menu_dead : Config.config -> Gwdb.base -> unit

      Displays the main anniversaries menu considering all dead people

      val print_menu_marriage : Config.config -> Gwdb.base -> unit

      Displays the main wedding anniversaries menu

      val print_anniversaries : Config.config -> unit

      Displays the menu of anniversaries selection

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/ChangeChildren/index.html b/static/doc/geneweb/Geneweb/ChangeChildren/index.html new file mode 100644 index 0000000000..65b599c458 --- /dev/null +++ b/static/doc/geneweb/Geneweb/ChangeChildren/index.html @@ -0,0 +1,2 @@ + +ChangeChildren (geneweb.Geneweb.ChangeChildren)

      Module Geneweb.ChangeChildren

      val digest_children : Gwdb.base -> Gwdb.iper list -> string

      Returns digest (using md5 algorithm) of concatenated for every childran first name, surname and occurence number

      val check_digest : Config.config -> string -> unit

      Checks if children digest in environement conf.env corresponds to specified digest. Other print error page.

      exception ChangeChildrenConflict of Gwdb.person * Gwdb.person

      Exception raised when childran change defines a new childran information (new first name, new surname and new occurence number) are in conflict with another person already existing in the base

      exception FirstNameMissing of Gwdb.iper

      Exception raised when childran change removes it first name

      val change_children : Config.config -> Gwdb.base -> string -> Gwdb.iper list -> ((string * string * int * Gwdb.iper) * (string * string * int * Gwdb.iper)) list

      Change all person's children by looking up information to update inside conf.env that was send by the form. Changes also childran's personal image name. Could raise ChangeChildrenConflict if new childran's key is in conflict with another and FirstNameMissing if new childran's first name is empty. If surname modification is requested but absent then childran takes parent's surname. Returns informations used by Update module to record children's update operation.

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/ChangeChildrenDisplay/index.html b/static/doc/geneweb/Geneweb/ChangeChildrenDisplay/index.html new file mode 100644 index 0000000000..3c62ea8024 --- /dev/null +++ b/static/doc/geneweb/Geneweb/ChangeChildrenDisplay/index.html @@ -0,0 +1,2 @@ + +ChangeChildrenDisplay (geneweb.Geneweb.ChangeChildrenDisplay)

      Module Geneweb.ChangeChildrenDisplay

      val print : Config.config -> Gwdb.base -> unit

      Displays a form where all person's children with their first names, surnames and occurence numbers are listed and could be modified on submit. Id of person should be mentionned in environement conf.env with binding "ip"=id otherwise displays Bad request page.

      val print_ok : Config.config -> Gwdb.base -> unit

      Performs and displays results of children modification requested by form submiting. If changes of one of children raises an error displays corresponding error page that either just informs user about error source either propose to fix up solution.

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Check/index.html b/static/doc/geneweb/Geneweb/Check/index.html new file mode 100644 index 0000000000..a03bdca058 --- /dev/null +++ b/static/doc/geneweb/Geneweb/Check/index.html @@ -0,0 +1,3 @@ + +Check (geneweb.Geneweb.Check)

      Module Geneweb.Check

      val print_base_error : Stdlib.out_channel -> Gwdb.base -> CheckItem.base_error -> unit

      Print database specification error on the giving channel

      val print_base_warning : Stdlib.out_channel -> Gwdb.base -> CheckItem.base_warning -> unit

      Print database specification warning on the giving channel

      val check_base : ?verbose:bool -> ?mem:bool -> +Gwdb.base -> (CheckItem.base_error -> unit) -> (CheckItem.base_warning -> unit) -> ((Gwdb.iper * Gwdb.person * Def.sex option * Gwdb.relation list option) -> unit) -> unit

      check_base base onwarning onerror _ makes full database proprety check. Checks every person and family separetely with corresponding function inside CheckItem module. Checks also person's graph in order to find cycles (if person is own ancestor).

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/CheckItem/index.html b/static/doc/geneweb/Geneweb/CheckItem/index.html new file mode 100644 index 0000000000..d312c3d193 --- /dev/null +++ b/static/doc/geneweb/Geneweb/CheckItem/index.html @@ -0,0 +1,3 @@ + +CheckItem (geneweb.Geneweb.CheckItem)

      Module Geneweb.CheckItem

      type base_error = Gwdb.person Def.error

      Database specification error

      Database specification warning

      type 'string event_name =
      | Psort of 'string Def.gen_pers_event_name(*

      Personal event name

      *)
      | Fsort of 'string Def.gen_fam_event_name(*

      Familial event name

      *)

      Event name that unites personal and familial event names

      val sort_events : ('a -> 'string event_name) -> ('a -> Adef.cdate) -> 'a list -> 'a list

      Sort events (both peronal and familial) by their date and their name

      val merge_events : ('a -> 'string event_name) -> ('a -> Adef.cdate) -> 'a list -> 'a list -> 'a list

      Merge two sorted event lists (returns sorted list)

      val check_siblings : ?onchange:bool -> Gwdb.base -> (base_warning -> unit) -> (Gwdb.ifam * Gwdb.family) -> (Gwdb.person -> unit) -> unit

      check_siblings ?onchange base warning (ifam, fam) callback Checks birth date consistency between siblings. Also calls callback with each child.

      val person : ?onchange:bool -> +Gwdb.base -> (base_warning -> unit) -> Gwdb.person -> (Gwdb.iper * Gwdb.person * Def.sex option * Gwdb.relation list option) list option

      person onchange base warn p checks person's properties:

      • personal events
      • person's age
      • person's titles dates
      • etc. If onchange is set then sort person's events Calls warn on corresponding base_warning when find some inconsistencies.
      val family : ?onchange:bool -> Gwdb.base -> (base_warning -> unit) -> Gwdb.ifam -> Gwdb.family -> unit

      family onchange base warn f checks family properties like :

      • familial events
      • parents marraige
      • children age gap and birth
      • etc. If onchange is set then sort family's events Calls warn on corresponding base_warning when find some inconsistencies.
      val on_person_update : Gwdb.base -> (base_warning -> unit) -> Gwdb.person -> unit

      Unlike person who checks directly the properties of a person, checks the properties of a person in relation to other people (his children, parents, spouses, witnesses, etc). Calls warn on corresponding base_warning when find some inconsistencies.

      val sort_children : Gwdb.base -> Gwdb.iper array -> (Gwdb.iper array * Gwdb.iper array) option

      Sort array of children by their birth date from oldest to youngest. Returns old array and sorted version.

      val check_other_fields : Gwdb.base -> (base_misc -> unit) -> Gwdb.ifam -> Gwdb.family -> unit

      Cheks if family, father and mother have sources. Otherwise call misc on base_misc

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Config/index.html b/static/doc/geneweb/Geneweb/Config/index.html new file mode 100644 index 0000000000..4e10ea45ab --- /dev/null +++ b/static/doc/geneweb/Geneweb/Config/index.html @@ -0,0 +1,2 @@ + +Config (geneweb.Geneweb.Config)

      Module Geneweb.Config

      type auth_scheme_kind =
      | NoAuth
      | TokenAuth of token_auth_scheme
      | HttpAuth of http_auth_scheme

      Authentication scheme data type

      and token_auth_scheme = {
      ts_user : string;
      ts_pass : string;
      }

      Authentication via security token

      and http_auth_scheme =
      | Basic of basic_auth_scheme
      | Digest of digest_auth_scheme

      Authentication via HTTP

      and basic_auth_scheme = {
      bs_realm : string;
      bs_user : string;
      bs_pass : string;
      }

      Basic authentication scheme inside Autorization HTTP header

      and digest_auth_scheme = {
      ds_username : string;
      ds_realm : string;
      ds_nonce : string;
      ds_meth : string;
      ds_uri : string;
      ds_qop : string;
      ds_nc : string;
      ds_cnonce : string;
      ds_response : string;
      }

      Digest authentication scheme inside Autorization HTTP header

      type output_conf = {
      status : Def.httpStatus -> unit;
      header : string -> unit;
      body : string -> unit;
      flush : unit -> unit;
      }

      HTTP printer, that prints and sends requests on the user's socket

      type config = {
      from : string;
      api_mode : bool;
      manitou : bool;
      supervisor : bool;
      wizard : bool;
      is_printed_by_template : bool;
      debug : bool;
      friend : bool;
      just_friend_wizard : bool;
      user : string;
      username : string;
      auth_scheme : auth_scheme_kind;
      command : string;
      indep_command : string;
      highlight : string;
      lang : string;
      default_lang : string;
      default_sosa_ref : Gwdb.iper * Gwdb.person option;
      multi_parents : bool;
      authorized_wizards_notes : bool;
      public_if_titles : bool;
      public_if_no_date : bool;
      access_by_key : bool;
      private_years : int;
      hide_names : bool;
      use_restrict : bool;
      no_image : bool;
      no_note : bool;
      bname : string;
      cgi_passwd : string;
      env : (string * string) list;
      mutable senv : (string * string) list;
      mutable henv : (string * string) list;
      base_env : (string * string) list;
      allowed_titles : string list Stdlib.Lazy.t;
      denied_titles : string list Stdlib.Lazy.t;
      request : string list;
      lexicon : (string, string) Stdlib.Hashtbl.t;
      mutable charset : string;
      is_rtl : bool;
      left : string;
      right : string;
      auth_file : string;
      border : int;
      mutable n_connect : (int * int * int * (string * float) list) option;
      today : Def.dmy;
      today_wd : int;
      time : int * int * int;
      ctime : float;
      mutable output_conf : output_conf;
      image_prefix : string;
      cgi : bool;
      forced_plugins : string list;
      plugins : string list;
      }

      Geneweb configuration data type

      val empty : config

      A dummy config value, with uninitialized fields. Used for testing purpose

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Cousins/index.html b/static/doc/geneweb/Geneweb/Cousins/index.html new file mode 100644 index 0000000000..c4eec33021 --- /dev/null +++ b/static/doc/geneweb/Geneweb/Cousins/index.html @@ -0,0 +1,2 @@ + +Cousins (geneweb.Geneweb.Cousins)

      Module Geneweb.Cousins

      val default_max_cnt : int

      Default number of relatives that could be listed at the same page

      val children_of_fam : Gwdb.base -> Gwdb.ifam -> Gwdb.iper list

      Retruns list of children of the giving family

      val siblings : Config.config -> Gwdb.base -> Gwdb.iper -> (Gwdb.iper * (Gwdb.iper * Def.sex)) list

      Returns list of person's siblings that includes also half-blood siblings. Every sibling is annotated with parent's id and parent's sex. For common father's and mother's childran father's annotation is preserved.

      val has_desc_lev : Config.config -> Gwdb.base -> int -> Gwdb.person -> bool

      has_desc_lev conf base lev p tells if person p has descendants at the level lev. lev 2 represents his children, 3 represents grandchildren, etc.

      val br_inter_is_empty : ('a * 'b) list -> ('a * 'c) list -> bool

      Tells if two family branches don't itersect

      val sibling_has_desc_lev : Config.config -> Gwdb.base -> int -> (Gwdb.iper * 'a) -> bool

      Same as has_desc_lev but used for a person's sibling as returned by siblings.

      val sosa_of_persons : Config.config -> Gwdb.base -> Gwdb.iper list -> int

      Returns sosa number calculated from the giving ancestors list.

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/CousinsDisplay/index.html b/static/doc/geneweb/Geneweb/CousinsDisplay/index.html new file mode 100644 index 0000000000..d83e1f19ac --- /dev/null +++ b/static/doc/geneweb/Geneweb/CousinsDisplay/index.html @@ -0,0 +1,2 @@ + +CousinsDisplay (geneweb.Geneweb.CousinsDisplay)

      Module Geneweb.CousinsDisplay

      val print : Config.config -> Gwdb.base -> Gwdb.person -> unit

      Displays the menu that lists all person's relatives depending on ancestor and his descandant levels specified by conf.env variables v1 (for ancestor) and v2 for his descandant. For exemple :

      "v1" = 1, "v2" = 1 - Displays all person's siblings (mount to the person's parent (ancestor of level 1) and lists all his children (descandant of level 1)); "v1" = 2, "v2" = 2 - Displays all cousins; "v1" = 2, "v2" = 1 - Displays all uncles/aunts; "v1" = 1, "v2" = 2 - Displays all nieces/nephews; etc.

      Variable "t" is used to display anniversaries for relatives like BirthdayDisplay.gen_print. If nor of those variables are defined, prints menu that allows to access the most common relatives (except for direct relatives) like cousins, siblings, uncles/aunts, etc.

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Dag/Pset/index.html b/static/doc/geneweb/Geneweb/Dag/Pset/index.html new file mode 100644 index 0000000000..1f46a10452 --- /dev/null +++ b/static/doc/geneweb/Geneweb/Dag/Pset/index.html @@ -0,0 +1,2 @@ + +Pset (geneweb.Geneweb.Dag.Pset)

      Module Dag.Pset

      type t = Gwdb.iper list
      type elt = Gwdb.iper
      val add : 'a -> 'a list -> 'a list
      val empty : 'a list
      val elements : 'a list -> 'a list
      val mem : 'a -> 'a list -> bool
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Dag/index.html b/static/doc/geneweb/Geneweb/Dag/index.html new file mode 100644 index 0000000000..07c3dc88cc --- /dev/null +++ b/static/doc/geneweb/Geneweb/Dag/index.html @@ -0,0 +1,2 @@ + +Dag (geneweb.Geneweb.Dag)

      Module Geneweb.Dag

      module Pset : sig ... end
      val get_dag_elems : Config.config -> Gwdb.base -> Gwdb.iper list
      type ('a, 'b) sum = ('a'b) Def.choice
      val make_dag : Config.config -> Gwdb.base -> Gwdb.iper list -> (Gwdb.iper, int) Def.choice Dag2html.dag
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Dag2html/index.html b/static/doc/geneweb/Geneweb/Dag2html/index.html new file mode 100644 index 0000000000..72db3c0d7d --- /dev/null +++ b/static/doc/geneweb/Geneweb/Dag2html/index.html @@ -0,0 +1,2 @@ + +Dag2html (geneweb.Geneweb.Dag2html)

      Module Geneweb.Dag2html

      type 'a dag = {
      mutable dag : 'a node array;
      }
      and 'a node = {
      mutable pare : idag list;
      valu : 'a;
      mutable chil : idag list;
      }
      and idag
      val int_of_idag : idag -> int
      val idag_of_int : int -> idag
      type 'a table = {
      mutable table : 'a data array array;
      }
      and 'a data = {
      mutable elem : 'a elem;
      mutable span : span_id;
      }
      and 'a elem =
      | Elem of 'a
      | Ghost of ghost_id
      | Nothing
      and span_id
      and ghost_id
      type align =
      | LeftA
      | CenterA
      | RightA
      type ('a, 'b) table_data =
      | TDitem of 'a
      | TDtext of string
      | TDhr of align
      | TDbar of 'b option
      | TDnothing
      type ('a, 'b) html_table_line = (int * align * ('a'b) table_data) array
      type ('a, 'b) html_table = ('a'b) html_table_line array
      val html_table_struct : ('a node -> 'b) -> ('a node -> 'c) -> ('a node -> bool) -> 'a dag -> idag table -> (int * align * ('b'c) table_data) array array
      val table_of_dag : ('a node -> bool) -> bool -> bool -> bool -> 'a dag -> idag table
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/DagDisplay/index.html b/static/doc/geneweb/Geneweb/DagDisplay/index.html new file mode 100644 index 0000000000..f7f24a1f10 --- /dev/null +++ b/static/doc/geneweb/Geneweb/DagDisplay/index.html @@ -0,0 +1,2 @@ + +DagDisplay (geneweb.Geneweb.DagDisplay)

      Module Geneweb.DagDisplay

      val image_txt : Config.config -> Gwdb.base -> Gwdb.person -> string
      type item =
      | Item of Gwdb.person * string
      val make_tree_hts : Config.config -> Gwdb.base -> (Gwdb.person -> item) -> (Gwdb.iper -> string) -> bool -> Gwdb.iper list -> (Gwdb.iper * (Gwdb.iper * Gwdb.ifam option)) list -> (Gwdb.iper'a) Def.choice Dag2html.dag -> (int * Dag2html.align * (string, string) Dag2html.table_data) array array
      type dag_item = string
      val print_slices_menu_or_dag_page : Config.config -> string -> (int * Dag2html.align * (dag_item, string) Dag2html.table_data) array array -> string -> unit
      val make_and_print_dag : Config.config -> Gwdb.base -> (Gwdb.person -> item) -> (Gwdb.iper -> string) -> bool -> Gwdb.iper list -> (Gwdb.iper * (Gwdb.iper * Gwdb.ifam option)) list -> string -> string -> unit
      val print : Config.config -> Gwdb.base -> unit
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/DateDisplay/index.html b/static/doc/geneweb/Geneweb/DateDisplay/index.html new file mode 100644 index 0000000000..b7c3a58135 --- /dev/null +++ b/static/doc/geneweb/Geneweb/DateDisplay/index.html @@ -0,0 +1,3 @@ + +DateDisplay (geneweb.Geneweb.DateDisplay)

      Module Geneweb.DateDisplay

      val get_wday : Config.config -> Def.date -> string

      get_wday conf date Return the day of the week for this date

      val code_dmy : Config.config -> Def.dmy -> string

      Returns textual representation of the date translated to the current language. Uses different encodings depending on day's, month's and year's accessibility. Doesn't consider precision.

      val string_of_dmy : Config.config -> Def.dmy -> string

      Converts and translate date to the textual representation for the giving language. Considers precision.

      val string_of_date : Config.config -> Def.date -> string

      If date is Dgreg calls for string_of_dmy to convert date to the string else returns content of Dtext. Difference between calendars is not taken into the acount.

      val string_of_ondate : ?link:bool -> Config.config -> Def.date -> string

      Converts and translate date with considering different calendars with prefix "on" before dates (changes for other languages). Date precision is much more verbose then with string_of_date. Decline phrase if needed. If link is true then encapsulates result in HTML link to the page calendar's date converter.

      val string_slash_of_date : Config.config -> Def.date -> string

      Returns date in format dd/mm/yyyy. Format could be different for other languages (defined by !dates order keyword in the lexicon).

      val string_of_age : Config.config -> Def.dmy -> string

      Returns textual representation of the age represented by dmy.

      val prec_year_text : Config.config -> Def.dmy -> string

      Returns textual representation of date's precision and year.

      val prec_text : Config.config -> Def.dmy -> string

      Returns textual representation of date's precision

      val month_text : Def.dmy -> string

      Returns textual representation of date's month number.

      val year_text : Def.dmy -> string

      Returns textual representation of date's year.

      val short_dates_text : Config.config -> Gwdb.base -> Gwdb.person -> string

      Returns concatenation of person's birth and death dates (if exists). Precision is mentionned for each date. For example :

      * 1700-1780 (birth - death) * 1700- (birth - death but don't know when) * 1700 (birth - alive) * †1780 (unknown birth date - death) * † (unknown birth date - death but don't know when)

      val short_marriage_date_text : Config.config -> Gwdb.base -> Gwdb.family -> Gwdb.person -> Gwdb.person -> string

      Retruns year of marriage for given spouses with its precision.

      val death_symbol : Config.config -> string

      death_symbol conf Return the value associated to "death_symbol" in .gwf file if it is defined, or use "†" if it is not.

      val code_french_year : Config.config -> int -> string

      Returns roman number of the year of French calendar

      val string_of_date_aux : ?link:bool -> ?dmy:(Config.config -> Def.dmy -> string) -> ?sep:string -> +Config.config -> Def.date -> string

      Same as string_of_ondate except :

      • Conversion function for Def.dmy could be passed in in dmy argument
      • Doesn't consider phrase declination as string_of_ondate does.
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/DescendDisplay/index.html b/static/doc/geneweb/Geneweb/DescendDisplay/index.html new file mode 100644 index 0000000000..95eb3c1165 --- /dev/null +++ b/static/doc/geneweb/Geneweb/DescendDisplay/index.html @@ -0,0 +1,2 @@ + +DescendDisplay (geneweb.Geneweb.DescendDisplay)

      Module Geneweb.DescendDisplay

      val display_descendants_level : Config.config -> Gwdb.base -> int -> Gwdb.person -> unit

      Displays only descendants for specified level in unordered lists

      val display_descendants_with_numbers : Config.config -> Gwdb.base -> int -> Gwdb.person -> unit

      Displays descendants with numerated by letter list. Title links to descendats index

      val display_descendant_index : Config.config -> Gwdb.base -> int -> Gwdb.person -> unit

      Displays index of descendants

      val display_spouse_index : Config.config -> Gwdb.base -> int -> Gwdb.person -> unit

      Displays index of descendant's spouses

      val display_descendant_with_table : Config.config -> Gwdb.base -> int -> Gwdb.person -> unit

      Displays descendants in the table where rows are ordered by D'Aboville number.

      val print_tree : Config.config -> Gwdb.base -> int -> Gwdb.person -> unit

      Displays tree of descendants

      val print_aboville : Config.config -> Gwdb.base -> int -> Gwdb.person -> unit

      Displays descendants as follows :

      person | desc1 | desc2 | | desc21 | desc3

      val desmenu_print : Config.config -> Gwdb.base -> Gwdb.person -> unit

      Prints form that allows to customise display of descendants

      val print : Config.config -> Gwdb.base -> Gwdb.person -> unit

      Displays the descendants of the selected in conv.env person. Descendants could be displayed by different ways depending on variable t in conv.env environement:

      • "L" dispalying descendants in unordered list
      • "F" same as "L" but displays only female line
      • "M" same as "L" but displays only female line
      • "H" table dispalying
      • "I" table dispalying with spouses information
      • "A" numerated list (d'Aboville)
      • "V" displaying a tree of descendants

      Previous dispalyings are done by template evaluation. Next ones are done by functions inside this module:

      • "B" for print_aboville
      • "S" for display_descendants_level
      • "K" for display_descendant_with_table
      • "N" for display_descendants_with_numbers
      • "G" for display_descendant_index
      • "C" for display_spouse_index
      • "T" for print_tree

      Variable v is used to select maximal level to descend for descendant displaying (1 for children, 2 for grandchildren, etc). If t variable isn't defined, then displays the form that allows customising of display.

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Difference/index.html b/static/doc/geneweb/Geneweb/Difference/index.html new file mode 100644 index 0000000000..a4cc1ee993 --- /dev/null +++ b/static/doc/geneweb/Geneweb/Difference/index.html @@ -0,0 +1,2 @@ + +Difference (geneweb.Geneweb.Difference)

      Module Geneweb.Difference

      Differences between two arrays.

      val f : 'a array -> 'a array -> bool array * bool array

      Difference.f a1 a2 returns a couple of two arrays of booleans (d1, d2). d1 has the same size as a1. d2 has the same size as a2. d1.(i) is True if a1.(i) has no corresponding value in a2. d2.(i) is True if a2.(i) has no corresponding value in a1. d1 and s2 have the same number of values equal to False.

      Can be used to write the diff program (comparison of two files), the input arrays being the array of lines of each file.

      Can be used also to compare two strings (they must have been exploded into arrays of chars), or two DNA strings, and so on.

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Fixbase/index.html b/static/doc/geneweb/Geneweb/Fixbase/index.html new file mode 100644 index 0000000000..5a68510ce6 --- /dev/null +++ b/static/doc/geneweb/Geneweb/Fixbase/index.html @@ -0,0 +1,2 @@ + +Fixbase (geneweb.Geneweb.Fixbase)

      Module Geneweb.Fixbase

      All the function of this module scan the base and fix what is considered as corrupted data.

      They all share a same signature : let check_XXX ?report progress base = ...

      The optionnal report function should be used to track changes.

      progress i max keep tracks of the progress of a task. When called, task is about i/max done.

      Note that it does not actually commit the changes, so if you do not want a dry run, apply Gwdb.commit_patches

      type patch =
      | Fix_NBDS of Gwdb.iper
      | Fix_AddedUnion of Gwdb.iper
      | Fix_AddedParents of Gwdb.iper
      | Fix_ParentDeleted of Gwdb.iper
      | Fix_AddedChild of Gwdb.ifam
      | Fix_RemovedUnion of Gwdb.iper * Gwdb.ifam
      | Fix_RemovedDuplicateUnion of Gwdb.iper * Gwdb.ifam
      | Fix_AddedRelatedFromPevent of Gwdb.iper * Gwdb.iper
      | Fix_AddedRelatedFromFevent of Gwdb.iper * Gwdb.iper
      | Fix_MarriageDivorce of Gwdb.ifam
      | Fix_MissingSpouse of Gwdb.ifam * Gwdb.iper
      | Fix_WrongUTF8Encoding of Gwdb.ifam option * Gwdb.iper option * (Gwdb.istr * Gwdb.istr) option
      | Fix_UpdatedOcc of Gwdb.iper * int * int

      All possible patches that could be automatically deducted from incontinent or absent information in the database

      val check_NBDS : ?report:(patch -> unit) -> (int -> int -> unit) -> Gwdb.base -> unit

      For every person in the base synchronise his birth, death, baptism and burial events with his fields and vice versa.

      val check_families_parents : ?report:(patch -> unit) -> (int -> int -> unit) -> Gwdb.base -> unit

      For every family's parent in the base add current family to the parent's union (if absent).

      val check_families_children : ?report:(patch -> unit) -> (int -> int -> unit) -> Gwdb.base -> unit

      For every family's childran in the base add current family to the childran's ascendants (if absent). Doesn't modify consanguinity rate.

      val check_persons_parents : ?report:(patch -> unit) -> (int -> int -> unit) -> Gwdb.base -> unit

      For every person checks it ascendants. If it references to the dummy family, then remove this reference. Otherwise add person to the family's children if he is absent.

      val check_persons_families : ?report:(patch -> unit) -> (int -> int -> unit) -> Gwdb.base -> unit

      For every person in the base removes all duplicate families and families where person isn't a parent

      val check_pevents_witnesses : ?report:(patch -> unit) -> (int -> int -> unit) -> Gwdb.base -> unit

      For every person's event's witness add current person to the list of related persons if absent.

      val check_fevents_witnesses : ?report:(patch -> unit) -> (int -> int -> unit) -> Gwdb.base -> unit

      For every family's event's witness add family's father to the list of related persons if absent.

      val fix_marriage_divorce : ?report:(patch -> unit) -> (int -> int -> unit) -> Gwdb.base -> unit

      For every family in the base synchronise its fields with marriage and divorce events.

      val fix_missing_spouses : ?report:(patch -> unit) -> (int -> int -> unit) -> Gwdb.base -> unit

      For every family's missing parent (or spouse) fix his id and add current family to the parent's union

      val fix_utf8_sequence : ?report:(patch -> unit) -> (int -> int -> unit) -> Gwdb.base -> unit

      For every person's and family's string remplace it with normalized UTF8 version

      val fix_key : ?report:(patch -> unit) -> (int -> int -> unit) -> Gwdb.base -> unit

      For every person in the base update his occurence number if someone with same name and same occurence number already exists in the base.

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/GWPARAM/index.html b/static/doc/geneweb/Geneweb/GWPARAM/index.html new file mode 100644 index 0000000000..ce5dfbdf99 --- /dev/null +++ b/static/doc/geneweb/Geneweb/GWPARAM/index.html @@ -0,0 +1,2 @@ + +GWPARAM (geneweb.Geneweb.GWPARAM)

      Module Geneweb.GWPARAM

      type syslog_level = [
      | `LOG_ALERT
      | `LOG_CRIT
      | `LOG_DEBUG
      | `LOG_EMERG
      | `LOG_ERR
      | `LOG_INFO
      | `LOG_NOTICE
      | `LOG_WARNING
      ]

      The level of log gravity (`LOG_WARNING the lightest).

      val init : (unit -> unit) Stdlib.ref

      Inititialise assets for gwd server (one in current directory one in /usr/share/geneweb)

      val base_path : (string list -> string -> string) Stdlib.ref

      !base_path pref fname default function that returns path to fname inside base directory where pref is a list of subdirectories between base directory and fname.

      val bpath : (string -> string) Stdlib.ref

      !bpath fname default function that returns path to fname inside base directory

      val output_error : (?headers:string list -> ?content:string -> Config.config -> Def.httpStatus -> unit) Stdlib.ref

      !output_error ?headers ?content conf status default function that send the http status status, headers and content if provided. Otherwise send default content from /etc/<status-code>-<lang>.html

      val p_auth : (Config.config -> Gwdb.base -> Gwdb.person -> bool) Stdlib.ref

      Calculate the access rights to the person's information in according to his age. Returns (in the order of the tests) :

      • True if : requester is wizard or friend or person is public
      • True if : person has at least one title and public_if_title is set to yes in gwf config file
      • False if : person is alive and private_years > 0
      • True if : person is older (depending on the date of birth or baptism date) then privates_years
      • False if : person is younger (depending on the date of birth or baptism date) then privates_years
      • True if : person has been deceased for more than privates_years
      • False if : person has been deceased for less than privates_years
      • True if : person is between 80 and 120 years old and he is not beeing private and public_if_no_date is set to yes in gwf config file
      • True if : person has been married for more than private_years
      • False otherwise
      val syslog : (syslog_level -> string -> unit) Stdlib.ref

      !syslog level log log message log with gravity level level on stderr.

      val wrap_output : (Config.config -> string -> (unit -> unit) -> unit) Stdlib.ref
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/GWPARAM_ITL/index.html b/static/doc/geneweb/Geneweb/GWPARAM_ITL/index.html new file mode 100644 index 0000000000..122fdff886 --- /dev/null +++ b/static/doc/geneweb/Geneweb/GWPARAM_ITL/index.html @@ -0,0 +1,2 @@ + +GWPARAM_ITL (geneweb.Geneweb.GWPARAM_ITL)

      Module Geneweb.GWPARAM_ITL

      val init_cache : (Config.config -> Gwdb.base -> Gwdb.iper -> int -> int -> int -> unit) Stdlib.ref

      init_cache conf base ip nb_asc from_gen_desc nb_desc

      val max_ancestor_level : (Config.config -> Gwdb.base -> Gwdb.iper -> string -> int -> int -> int) Stdlib.ref
      val max_descendant_level : (Config.config -> Gwdb.base -> Gwdb.iper -> int -> int) Stdlib.ref
      val tree_generation_list : (Config.config -> Gwdb.base -> string -> Gwdb.person -> (Gwdb.person * Gwdb.ifam * string) option * (Gwdb.person * Gwdb.ifam * string) option) Stdlib.ref
      val get_father : (Config.config -> Gwdb.base -> string -> Gwdb.iper -> ((Gwdb.person * bool) * string) option) Stdlib.ref
      val get_mother : (Config.config -> Gwdb.base -> string -> Gwdb.iper -> ((Gwdb.person * bool) * string) option) Stdlib.ref
      val get_person : (Config.config -> Gwdb.base -> string -> Gwdb.iper -> ((Gwdb.person * bool) * string) option) Stdlib.ref
      val get_father' : (Config.config -> Gwdb.base -> Gwdb.iper -> (string * (Gwdb.person * bool) * Gwdb.ifam * Gwdb.family * (Gwdb.iper * Gwdb.iper * Gwdb.iper)) option) Stdlib.ref
      val get_mother' : (Config.config -> Gwdb.base -> Gwdb.iper -> (string * (Gwdb.person * bool) * Gwdb.ifam * Gwdb.family * (Gwdb.iper * Gwdb.iper * Gwdb.iper)) option) Stdlib.ref
      val get_family : (Config.config -> Gwdb.base -> string -> Gwdb.person -> Gwdb.ifam -> (Gwdb.family * (Gwdb.iper * Gwdb.iper * Gwdb.iper) * bool) option) Stdlib.ref
      val get_families : (Config.config -> Gwdb.base -> Gwdb.person -> (Gwdb.ifam * Gwdb.family * (Gwdb.iper * Gwdb.iper * Gwdb.person) * string * bool) list) Stdlib.ref
      val get_children_of_parents : (Gwdb.base -> string -> Gwdb.ifam -> Gwdb.iper -> Gwdb.iper -> (Gwdb.person * string) list) Stdlib.ref
      val get_children : (Gwdb.base -> string -> Gwdb.ifam -> Gwdb.iper -> Gwdb.iper -> ((Gwdb.person * bool) * string) list) Stdlib.ref
      val get_children' : (Config.config -> Gwdb.base -> Gwdb.iper -> Gwdb.family -> Gwdb.iper -> (string * (Gwdb.iper * Gwdb.iper * Gwdb.iper) * ((Gwdb.person * bool) * string * bool) list) list) Stdlib.ref
      val has_children : (Config.config -> Gwdb.base -> Gwdb.person -> Gwdb.family -> bool) Stdlib.ref
      val has_family_correspondance : (string -> Gwdb.iper -> bool) Stdlib.ref
      val has_siblings : (string -> Gwdb.iper -> bool) Stdlib.ref
      val nb_children : (string -> Gwdb.ifam -> int) Stdlib.ref
      val nb_families : (string -> Gwdb.iper -> int) Stdlib.ref
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Gwlib/index.html b/static/doc/geneweb/Geneweb/Gwlib/index.html new file mode 100644 index 0000000000..4b7926199c --- /dev/null +++ b/static/doc/geneweb/Geneweb/Gwlib/index.html @@ -0,0 +1,2 @@ + +Gwlib (geneweb.Geneweb.Gwlib)

      Module Geneweb.Gwlib

      val prefix : string
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/History/index.html b/static/doc/geneweb/Geneweb/History/index.html new file mode 100644 index 0000000000..b7c401adcf --- /dev/null +++ b/static/doc/geneweb/Geneweb/History/index.html @@ -0,0 +1,2 @@ + +History (geneweb.Geneweb.History)

      Module Geneweb.History

      val file_name : Config.config -> string

      Retruns path to the file where history of updates is stored

      val record : Config.config -> Gwdb.base -> (Gwdb.iperGwdb.iperGwdb.ifam, string) Def.base_changed -> string -> unit

      record conf change action records new modification in the history files (global file and specific for each concerned by modification person). Additionaly it does:

      • Updates conf.default_sosa_ref if concered by modification person is referenced by default_sosa_ref
      • Notify foreign notify_change about modification on the base (doesn't notify if multiple modifications are done succesively)
      val notify : Config.config -> Gwdb.base -> string -> unit

      notify conf base action Explicit notification of foreign script notify_change that modification action action was executed on the database. Since record already does notify script about unary modification on the base, this function is used exclusively to send notification about multiple modifications and avoid creating indefinite amount of processes for each modification (for example for each concerned person in the list of modified persons).

      val print : Config.config -> Gwdb.base -> unit

      Displays an history of updates

      Same as `print`, but simultaneously searches for text inside the history and higlhight all found matches. Search pattern is available with s variable in environement conf.env.

      val line_fields : string -> (string * string * string * string option) option

      Parses one line of history file that delimits one modification record.

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/HistoryDiff/index.html b/static/doc/geneweb/Geneweb/HistoryDiff/index.html new file mode 100644 index 0000000000..395b04264c --- /dev/null +++ b/static/doc/geneweb/Geneweb/HistoryDiff/index.html @@ -0,0 +1,2 @@ + +HistoryDiff (geneweb.Geneweb.HistoryDiff)

      Module Geneweb.HistoryDiff

      type gen_record = {
      date : string;
      wizard : string;
      gen_p : (Gwdb.iperGwdb.iper, string) Def.gen_person;
      gen_f : (Gwdb.iperGwdb.ifam, string) Def.gen_family list;
      gen_c : Gwdb.iper array list;
      }

      Type that represnets one update record stored in the history file for concerned person.

      val history_file : string -> string -> int -> string

      Returns history filename for the person with the given key. Has format : firstname.occ.surname

      val history_path : Config.config -> string -> string

      Returns path to the history file inside history_d with given filename

      val record_diff : Config.config -> Gwdb.base -> (Gwdb.iperGwdb.iperGwdb.ifam, string) Def.base_changed -> unit

      record_diff conf base change records new updated information change inside the history files of concerned by change persons. 

      val load_person_history : Config.config -> string -> gen_record list

      Loadlist of modification records for a giving person's history file. The most recent modification is at the head of the list

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/HistoryDiffDisplay/index.html b/static/doc/geneweb/Geneweb/HistoryDiffDisplay/index.html new file mode 100644 index 0000000000..0c71bc6958 --- /dev/null +++ b/static/doc/geneweb/Geneweb/HistoryDiffDisplay/index.html @@ -0,0 +1,2 @@ + +HistoryDiffDisplay (geneweb.Geneweb.HistoryDiffDisplay)

      Module Geneweb.HistoryDiffDisplay

      val print_clean : Config.config -> unit

      Displays page that allows to select all revision of the history file in argument that user may want to clean

      val print_clean_ok : Config.config -> unit

      Cleans the history associated to the history file in argument

      val print : Config.config -> Gwdb.base -> unit

      Displays the page that allows to select (with variable t = "SUM") and to view (with variable t = "DIFF") the difference between all revisions of history file of concerned person in variable f. Intepretate the template file updhist_diff.txt

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Hutil/index.html b/static/doc/geneweb/Geneweb/Hutil/index.html new file mode 100644 index 0000000000..d5128bdb24 --- /dev/null +++ b/static/doc/geneweb/Geneweb/Hutil/index.html @@ -0,0 +1,2 @@ + +Hutil (geneweb.Geneweb.Hutil)

      Module Geneweb.Hutil

      val header_without_http : Config.config -> (bool -> unit) -> unit

      header_without_http conf title pritns HTML page header in the body of the current response on the socket. HTML page header consists of :

      • <!DOCTYPE> Declaration
      • <head> tag where :
      • content of <title> tag is get with title true
      • <meta> and <link> tags are filled due to conf
      • content of <style> tag is evaluated and send by interpretation of template etc/css.txt
      • Opening <body> tag with its attributes
      • If user is a wizard or a friend, then includes all messages send to him.
      val gen_trailer : bool -> Config.config -> unit

      gen_trailer with_logo prints HTML page trailer in the body of the current response on the socket. HTML page header consists of :

      • Copyright message from template etc/copyr.txt with inserted logo if with_logo is true
      • Scripts JS from template etc/js.txt
      • Closing <body> and <html> tags
      val header_without_page_title : Config.config -> (bool -> unit) -> unit

      Calls for Util.html to print HTTP header and for header_without_http to print HTML page header. Additionaly prints opening container <div> tag on the socket.

      val header : Config.config -> (bool -> unit) -> unit

      header conf title calls for header_without_page_title to print HTTP header and HTML page header. Additionaly prints page title with title true (false to print browser tab title).

      val header_no_page_title : Config.config -> (bool -> unit) -> unit

      Same as header but takes page title from conf.env.

      val header_fluid : Config.config -> (bool -> unit) -> unit

      Pritns HTML page header (without HTTP headers) and opens fluid container <div> (see Bootstrap).

      Same as header but insert links to previous and home pages (with print_link_to_welcome) before page title.

      val trailer : Config.config -> unit

      Same as gen_trailer true.

      val rheader : Config.config -> (bool -> unit) -> unit

      Same as header except page's title informs about an occured error (red title).

      Returns the HTML link to the previous (referer) page

      gen_print_link_to_welcome f conf right_alined prints links to previous and to home pages. f is used to print additional content before links.

      Calls gen_print_link_to_welcome with empty function f.

      val incorrect_request : Config.config -> unit

      Sends Bad Request HTTP response (same as GWPARAM.output_error conf Bad_Request)

      val interp : Config.config -> string -> ('a'b) Templ.interp_fun -> 'a Templ.env -> 'b -> unit
      val interp_no_header : Config.config -> string -> ('a'b) Templ.interp_fun -> 'a Templ.env -> 'b -> unit
      val print_calendar : Config.config -> unit

      Displays the calendar; if no key is set, it will use today's date. Based on template file calendar.txt

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/ImageDisplay/index.html b/static/doc/geneweb/Geneweb/ImageDisplay/index.html new file mode 100644 index 0000000000..55c809c562 --- /dev/null +++ b/static/doc/geneweb/Geneweb/ImageDisplay/index.html @@ -0,0 +1,2 @@ + +ImageDisplay (geneweb.Geneweb.ImageDisplay)

      Module Geneweb.ImageDisplay

      val print_image_file : Config.config -> string -> bool

      print_image_file conf fname send HTTP respose with content of an image file at the path fname. MIME type of an image is deducted from fname extension. Returns false if image wasn't found or couldn't be send.

      val print : Config.config -> Gwdb.base -> unit

      Searhes image's filename in the environement conf.env and sends HTTP respose with its content on the socket. If filename isn't presented, looks up personal image for person's mentionned in conf.env

      val print_html : Config.config -> unit

      Sends HTTP respose with HTML page containg just image specified in arguments.

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/MergeDisplay/index.html b/static/doc/geneweb/Geneweb/MergeDisplay/index.html new file mode 100644 index 0000000000..64fe1c5c1d --- /dev/null +++ b/static/doc/geneweb/Geneweb/MergeDisplay/index.html @@ -0,0 +1,2 @@ + +MergeDisplay (geneweb.Geneweb.MergeDisplay)

      Module Geneweb.MergeDisplay

      val print_someone : Config.config -> Gwdb.base -> Gwdb.person -> unit

      Prints person's key on the socket

      val print : Config.config -> Gwdb.base -> Gwdb.person -> unit

      Displays a menu for merging two persons

      val print_possible_continue_merging : Config.config -> Gwdb.base -> unit

      Prints link on the page to continue merging two persons (or two duplications).

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/MergeDupDisplay/index.html b/static/doc/geneweb/Geneweb/MergeDupDisplay/index.html new file mode 100644 index 0000000000..803898cd64 --- /dev/null +++ b/static/doc/geneweb/Geneweb/MergeDupDisplay/index.html @@ -0,0 +1,2 @@ + +MergeDupDisplay (geneweb.Geneweb.MergeDupDisplay)

      Module Geneweb.MergeDupDisplay

      val main_page : Config.config -> Gwdb.base -> unit

      Displays a menu for merging possible duplications of persons

      val answ_ind_y_n : Config.config -> Gwdb.base -> unit

      Either displays the merge dupliate menu if `answer_y` is not a key of the request, or a form for merging two persons

      val answ_fam_y_n : Config.config -> Gwdb.base -> unit

      Same than `answ_ind_y_n` but for families

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/MergeFamDisplay/index.html b/static/doc/geneweb/Geneweb/MergeFamDisplay/index.html new file mode 100644 index 0000000000..e32ab54e61 --- /dev/null +++ b/static/doc/geneweb/Geneweb/MergeFamDisplay/index.html @@ -0,0 +1,2 @@ + +MergeFamDisplay (geneweb.Geneweb.MergeFamDisplay)

      Module Geneweb.MergeFamDisplay

      val print_differences : Config.config -> Gwdb.base -> (Gwdb.iper * Gwdb.iper) list -> (Gwdb.ifam * Gwdb.family) -> (Gwdb.ifam * Gwdb.family) -> unit

      Displays differences between couples ; relation kind, marriage, marriage place and divorce.

      val print : Config.config -> Gwdb.base -> unit

      Displays a menu for merging families. Couples must be identical (modulo reversion).

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/MergeFamOk/index.html b/static/doc/geneweb/Geneweb/MergeFamOk/index.html new file mode 100644 index 0000000000..bc0af02d20 --- /dev/null +++ b/static/doc/geneweb/Geneweb/MergeFamOk/index.html @@ -0,0 +1,2 @@ + +MergeFamOk (geneweb.Geneweb.MergeFamOk)

      Module Geneweb.MergeFamOk

      val print_merge : Config.config -> Gwdb.base -> unit
      val print_mod_merge : Config.config -> Gwdb.base -> unit
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/MergeInd/index.html b/static/doc/geneweb/Geneweb/MergeInd/index.html new file mode 100644 index 0000000000..63d29d3245 --- /dev/null +++ b/static/doc/geneweb/Geneweb/MergeInd/index.html @@ -0,0 +1,2 @@ + +MergeInd (geneweb.Geneweb.MergeInd)

      Module Geneweb.MergeInd

      val reparent_ind : Gwdb.base -> (CheckItem.base_warning -> unit) -> Gwdb.iper -> Gwdb.iper -> unit
      exception Error_loop of Gwdb.person
      exception Same_person
      exception Different_sexes of Gwdb.person * Gwdb.person
      val kill_ancestors : Config.config -> Gwdb.base -> bool -> Gwdb.person -> int Stdlib.ref -> int Stdlib.ref -> unit
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/MergeIndDisplay/index.html b/static/doc/geneweb/Geneweb/MergeIndDisplay/index.html new file mode 100644 index 0000000000..8b1f25c09d --- /dev/null +++ b/static/doc/geneweb/Geneweb/MergeIndDisplay/index.html @@ -0,0 +1,2 @@ + +MergeIndDisplay (geneweb.Geneweb.MergeIndDisplay)

      Module Geneweb.MergeIndDisplay

      val print : Config.config -> Gwdb.base -> unit

      Displays a form for merging two persons

      val print_kill_ancestors : Config.config -> Gwdb.base -> unit

      Displays the page for killing ancestors (undocumented feature)

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/MergeIndOk/index.html b/static/doc/geneweb/Geneweb/MergeIndOk/index.html new file mode 100644 index 0000000000..b03f85cb20 --- /dev/null +++ b/static/doc/geneweb/Geneweb/MergeIndOk/index.html @@ -0,0 +1,2 @@ + +MergeIndOk (geneweb.Geneweb.MergeIndOk)

      Module Geneweb.MergeIndOk

      val reconstitute : Config.config -> Gwdb.base -> Gwdb.person -> Gwdb.person -> (Gwdb.iper, string * string * int * Update.create * string, string) Def.gen_person
      val effective_mod_merge : Config.config -> Gwdb.base -> (Gwdb.iperGwdb.iper, string) Def.gen_person -> (Gwdb.iperGwdb.iper, string) Def.gen_person -> (Gwdb.iperUpdate.key, string) Def.gen_person -> (Config.config -> Gwdb.base -> CheckItem.base_warning list -> (Gwdb.iperGwdb.iperGwdb.istr) Def.gen_person -> (Gwdb.iperGwdb.ifam) Def.NLDB.page list -> string -> string -> int -> (Gwdb.iperGwdb.ifam) Def.NLDB.page list -> string -> string -> int -> 'a) -> 'a
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/MergeIndOkDisplay/index.html b/static/doc/geneweb/Geneweb/MergeIndOkDisplay/index.html new file mode 100644 index 0000000000..e926613da0 --- /dev/null +++ b/static/doc/geneweb/Geneweb/MergeIndOkDisplay/index.html @@ -0,0 +1,2 @@ + +MergeIndOkDisplay (geneweb.Geneweb.MergeIndOkDisplay)

      Module Geneweb.MergeIndOkDisplay

      val print_merge : Config.config -> Gwdb.base -> unit
      val print_mod_merge : Config.config -> Gwdb.base -> unit
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Notes/index.html b/static/doc/geneweb/Geneweb/Notes/index.html new file mode 100644 index 0000000000..eeb6b5d92e --- /dev/null +++ b/static/doc/geneweb/Geneweb/Notes/index.html @@ -0,0 +1,2 @@ + +Notes (geneweb.Geneweb.Notes)

      Module Geneweb.Notes

      module StrSet = Mutil.StrSet
      val file_path : Config.config -> Gwdb.base -> string -> string
      val path_of_fnotes : string -> string
      val read_notes : Gwdb.base -> string -> (string * string) list * string
      val merge_possible_aliases : Config.config -> (('a'b) Def.NLDB.page * (string list * 'c list)) list -> (('a'b) Def.NLDB.page * (string list * 'c list)) list
      val commit_notes : Config.config -> Gwdb.base -> string -> string -> unit
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/NotesDisplay/index.html b/static/doc/geneweb/Geneweb/NotesDisplay/index.html new file mode 100644 index 0000000000..aff7b26734 --- /dev/null +++ b/static/doc/geneweb/Geneweb/NotesDisplay/index.html @@ -0,0 +1,2 @@ + +NotesDisplay (geneweb.Geneweb.NotesDisplay)

      Module Geneweb.NotesDisplay

      val print_linked_list : Config.config -> Gwdb.base -> (Gwdb.iperGwdb.ifam) Def.NLDB.page list -> unit

      Displays the page list in argument

      val print : Config.config -> Gwdb.base -> unit

      Displays the base notes

      val print_mod : Config.config -> Gwdb.base -> unit

      Displays a text form for writing notes

      val print_mod_ok : Config.config -> Gwdb.base -> unit

      Updates notes

      val print_misc_notes : Config.config -> Gwdb.base -> unit

      Displays a menu to search in notes

      Same as `print_misc_notes`, with a default search

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/NotesLinks/index.html b/static/doc/geneweb/Geneweb/NotesLinks/index.html new file mode 100644 index 0000000000..a7f6391030 --- /dev/null +++ b/static/doc/geneweb/Geneweb/NotesLinks/index.html @@ -0,0 +1,2 @@ + +NotesLinks (geneweb.Geneweb.NotesLinks)

      Module Geneweb.NotesLinks

      val char_dir_sep : char
      val check_file_name : string -> (string list * string) option
      val update_db : Gwdb.base -> (Gwdb.iperGwdb.ifam) Def.NLDB.page -> (string list * (Def.NLDB.key * Def.NLDB.ind) list) -> unit
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Output/index.html b/static/doc/geneweb/Geneweb/Output/index.html new file mode 100644 index 0000000000..b52a7e772c --- /dev/null +++ b/static/doc/geneweb/Geneweb/Output/index.html @@ -0,0 +1,2 @@ + +Output (geneweb.Geneweb.Output)

      Module Geneweb.Output

      val status : Config.config -> Def.httpStatus -> unit

      status conf answer print HTTP status line to the socket where answer is a HTTP status.

      val header : Config.config -> ('a, unit, string, unit) Stdlib.format4 -> 'a

      Formatter printing of the HTTP header (header line) to the socket. If used without seting HTTP status with status, it is set OK.

      val print_string : Config.config -> string -> unit

      Printing the part of HTTP response body on the socket. If used without seting HTTP status with status, it is set OK.

      val printf : Config.config -> ('a, unit, string, unit) Stdlib.format4 -> 'a

      Formatter printing of the part of HTTP response body on the socket. If used without seting HTTP status with status, it is set OK.

      val flush : Config.config -> unit

      Flushes (send) printed previously content of the buffer on the socket.

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Perso/index.html b/static/doc/geneweb/Geneweb/Perso/index.html new file mode 100644 index 0000000000..6410802442 --- /dev/null +++ b/static/doc/geneweb/Geneweb/Perso/index.html @@ -0,0 +1,3 @@ + +Perso (geneweb.Geneweb.Perso)

      Module Geneweb.Perso

      type generation_person =
      | GP_person of Sosa.t * Gwdb.iper * Gwdb.ifam option
      | GP_same of Sosa.t * Sosa.t * Gwdb.iper
      | GP_interv of (Sosa.t * Sosa.t * (Sosa.t * Sosa.t) option) option
      | GP_missing of Sosa.t * Gwdb.iper
      val string_of_marriage_text : Config.config -> Gwdb.base -> Gwdb.family -> string
      val interp_templ : ?no_headers:bool -> string -> Config.config -> Gwdb.base -> Gwdb.person -> unit
      val interp_templ_with_menu : (bool -> unit) -> string -> Config.config -> Gwdb.base -> Gwdb.person -> unit
      val interp_notempl_with_menu : (bool -> unit) -> string -> Config.config -> Gwdb.base -> Gwdb.person -> unit
      val print : ?no_headers:bool -> Config.config -> Gwdb.base -> Gwdb.person -> unit

      Displays the HTML page of a person

      val print_ascend : Config.config -> Gwdb.base -> Gwdb.person -> unit

      Displays the ascendants of the selected person

      Displays links to pages associated to the person

      val build_sosa_tree_ht : Config.config -> Gwdb.base -> Gwdb.person -> unit

      Construts from the giving person sosa table strored in the cache. Sosa table contains association person_id -> sosa number for each person in the base. Person has sosa Sosa.one and his ancestors have sosa > Sosa.one. For non ancestor person sosa number is set to Sosa.zero.

      val build_sosa_ht : Config.config -> Gwdb.base -> unit

      Extract referenced person from environement and constructs for him sosa table wiht build_sosa_tree_ht.

      val get_sosa_person : Gwdb.person -> Sosa.t
      val get_single_sosa : Config.config -> Gwdb.base -> Gwdb.person -> Sosa.t
      val print_sosa : Config.config -> Gwdb.base -> Gwdb.person -> bool -> unit
      val get_linked_page : Config.config -> Gwdb.base -> Gwdb.person -> string -> string
      val get_birth_text : Config.config -> Gwdb.person -> bool -> string
      val get_baptism_text : Config.config -> Gwdb.person -> bool -> string
      val get_death_text : Config.config -> Gwdb.person -> bool -> string
      val get_burial_text : Config.config -> Gwdb.person -> bool -> string
      val get_cremation_text : Config.config -> Gwdb.person -> bool -> string
      val get_marriage_date_text : Config.config -> Gwdb.family -> bool -> string
      val linked_page_text : Config.config -> Gwdb.base -> Gwdb.person -> string -> 'a -> string -> ((Gwdb.iperGwdb.ifam) Def.NLDB.page * ('b * ('a * Def.NLDB.ind) list)) -> string
      val max_ancestor_level : Config.config -> Gwdb.base -> Gwdb.iper -> int -> int
      val string_of_died : Config.config -> Gwdb.person -> bool -> string
      val string_of_parent_age : Config.config -> Gwdb.base -> (Gwdb.person * bool) -> (Gwdb.family -> Gwdb.iper) -> string
      val string_of_image_url : Config.config -> Gwdb.base -> (Gwdb.person * bool) -> bool -> string
      val round_2_dec : float -> float
      val has_children : Gwdb.base -> Gwdb.person -> bool
      val string_of_image_size : Config.config -> Gwdb.base -> (Gwdb.person * bool) -> string
      val string_of_image_medium_size : Config.config -> Gwdb.base -> (Gwdb.person * bool) -> string
      val string_of_image_small_size : Config.config -> Gwdb.base -> (Gwdb.person * bool) -> string
      val infinite : int
      val limit_desc : Config.config -> int
      val make_desc_level_table : Config.config -> Gwdb.base -> int -> Gwdb.person -> (Util.IperSet.elt, int) Gwdb.Marker.t * (Gwdb.ifam, int) Gwdb.Marker.t
      val default_max_cousin_lev : int
      type dup =
      | DupFam of Gwdb.ifam * Gwdb.ifam
      | DupInd of Gwdb.iper * Gwdb.iper
      | NoDup
      type excl_dup = (Gwdb.iper * Gwdb.iper) list * (Gwdb.ifam * Gwdb.ifam) list
      val excluded_possible_duplications : Config.config -> excl_dup
      val first_possible_duplication : Gwdb.base -> Gwdb.iper -> excl_dup -> dup
      val nobility_titles_list : Config.config -> Gwdb.base -> Gwdb.person -> (int * Gwdb.istr Def.gen_title_name * Gwdb.istr * Gwdb.istr list * (Adef.date option * Adef.date option) list) list
      val has_history : Config.config -> Gwdb.base -> Gwdb.person -> bool -> bool
      val has_possible_duplications : Config.config -> Gwdb.base -> Gwdb.person -> bool
      val string_of_title : ?link:bool -> +Config.config -> Gwdb.base -> string -> Gwdb.person -> (int * Gwdb.istr Def.gen_title_name * Gwdb.istr * Gwdb.istr list * (Def.date option * Def.date option) list) -> string

      Optionnal link argument is passed to DateDisplay.string_of_ondate

      type event_name =
      | Pevent of Gwdb.istr Def.gen_pers_event_name
      | Fevent of Gwdb.istr Def.gen_fam_event_name
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Place/index.html b/static/doc/geneweb/Geneweb/Place/index.html new file mode 100644 index 0000000000..28e752b192 --- /dev/null +++ b/static/doc/geneweb/Geneweb/Place/index.html @@ -0,0 +1,4 @@ + +Place (geneweb.Geneweb.Place)

      Module Geneweb.Place

      val suburb_aux : (string -> int -> int -> int -> 'a) -> (string -> 'a) -> string -> 'a
      val split_suburb : string -> string * string

      split_suburb "[foo-bar] - boobar (baz)" is 9"foo-bar", "boobar (baz)")

      val only_suburb : string -> string

      only_suburb "[foo-bar] - boobar (baz)" is "foo-bar" only_suburb "boobar (baz)" is ""

      val without_suburb : string -> string

      without_suburb "[foo-bar] - boobar (baz)" is "boobar (baz)" without_suburb "boobar (baz)" is "boobar (baz)"

      val normalize : string -> string

      Transform "[foo-bar] - boobar (baz)" into "foo-bar, boobar (baz)"

      val compare_places : string -> string -> int
      val fold_place_long : bool -> string -> string list
      val fold_place_short : bool -> string -> string
      exception List_too_long
      val get_all : Config.config -> Gwdb.base -> add_birth:bool -> add_baptism:bool -> add_death:bool -> +add_burial:bool -> add_marriage:bool -> +'a -> 'c -> (string -> 'a) -> ('a -> bool) -> ('b option -> Gwdb.person -> 'b) -> ('b -> 'c) -> int -> ('a * 'c) array
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/PlaceDisplay/index.html b/static/doc/geneweb/Geneweb/PlaceDisplay/index.html new file mode 100644 index 0000000000..c1daf89fd1 --- /dev/null +++ b/static/doc/geneweb/Geneweb/PlaceDisplay/index.html @@ -0,0 +1,6 @@ + +PlaceDisplay (geneweb.Geneweb.PlaceDisplay)

      Module Geneweb.PlaceDisplay

      val print_html_places_surnames : Config.config -> Gwdb.base -> (string list * (string * Gwdb.iper list) list) array -> unit
      val print_aux_opt : add_birth:bool -> add_baptism:bool -> add_death:bool -> +add_burial:bool -> add_marriage:bool -> string
      val print_aux : Config.config -> (bool -> unit) -> (unit -> 'a) -> unit
      val print_all_places_surnames_short : Config.config -> Gwdb.base -> add_birth:bool -> add_baptism:bool -> +add_death:bool -> add_burial:bool -> add_marriage:bool -> unit
      val print_all_places_surnames_long : Config.config -> Gwdb.base -> string -> add_birth:bool -> +add_baptism:bool -> add_death:bool -> add_burial:bool -> add_marriage:bool -> +int -> unit
      val print_all_places_surnames : Config.config -> Gwdb.base -> unit
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Relation/index.html b/static/doc/geneweb/Geneweb/Relation/index.html new file mode 100644 index 0000000000..0cb8a30c2a --- /dev/null +++ b/static/doc/geneweb/Geneweb/Relation/index.html @@ -0,0 +1,2 @@ + +Relation (geneweb.Geneweb.Relation)

      Module Geneweb.Relation

      val round_2_dec : float -> float
      type 'a dag_ind = {
      di_val : 'a;
      mutable di_famc : 'a dag_fam;
      mutable di_fams : 'a dag_fam;
      }
      and 'a dag_fam = {
      mutable df_pare : 'a dag_ind list;
      df_chil : 'a dag_ind list;
      }
      val dag_ind_list_of_path : ('a * famlink) list -> 'a option dag_ind list
      val add_missing_parents_of_siblings : Config.config -> Gwdb.base -> Gwdb.iper option dag_ind list -> Gwdb.iper option dag_ind list
      val dag_fam_list_of_ind_list : 'a dag_ind list -> 'a dag_fam list
      val add_phony_children : 'a option dag_ind list -> 'a option dag_fam list -> 'a option dag_ind list
      val add_common_parent : Gwdb.base -> Gwdb.iper -> Gwdb.iper -> Gwdb.iper list -> Gwdb.iper list
      val ind_set_of_relation_path : Gwdb.base -> (Gwdb.iper * famlink) list -> Gwdb.iper list
      type node =
      | NotVisited
      | Visited of bool * Gwdb.iper * famlink
      val excl_faml : Config.config -> Gwdb.base -> Gwdb.ifam list
      val get_shortest_path_relation : Config.config -> Gwdb.base -> Gwdb.iper -> Gwdb.iper -> Gwdb.ifam list -> ((Gwdb.iper * famlink) list * Gwdb.ifam) option
      val simplify_path : 'a -> Gwdb.base -> (Gwdb.iper * famlink) list -> (Gwdb.iper * famlink) list

      simplify_path conf base path Removes unnecessary people from the path (e.g. half sibling when only parents are useful)

      (HalfSibling|Sibling|Child) as x -> Child -> HalfSibling becomes x -> Mate -> Child

      HalfSibling -> Parent becomes Parent -> Mate -> Mate -> Parent

      val nb_fields : string -> int
      val belongs_to_branch : 'a -> 'b -> ('b * 'c * 'a list) list -> bool
      val get_piece_of_branch : Config.config -> Gwdb.base -> ((((Gwdb.iper'a) Gwdb.Marker.t * (Gwdb.person * 'b) list) * int) * ('a -> (int * 'c * Gwdb.iper list) list)) -> (int * int) -> Gwdb.iper list
      val compute_simple_relationship : Config.config -> Gwdb.base -> (Gwdb.iper, int) Gwdb.Marker.t -> Gwdb.iper -> Gwdb.iper -> ((int * int * (Gwdb.person * int) list) list * Sosa.t * float * (Gwdb.iperConsang.relationship) Gwdb.Marker.t) option
      val known_spouses_list : Config.config -> Gwdb.base -> Gwdb.person -> Gwdb.person -> Gwdb.person list
      val merge_relations : ('a option * 'b option * (int * int * 'c) * 'd) list -> ('a option * 'b option * (int * int * 'c) * 'd) list -> ('a option * 'b option * (int * int * 'c) * 'd) list
      val combine_relationship : Config.config -> Gwdb.base -> (Gwdb.iper, int) Gwdb.Marker.t -> Gwdb.person list -> Gwdb.person list -> (Gwdb.person -> 'a) -> (Gwdb.person -> 'b) -> (('a * 'b * (int * int * (Gwdb.person * int) list)) list * Sosa.t * (Gwdb.iperConsang.relationship) Gwdb.Marker.t) list -> (('a * 'b * (int * int * (Gwdb.person * int) list)) list * Sosa.t * (Gwdb.iperConsang.relationship) Gwdb.Marker.t) list
      val sp : 'a -> 'a option
      val no_sp : 'a -> 'b option
      val compute_relationship : Config.config -> Gwdb.base -> bool -> Gwdb.person -> Gwdb.person -> ((Gwdb.person option * Gwdb.person option * (int * int * (Gwdb.person * int) list) * (Gwdb.iperConsang.relationship) Gwdb.Marker.t) list * Sosa.t * float) option
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/RelationDisplay/index.html b/static/doc/geneweb/Geneweb/RelationDisplay/index.html new file mode 100644 index 0000000000..765348c0ef --- /dev/null +++ b/static/doc/geneweb/Geneweb/RelationDisplay/index.html @@ -0,0 +1,2 @@ + +RelationDisplay (geneweb.Geneweb.RelationDisplay)

      Module Geneweb.RelationDisplay

      val dag_of_ind_dag_list : 'a option Relation.dag_ind list -> ('a, int) Def.choice Dag2html.node list
      val dag_of_relation_path : Config.config -> Gwdb.base -> (Gwdb.iper * Relation.famlink) list -> Gwdb.iper list * (Gwdb.iper, int) Def.choice Dag2html.dag
      val old_print_relationship_dag : Config.config -> Gwdb.base -> (Gwdb.person -> DagDisplay.item) -> (Gwdb.iper -> string) -> (Gwdb.iper * Relation.famlink) list -> string -> unit
      val print_relationship_dag : Config.config -> Gwdb.base -> (Gwdb.person -> DagDisplay.item) -> (Gwdb.iper -> string) -> (Gwdb.iper * Relation.famlink) list -> string -> unit
      val print_relation_path : Config.config -> Gwdb.base -> Gwdb.iper -> Gwdb.iper -> (Gwdb.iper * Relation.famlink) list -> Gwdb.ifam -> Gwdb.ifam list -> unit
      val print_shortest_path : Config.config -> Gwdb.base -> Gwdb.person -> Gwdb.person -> unit
      val parents_label : Config.config -> Gwdb.base -> ((((Gwdb.iper'a) Gwdb.Marker.t * (Gwdb.person * 'b) list) * int) * ('a -> (int * 'c * Gwdb.iper list) list)) -> int -> string
      val parent_in_law_label : Config.config -> Def.sex -> Def.sex -> string
      val ancestor_label : Config.config -> Gwdb.base -> ((((Gwdb.iper'a) Gwdb.Marker.t * (Gwdb.person * 'b) list) * int) * ('a -> (int * 'c * Gwdb.iper list) list)) -> int -> Def.sex -> string
      val child_in_law_label : Config.config -> Def.sex -> Def.sex -> string
      val descendant_label : Config.config -> Gwdb.base -> (((Gwdb.iperConsang.relationship) Gwdb.Marker.t * (Gwdb.person * 'a) list) * int) -> int -> Gwdb.person -> string
      val brother_label : Config.config -> int -> Def.sex -> string
      val half_brother_label : Config.config -> Def.sex -> string
      val brother_in_law_label : Config.config -> Def.sex -> Def.sex -> string
      val uncle_label : Config.config -> Gwdb.base -> (((Gwdb.iperConsang.relationship) Gwdb.Marker.t * (Gwdb.person * 'a) list) * int) -> int -> Gwdb.person -> string
      val nephew_label : Config.config -> int -> Gwdb.person -> string
      val same_parents : Config.config -> Gwdb.base -> Gwdb.person -> Gwdb.person -> bool
      val string_of_big_int : Config.config -> int -> string
      val print_solution_ancestor : Config.config -> Gwdb.base -> bool -> Gwdb.person -> Gwdb.person -> Gwdb.person option -> Gwdb.person option -> int -> int -> (Gwdb.person * int) list -> unit
      val print_solution_not_ancestor : Config.config -> Gwdb.base -> bool -> Gwdb.person -> Gwdb.person -> (Gwdb.person option * Gwdb.person option * (int * int * (Gwdb.person * int) list) * (Gwdb.iperConsang.relationship) Gwdb.Marker.t) -> unit
      val print_solution : Config.config -> Gwdb.base -> bool -> int -> Gwdb.person -> Gwdb.person -> (Gwdb.person option * Gwdb.person option * (int * int * (Gwdb.person * int) list) * (Gwdb.iperConsang.relationship) Gwdb.Marker.t) -> unit
      val max_br : int
      val print_propose_upto : Config.config -> Gwdb.base -> Gwdb.person -> Gwdb.person -> ('a option * 'b option * (int * int * 'c) * 'd) list -> unit
      val print_one_path : Config.config -> Gwdb.base -> ((Gwdb.iper * Def.sex) list * (Gwdb.iper * Def.sex) list) list Stdlib.ref -> Gwdb.person -> Gwdb.person -> Gwdb.person -> Gwdb.person option -> Gwdb.person option -> int -> int -> unit
      val print_path : Config.config -> Gwdb.base -> Gwdb.person -> Gwdb.person -> (Gwdb.person option * Gwdb.person option * (int * int * (Gwdb.person * 'a) list) * 'b) -> unit
      val print_main_relationship : Config.config -> Gwdb.base -> bool -> Gwdb.person -> Gwdb.person -> ((Gwdb.person option * Gwdb.person option * (int * int * (Gwdb.person * int) list) * (Gwdb.iperConsang.relationship) Gwdb.Marker.t) list * Sosa.t * float) option -> unit
      val multi_relation_next_txt : Config.config -> Gwdb.person list -> int -> (Gwdb.iper, string) Stdlib.Hashtbl.t -> string
      val print_no_relationship : Config.config -> Gwdb.base -> Gwdb.person list -> unit
      val print_multi_relation : Config.config -> Gwdb.base -> Gwdb.person list -> int -> (Gwdb.iper, string) Stdlib.Hashtbl.t -> unit
      val print_base_loop : Config.config -> Gwdb.base -> Gwdb.person -> unit
      val relmenu_print : Config.config -> Gwdb.base -> Gwdb.person -> unit
      val print : Config.config -> Gwdb.base -> Gwdb.person -> Gwdb.person option -> unit
      val print_multi : Config.config -> Gwdb.base -> unit
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/RelationLink/index.html b/static/doc/geneweb/Geneweb/RelationLink/index.html new file mode 100644 index 0000000000..2361d62f46 --- /dev/null +++ b/static/doc/geneweb/Geneweb/RelationLink/index.html @@ -0,0 +1,2 @@ + +RelationLink (geneweb.Geneweb.RelationLink)

      Module Geneweb.RelationLink

      type info = {
      ip : Gwdb.iper;
      sp : Def.sex;
      ip1 : Gwdb.iper;
      ip2 : Gwdb.iper;
      b1 : (Gwdb.iper * Def.sex) list;
      b2 : (Gwdb.iper * Def.sex) list;
      c1 : int;
      c2 : int;
      pb1 : (Gwdb.iper * Def.sex) list option;
      pb2 : (Gwdb.iper * Def.sex) list option;
      nb1 : (Gwdb.iper * Def.sex) list option;
      nb2 : (Gwdb.iper * Def.sex) list option;
      sp1 : Gwdb.person option;
      sp2 : Gwdb.person option;
      bd : int;
      td_prop : string;
      }
      val threshold : int Stdlib.ref
      val make_dist_tab : Config.config -> Gwdb.base -> Gwdb.iper -> int -> (Gwdb.iper -> int) * (Gwdb.iper -> int)
      val find_first_branch : Config.config -> Gwdb.base -> ((Gwdb.iper -> int) * (Gwdb.iper -> int)) -> Gwdb.iper -> int -> Gwdb.iper -> Def.sex -> (Gwdb.iper * Def.sex) list option
      val print_relation_path : Config.config -> Gwdb.base -> info -> unit
      val print : Config.config -> Gwdb.base -> unit
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/SearchName/index.html b/static/doc/geneweb/Geneweb/SearchName/index.html new file mode 100644 index 0000000000..9db535cfaa --- /dev/null +++ b/static/doc/geneweb/Geneweb/SearchName/index.html @@ -0,0 +1,2 @@ + +SearchName (geneweb.Geneweb.SearchName)

      Module Geneweb.SearchName

      val search_key_aux : (Config.config -> Gwdb.base -> Gwdb.person list -> string -> Gwdb.person list) -> Config.config -> Gwdb.base -> string -> Gwdb.person list

      search_key_aux aux conf base str search persons by misc name str (could be one of the mix). If result is empty tries to it search names with roman number instead of numerals (if they are present in the name). Applies aux on the result and removes all dublicates. Empty persons, persons with private names or persons to which there are no rights to access are not listed.

      val search_by_name : Config.config -> Gwdb.base -> string -> Gwdb.person list

      Search persons by name that has format "firstname surname". Dublicates are possible. Empty persons, persons with private names or persons to which there are no rights to access are not listed.

      val search_partial_key : Config.config -> Gwdb.base -> string -> Gwdb.person list

      Calls search_key_aux with aux fonction that makes calls to search_by_name if result is empty.

      val search_by_sosa : Config.config -> Gwdb.base -> string -> Gwdb.person list
      val search_by_key : Config.config -> Gwdb.base -> string -> Gwdb.person list

      Same as search_by_name but search by key that has format "firstname.occ surname".

      val search_approx_key : Config.config -> Gwdb.base -> string -> Gwdb.person list

      Calls search_key_aux with aux fonction that filter result list and only persons whose fname^sname or one of their misc names are equal to key.

      val print : Config.config -> Gwdb.base -> (Config.config -> Gwdb.base -> string -> Gwdb.person list -> unit) -> (Config.config -> string -> unit) -> unit
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Some/index.html b/static/doc/geneweb/Geneweb/Some/index.html new file mode 100644 index 0000000000..99f468d0f9 --- /dev/null +++ b/static/doc/geneweb/Geneweb/Some/index.html @@ -0,0 +1,2 @@ + +Some (geneweb.Geneweb.Some)

      Module Geneweb.Some

      val surname_not_found : Config.config -> string -> unit
      val persons_of_fsname : Config.config -> Gwdb.base -> (Gwdb.base -> string -> Gwdb.istr list) -> (Gwdb.istr -> Gwdb.iper list) -> (Gwdb.person -> Gwdb.istr) -> string -> (string * Gwdb.istr * Gwdb.iper list) list * (string -> string)

      persons_of_fsname conf base base_strings_of_fsname find proj x function where:

      • base_strings_of_fsname base x is a function that returns the list of first/surnames (as istr) being equal to x
      • find istr is a function that returns the list of persons having istr as a first/surname id
      • proj iper is a function that returns first/surname id from the giving person id.
      • x is a first/surname or its substring.

      Returns (l,inj) where l is a list of (str,istr,iperl) where istr is id of str and iperl is a list of persons found that has istr as a first/surname such that str = inj x

      val first_name_print : Config.config -> Gwdb.base -> string -> unit
      val surname_print : Config.config -> Gwdb.base -> (Config.config -> string -> unit) -> string -> unit
      val search_surname : Config.config -> Gwdb.base -> string -> Gwdb.iper list
      val search_surname_print : Config.config -> Gwdb.base -> (Config.config -> string -> unit) -> string -> unit
      val search_first_name : Config.config -> Gwdb.base -> string -> (string * (Mutil.StrSet.t * Gwdb.iper list)) list
      val search_first_name_print : Config.config -> Gwdb.base -> string -> unit
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/SrcfileDisplay/index.html b/static/doc/geneweb/Geneweb/SrcfileDisplay/index.html new file mode 100644 index 0000000000..c5ecc44014 --- /dev/null +++ b/static/doc/geneweb/Geneweb/SrcfileDisplay/index.html @@ -0,0 +1,2 @@ + +SrcfileDisplay (geneweb.Geneweb.SrcfileDisplay)

      Module Geneweb.SrcfileDisplay

      type src_mode =
      | Lang
      | Source
      val print : Config.config -> Gwdb.base -> string -> unit
      val print_source : Config.config -> Gwdb.base -> string -> unit
      val print_start : Config.config -> Gwdb.base -> unit
      val incr_welcome_counter : Config.config -> (int * int * string) option
      val incr_request_counter : Config.config -> (int * int * string) option
      val adm_file : string -> string

      Compute administration file path with giving name (search inside cnt directory)

      val source_file_name : Config.config -> string -> string
      val copy_from_stream : Config.config -> Gwdb.base -> char Stdlib.Stream.t -> src_mode -> unit
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Stats/index.html b/static/doc/geneweb/Geneweb/Stats/index.html new file mode 100644 index 0000000000..73ea5870a3 --- /dev/null +++ b/static/doc/geneweb/Geneweb/Stats/index.html @@ -0,0 +1,2 @@ + +Stats (geneweb.Geneweb.Stats)

      Module Geneweb.Stats

      type stats = {
      mutable men : int;
      mutable women : int;
      mutable neutre : int;
      mutable noname : int;
      mutable oldest_father : int * Gwdb.person;
      mutable oldest_mother : int * Gwdb.person;
      mutable youngest_father : int * Gwdb.person;
      mutable youngest_mother : int * Gwdb.person;
      mutable oldest_dead : int * Gwdb.person;
      mutable oldest_still_alive : int * Gwdb.person;
      }

      Statistic about persons in database

      val stat_base : Gwdb.base -> stats

      Compute stats from the database's persons

      val print_stats : Gwdb.base -> stats -> unit

      Prints statistic stats on stdout

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Templ/index.html b/static/doc/geneweb/Geneweb/Templ/index.html new file mode 100644 index 0000000000..5ee53a7646 --- /dev/null +++ b/static/doc/geneweb/Geneweb/Templ/index.html @@ -0,0 +1,2 @@ + +Templ (geneweb.Geneweb.Templ)

      Module Geneweb.Templ

      type 'a vother
      type 'a env = (string * 'a) list
      val eval_transl : Config.config -> bool -> string -> string -> string
      type ('a, 'b) interp_fun = {
      eval_var : 'a env -> 'b -> TemplAst.loc -> string list -> 'b TemplAst.expr_val;
      eval_transl : 'a env -> bool -> string -> string -> string;
      eval_predefined_apply : 'a env -> string -> 'b TemplAst.expr_val list -> string;
      get_vother : 'a -> 'b vother option;
      set_vother : 'b vother -> 'a;
      print_foreach : ('a env -> 'b -> TemplAst.ast -> unit) -> ('a env -> 'b -> TemplAst.ast -> string) -> 'a env -> 'b -> TemplAst.loc -> string -> string list -> TemplAst.ast list list -> TemplAst.ast list -> unit;
      }
      val interp_ast : Config.config -> ('a'b) interp_fun -> 'a env -> 'b -> TemplAst.ast list -> unit
      val input_templ : Config.config -> string -> TemplAst.ast list option

      Evaluates and prints content of cpr template. If template wasn't found prints basic copyrigth HTML structure.

      Calls print_copyright with config where variable with_logo is set to "yes"

      val include_hed_trl : Config.config -> string -> unit
      val copy_from_templ : Config.config -> string env -> Stdlib.in_channel -> unit
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/TemplAst/index.html b/static/doc/geneweb/Geneweb/TemplAst/index.html new file mode 100644 index 0000000000..bfab1e2890 --- /dev/null +++ b/static/doc/geneweb/Geneweb/TemplAst/index.html @@ -0,0 +1,2 @@ + +TemplAst (geneweb.Geneweb.TemplAst)

      Module Geneweb.TemplAst

      type ast =
      | Atext of loc * string
      | Avar of loc * string * string list
      | Atransl of loc * bool * string * string
      | Aconcat of loc * ast list
      | Awid_hei of string
      | Aif of ast * ast list * ast list
      | Aforeach of loc * string * string list * ast list list * ast list
      | Afor of string * ast * ast * ast list
      | Adefine of string * string list * ast list * ast list
      | Aapply of loc * string * ast list list
      | Alet of string * ast list * ast list
      | Aop1 of loc * string * ast
      | Aop2 of loc * string * ast * ast
      | Aint of loc * string
      | Ainclude of string * ast list
      and loc = string * int * int
      type 'a expr_val =
      | VVbool of bool
      | VVstring of string
      | VVother of string list -> 'a expr_val
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/TemplDate/index.html b/static/doc/geneweb/Geneweb/TemplDate/index.html new file mode 100644 index 0000000000..76cd462a66 --- /dev/null +++ b/static/doc/geneweb/Geneweb/TemplDate/index.html @@ -0,0 +1,2 @@ + +TemplDate (geneweb.Geneweb.TemplDate)

      Module Geneweb.TemplDate

      val eval_date_var : Config.config -> int -> string list -> 'a TemplAst.expr_val
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Templ_parser/index.html b/static/doc/geneweb/Geneweb/Templ_parser/index.html new file mode 100644 index 0000000000..468fb0350c --- /dev/null +++ b/static/doc/geneweb/Geneweb/Templ_parser/index.html @@ -0,0 +1,2 @@ + +Templ_parser (geneweb.Geneweb.Templ_parser)

      Module Geneweb.Templ_parser

      val dump_list : ('a -> string) -> 'a list -> string
      val current_file : string Stdlib.ref
      val wrap : string -> (unit -> 'a) -> 'a
      val line_of_loc : 'a -> (string * int * int) -> (int * int * int) option
      val dummy_pos : int * int
      val pos : Stdlib.Lexing.lexbuf -> string * int * int
      exception Templ_parser_exc of string * int * int
      val fail : Stdlib.Lexing.lexbuf -> ?pos:(string * int * int) -> unit -> 'a
      val dump_ast : ?truncate:int -> ?depth:int -> TemplAst.ast -> string
      val included_files : (string * TemplAst.ast list) list Stdlib.ref
      val flush : TemplAst.ast list -> Stdlib.Buffer.t -> Stdlib.Lexing.lexbuf -> TemplAst.ast list
      val __ocaml_lex_tables : Stdlib.Lexing.lex_tables
      val parse_ast : Config.config -> Stdlib.Buffer.t -> string list -> TemplAst.ast list -> Stdlib.Lexing.lexbuf -> TemplAst.ast list * string
      val __ocaml_lex_parse_ast_rec : Config.config -> Stdlib.Buffer.t -> string list -> TemplAst.ast list -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast list * string
      val parse_ident_list : Stdlib.Lexing.lexbuf -> string list
      val __ocaml_lex_parse_ident_list_rec : Stdlib.Lexing.lexbuf -> int -> string list
      val parse_expr : Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_rec : Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_if : Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_if_rec : Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_if_1 : TemplAst.ast -> Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_if_1_rec : TemplAst.ast -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_if_2 : TemplAst.ast -> TemplAst.ast -> Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_if_2_rec : TemplAst.ast -> TemplAst.ast -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_or : Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_or_rec : Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_or_1 : TemplAst.ast -> Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_or_1_rec : TemplAst.ast -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_and : Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_and_rec : Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_and_1 : TemplAst.ast -> Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_and_1_rec : TemplAst.ast -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_is_substr : Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_is_substr_rec : Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_is_substr_1 : TemplAst.ast -> Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_is_substr_1_rec : TemplAst.ast -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_in : Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_in_rec : Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_in_1 : TemplAst.ast -> Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_in_1_rec : TemplAst.ast -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_3 : Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_3_rec : Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_3_1 : TemplAst.ast -> Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_3_1_rec : TemplAst.ast -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_4 : Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_4_rec : Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_4_1 : TemplAst.ast -> Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_4_1_rec : TemplAst.ast -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_5 : Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_5_rec : Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_5_1 : TemplAst.ast -> Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_5_1_rec : TemplAst.ast -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_simple_expr : Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_simple_expr_rec : Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_simple_expr_1 : Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_simple_expr_1_rec : Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val discard_RPAREN : Stdlib.Lexing.lexbuf -> unit
      val __ocaml_lex_discard_RPAREN_rec : Stdlib.Lexing.lexbuf -> int -> unit
      val parse_tuple : Stdlib.Lexing.lexbuf -> TemplAst.ast list list
      val __ocaml_lex_parse_tuple_rec : Stdlib.Lexing.lexbuf -> int -> TemplAst.ast list list
      val parse_tuple_1 : Stdlib.Lexing.lexbuf -> TemplAst.ast list list
      val __ocaml_lex_parse_tuple_1_rec : Stdlib.Lexing.lexbuf -> int -> TemplAst.ast list list
      val parse_expr_list : Stdlib.Lexing.lexbuf -> TemplAst.ast list list
      val __ocaml_lex_parse_expr_list_rec : Stdlib.Lexing.lexbuf -> int -> TemplAst.ast list list
      val parse_expr_list_1 : TemplAst.ast -> Stdlib.Lexing.lexbuf -> TemplAst.ast list list
      val __ocaml_lex_parse_expr_list_1_rec : TemplAst.ast -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast list list
      val parse_char_stream_semi : (Stdlib.Lexing.lexbuf -> TemplAst.ast) -> (Stdlib.Lexing.lexbuf -> TemplAst.ast) -> Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_char_stream_semi_rec : (Stdlib.Lexing.lexbuf -> TemplAst.ast) -> (Stdlib.Lexing.lexbuf -> TemplAst.ast) -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val discard_opt_semi : Stdlib.Lexing.lexbuf -> unit
      val __ocaml_lex_discard_opt_semi_rec : Stdlib.Lexing.lexbuf -> int -> unit
      val lexicon_word : Stdlib.Lexing.lexbuf -> bool * string * string
      val __ocaml_lex_lexicon_word_rec : Stdlib.Lexing.lexbuf -> int -> bool * string * string
      val lexicon_index : Stdlib.Lexing.lexbuf -> string
      val __ocaml_lex_lexicon_index_rec : Stdlib.Lexing.lexbuf -> int -> string
      val value : Stdlib.Lexing.lexbuf -> string
      val __ocaml_lex_value_rec : Stdlib.Lexing.lexbuf -> int -> string
      val compound_var : Stdlib.Lexing.lexbuf -> string list
      val __ocaml_lex_compound_var_rec : Stdlib.Lexing.lexbuf -> int -> string list
      val variable : Stdlib.Lexing.lexbuf -> [ `comment | `escaped of char | `variable of string list ]
      val __ocaml_lex_variable_rec : Stdlib.Lexing.lexbuf -> int -> [ `comment | `escaped of char | `variable of string list ]
      val variable_ident : Stdlib.Lexing.lexbuf -> string list
      val __ocaml_lex_variable_ident_rec : Stdlib.Lexing.lexbuf -> int -> string list
      val transl_index : Stdlib.Lexing.lexbuf -> string
      val __ocaml_lex_transl_index_rec : Stdlib.Lexing.lexbuf -> int -> string
      val lexicon_word_text : Stdlib.Buffer.t -> int -> Stdlib.Lexing.lexbuf -> string
      val __ocaml_lex_lexicon_word_text_rec : Stdlib.Buffer.t -> int -> Stdlib.Lexing.lexbuf -> int -> string
      val comment : Stdlib.Lexing.lexbuf -> unit
      val __ocaml_lex_comment_rec : Stdlib.Lexing.lexbuf -> int -> unit
      val parse_define : Config.config -> Stdlib.Buffer.t -> string list -> TemplAst.ast list -> Stdlib.Lexing.lexbuf -> TemplAst.ast list * string
      val __ocaml_lex_parse_define_rec : Config.config -> Stdlib.Buffer.t -> string list -> TemplAst.ast list -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast list * string
      val parse_params : Stdlib.Lexing.lexbuf -> string list
      val __ocaml_lex_parse_params_rec : Stdlib.Lexing.lexbuf -> int -> string list
      val parse_params_1 : Stdlib.Lexing.lexbuf -> string list
      val __ocaml_lex_parse_params_1_rec : Stdlib.Lexing.lexbuf -> int -> string list
      val parse_let : Config.config -> Stdlib.Buffer.t -> string list -> TemplAst.ast list -> Stdlib.Lexing.lexbuf -> TemplAst.ast list * string
      val __ocaml_lex_parse_let_rec : Config.config -> Stdlib.Buffer.t -> string list -> TemplAst.ast list -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast list * string
      val parse_include : Config.config -> Stdlib.Buffer.t -> string list -> TemplAst.ast list -> Stdlib.Lexing.lexbuf -> TemplAst.ast list * string
      val __ocaml_lex_parse_include_rec : Config.config -> Stdlib.Buffer.t -> string list -> TemplAst.ast list -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast list * string
      val parse_apply : Config.config -> Stdlib.Buffer.t -> Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_apply_rec : Config.config -> Stdlib.Buffer.t -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_stmt : Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_stmt_rec : Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_if : Config.config -> Stdlib.Buffer.t -> Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_if_rec : Config.config -> Stdlib.Buffer.t -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_for : Config.config -> Stdlib.Buffer.t -> Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_for_rec : Config.config -> Stdlib.Buffer.t -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_foreach : Config.config -> Stdlib.Buffer.t -> Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_foreach_rec : Config.config -> Stdlib.Buffer.t -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_foreach_params : Stdlib.Lexing.lexbuf -> TemplAst.ast list list
      val __ocaml_lex_parse_foreach_params_rec : Stdlib.Lexing.lexbuf -> int -> TemplAst.ast list list
      val parse_templ : Config.config -> Stdlib.Lexing.lexbuf -> TemplAst.ast list
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Title/index.html b/static/doc/geneweb/Geneweb/Title/index.html new file mode 100644 index 0000000000..3016ccb0d0 --- /dev/null +++ b/static/doc/geneweb/Geneweb/Title/index.html @@ -0,0 +1,4 @@ + +Title (geneweb.Geneweb.Title)

      Module Geneweb.Title

      module StrSet = Mutil.StrSet
      val date_interval : Config.config -> Gwdb.base -> date_search -> Gwdb.person -> (Def.dmy * Def.dmy) option
      val compare_title_dates : Config.config -> Gwdb.base -> (Gwdb.person * 'a Def.gen_title) -> (Gwdb.person * 'b Def.gen_title) -> int
      val compare_title_order : Config.config -> Gwdb.base -> (Gwdb.person * 'a Def.gen_title) -> (Gwdb.person * 'b Def.gen_title) -> int
      val select_title_place : Config.config -> Gwdb.base -> absolute:bool -> +string -> string -> (Gwdb.person * Gwdb.title) list * string * string * string list
      val select_all_with_place : Config.config -> Gwdb.base -> string -> (Gwdb.person * Gwdb.title) list * string
      val select_title : Config.config -> Gwdb.base -> absolute:bool -> +string -> StrSet.elt list * string * string list
      val select_place : Config.config -> Gwdb.base -> string -> string list * string
      val select_all : (Gwdb.title -> Gwdb.istr) -> Config.config -> Gwdb.base -> StrSet.elt list
      val select_all2 : (Gwdb.title -> Gwdb.istr) -> Config.config -> Gwdb.base -> (string * int) list
      val select_all_titles : Config.config -> Gwdb.base -> (string * int) list
      val select_all_places : Config.config -> Gwdb.base -> StrSet.elt list
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/TitleDisplay/index.html b/static/doc/geneweb/Geneweb/TitleDisplay/index.html new file mode 100644 index 0000000000..b21cf0f59f --- /dev/null +++ b/static/doc/geneweb/Geneweb/TitleDisplay/index.html @@ -0,0 +1,2 @@ + +TitleDisplay (geneweb.Geneweb.TitleDisplay)

      Module Geneweb.TitleDisplay

      val my_alphabetic : string -> string -> int
      val string_cnt_list_uniq : (string * int) list -> (string * int) list
      val compare_titles2 : (string * 'a) -> (string * 'b) -> int
      val give_access_someone : Config.config -> Gwdb.base -> (Gwdb.person * Gwdb.istr Def.gen_title) -> Gwdb.person list -> unit
      val give_access_title : Config.config -> string -> string -> unit
      val give_access_all_titles : Config.config -> string -> bool -> unit
      val give_access_all_places : Config.config -> string -> unit
      val propose_tree_for_list : (Gwdb.person * 'a) list -> Config.config -> unit
      val print_title_place_list : Config.config -> Gwdb.base -> string -> string -> string list -> (Gwdb.person * Gwdb.istr Def.gen_title) list -> unit
      val print_all_with_place_list : Config.config -> Gwdb.base -> string -> (Gwdb.person * Gwdb.istr Def.gen_title) list -> unit
      val select_title_place : Config.config -> Gwdb.base -> string -> string -> (Gwdb.person * Gwdb.title) list * string * string * string list
      val select_title : Config.config -> Gwdb.base -> string -> Geneweb.Title.StrSet.elt list * string * string list
      val print_title_place : Config.config -> Gwdb.base -> string -> string -> unit
      val print_all_with_place : Config.config -> Gwdb.base -> string -> unit
      val print_places_list : Config.config -> Gwdb.base -> string -> string list -> string list -> unit
      val print_places : Config.config -> Gwdb.base -> string -> unit
      val print_titles : Config.config -> Gwdb.base -> string -> unit
      val print_all_titles : Config.config -> Gwdb.base -> unit
      val print_all_places : Config.config -> Gwdb.base -> unit
      val print : Config.config -> Gwdb.base -> unit
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Translate/index.html b/static/doc/geneweb/Geneweb/Translate/index.html new file mode 100644 index 0000000000..f11643fbad --- /dev/null +++ b/static/doc/geneweb/Geneweb/Translate/index.html @@ -0,0 +1,2 @@ + +Translate (geneweb.Geneweb.Translate)

      Module Geneweb.Translate

      val inline : string -> char -> (char -> string) -> string -> string * bool
      val language_name : ?sep:char -> string -> string -> string
      val eval : string -> string
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Update/index.html b/static/doc/geneweb/Geneweb/Update/index.html new file mode 100644 index 0000000000..44b788c472 --- /dev/null +++ b/static/doc/geneweb/Geneweb/Update/index.html @@ -0,0 +1,2 @@ + +Update (geneweb.Geneweb.Update)

      Module Geneweb.Update

      type update_error =
      | UERR of string
      | UERR_sex_married of Gwdb.person
      | UERR_sex_incoherent of Gwdb.base * Gwdb.person
      | UERR_sex_undefined of string * string * int
      | UERR_unknow_person of string * string * int
      | UERR_already_defined of Gwdb.base * Gwdb.person * string
      | UERR_own_ancestor of Gwdb.base * Gwdb.person
      | UERR_digest
      | UERR_bad_date of Def.dmy
      | UERR_missing_field of string
      | UERR_already_has_parents of Gwdb.base * Gwdb.person
      | UERR_missing_surname of string
      | UERR_missing_first_name of string
      exception ModErr of update_error
      type create_info = {
      ci_birth_date : Def.date option;
      ci_birth_place : string;
      ci_death : Def.death;
      ci_death_date : Def.date option;
      ci_death_place : string;
      ci_occupation : string;
      ci_public : bool;
      }
      type create =
      | Create of Def.sex * create_info option
      type key = string * string * int * create * string
      val infer_death : Config.config -> Gwdb.base -> Gwdb.person -> Def.death
      val infer_death_bb : Config.config -> Def.date option -> Def.date option -> Def.death
      val infer_death_from_age : int -> Def.death
      val infer_death_from_parents : Config.config -> Gwdb.base -> Gwdb.family -> Def.death
      val print_same_name : Config.config -> Gwdb.base -> Gwdb.person -> unit
      val print_person_parents_and_spouse : Config.config -> Gwdb.base -> Gwdb.person -> unit
      val insert_person : Config.config -> Gwdb.base -> string -> (Gwdb.iperGwdb.iperGwdb.istr) Def.gen_person list Stdlib.ref -> key -> Gwdb.iper
      val delete_topological_sort_v : Config.config -> Gwdb.base -> unit
      val delete_topological_sort : Config.config -> Gwdb.base -> unit
      val print_return : Config.config -> unit

      Helper function printing a hidden form containing current env, with a submit button "return", plus a hidden field return=on.

      val print_continue : Config.config -> ?continue:string -> string -> string -> unit

      print_continue conf param value Helper function printing a hidden form containing current env, with a submit button "continue", plus a hidden field param=value. Optionnal continue parameter is the label used for the submit button.

      val prerr : Config.config -> update_error -> (unit -> unit) -> 'a

      prerr conf err callback Regular mode: print error page using callback (wrapped in header/trailer) and and raise ModErr err API mode: only raise ModErr err

      val string_of_error : Config.config -> update_error -> string
      val print_error : Config.config -> Gwdb.base -> update_error -> unit
      val print_warnings : Config.config -> Gwdb.base -> CheckItem.base_warning list -> unit
      val print_miscs : Config.config -> Gwdb.base -> CheckItem.base_misc list -> unit
      val print_warnings_and_miscs : Config.config -> Gwdb.base -> CheckItem.base_warning list -> CheckItem.base_misc list -> unit
      val def_error : Config.config -> Gwdb.base -> Gwdb.person Def.error -> unit
      val error : Config.config -> update_error -> 'exn
      val error_locked : Config.config -> unit
      val error_digest : Config.config -> 'exn
      val digest_person : (Gwdb.iperkey, string) Def.gen_person -> Stdlib.Digest.t
      val digest_family : ((key_, string) Def.gen_family * key Def.gen_couple * key Def.gen_descend) -> Stdlib.Digest.t
      val reconstitute_date : Config.config -> string -> Def.date option
      val print_someone : Config.config -> Gwdb.base -> Gwdb.person -> unit
      val update_conf : Config.config -> Config.config
      val bad_date : Config.config -> Def.dmy -> 'a
      val check_greg_day : Config.config -> Def.dmy -> unit
      val check_missing_witnesses_names : Config.config -> ('a -> ((string * string * 'b * 'c * 'd) * 'e) array) -> 'a list -> update_error option
      val check_missing_name : Config.config -> ('a'b, string) Def.gen_person -> update_error option
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/UpdateData/IstrSet/index.html b/static/doc/geneweb/Geneweb/UpdateData/IstrSet/index.html new file mode 100644 index 0000000000..893b9c383e --- /dev/null +++ b/static/doc/geneweb/Geneweb/UpdateData/IstrSet/index.html @@ -0,0 +1,2 @@ + +IstrSet (geneweb.Geneweb.UpdateData.IstrSet)

      Module UpdateData.IstrSet

      type elt = Gwdb.istr
      type t
      val empty : t
      val is_empty : t -> bool
      val mem : elt -> t -> bool
      val add : elt -> t -> t
      val singleton : elt -> t
      val remove : elt -> t -> t
      val union : t -> t -> t
      val inter : t -> t -> t
      val disjoint : t -> t -> bool
      val diff : t -> t -> t
      val compare : t -> t -> int
      val equal : t -> t -> bool
      val subset : t -> t -> bool
      val iter : (elt -> unit) -> t -> unit
      val map : (elt -> elt) -> t -> t
      val fold : (elt -> 'a -> 'a) -> t -> 'a -> 'a
      val for_all : (elt -> bool) -> t -> bool
      val exists : (elt -> bool) -> t -> bool
      val filter : (elt -> bool) -> t -> t
      val partition : (elt -> bool) -> t -> t * t
      val cardinal : t -> int
      val elements : t -> elt list
      val min_elt : t -> elt
      val min_elt_opt : t -> elt option
      val max_elt : t -> elt
      val max_elt_opt : t -> elt option
      val choose : t -> elt
      val choose_opt : t -> elt option
      val split : elt -> t -> t * bool * t
      val find : elt -> t -> elt
      val find_opt : elt -> t -> elt option
      val find_first : (elt -> bool) -> t -> elt
      val find_first_opt : (elt -> bool) -> t -> elt option
      val find_last : (elt -> bool) -> t -> elt
      val find_last_opt : (elt -> bool) -> t -> elt option
      val of_list : elt list -> t
      val to_seq_from : elt -> t -> elt Stdlib.Seq.t
      val to_seq : t -> elt Stdlib.Seq.t
      val add_seq : elt Stdlib.Seq.t -> t -> t
      val of_seq : elt Stdlib.Seq.t -> t
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/UpdateData/PersMap/index.html b/static/doc/geneweb/Geneweb/UpdateData/PersMap/index.html new file mode 100644 index 0000000000..a7f02a8def --- /dev/null +++ b/static/doc/geneweb/Geneweb/UpdateData/PersMap/index.html @@ -0,0 +1,2 @@ + +PersMap (geneweb.Geneweb.UpdateData.PersMap)

      Module UpdateData.PersMap

      type key = Gwdb.istr
      type +'a t
      val empty : 'a t
      val is_empty : 'a t -> bool
      val mem : key -> 'a t -> bool
      val add : key -> 'a -> 'a t -> 'a t
      val update : key -> ('a option -> 'a option) -> 'a t -> 'a t
      val singleton : key -> 'a -> 'a t
      val remove : key -> 'a t -> 'a t
      val merge : (key -> 'a option -> 'b option -> 'c option) -> 'a t -> 'b t -> 'c t
      val union : (key -> 'a -> 'a -> 'a option) -> 'a t -> 'a t -> 'a t
      val compare : ('a -> 'a -> int) -> 'a t -> 'a t -> int
      val equal : ('a -> 'a -> bool) -> 'a t -> 'a t -> bool
      val iter : (key -> 'a -> unit) -> 'a t -> unit
      val fold : (key -> 'a -> 'b -> 'b) -> 'a t -> 'b -> 'b
      val for_all : (key -> 'a -> bool) -> 'a t -> bool
      val exists : (key -> 'a -> bool) -> 'a t -> bool
      val filter : (key -> 'a -> bool) -> 'a t -> 'a t
      val partition : (key -> 'a -> bool) -> 'a t -> 'a t * 'a t
      val cardinal : 'a t -> int
      val bindings : 'a t -> (key * 'a) list
      val min_binding : 'a t -> key * 'a
      val min_binding_opt : 'a t -> (key * 'a) option
      val max_binding : 'a t -> key * 'a
      val max_binding_opt : 'a t -> (key * 'a) option
      val choose : 'a t -> key * 'a
      val choose_opt : 'a t -> (key * 'a) option
      val split : key -> 'a t -> 'a t * 'a option * 'a t
      val find : key -> 'a t -> 'a
      val find_opt : key -> 'a t -> 'a option
      val find_first : (key -> bool) -> 'a t -> key * 'a
      val find_first_opt : (key -> bool) -> 'a t -> (key * 'a) option
      val find_last : (key -> bool) -> 'a t -> key * 'a
      val find_last_opt : (key -> bool) -> 'a t -> (key * 'a) option
      val map : ('a -> 'b) -> 'a t -> 'b t
      val mapi : (key -> 'a -> 'b) -> 'a t -> 'b t
      val to_seq : 'a t -> (key * 'a) Stdlib.Seq.t
      val to_seq_from : key -> 'a t -> (key * 'a) Stdlib.Seq.t
      val add_seq : (key * 'a) Stdlib.Seq.t -> 'a t -> 'a t
      val of_seq : (key * 'a) Stdlib.Seq.t -> 'a t
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/UpdateData/PersSet/index.html b/static/doc/geneweb/Geneweb/UpdateData/PersSet/index.html new file mode 100644 index 0000000000..3c706a9b94 --- /dev/null +++ b/static/doc/geneweb/Geneweb/UpdateData/PersSet/index.html @@ -0,0 +1,2 @@ + +PersSet (geneweb.Geneweb.UpdateData.PersSet)

      Module UpdateData.PersSet

      type elt = Gwdb.person
      type t
      val empty : t
      val is_empty : t -> bool
      val mem : elt -> t -> bool
      val add : elt -> t -> t
      val singleton : elt -> t
      val remove : elt -> t -> t
      val union : t -> t -> t
      val inter : t -> t -> t
      val disjoint : t -> t -> bool
      val diff : t -> t -> t
      val compare : t -> t -> int
      val equal : t -> t -> bool
      val subset : t -> t -> bool
      val iter : (elt -> unit) -> t -> unit
      val map : (elt -> elt) -> t -> t
      val fold : (elt -> 'a -> 'a) -> t -> 'a -> 'a
      val for_all : (elt -> bool) -> t -> bool
      val exists : (elt -> bool) -> t -> bool
      val filter : (elt -> bool) -> t -> t
      val partition : (elt -> bool) -> t -> t * t
      val cardinal : t -> int
      val elements : t -> elt list
      val min_elt : t -> elt
      val min_elt_opt : t -> elt option
      val max_elt : t -> elt
      val max_elt_opt : t -> elt option
      val choose : t -> elt
      val choose_opt : t -> elt option
      val split : elt -> t -> t * bool * t
      val find : elt -> t -> elt
      val find_opt : elt -> t -> elt option
      val find_first : (elt -> bool) -> t -> elt
      val find_first_opt : (elt -> bool) -> t -> elt option
      val find_last : (elt -> bool) -> t -> elt
      val find_last_opt : (elt -> bool) -> t -> elt option
      val of_list : elt list -> t
      val to_seq_from : elt -> t -> elt Stdlib.Seq.t
      val to_seq : t -> elt Stdlib.Seq.t
      val add_seq : elt Stdlib.Seq.t -> t -> t
      val of_seq : elt Stdlib.Seq.t -> t
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/UpdateData/StringSet/index.html b/static/doc/geneweb/Geneweb/UpdateData/StringSet/index.html new file mode 100644 index 0000000000..dc40df1509 --- /dev/null +++ b/static/doc/geneweb/Geneweb/UpdateData/StringSet/index.html @@ -0,0 +1,2 @@ + +StringSet (geneweb.Geneweb.UpdateData.StringSet)

      Module UpdateData.StringSet

      type elt = Stdlib.String.t
      type t = Stdlib__set.Make(Stdlib.String).t
      val empty : t
      val is_empty : t -> bool
      val mem : elt -> t -> bool
      val add : elt -> t -> t
      val singleton : elt -> t
      val remove : elt -> t -> t
      val union : t -> t -> t
      val inter : t -> t -> t
      val disjoint : t -> t -> bool
      val diff : t -> t -> t
      val compare : t -> t -> int
      val equal : t -> t -> bool
      val subset : t -> t -> bool
      val iter : (elt -> unit) -> t -> unit
      val map : (elt -> elt) -> t -> t
      val fold : (elt -> 'a -> 'a) -> t -> 'a -> 'a
      val for_all : (elt -> bool) -> t -> bool
      val exists : (elt -> bool) -> t -> bool
      val filter : (elt -> bool) -> t -> t
      val partition : (elt -> bool) -> t -> t * t
      val cardinal : t -> int
      val elements : t -> elt list
      val min_elt : t -> elt
      val min_elt_opt : t -> elt option
      val max_elt : t -> elt
      val max_elt_opt : t -> elt option
      val choose : t -> elt
      val choose_opt : t -> elt option
      val split : elt -> t -> t * bool * t
      val find : elt -> t -> elt
      val find_opt : elt -> t -> elt option
      val find_first : (elt -> bool) -> t -> elt
      val find_first_opt : (elt -> bool) -> t -> elt option
      val find_last : (elt -> bool) -> t -> elt
      val find_last_opt : (elt -> bool) -> t -> elt option
      val of_list : elt list -> t
      val to_seq_from : elt -> t -> elt Stdlib.Seq.t
      val to_seq : t -> elt Stdlib.Seq.t
      val add_seq : elt Stdlib.Seq.t -> t -> t
      val of_seq : elt Stdlib.Seq.t -> t
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/UpdateData/index.html b/static/doc/geneweb/Geneweb/UpdateData/index.html new file mode 100644 index 0000000000..f712f4c631 --- /dev/null +++ b/static/doc/geneweb/Geneweb/UpdateData/index.html @@ -0,0 +1,2 @@ + +UpdateData (geneweb.Geneweb.UpdateData)

      Module Geneweb.UpdateData

      module PersMap : sig ... end
      module PersSet : sig ... end
      module StringSet : sig ... end
      module IstrSet : sig ... end
      val get_data : Config.config -> (Gwdb.person -> Gwdb.istr) list * (('a'b) Def.gen_pers_event -> 'b) list * (Gwdb.family -> Gwdb.istr) list * (('c'd) Def.gen_fam_event -> 'd) list
      val get_all_data : Config.config -> Gwdb.base -> IstrSet.elt list
      val get_person_from_data : Config.config -> Gwdb.base -> (PersMap.key * PersSet.elt list) list
      val combine_by_ini : string -> ('a * string) list -> (string * ('a * string) list) list
      val reduce_cpl_list : int -> ('a * 'b list) list -> ('a * 'b list) list

      Description : Retourne la sous liste telle que la somme des longueurs des ('b list) soit égale à size. Args :

      • size : la taille de la liste retournée
      • list : la liste originale Retour :
      • list : la nouvelle liste dont la somme des ('b list) est égale à size Rem : Non exporté en clair hors de ce module.
      val update_person : Config.config -> Gwdb.base -> string -> string -> Gwdb.person -> (Gwdb.iperGwdb.iperGwdb.istr) Def.gen_person

      Description : Met à jour le/les champ(s) de la personne. Args :

      • conf : configuration de la base
      • base : base de donnée
      • old : l'ancien contenu
      • new_input : le nouveau contenu
      • p : person Retour :
      • gen_person iper istr : gen_person avec les champs modifiés Rem : Non exporté en clair hors de ce module.
      val update_family : Config.config -> Gwdb.base -> string -> string -> Gwdb.family -> (Gwdb.iperGwdb.ifamGwdb.istr) Def.gen_family

      Description : Met à jour le/les champ(s) de la famille. Args :

      • conf : configuration de la base
      • base : base de donnée
      • old : l'ancien contenu
      • new_input : le nouveau contenu
      • fam : family Retour :
      • gen_family ifam istr : gen_family avec les champs modifiés Rem : Non exporté en clair hors de ce module.
      val update_person_list : Config.config -> Gwdb.base -> string -> (string * Gwdb.person list) list -> int -> int -> unit

      Description : Args :

      • conf : configuration
      • base : base
      • new_input : le nouveau contenu
      • list : la liste des (clé, person list)
      • nb_pers : le nombre de personnes concernées par la mise à jour
      • max_updates = le nombre maximum de persons que l'on met à jour Retour :
      • unit Rem : Non exporté en clair hors de ce module.
      val build_list : Config.config -> Gwdb.base -> (Gwdb.istr * string) list

      Get all the data and filter them if "s" is defined in conf.env

      val build_list_short : Config.config -> ('a * string) list -> StringSet.elt list
      val build_list_long : Config.config -> (Gwdb.istr * string) list -> (string * (Gwdb.istr * string) list) list
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/UpdateDataDisplay/index.html b/static/doc/geneweb/Geneweb/UpdateDataDisplay/index.html new file mode 100644 index 0000000000..342e049f52 --- /dev/null +++ b/static/doc/geneweb/Geneweb/UpdateDataDisplay/index.html @@ -0,0 +1,2 @@ + +UpdateDataDisplay (geneweb.Geneweb.UpdateDataDisplay)

      Module Geneweb.UpdateDataDisplay

      val print_mod : Config.config -> Gwdb.base -> unit

      Displays a menu for updating Geneweb's dictionary of names, last names, locations, sources and professions.

      val print_mod_ok : Config.config -> Gwdb.base -> unit

      Updates persons linked to the updated data.

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/UpdateFam/index.html b/static/doc/geneweb/Geneweb/UpdateFam/index.html new file mode 100644 index 0000000000..1135708384 --- /dev/null +++ b/static/doc/geneweb/Geneweb/UpdateFam/index.html @@ -0,0 +1,2 @@ + +UpdateFam (geneweb.Geneweb.UpdateFam)

      Module Geneweb.UpdateFam

      val person_key : Gwdb.base -> Gwdb.iper -> Update.key

      Returns the update key associated to a person

      val print_update_fam : Config.config -> Gwdb.base -> ((Update.keyGwdb.ifam, string) Def.gen_family * Update.key Def.gen_couple * Update.key Def.gen_descend) -> string -> unit

      The main page for updating families.

      val print_add : Config.config -> Gwdb.base -> unit

      Displays the form for adding families

      val print_mod : Config.config -> Gwdb.base -> unit

      Displays a form for updating a family

      val print_del : Config.config -> Gwdb.base -> unit

      Displays a page for validating the deletion of the family in argument

      val print_inv : Config.config -> Gwdb.base -> unit

      Displays a menu for inverting the order of two families

      val print_add_parents : Config.config -> Gwdb.base -> unit

      Associates parents to a person

      val change_order : Gwdb.person -> Gwdb.ifam -> int -> Gwdb.ifam list

      change_order p f i Returns the families of `p` where `f` is at the ith position. `i` must not be 0.

      val print_change_order : Config.config -> Gwdb.base -> unit

      Displays a menu to change the family order

      val print_change_event_order : Config.config -> Gwdb.base -> unit

      Displays the form for changing the order of events for a family

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/UpdateFamOk/index.html b/static/doc/geneweb/Geneweb/UpdateFamOk/index.html new file mode 100644 index 0000000000..c9bca07da8 --- /dev/null +++ b/static/doc/geneweb/Geneweb/UpdateFamOk/index.html @@ -0,0 +1,2 @@ + +UpdateFamOk (geneweb.Geneweb.UpdateFamOk)

      Module Geneweb.UpdateFamOk

      val reconstitute_from_fevents : bool -> 'string -> ('person'string) Def.gen_fam_event list -> (Def.relation_kind * Def.cdate * 'string * 'string * 'string) * Def.divorce * ('person * Def.witness_kind) array

      reconstitute_from_fevents nsck empty_string family_events Iterate over family's events and returns a tuple with:

      • marriage information (relation kind, date, place, notes, source);
      • divorce information;
      • marriage witnesses;

      Boolean `nsck' is true if no check have been made on the married persons sex.

      val effective_del : Config.config -> Gwdb.base -> Gwdb.iper -> Gwdb.family -> unit

      Removes a family from the base

      val all_checks_family : Config.config -> Gwdb.base -> Gwdb.ifam -> (Gwdb.iperGwdb.ifamGwdb.istr) Def.gen_family -> Gwdb.iper Def.gen_couple -> Gwdb.iper Def.gen_descend -> (Update.key Def.gen_couple * Update.key Def.gen_descend * (('i array * 'j array) * ('i array * 'j array)) option) -> CheckItem.base_warning list * CheckItem.base_misc list

      Displays a family page in HTML after an update. Used by MergeFamOk

      val print_del : Config.config -> Gwdb.base -> unit

      Deletes a family and displays a page confirming its deletion

      val print_add : Config.config -> Gwdb.base -> unit

      Displays the page after validating the addition of a family in the base

      val print_add_parents : Config.config -> Gwdb.base -> unit
      val print_mod_aux : Config.config -> Gwdb.base -> ((string * string * int * Update.create * string, Gwdb.ifam, string) Def.gen_family -> (string * string * int * Update.create * string) Def.gen_couple -> (string * string * int * Update.create * string) Def.gen_descend -> unit) -> unit
      val print_mod : Config.config -> Gwdb.base -> unit
      val print_inv : Config.config -> Gwdb.base -> unit

      Reverses families

      val print_change_order_ok : Config.config -> Gwdb.base -> unit

      Changes the family order for a person

      val print_change_event_order : Config.config -> Gwdb.base -> unit

      Changes the evenements order for a family

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/UpdateInd/index.html b/static/doc/geneweb/Geneweb/UpdateInd/index.html new file mode 100644 index 0000000000..6cd8bb4a0a --- /dev/null +++ b/static/doc/geneweb/Geneweb/UpdateInd/index.html @@ -0,0 +1,2 @@ + +UpdateInd (geneweb.Geneweb.UpdateInd)

      Module Geneweb.UpdateInd

      val string_person_of : Gwdb.base -> Gwdb.person -> (Gwdb.iperUpdate.key, string) Def.gen_person
      val print_update_ind : Config.config -> Gwdb.base -> (Gwdb.iperUpdate.key, string) Def.gen_person -> string -> unit

      The main HTML page displayed after an update. Based on template updind.txt

      val print_add : Config.config -> Gwdb.base -> unit

      Displays an HTML form with empty fields for adding a person

      val print_del : Config.config -> Gwdb.base -> unit

      Displays a page for validating the deletion of a person

      val print_mod : Config.config -> Gwdb.base -> unit

      Displays a form for updating a person

      val print_change_event_order : Config.config -> Gwdb.base -> unit

      Displays the form for changing the order of events for a person

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/UpdateIndOk/index.html b/static/doc/geneweb/Geneweb/UpdateIndOk/index.html new file mode 100644 index 0000000000..1898b3fa01 --- /dev/null +++ b/static/doc/geneweb/Geneweb/UpdateIndOk/index.html @@ -0,0 +1,3 @@ + +UpdateIndOk (geneweb.Geneweb.UpdateIndOk)

      Module Geneweb.UpdateIndOk

      val effective_del_no_commit : Gwdb.base -> (Gwdb.iperGwdb.iper, string) Def.gen_person -> unit

      Removes a person from the base

      val effective_del_commit : Config.config -> Gwdb.base -> (Gwdb.iperGwdb.iper, string) Def.gen_person -> unit

      Adds to the diff the deletion of a person

      val effective_del : Config.config -> Gwdb.base -> Gwdb.person -> unit

      effective_del applies effective_del_no_commit and effective_del_commit

      val effective_mod : ?prerr:(Config.config -> Gwdb.base -> Update.update_error -> unit) -> ?skip_conflict:Gwdb.iper -> +Config.config -> Gwdb.base -> (Gwdb.iperUpdate.key, string) Def.gen_person -> (Gwdb.iperGwdb.iperGwdb.istr) Def.gen_person

      effective_mod prerr ?skip_conflict conf base sp

      val print_mod : ?prerr:(Config.config -> Gwdb.base -> Update.update_error -> unit) -> Config.config -> Gwdb.base -> unit

      Tries to modifies a person and displays a success page if successful

      Patches the informations of a person by checking the order of events: for example, a birth should happen before the death of a mother.

      val print_mod_aux : Config.config -> Gwdb.base -> ((Gwdb.iperUpdate.key, string) Def.gen_person -> unit) -> unit
      val rename_image_file : Config.config -> Gwdb.base -> Gwdb.person -> (Gwdb.iperGwdb.iper, string) Def.gen_person -> unit

      Renames the image associated to a person

      val print_add : Config.config -> Gwdb.base -> unit

      Tries to add a person to the base and displays a success HTML page if successful

      val print_del : Config.config -> Gwdb.base -> unit

      Tries to remove a person from the base and displays a success HTML page if successful

      val print_change_event_order : Config.config -> Gwdb.base -> unit

      Tries to change the order of events for a person and displays a success HTML page if successful

      val raw_get : Config.config -> string -> string
      val strip_person : (Gwdb.iper, string * 'a * 'b * 'c * 'd, string) Def.gen_person -> (Gwdb.iper, string * 'a * 'b * 'c * 'd, string) Def.gen_person
      val check_person : Config.config -> (Gwdb.iper, string * string * 'b * 'c * 'd, string) Def.gen_person -> Update.update_error option
      val error_person : Config.config -> Update.update_error -> unit
      val reconstitute_death : Config.config -> Def.date option -> Def.date option -> string -> Def.burial -> string -> Def.death
      val reconstitute_from_pevents : ('a, string) Def.gen_pers_event list -> bool -> (Def.cdate * string * string * string) -> (Def.cdate * string * string * string) -> (Def.death * string * string * string) -> (Def.burial * string * string * string) -> (Def.cdate * string * string * string) * (Def.cdate * string * string * string) * (Def.death * string * string * string) * (Def.burial * string * string * string) * ('a, string) Def.gen_pers_event list
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Util/IfamSet/index.html b/static/doc/geneweb/Geneweb/Util/IfamSet/index.html new file mode 100644 index 0000000000..4a697e1d90 --- /dev/null +++ b/static/doc/geneweb/Geneweb/Util/IfamSet/index.html @@ -0,0 +1,2 @@ + +IfamSet (geneweb.Geneweb.Util.IfamSet)

      Module Util.IfamSet

      include Stdlib.Set.S with type elt = Gwdb.ifam
      type elt = Gwdb.ifam
      type t
      val empty : t
      val is_empty : t -> bool
      val mem : elt -> t -> bool
      val add : elt -> t -> t
      val singleton : elt -> t
      val remove : elt -> t -> t
      val union : t -> t -> t
      val inter : t -> t -> t
      val disjoint : t -> t -> bool
      val diff : t -> t -> t
      val compare : t -> t -> int
      val equal : t -> t -> bool
      val subset : t -> t -> bool
      val iter : (elt -> unit) -> t -> unit
      val map : (elt -> elt) -> t -> t
      val fold : (elt -> 'a -> 'a) -> t -> 'a -> 'a
      val for_all : (elt -> bool) -> t -> bool
      val exists : (elt -> bool) -> t -> bool
      val filter : (elt -> bool) -> t -> t
      val partition : (elt -> bool) -> t -> t * t
      val cardinal : t -> int
      val elements : t -> elt list
      val min_elt : t -> elt
      val min_elt_opt : t -> elt option
      val max_elt : t -> elt
      val max_elt_opt : t -> elt option
      val choose : t -> elt
      val choose_opt : t -> elt option
      val split : elt -> t -> t * bool * t
      val find : elt -> t -> elt
      val find_opt : elt -> t -> elt option
      val find_first : (elt -> bool) -> t -> elt
      val find_first_opt : (elt -> bool) -> t -> elt option
      val find_last : (elt -> bool) -> t -> elt
      val find_last_opt : (elt -> bool) -> t -> elt option
      val of_list : elt list -> t
      val to_seq_from : elt -> t -> elt Stdlib.Seq.t
      val to_seq : t -> elt Stdlib.Seq.t
      val add_seq : elt Stdlib.Seq.t -> t -> t
      val of_seq : elt Stdlib.Seq.t -> t
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Util/IperSet/index.html b/static/doc/geneweb/Geneweb/Util/IperSet/index.html new file mode 100644 index 0000000000..1a5e2f30b7 --- /dev/null +++ b/static/doc/geneweb/Geneweb/Util/IperSet/index.html @@ -0,0 +1,2 @@ + +IperSet (geneweb.Geneweb.Util.IperSet)

      Module Util.IperSet

      include Stdlib.Set.S with type elt = Gwdb.iper
      type elt = Gwdb.iper
      type t
      val empty : t
      val is_empty : t -> bool
      val mem : elt -> t -> bool
      val add : elt -> t -> t
      val singleton : elt -> t
      val remove : elt -> t -> t
      val union : t -> t -> t
      val inter : t -> t -> t
      val disjoint : t -> t -> bool
      val diff : t -> t -> t
      val compare : t -> t -> int
      val equal : t -> t -> bool
      val subset : t -> t -> bool
      val iter : (elt -> unit) -> t -> unit
      val map : (elt -> elt) -> t -> t
      val fold : (elt -> 'a -> 'a) -> t -> 'a -> 'a
      val for_all : (elt -> bool) -> t -> bool
      val exists : (elt -> bool) -> t -> bool
      val filter : (elt -> bool) -> t -> t
      val partition : (elt -> bool) -> t -> t * t
      val cardinal : t -> int
      val elements : t -> elt list
      val min_elt : t -> elt
      val min_elt_opt : t -> elt option
      val max_elt : t -> elt
      val max_elt_opt : t -> elt option
      val choose : t -> elt
      val choose_opt : t -> elt option
      val split : elt -> t -> t * bool * t
      val find : elt -> t -> elt
      val find_opt : elt -> t -> elt option
      val find_first : (elt -> bool) -> t -> elt
      val find_first_opt : (elt -> bool) -> t -> elt option
      val find_last : (elt -> bool) -> t -> elt
      val find_last_opt : (elt -> bool) -> t -> elt option
      val of_list : elt list -> t
      val to_seq_from : elt -> t -> elt Stdlib.Seq.t
      val to_seq : t -> elt Stdlib.Seq.t
      val add_seq : elt Stdlib.Seq.t -> t -> t
      val of_seq : elt Stdlib.Seq.t -> t
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Util/index.html b/static/doc/geneweb/Geneweb/Util/index.html new file mode 100644 index 0000000000..bba91eb271 --- /dev/null +++ b/static/doc/geneweb/Geneweb/Util/index.html @@ -0,0 +1,2 @@ + +Util (geneweb.Geneweb.Util)

      Module Geneweb.Util

      val cnt_dir : string Stdlib.ref

      Returns the current dir (changed by `gwd` if geneweb is running on windows)

      val image_prefix : Config.config -> string

      Returns the image prefix (conf.image_prefix)

      val base_path : string list -> string -> string

      Alias for !GWPARAM.base_path

      val bpath : string -> string

      Alias for !GWPARAM.bpath

      val search_in_assets : string -> string

      Checks that the file in argument belong to one of the asserts dir (defined in the Secure module)

      val etc_file_name : Config.config -> string -> string

      Returns the path to the template file in parameter

      val escache_value : Gwdb.base -> string

      Returns the date of the base directory last update

      val commit_patches : Config.config -> Gwdb.base -> unit

      Commits the patches and logs the modification

      val update_wf_trace : Config.config -> string -> unit
      val get_referer : Config.config -> string

      Get referer (the page you came from to the current page) page from HTTP request

      val no_html_tags : string -> string
      val clean_html_tags : string -> string list -> string
      val html : ?content_type:string -> Config.config -> unit

      Prints HTTP response headers with giving content type (default : text/html) on the socket.

      val unauthorized : Config.config -> string -> unit

      Prints HTTP response with code 401 (Unauthorized) and error page with giving message

      val string_of_ctime : Config.config -> string
      val commd : Config.config -> string

      Returns link to the current command (database name after domain name and port in url) with query string that containts bindings from conf.henv and conf.senv. Doesn't add binding (k,v) when:

      • k = "oc" or "ocz" and v = "0"
      • v = ""
      val commd_2 : Config.config -> string

      Same as commd but returns without separator '&' at the end.

      val prefix_base : Config.config -> string
      val prefix_base_password : Config.config -> string
      val prefix_base_2 : Config.config -> string
      val prefix_base_password_2 : Config.config -> string
      val hidden_env : Config.config -> unit

      Creates a hidden HTML input for every key and value in conf.henv and conf.senv. Used to include immutable environement bindings in the HTML form.

      val nobtit : Config.config -> Gwdb.base -> Gwdb.person -> Gwdb.title list

      nobtit conf base p returns list of titles of p from the base that respects constraints imposed by conf.allowed_titles and conf.denied_titles

      val strictly_after_private_years : Config.config -> Def.dmy -> bool
      val authorized_age : Config.config -> Gwdb.base -> Gwdb.person -> bool

      Alias to !GWPARAM.p_auth

      val is_old_person : Config.config -> (Gwdb.iperGwdb.iperGwdb.istr) Def.gen_person -> bool
      val start_with_vowel : string -> bool
      val acces_n : Config.config -> Gwdb.base -> string -> Gwdb.person -> string

      Returns URL query string to access nth person

      val acces : Config.config -> Gwdb.base -> Gwdb.person -> string
      val wprint_hidden_person : Config.config -> Gwdb.base -> string -> Gwdb.person -> unit
      val accessible_by_key : Config.config -> Gwdb.base -> Gwdb.person -> string -> string -> bool

      Tells if person could be accessed by his first name and surname

      geneweb_link conf href s Returns HTML link to actual geneweb's command (database name) with additional (to those defind by commd) argument href and s as textual content of the link.

      Prints on the socket link created by geneweb_link.

      val is_restricted : Config.config -> Gwdb.base -> Gwdb.iper -> bool

      Tells if person is restrited to acccess. If mode `use_restrict` is disabled returns always false.

      val is_hidden : Gwdb.person -> bool

      Tells if person is hiden (if his surname is empty)

      Returns person with giving id from the base. If person is restrited to acccess returns empty person with giving id.

      val string_gen_person : Gwdb.base -> (Gwdb.iperGwdb.iperGwdb.istr) Def.gen_person -> (Gwdb.iperGwdb.iper, string) Def.gen_person

      Remplaces string ids inside person's entry by real strings

      val string_gen_family : Gwdb.base -> (Gwdb.iperGwdb.ifamGwdb.istr) Def.gen_family -> (Gwdb.iperGwdb.ifam, string) Def.gen_family

      Remplaces string ids inside family's entry by real strings

      type p_access = (Gwdb.base -> Gwdb.person -> string) * (Gwdb.base -> Gwdb.person -> string)

      Type that defines couple of functions allowing to access to person's first name and surname.

      val std_access : p_access

      Standard access (p_first_name, p_surname).

      val raw_access : p_access

      Raw access (sou + get_name).

      val gen_person_text : p_access -> Config.config -> Gwdb.base -> Gwdb.person -> string

      Returns person's first name and surname HTML description depending on :

      • his public name
      • his qualifiers If person is hiden returns ".....". If person's names are hiden or access to them is denied returns "x x"
      val gen_person_text_no_html : p_access -> Config.config -> Gwdb.base -> Gwdb.person -> string

      Same as gen_person_text but doesn't encapsulates description in HTML tag <em>.

      val gen_person_text_without_title : p_access -> Config.config -> Gwdb.base -> Gwdb.person -> string

      Returns either person's first name and surname either title and qualifiers HTML description

      val gen_person_title_text : (Config.config -> Gwdb.base -> Gwdb.person -> string -> string) -> p_access -> Config.config -> Gwdb.base -> Gwdb.person -> string

      gen_person_title_text reference paccess conf base p returns HTML structure of person that describes person's first name surname and main title. reference is used to either encapsulate structure in the link (or other type of maniplations).

      val person_text : Config.config -> Gwdb.base -> Gwdb.person -> string

      Makes call to gen_person_text with std_access

      val person_text_no_html : Config.config -> Gwdb.base -> Gwdb.person -> string

      Makes call to gen_person_text_no_html with std_access

      val person_text_without_surname : Config.config -> Gwdb.base -> Gwdb.person -> string

      Same as gen_person_text but doesn't display surname

      val person_text_no_surn_no_acc_chk : Config.config -> Gwdb.base -> Gwdb.person -> string

      Same as gen_person_text but :

      • doesn't display surname
      • returns HTML description even if person's names are hiden or access to them is denied (don't print "x x")
      val person_text_without_title : Config.config -> Gwdb.base -> Gwdb.person -> string

      Makes call to gen_person_text_without_title with std_access

      val main_title : Config.config -> Gwdb.base -> Gwdb.person -> Gwdb.title option

      Returns main person's title. If person doesn't have it, then returns first title from the list.

      val titled_person_text : Config.config -> Gwdb.base -> Gwdb.person -> Gwdb.title -> string

      Returns person's first name and surname text description depending on person's title

      val one_title_text : Gwdb.base -> Gwdb.title -> string

      Returns HTML representation of title's identifier with its place (if exists)

      val person_title_text : Config.config -> Gwdb.base -> Gwdb.person -> string

      Returns HTML structure of person that describes person's first name surname and main title. Calls gen_person_title_text with no_reference.

      val person_title : Config.config -> Gwdb.base -> Gwdb.person -> string

      Returns HTML representation of person's main title (or first title if main doesn't exists). If person doesn't have a title or if access to person isn't granted returns empty string

      val child_of_parent : Config.config -> Gwdb.base -> Gwdb.person -> string
      val reference : Config.config -> Gwdb.base -> Gwdb.person -> string -> string

      reference conf base p desc returns HTML link to the person where desc is content of the link (generaly his first name and surname description). If person is hidden returns desc (do not create link).

      val reference_noid : Config.config -> Gwdb.base -> Gwdb.person -> string -> string

      Same as reference but link doesn't has "id" field

      val no_reference : Config.config -> Gwdb.base -> Gwdb.person -> string -> string

      reference conf base p desc returns desc without creating a link

      val referenced_person_title_text : Config.config -> Gwdb.base -> Gwdb.person -> string

      Retruns HTML link to the person that contains its first name, surname and person's nobility title. Calls gen_person_title_text with reference.

      val referenced_person_text : Config.config -> Gwdb.base -> Gwdb.person -> string

      Returns HTML link to the person that contains its first name and surname.

      val referenced_person_text_without_surname : Config.config -> Gwdb.base -> Gwdb.person -> string

      Returns HTML link to the person that contains its first name.

      val update_family_loop : Config.config -> Gwdb.base -> Gwdb.person -> string -> string
      val p_getenv : (string * string) list -> string -> string option

      Returns value associated to the label in environnement

      val p_getint : (string * string) list -> string -> int option

      Returns integer value associated to the label in environnement

      val create_env : string -> (string * string) list

      Create association list from two types of string. First has format : [k1=v1;k2=v2]. Second : [k1=v1&k2=v2]. For both returns list [("k1","v1"); ("k2","v2")].

      val open_etc_file : string -> (Stdlib.in_channel * string) option

      open_etc_file fname search for template etc/fname.txt inside the base directory or inside one of assets directories. Returns input channel and the path to giving template.

      val open_hed_trl : Config.config -> string -> Stdlib.in_channel option
      val open_templ_fname : Config.config -> string -> (Stdlib.in_channel * string) option

      open_etc_file fname search for template etc/fname.txt using config or inside one of assets directories. Returns input channel and the path to giving template.

      val open_templ : Config.config -> string -> Stdlib.in_channel option

      Same as open_templ_fname but returns only input channel of the giving template file

      val string_of_place : Config.config -> string -> string
      val place_of_string : Config.config -> string -> Def.place option
      val allowed_tags_file : string Stdlib.ref
      val body_prop : Config.config -> string

      Returns additional attributes for <body> tag from config.

      val message_to_wizard : Config.config -> unit

      Prints all messages send to wizard (or friend) on the socket. Messages are located in <basename>/etc/mess_wizzard.txt (messages destinated to all wizards) and in <basename>/etc/mess_wizzard_<user>.txt (messages destinated to considered wizard).

      val of_course_died : Config.config -> Gwdb.person -> bool
      val hexa_string : string -> string
      val surname_particle : Gwdb.base -> string -> string

      surname_particle base sn Extract the particle of sn if there is one. The list of particles to use is defined in base.

      val surname_without_particle : Gwdb.base -> string -> string

      surname_without_particle base sn Remove the particle of sn if there is one. The list of particles to use is defined in base.

      val specify_homonymous : Config.config -> Gwdb.base -> Gwdb.person -> bool -> unit
      val get_approx_birth_date_place : Config.config -> Gwdb.base -> Gwdb.person -> Def.date option * string
      val get_approx_death_date_place : Config.config -> Gwdb.base -> Gwdb.person -> Def.date option * string
      type ('a, 'b) format2 = ('a, unit, string, 'b) Stdlib.format4
      val check_format : ('a'b) format2 -> string -> ('a'b) format2 option
      val valid_format : ('a'b) format2 -> string -> ('a'b) format2
      val transl : Config.config -> string -> string

      Find translation of given english word in conf.lexicon

      val transl_nth : Config.config -> string -> int -> string

      transl_nth conf w n translate word w and returns n'th field of its translation (with nth_field).

      val transl_decline : Config.config -> string -> string -> string
      val ftransl : Config.config -> ('a'b) format2 -> ('a'b) format2
      val ftransl_nth : Config.config -> ('a'b) format2 -> int -> ('a'b) format2
      val fdecline : ('a'b) format2 -> string -> ('a'b) format2
      val fcapitale : ('a'b) format2 -> ('a'b) format2
      val nth_field : string -> int -> string

      nth_field str n gets n'th field of string that separate its fields with "/". Example :

      • nth_field "a/b/</c>/d" 0 = a
      • nth_field "a/b/</c>/d" 1 = b
      • nth_field "a/b/</c>/d" 2 = </c>
      • nth_field "a/b/</c>/d" 3 = d
      val cftransl : Config.config -> string -> string list -> string
      val translate_eval : string -> string
      val transl_a_of_b : Config.config -> string -> string -> string -> string

      transl_a_of_b conf a b b_raw Translate "a of b" using b_raw for declension. i.e. if b is wrapped in html, b_raw should be that texte with no html, and b_raw should be b otherwise.

      val transl_a_of_gr_eq_gen_lev : Config.config -> string -> string -> string -> string
      val std_color : Config.config -> string -> string

      Colorise HTML element with conf.highlight color.

      val index_of_sex : Def.sex -> int

      Sex index (0 for male, 1 for female, 2 for neuter)

      val string_of_pevent_name : Config.config -> Gwdb.base -> Gwdb.istr Def.gen_pers_event_name -> string
      val string_of_fevent_name : Config.config -> Gwdb.base -> Gwdb.istr Def.gen_fam_event_name -> string

      string_of_fevent_name conf base fevent_name

      val string_of_fevent : Config.config -> Gwdb.base -> Gwdb.istr Def.gen_fam_event_name -> string

      string_of_fevent conf base fevent_name

      val string_of_witness_kind : Config.config -> Def.sex -> Def.witness_kind -> string

      string_of_witness_kind conf sex wk Return the string corresponding to wk according to sex and conf.

      val relation_txt : Config.config -> Def.sex -> Gwdb.family -> (('a -> 'b) -> 'b'a'b) Stdlib.format
      val string_of_decimal_num : Config.config -> float -> string
      val person_exists : Config.config -> Gwdb.base -> (string * string * int) -> bool
      val husband_wife : Config.config -> Gwdb.base -> Gwdb.person -> bool -> string
      val find_person_in_env : Config.config -> Gwdb.base -> string -> Gwdb.person option

      find_person_in_env conf base suff Reconstitutes the key of a person from conf.env, using "i" ^ suff or "n" ^ suff + "p" ^ suff + "oc" ^ suff

      val find_person_in_env_pref : Config.config -> Gwdb.base -> string -> Gwdb.person option

      find_person_in_env_pref conf base prefix Same as find_person_in_env except that it uses a prefix instead of a suffix.

      val default_sosa_ref : Config.config -> Gwdb.base -> Gwdb.person option
      val find_sosa_ref : Config.config -> Gwdb.base -> Gwdb.person option
      val update_gwf_sosa : Config.config -> Gwdb.base -> (Gwdb.iper * (string * string * int)) -> unit
      val get_server_string : Config.config -> string

      Returns server host name with its port number (if different from 80).

      val get_request_string : Config.config -> string

      Returns request string. Request string has format scriptname?querystring where scriptname is a path to the script in URI.

      val create_topological_sort : Config.config -> Gwdb.base -> (Gwdb.iper, int) Gwdb.Marker.t
      val p_of_sosa : Config.config -> Gwdb.base -> Sosa.t -> Gwdb.person -> Gwdb.person option

      p_of_sosa conf base sosa p0 Get the sosa sosa of p0 if it exists

      val branch_of_sosa : Config.config -> Gwdb.base -> Sosa.t -> Gwdb.person -> Gwdb.person list option

      branch_of_sosa conf base sosa p0 Get all the lineage to go from p0's ancestor with sosa number sosa to p0

      val sosa_of_branch : Gwdb.person list -> Sosa.t

      sosa_of_branch branch Given a path of person to follow branch, return the sosa number of the last person of this list. No check is done to ensure that given persons are actually parents.

      val old_branch_of_sosa : Config.config -> Gwdb.base -> Gwdb.iper -> Sosa.t -> (Gwdb.iper * Def.sex) list option
      • deprecated

        Use branch_of_sosa instead

      val old_sosa_of_branch : Config.config -> Gwdb.base -> (Gwdb.iper * Def.sex) list -> Sosa.t
      • deprecated

        Use sosa_of_branch instead

      val has_image : Config.config -> Gwdb.base -> Gwdb.person -> bool
      val image_file_name : string -> string

      image_file_name fname search for image images/fname inside the base and assets directories. Retrun the path to found file or fname if file isn't found.

      val source_image_file_name : string -> string -> string

      Returns path to the image file with the giving name in directory sources.

      val image_size : string -> (int * int) option

      Returns width and height of an image.

      val limited_image_size : int -> int -> string -> (int * int) option -> (int * int) option

      limited_image_size max_wid max_hei fname defsize returns image size of fname. If width and height are greater then their limits max_wid and max_hei then returns reduced size with the same proportions. defsize is returned if image filename is empty.

      val image_and_size : Config.config -> Gwdb.base -> Gwdb.person -> (string -> (int * int) option -> (int * int) option) -> (bool * string * (int * int) option) option

      Returns path to the personal image. In details, returns (is_filename,source,size) where is_filename tells if source is a filename or URL and size is a size of image (width x height).

      val default_image_name_of_key : string -> string -> int -> string

      Returns default image name calculated from person's first name, surname and occurence number. For example : Jean Claude DUPOND 3 => jean_claude.3.dupond

      val default_image_name : Gwdb.base -> Gwdb.person -> string

      Returns default image name calculated from person's key.

      val auto_image_file : Config.config -> Gwdb.base -> Gwdb.person -> string option

      Searchs personal image (portrait) inside the base directory by looking up its default name and tryig to deduce its extension. Returns path to the image if found.

      val only_printable : string -> string

      Trims and remplaces all non-printable characters by spaces in the given string.

      val only_printable_or_nl : string -> string

      Same as only_printable but also accepts '\n'.

      val relation_type_text : Config.config -> Def.relation_type -> int -> string
      val rchild_type_text : Config.config -> Def.relation_type -> int -> string
      val has_nephews_or_nieces : Config.config -> Gwdb.base -> Gwdb.person -> bool
      val browser_doesnt_have_tables : Config.config -> bool
      val doctype : Config.config -> string
      val begin_centered : Config.config -> unit

      Prints on the socket beginning of the <table> tag untill first opened <td> where the text is centred

      val end_centered : Config.config -> unit

      Prints on the socket end of the column and table opened by begin_centered

      val print_alphab_list : Config.config -> ('a -> string) -> ('a -> unit) -> 'a list -> unit
      val pre_text_size : string -> int
      val print_pre_center : Config.config -> int -> string -> unit
      val print_pre_left : Config.config -> int -> string -> unit
      val print_pre_right : Config.config -> int -> string -> unit
      val short_f_month : int -> string
      type auth_user = {
      au_user : string;
      au_passwd : string;
      au_info : string;
      }

      Authenticated user from from authorization file.

      val read_gen_auth_file : string -> auth_user list

      Read all authenticated users with their passwords from authorization file (associated to "wizard_passwd_file" in conf.base_env)

      val is_that_user_and_password : Config.auth_scheme_kind -> string -> string -> bool

      is_that_user_and_password auth_sheme user paswd verify if given user with his password correspond to the authentication scheme.

      val in_text : bool -> string -> string -> bool
      val html_highlight : bool -> string -> string -> string
      val wprint_in_columns : Config.config -> ('a -> string) -> ('a -> unit) -> 'a list -> unit
      val is_hide_names : Config.config -> Gwdb.person -> bool

      Tells if person's names are hiden (if person's access is Private or if mode conf.hide_names is enabled).

      val reduce_list : int -> 'a list -> 'a list

      reduce_list n l takes n first elements from the list l

      val print_reference : Config.config -> string -> int -> string -> unit
      val gen_print_tips : Config.config -> string -> unit

      Print a tip with the specified text

      val print_tips_relationship : Config.config -> unit

      Print a tip that tells to Click an individual below to calculate the family link.

      val print_image_sex : Config.config -> Gwdb.person -> int -> unit
      val display_options : Config.config -> string
      type cache_visited_t = (string, (Gwdb.iper * string) list) Stdlib.Hashtbl.t
      val cache_visited : Config.config -> string
      val read_visited : Config.config -> cache_visited_t
      val record_visited : Config.config -> Gwdb.iper -> unit
      val array_mem_witn : Config.config -> Gwdb.base -> Gwdb.iper -> (Gwdb.iper * Def.witness_kind) array -> bool * string

      array_mem_witn conf base ip array checks if ip is in array and returns corresponding string_of_witness_kind if so.

      val name_key : Gwdb.base -> string -> string

      name_key base name is name, with particles put at the end of the string instead of the beginning.

      val nb_char_occ : char -> string -> int

      nb_char_occ c s return the number of times c appears in s.

      val escape_html : string -> string

      escape_html str replaces '&', '"', '\'', '<' and '>' with their corresponding character entities (using entity number)

      val safe_html : string -> string

      safe_html s sanitizes s element in order to fix ill-formed HTML input and to prevent XSS injection

      It removes any tag which is not allowed by geneweb. It removes all attributes starting with "on". It removes any attribute when the value starts with "javascript". Text is escaped using escape_html.

      val string_with_macros : Config.config -> (char * (unit -> string)) list -> string -> string

      string_with_macros conf env s Return a string with "%xxx" macro replaced by their value. Also filter unsafe html tags.

      val is_empty_name : Gwdb.person -> bool

      is_empty_name p false if we knwon the first name or the last name of p.

      module IperSet : sig ... end
      module IfamSet : sig ... end
      val include_template : Config.config -> (string * string) list -> string -> (unit -> unit) -> unit

      include_template conf env fname failure Search fname in templates path and interpret it with global environnement env provided. Interpretation of template write directly its results in the socket. If the file can not be found, failure is called.

      val select_masc : Config.config -> Gwdb.base -> (Gwdb.iper * int) list -> (Gwdb.iper, int * Gwdb.person) Stdlib.Hashtbl.t

      select_masc conf base ips From ips, a list matching ipers to a number of maximum generations, get maximum ascendants of ipers up to these corresponding generations.

      A person is maximum ascendant if their generation matches the maximum, or if they do not have ancestors.

      The result is a Hashtbl matching an iper to the corresponding person and their generation.

      val select_desc : Config.config -> Gwdb.base -> int -> (Gwdb.iper * int) list -> (Gwdb.iperGwdb.person) Stdlib.Hashtbl.t

      select_desc conf base gen_desc ips From ips, a list matching ipers to a number of maximum generations, get spouses and descendants of ipers up to these corresponding generations.

      val select_mascdesc : Config.config -> Gwdb.base -> (Gwdb.iper * int) list -> int -> (Gwdb.iperGwdb.person) Stdlib.Hashtbl.t

      select_ascdesc conf base ips gen_desc Get maximum ascendants with select_masc, and get their desc with select_desc

      val sprintf_today : Config.config -> string

      sprintf_today confo Uses Mutil.sprintf_date in order to print datetime defined in conf.

      val auth_warning : Config.config -> Gwdb.base -> ('aGwdb.personGwdb.ifam'b'c'd'e) Def.warning -> bool

      auth_warning conf base w Check if current user has enough right in order to see w

      val person_warnings : Config.config -> Gwdb.base -> Gwdb.person -> CheckItem.base_warning list

      person_warnings conf base p Shorthand for CheckItem.person and CheckItem.on_person_update on p and CheckItem.check_siblings on they children using auth_warning for filtering.

      val name_with_roman_number : string -> string option

      Convert arabic numerals to roman numerals. Some result is returned if there are numerals, None if not.

      val cut_words : string -> string list

      cut_words str Same output as String.split_on_char ' ' s |> List.map String.trim |> List.filter ((<>) "")

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Version/index.html b/static/doc/geneweb/Geneweb/Version/index.html new file mode 100644 index 0000000000..e95ca506bf --- /dev/null +++ b/static/doc/geneweb/Geneweb/Version/index.html @@ -0,0 +1,2 @@ + +Version (geneweb.Geneweb.Version)

      Module Geneweb.Version

      val txt : string

      Current Geneweb version

      val available_languages : string list

      List of all supported by Geneweb languages (abbreviations).

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Wiki/index.html b/static/doc/geneweb/Geneweb/Wiki/index.html new file mode 100644 index 0000000000..2ef6d665d2 --- /dev/null +++ b/static/doc/geneweb/Geneweb/Wiki/index.html @@ -0,0 +1,4 @@ + +Wiki (geneweb.Geneweb.Wiki)

      Module Geneweb.Wiki

      type wiki_info = {
      wi_mode : string;
      wi_file_path : string -> string;
      wi_person_exists : (string * string * int) -> bool;
      }
      val html_of_tlsw : Config.config -> string -> string list

      Parses a whole TLSW text to a list of strings

      val html_with_summary_of_tlsw : Config.config -> wiki_info -> (bool * string * string) option -> string -> string

      HTML displaying a table of content for a TLSW file

      val extract_sub_part : string -> int -> string list

      extract_sub_part tlsw i Extracts the `i`th first TLSW sections of `tlsw`

      val split_title_and_text : string -> (string * string) list * string

      The argument is expected to have the form "KEY=value\n"... This function calculates each Key/value pair and puts it in a list; except for the key TITLE, that is the second element of the returned tuple. If there is no title defined, checks if the first line is not empty and does not start with '=' nor contains '<' nor '', in which case it is choosen as a + first line. Otherwise, the title is the empty string. +

      val print_sub_part : Config.config -> wiki_info -> bool -> string -> string -> int -> string list -> unit

      Prints an exctracted sub part

      val print_mod_view_page : Config.config -> bool -> string -> string -> (bool -> unit) -> (string * string) list -> string -> unit

      Prints an editable part

      val print_mod_ok : Config.config -> wiki_info -> (string -> string option) -> (string option -> string) -> (string -> (string * string) list * string) -> (string -> string -> unit) -> (string -> string) -> bool -> unit

      Commits the changes of a page

      val notes_aliases : Config.config -> (string * string) list

      Reads the notes alias file (conf.base_env.notes_alias_file or base_path/notes.alias). File format is "KEY value\n...", returns the list of (KEY,value)

      val map_notes : (string * string) list -> string -> string

      Given an alias list, finds the corresponding alias for a given string

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/WiznotesDisplay/index.html b/static/doc/geneweb/Geneweb/WiznotesDisplay/index.html new file mode 100644 index 0000000000..640077e5f6 --- /dev/null +++ b/static/doc/geneweb/Geneweb/WiznotesDisplay/index.html @@ -0,0 +1,2 @@ + +WiznotesDisplay (geneweb.Geneweb.WiznotesDisplay)

      Module Geneweb.WiznotesDisplay

      val dir : Config.config -> Gwdb.base -> string

      Returns the path to the wizard notes files associated to the base.

      val print : Config.config -> Gwdb.base -> unit

      Prints the HTML page displaying the wizard notes. Fails if wizard authentification is incorrect

      val print_mod : Config.config -> Gwdb.base -> unit

      Prints the HTML page displaying editable wizard notes. Fails if wizard authentification is incorrect or if current user cannot edit.

      val print_mod_ok : Config.config -> Gwdb.base -> unit

      Commits the modification and displays the `OK` page. Fails if wizard authentification is incorrect

      val print_view : Config.config -> Gwdb.base -> unit

      Same as `print_mod`, but works even if user cannot edit. It still fails in case of wrong authentification.

      Same as `print` but highlights HTML with the speficied string searched (environment key of search is `s`). If no search is specified, just prints the wizard notes.

      val connected_wizards : Config.config -> Gwdb.base -> unit

      Displays the connected wizards.

      val change_wizard_visibility : Config.config -> Gwdb.base -> unit

      Same as `connected_wizards`, but starts by updating the wizard visibility.

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/index.html b/static/doc/geneweb/Geneweb/index.html new file mode 100644 index 0000000000..09f3adbc6f --- /dev/null +++ b/static/doc/geneweb/Geneweb/index.html @@ -0,0 +1,2 @@ + +Geneweb (geneweb.Geneweb)

      Module Geneweb

      module AdvSearchOk : sig ... end
      module AdvSearchOkDisplay : sig ... end
      module Alln : sig ... end
      module AllnDisplay : sig ... end
      module Ansel : sig ... end
      module Base64 : sig ... end
      module BirthDeath : sig ... end
      module BirthDeathDisplay : sig ... end
      module BirthdayDisplay : sig ... end
      module ChangeChildren : sig ... end
      module ChangeChildrenDisplay : sig ... end
      module Check : sig ... end
      module CheckItem : sig ... end
      module Config : sig ... end
      module Cousins : sig ... end
      module CousinsDisplay : sig ... end
      module Dag : sig ... end
      module Dag2html : sig ... end
      module DagDisplay : sig ... end
      module DateDisplay : sig ... end
      module DescendDisplay : sig ... end
      module Difference : sig ... end

      Differences between two arrays.

      module Fixbase : sig ... end

      All the function of this module scan the base and fix what is considered as corrupted data.

      module GWPARAM : sig ... end
      module GWPARAM_ITL : sig ... end
      module Gwlib : sig ... end
      module History : sig ... end
      module HistoryDiff : sig ... end
      module HistoryDiffDisplay : sig ... end
      module Hutil : sig ... end
      module ImageDisplay : sig ... end
      module MergeDisplay : sig ... end
      module MergeDupDisplay : sig ... end
      module MergeFamDisplay : sig ... end
      module MergeFamOk : sig ... end
      module MergeInd : sig ... end
      module MergeIndDisplay : sig ... end
      module MergeIndOk : sig ... end
      module MergeIndOkDisplay : sig ... end
      module Notes : sig ... end
      module NotesDisplay : sig ... end
      module Output : sig ... end
      module Perso : sig ... end
      module Place : sig ... end
      module PlaceDisplay : sig ... end
      module Relation : sig ... end
      module RelationDisplay : sig ... end
      module SearchName : sig ... end
      module Some : sig ... end
      module SrcfileDisplay : sig ... end
      module Stats : sig ... end
      module Templ : sig ... end
      module TemplAst : sig ... end
      module TemplDate : sig ... end
      module Templ_parser : sig ... end
      module Title : sig ... end
      module TitleDisplay : sig ... end
      module Translate : sig ... end
      module Update : sig ... end
      module UpdateData : sig ... end
      module UpdateDataDisplay : sig ... end
      module UpdateFam : sig ... end
      module UpdateFamOk : sig ... end
      module UpdateInd : sig ... end
      module UpdateIndOk : sig ... end
      module Util : sig ... end
      module Version : sig ... end
      module Wiki : sig ... end
      module WiznotesDisplay : sig ... end
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__AdvSearchOk/.dune-keep b/static/doc/geneweb/Geneweb__AdvSearchOk/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__AdvSearchOk/index.html b/static/doc/geneweb/Geneweb__AdvSearchOk/index.html new file mode 100644 index 0000000000..4365966aa4 --- /dev/null +++ b/static/doc/geneweb/Geneweb__AdvSearchOk/index.html @@ -0,0 +1,2 @@ + +Geneweb__AdvSearchOk (geneweb.Geneweb__AdvSearchOk)

      Module Geneweb__AdvSearchOk

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__AdvSearchOkDisplay/.dune-keep b/static/doc/geneweb/Geneweb__AdvSearchOkDisplay/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__AdvSearchOkDisplay/index.html b/static/doc/geneweb/Geneweb__AdvSearchOkDisplay/index.html new file mode 100644 index 0000000000..127f15a34e --- /dev/null +++ b/static/doc/geneweb/Geneweb__AdvSearchOkDisplay/index.html @@ -0,0 +1,2 @@ + +Geneweb__AdvSearchOkDisplay (geneweb.Geneweb__AdvSearchOkDisplay)

      Module Geneweb__AdvSearchOkDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Alln/.dune-keep b/static/doc/geneweb/Geneweb__Alln/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__Alln/index.html b/static/doc/geneweb/Geneweb__Alln/index.html new file mode 100644 index 0000000000..ef7aade373 --- /dev/null +++ b/static/doc/geneweb/Geneweb__Alln/index.html @@ -0,0 +1,2 @@ + +Geneweb__Alln (geneweb.Geneweb__Alln)

      Module Geneweb__Alln

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__AllnDisplay/.dune-keep b/static/doc/geneweb/Geneweb__AllnDisplay/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__AllnDisplay/index.html b/static/doc/geneweb/Geneweb__AllnDisplay/index.html new file mode 100644 index 0000000000..da6f473e26 --- /dev/null +++ b/static/doc/geneweb/Geneweb__AllnDisplay/index.html @@ -0,0 +1,2 @@ + +Geneweb__AllnDisplay (geneweb.Geneweb__AllnDisplay)

      Module Geneweb__AllnDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Ansel/.dune-keep b/static/doc/geneweb/Geneweb__Ansel/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__Ansel/index.html b/static/doc/geneweb/Geneweb__Ansel/index.html new file mode 100644 index 0000000000..a5e6c5d870 --- /dev/null +++ b/static/doc/geneweb/Geneweb__Ansel/index.html @@ -0,0 +1,2 @@ + +Geneweb__Ansel (geneweb.Geneweb__Ansel)

      Module Geneweb__Ansel

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Base64/.dune-keep b/static/doc/geneweb/Geneweb__Base64/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__Base64/index.html b/static/doc/geneweb/Geneweb__Base64/index.html new file mode 100644 index 0000000000..0d81b73c02 --- /dev/null +++ b/static/doc/geneweb/Geneweb__Base64/index.html @@ -0,0 +1,2 @@ + +Geneweb__Base64 (geneweb.Geneweb__Base64)

      Module Geneweb__Base64

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__BirthDeath/.dune-keep b/static/doc/geneweb/Geneweb__BirthDeath/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__BirthDeath/index.html b/static/doc/geneweb/Geneweb__BirthDeath/index.html new file mode 100644 index 0000000000..4c4b56c7d0 --- /dev/null +++ b/static/doc/geneweb/Geneweb__BirthDeath/index.html @@ -0,0 +1,2 @@ + +Geneweb__BirthDeath (geneweb.Geneweb__BirthDeath)

      Module Geneweb__BirthDeath

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__BirthDeathDisplay/.dune-keep b/static/doc/geneweb/Geneweb__BirthDeathDisplay/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__BirthDeathDisplay/index.html b/static/doc/geneweb/Geneweb__BirthDeathDisplay/index.html new file mode 100644 index 0000000000..882db62f4a --- /dev/null +++ b/static/doc/geneweb/Geneweb__BirthDeathDisplay/index.html @@ -0,0 +1,2 @@ + +Geneweb__BirthDeathDisplay (geneweb.Geneweb__BirthDeathDisplay)

      Module Geneweb__BirthDeathDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__BirthdayDisplay/.dune-keep b/static/doc/geneweb/Geneweb__BirthdayDisplay/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__BirthdayDisplay/index.html b/static/doc/geneweb/Geneweb__BirthdayDisplay/index.html new file mode 100644 index 0000000000..6b46c643a1 --- /dev/null +++ b/static/doc/geneweb/Geneweb__BirthdayDisplay/index.html @@ -0,0 +1,2 @@ + +Geneweb__BirthdayDisplay (geneweb.Geneweb__BirthdayDisplay)

      Module Geneweb__BirthdayDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__ChangeChildren/.dune-keep b/static/doc/geneweb/Geneweb__ChangeChildren/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__ChangeChildren/index.html b/static/doc/geneweb/Geneweb__ChangeChildren/index.html new file mode 100644 index 0000000000..3223068011 --- /dev/null +++ b/static/doc/geneweb/Geneweb__ChangeChildren/index.html @@ -0,0 +1,2 @@ + +Geneweb__ChangeChildren (geneweb.Geneweb__ChangeChildren)

      Module Geneweb__ChangeChildren

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__ChangeChildrenDisplay/.dune-keep b/static/doc/geneweb/Geneweb__ChangeChildrenDisplay/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__ChangeChildrenDisplay/index.html b/static/doc/geneweb/Geneweb__ChangeChildrenDisplay/index.html new file mode 100644 index 0000000000..6634d7d41e --- /dev/null +++ b/static/doc/geneweb/Geneweb__ChangeChildrenDisplay/index.html @@ -0,0 +1,2 @@ + +Geneweb__ChangeChildrenDisplay (geneweb.Geneweb__ChangeChildrenDisplay)

      Module Geneweb__ChangeChildrenDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Check/.dune-keep b/static/doc/geneweb/Geneweb__Check/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__Check/index.html b/static/doc/geneweb/Geneweb__Check/index.html new file mode 100644 index 0000000000..ca2fa7f44d --- /dev/null +++ b/static/doc/geneweb/Geneweb__Check/index.html @@ -0,0 +1,2 @@ + +Geneweb__Check (geneweb.Geneweb__Check)

      Module Geneweb__Check

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__CheckItem/.dune-keep b/static/doc/geneweb/Geneweb__CheckItem/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__CheckItem/index.html b/static/doc/geneweb/Geneweb__CheckItem/index.html new file mode 100644 index 0000000000..30ad193df0 --- /dev/null +++ b/static/doc/geneweb/Geneweb__CheckItem/index.html @@ -0,0 +1,2 @@ + +Geneweb__CheckItem (geneweb.Geneweb__CheckItem)

      Module Geneweb__CheckItem

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Config/.dune-keep b/static/doc/geneweb/Geneweb__Config/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__Config/index.html b/static/doc/geneweb/Geneweb__Config/index.html new file mode 100644 index 0000000000..23cfcb706c --- /dev/null +++ b/static/doc/geneweb/Geneweb__Config/index.html @@ -0,0 +1,2 @@ + +Geneweb__Config (geneweb.Geneweb__Config)

      Module Geneweb__Config

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Cousins/.dune-keep b/static/doc/geneweb/Geneweb__Cousins/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__Cousins/index.html b/static/doc/geneweb/Geneweb__Cousins/index.html new file mode 100644 index 0000000000..7f76ee835f --- /dev/null +++ b/static/doc/geneweb/Geneweb__Cousins/index.html @@ -0,0 +1,2 @@ + +Geneweb__Cousins (geneweb.Geneweb__Cousins)

      Module Geneweb__Cousins

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__CousinsDisplay/.dune-keep b/static/doc/geneweb/Geneweb__CousinsDisplay/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__CousinsDisplay/index.html b/static/doc/geneweb/Geneweb__CousinsDisplay/index.html new file mode 100644 index 0000000000..731b9fc354 --- /dev/null +++ b/static/doc/geneweb/Geneweb__CousinsDisplay/index.html @@ -0,0 +1,2 @@ + +Geneweb__CousinsDisplay (geneweb.Geneweb__CousinsDisplay)

      Module Geneweb__CousinsDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Dag/.dune-keep b/static/doc/geneweb/Geneweb__Dag/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__Dag/index.html b/static/doc/geneweb/Geneweb__Dag/index.html new file mode 100644 index 0000000000..2c49ac6ce0 --- /dev/null +++ b/static/doc/geneweb/Geneweb__Dag/index.html @@ -0,0 +1,2 @@ + +Geneweb__Dag (geneweb.Geneweb__Dag)

      Module Geneweb__Dag

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Dag2html/.dune-keep b/static/doc/geneweb/Geneweb__Dag2html/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__Dag2html/index.html b/static/doc/geneweb/Geneweb__Dag2html/index.html new file mode 100644 index 0000000000..6668f80aa9 --- /dev/null +++ b/static/doc/geneweb/Geneweb__Dag2html/index.html @@ -0,0 +1,2 @@ + +Geneweb__Dag2html (geneweb.Geneweb__Dag2html)

      Module Geneweb__Dag2html

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__DagDisplay/.dune-keep b/static/doc/geneweb/Geneweb__DagDisplay/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__DagDisplay/index.html b/static/doc/geneweb/Geneweb__DagDisplay/index.html new file mode 100644 index 0000000000..08e178c33c --- /dev/null +++ b/static/doc/geneweb/Geneweb__DagDisplay/index.html @@ -0,0 +1,2 @@ + +Geneweb__DagDisplay (geneweb.Geneweb__DagDisplay)

      Module Geneweb__DagDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__DateDisplay/.dune-keep b/static/doc/geneweb/Geneweb__DateDisplay/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__DateDisplay/index.html b/static/doc/geneweb/Geneweb__DateDisplay/index.html new file mode 100644 index 0000000000..ab3f479072 --- /dev/null +++ b/static/doc/geneweb/Geneweb__DateDisplay/index.html @@ -0,0 +1,2 @@ + +Geneweb__DateDisplay (geneweb.Geneweb__DateDisplay)

      Module Geneweb__DateDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__DescendDisplay/.dune-keep b/static/doc/geneweb/Geneweb__DescendDisplay/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__DescendDisplay/index.html b/static/doc/geneweb/Geneweb__DescendDisplay/index.html new file mode 100644 index 0000000000..b3e91d6d1e --- /dev/null +++ b/static/doc/geneweb/Geneweb__DescendDisplay/index.html @@ -0,0 +1,2 @@ + +Geneweb__DescendDisplay (geneweb.Geneweb__DescendDisplay)

      Module Geneweb__DescendDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Difference/.dune-keep b/static/doc/geneweb/Geneweb__Difference/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__Difference/index.html b/static/doc/geneweb/Geneweb__Difference/index.html new file mode 100644 index 0000000000..e3ed90451a --- /dev/null +++ b/static/doc/geneweb/Geneweb__Difference/index.html @@ -0,0 +1,2 @@ + +Geneweb__Difference (geneweb.Geneweb__Difference)

      Module Geneweb__Difference

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Fixbase/.dune-keep b/static/doc/geneweb/Geneweb__Fixbase/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__Fixbase/index.html b/static/doc/geneweb/Geneweb__Fixbase/index.html new file mode 100644 index 0000000000..12a3287bb8 --- /dev/null +++ b/static/doc/geneweb/Geneweb__Fixbase/index.html @@ -0,0 +1,2 @@ + +Geneweb__Fixbase (geneweb.Geneweb__Fixbase)

      Module Geneweb__Fixbase

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__GWPARAM/.dune-keep b/static/doc/geneweb/Geneweb__GWPARAM/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__GWPARAM/index.html b/static/doc/geneweb/Geneweb__GWPARAM/index.html new file mode 100644 index 0000000000..d559c77920 --- /dev/null +++ b/static/doc/geneweb/Geneweb__GWPARAM/index.html @@ -0,0 +1,2 @@ + +Geneweb__GWPARAM (geneweb.Geneweb__GWPARAM)

      Module Geneweb__GWPARAM

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__GWPARAM_ITL/.dune-keep b/static/doc/geneweb/Geneweb__GWPARAM_ITL/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__GWPARAM_ITL/index.html b/static/doc/geneweb/Geneweb__GWPARAM_ITL/index.html new file mode 100644 index 0000000000..503ff60f9b --- /dev/null +++ b/static/doc/geneweb/Geneweb__GWPARAM_ITL/index.html @@ -0,0 +1,2 @@ + +Geneweb__GWPARAM_ITL (geneweb.Geneweb__GWPARAM_ITL)

      Module Geneweb__GWPARAM_ITL

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Gwlib/.dune-keep b/static/doc/geneweb/Geneweb__Gwlib/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__Gwlib/index.html b/static/doc/geneweb/Geneweb__Gwlib/index.html new file mode 100644 index 0000000000..5782c6828a --- /dev/null +++ b/static/doc/geneweb/Geneweb__Gwlib/index.html @@ -0,0 +1,2 @@ + +Geneweb__Gwlib (geneweb.Geneweb__Gwlib)

      Module Geneweb__Gwlib

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__History/.dune-keep b/static/doc/geneweb/Geneweb__History/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__History/index.html b/static/doc/geneweb/Geneweb__History/index.html new file mode 100644 index 0000000000..fb2aff0ad0 --- /dev/null +++ b/static/doc/geneweb/Geneweb__History/index.html @@ -0,0 +1,2 @@ + +Geneweb__History (geneweb.Geneweb__History)

      Module Geneweb__History

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__HistoryDiff/.dune-keep b/static/doc/geneweb/Geneweb__HistoryDiff/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__HistoryDiff/index.html b/static/doc/geneweb/Geneweb__HistoryDiff/index.html new file mode 100644 index 0000000000..115f5cdd04 --- /dev/null +++ b/static/doc/geneweb/Geneweb__HistoryDiff/index.html @@ -0,0 +1,2 @@ + +Geneweb__HistoryDiff (geneweb.Geneweb__HistoryDiff)

      Module Geneweb__HistoryDiff

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__HistoryDiffDisplay/.dune-keep b/static/doc/geneweb/Geneweb__HistoryDiffDisplay/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__HistoryDiffDisplay/index.html b/static/doc/geneweb/Geneweb__HistoryDiffDisplay/index.html new file mode 100644 index 0000000000..49bd9778ef --- /dev/null +++ b/static/doc/geneweb/Geneweb__HistoryDiffDisplay/index.html @@ -0,0 +1,2 @@ + +Geneweb__HistoryDiffDisplay (geneweb.Geneweb__HistoryDiffDisplay)

      Module Geneweb__HistoryDiffDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Hutil/.dune-keep b/static/doc/geneweb/Geneweb__Hutil/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__Hutil/index.html b/static/doc/geneweb/Geneweb__Hutil/index.html new file mode 100644 index 0000000000..7b38e90a44 --- /dev/null +++ b/static/doc/geneweb/Geneweb__Hutil/index.html @@ -0,0 +1,2 @@ + +Geneweb__Hutil (geneweb.Geneweb__Hutil)

      Module Geneweb__Hutil

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__ImageDisplay/.dune-keep b/static/doc/geneweb/Geneweb__ImageDisplay/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__ImageDisplay/index.html b/static/doc/geneweb/Geneweb__ImageDisplay/index.html new file mode 100644 index 0000000000..072a32e27f --- /dev/null +++ b/static/doc/geneweb/Geneweb__ImageDisplay/index.html @@ -0,0 +1,2 @@ + +Geneweb__ImageDisplay (geneweb.Geneweb__ImageDisplay)

      Module Geneweb__ImageDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__MergeDisplay/.dune-keep b/static/doc/geneweb/Geneweb__MergeDisplay/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__MergeDisplay/index.html b/static/doc/geneweb/Geneweb__MergeDisplay/index.html new file mode 100644 index 0000000000..60a0871f08 --- /dev/null +++ b/static/doc/geneweb/Geneweb__MergeDisplay/index.html @@ -0,0 +1,2 @@ + +Geneweb__MergeDisplay (geneweb.Geneweb__MergeDisplay)

      Module Geneweb__MergeDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__MergeDupDisplay/.dune-keep b/static/doc/geneweb/Geneweb__MergeDupDisplay/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__MergeDupDisplay/index.html b/static/doc/geneweb/Geneweb__MergeDupDisplay/index.html new file mode 100644 index 0000000000..db555e32a7 --- /dev/null +++ b/static/doc/geneweb/Geneweb__MergeDupDisplay/index.html @@ -0,0 +1,2 @@ + +Geneweb__MergeDupDisplay (geneweb.Geneweb__MergeDupDisplay)

      Module Geneweb__MergeDupDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__MergeFamDisplay/.dune-keep b/static/doc/geneweb/Geneweb__MergeFamDisplay/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__MergeFamDisplay/index.html b/static/doc/geneweb/Geneweb__MergeFamDisplay/index.html new file mode 100644 index 0000000000..f11d73e871 --- /dev/null +++ b/static/doc/geneweb/Geneweb__MergeFamDisplay/index.html @@ -0,0 +1,2 @@ + +Geneweb__MergeFamDisplay (geneweb.Geneweb__MergeFamDisplay)

      Module Geneweb__MergeFamDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__MergeFamOk/.dune-keep b/static/doc/geneweb/Geneweb__MergeFamOk/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__MergeFamOk/index.html b/static/doc/geneweb/Geneweb__MergeFamOk/index.html new file mode 100644 index 0000000000..d2fcf7a1b2 --- /dev/null +++ b/static/doc/geneweb/Geneweb__MergeFamOk/index.html @@ -0,0 +1,2 @@ + +Geneweb__MergeFamOk (geneweb.Geneweb__MergeFamOk)

      Module Geneweb__MergeFamOk

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__MergeInd/.dune-keep b/static/doc/geneweb/Geneweb__MergeInd/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__MergeInd/index.html b/static/doc/geneweb/Geneweb__MergeInd/index.html new file mode 100644 index 0000000000..023cdd9e9b --- /dev/null +++ b/static/doc/geneweb/Geneweb__MergeInd/index.html @@ -0,0 +1,2 @@ + +Geneweb__MergeInd (geneweb.Geneweb__MergeInd)

      Module Geneweb__MergeInd

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__MergeIndDisplay/.dune-keep b/static/doc/geneweb/Geneweb__MergeIndDisplay/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__MergeIndDisplay/index.html b/static/doc/geneweb/Geneweb__MergeIndDisplay/index.html new file mode 100644 index 0000000000..477e6e7f10 --- /dev/null +++ b/static/doc/geneweb/Geneweb__MergeIndDisplay/index.html @@ -0,0 +1,2 @@ + +Geneweb__MergeIndDisplay (geneweb.Geneweb__MergeIndDisplay)

      Module Geneweb__MergeIndDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__MergeIndOk/.dune-keep b/static/doc/geneweb/Geneweb__MergeIndOk/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__MergeIndOk/index.html b/static/doc/geneweb/Geneweb__MergeIndOk/index.html new file mode 100644 index 0000000000..b4c762ae19 --- /dev/null +++ b/static/doc/geneweb/Geneweb__MergeIndOk/index.html @@ -0,0 +1,2 @@ + +Geneweb__MergeIndOk (geneweb.Geneweb__MergeIndOk)

      Module Geneweb__MergeIndOk

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__MergeIndOkDisplay/.dune-keep b/static/doc/geneweb/Geneweb__MergeIndOkDisplay/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__MergeIndOkDisplay/index.html b/static/doc/geneweb/Geneweb__MergeIndOkDisplay/index.html new file mode 100644 index 0000000000..d8187f9ffa --- /dev/null +++ b/static/doc/geneweb/Geneweb__MergeIndOkDisplay/index.html @@ -0,0 +1,2 @@ + +Geneweb__MergeIndOkDisplay (geneweb.Geneweb__MergeIndOkDisplay)

      Module Geneweb__MergeIndOkDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Notes/.dune-keep b/static/doc/geneweb/Geneweb__Notes/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__Notes/index.html b/static/doc/geneweb/Geneweb__Notes/index.html new file mode 100644 index 0000000000..a8389a1cbd --- /dev/null +++ b/static/doc/geneweb/Geneweb__Notes/index.html @@ -0,0 +1,2 @@ + +Geneweb__Notes (geneweb.Geneweb__Notes)

      Module Geneweb__Notes

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__NotesDisplay/.dune-keep b/static/doc/geneweb/Geneweb__NotesDisplay/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__NotesDisplay/index.html b/static/doc/geneweb/Geneweb__NotesDisplay/index.html new file mode 100644 index 0000000000..e024fb4d9f --- /dev/null +++ b/static/doc/geneweb/Geneweb__NotesDisplay/index.html @@ -0,0 +1,2 @@ + +Geneweb__NotesDisplay (geneweb.Geneweb__NotesDisplay)

      Module Geneweb__NotesDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__NotesLinks/.dune-keep b/static/doc/geneweb/Geneweb__NotesLinks/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__NotesLinks/index.html b/static/doc/geneweb/Geneweb__NotesLinks/index.html new file mode 100644 index 0000000000..4e1a25414e --- /dev/null +++ b/static/doc/geneweb/Geneweb__NotesLinks/index.html @@ -0,0 +1,2 @@ + +Geneweb__NotesLinks (geneweb.Geneweb__NotesLinks)

      Module Geneweb__NotesLinks

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Output/.dune-keep b/static/doc/geneweb/Geneweb__Output/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__Output/index.html b/static/doc/geneweb/Geneweb__Output/index.html new file mode 100644 index 0000000000..c8f3491a7d --- /dev/null +++ b/static/doc/geneweb/Geneweb__Output/index.html @@ -0,0 +1,2 @@ + +Geneweb__Output (geneweb.Geneweb__Output)

      Module Geneweb__Output

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Perso/.dune-keep b/static/doc/geneweb/Geneweb__Perso/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__Perso/index.html b/static/doc/geneweb/Geneweb__Perso/index.html new file mode 100644 index 0000000000..ad69908b09 --- /dev/null +++ b/static/doc/geneweb/Geneweb__Perso/index.html @@ -0,0 +1,2 @@ + +Geneweb__Perso (geneweb.Geneweb__Perso)

      Module Geneweb__Perso

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Place/.dune-keep b/static/doc/geneweb/Geneweb__Place/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__Place/index.html b/static/doc/geneweb/Geneweb__Place/index.html new file mode 100644 index 0000000000..6b6940d7e7 --- /dev/null +++ b/static/doc/geneweb/Geneweb__Place/index.html @@ -0,0 +1,2 @@ + +Geneweb__Place (geneweb.Geneweb__Place)

      Module Geneweb__Place

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__PlaceDisplay/.dune-keep b/static/doc/geneweb/Geneweb__PlaceDisplay/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__PlaceDisplay/index.html b/static/doc/geneweb/Geneweb__PlaceDisplay/index.html new file mode 100644 index 0000000000..9de21160e2 --- /dev/null +++ b/static/doc/geneweb/Geneweb__PlaceDisplay/index.html @@ -0,0 +1,2 @@ + +Geneweb__PlaceDisplay (geneweb.Geneweb__PlaceDisplay)

      Module Geneweb__PlaceDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Relation/.dune-keep b/static/doc/geneweb/Geneweb__Relation/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__Relation/index.html b/static/doc/geneweb/Geneweb__Relation/index.html new file mode 100644 index 0000000000..2e0c68ab11 --- /dev/null +++ b/static/doc/geneweb/Geneweb__Relation/index.html @@ -0,0 +1,2 @@ + +Geneweb__Relation (geneweb.Geneweb__Relation)

      Module Geneweb__Relation

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__RelationDisplay/.dune-keep b/static/doc/geneweb/Geneweb__RelationDisplay/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__RelationDisplay/index.html b/static/doc/geneweb/Geneweb__RelationDisplay/index.html new file mode 100644 index 0000000000..d665957229 --- /dev/null +++ b/static/doc/geneweb/Geneweb__RelationDisplay/index.html @@ -0,0 +1,2 @@ + +Geneweb__RelationDisplay (geneweb.Geneweb__RelationDisplay)

      Module Geneweb__RelationDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__RelationLink/.dune-keep b/static/doc/geneweb/Geneweb__RelationLink/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__RelationLink/index.html b/static/doc/geneweb/Geneweb__RelationLink/index.html new file mode 100644 index 0000000000..7db4c28f30 --- /dev/null +++ b/static/doc/geneweb/Geneweb__RelationLink/index.html @@ -0,0 +1,2 @@ + +Geneweb__RelationLink (geneweb.Geneweb__RelationLink)

      Module Geneweb__RelationLink

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__SearchName/.dune-keep b/static/doc/geneweb/Geneweb__SearchName/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__SearchName/index.html b/static/doc/geneweb/Geneweb__SearchName/index.html new file mode 100644 index 0000000000..4e43a7f5d7 --- /dev/null +++ b/static/doc/geneweb/Geneweb__SearchName/index.html @@ -0,0 +1,2 @@ + +Geneweb__SearchName (geneweb.Geneweb__SearchName)

      Module Geneweb__SearchName

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Some/.dune-keep b/static/doc/geneweb/Geneweb__Some/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__Some/index.html b/static/doc/geneweb/Geneweb__Some/index.html new file mode 100644 index 0000000000..8f7216bb2c --- /dev/null +++ b/static/doc/geneweb/Geneweb__Some/index.html @@ -0,0 +1,2 @@ + +Geneweb__Some (geneweb.Geneweb__Some)

      Module Geneweb__Some

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__SrcfileDisplay/.dune-keep b/static/doc/geneweb/Geneweb__SrcfileDisplay/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__SrcfileDisplay/index.html b/static/doc/geneweb/Geneweb__SrcfileDisplay/index.html new file mode 100644 index 0000000000..9b3a96af75 --- /dev/null +++ b/static/doc/geneweb/Geneweb__SrcfileDisplay/index.html @@ -0,0 +1,2 @@ + +Geneweb__SrcfileDisplay (geneweb.Geneweb__SrcfileDisplay)

      Module Geneweb__SrcfileDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Stats/.dune-keep b/static/doc/geneweb/Geneweb__Stats/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__Stats/index.html b/static/doc/geneweb/Geneweb__Stats/index.html new file mode 100644 index 0000000000..a888ac3cce --- /dev/null +++ b/static/doc/geneweb/Geneweb__Stats/index.html @@ -0,0 +1,2 @@ + +Geneweb__Stats (geneweb.Geneweb__Stats)

      Module Geneweb__Stats

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Templ/.dune-keep b/static/doc/geneweb/Geneweb__Templ/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__Templ/index.html b/static/doc/geneweb/Geneweb__Templ/index.html new file mode 100644 index 0000000000..4393fb78ce --- /dev/null +++ b/static/doc/geneweb/Geneweb__Templ/index.html @@ -0,0 +1,2 @@ + +Geneweb__Templ (geneweb.Geneweb__Templ)

      Module Geneweb__Templ

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__TemplAst/.dune-keep b/static/doc/geneweb/Geneweb__TemplAst/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__TemplAst/index.html b/static/doc/geneweb/Geneweb__TemplAst/index.html new file mode 100644 index 0000000000..b4e23afae0 --- /dev/null +++ b/static/doc/geneweb/Geneweb__TemplAst/index.html @@ -0,0 +1,2 @@ + +Geneweb__TemplAst (geneweb.Geneweb__TemplAst)

      Module Geneweb__TemplAst

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__TemplDate/.dune-keep b/static/doc/geneweb/Geneweb__TemplDate/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__TemplDate/index.html b/static/doc/geneweb/Geneweb__TemplDate/index.html new file mode 100644 index 0000000000..bc0dbb7c6b --- /dev/null +++ b/static/doc/geneweb/Geneweb__TemplDate/index.html @@ -0,0 +1,2 @@ + +Geneweb__TemplDate (geneweb.Geneweb__TemplDate)

      Module Geneweb__TemplDate

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Templ_parser/.dune-keep b/static/doc/geneweb/Geneweb__Templ_parser/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__Templ_parser/index.html b/static/doc/geneweb/Geneweb__Templ_parser/index.html new file mode 100644 index 0000000000..a58262c1a2 --- /dev/null +++ b/static/doc/geneweb/Geneweb__Templ_parser/index.html @@ -0,0 +1,2 @@ + +Geneweb__Templ_parser (geneweb.Geneweb__Templ_parser)

      Module Geneweb__Templ_parser

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Title/.dune-keep b/static/doc/geneweb/Geneweb__Title/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__Title/index.html b/static/doc/geneweb/Geneweb__Title/index.html new file mode 100644 index 0000000000..73f67c7627 --- /dev/null +++ b/static/doc/geneweb/Geneweb__Title/index.html @@ -0,0 +1,2 @@ + +Geneweb__Title (geneweb.Geneweb__Title)

      Module Geneweb__Title

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__TitleDisplay/.dune-keep b/static/doc/geneweb/Geneweb__TitleDisplay/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__TitleDisplay/index.html b/static/doc/geneweb/Geneweb__TitleDisplay/index.html new file mode 100644 index 0000000000..a9267d66c2 --- /dev/null +++ b/static/doc/geneweb/Geneweb__TitleDisplay/index.html @@ -0,0 +1,2 @@ + +Geneweb__TitleDisplay (geneweb.Geneweb__TitleDisplay)

      Module Geneweb__TitleDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Translate/.dune-keep b/static/doc/geneweb/Geneweb__Translate/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__Translate/index.html b/static/doc/geneweb/Geneweb__Translate/index.html new file mode 100644 index 0000000000..1356d11615 --- /dev/null +++ b/static/doc/geneweb/Geneweb__Translate/index.html @@ -0,0 +1,2 @@ + +Geneweb__Translate (geneweb.Geneweb__Translate)

      Module Geneweb__Translate

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Update/.dune-keep b/static/doc/geneweb/Geneweb__Update/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__Update/index.html b/static/doc/geneweb/Geneweb__Update/index.html new file mode 100644 index 0000000000..045d1ba514 --- /dev/null +++ b/static/doc/geneweb/Geneweb__Update/index.html @@ -0,0 +1,2 @@ + +Geneweb__Update (geneweb.Geneweb__Update)

      Module Geneweb__Update

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__UpdateData/.dune-keep b/static/doc/geneweb/Geneweb__UpdateData/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__UpdateData/index.html b/static/doc/geneweb/Geneweb__UpdateData/index.html new file mode 100644 index 0000000000..23dac545b6 --- /dev/null +++ b/static/doc/geneweb/Geneweb__UpdateData/index.html @@ -0,0 +1,2 @@ + +Geneweb__UpdateData (geneweb.Geneweb__UpdateData)

      Module Geneweb__UpdateData

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__UpdateDataDisplay/.dune-keep b/static/doc/geneweb/Geneweb__UpdateDataDisplay/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__UpdateDataDisplay/index.html b/static/doc/geneweb/Geneweb__UpdateDataDisplay/index.html new file mode 100644 index 0000000000..12a4a53195 --- /dev/null +++ b/static/doc/geneweb/Geneweb__UpdateDataDisplay/index.html @@ -0,0 +1,2 @@ + +Geneweb__UpdateDataDisplay (geneweb.Geneweb__UpdateDataDisplay)

      Module Geneweb__UpdateDataDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__UpdateFam/.dune-keep b/static/doc/geneweb/Geneweb__UpdateFam/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__UpdateFam/index.html b/static/doc/geneweb/Geneweb__UpdateFam/index.html new file mode 100644 index 0000000000..1740cc5de5 --- /dev/null +++ b/static/doc/geneweb/Geneweb__UpdateFam/index.html @@ -0,0 +1,2 @@ + +Geneweb__UpdateFam (geneweb.Geneweb__UpdateFam)

      Module Geneweb__UpdateFam

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__UpdateFamOk/.dune-keep b/static/doc/geneweb/Geneweb__UpdateFamOk/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__UpdateFamOk/index.html b/static/doc/geneweb/Geneweb__UpdateFamOk/index.html new file mode 100644 index 0000000000..ada7c7d372 --- /dev/null +++ b/static/doc/geneweb/Geneweb__UpdateFamOk/index.html @@ -0,0 +1,2 @@ + +Geneweb__UpdateFamOk (geneweb.Geneweb__UpdateFamOk)

      Module Geneweb__UpdateFamOk

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__UpdateInd/.dune-keep b/static/doc/geneweb/Geneweb__UpdateInd/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__UpdateInd/index.html b/static/doc/geneweb/Geneweb__UpdateInd/index.html new file mode 100644 index 0000000000..dcef231258 --- /dev/null +++ b/static/doc/geneweb/Geneweb__UpdateInd/index.html @@ -0,0 +1,2 @@ + +Geneweb__UpdateInd (geneweb.Geneweb__UpdateInd)

      Module Geneweb__UpdateInd

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__UpdateIndOk/.dune-keep b/static/doc/geneweb/Geneweb__UpdateIndOk/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__UpdateIndOk/index.html b/static/doc/geneweb/Geneweb__UpdateIndOk/index.html new file mode 100644 index 0000000000..3071d06c79 --- /dev/null +++ b/static/doc/geneweb/Geneweb__UpdateIndOk/index.html @@ -0,0 +1,2 @@ + +Geneweb__UpdateIndOk (geneweb.Geneweb__UpdateIndOk)

      Module Geneweb__UpdateIndOk

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Util/.dune-keep b/static/doc/geneweb/Geneweb__Util/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__Util/index.html b/static/doc/geneweb/Geneweb__Util/index.html new file mode 100644 index 0000000000..510be20121 --- /dev/null +++ b/static/doc/geneweb/Geneweb__Util/index.html @@ -0,0 +1,2 @@ + +Geneweb__Util (geneweb.Geneweb__Util)

      Module Geneweb__Util

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Version/.dune-keep b/static/doc/geneweb/Geneweb__Version/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__Version/index.html b/static/doc/geneweb/Geneweb__Version/index.html new file mode 100644 index 0000000000..6757c2a894 --- /dev/null +++ b/static/doc/geneweb/Geneweb__Version/index.html @@ -0,0 +1,2 @@ + +Geneweb__Version (geneweb.Geneweb__Version)

      Module Geneweb__Version

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Wiki/.dune-keep b/static/doc/geneweb/Geneweb__Wiki/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__Wiki/index.html b/static/doc/geneweb/Geneweb__Wiki/index.html new file mode 100644 index 0000000000..f417b7d6c3 --- /dev/null +++ b/static/doc/geneweb/Geneweb__Wiki/index.html @@ -0,0 +1,2 @@ + +Geneweb__Wiki (geneweb.Geneweb__Wiki)

      Module Geneweb__Wiki

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__WiznotesDisplay/.dune-keep b/static/doc/geneweb/Geneweb__WiznotesDisplay/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb__WiznotesDisplay/index.html b/static/doc/geneweb/Geneweb__WiznotesDisplay/index.html new file mode 100644 index 0000000000..8581ba8044 --- /dev/null +++ b/static/doc/geneweb/Geneweb__WiznotesDisplay/index.html @@ -0,0 +1,2 @@ + +Geneweb__WiznotesDisplay (geneweb.Geneweb__WiznotesDisplay)

      Module Geneweb__WiznotesDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb_export/.dune-keep b/static/doc/geneweb/Geneweb_export/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb_export/Json_converter/Make/argument-1-D/index.html b/static/doc/geneweb/Geneweb_export/Json_converter/Make/argument-1-D/index.html new file mode 100644 index 0000000000..277457bcc4 --- /dev/null +++ b/static/doc/geneweb/Geneweb_export/Json_converter/Make/argument-1-D/index.html @@ -0,0 +1,2 @@ + +D (geneweb.Geneweb_export.Json_converter.Make.1-D)

      Parameter Make.1-D

      type t

      Json value

      val str : string -> t

      Convert to JSON string

      val int : int -> t

      Convert to JSON integer

      val obj : (string * t) array -> t

      Convert to JSON object

      val null : t

      Convert to JSON null value

      val array : 't array -> t

      Convert array to JSON list

      val list : 't list -> t

      Convert list to JSON list

      val bool : bool -> t

      Convert to JSON boolean

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb_export/Json_converter/Make/index.html b/static/doc/geneweb/Geneweb_export/Json_converter/Make/index.html new file mode 100644 index 0000000000..ec869f691a --- /dev/null +++ b/static/doc/geneweb/Geneweb_export/Json_converter/Make/index.html @@ -0,0 +1,2 @@ + +Make (geneweb.Geneweb_export.Json_converter.Make)

      Module Json_converter.Make

      Functor building JSON convertion functions of the Geneweb data types.

      Parameters

      Signature

      val conv_dmy : Def.dmy -> D.t

      Convert dmy to JSON

      val conv_dmy2 : Def.dmy2 -> D.t

      Convert dmy2 to JSON

      val conv_cdate : Def.cdate -> D.t

      Convert cdate to JSON

      val conv_pevent_name : string Def.gen_pers_event_name -> D.t

      Convert gen_pers_event_name to JSON

      val conv_event_witness_kind : Def.witness_kind -> D.t

      Convert witness_kind to JSON

      val conv_pevent : (Gwdb_driver.iper, string) Def.gen_pers_event -> D.t

      Convert gen_pers_event to JSON

      val conv_title_name : string Def.gen_title_name -> D.t

      Convert gen_title_name to JSON

      val conv_title : string Def.gen_title -> D.t

      Convert gen_title to JSON

      val conv_relation_kind : Def.relation_kind -> D.t

      Convert relation_kind to JSON

      val conv_fevent_name : string Def.gen_fam_event_name -> D.t

      Convert gen_fam_event_name to JSON

      val conv_fevent : (Gwdb_driver.iper, string) Def.gen_fam_event -> D.t

      Convert gen_fam_event to JSON

      val conv_divorce : Def.divorce -> D.t

      Convert divorce to JSON

      val conv_relation_type : Def.relation_type -> D.t

      Convert relation_type to JSON

      val conv_rparent : (Gwdb_driver.iper, string) Def.gen_relation -> D.t

      Convert gen_relation to JSON

      val conv_death : Def.death -> D.t

      Convert death to JSON

      val conv_person : Gwdb.base -> Gwdb.person -> D.t

      Convert person to JSON

      val conv_family : Gwdb.base -> Gwdb.family -> D.t

      Convert family to JSON

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb_export/Json_converter/index.html b/static/doc/geneweb/Geneweb_export/Json_converter/index.html new file mode 100644 index 0000000000..9db2c807f4 --- /dev/null +++ b/static/doc/geneweb/Geneweb_export/Json_converter/index.html @@ -0,0 +1,2 @@ + +Json_converter (geneweb.Geneweb_export.Json_converter)

      Module Geneweb_export.Json_converter

      module type ConverterDriver = sig ... end

      Json converter driver

      module Make (D : ConverterDriver) : sig ... end

      Functor building JSON convertion functions of the Geneweb data types.

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb_export/Json_converter/module-type-ConverterDriver/index.html b/static/doc/geneweb/Geneweb_export/Json_converter/module-type-ConverterDriver/index.html new file mode 100644 index 0000000000..e34d877146 --- /dev/null +++ b/static/doc/geneweb/Geneweb_export/Json_converter/module-type-ConverterDriver/index.html @@ -0,0 +1,2 @@ + +ConverterDriver (geneweb.Geneweb_export.Json_converter.ConverterDriver)

      Module type Json_converter.ConverterDriver

      Json converter driver

      type t

      Json value

      val str : string -> t

      Convert to JSON string

      val int : int -> t

      Convert to JSON integer

      val obj : (string * t) array -> t

      Convert to JSON object

      val null : t

      Convert to JSON null value

      val array : 't array -> t

      Convert array to JSON list

      val list : 't list -> t

      Convert list to JSON list

      val bool : bool -> t

      Convert to JSON boolean

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb_export/index.html b/static/doc/geneweb/Geneweb_export/index.html new file mode 100644 index 0000000000..9844c8c683 --- /dev/null +++ b/static/doc/geneweb/Geneweb_export/index.html @@ -0,0 +1,2 @@ + +Geneweb_export (geneweb.Geneweb_export)

      Module Geneweb_export

      module Json_converter : sig ... end
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb_export__Json_converter/.dune-keep b/static/doc/geneweb/Geneweb_export__Json_converter/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Geneweb_export__Json_converter/index.html b/static/doc/geneweb/Geneweb_export__Json_converter/index.html new file mode 100644 index 0000000000..fcaba8bab0 --- /dev/null +++ b/static/doc/geneweb/Geneweb_export__Json_converter/index.html @@ -0,0 +1,2 @@ + +Geneweb_export__Json_converter (geneweb.Geneweb_export__Json_converter)

      Module Geneweb_export__Json_converter

      \ No newline at end of file diff --git a/static/doc/geneweb/Gutil/.dune-keep b/static/doc/geneweb/Gutil/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Gutil/index.html b/static/doc/geneweb/Gutil/index.html new file mode 100644 index 0000000000..fe5434b873 --- /dev/null +++ b/static/doc/geneweb/Gutil/index.html @@ -0,0 +1,2 @@ + +Gutil (geneweb.Gutil)

      Module Gutil

      val spouse : Gwdb.iper -> Gwdb.family -> Gwdb.iper

      spouse p f returns spouse of giving person inside the family.

      val person_not_a_key_find_all : Gwdb.base -> string -> Gwdb.iper list

      Returns list of persons having the giving name as one of the misc names.

      val person_ht_find_all : Gwdb.base -> string -> Gwdb.iper list

      Returns list of persons from the giving key. If key has form "firstname.occ surname" then returns list of one corresponding person. Otherwise calls person_not_a_key_find_all

      val person_of_string_key : Gwdb.base -> string -> Gwdb.iper option

      person_of_string_key base key try to find a key inside key string of the form "firstname.occ surname" and returns a corresponding person. If person doesn't exists or key isn't found then returns None

      val find_same_name : Gwdb.base -> Gwdb.person -> Gwdb.person list

      Returns list of persons having the same first name and surname as the specified person

      val designation : Gwdb.base -> Gwdb.person -> string

      Returns person's key that has form "firstname.occ surname"

      val trim_trailing_spaces : string -> string

      Trim at the end of string

      val alphabetic_utf_8 : string -> string -> int

      Compare two UTF-8 encoded strings by alphabetic order

      val alphabetic : string -> string -> int

      Compare two ISO-8859-1 encoded strings by alphabetic order

      val alphabetic_order : string -> string -> int

      Same as alphabetic_utf_8

      val arg_list_of_string : string -> string list

      Parse line and extract separated arguments ("" and '' are used to indlude spaces inside the argument)

      val sort_person_list : Gwdb.base -> Gwdb.person list -> Gwdb.person list

      Sort list of persons by comparison with following order:

      • Compare by birth and death date
      • Compare by surname
      • Compare by first name
      • Compare by occurence number
      • Compare by id
      val sort_uniq_person_list : Gwdb.base -> Gwdb.person list -> Gwdb.person list

      Same as sort_person_list but also remove duplicates

      val father : 'a Def.gen_couple -> 'a

      Same as Adef.father

      val mother : 'a Def.gen_couple -> 'a

      Same as Adef.mother

      val couple : bool -> 'a -> 'a -> 'a Def.gen_couple

      couple multi f m creates a couple from father f and mother m. If multi true uses multiparent functionality

      val parent_array : 'a Def.gen_couple -> 'a array

      Same as Adef.parent_array

      val find_free_occ : Gwdb.base -> string -> string -> int

      Find first free occurence number for the person with specified first name and surname.

      val get_birth_death_date : Gwdb.person -> Def.date option * Def.date option * bool

      get_birth_death p Return (birth, death, approx). If birth/death date can not be found, baptism/burial date is used and approx is set to true (it is false if both birth and death dates are found).

      \ No newline at end of file diff --git a/static/doc/geneweb/Gwb2gedLib/.dune-keep b/static/doc/geneweb/Gwb2gedLib/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Gwb2gedLib/index.html b/static/doc/geneweb/Gwb2gedLib/index.html new file mode 100644 index 0000000000..c330268091 --- /dev/null +++ b/static/doc/geneweb/Gwb2gedLib/index.html @@ -0,0 +1,2 @@ + +Gwb2gedLib (geneweb.Gwb2gedLib)

      Module Gwb2gedLib

      val gwb2ged : bool -> Gwexport.gwexport_opts -> ((Gwdb.iper -> bool) * (Gwdb.ifam -> bool)) -> unit

      gwb2ged with_indexes opts sel Converts a Geneweb database to a GEDCOM file. * `with_indexes` specifies if indexes are printed or not; * `opts` are the export options * `sel` is a pair of selectors returned by the database export

      \ No newline at end of file diff --git a/static/doc/geneweb/Gwd_lib/.dune-keep b/static/doc/geneweb/Gwd_lib/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Gwd_lib/GwdLog/index.html b/static/doc/geneweb/Gwd_lib/GwdLog/index.html new file mode 100644 index 0000000000..29eb5945d0 --- /dev/null +++ b/static/doc/geneweb/Gwd_lib/GwdLog/index.html @@ -0,0 +1,2 @@ + +GwdLog (geneweb.Gwd_lib.GwdLog)

      Module Gwd_lib.GwdLog

      val verbosity : int Stdlib.ref

      Verbosity level: defines the verbosity level that will allow the `syslog` function to print anything.

      val debug : bool Stdlib.ref

      If set to `true`, prints backtrace when printng log.

      val oc : Stdlib.out_channel option Stdlib.ref

      The output channel in which log is written.

      val log : (Stdlib.out_channel -> unit) -> unit

      Prints on `oc`

      type level = [
      | `LOG_EMERG(*

      Print if `!verbosity >= 0`

      *)
      | `LOG_ALERT(*

      Print if `!verbosity >= 1`

      *)
      | `LOG_CRIT(*

      Print if `!verbosity >= 2`

      *)
      | `LOG_ERR(*

      Print if `!verbosity >= 3`

      *)
      | `LOG_WARNING(*

      Print if `!verbosity >= 4`

      *)
      | `LOG_NOTICE(*

      Print if `!verbosity >= 5`

      *)
      | `LOG_INFO(*

      Print if `!verbosity >= 6`

      *)
      | `LOG_DEBUG(*

      Print if `!verbosity >= 7`

      *)
      ]

      The level of log.

      val syslog : level -> string -> unit

      syslog level msg Prints `msg` on `!oc` depending on the verbosity.

      \ No newline at end of file diff --git a/static/doc/geneweb/Gwd_lib/GwdPlugin/index.html b/static/doc/geneweb/Gwd_lib/GwdPlugin/index.html new file mode 100644 index 0000000000..21657428f4 --- /dev/null +++ b/static/doc/geneweb/Gwd_lib/GwdPlugin/index.html @@ -0,0 +1,2 @@ + +GwdPlugin (geneweb.Gwd_lib.GwdPlugin)

      Module Gwd_lib.GwdPlugin

      val assets : string Stdlib.ref
      val ht : (string, string * (Geneweb.Config.config -> Gwdb.base option -> bool)) Stdlib.Hashtbl.t
      val register : ns:string -> (string * (string -> Geneweb.Config.config -> Gwdb.base option -> bool)) list -> unit
      val se : (string * (Geneweb.Config.config -> Gwdb.base option -> unit)) list Stdlib.ref
      val register_se : ns:string -> (string -> Geneweb.Config.config -> Gwdb.base option -> unit) -> unit
      \ No newline at end of file diff --git a/static/doc/geneweb/Gwd_lib/Request/index.html b/static/doc/geneweb/Gwd_lib/Request/index.html new file mode 100644 index 0000000000..d95dd5e983 --- /dev/null +++ b/static/doc/geneweb/Gwd_lib/Request/index.html @@ -0,0 +1,2 @@ + +Request (geneweb.Gwd_lib.Request)

      Module Gwd_lib.Request

      val w_base : none:(Geneweb.Config.config -> 'a) -> (Geneweb.Config.config -> Gwdb.base -> 'a) -> Geneweb.Config.config -> Gwdb.base option -> 'a

      w_lock ~none callback conf base Acquire a write lock on the base and call callback, or fail with none.

      val w_lock : onerror:(Geneweb.Config.config -> Gwdb.base -> 'a) -> (Geneweb.Config.config -> Gwdb.base -> 'a) -> Geneweb.Config.config -> Gwdb.base -> 'a

      w_lock ~onerror callback conf base Acquire a write lock on the base and call the callback, or fail with onerror.

      val w_wizard : (Geneweb.Config.config -> Gwdb.base -> unit) -> Geneweb.Config.config -> Gwdb.base -> unit

      w_wizard callback conf base Run callback conf base if conf has wizard rights or return Forbidden or Unauthorized.

      w_person ~none callback conf base Find a person in environement and call callback, or fail with none.

      \ No newline at end of file diff --git a/static/doc/geneweb/Gwd_lib/index.html b/static/doc/geneweb/Gwd_lib/index.html new file mode 100644 index 0000000000..0eb16379d8 --- /dev/null +++ b/static/doc/geneweb/Gwd_lib/index.html @@ -0,0 +1,2 @@ + +Gwd_lib (geneweb.Gwd_lib)

      Module Gwd_lib

      module GwdLog : sig ... end
      module GwdPlugin : sig ... end
      module Request : sig ... end
      \ No newline at end of file diff --git a/static/doc/geneweb/Gwd_lib__GwdLog/.dune-keep b/static/doc/geneweb/Gwd_lib__GwdLog/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Gwd_lib__GwdLog/index.html b/static/doc/geneweb/Gwd_lib__GwdLog/index.html new file mode 100644 index 0000000000..6b89b71998 --- /dev/null +++ b/static/doc/geneweb/Gwd_lib__GwdLog/index.html @@ -0,0 +1,2 @@ + +Gwd_lib__GwdLog (geneweb.Gwd_lib__GwdLog)

      Module Gwd_lib__GwdLog

      \ No newline at end of file diff --git a/static/doc/geneweb/Gwd_lib__GwdPlugin/.dune-keep b/static/doc/geneweb/Gwd_lib__GwdPlugin/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Gwd_lib__GwdPlugin/index.html b/static/doc/geneweb/Gwd_lib__GwdPlugin/index.html new file mode 100644 index 0000000000..a3078b6ed2 --- /dev/null +++ b/static/doc/geneweb/Gwd_lib__GwdPlugin/index.html @@ -0,0 +1,2 @@ + +Gwd_lib__GwdPlugin (geneweb.Gwd_lib__GwdPlugin)

      Module Gwd_lib__GwdPlugin

      \ No newline at end of file diff --git a/static/doc/geneweb/Gwd_lib__Request/.dune-keep b/static/doc/geneweb/Gwd_lib__Request/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Gwd_lib__Request/index.html b/static/doc/geneweb/Gwd_lib__Request/index.html new file mode 100644 index 0000000000..27bba479df --- /dev/null +++ b/static/doc/geneweb/Gwd_lib__Request/index.html @@ -0,0 +1,2 @@ + +Gwd_lib__Request (geneweb.Gwd_lib__Request)

      Module Gwd_lib__Request

      \ No newline at end of file diff --git a/static/doc/geneweb/Gwdb/.dune-keep b/static/doc/geneweb/Gwdb/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Gwdb/index.html b/static/doc/geneweb/Gwdb/index.html new file mode 100644 index 0000000000..d38920fc33 --- /dev/null +++ b/static/doc/geneweb/Gwdb/index.html @@ -0,0 +1,2 @@ + +Gwdb (geneweb.Gwdb)

      Module Gwdb

      include module type of struct include Gwdb_driver end
      type istr = Gwdb_driver.istr

      String id

      type ifam = Gwdb_driver.ifam

      Family id

      type iper = Gwdb_driver.iper

      Person id

      val string_of_iper : iper -> string

      Convert iper to string

      val string_of_ifam : ifam -> string

      Convert ifam to string

      val string_of_istr : istr -> string

      Convert istr to string

      val iper_of_string : string -> iper

      Convert iper from string

      val ifam_of_string : string -> ifam

      Convert ifam from string

      val istr_of_string : string -> istr

      Convert istr from string

      type person = Gwdb_driver.person

      Person data structure

      type family = Gwdb_driver.family

      Family data structure

      type relation = (iperistr) Def.gen_relation

      Database implementation for Def.gen_relation

      type title = istr Def.gen_title

      Database implementation for Def.gen_title

      type pers_event = (iperistr) Def.gen_pers_event

      Database implementation for Def.pers_event

      type fam_event = (iperistr) Def.gen_fam_event

      Database implementation for Def.fam_event

      type string_person_index = Gwdb_driver.string_person_index

      Data structure for optimised search throughout index by name (surname or first name).

      type base = Gwdb_driver.base

      Database represntation in the memory that regroups data and basic requests over this data.

      val open_base : string -> base

      Open database situated in the specified directory.

      val close_base : base -> unit

      Close database memory representation.

      val dummy_iper : iper

      Dummy person id

      val dummy_ifam : ifam

      Dummy family id

      val eq_istr : istr -> istr -> bool

      Says if strings with the giving ids are equal

      val is_empty_string : istr -> bool

      Says if string with the giving id is empty ("")

      val is_quest_string : istr -> bool

      Says if string with the giving id is a question mark ("?")

      val empty_string : istr

      Id of the empty string ("")

      val quest_string : istr

      Id of the question mark ("?")

      val empty_person : base -> iper -> person

      Returns unitialised person with the giving id.

      val empty_family : base -> ifam -> family

      Returns unitialised family with the giving id.

      val iper_exists : base -> iper -> bool

      Tells if person with giving id exists in the base.

      val ifam_exists : base -> ifam -> bool

      Tells if family with giving id exists in the base.

      Getters

      Getters are used to extract information about person and family. If corresponding information part isn't present, driver load it from the disk and cache it so further gets will return result immediately.

      val get_access : person -> Def.access

      Get rights that defines access to person's data

      val get_aliases : person -> istr list

      Get person's aliases ids

      val get_baptism : person -> Def.cdate

      Get person's baptism date

      val get_baptism_note : person -> istr

      Get person's baptism note id

      val get_baptism_place : person -> istr

      Get person's baptism place id

      val get_baptism_src : person -> istr

      Get person's baptism source id

      val get_birth : person -> Def.cdate

      Get person's birth date

      val get_birth_note : person -> istr

      Get person's birth note id

      val get_birth_place : person -> istr

      Get person's birth place id

      val get_birth_src : person -> istr

      Get person's birth source id

      val get_burial : person -> Def.burial

      Get information about person's burial

      val get_burial_note : person -> istr

      Get person's burial note id

      val get_burial_place : person -> istr

      Get person's burial place id

      val get_burial_src : person -> istr

      Get person's burial source id

      val get_children : family -> iper array

      Get array of family's children ids

      val get_comment : family -> istr

      Get family's comment id

      val get_consang : person -> Adef.fix

      Get person's consanguinity degree with his ascendants

      val get_death : person -> Def.death

      Get person's death status

      val get_death_note : person -> istr

      Get person's death note id

      val get_death_place : person -> istr

      Get person's death place id

      val get_death_src : person -> istr

      Get person's death source id

      val get_divorce : family -> Def.divorce

      Get family's divorce status

      val get_family : person -> ifam array

      Get array of family's ids to which a person belongs as parent (person's union)

      val get_father : family -> iper

      Get family's father id (from the family's couple)

      val get_fevents : family -> fam_event list

      Get family's event list

      val get_first_name : person -> istr

      Get person's first name id

      val get_first_names_aliases : person -> istr list

      Get list of person's first name aliases ids

      val get_fsources : family -> istr

      Get family's sources id

      val get_ifam : family -> ifam

      Get family's id

      val get_image : person -> istr

      Get id of path to person's image

      val get_iper : person -> iper

      Get person's id

      val get_marriage : family -> Def.cdate

      Get family's marriage date

      val get_marriage_note : family -> istr

      Get family's marriage note id

      val get_marriage_place : family -> istr

      Get family's marriage place id

      val get_marriage_src : family -> istr

      Get family's marriage source id

      val get_mother : family -> iper

      Get family's mother id (from the family's couple)

      val get_notes : person -> istr

      Get person's notes id

      val get_occ : person -> int

      Get person's occurence number

      val get_occupation : person -> istr

      Get person's occupation id

      val get_origin_file : family -> istr

      Get family's origin file (.gw filename where family is defined) id

      val get_parent_array : family -> iper array

      Get family's parents ids (father and mother from family's couple)

      val get_parents : person -> ifam option

      Get person's family id to which his parents belong (as family's couple)

      val get_pevents : person -> pers_event list

      Get person's event list

      val get_psources : person -> istr

      Get person's sources id

      val get_public_name : person -> istr

      Get person's public name id

      val get_qualifiers : person -> istr list

      Get list of person's qualifiers ids

      Get person's related persons ids

      val get_relation : family -> Def.relation_kind

      Get relation kind between couple in the family

      val get_rparents : person -> relation list

      Get person's relations with not native parents

      val get_sex : person -> Def.sex

      Get person's sex

      val get_surname : person -> istr

      Get person's surname id

      val get_surnames_aliases : person -> istr list

      Get person's surname aliases ids

      val get_titles : person -> title list

      Get list of person's nobility titles

      val get_witnesses : family -> iper array

      Get array of family's witnesses ids

      val gen_couple_of_family : family -> iper Def.gen_couple

      Extract gen_couple from family.

      val gen_descend_of_family : family -> iper Def.gen_descend

      Extract gen_descend from family.

      val gen_family_of_family : family -> (iperifamistr) Def.gen_family

      Extract gen_family from family.

      val gen_person_of_person : person -> (iperiperistr) Def.gen_person

      Extract gen_person from person.

      val gen_ascend_of_person : person -> ifam Def.gen_ascend

      Extract gen_ascend from person.

      val gen_union_of_person : person -> ifam Def.gen_union

      Extract gen_union from person.

      val family_of_gen_family : base -> ((iperifamistr) Def.gen_family * iper Def.gen_couple * iper Def.gen_descend) -> family

      Create family from associated values.

      val person_of_gen_person : base -> ((iperiperistr) Def.gen_person * ifam Def.gen_ascend * ifam Def.gen_union) -> person

      Create person from associated values.

      val poi : base -> iper -> person

      Create uninitialised person with giving id

      val foi : base -> ifam -> family

      Create uninitialised family with giving id

      val sou : base -> istr -> string

      Returns string that has giving id from the base

      val no_person : iper -> (iperiperistr) Def.gen_person

      Returns unitialised gen_person with giving id

      val no_ascend : ifam Def.gen_ascend

      Returns unitialised gen_ascend

      val no_union : ifam Def.gen_union

      Returns unitialised gen_union

      val no_family : ifam -> (iperifamistr) Def.gen_family

      Returns unitialised gen_family with giving id

      val no_descend : iper Def.gen_descend

      Returns unitialised gen_descend

      val no_couple : iper Def.gen_couple

      Returns unitialised gen_couple

      val nb_of_persons : base -> int

      Returns number of persons inside the database

      val nb_of_real_persons : base -> int

      Returns number of defined persons (without bogus definition "? ?") inside the database

      val nb_of_families : base -> int

      Returns number of families inside the database

      val bname : base -> string

      Returns database name

      val patch_person : base -> iper -> (iperiperistr) Def.gen_person -> unit

      Modify/add person with the giving id in the base. New names are added to the patched name index for the cosidered person and for evey member of family to which he belongs. Modification stay blocked until call of commit_patches.

      val patch_ascend : base -> iper -> ifam Def.gen_ascend -> unit

      Modify/add ascendants of a person with a giving id. Modification stay blocked until call of commit_patches.

      val patch_union : base -> iper -> ifam Def.gen_union -> unit

      Modify/add union of a person with a giving id. Modification stay blocked until call of commit_patches.

      val patch_family : base -> ifam -> (iperifamistr) Def.gen_family -> unit

      Modify/add family with a giving id. Modification stay blocked until call of commit_patches.

      val patch_descend : base -> ifam -> iper Def.gen_descend -> unit

      Modify/add descendants of a family with a giving id. Modification stay blocked until call of commit_patches.

      val patch_couple : base -> ifam -> iper Def.gen_couple -> unit

      Modify/add couple of a family with a giving id. Modification stay blocked until call of commit_patches.

      val insert_string : base -> string -> istr

      Modify/add string with a giving id. If string already exists return its id. Modification stay blocked until call of commit_patches.

      val commit_patches : base -> unit

      Commit blocked modifications (patches) and update database files in order to apply modifications on the disk.

      val commit_notes : base -> string -> string -> unit

      commit_notes fname s Update content of the notes/extended page file fname if exists.

      val new_iper : base -> iper

      Retruns new unused person's id

      val new_ifam : base -> ifam

      Retruns new unused family's id

      val insert_ascend : base -> iper -> ifam Def.gen_ascend -> unit

      Same as patch_ascend

      val insert_union : base -> iper -> ifam Def.gen_union -> unit

      Same as patch_union

      val insert_descend : base -> ifam -> iper Def.gen_descend -> unit

      Same as patch_couple

      val insert_couple : base -> ifam -> iper Def.gen_couple -> unit

      Same as patch_descend

      val delete_ascend : base -> iper -> unit

      Clear person's ascendants data structure

      val delete_union : base -> iper -> unit

      Clear person's union data structure

      val delete_descend : base -> ifam -> unit

      Clear family's descendants data structure

      val delete_couple : base -> ifam -> unit

      Clear family's couple data structure

      val person_of_key : base -> string -> string -> int -> iper option

      person_of_key first_name surname occ returns person from his key information (first name, surname and occurence number)

      val persons_of_name : base -> string -> iper list

      Return list of person ids that have giving name (could be one of the mix).

      val persons_of_first_name : base -> string_person_index

      Returns data structure that allows to make optimised search throughout index by first name

      val persons_of_surname : base -> string_person_index

      Returns data structure that allows to make optimised search throughout index by surname

      val spi_first : string_person_index -> string -> istr

      Returns first first/surname id starting with that string

      val spi_next : string_person_index -> istr -> istr

      Retruns next first/surname id that follows giving name's id by Gutil.alphabetical order

      val spi_find : string_person_index -> istr -> iper list

      Retruns all persons id having that first/surname.

      val base_visible_get : base -> (person -> bool) -> iper -> bool

      base_visible_get base fct ip get visibility of person ip (true for not visible (restrited)) from the base. If file restrict is present then read it to get visibility information. If person's visibility isn't known, then set it with fct. Used when mode `use_restrict` is ativated

      val base_visible_write : base -> unit

      Write updated visibility information to the restricted file.

      val base_particles : base -> Re.re

      Return regular expression that matches all defined in the base particles.

      val base_strings_of_first_name : base -> string -> istr list

      base_strings_of_first_name base x Return the list of first names (as istr) being equal or to x using Name.crush_lower comparison. x could be also a substring of the matched first name.

      val base_strings_of_surname : base -> string -> istr list

      base_strings_of_surname base x Return the list of surnames (as istr) being equal to x using Name.crush_lower comparison. x could be also a substring of the matched surname.

      val load_ascends_array : base -> unit

      Load array of ascendants in the memory and cache it so it could be accessed instantly by other functions unless clear_ascends_array is called.

      val load_unions_array : base -> unit

      Load array of unions in the memory and cache it so it could be accessed instantly by other functions unless clear_unions_array is called.

      val load_couples_array : base -> unit

      Load array of couples in the memory and cache it so it could be accessed instantly by other functions unless clear_couples_array is called.

      val load_descends_array : base -> unit

      Load array of descendants in the memory and cache it so it could be accessed instantly by other functions unless clear_descends_array is called.

      val load_strings_array : base -> unit

      Load array of strings in the memory and cache it so it could be accessed instantly by other functions unless clear_strings_array is called.

      val load_persons_array : base -> unit

      Load array of persons in the memory and cache it so it could be accessed instantly by other functions unless clear_persons_array is called.

      val load_families_array : base -> unit

      Load array of families in the memory and cache it so it could be accessed instantly by other functions unless clear_families_array is called.

      val clear_ascends_array : base -> unit

      Remove array of ascendants from the memory

      val clear_unions_array : base -> unit

      Remove array of unions from the memory

      val clear_couples_array : base -> unit

      Remove array of couples from the memory

      val clear_descends_array : base -> unit

      Remove array of descendants from the memory

      val clear_strings_array : base -> unit

      Remove array of strings from the memory

      val clear_persons_array : base -> unit

      Remove array of persons from the memory

      val clear_families_array : base -> unit

      Remove array of families from the memory

      val base_notes_read : base -> string -> string

      base_notes_read base fname read and return content of fname note (either database note either extended page).

      val base_notes_read_first_line : base -> string -> string

      base_notes_read base fname read and return first line of fname note

      val base_notes_are_empty : base -> string -> bool

      Says if note has empty content

      val base_notes_origin_file : base -> string

      Retruns origin file (.gw file) of the note

      val base_notes_dir : base -> string

      Directory where extended pages are stored

      val base_wiznotes_dir : base -> string

      Directory where wizard notes are stored

      val date_of_last_change : base -> float

      Returns last modification time of the database on disk

      module Collection = Gwdb_driver.Collection

      Collections of elemetns

      module Marker = Gwdb_driver.Marker

      Markers for elements inside Collection.t

      Useful collections

      val ipers : base -> iper Collection.t

      Collection of person's ids

      val persons : base -> person Collection.t

      Collection of persons

      val ifams : ?select:(ifam -> bool) -> base -> ifam Collection.t

      Collection of family's ids

      val families : ?select:(family -> bool) -> base -> family Collection.t

      Collection of families

      val dummy_collection : 'a -> 'a Collection.t

      dummy_collection x create a dummy collection with no element. x is only used for typing. Useful for placeholders or for typing purpose.

      Useful markers

      val iper_marker : iper Collection.t -> 'a -> (iper'a) Marker.t

      iper_marker c v create marker over collection of person's ids and initialise it for every element with v

      val ifam_marker : ifam Collection.t -> 'a -> (ifam'a) Marker.t

      ifam_marker c v create marker over collection of family's ids and initialise it for every element with v

      val dummy_marker : 'a -> 'b -> ('a'b) Marker.t

      dummy_marker k v create a dummy collection with no element. k and v are only used for typing. Useful for placeholders or for typing purpose.

      Database creation

      val make : string -> string list -> (((int, int, int) Def.gen_person array * int Def.gen_ascend array * int Def.gen_union array) * ((int, int, int) Def.gen_family array * int Def.gen_couple array * int Def.gen_descend array) * string array * Def.base_notes) -> base

      make bname particles arrays create a base with bname name and arrays as content.

      val read_nldb : base -> (iperifam) Def.NLDB.t

      TODOOCP : doc

      val write_nldb : base -> (iperifam) Def.NLDB.t -> unit
      val sync : ?scratch:bool -> base -> unit

      sync scratch base Ensure that everything is synced on disk.

      Depending on the backend, it may perform various operation such as indexes rebuilding, and it might be a lengthy operation.

      Use scratch (default false) to sync and rebuild the whole database. Otherwise, only changes that occured since the last sync call are treated.

      insert_person base p a u Add a new person with its union and ascendants in the base. Allocate and returns the fresh new id for this person. p SHOULD be defined using dummy_iper.

      insert_family base f c d Add a new family with its couple and descendants the in the base. Allocate and returns the fresh new id for this family. f SHOULD be defined using dummy_ifam.

      DELETE

      val is_empty_p : ?ifam:ifam -> base -> iper -> bool
      val rm_union : base -> ifam -> iper -> unit
      val delete_person : base -> iper -> unit

      delete_person base iper and delete_family base ifam recursively delete data trying to do clever things:

      • if data to be deleted is linked and useful, it is replaced by empty data (and is actually deleted otherwise)
      • if empty data is linked to deleted data, the former is deleted as well
      val delete_family : base -> ifam -> unit
      \ No newline at end of file diff --git a/static/doc/geneweb/Gwdb_driver/.dune-keep b/static/doc/geneweb/Gwdb_driver/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Gwdb_driver/Collection/index.html b/static/doc/geneweb/Gwdb_driver/Collection/index.html new file mode 100644 index 0000000000..eb6a9aaae0 --- /dev/null +++ b/static/doc/geneweb/Gwdb_driver/Collection/index.html @@ -0,0 +1,2 @@ + +Collection (geneweb.Gwdb_driver.Collection)

      Module Gwdb_driver.Collection

      Collections of elemetns

      type 'a t

      Collections are sets of elements you want to traverse.

      val length : 'a t -> int

      Return the number of elements of a colletion

      val map : ('a -> 'b) -> 'a t -> 'b t

      map fn c Return a collection corresponding to c where fn would have been applied to each of its elements.

      val iter : ('a -> unit) -> 'a t -> unit

      iter fn c Apply fn would have been applied to each elements of c.

      val iteri : (int -> 'a -> unit) -> 'a t -> unit

      iter fn c Apply fn i would have been applied to each elements of c where i is the index (starting with 0) of the element.

      val fold : ?from:int -> ?until:int -> ('a -> 'b -> 'a) -> 'a -> 'b t -> 'a

      fold fn acc c Combine each element of c into a single value using fn. fn first argument is the result computed so far as we traverse the collection, and second element is the current element being combined. acc is the starting combined value. Start at from-nth and finish with until-nth element (included).

      val fold_until : ('a -> bool) -> ('a -> 'b -> 'a) -> 'a -> 'b t -> 'a

      fold_until continue fn acc c Same as fold fn acc c, but computation stops as soon as continue is not satisfied by combined value anymore.

      val iterator : 'a t -> unit -> 'a option

      iterator c Return a function returning Some next_element when it is called, or None if you reached the end of the collection.

      \ No newline at end of file diff --git a/static/doc/geneweb/Gwdb_driver/Marker/index.html b/static/doc/geneweb/Gwdb_driver/Marker/index.html new file mode 100644 index 0000000000..8acf507fbf --- /dev/null +++ b/static/doc/geneweb/Gwdb_driver/Marker/index.html @@ -0,0 +1,2 @@ + +Marker (geneweb.Gwdb_driver.Marker)

      Module Gwdb_driver.Marker

      Markers for elements inside Collection.t

      type ('k, 'v) t

      Markers are way to annotate (add extra information to) elements of a Collection.t.

      val get : ('k'v) t -> 'k -> 'v

      get marker key Return the annotation associated to key.

      val set : ('k'v) t -> 'k -> 'v -> unit

      set marker key value Set value as annotation associated to key.

      \ No newline at end of file diff --git a/static/doc/geneweb/Gwdb_driver/index.html b/static/doc/geneweb/Gwdb_driver/index.html new file mode 100644 index 0000000000..35018d8e71 --- /dev/null +++ b/static/doc/geneweb/Gwdb_driver/index.html @@ -0,0 +1,2 @@ + +Gwdb_driver (geneweb.Gwdb_driver)

      Module Gwdb_driver

      type istr

      String id

      type ifam

      Family id

      type iper

      Person id

      val string_of_iper : iper -> string

      Convert iper to string

      val string_of_ifam : ifam -> string

      Convert ifam to string

      val string_of_istr : istr -> string

      Convert istr to string

      val iper_of_string : string -> iper

      Convert iper from string

      val ifam_of_string : string -> ifam

      Convert ifam from string

      val istr_of_string : string -> istr

      Convert istr from string

      type person

      Person data structure

      type family

      Family data structure

      type relation = (iperistr) Def.gen_relation

      Database implementation for Def.gen_relation

      type title = istr Def.gen_title

      Database implementation for Def.gen_title

      type pers_event = (iperistr) Def.gen_pers_event

      Database implementation for Def.pers_event

      type fam_event = (iperistr) Def.gen_fam_event

      Database implementation for Def.fam_event

      type string_person_index

      Data structure for optimised search throughout index by name (surname or first name).

      type base

      Database represntation in the memory that regroups data and basic requests over this data.

      val open_base : string -> base

      Open database situated in the specified directory.

      val close_base : base -> unit

      Close database memory representation.

      val dummy_iper : iper

      Dummy person id

      val dummy_ifam : ifam

      Dummy family id

      val eq_istr : istr -> istr -> bool

      Says if strings with the giving ids are equal

      val is_empty_string : istr -> bool

      Says if string with the giving id is empty ("")

      val is_quest_string : istr -> bool

      Says if string with the giving id is a question mark ("?")

      val empty_string : istr

      Id of the empty string ("")

      val quest_string : istr

      Id of the question mark ("?")

      val empty_person : base -> iper -> person

      Returns unitialised person with the giving id.

      val empty_family : base -> ifam -> family

      Returns unitialised family with the giving id.

      val iper_exists : base -> iper -> bool

      Tells if person with giving id exists in the base.

      val ifam_exists : base -> ifam -> bool

      Tells if family with giving id exists in the base.

      Getters

      Getters are used to extract information about person and family. If corresponding information part isn't present, driver load it from the disk and cache it so further gets will return result immediately.

      val get_access : person -> Def.access

      Get rights that defines access to person's data

      val get_aliases : person -> istr list

      Get person's aliases ids

      val get_baptism : person -> Def.cdate

      Get person's baptism date

      val get_baptism_note : person -> istr

      Get person's baptism note id

      val get_baptism_place : person -> istr

      Get person's baptism place id

      val get_baptism_src : person -> istr

      Get person's baptism source id

      val get_birth : person -> Def.cdate

      Get person's birth date

      val get_birth_note : person -> istr

      Get person's birth note id

      val get_birth_place : person -> istr

      Get person's birth place id

      val get_birth_src : person -> istr

      Get person's birth source id

      val get_burial : person -> Def.burial

      Get information about person's burial

      val get_burial_note : person -> istr

      Get person's burial note id

      val get_burial_place : person -> istr

      Get person's burial place id

      val get_burial_src : person -> istr

      Get person's burial source id

      val get_children : family -> iper array

      Get array of family's children ids

      val get_comment : family -> istr

      Get family's comment id

      val get_consang : person -> Adef.fix

      Get person's consanguinity degree with his ascendants

      val get_death : person -> Def.death

      Get person's death status

      val get_death_note : person -> istr

      Get person's death note id

      val get_death_place : person -> istr

      Get person's death place id

      val get_death_src : person -> istr

      Get person's death source id

      val get_divorce : family -> Def.divorce

      Get family's divorce status

      val get_family : person -> ifam array

      Get array of family's ids to which a person belongs as parent (person's union)

      val get_father : family -> iper

      Get family's father id (from the family's couple)

      val get_fevents : family -> fam_event list

      Get family's event list

      val get_first_name : person -> istr

      Get person's first name id

      val get_first_names_aliases : person -> istr list

      Get list of person's first name aliases ids

      val get_fsources : family -> istr

      Get family's sources id

      val get_ifam : family -> ifam

      Get family's id

      val get_image : person -> istr

      Get id of path to person's image

      val get_iper : person -> iper

      Get person's id

      val get_marriage : family -> Def.cdate

      Get family's marriage date

      val get_marriage_note : family -> istr

      Get family's marriage note id

      val get_marriage_place : family -> istr

      Get family's marriage place id

      val get_marriage_src : family -> istr

      Get family's marriage source id

      val get_mother : family -> iper

      Get family's mother id (from the family's couple)

      val get_notes : person -> istr

      Get person's notes id

      val get_occ : person -> int

      Get person's occurence number

      val get_occupation : person -> istr

      Get person's occupation id

      val get_origin_file : family -> istr

      Get family's origin file (.gw filename where family is defined) id

      val get_parent_array : family -> iper array

      Get family's parents ids (father and mother from family's couple)

      val get_parents : person -> ifam option

      Get person's family id to which his parents belong (as family's couple)

      val get_pevents : person -> pers_event list

      Get person's event list

      val get_psources : person -> istr

      Get person's sources id

      val get_public_name : person -> istr

      Get person's public name id

      val get_qualifiers : person -> istr list

      Get list of person's qualifiers ids

      Get person's related persons ids

      val get_relation : family -> Def.relation_kind

      Get relation kind between couple in the family

      val get_rparents : person -> relation list

      Get person's relations with not native parents

      val get_sex : person -> Def.sex

      Get person's sex

      val get_surname : person -> istr

      Get person's surname id

      val get_surnames_aliases : person -> istr list

      Get person's surname aliases ids

      val get_titles : person -> title list

      Get list of person's nobility titles

      val get_witnesses : family -> iper array

      Get array of family's witnesses ids

      val gen_couple_of_family : family -> iper Def.gen_couple

      Extract gen_couple from family.

      val gen_descend_of_family : family -> iper Def.gen_descend

      Extract gen_descend from family.

      val gen_family_of_family : family -> (iperifamistr) Def.gen_family

      Extract gen_family from family.

      val gen_person_of_person : person -> (iperiperistr) Def.gen_person

      Extract gen_person from person.

      val gen_ascend_of_person : person -> ifam Def.gen_ascend

      Extract gen_ascend from person.

      val gen_union_of_person : person -> ifam Def.gen_union

      Extract gen_union from person.

      val family_of_gen_family : base -> ((iperifamistr) Def.gen_family * iper Def.gen_couple * iper Def.gen_descend) -> family

      Create family from associated values.

      val person_of_gen_person : base -> ((iperiperistr) Def.gen_person * ifam Def.gen_ascend * ifam Def.gen_union) -> person

      Create person from associated values.

      val poi : base -> iper -> person

      Create uninitialised person with giving id

      val foi : base -> ifam -> family

      Create uninitialised family with giving id

      val sou : base -> istr -> string

      Returns string that has giving id from the base

      val no_person : iper -> (iperiperistr) Def.gen_person

      Returns unitialised gen_person with giving id

      val no_ascend : ifam Def.gen_ascend

      Returns unitialised gen_ascend

      val no_union : ifam Def.gen_union

      Returns unitialised gen_union

      val no_family : ifam -> (iperifamistr) Def.gen_family

      Returns unitialised gen_family with giving id

      val no_descend : iper Def.gen_descend

      Returns unitialised gen_descend

      val no_couple : iper Def.gen_couple

      Returns unitialised gen_couple

      val nb_of_persons : base -> int

      Returns number of persons inside the database

      val nb_of_real_persons : base -> int

      Returns number of defined persons (without bogus definition "? ?") inside the database

      val nb_of_families : base -> int

      Returns number of families inside the database

      val bname : base -> string

      Returns database name

      val patch_person : base -> iper -> (iperiperistr) Def.gen_person -> unit

      Modify/add person with the giving id in the base. New names are added to the patched name index for the cosidered person and for evey member of family to which he belongs. Modification stay blocked until call of commit_patches.

      val patch_ascend : base -> iper -> ifam Def.gen_ascend -> unit

      Modify/add ascendants of a person with a giving id. Modification stay blocked until call of commit_patches.

      val patch_union : base -> iper -> ifam Def.gen_union -> unit

      Modify/add union of a person with a giving id. Modification stay blocked until call of commit_patches.

      val patch_family : base -> ifam -> (iperifamistr) Def.gen_family -> unit

      Modify/add family with a giving id. Modification stay blocked until call of commit_patches.

      val patch_descend : base -> ifam -> iper Def.gen_descend -> unit

      Modify/add descendants of a family with a giving id. Modification stay blocked until call of commit_patches.

      val patch_couple : base -> ifam -> iper Def.gen_couple -> unit

      Modify/add couple of a family with a giving id. Modification stay blocked until call of commit_patches.

      val insert_string : base -> string -> istr

      Modify/add string with a giving id. If string already exists return its id. Modification stay blocked until call of commit_patches.

      val commit_patches : base -> unit

      Commit blocked modifications (patches) and update database files in order to apply modifications on the disk.

      val commit_notes : base -> string -> string -> unit

      commit_notes fname s Update content of the notes/extended page file fname if exists.

      val new_iper : base -> iper

      Retruns new unused person's id

      val new_ifam : base -> ifam

      Retruns new unused family's id

      val insert_person : base -> iper -> (iperiperistr) Def.gen_person -> unit

      Same as patch_person

      val insert_ascend : base -> iper -> ifam Def.gen_ascend -> unit

      Same as patch_ascend

      val insert_union : base -> iper -> ifam Def.gen_union -> unit

      Same as patch_union

      val insert_family : base -> ifam -> (iperifamistr) Def.gen_family -> unit

      Same as patch_family

      val insert_descend : base -> ifam -> iper Def.gen_descend -> unit

      Same as patch_couple

      val insert_couple : base -> ifam -> iper Def.gen_couple -> unit

      Same as patch_descend

      val delete_person : base -> iper -> unit

      Remplace person with the giving id by bogus definition and clear person's data structure.

      val delete_ascend : base -> iper -> unit

      Clear person's ascendants data structure

      val delete_union : base -> iper -> unit

      Clear person's union data structure

      val delete_family : base -> ifam -> unit

      Remplace family with the giving id by dummy family and clear family's data structure.

      val delete_descend : base -> ifam -> unit

      Clear family's descendants data structure

      val delete_couple : base -> ifam -> unit

      Clear family's couple data structure

      val person_of_key : base -> string -> string -> int -> iper option

      person_of_key first_name surname occ returns person from his key information (first name, surname and occurence number)

      val persons_of_name : base -> string -> iper list

      Return list of person ids that have giving name (could be one of the mix).

      val persons_of_first_name : base -> string_person_index

      Returns data structure that allows to make optimised search throughout index by first name

      val persons_of_surname : base -> string_person_index

      Returns data structure that allows to make optimised search throughout index by surname

      val spi_first : string_person_index -> string -> istr

      Returns first first/surname id starting with that string

      val spi_next : string_person_index -> istr -> istr

      Retruns next first/surname id that follows giving name's id by Gutil.alphabetical order

      val spi_find : string_person_index -> istr -> iper list

      Retruns all persons id having that first/surname.

      val base_visible_get : base -> (person -> bool) -> iper -> bool

      base_visible_get base fct ip get visibility of person ip (true for not visible (restrited)) from the base. If file restrict is present then read it to get visibility information. If person's visibility isn't known, then set it with fct. Used when mode `use_restrict` is ativated

      val base_visible_write : base -> unit

      Write updated visibility information to the restricted file.

      val base_particles : base -> Re.re

      Return regular expression that matches all defined in the base particles.

      val base_strings_of_first_name : base -> string -> istr list

      base_strings_of_first_name base x Return the list of first names (as istr) being equal or to x using Name.crush_lower comparison. x could be also a substring of the matched first name.

      val base_strings_of_surname : base -> string -> istr list

      base_strings_of_surname base x Return the list of surnames (as istr) being equal to x using Name.crush_lower comparison. x could be also a substring of the matched surname.

      val load_ascends_array : base -> unit

      Load array of ascendants in the memory and cache it so it could be accessed instantly by other functions unless clear_ascends_array is called.

      val load_unions_array : base -> unit

      Load array of unions in the memory and cache it so it could be accessed instantly by other functions unless clear_unions_array is called.

      val load_couples_array : base -> unit

      Load array of couples in the memory and cache it so it could be accessed instantly by other functions unless clear_couples_array is called.

      val load_descends_array : base -> unit

      Load array of descendants in the memory and cache it so it could be accessed instantly by other functions unless clear_descends_array is called.

      val load_strings_array : base -> unit

      Load array of strings in the memory and cache it so it could be accessed instantly by other functions unless clear_strings_array is called.

      val load_persons_array : base -> unit

      Load array of persons in the memory and cache it so it could be accessed instantly by other functions unless clear_persons_array is called.

      val load_families_array : base -> unit

      Load array of families in the memory and cache it so it could be accessed instantly by other functions unless clear_families_array is called.

      val clear_ascends_array : base -> unit

      Remove array of ascendants from the memory

      val clear_unions_array : base -> unit

      Remove array of unions from the memory

      val clear_couples_array : base -> unit

      Remove array of couples from the memory

      val clear_descends_array : base -> unit

      Remove array of descendants from the memory

      val clear_strings_array : base -> unit

      Remove array of strings from the memory

      val clear_persons_array : base -> unit

      Remove array of persons from the memory

      val clear_families_array : base -> unit

      Remove array of families from the memory

      val base_notes_read : base -> string -> string

      base_notes_read base fname read and return content of fname note (either database note either extended page).

      val base_notes_read_first_line : base -> string -> string

      base_notes_read base fname read and return first line of fname note

      val base_notes_are_empty : base -> string -> bool

      Says if note has empty content

      val base_notes_origin_file : base -> string

      Retruns origin file (.gw file) of the note

      val base_notes_dir : base -> string

      Directory where extended pages are stored

      val base_wiznotes_dir : base -> string

      Directory where wizard notes are stored

      val date_of_last_change : base -> float

      Returns last modification time of the database on disk

      module Collection : sig ... end

      Collections of elemetns

      module Marker : sig ... end

      Markers for elements inside Collection.t

      Useful collections

      val ipers : base -> iper Collection.t

      Collection of person's ids

      val persons : base -> person Collection.t

      Collection of persons

      val ifams : ?select:(ifam -> bool) -> base -> ifam Collection.t

      Collection of family's ids

      val families : ?select:(family -> bool) -> base -> family Collection.t

      Collection of families

      val dummy_collection : 'a -> 'a Collection.t

      dummy_collection x create a dummy collection with no element. x is only used for typing. Useful for placeholders or for typing purpose.

      Useful markers

      val iper_marker : iper Collection.t -> 'a -> (iper'a) Marker.t

      iper_marker c v create marker over collection of person's ids and initialise it for every element with v

      val ifam_marker : ifam Collection.t -> 'a -> (ifam'a) Marker.t

      ifam_marker c v create marker over collection of family's ids and initialise it for every element with v

      val dummy_marker : 'a -> 'b -> ('a'b) Marker.t

      dummy_marker k v create a dummy collection with no element. k and v are only used for typing. Useful for placeholders or for typing purpose.

      Database creation

      val make : string -> string list -> (((int, int, int) Def.gen_person array * int Def.gen_ascend array * int Def.gen_union array) * ((int, int, int) Def.gen_family array * int Def.gen_couple array * int Def.gen_descend array) * string array * Def.base_notes) -> base

      make bname particles arrays create a base with bname name and arrays as content.

      val read_nldb : base -> (iperifam) Def.NLDB.t

      TODOOCP : doc

      val write_nldb : base -> (iperifam) Def.NLDB.t -> unit
      val sync : ?scratch:bool -> base -> unit

      sync scratch base Ensure that everything is synced on disk.

      Depending on the backend, it may perform various operation such as indexes rebuilding, and it might be a lengthy operation.

      Use scratch (default false) to sync and rebuild the whole database. Otherwise, only changes that occured since the last sync call are treated.

      \ No newline at end of file diff --git a/static/doc/geneweb/Gwexport/.dune-keep b/static/doc/geneweb/Gwexport/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Gwexport/index.html b/static/doc/geneweb/Gwexport/index.html new file mode 100644 index 0000000000..c8ae78122a --- /dev/null +++ b/static/doc/geneweb/Gwexport/index.html @@ -0,0 +1,2 @@ + +Gwexport (geneweb.Gwexport)

      Module Gwexport

      type gwexport_charset =
      | Ansel
      | Ansi
      | Ascii
      | Utf8
      type gwexport_opts = {
      asc : int option;
      ascdesc : int option;
      base : (string * Gwdb.base) option;
      censor : int;
      charset : gwexport_charset;
      desc : int option;
      img_base_path : string;
      keys : string list;
      mem : bool;
      no_notes : [ `nn | `nnn | `none ];
      no_picture : bool;
      oc : string * (string -> unit) * (unit -> unit);
      parentship : bool;
      picture_path : bool;
      source : string option;
      surnames : string list;
      verbose : bool;
      }
      val default_opts : gwexport_opts

      Default set of options

      val speclist : gwexport_opts Stdlib.ref -> (Stdlib.Arg.key * Stdlib.Arg.spec * Stdlib.Arg.doc) list

      Given a set of options, returns default command line arguments for selecting elements from a base. The output of this function is the first input of Arg.parse.

      val anonfun : gwexport_opts Stdlib.ref -> Stdlib.Arg.anon_fun

      anonfun opts = fun base_name -> ... Given a set of options `opts` where `!opts.base` is uninitialized, opens the dir `base_name` and initializes !opts.base with the base name. The output of this function is the second argument of Arg.parse.

      val errmsg : Stdlib.Arg.usage_msg

      Default error message. This is the third argument of Arg.parse.

      val select : gwexport_opts -> Gwdb.iper list -> (Gwdb.iper -> bool) * (Gwdb.ifam -> bool)

      select opts ips Return filters for iper and ifam to be used when exporting a (portion of a) base.

      \ No newline at end of file diff --git a/static/doc/geneweb/GwuLib/.dune-keep b/static/doc/geneweb/GwuLib/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/GwuLib/index.html b/static/doc/geneweb/GwuLib/index.html new file mode 100644 index 0000000000..357376456e --- /dev/null +++ b/static/doc/geneweb/GwuLib/index.html @@ -0,0 +1,2 @@ + +GwuLib (geneweb.GwuLib)

      Module GwuLib

      val out_dir : string Stdlib.ref
      val old_gw : bool Stdlib.ref
      val raw_output : bool Stdlib.ref
      val separate_list : string list Stdlib.ref
      val only_file : string Stdlib.ref
      val sep_limit : int Stdlib.ref
      val prepare_free_occ : ?select:(Gwdb.iper -> bool) -> Gwdb.base -> unit

      Initializes the internal hashtables. Person whose identifier is not selected (`select p = false`) are ignored.

      val gwu : Gwexport.gwexport_opts -> bool -> Gwdb.base -> string -> string -> (string, (string -> unit) * bool Stdlib.ref * (unit -> unit)) Stdlib.Hashtbl.t -> ((Gwdb.iper -> bool) * (Gwdb.ifam -> bool)) -> unit

      Prints the `.gw` file.

      \ No newline at end of file diff --git a/static/doc/geneweb/Lock/.dune-keep b/static/doc/geneweb/Lock/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Lock/index.html b/static/doc/geneweb/Lock/index.html new file mode 100644 index 0000000000..2ab8784dce --- /dev/null +++ b/static/doc/geneweb/Lock/index.html @@ -0,0 +1,2 @@ + +Lock (geneweb.Lock)

      Module Lock

      val no_lock_flag : bool Stdlib.ref

      Flag that indicates if the lock should be used.

      val print_error_and_exit : unit -> unit

      Print lock error message and terminate program.

      val print_try_again : unit -> unit

      Print message about locked database.

      val control : onerror:(unit -> 'a) -> string -> bool -> (unit -> 'a) -> 'a

      control ~onerror lname wait f opens file lname, puts a write lock on it and then calls f. If wait is true then if it tries to access locked file it will be blocked until these lock is removed. Otherwise it will fail, and function onerror will be called. If flag no_lock_flag is set then returns f () immediatly.

      val control_retry : onerror:(unit -> 'a) -> string -> (unit -> 'a) -> 'a

      Tries to call control without blocking. If it fail (lock is put) then call again control and waits untill lock is removed. If it fails with another reason calls onerror.

      \ No newline at end of file diff --git a/static/doc/geneweb/Mutil/.dune-keep b/static/doc/geneweb/Mutil/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Mutil/index.html b/static/doc/geneweb/Mutil/index.html new file mode 100644 index 0000000000..21c019ba4f --- /dev/null +++ b/static/doc/geneweb/Mutil/index.html @@ -0,0 +1,3 @@ + +Mutil (geneweb.Mutil)

      Module Mutil

      val verbose : bool Stdlib.ref

      Global variable that indicates either servers should be in verbose mode.

      val list_iter_first : (bool -> 'a -> unit) -> 'a list -> unit

      list_iter_first f l iter over first element with f true and over others with f false.

      val strip_all_trailing_spaces : string -> string

      Remove all trailing spaces in string

      val decline : char -> string -> string
      val nominative : string -> string

      Encodes name for nominative declination format.

      • deprecated
      val mkdir_p : ?perm:int -> string -> unit

      mkdir_p ?perm dir Create the directory dir. No error if existing, make parent directories as needed.

      val remove_dir : string -> unit

      Remove every file in the directory and then remove the directory itself

      val lock_file : string -> string

      Returns the name of a lock file (with extension .lck). Result is generally used as an argument for Lock.control function.

      val initial : string -> int

      Returns position of first capital letter in the name (0 if no capitals).

      val input_particles : string -> string list

      input_particles fname read file and returns list of lines. Empty lines are skipped.

      val surnames_pieces : string -> string list

      Divide surnames on pieces. Every separated word that contains at least 4 character forms one piece. Words that contains less than 4 characters or words "saint" and "sainte" are considered as the particles and are attached to the another word to form a piece. If string contains less than two pieces, returns an empty list.

      val utf_8_of_iso_8859_1 : string -> string

      Convert encoded string with ISO 8859-1 to UTF 8

      val iso_8859_1_of_utf_8 : string -> string

      Convert encoded string with UTF 8 to ISO 8859-1

      val roman_of_arabian : int -> string

      Convert arabic number (int) to roman (string). Number should be < 4000.

      val arabian_of_roman : string -> int

      Convert roman number (string) to arabic (int). Number should be less or equal to MMMCMXCIX (3999).

      val input_lexicon : string -> (string, string) Stdlib.Hashtbl.t -> (unit -> Stdlib.in_channel) -> unit

      input_lexicon lang ht open_file open lexicon.txt file with open_file (), parse it and fill ht where key is a section name (in english) and value is a coresponding traduction associated to a lang language code. If traduction line has a form ->: sect it associates to the current section name the value associated to sect section name inside ht.

      module StrSet : Stdlib.Set.S with type elt = string

      Set of strings

      val tr : char -> char -> string -> string

      tr c1 c2 str Return a new string which is the same as str with all occurences of c1 replaced by c2. If str does not contain c1 str is returned untouched.

      val unsafe_tr : char -> char -> string -> string

      unsafe_tr c1 c2 str Update str in place. Replace all occurences of c1 by c2.

      val array_to_list_map : ('a -> 'b) -> 'a array -> 'b list

      array_to_list_map fn a is almost like Array.to_list a |> List.map fn but is more efficient.

      The list is constructed backward, so if fn have side effects it may not behave as excepted.

      val array_to_list_rev_map : ('a -> 'b) -> 'a array -> 'b list

      array_to_list_revmap fn a is almost like Array.to_list a |> List.rev_map fn but is more efficient.

      val array_assoc : 'k -> ('k * 'v) array -> 'v

      array_assoc k arr returns the value associated with key k in the array of pairs arr. That is, array_assoc k [| ... ; (k,v) ; ... |] = v if (k,v) is the leftmost binding of a in array arr. Raise Not_found if there is no value associated with k in arr.

      val start_with : string -> int -> string -> bool

      start_with prefix off str Test if str starts with prefix (at offset off).

      Raise Invalid_argument if off is not a valid index in str.

      val start_with_wildcard : string -> int -> string -> bool

      start_with_wildcard prefix off str Test if str starts with prefix (at offset off). Occurences of '_' in prefix will match both '_' and ' ' in str and trailing '_' of prefix is treated as an optional '_' ' '.

      Raise Invalid_argument if off is not a valid index in str.

      val contains : string -> string -> bool

      contains str sub Test sub is contained in str.

      val compile_particles : string list -> Re.re

      compile_particles list Compile list so it can be used with get_particle or compare_after_particle function.

      val get_particle : Re.re -> string -> string

      get_particle particles name Return p where p is in particles and is prefix of name. If no such p exists, empty string "" is returned.

      val compare_after_particle : Re.re -> string -> string -> int

      compare_after_particle particles s1 s2 compare strings s1 s2 starting from the first character after particle's match. If they are equal, compare particles.

      val rm : string -> unit

      rm fname Remove fname. If fname does not exists, do nothing.

      val mv : string -> string -> unit

      mv src dst Move src to dst. If src does not exists, do nothing.

      val string_of_int_sep : string -> int -> string

      string_of_int_sep "," 1000000 is "1,000,000"

      val list_compare : ('a -> 'a -> int) -> 'a list -> 'a list -> int

      list_compare cmp l1 l2 Comparison function for lists, using cmp to compare each elements

      val list_find_map : ('a -> 'b option) -> 'a list -> 'b option

      list_find_map fn list OCaml Stdlib's List.find_map (introduced in 4.10.0) backported into GeneWeb

      val list_rev_iter : ('a -> unit) -> 'a list -> unit

      list_rev_iter f l gives the same result as List.rev l |> List.iter fn, but without creating intermediate list (not tail-recursive).

      val list_last : 'a list -> 'a

      list_last list Return the last element of the list. Raises Failure if the list is empty.

      val list_slice : int -> int -> 'a list -> 'a list

      list_slice from_ to_ list Extracts elements from a-nth (starts with zero, inclusive) to b-nth (exclusive). If list is not long enough, result will be shorter than requested, but the function will not fail.

      val check_magic : string -> Stdlib.in_channel -> bool

      check_magic magic ic Read (and consume) the magic string at the beggining of ic and return true. If ic does not start with magic, reset the reading position of ic to where is was before you call check_magic and return false.

      val executable_magic : string

      Magic string are either get from GW_EXECUTABLE_MAGIC environement variable either generated from the md5sum of the running executable. It can be used for volatile files which can be easily corrupted by any change in program or data representation.

      val random_magic : string

      Magic string generated from 30 random bits. It should be different each time you launch the program.

      val array_except : 'a -> 'a array -> 'a array

      array_except value array Return a new array containing all the elements from array except the first occurence of value

      val default_particles : string list

      List of default particles used in GeneWeb

      val array_forall2 : ('a -> 'b -> bool) -> 'a array -> 'b array -> bool

      array_forall2 p a b Checks if all elements of the arrays satisfy the predicate p. That is, it returns (p a1 b1) && (p a2 b2) && ... && (p an bn). Raise Invalid_argument if the two lists are determined to have different lengths.

      val list_replace : 'a -> 'a -> 'a list -> 'a list

      list_replace old_v new_v list Return the same list as list were the first occurence of old_v has been replaced by new_v. If old_v is unbound, the list is returned unchanged.

      val list_except : 'a -> 'a list -> 'a list

      list_except x list Return a list containing all the elements from list except the first occurence of x.

      val list_index : 'a -> 'a list -> int

      list_index element list Finds the index of element in list. Raises Not_found if it does not exists.

      val list_ref_append : 'a list Stdlib.ref -> 'a -> unit

      list_ref_append tl hd Add hd at the beginning of tl ref.

      val input_file_ic : Stdlib.in_channel -> string

      Read the content of a file. Starts from the position where it is when calling input_file_ic, and read until the end of the file.

      This function avoid crashes with text files on Windows platform.

      If the channel is opened on a file that is not a regular file, the result is meaningless.

      val normalize_utf_8 : string -> string

      normalize_utf_8 s Return s normalized using NFC with all malformed UTF-8 character replaced by the replacement character

      val list_map_sort_uniq : ('a -> 'b) -> 'a list -> 'b list

      list_map_sort_uniq f l apply f to every element and return sorted with Merge Sort algorithm list where every element is unique.

      val list_rev_map_append : ('a -> 'b) -> 'a list -> 'b list -> 'b list

      list_rev_map_append f l1 l2 apply f to every element in l1, reverse it and concat with l2.

      val read_or_create_channel : ?magic:string -> ?wait:bool -> +string -> (Stdlib.in_channel -> 'a) -> (Stdlib.out_channel -> 'a) -> 'a

      read_or_create_channel ?magic fname read write

      If fname exists (and starts with magic if this one is provided), read function is used on the file. If it does not, or does not start with magic, or if read raise an exception, write function is used on the file.

      This function takes care of locking and closing files so you must not take care of that in read/write. It also takes care of writing magic at the beginning of the file before calling write

      On Windows, file is not locked.

      val read_or_create_value : ?magic:string -> ?wait:bool -> string -> (unit -> 'a) -> 'a

      read_or_create_value ?magic fname create

      If fname exists (and starts and ends with magic if this one is provided), return the unmarshalled value. If it does not, or does not start with magic, or if unmarshalling raise an exception, create function is used to produce the value to be marshalled.

      On Windows, file is not locked.

      val bench : string -> (unit -> 'a) -> 'a

      bench name fn Execute fn, print stats about time and memory allocation, return fn result.

      val print_callstack : ?max:int -> unit -> unit

      Prints call stack on stderr with at most max entries.

      val encode : string -> string

      encode s Encodes the string s in another string where spaces and special characters are coded. This allows to put such strings in html links <a href=...>. This is the same encoding done by Web browsers in forms.

      val decode : string -> string

      decode s Does the inverse job than code, restoring the initial string. The heading and trailing spaces are stripped.

      val gen_decode : bool -> string -> string

      Like above but heading and trailing spaces are stripped only if bool parameter is true. decode = gen_decode true.

      val extract_param : string -> char -> string list -> string

      extract_param name stopc request can be used to extract some parameter from a browser request (list of strings); name is a string which should match the beginning of a request line, stopc is a character ending the request line. For example, the string request has been obtained by: extract_param "GET /" ' '. Answers the empty string if the parameter is not found.

      val sprintf_date : Unix.tm -> string

      Print a date using "%04d-%02d-%02d %02d:%02d:%02d" format Example : 2021-12-13 22:35:08.

      val rev_input_line : Stdlib.in_channel -> int -> (bytes Stdlib.ref * int Stdlib.ref) -> string * int

      rev_input_line ic pos (rbytes, rpos) Read characters in reverse order from the given input channel, until a newline character is encountered. Return the string of all characters read, without the newline character at the end, and the position of the first character of the returned line (to be used with next rev_input_line call).

      rpos and rbytes are intermediate between ic and reading functions. At the beginig when !rpos = 0 and rbytes is empty, initialise buffer with the size = 1024, then reads last 1024 characters from ci. When rpos comes down to 0, resize buffer *2 and reads 2048 characters before 1024 last characters. rpos and rbytes must be the same in each subsequents calls

      Raises End_of_file if the beginning of the file is reached at the beginning of line.

      val search_file_opt : string list -> string -> string option

      search_file directories file Search for a file in different directories and return then first result or None if not found

      val search_asset_opt : string -> string option

      search_asset fname Searches for a file in assets directories. i.e. directories previously registered with Secure.add_assets

      val eq_key : (string * string * int) -> (string * string * int) -> bool

      eq_key (fn1, sn1, oc1) (fn2, sn2, oc2) Tests if two persons would have the same key

      val ls_r : string list -> string list

      ls_r dirs List directories (and subdirectories) contents of dirs, including dirs themselves.

      val rm_rf : string -> unit

      rm_rf dir Remove directory dir and everything inside dir.

      val filter_map : ('a -> 'b option) -> 'a list -> 'b list

      filter_map fn list is a combination of map and filter. Not tail-recursive.

      val rev_iter : ('a -> unit) -> 'a list -> unit

      rev_iter fn list is like List.iter fn (List.rev list). Not tail-recursive.

      val groupby : key:('a -> 'k) -> value:('a -> 'v) -> 'a list -> ('k * 'v list) list

      groupby ~key ~value list Group the elements returning the same key together. Ordering of elements is unspecified.

      val digest : string -> string

      digest s Returns the (128 bits long, using MD5 algorithm) digest of s.

      \ No newline at end of file diff --git a/static/doc/geneweb/Name/.dune-keep b/static/doc/geneweb/Name/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Name/index.html b/static/doc/geneweb/Name/index.html new file mode 100644 index 0000000000..db3eec6355 --- /dev/null +++ b/static/doc/geneweb/Name/index.html @@ -0,0 +1,2 @@ + +Name (geneweb.Name)

      Module Name

      val forbidden_char : char list

      List of forbidden to use characters

      val unaccent_utf_8 : bool -> string -> int -> string * int

      unaccent_utf_8 lower s i checks UTF-8 characher that starts at position i inside s and returns couple (cs,np) where cs is ASCII representation of this character (characters between 0x00 and 0x7F) and np it's a position of next utf8 character inside s. If lower is true then cs will contain only lowercase letters. Example : unaccent_utf_8 "aÈa" 1 -> ("e",3)

      val next_chars_if_equiv : string -> int -> string -> int -> (int * int) option

      next_chars_if_equiv s1 i1 s2 i2 checks if UTF-8 characters that start at position i1 inside s1 and at i2 inside s2 are equivalent (have the same ASCII representation). In this case returns position of the next charecter for each of them. Otherwise, returns None.

      val lower : string -> string

      Convert every letter to lowercase and use *unidecode* library to represent unicode characters with ASCII. Non-alphanumeric characters (except '.') are remplaced by space.

      val title : string -> string

      Apply uppercasing to the first letter of each name (sequence of alphabetic characters) part, and lowercasing to the rest of the text.

      val abbrev : string -> string

      Remplace by an abbreviation or remove particles inside the name

      val strip : string -> string

      Removes all the spaces inside the name

      val strip_c : string -> char -> string

      strip_c s c removes all the occurences of c inside the name

      val purge : string -> string

      Removes all the forbiden characters from forbidden_char inside the name

      val crush : string -> string

      Converts name to the following format:

      • no spaces
      • roman numbers are keeped
      • vowels are suppressed, except in words starting with a vowel, where this vowel is converted into "e"
      • "k" and "q" replaced by "c"
      • "y" replaced by "i"
      • "z" replaced by "s"
      • "ph" replaced by "f"
      • others "h" deleted
      • s at thr end of words are deleted
      • no double lowercase consons
      val strip_lower : string -> string

      Equivalent to strip o lower. Used as:

      • First comparison of names.
      • Comparison for first names and surnames.
      val crush_lower : string -> string

      Equivalent to crush o abbrev o lower. Used as:

      • Second comparison of names.
      • Key when index by names
      val concat : string -> string -> string

      concat fn sn is fn ^ " " ^ sn but faster.

      val split_sname_callback : (int -> int -> unit) -> string -> unit

      split_sname_callback fn s Same as split_sname, but call fn with substring indexes instead of building a list

      val split_fname_callback : (int -> int -> unit) -> string -> unit

      split_fname_callback fn s Same as split_fname, but call fn with substring indexes instead of building a list

      val split_sname : string -> string list

      split_sname s split the surname s in parts composing it. e.g. split_sname base "Foo-Bar" is [ "Foo" ; "Bar"]

      val split_fname : string -> string list

      split_fname s split the string s representing multiple first names into this list of firstname. e.g. split_fname base "Foo-Bar Baz" is [ "Foo-Bar" ; "Baz"]

      \ No newline at end of file diff --git a/static/doc/geneweb/Opt/.dune-keep b/static/doc/geneweb/Opt/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Opt/index.html b/static/doc/geneweb/Opt/index.html new file mode 100644 index 0000000000..581ae6225c --- /dev/null +++ b/static/doc/geneweb/Opt/index.html @@ -0,0 +1,2 @@ + +Opt (geneweb.Opt)

      Module Opt

      val iter : ('a -> unit) -> 'a option -> unit

      iter f o if o=Some x then executes f x.

      val map : ('a -> 'b) -> 'a option -> 'b option

      map f o if o=Some x then returns Some (f x) otherwise returns None.

      val map_default : 'a -> ('b -> 'a) -> 'b option -> 'a

      map_default d f o if o=Some x then returns (f x) otherwise returns d.

      val default : 'a -> 'a option -> 'a

      default d o if o=Some x then returns x otherwise returns d.

      val to_string : string option -> string

      to_string so if so=Some s then returns s otherwise returns empty string.

      \ No newline at end of file diff --git a/static/doc/geneweb/Plugin_gwxjg_lib/.dune-keep b/static/doc/geneweb/Plugin_gwxjg_lib/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_data/Yojson_write/index.html b/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_data/Yojson_write/index.html new file mode 100644 index 0000000000..6646646a9b --- /dev/null +++ b/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_data/Yojson_write/index.html @@ -0,0 +1,2 @@ + +Yojson_write (geneweb.Plugin_gwxjg_lib.Gwxjg_data.Yojson_write)

      Module Gwxjg_data.Yojson_write

      val hex : int -> char
      val write_special : string -> int Stdlib.ref -> int -> Stdlib.Buffer.t -> string -> unit
      val write_control_char : string -> int Stdlib.ref -> int -> Stdlib.Buffer.t -> char -> unit
      val finish_string : string -> int Stdlib.ref -> Stdlib.Buffer.t -> unit
      val write_string_body : Stdlib.Buffer.t -> string -> unit
      val write_string : Stdlib.Buffer.t -> string -> unit
      val dec : int -> char
      val write_digits : Stdlib.Buffer.t -> int -> unit
      val write_int : Stdlib.Buffer.t -> int -> unit
      val write_float : Stdlib.Buffer.t -> float -> unit
      val write_null : Stdlib.Buffer.t -> unit -> unit
      val write_bool : Stdlib.Buffer.t -> bool -> unit
      val write_kv : Stdlib.Buffer.t -> (string * Jingoo.Jg_types.tvalue) -> unit
      val write_list_aux : a. (Stdlib.Buffer.t -> 'a -> unit) -> Stdlib.Buffer.t -> 'a list -> unit
      val write_assoc : Stdlib.Buffer.t -> (string * Jingoo.Jg_types.tvalue) list -> unit
      val write_hash : Stdlib.Buffer.t -> (string, Jingoo.Jg_types.tvalue) Stdlib.Hashtbl.t -> unit
      val write_list : Stdlib.Buffer.t -> Jingoo.Jg_types.tvalue list -> unit
      val write_array : Stdlib.Buffer.t -> Jingoo.Jg_types.tvalue array -> unit
      val write_json : Stdlib.Buffer.t -> Jingoo.Jg_types.tvalue -> unit
      \ No newline at end of file diff --git a/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_data/index.html b/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_data/index.html new file mode 100644 index 0000000000..8ae5b8eb0f --- /dev/null +++ b/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_data/index.html @@ -0,0 +1,2 @@ + +Gwxjg_data (geneweb.Plugin_gwxjg_lib.Gwxjg_data)

      Module Plugin_gwxjg_lib.Gwxjg_data

      module Ezgw = Gwxjg_ezgw
      module Lexicon_parser = Gwxjg_lexicon_parser
      val person_ht : (Gwdb.iperJingoo.Jg_types.tvalue) Stdlib.Hashtbl.t
      val mk_opt : ('a -> Jingoo.Jg_types.tvalue) -> 'a option -> Jingoo.Jg_types.tvalue
      val mk_source_rs : Geneweb.Config.config -> Gwdb.base -> string -> Jingoo.Jg_types.tvalue * Jingoo.Jg_types.tvalue
      val mk_note_rs : Geneweb.Config.config -> Gwdb.base -> (char * (unit -> string)) list -> string -> Jingoo.Jg_types.tvalue * Jingoo.Jg_types.tvalue
      val mk_person_note_rs : Geneweb.Config.config -> Gwdb.base -> Gwdb.person -> string -> Jingoo.Jg_types.tvalue * Jingoo.Jg_types.tvalue
      val date_compare_aux : Jingoo.Jg_types.tvalue -> Jingoo.Jg_types.tvalue -> Jingoo.Jg_types.tvalue
      val compare_month : Jingoo.Jg_types.tvalue -> Jingoo.Jg_types.tvalue -> Jingoo.Jg_types.tvalue
      val compare_day : Jingoo.Jg_types.tvalue -> Jingoo.Jg_types.tvalue -> Jingoo.Jg_types.tvalue
      val cmp_prec : Jingoo.Jg_types.tvalue -> Jingoo.Jg_types.tvalue -> Jingoo.Jg_types.tvalue
      val field : Jingoo.Jg_types.tvalue -> string -> Jingoo.Jg_types.tvalue
      val mk_family : Geneweb.Config.config -> Gwdb.base -> (Gwdb.ifam * Gwdb.family * (Gwdb.iper * Gwdb.iper * Gwdb.iper) * bool) -> Jingoo.Jg_types.tvalue
      val get_n_mk_family : Geneweb.Config.config -> Gwdb.base -> ?origin:Gwdb.iper -> Gwdb.ifam -> Gwdb.family -> Jingoo.Jg_types.tvalue
      val date_compare : Jingoo.Jg_types.tvalue
      val date_eq : Jingoo.Jg_types.tvalue
      val dtext_eq : Jingoo.Jg_types.tvalue
      val mk_dmy : Def.dmy -> Jingoo.Jg_types.tvalue
      val mk_date : Def.date -> Jingoo.Jg_types.tvalue
      val to_dmy : Jingoo.Jg_types.tvalue -> Def.dmy
      val to_dmy2 : Jingoo.Jg_types.tvalue -> Def.dmy2
      val to_prec : Def.precision -> Jingoo.Jg_types.tvalue
      val of_prec : Jingoo.Jg_types.tvalue -> Def.precision
      val to_gregorian_aux : string -> Jingoo.Jg_types.tvalue -> Def.dmy
      val of_calendar : Jingoo.Jg_types.tvalue -> Def.calendar
      val module_DATE : Geneweb.Config.config -> Jingoo.Jg_types.tvalue
      val lazy_list : a. ('a -> Jingoo.Jg_types.tvalue) -> 'a list -> Jingoo.Jg_types.tvalue
      val lazy_get_n_mk_person : Geneweb.Config.config -> Gwdb.base -> Gwdb.iper -> Jingoo.Jg_types.tvalue
      val ppget : Geneweb.Config.config -> Gwdb.base -> Gwdb.person -> Jingoo.Jg_types.tvalue
      val pget : Geneweb.Config.config -> Gwdb.base -> Gwdb.iper -> Jingoo.Jg_types.tvalue
      val get_n_mk_person : Geneweb.Config.config -> Gwdb.base -> Gwdb.iper -> Jingoo.Jg_types.tvalue
      val mk_rparent_aux : (Def.relation_type -> Jingoo.Jg_types.tvalue) -> Geneweb.Config.config -> Gwdb.base -> Jingoo.Jg_types.tvalue list -> Gwdb.relation -> Jingoo.Jg_types.tvalue list
      val mk_rparent : Geneweb.Config.config -> Gwdb.base -> Jingoo.Jg_types.tvalue list -> Gwdb.relation -> Jingoo.Jg_types.tvalue list
      val mk_rchild : Geneweb.Config.config -> Gwdb.base -> Jingoo.Jg_types.tvalue list -> Gwdb.relation -> Jingoo.Jg_types.tvalue list
      val mk_witness_kind : Def.witness_kind -> Jingoo.Jg_types.tvalue
      val mk_event : Geneweb.Config.config -> Gwdb.base -> (Geneweb.Perso.event_name * Def.cdate * Gwdb.istr * Gwdb.istr * Gwdb.istr * (Gwdb.iper * Def.witness_kind) array * Gwdb.iper option) -> Jingoo.Jg_types.tvalue
      val mk_title : Gwdb.base -> Gwdb.title -> Jingoo.Jg_types.tvalue
      val mk_ancestors : Geneweb.Config.config -> Gwdb.base -> Gwdb.person -> Jingoo.Jg_types.tvalue * Jingoo.Jg_types.tvalue * Jingoo.Jg_types.tvalue
      val mk_rparents : Geneweb.Config.config -> Gwdb.base -> Gwdb.person -> Jingoo.Jg_types.tvalue
      val mk_families_spouses : Gwdb.iper -> Geneweb.Config.config -> Gwdb.base -> Gwdb.person -> Jingoo.Jg_types.tvalue * Jingoo.Jg_types.tvalue
      val mk_str_lst : Gwdb.base -> Gwdb.istr list -> Jingoo.Jg_types.tvalue
      val unsafe_mk_semi_public_person : Geneweb.Config.config -> Gwdb.base -> Gwdb.person -> Jingoo.Jg_types.tvalue
      val get_sosa_person : Geneweb.Config.config -> Gwdb.base -> Gwdb.person -> Jingoo.Jg_types.tvalue
      val find_events : Geneweb.Config.config -> Gwdb.base -> Geneweb.Perso.event_name list -> (Geneweb.Perso.event_name * Def.cdate * Gwdb.istr * Gwdb.istr * Gwdb.istr * (Gwdb.iper * Def.witness_kind) array * Gwdb.iper option) list -> Jingoo.Jg_types.tvalue
      val unsafe_mk_person : Geneweb.Config.config -> Gwdb.base -> Gwdb.person -> Jingoo.Jg_types.tvalue
      val mk_fevent : ?spouse:Gwdb.iper -> Geneweb.Config.config -> Gwdb.base -> (Gwdb.iperGwdb.istr) Def.gen_fam_event -> Jingoo.Jg_types.tvalue
      val mk_pevent : Geneweb.Config.config -> Gwdb.base -> (Gwdb.iperGwdb.istr) Def.gen_pers_event -> Jingoo.Jg_types.tvalue
      val mk_gen_title : Gwdb.base -> Gwdb.istr Def.gen_title -> Jingoo.Jg_types.tvalue
      val module_OPT : Jingoo.Jg_types.tvalue
      val module_NAME : Gwdb.base -> Jingoo.Jg_types.tvalue
      val mk_conf : Geneweb.Config.config -> Jingoo.Jg_types.tvalue
      val mk_env_no_base : Geneweb.Config.config -> Jingoo.Jg_types.tvalue
      val mk_env : Geneweb.Config.config -> Gwdb.base -> Jingoo.Jg_types.tvalue
      val decode_varenv : Jingoo.Jg_types.tvalue
      val encode_varenv : Jingoo.Jg_types.tvalue
      val mk_base : Gwdb.base -> Jingoo.Jg_types.tvalue
      val stringify : string -> string
      val trans : Geneweb.Config.config -> Jingoo.Jg_types.tvalue
      module Yojson_write : sig ... end
      val json_encode : Jingoo.Jg_types.tvalue -> string
      val log : Jingoo.Jg_types.tvalue
      val alphabetic : Jingoo.Jg_types.tvalue
      val module_CAST : Jingoo.Jg_types.tvalue
      val module_GWDB : Geneweb.Config.config -> Gwdb.base -> Jingoo.Jg_types.tvalue
      val default_env_aux : Geneweb.Config.config -> (string * Jingoo.Jg_types.tvalue) list
      val default_env_no_base : Geneweb.Config.config -> (string * Jingoo.Jg_types.tvalue) list
      val default_env : Geneweb.Config.config -> Gwdb.base -> (string * Jingoo.Jg_types.tvalue) list
      \ No newline at end of file diff --git a/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_ezgw/Event/index.html b/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_ezgw/Event/index.html new file mode 100644 index 0000000000..8fad153900 --- /dev/null +++ b/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_ezgw/Event/index.html @@ -0,0 +1,2 @@ + +Event (geneweb.Plugin_gwxjg_lib.Gwxjg_ezgw.Event)

      Module Gwxjg_ezgw.Event

      val name : Geneweb.Config.config -> Gwdb.base -> (Geneweb.Perso.event_name * 'a * 'b * 'c * 'd * 'e * 'f) -> string
      val kind : (Geneweb.Perso.event_name * 'a * 'b * 'c * 'd * 'e * 'f) -> string
      val date : ('a * Adef.cdate * 'b * 'c * 'd * 'e * 'f) -> Adef.date option
      val place : Geneweb.Config.config -> Gwdb.base -> ('a * 'b * Gwdb.istr * 'c * 'd * 'e * 'f) -> string
      val note : Geneweb.Config.config -> Gwdb.base -> ('a * 'b * 'c * Gwdb.istr * 'd * 'e * 'f) -> string
      val src : Gwdb.base -> ('a * 'b * 'c * 'd * Gwdb.istr * 'e * 'f) -> string
      val witnesses : ('a * 'b * 'c * 'd * 'e * 'f * 'g) -> 'f
      val spouse_opt : ('a * 'b * 'c * 'd * 'e * 'f * 'g) -> 'g
      \ No newline at end of file diff --git a/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_ezgw/Family/index.html b/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_ezgw/Family/index.html new file mode 100644 index 0000000000..a88092a5c2 --- /dev/null +++ b/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_ezgw/Family/index.html @@ -0,0 +1,2 @@ + +Family (geneweb.Plugin_gwxjg_lib.Gwxjg_ezgw.Family)

      Module Gwxjg_ezgw.Family

      val children : ('a * Gwdb.family * 'b * 'c) -> Gwdb.iper array
      val divorce_date : ('a * Gwdb.family * 'b * bool) -> Adef.date option
      val events : ('a * Gwdb.family * ('b * 'c * 'd) * bool) -> (Geneweb.Perso.event_name * Def.cdate * Gwdb.istr * Gwdb.istr * Gwdb.istr * (Gwdb.iper * Def.witness_kind) array * 'd option) list
      val father : ('a * 'b * ('c * 'd * 'e) * 'f) -> 'c
      val ifam : (Gwdb.ifam * 'a * 'b * 'c) -> string
      val marriage_date : ('a * Gwdb.family * ('b * 'c * 'd) * bool) -> Adef.date option
      val marriage_place : ('a * Gwdb.family * 'b * 'c) -> Gwdb.istr
      val marriage_note : ('a * Gwdb.family * 'b * bool) -> Gwdb.istr
      val marriage_source : ('a * Gwdb.family * 'b * bool) -> Gwdb.istr
      val mother : ('a * 'b * ('c * 'd * 'e) * 'f) -> 'd
      val note : Geneweb.Config.config -> Gwdb.base -> ('a * Gwdb.family * 'b * bool) -> string
      val origin_file : Geneweb.Config.config -> Gwdb.base -> ('a * Gwdb.family * 'b * 'c) -> string
      val spouse_iper : ('a * 'b * ('c * 'd * 'e) * 'f) -> 'e
      val witnesses : ('a * Gwdb.family * 'b * bool) -> Gwdb.iper array
      val sources : Gwdb.base -> ('a * Gwdb.family * 'b * bool) -> string
      \ No newline at end of file diff --git a/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_ezgw/Person/index.html b/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_ezgw/Person/index.html new file mode 100644 index 0000000000..7550b865b7 --- /dev/null +++ b/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_ezgw/Person/index.html @@ -0,0 +1,2 @@ + +Person (geneweb.Plugin_gwxjg_lib.Gwxjg_ezgw.Person)

      Module Gwxjg_ezgw.Person

      val children : Gwdb.base -> Gwdb.person -> Gwdb.iper list
      val consanguinity : Gwdb.person -> float
      val dates : Geneweb.Config.config -> Gwdb.base -> Gwdb.person -> string
      val death : Gwdb.person -> Def.death
      val first_name : Gwdb.base -> Gwdb.person -> string
      val history_file : Gwdb.base -> Gwdb.person -> string
      val image : Gwdb.base -> Gwdb.person -> string
      val is_accessible_by_key : Geneweb.Config.config -> Gwdb.base -> Gwdb.person -> bool
      val linked_page : Geneweb.Config.config -> Gwdb.base -> Gwdb.person -> string -> string
      val note : Geneweb.Config.config -> Gwdb.base -> Gwdb.person -> string
      val relations : Gwdb.person -> Gwdb.iper list
      val siblings : Gwdb.base -> Gwdb.person -> Gwdb.iper list
      val half_siblings : Gwdb.base -> Gwdb.person -> Gwdb.iper list
      val sex : Gwdb.person -> int
      val surname : Gwdb.base -> Gwdb.person -> string
      \ No newline at end of file diff --git a/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_ezgw/index.html b/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_ezgw/index.html new file mode 100644 index 0000000000..fb30713421 --- /dev/null +++ b/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_ezgw/index.html @@ -0,0 +1,2 @@ + +Gwxjg_ezgw (geneweb.Plugin_gwxjg_lib.Gwxjg_ezgw)

      Module Plugin_gwxjg_lib.Gwxjg_ezgw

      type fam = Gwdb.ifam * Gwdb.family * (Gwdb.iper * Gwdb.iper * Gwdb.iper) * bool
      type rel = Gwdb.relation * Gwdb.person option
      type env = {
      all_gp : Geneweb.Perso.generation_person list option;
      baseprefix : string option;
      desc_level_table : (int array * int array) Stdlib.Lazy.t option;
      desc_mark : bool array Stdlib.ref option;
      fam : fam option;
      prev_fam : fam option;
      sosa : (Gwdb.iper * (Sosa.t * Gwdb.person) option) list Stdlib.ref option;
      sosa_ref : Gwdb.person option Stdlib.Lazy.t option;
      src : string option;
      }
      val conf_w_baseprefix : Geneweb.Config.config -> env -> Geneweb.Config.config
      val empty : env
      val env : env
      val get_env : 'a option -> 'a
      val sex_of_index : int -> Def.sex
      module Person : sig ... end
      module Family : sig ... end
      module Event : sig ... end
      \ No newline at end of file diff --git a/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_lexicon_parser/index.html b/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_lexicon_parser/index.html new file mode 100644 index 0000000000..f48b9d9d27 --- /dev/null +++ b/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_lexicon_parser/index.html @@ -0,0 +1,2 @@ + +Gwxjg_lexicon_parser (geneweb.Plugin_gwxjg_lib.Gwxjg_lexicon_parser)

      Module Plugin_gwxjg_lib.Gwxjg_lexicon_parser

      type i18n_expr =
      | Arg of string
      | Str of string
      | Elision of string * string
      | Declension of char * string
      val flush : Stdlib.Buffer.t -> i18n_expr list -> i18n_expr list
      val need_split : string -> bool
      val __ocaml_lex_tables : Stdlib.Lexing.lex_tables
      val p_main : (string * (string * i18n_expr array array) list) list -> Stdlib.Lexing.lexbuf -> (string * (string * i18n_expr array array) list) list
      val __ocaml_lex_p_main_rec : (string * (string * i18n_expr array array) list) list -> Stdlib.Lexing.lexbuf -> int -> (string * (string * i18n_expr array array) list) list
      val p_lang : bool -> (string * i18n_expr array array) list -> Stdlib.Lexing.lexbuf -> (string * i18n_expr array array) list
      val __ocaml_lex_p_lang_rec : bool -> (string * i18n_expr array array) list -> Stdlib.Lexing.lexbuf -> int -> (string * i18n_expr array array) list
      val p_trad : Stdlib.Buffer.t -> i18n_expr list -> Stdlib.Lexing.lexbuf -> i18n_expr array
      val __ocaml_lex_p_trad_rec : Stdlib.Buffer.t -> i18n_expr list -> Stdlib.Lexing.lexbuf -> int -> i18n_expr array
      \ No newline at end of file diff --git a/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_trans/index.html b/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_trans/index.html new file mode 100644 index 0000000000..a770dd7b49 --- /dev/null +++ b/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_trans/index.html @@ -0,0 +1,14 @@ + +Gwxjg_trans (geneweb.Plugin_gwxjg_lib.Gwxjg_trans)

      Module Plugin_gwxjg_lib.Gwxjg_trans

      module Lexicon_parser = Gwxjg_lexicon_parser
      val fast_concat : string list -> string
      val args : Lexicon_parser.i18n_expr list list -> string list
      val import_trad : ('a?kwargs:(string * Jingoo.Jg_types.tvalue) list -> +int -> Jingoo.Jg_types.tvalue) Stdlib.Hashtbl.t -> 'a -> Lexicon_parser.i18n_expr array array -> unit
      val default_lang : string
      val find_lang : string -> (string * 'a) list -> 'a
      val make_lang : ('a * (string * Lexicon_parser.i18n_expr array array) list) list -> int -> string -> ('a?kwargs:(string * Jingoo.Jg_types.tvalue) list +-> int -> Jingoo.Jg_types.tvalue) Stdlib.Hashtbl.t
      val lexicon_files : string list Stdlib.ref
      val de_en_es_fi_fr_it_nl_no_pt_sv : ((string, ?kwargs:(string * Jingoo.Jg_types.tvalue) list +-> int -> Jingoo.Jg_types.tvalue) Stdlib.Hashtbl.t * (string, ?kwargs:(string * Jingoo.Jg_types.tvalue) list +-> int -> Jingoo.Jg_types.tvalue) Stdlib.Hashtbl.t * (string, ?kwargs:(string * Jingoo.Jg_types.tvalue) list +-> int -> Jingoo.Jg_types.tvalue) Stdlib.Hashtbl.t * (string, ?kwargs:(string * Jingoo.Jg_types.tvalue) list +-> int -> Jingoo.Jg_types.tvalue) Stdlib.Hashtbl.t * (string, ?kwargs:(string * Jingoo.Jg_types.tvalue) list +-> int -> Jingoo.Jg_types.tvalue) Stdlib.Hashtbl.t * (string, ?kwargs:(string * Jingoo.Jg_types.tvalue) list +-> int -> Jingoo.Jg_types.tvalue) Stdlib.Hashtbl.t * (string, ?kwargs:(string * Jingoo.Jg_types.tvalue) list +-> int -> Jingoo.Jg_types.tvalue) Stdlib.Hashtbl.t * (string, ?kwargs:(string * Jingoo.Jg_types.tvalue) list +-> int -> Jingoo.Jg_types.tvalue) Stdlib.Hashtbl.t * (string, ?kwargs:(string * Jingoo.Jg_types.tvalue) list +-> int -> Jingoo.Jg_types.tvalue) Stdlib.Hashtbl.t * (string, ?kwargs:(string * Jingoo.Jg_types.tvalue) list +-> int -> Jingoo.Jg_types.tvalue) Stdlib.Hashtbl.t) lazy_t
      \ No newline at end of file diff --git a/static/doc/geneweb/Plugin_gwxjg_lib/index.html b/static/doc/geneweb/Plugin_gwxjg_lib/index.html new file mode 100644 index 0000000000..052489556f --- /dev/null +++ b/static/doc/geneweb/Plugin_gwxjg_lib/index.html @@ -0,0 +1,2 @@ + +Plugin_gwxjg_lib (geneweb.Plugin_gwxjg_lib)

      Module Plugin_gwxjg_lib

      module Gwxjg_data : sig ... end
      module Gwxjg_ezgw : sig ... end
      module Gwxjg_lexicon_parser : sig ... end
      module Gwxjg_trans : sig ... end
      \ No newline at end of file diff --git a/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_data/.dune-keep b/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_data/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_data/index.html b/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_data/index.html new file mode 100644 index 0000000000..6c6b48bf09 --- /dev/null +++ b/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_data/index.html @@ -0,0 +1,2 @@ + +Plugin_gwxjg_lib__Gwxjg_data (geneweb.Plugin_gwxjg_lib__Gwxjg_data)

      Module Plugin_gwxjg_lib__Gwxjg_data

      \ No newline at end of file diff --git a/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_ezgw/.dune-keep b/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_ezgw/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_ezgw/index.html b/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_ezgw/index.html new file mode 100644 index 0000000000..7ea5f19b63 --- /dev/null +++ b/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_ezgw/index.html @@ -0,0 +1,2 @@ + +Plugin_gwxjg_lib__Gwxjg_ezgw (geneweb.Plugin_gwxjg_lib__Gwxjg_ezgw)

      Module Plugin_gwxjg_lib__Gwxjg_ezgw

      \ No newline at end of file diff --git a/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_lexicon_parser/.dune-keep b/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_lexicon_parser/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_lexicon_parser/index.html b/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_lexicon_parser/index.html new file mode 100644 index 0000000000..a70aed5349 --- /dev/null +++ b/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_lexicon_parser/index.html @@ -0,0 +1,2 @@ + +Plugin_gwxjg_lib__Gwxjg_lexicon_parser (geneweb.Plugin_gwxjg_lib__Gwxjg_lexicon_parser)

      Module Plugin_gwxjg_lib__Gwxjg_lexicon_parser

      \ No newline at end of file diff --git a/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_trans/.dune-keep b/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_trans/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_trans/index.html b/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_trans/index.html new file mode 100644 index 0000000000..90bf0f5a0d --- /dev/null +++ b/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_trans/index.html @@ -0,0 +1,2 @@ + +Plugin_gwxjg_lib__Gwxjg_trans (geneweb.Plugin_gwxjg_lib__Gwxjg_trans)

      Module Plugin_gwxjg_lib__Gwxjg_trans

      \ No newline at end of file diff --git a/static/doc/geneweb/Pqueue/.dune-keep b/static/doc/geneweb/Pqueue/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Pqueue/Make/argument-1-Ord/index.html b/static/doc/geneweb/Pqueue/Make/argument-1-Ord/index.html new file mode 100644 index 0000000000..44a329e73a --- /dev/null +++ b/static/doc/geneweb/Pqueue/Make/argument-1-Ord/index.html @@ -0,0 +1,2 @@ + +Ord (geneweb.Pqueue.Make.1-Ord)

      Parameter Make.1-Ord

      type t
      val leq : t -> t -> bool
      \ No newline at end of file diff --git a/static/doc/geneweb/Pqueue/Make/index.html b/static/doc/geneweb/Pqueue/Make/index.html new file mode 100644 index 0000000000..8b6069a196 --- /dev/null +++ b/static/doc/geneweb/Pqueue/Make/index.html @@ -0,0 +1,2 @@ + +Make (geneweb.Pqueue.Make)

      Module Pqueue.Make

      Functor that creates instance of priority queue from given element type.

      Parameters

      module Ord : OrderedType

      Signature

      type elt = Ord.t

      Type of elementes contained in priority queues.

      type t

      Type of priority queues.

      val empty : t

      The empty queue.

      val is_empty : t -> bool

      is_empty q checks the emptiness of q.

      val add : elt -> t -> t

      add x h adds a new element x in heap h.

      val take : t -> elt * t

      take x removes the minimum element of x and returns it; raises Not_found when x is empty.

      val union : t -> t -> t

      union q1 q2 returns heap constructed by union of q1 q2

      \ No newline at end of file diff --git a/static/doc/geneweb/Pqueue/index.html b/static/doc/geneweb/Pqueue/index.html new file mode 100644 index 0000000000..6d4786b49c --- /dev/null +++ b/static/doc/geneweb/Pqueue/index.html @@ -0,0 +1,2 @@ + +Pqueue (geneweb.Pqueue)

      Module Pqueue

      Module Pqueue: priority queues.

      This module implements priority queues, given a total ordering function over the elements inserted. All operations are purely applicative (no side effects). The implementation uses binomial queues from Chris Okasaki. "add", "take" and "union" are in o(log n) in the worst case.

      module type OrderedType = sig ... end

      The input signature of the functor Pqueue.Make. t is the type of the inserted elements. leq is a total ordering function over the elements. This is a two-argument function f returning True if the first argument is less or equal to the second one.

      module type S = sig ... end

      Output signature for priority queue

      module Make (Ord : OrderedType) : S with type elt = Ord.t

      Functor that creates instance of priority queue from given element type.

      \ No newline at end of file diff --git a/static/doc/geneweb/Pqueue/module-type-OrderedType/index.html b/static/doc/geneweb/Pqueue/module-type-OrderedType/index.html new file mode 100644 index 0000000000..af2366aa87 --- /dev/null +++ b/static/doc/geneweb/Pqueue/module-type-OrderedType/index.html @@ -0,0 +1,2 @@ + +OrderedType (geneweb.Pqueue.OrderedType)

      Module type Pqueue.OrderedType

      The input signature of the functor Pqueue.Make. t is the type of the inserted elements. leq is a total ordering function over the elements. This is a two-argument function f returning True if the first argument is less or equal to the second one.

      type t
      val leq : t -> t -> bool
      \ No newline at end of file diff --git a/static/doc/geneweb/Pqueue/module-type-S/index.html b/static/doc/geneweb/Pqueue/module-type-S/index.html new file mode 100644 index 0000000000..7fd59aae2d --- /dev/null +++ b/static/doc/geneweb/Pqueue/module-type-S/index.html @@ -0,0 +1,2 @@ + +S (geneweb.Pqueue.S)

      Module type Pqueue.S

      Output signature for priority queue

      type elt

      Type of elementes contained in priority queues.

      type t

      Type of priority queues.

      val empty : t

      The empty queue.

      val is_empty : t -> bool

      is_empty q checks the emptiness of q.

      val add : elt -> t -> t

      add x h adds a new element x in heap h.

      val take : t -> elt * t

      take x removes the minimum element of x and returns it; raises Not_found when x is empty.

      val union : t -> t -> t

      union q1 q2 returns heap constructed by union of q1 q2

      \ No newline at end of file diff --git a/static/doc/geneweb/ProgrBar/.dune-keep b/static/doc/geneweb/ProgrBar/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/ProgrBar/index.html b/static/doc/geneweb/ProgrBar/index.html new file mode 100644 index 0000000000..66951a3b94 --- /dev/null +++ b/static/doc/geneweb/ProgrBar/index.html @@ -0,0 +1,2 @@ + +ProgrBar (geneweb.ProgrBar)

      Module ProgrBar

      val empty : char Stdlib.ref

      Character that represents not passed part of progression bar

      val full : char Stdlib.ref

      Character that represents passed part of progression bar

      val start : unit -> unit

      Prints empty bar with carriage return.

      val run : int -> int -> unit

      run i len modifies progression bar that is now filled proportionally to i by comparison with len.

      val finish : unit -> unit

      Stop printing progression bar and prints a new line.

      val suspend : unit -> unit

      Stop printing progression bar and prints a new line.

      val restart : int -> int -> unit

      restart i len restart progression bar. It's equivalent to call successively run from 0 to i.

      \ No newline at end of file diff --git a/static/doc/geneweb/Secure/.dune-keep b/static/doc/geneweb/Secure/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Secure/index.html b/static/doc/geneweb/Secure/index.html new file mode 100644 index 0000000000..c6fcb10d33 --- /dev/null +++ b/static/doc/geneweb/Secure/index.html @@ -0,0 +1,2 @@ + +Secure (geneweb.Secure)

      Module Secure

      val assets : unit -> string list

      Returns list of allowed to acces assets

      val base_dir : unit -> string

      Returns directory where databases are installed to which acces is allowed

      val add_assets : string -> unit

      Add new asset to the assets list

      val set_base_dir : string -> unit

      Set base directory

      val check : string -> bool

      Check if a filename is safe to read:

      • it must not contain the '\000' character
      • it must either be relative to the local directory OR included in one of the allowed directories (base_dir or assets)
      • the relative part does not contain the '..' directory
      val open_in : string -> Stdlib.in_channel

      Secured version of open_in

      val open_in_bin : string -> Stdlib.in_channel

      Secured version of open_in_bin

      val open_out : string -> Stdlib.out_channel

      Secured version of open_out

      val open_out_bin : string -> Stdlib.out_channel

      Secured version of open_out_bin

      val open_out_gen : Stdlib.open_flag list -> int -> string -> Stdlib.out_channel

      Secured version of open_out_gen

      \ No newline at end of file diff --git a/static/doc/geneweb/Sosa/.dune-keep b/static/doc/geneweb/Sosa/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Sosa/index.html b/static/doc/geneweb/Sosa/index.html new file mode 100644 index 0000000000..c1dd31702f --- /dev/null +++ b/static/doc/geneweb/Sosa/index.html @@ -0,0 +1,2 @@ + +Sosa (geneweb.Sosa)

      Module Sosa

      type t
      val zero : t

      Initial sosa value

      val one : t

      Sosa number describing the subject itself

      val eq : t -> t -> bool

      Equality between 2 sosa

      val gt : t -> t -> bool

      Tells if one sosa number is greater then another

      val compare : t -> t -> int

      Comparison function between sosa numbers

      val add : t -> t -> t

      Addition of 2 sosa numbers

      val sub : t -> t -> t

      Substraction of 2 sosa numbers

      val twice : t -> t

      Returns sosa number multiplied by 2. Represents father's sosa number of person with the giving sosa.

      val half : t -> t

      Returns sosa number divided by 2. If person has a child then result number will be child's sosa number.

      val even : t -> bool

      Tells if sosa number is even. Even numbers describe fathers, odd - mothers for each generation.

      val inc : t -> int -> t

      Addition of sosa number with a integer

      val mul : t -> int -> t

      Multiply sosa number with an integer

      val exp : t -> int -> t

      The power of the sosa number

      val div : t -> int -> t

      Divide sosa number by an integer

      val modl : t -> int -> t

      Calculate module of sosa number comparing to integer

      val gen : t -> int

      Retruns generation of sosa number.

      val branches : t -> int list

      branches sosa Return the path to follow in order to reach sosa It is encoded as a list of int representing the acendant to choose at each generation. 0 if you have to follow the father branch, 1 if it is the mother branch.

      val of_int : int -> t

      Converts sosa from integer

      val of_string : string -> t

      Converts sosa from string

      val to_string : t -> string

      Converts sosa to string

      val to_string_sep : string -> t -> string
      \ No newline at end of file diff --git a/static/doc/geneweb/Utf8/.dune-keep b/static/doc/geneweb/Utf8/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Utf8/index.html b/static/doc/geneweb/Utf8/index.html new file mode 100644 index 0000000000..fa7a957f5a --- /dev/null +++ b/static/doc/geneweb/Utf8/index.html @@ -0,0 +1,2 @@ + +Utf8 (geneweb.Utf8)

      Module Utf8

      val nbc : char -> int

      Return the number of bytes composing the UTF8 character starting with c

      val next : string -> int -> int

      Utf8.next s i returns the index of the character comming after the one which starts at i.

      val get : string -> int -> int

      Utf8.get s n returns the index where the n-th character starts in string s.

      val length : string -> int

      Return the length (number of characters, not bytes) of the given string.

      val sub : ?pad:char -> string -> int -> int -> string

      sub ?pad s start len Return a fresh UTF8-friendly substring of len characters, padded if needed. Be careful start is the index of the byte where to start in s, not the start-th UTF8-character.

      val cmap_utf_8 : (Stdlib.Uchar.t -> [< `Self | `Uchars of Stdlib.Uchar.t list ]) -> string -> string

      cmap_utf_8 cmap s returns the UTF-8 encoded string resulting from applying the character map cmap to every character of the UTF-8 encoded string s.

      val lowercase : string -> string

      Returns UTF-8 encoded string with all uppercase letters translated to lowercase

      val uppercase : string -> string

      Returns UTF-8 encoded string with all lowercase letters translated to uppercase

      val capitalize_fst : string -> string

      Returns UTF-8 encoded string where the first letter is capitalised

      val capitalize : string -> string

      Returns UTF-8 encoded string where the first letter is capitalised and others minimalised

      val compare : string -> string -> int

      compare a b compare normalized version of a and b It is case insensitive. It starts with unaccented comparison of a and b, and refine the result with accents comparison.

      Here is an exemple of how letters would be sorted: A À Á  B C Ç Č D E É L Ł Ô Ö Ø Œ P Q R * . ?

      \ No newline at end of file diff --git a/static/doc/geneweb/Wserver/.dune-keep b/static/doc/geneweb/Wserver/.dune-keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/static/doc/geneweb/Wserver/index.html b/static/doc/geneweb/Wserver/index.html new file mode 100644 index 0000000000..9a435772f3 --- /dev/null +++ b/static/doc/geneweb/Wserver/index.html @@ -0,0 +1,2 @@ + +Wserver (geneweb.Wserver)

      Module Wserver

      val f : ([ `LOG_EMERG | `LOG_ALERT | `LOG_CRIT | `LOG_ERR | `LOG_WARNING | `LOG_NOTICE | `LOG_INFO | `LOG_DEBUG ] -> string -> unit) -> string option -> int -> int -> int option -> ((Unix.sockaddr * string list) -> string -> string -> unit) -> unit

      Wserver.f syslog addr port tmout maxc g Starts an elementary httpd server at port port in the current machine. The variable addr is Some the-address-to-use or None for any of the available addresses of the present machine. The port number is any number greater than 1024 (to create a client < 1024, you must be root). At each connection, the function g is called: g (addr, request) scr cont where addr is the client identification socket, request the browser request, scr the script name (extracted from request) and cont the stdin contents . The function g has tmout seconds to answer some text on standard output. If maxc is Some n, maximum n clients can be treated at the same time; None means no limit. syslog is the function used to log errors or debug info. It is called syslog because it is used with the same gravity levels, but it can be anything.

      See the example below.

      val close_connection : unit -> unit

      Closes the current socket

      val printf : ('aStdlib.out_channel, unit) Stdlib.format -> 'a

      Formatter printing in the out channel associated to the connected socket

      val print_string : string -> unit

      Prints a string in the out channel associated to the socket

      val header : string -> unit

      Prints a header; cannot be called if part of content part already has been sent

      val wflush : unit -> unit

      Flushes the content of the current socket

      val http : Def.httpStatus -> unit

      Output.status conf answer sends the http header where answer represents the answer status.

      val http_redirect_temporarily : string -> unit

      Output.status conf_redirect url sends the http header where url represents the Location where the request needs to be redirected.

      val get_request_and_content : char Stdlib.Stream.t -> string list * string

      Returns the request from a stream read from a socket.

      val wsocket : unit -> Unix.file_descr

      Returns the last used socket

      val woc : unit -> Stdlib.out_channel

      Return the out_channel associated to the socket

      val sock_in : string Stdlib.ref

      Names of the files used in windows implementation to communicate http requests and html answers. Default "wserver.sin" and "wserver.sou". Can have relative or absolute paths.

      val sock_out : string Stdlib.ref
      val stop_server : string Stdlib.ref

      Name of the file whose presence tells the server to stop (at least one request is necessary to unfreeze the server to make it check that this file exits. Default "STOP_SERVER". Can have relative or absolute path.

      val cgi : bool Stdlib.ref

      CGI (Common Gateway Interface) mode (default false).

      \ No newline at end of file diff --git a/static/doc/geneweb/index.html b/static/doc/geneweb/index.html new file mode 100644 index 0000000000..542d668088 --- /dev/null +++ b/static/doc/geneweb/index.html @@ -0,0 +1,2 @@ + +index (geneweb.index)

      geneweb index

      Library geneweb

      The entry point of this library is the module: Geneweb.

      Library geneweb.core

      This library exposes the following toplevel modules:

      Library geneweb.def

      This library exposes the following toplevel modules:

      Library geneweb.def_show

      The entry point of this library is the module: Def_show.

      Library geneweb.export

      The entry point of this library is the module: Geneweb_export.

      Library geneweb.gwb2ged_lib

      The entry point of this library is the module: Gwb2gedLib.

      Library geneweb.gwd_lib

      The entry point of this library is the module: Gwd_lib.

      Library geneweb.gwdb

      This library exposes the following toplevel modules:

      Library geneweb.gwdb_driver

      The entry point of this library is the module: Gwdb_driver.

      Library geneweb.gwexport_lib

      The entry point of this library is the module: Gwexport.

      Library geneweb.gwu_lib

      The entry point of this library is the module: GwuLib.

      Library geneweb.plugin_gwxjg_lib

      The entry point of this library is the module: Plugin_gwxjg_lib.

      Library geneweb.sosa.mli

      The entry point of this library is the module: Sosa.

      Library geneweb.util

      This library exposes the following toplevel modules:

      Library geneweb.wserver

      The entry point of this library is the module: Wserver.

      \ No newline at end of file diff --git a/static/doc/highlight.pack.js b/static/doc/highlight.pack.js new file mode 100644 index 0000000000..2e55d49154 --- /dev/null +++ b/static/doc/highlight.pack.js @@ -0,0 +1,2 @@ +/*! highlight.js v9.15.8 | BSD3 License | git.io/hljslicense */ +!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs}))}(function(a){var f=[],u=Object.keys,N={},c={},n=/^(no-?highlight|plain|text)$/i,s=/\blang(?:uage)?-([\w-]+)\b/i,t=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,r={case_insensitive:"cI",lexemes:"l",contains:"c",keywords:"k",subLanguage:"sL",className:"cN",begin:"b",beginKeywords:"bK",end:"e",endsWithParent:"eW",illegal:"i",excludeBegin:"eB",excludeEnd:"eE",returnBegin:"rB",returnEnd:"rE",relevance:"r",variants:"v",IDENT_RE:"IR",UNDERSCORE_IDENT_RE:"UIR",NUMBER_RE:"NR",C_NUMBER_RE:"CNR",BINARY_NUMBER_RE:"BNR",RE_STARTERS_RE:"RSR",BACKSLASH_ESCAPE:"BE",APOS_STRING_MODE:"ASM",QUOTE_STRING_MODE:"QSM",PHRASAL_WORDS_MODE:"PWM",C_LINE_COMMENT_MODE:"CLCM",C_BLOCK_COMMENT_MODE:"CBCM",HASH_COMMENT_MODE:"HCM",NUMBER_MODE:"NM",C_NUMBER_MODE:"CNM",BINARY_NUMBER_MODE:"BNM",CSS_NUMBER_MODE:"CSSNM",REGEXP_MODE:"RM",TITLE_MODE:"TM",UNDERSCORE_TITLE_MODE:"UTM",COMMENT:"C",beginRe:"bR",endRe:"eR",illegalRe:"iR",lexemesRe:"lR",terminators:"t",terminator_end:"tE"},b="",h={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};function _(e){return e.replace(/&/g,"&").replace(//g,">")}function E(e){return e.nodeName.toLowerCase()}function v(e,n){var t=e&&e.exec(n);return t&&0===t.index}function l(e){return n.test(e)}function g(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function R(e){var a=[];return function e(n,t){for(var r=n.firstChild;r;r=r.nextSibling)3===r.nodeType?t+=r.nodeValue.length:1===r.nodeType&&(a.push({event:"start",offset:t,node:r}),t=e(r,t),E(r).match(/br|hr|img|input/)||a.push({event:"stop",offset:t,node:r}));return t}(e,0),a}function i(e){if(r&&!e.langApiRestored){for(var n in e.langApiRestored=!0,r)e[n]&&(e[r[n]]=e[n]);(e.c||[]).concat(e.v||[]).forEach(i)}}function m(o){function s(e){return e&&e.source||e}function c(e,n){return new RegExp(s(e),"m"+(o.cI?"i":"")+(n?"g":""))}!function n(t,e){if(!t.compiled){if(t.compiled=!0,t.k=t.k||t.bK,t.k){function r(t,e){o.cI&&(e=e.toLowerCase()),e.split(" ").forEach(function(e){var n=e.split("|");a[n[0]]=[t,n[1]?Number(n[1]):1]})}var a={};"string"==typeof t.k?r("keyword",t.k):u(t.k).forEach(function(e){r(e,t.k[e])}),t.k=a}t.lR=c(t.l||/\w+/,!0),e&&(t.bK&&(t.b="\\b("+t.bK.split(" ").join("|")+")\\b"),t.b||(t.b=/\B|\b/),t.bR=c(t.b),t.endSameAsBegin&&(t.e=t.b),t.e||t.eW||(t.e=/\B|\b/),t.e&&(t.eR=c(t.e)),t.tE=s(t.e)||"",t.eW&&e.tE&&(t.tE+=(t.e?"|":"")+e.tE)),t.i&&(t.iR=c(t.i)),null==t.r&&(t.r=1),t.c||(t.c=[]),t.c=Array.prototype.concat.apply([],t.c.map(function(e){return function(n){return n.v&&!n.cached_variants&&(n.cached_variants=n.v.map(function(e){return g(n,{v:null},e)})),n.cached_variants||n.eW&&[g(n)]||[n]}("self"===e?t:e)})),t.c.forEach(function(e){n(e,t)}),t.starts&&n(t.starts,e);var i=t.c.map(function(e){return e.bK?"\\.?(?:"+e.b+")\\.?":e.b}).concat([t.tE,t.i]).map(s).filter(Boolean);t.t=i.length?c(function(e,n){for(var t=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,r=0,a="",i=0;i')+n+(t?"":b):n}function o(){E+=null!=l.sL?function(){var e="string"==typeof l.sL;if(e&&!N[l.sL])return _(g);var n=e?C(l.sL,g,!0,f[l.sL]):O(g,l.sL.length?l.sL:void 0);return 0")+'"');return g+=n,n.length||1}var s=B(e);if(!s)throw new Error('Unknown language: "'+e+'"');m(s);var a,l=t||s,f={},E="";for(a=l;a!==s;a=a.parent)a.cN&&(E=c(a.cN,"",!0)+E);var g="",R=0;try{for(var d,p,M=0;l.t.lastIndex=M,d=l.t.exec(n);)p=r(n.substring(M,d.index),d[0]),M=d.index+p;for(r(n.substr(M)),a=l;a.parent;a=a.parent)a.cN&&(E+=b);return{r:R,value:E,language:e,top:l}}catch(e){if(e.message&&-1!==e.message.indexOf("Illegal"))return{r:0,value:_(n)};throw e}}function O(t,e){e=e||h.languages||u(N);var r={r:0,value:_(t)},a=r;return e.filter(B).filter(M).forEach(function(e){var n=C(e,t,!1);n.language=e,n.r>a.r&&(a=n),n.r>r.r&&(a=r,r=n)}),a.language&&(r.second_best=a),r}function d(e){return h.tabReplace||h.useBR?e.replace(t,function(e,n){return h.useBR&&"\n"===e?"
      ":h.tabReplace?n.replace(/\t/g,h.tabReplace):""}):e}function o(e){var n,t,r,a,i,o=function(e){var n,t,r,a,i=e.className+" ";if(i+=e.parentNode?e.parentNode.className:"",t=s.exec(i))return B(t[1])?t[1]:"no-highlight";for(n=0,r=(i=i.split(/\s+/)).length;n/g,"\n"):n=e,i=n.textContent,r=o?C(o,i,!0):O(i),(t=R(n)).length&&((a=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=r.value,r.value=function(e,n,t){var r=0,a="",i=[];function o(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset"}function u(e){a+=""}function s(e){("start"===e.event?c:u)(e.node)}for(;e.length||n.length;){var l=o();if(a+=_(t.substring(r,l[0].offset)),r=l[0].offset,l===e){for(i.reverse().forEach(u);s(l.splice(0,1)[0]),(l=o())===e&&l.length&&l[0].offset===r;);i.reverse().forEach(c)}else"start"===l[0].event?i.push(l[0].node):i.pop(),s(l.splice(0,1)[0])}return a+_(t.substr(r))}(t,R(a),i)),r.value=d(r.value),e.innerHTML=r.value,e.className=function(e,n,t){var r=n?c[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}(e.className,o,r.language),e.result={language:r.language,re:r.r},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.r}))}function p(){if(!p.called){p.called=!0;var e=document.querySelectorAll("pre code");f.forEach.call(e,o)}}function B(e){return e=(e||"").toLowerCase(),N[e]||N[c[e]]}function M(e){var n=B(e);return n&&!n.disableAutodetect}return a.highlight=C,a.highlightAuto=O,a.fixMarkup=d,a.highlightBlock=o,a.configure=function(e){h=g(h,e)},a.initHighlighting=p,a.initHighlightingOnLoad=function(){addEventListener("DOMContentLoaded",p,!1),addEventListener("load",p,!1)},a.registerLanguage=function(n,e){var t=N[n]=e(a);i(t),t.aliases&&t.aliases.forEach(function(e){c[e]=n})},a.listLanguages=function(){return u(N)},a.getLanguage=B,a.autoDetection=M,a.inherit=g,a.IR=a.IDENT_RE="[a-zA-Z]\\w*",a.UIR=a.UNDERSCORE_IDENT_RE="[a-zA-Z_]\\w*",a.NR=a.NUMBER_RE="\\b\\d+(\\.\\d+)?",a.CNR=a.C_NUMBER_RE="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",a.BNR=a.BINARY_NUMBER_RE="\\b(0b[01]+)",a.RSR=a.RE_STARTERS_RE="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",a.BE=a.BACKSLASH_ESCAPE={b:"\\\\[\\s\\S]",r:0},a.ASM=a.APOS_STRING_MODE={cN:"string",b:"'",e:"'",i:"\\n",c:[a.BE]},a.QSM=a.QUOTE_STRING_MODE={cN:"string",b:'"',e:'"',i:"\\n",c:[a.BE]},a.PWM=a.PHRASAL_WORDS_MODE={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},a.C=a.COMMENT=function(e,n,t){var r=a.inherit({cN:"comment",b:e,e:n,c:[]},t||{});return r.c.push(a.PWM),r.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),r},a.CLCM=a.C_LINE_COMMENT_MODE=a.C("//","$"),a.CBCM=a.C_BLOCK_COMMENT_MODE=a.C("/\\*","\\*/"),a.HCM=a.HASH_COMMENT_MODE=a.C("#","$"),a.NM=a.NUMBER_MODE={cN:"number",b:a.NR,r:0},a.CNM=a.C_NUMBER_MODE={cN:"number",b:a.CNR,r:0},a.BNM=a.BINARY_NUMBER_MODE={cN:"number",b:a.BNR,r:0},a.CSSNM=a.CSS_NUMBER_MODE={cN:"number",b:a.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},a.RM=a.REGEXP_MODE={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[a.BE,{b:/\[/,e:/\]/,r:0,c:[a.BE]}]},a.TM=a.TITLE_MODE={cN:"title",b:a.IR,r:0},a.UTM=a.UNDERSCORE_TITLE_MODE={cN:"title",b:a.UIR,r:0},a.METHOD_GUARD={b:"\\.\\s*"+a.UIR,r:0},a});hljs.registerLanguage("ocaml",function(e){return{aliases:["ml"],k:{keyword:"and as assert asr begin class constraint do done downto else end exception external for fun function functor if in include inherit! inherit initializer land lazy let lor lsl lsr lxor match method!|10 method mod module mutable new object of open! open or private rec sig struct then to try type val! val virtual when while with parser value",built_in:"array bool bytes char exn|5 float int int32 int64 list lazy_t|5 nativeint|5 string unit in_channel out_channel ref",literal:"true false"},i:/\/\/|>>/,l:"[a-z_]\\w*!?",c:[{cN:"literal",b:"\\[(\\|\\|)?\\]|\\(\\)",r:0},e.C("\\(\\*","\\*\\)",{c:["self"]}),{cN:"symbol",b:"'[A-Za-z_](?!')[\\w']*"},{cN:"type",b:"`[A-Z][\\w']*"},{cN:"type",b:"\\b[A-Z][\\w']*",r:0},{b:"[a-z_]\\w*'[\\w']*",r:0},e.inherit(e.ASM,{cN:"string",r:0}),e.inherit(e.QSM,{i:null}),{cN:"number",b:"\\b(0[xX][a-fA-F0-9_]+[Lln]?|0[oO][0-7_]+[Lln]?|0[bB][01_]+[Lln]?|[0-9][0-9_]*([Lln]|(\\.[0-9_]*)?([eE][-+]?[0-9_]+)?)?)",r:0},{b:/[-=]>/}]}});hljs.registerLanguage("reasonml",function(r){var e="~?[a-z$_][0-9a-zA-Z$_]*",a="`?[A-Z$_][0-9a-zA-Z$_]*",c="("+["||","&&","++","**","+.","*","/","*.","/.","...","|>"].map(function(r){return r.split("").map(function(r){return"\\"+r}).join("")}).join("|")+"|==|===)",n="\\s+"+c+"\\s+",t={keyword:"and as asr assert begin class constraint do done downto else end exception externalfor fun function functor if in include inherit initializerland lazy let lor lsl lsr lxor match method mod module mutable new nonrecobject of open or private rec sig struct then to try type val virtual when while with",built_in:"array bool bytes char exn|5 float int int32 int64 list lazy_t|5 nativeint|5 ref string unit ",literal:"true false"},i="\\b(0[xX][a-fA-F0-9_]+[Lln]?|0[oO][0-7_]+[Lln]?|0[bB][01_]+[Lln]?|[0-9][0-9_]*([Lln]|(\\.[0-9_]*)?([eE][-+]?[0-9_]+)?)?)",s={cN:"number",r:0,v:[{b:i},{b:"\\(\\-"+i+"\\)"}]},b={cN:"operator",r:0,b:c},o=[{cN:"identifier",r:0,b:e},b,s],l=[r.QSM,b,{cN:"module",b:"\\b"+a,rB:!0,e:".",c:[{cN:"identifier",b:a,r:0}]}],u=[{cN:"module",b:"\\b"+a,rB:!0,e:".",r:0,c:[{cN:"identifier",b:a,r:0}]}],_={cN:"function",r:0,k:t,v:[{b:"\\s(\\(\\.?.*?\\)|"+e+")\\s*=>",e:"\\s*=>",rB:!0,r:0,c:[{cN:"params",v:[{b:e},{b:"~?[a-z$_][0-9a-zA-Z$_]*(s*:s*[a-z$_][0-9a-z$_]*((s*('?[a-z$_][0-9a-z$_]*s*(,'?[a-z$_][0-9a-z$_]*)*)?s*))?)?(s*:s*[a-z$_][0-9a-z$_]*((s*('?[a-z$_][0-9a-z$_]*s*(,'?[a-z$_][0-9a-z$_]*)*)?s*))?)?"},{b:/\(\s*\)/}]}]},{b:"\\s\\(\\.?[^;\\|]*\\)\\s*=>",e:"\\s=>",rB:!0,r:0,c:[{cN:"params",r:0,v:[{b:e,e:"(,|\\n|\\))",r:0,c:[b,{cN:"typing",b:":",e:"(,|\\n)",rB:!0,r:0,c:u}]}]}]},{b:"\\(\\.\\s"+e+"\\)\\s*=>"}]};l.push(_);var N={cN:"constructor",b:a+"\\(",e:"\\)",i:"\\n",k:t,c:[r.QSM,b,{cN:"params",b:"\\b"+e}]},d={cN:"pattern-match",b:"\\|",rB:!0,k:t,e:"=>",r:0,c:[N,b,{r:0,cN:"constructor",b:a}]},z={cN:"module-access",k:t,rB:!0,v:[{b:"\\b("+a+"\\.)+"+e},{b:"\\b("+a+"\\.)+\\(",e:"\\)",rB:!0,c:[_,{b:"\\(",e:"\\)",skip:!0}].concat(l)},{b:"\\b("+a+"\\.)+{",e:"}"}],c:l};return u.push(z),{aliases:["re"],k:t,i:"(:\\-|:=|\\${|\\+=)",c:[r.C("/\\*","\\*/",{i:"^(\\#,\\/\\/)"}),{cN:"character",b:"'(\\\\[^']+|[^'])'",i:"\\n",r:0},r.QSM,{cN:"literal",b:"\\(\\)",r:0},{cN:"literal",b:"\\[\\|",e:"\\|\\]",r:0,c:o},{cN:"literal",b:"\\[",e:"\\]",r:0,c:o},N,{cN:"operator",b:n,i:"\\-\\->",r:0},s,r.CLCM,d,_,{cN:"module-def",b:"\\bmodule\\s+"+e+"\\s+"+a+"\\s+=\\s+{",e:"}",rB:!0,k:t,r:0,c:[{cN:"module",r:0,b:a},{b:"{",e:"}",skip:!0}].concat(l)},z]}}); \ No newline at end of file diff --git a/static/doc/index.html b/static/doc/index.html new file mode 100644 index 0000000000..d9a7c8616d --- /dev/null +++ b/static/doc/index.html @@ -0,0 +1,19 @@ + + + + index + + + + + +
      +
      +

      OCaml package documentation

      +
        +
      1. geneweb
      2. +
      +
      +
      + + \ No newline at end of file diff --git a/static/doc/odoc.css b/static/doc/odoc.css new file mode 100644 index 0000000000..c5d2acb024 --- /dev/null +++ b/static/doc/odoc.css @@ -0,0 +1,782 @@ +@charset "UTF-8"; +/* Copyright (c) 2016 The odoc contributors. All rights reserved. + Distributed under the ISC license, see terms at the end of the file. + odoc 2.0.2 */ + +/* Fonts */ +@import url('https://fonts.googleapis.com/css?family=Fira+Mono:400,500'); +@import url('https://fonts.googleapis.com/css?family=Noticia+Text:400,400i,700'); +@import url('https://fonts.googleapis.com/css?family=Fira+Sans:400,400i,500,500i,600,600i,700,700i'); + +:root, +.light:root { + --main-background: #FFFFFF; + + --color: #333333; + --link-color: #2C94BD; + --anchor-hover: #555; + --anchor-color: #d5d5d5; + --xref-shadow: #cc6666; + --header-shadow: #ddd; + --by-name-version-color: #aaa; + --by-name-nav-link-color: #222; + --target-background: rgba(187, 239, 253, 0.3); + --target-shadow: rgba(187, 239, 253, 0.8); + --pre-border-color: #eee; + --code-background: #f6f8fa; + + --li-code-background: #f6f8fa; + --li-code-color: #0d2b3e; + --toc-color: #1F2D3D; + --toc-before-color: #777; + --toc-background: #f6f8fa; + --toc-list-border: #ccc; + + --spec-summary-border-color: #5c9cf5; + --spec-summary-background: var(--code-background); + --spec-summary-hover-background: #ebeff2; + --spec-details-after-background: rgba(0, 4, 15, 0.05); + --spec-details-after-shadow: rgba(204, 204, 204, 0.53); +} + +.dark:root { + --main-background: #202020; + --code-background: #222; + --line-numbers-background: rgba(0, 0, 0, 0.125); + --navbar-background: #202020; + + --color: #bebebe; + --dirname-color: #666; + --underline-color: #444; + --visited-color: #002800; + --visited-number-color: #252; + --unvisited-color: #380000; + --unvisited-number-color: #622; + --somevisited-color: #303000; + --highlight-color: #303e3f; + --line-number-color: rgba(230, 230, 230, 0.3); + --unvisited-margin-color: #622; + --border: #333; + --navbar-border: #333; + --code-color: #ccc; + + --li-code-background: #373737; + --li-code-color: #999; + --toc-color: #777; + --toc-background: #252525; + + --hljs-link: #999; + --hljs-keyword: #cda869; + --hljs-regexp: #f9ee98; + --hljs-title: #dcdcaa; + --hljs-type: #ac885b; + --hljs-meta: #82aaff; + --hljs-variable: #cf6a4c; +} + +@media (prefers-color-scheme: dark) { + :root { + --main-background: #202020; + --code-background: #333; + --line-numbers-background: rgba(0, 0, 0, 0.125); + --navbar-background: #202020; + + --meter-unvisited-color: #622; + --meter-visited-color: #252; + --meter-separator-color: black; + + --color: #bebebe; + --dirname-color: #666; + --underline-color: #444; + --visited-color: #002800; + --visited-number-color: #252; + --unvisited-color: #380000; + --unvisited-number-color: #622; + --somevisited-color: #303000; + --highlight-color: #303e3f; + --line-number-color: rgba(230, 230, 230, 0.3); + --unvisited-margin-color: #622; + --border: #333; + --navbar-border: #333; + --code-color: #ccc; + --by-name-nav-link-color: var(--color); + + --li-code-background: #373737; + --li-code-color: #999; + --toc-color: #777; + --toc-before-color: #777; + --toc-background: #252525; + --toc-list-border: #ccc; + --spec-summary-hover-background: #ebeff2; + --spec-details-after-background: rgba(0, 4, 15, 0.05); + --spec-details-after-shadow: rgba(204, 204, 204, 0.53); + + --hljs-link: #999; + --hljs-keyword: #cda869; + --hljs-regexp: #f9ee98; + --hljs-title: #dcdcaa; + --hljs-type: #ac885b; + --hljs-meta: #82aaff; + --hljs-variable: #cf6a4c; + } +} + +/* Reset a few things. */ + +html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font: inherit; + vertical-align: baseline; + +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +*, *:before, *:after { + box-sizing: border-box; +} + +html { + font-size: 15px; +} + +body { + text-align: left; + background: #FFFFFF; + color: var(--color); + background-color: var(--main-background); +} + +body { + max-width: 90ex; + margin-left: calc(10vw + 20ex); + margin-right: 4ex; + margin-top: 20px; + margin-bottom: 50px; + font-family: "Noticia Text", Georgia, serif; + line-height: 1.5; +} + +header { + margin-bottom: 30px; +} + +nav { + font-family: "Fira Sans", Helvetica, Arial, sans-serif; +} + +/* Basic markup elements */ + +b, strong { + font-weight: bold; +} + +i { + font-style: italic; +} + +em, i em.odd{ + font-style: italic; +} + +em.odd, i em { + font-style: normal; +} + +sup { + vertical-align: super; +} + +sub { + vertical-align: sub; +} + +sup, sub { + font-size: 12px; + line-height: 0; + margin-left: 0.2ex; +} + +pre { + margin-top: 0.8em; + margin-bottom: 1.2em; +} + +p, ul, ol { + margin-top: 0.5em; + margin-bottom: 1em; +} +ul, ol { + list-style-position: outside +} + +ul>li { + margin-left: 22px; +} + +ol>li { + margin-left: 27.2px; +} + +li>*:first-child { + margin-top: 0 +} + +/* Text alignements, this should be forbidden. */ + +.left { + text-align: left; +} + +.right { + text-align: right; +} + +.center { + text-align: center; +} + +/* Links and anchors */ + +a { + text-decoration: none; + color: var(--link-color); +} + +a:hover { + box-shadow: 0 1px 0 0 var(--link-color); +} + +/* Linked highlight */ +*:target { + background-color: var(--target-background) !important; + box-shadow: 0 0px 0 1px var(--target-shadow) !important; + border-radius: 1px; +} + +*:hover > a.anchor { + visibility: visible; +} + +a.anchor:before { + content: "#"; +} + +a.anchor:hover { + box-shadow: none; + text-decoration: none; + color: var(--anchor-hover); +} + +a.anchor { + visibility: hidden; + position: absolute; + /* top: 0px; */ + /* margin-left: -3ex; */ + margin-left: -1.3em; + font-weight: normal; + font-style: normal; + padding-right: 0.4em; + padding-left: 0.4em; + /* To remain selectable */ + color: var(--anchor-color); +} + +.spec > a.anchor { + margin-left: -2.3em; + padding-right: 0.9em; +} + +.xref-unresolved { + color: #2C94BD; +} +.xref-unresolved:hover { + box-shadow: 0 1px 0 0 var(--xref-shadow); +} + +/* Section and document divisions. + Until at least 4.03 many of the modules of the stdlib start at .h7, + we restart the sequence there like h2 */ + +h1, h2, h3, h4, h5, h6, .h7, .h8, .h9, .h10 { + font-family: "Fira Sans", Helvetica, Arial, sans-serif; + font-weight: 400; + margin: 0.5em 0 0.5em 0; + padding-top: 0.1em; + line-height: 1.2; + overflow-wrap: break-word; +} + +h1 { + font-weight: 500; + font-size: 2.441em; + margin-top: 1.214em; +} + +h1 { + font-weight: 500; + font-size: 1.953em; + box-shadow: 0 1px 0 0 var(--header-shadow); +} + +h2 { + font-size: 1.563em; +} + +h3 { + font-size: 1.25em; +} + +small, .font_small { + font-size: 0.8em; +} + +h1 code, h1 tt { + font-size: inherit; + font-weight: inherit; +} + +h2 code, h2 tt { + font-size: inherit; + font-weight: inherit; +} + +h3 code, h3 tt { + font-size: inherit; + font-weight: inherit; +} + +h3 code, h3 tt { + font-size: inherit; + font-weight: inherit; +} + +h4 { + font-size: 1.12em; +} + +/* Comment delimiters, hidden but accessible to screen readers and + selected for copy/pasting */ + +/* Taken from bootstrap */ +/* See also https://stackoverflow.com/a/27769435/4220738 */ +.comment-delim { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +/* Preformatted and code */ + +tt, code, pre { + font-family: "Fira Mono", courier; + font-weight: 400; +} + +pre { + padding: 0.1em; + border: 1px solid var(--pre-border-color); + border-radius: 5px; + overflow-x: auto; +} + +p code, +li code { + background-color: var(--li-code-background); + color: var(--li-code-color); + border-radius: 3px; + padding: 0 0.3ex; +} + +p a > code { + color: var(--link-color); +} + +/* Code blocks (e.g. Examples) */ + +pre code { + font-size: 0.893rem; +} + +/* Code lexemes */ + +.keyword { + font-weight: 500; +} + +.arrow { white-space: nowrap } + +/* Module member specification */ + +.spec { + background-color: var(--spec-summary-background); + border-radius: 3px; + border-left: 4px solid var(--spec-summary-border-color); + border-right: 5px solid transparent; + padding: 0.35em 0.5em; +} + +div.spec, .def-doc { + margin-bottom: 20px; +} + +.spec.type .variant { + margin-left: 2ch; +} +.spec.type .variant p { + margin: 0; + font-style: italic; +} +.spec.type .record { + margin-left: 2ch; +} +.spec.type .record p { + margin: 0; + font-style: italic; +} + +div.def { + margin-top: 0; + text-indent: -2ex; + padding-left: 2ex; +} + +div.def+div.def-doc { + margin-left: 1ex; + margin-top: 2.5px +} + +div.def-doc>*:first-child { + margin-top: 0; +} + +/* Collapsible inlined include and module */ + +.odoc-include details { + position: relative; +} + +.odoc-include details:after { + z-index: -100; + display: block; + content: " "; + position: absolute; + border-radius: 0 1ex 1ex 0; + right: -20px; + top: 1px; + bottom: 1px; + width: 15px; + background: var(--spec-details-after-background, rgba(0, 4, 15, 0.05)); + box-shadow: 0 0px 0 1px var(--spec-details-after-shadow, rgba(204, 204, 204, 0.53)); +} + +.odoc-include summary { + position: relative; + margin-bottom: 20px; + cursor: pointer; + outline: none; +} + +.odoc-include summary:hover { + background-color: var(--spec-summary-hover-background); +} + +/* FIXME: Does not work in Firefox. */ +.odoc-include summary::-webkit-details-marker { + color: #888; + transform: scaleX(-1); + position: absolute; + top: calc(50% - 5px); + height: 11px; + right: -29px; +} + +/* Records and variants FIXME */ + +div.def table { + text-indent: 0em; + padding: 0; + margin-left: -2ex; +} + +td.def { + padding-left: 2ex; +} + +td.def-doc *:first-child { + margin-top: 0em; +} + +/* Lists of @tags */ + +.at-tags { list-style-type: none; margin-left: -3ex; } +.at-tags li { padding-left: 3ex; text-indent: -3ex; } +.at-tags .at-tag { text-transform: capitalize } + +/* Lists of modules */ + +.modules { list-style-type: none; margin-left: -3ex; } +.modules li { padding-left: 3ex; text-indent: -3ex; margin-top: 5px } +.modules .synopsis { padding-left: 1ch; } + +/* Odig package index */ + +.packages { list-style-type: none; margin-left: -3ex; } +.packages li { padding-left: 3ex; text-indent: -3ex } +.packages li a.anchor { padding-right: 0.5ch; padding-left: 3ch; } +.packages .version { font-size: 10px; color: var(--by-name-version-color); } +.packages .synopsis { padding-left: 1ch } + +.by-name nav a { + text-transform: uppercase; + font-size: 18px; + margin-right: 1ex; + color: var(--by-name-nav-link-color,); + display: inline-block; +} + +.by-tag nav a { + margin-right: 1ex; + color: var(--by-name-nav-link-color); + display: inline-block; +} + +.by-tag ol { list-style-type: none; } +.by-tag ol.tags li { margin-left: 1ch; display: inline-block } +.by-tag td:first-child { text-transform: uppercase; } + +/* Odig package page */ + +.package nav { + display: inline; + font-size: 14px; + font-weight: normal; +} + +.package .version { + font-size: 14px; +} + +.package.info { + margin: 0; +} + +.package.info td:first-child { + font-style: italic; + padding-right: 2ex; +} + +.package.info ul { + list-style-type: none; + display: inline; + margin: 0; +} + +.package.info li { + display: inline-block; + margin: 0; + margin-right: 1ex; +} + +#info-authors li, #info-maintainers li { + display: block; +} + +/* Sidebar and TOC */ + +.odoc-toc:before { + display: block; + content: "Contents"; + text-transform: uppercase; + font-size: 1em; + margin: 1.414em 0 0.5em; + font-weight: 500; + color: var(--toc-before-color); + line-height: 1.2; +} + +.odoc-toc { + position: fixed; + top: 0px; + bottom: 0px; + left: 0px; + max-width: 30ex; + min-width: 26ex; + width: 20%; + background: var(--toc-background); + overflow: auto; + color: var(--toc-color); + padding-left: 2ex; + padding-right: 2ex; +} + +.odoc-toc ul li a { + font-family: "Fira Sans", sans-serif; + font-size: 0.95em; + color: var(--color); + font-weight: 400; + line-height: 1.6em; + display: block; +} + +.odoc-toc ul li a:hover { + box-shadow: none; + text-decoration: underline; +} + +/* First level titles */ + +.odoc-toc>ul>li>a { + font-weight: 500; +} + +.odoc-toc li ul { + margin: 0px; +} + +.odoc-toc ul { + list-style-type: none; +} + +.odoc-toc ul li { + margin: 0; +} +.odoc-toc>ul>li { + margin-bottom: 0.3em; +} + +.odoc-toc ul li li { + border-left: 1px solid var(--toc-list-border); + margin-left: 5px; + padding-left: 12px; +} + +/* Mobile adjustements. */ + +@media only screen and (max-width: 95ex) { + .odoc-content { + margin: auto; + padding: 2em; + } + .odoc-toc { + position: static; + width: auto; + min-width: unset; + max-width: unset; + border: none; + padding: 0.2em 1em; + border-radius: 5px; + } +} + +/* Print adjustements. */ + +@media print { + body { + color: black; + background: white; + } + body nav:first-child { + visibility: hidden; + } +} + +/* Syntax highlighting (based on github-gist) */ + +.hljs { + display: block; + background: var(--code-background); + padding: 0.5em; + color: var(--color); + overflow-x: auto; +} + +.hljs-comment, +.hljs-meta { + color: #969896; +} + +.hljs-string, +.hljs-variable, +.hljs-template-variable, +.hljs-strong, +.hljs-emphasis, +.hljs-quote { + color: #df5000; +} + +.hljs-keyword, +.hljs-selector-tag { + color: #a71d5d; +} + +.hljs-type, +.hljs-class .hljs-title { + color: #458; + font-weight: 500; +} + +.hljs-literal, +.hljs-symbol, +.hljs-bullet, +.hljs-attribute { + color: #0086b3; +} + +.hljs-section, +.hljs-name { + color: #63a35c; +} + +.hljs-tag { + color: #333333; +} + +.hljs-attr, +.hljs-selector-id, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #795da3; +} + +.hljs-addition { + color: #55a532; + background-color: #eaffea; +} + +.hljs-deletion { + color: #bd2c00; + background-color: #ffecec; +} + +.hljs-link { + text-decoration: underline; +} + +/*--------------------------------------------------------------------------- + Copyright (c) 2016 The odoc contributors + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + ---------------------------------------------------------------------------*/ diff --git a/static/html/.buildinfo b/static/html/.buildinfo new file mode 100644 index 0000000000..2b98416203 --- /dev/null +++ b/static/html/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 42e050ea871d04cb1c2c51413627c51c +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/static/html/_images/diagram.png b/static/html/_images/diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..4f171ed4ce020ddaa465d3922c38bf63421ddbeb GIT binary patch literal 118635 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

      8QlmG~oD=X-X-`0uoWLO#t|Z#7~rt;d7NWEa#+ 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

    • 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%0A9qd- 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

      (|=yul&Inunk`=H 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

      g}#RLml0-b@DZT z?y&3mVIaC~C`@dV>56LIG6IdoxXC0%Azt{l)q-S!KFDlq^cMl)aKegP3G{3j0tX*| zym{oWo4MnLZ;|J>%MPCzG$UZuX3*l@CpFXi>QjqtJ>rPCR6G zPJlY>v|VNek*fyK%*r0j_Tb8Kdo#fe;6k)<$thJmR7=uXTO_FBh^9|koY$7pPrqN4 zllHEer7mpKz}!2f^uy$%`)fOw7u}xVTOWV7|irv=`sR-bK49|v<$-5qCsJlE%#=gxE+i1p_Sv0UR z>z02VCZqk;=jrA9KhNLK$e5sJ^TRmoYC4MHUqUIerc;jp3%5PjF|NAQFwLtzY}XG+ z=;!I&@5brpXGfS0`rv(BRJ`O=7^M?OQ>6Av>V16xiU0kir1|5k4|Vu&7+NEKmF+Xg zKN~kDhfRJ$gWgEQxm&6N$9^>Bj;`fPI7y1y9-ogBMJt2w=mn3ip7oqGq%^K(USl?6 z6xm@Z2Z7(R*)#7qd!nx3CsfgTVgJGdz+)#DYCau5G9>WeJ2cw+rY&)|&jN;nP5xA^ zX3yl*Qw~Wt+uThKr=OJMqICc^3&1`w9SDH8I0uG;)q6+M%>|ALQ4{d55gQ`JVLyqKkahU;-Zjo zk~zDM09W;zh6QS({(`|dJJTtfbXSoIef8atEXzeUhz^Iv5JGc40cVHyp%hCi4?_q3 zYy~s+lYSs(DGKywIjnX>iv9*NHQ?puRfd0Y?7~R8L1KAu6)OlI8$X%k z?m$bJGwMF7816?n@nuMYXqH|)?$`S(XH;jFQfa6luu<>X5?%z4zW`!rk<8$5rjw7k z*ryO#*TO7_$=x5 z)``qC^%@{UJ9M^^4S`9zy0wk#2=%GT} z%CJpB%ahk(YTVscO?LxG^ zA)V4lBQ@xVN;}f|C`hMD*ND;r(nt=1bV~Po2A<#ZeQUk%TIe5e-zWFI&)(O*_C6#* z9Q~k79rYSat*W(Jkb~i2FdtSgv{*^kjnUp3N5F#k5Xx5YXv3WRdTsk)#T`aUs+X}h zYR6Uz^(YIa9U83FyZJKW}X4sAFe?PuJdUG7f9X~#OCt<`Bz6n^~DpNj2Xl2}@~ zq}PZy4|J3=*XBaOQ|~()^!7~Gcj69(gqlSQ>p61^Yts=`o4HLc=!Vii!BLK~olEc}O=8p#!>5p&i~vaut~ z$;qx@{8g+K>9UOg`m7BmH3(C)zuoBDr9qg$_XioRr=@02!Pp#%H}^P&2xbsT1QX){ z)KqVf^RmBV=UJvIAMe4(U%(Dd*#aULx(UImTpJE~>WOBG!z|*`f}GD2%qWRm8UPF7 z%2Xmh5g*J+AQqykaw3B@qa~D>h|xG*Cy@7!>LXzY z?$M&KW-5lJwR_90F%r@1Gmt2QJ570o{$)W4nn~K!xxNmrx-S>yC~HKa@;rIi?AW$|rA5p0 z_EAcP)}WM@kEa^eC#!`_7W`@HyN@JGxvHA;iTfs05691uZw3JuD7WcC!b4`Z6?Ml* z3wWVU4v0=IS7C7e6lBWdpNfnt(2U7`H8KeYCR^c;n_Ev?WPWc#i`kGf1PiBJ+npTvCS~rXEg`J-Fik$Kz1NP=AXH>~7qA$guBD!?^wt2q^NqJ=^BCa+73pvP zh}U+?;oCQANarr~89vjt5%_p{R%dvsoW5mC+#J-imSXf-RC3)+~-NZTarQ&T9Aj_u^)$>H~uZ zogaGKIYxgjvJe}pk+toQra3-%dqn*ydz2 z=TzoRGy7?az+NCv>v!9wi-g)dXu+KlHvPtS2@vubZbcnrpDDrpXy~h%XT_|mp4hQ$ z4UC76$aXc>BtlO7k)&Dl|3iD9X>@ISy8=GlCKh-hzyuq(IiLL6}F zAs2cJAre%%QlVi#adYFa746V6k?Elbp|g{F5nTK`(e0%HUs{}x;lW| z3v)O0D0>HI4lARSuVy6Lyk&0_(TpXBcGL){!X3vsyXDM)4ADs#JBSIXzMcY%WzYCGEMizH*?h9p6VeFxGO9HFb;0 zVK*;R)-5PhZ@$jGn&Z-6K|*N`*wJeZHa$Z1%DS$_I!one0_YON-=7wbDNn{1bF9b~u9~Hhj`JknHVoY+%Req=Z`WW)3(#^-S$r-6;E)l+W%C26> z;oNppv=M`EUPfC@#u*NAYyaH0M;`p<&PCo?xfsoj843`=O%T#}muy^Vi|?;g`P@kbgJZ&UdDXGI z!`#r0igrq$jj&t@iy@gBl8Mjg*cyboyRI|l*BxCer}gJtz6&kD-osJ_mS@PlC6t^2 zx8-9{EbaZu%Mn>%wP70iMR9nC?d{*|v$3bxEgyDSZ#H0!U9W+TH>LOmM{MEDQK8B0 zG8d6!`!Q5D3Ji?Zs&DUbqdn00|0I?BpYx!Nfv@z5>cHK%nv$yRSBbwP!nO0h)IjiC9JBbeO500X98S7 z7JOXLRzbW++H=#_h%WZCQ8vnL-jv8yEONcmms`H5?hk?T_@I_+HiMx`pWT<(Nn-GD>QhrY5!xSTI7ZtVp3XnOY) zldEH6N7h<$+A-0c6y|Z)pM4IcXPbS8U0Q}Vw?Qmh5MY$ASw=F*kD~yMJ3hY*ivQdV*(j@?rmWXrll5l=Z0KZI2K( z4_|Xxdc|AYYH0M*_8?yAnWpzfD$ZgEZN>?IxsNF4g%r!JAT8owcr}eEv0v*CE!`?~ zq}hOk>AxWj^CG-RvI{*(ni%QNZGG-~1k(Vh(jO+BQl43LMGjlpunR6U7lJsvI=*() zt^!0VR{yTE2AdMO;PTyqzAo)yJW%)ShMKk6o)${!v%q&kAuXl*1IH19)1}Ix-=-qEPV@O1Oc_Z9bYLr z^(BIyJiY56~c)5tWQ0C?`%X)v6e? zi>IDi#!U~<<_eL~!CGNEp)na3rf+Iw!X76Z8T9keAV;Z@6~9W1&$A*8)$HLHhL%4J zI}N(l68uUNX^^aJhVN5mS}R|?nMoQfiTi;iA#$|nYN+_p9bb}jbMj9AHUam!Vz5Jt zFn;uRpo;Y>DLq&c3^YQ-QYhZpT_P=F_0@0Fr~>g{Qu7&;W3Uk9}I#3i9;Ys%nn*7)2Bda2Nc)_x~A+%ObsLf$zVteP{Y2@Zk_O^M2Ygh0;0s+)$& zd*q7Mn>BJBXL2DNe|RCE^}>ezdviSWQbe~_pEN&s>B8@V({OWKp{OI74IS!mD0}d* z;rUMD(%eEoJ8O*m26@Ai@IDKjMQn@C2@v6Vn`6JN0SZ)<_0OHo&@dy6U+X!B4^mws zCjUG%h)d4@jzLV9_SIr&CfpUBZfmD&CXMz}RoAfu-G&$SWX zspeDrOqELO?#R2=n<@%7g-@pvTR$(){m9Tq&Cx5zGEtWE^{Zy<=sUj3ps!t2i#+{? zzfJdBeM9`V9f$<$E@HP#cI^`lp+M`26m zcO*+8Hp-%{nGR{*OHm-Wqoe1IS{Scw_hc!m|)GCzmcD93(F007E883c1R_aPnB4;yD&5*o>jG1tu z#@b|R!f3-7oDg!;1i$m;x zT*~2cw$2hI5L2y1EDv@Q(nJBOr_jqF3jf*b8^QE!Y`=(t_@!wrM1*^T+vD510S@1n{S^>6D;1CPCT_@`mnU-C zYPOr;`Zwu)Lq+7@VZ>(Z;_W8iKe2E>3LbX>JZ&yfq_J9l>LmH0-gO(fGc12>58>Ix zKWvJ+AztWU)Z^@@%_Ux@$Q)^}E)X?9rcMcMeH@z`BpN>1&Sm{f)cJw+PUT9`q4(<4 zhuDjMJUDE8*N8ped^r5Fsn|p%n+&aYWL+b1A2NK}A| zJ~<}wP!aXDjCk5Jq>ae>HbJBi`2r>PP?I8rGotZ5z;r1uVeSH&bTy;;Z3;!hwJgXC z)O&3m*ZjWPS`-zPT%PJ^f;z2YzIwNIQ7=ywr|tW>);4=H>~uvnIv-HUDumP&tC(H0 zCzzFu{+XZ^+bMI`e!rL?NC!1mH&*Hb-cONS12CysotSKW3QHrn;7EhXrRpRt! z0swD@%<>WrN9$1VJP%dLC+s!1xc%#hY3rG#j-uge>%;ULIJ{vxDs!3K9_y9;jjX&L z8-j>%&1xFSBp+w*v%-csRcflrGOQ{*aqI=xzd;M!KF6 zK93UAe?`TiU!QQW-TTR7k3EAUuQDq!ZAdjT7nnFHy7HM&@3BU0V%$*YGw%25pW;-L zYs6>75rtK{_SA*LWZZWao+`FZaHGuoD@Y3(oW0oV3CFnh{o^N1o=3ZI*Di?EQ;bl$ za)xq3`E;OscK`g2;nFv2UniN&y32QUP>UK!*a(BN#>s7P9c%@TV)k0d`{NZDnxTc! z>4oMRys_^2Nv2A^{fjuh`X+EoS%;6Qxz>@b?SAGaRxc#R%KEPt%@!ki6)``zH($7( zD~)HgZpYG^XTwU^ATX{_FF&iM`zge8rGSy&^vhBuGqX#&H(#`qY{mwome=~p^!Yxc z)0yd&vTn=fFz+_n8_3AZl4)k4YH8Y#4_w_yG%}pnv z4+)*ca}Ix{N)|eLkHG9f(IN(z2EjIAg2ULcxgsQS4gy>8VAi*S-D;|@*xpp>6QvK9 zdsLO;IWAMUg*%LY?fd6m6Vc}S)v!`2FWLlFe)x6ny861rsOXsU*?5t@pw1I=x!na5 z+1SenVP%9XVaDsoPTwMPO1Y-+pSvolF%QuLPns!ZUa*p$#{B$g&#p+F&VrV2Ieu%% zb;D$^Hu~oio>D;&ZP4oZ9bo2=7L{K2^*!6Olas}`SzI(nr9WBPIOgJtSH4f2yu@ZV zCq%N(UJtHU zgEuSWS&IpaO}SWt*m4@xOaR8WDFQg9R!9G>MFK)ndEdx3P!^hYm{j9k%=?rdnR019 za*ZTp#H;Rx88jGLs}qevWECEY79qBii2VWu?0j?t2QP>|r;XVjd5X{24(5D& zLia*RX)<7Qs@S~VexSB~v-U*q74y-#QlwcLY;Yn){cPQkD=UaLu5?!lP-%hDJiLqT z$H|PyN!<436vW%sYB|nBrv7ZG^)jv+!s#k@7%g6?;L76hFRiXVNPwI{{HLyT z@QQLmlmte0Fdk%O%G-*E&j`97DLk_6|J~~C)0dH!I=nrn-UfKb;DPv@698*I$}m&` z1I@44emb&$VED&;XQ9vG{5c+0j_{h-{Eepar?t+PM?Oq_z{FCvDw+dBVk_a#=q#^l zj@9H8nG5vs@u~3dL=v?xL`5g8)BWecI#I74pU~+TPEyq88)szjasOm`((s&f+!w=Q z!VGczZXXJZ-6lat#i+)Ea(Q=Ny{n?);exl%VE-?v63MG>!Grv6mj185zMbVZ6A9dR zsjI8!WcguB$HZ_rTK9Gk7|;Le0;q8?BlKIOE$yc7qzS^D7;NU|ikb7ZRoAC8S?~$)lLv_O)gzj3%I60PC0vuu^bTR8-Uqt;W3?Nk~ci74$P=#?Ry$qaLwU zr1bqSXx2y|d24g57j;JT{T4U&&O)!<*VCijJ;OXbpA!BFOXJ}UFoc!K4rY~mtN6!h zob*Kh2~g^znV*&h(oUn7oOjF`6%dg|$NW?ns#!I;tmAjNZcf74b91{SBv9tIFE!zq z=pewSu6ehz^l9?|7D%eHbcVfaC~JzQjrbTh2K2=|z>h0!6PwWrGyqYGW_abkT%%?+EWBv7X`M(=oGZNJr6MYHlEoPo1;1bQxFIHy7(3yDiiX zJF9^lx|C$~k4B%KPzE+UaY*DdH}y81`FT?*yJz@eJ;lG67)+NE^cGoK^Sn}S)#+GP zuCY;eXN_k%1Rdt>=c6U9AUcrFTzTzjFuh4!8mdKl~Lv9gDVfR2_zH4u+unwEBKpj`+yLOgppR%(uGf%tDFuf|1m> zpQUAtt6YM`r~IjP3-k>(jCuc4Be#T8NJgiFL?AC-z+UMN9FEcH$ZkVFJM`Hf;WKhF zYr_QSFjOG$L({JyIkwf=QInaOnWJ@;iqu{*7_P z{UPWzMX_~%x}p_zYzG*t(942_UtYPhXgtH^4Oe!es~h(F=~7WKQBY=eW!fLS2djbsm-8GSz1PplQBd^bs2RJvE9!`Q zYq`Nj0e||zLfvYZ;XJbp@u6qRs-@>AFL(4Qap?qk4ck6&9UkM21`|uNZH@(?s_aTn zm_5LB+_7FI)NWv-l>^$RiBA9d;X{Fp-Nv2WM-9`M`cZ5pHP}epskj!%HiO#)I5^(u zkAQD--Ctw6LI=_wU+c!4z>&pK`8p-#=g% zFv&odOJ0B=9kIv?K6pmtd~%`|8_UJ4eXpQbTbiLEMeE;(U`4*)bV0gIX<#ptctX!~Qm#XTQ1621va?6n?e3?nFn&4vHi< zYr36WiqR0uF^sbugKPp z@F)#WR6xV?)tjPuZx{iIMuwQ_MDBfn4)^E{N#LX@W$FH%!#(6mXid$sH8+^`i3Mz$ zYhBH5jTNYh9ir_--KEpY_}JmUoG?9PudUI6k@E@1bZ=vB}ABKEoa^U?JS^ zyBn&+#r_TxM+Vf}ItiSMYu?y>SiCli;@VIQ6XwD3t8h97dYE)n_?6|6n))Kli)eM+ z4xaac-}xQ%Ie0PJ#@{=>>HSw=!x>$|=t!OeZN+y9WS*-P3a}^R{i;R^o{!Nj_dkG> zR&1wZF7|U(Ufx=bw{#Dx!(*2A2?w8%P*!xJV3xgiPwV9gp`UU9;Zix-UWnr*5|rA& zGRIjnTC4$|ee~J-xO2^77=hEdY?><|a5wocrYh(RT(S5P{H}XYu~DX6NO=3!?Ys83 z-x%fv30C@n;FI@(so=<-&r|R2?vMPbMP5yZXWa;mt4L#8h&pmn{2RVB7a8`_=QTiN zhn3#XoQuV4$BrHlQDc(0Fe>{q$}juOI#kAi8fkc+)dBltL>SY$!cN`drzvsXmA|Hp z{1&~xl_OXGn!+wg%g}=IKAf2k{&u#H#MuHAwr-b8Z8@Qzr>cPEU$M_>+_!!~Dvqud zb9UNi+F9)TTmX{2kV9?f*AA_}Sh#%{=^8s%M!iKfV`o`*or!_tGJD)@wS=C5*-AF! ze6(WQJN2uh_mG>P_NCS5sf!{f?CelCHzC1ZwT|tJk#{3oGoJbh)@`89q0cJBP-3UP zE=4Ag>|1s=Cwm^q4g}p@&w(8W(KrtTj6Py+iJo$Fu;@87NfLSS;KiH0_$!v^68+S_&4 zYs1B#a;dP65|E|(>VspIZI6^xSX3J6O{aAg(Hj57q^LYspZnCc0x|E3^65X<=Mez2 zeZj~;|337|?Pa0V%q!=rNC18Cqd21C0VrPA-rt^tbMgay4w}3d6%*Yr@-xeuj{j;_ zxb&1Fiv2(%;VfNQH!;MzhaGu}%!P1Hi19cge_vWu;TWSg-7%@vpk* zG8BtJ!=hw);g95ZVJF#Vn^+kJK_Ni8lwPp2laNe2tf##i0&@e?8230x*@%|!{r>rG z-H+sl=xhDw0;q=~LE7MX0$}d#jz6ro|M&590vF9CP|thp*6|p&3qixH@`X9emj~Tg zI{K3P2PlgVXJrsZeSdIClRC;@x<^{ZX*B+7ts@gOwI%K0fgp2`^;R{ft#8Pq3gQlu zkE5|a4q$*rL4~f@tI-DE%3J2j)vM6pbtY05=JjU!L&={6c-NrPghajSpqRSCxB`>^ zH&M*B&F;|I1>65$J1Hv{LRnklUFD=1aX&Qt}YwVmK{2)|C}53o7-FvFgx=7 zJWw&?K35v*xelb8NbgHColJ;AITzc#6!$`+PAhcBl9V`hi0GaWSX+Kz^@<3|rhC)5 zUX5sc3LnFdvw%n}W^Ce-;keoU-d!)?gkqm-3s4@pDT*)yXYHR$XN~|#mR<6%NSqLt zvk2h?RdyuHqp>(k8Kn}$pmXvNQ^xfR+_8|<0}w0}5lv)qa19LwTMqa}KtVV;JjP~y zy&p;}Yh=A9Qc;1WqrD@g8uks&Vkz%IE994Y03I5Q$LRi1)iyAzD@x<~T635b!tvKk zvE}JY1g^EhU|AflKit&QOBEd`QUk;=HQeVc7}!^^SN(}syK1&h!bG*ss+tck{$3w; zgCf_z@4GRov;Vvw^t;FT(S4rVy`&g0`Ysiyx4#Xp?AUdo7_nXgO2 z3fbq>hnmpjlXUF2DnQPqx#mDNKr-EXJu5mE?ia= z{sbPRDG;#l&5V*9UyZOfZfP>J zLaLy}dQyU&U@%U;FFxDLC5F0uZ3vJ(U9thn$kN;U3+DkSqz}F(UoR3XQZ={^MV&d< z`YrTe|M>>W@h(rr6Y!?zrqt3ui*188FMhQzd#5J!$#-{jXePnkSb>ANySqCyKYgWt zw8e3o=+?7T)o{flSg{nM_sQ{_kd}b7E!H^O->-)atiiq#Ve%(MNY zr?ZVZI~ZL%zv@}Q7jK$zJ(RUZqV_=q0|6O(F>lJPV)xq658!&?p&Ve0EUddrdQ^vf zoi%(1ZY*5Rv2n7^wy`NTZcKgb-k9*%t@dNCvum9I<}?_;M|{XzPCnb(QFYgqR=F^y zgfOF80{0j`igSUX3?fY?XH}W^5~rJ{y{=_E{$xuuH&>a`G#MrB;3Mp3KFbocOcI#o zG5K^fzAogE)(5biNQQ1Jge?^1@MI1AuY_`j^TI!(vWOCp5}fql8!h1*gnf;gYiW&4 zmI)1M{N`xFoU#1rW5U(O7Nrpcv5z-XO0s`7%Ka^ljs|ggWkk+A8SrIby4P0ev=ov< zUCvLB_>9WUsb)n>H0?*c{sRT`C##e zQqA#9Y1cz(B?Z1375;&s-XNOiHrYk%0{AdIQm1>YXOns68NE63IL!4*xgIi(*ag_S zDQPe}?ZZxq=AFEpY|sf3Dau&$Ldb4O{vY079)&9ql;o^eAg<9{7m$5$X%frpsEygd zB{-Ng_?gs=^n{g?tIk>gZ|mx>;s|loBdCa)$$%RRdIxyddlM2)WKnbvUH;#argqz- zoD`q0^C(v4s0Y$-iTa}d#nN)2c%~|9g`^ZCZ}sh}@HcKI#WzqGCI8py3z=|J#r0&+ ztjaaGS7$J(J6@G0xLe?|*Mf(QSW8^c0fBGa?SsQaL9a}8Jvpq@tFM+Lr-Kj8portj zT(10S_6tIZNXtzab^AU0zki0JBj^% zxrPPv3kBNy_-%xp6(UqIA2Zf)Cp82pgYJ~y`)@DA#A8i$ z*N7|~!N@cA;Ga7=K-Nha?7!E;wb>+G4}HMkN_9~;;164xTj{p!(p#>)>>OGzy4o&q zSTRL{@(uSqFE|ac(xCsFnmz|F+z0V})D<;p`|Y7^FgnN+*69G3xO~7#y#SLI218oc z!9%g?DWv5#u_rU0+>g+}ZpUiJ_9A@KITxlwnd_s093r%blwkp`xt714E0Yo4B$+9Z zsp_HJqYi@np!JnNxR*_AJv{aXT{Zp^-U!H<(J}D92%4atrkH%W70`o|8NCreIlIH_ zAhpGbwnK&ARrQW_hVQ`JyG<`1q46r(6>#voO}%cH2jEp;R?Wu`rc# ztGS2~6b9Du>;p8mXLELh>j6adfxp>&AWw~a{h9pc_)8k|gWFsDmfge(Wv=jx5_HoA zLBp30IeUl&0lvDa0?8@)M~D3M48NZDcGec@7wK0)vWHA0=``zEiuu|P=1d6F2^&P7 zO+td`B-ty#-mmlF1+g9)?bd+nFlV(sJABw-q%OoEzo~x%XN_<&#jh+7?i%(A&e$cp zDTcr`A5m->5V_wMY`8XQZ7E`D_>YXVI2O~j)8g-5Yg+lHrnGWROo!C7Jzw80?Tp{> z7bzz^-?P^ndJaM&NPhBO?V1 zO>oGsZLm1HN@L+dFS#L;_YSj-duE?-K9W0)*s=yj`Lkou+8O0gXi@{Ot-Mw3TY28Huc4X8tr@n(c4dcnzTQ(BxP<;^u_hK2(_M`@U^N!S4Vh`Q5+NOK6 zT|cjHrHs{lCXNa-eK|jTS3!uj)%b_PhwY^Afbk4CXinm_3i>C>r!h?oGy5p5d2?G? z#r&Z-XaNf_PVCaPp3$gR(fq|}c@}Zxlo9u1{PpDSUn|Q<9Gl)Zy|Hmc=6ntZ4ecl2 zt&f%QMneU~&rvvwAegE^J^lIzR+gY=*?I?uUhI_z!tkBE^X%#Iw5?J<$q)P{^(PE* zfFu%!QARl?$Jn(qa=e8e&CfWX*yb#Z7ugM7eOw2DVi%M8r*9`2n>Bdo6td#({=hQ4 zF3GB+w!yl7!&&i=-&1Q#{t9#xgF}c`iR|DaASGmYn+JWzQxGtvi@yOQxWu-Iq^x-0 zY$YWQQLb%Q)vrCtWqmLnz)*2_={Up8#ExfG_9EF7>GyQH)?e`x#9#7R`iy2Cwf`;Y zYQ_pg&NUcN<=ou7a0{vt-a5v#u`dzbM1rZG%vAljG#BNOTkiZYT`^Z&VCq|B*xnTJ zu-kpgX!&hy+vT}C|9hey?}lX4_O)i6*}AncGRrcmxdBA;BG&Xfzl};1Ct}P!D(lh# z$bs_Vo+k;pJ^>b`6}Xz_n-eqJd2L@i(B^JmAkl zx>w(swsZz`CY{44-F(nJ@!di$Gf}!X2F2v4IWgiwbDAvlcl+X@R*0excc#cE zt}n5-0NxEPpeIJ){q*B%2sm@M^wD4+Fp^3Wy7gPL<#ucm#d%3APRIzj#}}rj`b>Je zj%_@c-2a*O(MMF0Q@RLmEva3b&>s7?$BJZQo6R2w#+5~eUbU>OVv{?6YVi)QSt->U zVk;1c6PVu{b9wU98Qet!dW^2_!xq$u(SbHN4i8l(me(&nM1*ek5IP$*z7^8Cuqe5v zg%rh;eJjnv6L9Ea*_Zw|FkEuc1zlrR8hQY_t9ZI{STXbzbSJJmj4by^yHl-k#AXm{JtlH2MFOmOzaoD|9! zMav(hffNlW;ee81ONT%46Z3ewvfn}B+Wy#XF!>dHLhldnyAx(Q>0i?E&O{pXcgL2W zjp?dhd;%+i!KTORwGi`M265VL~MvE#VN=uVfq~ku?OjOBvw9Fp#z?j%H zE1sXdm_I+VjTl#3!{GlhloB2-OygZKiV~2|a9B1U*C^R_w z`zrE82HqUIl`eujk>ET~;0nUVc)ii}^azQeJF`kJU|a@2uwuBN+;j83v|I7CZNSqD zGFRX8nV(~q&Es{v7)-BAL)NhlQFiAR7){GO-)~l{4850I8W-`07GGP6wd==^xr2|T z+liFv7oOoE@_n$C-tKr+R7ru?4ZD?@cZHb9R@+d4{!CCvO>4yyYZKzhyL$)oZY}vh zZg|X<{auaH^=@D%QJ5=@P^;jOc_7K(U7>=LUsni=%sc5yKF79}IPLVyK5J$o$ zl2=yOlt{F%=dP>!GslEYzyqXQoqz({zgf&4a92CyN*p5(bc5#t>?3XZzl)~{nS4rG z+5E8?mRBjn2^;vnO*mUQyUVcmn0n-0@sEx}sjVRVjR$hnMuh42jdnb05c2`x-i8O& zXTpoQAdAOgyopH?8TUGfZ+Jtu<&$`2dYn@r#46tA+4>)PM1O(NCOjr<>$rwxg`BLI@;;=BOrTTQk1bthj zs=b>atX*VLL6fe>NISt5tH~%kwvkA$nb)-&Wrk`d?9=;rN{0TW^nJiX@l$X-7sfVb zueg55@l!i_!|V2}))&!qXCl_;@+3j{$>ixOV}#2d_#5&(uvGa+lueTjuCK)pD8*j~ zux*jG2I`H2Ncu0Gvu;Gm9tN%9ut~s`Fw9v#VcN&nr(Rn+IMezD=Q`BCjrX#~3G~1l$pg zu`FRF5;vCEpi#$!dM+RBjqe)mHY4NLIEvqjO}b@YJ(2p{9_z*fEn4PZ;~t_f!3Q{M zaAa1G=l@jWUr%D7CIZf?r$rH*3p!yKOD}&C`pmHZGhuzvRUeKKC&I%yKgo%R)E#AI zS!>>|Y|gwu>~WqkUj@=qKY&5edkg%W1|5*PlBC}?();wc-k+%4nfJxj7<6}npF80! z@mRha3D0(P)3KC-NHj{(Cl7Z0b2$s-5EE-|>LE9FTBSG>5gf+@cZ&k^L`?!nio-ln zaECP~b-?^f*Wdlb`#`e@_+lsG=&-p|?GtX1|8uP-yG`l@%N23(xN;ne z57(Z$$zzrN!&D-QtaH2a?o5Xwz@3mLb83a`>}3R1POg%=O6Ek9Dn4K4*-@%b8LFWL zwd3$_@U;Aa9rrmbvVWS|~D z6?p&~==g!Z!PyXg`m)VJfoE0iTp-U4f9v+F#uqI@jo9z{5~Z*c6J0-rQdSH$Mr7}W z<|*tThhpjgdu(% zmJ6YP(~DLI$C?&}I7gA6aVs4M;zcfoP?^G9na?jE& z9qn3rf2z4$t925BIk@Y|9hw0GQqXz}?cegcgU%nz--;K4 z1Bi#e=*majMzP9rj-`=}>xqNsxP|Pyyo>{~GTf_OU(OtL&lmKK{d9eMZ-mtXVyb1}jIjyJFgfAI7zu1!m|c!h(w1)t7JDC7$ymcram zyzfh7zT5XIW)EG@Ai*mEdkX4=emq`3rbeZiFuWDr^TtUM@!&6y^tc}Z)#6%5?6KRR zOp$?yIq#!okx^br4BtR@poQFto%)6*Ua=Pz}VJO2_)JY!fXJ!2t1o8jY0qXLQZWAVfpCV96)wAAo>?og8BUmHwwg? zA^XMsZX${Up1`PJYPn&0XIRV0TrYclI>q;n6+6KFp^loB)U*a=4U|)HvcB1*jzO;4 z$@bNmE3aB6;MKoP%#otT(NH!i>O=EFGtK0#U;z(W5Bc)c6~Z>U8j56v?>R7jc=YO3gE z!Q6prE<(oP23y?GGu@R2v2S0_%nH|y*_SYkw8Dv1qR0%xX?W(hpEF-H7%T*_9tnFO zx{XoV{82!QN`EV1OL3sKR6q}-tWdo0TkI3NoSSuC;g0oB3)fY$Yr-+Q)_MY~*&1EF zu38O1nab;gdQ}(7dlzeSh=QrKDj@-|1V9e0lo1(BgNzRG`HdcRId5#JTR0_F^Up6D z$t9YufF^3d*cE#-kbNtbi|>Pg<6nOU4~CyQdlx%eDB(%OT}&%bEi6h8NrQ(7{ka;B3oa40^E4 zIcIQ%J3kS;{|Cu~mnqb!nmhZRlqpa=*c7H&M(le_c z-ePYY`nDM+cX^(JwwxO25!?yg^vSOqNF^DPhwFYqwLC@O2iSgkXA_^W59P~)F@lci zmLJ5D@1V8uId8e+O<()rV)g`?n;cD4@2+rv&%Nhai@oII>VLOblx!cj2_oBux<7A# zc#GVK;B_o^A!8z!Rorv$lSboOnysPCl`1-G8{aCte6W`zxH< zJiT5Iu*YkulVwmxDh!=uU`$3bZ!H$#=$V>abt~%mDG?|l#_d6}6_s;7gV?)eLFNK! zV6KT1IyOLZzS{}YM*E;kMBd9IVYUc9>b!Z4acN`bT6nMjx18n7|G9Mpt8y>ar%al8VfW z{nXbZ5^I5bN~iEnec;Qy0H_wnK@0dM&eIJ6qd4`Cx_(PGHI$UBzb-8;72Df2=A*s1 zpNyZrKdW1?Tj_nz!C|rVkLS_E!|RQ=4NeU$vvdo-yw7yj(Zg$5%7~eN1cfp!jywq^ zu-XalT2HJXdw}G8F9qDsc0vu)yJ{wx*i1TfFsbxStj!*7aH068SwgV65g2SEehg6f zV%Za-a9@8|I(o`{k+#3L_h(&K8st|=#*lYF*|B|N=MEtV$5sXx8%saS zviXsF$!=!6M`HxV_=yl+$%rk9Ll3kTs`?$E?=0Ckw5aW@ zz3yO#KMpGsm#~Em++V=R0bDtfcHQXq^>g(@c!IBTf&McVpS9OhVDrZ%WBPip&zSHe z`1U%Q-=>W;#OdpeS1=by^0TP*{NtM4cz%6A#psonU`w4%Acc6wuat4UGiyu!pAb_e zwY!P%_I7C_SSmh%RBHo8g=DxNtJ2{eaonuu>m+Hx7ymVCl;70Ulp*x;F;bLN5))zm z=fUluw6Co3$3WnpOC#UDxwooHHNyWxk28v@Hhkq-I2Pj#;+JI#WCsn=!n+e%!rJX!QiGZ z;5Vmi)<=)7E58^Si1@G+x3RHtPp^@yf*vJ+5M%Kppyh1WVP0r>Md<9DNI1B3p{{mU z`tL)e$>K5s_m50LNP({)xWssV-uF-_IG%{;$0GH4n+7sh2=E4S97~M&+%(l(*5eC~ z7vJf~*Pf(`IkS}H&4B&!p(TDI8`yZ4KLisGd2mMrqy23JxQj9uci} zjokm~FF=;D8!TRjk-QsxYVjn;3Qk_cD!($OJE)ys~XdUXx%ix+*l`+3?81m?<+o=<$(- zP$L^4mwvuH^u3KCoRjx(1GZib=~pUV!2GIFo+fRVvW*c29XC2UTI5o42-_oHbnAji zGJhb;z(@UyPT5(VU=_w;2)3COQn<;0M~@ykXA6AGtt8}8bKfzG&Z$OiOSno}vOTQ) z+W|VH7NUans1p(-jCm^mSWnE{|5gvtfulDjF{fUT5yVZ-&y82nu}k__@SnNByqf7? ze#=Fa@jPyln?}~z1%EO5&IRVWn*-RAWStA0BseaOrwLIP>*=@oxoCX7k^(?)BQS(5 z?6dk_cEuY$@-nE3GZj9^i=fvq+;|d;)?^3Eb=HkTxII=yXMNV8sCKi1*OXV73qzb8 zvdhq&eK--~=*!X6DRBCg3yYOEEjEP&x?emn#7AaKt>8lJ+**;2i)>@gggH^G%k7-E zIT`w-4+Je=GN^TkmY+Yh8adyoD;~y3;-enZ)FSg9Dp_yQReOPo5vxmwhK<^y^>ylW&{3@A`4C z!19#}VokA0QNs|mrXUz#7ItZx8y|fppa{iSW8(aEeDA%ZNz&HV*7Au;v$6s%b5~bY zv1uujMYm30XW6qd_fBh84VG}|TNg5`+0J&a^w-I>pDQaX>m*U3?`h;{xEsm9#o&9< zm2uf34U(prwY&J?Qy8z};4B?YgUl$nFIcjpBqGYVV9=iddTp$gW?cPL^Z{fODVP$U z7Bs1FMNNl zf@*Af|I8IOG$3SDp%@4FG;UXNNI`qLEgtIg_m7X9f976U<1^h7GYSPp-@3ZoG?t}8S(yKiwwbI{83(=)np z3s=#Ppllp3n^o1i*L$8fe?`#g8ncoO*%oN$G|W2)hL>D`yNO>#3V1Zx1q=)4ag*Cr znAZ!yB_HTN$#D5HY@WII6jajLvIkw4duK>u@?W3v3kLa4?PE%LE4mu&7>&2j^ z>x5*GdRlt$AWZ_W?Km7M2LV?)ZzyGwd{dOValn&J=+ zaIk)5cfPpCcDL17K@>OnOa<-f>3QkJ>sPN{hRpoKBF?nJHrRNOXFjo zh1U8$*6pQ5%K^;230K9SgXTac@E;bQ3FGz4iQG>&Z8Tz&IkwUL{)K!8{f|sRyiYhw*-vi zUhDi|afD0v29KRSlG@1306sDY!+uyMhnqC?24m!yzTXxvF?ZF%Aai>Yp|;_l4KJOJ zixeB;!c7W;MPg^4g)l>D2cG9<8RZq!{9U0q;rZXcx7BnF;_iKr7RF6x46bf&ZeF8l zuH77Rh`RT|NAcaQ-;~KH|BAG<`{j>{1l2YWwzDK8|7`?3cK*|gVBf&I^c#* zba~(uC)-Pb%FQ^BT<4{^xm{gufX?(jBK&w!M8TIuNoPG4M7n+v7=Uqak2yz^FzHA3 zwSwAT@eT*ELPqZ`{?2C=vo@jUpw-WO)ftxhJNi+ffLb_`JB}|atXXaG(qRrjXW6SX zBy9Y+LAZvQ4%g~GaAf>Mc%{^(lV?~InE!Vjq{Clbx?A$wm%#3k8yL_o(JyyPJH^-G z4ywNM^oajj`y5uxW9ZziOQ+ZFfn#{2lLcPh-iLpMrmlJ9;^yY(N4&By%jot-iI{7&Z1u*q%X>q%#t+<dNl8hs*r0!{ zavPFGC4{kxU7;U|7mNTRf(Vjv9b&5{rN^YQ0>;*tEEg(gk`t74JQcORkI%Hdjf%Sz z0}_9u(&P&3n<)N8Vdi5?lr41Y2_Qd}pOOqOFykoCwKJE;v`+VkXrH&^*nSShTn)^b z7ecSR)+?o3PImmUvoU9Wti&qR1>m{7*JB@Q|IX4m#vns@@lF{7RoRg z<_zx)|Krlmz`36&U+5d?avxxzDQ$ZzHnT>c3Rcl=v;m-9Yd@m~f2LiDCJO~YW`Bj1W z*way1^_Q^Rcg(BW!H5k7$4w=gZS6!J{VGRarqV=c>2%Y|TS6765&idJDEqaq^#!le> zp&BdP+E@Ne#X9um&z_B7fq3TUzOJqh=R;HHf(K_o7!Ux&ypOEg8V@?$^qT7%rE2Tc zUogBF^KnV%nf|5ILC0$(^h|`}T02d_SzJ~A8J&KY16jx~)QnhPZbl(T15x*o%djgn zmqJscn$g_Yu?wL%`;w)mbAI!f<66pB#DUx9sSG1A9vtbp7G~fW4R*Ur^+A5Mm({zE z(z)X5ZXBF=J%cSzClJPA|BQSVh+&F@GvWR6s5)%i) z9B$}{|8DI9_}hw01O8S`2u;lG$e?0EKB6W7M}$3JzWz5Rp@S(K5YS&XO4BUsGRy zcwMtbYiuZ5^G<6O7^wRJ0Rcs1$?-yc%hq*dhJ7)JsY&ii$IFG z&6f{MlC!Ms%E&fQ7UrPJcvNu=>d0^1_GZO* zqAxMmMFhCSgZBF1zetp9(%u2r14u=`~7v)V{Qci(^AET7Ml9gMs)*%~I4f|*bwf&{rPZ$`Fw8ia81Yqy-bI=*6AYBwc{iQkkV7xY!GEtW@M>|1>Rty7u{Iz7#o{ip$35 zl)4OoE~m`fe&*WP+Tx^cYdeYsQEn)((Vh`XydxB+ZMB@;?$=*re%P$M6Py0-ztw7n zv#UME0NE`$LsbycaTX5%+`iUR3as46b4r=r$@BPo<1)F>)cb|ii&f9r7R>SX|DNjY zX8BDdR^Opq7bejR@H7@a3=tMJrbvkU3nTrMhV-ZllZy-MTCY7s0k9K4Ju?!%a z-7N94-iuP$nj7P1wuT&v3Z7vCzU@R_9qlQF_aiVOpG7PL8l_X<#QzUpI(n*V{$uM7 zSoOz$>%EgoxP1SMT4@KkgW9C0ZCZDCcRL-U?A6hwH}f=I(bm^ zY8NI*x=Hy6EB4Gzme$AEeecW!rNzyO+jJ&}CKFl{tOQ!UX+tuHXBh7@7Kgo)3MeV- zp&If51}Fw~Lb*Y&hRX(*PHR)0Xk~69(1ItC@^Jx)RWLTKXp1&FfXO(wVG=YRur-=d zUmqm#LtcAG2{5m5V;#nC>w<*h!#^0JI4KU=muZ?cgM09kTPGRuvKcMJm3xYc?rxbW z^MgrHrjuq5xWLPe^ z_n`ughB~R13&*umsdN$CZn$xz7%y$Wa%fwDpCT2SnnqmE!xN9X4!)D8PBcw(RJZJ)y5NlAd%fK4OL-2`j!b@-Atp7(5)BScPK`G)X+yZ-W7j!Pyai$ih- zpOej?r>RJ_DGE{QgfKTqZ9*pTsiNgIjwUPJCodopS)A!`Q@0g!j___d^f&B6Tw+%{tH(uQ~o2cn~3Qddw#9B3-z(f{^E=ToF zisj&bbTDQ;s_hRyx=E*W>~gE$itH?RF_es6^-BMFmfN=e*c;M4FLI|P zt&LHs$D60zh&8ev#3BmGbC%|LDsHC8NB;l5)0j$SNRFQ64Gzbq=|*&tA4r6*jZ->C zahTJXL~-TCoZdsr3cHRw@QWm8s*dE{(4Yk7bA&Y`~6zC>Es{y^dt1NyFmb^U4&WnV$H)Ne-> zQothg1SvP!ly=L*Z=c6UXVrcuJvu2P{?wF$Ls}yt0!4*xibJJvW(E{=y_yTIY+f|7~fZ)%(B z{;AjKf7^PX?TFj5u2$}Qq86=OLk5hopqyVI1+9);BMA%A-Ru6yT><5z7cMDF+Nq7} zL@lySzCq6_Agr{P&6reHY(1L-Wav>MgqFGuvI-JHEVwK^~4RsD3 zI>HHFnqgL{+s7=oS~*FV9NplQoZWkF>Lp8M`|1zJ(oaM{TmLc2c^Xd=`J5d^T`E@v z*To8DKD!}gBy98wl)w6X7vtW<(=>nhNWLwyEbVIKa2@bh*Y9Q?%Jv(peiY8-zJ=l{ z1p(K*(iuFq0_k^TkYAdt2+EjgS+Y(IoG?WT#>tsA?M-IxLa-I#QvqD5i!SY*4%yP_ zg!2RL9YntE?(R>$JhdHy+((uFDR@q$>p;Vz`~yvf&}GZm z78|T!@O7+5u&;hrY7x0XDOyIYCm!*KABb|kxo$L13>GRWxjzYYgE ziWkAVMCtNa-;k8uYZEVdHxq9A1}>$^JidpvW(r)SqS1raCGp3c$<@Uwn`iI`3Q9hDL4R>YdULwEbT>5xv!?C3Vc+j= zHem&*Uv(eK&bpYow|k$&C*Ltd@$ocyWM83*8Fs_W%zvGj+0tncFS^?)OdxBB*V{Uo zTpYxB0l64qc=!{xY5T2yd1FY!BQucH8vTQuggW-_grU@c)PKdexNbY zGPPYcwQZiW7Ni}hyUM4wPwzpzk|J|B9-`{W-8H}p6e|OQ{SY&h{vvb=Kd?z zy}iN?lNlyV|6mf)qnCb9;!mZ^d9>gCiPXe3K;W-ssXIGom?T5l!x5d2SRHBE4Q1J$ zzRBqjmEQ&GlZ&EOTdC*HO=B>2 z9=9{)l3v%u?lIuT)k-lDd;H&mREdYL_2LdDTs_0L>og=V6>gc%@RVy^e4<~V)~G5I zzTR?sX3JPDK|pM}oM*a-{Z0jJ=P^A<#<{Ygg37ADj_WnRO~7tHkSph2+ImbtnN~jy z_r|I|-nWxCpZ)EOc!U0YzCs30o2%wsN0oRbr+rhK7t~k#)+w`CN=Jz7*W9_-^Df17 z=1+p&=$}1@rf;&pngYaFB~Zj^)&n-im?d*dhfAGH64rrY9kY!j2> ze?qiv^$m&4NE@Zw8w{KOlhjU_*&?Rz`CAA#ya-bYk;n#4<#7>K6_>}lJ^k~>2!lzt zIC4x}oB<9PbR@(k+60EL`Z+{z;ZijV_}foPK4xuMfYS^HpGs~HzY?+9XXUo7W=PXk z1;R?J?4z~wXaABVT}vF3@<#*Z;<2j(pJ#Rn?P&-h2`_kl7miRLIfa@xV*0b_LiiiG z-R4*tMHAhhY}`pW*%vf);sQfoa}9@2FwyqeU*F_g0(&lYx(HjU@2RGzj5krMeVrjI zLeKZrQdu6`awhE3B%BDS#05W|AEno+8>zqy5K<-1Fd8?~Nm55HH_~AAENawB z#^L$YK^>Rz?X!xi%2zZ73S^dS#@#~#zU#iU;$2pnh?Lo_{HyZzJsE20(?+VQ>1Nb> z1qW~%9)tk7Z$gc!>sYSCnRB0idna&ccm9>XP;n*8S-@g=%4eE-cUYp*Tyx>ZeBkv& z^OyI(oOCL*o>=qiqrT7H5=jG#4dgxSQ;-pQ^&u19p=!^it@t0QxI z{dLaKGliN-)%MXd)}wEU4%vfzL9jOxY(Yh9a)=W0Ur|&IYYZVb7@|=7!`2}Ft80Mw z`_egyq4@;+V!Lq3B2D62pUI9danHM7`p`pdpPP`VF{%wGAFNvzM3+)U{F$I~`6qWs=`n9Ap}!p0 z@uh;6wGBN@mkaY-Wa5NdqwCK~3t-7vq+T;A zh|1N@J^ac9%>=c51e`y3tC8p-%hR*S146&=K}_7#_Z4<^S`|BZishE7f6auHWy5!` zt_v@EsEUR?f6A9_nQr1CC2#*Dnx61_>iHy$%`5%-&g`zG2K|J)da>qjdJp-t3h}S^ zxGe40bAWTlY%lU@40hZsA@i4<-PME48#ao1?$+&{VUk1@mgb6^7dLAj*pt^V05_@A z%UE#3IF)ldUR~2(O&J#!S^g6qOpmI!u@Eh0oIDjWD)~=2Sh|`EZ9~bl(^qqIH#tDp zQ)1NB&P!K4BykR?hvdm89D73!p6PY2Rjavobo6S~{kv@Tx6DA~VMgM|rH~fvM?XS2 m#J_)LllnKd0a}=FNWW9YS;2IY5_-&$kfI48rW~38 literal 0 HcmV?d00001 diff --git a/static/html/_sources/dev-doc/binaries/bench.md.txt b/static/html/_sources/dev-doc/binaries/bench.md.txt new file mode 100644 index 0000000000..a6654e8e36 --- /dev/null +++ b/static/html/_sources/dev-doc/binaries/bench.md.txt @@ -0,0 +1,5 @@ +# bench + +Executes multiple tests on the library and output CPU usage +information. +Can be executed with `make bench` or `_build/default/bench/bench.exe`. \ No newline at end of file diff --git a/static/html/_sources/dev-doc/binaries/cgl.md.txt b/static/html/_sources/dev-doc/binaries/cgl.md.txt new file mode 100644 index 0000000000..a8e0697ab8 --- /dev/null +++ b/static/html/_sources/dev-doc/binaries/cgl.md.txt @@ -0,0 +1,4 @@ +# cgl + +Removes the links of an HTML page and replaces them by `span`s. +Registered as a service. diff --git a/static/html/_sources/dev-doc/binaries/connex.md.txt b/static/html/_sources/dev-doc/binaries/connex.md.txt new file mode 100644 index 0000000000..c31fa7353d --- /dev/null +++ b/static/html/_sources/dev-doc/binaries/connex.md.txt @@ -0,0 +1,23 @@ +# connex + +## Documentation + +Calculates the connex components of a base and returns it in HTML. + +``` +usage: geneweb.connex + + -gwd_p : Specify the port number of gwd (default = 2317); > 1024 for normal users. + -server : Name of the server (default is 127.0.0.1). + -a : all connex components + -s : produce statistics + -d : detail for this length + -i : ignore this file + -bf : by origin files + -del : ask for deleting branches whose size <= that value + -cnt : delete cnt branches whose size <= -del value + -exact : delete only branches whose size strictly = -del value + -o : output to this file + -help Display this list of options + --help Display this list of options +``` diff --git a/static/html/_sources/dev-doc/binaries/consang.md.txt b/static/html/_sources/dev-doc/binaries/consang.md.txt new file mode 100644 index 0000000000..68eb0500cd --- /dev/null +++ b/static/html/_sources/dev-doc/binaries/consang.md.txt @@ -0,0 +1,19 @@ +# consang + +## Documentation + +Calculates the consanguinity level of individuals and synchronizes it with +the base. + +``` +usage: geneweb.consang [options] + -q quiet mode + -qq very quiet mode + -fast faster, but use more memory + -scratch : from scratch + -mem : Save memory, but slower when rewritting database + -nolock : do not lock database. +``` + +[Online documentation](https://geneweb.tuxfamily.org/wiki/consang) + diff --git a/static/html/_sources/dev-doc/binaries/export.md.txt b/static/html/_sources/dev-doc/binaries/export.md.txt new file mode 100644 index 0000000000..2f998a5b4c --- /dev/null +++ b/static/html/_sources/dev-doc/binaries/export.md.txt @@ -0,0 +1,4 @@ +# export + +Exports a database in GED or in GW depending on the option. +Registers the "EXPORT" request as an extra request. diff --git a/static/html/_sources/dev-doc/binaries/fixbase_plugin.md.txt b/static/html/_sources/dev-doc/binaries/fixbase_plugin.md.txt new file mode 100644 index 0000000000..b189e78c7d --- /dev/null +++ b/static/html/_sources/dev-doc/binaries/fixbase_plugin.md.txt @@ -0,0 +1,4 @@ +# fixbase + +Applies the different fixbase utils (module `Fixbase`) from a dedicated UI. +Registers two new requests: FIXBASE and FIXBASE_OK. \ No newline at end of file diff --git a/static/html/_sources/dev-doc/binaries/forum.md.txt b/static/html/_sources/dev-doc/binaries/forum.md.txt new file mode 100644 index 0000000000..463f5b27b1 --- /dev/null +++ b/static/html/_sources/dev-doc/binaries/forum.md.txt @@ -0,0 +1,5 @@ +# forum + +Includes a forum platform in the web server. +Registers the requests FORUM, FORUM_ADD, FORUM_ADD_OK, FORUM_DEL, FORUM_P_P, +FORUM_SEARCH, FORUM_VAL, FORUM_VIEW. diff --git a/static/html/_sources/dev-doc/binaries/ged2gwb.md.txt b/static/html/_sources/dev-doc/binaries/ged2gwb.md.txt new file mode 100644 index 0000000000..112d7210a4 --- /dev/null +++ b/static/html/_sources/dev-doc/binaries/ged2gwb.md.txt @@ -0,0 +1,48 @@ +# ged2gwb + +## Documentation + +Imports a GEDCOM 5.5.1 file to a Geneweb base. GEDCOM is a popular format +among genealogy enthusiasts. +[GEDCOM 5.5.1 documentation](http://www.ancestris.org/dl/ancestris/norme_gedcom/Gedcom_norm_551_2019_11_15.pdf) + +``` +Usage: geneweb.ged2gwb [] [options] where options are: + -charset [ANSEL|ASCII|MSDOS] Force given charset decoding, overriding the possible setting in GEDCOM + -dates_dm Interpret months-numbered dates as day/month/year + -dates_md Interpret months-numbered dates as month/day/year + -ds Set the source field for persons and families without source data + -efn When creating a person, if the GEDCOM first name part holds several names, the first of this names becomes the person "first name" and the complete GEDCOM first name part a "first name alias". + -epn When creating a person, if the GEDCOM first name part looks like a public name, i.e. holds: +* a number or a roman number, supposed to be a number of a nobility title, +* one of the words: "der", "den", "die", "el", "le", "la", "the", supposed to be the beginning of a qualifier, then the GEDCOM first name part becomes the person "public name" and its first word his "first name". + -f Remove database if already existing + -fne When creating a person, if the GEDCOM first name part holds a part between 'b' (any character) and 'e' (any character), it is considered to be the usual first name: e.g. -fne '""' or -fne "()". + -lf Convert first names to lowercase letters, with initials in uppercase. + -log Redirect log trace to this file. + -ls Convert surnames to lowercase letters, with initials in uppercase. Try to keep lowercase particles. + -nc No consistency check + -no_efn Cancels the previous option. + -no_epn Cancels the previous option. + -no_nd Don't interpret a year preceded by a minus sign as a negative year + -no_pit Do not consider persons having titles as public + -nopicture Don't extract individual picture. + -o Output database (default: "a"). + -particles Use the given file as list of particles + -rs_no_mention Force relation status to NoMention (default is Married) + -tnd Set negative dates when inconsistency (e.g. birth after death) + -trackid Print gedcom id to gw id matches. + -udi x-y Set the interval for persons whose death part is undefined: + - if before x years, they are considered as alive + - if after y year, they are considered as death + - between x and y year, they are considered as "don't know" + Default x is 80 and y is 120 + -uin Put untreated GEDCOM tags in notes + -us Convert surnames to uppercase letters. +``` + +Depends on the library `gwexport`. + +## Our recommendations + +{doc}`/audit/binaries/ged2gwb` \ No newline at end of file diff --git a/static/html/_sources/dev-doc/binaries/gwb2ged.md.txt b/static/html/_sources/dev-doc/binaries/gwb2ged.md.txt new file mode 100644 index 0000000000..0123f647b8 --- /dev/null +++ b/static/html/_sources/dev-doc/binaries/gwb2ged.md.txt @@ -0,0 +1,29 @@ +# gwb2ged + +## Documentation + +Converts a Geneweb database to a GEDCOM 5.5.1 file. GEDCOM is a popular format +among genealogy enthusiasts. +[GEDCOM 5.5.1 documentation](http://www.ancestris.org/dl/ancestris/norme_gedcom/Gedcom_norm_551_2019_11_15.pdf) + + +``` +Usage: geneweb.gwb2ged [OPT] + -indexes export indexes in gedcom + -a maximum generation of the root's ascendants + -ad maximum generation of the root's ascendants descendants + -key key reference of root person. Used for -a/-d options. Can be used multiple times. Key format is "First Name.occ SURNAME" + -c : when a person is born less than years ago, it is not exported unless it is Public. All the spouses and descendants are also censored. + -charset [ASCII|ANSEL|ANSI|UTF-8] set charset; default is UTF-8 + -d maximum generation of the root's descendants. + -mem save memory space, but slower. + -nn no (database) notes. + -nnn no notes (implies -nn). + -nopicture don't extract individual picture. + -o output file name (default: stdout). + -parentship select individuals involved in parentship computation between pairs of keys. Pairs must be defined with -key option, descendant first: e.g. -key "Descendant.0 SURNAME" -key "Ancestor.0 SURNAME". If multiple pair are provided, union of persons are returned. + -picture-path extract pictures path. + -s select this surname (option usable several times, union of surnames will be used). + -source replace individuals and families sources. Also delete event sources. + -v verbose +``` diff --git a/static/html/_sources/dev-doc/binaries/gwc.md.txt b/static/html/_sources/dev-doc/binaries/gwc.md.txt new file mode 100644 index 0000000000..8ede564135 --- /dev/null +++ b/static/html/_sources/dev-doc/binaries/gwc.md.txt @@ -0,0 +1,30 @@ +# gwc + +## Documentation + +Creates a new database. + +``` +Usage: geneweb.gwc [options] [files] +where [files] are a list of files: + source files end with .gw + object files end with .gwo +and [options] are: + -bnotes [drop|erase|first|merge] Behavior for base notes of the next file. [drop]: dropped. [erase]: erase the current content. [first]: dropped if current content is not empty. [merge]: concatenated to the current content. Default: merge + -c Only compiling + -cg Compute consanguinity + -ds Set the source field for persons and families without source data + -f Remove database if already existing + -mem Save memory, but slower + -nc No consistency check + -nofail No failure in case of error + -nolock Do not lock database + -nopicture Do not create associative pictures + -o Output database (default: a.gwb) + -particles Particles file (default = predefined particles) + -q Quiet + -sep Separate all persons in next file + -sh Shift all persons numbers in next files + -stats Print statistics + -v Verbose +``` diff --git a/static/html/_sources/dev-doc/binaries/gwd.md.txt b/static/html/_sources/dev-doc/binaries/gwd.md.txt new file mode 100644 index 0000000000..e7dbcc89a0 --- /dev/null +++ b/static/html/_sources/dev-doc/binaries/gwd.md.txt @@ -0,0 +1,318 @@ +# gwd + +## Documentation + +The main web-server for geneweb. It depends on `wserver`, a library defined in `bin/`. + +``` +Usage: gwd [options] where options are: + -a

      Select a specific address (default = any address of this computer). + -add_lexicon Add file as lexicon. + -allowed_tags HTML tags which are allowed to be displayed. One tag per line in file. + -auth Authorization file to restrict access. The file must hold lines of the form "user:password". + -bd Directory where the databases are installed. + -blang Select the user browser language if any. + -cache_langs Lexicon languages to be cached. + -cgi Force CGI mode. + -conn_tmout Connection timeout (default 120s; 0 means no limit). + -daemon Unix daemon mode. + -debug Enable debug mode + -digest Use Digest authorization scheme (more secure on passwords) + -friend Set a friend password. + -hd Directory where the directory lang is installed. + -images_dir Same than previous but directory name relative to current. + -images_url URL for GeneWeb images (default: gwd send them). + -lang Set a default language (default: fr). + -log Log trace to this file. Use "-" or "" to redirect output to stdout or "" to output log to stderr. + -log_level Send messages with severity <= to syslog (default: 7). + -login_tmout Login timeout for entries with passwords in CGI mode (default 1800s). + -max_clients Max number of clients treated at the same time (default: no limit) (not cgi). + -min_disp_req Minimum number of requests in robot trace (default: 6). + -no_host_address Force no reverse host by address. + -nolock Do not lock files before writing. + -only
      Only inet address accepted. + -p Select a port number (default = 2317). + -plugin .cmxs load a safe plugin. Combine with -force to enable for every base. Combine with -unsafe to allow unverified plugins. e.g. "-plugin -unsafe -force". + -plugins load all plugins in . Combine with -force to enable for every base. Combine with -unsafe to allow unverified plugins. e.g. "-plugins -unsafe -force". + -redirect Send a message to say that this service has been redirected to . + -robot_xcl , Exclude connections when more than requests in seconds. + -setup_link Display a link to local gwsetup in bottom of pages. + -trace_failed_passwd Print the failed passwords in log (except if option -digest is set). + -wd Directory for socket communication (Windows) and access count. + -wizard Set a wizard password. + -wjf Wizard just friend (permanently). +``` + +It is build from eight files: `gwdLog.ml`, `gwdPlugin.ml`, `request.ml` (these +three files define `geneweb.gwd_lib`),, `gwdPluginDep.ml`, +`gwdPluginMD5.ml`, `gwdPluginMETA.ml`, `robot.ml` and `gwd.ml`. + +### GwdLog module +Util functions for logging errors & infos. + +### GwdPlugin module +Module used for registering plug-ins to Gwd. + +### Request module +The main interface between the Geneweb core and the rest of the world. + +### GedPluginDep module +Calculates the load order of the different plugins. + +### GwdPluginMD5 module +Checks the plugins .cmxs files and assets did not change since compilation. +This module is written by mk_gwdPluginMD5.ml. After the plug-ins have been compiled, +mk_gwdPluginMD5.ml lists them in a pattern matching with their MD5 hash. + +### GwdPluginMETA module +Handles the metadata of a plug-in: its version, its mainteners' list and +its dependencies. +Metadata is optional, and may contain the dependencies of the plugin (separated +by a comma), its maintainers (separated by a comma) and its version. + +### Robot module +Handles the connection of robots to the server. + +### Gwd module +The executable + +## Requests +Gwd displays different web pages and perform different actions given a mode. +This mode is given as a GET argument with the key `m`. + +Here is a quick documentation of each mode. + +* No mode: displays the default page depending on other arguments. It can be +the index page (no base selected), a welcome page (only a base has been +selected) or a person page (a base and a person has been selected). + +* Mode "A": displays the ascendants of the selected person (selection key is `i`). + +* Mode "ADD_FAM": displays the form for adding families. + +* Mode "ADD_FAM_OK": requests to add a new family. + +* Mode "ADD_IND": displays a form for adding a new person + +* Mode "ADD_IND_OK": requests to add a new person. + +* Mode "ADD_PAR": associate parents to a person (person identifier must be set +with key `ip`) + +* Mode "ADD_PAR_OK" : requests to add new parents. + +* Mode "ANM" : displays the menu of anniversaries modification + +* Mode "AN" : displays anniversaries ; with the `v` key for months, displays +the anniversaries of thay month (v=1 -> January, ...) + +* Mode "AD": displays death anniversaries ; with the `v` key for months, displays +the anniversaries of thay month (v=1 -> January, ...) + +* Mode "AM": displays marriage anniversaries ; with the `v` key for months, displays +the anniversaries of thay month (v=1 -> January, ...) + +* Mode "AS_OK": displays the results of an advanced search + +* Mode "C": displays the cousins menu + +* Mode "CAL": displays the calendars; if no key set, it will use today's date. + +* Mode "CHG_CHN": displays the form for changing children names of a person + +* Mode "CHG_CHN_OK": requests to change the children names a new person. + +* Mode "CHG_EVT_IND_ORD": displays the form for changing the order of events +for a person + +* Mode "CHG_EVT_IND_ORD_OK": requests to change the evenement order of a +person. + +* Mode "CHG_EVT_FAM_ORD": displays the form for changing the order of events +for a family + +* Mode "CHG_EVT_FAM_ORD_OK": requests to change the evenement order of a +family. + +* Mode "CHG_FAM_ORD": displays a menu to change the family order + +* Mode "CHG_FAM_ORD_OK": requests the family order change + +* Mode "CONN_WIZ": displays the connected wizards (the base admins) + +* Mode "D": displays the descendants of the selected person (selection key is `i`). + +* Mode "DAG": displays a relationship graph. + +* Mode "DEL_FAM": displays a page for validating the deletion of the family in +argument (key is `i`). + +* Mode "DEL_FAM_OK": requests to remove a family. + +* Mode "DEL_IND": displays a page for validating the deletion of the person in +argument (key is `i`). + +* Mode "DEL_IND_OK": requests to remove a person. + +* Mode "F": displays the family tree. + +* Mode "H": displays the file `fname.txt` where `fname` is register with the key +`v` and the file being in `hd/etc` (`hd` is the dir specified by option `-hd`). + +* Mode "HIST": displays an history of updates. + +* Mode "HIST_CLEAN": displays the history list associated to the history file +in argument (key is `f`). + +* Mode "HIST_CLEAN_OK": requests to clean the history associated to the history +file in argument + +* Mode "HIST_DIFF": displays the page that allows to select (with variable +`t = "SUM"`) and to view (with variable `t = "DIFF"`) the difference +between all revisions of history file of concerned person in variable `f`. +Intepretate the template file `updhist_diff.txt` + +* Mode "HIST_SEARCH": same as "HIST", but with a default search + +* Mode "IM": displays the image whose name is in argument (key is `s`) + +* Mode "IMH": same than "IM", but returns HTML + +* Mode "INV_FAM": displays a menu for inverting the order of two families (where +a family is given by the `f` key and the individual is given by the `i` key). + +* Mode "INV_FAM_OK": requests to reverse the families. + +* Mode "KILL_ANC": Undocumented feature; kill someone's ancestors. + +* Mode "LB": lists the last births. + +* Mode "LD": lists the last deaths. + +* Mode "LINKED": displays links to pages assocaited to an individual. + +* Mode "LL": lists the persons who lived the longest. + +* Mode "LM": lists the last marriages. + +* Mode "MISC_NOTES": displays a menu to search in notes. + +* Mode "MISC_NOTES_SEARCH": same as "MISC_NOTES", but with a search argument + (key is `s`) + +* Mode "MOD_DATA": displays a menu for updating Geneweb's dictionary of names, +last names, locations, sources and professions. + +* Mode "MOD_DATA_OK": requests a data modification. + +* Mode "MOD_FAM": displays a form for updating a family (key is `i`). + +* Mode "MOD_FAM_OK": requests a family modification. + +* Mode "MOD_IND": displays a form for updating a person (key is `i`). + +* Mode "MOD_IND_OK": requests a person modification. + +* Mode "MOD_NOTES": displays a text form for writing notes. + +* Mode "MOD_NOTES_OK": requests a note update. + +* Mode "MOD_WIZNOTES": displays the HTML page for editing wizard notes. +Fails if wizard authentification is incorrect or if current user cannot +edit. + +* Mode "MOD_WIZNOTES_OK": requests the wizard note modification. + +* Mode "MRG": displays a menu for merging two persons +(key for persons is `i`). + +* Mode "MRG_DUP": displays a menu for merging possible duplications of persons +(key for persons is `ip`). + +* Mode "MRG_DUP_IND_Y_N": either displays the merge dupliate menu if +`answer_y` is not a key of the request, or a form for merging two +person (whose keys are `i` and `i2`). + +* Mod "MRG_DUP_FAM_Y_N": same than "MRG_DUP_IND_Y_N", but for families. + +* Mode "MRG_FAM": displays a menu for merging families (family keys are `i` +and `i2`). Couples must be identical (modulo reversion). + +* Mode "MRG_FAM_OK": requests the family merge + +* Mode "MRG_MOD_FAM_OK": requests the family modification and merge + +* Mode "MRG_IND": displays a form for merging two persons + +* Mode "MRG_IND_OK": requests a merge of two persons + +* Mode "MRG_MOD_IND_OK": requests a merge & modification of two persons + +* Mode "N": lists all the surnames; if a surname is selected (key is `v`), +displays the list of pages where this surname is used. + +* Mode "NG": same than `N`, but expects a name with the key `n` + +* Mode "NOTES": displays the notes + +* Mode "OA": displays the list of the oldest persons that are still alive or, +if unknown, whose death are not probable + +* Mode "OE": same as "OA", but for engaged couples + +* Mode "P": lists all the first names; if a surname is selected (key is `v`), +displays the list of pages where this name is used. + +* Mode "PQP_PYR": displays a population pyramid (reachable from "STAT") + +* Mode "PS": displays all the persons associated to a given place (`ma` key for +marriage, `bi` key for birth, `bp` key for baptism, `de` key for death and `bu` +key for burial). + +* Mode "R": displays the relationship details between two persons + +* Mode "REQUEST": displays the current request + +* Mode "RL": displays the relationship link between two persons + +* Mode "RLM": displays relation ship details between multiple persons + +* Mode "S": displays the results of a search +(from, for example, the main page). + +* Mode "SRC": displays the file in argument (key is `v`) + +* Mode "STAT": displays several links for statistics: latest births, death, +marriages, the oldest couples, persons that are alive and who lives the longest. +There also is a population pyramid. + +* Mode "CHANGE_WIZ_VIS": displays the connected wizards + +* Mode "TT": displays the titles associated to persons + +* Mode "U": displays the page associated to the template `updmenu.txt` + +* Mode "VIEW_WIZNOTES": Prints the HTML page displaying wizard notes + +* Mode "WIZNOTES": Same as VIEW_WIZNOTES, but fails if not authentificated + +* Mode "WIZNOTES_SEARCH": Same as VIEW_WIZNOTES, but highlights HTML with +the specified string searched (key is `s`). + +Any other mode leads to an incorrect request page (Error 400). + +## Plug-ins +Plus-ins are additional features that can be added to `gwd`. They can register +two kind of services: + +* additional modes: with `GwdPlugin.register`, a plug-in can register new +requests + +* additional computations: with `GwdPlugin.register_se`, a plug-in can register +pre/post processors + +## Customization +Each base can be customized with a `.gwf` file. A documented example is +available on the `etc` directory at the root of the project. +Plug-ins are activated for a base with the `plugin=...` directive in the +configuration file. diff --git a/static/html/_sources/dev-doc/binaries/gwdiff.md.txt b/static/html/_sources/dev-doc/binaries/gwdiff.md.txt new file mode 100644 index 0000000000..869f1c5a81 --- /dev/null +++ b/static/html/_sources/dev-doc/binaries/gwdiff.md.txt @@ -0,0 +1,17 @@ +# gwdiff + +## Documentation + +Target differences between two GeneWeb databases (see README for more details) + +``` +Usage: geneweb.gwdiff [options] base1 base2 +Options are: + -1 : (mandatory) defines starting person in base1 + -2 : (mandatory) defines starting person in base2 + -ad : checks descendants of all ascendants + -d : checks descendants (default) + -html : HTML format used for report + -mem : save memory space, but slower +``` + diff --git a/static/html/_sources/dev-doc/binaries/gwfixbase.md.txt b/static/html/_sources/dev-doc/binaries/gwfixbase.md.txt new file mode 100644 index 0000000000..3b12587d66 --- /dev/null +++ b/static/html/_sources/dev-doc/binaries/gwfixbase.md.txt @@ -0,0 +1,29 @@ +# fixbase + +## Documentation + +Checks the consistency of the base, fixes it and applies +the latest patch if there is one. + +``` +Usage: geneweb.gwfixbase [OPTION] base + -dry-run do not commit changes (only print) + -q quiet mode + -qq very quiet mode + -fast fast mode. Needs more memory. + -families-parents missing doc + -families-children missing doc + -persons-NBDS missing doc + -persons-parents missing doc + -persons-families missing doc + -pevents-witnesses missing doc + -fevents-witnesses missing doc + -marriage-divorce missing doc + -person-key missing doc + -index rebuild index. It is automatically enable by any other option. + -invalid-utf8 missing doc +``` + +## Our recommendations + +- {doc}`/audit/binaries/gwfixbase` diff --git a/static/html/_sources/dev-doc/binaries/gwgc.md.txt b/static/html/_sources/dev-doc/binaries/gwgc.md.txt new file mode 100644 index 0000000000..867e55c4d4 --- /dev/null +++ b/static/html/_sources/dev-doc/binaries/gwgc.md.txt @@ -0,0 +1,11 @@ +# gwgc + +## Documentation + +Simplifies a database by removing unused entries of its dictionary. + +``` +Usage: geneweb.gwgc [OPTION] base + --dry-run do not commit changes (only print) + +``` diff --git a/static/html/_sources/dev-doc/binaries/gwrepl.md.txt b/static/html/_sources/dev-doc/binaries/gwrepl.md.txt new file mode 100644 index 0000000000..f78793826a --- /dev/null +++ b/static/html/_sources/dev-doc/binaries/gwrepl.md.txt @@ -0,0 +1,12 @@ +# gwrepl + +## Documentation + +Starts an OCaml interactive top-level for writing scripts manipulating the +database. It loads all the necessary libraries to use the geneweb +libraries. +For script execution, run: + cat | [ GWREPL_PPF=/dev/null ] [ GWREPL_VERBOSE=1 ] [ GWREPL_FORCE_UNPACK=1 ] [ GWREPL_NOPROMPT=1 ] gwrepl.exe [scrip_arg1] ... + +For interactive top-level, run `gwdrepl.exe`. + diff --git a/static/html/_sources/dev-doc/binaries/gwu.md.txt b/static/html/_sources/dev-doc/binaries/gwu.md.txt new file mode 100644 index 0000000000..1cf2f2e3c7 --- /dev/null +++ b/static/html/_sources/dev-doc/binaries/gwu.md.txt @@ -0,0 +1,41 @@ +# gwu + +## Documentation + +Exports the content of a Geneweb base to a .gw file. + +``` +Usage: geneweb.gwu [OPT] + -odir create files from original name in directory (else on -o file) + -isolated export isolated persons (work only if export all database). + -old_gw do not export additional fields (for backward compatibility: < 7.00) + -raw raw output (without possible utf-8 conversion) + -sep <1st_name.num surname> To use together with the option "-odir": separate this person and all his ancestors and descendants sharing the same surname. All the concerned families are displayed on standard output instead of their associated files. This option can be used several times. + -sep_only_file with option "-sep", tells to separate only groups of that file. + -sep_limit When using the option "-sep", groups of families can become isolated in the files. Gwu reconnects them to the separated families (i.e. displays them to standard output) if the size of these groups is less than 21. The present option changes this limit. + -a maximum generation of the root's ascendants + -ad maximum generation of the root's ascendants descendants + -key key reference of root person. Used for -a/-d options. Can be used multiple times. Key format is "First Name.occ SURNAME" + -c : when a person is born less than years ago, it is not exported unless it is Public. All the spouses and descendants are also censored. + -charset [ASCII|ANSEL|ANSI|UTF-8] set charset; default is UTF-8 + -d maximum generation of the root's descendants. + -mem save memory space, but slower. + -nn no (database) notes. + -nnn no notes (implies -nn). + -nopicture don't extract individual picture. + -o output file name (default: stdout). + -parentship select individuals involved in parentship computation between pairs of keys. Pairs must be defined with -key option, descendant first: e.g. -key "Descendant.0 SURNAME" -key "Ancestor.0 SURNAME". If multiple pair are provided, union of persons are returned. + -picture-path extract pictures path. + -s select this surname (option usable several times, union of surnames will be used). + -source replace individuals and families sources. Also delete event sources. + -v verbose + +``` + +See also: +https://geneweb.tuxfamily.org/wiki/gwu +https://geneweb.tuxfamily.org/wiki/save + +## Our recommendations + +{doc}`/audit/binaries/gwu` \ No newline at end of file diff --git a/static/html/_sources/dev-doc/binaries/gwxjg.md.txt b/static/html/_sources/dev-doc/binaries/gwxjg.md.txt new file mode 100644 index 0000000000..59baf34347 --- /dev/null +++ b/static/html/_sources/dev-doc/binaries/gwxjg.md.txt @@ -0,0 +1,5 @@ +# gwxjg + +WARNING: This is not a plugin, it only provides tools for other plugins to use. +This package provides translation tools from Geneweb structure to Jingoo's type system. + diff --git a/static/html/_sources/dev-doc/binaries/index.rst.txt b/static/html/_sources/dev-doc/binaries/index.rst.txt new file mode 100644 index 0000000000..426c0fc991 --- /dev/null +++ b/static/html/_sources/dev-doc/binaries/index.rst.txt @@ -0,0 +1,9 @@ +Project binaries +================ + +.. toctree:: + :maxdepth: 2 + + official_binaries + plugins + tests diff --git a/static/html/_sources/dev-doc/binaries/jingoo.md.txt b/static/html/_sources/dev-doc/binaries/jingoo.md.txt new file mode 100644 index 0000000000..dd72219f28 --- /dev/null +++ b/static/html/_sources/dev-doc/binaries/jingoo.md.txt @@ -0,0 +1,3 @@ +# jingoo + +WARNING: This is not a plugin. This only loads `geneweb.gwd_lib`. \ No newline at end of file diff --git a/static/html/_sources/dev-doc/binaries/lib_show.md.txt b/static/html/_sources/dev-doc/binaries/lib_show.md.txt new file mode 100644 index 0000000000..6b0dc8d6f3 --- /dev/null +++ b/static/html/_sources/dev-doc/binaries/lib_show.md.txt @@ -0,0 +1,3 @@ +# lib_show + +WARNING: This is not a plugin. This only loads `geneweb.def_show`. \ No newline at end of file diff --git a/static/html/_sources/dev-doc/binaries/no_index.md.txt b/static/html/_sources/dev-doc/binaries/no_index.md.txt new file mode 100644 index 0000000000..41ea17b895 --- /dev/null +++ b/static/html/_sources/dev-doc/binaries/no_index.md.txt @@ -0,0 +1 @@ +# no_index \ No newline at end of file diff --git a/static/html/_sources/dev-doc/binaries/official_binaries.rst.txt b/static/html/_sources/dev-doc/binaries/official_binaries.rst.txt new file mode 100644 index 0000000000..4f8960bb36 --- /dev/null +++ b/static/html/_sources/dev-doc/binaries/official_binaries.rst.txt @@ -0,0 +1,24 @@ +Official binaries +================= + +These binaries are from the official geneweb package. They provide +the core utilities for manipulating databases and a web server. + +.. toctree:: + :maxdepth: 2 + :caption: List of binaries: + + connex + consang + ged2gwb + gwb2ged + gwb2ged + gwc + gwd + gwdiff + gwfixbase + gwgc + gwrepl + gwu + setup + update_nldb diff --git a/static/html/_sources/dev-doc/binaries/plugins.rst.txt b/static/html/_sources/dev-doc/binaries/plugins.rst.txt new file mode 100644 index 0000000000..ae346c37cd --- /dev/null +++ b/static/html/_sources/dev-doc/binaries/plugins.rst.txt @@ -0,0 +1,22 @@ +Plug-ins +======== + +Plug-ins are user-defined scripts that were merged into the main repository. +While they are part of the main branch, their purpose it to let user develop +their own OCaml scripts for updating the behaviour or the web werver `gwd`. + +.. toctree:: + :caption: List of plug-ins: + + cgl + export + fixbase_plugin + forum + gwxjg + jingoo + lib_show + no_index + v7 + v7_im + welcome + xhtml diff --git a/static/html/_sources/dev-doc/binaries/setup.md.txt b/static/html/_sources/dev-doc/binaries/setup.md.txt new file mode 100644 index 0000000000..09fe5965e7 --- /dev/null +++ b/static/html/_sources/dev-doc/binaries/setup.md.txt @@ -0,0 +1,15 @@ +# setup + +The database setup portal. It depends on `wserver`, a library defined in `bin/`. + +``` +Usage: setup.exe [options] where options are: + -bd : Directory where the databases are installed. + -gwd_p : Specify the port number of gwd (default = 2317); > 1024 for normal users. + -lang : default lang + -daemon : Unix daemon mode. + -p : Select a port number (default = 2316); > 1024 for normal users. + -only : File containing the only authorized address + -gd : gwsetup directory + -bindir : binary directory (default = value of option -gd) +``` \ No newline at end of file diff --git a/static/html/_sources/dev-doc/binaries/test.md.txt b/static/html/_sources/dev-doc/binaries/test.md.txt new file mode 100644 index 0000000000..fa696cd990 --- /dev/null +++ b/static/html/_sources/dev-doc/binaries/test.md.txt @@ -0,0 +1,38 @@ +# test + +Starts multiple non-regression tests. Tested modules are `MUtil`, `Util` +(`Test_utils`), the choosen `Sosa` implementation (`Test_sosa`), `Place` +(`Test_place`) and `NotesLink` (`Test_wiki`). +Can be executed with `make test` or `_build/default/test/test.exe`. + +``` +usage: default/test/test.exe options* + -conf fn Read configuration file. + -cache-filename str Cache file to store previous results. (default: /home/ovenstent/gits/geneweb-project/geneweb/_build/oUnit-$(suite_name).cache) + -chooser {failfirst|simple} + Select the method to choose tests to run. (default: simple) + -ci {true|false} Display logs for CI, like Travis and AppVeyor, in the console with colors. (default: false) + -display {true|false} Output logs on screen. (default: true) + -health-check-interval f Seconds between checking health of workers. (default: 1.) + -log-encoding str Encoding of the log. (default: utf-8) + -no-cache-filename Reset value of cache_filename. + -no-output-file Reset value of output_file. + -no-output-html-dir Reset value of output_html_dir. + -no-output-junit-file Reset value of output_junit_file. + -no-testdata-dir Reset value of testdata_dir. + -output-file str Output verbose log in the given file. (default: /home/ovenstent/gits/geneweb-project/geneweb/_build/oUnit-$(suite_name)-$(shard_id).log) + -output-html-dir str Output directory of the HTML files. (default: none) + -output-junit-file str Output file for JUnit. (default: none) + -processes-grace-period f Delay to wait for a process to stop. (default: 5.) + -processes-kill-period f Delay to wait for a process to stop after killing it. (default: 5.) + -results-style-1-X {true|false} Use OUnit 1.X results printer (will be deprecated in 2.1.0+). (default: false) + -run-gc-full-major {true|false} Run a Gc.full_major in between tests. (default: true) + -runner {processes|sequential} + Select a the method to run tests. (default: processes) + -shards i Number of shards to use as worker (threads or processes). (default: 4) + -suite-name str The name of the test suite running. (default: Geneweb) + -testdata-dir str Location of the test data directory (absolute path). (default: none) + -verbose {true|false} Run test in verbose mode. (default: false) + -only-test path Run only the selected tests. + -list-test List tests +``` \ No newline at end of file diff --git a/static/html/_sources/dev-doc/binaries/tests.rst.txt b/static/html/_sources/dev-doc/binaries/tests.rst.txt new file mode 100644 index 0000000000..18a1504898 --- /dev/null +++ b/static/html/_sources/dev-doc/binaries/tests.rst.txt @@ -0,0 +1,9 @@ +Tests +===== + +.. toctree:: + :maxdepth: 2 + :caption: List of binaries: + + test + bench diff --git a/static/html/_sources/dev-doc/binaries/update_nldb.md.txt b/static/html/_sources/dev-doc/binaries/update_nldb.md.txt new file mode 100644 index 0000000000..81e1d8837a --- /dev/null +++ b/static/html/_sources/dev-doc/binaries/update_nldb.md.txt @@ -0,0 +1 @@ +# update_nldb \ No newline at end of file diff --git a/static/html/_sources/dev-doc/binaries/v7.md.txt b/static/html/_sources/dev-doc/binaries/v7.md.txt new file mode 100644 index 0000000000..4da3171a7a --- /dev/null +++ b/static/html/_sources/dev-doc/binaries/v7.md.txt @@ -0,0 +1,4 @@ +# v7 + +Defines new reqursts and redefines some old ones with new changes for the V7. +Registers the requests to the index (""), A, C, D, DOC, L, P, PS and TP. diff --git a/static/html/_sources/dev-doc/binaries/v7_im.md.txt b/static/html/_sources/dev-doc/binaries/v7_im.md.txt new file mode 100644 index 0000000000..245c2acb40 --- /dev/null +++ b/static/html/_sources/dev-doc/binaries/v7_im.md.txt @@ -0,0 +1,4 @@ +# v7_im + +Complements plugin v7 with image handling. +Registers requests DEL_IMAGE, DEL_IMAGE_OK, SND_IMAGE and SND_IMAGE_OK. \ No newline at end of file diff --git a/static/html/_sources/dev-doc/binaries/welcome.md.txt b/static/html/_sources/dev-doc/binaries/welcome.md.txt new file mode 100644 index 0000000000..3ee9ebe53d --- /dev/null +++ b/static/html/_sources/dev-doc/binaries/welcome.md.txt @@ -0,0 +1,4 @@ +# welcome + +This plugin facilitates the main page and search page use. +Registers the requests to the index page and S. \ No newline at end of file diff --git a/static/html/_sources/dev-doc/binaries/xhtml.md.txt b/static/html/_sources/dev-doc/binaries/xhtml.md.txt new file mode 100644 index 0000000000..3486301b7a --- /dev/null +++ b/static/html/_sources/dev-doc/binaries/xhtml.md.txt @@ -0,0 +1,3 @@ +# xhtml + +Replaces the `Content-type` field of requests by `xhtml+xml`. \ No newline at end of file diff --git a/static/html/_sources/dev-doc/geneweb-lib/index.md.txt b/static/html/_sources/dev-doc/geneweb-lib/index.md.txt new file mode 100644 index 0000000000..30940f2d67 --- /dev/null +++ b/static/html/_sources/dev-doc/geneweb-lib/index.md.txt @@ -0,0 +1,112 @@ +# Geneweb library overview + +## Def lib + +### Adef + +This module exposes base types and functions used by many other geneweb's libraries. It defines the types and manipulation functions for: +- Consanguinity degrees +- Dates +- Compressed dates +- Polymorphic couple that regroups parents (father and mother). + +### Def +## Util lib + +### Buff + +Module that defines extenisable buffer and auxilarry functions to store charcacters and strings and get buffer's content. The reason to define this module instead of using standard [Buffer](https://docs.ocaml.pro/docs/LIBRARY.stdlib@ocaml-base-compiler.4.10.0/Stdlib/Buffer/index.html) module is that its +storing functions are more simple to use as an argument to the recursive functions over strings that are very common throughout Geneweb library. + +### Name + +Module that defines some useful functions to construct, format, compress and adopt the strings to represent them as being person surnames/first names. + +### Utf8 + +Utf8 is a module that regroups some standard and useful functions dealing with UTF-8 encoded strings, which differs to standard OCaml module [Stdlib.String](https://docs.ocaml.pro/docs/LIBRARY.stdlib@ocaml-base-compiler.4.10.0/Stdlib/String/index.html), that internally considers the string as a table of bytes (Utf8 consider it as a table of UTF-8 encoded character). The major difference of this module comparing to the similar (like [Camomile](http://camomile.sourceforge.net/)) is that sometimes it makes use of [OCaml implementation](https://github.com/geneweb/unidecode) for [Unidecode](https://pypi.org/project/Unidecode/) library, that is used to convert encoded UTF-8 character to its ASCII representation. + +### Secure + +This module grants additional security layer and controls which directories can be read by the webserver, to prevent malicious users from reading/writing on the server disk. Allowed directories are composed of list of **assets** and the **base directory**. + +### Opt + +Module that defines/redefines some useful functions over `option` type. + +### Lock + +Module that define the flag and the functions that allow +to manage simultaneous accesses to the files by puting a lock on them with `Unix.lockf`. + +### ProgrBar + +Module that provides printing functions that helps to iterate over collections with progressive bar that shows current iteration stage (proportion of current index to total number). Here is an exemple how does it used for iteration over collection with 240 elements : + +```bash + +# start () +............................................................ + +# run 0 240 +|........................................................... + +# run 1 240 +/........................................................... + +# run 2 240 +-........................................................... + +# run 3 240 +\........................................................... + +# run 4 240 +o|.......................................................... + +# sucessive runs + +# run 120 240 + +oooooooooooooooooooooooooooooo|............................. + +``` + +### Mutil + +The main module inside *Util* library that regroups many type of useful functions dealing with : +- File system +- Lists +- Arrays +- Names +- Letters +- IO +- System calls +- Parsing different formats (like lexicon.txt or HTTP header) +- Encoding/decoding + + +### Calendar + +This module defines bindings to [calendars](https://github.com/geneweb/calendars) package that allows to manage different calendar's date. Module exposes functions that: +- Convert SDN (serial day number) to and from one of the date for supported calendars (gregorian, julian, french andhebrew). +- Convert any supported calendar's date to and from gregorian's date. +- Give information about moon's phase and about lunar calendar for the given day (SDN). + +### Date + +*Date* provides usefull functions that helps to compare and to count time elapes between two dates. + +### Pqueue + +This module implements priority queues. All operations are purely applicative (no side effects). +The implementation uses [binomial queues from Chris Okasaki](https://lara.epfl.ch/w/_media/fv20/optimalpurelyfunctionalqueues.pdf). Functions `add`, `take` and `union` are in O(log n) in the worst case. + +### Futil + +This module regroups some usefull functions dealing with polymorphic data types (starts with `gen_`). Particulary it exposes functions that map values inside `gen_` data type. Aditionally it provide `gen_person_misc_names` that computes list of various mix between all kind of name of the person. + +## Gwdb-legacy lib + +### Btree + +Module that is equivalent to [Stdlib.Map](https://ocaml.org/api/Map.html) except some added in output signature functions dealing with keys. \ No newline at end of file diff --git a/static/html/_sources/dev-doc/index.rst.txt b/static/html/_sources/dev-doc/index.rst.txt new file mode 100644 index 0000000000..b4000c0ddb --- /dev/null +++ b/static/html/_sources/dev-doc/index.rst.txt @@ -0,0 +1,23 @@ + +Developer documentation +======================== + +This documentation is an overview of the different components of Geneweb. +It describes: + +- The functioning of the build system; + +- An overview of some libraries defined in the project; + +- A documentation of the main binaries; + +- A documentation for libraries generated with **odoc**. + + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + overview/index + installation/index + binaries/index \ No newline at end of file diff --git a/static/html/_sources/dev-doc/installation/build-system.md.txt b/static/html/_sources/dev-doc/installation/build-system.md.txt new file mode 100644 index 0000000000..3711914f8b --- /dev/null +++ b/static/html/_sources/dev-doc/installation/build-system.md.txt @@ -0,0 +1 @@ +dsd \ No newline at end of file diff --git a/static/html/_sources/dev-doc/installation/index.md.txt b/static/html/_sources/dev-doc/installation/index.md.txt new file mode 100644 index 0000000000..4a604eadbe --- /dev/null +++ b/static/html/_sources/dev-doc/installation/index.md.txt @@ -0,0 +1,824 @@ +# Installation procedure + +## Build documentation +1. Install the dependencies in an opam switch + ``` + $ opam switch create geneweb 4.09.1 + $ opam install . --deps-only + ``` + +2. Run the configuration script + ``` + $ ocaml ./configure.ml + ``` + +3. Build the distibution + ``` + $ make clean distrib + ``` + +## Configure +The `configure.ml` file is an ocaml script whose purpose is to +update `Makefile.config` by setting the environment variables +the `Makefile` needs. + +``` +usage: configure.ml [options] + --gwdb-legacy Use legacy backend + --release Use release profile: no debug informations (defaut: true) + --debug Use dev profile: no optimization, debug informations (default: false) + --sosa-legacy Use legacy Sosa module implementation + --sosa-num Use Sosa module implementation based on `num` library + --sosa-zarith Use Sosa module implementation based on `zarith` library + --syslog Log gwd errors using syslog + -help Display this list of options + --help Display this list of options +``` + +## Build system + +### Makefile + +The root of every action that could be performed on geneweb pass over its **Makefile**. In this section we will describe the variables, targets and its dependencies. + +#### Variables + +Makefile loads variables from **Makefile.config** generated by the configuration script for customised execution of some commands. Variables with suffix `_D` are passed to [cppo](https://github.com/ocaml-community/cppo) command that preprocess files with an equivalent to the C preprocessor. Here is a description of those variables : + +- `OS_TYPE` : kernel name (Linux, Win, Darwin, etc.) +- `STRIP` : command that discards symbols from compiled object files. Depends on kernel (linux command is ```strip```). +- `RM` : command that is used to remove files, directories, etc. Depends on kernel (linux command is ```/bin/rm -f```). +- `EXT` : extension for geneweb executable files. Depends on kernel (on Windows it's *.exe*). +- `GWDB_D` : argument to cppo command that defines a variable that tells which geneweb data base driver implementation will be used (example : *GENEWEB_GWDB_LEGACY*). +- `OS_D` : argument to cppo command that defines a variable for current system (example : *UNIX*). +- `SYSLOG_D` : argument to cppo command that could define a marker variable *SYSLOG*. When defined, activate logging by geneweb server. +- `GWDB_PKG` : dune library that implements geneweb database driver (example : *geneweb.gwdb-legacy*). +- `SOSA_PKG` : dune library that implements sosa (example : *geneweb_sosa_zarith*). +- `SYSLOG_PKG` : if *SYSLOG* is defined, then indicate dune library used for logging functionalities. +- `DUNE_DIRS_EXCLUDE` : specifies directories that will be excluded from *geneweb* library. Used to exclude not chosen implementations for sosa and for geneweb database driver. +- `DUNE_PROFILE` : specifies dune profile (default : release). + +Makefile also defines additional non-configurable variables : + +- `PREFIX` : +- `DISTRIB_DIR` : directory where a local geneweb distribution is stored. +- `BUILD_DISTRIB_DIR` : directory where geneweb executable files for local distribution are stored. +- `BUILD_DIR` : directory where the compiled artefacts are stored. +- `CPPO_D` : regroups all arguments to cppo (`GWDB_D`, `OS_D`, `SYSLOG_D`). If dune's profile is *dev* then also contains the definition of *DEBUG* variable that enables emitting warnings on stderr by geneweb server. +- `BENCH_FILE` : file where benchmark results are stored. + +Nowadays geneweb is entirely compiled by [dune](https://dune.readthedocs.io/en/stable/index.html), due to *dune* files. Non-preprocessed version of *dune* files are stored in *dune.in*. Makefile is responsible for the generation of corresponding *dune* from the *dune.in*. Every *dune* file that should be generated is stored in variable `GENERATED_FILES_DEP` in addition to other files generated by Makefile : + +```Makefile +GENERATED_FILES_DEP = \ + dune-workspace \ + hd/etc/version.txt \ + lib/dune \ + lib/gwdb/dune \ + lib/core/dune \ + lib/gwlib.ml \ + lib/util/dune \ + benchmark/dune \ + bin/connex/dune \ + bin/consang/dune \ + bin/fixbase/dune \ + bin/ged2gwb/dune \ + bin/gwb2ged/dune \ + bin/gwc/dune \ + bin/gwd/dune \ + bin/gwdiff/dune \ + bin/gwgc/dune \ + bin/gwrepl/dune \ + bin/gwrepl/.depend \ + bin/gwu/dune \ + bin/setup/dune \ + bin/update_nldb/dune \ + test/dune \ +``` + +#### Targets + +##### Main targets + +- Makefile.config: configure.ml
      + + Executed when *Makefile.config* isn't up-to-date with *configure.ml*. Prints corresponding error message and terminates execution. This target isn't executed when the goal is `ci` target. + +- lib/gwlib.ml:
      + + Generates the content for *lib/gwlib.ml* that depends on `PREFIX`. + +- bin/gwrepl/.depend:
      + + Generates the content for *bin/gwrepl/.depend*. + +- hd/etc/version.txt:
      + + Generates the content for hd/etc/version.txt that indicates some information about geneweb version like date of compilation and commit used. + +- %/dune: %/dune.in Makefile.config
      + + Generates [dune](https://dune.readthedocs.io/en/stable/dune-files.html#dune) file from corresponding *dune.in* as follows: + - Preprocess with ```cppo -n``` depending on `CPPO_D` argument. + - Remplaces with [sed](https://www.gnu.org/software/sed/manual/sed.html) occurrences of %%%CPPO_D%%%, %%%SOSA_PKG%%%, %%%GWDB_PKG%%%, %%%SYSLOG_PKG%%% and %%%DUNE_DIRS_EXCLUDE%%% by the values of corresponding variables. + +- dune-workspace: dune-workspace.in Makefile.config
      + + Generates [dune-workspace](https://dune.readthedocs.io/en/stable/dune-files.html#dune-workspace) file that is used to define different build contexts and currently selected build profile. Generation is done by replacing the occurrence of %%%DUNE_PROFILE%%% inside *dune-workspace.in* by the value of corresponding variable. + +- build: $(GENERATED_FILES_DEP)
      + + Default goal when ```make``` is called without targets. Executes the target for every file specified in `GENERATED_FILES_DEP` and then build all public artefacts in geneweb package. + +- distrib: build
      + + Principal target. Build entire system and creates a local distibution of geneweb under `DISTRIB_DIR` directory. See for more information. + +- clean:
      + + Removes all generated files that are specified in `GENERATED_FILES_DEP` and `DISTRIB_DIR` + +##### Additional targets + +- generated: $(GENERATED_FILES_DEP)
      + + Executes the target for every file specified in `GENERATED_FILES_DEP`. + +- install: $(GENERATED_FILES_DEP)
      + + Executes the target for every file specified in `GENERATED_FILES_DEP`, compilates all public artefacts and then install geneweb in opam. + +- uninstall: $(GENERATED_FILES_DEP)
      + + Same as **install** but remote geneweb from opam. + +- doc: | $(GENERATED_FILES_DEP)
      + + Generates documentation for all public artefacts in geneweb. Note that prerequisites on the right to `|` are [order-only](https://www.gnu.org/software/make/manual/html_node/Prerequisite-Types.html). + +- test: | $(GENERATED_FILES_DEP)
      + + Executes test suites defined in *test* directory. + +- bench: | $(GENERATED_FILES_DEP)
      + + Executes the benchmark defined in *benchmark* directory. + +- bench-marshal: | $(GENERATED_FILES_DEP)
      + + Executes the benchmark with options ```--marshal --name ${BENCH_NAME} ${BENCH_FILE}``` where `BENCH_NAME` is the name of bench results that will be stored in hash table and marshalled in `BENCH_FILE`. Prerequisite to **ci** target. + +- bench-tabulate: | $(GENERATED_FILES_DEP)
      + + Executes the benchmark with option ```--tabulate ${BENCH_FILE}``` that prints on the screen tables of bench results stored in `BENCH_FILE`. Prerequisite to **ci** target. + +- ci:
      + + - Configure geneweb for every existing implementation of sosa. + - Executes tests and benchmarks (name corresponds to sosa implementation) for each of them (recursive make call with goals **clean**, **test**, **bench-marshal** **clean**). + - Prints all benchmark results (recursive make call with goal **bench-tabulate**). + +### Dune configuration files + +#### dune-project + +This file is used to mark the root of projects as well as define project-wide parameters. In the case of geneweb this file specifies version of the dune configuration files with `lang` stanza and sets the name of project with `name` stanza: + +```lisp +(lang dune 2.8) +(name geneweb) +``` + +#### dune-workspace + +This file is used to define different build contexts and to select a build profile. +Geneweb defines only one `default` context. Build profile (`release` or `dev`) is chosen by configuration script (```--release``` option to use release profile) with subsequent ```make```. + +#### dune + +Dune files used to describe libraries, executables, tests, and everything dune needs to know about. Some of dune files are preprocessed by Makefile in order to remplace all occurences of %%%VARIABLE%%% by their real value (see [Variables](#variables)) In this section we will describe each of those file inside geneweb project. + +```./dune``` + +The root dune file that, in the geneweb case, modifies the environment used with `dev` build profile. Particularly, it passes additional [option](https://ocaml.org/manual/native.html#s:native-options) to the OCaml compiler : + +```bash +-w +a-4-9-35-42-44-48 +``` + +This option tells to compiler to enable all the warnings except : +- Fragile pattern matching. +- Missing fields in a record pattern. +- Unused for-loop index. +- Disambiguated constructor or label name. +- Open statement that shadows an already defined identifier. +- Implicit elimination of optional arguments. + +#### Geneweb library + +```lib/dune``` + +Defines public **geneweb** library . + +- It includes modules under the `lib` directory and every of them is preprocessed with ```cppo```. +- Module *TemplAst* is specified as a module without implementation (has only .mli). +- Module *Templ_parser* is obtained from *templ_parser.mll* with stanza `ocamllex` that makes call for [ocamllex](https://ocaml.org/manual/lexyacc.html#s:ocamllex-overview) lexer. +- Compilation of this library includes compilation of every subdirectory (with `dirs` stanza) except those mentioned in %%%DUNE_DIRS_EXCLUDE%%% variable (not used implementations). +- Depends on geneweb libraries : + - geneweb_core + - geneweb_def + - geneweb_gwdb + - geneweb_sosa_mli + - geneweb_util +- Depends on extrenal libraries : + - [unix](https://docs.ocaml.pro/docs/META.unix@ocamlfind.1.9.1/index.html) + - [str](https://docs.ocaml.pro/docs/META.str@ocamlfind.1.9.1/index.html) + - [stdlib-shims](https://docs.ocaml.pro/docs/META.stdlib-shims@stdlib-shims.0.3.0/index.html) + - [camlp5](https://docs.ocaml.pro/docs/META.camlp5@camlp5.8.00.01/index.html) + - [markup](https://docs.ocaml.pro/docs/META.markup@markup.1.0.0-1/index.html) + +```lib/core/dune``` + +Defines public **geneweb.core** library (locally - **geneweb_core**). + +- It includes modules under the `lib/core` directory and every of them is preprocessed with ```cppo```. +- Depends on geneweb libraries : + - geneweb_def + - geneweb_gwdb + - geneweb_sosa_mli + - geneweb_util +- Depends on extrenal libraries : + - [unix](https://docs.ocaml.pro/docs/META.unix@ocamlfind.1.9.1/index.html) + +```lib/def/dune``` + +Defines public **geneweb.def** library (locally - **geneweb_def**). Includes only two modules : *Adef* and *Def*. + +```lib/gwdb/dune``` + +Defines public **geneweb.gwdb** library (locally - **geneweb_gwdb**). + +- It includes modules under the `lib/gwdb` directory and every of them is preprocessed with ```cppo```. +- Depends on geneweb libraries : + - geneweb_def + - gwdb_driver_mli + - geneweb_util +- Depends on extrenal libraries : + - [unix](https://docs.ocaml.pro/docs/META.unix@ocamlfind.1.9.1/index.html) + +```lib/gwdb_driver.mli/dune``` + +Defines public virtual (that requires an implementation) **geneweb.gwdb_driver** library (locally - **gwdb_driver_mli**). + +- Include only one virtual module *Gwdb_driver*. +- Depends on geneweb libraries : + - geneweb_def +- Depends on extrenal libraries : + - [re](https://docs.ocaml.pro/docs/META.re@re.1.9.0/index.html) + +```lib/gwdb-legacy/dune``` + +Defines public **geneweb.gwdb-legacy** library (locally - **gwdb_legacy**). This library is an implementaion for virtual **gwdb_driver_mli** library. + +- It includes modules under the `lib/gwdb-legacy` directory. +- Module *Dbdisk* is specified as a module without implementation. +- Depends on geneweb libraries : + - geneweb_def + - geneweb_util +- Depends on extrenal libraries : + - [re](https://docs.ocaml.pro/docs/META.re@re.1.9.0/index.html) + - [unix](https://docs.ocaml.pro/docs/META.unix@ocamlfind.1.9.1/index.html) + +```lib/json_export/dune``` + +Defines public **geneweb.export** library (locally - **geneweb_export**). + +- Include only one module *Json_converter*. +- Depends on geneweb libraries : + - geneweb_def + - geneweb_def_show + - geneweb_gwdb +- Depends on extrenal libraries : + - [unix](https://docs.ocaml.pro/docs/META.unix@ocamlfind.1.9.1/index.html) + +```lib/show/dune``` + +Defines public **geneweb.def_show** library (locally - **geneweb_def_show**). + +- Include only one module *Def_show*. This module is preprocessed with [ppx_import](https://github.com/ocaml-ppx/ppx_import) and [ppx_deriving.show](https://github.com/ocaml-ppx/ppx_deriving#plugin-show) PPX rewriters that require feedback from the compilation phase (for that it is used inside `staged_pps` stanza rather than in ordinar `pps`). +- Depends on geneweb libraries : + - geneweb_def + - geneweb_gwdb + +```lib/sosa.mli/dune``` + +Defines public virtual **geneweb.sosa.mli** library (locally - **geneweb_sosa_mli**). Includes only one virtual module *Sosa*. + +```lib/sosa_array/dune``` + +Defines public **geneweb.sosa_array** library (locally - **geneweb_sosa_array**). This library is an one of implementaions for virtual **geneweb_sosa_mli** library. It includes only one module *Sosa*. + +```lib/sosa_num/dune``` + +Defines public **geneweb.sosa_num** library (locally - **geneweb_sosa_num**). This library is an one of implementaions for virtual **geneweb_sosa_mli** library. + +- It includes only one module *Sosa*. +- Depends on extrenal libraries : + - [num](https://docs.ocaml.pro/docs/META.num@num.1.4/index.html) + +```lib/sosa_zarith/dune``` + +Defines public **geneweb.sosa_zarith** library (locally - **geneweb_sosa_zarith**). This library is an one of implementaions for virtual **geneweb_sosa_mli** library. + +- It includes only one module *Sosa*. +- Depends on extrenal libraries : + - [zarith](https://docs.ocaml.pro/docs/META.zarith@zarith.1.11/index.html) + +```lib/util/dune``` + +Defines public **geneweb.util** library (locally - **geneweb_util**). + +- It includes modules under the `lib/util` directory and every of them is preprocessed with ```cppo```. +- Depends on geneweb libraries : + - geneweb_def +- Depends on extrenal libraries : + - [calendars](https://docs.ocaml.pro/docs/META.calendar@calendar.2.04/index.html) + - [stdlib-shims](https://docs.ocaml.pro/docs/META.stdlib-shims@stdlib-shims.0.3.0/index.html) + - [unix](https://docs.ocaml.pro/docs/META.unix@ocamlfind.1.9.1/index.html) + - [unidecode](https://github.com/geneweb/unidecode) + - [re](https://docs.ocaml.pro/docs/META.re@re.1.9.0/index.html) + - [uucp](https://docs.ocaml.pro/docs/META.uucp@uucp.13.0.0/index.html) + - [uunf](https://docs.ocaml.pro/docs/META.uunf@uunf.13.0.0/index.html) + - [uutf](https://docs.ocaml.pro/docs/META.uutf@uutf.1.0.2/index.html) + +##### Geneweb executables + +```bin/connex/dune``` + +Defines public **geneweb.connex** executable (locally - **connex**). + +- It includes only one module *Connex*. +- Depends on geneweb libraries : + - geneweb + - Chosen implementation of gwdb_driver_mli. + - Chosen implementation of geneweb_sosa_mli. +- Depends on extrenal libraries : + - [str](https://docs.ocaml.pro/docs/META.str@ocamlfind.1.9.1/index.html) + - [unix](https://docs.ocaml.pro/docs/META.unix@ocamlfind.1.9.1/index.html) + +```bin/consang/dune``` + +Defines public **geneweb.consang** executable (locally - **consang**). + +- It includes only one module *Consang* that is preprocessed with ```cppo```. +- Depends on geneweb libraries : + - geneweb + - Chosen implementation of gwdb_driver_mli. + - Chosen implementation of geneweb_sosa_mli. +- Depends on extrenal libraries : + - [unix](https://docs.ocaml.pro/docs/META.unix@ocamlfind.1.9.1/index.html) + +```bin/fixbase/dune``` + +Defines public **geneweb.gwfixbase** executable (locally - **gwfixbase**). + +- It includes only one module *Gwfixbase*. +- Depends on geneweb libraries : + - geneweb + - Chosen implementation of gwdb_driver_mli. + - Chosen implementation of geneweb_sosa_mli. +- Depends on extrenal libraries : + - [str](https://docs.ocaml.pro/docs/META.str@ocamlfind.1.9.1/index.html) + - [unix](https://docs.ocaml.pro/docs/META.unix@ocamlfind.1.9.1/index.html) + +```bin/ged2gwb/dune``` + +Defines public **geneweb.ged2gwb** executable (locally - **ged2gwb**). + +- It includes only one module *Ged2gwb* preprocessed by [camlp5o](https://camlp5.github.io/doc/html/) that provides parsing and pretty printing tools. Particulary, it uses following extensions: + - `pr_o.cmo`: pretty print in normal syntax + - `pa_extend.cmo`: syntax extension for grammars + - `q_MLast.cmo`: syntax tree nodes (in revised syntax) +- Depends on geneweb libraries : + - geneweb + - Chosen implementation of gwdb_driver_mli. + - Chosen implementation of geneweb_sosa_mli. +- Depends on extrenal libraries : + - [str](https://docs.ocaml.pro/docs/META.str@ocamlfind.1.9.1/index.html) + - [unix](https://docs.ocaml.pro/docs/META.unix@ocamlfind.1.9.1/index.html) + +```bin/gwb2ged/dune``` + +Defines : +1. Public **geneweb.gwb2ged_lib** library (locally - **gwb2ged_lib**). + - It includes only one module *Gwb2gedLib*. + - Depends on geneweb libraries : + - geneweb + - gwexport_lib +2. Public **geneweb.gwb2ge** executable (locally - **gwb2ged**). + - It includes only one module *Gwb2ged*. + - Depends on geneweb libraries : + - geneweb + - gwb2ged_lib + - gwu_lib + - Chosen implementation of gwdb_driver_mli. + - Chosen implementation of geneweb_sosa_mli. + - Depends on extrenal libraries : + - [str](https://docs.ocaml.pro/docs/META.str@ocamlfind.1.9.1/index.html) + - [unix](https://docs.ocaml.pro/docs/META.unix@ocamlfind.1.9.1/index.html) + +```bin/gwc/dune``` + +Defines public **geneweb.gwc** executable (locally - **gwc**). + +- It includes modules under the `bin/gwc` directory and every of them is preprocessed with ```cppo```. +- Depends on geneweb libraries : + - geneweb + - Chosen implementation of gwdb_driver_mli. + - Chosen implementation of geneweb_sosa_mli. +- Depends on extrenal libraries : + - [unix](https://docs.ocaml.pro/docs/META.unix@ocamlfind.1.9.1/index.html) + +```bin/gwd/dune``` + +Defines: + +1. Public wrapped **geneweb.gwd_lib** library (locally - **gwd_lib**). + - It includes modules *GwdLog*, *GwdPlugin* and *Request* that are preprocessed with ```cppo```. + - Depends on geneweb libraries : + - geneweb + - wserver + - Chosen implementation of gwdb_driver_mli. + - Chosen implementation of geneweb_sosa_mli. +2. Public executable **geneweb.gwd** library (locally - **gwd**). + - It includes modules *Gwd*, *GwdPluginDep*, *GwdPluginMD5*, *GwdPluginMETA* and *Robot* that are preprocessed with ```cppo```. + - Module *GwdPluginMD5* is created by `rule` stanza. Stanza `deps` tells to dune to do firstly: + - Find module *Mk_gwdPluginMD5* + - Construct all recursively defined in ```plugins/``` aliases `@plugin`. + File ```gwdPluginMD5.ml``` is created by running maker script ```mk_gwdPluginMD5.ml``` with path to ```plugins/``` directory specified in argument. + - All the libraies used by executable are compiled with `-linkall` flag. + - Depends on geneweb libraries : + - gwd_lib + - geneweb + - wserver + - Chosen implementation of gwdb_driver_mli. + - Chosen implementation of geneweb_sosa_mli. + - Depends on extrenal libraries : + - [dynlink](https://docs.ocaml.pro/docs/META.dynlink@ocamlfind.1.9.1/index.html) + - [str](https://docs.ocaml.pro/docs/META.str@ocamlfind.1.9.1/index.html) + - [unix](https://docs.ocaml.pro/docs/META.unix@ocamlfind.1.9.1/index.html) + +```bin/gwdiff/dune``` + +Defines public **geneweb.gwdiff** executable (locally - **gwdiff**). + +- It includes only one module *Gwdiff*. +- Depends on geneweb libraries : + - geneweb + - Chosen implementation of gwdb_driver_mli. + - Chosen implementation of geneweb_sosa_mli. +- Depends on extrenal libraries : + - [str](https://docs.ocaml.pro/docs/META.str@ocamlfind.1.9.1/index.html) + - [unix](https://docs.ocaml.pro/docs/META.unix@ocamlfind.1.9.1/index.html) + +```bin/gwexport/dune``` + +Defines public **geneweb.gwexport_lib** library (locally - **gwexport_lib**). + +- It includes only one module *Gwexport*. +- Depends on geneweb libraries : + - geneweb + +```bin/gwgc/dune``` + +Defines public **geneweb.gwgc** executable (locally - **gwgc**). + +- It includes only one module *Gwgc* that is preprocessed with ```cppo```. +- Depends on geneweb libraries : + - geneweb + - Chosen implementation of gwdb_driver_mli. + - Chosen implementation of geneweb_sosa_mli. +- Depends on extrenal libraries : + - [str](https://docs.ocaml.pro/docs/META.str@ocamlfind.1.9.1/index.html) + - [unix](https://docs.ocaml.pro/docs/META.unix@ocamlfind.1.9.1/index.html) + +```bin/gwrepl/dune``` + +Defines: + +1. Private library **gwrepl_deps** that links all dependent libraries. + - Depends on geneweb libraries : + - geneweb_core + - geneweb_def + - geneweb_util + - geneweb_gwdb + - Chosen implementation of gwdb_driver_mli. + - Chosen implementation of geneweb_sosa_mli. + - Depends on external libraries + - [stdlib](https://docs.ocaml.pro/docs/LIBRARY.stdlib@ocaml-base-compiler.4.10.0/index.html) + - [str](https://docs.ocaml.pro/docs/META.str@ocamlfind.1.9.1/index.html) + - [unix](https://docs.ocaml.pro/docs/META.unix@ocamlfind.1.9.1/index.html) +2. Public **gwrepl** executable . + - It includes only two modules *Gwrepl* and *Data*. + - **gwrepl** executable is preprocessed with ```cppo```. + - Module *Data* is created with `rule` stanza from : + - Module *Mk_data* + - File ```.depend``` .
      + File ```data.ml``` is created by running maker script ```mk_data.ml``` that is linked with ```unix.cma``` by OCaml toplevel. + - *Data* is preprocessed with [ppx_blob](https://github.com/johnwhitington/ppx_blob) that is used to extract the content of binary file at compile time. + - It is compiled by bytecode compiler and producing static object files: + ```lisp + (modes byte object) + ``` + - All the libraies used by executable are compiled with `-linkall` flag. + - Linked with ```-custom``` option that is used by bytecode compiler to produce native executable that embeds the ocamlrun virtual machine as well as the byte code. See [dune-executable](https://dune.readthedocs.io/en/stable/dune-files.html#executable). + - Depends on external libraries: + - [compiler-libs.toplevel](https://docs.ocaml.pro/docs/META.compiler-libs.toplevel@ocamlfind.1.9.1/index.html) + - [unix](https://docs.ocaml.pro/docs/META.unix@ocamlfind.1.9.1/index.html) + +```bin/gwu/dune``` + +Defines : +1. Public **geneweb.gwu_lib** library (locally - **gwu_lib**). + - It includes only one module *GwuLib*. + - Depends on geneweb libraries : + - geneweb + - gwexport_lib +2. Public **geneweb.gwu** executable (locally - **gwu**). + - It includes only one module *Gwu*. + - Depends on geneweb libraries : + - geneweb + - gwexport_lib + - gwu_lib + - Chosen implementation of gwdb_driver_mli. + - Chosen implementation of geneweb_sosa_mli. + - Depends on extrenal libraries : + - [str](https://docs.ocaml.pro/docs/META.str@ocamlfind.1.9.1/index.html) + - [unix](https://docs.ocaml.pro/docs/META.unix@ocamlfind.1.9.1/index.html) + +```bin/setup/dune``` + +Defines public **geneweb.setup** executable (locally - **setup**). + +- It includes only one module *Setup* that is preprocessed with ```cppo```. +- Depends on geneweb libraries : + - geneweb + - wserver + - Chosen implementation of gwdb_driver_mli. + - Chosen implementation of geneweb_sosa_mli. +- Depends on extrenal libraries : + - [unix](https://docs.ocaml.pro/docs/META.unix@ocamlfind.1.9.1/index.html) + - [str](https://docs.ocaml.pro/docs/META.str@ocamlfind.1.9.1/index.html) + +```bin/update_nldb/dune``` + +Defines public **geneweb.update_nldb** executable (locally - **update_nldb**). + +- It includes only one module *Update_nldb*. +- Depends on geneweb libraries : + - geneweb + - Chosen implementation of gwdb_driver_mli. + - Chosen implementation of geneweb_sosa_mli. +- Depends on extrenal libraries : + - [str](https://docs.ocaml.pro/docs/META.str@ocamlfind.1.9.1/index.html) + - [unix](https://docs.ocaml.pro/docs/META.unix@ocamlfind.1.9.1/index.html) + + +```bin/wserver/dune``` + +Defines public **geneweb.wserver** library (locally - **wserver**). + +- It includes only one module *Wserver*. +- Depends on geneweb libraries : + - geneweb_util +- Depends on extrenal libraries : + - [unix](https://docs.ocaml.pro/docs/META.unix@ocamlfind.1.9.1/index.html) + +##### Geneweb plugins + +```plugins/cgl/dune``` + +Defines plugin **plugin_cgl**. + +- It includes only one module *Plugin_cgl*. +- Plugin is compiled by native compiler with + ```lisp + (modes (native plugin)) + ``` +- Construction of `@plugin` alias depends on plugin's compilation. +- Depends on geneweb libraries : + - geneweb + - gwd_lib + - wserver + +```plugins/export/dune``` + +Defines plugin **plugin_export**. + +- It includes only one module *Plugin_export*. +- Plugin is compiled by native compiler. +- Construction of `@plugin` alias depends on plugin's compilation. +- Compiled with flags that tells to compiler to disable warnings: + - Innocuous unused variable. + - Constructor or label name used out of scope. +- Linked statically with libraries : + - gwexport_lib + - gwu_lib + - gwb2ged_lib +- Depends on geneweb libraries : + - geneweb + - gwd_lib + - gwb2ged_lib + - gwexport_lib + - gwu_lib + - wserver + +```plugins/fixbase/dune``` + +Defines plugin **plugin_fixbase**. + +- It includes only one module *Plugin_fixbase*. +- Plugin is preprocessed with [ppx_deriving.show](https://github.com/ocaml-ppx/ppx_deriving#plugin-show). +- Plugin is compiled by native compiler with ```-linkall``` option. +- Construction of `@plugin` alias depends on: + - Plugin's compilation + - Every file from *assets* directory. +- Depends on geneweb libraries : + - gwd_lib + - geneweb_def_show + +```plugins/forum/dune``` + +Defines plugin **plugin_forum**. + +- It includes only one module *Plugin_forum* that was obtained by preprocessoing corresponding ```.cppo.ml```. Stanza `rule` in this context is used to remplace lines with directive ```#include``` by one of included file : +```lisp +(rule + (target plugin_forum.ml) + (deps + (:included + %{project_root}/plugins/forum/forum.ml + %{project_root}/plugins/forum/forumDisplay.ml + ) + (:src plugin_forum.cppo.ml) + ) + (action (run %{bin:cppo} %{src} -o %{target})) +``` +- Plugin is compiled by native compiler. +- Construction of `@plugin` alias depends on plugin's compilation. +- Depends on geneweb libraries : + - geneweb + - gwd_lib + - wserver + +```plugins/gwxjg/dune``` + +Defines : + +1. Public **geneweb.plugin_gwxjg_lib** library (locally - **plugin_gwxjg_lib**). + - It includes modules *Gwxjg_ezgw*, *Gwxjg_data*, *Gwxjg_trans* and *Gwxjg_lexicon_parser*. + - Module *Gwxjg_lexicon_parser* is obtained from *gwxjg_lexicon_parser.mll* with stanza `ocamllex` that makes call for [ocamllex](https://ocaml.org/manual/lexyacc.html#s:ocamllex-overview) lexer. + - Compiled with flags that tells to compiler to disable warnings: + - Constructor or label name used out of scope. + - Disambiguated constructor or label name. + - Depends on geneweb libraries : + - geneweb + - Depends on external libraries : + - [jingoo](https://docs.ocaml.pro/docs/META.jingoo@jingoo.1.4.3/index.html) + - [unix](https://docs.ocaml.pro/docs/META.unix@ocamlfind.1.9.1/index.html) +2. Plugin **plugin_gwxjg**. + - It includes only one module *Plugin_gwxjg*. + - Plugin is compiled by native compiler with ```-linkall``` option. + - Construction of `@plugin` alias depends on: + - Plugin's compilation + - *META* file. + - Linked statically with libraries : + - plugin_gwxjg_lib + - Depends on geneweb libraries : + - gwd_lib + - plugin_gwxjg_lib + +```plugins/jingoo/dune``` + +Defines plugin **plugin_jingoo**. + +- It includes only one module *Plugin_jingoo*. +- Plugin is compiled by native compiler with ```-linkall``` option. +- Construction of `@plugin` alias depends on plugin's compilation. +- Linked statically with libraries : + - [jingoo](https://docs.ocaml.pro/docs/META.jingoo@jingoo.1.4.3/index.html) +- Depends on geneweb libraries : + - gwd_lib + +```plugins/lib_show/dune``` + +Defines plugin **plugin_lib_show**. + +- It includes only one module *Plugin_lib_show*. +- Plugin is compiled by native compiler with ```-linkall``` option. +- Construction of `@plugin` alias depends on plugin's compilation. +- Linked statically with libraries : + - geneweb_def_show + +```plugins/no_index/dune``` + +Defines plugin **plugin_no_index**. + +- It includes only one module *Plugin_no_index*. +- Plugin is compiled by native compiler. +- Construction of `@plugin` alias depends on plugin's compilation. +- Depends on geneweb libraries : + - geneweb + - gwd_lib + - wserver + +```plugins/v7/dune``` + +1. Wrapped **plugin_v7_lib** library. + - It includes modules starting with prefix ```V7```. + - Depends on geneweb libraries : + - geneweb + - geneweb_util + - gwd_lib +2. Plugin **plugin_v7**. + - It includes only one module *Plugin_v7*. + - Plugin is compiled by native compiler with ```-linkall``` option. + - Construction of `@plugin` alias depends on: + - Plugin's compilation + - Every file from *assets* directory. + - Linked statically with libraries : + - plugin_v7_lib + - Depends on geneweb libraries : + - gwd_lib + - plugin_v7_lib + +```plugins/v7_im/dune``` + +1. Wrapped **plugin_v7_im_lib** library. + - It includes only one module *V7_im_sendImage*. + - Depends on geneweb libraries : + - geneweb_util + - gwd_lib +2. Plugin **plugin_v7**. + - It includes only one module *Plugin_v7_im*. + - Plugin is compiled by native compiler. + - Construction of `@plugin` alias depends on plugin's compilation. + - Linked statically with libraries : + - plugin_v7_im_lib + - Depends on geneweb libraries : + - gwd_lib + - plugin_v7_im_lib + +```plugins/welcome/dune``` + +Defines plugin **plugin_welcome**. + +- It includes only one module *Plugin_welcome*. +- Plugin is compiled by native compiler with ```-linkall``` option. +- Construction of `@plugin` alias depends on: + - Plugin's compilation. + - Every file from *assets* directory. + - *META* file. +- Depends on geneweb libraries : + - gwd_lib + - wserver + - plugin_v7_lib + +##### Geneweb tests + +```test/dune``` + +Defines: + +1. **dummy_gwdb** library that is an implementation for **gwdb_driver_mli** virtual library. + - It includes only one module *Gwdb_driver*. + - Depends on geneweb libraries: + - geneweb_def + - Depends on external libraries: + - [stdlib-shims](https://docs.ocaml.pro/docs/META.stdlib-shims@stdlib-shims.0.3.0/index.html) +2. **test** executable. + - It includes modules starting with prefix ```Test``` that are preprocessed with [ppx_deriving.show](https://github.com/ocaml-ppx/ppx_deriving#plugin-show) PPX rewriter. + - Construction of `@runtest` alias depends on execution of **test**. + - Depends on geneweb libraries: + - geneweb + - dummy_gwdb + - Chosen implementation of geneweb_sosa_mli. + - Depends on external libraries: + - [stdlib-shims](https://docs.ocaml.pro/docs/META.stdlib-shims@stdlib-shims.0.3.0/index.html) + - [oUnit](https://docs.ocaml.pro/docs/META.oUnit@ounit.2.0.8/index.html) + +##### Geneweb benchmarks + +```benchmark/dune``` + +Defines **bench** executable. + +- It includes only one module *Bench* that is preprocessed with ```cppo```. +- Construction of `@runbench` alias depends on execution of **bench**. +- Depends on geneweb libraries : + - geneweb + - Chosen implementation of gwdb_driver_mli. + - Chosen implementation of geneweb_sosa_mli. +- Depends on extrenal libraries : + - [unix](https://docs.ocaml.pro/docs/META.unix@ocamlfind.1.9.1/index.html) + - [benchmark](https://docs.ocaml.pro/docs/META.benchmark@benchmark.1.6/index.html) diff --git a/static/html/_sources/dev-doc/overview/database.md.txt b/static/html/_sources/dev-doc/overview/database.md.txt new file mode 100644 index 0000000000..afa153d85d --- /dev/null +++ b/static/html/_sources/dev-doc/overview/database.md.txt @@ -0,0 +1,146 @@ +# Database overview + +## Gw files + +Genealogy database could be created by Geneweb from one or from multiple source files with *.gw* extension. Those files describe structurally persons, families all kinds of relationships, different events, etc. You can read more about the file structure [here](https://geneweb.tuxfamily.org/wiki/gw). Binary executable `gwc` reads files *.gw*, extracts all persons and families information and passes it to the **Gwdb** module in order to create the database. + +## Database entries + +Transmitted to **Gwdb** information is composed mainly from: + +- Array of all strings that could be any kind of information encoded as a string, like for example: person's name, birth place, marriage place, etc. Identifier `istr` allows to reference the string in the given array (index of an element inside the array). + +- Array of persons where each element encompasses information about one person. Every string field of a person (like his name, birthplace, etc.) is an identifier where the real string is stored in array mentioned before. Reference to other persons by means of identifier `iper` that reference person in the current array (index of an element inside the persons array). + +- Array of families where each element encompasses information about one family (couple, children, marriage date, etc.). Identifier `ifam` allows to reference the family in the given array (index of element inside the array). + +Each array keeps a data structure defined in the module **Def**. Further, those entries will be the main source for every database request. + +## Storage + +**Gwdb** is responsible for creating the database on the disk from the provided inputs. It creates a directory `dbname.gwb` containing several +files. The main file `base` contains marshalled representation of each array and `base.acc` stores offsets to every entry entry that allows to make constant time access. Additionally, it creates some index files that associate useful for requests information to the entry's identifier in the `base` file. That helps to requests to find instantly entry without iteration over all existing ones in the database. For example `strings.inx` is a string index that allows to find id for a searched string. One file is slightly different: the `patches` file. It stores every modification done inside the base (see [Modifications](#modifications) subsection). The storage manipulation interface is described in `lib/gwdb_driver.mli/gwdb_driver.mli`. This is a virtual module whose +current implementation is available on `gwdb-legacy`. Format and description for every database file is listed below: + +```text +base - the base itself + magic number (magic_gwb) : string of length 8 + number of persons : binary_int + number of families : binary_int + number of strings : binary_int + persons array offset in file : binary_int + ascends array offset in file : binary_int + unions array offset in file : binary_int + families array offset in file : binary_int + couples array offset in file : binary_int + descends array offset in file : binary_int + strings array offset in file : binary_int + notes origin file : value + persons array : value + ascends array : value + unions array : value + families array : value + couples array : value + descends array : value + strings array : value + +base.acc - direct accesses to arrays inside base + persons offsets : array of binary_ints + ascends offsets : array of binary_ints + unions offsets : array of binary_ints + families offsets : array of binary_ints + couples offsets : array of binary_ints + descends offsets : array of binary_ints + strings offsets : array of binary_ints + +names.inx - index for names, strings of first names and surnames + offset to sindex : binary_int + offset to findex : binary_int + 1st index (mixes between names) : value + array, length = 16383, associating: + - a hash value of a "crushed" (module "Name") name + (modulo length) + - to the array of ids of the corresponding persons + 2nd index (surnames sub-strings) : value + array, length = "table_size", associating: + - a hash value of the "crushed" (module "Name") surname + sub-string (modulo length) + - to the array of the corresponding surnnames (string ids) + that contain giving surname sub-string + 3rd index (first name sub-strings) : value + array, length = 16383, associating: + - a hash value of the "crushed" (module "Name") first name + sub-string (modulo length) + - to the array of the corresponding string ids that contains + giving first name sub-string + +names.acc - direct accesses to values inside arrays in names.inx + +strings.inx - index for all strings + length of the strings offset array : binary_int + strings hash table index : 2 arrays of binary_ints + strings offset array (length = prime after 10 * strings + array length) + - associating a hash value of the string modulo length + - to its id in the string array + strings list array (length = string array length) + - associating a string id + - to the id of the next index (previous value) holding the + same hash value + +snames.inx - index for surnames + array ordered by surname + - associating the string id of a surname + - to a pointer (offset) inside snames.dat + +snames.dat - data associated with snames.inx + array of list of persons holding a surname + +fnames.inx - index for first names + array ordered by first name + - associating the string id of a first name + - to a pointer (offset) inside fnames.dat + +fnames.dat - data associated with fnames.inx + array of list of persons holding a first name + +notes - text file containing data base notes. + +notes_d - directory containing .txt for each extended page + +particles.txt - text file with autorised name's particles + +patches - modification inside the database + When updated, none of the previous files are modified. + Only this one is written and rewritten. It holds a record + of type "patches", composed of association lists + "index" - "new value". + +nb_persons - number of real persons (with those added by patches) + +synchro_patches - timestamped history of base's modifications. + +restrict - defines visibility of each person in the base + +``` + +## Modifications + +When a modification is requested, geneweb does not update `base` file itself. It +completes the `patches` file containing all the latest modifications on the +base. Every modification (patch) done is pended until patches are committed with `commit_patches` request. +Commit performs update of the `patches` file. + +Patching signifies only operations that add or modify an entry. Entry suppression is done quite differently. +It is replaced by a *dummy* entry and then removed by Geneweb's garbage collector `gwgc` that performs compaction +of database arrays. Another useful `fixbase` tool, locates and fixes inconsistencies on the base and updates all database files. + +## Example + +Here is an example how Geneweb displays birth dates of persons that have given name (let's say "Pierre") without considering caches: + +- Firstly, it makes dichotomous search inside `fnames.inx` of a string id (`istr`) that references "Pierre" +- Then it reads (with associated to "Pierre" offset from `fnames.inx`) position in the file `fnames.data` where list of ids of persons (`iper`) with first name "Pierre" are stored. +- For every person's id it gets person's entry offset from `base.acc` file +- Then it reads person's entry with giving offset and get field associated to the birth date. +- Displays all extracted birth dates. diff --git a/static/html/_sources/dev-doc/overview/index.rst.txt b/static/html/_sources/dev-doc/overview/index.rst.txt new file mode 100644 index 0000000000..7759c4c5fc --- /dev/null +++ b/static/html/_sources/dev-doc/overview/index.rst.txt @@ -0,0 +1,167 @@ + +Overview +======== + +How to start a Geneweb server +----------------------------- + +Starting the server +~~~~~~~~~~~~~~~~~~~ + +Starting a Geneweb web server requires two tools: + +- :code:`gwd`, the actual web server; +- :code:`setup`, the database setup portal. + +These two tools are part of the main distribution and can be found on :code:`_build`. +If you built the project with :code:`make clean distrib`, two scripts are available on +the directory :code:`distribution/`. Keep in mind they are scripts wrapping the actual +binaries. + +To start the server on the current directory:: + + _build/install/default/bin/geneweb.gwd -hd + +This will start the main web server on port 2317. + +To start the setup server on the current directory:: + + _build/default/bin/setup/setup.exe -gd + +This will start the setup server on port 2316. + +Configuration +~~~~~~~~~~~~~ + +Geneweb can be configured by defining a `.gwb` file. An example is +available in the :code:`etc` directory. + +Architecture of Geneweb +----------------------- + +Geneweb is built from three main components: + +- the storage of the genealogical trees, divided in a patch file and the actual data; +- the libraries, reading the data from the storage and writing the patch file +- the binaries and the web server, reading and writing the storage + +.. image:: diagram.png + +Storage architecture +~~~~~~~~~~~~~~~~~~~~ + +.. toctree:: + :maxdepth: 2 + + database + +Libraries +--------- + + +- `Util`: a library with miscellaneous useful modules for manipulating + base data types. + +- `Def`: the definition of the main type definitions used in Geneweb trees. + +- `Sosa`: describes a Sosa-Stradonitz numbering (known an + Ahnentafel numbering), associating natural identifiers to individuals. This + library is virtual and has three different implementations. One of these + implementations is selected by the configuration script. + + * `Sosa_array` is one of the `sosa` implementations. It represents naturals + as pair of integers stored in an array `a` such that + `sosa = a.(0) + base * a(1)`) where `base` is a hardcoded constant. + + * `Sosa_num` is one of the `sosa` implementation based on the `Big_int` + library. + + * `Sosa_zarith` is one of the `sosa` implementation based on the `Zarith` + library. + +- `Gwdb_driver`: describes the storage implementation. While it is + virtual, it currently has only one implementation, `gwdb-legacy`. It is wrapped + by the `gwdb` library that exports many tools for database updates. + +- `Core`: core of Geneweb for calculating consanguinity between persons. + +- `Geneweb_export` : provides a functor for defining Json convertors for Geneweb's + datatypes. + +- `Def_show`: defines formatters and `string` converters for Geneweb's datatypes. + +- `Geneweb`: the main library. It contains several kinds of files, from + utilitarian modules to HTML generation. + +- `Gwb2gedLib`: defines a function for exporting a base to a GEDCOM file. + +- `Wserver`: a light-weight web server, used by `gwd` and `setup`. + +- `Gwd_lib`: defines additional modules for the `gwd` web server. + +- `GwuLib`: defines useful functions for exporting a database to a `.gw` file. + +The documentation of each module is available on the automatically generated +documentation of geneweb (`$ make doc`) + + +Binaries +~~~~~~~~ + +Official binaries +----------------- + +Here are the binaries maintained by Geneweb: + +- `Connex <../binaries/connex.html>`_: calculates connex components of a base; + +- `Consang <../binaries/consang.html>`_: calculates the consanguinity level of individuals; + +- `Ged2gwb <../binaries/ged2gwb.html>`_: imports a GEDCOM 5.5.1 file to a Geneweb base; + +- `Gwb2ged <../binaries/gwb2ged.html>`_: exports a base to a GEDCOM 5.5.1 base; + +- `Gwc <../binaries/gwc.html>`_: creates a new database; + +- `Gwd <../binaries/gwd.html>`_: starts Geneweb's main web server which allows to interact with bases; + +- `Gwdiff <../binaries/gwdiff.html>`_: targets differences between two databases; + +- `Fixbase <../binaries/gwfixbase.html>`_: checks the consistency of a base and applies patches; + +- `Gwgc <../binaries/gwgc.html>`_: removes unused entries in Geneweb's arrays; + +- `Gwrepl <../binaries/gwrepl.html>`_: an OCaml interactive top level, useful for scripts; + +- `Gwu <../binaries/gwu.html>`_: exports a base to a :code:`.gw` file; + +- `Setup <../binaries/setup.html>`_: a web server for selecting and creating databases. + +.. toctree:: + :maxdepth: 1 + :caption: For mor details about every binary, see: + + ../binaries/official_binaries + +Web-server and plug-ins +----------------------- + +The :code:`gwd` web server is customizable with plug-ins; code replacing +the original behaviour of the web server handling requests. They are +dynamically loaded by :code:`gwd` at its start and each base can be activated +through the :code:`.gwb` file (:code:`plugins=*` for activating all plug-ins, +otherwise :code:`plugins=p1,p2,...`). + +A plug-in is composed of its code, a :code:`dune` file for building and a +:code:`META` file, containing some informations about the plug-in itself. + +Here is an example of :code:`META` file: + +``` +version:1 +maintainers:OCamlPro +depends:plugin1,plugin2 +``` + +The only field taken into account by `gwd` is `depends` as it is used to +check there are no circular dependencies between plug-ins. diff --git a/static/html/_sources/index.rst.txt b/static/html/_sources/index.rst.txt new file mode 100644 index 0000000000..828c677972 --- /dev/null +++ b/static/html/_sources/index.rst.txt @@ -0,0 +1,38 @@ +.. audit documentation master file, created by + sphinx-quickstart on Mon Nov 22 11:15:19 2021. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to Geneweb Audit's Documentation! +========================================= + +This document is one of the results of OCamlPro's first mission over Geneweb. +It consists mainly of two parts: + +- A developer documentation, complementing the `Geneweb wiki `_. + In turn, it provides an overview of the main components of Geneweb, in addition to the documentation for its + code part generated using **odoc**. + +- An audit that gives recommendations starting from comments on the source code and ending with long term improvement + advices. It was based on this `commit `_. + +In addition to the document, a `PR `_ makes part of the mission results that, in turn : + +* Adds interfaces and documentation to the most of existing modules; +* Fixes: + * CI execution with *appveyor.yml*; + * Access to assets files with Secure module. + +.. toctree:: + :maxdepth: 3 + :caption: Contents: + + dev-doc/index + audit/index + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/static/html/_static/alabaster.css b/static/html/_static/alabaster.css new file mode 100644 index 0000000000..0eddaeb07d --- /dev/null +++ b/static/html/_static/alabaster.css @@ -0,0 +1,701 @@ +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: Georgia, serif; + font-size: 17px; + background-color: #fff; + color: #000; + margin: 0; + padding: 0; +} + + +div.document { + width: 940px; + margin: 30px auto 0 auto; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 220px; +} + +div.sphinxsidebar { + width: 220px; + font-size: 14px; + line-height: 1.5; +} + +hr { + border: 1px solid #B1B4B6; +} + +div.body { + background-color: #fff; + color: #3E4349; + padding: 0 30px 0 30px; +} + +div.body > .section { + text-align: left; +} + +div.footer { + width: 940px; + margin: 20px auto 30px auto; + font-size: 14px; + color: #888; + text-align: right; +} + +div.footer a { + color: #888; +} + +p.caption { + font-family: inherit; + font-size: inherit; +} + + +div.relations { + display: none; +} + + +div.sphinxsidebar a { + color: #444; + text-decoration: none; + border-bottom: 1px dotted #999; +} + +div.sphinxsidebar a:hover { + border-bottom: 1px solid #999; +} + +div.sphinxsidebarwrapper { + padding: 18px 10px; +} + +div.sphinxsidebarwrapper p.logo { + padding: 0; + margin: -10px 0 0 0px; + text-align: center; +} + +div.sphinxsidebarwrapper h1.logo { + margin-top: -10px; + text-align: center; + margin-bottom: 5px; + text-align: left; +} + +div.sphinxsidebarwrapper h1.logo-name { + margin-top: 0px; +} + +div.sphinxsidebarwrapper p.blurb { + margin-top: 0; + font-style: normal; +} + +div.sphinxsidebar h3, +div.sphinxsidebar h4 { + font-family: Georgia, serif; + color: #444; + font-size: 24px; + font-weight: normal; + margin: 0 0 5px 0; + padding: 0; +} + +div.sphinxsidebar h4 { + font-size: 20px; +} + +div.sphinxsidebar h3 a { + color: #444; +} + +div.sphinxsidebar p.logo a, +div.sphinxsidebar h3 a, +div.sphinxsidebar p.logo a:hover, +div.sphinxsidebar h3 a:hover { + border: none; +} + +div.sphinxsidebar p { + color: #555; + margin: 10px 0; +} + +div.sphinxsidebar ul { + margin: 10px 0; + padding: 0; + color: #000; +} + +div.sphinxsidebar ul li.toctree-l1 > a { + font-size: 120%; +} + +div.sphinxsidebar ul li.toctree-l2 > a { + font-size: 110%; +} + +div.sphinxsidebar input { + border: 1px solid #CCC; + font-family: Georgia, serif; + font-size: 1em; +} + +div.sphinxsidebar hr { + border: none; + height: 1px; + color: #AAA; + background: #AAA; + + text-align: left; + margin-left: 0; + width: 50%; +} + +div.sphinxsidebar .badge { + border-bottom: none; +} + +div.sphinxsidebar .badge:hover { + border-bottom: none; +} + +/* To address an issue with donation coming after search */ +div.sphinxsidebar h3.donation { + margin-top: 10px; +} + +/* -- body styles ----------------------------------------------------------- */ + +a { + color: #004B6B; + text-decoration: underline; +} + +a:hover { + color: #6D4100; + text-decoration: underline; +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: Georgia, serif; + font-weight: normal; + margin: 30px 0px 10px 0px; + padding: 0; +} + +div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } +div.body h2 { font-size: 180%; } +div.body h3 { font-size: 150%; } +div.body h4 { font-size: 130%; } +div.body h5 { font-size: 100%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #DDD; + padding: 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + color: #444; + background: #EAEAEA; +} + +div.body p, div.body dd, div.body li { + line-height: 1.4em; +} + +div.admonition { + margin: 20px 0px; + padding: 10px 30px; + background-color: #EEE; + border: 1px solid #CCC; +} + +div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fafafa; +} + +div.admonition p.admonition-title { + font-family: Georgia, serif; + font-weight: normal; + font-size: 24px; + margin: 0 0 10px 0; + padding: 0; + line-height: 1; +} + +div.admonition p.last { + margin-bottom: 0; +} + +div.highlight { + background-color: #fff; +} + +dt:target, .highlight { + background: #FAF3E8; +} + +div.warning { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.danger { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.error { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.caution { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.attention { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.important { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.note { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.tip { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.hint { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.seealso { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.topic { + background-color: #EEE; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre, tt, code { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 0.9em; +} + +.hll { + background-color: #FFC; + margin: 0 -12px; + padding: 0 12px; + display: block; +} + +img.screenshot { +} + +tt.descname, tt.descclassname, code.descname, code.descclassname { + font-size: 0.95em; +} + +tt.descname, code.descname { + padding-right: 0.08em; +} + +img.screenshot { + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils { + border: 1px solid #888; + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils td, table.docutils th { + border: 1px solid #888; + padding: 0.25em 0.7em; +} + +table.field-list, table.footnote { + border: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +table.footnote { + margin: 15px 0; + width: 100%; + border: 1px solid #EEE; + background: #FDFDFD; + font-size: 0.9em; +} + +table.footnote + table.footnote { + margin-top: -15px; + border-top: none; +} + +table.field-list th { + padding: 0 0.8em 0 0; +} + +table.field-list td { + padding: 0; +} + +table.field-list p { + margin-bottom: 0.8em; +} + +/* Cloned from + * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68 + */ +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +table.footnote td.label { + width: .1px; + padding: 0.3em 0 0.3em 0.5em; +} + +table.footnote td { + padding: 0.3em 0.5em; +} + +dl { + margin: 0; + padding: 0; +} + +dl dd { + margin-left: 30px; +} + +blockquote { + margin: 0 0 0 30px; + padding: 0; +} + +ul, ol { + /* Matches the 30px from the narrow-screen "li > ul" selector below */ + margin: 10px 0 10px 30px; + padding: 0; +} + +pre { + background: #EEE; + padding: 7px 30px; + margin: 15px 0px; + line-height: 1.3em; +} + +div.viewcode-block:target { + background: #ffd; +} + +dl pre, blockquote pre, li pre { + margin-left: 0; + padding-left: 30px; +} + +tt, code { + background-color: #ecf0f3; + color: #222; + /* padding: 1px 2px; */ +} + +tt.xref, code.xref, a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fff; +} + +a.reference { + text-decoration: none; + border-bottom: 1px dotted #004B6B; +} + +/* Don't put an underline on images */ +a.image-reference, a.image-reference:hover { + border-bottom: none; +} + +a.reference:hover { + border-bottom: 1px solid #6D4100; +} + +a.footnote-reference { + text-decoration: none; + font-size: 0.7em; + vertical-align: top; + border-bottom: 1px dotted #004B6B; +} + +a.footnote-reference:hover { + border-bottom: 1px solid #6D4100; +} + +a:hover tt, a:hover code { + background: #EEE; +} + + +@media screen and (max-width: 870px) { + + div.sphinxsidebar { + display: none; + } + + div.document { + width: 100%; + + } + + div.documentwrapper { + margin-left: 0; + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + } + + div.bodywrapper { + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + margin-left: 0; + } + + ul { + margin-left: 0; + } + + li > ul { + /* Matches the 30px from the "ul, ol" selector above */ + margin-left: 30px; + } + + .document { + width: auto; + } + + .footer { + width: auto; + } + + .bodywrapper { + margin: 0; + } + + .footer { + width: auto; + } + + .github { + display: none; + } + + + +} + + + +@media screen and (max-width: 875px) { + + body { + margin: 0; + padding: 20px 30px; + } + + div.documentwrapper { + float: none; + background: #fff; + } + + div.sphinxsidebar { + display: block; + float: none; + width: 102.5%; + margin: 50px -30px -20px -30px; + padding: 10px 20px; + background: #333; + color: #FFF; + } + + div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, + div.sphinxsidebar h3 a { + color: #fff; + } + + div.sphinxsidebar a { + color: #AAA; + } + + div.sphinxsidebar p.logo { + display: none; + } + + div.document { + width: 100%; + margin: 0; + } + + div.footer { + display: none; + } + + div.bodywrapper { + margin: 0; + } + + div.body { + min-height: 0; + padding: 0; + } + + .rtd_doc_footer { + display: none; + } + + .document { + width: auto; + } + + .footer { + width: auto; + } + + .footer { + width: auto; + } + + .github { + display: none; + } +} + + +/* misc. */ + +.revsys-inline { + display: none!important; +} + +/* Make nested-list/multi-paragraph items look better in Releases changelog + * pages. Without this, docutils' magical list fuckery causes inconsistent + * formatting between different release sub-lists. + */ +div#changelog > div.section > ul > li > p:only-child { + margin-bottom: 0; +} + +/* Hide fugly table cell borders in ..bibliography:: directive output */ +table.docutils.citation, table.docutils.citation td, table.docutils.citation th { + border: none; + /* Below needed in some edge cases; if not applied, bottom shadows appear */ + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + + +/* relbar */ + +.related { + line-height: 30px; + width: 100%; + font-size: 0.9rem; +} + +.related.top { + border-bottom: 1px solid #EEE; + margin-bottom: 20px; +} + +.related.bottom { + border-top: 1px solid #EEE; +} + +.related ul { + padding: 0; + margin: 0; + list-style: none; +} + +.related li { + display: inline; +} + +nav#rellinks { + float: right; +} + +nav#rellinks li+li:before { + content: "|"; +} + +nav#breadcrumbs li+li:before { + content: "\00BB"; +} + +/* Hide certain items when printing */ +@media print { + div.related { + display: none; + } +} \ No newline at end of file diff --git a/static/html/_static/basic.css b/static/html/_static/basic.css new file mode 100644 index 0000000000..be19270e4a --- /dev/null +++ b/static/html/_static/basic.css @@ -0,0 +1,856 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li div.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 450px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a.brackets:before, +span.brackets > a:before{ + content: "["; +} + +a.brackets:after, +span.brackets > a:after { + content: "]"; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +table.footnote td, table.footnote th { + border: 0 !important; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +dl.footnote > dt, +dl.citation > dt { + float: left; + margin-right: 0.5em; +} + +dl.footnote > dd, +dl.citation > dd { + margin-bottom: 0em; +} + +dl.footnote > dd:after, +dl.citation > dd:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dt:after { + content: ":"; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0.5em; + content: ":"; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.doctest > div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.descname { + background-color: transparent; + font-weight: bold; + font-size: 1.2em; +} + +code.descclassname { + background-color: transparent; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/static/html/_static/custom.css b/static/html/_static/custom.css new file mode 100644 index 0000000000..2a924f1d6a --- /dev/null +++ b/static/html/_static/custom.css @@ -0,0 +1 @@ +/* This file intentionally left blank. */ diff --git a/static/html/_static/doctools.js b/static/html/_static/doctools.js new file mode 100644 index 0000000000..61ac9d266f --- /dev/null +++ b/static/html/_static/doctools.js @@ -0,0 +1,321 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for all documentation. + * + * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/** + * select a different prefix for underscore + */ +$u = _.noConflict(); + +/** + * make the code below compatible with browsers without + * an installed firebug like debugger +if (!window.console || !console.firebug) { + var names = ["log", "debug", "info", "warn", "error", "assert", "dir", + "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", + "profile", "profileEnd"]; + window.console = {}; + for (var i = 0; i < names.length; ++i) + window.console[names[i]] = function() {}; +} + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} + +/** + * Small JavaScript module for the documentation. + */ +var Documentation = { + + init : function() { + this.fixFirefoxAnchorBug(); + this.highlightSearchWords(); + this.initIndexTable(); + if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) { + this.initOnKeyListeners(); + } + }, + + /** + * i18n support + */ + TRANSLATIONS : {}, + PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, + LOCALE : 'unknown', + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext : function(string) { + var translated = Documentation.TRANSLATIONS[string]; + if (typeof translated === 'undefined') + return string; + return (typeof translated === 'string') ? translated : translated[0]; + }, + + ngettext : function(singular, plural, n) { + var translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated === 'undefined') + return (n == 1) ? singular : plural; + return translated[Documentation.PLURALEXPR(n)]; + }, + + addTranslations : function(catalog) { + for (var key in catalog.messages) + this.TRANSLATIONS[key] = catalog.messages[key]; + this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); + this.LOCALE = catalog.locale; + }, + + /** + * add context elements like header anchor links + */ + addContextElements : function() { + $('div[id] > :header:first').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this headline')). + appendTo(this); + }); + $('dt[id]').each(function() { + $('
      \u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this definition')). + appendTo(this); + }); + }, + + /** + * workaround a firefox stupidity + * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 + */ + fixFirefoxAnchorBug : function() { + if (document.location.hash && $.browser.mozilla) + window.setTimeout(function() { + document.location.href += ''; + }, 10); + }, + + /** + * highlight the search words provided in the url in the text + */ + highlightSearchWords : function() { + var params = $.getQueryParameters(); + var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; + if (terms.length) { + var body = $('div.body'); + if (!body.length) { + body = $('body'); + } + window.setTimeout(function() { + $.each(terms, function() { + body.highlightText(this.toLowerCase(), 'highlighted'); + }); + }, 10); + $('') + .appendTo($('#searchbox')); + } + }, + + /** + * init the domain index toggle buttons + */ + initIndexTable : function() { + var togglers = $('img.toggler').click(function() { + var src = $(this).attr('src'); + var idnum = $(this).attr('id').substr(7); + $('tr.cg-' + idnum).toggle(); + if (src.substr(-9) === 'minus.png') + $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); + else + $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); + }).css('display', ''); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { + togglers.click(); + } + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords : function() { + $('#searchbox .highlight-link').fadeOut(300); + $('span.highlighted').removeClass('highlighted'); + }, + + /** + * make the url absolute + */ + makeURL : function(relativeURL) { + return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; + }, + + /** + * get the current relative url + */ + getCurrentURL : function() { + var path = document.location.pathname; + var parts = path.split(/\//); + $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { + if (this === '..') + parts.pop(); + }); + var url = parts.join('/'); + return path.substring(url.lastIndexOf('/') + 1, path.length - 1); + }, + + initOnKeyListeners: function() { + $(document).keydown(function(event) { + var activeElementType = document.activeElement.tagName; + // don't navigate when in search box, textarea, dropdown or button + if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT' + && activeElementType !== 'BUTTON' && !event.altKey && !event.ctrlKey && !event.metaKey + && !event.shiftKey) { + switch (event.keyCode) { + case 37: // left + var prevHref = $('link[rel="prev"]').prop('href'); + if (prevHref) { + window.location.href = prevHref; + return false; + } + case 39: // right + var nextHref = $('link[rel="next"]').prop('href'); + if (nextHref) { + window.location.href = nextHref; + return false; + } + } + } + }); + } +}; + +// quick alias for translations +_ = Documentation.gettext; + +$(document).ready(function() { + Documentation.init(); +}); diff --git a/static/html/_static/documentation_options.js b/static/html/_static/documentation_options.js new file mode 100644 index 0000000000..8839ac8c2c --- /dev/null +++ b/static/html/_static/documentation_options.js @@ -0,0 +1,12 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '0.1', + LANGUAGE: 'None', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false +}; \ No newline at end of file diff --git a/static/html/_static/file.png b/static/html/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..a858a410e4faa62ce324d814e4b816fff83a6fb3 GIT binary patch literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( literal 0 HcmV?d00001 diff --git a/static/html/_static/jquery-3.5.1.js b/static/html/_static/jquery-3.5.1.js new file mode 100644 index 0000000000..50937333b9 --- /dev/null +++ b/static/html/_static/jquery-3.5.1.js @@ -0,0 +1,10872 @@ +/*! + * jQuery JavaScript Library v3.5.1 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2020-05-04T22:49Z + */ +( function( global, factory ) { + + "use strict"; + + if ( typeof module === "object" && typeof module.exports === "object" ) { + + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common +// enough that all such attempts are guarded in a try block. +"use strict"; + +var arr = []; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +var flat = arr.flat ? function( array ) { + return arr.flat.call( array ); +} : function( array ) { + return arr.concat.apply( [], array ); +}; + + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + +var support = {}; + +var isFunction = function isFunction( obj ) { + + // Support: Chrome <=57, Firefox <=52 + // In some browsers, typeof returns "function" for HTML elements + // (i.e., `typeof document.createElement( "object" ) === "function"`). + // We don't want to classify *any* DOM node as a function. + return typeof obj === "function" && typeof obj.nodeType !== "number"; + }; + + +var isWindow = function isWindow( obj ) { + return obj != null && obj === obj.window; + }; + + +var document = window.document; + + + + var preservedScriptAttributes = { + type: true, + src: true, + nonce: true, + noModule: true + }; + + function DOMEval( code, node, doc ) { + doc = doc || document; + + var i, val, + script = doc.createElement( "script" ); + + script.text = code; + if ( node ) { + for ( i in preservedScriptAttributes ) { + + // Support: Firefox 64+, Edge 18+ + // Some browsers don't support the "nonce" property on scripts. + // On the other hand, just using `getAttribute` is not enough as + // the `nonce` attribute is reset to an empty string whenever it + // becomes browsing-context connected. + // See https://github.com/whatwg/html/issues/2369 + // See https://html.spec.whatwg.org/#nonce-attributes + // The `node.getAttribute` check was added for the sake of + // `jQuery.globalEval` so that it can fake a nonce-containing node + // via an object. + val = node[ i ] || node.getAttribute && node.getAttribute( i ); + if ( val ) { + script.setAttribute( i, val ); + } + } + } + doc.head.appendChild( script ).parentNode.removeChild( script ); + } + + +function toType( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; +} +/* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var + version = "3.5.1", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } + + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + even: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return ( i + 1 ) % 2; + } ) ); + }, + + odd: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return i % 2; + } ) ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + copy = options[ name ]; + + // Prevent Object.prototype pollution + // Prevent never-ending loop + if ( name === "__proto__" || target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + src = target[ name ]; + + // Ensure proper type for the source value + if ( copyIsArray && !Array.isArray( src ) ) { + clone = []; + } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { + clone = {}; + } else { + clone = src; + } + copyIsArray = false; + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + // Evaluates a script in a provided context; falls back to the global one + // if not specified. + globalEval: function( code, options, doc ) { + DOMEval( code, { nonce: options && options.nonce }, doc ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return flat( ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( _i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = toType( obj ); + + if ( isFunction( obj ) || isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.5 + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://js.foundation/ + * + * Date: 2020-03-14 + */ +( function( window ) { +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + nonnativeSelectorCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ( {} ).hasOwnProperty, + arr = [], + pop = arr.pop, + pushNative = arr.push, + push = arr.push, + slice = arr.slice, + + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[ i ] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + + "ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram + identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + + // "Attribute values must be CSS identifiers [capture 5] + // or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + + whitespace + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + + "*" ), + rdescend = new RegExp( whitespace + "|>" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rhtml = /HTML$/i, + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), + funescape = function( escape, nonHex ) { + var high = "0x" + escape.slice( 1 ) - 0x10000; + + return nonHex ? + + // Strip the backslash prefix from a non-hex escape sequence + nonHex : + + // Replace a hexadecimal escape sequence with the encoded Unicode code point + // Support: IE <=11+ + // For values outside the Basic Multilingual Plane (BMP), manually construct a + // surrogate pair + high < 0 ? + String.fromCharCode( high + 0x10000 ) : + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + inDisabledFieldset = addCombinator( + function( elem ) { + return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; + }, + { dir: "parentNode", next: "legend" } + ); + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + ( arr = slice.call( preferredDoc.childNodes ) ), + preferredDoc.childNodes + ); + + // Support: Android<4.0 + // Detect silently failing push.apply + // eslint-disable-next-line no-unused-expressions + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + pushNative.apply( target, slice.call( els ) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + + // Can't trust NodeList.length + while ( ( target[ j++ ] = els[ i++ ] ) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + setDocument( context ); + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { + + // ID selector + if ( ( m = match[ 1 ] ) ) { + + // Document context + if ( nodeType === 9 ) { + if ( ( elem = context.getElementById( m ) ) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && ( elem = newContext.getElementById( m ) ) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[ 2 ] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !nonnativeSelectorCache[ selector + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && + + // Support: IE 8 only + // Exclude object elements + ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { + + newSelector = selector; + newContext = context; + + // qSA considers elements outside a scoping root when evaluating child or + // descendant combinators, which is not what we want. + // In such cases, we work around the behavior by prefixing every selector in the + // list with an ID selector referencing the scope context. + // The technique has to be used as well when a leading combinator is used + // as such selectors are not recognized by querySelectorAll. + // Thanks to Andrew Dupont for this technique. + if ( nodeType === 1 && + ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + + // We can use :scope instead of the ID hack if the browser + // supports it & if we're not changing the context. + if ( newContext !== context || !support.scope ) { + + // Capture the context ID, setting it first if necessary + if ( ( nid = context.getAttribute( "id" ) ) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", ( nid = expando ) ); + } + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + + toSelector( groups[ i ] ); + } + newSelector = groups.join( "," ); + } + + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + nonnativeSelectorCache( selector, true ); + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return ( cache[ key + " " ] = value ); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement( "fieldset" ); + + try { + return !!fn( el ); + } catch ( e ) { + return false; + } finally { + + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + + // release memory in IE + el = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split( "|" ), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[ i ] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( ( cur = cur.nextSibling ) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return ( name === "input" || name === "button" ) && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + inDisabledFieldset( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction( function( argument ) { + argument = +argument; + return markFunction( function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ ( j = matchIndexes[ i ] ) ] ) { + seed[ j ] = !( matches[ j ] = seed[ j ] ); + } + } + } ); + } ); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + var namespace = elem.namespaceURI, + docElem = ( elem.ownerDocument || elem ).documentElement; + + // Support: IE <=8 + // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes + // https://bugs.jquery.com/ticket/4833 + return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9 - 11+, Edge 12 - 18+ + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( preferredDoc != document && + ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { + + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); + } + } + + // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, + // Safari 4 - 5 only, Opera <=11.6 - 12.x only + // IE/Edge & older browsers don't support the :scope pseudo-class. + // Support: Safari 6.0 only + // Safari 6.0 supports :scope but it's an alias of :root there. + support.scope = assert( function( el ) { + docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); + return typeof el.querySelectorAll !== "undefined" && + !el.querySelectorAll( ":scope fieldset div" ).length; + } ); + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert( function( el ) { + el.className = "i"; + return !el.getAttribute( "className" ); + } ); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert( function( el ) { + el.appendChild( document.createComment( "" ) ); + return !el.getElementsByTagName( "*" ).length; + } ); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert( function( el ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + } ); + + // ID filter and find + if ( support.getById ) { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute( "id" ) === attrId; + }; + }; + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode( "id" ); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( ( elem = elems[ i++ ] ) ) { + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find[ "TAG" ] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { + + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert( function( el ) { + + var input; + + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !el.querySelectorAll( "[selected]" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push( "~=" ); + } + + // Support: IE 11+, Edge 15 - 18+ + // IE 11/Edge don't find elements on a `[name='']` query in some cases. + // Adding a temporary attribute to the document before the selection works + // around the issue. + // Interestingly, IE 10 & older don't seem to have the issue. + input = document.createElement( "input" ); + input.setAttribute( "name", "" ); + el.appendChild( input ); + if ( !el.querySelectorAll( "[name='']" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + + whitespace + "*(?:''|\"\")" ); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !el.querySelectorAll( ":checked" ).length ) { + rbuggyQSA.push( ":checked" ); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push( ".#.+[+~]" ); + } + + // Support: Firefox <=3.6 - 5 only + // Old Firefox doesn't throw on a badly-escaped identifier. + el.querySelectorAll( "\\\f" ); + rbuggyQSA.push( "[\\r\\n\\f]" ); + } ); + + assert( function( el ) { + el.innerHTML = "" + + ""; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement( "input" ); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( el.querySelectorAll( "[name=d]" ).length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: Opera 10 - 11 only + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll( "*,:x" ); + rbuggyQSA.push( ",.*:" ); + } ); + } + + if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector ) ) ) ) { + + assert( function( el ) { + + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( el, "*" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( el, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + } ); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + ) ); + } : + function( a, b ) { + if ( b ) { + while ( ( b = b.parentNode ) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { + + // Choose the first element that is related to our preferred document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( a == document || a.ownerDocument == preferredDoc && + contains( preferredDoc, a ) ) { + return -1; + } + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( b == document || b.ownerDocument == preferredDoc && + contains( preferredDoc, b ) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + return a == document ? -1 : + b == document ? 1 : + /* eslint-enable eqeqeq */ + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( ( cur = cur.parentNode ) ) { + ap.unshift( cur ); + } + cur = b; + while ( ( cur = cur.parentNode ) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[ i ] === bp[ i ] ) { + i++; + } + + return i ? + + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[ i ], bp[ i ] ) : + + // Otherwise nodes in our document sort first + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + ap[ i ] == preferredDoc ? -1 : + bp[ i ] == preferredDoc ? 1 : + /* eslint-enable eqeqeq */ + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + setDocument( elem ); + + if ( support.matchesSelector && documentIsHTML && + !nonnativeSelectorCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch ( e ) { + nonnativeSelectorCache( expr, true ); + } + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( context.ownerDocument || context ) != document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( elem.ownerDocument || elem ) != document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; +}; + +Sizzle.escape = function( sel ) { + return ( sel + "" ).replace( rcssescape, fcssescape ); +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + + // If no nodeType, this is expected to be an array + while ( ( node = elem[ i++ ] ) ) { + + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[ 1 ] = match[ 1 ].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[ 3 ] = ( match[ 3 ] || match[ 4 ] || + match[ 5 ] || "" ).replace( runescape, funescape ); + + if ( match[ 2 ] === "~=" ) { + match[ 3 ] = " " + match[ 3 ] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[ 1 ] = match[ 1 ].toLowerCase(); + + if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { + + // nth-* requires argument + if ( !match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[ 4 ] = +( match[ 4 ] ? + match[ 5 ] + ( match[ 6 ] || 1 ) : + 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); + match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); + + // other types prohibit arguments + } else if ( match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[ 6 ] && match[ 2 ]; + + if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[ 3 ] ) { + match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + + // Get excess from tokenize (recursively) + ( excess = tokenize( unquoted, true ) ) && + + // advance to the next closing parenthesis + ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { + + // excess is a negative index + match[ 0 ] = match[ 0 ].slice( 0, excess ); + match[ 2 ] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { + return true; + } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + ( pattern = new RegExp( "(^|" + whitespace + + ")" + className + "(" + whitespace + "|$)" ) ) && classCache( + className, function( elem ) { + return pattern.test( + typeof elem.className === "string" && elem.className || + typeof elem.getAttribute !== "undefined" && + elem.getAttribute( "class" ) || + "" + ); + } ); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + /* eslint-disable max-len */ + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + /* eslint-enable max-len */ + + }; + }, + + "CHILD": function( type, what, _argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, _context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( ( node = node[ dir ] ) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( ( node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + + // Use previously-cached element index if available + if ( useCache ) { + + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + + // Use the same loop as above to seek `elem` from the start + while ( ( node = ++nodeIndex && node && node[ dir ] || + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || + ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction( function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[ i ] ); + seed[ idx ] = !( matches[ idx ] = matched[ i ] ); + } + } ) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + + // Potentially complex pseudos + "not": markFunction( function( selector ) { + + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction( function( seed, matches, _context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( ( elem = unmatched[ i ] ) ) { + seed[ i ] = !( matches[ i ] = elem ); + } + } + } ) : + function( elem, _context, xml ) { + input[ 0 ] = elem; + matcher( input, null, xml, results ); + + // Don't keep the element (issue #299) + input[ 0 ] = null; + return !results.pop(); + }; + } ), + + "has": markFunction( function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + } ), + + "contains": markFunction( function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; + }; + } ), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + + // lang value must be a valid identifier + if ( !ridentifier.test( lang || "" ) ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( ( elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); + return false; + }; + } ), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && + ( !document.hasFocus || document.hasFocus() ) && + !!( elem.type || elem.href || ~elem.tabIndex ); + }, + + // Boolean properties + "enabled": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( true ), + + "checked": function( elem ) { + + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return ( nodeName === "input" && !!elem.checked ) || + ( nodeName === "option" && !!elem.selected ); + }, + + "selected": function( elem ) { + + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + // eslint-disable-next-line no-unused-expressions + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos[ "empty" ]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( ( attr = elem.getAttribute( "type" ) ) == null || + attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo( function() { + return [ 0 ]; + } ), + + "last": createPositionalPseudo( function( _matchIndexes, length ) { + return [ length - 1 ]; + } ), + + "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + } ), + + "even": createPositionalPseudo( function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "odd": createPositionalPseudo( function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? + argument + length : + argument > length ? + length : + argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ) + } +}; + +Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || ( match = rcomma.exec( soFar ) ) ) { + if ( match ) { + + // Don't consume trailing commas as valid + soFar = soFar.slice( match[ 0 ].length ) || soFar; + } + groups.push( ( tokens = [] ) ); + } + + matched = false; + + // Combinators + if ( ( match = rcombinators.exec( soFar ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + + // Cast descendant combinators to space + type: match[ 0 ].replace( rtrim, " " ) + } ); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || + ( match = preFilters[ type ]( match ) ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + type: type, + matches: match + } ); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[ i ].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || ( elem[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || + ( outerCache[ elem.uniqueID ] = {} ); + + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( ( oldCache = uniqueCache[ key ] ) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return ( newCache[ 2 ] = oldCache[ 2 ] ); + } else { + + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[ i ]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[ 0 ]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[ i ], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( ( elem = unmatched[ i ] ) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction( function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( + selector || "*", + context.nodeType ? [ context ] : context, + [] + ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( ( elem = temp[ i ] ) ) { + matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) ) { + + // Restore matcherIn since elem is not yet a final match + temp.push( ( matcherIn[ i ] = elem ) ); + } + } + postFinder( null, ( matcherOut = [] ), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) && + ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { + + seed[ temp ] = !( results[ temp ] = elem ); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + } ); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[ 0 ].type ], + implicitRelative = leadingRelative || Expr.relative[ " " ], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + ( checkContext = context ).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { + matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; + } else { + matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[ j ].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens + .slice( 0, i - 1 ) + .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), + + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), + len = elems.length; + + if ( outermost ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + outermostContext = context == document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( !context && elem.ownerDocument != document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( ( matcher = elementMatchers[ j++ ] ) ) { + if ( matcher( elem, context || document, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + + // They will have gone through all possible matchers + if ( ( elem = !matcher && elem ) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( ( matcher = setMatchers[ j++ ] ) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !( unmatched[ i ] || setMatched[ i ] ) ) { + setMatched[ i ] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[ i ] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( + selector, + matcherFromGroupMatchers( elementMatchers, setMatchers ) + ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( ( selector = compiled.selector || selector ) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[ 0 ] = match[ 0 ].slice( 0 ); + if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { + + context = ( Expr.find[ "ID" ]( token.matches[ 0 ] + .replace( runescape, funescape ), context ) || [] )[ 0 ]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[ i ]; + + // Abort if we hit a combinator + if ( Expr.relative[ ( type = token.type ) ] ) { + break; + } + if ( ( find = Expr.find[ type ] ) ) { + + // Search, expanding context for leading sibling combinators + if ( ( seed = find( + token.matches[ 0 ].replace( runescape, funescape ), + rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || + context + ) ) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert( function( el ) { + + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; +} ); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert( function( el ) { + el.innerHTML = ""; + return el.firstChild.getAttribute( "href" ) === "#"; +} ) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + } ); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert( function( el ) { + el.innerHTML = ""; + el.firstChild.setAttribute( "value", "" ); + return el.firstChild.getAttribute( "value" ) === ""; +} ) ) { + addHandle( "value", function( elem, _name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + } ); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert( function( el ) { + return el.getAttribute( "disabled" ) == null; +} ) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; + } + } ); +} + +return Sizzle; + +} )( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +}; +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Filtered directly for both simple and complex selectors + return jQuery.filter( qualifier, elements, not ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, _i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, _i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, _i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( elem.contentDocument != null && + + // Support: IE 11+ + // elements with no `data` attribute has an object + // `contentDocument` with a `null` prototype. + getProto( elem.contentDocument ) ) { + + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && toType( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( _i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.stackTrace ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // rejected_handlers.disable + // fulfilled_handlers.disable + tuples[ 3 - i ][ 3 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock, + + // progress_handlers.lock + tuples[ 0 ][ 3 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the master Deferred + master = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + master.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( master.state() === "pending" || + isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return master.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); + } + + return master.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( toType( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, _key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; + + +// Matches dashed string for camelizing +var rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g; + +// Used by camelCase as callback to replace() +function fcamelCase( _all, letter ) { + return letter.toUpperCase(); +} + +// Convert dashed to camelCase; used by the css and data modules +// Support: IE <=9 - 11, Edge 12 - 15 +// Microsoft forgot to hump their vendor prefix (#9572) +function camelCase( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); +} +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( camelCase ); + } else { + key = camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var documentElement = document.documentElement; + + + + var isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ); + }, + composed = { composed: true }; + + // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only + // Check attachment across shadow DOM boundaries when possible (gh-3504) + // Support: iOS 10.0-10.2 only + // Early iOS 10 versions support `attachShadow` but not `getRootNode`, + // leading to errors. We need to check for `getRootNode`. + if ( documentElement.getRootNode ) { + isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ) || + elem.getRootNode( composed ) === elem.ownerDocument; + }; + } +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + isAttached( elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, scale, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = elem.nodeType && + ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Support: Firefox <=54 + // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) + initial = initial / 2; + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + while ( maxIterations-- ) { + + // Evaluate and update our best guess (doubling guesses that zero out). + // Finish if the scale equals or crosses 1 (making the old*new product non-positive). + jQuery.style( elem, prop, initialInUnit + unit ); + if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { + maxIterations = 0; + } + initialInUnit = initialInUnit / scale; + + } + + initialInUnit = initialInUnit * 2; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); + +var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); + + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // Support: IE <=9 only + // IE <=9 replaces "; + support.option = !!div.lastChild; +} )(); + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
      " ], + col: [ 2, "", "
      " ], + tr: [ 2, "", "
      " ], + td: [ 3, "", "
      " ], + + _default: [ 0, "", "" ] +}; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// Support: IE <=9 only +if ( !support.option ) { + wrapMap.optgroup = wrapMap.option = [ 1, "" ]; +} + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, attached, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( toType( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + attached = isAttached( elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( attached ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 - 11+ +// focus() and blur() are asynchronous, except when they are no-op. +// So expect focus to be synchronous when the element is already active, +// and blur to be synchronous when the element is not already active. +// (focus and blur are always synchronous in other supported browsers, +// this just defines when we can count on it). +function expectSync( elem, type ) { + return ( elem === safeActiveElement() ) === ( type === "focus" ); +} + +// Support: IE <=9 only +// Accessing document.activeElement can throw unexpectedly +// https://bugs.jquery.com/ticket/13393 +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Only attach events to objects that accept data + if ( !acceptData( elem ) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = Object.create( null ); + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( nativeEvent ), + + handlers = ( + dataPriv.get( this, "events" ) || Object.create( null ) + )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // If the event is namespaced, then each handler is only invoked if it is + // specially universal or its namespaces are a superset of the event's. + if ( !event.rnamespace || handleObj.namespace === false || + event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + click: { + + // Utilize native event to ensure correct state for checkable inputs + setup: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Claim the first handler + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + // dataPriv.set( el, "click", ... ) + leverageNative( el, "click", returnTrue ); + } + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Force setup before triggering a click + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + leverageNative( el, "click" ); + } + + // Return non-false to allow normal event-path propagation + return true; + }, + + // For cross-browser consistency, suppress native .click() on links + // Also prevent it if we're currently inside a leveraged native-event stack + _default: function( event ) { + var target = event.target; + return rcheckableType.test( target.type ) && + target.click && nodeName( target, "input" ) && + dataPriv.get( target, "click" ) || + nodeName( target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +// Ensure the presence of an event listener that handles manually-triggered +// synthetic events by interrupting progress until reinvoked in response to +// *native* events that it fires directly, ensuring that state changes have +// already occurred before other listeners are invoked. +function leverageNative( el, type, expectSync ) { + + // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add + if ( !expectSync ) { + if ( dataPriv.get( el, type ) === undefined ) { + jQuery.event.add( el, type, returnTrue ); + } + return; + } + + // Register the controller as a special universal handler for all event namespaces + dataPriv.set( el, type, false ); + jQuery.event.add( el, type, { + namespace: false, + handler: function( event ) { + var notAsync, result, + saved = dataPriv.get( this, type ); + + if ( ( event.isTrigger & 1 ) && this[ type ] ) { + + // Interrupt processing of the outer synthetic .trigger()ed event + // Saved data should be false in such cases, but might be a leftover capture object + // from an async native handler (gh-4350) + if ( !saved.length ) { + + // Store arguments for use when handling the inner native event + // There will always be at least one argument (an event object), so this array + // will not be confused with a leftover capture object. + saved = slice.call( arguments ); + dataPriv.set( this, type, saved ); + + // Trigger the native event and capture its result + // Support: IE <=9 - 11+ + // focus() and blur() are asynchronous + notAsync = expectSync( this, type ); + this[ type ](); + result = dataPriv.get( this, type ); + if ( saved !== result || notAsync ) { + dataPriv.set( this, type, false ); + } else { + result = {}; + } + if ( saved !== result ) { + + // Cancel the outer synthetic event + event.stopImmediatePropagation(); + event.preventDefault(); + return result.value; + } + + // If this is an inner synthetic event for an event with a bubbling surrogate + // (focus or blur), assume that the surrogate already propagated from triggering the + // native event and prevent that from happening again here. + // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the + // bubbling surrogate propagates *after* the non-bubbling base), but that seems + // less bad than duplication. + } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { + event.stopPropagation(); + } + + // If this is a native event triggered above, everything is now in order + // Fire an inner synthetic event with the original arguments + } else if ( saved.length ) { + + // ...and capture the result + dataPriv.set( this, type, { + value: jQuery.event.trigger( + + // Support: IE <=9 - 11+ + // Extend with the prototype to reset the above stopImmediatePropagation() + jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), + saved.slice( 1 ), + this + ) + } ); + + // Abort handling of the native event + event.stopImmediatePropagation(); + } + } + } ); +} + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || Date.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + code: true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + + which: function( event ) { + var button = event.button; + + // Add which for key events + if ( event.which == null && rkeyEvent.test( event.type ) ) { + return event.charCode != null ? event.charCode : event.keyCode; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { + if ( button & 1 ) { + return 1; + } + + if ( button & 2 ) { + return 3; + } + + if ( button & 4 ) { + return 2; + } + + return 0; + } + + return event.which; + } +}, jQuery.event.addProp ); + +jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { + jQuery.event.special[ type ] = { + + // Utilize native event if possible so blur/focus sequence is correct + setup: function() { + + // Claim the first handler + // dataPriv.set( this, "focus", ... ) + // dataPriv.set( this, "blur", ... ) + leverageNative( this, type, expectSync ); + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function() { + + // Force setup before trigger + leverageNative( this, type ); + + // Return non-false to allow normal event-path propagation + return true; + }, + + delegateType: delegateType + }; +} ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + + // Support: IE <=10 - 11, Edge 12 - 13 only + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return jQuery( elem ).children( "tbody" )[ 0 ] || elem; + } + + return elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { + elem.type = elem.type.slice( 5 ); + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.get( src ); + events = pdataOld.events; + + if ( events ) { + dataPriv.remove( dest, "handle events" ); + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = flat( args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + valueIsFunction = isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( valueIsFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( valueIsFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl && !node.noModule ) { + jQuery._evalUrl( node.src, { + nonce: node.nonce || node.getAttribute( "nonce" ) + }, doc ); + } + } else { + DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && isAttached( node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html; + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = isAttached( elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + +var swap = function( elem, options, callback ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.call( elem ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + +var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + container.style.cssText = "position:absolute;left:-11111px;width:60px;" + + "margin-top:1px;padding:0;border:0"; + div.style.cssText = + "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + + "margin:auto;border:1px;padding:1px;" + + "width:60%;top:1%"; + documentElement.appendChild( container ).appendChild( div ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; + + // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 + // Some styles come back with percentage values, even though they shouldn't + div.style.right = "60%"; + pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; + + // Support: IE 9 - 11 only + // Detect misreporting of content dimensions for box-sizing:border-box elements + boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; + + // Support: IE 9 only + // Detect overflow:scroll screwiness (gh-3699) + // Support: Chrome <=64 + // Don't get tricked when zoom affects offsetWidth (gh-4029) + div.style.position = "absolute"; + scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + function roundPixelMeasures( measure ) { + return Math.round( parseFloat( measure ) ); + } + + var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, + reliableTrDimensionsVal, reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (#8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + jQuery.extend( support, { + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelBoxStyles: function() { + computeStyleTests(); + return pixelBoxStylesVal; + }, + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + }, + scrollboxSize: function() { + computeStyleTests(); + return scrollboxSizeVal; + }, + + // Support: IE 9 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Behavior in IE 9 is more subtle than in newer versions & it passes + // some versions of this test; make sure not to make it pass there! + reliableTrDimensions: function() { + var table, tr, trChild, trStyle; + if ( reliableTrDimensionsVal == null ) { + table = document.createElement( "table" ); + tr = document.createElement( "tr" ); + trChild = document.createElement( "div" ); + + table.style.cssText = "position:absolute;left:-11111px"; + tr.style.height = "1px"; + trChild.style.height = "9px"; + + documentElement + .appendChild( table ) + .appendChild( tr ) + .appendChild( trChild ); + + trStyle = window.getComputedStyle( tr ); + reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; + + documentElement.removeChild( table ); + } + return reliableTrDimensionsVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, #12537) + // .css('--customProperty) (#3144) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !isAttached( elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return ( this.get = hookFn ).apply( this, arguments ); + } + }; +} + + +var cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style, + vendorProps = {}; + +// Return a vendor-prefixed property or undefined +function vendorPropName( name ) { + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a potentially-mapped jQuery.cssProps or vendor prefixed property +function finalPropName( name ) { + var final = jQuery.cssProps[ name ] || vendorProps[ name ]; + + if ( final ) { + return final; + } + if ( name in emptyStyle ) { + return name; + } + return vendorProps[ name ] = vendorPropName( name ) || name; +} + + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rcustomProp = /^--/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }; + +function setPositiveNumber( _elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { + var i = dimension === "width" ? 1 : 0, + extra = 0, + delta = 0; + + // Adjustment may not be necessary + if ( box === ( isBorderBox ? "border" : "content" ) ) { + return 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin + if ( box === "margin" ) { + delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); + } + + // If we get here with a content-box, we're seeking "padding" or "border" or "margin" + if ( !isBorderBox ) { + + // Add padding + delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // For "border" or "margin", add border + if ( box !== "padding" ) { + delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + + // But still keep track of it otherwise + } else { + extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + + // If we get here with a border-box (content + padding + border), we're seeking "content" or + // "padding" or "margin" + } else { + + // For "content", subtract padding + if ( box === "content" ) { + delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // For "content" or "padding", subtract border + if ( box !== "margin" ) { + delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + // Account for positive content-box scroll gutter when requested by providing computedVal + if ( !isBorderBox && computedVal >= 0 ) { + + // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border + // Assuming integer scroll gutter, subtract the rest and round down + delta += Math.max( 0, Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + computedVal - + delta - + extra - + 0.5 + + // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter + // Use an explicit zero to avoid NaN (gh-3964) + ) ) || 0; + } + + return delta; +} + +function getWidthOrHeight( elem, dimension, extra ) { + + // Start with computed style + var styles = getStyles( elem ), + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). + // Fake content-box until we know it's needed to know the true value. + boxSizingNeeded = !support.boxSizingReliable() || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + valueIsBorderBox = isBorderBox, + + val = curCSS( elem, dimension, styles ), + offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); + + // Support: Firefox <=54 + // Return a confounding non-pixel value or feign ignorance, as appropriate. + if ( rnumnonpx.test( val ) ) { + if ( !extra ) { + return val; + } + val = "auto"; + } + + + // Support: IE 9 - 11 only + // Use offsetWidth/offsetHeight for when box sizing is unreliable. + // In those cases, the computed value can be trusted to be border-box. + if ( ( !support.boxSizingReliable() && isBorderBox || + + // Support: IE 10 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Interestingly, in some cases IE 9 doesn't suffer from this issue. + !support.reliableTrDimensions() && nodeName( elem, "tr" ) || + + // Fall back to offsetWidth/offsetHeight when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + val === "auto" || + + // Support: Android <=4.1 - 4.3 only + // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) + !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && + + // Make sure the element is visible & connected + elem.getClientRects().length ) { + + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Where available, offsetWidth/offsetHeight approximate border box dimensions. + // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the + // retrieved value as a content box dimension. + valueIsBorderBox = offsetProp in elem; + if ( valueIsBorderBox ) { + val = elem[ offsetProp ]; + } + } + + // Normalize "" and auto + val = parseFloat( val ) || 0; + + // Adjust for the element's box model + return ( val + + boxModelAdjustment( + elem, + dimension, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles, + + // Provide the current computed size to request scroll gutter calculation (gh-3589) + val + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "animationIterationCount": true, + "columnCount": true, + "fillOpacity": true, + "flexGrow": true, + "flexShrink": true, + "fontWeight": true, + "gridArea": true, + "gridColumn": true, + "gridColumnEnd": true, + "gridColumnStart": true, + "gridRow": true, + "gridRowEnd": true, + "gridRowStart": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: {}, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (#7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append + // "px" to a few hardcoded values. + if ( type === "number" && !isCustomProp ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( _i, dimension ) { + jQuery.cssHooks[ dimension ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, dimension, extra ); + } ) : + getWidthOrHeight( elem, dimension, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = getStyles( elem ), + + // Only read styles.position if the test has a chance to fail + // to avoid forcing a reflow. + scrollboxSizeBuggy = !support.scrollboxSize() && + styles.position === "absolute", + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) + boxSizingNeeded = scrollboxSizeBuggy || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + subtract = extra ? + boxModelAdjustment( + elem, + dimension, + extra, + isBorderBox, + styles + ) : + 0; + + // Account for unreliable border-box dimensions by comparing offset* to computed and + // faking a content-box to get border and padding (gh-3699) + if ( isBorderBox && scrollboxSizeBuggy ) { + subtract -= Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + parseFloat( styles[ dimension ] ) - + boxModelAdjustment( elem, dimension, "border", false, styles ) - + 0.5 + ); + } + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ dimension ] = value; + value = jQuery.css( elem, dimension ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, + function( elem, computed ) { + if ( computed ) { + return ( parseFloat( curCSS( elem, "marginLeft" ) ) || + elem.getBoundingClientRect().left - + swap( elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + } ) + ) + "px"; + } + } +); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( prefix !== "margin" ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && ( + jQuery.cssHooks[ tween.prop ] || + tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, jQuery.fx.interval ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = Date.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 15 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY and Edge just mirrors + // the overflowX value there. + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + // If there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith( elem, [ animation ] ); + return false; + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + result.stop.bind( result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !isFunction( easing ) && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = Date.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + jQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +function classesToArray( value ) { + if ( Array.isArray( value ) ) { + return value; + } + if ( typeof value === "string" ) { + return value.match( rnothtmlwhite ) || []; + } + return []; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) > -1 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isValidValue = type === "string" || Array.isArray( value ); + + if ( typeof stateVal === "boolean" && isValidValue ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + return this.each( function() { + var className, i, self, classNames; + + if ( isValidValue ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = classesToArray( value ); + + while ( ( className = classNames[ i++ ] ) ) { + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, valueIsFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + valueIsFunction = isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( valueIsFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (#14686, #14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion + + +support.focusin = "onfocusin" in window; + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + stopPropagationCallback = function( e ) { + e.stopPropagation(); + }; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = lastElement = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + lastElement = cur; + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( + dataPriv.get( cur, "events" ) || Object.create( null ) + )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + + if ( event.isPropagationStopped() ) { + lastElement.addEventListener( type, stopPropagationCallback ); + } + + elem[ type ](); + + if ( event.isPropagationStopped() ) { + lastElement.removeEventListener( type, stopPropagationCallback ); + } + + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + + // Handle: regular nodes (via `this.ownerDocument`), window + // (via `this.document`) & document (via `this`). + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + dataPriv.remove( doc, fix ); + + } else { + dataPriv.access( doc, fix, attaches ); + } + } + }; + } ); +} +var location = window.location; + +var nonce = { guid: Date.now() }; + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) { + xml = undefined; + } + + if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; +}; + + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( Array.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && toType( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + if ( a == null ) { + return ""; + } + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ) + .filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ) + .map( function( _i, elem ) { + var val = jQuery( this ).val(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() + " " ] = + ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) + .concat( match[ 2 ] ); + } + } + match = responseHeaders[ key.toLowerCase() + " " ]; + } + return match == null ? null : match.join( ", " ); + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 15 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available and should be processed, append data to url + if ( s.data && ( s.processData || typeof s.data === "string" ) ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Use a noop converter for missing script + if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { + s.converters[ "text script" ] = function() {}; + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( _i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted + if ( isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + +jQuery.ajaxPrefilter( function( s ) { + var i; + for ( i in s.headers ) { + if ( i.toLowerCase() === "content-type" ) { + s.contentType = s.headers[ i ] || ""; + } + } +} ); + + +jQuery._evalUrl = function( url, options, doc ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (#11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + + // Only evaluate the response if it is successful (gh-4126) + // dataFilter is not invoked for failure responses, so using it instead + // of the default converter is kludgy but it works. + converters: { + "text script": function() {} + }, + dataFilter: function( response ) { + jQuery.globalEval( response, options, doc ); + } + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( isFunction( html ) ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var htmlIsFunction = isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { + try { + return new window.XMLHttpRequest(); + } catch ( e ) {} +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // #1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.ontimeout = + xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // #14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain or forced-by-attrs requests + if ( s.crossDomain || s.scriptAttrs ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( " + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      bench

      +

      Executes multiple tests on the library and output CPU usage +information. +Can be executed with make bench or _build/default/bench/bench.exe.

      +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/binaries/cgl.html b/static/html/dev-doc/binaries/cgl.html new file mode 100644 index 0000000000..b8c66c974b --- /dev/null +++ b/static/html/dev-doc/binaries/cgl.html @@ -0,0 +1,127 @@ + + + + + + + + cgl — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      cgl

      +

      Removes the links of an HTML page and replaces them by spans. +Registered as a service.

      +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/binaries/connex.html b/static/html/dev-doc/binaries/connex.html new file mode 100644 index 0000000000..a37ede2b49 --- /dev/null +++ b/static/html/dev-doc/binaries/connex.html @@ -0,0 +1,148 @@ + + + + + + + + connex — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      connex

      +
      +

      Documentation

      +

      Calculates the connex components of a base and returns it in HTML.

      +
      usage: geneweb.connex <base>
      +
      +  -gwd_p <number>: Specify the port number of gwd (default = 2317); > 1024 for normal users.
      +  -server <string>: Name of the server (default is 127.0.0.1).
      +  -a : all connex components
      +  -s : produce statistics
      +  -d <int> : detail for this length
      +  -i <file> : ignore this file
      +  -bf : by origin files
      +  -del <int> : ask for deleting branches whose size <= that value
      +  -cnt <int> : delete cnt branches whose size <= -del value
      +  -exact : delete only branches whose size strictly = -del value
      +  -o <file> : output to this file
      +  -help  Display this list of options
      +  --help  Display this list of options
      +
      +
      +
      +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/binaries/consang.html b/static/html/dev-doc/binaries/consang.html new file mode 100644 index 0000000000..624aab88e8 --- /dev/null +++ b/static/html/dev-doc/binaries/consang.html @@ -0,0 +1,142 @@ + + + + + + + + consang — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      consang

      +
      +

      Documentation

      +

      Calculates the consanguinity level of individuals and synchronizes it with +the base.

      +
      usage: geneweb.consang [options] <file_name>
      +  -q  quiet mode
      +  -qq  very quiet mode
      +  -fast  faster, but use more memory
      +  -scratch : from scratch
      +  -mem : Save memory, but slower when rewritting database
      +  -nolock : do not lock database.
      +
      +
      +

      Online documentation

      +
      +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/binaries/export.html b/static/html/dev-doc/binaries/export.html new file mode 100644 index 0000000000..55ff712d8c --- /dev/null +++ b/static/html/dev-doc/binaries/export.html @@ -0,0 +1,128 @@ + + + + + + + + export — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      export

      +

      Exports a database in GED or in GW depending on the option. +Registers the “EXPORT” request as an extra request.

      +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/binaries/fixbase_plugin.html b/static/html/dev-doc/binaries/fixbase_plugin.html new file mode 100644 index 0000000000..f437442acb --- /dev/null +++ b/static/html/dev-doc/binaries/fixbase_plugin.html @@ -0,0 +1,124 @@ + + + + + + + + fixbase — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      fixbase

      +

      Applies the different fixbase utils (module Fixbase) from a dedicated UI. +Registers two new requests: FIXBASE and FIXBASE_OK.

      +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/binaries/forum.html b/static/html/dev-doc/binaries/forum.html new file mode 100644 index 0000000000..55b0eb1a18 --- /dev/null +++ b/static/html/dev-doc/binaries/forum.html @@ -0,0 +1,129 @@ + + + + + + + + forum — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      forum

      +

      Includes a forum platform in the web server. +Registers the requests FORUM, FORUM_ADD, FORUM_ADD_OK, FORUM_DEL, FORUM_P_P, +FORUM_SEARCH, FORUM_VAL, FORUM_VIEW.

      +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/binaries/ged2gwb.html b/static/html/dev-doc/binaries/ged2gwb.html new file mode 100644 index 0000000000..c2e1ad5957 --- /dev/null +++ b/static/html/dev-doc/binaries/ged2gwb.html @@ -0,0 +1,163 @@ + + + + + + + + ged2gwb — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      ged2gwb

      +
      +

      Documentation

      +

      Imports a GEDCOM 5.5.1 file to a Geneweb base. GEDCOM is a popular format +among genealogy enthusiasts. +GEDCOM 5.5.1 documentation

      +
      Usage: geneweb.ged2gwb [<ged>] [options] where options are:
      +  -charset [ANSEL|ASCII|MSDOS] Force given charset decoding, overriding the possible setting in GEDCOM
      +  -dates_dm Interpret months-numbered dates as day/month/year
      +  -dates_md Interpret months-numbered dates as month/day/year
      +  -ds Set the source field for persons and families without source data
      +  -efn When creating a person, if the GEDCOM first name part holds several names, the first of this names becomes the person "first name" and the complete GEDCOM first name part a "first name alias".
      +  -epn When creating a person, if the GEDCOM first name part looks like a public name, i.e. holds:
      +* a number or a roman number, supposed to be a number of a nobility title,
      +* one of the words: "der", "den", "die", "el", "le", "la", "the", supposed to be the beginning of a qualifier, then the GEDCOM first name part becomes the person "public name" and its first word his "first name".
      +  -f Remove database if already existing
      +  -fne <be> When creating a person, if the GEDCOM first name part holds a part between 'b' (any character) and 'e' (any character), it is considered to be the usual first name: e.g. -fne '""' or -fne "()".
      +  -lf Convert first names to lowercase letters, with initials in uppercase.
      +  -log <file> Redirect log trace to this file.
      +  -ls Convert surnames to lowercase letters, with initials in uppercase. Try to keep lowercase particles.
      +  -nc No consistency check
      +  -no_efn Cancels the previous option.
      +  -no_epn Cancels the previous option.
      +  -no_nd Don't interpret a year preceded by a minus sign as a negative year
      +  -no_pit Do not consider persons having titles as public
      +  -nopicture Don't extract individual picture.
      +  -o <file> Output database (default: "a").
      +  -particles <FILE> Use the given file as list of particles
      +  -rs_no_mention Force relation status to NoMention (default is Married)
      +  -tnd Set negative dates when inconsistency (e.g. birth after death)
      +  -trackid Print gedcom id to gw id matches.
      +  -udi x-y Set the interval for persons whose death part is undefined:
      +       - if before x years, they are considered as alive
      +       - if after y year, they are considered as death
      +       - between x and y year, they are considered as "don't know"
      +       Default x is 80 and y is 120
      +  -uin Put untreated GEDCOM tags in notes
      +  -us Convert surnames to uppercase letters.
      +
      +
      +

      Depends on the library gwexport.

      +
      + +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/binaries/gwb2ged.html b/static/html/dev-doc/binaries/gwb2ged.html new file mode 100644 index 0000000000..0fd71f45bc --- /dev/null +++ b/static/html/dev-doc/binaries/gwb2ged.html @@ -0,0 +1,154 @@ + + + + + + + + gwb2ged — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      gwb2ged

      +
      +

      Documentation

      +

      Converts a Geneweb database to a GEDCOM 5.5.1 file. GEDCOM is a popular format +among genealogy enthusiasts. +GEDCOM 5.5.1 documentation

      +
      Usage: geneweb.gwb2ged <BASE> [OPT]
      +  -indexes                          export indexes in gedcom
      +  -a <N>                            maximum generation of the root's ascendants
      +  -ad <N>                           maximum generation of the root's ascendants descendants
      +  -key <KEY>                        key reference of root person. Used for -a/-d options. Can be used multiple times. Key format is "First Name.occ SURNAME"
      +  -c <NUM>:                         when a person is born less than <num> years ago, it is not exported unless it is Public. All the spouses and descendants are also censored.
      +  -charset [ASCII|ANSEL|ANSI|UTF-8] set charset; default is UTF-8
      +  -d <N>                            maximum generation of the root's descendants.
      +  -mem                              save memory space, but slower.
      +  -nn                               no (database) notes.
      +  -nnn                              no notes (implies -nn).
      +  -nopicture                        don't extract individual picture.
      +  -o <GED>                          output file name (default: stdout).
      +  -parentship                       select individuals involved in parentship computation between pairs of keys. Pairs must be defined with -key option, descendant first: e.g. -key "Descendant.0 SURNAME" -key "Ancestor.0 SURNAME". If multiple pair are provided, union of persons are returned.
      +  -picture-path                     extract pictures path.
      +  -s <SN>                           select this surname (option usable several times, union of surnames will be used).
      +  -source <SRC>                     replace individuals and families sources. Also delete event sources.
      +  -v                                verbose
      +
      +
      +
      +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/binaries/gwc.html b/static/html/dev-doc/binaries/gwc.html new file mode 100644 index 0000000000..c90d7fc173 --- /dev/null +++ b/static/html/dev-doc/binaries/gwc.html @@ -0,0 +1,156 @@ + + + + + + + + gwc — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      gwc

      +
      +

      Documentation

      +

      Creates a new database.

      +
      Usage: geneweb.gwc [options] [files]
      +where [files] are a list of files:
      +  source files end with .gw
      +  object files end with .gwo
      +and [options] are:
      +  -bnotes [drop|erase|first|merge] Behavior for base notes of the next file. [drop]: dropped. [erase]: erase the current content. [first]: dropped if current content is not empty. [merge]: concatenated to the current content. Default: merge
      +  -c                               Only compiling
      +  -cg                              Compute consanguinity
      +  -ds <str>                        Set the source field for persons and families without source data
      +  -f                               Remove database if already existing
      +  -mem                             Save memory, but slower
      +  -nc                              No consistency check
      +  -nofail                          No failure in case of error
      +  -nolock                          Do not lock database
      +  -nopicture                       Do not create associative pictures
      +  -o <file>                        Output database (default: a.gwb)
      +  -particles <file>                Particles file (default = predefined particles)
      +  -q                               Quiet
      +  -sep                             Separate all persons in next file
      +  -sh <int>                        Shift all persons numbers in next files
      +  -stats                           Print statistics
      +  -v                               Verbose
      +
      +
      +
      +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/binaries/gwd.html b/static/html/dev-doc/binaries/gwd.html new file mode 100644 index 0000000000..1861cd5e5a --- /dev/null +++ b/static/html/dev-doc/binaries/gwd.html @@ -0,0 +1,363 @@ + + + + + + + + gwd — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      gwd

      +
      +

      Documentation

      +

      The main web-server for geneweb. It depends on wserver, a library defined in bin/.

      +
      Usage: gwd [options] where options are:
      +  -a <ADDRESS>           Select a specific address (default = any address of this computer).
      +  -add_lexicon <FILE>    Add file as lexicon.
      +  -allowed_tags <FILE>   HTML tags which are allowed to be displayed. One tag per line in file.
      +  -auth <FILE>           Authorization file to restrict access. The file must hold lines of the form "user:password".
      +  -bd <DIR>              Directory where the databases are installed.
      +  -blang                 Select the user browser language if any.
      +  -cache_langs           Lexicon languages to be cached.
      +  -cgi                   Force CGI mode.
      +  -conn_tmout <SEC>      Connection timeout (default 120s; 0 means no limit).
      +  -daemon                Unix daemon mode.
      +  -debug                 Enable debug mode
      +  -digest                Use Digest authorization scheme (more secure on passwords)
      +  -friend <PASSWD>       Set a friend password.
      +  -hd <DIR>              Directory where the directory lang is installed.
      +  -images_dir <DIR>      Same than previous but directory name relative to current.
      +  -images_url <URL>      URL for GeneWeb images (default: gwd send them).
      +  -lang <LANG>           Set a default language (default: fr).
      +  -log <FILE>            Log trace to this file. Use "-" or "<stdout>" to redirect output to stdout or "<stderr>" to output log to stderr.
      +  -log_level <N>         Send messages with severity <= <N> to syslog (default: 7).
      +  -login_tmout <SEC>     Login timeout for entries with passwords in CGI mode (default 1800s).
      +  -max_clients <NUM>     Max number of clients treated at the same time (default: no limit) (not cgi).
      +  -min_disp_req          Minimum number of requests in robot trace (default: 6).
      +  -no_host_address       Force no reverse host by address.
      +  -nolock                Do not lock files before writing.
      +  -only <ADDRESS>        Only inet address accepted.
      +  -p <NUMBER>            Select a port number (default = 2317).
      +  -plugin <PLUGIN>.cmxs  load a safe plugin. Combine with -force to enable for every base. Combine with -unsafe to allow unverified plugins. e.g. "-plugin -unsafe -force".
      +  -plugins <DIR>         load all plugins in <DIR>. Combine with -force to enable for every base. Combine with -unsafe to allow unverified plugins. e.g. "-plugins -unsafe -force".
      +  -redirect <ADDR>       Send a message to say that this service has been redirected to <ADDR>.
      +  -robot_xcl <CNT>,<SEC> Exclude connections when more than <CNT> requests in <SEC> seconds.
      +  -setup_link            Display a link to local gwsetup in bottom of pages.
      +  -trace_failed_passwd   Print the failed passwords in log (except if option -digest is set).
      +  -wd <DIR>              Directory for socket communication (Windows) and access count.
      +  -wizard <PASSWD>       Set a wizard password.
      +  -wjf                   Wizard just friend (permanently).
      +
      +
      +

      It is build from eight files: gwdLog.ml, gwdPlugin.ml, request.ml (these +three files define geneweb.gwd_lib),, gwdPluginDep.ml, +gwdPluginMD5.ml, gwdPluginMETA.ml, robot.ml and gwd.ml.

      +
      +

      GwdLog module

      +

      Util functions for logging errors & infos.

      +
      +
      +

      GwdPlugin module

      +

      Module used for registering plug-ins to Gwd.

      +
      +
      +

      Request module

      +

      The main interface between the Geneweb core and the rest of the world.

      +
      +
      +

      GedPluginDep module

      +

      Calculates the load order of the different plugins.

      +
      +
      +

      GwdPluginMD5 module

      +

      Checks the plugins .cmxs files and assets did not change since compilation. +This module is written by mk_gwdPluginMD5.ml. After the plug-ins have been compiled, +mk_gwdPluginMD5.ml lists them in a pattern matching with their MD5 hash.

      +
      +
      +

      GwdPluginMETA module

      +

      Handles the metadata of a plug-in: its version, its mainteners’ list and +its dependencies. +Metadata is optional, and may contain the dependencies of the plugin (separated +by a comma), its maintainers (separated by a comma) and its version.

      +
      +
      +

      Robot module

      +

      Handles the connection of robots to the server.

      +
      +
      +

      Gwd module

      +

      The executable

      +
      +
      +
      +

      Requests

      +

      Gwd displays different web pages and perform different actions given a mode. +This mode is given as a GET argument with the key m.

      +

      Here is a quick documentation of each mode.

      +
        +
      • No mode: displays the default page depending on other arguments. It can be +the index page (no base selected), a welcome page (only a base has been +selected) or a person page (a base and a person has been selected).

      • +
      • Mode “A”: displays the ascendants of the selected person (selection key is i).

      • +
      • Mode “ADD_FAM”: displays the form for adding families.

      • +
      • Mode “ADD_FAM_OK”: requests to add a new family.

      • +
      • Mode “ADD_IND”: displays a form for adding a new person

      • +
      • Mode “ADD_IND_OK”: requests to add a new person.

      • +
      • Mode “ADD_PAR”: associate parents to a person (person identifier must be set +with key ip)

      • +
      • Mode “ADD_PAR_OK” : requests to add new parents.

      • +
      • Mode “ANM” : displays the menu of anniversaries modification

      • +
      • Mode “AN” : displays anniversaries ; with the v key for months, displays +the anniversaries of thay month (v=1 -> January, …)

      • +
      • Mode “AD”: displays death anniversaries ; with the v key for months, displays +the anniversaries of thay month (v=1 -> January, …)

      • +
      • Mode “AM”: displays marriage anniversaries ; with the v key for months, displays +the anniversaries of thay month (v=1 -> January, …)

      • +
      • Mode “AS_OK”: displays the results of an advanced search

      • +
      • Mode “C”: displays the cousins menu

      • +
      • Mode “CAL”: displays the calendars; if no key set, it will use today’s date.

      • +
      • Mode “CHG_CHN”: displays the form for changing children names of a person

      • +
      • Mode “CHG_CHN_OK”: requests to change the children names a new person.

      • +
      • Mode “CHG_EVT_IND_ORD”: displays the form for changing the order of events +for a person

      • +
      • Mode “CHG_EVT_IND_ORD_OK”: requests to change the evenement order of a +person.

      • +
      • Mode “CHG_EVT_FAM_ORD”: displays the form for changing the order of events +for a family

      • +
      • Mode “CHG_EVT_FAM_ORD_OK”: requests to change the evenement order of a +family.

      • +
      • Mode “CHG_FAM_ORD”: displays a menu to change the family order

      • +
      • Mode “CHG_FAM_ORD_OK”: requests the family order change

      • +
      • Mode “CONN_WIZ”: displays the connected wizards (the base admins)

      • +
      • Mode “D”: displays the descendants of the selected person (selection key is i).

      • +
      • Mode “DAG”: displays a relationship graph.

      • +
      • Mode “DEL_FAM”: displays a page for validating the deletion of the family in +argument (key is i).

      • +
      • Mode “DEL_FAM_OK”: requests to remove a family.

      • +
      • Mode “DEL_IND”: displays a page for validating the deletion of the person in +argument (key is i).

      • +
      • Mode “DEL_IND_OK”: requests to remove a person.

      • +
      • Mode “F”: displays the family tree.

      • +
      • Mode “H”: displays the file fname.txt where fname is register with the key +v and the file being in hd/etc (hd is the dir specified by option -hd).

      • +
      • Mode “HIST”: displays an history of updates.

      • +
      • Mode “HIST_CLEAN”: displays the history list associated to the history file +in argument (key is f).

      • +
      • Mode “HIST_CLEAN_OK”: requests to clean the history associated to the history +file in argument

      • +
      • Mode “HIST_DIFF”: displays the page that allows to select (with variable +t = "SUM") and to view (with variable t = "DIFF") the difference +between all revisions of history file of concerned person in variable f. +Intepretate the template file updhist_diff.txt

      • +
      • Mode “HIST_SEARCH”: same as “HIST”, but with a default search

      • +
      • Mode “IM”: displays the image whose name is in argument (key is s)

      • +
      • Mode “IMH”: same than “IM”, but returns HTML

      • +
      • Mode “INV_FAM”: displays a menu for inverting the order of two families (where +a family is given by the f key and the individual is given by the i key).

      • +
      • Mode “INV_FAM_OK”: requests to reverse the families.

      • +
      • Mode “KILL_ANC”: Undocumented feature; kill someone’s ancestors.

      • +
      • Mode “LB”: lists the last births.

      • +
      • Mode “LD”: lists the last deaths.

      • +
      • Mode “LINKED”: displays links to pages assocaited to an individual.

      • +
      • Mode “LL”: lists the persons who lived the longest.

      • +
      • Mode “LM”: lists the last marriages.

      • +
      • Mode “MISC_NOTES”: displays a menu to search in notes.

      • +
      • Mode “MISC_NOTES_SEARCH”: same as “MISC_NOTES”, but with a search argument +(key is s)

      • +
      • Mode “MOD_DATA”: displays a menu for updating Geneweb’s dictionary of names, +last names, locations, sources and professions.

      • +
      • Mode “MOD_DATA_OK”: requests a data modification.

      • +
      • Mode “MOD_FAM”: displays a form for updating a family (key is i).

      • +
      • Mode “MOD_FAM_OK”: requests a family modification.

      • +
      • Mode “MOD_IND”: displays a form for updating a person (key is i).

      • +
      • Mode “MOD_IND_OK”: requests a person modification.

      • +
      • Mode “MOD_NOTES”: displays a text form for writing notes.

      • +
      • Mode “MOD_NOTES_OK”: requests a note update.

      • +
      • Mode “MOD_WIZNOTES”: displays the HTML page for editing wizard notes. +Fails if wizard authentification is incorrect or if current user cannot +edit.

      • +
      • Mode “MOD_WIZNOTES_OK”: requests the wizard note modification.

      • +
      • Mode “MRG”: displays a menu for merging two persons +(key for persons is i).

      • +
      • Mode “MRG_DUP”: displays a menu for merging possible duplications of persons +(key for persons is ip).

      • +
      • Mode “MRG_DUP_IND_Y_N”: either displays the merge dupliate menu if +answer_y is not a key of the request, or a form for merging two +person (whose keys are i and i2).

      • +
      • Mod “MRG_DUP_FAM_Y_N”: same than “MRG_DUP_IND_Y_N”, but for families.

      • +
      • Mode “MRG_FAM”: displays a menu for merging families (family keys are i +and i2). Couples must be identical (modulo reversion).

      • +
      • Mode “MRG_FAM_OK”: requests the family merge

      • +
      • Mode “MRG_MOD_FAM_OK”: requests the family modification and merge

      • +
      • Mode “MRG_IND”: displays a form for merging two persons

      • +
      • Mode “MRG_IND_OK”: requests a merge of two persons

      • +
      • Mode “MRG_MOD_IND_OK”: requests a merge & modification of two persons

      • +
      • Mode “N”: lists all the surnames; if a surname is selected (key is v), +displays the list of pages where this surname is used.

      • +
      • Mode “NG”: same than N, but expects a name with the key n

      • +
      • Mode “NOTES”: displays the notes

      • +
      • Mode “OA”: displays the list of the oldest persons that are still alive or, +if unknown, whose death are not probable

      • +
      • Mode “OE”: same as “OA”, but for engaged couples

      • +
      • Mode “P”: lists all the first names; if a surname is selected (key is v), +displays the list of pages where this name is used.

      • +
      • Mode “PQP_PYR”: displays a population pyramid (reachable from “STAT”)

      • +
      • Mode “PS”: displays all the persons associated to a given place (ma key for +marriage, bi key for birth, bp key for baptism, de key for death and bu +key for burial).

      • +
      • Mode “R”: displays the relationship details between two persons

      • +
      • Mode “REQUEST”: displays the current request

      • +
      • Mode “RL”: displays the relationship link between two persons

      • +
      • Mode “RLM”: displays relation ship details between multiple persons

      • +
      • Mode “S”: displays the results of a search +(from, for example, the main page).

      • +
      • Mode “SRC”: displays the file in argument (key is v)

      • +
      • Mode “STAT”: displays several links for statistics: latest births, death, +marriages, the oldest couples, persons that are alive and who lives the longest. +There also is a population pyramid.

      • +
      • Mode “CHANGE_WIZ_VIS”: displays the connected wizards

      • +
      • Mode “TT”: displays the titles associated to persons

      • +
      • Mode “U”: displays the page associated to the template updmenu.txt

      • +
      • Mode “VIEW_WIZNOTES”: Prints the HTML page displaying wizard notes

      • +
      • Mode “WIZNOTES”: Same as VIEW_WIZNOTES, but fails if not authentificated

      • +
      • Mode “WIZNOTES_SEARCH”: Same as VIEW_WIZNOTES, but highlights HTML with +the specified string searched (key is s).

      • +
      +

      Any other mode leads to an incorrect request page (Error 400).

      +
      +
      +

      Plug-ins

      +

      Plus-ins are additional features that can be added to gwd. They can register +two kind of services:

      +
        +
      • additional modes: with GwdPlugin.register, a plug-in can register new +requests

      • +
      • additional computations: with GwdPlugin.register_se, a plug-in can register +pre/post processors

      • +
      +
      +
      +

      Customization

      +

      Each base can be customized with a <BASENAME>.gwf file. A documented example is +available on the etc directory at the root of the project. +Plug-ins are activated for a base with the plugin=... directive in the +configuration file.

      +
      +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/binaries/gwdiff.html b/static/html/dev-doc/binaries/gwdiff.html new file mode 100644 index 0000000000..15929e82b6 --- /dev/null +++ b/static/html/dev-doc/binaries/gwdiff.html @@ -0,0 +1,142 @@ + + + + + + + + gwdiff — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      gwdiff

      +
      +

      Documentation

      +

      Target differences between two GeneWeb databases (see README for more details)

      +
      Usage: geneweb.gwdiff [options] base1 base2
      +Options are: 
      +  -1 <fn> <occ> <sn> : (mandatory) defines starting person in base1
      +  -2 <fn> <occ> <sn> : (mandatory) defines starting person in base2
      +  -ad : checks descendants of all ascendants 
      +  -d : checks descendants (default)
      +  -html <root>: HTML format used for report
      +  -mem : save memory space, but slower
      +
      +
      +
      +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/binaries/gwfixbase.html b/static/html/dev-doc/binaries/gwfixbase.html new file mode 100644 index 0000000000..d785f3cc37 --- /dev/null +++ b/static/html/dev-doc/binaries/gwfixbase.html @@ -0,0 +1,145 @@ + + + + + + + + fixbase — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      fixbase

      +
      +

      Documentation

      +

      Checks the consistency of the base, fixes it and applies +the latest patch if there is one.

      +
      Usage: geneweb.gwfixbase [OPTION] base
      +  -dry-run  do not commit changes (only print)
      +  -q  quiet mode
      +  -qq  very quiet mode
      +  -fast  fast mode. Needs more memory.
      +  -families-parents  missing doc
      +  -families-children  missing doc
      +  -persons-NBDS  missing doc
      +  -persons-parents  missing doc
      +  -persons-families  missing doc
      +  -pevents-witnesses  missing doc
      +  -fevents-witnesses  missing doc
      +  -marriage-divorce  missing doc
      +  -person-key  missing doc
      +  -index  rebuild index. It is automatically enable by any other option.
      +  -invalid-utf8  missing doc
      +
      +
      +
      +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/binaries/gwgc.html b/static/html/dev-doc/binaries/gwgc.html new file mode 100644 index 0000000000..1f52c9d28a --- /dev/null +++ b/static/html/dev-doc/binaries/gwgc.html @@ -0,0 +1,137 @@ + + + + + + + + gwgc — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      gwgc

      +
      +

      Documentation

      +

      Simplifies a database by removing unused entries of its dictionary.

      +
      Usage: geneweb.gwgc [OPTION] base
      +  --dry-run  do not commit changes (only print)
      +
      +
      +
      +
      +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/binaries/gwrepl.html b/static/html/dev-doc/binaries/gwrepl.html new file mode 100644 index 0000000000..fc5af3f18f --- /dev/null +++ b/static/html/dev-doc/binaries/gwrepl.html @@ -0,0 +1,137 @@ + + + + + + + + gwrepl — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      gwrepl

      +
      +

      Documentation

      +

      Starts an OCaml interactive top-level for writing scripts manipulating the +database. It loads all the necessary libraries to use the geneweb +libraries. +For script execution, run: +cat <script.ml> | [ GWREPL_PPF=/dev/null ] [ GWREPL_VERBOSE=1 ] [ GWREPL_FORCE_UNPACK=1 ] [ GWREPL_NOPROMPT=1 ] gwrepl.exe [scrip_arg1] …

      +

      For interactive top-level, run gwdrepl.exe.

      +
      +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/binaries/gwu.html b/static/html/dev-doc/binaries/gwu.html new file mode 100644 index 0000000000..d64649cea3 --- /dev/null +++ b/static/html/dev-doc/binaries/gwu.html @@ -0,0 +1,156 @@ + + + + + + + + gwu — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      gwu

      +
      +

      Documentation

      +

      Exports the content of a Geneweb base to a .gw file.

      +
      Usage: geneweb.gwu <BASE> [OPT]
      +  -odir <dir>                       create files from original name in directory (else on -o file)
      +  -isolated                         export isolated persons (work only if export all database).
      +  -old_gw                           do not export additional fields (for backward compatibility: < 7.00)
      +  -raw                              raw output (without possible utf-8 conversion)
      +  -sep <1st_name.num surname>       To use together with the option "-odir": separate this person and all his ancestors and descendants sharing the same surname. All the concerned families are displayed on standard output instead of their associated files. This option can be used several times.
      +  -sep_only_file <file>             with option "-sep", tells to separate only groups of that file.
      +  -sep_limit <num>                  When using the option "-sep", groups of families can become isolated in the files. Gwu reconnects them to the separated families (i.e. displays them to standard output) if the size of these groups is less than 21. The present option changes this limit.
      +  -a <N>                            maximum generation of the root's ascendants
      +  -ad <N>                           maximum generation of the root's ascendants descendants
      +  -key <KEY>                        key reference of root person. Used for -a/-d options. Can be used multiple times. Key format is "First Name.occ SURNAME"
      +  -c <NUM>:                         when a person is born less than <num> years ago, it is not exported unless it is Public. All the spouses and descendants are also censored.
      +  -charset [ASCII|ANSEL|ANSI|UTF-8] set charset; default is UTF-8
      +  -d <N>                            maximum generation of the root's descendants.
      +  -mem                              save memory space, but slower.
      +  -nn                               no (database) notes.
      +  -nnn                              no notes (implies -nn).
      +  -nopicture                        don't extract individual picture.
      +  -o <GED>                          output file name (default: stdout).
      +  -parentship                       select individuals involved in parentship computation between pairs of keys. Pairs must be defined with -key option, descendant first: e.g. -key "Descendant.0 SURNAME" -key "Ancestor.0 SURNAME". If multiple pair are provided, union of persons are returned.
      +  -picture-path                     extract pictures path.
      +  -s <SN>                           select this surname (option usable several times, union of surnames will be used).
      +  -source <SRC>                     replace individuals and families sources. Also delete event sources.
      +  -v                                verbose
      +
      +
      +
      +

      See also: +https://geneweb.tuxfamily.org/wiki/gwu +https://geneweb.tuxfamily.org/wiki/save

      +
      +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/binaries/gwxjg.html b/static/html/dev-doc/binaries/gwxjg.html new file mode 100644 index 0000000000..746b1270a8 --- /dev/null +++ b/static/html/dev-doc/binaries/gwxjg.html @@ -0,0 +1,128 @@ + + + + + + + + gwxjg — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      gwxjg

      +

      WARNING: This is not a plugin, it only provides tools for other plugins to use. +This package provides translation tools from Geneweb structure to Jingoo’s type system.

      +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/binaries/index.html b/static/html/dev-doc/binaries/index.html new file mode 100644 index 0000000000..3e562d4492 --- /dev/null +++ b/static/html/dev-doc/binaries/index.html @@ -0,0 +1,163 @@ + + + + + + + + Project binaries — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + +
      +
      + +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/binaries/jingoo.html b/static/html/dev-doc/binaries/jingoo.html new file mode 100644 index 0000000000..20d8f916d3 --- /dev/null +++ b/static/html/dev-doc/binaries/jingoo.html @@ -0,0 +1,123 @@ + + + + + + + + jingoo — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      jingoo

      +

      WARNING: This is not a plugin. This only loads geneweb.gwd_lib.

      +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/binaries/lib_show.html b/static/html/dev-doc/binaries/lib_show.html new file mode 100644 index 0000000000..665f4ea3f2 --- /dev/null +++ b/static/html/dev-doc/binaries/lib_show.html @@ -0,0 +1,123 @@ + + + + + + + + lib_show — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      lib_show

      +

      WARNING: This is not a plugin. This only loads geneweb.def_show.

      +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/binaries/no_index.html b/static/html/dev-doc/binaries/no_index.html new file mode 100644 index 0000000000..280ba1a962 --- /dev/null +++ b/static/html/dev-doc/binaries/no_index.html @@ -0,0 +1,122 @@ + + + + + + + + no_index — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      no_index

      +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/binaries/official_binaries.html b/static/html/dev-doc/binaries/official_binaries.html new file mode 100644 index 0000000000..157f304794 --- /dev/null +++ b/static/html/dev-doc/binaries/official_binaries.html @@ -0,0 +1,189 @@ + + + + + + + + Official binaries — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      Official binaries

      +

      These binaries are from the official geneweb package. They provide +the core utilities for manipulating databases and a web server.

      + +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/binaries/plugins.html b/static/html/dev-doc/binaries/plugins.html new file mode 100644 index 0000000000..3d0353a3e7 --- /dev/null +++ b/static/html/dev-doc/binaries/plugins.html @@ -0,0 +1,144 @@ + + + + + + + + Plug-ins — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      Plug-ins

      +

      Plug-ins are user-defined scripts that were merged into the main repository. +While they are part of the main branch, their purpose it to let user develop +their own OCaml scripts for updating the behaviour or the web werver gwd.

      +
      +

      List of plug-ins:

      + +
      +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/binaries/setup.html b/static/html/dev-doc/binaries/setup.html new file mode 100644 index 0000000000..10deb24da3 --- /dev/null +++ b/static/html/dev-doc/binaries/setup.html @@ -0,0 +1,134 @@ + + + + + + + + setup — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      setup

      +

      The database setup portal. It depends on wserver, a library defined in bin/.

      +
      Usage: setup.exe [options] where options are:
      +  -bd <dir>: Directory where the databases are installed.
      +  -gwd_p <number>: Specify the port number of gwd (default = 2317); > 1024 for normal users.
      +  -lang <string>: default lang
      +  -daemon : Unix daemon mode.
      +  -p <number>: Select a port number (default = 2316); > 1024 for normal users.
      +  -only <file>: File containing the only authorized address
      +  -gd <string>: gwsetup directory
      +  -bindir <string>: binary directory (default = value of option -gd)
      +
      +
      +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/binaries/test.html b/static/html/dev-doc/binaries/test.html new file mode 100644 index 0000000000..3aa9b9f12a --- /dev/null +++ b/static/html/dev-doc/binaries/test.html @@ -0,0 +1,156 @@ + + + + + + + + test — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      test

      +

      Starts multiple non-regression tests. Tested modules are MUtil, Util +(Test_utils), the choosen Sosa implementation (Test_sosa), Place +(Test_place) and NotesLink (Test_wiki). +Can be executed with make test or _build/default/test/test.exe.

      +
      usage: default/test/test.exe options*
      +  -conf fn                        Read configuration file.
      +  -cache-filename str             Cache file to store previous results. (default: /home/ovenstent/gits/geneweb-project/geneweb/_build/oUnit-$(suite_name).cache)
      +  -chooser {failfirst|simple}
      +                                  Select the method to choose tests to run. (default: simple)
      +  -ci {true|false}                Display logs for CI, like Travis and AppVeyor, in the console with colors. (default: false)
      +  -display {true|false}           Output logs on screen. (default: true)
      +  -health-check-interval f        Seconds between checking health of workers. (default: 1.)
      +  -log-encoding str               Encoding of the log. (default: utf-8)
      +  -no-cache-filename              Reset value of cache_filename.
      +  -no-output-file                 Reset value of output_file.
      +  -no-output-html-dir             Reset value of output_html_dir.
      +  -no-output-junit-file           Reset value of output_junit_file.
      +  -no-testdata-dir                Reset value of testdata_dir.
      +  -output-file str                Output verbose log in the given file. (default: /home/ovenstent/gits/geneweb-project/geneweb/_build/oUnit-$(suite_name)-$(shard_id).log)
      +  -output-html-dir str            Output directory of the HTML files. (default: none)
      +  -output-junit-file str          Output file for JUnit. (default: none)
      +  -processes-grace-period f       Delay to wait for a process to stop. (default: 5.)
      +  -processes-kill-period f        Delay to wait for a process to stop after killing it. (default: 5.)
      +  -results-style-1-X {true|false} Use OUnit 1.X results printer (will be deprecated in 2.1.0+). (default: false)
      +  -run-gc-full-major {true|false} Run a Gc.full_major in between tests. (default: true)
      +  -runner {processes|sequential}
      +                                  Select a the method to run tests. (default: processes)
      +  -shards i                       Number of shards to use as worker (threads or processes). (default: 4)
      +  -suite-name str                 The name of the test suite running. (default: Geneweb)
      +  -testdata-dir str               Location of the test data directory (absolute path). (default: none)
      +  -verbose {true|false}           Run test in verbose mode. (default: false)
      +  -only-test path                 Run only the selected tests.
      +  -list-test                      List tests
      +
      +
      +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/binaries/tests.html b/static/html/dev-doc/binaries/tests.html new file mode 100644 index 0000000000..4d946eaea3 --- /dev/null +++ b/static/html/dev-doc/binaries/tests.html @@ -0,0 +1,126 @@ + + + + + + + + Tests — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      Tests

      +
      +

      List of binaries:

      + +
      +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/binaries/update_nldb.html b/static/html/dev-doc/binaries/update_nldb.html new file mode 100644 index 0000000000..66a4034c09 --- /dev/null +++ b/static/html/dev-doc/binaries/update_nldb.html @@ -0,0 +1,122 @@ + + + + + + + + update_nldb — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      update_nldb

      +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/binaries/v7.html b/static/html/dev-doc/binaries/v7.html new file mode 100644 index 0000000000..32b81016d7 --- /dev/null +++ b/static/html/dev-doc/binaries/v7.html @@ -0,0 +1,128 @@ + + + + + + + + v7 — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      v7

      +

      Defines new reqursts and redefines some old ones with new changes for the V7. +Registers the requests to the index (“”), A, C, D, DOC, L, P, PS and TP.

      +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/binaries/v7_im.html b/static/html/dev-doc/binaries/v7_im.html new file mode 100644 index 0000000000..708d0c5a3c --- /dev/null +++ b/static/html/dev-doc/binaries/v7_im.html @@ -0,0 +1,128 @@ + + + + + + + + v7_im — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      v7_im

      +

      Complements plugin v7 with image handling. +Registers requests DEL_IMAGE, DEL_IMAGE_OK, SND_IMAGE and SND_IMAGE_OK.

      +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/binaries/welcome.html b/static/html/dev-doc/binaries/welcome.html new file mode 100644 index 0000000000..eda436ba41 --- /dev/null +++ b/static/html/dev-doc/binaries/welcome.html @@ -0,0 +1,128 @@ + + + + + + + + welcome — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      welcome

      +

      This plugin facilitates the main page and search page use. +Registers the requests to the index page and S.

      +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/binaries/xhtml.html b/static/html/dev-doc/binaries/xhtml.html new file mode 100644 index 0000000000..e3690ce21d --- /dev/null +++ b/static/html/dev-doc/binaries/xhtml.html @@ -0,0 +1,122 @@ + + + + + + + + xhtml — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      xhtml

      +

      Replaces the Content-type field of requests by xhtml+xml.

      +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/index.html b/static/html/dev-doc/index.html new file mode 100644 index 0000000000..b1c4b2b4d9 --- /dev/null +++ b/static/html/dev-doc/index.html @@ -0,0 +1,151 @@ + + + + + + + + Developer documentation — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      Developer documentation

      +

      This documentation is an overview of the different components of Geneweb. +It describes:

      +
        +
      • The functioning of the build system;

      • +
      • An overview of some libraries defined in the project;

      • +
      • A documentation of the main binaries;

      • +
      • A documentation for libraries generated with odoc.

      • +
      + +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/installation/build-system.html b/static/html/dev-doc/installation/build-system.html new file mode 100644 index 0000000000..e41e7e3d7e --- /dev/null +++ b/static/html/dev-doc/installation/build-system.html @@ -0,0 +1,102 @@ + + + + + + + + <no title> — audit 0.1 documentation + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +

      dsd

      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/installation/index.html b/static/html/dev-doc/installation/index.html new file mode 100644 index 0000000000..f2e0cf001d --- /dev/null +++ b/static/html/dev-doc/installation/index.html @@ -0,0 +1,1211 @@ + + + + + + + + Installation procedure — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      Installation procedure

      +
      +

      Build documentation

      +
        +
      1. Install the dependencies in an opam switch

        +
        $ opam switch create geneweb 4.09.1
        +$ opam install . --deps-only
        +
        +
        +
      2. +
      3. Run the configuration script

        +
        $ ocaml ./configure.ml
        +
        +
        +
      4. +
      5. Build the distibution

        +
        $ make clean distrib
        +
        +
        +
      6. +
      +
      +
      +

      Configure

      +

      The configure.ml file is an ocaml script whose purpose is to +update Makefile.config by setting the environment variables +the Makefile needs.

      +
      usage: configure.ml [options]
      +  --gwdb-legacy Use legacy backend
      +  --release Use release profile: no debug informations (defaut: true)
      +  --debug Use dev profile: no optimization, debug informations (default: false)
      +  --sosa-legacy Use legacy Sosa module implementation
      +  --sosa-num Use Sosa module implementation based on `num` library
      +  --sosa-zarith Use Sosa module implementation based on `zarith` library
      +  --syslog Log gwd errors using syslog
      +  -help  Display this list of options
      +  --help  Display this list of options
      +
      +
      +
      +
      +

      Build system

      +
      +

      Makefile

      +

      The root of every action that could be performed on geneweb pass over its Makefile. In this section we will describe the variables, targets and its dependencies.

      +
      +

      Variables

      +

      Makefile loads variables from Makefile.config generated by the configuration script for customised execution of some commands. Variables with suffix _D are passed to cppo command that preprocess files with an equivalent to the C preprocessor. Here is a description of those variables :

      +
        +
      • OS_TYPE : kernel name (Linux, Win, Darwin, etc.)

      • +
      • STRIP : command that discards symbols from compiled object files. Depends on kernel (linux command is strip).

      • +
      • RM : command that is used to remove files, directories, etc. Depends on kernel (linux command is /bin/rm -f).

      • +
      • EXT : extension for geneweb executable files. Depends on kernel (on Windows it’s .exe).

      • +
      • GWDB_D : argument to cppo command that defines a variable that tells which geneweb data base driver implementation will be used (example : GENEWEB_GWDB_LEGACY).

      • +
      • OS_D : argument to cppo command that defines a variable for current system (example : UNIX).

      • +
      • SYSLOG_D : argument to cppo command that could define a marker variable SYSLOG. When defined, activate logging by geneweb server.

      • +
      • GWDB_PKG : dune library that implements geneweb database driver (example : geneweb.gwdb-legacy).

      • +
      • SOSA_PKG : dune library that implements sosa (example : geneweb_sosa_zarith).

      • +
      • SYSLOG_PKG : if SYSLOG is defined, then indicate dune library used for logging functionalities.

      • +
      • DUNE_DIRS_EXCLUDE : specifies directories that will be excluded from geneweb library. Used to exclude not chosen implementations for sosa and for geneweb database driver.

      • +
      • DUNE_PROFILE : specifies dune profile (default : release).

      • +
      +

      Makefile also defines additional non-configurable variables :

      +
        +
      • PREFIX :

      • +
      • DISTRIB_DIR : directory where a local geneweb distribution is stored.

      • +
      • BUILD_DISTRIB_DIR : directory where geneweb executable files for local distribution are stored.

      • +
      • BUILD_DIR : directory where the compiled artefacts are stored.

      • +
      • CPPO_D : regroups all arguments to cppo (GWDB_D, OS_D, SYSLOG_D). If dune’s profile is dev then also contains the definition of DEBUG variable that enables emitting warnings on stderr by geneweb server.

      • +
      • BENCH_FILE : file where benchmark results are stored.

      • +
      +

      Nowadays geneweb is entirely compiled by dune, due to dune files. Non-preprocessed version of dune files are stored in dune.in. Makefile is responsible for the generation of corresponding dune from the dune.in. Every dune file that should be generated is stored in variable GENERATED_FILES_DEP in addition to other files generated by Makefile :

      +
      GENERATED_FILES_DEP = \
      +	dune-workspace \
      +	hd/etc/version.txt \
      +	lib/dune \
      +	lib/gwdb/dune \
      +	lib/core/dune \
      +	lib/gwlib.ml \
      +	lib/util/dune \
      +	benchmark/dune \
      +	bin/connex/dune \
      +	bin/consang/dune \
      +	bin/fixbase/dune \
      +	bin/ged2gwb/dune \
      +	bin/gwb2ged/dune \
      +	bin/gwc/dune \
      +	bin/gwd/dune \
      +	bin/gwdiff/dune \
      +	bin/gwgc/dune \
      +	bin/gwrepl/dune \
      +	bin/gwrepl/.depend \
      +	bin/gwu/dune \
      +	bin/setup/dune \
      +	bin/update_nldb/dune \
      +	test/dune \
      +
      +
      +
      +
      +

      Targets

      +
      +
      Main targets
      +
        +
      • Makefile.config: configure.ml

        +

        Executed when Makefile.config isn’t up-to-date with configure.ml. Prints corresponding error message and terminates execution. This target isn’t executed when the goal is ci target.

        +
      • +
      • lib/gwlib.ml:

        +

        Generates the content for lib/gwlib.ml that depends on PREFIX.

        +
      • +
      • bin/gwrepl/.depend:

        +

        Generates the content for bin/gwrepl/.depend.

        +
      • +
      • hd/etc/version.txt:

        +

        Generates the content for hd/etc/version.txt that indicates some information about geneweb version like date of compilation and commit used.

        +
      • +
      • %/dune: %/dune.in Makefile.config

        +

        Generates dune file from corresponding dune.in as follows:

        +
          +
        • Preprocess with cppo -n depending on CPPO_D argument.

        • +
        • Remplaces with sed occurrences of %%%CPPO_D%%%, %%%SOSA_PKG%%%, %%%GWDB_PKG%%%, %%%SYSLOG_PKG%%% and %%%DUNE_DIRS_EXCLUDE%%% by the values of corresponding variables.

        • +
        +
      • +
      • dune-workspace: dune-workspace.in Makefile.config

        +

        Generates dune-workspace file that is used to define different build contexts and currently selected build profile. Generation is done by replacing the occurrence of %%%DUNE_PROFILE%%% inside dune-workspace.in by the value of corresponding variable.

        +
      • +
      • build: $(GENERATED_FILES_DEP)

        +

        Default goal when make is called without targets. Executes the target for every file specified in GENERATED_FILES_DEP and then build all public artefacts in geneweb package.

        +
      • +
      • distrib: build

        +

        Principal target. Build entire system and creates a local distibution of geneweb under DISTRIB_DIR directory. See for more information.

        +
      • +
      • clean:

        +

        Removes all generated files that are specified in GENERATED_FILES_DEP and DISTRIB_DIR

        +
      • +
      +
      +
      +
      Additional targets
      +
        +
      • generated: $(GENERATED_FILES_DEP)

        +

        Executes the target for every file specified in GENERATED_FILES_DEP.

        +
      • +
      • install: $(GENERATED_FILES_DEP)

        +

        Executes the target for every file specified in GENERATED_FILES_DEP, compilates all public artefacts and then install geneweb in opam.

        +
      • +
      • uninstall: $(GENERATED_FILES_DEP)

        +

        Same as install but remote geneweb from opam.

        +
      • +
      • doc: | $(GENERATED_FILES_DEP)

        +

        Generates documentation for all public artefacts in geneweb. Note that prerequisites on the right to | are order-only.

        +
      • +
      • test: | $(GENERATED_FILES_DEP)

        +

        Executes test suites defined in test directory.

        +
      • +
      • bench: | $(GENERATED_FILES_DEP)

        +

        Executes the benchmark defined in benchmark directory.

        +
      • +
      • bench-marshal: | $(GENERATED_FILES_DEP)

        +

        Executes the benchmark with options --marshal --name ${BENCH_NAME} ${BENCH_FILE} where BENCH_NAME is the name of bench results that will be stored in hash table and marshalled in BENCH_FILE. Prerequisite to ci target.

        +
      • +
      • bench-tabulate: | $(GENERATED_FILES_DEP)

        +

        Executes the benchmark with option --tabulate ${BENCH_FILE} that prints on the screen tables of bench results stored in BENCH_FILE. Prerequisite to ci target.

        +
      • +
      • ci:

        +
          +
        • Configure geneweb for every existing implementation of sosa.

        • +
        • Executes tests and benchmarks (name corresponds to sosa implementation) for each of them (recursive make call with goals clean, test, bench-marshal clean).

        • +
        • Prints all benchmark results (recursive make call with goal bench-tabulate).

        • +
        +
      • +
      +
      +
      +
      +
      +

      Dune configuration files

      +
      +

      dune-project

      +

      This file is used to mark the root of projects as well as define project-wide parameters. In the case of geneweb this file specifies version of the dune configuration files with lang stanza and sets the name of project with name stanza:

      +
      (lang dune 2.8)
      +(name geneweb)
      +
      +
      +
      +
      +

      dune-workspace

      +

      This file is used to define different build contexts and to select a build profile. +Geneweb defines only one default context. Build profile (release or dev) is chosen by configuration script (--release option to use release profile) with subsequent make.

      +
      +
      +

      dune

      +

      Dune files used to describe libraries, executables, tests, and everything dune needs to know about. Some of dune files are preprocessed by Makefile in order to remplace all occurences of %%%VARIABLE%%% by their real value (see Variables) In this section we will describe each of those file inside geneweb project.

      +

      ./dune

      +

      The root dune file that, in the geneweb case, modifies the environment used with dev build profile. Particularly, it passes additional option to the OCaml compiler :

      +
      -w +a-4-9-35-42-44-48
      +
      +
      +

      This option tells to compiler to enable all the warnings except :

      +
        +
      • Fragile pattern matching.

      • +
      • Missing fields in a record pattern.

      • +
      • Unused for-loop index.

      • +
      • Disambiguated constructor or label name.

      • +
      • Open statement that shadows an already defined identifier.

      • +
      • Implicit elimination of optional arguments.

      • +
      +
      +
      +

      Geneweb library

      +

      lib/dune

      +

      Defines public geneweb library .

      +
        +
      • It includes modules under the lib directory and every of them is preprocessed with cppo.

      • +
      • Module TemplAst is specified as a module without implementation (has only .mli).

      • +
      • Module Templ_parser is obtained from templ_parser.mll with stanza ocamllex that makes call for ocamllex lexer.

      • +
      • Compilation of this library includes compilation of every subdirectory (with dirs stanza) except those mentioned in %%%DUNE_DIRS_EXCLUDE%%% variable (not used implementations).

      • +
      • Depends on geneweb libraries :

        +
          +
        • geneweb_core

        • +
        • geneweb_def

        • +
        • geneweb_gwdb

        • +
        • geneweb_sosa_mli

        • +
        • geneweb_util

        • +
        +
      • +
      • Depends on extrenal libraries :

        + +
      • +
      +

      lib/core/dune

      +

      Defines public geneweb.core library (locally - geneweb_core).

      +
        +
      • It includes modules under the lib/core directory and every of them is preprocessed with cppo.

      • +
      • Depends on geneweb libraries :

        +
          +
        • geneweb_def

        • +
        • geneweb_gwdb

        • +
        • geneweb_sosa_mli

        • +
        • geneweb_util

        • +
        +
      • +
      • Depends on extrenal libraries :

        + +
      • +
      +

      lib/def/dune

      +

      Defines public geneweb.def library (locally - geneweb_def). Includes only two modules : Adef and Def.

      +

      lib/gwdb/dune

      +

      Defines public geneweb.gwdb library (locally - geneweb_gwdb).

      +
        +
      • It includes modules under the lib/gwdb directory and every of them is preprocessed with cppo.

      • +
      • Depends on geneweb libraries :

        +
          +
        • geneweb_def

        • +
        • gwdb_driver_mli

        • +
        • geneweb_util

        • +
        +
      • +
      • Depends on extrenal libraries :

        + +
      • +
      +

      lib/gwdb_driver.mli/dune

      +

      Defines public virtual (that requires an implementation) geneweb.gwdb_driver library (locally - gwdb_driver_mli).

      +
        +
      • Include only one virtual module Gwdb_driver.

      • +
      • Depends on geneweb libraries :

        +
          +
        • geneweb_def

        • +
        +
      • +
      • Depends on extrenal libraries :

        + +
      • +
      +

      lib/gwdb-legacy/dune

      +

      Defines public geneweb.gwdb-legacy library (locally - gwdb_legacy). This library is an implementaion for virtual gwdb_driver_mli library.

      +
        +
      • It includes modules under the lib/gwdb-legacy directory.

      • +
      • Module Dbdisk is specified as a module without implementation.

      • +
      • Depends on geneweb libraries :

        +
          +
        • geneweb_def

        • +
        • geneweb_util

        • +
        +
      • +
      • Depends on extrenal libraries :

        + +
      • +
      +

      lib/json_export/dune

      +

      Defines public geneweb.export library (locally - geneweb_export).

      +
        +
      • Include only one module Json_converter.

      • +
      • Depends on geneweb libraries :

        +
          +
        • geneweb_def

        • +
        • geneweb_def_show

        • +
        • geneweb_gwdb

        • +
        +
      • +
      • Depends on extrenal libraries :

        + +
      • +
      +

      lib/show/dune

      +

      Defines public geneweb.def_show library (locally - geneweb_def_show).

      +
        +
      • Include only one module Def_show. This module is preprocessed with ppx_import and ppx_deriving.show PPX rewriters that require feedback from the compilation phase (for that it is used inside staged_pps stanza rather than in ordinar pps).

      • +
      • Depends on geneweb libraries :

        +
          +
        • geneweb_def

        • +
        • geneweb_gwdb

        • +
        +
      • +
      +

      lib/sosa.mli/dune

      +

      Defines public virtual geneweb.sosa.mli library (locally - geneweb_sosa_mli). Includes only one virtual module Sosa.

      +

      lib/sosa_array/dune

      +

      Defines public geneweb.sosa_array library (locally - geneweb_sosa_array). This library is an one of implementaions for virtual geneweb_sosa_mli library. It includes only one module Sosa.

      +

      lib/sosa_num/dune

      +

      Defines public geneweb.sosa_num library (locally - geneweb_sosa_num). This library is an one of implementaions for virtual geneweb_sosa_mli library.

      +
        +
      • It includes only one module Sosa.

      • +
      • Depends on extrenal libraries :

        + +
      • +
      +

      lib/sosa_zarith/dune

      +

      Defines public geneweb.sosa_zarith library (locally - geneweb_sosa_zarith). This library is an one of implementaions for virtual geneweb_sosa_mli library.

      +
        +
      • It includes only one module Sosa.

      • +
      • Depends on extrenal libraries :

        + +
      • +
      +

      lib/util/dune

      +

      Defines public geneweb.util library (locally - geneweb_util).

      +
        +
      • It includes modules under the lib/util directory and every of them is preprocessed with cppo.

      • +
      • Depends on geneweb libraries :

        +
          +
        • geneweb_def

        • +
        +
      • +
      • Depends on extrenal libraries :

        + +
      • +
      +
      +
      Geneweb executables
      +

      bin/connex/dune

      +

      Defines public geneweb.connex executable (locally - connex).

      +
        +
      • It includes only one module Connex.

      • +
      • Depends on geneweb libraries :

        +
          +
        • geneweb

        • +
        • Chosen implementation of gwdb_driver_mli.

        • +
        • Chosen implementation of geneweb_sosa_mli.

        • +
        +
      • +
      • Depends on extrenal libraries :

        + +
      • +
      +

      bin/consang/dune

      +

      Defines public geneweb.consang executable (locally - consang).

      +
        +
      • It includes only one module Consang that is preprocessed with cppo.

      • +
      • Depends on geneweb libraries :

        +
          +
        • geneweb

        • +
        • Chosen implementation of gwdb_driver_mli.

        • +
        • Chosen implementation of geneweb_sosa_mli.

        • +
        +
      • +
      • Depends on extrenal libraries :

        + +
      • +
      +

      bin/fixbase/dune

      +

      Defines public geneweb.gwfixbase executable (locally - gwfixbase).

      +
        +
      • It includes only one module Gwfixbase.

      • +
      • Depends on geneweb libraries :

        +
          +
        • geneweb

        • +
        • Chosen implementation of gwdb_driver_mli.

        • +
        • Chosen implementation of geneweb_sosa_mli.

        • +
        +
      • +
      • Depends on extrenal libraries :

        + +
      • +
      +

      bin/ged2gwb/dune

      +

      Defines public geneweb.ged2gwb executable (locally - ged2gwb).

      +
        +
      • It includes only one module Ged2gwb preprocessed by camlp5o that provides parsing and pretty printing tools. Particulary, it uses following extensions:

        +
          +
        • pr_o.cmo: pretty print in normal syntax

        • +
        • pa_extend.cmo: syntax extension for grammars

        • +
        • q_MLast.cmo: syntax tree nodes (in revised syntax)

        • +
        +
      • +
      • Depends on geneweb libraries :

        +
          +
        • geneweb

        • +
        • Chosen implementation of gwdb_driver_mli.

        • +
        • Chosen implementation of geneweb_sosa_mli.

        • +
        +
      • +
      • Depends on extrenal libraries :

        + +
      • +
      +

      bin/gwb2ged/dune

      +

      Defines :

      +
        +
      1. Public geneweb.gwb2ged_lib library (locally - gwb2ged_lib).

        +
          +
        • It includes only one module Gwb2gedLib.

        • +
        • Depends on geneweb libraries :

          +
            +
          • geneweb

          • +
          • gwexport_lib

          • +
          +
        • +
        +
      2. +
      3. Public geneweb.gwb2ge executable (locally - gwb2ged).

        +
          +
        • It includes only one module Gwb2ged.

        • +
        • Depends on geneweb libraries :

          +
            +
          • geneweb

          • +
          • gwb2ged_lib

          • +
          • gwu_lib

          • +
          • Chosen implementation of gwdb_driver_mli.

          • +
          • Chosen implementation of geneweb_sosa_mli.

          • +
          +
        • +
        • Depends on extrenal libraries :

          + +
        • +
        +
      4. +
      +

      bin/gwc/dune

      +

      Defines public geneweb.gwc executable (locally - gwc).

      +
        +
      • It includes modules under the bin/gwc directory and every of them is preprocessed with cppo.

      • +
      • Depends on geneweb libraries :

        +
          +
        • geneweb

        • +
        • Chosen implementation of gwdb_driver_mli.

        • +
        • Chosen implementation of geneweb_sosa_mli.

        • +
        +
      • +
      • Depends on extrenal libraries :

        + +
      • +
      +

      bin/gwd/dune

      +

      Defines:

      +
        +
      1. Public wrapped geneweb.gwd_lib library (locally - gwd_lib).

        +
          +
        • It includes modules GwdLog, GwdPlugin and Request that are preprocessed with cppo.

        • +
        • Depends on geneweb libraries :

          +
            +
          • geneweb

          • +
          • wserver

          • +
          • Chosen implementation of gwdb_driver_mli.

          • +
          • Chosen implementation of geneweb_sosa_mli.

          • +
          +
        • +
        +
      2. +
      3. Public executable geneweb.gwd library (locally - gwd).

        +
          +
        • It includes modules Gwd, GwdPluginDep, GwdPluginMD5, GwdPluginMETA and Robot that are preprocessed with cppo.

        • +
        • Module GwdPluginMD5 is created by rule stanza. Stanza deps tells to dune to do firstly:

          +
            +
          • Find module Mk_gwdPluginMD5

          • +
          • Construct all recursively defined in plugins/ aliases @plugin. +File gwdPluginMD5.ml is created by running maker script mk_gwdPluginMD5.ml with path to plugins/ directory specified in argument.

          • +
          +
        • +
        • All the libraies used by executable are compiled with -linkall flag.

        • +
        • Depends on geneweb libraries :

          +
            +
          • gwd_lib

          • +
          • geneweb

          • +
          • wserver

          • +
          • Chosen implementation of gwdb_driver_mli.

          • +
          • Chosen implementation of geneweb_sosa_mli.

          • +
          +
        • +
        • Depends on extrenal libraries :

          + +
        • +
        +
      4. +
      +

      bin/gwdiff/dune

      +

      Defines public geneweb.gwdiff executable (locally - gwdiff).

      +
        +
      • It includes only one module Gwdiff.

      • +
      • Depends on geneweb libraries :

        +
          +
        • geneweb

        • +
        • Chosen implementation of gwdb_driver_mli.

        • +
        • Chosen implementation of geneweb_sosa_mli.

        • +
        +
      • +
      • Depends on extrenal libraries :

        + +
      • +
      +

      bin/gwexport/dune

      +

      Defines public geneweb.gwexport_lib library (locally - gwexport_lib).

      +
        +
      • It includes only one module Gwexport.

      • +
      • Depends on geneweb libraries :

        +
          +
        • geneweb

        • +
        +
      • +
      +

      bin/gwgc/dune

      +

      Defines public geneweb.gwgc executable (locally - gwgc).

      +
        +
      • It includes only one module Gwgc that is preprocessed with cppo.

      • +
      • Depends on geneweb libraries :

        +
          +
        • geneweb

        • +
        • Chosen implementation of gwdb_driver_mli.

        • +
        • Chosen implementation of geneweb_sosa_mli.

        • +
        +
      • +
      • Depends on extrenal libraries :

        + +
      • +
      +

      bin/gwrepl/dune

      +

      Defines:

      +
        +
      1. Private library gwrepl_deps that links all dependent libraries.

        +
          +
        • Depends on geneweb libraries :

          +
            +
          • geneweb_core

          • +
          • geneweb_def

          • +
          • geneweb_util

          • +
          • geneweb_gwdb

          • +
          • Chosen implementation of gwdb_driver_mli.

          • +
          • Chosen implementation of geneweb_sosa_mli.

          • +
          +
        • +
        • Depends on external libraries

          + +
        • +
        +
      2. +
      3. Public gwrepl executable .

        +
          +
        • It includes only two modules Gwrepl and Data.

        • +
        • gwrepl executable is preprocessed with cppo.

        • +
        • Module Data is created with rule stanza from :

          +
            +
          • Module Mk_data

          • +
          • File .depend .
            +File data.ml is created by running maker script mk_data.ml that is linked with unix.cma by OCaml toplevel.

          • +
          +
        • +
        • Data is preprocessed with ppx_blob that is used to extract the content of binary file at compile time.

        • +
        • It is compiled by bytecode compiler and producing static object files:

          +
          (modes byte object)
          +
          +
          +
        • +
        • All the libraies used by executable are compiled with -linkall flag.

        • +
        • Linked with -custom option that is used by bytecode compiler to produce native executable that embeds the ocamlrun virtual machine as well as the byte code. See dune-executable.

        • +
        • Depends on external libraries:

          + +
        • +
        +
      4. +
      +

      bin/gwu/dune

      +

      Defines :

      +
        +
      1. Public geneweb.gwu_lib library (locally - gwu_lib).

        +
          +
        • It includes only one module GwuLib.

        • +
        • Depends on geneweb libraries :

          +
            +
          • geneweb

          • +
          • gwexport_lib

          • +
          +
        • +
        +
      2. +
      3. Public geneweb.gwu executable (locally - gwu).

        +
          +
        • It includes only one module Gwu.

        • +
        • Depends on geneweb libraries :

          +
            +
          • geneweb

          • +
          • gwexport_lib

          • +
          • gwu_lib

          • +
          • Chosen implementation of gwdb_driver_mli.

          • +
          • Chosen implementation of geneweb_sosa_mli.

          • +
          +
        • +
        • Depends on extrenal libraries :

          + +
        • +
        +
      4. +
      +

      bin/setup/dune

      +

      Defines public geneweb.setup executable (locally - setup).

      +
        +
      • It includes only one module Setup that is preprocessed with cppo.

      • +
      • Depends on geneweb libraries :

        +
          +
        • geneweb

        • +
        • wserver

        • +
        • Chosen implementation of gwdb_driver_mli.

        • +
        • Chosen implementation of geneweb_sosa_mli.

        • +
        +
      • +
      • Depends on extrenal libraries :

        + +
      • +
      +

      bin/update_nldb/dune

      +

      Defines public geneweb.update_nldb executable (locally - update_nldb).

      +
        +
      • It includes only one module Update_nldb.

      • +
      • Depends on geneweb libraries :

        +
          +
        • geneweb

        • +
        • Chosen implementation of gwdb_driver_mli.

        • +
        • Chosen implementation of geneweb_sosa_mli.

        • +
        +
      • +
      • Depends on extrenal libraries :

        + +
      • +
      +

      bin/wserver/dune

      +

      Defines public geneweb.wserver library (locally - wserver).

      +
        +
      • It includes only one module Wserver.

      • +
      • Depends on geneweb libraries :

        +
          +
        • geneweb_util

        • +
        +
      • +
      • Depends on extrenal libraries :

        + +
      • +
      +
      +
      +
      Geneweb plugins
      +

      plugins/cgl/dune

      +

      Defines plugin plugin_cgl.

      +
        +
      • It includes only one module Plugin_cgl.

      • +
      • Plugin is compiled by native compiler with

        +
        (modes (native plugin))
        +
        +
        +
      • +
      • Construction of @plugin alias depends on plugin’s compilation.

      • +
      • Depends on geneweb libraries :

        +
          +
        • geneweb

        • +
        • gwd_lib

        • +
        • wserver

        • +
        +
      • +
      +

      plugins/export/dune

      +

      Defines plugin plugin_export.

      +
        +
      • It includes only one module Plugin_export.

      • +
      • Plugin is compiled by native compiler.

      • +
      • Construction of @plugin alias depends on plugin’s compilation.

      • +
      • Compiled with flags that tells to compiler to disable warnings:

        +
          +
        • Innocuous unused variable.

        • +
        • Constructor or label name used out of scope.

        • +
        +
      • +
      • Linked statically with libraries :

        +
          +
        • gwexport_lib

        • +
        • gwu_lib

        • +
        • gwb2ged_lib

        • +
        +
      • +
      • Depends on geneweb libraries :

        +
          +
        • geneweb

        • +
        • gwd_lib

        • +
        • gwb2ged_lib

        • +
        • gwexport_lib

        • +
        • gwu_lib

        • +
        • wserver

        • +
        +
      • +
      +

      plugins/fixbase/dune

      +

      Defines plugin plugin_fixbase.

      +
        +
      • It includes only one module Plugin_fixbase.

      • +
      • Plugin is preprocessed with ppx_deriving.show.

      • +
      • Plugin is compiled by native compiler with -linkall option.

      • +
      • Construction of @plugin alias depends on:

        +
          +
        • Plugin’s compilation

        • +
        • Every file from assets directory.

        • +
        +
      • +
      • Depends on geneweb libraries :

        +
          +
        • gwd_lib

        • +
        • geneweb_def_show

        • +
        +
      • +
      +

      plugins/forum/dune

      +

      Defines plugin plugin_forum.

      +
        +
      • It includes only one module Plugin_forum that was obtained by preprocessoing corresponding .cppo.ml. Stanza rule in this context is used to remplace lines with directive #include by one of included file :

      • +
      +
      (rule
      +  (target plugin_forum.ml)
      +  (deps
      +    (:included
      +      %{project_root}/plugins/forum/forum.ml
      +      %{project_root}/plugins/forum/forumDisplay.ml
      +    )
      +    (:src plugin_forum.cppo.ml)
      +  )
      +  (action (run %{bin:cppo} %{src} -o %{target}))
      +
      +
      +
        +
      • Plugin is compiled by native compiler.

      • +
      • Construction of @plugin alias depends on plugin’s compilation.

      • +
      • Depends on geneweb libraries :

        +
          +
        • geneweb

        • +
        • gwd_lib

        • +
        • wserver

        • +
        +
      • +
      +

      plugins/gwxjg/dune

      +

      Defines :

      +
        +
      1. Public geneweb.plugin_gwxjg_lib library (locally - plugin_gwxjg_lib).

        +
          +
        • It includes modules Gwxjg_ezgw, Gwxjg_data, Gwxjg_trans and Gwxjg_lexicon_parser.

        • +
        • Module Gwxjg_lexicon_parser is obtained from gwxjg_lexicon_parser.mll with stanza ocamllex that makes call for ocamllex lexer.

        • +
        • Compiled with flags that tells to compiler to disable warnings:

          +
            +
          • Constructor or label name used out of scope.

          • +
          • Disambiguated constructor or label name.

          • +
          +
        • +
        • Depends on geneweb libraries :

          +
            +
          • geneweb

          • +
          +
        • +
        • Depends on external libraries :

          + +
        • +
        +
      2. +
      3. Plugin plugin_gwxjg.

        +
          +
        • It includes only one module Plugin_gwxjg.

        • +
        • Plugin is compiled by native compiler with -linkall option.

        • +
        • Construction of @plugin alias depends on:

          +
            +
          • Plugin’s compilation

          • +
          • META file.

          • +
          +
        • +
        • Linked statically with libraries :

          +
            +
          • plugin_gwxjg_lib

          • +
          +
        • +
        • Depends on geneweb libraries :

          +
            +
          • gwd_lib

          • +
          • plugin_gwxjg_lib

          • +
          +
        • +
        +
      4. +
      +

      plugins/jingoo/dune

      +

      Defines plugin plugin_jingoo.

      +
        +
      • It includes only one module Plugin_jingoo.

      • +
      • Plugin is compiled by native compiler with -linkall option.

      • +
      • Construction of @plugin alias depends on plugin’s compilation.

      • +
      • Linked statically with libraries :

        + +
      • +
      • Depends on geneweb libraries :

        +
          +
        • gwd_lib

        • +
        +
      • +
      +

      plugins/lib_show/dune

      +

      Defines plugin plugin_lib_show.

      +
        +
      • It includes only one module Plugin_lib_show.

      • +
      • Plugin is compiled by native compiler with -linkall option.

      • +
      • Construction of @plugin alias depends on plugin’s compilation.

      • +
      • Linked statically with libraries :

        +
          +
        • geneweb_def_show

        • +
        +
      • +
      +

      plugins/no_index/dune

      +

      Defines plugin plugin_no_index.

      +
        +
      • It includes only one module Plugin_no_index.

      • +
      • Plugin is compiled by native compiler.

      • +
      • Construction of @plugin alias depends on plugin’s compilation.

      • +
      • Depends on geneweb libraries :

        +
          +
        • geneweb

        • +
        • gwd_lib

        • +
        • wserver

        • +
        +
      • +
      +

      plugins/v7/dune

      +
        +
      1. Wrapped plugin_v7_lib library.

        +
          +
        • It includes modules starting with prefix V7.

        • +
        • Depends on geneweb libraries :

          +
            +
          • geneweb

          • +
          • geneweb_util

          • +
          • gwd_lib

          • +
          +
        • +
        +
      2. +
      3. Plugin plugin_v7.

        +
          +
        • It includes only one module Plugin_v7.

        • +
        • Plugin is compiled by native compiler with -linkall option.

        • +
        • Construction of @plugin alias depends on:

          +
            +
          • Plugin’s compilation

          • +
          • Every file from assets directory.

          • +
          +
        • +
        • Linked statically with libraries :

          +
            +
          • plugin_v7_lib

          • +
          +
        • +
        • Depends on geneweb libraries :

          +
            +
          • gwd_lib

          • +
          • plugin_v7_lib

          • +
          +
        • +
        +
      4. +
      +

      plugins/v7_im/dune

      +
        +
      1. Wrapped plugin_v7_im_lib library.

        +
          +
        • It includes only one module V7_im_sendImage.

        • +
        • Depends on geneweb libraries :

          +
            +
          • geneweb_util

          • +
          • gwd_lib

          • +
          +
        • +
        +
      2. +
      3. Plugin plugin_v7.

        +
          +
        • It includes only one module Plugin_v7_im.

        • +
        • Plugin is compiled by native compiler.

        • +
        • Construction of @plugin alias depends on plugin’s compilation.

        • +
        • Linked statically with libraries :

          +
            +
          • plugin_v7_im_lib

          • +
          +
        • +
        • Depends on geneweb libraries :

          +
            +
          • gwd_lib

          • +
          • plugin_v7_im_lib

          • +
          +
        • +
        +
      4. +
      +

      plugins/welcome/dune

      +

      Defines plugin plugin_welcome.

      +
        +
      • It includes only one module Plugin_welcome.

      • +
      • Plugin is compiled by native compiler with -linkall option.

      • +
      • Construction of @plugin alias depends on:

        +
          +
        • Plugin’s compilation.

        • +
        • Every file from assets directory.

        • +
        • META file.

        • +
        +
      • +
      • Depends on geneweb libraries :

        +
          +
        • gwd_lib

        • +
        • wserver

        • +
        • plugin_v7_lib

        • +
        +
      • +
      +
      +
      +
      Geneweb tests
      +

      test/dune

      +

      Defines:

      +
        +
      1. dummy_gwdb library that is an implementation for gwdb_driver_mli virtual library.

        +
          +
        • It includes only one module Gwdb_driver.

        • +
        • Depends on geneweb libraries:

          +
            +
          • geneweb_def

          • +
          +
        • +
        • Depends on external libraries:

          + +
        • +
        +
      2. +
      3. test executable.

        +
          +
        • It includes modules starting with prefix Test that are preprocessed with ppx_deriving.show PPX rewriter.

        • +
        • Construction of @runtest alias depends on execution of test.

        • +
        • Depends on geneweb libraries:

          +
            +
          • geneweb

          • +
          • dummy_gwdb

          • +
          • Chosen implementation of geneweb_sosa_mli.

          • +
          +
        • +
        • Depends on external libraries:

          + +
        • +
        +
      4. +
      +
      +
      +
      Geneweb benchmarks
      +

      benchmark/dune

      +

      Defines bench executable.

      +
        +
      • It includes only one module Bench that is preprocessed with cppo.

      • +
      • Construction of @runbench alias depends on execution of bench.

      • +
      • Depends on geneweb libraries :

        +
          +
        • geneweb

        • +
        • Chosen implementation of gwdb_driver_mli.

        • +
        • Chosen implementation of geneweb_sosa_mli.

        • +
        +
      • +
      • Depends on extrenal libraries :

        + +
      • +
      +
      +
      +
      +
      +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/overview/database.html b/static/html/dev-doc/overview/database.html new file mode 100644 index 0000000000..a5222fa9d2 --- /dev/null +++ b/static/html/dev-doc/overview/database.html @@ -0,0 +1,267 @@ + + + + + + + + Database overview — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      Database overview

      +
      +

      Gw files

      +

      Genealogy database could be created by Geneweb from one or from multiple source files with .gw extension. Those files describe structurally persons, families all kinds of relationships, different events, etc. You can read more about the file structure here. Binary executable gwc reads files .gw, extracts all persons and families information and passes it to the Gwdb module in order to create the database.

      +
      +
      +

      Database entries

      +

      Transmitted to Gwdb information is composed mainly from:

      +
        +
      • Array of all strings that could be any kind of information encoded as a string, like for example: person’s name, birth place, marriage place, etc. Identifier istr allows to reference the string in the given array (index of an element inside the array).

      • +
      • Array of persons where each element encompasses information about one person. Every string field of a person (like his name, birthplace, etc.) is an identifier where the real string is stored in array mentioned before. Reference to other persons by means of identifier iper that reference person in the current array (index of an element inside the persons array).

      • +
      • Array of families where each element encompasses information about one family (couple, children, marriage date, etc.). Identifier ifam allows to reference the family in the given array (index of element inside the array).

      • +
      +

      Each array keeps a data structure defined in the module Def. Further, those entries will be the main source for every database request.

      +
      +
      +

      Storage

      +

      Gwdb is responsible for creating the database on the disk from the provided inputs. It creates a directory dbname.gwb containing several +files. The main file base contains marshalled representation of each array and base.acc stores offsets to every entry entry that allows to make constant time access. Additionally, it creates some index files that associate useful for requests information to the entry’s identifier in the base file. That helps to requests to find instantly entry without iteration over all existing ones in the database. For example strings.inx is a string index that allows to find id for a searched string. One file is slightly different: the patches file. It stores every modification done inside the base (see Modifications subsection). The storage manipulation interface is described in lib/gwdb_driver.mli/gwdb_driver.mli. This is a virtual module whose +current implementation is available on gwdb-legacy. Format and description for every database file is listed below:

      +
      base - the base itself
      +  magic number (magic_gwb)                 : string of length 8
      +  number of persons                        : binary_int
      +  number of families                       : binary_int
      +  number of strings                        : binary_int
      +  persons array offset in file             : binary_int
      +  ascends array offset in file             : binary_int
      +  unions array offset in file              : binary_int
      +  families array offset in file            : binary_int
      +  couples array offset in file             : binary_int
      +  descends array offset in file            : binary_int
      +  strings array offset in file             : binary_int
      +  notes origin file                        : value
      +  persons array                            : value
      +  ascends array                            : value
      +  unions array                             : value
      +  families array                           : value
      +  couples array                            : value
      +  descends array                           : value
      +  strings array                            : value
      +
      +base.acc - direct accesses to arrays inside base
      +  persons offsets   : array of binary_ints
      +  ascends offsets   : array of binary_ints
      +  unions offsets    : array of binary_ints
      +  families offsets  : array of binary_ints
      +  couples offsets   : array of binary_ints
      +  descends offsets  : array of binary_ints
      +  strings offsets   : array of binary_ints
      +
      +names.inx - index for names, strings of first names and surnames
      +  offset to sindex : binary_int
      +  offset to findex : binary_int
      +  1st index (mixes between names) : value 
      +    array, length = 16383, associating:
      +      - a hash value of a "crushed" (module "Name") name 
      +        (modulo length)
      +      - to the array of ids of the corresponding persons
      +  2nd index (surnames sub-strings) : value
      +    array, length = "table_size", associating:
      +      - a hash value of the "crushed" (module "Name") surname 
      +        sub-string (modulo length)
      +      - to the array of the corresponding surnnames (string ids) 
      +      that contain giving surname sub-string
      +  3rd index (first name sub-strings) : value 
      +    array, length = 16383, associating:
      +      - a hash value of the "crushed" (module "Name") first name 
      +      sub-string (modulo length)
      +      - to the array of the corresponding string ids that contains 
      +      giving first name sub-string
      +
      +names.acc - direct accesses to values inside arrays in names.inx
      +
      +strings.inx - index for all strings
      +  length of the strings offset array : binary_int
      +  strings hash table index           : 2 arrays of binary_ints
      +    strings offset array (length = prime after 10 * strings 
      +    array length)
      +      - associating a hash value of the string modulo length
      +      - to its id in the string array
      +    strings list array (length = string array length)
      +      - associating a string id
      +      - to the id of the next index (previous value) holding the 
      +      same hash value
      +
      +snames.inx - index for surnames
      +  array ordered by surname  
      +    - associating the string id of a surname
      +    - to a pointer (offset) inside snames.dat
      +
      +snames.dat - data associated with snames.inx
      +  array of list of persons holding a surname
      +
      +fnames.inx - index for first names
      +  array ordered by first name 
      +    - associating the string id of a first name
      +    - to a pointer (offset) inside fnames.dat
      +
      +fnames.dat - data associated with fnames.inx
      +  array of list of persons holding a first name
      +
      +notes - text file containing data base notes.
      +
      +notes_d - directory containing .txt for each extended page
      +
      +particles.txt - text file with autorised name's particles
      +
      +patches - modification inside the database
      +  When updated, none of the previous files are modified. 
      +  Only this one is written and rewritten. It holds a record 
      +  of type "patches", composed of association lists 
      +  "index" - "new value".
      +
      +nb_persons - number of real persons (with those added by patches)
      +
      +synchro_patches - timestamped history of base's modifications. 
      +
      +restrict - defines visibility of each person in the base 
      +
      +
      +
      +
      +

      Modifications

      +

      When a modification is requested, geneweb does not update base file itself. It +completes the patches file containing all the latest modifications on the +base. Every modification (patch) done is pended until patches are committed with commit_patches request. +Commit performs update of the patches file.

      +

      Patching signifies only operations that add or modify an entry. Entry suppression is done quite differently. +It is replaced by a dummy entry and then removed by Geneweb’s garbage collector gwgc that performs compaction +of database arrays. Another useful fixbase tool, locates and fixes inconsistencies on the base and updates all database files.

      +
      +
      +

      Example

      +

      Here is an example how Geneweb displays birth dates of persons that have given name (let’s say “Pierre”) without considering caches:

      +
        +
      • Firstly, it makes dichotomous search inside fnames.inx of a string id (istr) that references “Pierre”

      • +
      • Then it reads (with associated to “Pierre” offset from fnames.inx) position in the file fnames.data where list of ids of persons (iper) with first name “Pierre” are stored.

      • +
      • For every person’s id it gets person’s entry offset from base.acc file

      • +
      • Then it reads person’s entry with giving offset and get field associated to the birth date.

      • +
      • Displays all extracted birth dates.

      • +
      +
      +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/dev-doc/overview/index.html b/static/html/dev-doc/overview/index.html new file mode 100644 index 0000000000..fa71c2bac1 --- /dev/null +++ b/static/html/dev-doc/overview/index.html @@ -0,0 +1,263 @@ + + + + + + + + Overview — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      Overview

      +
      +

      How to start a Geneweb server

      +
      +

      Starting the server

      +

      Starting a Geneweb web server requires two tools:

      +
        +
      • gwd, the actual web server;

      • +
      • setup, the database setup portal.

      • +
      +

      These two tools are part of the main distribution and can be found on _build. +If you built the project with make clean distrib, two scripts are available on +the directory distribution/. Keep in mind they are scripts wrapping the actual +binaries.

      +

      To start the server on the current directory:

      +
      _build/install/default/bin/geneweb.gwd -hd <location_of_hd_dir>
      +
      +
      +

      This will start the main web server on port 2317.

      +

      To start the setup server on the current directory:

      +
      _build/default/bin/setup/setup.exe -gd <location_of_gwsetup_dir>
      +
      +
      +

      This will start the setup server on port 2316.

      +
      +
      +

      Configuration

      +

      Geneweb can be configured by defining a <base name>.gwb file. An example is +available in the etc directory.

      +
      +
      +
      +

      Architecture of Geneweb

      +

      Geneweb is built from three main components:

      +
        +
      • the storage of the genealogical trees, divided in a patch file and the actual data;

      • +
      • the libraries, reading the data from the storage and writing the patch file

      • +
      • the binaries and the web server, reading and writing the storage

      • +
      +../../_images/diagram.png +
      +

      Storage architecture

      + +
      +
      +
      +

      Libraries

      +
        +
      • Util: a library with miscellaneous useful modules for manipulating +base data types.

      • +
      • Def: the definition of the main type definitions used in Geneweb trees.

      • +
      • Sosa: describes a Sosa-Stradonitz numbering (known an +Ahnentafel numbering), associating natural identifiers to individuals. This +library is virtual and has three different implementations. One of these +implementations is selected by the configuration script.

        +
        +
          +
        • Sosa_array is one of the sosa implementations. It represents naturals +as pair of integers stored in an array a such that +sosa = a.(0) + base * a(1)) where base is a hardcoded constant.

        • +
        • Sosa_num is one of the sosa implementation based on the Big_int +library.

        • +
        • Sosa_zarith is one of the sosa implementation based on the Zarith +library.

        • +
        +
        +
      • +
      • Gwdb_driver: describes the storage implementation. While it is +virtual, it currently has only one implementation, gwdb-legacy. It is wrapped +by the gwdb library that exports many tools for database updates.

      • +
      • Core: core of Geneweb for calculating consanguinity between persons.

      • +
      • Geneweb_export : provides a functor for defining Json convertors for Geneweb’s +datatypes.

      • +
      • Def_show: defines formatters and string converters for Geneweb’s datatypes.

      • +
      • Geneweb: the main library. It contains several kinds of files, from +utilitarian modules to HTML generation.

      • +
      • Gwb2gedLib: defines a function for exporting a base to a GEDCOM file.

      • +
      • Wserver: a light-weight web server, used by gwd and setup.

      • +
      • Gwd_lib: defines additional modules for the gwd web server.

      • +
      • GwuLib: defines useful functions for exporting a database to a .gw file.

      • +
      +

      The documentation of each module is available on the automatically generated +documentation of geneweb ($ make doc)

      +
      +

      Binaries

      +
      +
      +
      +

      Official binaries

      +

      Here are the binaries maintained by Geneweb:

      +
        +
      • Connex: calculates connex components of a base;

      • +
      • Consang: calculates the consanguinity level of individuals;

      • +
      • Ged2gwb: imports a GEDCOM 5.5.1 file to a Geneweb base;

      • +
      • Gwb2ged: exports a base to a GEDCOM 5.5.1 base;

      • +
      • Gwc: creates a new database;

      • +
      • Gwd: starts Geneweb’s main web server which allows to interact with bases;

      • +
      • Gwdiff: targets differences between two databases;

      • +
      • Fixbase: checks the consistency of a base and applies patches;

      • +
      • Gwgc: removes unused entries in Geneweb’s arrays;

      • +
      • Gwrepl: an OCaml interactive top level, useful for scripts;

      • +
      • Gwu: exports a base to a .gw file;

      • +
      • Setup: a web server for selecting and creating databases.

      • +
      +
      +

      For mor details about every binary, see:

      + +
      +
      +
      +

      Web-server and plug-ins

      +

      The gwd web server is customizable with plug-ins; code replacing +the original behaviour of the web server handling requests. They are +dynamically loaded by gwd at its start and each base can be activated +through the .gwb file (plugins=* for activating all plug-ins, +otherwise plugins=p1,p2,...).

      +

      A plug-in is composed of its code, a dune file for building and a +META file, containing some informations about the plug-in itself.

      +

      Here is an example of META file:

      +

      ` +version:1 +maintainers:OCamlPro +depends:plugin1,plugin2 +`

      +

      The only field taken into account by gwd is depends as it is used to +check there are no circular dependencies between plug-ins.

      +
      +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/genindex.html b/static/html/genindex.html new file mode 100644 index 0000000000..415a2b77b8 --- /dev/null +++ b/static/html/genindex.html @@ -0,0 +1,104 @@ + + + + + + + + Index — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + + +

      Index

      + +
      + +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/objects.inv b/static/html/objects.inv new file mode 100644 index 0000000000000000000000000000000000000000..199398104881aade9d718e3a63d5de23433986bc GIT binary patch literal 1054 zcmV+(1mXK5AX9K?X>NERX>N99Zgg*Qc_4OWa&u{KZXhxWBOp+6Z)#;@bUGkMWo~76 zWnu~=AXa5^b7^mGIv@%oAXI2&AaZ4GVQFq;WpW^IW*~HEX>%ZEX>4U6X>%ZBZ*6dL zWpi_7WFU2OX>MmAdTeQ8E(&p?!BDp8olU)Z1_MQr4JDIzIcu_xL4Q|>rh!Y+%kq6Gie&#T z$$Y@ugFNyC$2&^&SyRUyBQZ(F$=Xswd0(INh{X_SF%x1r=l3cUvmjwCIH8szYA9@W zK{MlPPwRTtELl~>lNB)Kt1(qn?2>0aL@kD~A~U6~I=%<>vsA$ z5X~QK^03ZiO&NWlbsV!ln`3K5%ZHjZX;H_nVTR0eUGsnkF0JU~whB44;W!|yL^m9_ zeHufZ9tLcuhi%pA0X?S&BMI!Xv$>zf0~0MfQ4WP7zOi4jxwraZ?AA z$Elk$5q#$ff}W?v3qM0OG;oGI<}nC*z8W6GSA;{>w1nyg^N20%I`6g>R873)K<#&XkXX(=bSLOy9)qCi z1t+@_PJ6}AMJI=*IJg==ffhZaj#csY#pk+BqogegAdAMx$E;hU5VLHK2t~gk0c7#{ zAdIO5DVFu9Zi$-Dh^ZYEUVoANg!?ffgr@@xG0Ps1QnU*UG0Q&CLlqkqrx)}@x6Z-o z2Yu01M;JgBJ)wv3d?CWr#*JS0gy3OxSc4i; z2dSBU0v*qtc!feHHb!-?tf_^F`Vc`Oj;ThK+O$82b5vv@RM{DoH6q=wn z$4sc{f;TYY(F9ubaB`ToYp-6Sa77@Hzk?R489FhTU&Nr$kvzf)xM)?|r2@kd8ma$U z9LM~R6BDkf*dNj)w`Y8(o{}u|jUkXZahpOedrAnN?vgO2!D`fQ&xt(Cfsd*7sJ*VS zMiIY5yqKp;is?S-KiYqP{`SeEyVY-Y>fg?@Vtd`&04jgzUqG|A6WvIAzRH8z{Y7>U YS!Y`0DG`rh&M%BVXEp5p1M{y%8l-jPj{pDw literal 0 HcmV?d00001 diff --git a/static/html/search.html b/static/html/search.html new file mode 100644 index 0000000000..c6a2f3d9af --- /dev/null +++ b/static/html/search.html @@ -0,0 +1,114 @@ + + + + + + + + Search — Geneweb 0.1 documentation + + + + + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +

      Search

      +
      + +

      + Please activate JavaScript to enable the search + functionality. +

      +
      +

      + Searching for multiple words only shows matches that contain + all words. +

      +
      + + + +
      + +
      + +
      + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/static/html/searchindex.js b/static/html/searchindex.js new file mode 100644 index 0000000000..551b4ad894 --- /dev/null +++ b/static/html/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({docnames:["audit/binaries/connex","audit/binaries/consang","audit/binaries/ged2gwb","audit/binaries/gwb2ged","audit/binaries/gwc","audit/binaries/gwd","audit/binaries/gwdiff","audit/binaries/gwfixbase","audit/binaries/gwgc","audit/binaries/gwrepl","audit/binaries/gwu","audit/binaries/index","audit/binaries/plugin_cgl","audit/binaries/plugin_export","audit/binaries/plugin_forum","audit/binaries/plugin_v7","audit/index","audit/introduction/index","audit/introduction/installation","audit/libraries/config","audit/libraries/core","audit/libraries/fixbase","audit/libraries/geneweb","audit/libraries/geneweb_def","audit/libraries/geneweb_gwdb","audit/libraries/geneweb_gwdb-legacy","audit/libraries/geneweb_util","audit/libraries/index","audit/libraries/wserver","dev-doc/binaries/bench","dev-doc/binaries/cgl","dev-doc/binaries/connex","dev-doc/binaries/consang","dev-doc/binaries/export","dev-doc/binaries/fixbase_plugin","dev-doc/binaries/forum","dev-doc/binaries/ged2gwb","dev-doc/binaries/gwb2ged","dev-doc/binaries/gwc","dev-doc/binaries/gwd","dev-doc/binaries/gwdiff","dev-doc/binaries/gwfixbase","dev-doc/binaries/gwgc","dev-doc/binaries/gwrepl","dev-doc/binaries/gwu","dev-doc/binaries/gwxjg","dev-doc/binaries/index","dev-doc/binaries/jingoo","dev-doc/binaries/lib_show","dev-doc/binaries/no_index","dev-doc/binaries/official_binaries","dev-doc/binaries/plugins","dev-doc/binaries/setup","dev-doc/binaries/test","dev-doc/binaries/tests","dev-doc/binaries/update_nldb","dev-doc/binaries/v7","dev-doc/binaries/v7_im","dev-doc/binaries/welcome","dev-doc/binaries/xhtml","dev-doc/geneweb-lib/index","dev-doc/index","dev-doc/installation/index","dev-doc/overview/database","dev-doc/overview/index","index"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":2,sphinx:56},filenames:["audit/binaries/connex.md","audit/binaries/consang.md","audit/binaries/ged2gwb.md","audit/binaries/gwb2ged.md","audit/binaries/gwc.md","audit/binaries/gwd.md","audit/binaries/gwdiff.md","audit/binaries/gwfixbase.md","audit/binaries/gwgc.md","audit/binaries/gwrepl.md","audit/binaries/gwu.md","audit/binaries/index.rst","audit/binaries/plugin_cgl.md","audit/binaries/plugin_export.md","audit/binaries/plugin_forum.md","audit/binaries/plugin_v7.md","audit/index.rst","audit/introduction/index.rst","audit/introduction/installation.md","audit/libraries/config.md","audit/libraries/core.md","audit/libraries/fixbase.md","audit/libraries/geneweb.md","audit/libraries/geneweb_def.md","audit/libraries/geneweb_gwdb.md","audit/libraries/geneweb_gwdb-legacy.md","audit/libraries/geneweb_util.md","audit/libraries/index.rst","audit/libraries/wserver.md","dev-doc/binaries/bench.md","dev-doc/binaries/cgl.md","dev-doc/binaries/connex.md","dev-doc/binaries/consang.md","dev-doc/binaries/export.md","dev-doc/binaries/fixbase_plugin.md","dev-doc/binaries/forum.md","dev-doc/binaries/ged2gwb.md","dev-doc/binaries/gwb2ged.md","dev-doc/binaries/gwc.md","dev-doc/binaries/gwd.md","dev-doc/binaries/gwdiff.md","dev-doc/binaries/gwfixbase.md","dev-doc/binaries/gwgc.md","dev-doc/binaries/gwrepl.md","dev-doc/binaries/gwu.md","dev-doc/binaries/gwxjg.md","dev-doc/binaries/index.rst","dev-doc/binaries/jingoo.md","dev-doc/binaries/lib_show.md","dev-doc/binaries/no_index.md","dev-doc/binaries/official_binaries.rst","dev-doc/binaries/plugins.rst","dev-doc/binaries/setup.md","dev-doc/binaries/test.md","dev-doc/binaries/tests.rst","dev-doc/binaries/update_nldb.md","dev-doc/binaries/v7.md","dev-doc/binaries/v7_im.md","dev-doc/binaries/welcome.md","dev-doc/binaries/xhtml.md","dev-doc/geneweb-lib/index.md","dev-doc/index.rst","dev-doc/installation/index.md","dev-doc/overview/database.md","dev-doc/overview/index.rst","index.rst"],objects:{},objnames:{},objtypes:{},terms:{"100":22,"1024":[31,52],"120":[36,39,60],"127":31,"16383":63,"1800":39,"189":26,"1999":12,"1st":63,"1st_name":44,"2021":17,"2316":[52,64],"2317":[31,39,52,64],"240":60,"2nd":63,"3rd":63,"400":39,"4000":26,"555sample16b":2,"555sample16l":2,"847":25,"\u00e9l\u00e9ment":19,"\u00e9tait":21,"\u00e9trang":19,"\u0439\u0442":[],"abstract":26,"boolean":[5,6],"byte":[26,60,62],"case":[3,4,5,6,16,25,26,38,60,62],"compl\u00e9ter":21,"default":[2,29,31,36,37,38,39,40,44,52,53,62,64],"enum":5,"export":[11,16,37,44,46,51,62,64],"final":26,"function":[3,4,9,11,20,22,23,24,25,26,27,28,39,60,61,62,64,65],"import":[11,18,36,64],"int":[31,38],"long":65,"m\u00eame":21,"new":[5,8,11,16,22,26,27,34,38,39,56,63,64],"null":43,"public":[18,36,37,44,62],"remarqu\u00e9":[19,21],"return":[3,4,5,6,24,25,26,31,37,39,44],"static":62,"switch":62,"true":[4,5,25,53,62],"try":[26,36],"utilis\u00e9":[19,21],"while":[4,5,11,16,18,25,26,51,64],AND:5,Adding:65,And:[22,26],But:[4,22],For:[4,5,11,15,16,20,25,43,63,64],NOT:16,One:[16,39,63,64],Such:27,That:[5,25,26,63],The:[0,1,2,3,4,5,6,10,11,12,16,18,21,24,39,44,52,53,60,61,62,63,64],Then:63,There:[1,5,8,9,39],These:[50,64],Use:[11,36,39,53,62,65],Used:[37,44,62],Using:[7,11],_build:[29,53,64],_piqi:18,abbrev_list:26,abl:[5,11],about:[0,4,25,26,60,62,63,64],absolut:53,acc:[25,26,63],accept:39,access:[4,5,6,7,16,22,25,39,60,63,65],accord:11,account:[25,64],acknowledg:[11,16],action:[5,39,62],activ:[39,62,64],actual:[4,5,25,26,64],actuali:25,add:[23,25,39,60,63,65],add_fam:39,add_fam_ok:39,add_ind:39,add_ind_ok:39,add_lexicon:39,add_par:[11,39],add_par_ok:39,add_person_by_nam:4,added:[39,60,63],adding:[2,8,16,25,39],addit:[14,18,39,44,60,64,65],addition:63,additionali:[],addr:39,address:[39,52],adef:[0,27,62],adition:60,adm_fil:5,admin:39,adopt:60,advanc:39,advic:65,advsearchok:27,affect:16,after:[17,25,36,39,53,63],age:22,ago:[37,44],ahnentafel:64,algorithm:5,alia:[18,36,62],alias:62,aliv:[36,39],all:[3,4,5,6,11,18,20,22,24,25,26,31,37,38,39,40,43,44,60,62,63,64],alloc:20,allow:[3,5,16,22,25,26,39,60,63,64],allowed_tag:39,alow:[],alphabet:2,alreadi:[0,5,11,26,36,38,62],also:[0,1,4,5,8,10,12,16,22,25,26,27,37,39,44,62],alter:2,alternatif:25,alwai:[2,4,5,18],among:[36,37],amount:11,analysi:16,ancestor:[6,37,39,44],andhebrew:60,ani:[0,4,6,16,36,39,41,60,63],anm:39,anniversari:39,anoth:[4,16,25,26,63],ansel:[36,37,44],ansi:[37,44],answer_i:39,antoth:25,anymor:[5,8,16],anyon:[5,22],anywher:25,api:11,appear:[4,26],appli:[16,34,41,64],applic:60,apply_patch:25,appveyor:[53,65],arab:26,architectur:[61,65],arduou:[5,11],arein:4,aren:[23,25],arg:[11,24],argument:[4,11,22,39,60,62,65],arrai:[2,8,16,20,25,60,63,64],artefact:62,as_ok:39,ascend:[37,39,40,44,63],ascii:[36,37,44,60],ask:[24,31],assert:[25,26],asset:[39,60,62,65],assocait:39,associ:[4,5,8,11,16,19,38,39,44,63,64],assum:5,atom:16,audit:[17,21,27],auth:39,authentif:[11,39],author:[39,52],autom:16,automat:[4,16,41,64],autoris:63,auxilarri:60,avaiabl:27,avail:[2,5,27,39,63,64],avoid:[3,5,11,15,65],b34f9cc756d5b21792ebbe8d6e9f9ebf01eddd27:17,back:[11,22],backend:[5,62],backward:44,baptism:39,bar:60,base1:40,base2:40,base64:27,base:[5,8,11,16,20,22,25,26,31,32,36,37,38,39,41,42,44,60,62,63,64,65],base_data:25,base_env:19,base_restricted_get:25,base_visible_get:25,basenam:39,basic:5,becaus:[0,5,11,16,26],becom:[36,44],bee:[25,26],been:[6,16,39],befor:[4,25,36,39,63],beforehand:7,begin:[25,36],behavior:38,behaviour:[3,4,5,27,51,64],being:[5,11,39,60],belong:[5,16,24],below:63,bench:[46,54,62],bench_fil:62,bench_nam:62,benchmark:[],benchmarklink:[],best:16,better:[4,18,22,23,25,26],between:[4,9,26,36,37,39,40,44,53,60,63,64],big:[5,11,15,16,22],big_int:64,bin:[16,39,52,62,64],binair:21,binari:[0,1,5,8,16,21,25,52,54,61,62,63,65],binary_int:63,bind:[10,16,60],bindir:52,binomi:60,birth:[36,39,63],birthdeath:27,birthplac:63,blang:39,blit:26,block:4,bname:5,bnote:[4,38],bodi:[4,5,16,22],born:[22,37,44],bottom:39,branch:[31,51],bring:11,broken:22,browser:39,buff:27,buffer:[2,26,60],bug:[16,23,27],build:[16,17,39,61,64,65],build_dir:62,build_distrib_dir:62,built:[11,26,64],burial:39,bypass:23,bytecod:62,cach:[25,39,53,63],cache_filenam:53,cache_lang:39,cal:39,calcul:[5,6,31,32,39,64],calendar:[27,39,62],call:[1,2,16,25,26,28,60,62],camlp5:62,camlp5o:62,camomil:60,can:[3,5,15,16,18,28,29,37,39,44,53,60,63,64],cancel:[2,36],cannot:[18,39],cat:43,caus:23,censor:[37,44],central:27,cgi:39,cgl:[11,46,51,62],champ:19,chang:[1,11,16,25,26,27,39,41,42,44,56],change_wiz_vi:39,changed_p:22,charact:[2,36,60],charcact:60,charset:[36,37,44],check:[7,11,16,22,24,25,36,38,39,40,41,53,64],check_bas:22,check_noloop:20,checkitem:22,chg_chn:39,chg_chn_ok:39,chg_evt_fam_ord:39,chg_evt_fam_ord_ok:39,chg_evt_ind_ord:39,chg_evt_ind_ord_ok:39,chg_fam_ord:39,chg_fam_ord_ok:39,children:[22,24,39,41,63],choos:53,choosen:53,chooser:53,chop_extens:5,chosen:62,chri:60,circular:64,clair:19,clarifi:0,clean:[4,18,22,25,39,62,64],clear:[11,25],clearer:5,client:39,close:16,cma:62,cmo:62,cmx:39,cnt:[31,39],code:[0,4,5,7,10,11,18,20,22,25,26,28,62,64,65],code_french_year:22,collect:[6,20,60,65],collector:[25,63],color:53,com:[],combin:39,come:17,comm:19,comma:[22,39],command:[11,18,25,62],comment:65,commit:[17,25,41,42,62,63,65],commit_patch:63,common:[11,26,60],commonli:25,commun:39,comp_famili:4,compact:63,compar:[16,60],comparison:22,compat:[11,16,27,44],compatible_expr:6,compil:[5,11,16,18,21,38,39,62],complement:[57,65],complet:[16,36,63],complex:27,compoment:[],compon:[31,61,64,65],compos:[11,60,63,64],comprehens:18,compress:60,comput:[4,6,37,38,39,44,60],concat:3,concaten:38,concern:[22,39,44],concert:16,condit:5,conf:[5,16,19,53],config:[5,11,16,22,62],configur:[16,39,53,61,65],confus:[1,4],conn_tmout:39,conn_wiz:39,connect:39,connex:[11,46,50,62,64],connexion:5,consang:[0,11,16,27,46,50,62,64],consanguin:[0,32,38,60,64],consid:[0,1,2,4,5,6,10,13,15,16,18,21,22,25,26,27,36,60,63],consist:[36,38,41,64,65],consol:53,constant:[11,63,64],construct:[60,62],constructor:[4,16,62],contain:[5,16,27,39,52,62,63,64],content:[5,11,16,17,27,28,38,44,59,60,61,62,65],context:[26,62],continu:4,contribut:22,control:[5,60],convers:44,convert:[26,36,37,60,64],convert_famili:4,convertor:64,copi:[25,26],copyr:22,core:[5,27,39,50,62,64],correct:[2,5,11,20,26],correctli:[18,22,26],correspond:[0,23,25,62,63],corrupt:[16,25],could:[4,5,6,8,9,10,11,12,16,20,24,25,26,27,28,62,63],couldn:26,count:[39,60],counter:[8,16],coupl:[39,60,63],cousin:[22,39],cousinsdisplai:22,cppo:62,cppo_d:62,cpu:29,creat:[4,8,13,16,18,20,22,25,26,36,38,44,62,63,64],critic:16,crush:[26,63],current:[5,16,18,25,38,39,60,62,63,64],custom:[5,11,50,62],customis:62,customiz:64,cut_spac:4,d3d861:[],daemon:[39,52],dag:39,dagdisplai:19,dai:[22,36,60],dan:19,danger:25,darwin:62,dat:63,data:[4,8,16,27,36,38,39,53,60,62,63,64],databas:[2,4,16,20,22,24,25,32,33,36,37,38,39,40,42,43,44,50,52,62,64],datatyp:64,date:[4,16,17,22,26,36,39,62,63],dates_dm:36,dates_md:36,db1link:11,dbdisk:62,dbname:63,dead:[16,18,22],deal:[4,25,26,60],death:[36,39],debug:[11,39,62],decid:25,declar:4,declin:26,decod:[2,26,36,60],dedic:34,def:[27,28,62,63,64],def_show:[48,62,64],default_particl:26,defaut:62,defect:11,defin:[0,2,4,5,16,21,23,24,25,26,28,37,39,40,44,51,52,56,60,61,62,63,64],defini:[],definit:[4,27,62,64],degre:60,del:31,del_fam:39,del_fam_ok:39,del_imag:57,del_image_ok:57,del_ind:39,del_ind_ok:39,delai:53,delet:[8,16,25,31,37,39,44],den:36,dep:62,depend:[11,25,33,36,39,52,62,64],deprec:[4,18,22,26,53],der:36,descend:[22,37,39,40,44,63],descenddisplai:22,descrept:22,describ:[4,5,9,61,62,63,64],descript:[11,22,62,63],desir:23,despit:[4,20,22,24,26],detail:[2,5,31,39,40,64],deux:21,dev:[18,43,62],develop:[5,11,51,65],developp:[],dichotom:63,dictionari:[8,16,39,42],did:39,die:36,died:22,diff:[6,39],differ:[9,11,16,18,28,34,39,40,60,61,62,63,64],difficult:[4,11,23],digest:39,dir:[39,44,52,53,62],direct:[22,39,62,63],directli:[4,6,22,26],directori:[5,26,27,39,44,52,53,60,62,63,64],disabl:62,disambigu:62,discard:[4,6,14,18,62],discourag:23,discov:16,disk:[4,25,60,63],displai:[5,18,22,26,27,31,39,44,53,62,63],distibut:62,distrib:[62,64],distrib_dir:62,distribut:[62,64],divid:64,divorc:41,dkei:11,dlevel:11,dmy_of_dmy2:26,doc:[18,41,56,62,64],doctyp:19,document:[4,9,11,15,16,18,24,50,64],doe:[0,1,2,5,11,16,25,60,63],doen:24,doesn:[4,22,25,26],don:[4,26,36,37,44],done:[5,8,14,16,20,22,24,62,63],driver:[27,62],drop:38,dry:[41,42],dsd:[],dsk_base:25,due:[18,26,62],dummi:[24,63],dummy_gwdb:62,dune:[23,64],dune_dirs_exclud:62,dune_profil:62,dupliat:39,duplic:39,durabl:[5,11],dure:16,dutil:24,dynam:64,dynlink:62,each:[2,4,5,8,16,18,39,62,63,64],easi:16,easili:[16,25],edit:39,effect:60,effici:[0,8,16,26],effort:27,efn:[2,36],eight:39,either:[4,18,25,39],elap:60,element:[2,25,60,63],elementari:28,elimin:[4,62],els:[22,28,44],emb:62,emit:62,empti:[22,38],enabl:[39,41,62],encod:[53,60,63],encompass:63,encor:21,end:[4,11,22,25,38,65],endian:11,engag:39,enhanc:10,enough:[11,16,22],enregistr:19,enthusiast:[36,37],entir:[20,26,62],entri:[4,8,16,39,42,64],env:22,environ:[5,22,62],epn:[2,36],eq_kei:26,eq_list:26,equal:[5,20,22],equival:[60,62],eras:[2,38],erron:25,error:[4,11,16,25,26,38,39,62],est:[19,21],etc:[22,39,62,63,64],evalu:22,even:[0,4,18,24,25,27,39],event:[4,11,22,37,39,44,63],everi:[16,22,25,26,39,62,63,64],everyth:62,exact:[5,31],exampl:[4,5,9,11,16,20,27,39,62,64],except:[4,16,25,26,39,60,62],exclud:[39,62],exe:[29,43,52,53,62,64],exec_if_verb_ok:5,execut:[2,4,9,11,29,39,43,53,63,65],exempl:60,exhaust:[5,11,65],exist:[25,26,36,38,62,63,65],expect:[5,11,26,39],explicit:16,expos:[16,26,60],ext:62,extend:63,extenis:60,extens:[62,63],extern:[5,11,26,62],externel:[],extra:33,extract:[36,37,44,62,63],extrat:[],extren:62,ez_fil:26,f_some:4,facilit:58,fact:18,factor:[3,5],fail:[2,5,39],failfirst:53,failur:[5,38],fait:21,fals:[3,25,53,62],famili:[4,22,24,25,36,37,38,39,41,44,63],fast:[32,41],faster:32,fastli:[],father:[24,60],featur:[27,39],feedback:62,fevent:41,field:[4,22,25,36,38,44,59,62,63,64],file:[2,4,6,11,22,23,25,26,27,31,36,37,38,39,44,52,53,60,64,65],file_nam:32,filenam:53,filter:0,filter_map:26,find:[22,23,25,62,63],find_compatible_person:6,find_compatible_union:6,find_person_by_global_nam:4,find_person_by_local_nam:4,find_top:6,findex:63,first:[5,36,37,38,39,44,60,63,65],firstli:[26,62,63],fix:[0,16,22,27,41,63,65],fixbas:[16,18,27,46,50,51,62,63,64],fixbase_ok:34,flag:[60,62],fly:[11,65],fname:[39,63],fne:36,focus:11,follow:[28,62],forc:[5,11,36,39],forget:16,form:39,format:[4,36,37,40,44,60,63,65],formatt:64,forum:[11,46,51,62],forum_add:35,forum_add_ok:35,forum_del:35,forum_p_p:35,forum_search:35,forum_v:35,forum_view:35,forumdisplai:[14,62],found:64,fragil:62,framework:11,french:60,friend:39,from:[4,5,11,16,17,22,25,26,27,32,34,39,44,45,50,60,62,63,64,65],ftruncat:26,full:53,full_major:53,fulli:4,functor:[26,64],funtion:25,further:[2,4,25,63],futil:27,g_error:4,g_patch_p:4,gain:16,garbag:[25,63,65],ged2gwb:[11,46,50,62,64],ged:[2,33,36,37,44],ged_date_dmi:3,gedcom:[2,16,36,37,64],gedplugindep:11,gen_:60,gen_ascend:0,gen_fam_event_nam:3,gen_pers_event_nam:3,gen_person:4,gen_person_misc_nam:60,genealog:[36,37,63,64],geneanet:[11,27],gener:[0,4,5,11,18,25,37,44,61,62,64,65],generated_files_dep:62,geneweb:[5,11,16,18,20,25,26,27,31,32,36,37,38,39,40,41,42,43,44,45,47,48,50,53,61,63],geneweb_cor:62,geneweb_def:[16,27,62],geneweb_def_show:62,geneweb_export:[62,64],geneweb_gwdb:[16,27,62],geneweb_gwdb_legaci:62,geneweb_sosa_arrai:62,geneweb_sosa_mli:62,geneweb_sosa_num:62,geneweb_sosa_zarith:62,geneweb_util:[16,24,27,62],get:[2,4,22,25,26,39,60,63],get_id:2,get_mar_d:4,get_optinal_baptd:4,get_optional_birthd:4,get_optional_event_d:4,get_optional_sex:4,get_to_eoln:2,getter:11,git:53,github:[],give:[5,22,23,25,60,63,65],given:[6,11,18,25,26,36,39,53,60,63],global:[5,6,10,11,25,26,65],goal:62,good:[4,16],grace:53,grammar:62,grandpar:22,grant:60,graph:[18,39],great:11,gregorian:60,grep:19,group:44,guess:5,gw_syntax:4,gwb2ge:62,gwb2ged:[11,46,50,62,64],gwb2ged_lib:62,gwb2gedlib:[62,64],gwb:[38,63,64],gwc:[11,16,46,50,62,63,64],gwcomp:11,gwd:[11,16,31,46,50,51,52,62,64],gwd_lib:[39,47,62,64],gwd_p:[31,52],gwdb:[4,20,27,62,63,64],gwdb_d:62,gwdb_driver:[16,62,63,64],gwdb_driver_mli:62,gwdb_legaci:62,gwdb_pkg:62,gwdiff:[11,46,50,62,64],gwdlog:[11,62],gwdplugin:[11,62],gwdplugindep:[39,62],gwdpluginmd5:62,gwdpluginmeta:[11,62],gwdrepl:43,gwexport:[36,62],gwexport_lib:62,gwf:39,gwfixbas:[11,41,62],gwgc:[11,16,46,50,62,63,64],gwlib:62,gwo:[4,38],gwrepl:[5,11,46,50,62,64],gwrepl_dep:62,gwrepl_force_unpack:43,gwrepl_noprompt:43,gwrepl_ppf:43,gwrepl_verbos:43,gwsetup:[39,52],gwu:[11,46,50,62,64],gwu_lib:62,gwulib:[10,62,64],gwxjg:[26,46,51,62],gwxjg_data:62,gwxjg_ezgw:62,gwxjg_lexicon_pars:62,gwxjg_tran:62,hand:25,handl:[5,11,39,57,64],hard:28,hardcod:64,harden:7,has:[0,3,4,6,10,16,18,39,62,64],hash:[8,10,16,39,62,63],hashtabl:[5,10],hashtbl:11,have:[6,11,22,25,26,36,39,63],head:16,header:[60,65],health:53,heavi:[5,11,15],help:[9,11,16,26,31,60,62,63],here:[6,7,39,60,62,63,64],hide:[5,26],high:25,higher:11,highli:16,highlight:39,him:22,his:[22,25,36,44,63],hist:39,hist_clean:39,hist_clean_ok:39,hist_diff:39,hist_search:39,histori:[22,39,63],histrorydiff:22,hold:[36,39,63],home:53,host:39,how:[15,60,61,63,65],howev:[11,28],html:[12,30,31,39,40,53,64,65],html_n:11,http:[12,22,28,44,60],http_redirect_temporarili:28,humain:4,ic2:25,ic2_first_name_start_po:25,ic2_surname_start_po:25,ident:39,identifi:[4,8,11,16,39,62,63,64],ids:63,ifam:63,ignor:[25,31],imag:[39,57],images_dir:39,images_url:39,imediatli:4,imh:39,impact:25,implement:[11,16,18,23,25,53,60,62,63,64],implementaion:62,impli:[25,37,44],implicit:62,implicitili:25,imposs:6,improov:[],improv:[5,20,27,65],includ:[35,62],inclus:11,inconsist:[5,36,63],incorrect:[2,5,39],increment:26,indend:5,indent:65,index:[22,25,26,37,39,41,56,58,60,62,63,65],index_out_of_bound:25,indic:62,individu:[32,36,37,39,44,64],inet:39,infer:4,info:39,inform:[2,4,25,26,29,60,62,63,64],init:2,initi:[2,36],initialis:[24,25],innocu:62,input:[11,16,63],input_binary_int:25,ins:[5,11,46,50,61,65],insert:[4,24],insert_famili:24,insert_person:4,insid:[4,16,18,20,22,25,26,60,62,63],instal:[5,11,16,17,39,52,61,64,65],instanc:25,instantli:[25,63],instead:[0,4,5,6,8,11,16,26,44,60],instruct:16,integ:64,intepret:39,interact:[9,43,64],interest:24,interfac:[16,26,39,63,65],intern:[8,16,23,25,26,60],interpret:36,interv:[36,53],introduct:17,intuit:25,inv_fam:39,inv_fam_ok:39,invalid:41,invalid_argu:26,invari:11,invert:39,involv:[5,27,37,44],inx:[25,63],iovalu:25,iper:[20,63],is_compat:6,is_primary_fev:3,is_primary_pev:3,isn:[4,22,25,26,62],iso_8859_1_of_utf_8:26,isol:44,issu:[5,16],istr:63,iter:[0,20,60,63],its:[4,5,8,10,16,18,26,36,39,42,60,62,63,64,65],itself:[5,11,63,64],januari:39,jingoo:[45,46,51,62],join:16,json:64,json_convert:62,json_export:62,julian:60,julien:[],junit:53,just:[4,7,20,21,22,25,39],kahn:5,keep:[16,36,63,64],kei:[11,22,24,37,39,41,44,60],kernel:62,kill:[39,53],kill_anc:39,kill_par:0,kind:[39,60,63,64],know:[36,62],knowledg:[5,11],known:64,label:[22,62],lang:[5,18,39,52,62],languag:39,larg:16,last:[16,39],later:22,latest:[25,39,41,63],launch:25,layer:60,lead:[16,39],least:[5,8,16],leav:16,legaci:[16,27,62,63,64],len:[2,25,26],length:[25,26,31,63],lens:16,less:[37,44],let:[51,63],letter:[11,36,60,65],level:[9,11,22,32,43,64],level_to_int:5,lex:4,lexer:62,lexicon:[39,60],lib:[18,19,23,27,62,63],lib_show:[46,51,62],librai:62,librari:[0,1,5,11,18,21,29,36,39,43,52,61,65],light:[11,64],lighten:[21,27],like:[4,5,22,23,25,26,36,53,60,62,63],limit:[39,44],line:[4,5,18,24,25,26,39,62],link:[4,8,16,30,39,62],linkal:62,linux:[26,62],list:[0,2,3,4,5,6,18,19,25,26,31,36,38,39,50,51,53,54,60,62,63],littl:11,live:39,load:[6,25,39,43,47,48,62,64],local:[4,18,26,39,62],locat:[27,28,39,53,63],location_of_gwsetup_dir:64,location_of_hd_dir:64,lock:[4,25,32,38,39],lockf:60,log:[6,36,39,53,60,62],log_level:39,logic:[0,16,26,27],login:39,login_tmout:39,longer:5,longest:39,look:36,loop:[2,62],lot:16,lowercas:36,lui:21,lunar:60,machin:62,made:[6,25],magic:[2,25,63],magic_gwb:63,mai:[2,11,16,19,22,27,39],main:[5,11,39,51,58,60,61,63,64,65],mainli:[63,65],maintain:[5,11,39,64],mainten:[5,11,27,39],major:[53,60],make:[2,4,5,11,25,26,28,29,53,60,62,63,64,65],make_subarrai:2,makefil:[],maker:62,malici:60,manag:[26,28,60],mandatori:40,mani:[26,28,60,64,65],manipualt:16,manipul:[16,26,43,50,60,63,64],manner:[5,11,16],manual:[4,25],map:60,map_couple_p:26,mark:62,marker:62,markup:[11,62],marri:36,marriag:[4,39,41,63],marshal:[62,63],match:[2,11,12,13,25,36,39,62,65],match_str:5,matter:11,max:39,max_client:39,maximum:[37,44],md5:[5,39],mean:[18,22,25,26,39,63],meant:11,mem:[32,37,38,40,44],memori:[4,16,20,25,32,37,38,40,41,44],menhir:4,mention:[62,63],menu:39,merg:[38,39,51],messag:[5,11,39,62],meta:[62,64],metadata:39,method:[3,16,53],min_disp_req:39,min_person:4,mind:64,minim:26,minimum:39,minor:20,minu:36,misc_not:39,misc_notes_search:39,miscellan:64,miss:[16,18,41,62],mission:65,mix:[60,63],mk_data:62,mk_gedpluginmd5:11,mk_gwdpluginmd5:[5,11,39,62],mli:[5,23,62,63,65],mll:62,mod:39,mod_data:39,mod_data_ok:39,mod_fam:39,mod_fam_ok:39,mod_ind:39,mod_ind_ok:39,mod_not:39,mod_notes_ok:39,mod_wiznot:39,mod_wiznotes_ok:39,mode:[22,25,32,39,41,52,53,62],modif:[22,24,39,64],modifi:[7,8,16,25,62,63],modifif:16,modul:[0,4,5,11,20,22,23,24,25,26,28,34,53,60,62,63,64,65],modules_without_implement:23,modulo:[39,63],month:[36,39],moon:60,mor:64,more:[0,4,5,6,8,11,16,22,26,32,39,40,41,60,62,63],most:[4,26,65],mother:60,move:[5,16,23,26,27],mrg:39,mrg_dup:39,mrg_dup_fam_y_n:39,mrg_dup_ind_y_n:39,mrg_fam:39,mrg_fam_ok:39,mrg_ind:39,mrg_ind_ok:39,mrg_mod_fam_ok:39,mrg_mod_ind_ok:39,msdo:36,much:[4,8,16,28],multi:26,multi_coupl:23,multi_par:23,multicor:25,multipl:[11,29,37,39,44,53,63],must:[16,24,37,39,44],mutabl:5,mutil:[4,27,53],my_plugin:[5,11],name:[0,2,4,11,18,22,25,27,31,36,37,39,44,53,62,63,64,65],namespac:4,nativ:62,natur:64,navig:22,nb_person:[25,63],nbd:41,necess:4,necessari:[11,43],need:[18,22,23,41,62],neg:36,neutr:4,never:[4,5,16],next:[38,63],next_family_fun_templ:4,nnn:[37,44],no_consang:0,no_efn:36,no_epn:[2,36],no_host_address:39,no_index:[46,51,62],no_nd:36,no_pit:36,nobil:36,node:62,nofail:38,nolock:[32,38,39],noment:36,nomin:[4,26],non:[5,11,53,62,65],none:[25,53,63],nopictur:[36,37,38,44],nor:[9,16],normal:[5,31,52,62],normalize_utf_8:26,note:[4,19,36,37,38,39,44,62,63],notes_d:63,noteslink:53,noth:28,notic:16,now:[1,5,11],nowadai:[4,62],nth:25,num:[37,39,44,62],number:[0,8,10,16,20,26,31,36,38,39,52,53,60,63,64],obj:[11,23,25],object:[38,62],obtain:62,ocaml:[4,5,11,16,17,23,25,43,51,60,62,64],ocamllex:62,ocamlpro:[64,65],ocamlrun:62,occ:[37,40,44],occupi:25,occur:[4,22,25,26,62],occurr:62,ocp:16,odir:44,odoc:[18,61,65],offici:[46,61,65],offset:63,often:[5,22,23,25],okasaki:60,old:[1,22,25,26,56],old_branch_of_sosa:22,old_gw:44,oldest:[22,39],onc:[5,8,16,20],one:[1,11,16,18,22,25,26,36,41,60,62,63,64,65],ones:[56,63],onli:[5,11,13,18,21,22,23,25,26,31,38,39,41,42,44,45,47,48,52,53,62,63,64],onlin:[11,32],oooooooooooooooooooooooooooooo:60,opam:[5,11,16,17,27,62],open:[9,11,14,25,62],opendb:25,oper:[4,60,63],opt:[37,44],optim:62,option:[1,31,32,33,36,37,38,39,40,41,42,44,52,53,60,62],order:[2,22,26,39,62,63],ordinar:62,org:[12,44],origin:[31,44,63,64],os_d:62,os_typ:62,other:[4,5,6,22,24,25,39,41,45,60,62,63],otherwis:64,ounit:[53,62],our:[16,50],out:[26,62],out_dir:11,outbas:[16,25],output:[11,16,25,29,31,36,37,38,39,44,53,60],output_arrai:25,output_fil:53,output_html_dir:53,output_junit_fil:53,outsid:5,ovenst:53,over:[18,20,60,62,63,65],overrid:36,overview:[61,65],own:[5,16,51],pa_extend:62,packag:[18,26,45,50,60,62],page:[11,16,22,30,39,58,63,65],pair:[37,44,64],paramet:62,parent:[4,22,26,39,41,60],parentship:[37,44],pari:22,pars:[2,4,5,16,60,62],parse_par:4,parser:[2,65],part:[5,16,25,36,51,64,65],particl:[26,36,38,63],particular:16,particulari:[60,62],particularli:62,pas:[19,21],pass:[4,24,62,63],passign:6,passwd:39,password:39,patch:[25,41,63,64],patch_:25,patch_person:25,path:[26,37,44,53,62],pattern:[11,12,39,62,65],pend:[25,63],per:39,perform:[4,5,6,8,16,20,25,27,39,62,63],performan:25,period:53,perman:39,person:[4,11,20,22,24,25,36,37,38,39,40,41,44,60,63,64],person_hash:4,persons_of_nam:25,pevent:41,pgocaml:16,phase:[60,62],pictur:[36,37,38,44],piec:20,pierr:[22,63],place:[5,22,26,39,53,63],platform:35,plu:39,plug:[5,11,46,50,61,65],plugin1:64,plugin2:64,plugin:[15,18,19,21,26,39,45,47,48,57,58,64],plugin_cgl:62,plugin_export:62,plugin_fixbas:62,plugin_forum:62,plugin_gwxjg:62,plugin_gwxjg_lib:62,plugin_jingoo:62,plugin_lib_show:62,plugin_no_index:62,plugin_v7:62,plugin_v7_im:62,plugin_v7_im_lib:62,plugin_v7_lib:62,plugin_welcom:62,point:[4,5],pointer:63,polymorph:[4,11,60,65],popul:39,popular:[36,37],port:[11,31,39,52,64],portal:[52,64],posit:[26,63],possibl:[5,10,11,16,36,39,44],post:39,pour:21,pps:62,ppx:62,ppx_blob:62,ppx_deriv:62,ppx_import:62,pqp_pyr:39,pr_o:62,practic:[4,16],pre:39,preced:[18,36],predefin:38,prefer:[16,25],prefix:[2,25,62],preproces:[],preprocess:62,preprocesso:62,preprocessor:62,prerequisit:62,present:[1,16,25,44],preserv:[0,25],pretti:[5,62],prevent:[6,28,60],previou:[2,25,26,36,39,53,63],previous:27,primari:11,prime:63,primit:11,princip:62,print:[2,4,5,11,22,25,36,38,39,41,42,60,62],print_str:16,printend:22,printer:[53,65],printing_st:28,prioriti:60,privat:62,probabl:[5,25,39],procedur:[16,17,61,65],process:[14,25,28,53],processor:39,produc:[31,62],profess:39,profil:[18,62],program:[4,5,25],progrbar:27,progress:60,project:[5,11,15,16,18,27,39,53,61,64,65],project_root:62,prone:16,properli:26,properti:26,proport:60,protect:5,provid:[0,5,22,26,27,37,44,45,50,60,62,63,64,65],psql:16,publicli:[16,27],pure:[60,65],purpos:[10,16,25,51,62],put:[10,36],pute:60,pyramid:39,q_mlast:62,qualifi:36,que:21,questionn:18,queue:60,quick:39,quiet:[32,38,41],quit:[25,63],rais:[4,5,16,25,26],random:[8,16],rather:[25,62],raw:[22,44],reach:[8,16],reachabl:39,read:[4,5,25,53,60,63,64],read_famili:4,read_family_0:4,read_lin:9,read_or_create_channel:26,readibl:10,readm:40,readthedoc:[],real:[25,62,63],reason:[4,16,60],rebuild:41,recomend:26,recommand:[16,17],recommend:[5,26,50,65],recompact:[],reconnect:44,record:[5,11,16,22,62,63],record_access:25,recurs:[0,4,11,26,60,62,65],redefin:[5,27,56,60],redefinit:11,redirect:[36,39],reduc:10,redund:[18,26],refactor:16,refer:[5,6,11,16,22,37,44,63],referenc:22,refin:4,regist:[30,33,34,35,39,56,57,58],register_plugin:5,register_s:39,regress:53,regroup:[60,62],regularli:27,reimplement:4,rel:[22,39],relat:[4,5,16,27,36,39],relationdisplai:19,relationship:[4,39,63],relativesdisplai:22,releas:[18,62],relev:13,remot:62,remov:[5,11,22,25,26,30,36,38,39,42,62,63,64],remove_dir:26,remplac:[4,22,62],renam:[11,22,25],rename:[],repetit:[5,11],replac:[0,5,6,10,11,16,26,28,30,37,44,59,62,63,64],repo:[],report:40,repositori:[5,11,51],reprent:0,repres:[4,60,64],represent:[23,25,26,60,63],request:[11,16,24,25,33,34,35,50,56,57,58,59,62,63,64],requir:[6,18,20,27,62,64],requrst:56,reset:53,respect:2,respons:[5,22,62,63],rest:39,restrict:[25,39,63],result:[16,25,26,39,53,62,65],rethink:16,retourn:19,revers:39,revis:[25,39,62],rework:65,rewrit:[32,62],rewritten:63,right:[5,11,62],risk:26,rlm:39,rm_rf:26,robot:[11,16,62],robot_error:[5,16],robot_excl:5,robot_xcl:39,roman:[26,36],root:[5,37,39,40,44,62],round:5,rs_no_ment:36,rule:[18,62],run:[41,42,43,53,60,62],runbench:62,runner:53,runtest:62,safe:[25,39],safer:[2,3,16],sai:[39,63],said:27,saint:26,same:[1,3,4,5,11,22,25,26,39,44,62,63,65],sampl:2,save:[8,16,32,37,38,40,44],scatter:11,scheme:39,scope:62,scratch:32,screen:[53,62],scrip_arg1:43,script:[5,9,11,16,43,51,62,64],sdn:60,seam:[22,24],search:[22,39,58,63,65],search_file_opt:26,searching_field:22,sec:39,second:[4,39,53],section:[16,62],secur:[27,39,65],sed:62,see:[2,40,44,62,63,64],seem:[0,11,23],select:[10,22,37,39,44,52,53,62,64],send:[22,39],sens:22,sep:[4,38,44],sep_limit:44,sep_only_fil:44,separ:[5,11,22,26,27,38,39,44,65],sequenti:53,serial:60,serv:5,server:[5,11,28,31,35,39,50,60,61,62,65],servic:[30,39],set:[4,5,10,18,25,36,37,38,39,44,62],sete:26,setter:11,setup:[46,50,62,64],setup_link:39,sever:[28,36,37,39,44,63,64],sex:4,shadow:62,shard:53,shard_id:53,share:[16,44],shift:38,shim:62,ship:39,should:[3,4,5,6,8,11,14,15,22,25,26,27,28,62,65],shouldn:26,show:[60,62],side:[5,60],sign:36,signatur:60,signifi:[25,63],similar:[11,16,60],simpl:[5,11,16,53,60],simpler:[2,6,28],simpli:[6,16],simplif:[11,16],simplifi:[4,8,11,16,18,27,42],simultan:60,sinc:[4,22,23,25,26,39],sindex:63,singl:[4,11,26,27],size:[20,26,31,44],skip:26,slightli:[27,63],slower:[4,32,37,38,40,44],sname:63,snd_imag:57,snd_image_ok:57,socket:[22,39],softwar:11,solv:5,some:[2,4,5,6,9,11,18,20,22,25,26,27,56,60,61,62,63,64],someon:[5,11,39],someth:22,sometim:[5,8,16,22,60],somewher:[],sosa:[53,62,64],sosa_arrai:[62,64],sosa_num:[62,64],sosa_pkg:62,sosa_zarith:[62,64],sourc:[9,16,36,37,38,39,44,63,65],souvent:19,space:[16,20,22,25,37,40,44],span:30,special_var:5,specif:[5,11,13,18,39,65],specifi:[5,18,31,39,52,62],spous:[24,37,44],src:[37,39,44,62],src_oc_ht:10,srcfiledisplai:5,stabl:[],stage:[4,25,60],staged_pp:62,stai:26,standard:[0,2,5,11,16,44,60],stanza:[18,23,62],start:[5,9,26,40,43,53,60,61,62,65],stat:[38,39],state:[11,18],statement:[5,62],statist:[4,31,38,39],statu:[28,36],stderr:[39,62],stdlib:[26,60,62],stdout:[25,37,39,44],step:16,still:[4,11,16,22,25,26,27,39],sting:26,stop:[4,53],storag:[25,65],store:[4,53,60,62,63,64],str:[26,38,53,62],stradonitz:64,straightforwardli:5,strang:11,strictli:31,string:[3,4,8,10,13,16,25,26,31,39,52,60,63,64],string_of_list:3,stringutil:16,strip:62,strong:[5,11],strongli:[5,11],structur:[4,16,27,45,63],sturctur:[],style:[53,65],sub:[26,63],subdirectori:62,submodul:16,subpart:[],subsect:63,subsequ:62,subset:11,succes:26,sucess:60,suffer:16,suffix:62,suggest:27,suit:[53,62],suite_nam:53,sum:[22,39],support:[26,60],suppos:36,suppres:[],suppress:63,sure:5,surnam:[26,36,37,39,44,60,63],surname_piec:26,surnnam:63,sustain:11,symbol:62,sync:16,synchro_famili:25,synchro_patch:63,synchro_person:25,synchron:32,synchronis:[4,25],syntax:62,syslog:[39,62],syslog_d:62,syslog_pkg:62,system:[5,11,16,17,23,25,26,45,60,61,65],sytax:4,tabl:[8,10,16,25,60,62,63],table_s:63,tabul:62,tag:[36,39],tail:[0,4,11,26,65],take:[22,25,60],taken:[25,64],target:[18,40,64],task:[5,11,16],team:[5,11],tell:[18,44,62],templ:[19,22],templ_pars:62,templast:62,templat:[22,39],temporari:4,term:[0,65],termin:62,test:[6,12,16,29,46,61,65],test_plac:53,test_sosa:53,test_util:53,test_wiki:53,testdata:53,testdata_dir:53,text:[39,63],thai:39,than:[5,6,11,16,37,39,44,62],thei:[2,11,15,16,25,26,36,39,50,51,64],them:[6,11,16,18,25,26,30,39,44,60,62],thi:[0,1,3,4,5,8,11,15,16,18,20,22,23,24,25,26,27,28,31,36,37,39,44,45,47,48,58,60,61,62,63,64,65],thing:5,those:[25,62,63],though:0,thread:53,three:[39,64],through:[5,11,14,64],throughout:[20,26,60],tidi:27,time:[5,8,11,16,20,37,39,44,60,62,63],timeout:39,timestamp:[25,63],titl:[5,16,36,39],tnd:36,todai:[11,39],todo:21,togeth:44,tool:[5,11,45,62,63,64,65],top:[9,43,64],toplevel:[4,62],total:[25,60],trace:[36,39],trace_failed_passwd:39,trackid:36,transform:13,translat:45,transmit:63,travi:53,treat:[22,39],treat_request:5,treatrd:[],tree:[6,39,62,64],tri:5,trim:4,troubl:2,truc:19,tsort:5,tupl:11,turn:65,tuxfamili:44,twice:[5,6],two:[2,20,34,39,40,60,62,64,65],txt:[39,60,62,63],type:[3,11,13,16,22,23,25,45,59,60,63,64],udi:36,uin:36,unaccent_utf_8:26,unclear:24,undefin:36,under:62,understand:[5,7,11,22],undocu:39,unidecod:[26,60,62],unifi:11,uninstal:62,union:[37,44,60,63],unit:[4,5],unix:[26,39,52,60,62],unknown:39,unless:[37,44],unlog:11,unnecessari:4,unsaf:[5,39,65],unsafe_of_str:26,until:[25,63],untreat:36,unus:[4,8,11,16,22,25,26,42,62,64],unverifi:39,unwant:26,updat:[3,5,11,12,15,25,27,39,51,62,63,64,65],update_nldb:[46,50,62],updhist_diff:39,updmenu:39,uppercas:36,url:39,usabl:[5,11,37,44],usag:[4,29,31,32,36,37,38,39,40,41,42,44,52,53,62],use:[2,4,5,11,16,18,23,25,26,32,39,43,44,45,53,58,60,62],used:[0,2,4,5,8,11,15,16,18,21,22,25,26,37,39,40,44,60,62,64],useful:[9,60,63,64],useless:11,user:[5,25,31,39,51,52,60],uses:[4,5,10,18,22,26,60,62],using:[0,4,5,11,25,26,28,44,60,62,65],usual:36,utf8:[27,41],utf:[11,37,44,53,60],utf_8_of_iso_8859_1:26,util:[11,24,27,34,39,50,53,62,64,65],utilitarian:64,uucp:62,uunf:62,uutf:62,v7_im:[46,51,62],v7_im_sendimag:62,v7_templ:19,valid:39,valu:[7,23,25,31,52,53,60,62,63,65],variabl:[4,5,16,22,25,39],variant:[5,11,65],variou:60,verbos:[4,37,38,44,53],veri:[4,22,25,32,41,60],verifi:26,version:[0,1,5,11,16,17,25,26,39,62,64],via:18,view:39,view_wiznot:39,virtual:[62,63,64],visibl:[25,63],w_lock:5,w_wizard:5,wai:[5,16,25],wait:53,want:11,warn:[0,5,16,22,45,47,48,62],web:[5,11,16,28,35,39,50,51,61,65],webpag:[],webserv:60,websit:2,weight:64,welcom:[39,46,51,62],well:[11,16,27,28,62],were:[5,25,51],werver:51,what:[0,5,16],when:[0,2,4,6,8,9,11,16,22,24,25,26,28,32,36,37,39,44,62,63],where:[5,15,25,26,36,38,39,52,62,63,64],which:[0,2,5,9,11,16,25,26,39,60,62,64],who:39,whole:[4,5,16,18],whose:[4,5,16,31,36,39,62,63],why:5,wide:62,wiki:[0,4,44,65],win:62,window:[26,39,62],wit:[4,41],with_logo:22,without:[5,11,22,24,25,26,36,38,44,62,63],wizard:[5,39],wiznot:39,wiznotes_search:39,wiznotesdisplai:5,wjf:39,won:[25,26],word:36,work:[5,11,16,26,28,44],worker:53,workspac:18,world:39,worst:60,would:[2,3,5,6,10,11,16,27],wrap:[11,16,62,64],write:[4,5,11,25,39,43,60,64],written:[16,39,63],wrong:2,wrongli:2,wserver:[16,27,39,52,62,64],wserver_oc:28,www:12,xhtml:[12,46,51],xml:59,year:[22,36,37,44],yet:[5,6],yml:65,you:[11,22,63,64],zarith:[62,64]},titles:["connex","consang","ged2gwb","gwb2ged","gwc","gwd","gwdiff","gwfixbase","gwgc","gwrepl","gwu","Binaries","cgl","export","forum","v7","Audit","<no title>","Installation procedure recommandations","Config module","Consang","Fixbase","Geneweb library audit","Geneweb_def library audit","Geneweb_gwdb library audit","Geneweb_gwdb-legacy library audit","Geneweb_util library audit","Libraries","Wserver","bench","cgl","connex","consang","export","fixbase","forum","ged2gwb","gwb2ged","gwc","gwd","gwdiff","fixbase","gwgc","gwrepl","gwu","gwxjg","Project binaries","jingoo","lib_show","no_index","Official binaries","Plug-ins","setup","test","Tests","update_nldb","v7","v7_im","welcome","xhtml","Geneweb library overview","Developer documentation","Installation procedure","Database overview","Overview","Welcome to Geneweb Audit\u2019s Documentation!"],titleterms:{"export":[5,13,33],"function":[0,2,5,6,7,10,15,16],"int":5,Adding:16,The:27,Use:[2,10,16,21,27],Using:6,access:11,addit:62,adef:[23,60],advsearchok:22,api:5,architectur:64,argument:[2,5,6,7,10,16],artifact:18,assert:5,audit:[16,22,23,24,25,26,65],authentif:5,avoid:16,bad:5,base:6,befor:5,begin:5,bench:29,benchmark:62,between:27,big:2,binari:[11,46,50,64],birthdeath:22,block:28,btree:60,buff:[26,60],bug:28,build:[18,62],calendar:[26,60],cgl:[12,30],channel:28,check:5,close:28,code:16,collect:16,command:5,config:[19,27],configur:[18,62,64],connect:28,connex:[0,31],consang:[1,20,32],constant:[0,12],convert:5,custom:39,cycl:5,data:5,databas:63,date:60,db1link:4,def:[23,60],defin:11,depend:[5,18,27],descript:2,dev:[],develop:61,developp:[],differ:6,document:[0,1,5,8,31,32,36,37,38,39,40,41,42,43,44,61,62,65],doe:28,driver:25,dune:[18,62],each:11,endian:2,entri:63,env:5,error:[2,5],event:3,exampl:63,execut:[5,62],exhaust:[3,16],expect:2,fals:5,field:5,file:[1,5,16,18,62,63],fixbas:[21,34,41],fly:[8,16],forc:2,fork:28,format:[5,16],forum:[14,35],from:28,full:5,futil:[26,60],garbag:16,ged2gwb:[2,36],gedplugindep:[5,39],gener:[16,27],geneweb:[22,60,62,64,65],geneweb_def:23,geneweb_gwdb:[24,25],geneweb_util:26,get:11,global:16,gwb2ged:[3,37],gwc:[4,38],gwcomp:4,gwd:[5,39],gwdb:[24,25,60],gwdiff:[6,40],gwdlog:[5,39],gwdplugin:[5,39],gwdpluginmd5:39,gwdpluginmeta:[5,39],gwfixbas:7,gwgc:[8,42],gwrepl:[9,43],gwu:[10,44],gwxjg:45,handl:[6,28],hashtbl:10,header:16,how:64,html:16,html_n:12,inclus:14,inconsist:28,incorrect:18,indent:16,indic:65,input:2,ins:[39,51,64],instal:[18,62],instead:10,intern:5,introduct:[],jingoo:47,lck:5,legaci:[25,60],letter:16,level:5,lib:60,lib_show:48,librari:[2,16,22,23,24,25,26,27,60,62,64],littl:2,lock:[5,60],log:11,main:[10,62],makefil:[18,62],manag:[5,11],mani:16,markup:12,match:[3,5,16,28],messag:[2,6],messi:28,meta:5,method:5,metric:11,mk_gedpluginmd5:5,mli:16,modif:63,modul:[12,14,16,19,21,27,39],mutil:[26,60],name:[1,5,16,26,60],nbase:5,no_index:49,non:[3,16],note:[5,11],obj:2,offici:[50,64],one:2,onli:2,onlin:[0,1],opam:18,open:4,opt:60,option:[2,4,5,9,10,11,18],our:[36,41,44],out:28,out_dir:10,over:5,overview:[60,63,64],page:5,parser:16,pattern:[3,5,16,28],plug:[39,51,64],plugin:[5,11,62],polymorph:[13,16],pqueue:60,primari:3,primit:3,print:28,printer:16,procedur:[18,62],progrbar:[26,60],project:[46,62],pure:16,recommand:18,recommend:[11,16,27,36,41,44],record:10,recurs:[2,6,9,16],redefinit:3,refer:[7,15],remov:[4,10],repetit:3,replac:12,request:[5,39],rework:[16,27],robot:[5,39],same:[6,16],secur:[26,60],separ:16,server:64,setup:52,should:16,simplif:8,simplifi:5,special:5,specif:16,standard:3,start:64,state:28,storag:[16,63,64],strang:2,string:5,style:16,suggest:28,system:[18,62],tabl:65,tail:[6,9,16],target:62,test:[53,54,62],thei:7,tool:16,tupl:10,two:16,type:[4,5,10,27],undocu:5,uniform:11,unknown:5,unlog:6,unsaf:16,unus:[0,2,5,6,10],updat:[2,7,16],update_nldb:55,usag:11,use:7,useless:13,utf8:[26,60],utf:2,util:[5,16,60],v7_im:57,valu:[2,5,10,11,16],variabl:62,variant:[13,16],version:18,view:5,w_base:5,warn:18,web:64,welcom:[58,65],when:5,who:5,workspac:62,wrap:2,write:28,wrong:5,wserver:28,xhtml:59}}) \ No newline at end of file From 77930eaccda5fcad7038cacc74bf12140c06a40e Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed Date: Tue, 18 Jan 2022 17:22:59 +0100 Subject: [PATCH 72/73] Clean repository from doc --- .gitignore | 1 + Makefile | 2 +- {static => doc}/html/.buildinfo | 0 {static => doc}/html/_images/diagram.png | Bin .../_sources/dev-doc/binaries/bench.md.txt | 0 .../html/_sources/dev-doc/binaries/cgl.md.txt | 0 .../_sources/dev-doc/binaries/connex.md.txt | 0 .../_sources/dev-doc/binaries/consang.md.txt | 0 .../_sources/dev-doc/binaries/export.md.txt | 0 .../dev-doc/binaries/fixbase_plugin.md.txt | 0 .../_sources/dev-doc/binaries/forum.md.txt | 0 .../_sources/dev-doc/binaries/ged2gwb.md.txt | 0 .../_sources/dev-doc/binaries/gwb2ged.md.txt | 0 .../html/_sources/dev-doc/binaries/gwc.md.txt | 0 .../html/_sources/dev-doc/binaries/gwd.md.txt | 0 .../_sources/dev-doc/binaries/gwdiff.md.txt | 0 .../dev-doc/binaries/gwfixbase.md.txt | 0 .../_sources/dev-doc/binaries/gwgc.md.txt | 0 .../_sources/dev-doc/binaries/gwrepl.md.txt | 0 .../html/_sources/dev-doc/binaries/gwu.md.txt | 0 .../_sources/dev-doc/binaries/gwxjg.md.txt | 0 .../_sources/dev-doc/binaries/index.rst.txt | 0 .../_sources/dev-doc/binaries/jingoo.md.txt | 0 .../_sources/dev-doc/binaries/lib_show.md.txt | 0 .../_sources/dev-doc/binaries/no_index.md.txt | 0 .../binaries/official_binaries.rst.txt | 0 .../_sources/dev-doc/binaries/plugins.rst.txt | 0 .../_sources/dev-doc/binaries/setup.md.txt | 0 .../_sources/dev-doc/binaries/test.md.txt | 0 .../_sources/dev-doc/binaries/tests.rst.txt | 0 .../dev-doc/binaries/update_nldb.md.txt | 0 .../html/_sources/dev-doc/binaries/v7.md.txt | 0 .../_sources/dev-doc/binaries/v7_im.md.txt | 0 .../_sources/dev-doc/binaries/welcome.md.txt | 0 .../_sources/dev-doc/binaries/xhtml.md.txt | 0 .../_sources/dev-doc/geneweb-lib/index.md.txt | 0 .../html/_sources/dev-doc/index.rst.txt | 0 .../dev-doc/installation/build-system.md.txt | 0 .../dev-doc/installation/index.md.txt | 0 .../_sources/dev-doc/overview/database.md.txt | 0 .../_sources/dev-doc/overview/index.rst.txt | 0 {static => doc}/html/_sources/index.rst.txt | 0 {static => doc}/html/_static/alabaster.css | 0 {static => doc}/html/_static/basic.css | 0 {static => doc}/html/_static/custom.css | 0 {static => doc}/html/_static/doctools.js | 0 .../html/_static/documentation_options.js | 0 {static => doc}/html/_static/file.png | Bin {static => doc}/html/_static/jquery-3.5.1.js | 0 {static => doc}/html/_static/jquery.js | 0 {static => doc}/html/_static/language_data.js | 0 {static => doc}/html/_static/minus.png | Bin {static => doc}/html/_static/plus.png | Bin {static => doc}/html/_static/pygments.css | 0 {static => doc}/html/_static/searchtools.js | 0 .../html/_static/underscore-1.12.0.js | 0 {static => doc}/html/_static/underscore.js | 0 .../html/dev-doc/binaries/bench.html | 0 .../html/dev-doc/binaries/cgl.html | 0 .../html/dev-doc/binaries/connex.html | 0 .../html/dev-doc/binaries/consang.html | 0 .../html/dev-doc/binaries/export.html | 0 .../html/dev-doc/binaries/fixbase_plugin.html | 0 .../html/dev-doc/binaries/forum.html | 0 .../html/dev-doc/binaries/ged2gwb.html | 0 .../html/dev-doc/binaries/gwb2ged.html | 0 .../html/dev-doc/binaries/gwc.html | 0 .../html/dev-doc/binaries/gwd.html | 0 .../html/dev-doc/binaries/gwdiff.html | 0 .../html/dev-doc/binaries/gwfixbase.html | 0 .../html/dev-doc/binaries/gwgc.html | 0 .../html/dev-doc/binaries/gwrepl.html | 0 .../html/dev-doc/binaries/gwu.html | 0 .../html/dev-doc/binaries/gwxjg.html | 0 .../html/dev-doc/binaries/index.html | 0 .../html/dev-doc/binaries/jingoo.html | 0 .../html/dev-doc/binaries/lib_show.html | 0 .../html/dev-doc/binaries/no_index.html | 0 .../dev-doc/binaries/official_binaries.html | 0 .../html/dev-doc/binaries/plugins.html | 0 .../html/dev-doc/binaries/setup.html | 0 .../html/dev-doc/binaries/test.html | 0 .../html/dev-doc/binaries/tests.html | 0 .../html/dev-doc/binaries/update_nldb.html | 0 {static => doc}/html/dev-doc/binaries/v7.html | 0 .../html/dev-doc/binaries/v7_im.html | 0 .../html/dev-doc/binaries/welcome.html | 0 .../html/dev-doc/binaries/xhtml.html | 0 {static => doc}/html/dev-doc/index.html | 0 .../dev-doc/installation/build-system.html | 0 .../html/dev-doc/installation/index.html | 0 .../html/dev-doc/overview/database.html | 0 .../html/dev-doc/overview/index.html | 0 {static => doc}/html/genindex.html | 0 {static => doc}/html/objects.inv | Bin {static => doc}/html/search.html | 0 {static => doc}/html/searchindex.js | 0 static/doc/geneweb/Adef/.dune-keep | 0 static/doc/geneweb/Adef/index.html | 2 - static/doc/geneweb/Buff/.dune-keep | 0 static/doc/geneweb/Buff/Make/index.html | 2 - static/doc/geneweb/Buff/index.html | 2 - static/doc/geneweb/Calendar/.dune-keep | 0 static/doc/geneweb/Calendar/index.html | 2 - static/doc/geneweb/Consang/.dune-keep | 0 static/doc/geneweb/Consang/index.html | 2 - static/doc/geneweb/ConsangAll/.dune-keep | 0 static/doc/geneweb/ConsangAll/index.html | 2 - static/doc/geneweb/Date/.dune-keep | 0 static/doc/geneweb/Date/index.html | 2 - static/doc/geneweb/Def/.dune-keep | 0 static/doc/geneweb/Def/NLDB/index.html | 2 - static/doc/geneweb/Def/index.html | 2 - static/doc/geneweb/Def_show/.dune-keep | 0 static/doc/geneweb/Def_show/index.html | 2 - static/doc/geneweb/Futil/.dune-keep | 0 static/doc/geneweb/Futil/index.html | 4 - static/doc/geneweb/Geneweb/.dune-keep | 0 .../geneweb/Geneweb/AdvSearchOk/index.html | 2 - .../Geneweb/AdvSearchOkDisplay/index.html | 2 - static/doc/geneweb/Geneweb/Alln/index.html | 2 - .../geneweb/Geneweb/AllnDisplay/index.html | 2 - static/doc/geneweb/Geneweb/Ansel/index.html | 2 - static/doc/geneweb/Geneweb/Base64/index.html | 2 - .../doc/geneweb/Geneweb/BirthDeath/index.html | 3 - .../Geneweb/BirthDeathDisplay/index.html | 2 - .../Geneweb/BirthdayDisplay/index.html | 2 - .../geneweb/Geneweb/ChangeChildren/index.html | 2 - .../Geneweb/ChangeChildrenDisplay/index.html | 2 - static/doc/geneweb/Geneweb/Check/index.html | 3 - .../doc/geneweb/Geneweb/CheckItem/index.html | 3 - static/doc/geneweb/Geneweb/Config/index.html | 2 - static/doc/geneweb/Geneweb/Cousins/index.html | 2 - .../geneweb/Geneweb/CousinsDisplay/index.html | 2 - .../doc/geneweb/Geneweb/Dag/Pset/index.html | 2 - static/doc/geneweb/Geneweb/Dag/index.html | 2 - .../doc/geneweb/Geneweb/Dag2html/index.html | 2 - .../doc/geneweb/Geneweb/DagDisplay/index.html | 2 - .../geneweb/Geneweb/DateDisplay/index.html | 3 - .../geneweb/Geneweb/DescendDisplay/index.html | 2 - .../doc/geneweb/Geneweb/Difference/index.html | 2 - static/doc/geneweb/Geneweb/Fixbase/index.html | 2 - static/doc/geneweb/Geneweb/GWPARAM/index.html | 2 - .../geneweb/Geneweb/GWPARAM_ITL/index.html | 2 - static/doc/geneweb/Geneweb/Gwlib/index.html | 2 - static/doc/geneweb/Geneweb/History/index.html | 2 - .../geneweb/Geneweb/HistoryDiff/index.html | 2 - .../Geneweb/HistoryDiffDisplay/index.html | 2 - static/doc/geneweb/Geneweb/Hutil/index.html | 2 - .../geneweb/Geneweb/ImageDisplay/index.html | 2 - .../geneweb/Geneweb/MergeDisplay/index.html | 2 - .../Geneweb/MergeDupDisplay/index.html | 2 - .../Geneweb/MergeFamDisplay/index.html | 2 - .../doc/geneweb/Geneweb/MergeFamOk/index.html | 2 - .../doc/geneweb/Geneweb/MergeInd/index.html | 2 - .../Geneweb/MergeIndDisplay/index.html | 2 - .../doc/geneweb/Geneweb/MergeIndOk/index.html | 2 - .../Geneweb/MergeIndOkDisplay/index.html | 2 - static/doc/geneweb/Geneweb/Notes/index.html | 2 - .../geneweb/Geneweb/NotesDisplay/index.html | 2 - .../doc/geneweb/Geneweb/NotesLinks/index.html | 2 - static/doc/geneweb/Geneweb/Output/index.html | 2 - static/doc/geneweb/Geneweb/Perso/index.html | 3 - static/doc/geneweb/Geneweb/Place/index.html | 4 - .../geneweb/Geneweb/PlaceDisplay/index.html | 6 - .../doc/geneweb/Geneweb/Relation/index.html | 2 - .../Geneweb/RelationDisplay/index.html | 2 - .../geneweb/Geneweb/RelationLink/index.html | 2 - .../doc/geneweb/Geneweb/SearchName/index.html | 2 - static/doc/geneweb/Geneweb/Some/index.html | 2 - .../geneweb/Geneweb/SrcfileDisplay/index.html | 2 - static/doc/geneweb/Geneweb/Stats/index.html | 2 - static/doc/geneweb/Geneweb/Templ/index.html | 2 - .../doc/geneweb/Geneweb/TemplAst/index.html | 2 - .../doc/geneweb/Geneweb/TemplDate/index.html | 2 - .../geneweb/Geneweb/Templ_parser/index.html | 2 - static/doc/geneweb/Geneweb/Title/index.html | 4 - .../geneweb/Geneweb/TitleDisplay/index.html | 2 - .../doc/geneweb/Geneweb/Translate/index.html | 2 - static/doc/geneweb/Geneweb/Update/index.html | 2 - .../Geneweb/UpdateData/IstrSet/index.html | 2 - .../Geneweb/UpdateData/PersMap/index.html | 2 - .../Geneweb/UpdateData/PersSet/index.html | 2 - .../Geneweb/UpdateData/StringSet/index.html | 2 - .../doc/geneweb/Geneweb/UpdateData/index.html | 2 - .../Geneweb/UpdateDataDisplay/index.html | 2 - .../doc/geneweb/Geneweb/UpdateFam/index.html | 2 - .../geneweb/Geneweb/UpdateFamOk/index.html | 2 - .../doc/geneweb/Geneweb/UpdateInd/index.html | 2 - .../geneweb/Geneweb/UpdateIndOk/index.html | 3 - .../geneweb/Geneweb/Util/IfamSet/index.html | 2 - .../geneweb/Geneweb/Util/IperSet/index.html | 2 - static/doc/geneweb/Geneweb/Util/index.html | 2 - static/doc/geneweb/Geneweb/Version/index.html | 2 - static/doc/geneweb/Geneweb/Wiki/index.html | 4 - .../Geneweb/WiznotesDisplay/index.html | 2 - static/doc/geneweb/Geneweb/index.html | 2 - .../geneweb/Geneweb__AdvSearchOk/.dune-keep | 0 .../geneweb/Geneweb__AdvSearchOk/index.html | 2 - .../Geneweb__AdvSearchOkDisplay/.dune-keep | 0 .../Geneweb__AdvSearchOkDisplay/index.html | 2 - static/doc/geneweb/Geneweb__Alln/.dune-keep | 0 static/doc/geneweb/Geneweb__Alln/index.html | 2 - .../geneweb/Geneweb__AllnDisplay/.dune-keep | 0 .../geneweb/Geneweb__AllnDisplay/index.html | 2 - static/doc/geneweb/Geneweb__Ansel/.dune-keep | 0 static/doc/geneweb/Geneweb__Ansel/index.html | 2 - static/doc/geneweb/Geneweb__Base64/.dune-keep | 0 static/doc/geneweb/Geneweb__Base64/index.html | 2 - .../geneweb/Geneweb__BirthDeath/.dune-keep | 0 .../geneweb/Geneweb__BirthDeath/index.html | 2 - .../Geneweb__BirthDeathDisplay/.dune-keep | 0 .../Geneweb__BirthDeathDisplay/index.html | 2 - .../Geneweb__BirthdayDisplay/.dune-keep | 0 .../Geneweb__BirthdayDisplay/index.html | 2 - .../Geneweb__ChangeChildren/.dune-keep | 0 .../Geneweb__ChangeChildren/index.html | 2 - .../Geneweb__ChangeChildrenDisplay/.dune-keep | 0 .../Geneweb__ChangeChildrenDisplay/index.html | 2 - static/doc/geneweb/Geneweb__Check/.dune-keep | 0 static/doc/geneweb/Geneweb__Check/index.html | 2 - .../doc/geneweb/Geneweb__CheckItem/.dune-keep | 0 .../doc/geneweb/Geneweb__CheckItem/index.html | 2 - static/doc/geneweb/Geneweb__Config/.dune-keep | 0 static/doc/geneweb/Geneweb__Config/index.html | 2 - .../doc/geneweb/Geneweb__Cousins/.dune-keep | 0 .../doc/geneweb/Geneweb__Cousins/index.html | 2 - .../Geneweb__CousinsDisplay/.dune-keep | 0 .../Geneweb__CousinsDisplay/index.html | 2 - static/doc/geneweb/Geneweb__Dag/.dune-keep | 0 static/doc/geneweb/Geneweb__Dag/index.html | 2 - .../doc/geneweb/Geneweb__Dag2html/.dune-keep | 0 .../doc/geneweb/Geneweb__Dag2html/index.html | 2 - .../geneweb/Geneweb__DagDisplay/.dune-keep | 0 .../geneweb/Geneweb__DagDisplay/index.html | 2 - .../geneweb/Geneweb__DateDisplay/.dune-keep | 0 .../geneweb/Geneweb__DateDisplay/index.html | 2 - .../Geneweb__DescendDisplay/.dune-keep | 0 .../Geneweb__DescendDisplay/index.html | 2 - .../geneweb/Geneweb__Difference/.dune-keep | 0 .../geneweb/Geneweb__Difference/index.html | 2 - .../doc/geneweb/Geneweb__Fixbase/.dune-keep | 0 .../doc/geneweb/Geneweb__Fixbase/index.html | 2 - .../doc/geneweb/Geneweb__GWPARAM/.dune-keep | 0 .../doc/geneweb/Geneweb__GWPARAM/index.html | 2 - .../geneweb/Geneweb__GWPARAM_ITL/.dune-keep | 0 .../geneweb/Geneweb__GWPARAM_ITL/index.html | 2 - static/doc/geneweb/Geneweb__Gwlib/.dune-keep | 0 static/doc/geneweb/Geneweb__Gwlib/index.html | 2 - .../doc/geneweb/Geneweb__History/.dune-keep | 0 .../doc/geneweb/Geneweb__History/index.html | 2 - .../geneweb/Geneweb__HistoryDiff/.dune-keep | 0 .../geneweb/Geneweb__HistoryDiff/index.html | 2 - .../Geneweb__HistoryDiffDisplay/.dune-keep | 0 .../Geneweb__HistoryDiffDisplay/index.html | 2 - static/doc/geneweb/Geneweb__Hutil/.dune-keep | 0 static/doc/geneweb/Geneweb__Hutil/index.html | 2 - .../geneweb/Geneweb__ImageDisplay/.dune-keep | 0 .../geneweb/Geneweb__ImageDisplay/index.html | 2 - .../geneweb/Geneweb__MergeDisplay/.dune-keep | 0 .../geneweb/Geneweb__MergeDisplay/index.html | 2 - .../Geneweb__MergeDupDisplay/.dune-keep | 0 .../Geneweb__MergeDupDisplay/index.html | 2 - .../Geneweb__MergeFamDisplay/.dune-keep | 0 .../Geneweb__MergeFamDisplay/index.html | 2 - .../geneweb/Geneweb__MergeFamOk/.dune-keep | 0 .../geneweb/Geneweb__MergeFamOk/index.html | 2 - .../doc/geneweb/Geneweb__MergeInd/.dune-keep | 0 .../doc/geneweb/Geneweb__MergeInd/index.html | 2 - .../Geneweb__MergeIndDisplay/.dune-keep | 0 .../Geneweb__MergeIndDisplay/index.html | 2 - .../geneweb/Geneweb__MergeIndOk/.dune-keep | 0 .../geneweb/Geneweb__MergeIndOk/index.html | 2 - .../Geneweb__MergeIndOkDisplay/.dune-keep | 0 .../Geneweb__MergeIndOkDisplay/index.html | 2 - static/doc/geneweb/Geneweb__Notes/.dune-keep | 0 static/doc/geneweb/Geneweb__Notes/index.html | 2 - .../geneweb/Geneweb__NotesDisplay/.dune-keep | 0 .../geneweb/Geneweb__NotesDisplay/index.html | 2 - .../geneweb/Geneweb__NotesLinks/.dune-keep | 0 .../geneweb/Geneweb__NotesLinks/index.html | 2 - static/doc/geneweb/Geneweb__Output/.dune-keep | 0 static/doc/geneweb/Geneweb__Output/index.html | 2 - static/doc/geneweb/Geneweb__Perso/.dune-keep | 0 static/doc/geneweb/Geneweb__Perso/index.html | 2 - static/doc/geneweb/Geneweb__Place/.dune-keep | 0 static/doc/geneweb/Geneweb__Place/index.html | 2 - .../geneweb/Geneweb__PlaceDisplay/.dune-keep | 0 .../geneweb/Geneweb__PlaceDisplay/index.html | 2 - .../doc/geneweb/Geneweb__Relation/.dune-keep | 0 .../doc/geneweb/Geneweb__Relation/index.html | 2 - .../Geneweb__RelationDisplay/.dune-keep | 0 .../Geneweb__RelationDisplay/index.html | 2 - .../geneweb/Geneweb__RelationLink/.dune-keep | 0 .../geneweb/Geneweb__RelationLink/index.html | 2 - .../geneweb/Geneweb__SearchName/.dune-keep | 0 .../geneweb/Geneweb__SearchName/index.html | 2 - static/doc/geneweb/Geneweb__Some/.dune-keep | 0 static/doc/geneweb/Geneweb__Some/index.html | 2 - .../Geneweb__SrcfileDisplay/.dune-keep | 0 .../Geneweb__SrcfileDisplay/index.html | 2 - static/doc/geneweb/Geneweb__Stats/.dune-keep | 0 static/doc/geneweb/Geneweb__Stats/index.html | 2 - static/doc/geneweb/Geneweb__Templ/.dune-keep | 0 static/doc/geneweb/Geneweb__Templ/index.html | 2 - .../doc/geneweb/Geneweb__TemplAst/.dune-keep | 0 .../doc/geneweb/Geneweb__TemplAst/index.html | 2 - .../doc/geneweb/Geneweb__TemplDate/.dune-keep | 0 .../doc/geneweb/Geneweb__TemplDate/index.html | 2 - .../geneweb/Geneweb__Templ_parser/.dune-keep | 0 .../geneweb/Geneweb__Templ_parser/index.html | 2 - static/doc/geneweb/Geneweb__Title/.dune-keep | 0 static/doc/geneweb/Geneweb__Title/index.html | 2 - .../geneweb/Geneweb__TitleDisplay/.dune-keep | 0 .../geneweb/Geneweb__TitleDisplay/index.html | 2 - .../doc/geneweb/Geneweb__Translate/.dune-keep | 0 .../doc/geneweb/Geneweb__Translate/index.html | 2 - static/doc/geneweb/Geneweb__Update/.dune-keep | 0 static/doc/geneweb/Geneweb__Update/index.html | 2 - .../geneweb/Geneweb__UpdateData/.dune-keep | 0 .../geneweb/Geneweb__UpdateData/index.html | 2 - .../Geneweb__UpdateDataDisplay/.dune-keep | 0 .../Geneweb__UpdateDataDisplay/index.html | 2 - .../doc/geneweb/Geneweb__UpdateFam/.dune-keep | 0 .../doc/geneweb/Geneweb__UpdateFam/index.html | 2 - .../geneweb/Geneweb__UpdateFamOk/.dune-keep | 0 .../geneweb/Geneweb__UpdateFamOk/index.html | 2 - .../doc/geneweb/Geneweb__UpdateInd/.dune-keep | 0 .../doc/geneweb/Geneweb__UpdateInd/index.html | 2 - .../geneweb/Geneweb__UpdateIndOk/.dune-keep | 0 .../geneweb/Geneweb__UpdateIndOk/index.html | 2 - static/doc/geneweb/Geneweb__Util/.dune-keep | 0 static/doc/geneweb/Geneweb__Util/index.html | 2 - .../doc/geneweb/Geneweb__Version/.dune-keep | 0 .../doc/geneweb/Geneweb__Version/index.html | 2 - static/doc/geneweb/Geneweb__Wiki/.dune-keep | 0 static/doc/geneweb/Geneweb__Wiki/index.html | 2 - .../Geneweb__WiznotesDisplay/.dune-keep | 0 .../Geneweb__WiznotesDisplay/index.html | 2 - static/doc/geneweb/Geneweb_export/.dune-keep | 0 .../Make/argument-1-D/index.html | 2 - .../Json_converter/Make/index.html | 2 - .../Geneweb_export/Json_converter/index.html | 2 - .../module-type-ConverterDriver/index.html | 2 - static/doc/geneweb/Geneweb_export/index.html | 2 - .../Geneweb_export__Json_converter/.dune-keep | 0 .../Geneweb_export__Json_converter/index.html | 2 - static/doc/geneweb/Gutil/.dune-keep | 0 static/doc/geneweb/Gutil/index.html | 2 - static/doc/geneweb/Gwb2gedLib/.dune-keep | 0 static/doc/geneweb/Gwb2gedLib/index.html | 2 - static/doc/geneweb/Gwd_lib/.dune-keep | 0 static/doc/geneweb/Gwd_lib/GwdLog/index.html | 2 - .../doc/geneweb/Gwd_lib/GwdPlugin/index.html | 2 - static/doc/geneweb/Gwd_lib/Request/index.html | 2 - static/doc/geneweb/Gwd_lib/index.html | 2 - static/doc/geneweb/Gwd_lib__GwdLog/.dune-keep | 0 static/doc/geneweb/Gwd_lib__GwdLog/index.html | 2 - .../doc/geneweb/Gwd_lib__GwdPlugin/.dune-keep | 0 .../doc/geneweb/Gwd_lib__GwdPlugin/index.html | 2 - .../doc/geneweb/Gwd_lib__Request/.dune-keep | 0 .../doc/geneweb/Gwd_lib__Request/index.html | 2 - static/doc/geneweb/Gwdb/.dune-keep | 0 static/doc/geneweb/Gwdb/index.html | 2 - static/doc/geneweb/Gwdb_driver/.dune-keep | 0 .../geneweb/Gwdb_driver/Collection/index.html | 2 - .../doc/geneweb/Gwdb_driver/Marker/index.html | 2 - static/doc/geneweb/Gwdb_driver/index.html | 2 - static/doc/geneweb/Gwexport/.dune-keep | 0 static/doc/geneweb/Gwexport/index.html | 2 - static/doc/geneweb/GwuLib/.dune-keep | 0 static/doc/geneweb/GwuLib/index.html | 2 - static/doc/geneweb/Lock/.dune-keep | 0 static/doc/geneweb/Lock/index.html | 2 - static/doc/geneweb/Mutil/.dune-keep | 0 static/doc/geneweb/Mutil/index.html | 3 - static/doc/geneweb/Name/.dune-keep | 0 static/doc/geneweb/Name/index.html | 2 - static/doc/geneweb/Opt/.dune-keep | 0 static/doc/geneweb/Opt/index.html | 2 - .../doc/geneweb/Plugin_gwxjg_lib/.dune-keep | 0 .../Gwxjg_data/Yojson_write/index.html | 2 - .../Plugin_gwxjg_lib/Gwxjg_data/index.html | 2 - .../Gwxjg_ezgw/Event/index.html | 2 - .../Gwxjg_ezgw/Family/index.html | 2 - .../Gwxjg_ezgw/Person/index.html | 2 - .../Plugin_gwxjg_lib/Gwxjg_ezgw/index.html | 2 - .../Gwxjg_lexicon_parser/index.html | 2 - .../Plugin_gwxjg_lib/Gwxjg_trans/index.html | 14 - .../doc/geneweb/Plugin_gwxjg_lib/index.html | 2 - .../Plugin_gwxjg_lib__Gwxjg_data/.dune-keep | 0 .../Plugin_gwxjg_lib__Gwxjg_data/index.html | 2 - .../Plugin_gwxjg_lib__Gwxjg_ezgw/.dune-keep | 0 .../Plugin_gwxjg_lib__Gwxjg_ezgw/index.html | 2 - .../.dune-keep | 0 .../index.html | 2 - .../Plugin_gwxjg_lib__Gwxjg_trans/.dune-keep | 0 .../Plugin_gwxjg_lib__Gwxjg_trans/index.html | 2 - static/doc/geneweb/Pqueue/.dune-keep | 0 .../Pqueue/Make/argument-1-Ord/index.html | 2 - static/doc/geneweb/Pqueue/Make/index.html | 2 - static/doc/geneweb/Pqueue/index.html | 2 - .../Pqueue/module-type-OrderedType/index.html | 2 - .../geneweb/Pqueue/module-type-S/index.html | 2 - static/doc/geneweb/ProgrBar/.dune-keep | 0 static/doc/geneweb/ProgrBar/index.html | 2 - static/doc/geneweb/Secure/.dune-keep | 0 static/doc/geneweb/Secure/index.html | 2 - static/doc/geneweb/Sosa/.dune-keep | 0 static/doc/geneweb/Sosa/index.html | 2 - static/doc/geneweb/Utf8/.dune-keep | 0 static/doc/geneweb/Utf8/index.html | 2 - static/doc/geneweb/Wserver/.dune-keep | 0 static/doc/geneweb/Wserver/index.html | 2 - static/doc/geneweb/index.html | 2 - static/doc/highlight.pack.js | 2 - static/doc/index.html | 19 - static/doc/odoc.css | 782 ------------------ 418 files changed, 2 insertions(+), 1255 deletions(-) rename {static => doc}/html/.buildinfo (100%) rename {static => doc}/html/_images/diagram.png (100%) rename {static => doc}/html/_sources/dev-doc/binaries/bench.md.txt (100%) rename {static => doc}/html/_sources/dev-doc/binaries/cgl.md.txt (100%) rename {static => doc}/html/_sources/dev-doc/binaries/connex.md.txt (100%) rename {static => doc}/html/_sources/dev-doc/binaries/consang.md.txt (100%) rename {static => doc}/html/_sources/dev-doc/binaries/export.md.txt (100%) rename {static => doc}/html/_sources/dev-doc/binaries/fixbase_plugin.md.txt (100%) rename {static => doc}/html/_sources/dev-doc/binaries/forum.md.txt (100%) rename {static => doc}/html/_sources/dev-doc/binaries/ged2gwb.md.txt (100%) rename {static => doc}/html/_sources/dev-doc/binaries/gwb2ged.md.txt (100%) rename {static => doc}/html/_sources/dev-doc/binaries/gwc.md.txt (100%) rename {static => doc}/html/_sources/dev-doc/binaries/gwd.md.txt (100%) rename {static => doc}/html/_sources/dev-doc/binaries/gwdiff.md.txt (100%) rename {static => doc}/html/_sources/dev-doc/binaries/gwfixbase.md.txt (100%) rename {static => doc}/html/_sources/dev-doc/binaries/gwgc.md.txt (100%) rename {static => doc}/html/_sources/dev-doc/binaries/gwrepl.md.txt (100%) rename {static => doc}/html/_sources/dev-doc/binaries/gwu.md.txt (100%) rename {static => doc}/html/_sources/dev-doc/binaries/gwxjg.md.txt (100%) rename {static => doc}/html/_sources/dev-doc/binaries/index.rst.txt (100%) rename {static => doc}/html/_sources/dev-doc/binaries/jingoo.md.txt (100%) rename {static => doc}/html/_sources/dev-doc/binaries/lib_show.md.txt (100%) rename {static => doc}/html/_sources/dev-doc/binaries/no_index.md.txt (100%) rename {static => doc}/html/_sources/dev-doc/binaries/official_binaries.rst.txt (100%) rename {static => doc}/html/_sources/dev-doc/binaries/plugins.rst.txt (100%) rename {static => doc}/html/_sources/dev-doc/binaries/setup.md.txt (100%) rename {static => doc}/html/_sources/dev-doc/binaries/test.md.txt (100%) rename {static => doc}/html/_sources/dev-doc/binaries/tests.rst.txt (100%) rename {static => doc}/html/_sources/dev-doc/binaries/update_nldb.md.txt (100%) rename {static => doc}/html/_sources/dev-doc/binaries/v7.md.txt (100%) rename {static => doc}/html/_sources/dev-doc/binaries/v7_im.md.txt (100%) rename {static => doc}/html/_sources/dev-doc/binaries/welcome.md.txt (100%) rename {static => doc}/html/_sources/dev-doc/binaries/xhtml.md.txt (100%) rename {static => doc}/html/_sources/dev-doc/geneweb-lib/index.md.txt (100%) rename {static => doc}/html/_sources/dev-doc/index.rst.txt (100%) rename {static => doc}/html/_sources/dev-doc/installation/build-system.md.txt (100%) rename {static => doc}/html/_sources/dev-doc/installation/index.md.txt (100%) rename {static => doc}/html/_sources/dev-doc/overview/database.md.txt (100%) rename {static => doc}/html/_sources/dev-doc/overview/index.rst.txt (100%) rename {static => doc}/html/_sources/index.rst.txt (100%) rename {static => doc}/html/_static/alabaster.css (100%) rename {static => doc}/html/_static/basic.css (100%) rename {static => doc}/html/_static/custom.css (100%) rename {static => doc}/html/_static/doctools.js (100%) rename {static => doc}/html/_static/documentation_options.js (100%) rename {static => doc}/html/_static/file.png (100%) rename {static => doc}/html/_static/jquery-3.5.1.js (100%) rename {static => doc}/html/_static/jquery.js (100%) rename {static => doc}/html/_static/language_data.js (100%) rename {static => doc}/html/_static/minus.png (100%) rename {static => doc}/html/_static/plus.png (100%) rename {static => doc}/html/_static/pygments.css (100%) rename {static => doc}/html/_static/searchtools.js (100%) rename {static => doc}/html/_static/underscore-1.12.0.js (100%) rename {static => doc}/html/_static/underscore.js (100%) rename {static => doc}/html/dev-doc/binaries/bench.html (100%) rename {static => doc}/html/dev-doc/binaries/cgl.html (100%) rename {static => doc}/html/dev-doc/binaries/connex.html (100%) rename {static => doc}/html/dev-doc/binaries/consang.html (100%) rename {static => doc}/html/dev-doc/binaries/export.html (100%) rename {static => doc}/html/dev-doc/binaries/fixbase_plugin.html (100%) rename {static => doc}/html/dev-doc/binaries/forum.html (100%) rename {static => doc}/html/dev-doc/binaries/ged2gwb.html (100%) rename {static => doc}/html/dev-doc/binaries/gwb2ged.html (100%) rename {static => doc}/html/dev-doc/binaries/gwc.html (100%) rename {static => doc}/html/dev-doc/binaries/gwd.html (100%) rename {static => doc}/html/dev-doc/binaries/gwdiff.html (100%) rename {static => doc}/html/dev-doc/binaries/gwfixbase.html (100%) rename {static => doc}/html/dev-doc/binaries/gwgc.html (100%) rename {static => doc}/html/dev-doc/binaries/gwrepl.html (100%) rename {static => doc}/html/dev-doc/binaries/gwu.html (100%) rename {static => doc}/html/dev-doc/binaries/gwxjg.html (100%) rename {static => doc}/html/dev-doc/binaries/index.html (100%) rename {static => doc}/html/dev-doc/binaries/jingoo.html (100%) rename {static => doc}/html/dev-doc/binaries/lib_show.html (100%) rename {static => doc}/html/dev-doc/binaries/no_index.html (100%) rename {static => doc}/html/dev-doc/binaries/official_binaries.html (100%) rename {static => doc}/html/dev-doc/binaries/plugins.html (100%) rename {static => doc}/html/dev-doc/binaries/setup.html (100%) rename {static => doc}/html/dev-doc/binaries/test.html (100%) rename {static => doc}/html/dev-doc/binaries/tests.html (100%) rename {static => doc}/html/dev-doc/binaries/update_nldb.html (100%) rename {static => doc}/html/dev-doc/binaries/v7.html (100%) rename {static => doc}/html/dev-doc/binaries/v7_im.html (100%) rename {static => doc}/html/dev-doc/binaries/welcome.html (100%) rename {static => doc}/html/dev-doc/binaries/xhtml.html (100%) rename {static => doc}/html/dev-doc/index.html (100%) rename {static => doc}/html/dev-doc/installation/build-system.html (100%) rename {static => doc}/html/dev-doc/installation/index.html (100%) rename {static => doc}/html/dev-doc/overview/database.html (100%) rename {static => doc}/html/dev-doc/overview/index.html (100%) rename {static => doc}/html/genindex.html (100%) rename {static => doc}/html/objects.inv (100%) rename {static => doc}/html/search.html (100%) rename {static => doc}/html/searchindex.js (100%) delete mode 100644 static/doc/geneweb/Adef/.dune-keep delete mode 100644 static/doc/geneweb/Adef/index.html delete mode 100644 static/doc/geneweb/Buff/.dune-keep delete mode 100644 static/doc/geneweb/Buff/Make/index.html delete mode 100644 static/doc/geneweb/Buff/index.html delete mode 100644 static/doc/geneweb/Calendar/.dune-keep delete mode 100644 static/doc/geneweb/Calendar/index.html delete mode 100644 static/doc/geneweb/Consang/.dune-keep delete mode 100644 static/doc/geneweb/Consang/index.html delete mode 100644 static/doc/geneweb/ConsangAll/.dune-keep delete mode 100644 static/doc/geneweb/ConsangAll/index.html delete mode 100644 static/doc/geneweb/Date/.dune-keep delete mode 100644 static/doc/geneweb/Date/index.html delete mode 100644 static/doc/geneweb/Def/.dune-keep delete mode 100644 static/doc/geneweb/Def/NLDB/index.html delete mode 100644 static/doc/geneweb/Def/index.html delete mode 100644 static/doc/geneweb/Def_show/.dune-keep delete mode 100644 static/doc/geneweb/Def_show/index.html delete mode 100644 static/doc/geneweb/Futil/.dune-keep delete mode 100644 static/doc/geneweb/Futil/index.html delete mode 100644 static/doc/geneweb/Geneweb/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb/AdvSearchOk/index.html delete mode 100644 static/doc/geneweb/Geneweb/AdvSearchOkDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb/Alln/index.html delete mode 100644 static/doc/geneweb/Geneweb/AllnDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb/Ansel/index.html delete mode 100644 static/doc/geneweb/Geneweb/Base64/index.html delete mode 100644 static/doc/geneweb/Geneweb/BirthDeath/index.html delete mode 100644 static/doc/geneweb/Geneweb/BirthDeathDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb/BirthdayDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb/ChangeChildren/index.html delete mode 100644 static/doc/geneweb/Geneweb/ChangeChildrenDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb/Check/index.html delete mode 100644 static/doc/geneweb/Geneweb/CheckItem/index.html delete mode 100644 static/doc/geneweb/Geneweb/Config/index.html delete mode 100644 static/doc/geneweb/Geneweb/Cousins/index.html delete mode 100644 static/doc/geneweb/Geneweb/CousinsDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb/Dag/Pset/index.html delete mode 100644 static/doc/geneweb/Geneweb/Dag/index.html delete mode 100644 static/doc/geneweb/Geneweb/Dag2html/index.html delete mode 100644 static/doc/geneweb/Geneweb/DagDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb/DateDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb/DescendDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb/Difference/index.html delete mode 100644 static/doc/geneweb/Geneweb/Fixbase/index.html delete mode 100644 static/doc/geneweb/Geneweb/GWPARAM/index.html delete mode 100644 static/doc/geneweb/Geneweb/GWPARAM_ITL/index.html delete mode 100644 static/doc/geneweb/Geneweb/Gwlib/index.html delete mode 100644 static/doc/geneweb/Geneweb/History/index.html delete mode 100644 static/doc/geneweb/Geneweb/HistoryDiff/index.html delete mode 100644 static/doc/geneweb/Geneweb/HistoryDiffDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb/Hutil/index.html delete mode 100644 static/doc/geneweb/Geneweb/ImageDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb/MergeDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb/MergeDupDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb/MergeFamDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb/MergeFamOk/index.html delete mode 100644 static/doc/geneweb/Geneweb/MergeInd/index.html delete mode 100644 static/doc/geneweb/Geneweb/MergeIndDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb/MergeIndOk/index.html delete mode 100644 static/doc/geneweb/Geneweb/MergeIndOkDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb/Notes/index.html delete mode 100644 static/doc/geneweb/Geneweb/NotesDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb/NotesLinks/index.html delete mode 100644 static/doc/geneweb/Geneweb/Output/index.html delete mode 100644 static/doc/geneweb/Geneweb/Perso/index.html delete mode 100644 static/doc/geneweb/Geneweb/Place/index.html delete mode 100644 static/doc/geneweb/Geneweb/PlaceDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb/Relation/index.html delete mode 100644 static/doc/geneweb/Geneweb/RelationDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb/RelationLink/index.html delete mode 100644 static/doc/geneweb/Geneweb/SearchName/index.html delete mode 100644 static/doc/geneweb/Geneweb/Some/index.html delete mode 100644 static/doc/geneweb/Geneweb/SrcfileDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb/Stats/index.html delete mode 100644 static/doc/geneweb/Geneweb/Templ/index.html delete mode 100644 static/doc/geneweb/Geneweb/TemplAst/index.html delete mode 100644 static/doc/geneweb/Geneweb/TemplDate/index.html delete mode 100644 static/doc/geneweb/Geneweb/Templ_parser/index.html delete mode 100644 static/doc/geneweb/Geneweb/Title/index.html delete mode 100644 static/doc/geneweb/Geneweb/TitleDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb/Translate/index.html delete mode 100644 static/doc/geneweb/Geneweb/Update/index.html delete mode 100644 static/doc/geneweb/Geneweb/UpdateData/IstrSet/index.html delete mode 100644 static/doc/geneweb/Geneweb/UpdateData/PersMap/index.html delete mode 100644 static/doc/geneweb/Geneweb/UpdateData/PersSet/index.html delete mode 100644 static/doc/geneweb/Geneweb/UpdateData/StringSet/index.html delete mode 100644 static/doc/geneweb/Geneweb/UpdateData/index.html delete mode 100644 static/doc/geneweb/Geneweb/UpdateDataDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb/UpdateFam/index.html delete mode 100644 static/doc/geneweb/Geneweb/UpdateFamOk/index.html delete mode 100644 static/doc/geneweb/Geneweb/UpdateInd/index.html delete mode 100644 static/doc/geneweb/Geneweb/UpdateIndOk/index.html delete mode 100644 static/doc/geneweb/Geneweb/Util/IfamSet/index.html delete mode 100644 static/doc/geneweb/Geneweb/Util/IperSet/index.html delete mode 100644 static/doc/geneweb/Geneweb/Util/index.html delete mode 100644 static/doc/geneweb/Geneweb/Version/index.html delete mode 100644 static/doc/geneweb/Geneweb/Wiki/index.html delete mode 100644 static/doc/geneweb/Geneweb/WiznotesDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb/index.html delete mode 100644 static/doc/geneweb/Geneweb__AdvSearchOk/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__AdvSearchOk/index.html delete mode 100644 static/doc/geneweb/Geneweb__AdvSearchOkDisplay/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__AdvSearchOkDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb__Alln/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__Alln/index.html delete mode 100644 static/doc/geneweb/Geneweb__AllnDisplay/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__AllnDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb__Ansel/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__Ansel/index.html delete mode 100644 static/doc/geneweb/Geneweb__Base64/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__Base64/index.html delete mode 100644 static/doc/geneweb/Geneweb__BirthDeath/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__BirthDeath/index.html delete mode 100644 static/doc/geneweb/Geneweb__BirthDeathDisplay/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__BirthDeathDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb__BirthdayDisplay/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__BirthdayDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb__ChangeChildren/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__ChangeChildren/index.html delete mode 100644 static/doc/geneweb/Geneweb__ChangeChildrenDisplay/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__ChangeChildrenDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb__Check/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__Check/index.html delete mode 100644 static/doc/geneweb/Geneweb__CheckItem/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__CheckItem/index.html delete mode 100644 static/doc/geneweb/Geneweb__Config/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__Config/index.html delete mode 100644 static/doc/geneweb/Geneweb__Cousins/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__Cousins/index.html delete mode 100644 static/doc/geneweb/Geneweb__CousinsDisplay/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__CousinsDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb__Dag/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__Dag/index.html delete mode 100644 static/doc/geneweb/Geneweb__Dag2html/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__Dag2html/index.html delete mode 100644 static/doc/geneweb/Geneweb__DagDisplay/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__DagDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb__DateDisplay/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__DateDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb__DescendDisplay/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__DescendDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb__Difference/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__Difference/index.html delete mode 100644 static/doc/geneweb/Geneweb__Fixbase/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__Fixbase/index.html delete mode 100644 static/doc/geneweb/Geneweb__GWPARAM/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__GWPARAM/index.html delete mode 100644 static/doc/geneweb/Geneweb__GWPARAM_ITL/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__GWPARAM_ITL/index.html delete mode 100644 static/doc/geneweb/Geneweb__Gwlib/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__Gwlib/index.html delete mode 100644 static/doc/geneweb/Geneweb__History/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__History/index.html delete mode 100644 static/doc/geneweb/Geneweb__HistoryDiff/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__HistoryDiff/index.html delete mode 100644 static/doc/geneweb/Geneweb__HistoryDiffDisplay/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__HistoryDiffDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb__Hutil/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__Hutil/index.html delete mode 100644 static/doc/geneweb/Geneweb__ImageDisplay/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__ImageDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb__MergeDisplay/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__MergeDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb__MergeDupDisplay/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__MergeDupDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb__MergeFamDisplay/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__MergeFamDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb__MergeFamOk/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__MergeFamOk/index.html delete mode 100644 static/doc/geneweb/Geneweb__MergeInd/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__MergeInd/index.html delete mode 100644 static/doc/geneweb/Geneweb__MergeIndDisplay/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__MergeIndDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb__MergeIndOk/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__MergeIndOk/index.html delete mode 100644 static/doc/geneweb/Geneweb__MergeIndOkDisplay/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__MergeIndOkDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb__Notes/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__Notes/index.html delete mode 100644 static/doc/geneweb/Geneweb__NotesDisplay/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__NotesDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb__NotesLinks/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__NotesLinks/index.html delete mode 100644 static/doc/geneweb/Geneweb__Output/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__Output/index.html delete mode 100644 static/doc/geneweb/Geneweb__Perso/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__Perso/index.html delete mode 100644 static/doc/geneweb/Geneweb__Place/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__Place/index.html delete mode 100644 static/doc/geneweb/Geneweb__PlaceDisplay/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__PlaceDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb__Relation/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__Relation/index.html delete mode 100644 static/doc/geneweb/Geneweb__RelationDisplay/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__RelationDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb__RelationLink/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__RelationLink/index.html delete mode 100644 static/doc/geneweb/Geneweb__SearchName/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__SearchName/index.html delete mode 100644 static/doc/geneweb/Geneweb__Some/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__Some/index.html delete mode 100644 static/doc/geneweb/Geneweb__SrcfileDisplay/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__SrcfileDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb__Stats/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__Stats/index.html delete mode 100644 static/doc/geneweb/Geneweb__Templ/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__Templ/index.html delete mode 100644 static/doc/geneweb/Geneweb__TemplAst/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__TemplAst/index.html delete mode 100644 static/doc/geneweb/Geneweb__TemplDate/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__TemplDate/index.html delete mode 100644 static/doc/geneweb/Geneweb__Templ_parser/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__Templ_parser/index.html delete mode 100644 static/doc/geneweb/Geneweb__Title/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__Title/index.html delete mode 100644 static/doc/geneweb/Geneweb__TitleDisplay/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__TitleDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb__Translate/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__Translate/index.html delete mode 100644 static/doc/geneweb/Geneweb__Update/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__Update/index.html delete mode 100644 static/doc/geneweb/Geneweb__UpdateData/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__UpdateData/index.html delete mode 100644 static/doc/geneweb/Geneweb__UpdateDataDisplay/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__UpdateDataDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb__UpdateFam/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__UpdateFam/index.html delete mode 100644 static/doc/geneweb/Geneweb__UpdateFamOk/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__UpdateFamOk/index.html delete mode 100644 static/doc/geneweb/Geneweb__UpdateInd/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__UpdateInd/index.html delete mode 100644 static/doc/geneweb/Geneweb__UpdateIndOk/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__UpdateIndOk/index.html delete mode 100644 static/doc/geneweb/Geneweb__Util/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__Util/index.html delete mode 100644 static/doc/geneweb/Geneweb__Version/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__Version/index.html delete mode 100644 static/doc/geneweb/Geneweb__Wiki/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__Wiki/index.html delete mode 100644 static/doc/geneweb/Geneweb__WiznotesDisplay/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb__WiznotesDisplay/index.html delete mode 100644 static/doc/geneweb/Geneweb_export/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb_export/Json_converter/Make/argument-1-D/index.html delete mode 100644 static/doc/geneweb/Geneweb_export/Json_converter/Make/index.html delete mode 100644 static/doc/geneweb/Geneweb_export/Json_converter/index.html delete mode 100644 static/doc/geneweb/Geneweb_export/Json_converter/module-type-ConverterDriver/index.html delete mode 100644 static/doc/geneweb/Geneweb_export/index.html delete mode 100644 static/doc/geneweb/Geneweb_export__Json_converter/.dune-keep delete mode 100644 static/doc/geneweb/Geneweb_export__Json_converter/index.html delete mode 100644 static/doc/geneweb/Gutil/.dune-keep delete mode 100644 static/doc/geneweb/Gutil/index.html delete mode 100644 static/doc/geneweb/Gwb2gedLib/.dune-keep delete mode 100644 static/doc/geneweb/Gwb2gedLib/index.html delete mode 100644 static/doc/geneweb/Gwd_lib/.dune-keep delete mode 100644 static/doc/geneweb/Gwd_lib/GwdLog/index.html delete mode 100644 static/doc/geneweb/Gwd_lib/GwdPlugin/index.html delete mode 100644 static/doc/geneweb/Gwd_lib/Request/index.html delete mode 100644 static/doc/geneweb/Gwd_lib/index.html delete mode 100644 static/doc/geneweb/Gwd_lib__GwdLog/.dune-keep delete mode 100644 static/doc/geneweb/Gwd_lib__GwdLog/index.html delete mode 100644 static/doc/geneweb/Gwd_lib__GwdPlugin/.dune-keep delete mode 100644 static/doc/geneweb/Gwd_lib__GwdPlugin/index.html delete mode 100644 static/doc/geneweb/Gwd_lib__Request/.dune-keep delete mode 100644 static/doc/geneweb/Gwd_lib__Request/index.html delete mode 100644 static/doc/geneweb/Gwdb/.dune-keep delete mode 100644 static/doc/geneweb/Gwdb/index.html delete mode 100644 static/doc/geneweb/Gwdb_driver/.dune-keep delete mode 100644 static/doc/geneweb/Gwdb_driver/Collection/index.html delete mode 100644 static/doc/geneweb/Gwdb_driver/Marker/index.html delete mode 100644 static/doc/geneweb/Gwdb_driver/index.html delete mode 100644 static/doc/geneweb/Gwexport/.dune-keep delete mode 100644 static/doc/geneweb/Gwexport/index.html delete mode 100644 static/doc/geneweb/GwuLib/.dune-keep delete mode 100644 static/doc/geneweb/GwuLib/index.html delete mode 100644 static/doc/geneweb/Lock/.dune-keep delete mode 100644 static/doc/geneweb/Lock/index.html delete mode 100644 static/doc/geneweb/Mutil/.dune-keep delete mode 100644 static/doc/geneweb/Mutil/index.html delete mode 100644 static/doc/geneweb/Name/.dune-keep delete mode 100644 static/doc/geneweb/Name/index.html delete mode 100644 static/doc/geneweb/Opt/.dune-keep delete mode 100644 static/doc/geneweb/Opt/index.html delete mode 100644 static/doc/geneweb/Plugin_gwxjg_lib/.dune-keep delete mode 100644 static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_data/Yojson_write/index.html delete mode 100644 static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_data/index.html delete mode 100644 static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_ezgw/Event/index.html delete mode 100644 static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_ezgw/Family/index.html delete mode 100644 static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_ezgw/Person/index.html delete mode 100644 static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_ezgw/index.html delete mode 100644 static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_lexicon_parser/index.html delete mode 100644 static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_trans/index.html delete mode 100644 static/doc/geneweb/Plugin_gwxjg_lib/index.html delete mode 100644 static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_data/.dune-keep delete mode 100644 static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_data/index.html delete mode 100644 static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_ezgw/.dune-keep delete mode 100644 static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_ezgw/index.html delete mode 100644 static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_lexicon_parser/.dune-keep delete mode 100644 static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_lexicon_parser/index.html delete mode 100644 static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_trans/.dune-keep delete mode 100644 static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_trans/index.html delete mode 100644 static/doc/geneweb/Pqueue/.dune-keep delete mode 100644 static/doc/geneweb/Pqueue/Make/argument-1-Ord/index.html delete mode 100644 static/doc/geneweb/Pqueue/Make/index.html delete mode 100644 static/doc/geneweb/Pqueue/index.html delete mode 100644 static/doc/geneweb/Pqueue/module-type-OrderedType/index.html delete mode 100644 static/doc/geneweb/Pqueue/module-type-S/index.html delete mode 100644 static/doc/geneweb/ProgrBar/.dune-keep delete mode 100644 static/doc/geneweb/ProgrBar/index.html delete mode 100644 static/doc/geneweb/Secure/.dune-keep delete mode 100644 static/doc/geneweb/Secure/index.html delete mode 100644 static/doc/geneweb/Sosa/.dune-keep delete mode 100644 static/doc/geneweb/Sosa/index.html delete mode 100644 static/doc/geneweb/Utf8/.dune-keep delete mode 100644 static/doc/geneweb/Utf8/index.html delete mode 100644 static/doc/geneweb/Wserver/.dune-keep delete mode 100644 static/doc/geneweb/Wserver/index.html delete mode 100644 static/doc/geneweb/index.html delete mode 100644 static/doc/highlight.pack.js delete mode 100644 static/doc/index.html delete mode 100644 static/doc/odoc.css diff --git a/.gitignore b/.gitignore index f9b549bd2e..4e78e7014e 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,4 @@ lib/gwlib.ml hd/etc/version.txt *~ /_opam +static/doc \ No newline at end of file diff --git a/Makefile b/Makefile index adb713c9a7..1c7f1376b0 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ DISTRIB_DIR=distribution BUILD_DIR=_build/default ODOC_DIR=$(BUILD_DIR)/_doc/_html -DOC_DIR=static +DOC_DIR=doc ###### [BEGIN] Generated files section diff --git a/static/html/.buildinfo b/doc/html/.buildinfo similarity index 100% rename from static/html/.buildinfo rename to doc/html/.buildinfo diff --git a/static/html/_images/diagram.png b/doc/html/_images/diagram.png similarity index 100% rename from static/html/_images/diagram.png rename to doc/html/_images/diagram.png diff --git a/static/html/_sources/dev-doc/binaries/bench.md.txt b/doc/html/_sources/dev-doc/binaries/bench.md.txt similarity index 100% rename from static/html/_sources/dev-doc/binaries/bench.md.txt rename to doc/html/_sources/dev-doc/binaries/bench.md.txt diff --git a/static/html/_sources/dev-doc/binaries/cgl.md.txt b/doc/html/_sources/dev-doc/binaries/cgl.md.txt similarity index 100% rename from static/html/_sources/dev-doc/binaries/cgl.md.txt rename to doc/html/_sources/dev-doc/binaries/cgl.md.txt diff --git a/static/html/_sources/dev-doc/binaries/connex.md.txt b/doc/html/_sources/dev-doc/binaries/connex.md.txt similarity index 100% rename from static/html/_sources/dev-doc/binaries/connex.md.txt rename to doc/html/_sources/dev-doc/binaries/connex.md.txt diff --git a/static/html/_sources/dev-doc/binaries/consang.md.txt b/doc/html/_sources/dev-doc/binaries/consang.md.txt similarity index 100% rename from static/html/_sources/dev-doc/binaries/consang.md.txt rename to doc/html/_sources/dev-doc/binaries/consang.md.txt diff --git a/static/html/_sources/dev-doc/binaries/export.md.txt b/doc/html/_sources/dev-doc/binaries/export.md.txt similarity index 100% rename from static/html/_sources/dev-doc/binaries/export.md.txt rename to doc/html/_sources/dev-doc/binaries/export.md.txt diff --git a/static/html/_sources/dev-doc/binaries/fixbase_plugin.md.txt b/doc/html/_sources/dev-doc/binaries/fixbase_plugin.md.txt similarity index 100% rename from static/html/_sources/dev-doc/binaries/fixbase_plugin.md.txt rename to doc/html/_sources/dev-doc/binaries/fixbase_plugin.md.txt diff --git a/static/html/_sources/dev-doc/binaries/forum.md.txt b/doc/html/_sources/dev-doc/binaries/forum.md.txt similarity index 100% rename from static/html/_sources/dev-doc/binaries/forum.md.txt rename to doc/html/_sources/dev-doc/binaries/forum.md.txt diff --git a/static/html/_sources/dev-doc/binaries/ged2gwb.md.txt b/doc/html/_sources/dev-doc/binaries/ged2gwb.md.txt similarity index 100% rename from static/html/_sources/dev-doc/binaries/ged2gwb.md.txt rename to doc/html/_sources/dev-doc/binaries/ged2gwb.md.txt diff --git a/static/html/_sources/dev-doc/binaries/gwb2ged.md.txt b/doc/html/_sources/dev-doc/binaries/gwb2ged.md.txt similarity index 100% rename from static/html/_sources/dev-doc/binaries/gwb2ged.md.txt rename to doc/html/_sources/dev-doc/binaries/gwb2ged.md.txt diff --git a/static/html/_sources/dev-doc/binaries/gwc.md.txt b/doc/html/_sources/dev-doc/binaries/gwc.md.txt similarity index 100% rename from static/html/_sources/dev-doc/binaries/gwc.md.txt rename to doc/html/_sources/dev-doc/binaries/gwc.md.txt diff --git a/static/html/_sources/dev-doc/binaries/gwd.md.txt b/doc/html/_sources/dev-doc/binaries/gwd.md.txt similarity index 100% rename from static/html/_sources/dev-doc/binaries/gwd.md.txt rename to doc/html/_sources/dev-doc/binaries/gwd.md.txt diff --git a/static/html/_sources/dev-doc/binaries/gwdiff.md.txt b/doc/html/_sources/dev-doc/binaries/gwdiff.md.txt similarity index 100% rename from static/html/_sources/dev-doc/binaries/gwdiff.md.txt rename to doc/html/_sources/dev-doc/binaries/gwdiff.md.txt diff --git a/static/html/_sources/dev-doc/binaries/gwfixbase.md.txt b/doc/html/_sources/dev-doc/binaries/gwfixbase.md.txt similarity index 100% rename from static/html/_sources/dev-doc/binaries/gwfixbase.md.txt rename to doc/html/_sources/dev-doc/binaries/gwfixbase.md.txt diff --git a/static/html/_sources/dev-doc/binaries/gwgc.md.txt b/doc/html/_sources/dev-doc/binaries/gwgc.md.txt similarity index 100% rename from static/html/_sources/dev-doc/binaries/gwgc.md.txt rename to doc/html/_sources/dev-doc/binaries/gwgc.md.txt diff --git a/static/html/_sources/dev-doc/binaries/gwrepl.md.txt b/doc/html/_sources/dev-doc/binaries/gwrepl.md.txt similarity index 100% rename from static/html/_sources/dev-doc/binaries/gwrepl.md.txt rename to doc/html/_sources/dev-doc/binaries/gwrepl.md.txt diff --git a/static/html/_sources/dev-doc/binaries/gwu.md.txt b/doc/html/_sources/dev-doc/binaries/gwu.md.txt similarity index 100% rename from static/html/_sources/dev-doc/binaries/gwu.md.txt rename to doc/html/_sources/dev-doc/binaries/gwu.md.txt diff --git a/static/html/_sources/dev-doc/binaries/gwxjg.md.txt b/doc/html/_sources/dev-doc/binaries/gwxjg.md.txt similarity index 100% rename from static/html/_sources/dev-doc/binaries/gwxjg.md.txt rename to doc/html/_sources/dev-doc/binaries/gwxjg.md.txt diff --git a/static/html/_sources/dev-doc/binaries/index.rst.txt b/doc/html/_sources/dev-doc/binaries/index.rst.txt similarity index 100% rename from static/html/_sources/dev-doc/binaries/index.rst.txt rename to doc/html/_sources/dev-doc/binaries/index.rst.txt diff --git a/static/html/_sources/dev-doc/binaries/jingoo.md.txt b/doc/html/_sources/dev-doc/binaries/jingoo.md.txt similarity index 100% rename from static/html/_sources/dev-doc/binaries/jingoo.md.txt rename to doc/html/_sources/dev-doc/binaries/jingoo.md.txt diff --git a/static/html/_sources/dev-doc/binaries/lib_show.md.txt b/doc/html/_sources/dev-doc/binaries/lib_show.md.txt similarity index 100% rename from static/html/_sources/dev-doc/binaries/lib_show.md.txt rename to doc/html/_sources/dev-doc/binaries/lib_show.md.txt diff --git a/static/html/_sources/dev-doc/binaries/no_index.md.txt b/doc/html/_sources/dev-doc/binaries/no_index.md.txt similarity index 100% rename from static/html/_sources/dev-doc/binaries/no_index.md.txt rename to doc/html/_sources/dev-doc/binaries/no_index.md.txt diff --git a/static/html/_sources/dev-doc/binaries/official_binaries.rst.txt b/doc/html/_sources/dev-doc/binaries/official_binaries.rst.txt similarity index 100% rename from static/html/_sources/dev-doc/binaries/official_binaries.rst.txt rename to doc/html/_sources/dev-doc/binaries/official_binaries.rst.txt diff --git a/static/html/_sources/dev-doc/binaries/plugins.rst.txt b/doc/html/_sources/dev-doc/binaries/plugins.rst.txt similarity index 100% rename from static/html/_sources/dev-doc/binaries/plugins.rst.txt rename to doc/html/_sources/dev-doc/binaries/plugins.rst.txt diff --git a/static/html/_sources/dev-doc/binaries/setup.md.txt b/doc/html/_sources/dev-doc/binaries/setup.md.txt similarity index 100% rename from static/html/_sources/dev-doc/binaries/setup.md.txt rename to doc/html/_sources/dev-doc/binaries/setup.md.txt diff --git a/static/html/_sources/dev-doc/binaries/test.md.txt b/doc/html/_sources/dev-doc/binaries/test.md.txt similarity index 100% rename from static/html/_sources/dev-doc/binaries/test.md.txt rename to doc/html/_sources/dev-doc/binaries/test.md.txt diff --git a/static/html/_sources/dev-doc/binaries/tests.rst.txt b/doc/html/_sources/dev-doc/binaries/tests.rst.txt similarity index 100% rename from static/html/_sources/dev-doc/binaries/tests.rst.txt rename to doc/html/_sources/dev-doc/binaries/tests.rst.txt diff --git a/static/html/_sources/dev-doc/binaries/update_nldb.md.txt b/doc/html/_sources/dev-doc/binaries/update_nldb.md.txt similarity index 100% rename from static/html/_sources/dev-doc/binaries/update_nldb.md.txt rename to doc/html/_sources/dev-doc/binaries/update_nldb.md.txt diff --git a/static/html/_sources/dev-doc/binaries/v7.md.txt b/doc/html/_sources/dev-doc/binaries/v7.md.txt similarity index 100% rename from static/html/_sources/dev-doc/binaries/v7.md.txt rename to doc/html/_sources/dev-doc/binaries/v7.md.txt diff --git a/static/html/_sources/dev-doc/binaries/v7_im.md.txt b/doc/html/_sources/dev-doc/binaries/v7_im.md.txt similarity index 100% rename from static/html/_sources/dev-doc/binaries/v7_im.md.txt rename to doc/html/_sources/dev-doc/binaries/v7_im.md.txt diff --git a/static/html/_sources/dev-doc/binaries/welcome.md.txt b/doc/html/_sources/dev-doc/binaries/welcome.md.txt similarity index 100% rename from static/html/_sources/dev-doc/binaries/welcome.md.txt rename to doc/html/_sources/dev-doc/binaries/welcome.md.txt diff --git a/static/html/_sources/dev-doc/binaries/xhtml.md.txt b/doc/html/_sources/dev-doc/binaries/xhtml.md.txt similarity index 100% rename from static/html/_sources/dev-doc/binaries/xhtml.md.txt rename to doc/html/_sources/dev-doc/binaries/xhtml.md.txt diff --git a/static/html/_sources/dev-doc/geneweb-lib/index.md.txt b/doc/html/_sources/dev-doc/geneweb-lib/index.md.txt similarity index 100% rename from static/html/_sources/dev-doc/geneweb-lib/index.md.txt rename to doc/html/_sources/dev-doc/geneweb-lib/index.md.txt diff --git a/static/html/_sources/dev-doc/index.rst.txt b/doc/html/_sources/dev-doc/index.rst.txt similarity index 100% rename from static/html/_sources/dev-doc/index.rst.txt rename to doc/html/_sources/dev-doc/index.rst.txt diff --git a/static/html/_sources/dev-doc/installation/build-system.md.txt b/doc/html/_sources/dev-doc/installation/build-system.md.txt similarity index 100% rename from static/html/_sources/dev-doc/installation/build-system.md.txt rename to doc/html/_sources/dev-doc/installation/build-system.md.txt diff --git a/static/html/_sources/dev-doc/installation/index.md.txt b/doc/html/_sources/dev-doc/installation/index.md.txt similarity index 100% rename from static/html/_sources/dev-doc/installation/index.md.txt rename to doc/html/_sources/dev-doc/installation/index.md.txt diff --git a/static/html/_sources/dev-doc/overview/database.md.txt b/doc/html/_sources/dev-doc/overview/database.md.txt similarity index 100% rename from static/html/_sources/dev-doc/overview/database.md.txt rename to doc/html/_sources/dev-doc/overview/database.md.txt diff --git a/static/html/_sources/dev-doc/overview/index.rst.txt b/doc/html/_sources/dev-doc/overview/index.rst.txt similarity index 100% rename from static/html/_sources/dev-doc/overview/index.rst.txt rename to doc/html/_sources/dev-doc/overview/index.rst.txt diff --git a/static/html/_sources/index.rst.txt b/doc/html/_sources/index.rst.txt similarity index 100% rename from static/html/_sources/index.rst.txt rename to doc/html/_sources/index.rst.txt diff --git a/static/html/_static/alabaster.css b/doc/html/_static/alabaster.css similarity index 100% rename from static/html/_static/alabaster.css rename to doc/html/_static/alabaster.css diff --git a/static/html/_static/basic.css b/doc/html/_static/basic.css similarity index 100% rename from static/html/_static/basic.css rename to doc/html/_static/basic.css diff --git a/static/html/_static/custom.css b/doc/html/_static/custom.css similarity index 100% rename from static/html/_static/custom.css rename to doc/html/_static/custom.css diff --git a/static/html/_static/doctools.js b/doc/html/_static/doctools.js similarity index 100% rename from static/html/_static/doctools.js rename to doc/html/_static/doctools.js diff --git a/static/html/_static/documentation_options.js b/doc/html/_static/documentation_options.js similarity index 100% rename from static/html/_static/documentation_options.js rename to doc/html/_static/documentation_options.js diff --git a/static/html/_static/file.png b/doc/html/_static/file.png similarity index 100% rename from static/html/_static/file.png rename to doc/html/_static/file.png diff --git a/static/html/_static/jquery-3.5.1.js b/doc/html/_static/jquery-3.5.1.js similarity index 100% rename from static/html/_static/jquery-3.5.1.js rename to doc/html/_static/jquery-3.5.1.js diff --git a/static/html/_static/jquery.js b/doc/html/_static/jquery.js similarity index 100% rename from static/html/_static/jquery.js rename to doc/html/_static/jquery.js diff --git a/static/html/_static/language_data.js b/doc/html/_static/language_data.js similarity index 100% rename from static/html/_static/language_data.js rename to doc/html/_static/language_data.js diff --git a/static/html/_static/minus.png b/doc/html/_static/minus.png similarity index 100% rename from static/html/_static/minus.png rename to doc/html/_static/minus.png diff --git a/static/html/_static/plus.png b/doc/html/_static/plus.png similarity index 100% rename from static/html/_static/plus.png rename to doc/html/_static/plus.png diff --git a/static/html/_static/pygments.css b/doc/html/_static/pygments.css similarity index 100% rename from static/html/_static/pygments.css rename to doc/html/_static/pygments.css diff --git a/static/html/_static/searchtools.js b/doc/html/_static/searchtools.js similarity index 100% rename from static/html/_static/searchtools.js rename to doc/html/_static/searchtools.js diff --git a/static/html/_static/underscore-1.12.0.js b/doc/html/_static/underscore-1.12.0.js similarity index 100% rename from static/html/_static/underscore-1.12.0.js rename to doc/html/_static/underscore-1.12.0.js diff --git a/static/html/_static/underscore.js b/doc/html/_static/underscore.js similarity index 100% rename from static/html/_static/underscore.js rename to doc/html/_static/underscore.js diff --git a/static/html/dev-doc/binaries/bench.html b/doc/html/dev-doc/binaries/bench.html similarity index 100% rename from static/html/dev-doc/binaries/bench.html rename to doc/html/dev-doc/binaries/bench.html diff --git a/static/html/dev-doc/binaries/cgl.html b/doc/html/dev-doc/binaries/cgl.html similarity index 100% rename from static/html/dev-doc/binaries/cgl.html rename to doc/html/dev-doc/binaries/cgl.html diff --git a/static/html/dev-doc/binaries/connex.html b/doc/html/dev-doc/binaries/connex.html similarity index 100% rename from static/html/dev-doc/binaries/connex.html rename to doc/html/dev-doc/binaries/connex.html diff --git a/static/html/dev-doc/binaries/consang.html b/doc/html/dev-doc/binaries/consang.html similarity index 100% rename from static/html/dev-doc/binaries/consang.html rename to doc/html/dev-doc/binaries/consang.html diff --git a/static/html/dev-doc/binaries/export.html b/doc/html/dev-doc/binaries/export.html similarity index 100% rename from static/html/dev-doc/binaries/export.html rename to doc/html/dev-doc/binaries/export.html diff --git a/static/html/dev-doc/binaries/fixbase_plugin.html b/doc/html/dev-doc/binaries/fixbase_plugin.html similarity index 100% rename from static/html/dev-doc/binaries/fixbase_plugin.html rename to doc/html/dev-doc/binaries/fixbase_plugin.html diff --git a/static/html/dev-doc/binaries/forum.html b/doc/html/dev-doc/binaries/forum.html similarity index 100% rename from static/html/dev-doc/binaries/forum.html rename to doc/html/dev-doc/binaries/forum.html diff --git a/static/html/dev-doc/binaries/ged2gwb.html b/doc/html/dev-doc/binaries/ged2gwb.html similarity index 100% rename from static/html/dev-doc/binaries/ged2gwb.html rename to doc/html/dev-doc/binaries/ged2gwb.html diff --git a/static/html/dev-doc/binaries/gwb2ged.html b/doc/html/dev-doc/binaries/gwb2ged.html similarity index 100% rename from static/html/dev-doc/binaries/gwb2ged.html rename to doc/html/dev-doc/binaries/gwb2ged.html diff --git a/static/html/dev-doc/binaries/gwc.html b/doc/html/dev-doc/binaries/gwc.html similarity index 100% rename from static/html/dev-doc/binaries/gwc.html rename to doc/html/dev-doc/binaries/gwc.html diff --git a/static/html/dev-doc/binaries/gwd.html b/doc/html/dev-doc/binaries/gwd.html similarity index 100% rename from static/html/dev-doc/binaries/gwd.html rename to doc/html/dev-doc/binaries/gwd.html diff --git a/static/html/dev-doc/binaries/gwdiff.html b/doc/html/dev-doc/binaries/gwdiff.html similarity index 100% rename from static/html/dev-doc/binaries/gwdiff.html rename to doc/html/dev-doc/binaries/gwdiff.html diff --git a/static/html/dev-doc/binaries/gwfixbase.html b/doc/html/dev-doc/binaries/gwfixbase.html similarity index 100% rename from static/html/dev-doc/binaries/gwfixbase.html rename to doc/html/dev-doc/binaries/gwfixbase.html diff --git a/static/html/dev-doc/binaries/gwgc.html b/doc/html/dev-doc/binaries/gwgc.html similarity index 100% rename from static/html/dev-doc/binaries/gwgc.html rename to doc/html/dev-doc/binaries/gwgc.html diff --git a/static/html/dev-doc/binaries/gwrepl.html b/doc/html/dev-doc/binaries/gwrepl.html similarity index 100% rename from static/html/dev-doc/binaries/gwrepl.html rename to doc/html/dev-doc/binaries/gwrepl.html diff --git a/static/html/dev-doc/binaries/gwu.html b/doc/html/dev-doc/binaries/gwu.html similarity index 100% rename from static/html/dev-doc/binaries/gwu.html rename to doc/html/dev-doc/binaries/gwu.html diff --git a/static/html/dev-doc/binaries/gwxjg.html b/doc/html/dev-doc/binaries/gwxjg.html similarity index 100% rename from static/html/dev-doc/binaries/gwxjg.html rename to doc/html/dev-doc/binaries/gwxjg.html diff --git a/static/html/dev-doc/binaries/index.html b/doc/html/dev-doc/binaries/index.html similarity index 100% rename from static/html/dev-doc/binaries/index.html rename to doc/html/dev-doc/binaries/index.html diff --git a/static/html/dev-doc/binaries/jingoo.html b/doc/html/dev-doc/binaries/jingoo.html similarity index 100% rename from static/html/dev-doc/binaries/jingoo.html rename to doc/html/dev-doc/binaries/jingoo.html diff --git a/static/html/dev-doc/binaries/lib_show.html b/doc/html/dev-doc/binaries/lib_show.html similarity index 100% rename from static/html/dev-doc/binaries/lib_show.html rename to doc/html/dev-doc/binaries/lib_show.html diff --git a/static/html/dev-doc/binaries/no_index.html b/doc/html/dev-doc/binaries/no_index.html similarity index 100% rename from static/html/dev-doc/binaries/no_index.html rename to doc/html/dev-doc/binaries/no_index.html diff --git a/static/html/dev-doc/binaries/official_binaries.html b/doc/html/dev-doc/binaries/official_binaries.html similarity index 100% rename from static/html/dev-doc/binaries/official_binaries.html rename to doc/html/dev-doc/binaries/official_binaries.html diff --git a/static/html/dev-doc/binaries/plugins.html b/doc/html/dev-doc/binaries/plugins.html similarity index 100% rename from static/html/dev-doc/binaries/plugins.html rename to doc/html/dev-doc/binaries/plugins.html diff --git a/static/html/dev-doc/binaries/setup.html b/doc/html/dev-doc/binaries/setup.html similarity index 100% rename from static/html/dev-doc/binaries/setup.html rename to doc/html/dev-doc/binaries/setup.html diff --git a/static/html/dev-doc/binaries/test.html b/doc/html/dev-doc/binaries/test.html similarity index 100% rename from static/html/dev-doc/binaries/test.html rename to doc/html/dev-doc/binaries/test.html diff --git a/static/html/dev-doc/binaries/tests.html b/doc/html/dev-doc/binaries/tests.html similarity index 100% rename from static/html/dev-doc/binaries/tests.html rename to doc/html/dev-doc/binaries/tests.html diff --git a/static/html/dev-doc/binaries/update_nldb.html b/doc/html/dev-doc/binaries/update_nldb.html similarity index 100% rename from static/html/dev-doc/binaries/update_nldb.html rename to doc/html/dev-doc/binaries/update_nldb.html diff --git a/static/html/dev-doc/binaries/v7.html b/doc/html/dev-doc/binaries/v7.html similarity index 100% rename from static/html/dev-doc/binaries/v7.html rename to doc/html/dev-doc/binaries/v7.html diff --git a/static/html/dev-doc/binaries/v7_im.html b/doc/html/dev-doc/binaries/v7_im.html similarity index 100% rename from static/html/dev-doc/binaries/v7_im.html rename to doc/html/dev-doc/binaries/v7_im.html diff --git a/static/html/dev-doc/binaries/welcome.html b/doc/html/dev-doc/binaries/welcome.html similarity index 100% rename from static/html/dev-doc/binaries/welcome.html rename to doc/html/dev-doc/binaries/welcome.html diff --git a/static/html/dev-doc/binaries/xhtml.html b/doc/html/dev-doc/binaries/xhtml.html similarity index 100% rename from static/html/dev-doc/binaries/xhtml.html rename to doc/html/dev-doc/binaries/xhtml.html diff --git a/static/html/dev-doc/index.html b/doc/html/dev-doc/index.html similarity index 100% rename from static/html/dev-doc/index.html rename to doc/html/dev-doc/index.html diff --git a/static/html/dev-doc/installation/build-system.html b/doc/html/dev-doc/installation/build-system.html similarity index 100% rename from static/html/dev-doc/installation/build-system.html rename to doc/html/dev-doc/installation/build-system.html diff --git a/static/html/dev-doc/installation/index.html b/doc/html/dev-doc/installation/index.html similarity index 100% rename from static/html/dev-doc/installation/index.html rename to doc/html/dev-doc/installation/index.html diff --git a/static/html/dev-doc/overview/database.html b/doc/html/dev-doc/overview/database.html similarity index 100% rename from static/html/dev-doc/overview/database.html rename to doc/html/dev-doc/overview/database.html diff --git a/static/html/dev-doc/overview/index.html b/doc/html/dev-doc/overview/index.html similarity index 100% rename from static/html/dev-doc/overview/index.html rename to doc/html/dev-doc/overview/index.html diff --git a/static/html/genindex.html b/doc/html/genindex.html similarity index 100% rename from static/html/genindex.html rename to doc/html/genindex.html diff --git a/static/html/objects.inv b/doc/html/objects.inv similarity index 100% rename from static/html/objects.inv rename to doc/html/objects.inv diff --git a/static/html/search.html b/doc/html/search.html similarity index 100% rename from static/html/search.html rename to doc/html/search.html diff --git a/static/html/searchindex.js b/doc/html/searchindex.js similarity index 100% rename from static/html/searchindex.js rename to doc/html/searchindex.js diff --git a/static/doc/geneweb/Adef/.dune-keep b/static/doc/geneweb/Adef/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Adef/index.html b/static/doc/geneweb/Adef/index.html deleted file mode 100644 index f0758b6d14..0000000000 --- a/static/doc/geneweb/Adef/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Adef (geneweb.Adef)

      Module Adef

      type fix

      Consanguinity rate

      val float_of_fix : fix -> float

      Returns float coefficient of consanguinity rate

      val fix_of_float : float -> fix

      Returns consanguinity rate from its float coefficient

      val fix : int -> fix

      fix from int

      val fix_repr : fix -> int

      fix to int

      val no_consang : fix

      No consanguinity

      type date =
      | Dgreg of dmy * calendar
      | Dtext of string

      Date data type that can be either concrete date associated to a calendar or a textual form of the date.

      and calendar =
      | Dgregorian
      | Djulian
      | Dfrench
      | Dhebrew

      Supported calendars

      and dmy = {
      day : int;
      month : int;
      year : int;
      prec : precision;
      delta : int;
      }

      Concrete date with precision.

      and dmy2 = {
      day2 : int;
      month2 : int;
      year2 : int;
      delta2 : int;
      }

      Concrete date without precision.

      and precision =
      | Sure
      | About
      | Maybe
      | Before
      | After
      | OrYear of dmy2
      | YearInt of dmy2

      Precision attached to the concrete date.

      type cdate

      Compressed date

      val date_of_cdate : cdate -> date

      Convert cdate to date

      val cdate_of_date : date -> cdate

      Convert date to cdate

      val cdate_None : cdate

      Absent compressed date

      val od_of_cdate : cdate -> date option

      Optional date from cdate

      val cdate_of_od : date option -> cdate

      Optional date to cdate

      type 'person gen_couple

      Polymorphic type to represent a family's couple. Couple consists of the father and of the mother.

      val father : 'a gen_couple -> 'a

      Get father from couple

      val mother : 'a gen_couple -> 'a

      Get mother from couple

      val couple : 'a -> 'a -> 'a gen_couple

      couple f m creates a couple from father f and mother m

      val parent : 'a array -> 'a gen_couple

      Create gen_couple from array. First element of array should be father, second - mother

      val parent_array : 'a gen_couple -> 'a array

      Returns array from gen_couple. First element of array is father, second - mother

      val multi_couple : 'a -> 'a -> 'a gen_couple
      • deprecated

        Use couple instead

      val multi_parent : 'a array -> 'a gen_couple
      • deprecated

        Use parent instead

      \ No newline at end of file diff --git a/static/doc/geneweb/Buff/.dune-keep b/static/doc/geneweb/Buff/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Buff/Make/index.html b/static/doc/geneweb/Buff/Make/index.html deleted file mode 100644 index 326b5c8c80..0000000000 --- a/static/doc/geneweb/Buff/Make/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Make (geneweb.Buff.Make)

      Module Buff.Make

      Functor building a local implementation of the buffer.

      Parameters

      Signature

      val buff : bytes Stdlib.ref

      Internal representation of the buffer

      val store : int -> char -> int

      store i c stores a character c at the position i inside the buffer. Automatically extends buffer if needed. Returns the position that follows inserted character (i+1) in buffer. Should be used either with position 0 or with position returned by previous calls of store functions.

      val mstore : int -> string -> int

      mstore i s stores a string s starting from the postion i inside the buffer. Automatically extends buffer if needed. Returns the position that follows inserted string in buffer. Should be used either with position 0 or with position returned by previous calls of store functions.

      val gstore : int -> string -> int -> int -> int

      gstore i s si len stores substring of s from si position with length len inside the buffer starting from the postion i. Automatically extends buffer if needed. Returns the position that follows inserted substring in buffer. Should be used either with position 0 or with position returned by previous calls of store functions.

      val get : int -> string

      get len returns buffer's content until position len

      \ No newline at end of file diff --git a/static/doc/geneweb/Buff/index.html b/static/doc/geneweb/Buff/index.html deleted file mode 100644 index 7ec14ff526..0000000000 --- a/static/doc/geneweb/Buff/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Buff (geneweb.Buff)

      Module Buff

      module Make () : sig ... end

      Functor building a local implementation of the buffer.

      val buff : bytes Stdlib.ref

      Variable buff for the global buffer

      val get : int -> string

      Function get for the global buffer.

      val store : int -> char -> int

      Function store for the global buffer.

      val mstore : int -> string -> int

      Function mstore for the global buffer.

      val gstore : int -> string -> int -> int -> int

      Function gstore for the global buffer.

      \ No newline at end of file diff --git a/static/doc/geneweb/Calendar/.dune-keep b/static/doc/geneweb/Calendar/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Calendar/index.html b/static/doc/geneweb/Calendar/index.html deleted file mode 100644 index bd6e619b95..0000000000 --- a/static/doc/geneweb/Calendar/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Calendar (geneweb.Calendar)

      Module Calendar

      val gregorian_of_sdn : Def.precision -> int -> Def.dmy

      Returns date of gregorian calendar from SDN and specified precision.

      val julian_of_sdn : Def.precision -> int -> Def.dmy

      Returns date of julian calendar from SDN and specified precision.

      val french_of_sdn : Def.precision -> int -> Def.dmy

      Returns date of french calendar from SDN and specified precision.

      val hebrew_of_sdn : Def.precision -> int -> Def.dmy

      Returns date of hebrew calendar from SDN and specified precision.

      val sdn_of_gregorian : Def.dmy -> int

      Returns SDN of the date of gregorian calendar.

      val sdn_of_julian : Def.dmy -> int

      Returns SDN of the date of julian calendar.

      val sdn_of_french : Def.dmy -> int

      Returns SDN of the date of french calendar.

      val sdn_of_hebrew : Def.dmy -> int

      Returns SDN of the date of hebrew calendar.

      val gregorian_of_julian : Def.dmy -> Def.dmy

      Converts julian calendar's date to gregorian.

      val julian_of_gregorian : Def.dmy -> Def.dmy

      Converts gregorian calendar's date to julian date.

      val gregorian_of_french : Def.dmy -> Def.dmy

      Converts french calendar's date to gregorian date.

      val french_of_gregorian : Def.dmy -> Def.dmy

      Converts gregorian calendar's date to french date.

      val gregorian_of_hebrew : Def.dmy -> Def.dmy

      Converts hebrew calendar's date to gregorian date.

      val hebrew_of_gregorian : Def.dmy -> Def.dmy

      Converts gregorian calendar's date to hebrew date.

      type moon_phase =
      | NewMoon
      | FirstQuarter
      | FullMoon
      | LastQuarter

      Moon phases

      val moon_phase_of_sdn : int -> (moon_phase * int * int) option * int

      Returns information about moon phase from the given SDN. Result (Some (mph,h,m), day) describes moon phase mph, hour h and minute m when this phase appears and days day since last New Moon phase (moon's age). If result is (None,_), it tells that there wasn't any moon's phase (one of the mentionned in moon_phase) this day.

      \ No newline at end of file diff --git a/static/doc/geneweb/Consang/.dune-keep b/static/doc/geneweb/Consang/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Consang/index.html b/static/doc/geneweb/Consang/index.html deleted file mode 100644 index fa00ab7b14..0000000000 --- a/static/doc/geneweb/Consang/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Consang (geneweb.Consang)

      Module Consang

      type anc_stat

      Relation with ancestor status

      type relationship = {
      mutable weight1 : float;
      mutable weight2 : float;
      mutable relationship : float;
      mutable lens1 : (int * int * Gwdb.iper list) list;
      mutable lens2 : (int * int * Gwdb.iper list) list;
      mutable inserted : int;
      mutable elim_ancestors : bool;
      mutable anc_stat1 : anc_stat;
      mutable anc_stat2 : anc_stat;
      }

      Consanguinity information attached to person (relationship between parents)

      type relationship_info = {
      tstab : (Gwdb.iper, int) Gwdb.Marker.t;
      reltab : (Gwdb.iperrelationship) Gwdb.Marker.t;
      mutable queue : Gwdb.iper list array;
      }

      Computation consanguinity state for every person in the base

      exception TopologicalSortError of Gwdb.person

      Error that could occure while topological sorting, and raised when person is ancestor of himself.

      val topological_sort : Gwdb.base -> (Gwdb.base -> Gwdb.iper -> Gwdb.person) -> (Gwdb.iper, int) Gwdb.Marker.t

      Returns result of topological sort of persons. Result is represented as marker that associates to every person in the base his topologic rank (let's suppose r). Global rule is : if person p1 is ancestor of p2 then r(p1) > r(p2). For example, all leaf persons (without children) have rank 0, their parents (if no another child that has child themself) - rank 1, parents of their parents - rank 2, etc. Raises TopologicalSortError if person is directly or undirectly is ancestor of himself (cycle).

      val make_relationship_info : Gwdb.base -> (Gwdb.iper, int) Gwdb.Marker.t -> relationship_info

      Initialise relationship info.

      val check_noloop : Gwdb.base -> (Gwdb.person Def.error -> unit) -> unit

      check_noloop base onerror scans database person's oriented graph (vertex is a person and edge is parenthood from child to parent). If cycle is found (person is directly or undirectly is ancestor of himself) calls onerror with OwnAncestor error. Array of ascendants should be load in the memory.

      val check_noloop_for_person_list : Gwdb.base -> (Gwdb.person Def.error -> unit) -> Gwdb.iper list -> unit

      Same as check_noloop but scans only specified list of persons and their ancestors instead of entire database.

      \ No newline at end of file diff --git a/static/doc/geneweb/ConsangAll/.dune-keep b/static/doc/geneweb/ConsangAll/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/ConsangAll/index.html b/static/doc/geneweb/ConsangAll/index.html deleted file mode 100644 index 07e754611a..0000000000 --- a/static/doc/geneweb/ConsangAll/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -ConsangAll (geneweb.ConsangAll)

      Module ConsangAll

      val compute : ?verbosity:int -> Gwdb.base -> bool -> bool

      compute base from_scratch ?verbosity may be 0, 1 or 2 (default is 2) Compute consanguinity for each person in the base. If from_scratch is set then recompute consanguinity for entire database. Return true if base has been patched, false otherwise.

      \ No newline at end of file diff --git a/static/doc/geneweb/Date/.dune-keep b/static/doc/geneweb/Date/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Date/index.html b/static/doc/geneweb/Date/index.html deleted file mode 100644 index b26cdf40f2..0000000000 --- a/static/doc/geneweb/Date/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Date (geneweb.Date)

      Module Date

      val leap_year : int -> bool

      Says if the given year is a leap year.

      val nb_days_in_month : int -> int -> int

      Returns number of days for the given month and year for gregorian calendar. Takes into account leap years.

      val time_elapsed : Def.dmy -> Def.dmy -> Def.dmy

      time_elapsed start stop Compute the time elapsed between start and stop. If stop is prior to start, resulting dmy's field are negative (but correct). Resulting prec can be:

      • Sure for exact duration
      • Before for "less than" duration
      • After for "more than" duration
      • Maybe for other cases Used to compare only gregorian calendar's dates.
      val time_elapsed_opt : Def.dmy -> Def.dmy -> Def.dmy option

      Same as time_elapsed, but will return None if computation is not possible (e.g. time_elapsed_opt /1839 /1859).

      val date_of_death : Def.death -> Adef.date option

      Returns date of death if present.

      val dmy_of_dmy2 : Def.dmy2 -> Def.dmy

      dmy_of_dmy2 dmy2 Convert a dmy2 to dmy using Sure as precision.

      exception Not_comparable

      Not_comparable is raised by compare_dmy and compare_date when strict mode is used and precision of dates are incompatibles to have a reliable result (e.g. is compare_dmy 2019 07/2019) or when one of the date in compare_date is Dtext.

      val compare_dmy : ?strict:bool -> Def.dmy -> Def.dmy -> int

      compare_dmy ?strict d1 d2 Return a negative integer if d1 is prior to d2, 0 if d1 is equal to d2, and a positive integer if d2 is prior to d1. strict parameter enable or disable strict mode, and is false by default (see Not_comparable)

      val compare_dmy_opt : ?strict:bool -> Def.dmy -> Def.dmy -> int option

      compare_dmy_opt ?strict d1 d2 Same as compare_dmy, but do not raise an exception

      val compare_date : ?strict:bool -> Def.date -> Def.date -> int

      compare_date d1 d2 If both d1 and d2 are Dgreg date, uses compare_dmy to compare them. Dtext dates are always considered prior to any Dgreg date, and equal to any other Dtext date. strict parameter enable or disable strict mode, and is false by default (see Not_comparable)

      \ No newline at end of file diff --git a/static/doc/geneweb/Def/.dune-keep b/static/doc/geneweb/Def/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Def/NLDB/index.html b/static/doc/geneweb/Def/NLDB/index.html deleted file mode 100644 index fa58189e9f..0000000000 --- a/static/doc/geneweb/Def/NLDB/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -NLDB (geneweb.Def.NLDB)

      Module Def.NLDB

      TODOOCP : doc

      type ('a, 'b) page =
      | PgInd of 'a
      | PgFam of 'b
      | PgNotes
      | PgMisc of string
      | PgWizard of string
      type key = string * string * int
      type ind = {
      lnTxt : string option;
      lnPos : int;
      }
      type ('a, 'b) t = (('a'b) page * (string list * (key * ind) list)) list
      \ No newline at end of file diff --git a/static/doc/geneweb/Def/index.html b/static/doc/geneweb/Def/index.html deleted file mode 100644 index 2e6fd2454f..0000000000 --- a/static/doc/geneweb/Def/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Def (geneweb.Def)

      Module Def

      type httpStatus =
      | OK
      | Moved_Temporarily
      | Bad_Request
      | Unauthorized
      | Forbidden
      | Not_Found
      | Conflict
      | Internal_Server_Error
      | Service_Unavailable

      Http response status

      type ('a, 'b) choice =
      | Left of 'a
      | Right of 'b

      Type that represents 2 possible choices

      type cdate = Adef.cdate

      Alias to Adef.cdate

      type date = Adef.date =
      | Dgreg of dmy * calendar
      | Dtext of string

      Alias to Adef.date

      and calendar = Adef.calendar =
      | Dgregorian
      | Djulian
      | Dfrench
      | Dhebrew

      Alias to Adef.calendar

      and dmy = Adef.dmy = {
      day : int;
      month : int;
      year : int;
      prec : precision;
      delta : int;
      }

      Alias to Adef.dmy

      and dmy2 = Adef.dmy2 = {
      day2 : int;
      month2 : int;
      year2 : int;
      delta2 : int;
      }

      Alias to Adef.dmy2

      and precision = Adef.precision =
      | Sure
      | About
      | Maybe
      | Before
      | After
      | OrYear of dmy2
      | YearInt of dmy2

      Alias to Adef.precision

      type relation_kind =
      | Married
      | NotMarried
      | Engaged
      | NoSexesCheckNotMarried
      | NoMention
      | NoSexesCheckMarried
      | MarriageBann
      | MarriageContract
      | MarriageLicense
      | Pacs
      | Residence

      Relation kind between couple in the family

      type divorce =
      | NotDivorced
      | Divorced of cdate
      | Separated

      Divorce status

      type death_reason =
      | Killed
      | Murdered
      | Executed
      | Disappeared
      | Unspecified

      Death reason

      type death =
      | NotDead
      | Death of death_reason * cdate
      | DeadYoung
      | DeadDontKnowWhen
      | DontKnowIfDead
      | OfCourseDead

      Death status

      type burial =
      | UnknownBurial
      | Buried of cdate
      | Cremated of cdate

      Burial information

      type access =
      | IfTitles
      | Public
      | Private

      Rights for access to the personal data

      type 'string gen_title_name =
      | Tmain
      | Tname of 'string
      | Tnone

      Title name

      type 'string gen_title = {
      t_name : 'string gen_title_name;
      t_ident : 'string;
      t_place : 'string;
      t_date_start : cdate;
      t_date_end : cdate;
      t_nth : int;
      }

      Type that represents information about nobility title of a person

      type witness_kind =
      | Witness
      | Witness_GodParent
      | Witness_Officer

      Witness kind for an event

      type 'string gen_pers_event_name =
      | Epers_Birth
      | Epers_Baptism
      | Epers_Death
      | Epers_Burial
      | Epers_Cremation
      | Epers_Accomplishment
      | Epers_Acquisition
      | Epers_Adhesion
      | Epers_BaptismLDS
      | Epers_BarMitzvah
      | Epers_BatMitzvah
      | Epers_Benediction
      | Epers_ChangeName
      | Epers_Circumcision
      | Epers_Confirmation
      | Epers_ConfirmationLDS
      | Epers_Decoration
      | Epers_DemobilisationMilitaire
      | Epers_Diploma
      | Epers_Distinction
      | Epers_Dotation
      | Epers_DotationLDS
      | Epers_Education
      | Epers_Election
      | Epers_Emigration
      | Epers_Excommunication
      | Epers_FamilyLinkLDS
      | Epers_FirstCommunion
      | Epers_Funeral
      | Epers_Graduate
      | Epers_Hospitalisation
      | Epers_Illness
      | Epers_Immigration
      | Epers_ListePassenger
      | Epers_MilitaryDistinction
      | Epers_MilitaryPromotion
      | Epers_MilitaryService
      | Epers_MobilisationMilitaire
      | Epers_Naturalisation
      | Epers_Occupation
      | Epers_Ordination
      | Epers_Property
      | Epers_Recensement
      | Epers_Residence
      | Epers_Retired
      | Epers_ScellentChildLDS
      | Epers_ScellentParentLDS
      | Epers_ScellentSpouseLDS
      | Epers_VenteBien
      | Epers_Will
      | Epers_Name of 'string

      Personal event name.

      type ('person, 'string) gen_pers_event = {
      epers_name : 'string gen_pers_event_name;
      epers_date : cdate;
      epers_place : 'string;
      epers_reason : 'string;
      epers_note : 'string;
      epers_src : 'string;
      epers_witnesses : ('person * witness_kind) array;
      }

      Personal event information

      type 'string gen_fam_event_name =
      | Efam_Marriage
      | Efam_NoMarriage
      | Efam_NoMention
      | Efam_Engage
      | Efam_Divorce
      | Efam_Separated
      | Efam_Annulation
      | Efam_MarriageBann
      | Efam_MarriageContract
      | Efam_MarriageLicense
      | Efam_PACS
      | Efam_Residence
      | Efam_Name of 'string

      Event name pertaining a family.

      type ('person, 'string) gen_fam_event = {
      efam_name : 'string gen_fam_event_name;
      efam_date : cdate;
      efam_place : 'string;
      efam_reason : 'string;
      efam_note : 'string;
      efam_src : 'string;
      efam_witnesses : ('person * witness_kind) array;
      }

      Event information pertaining a family.

      type relation_type =
      | Adoption
      | Recognition
      | CandidateParent
      | GodParent
      | FosterParent

      Relation type with parent (if not native)

      type ('person, 'string) gen_relation = {
      r_type : relation_type;
      r_fath : 'person option;
      r_moth : 'person option;
      r_sources : 'string;
      }

      Relation information with parents (if not native)

      type sex =
      | Male
      | Female
      | Neuter

      Sex of person

      type place = {
      other : string;
      town : string;
      township : string;
      canton : string;
      district : string;
      county : string;
      region : string;
      country : string;
      }

      Place information

      type ('iper, 'person, 'string) gen_person = {
      first_name : 'string;
      surname : 'string;
      occ : int;
      image : 'string;
      public_name : 'string;
      qualifiers : 'string list;
      aliases : 'string list;
      first_names_aliases : 'string list;
      surnames_aliases : 'string list;
      titles : 'string gen_title list;
      rparents : ('person'string) gen_relation list;
      related : 'person list;
      occupation : 'string;
      sex : sex;
      access : access;
      birth : cdate;
      birth_place : 'string;
      birth_note : 'string;
      birth_src : 'string;
      baptism : cdate;
      baptism_place : 'string;
      baptism_note : 'string;
      baptism_src : 'string;
      death : death;
      death_place : 'string;
      death_note : 'string;
      death_src : 'string;
      burial : burial;
      burial_place : 'string;
      burial_note : 'string;
      burial_src : 'string;
      pevents : ('person'string) gen_pers_event list;
      notes : 'string;
      psources : 'string;
      key_index : 'iper;
      }

      Polymorphic type describing information about person.

      type 'family gen_ascend = {
      parents : 'family option;
      consang : Adef.fix;
      }

      Person's ascendants (family where he is a childran) with its consangunity rate (equal to relationship betwen his parents).

      type 'family gen_union = {
      family : 'family array;
      }
      type 'person gen_descend = {
      children : 'person array;
      }

      Children of the family

      type ('person, 'ifam, 'string) gen_family = {
      marriage : cdate;
      marriage_place : 'string;
      marriage_note : 'string;
      marriage_src : 'string;
      witnesses : 'person array;
      relation : relation_kind;
      divorce : divorce;
      fevents : ('person'string) gen_fam_event list;
      comment : 'string;
      origin_file : 'string;
      fsources : 'string;
      fam_index : 'ifam;
      }

      Polymorphic type describing information about family.

      type 'person gen_couple = 'person Adef.gen_couple

      Alias to Adef.gen_couple

      type 'person error =
      | AlreadyDefined of 'person
      | OwnAncestor of 'person(*

      Person is his own ancestor

      *)
      | BadSexOfMarriedPerson of 'person

      Database errors describing bad specification of the person

      type ('iper, 'person, 'family, 'descend, 'title, 'pevent, 'fevent) warning =
      | BigAgeBetweenSpouses of 'person * 'person * dmy
      | BirthAfterDeath of 'person(*

      Person is born after his death

      *)
      | IncoherentSex of 'person * int * int(*

      Incoherent sex of person

      *)
      | ChangedOrderOfChildren of 'family * 'descend * 'iper array * 'iper array(*

      Children order has been modified

      *)
      | ChangedOrderOfMarriages of 'person * 'family array * 'family array(*

      Person's marriages order has been modified

      *)
      | ChangedOrderOfFamilyEvents of 'family * 'fevent list * 'fevent list(*

      Family's events order has been modified

      *)
      | ChangedOrderOfPersonEvents of 'person * 'pevent list * 'pevent list(*

      Person's events order has been modified

      *)
      | ChildrenNotInOrder of 'family * 'descend * 'person * 'person(*

      Children aren't ordered

      *)
      | CloseChildren of 'family * 'person * 'person(*

      Age difference between two child is less then 7 month (except for twins)

      *)
      | DeadOld of 'person * dmy(*

      Dead old (at the age older then 109 after 1900 year and older then 100 before)

      *)
      | DeadTooEarlyToBeFather of 'person * 'person(*

      Childran is born in more then 1 year after his father's death

      *)
      | DistantChildren of 'family * 'person * 'person(*

      Age gap between two of siblings greater then 50 years

      *)
      | FEventOrder of 'person * 'fevent * 'fevent(*

      Familial events haven't been ordered correctly

      *)
      | FWitnessEventAfterDeath of 'person * 'fevent * 'family(*

      Witness is dead before familial event date

      *)
      | FWitnessEventBeforeBirth of 'person * 'fevent * 'family(*

      Witness is born after familial event date

      *)
      | IncoherentAncestorDate of 'person * 'person(*

      Ancestor is born after person's birth

      *)
      | MarriageDateAfterDeath of 'person(*

      Person is married after his death

      *)
      | MarriageDateBeforeBirth of 'person(*

      Person is married before his birth

      *)
      | MotherDeadBeforeChildBirth of 'person * 'person(*

      Childran is born after his mother's death

      *)
      | ParentBornAfterChild of 'person * 'person(*

      Parent is born after one of his childran

      *)
      | ParentTooOld of 'person * dmy * 'person(*

      Person became a parent at age older then 55 years for mother and 70 for father

      *)
      | ParentTooYoung of 'person * dmy * 'person(*

      Person became a parent at age younger then 11 years old

      *)
      | PEventOrder of 'person * 'pevent * 'pevent(*

      Personal events haven't been ordered correctly

      *)
      | PossibleDuplicateFam of 'family * 'family
      | PWitnessEventAfterDeath of 'person * 'pevent * 'person(*

      Witness is dead before personal event date

      *)
      | PWitnessEventBeforeBirth of 'person * 'pevent * 'person(*

      Witness is born after personal event date

      *)
      | TitleDatesError of 'person * 'title(*

      Title's start date is after end date or person is born after title dates

      *)
      | UndefinedSex of 'person(*

      Person has undefined sex (Neuter)

      *)
      | YoungForMarriage of 'person * dmy * 'family(*

      Person is married before he was 12 years old

      *)
      | OldForMarriage of 'person * dmy * 'family(*

      Person is married after he was 100 years old

      *)

      Database warnings attached to the specification of the person, family, relation, etc.

      type ('person, 'descend, 'title) misc =
      | MissingSources

      Missing sources warning

      type rn_mode =
      | RnAll(*

      Read all content

      *)
      | Rn1Ln(*

      Read first line

      *)
      | RnDeg(*

      If file isn't empty returns a space

      *)

      Database note/page reading mode

      type base_notes = {
      nread : string -> rn_mode -> string;
      norigin_file : string;
      efiles : unit -> string list;
      }

      Database note/page explorer structure

      type ('iper, 'person, 'family, 'string) base_changed =
      | U_Add_person of ('iper'person'string) gen_person
      | U_Modify_person of ('iper'person'string) gen_person * ('iper'person'string) gen_person
      | U_Delete_person of ('iper'person'string) gen_person
      | U_Merge_person of ('iper'person'string) gen_person * ('iper'person'string) gen_person * ('iper'person'string) gen_person
      | U_Send_image of ('iper'person'string) gen_person
      | U_Delete_image of ('iper'person'string) gen_person
      | U_Add_family of ('iper'person'string) gen_person * ('person'family'string) gen_family
      | U_Modify_family of ('iper'person'string) gen_person * ('person'family'string) gen_family * ('person'family'string) gen_family
      | U_Delete_family of ('iper'person'string) gen_person * ('person'family'string) gen_family
      | U_Invert_family of ('iper'person'string) gen_person * 'family
      | U_Merge_family of ('iper'person'string) gen_person * ('person'family'string) gen_family * ('person'family'string) gen_family * ('person'family'string) gen_family
      | U_Change_children_name of ('iper'person'string) gen_person * ((string * string * int * 'person) * (string * string * int * 'person)) list
      | U_Add_parent of ('iper'person'string) gen_person * ('person'family'string) gen_family
      | U_Kill_ancestors of ('iper'person'string) gen_person
      | U_Multi of ('iper'person'string) gen_person * ('iper'person'string) gen_person * bool
      | U_Notes of int option * string

      Update modification used for history tracking

      module NLDB : sig ... end

      TODOOCP : doc

      \ No newline at end of file diff --git a/static/doc/geneweb/Def_show/.dune-keep b/static/doc/geneweb/Def_show/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Def_show/index.html b/static/doc/geneweb/Def_show/index.html deleted file mode 100644 index 0d63b354ef..0000000000 --- a/static/doc/geneweb/Def_show/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Def_show (geneweb.Def_show)

      Module Def_show

      type date = Adef.date =
      | Dgreg of dmy * calendar
      | Dtext of string
      and calendar = Adef.calendar =
      | Dgregorian
      | Djulian
      | Dfrench
      | Dhebrew
      and dmy = Adef.dmy = {
      day : int;
      month : int;
      year : int;
      prec : precision;
      delta : int;
      }
      and dmy2 = Adef.dmy2 = {
      day2 : int;
      month2 : int;
      year2 : int;
      delta2 : int;
      }
      and precision = Adef.precision =
      | Sure
      | About
      | Maybe
      | Before
      | After
      | OrYear of dmy2
      | YearInt of dmy2
      val pp_date : Stdlib.Format.formatter -> date -> unit

      Printer for date

      val show_date : date -> string

      Convert date to string.

      val pp_calendar : Stdlib.Format.formatter -> calendar -> unit

      Printer for calendar

      val show_calendar : calendar -> string

      Convert calendar to string

      val pp_dmy : Stdlib.Format.formatter -> dmy -> unit

      Printer for dmy

      val show_dmy : dmy -> string

      Convert dmy to string

      val pp_dmy2 : Stdlib.Format.formatter -> dmy2 -> unit

      Printer for dmy2

      val show_dmy2 : dmy2 -> string

      Convert dmy2 to string

      val pp_precision : Stdlib.Format.formatter -> precision -> unit

      Printer for precision

      val show_precision : precision -> string

      Convert precision to string

      type cdate = Adef.cdate
      val pp_cdate : Stdlib.Format.formatter -> Adef.cdate -> unit

      Printer for cdate

      val show_cdate : Adef.cdate -> string

      Convert cdate to string

      type relation_kind = Def.relation_kind =
      | Married
      | NotMarried
      | Engaged
      | NoSexesCheckNotMarried
      | NoMention
      | NoSexesCheckMarried
      | MarriageBann
      | MarriageContract
      | MarriageLicense
      | Pacs
      | Residence
      val pp_relation_kind : Stdlib.Format.formatter -> relation_kind -> unit

      Printer for relation_kind

      val show_relation_kind : relation_kind -> string

      Convert relation_kind to string

      type divorce = Def.divorce =
      | NotDivorced
      | Divorced of cdate
      | Separated
      val pp_divorce : Stdlib.Format.formatter -> divorce -> unit

      Printer for divorce

      val show_divorce : divorce -> string

      Convert divorce to string

      type death_reason = Def.death_reason =
      | Killed
      | Murdered
      | Executed
      | Disappeared
      | Unspecified
      val pp_death_reason : Stdlib.Format.formatter -> death_reason -> unit

      Printer for death_reason

      val show_death_reason : death_reason -> string

      Convert death_reason to string

      type death = Def.death =
      | NotDead
      | Death of death_reason * cdate
      | DeadYoung
      | DeadDontKnowWhen
      | DontKnowIfDead
      | OfCourseDead
      val pp_death : Stdlib.Format.formatter -> death -> unit

      Printer for death

      val show_death : death -> string

      Convert death to string

      type burial = Def.burial =
      | UnknownBurial
      | Buried of cdate
      | Cremated of cdate
      val pp_burial : Stdlib.Format.formatter -> burial -> unit

      Printer for burial

      val show_burial : burial -> string

      Convert burial to string

      type access = Def.access =
      | IfTitles
      | Public
      | Private
      val pp_access : Stdlib.Format.formatter -> access -> unit

      Printer for access

      val show_access : access -> string

      Convert access to string

      type 'string gen_title_name = 'string Def.gen_title_name =
      | Tmain
      | Tname of 'string
      | Tnone
      val pp_gen_title_name : (Stdlib.Format.formatter -> 'string -> unit) -> Stdlib.Format.formatter -> 'string gen_title_name -> unit

      Printer for gen_title_name

      val show_gen_title_name : (Stdlib.Format.formatter -> 'string -> unit) -> 'string gen_title_name -> string

      Convert gen_title_name to string

      type 'string gen_title = 'string Def.gen_title = {
      t_name : 'string gen_title_name;
      t_ident : 'string;
      t_place : 'string;
      t_date_start : cdate;
      t_date_end : cdate;
      t_nth : int;
      }
      val pp_gen_title : (Stdlib.Format.formatter -> 'string -> unit) -> Stdlib.Format.formatter -> 'string gen_title -> unit

      Printer for gen_title

      val show_gen_title : (Stdlib.Format.formatter -> 'string -> unit) -> 'string gen_title -> string

      Convert gen_title to string

      type witness_kind = Def.witness_kind =
      | Witness
      | Witness_GodParent
      | Witness_Officer
      val pp_witness_kind : Stdlib.Format.formatter -> witness_kind -> unit

      Printer for witness_kind

      val show_witness_kind : witness_kind -> string

      Convert witness_kind to string

      type 'string gen_pers_event_name = 'string Def.gen_pers_event_name =
      | Epers_Birth
      | Epers_Baptism
      | Epers_Death
      | Epers_Burial
      | Epers_Cremation
      | Epers_Accomplishment
      | Epers_Acquisition
      | Epers_Adhesion
      | Epers_BaptismLDS
      | Epers_BarMitzvah
      | Epers_BatMitzvah
      | Epers_Benediction
      | Epers_ChangeName
      | Epers_Circumcision
      | Epers_Confirmation
      | Epers_ConfirmationLDS
      | Epers_Decoration
      | Epers_DemobilisationMilitaire
      | Epers_Diploma
      | Epers_Distinction
      | Epers_Dotation
      | Epers_DotationLDS
      | Epers_Education
      | Epers_Election
      | Epers_Emigration
      | Epers_Excommunication
      | Epers_FamilyLinkLDS
      | Epers_FirstCommunion
      | Epers_Funeral
      | Epers_Graduate
      | Epers_Hospitalisation
      | Epers_Illness
      | Epers_Immigration
      | Epers_ListePassenger
      | Epers_MilitaryDistinction
      | Epers_MilitaryPromotion
      | Epers_MilitaryService
      | Epers_MobilisationMilitaire
      | Epers_Naturalisation
      | Epers_Occupation
      | Epers_Ordination
      | Epers_Property
      | Epers_Recensement
      | Epers_Residence
      | Epers_Retired
      | Epers_ScellentChildLDS
      | Epers_ScellentParentLDS
      | Epers_ScellentSpouseLDS
      | Epers_VenteBien
      | Epers_Will
      | Epers_Name of 'string
      val pp_gen_pers_event_name : (Stdlib.Format.formatter -> 'string -> unit) -> Stdlib.Format.formatter -> 'string gen_pers_event_name -> unit

      Printer for gen_pers_event_name

      val show_gen_pers_event_name : (Stdlib.Format.formatter -> 'string -> unit) -> 'string gen_pers_event_name -> string

      Convert gen_pers_event_name to string

      type ('person, 'string) gen_pers_event = ('person'string) Def.gen_pers_event = {
      epers_name : 'string gen_pers_event_name;
      epers_date : cdate;
      epers_place : 'string;
      epers_reason : 'string;
      epers_note : 'string;
      epers_src : 'string;
      epers_witnesses : ('person * witness_kind) array;
      }
      val pp_gen_pers_event : (Stdlib.Format.formatter -> 'person -> unit) -> (Stdlib.Format.formatter -> 'string -> unit) -> Stdlib.Format.formatter -> ('person'string) gen_pers_event -> unit

      Printer for gen_pers_event

      val show_gen_pers_event : (Stdlib.Format.formatter -> 'person -> unit) -> (Stdlib.Format.formatter -> 'string -> unit) -> ('person'string) gen_pers_event -> string

      Convert gen_pers_event to string

      type 'string gen_fam_event_name = 'string Def.gen_fam_event_name =
      | Efam_Marriage
      | Efam_NoMarriage
      | Efam_NoMention
      | Efam_Engage
      | Efam_Divorce
      | Efam_Separated
      | Efam_Annulation
      | Efam_MarriageBann
      | Efam_MarriageContract
      | Efam_MarriageLicense
      | Efam_PACS
      | Efam_Residence
      | Efam_Name of 'string
      val pp_gen_fam_event_name : (Stdlib.Format.formatter -> 'string -> unit) -> Stdlib.Format.formatter -> 'string gen_fam_event_name -> unit

      Printer for gen_fam_event_name

      val show_gen_fam_event_name : (Stdlib.Format.formatter -> 'string -> unit) -> 'string gen_fam_event_name -> string

      Convert gen_fam_event_name to string

      type ('person, 'string) gen_fam_event = ('person'string) Def.gen_fam_event = {
      efam_name : 'string gen_fam_event_name;
      efam_date : cdate;
      efam_place : 'string;
      efam_reason : 'string;
      efam_note : 'string;
      efam_src : 'string;
      efam_witnesses : ('person * witness_kind) array;
      }
      val pp_gen_fam_event : (Stdlib.Format.formatter -> 'person -> unit) -> (Stdlib.Format.formatter -> 'string -> unit) -> Stdlib.Format.formatter -> ('person'string) gen_fam_event -> unit

      Printer for gen_fam_event

      val show_gen_fam_event : (Stdlib.Format.formatter -> 'person -> unit) -> (Stdlib.Format.formatter -> 'string -> unit) -> ('person'string) gen_fam_event -> string

      Convert gen_fam_event to string

      type relation_type = Def.relation_type =
      | Adoption
      | Recognition
      | CandidateParent
      | GodParent
      | FosterParent
      val pp_relation_type : Stdlib.Format.formatter -> relation_type -> unit

      Printer for relation_type

      val show_relation_type : relation_type -> string

      Convert relation_type to string

      type ('person, 'string) gen_relation = ('person'string) Def.gen_relation = {
      r_type : relation_type;
      r_fath : 'person option;
      r_moth : 'person option;
      r_sources : 'string;
      }
      val pp_gen_relation : (Stdlib.Format.formatter -> 'person -> unit) -> (Stdlib.Format.formatter -> 'string -> unit) -> Stdlib.Format.formatter -> ('person'string) gen_relation -> unit

      Printer for gen_relation

      val show_gen_relation : (Stdlib.Format.formatter -> 'person -> unit) -> (Stdlib.Format.formatter -> 'string -> unit) -> ('person'string) gen_relation -> string

      Convert gen_relation to string

      type sex = Def.sex =
      | Male
      | Female
      | Neuter
      val pp_sex : Stdlib.Format.formatter -> sex -> unit

      Printer for sex

      val show_sex : sex -> string

      Convert sex to string

      type place = Def.place = {
      other : string;
      town : string;
      township : string;
      canton : string;
      district : string;
      county : string;
      region : string;
      country : string;
      }
      val pp_place : Stdlib.Format.formatter -> place -> unit

      Printer for place

      val show_place : place -> string

      Convert place to string

      type ('iper, 'person, 'string) gen_person = ('iper'person'string) Def.gen_person = {
      first_name : 'string;
      surname : 'string;
      occ : int;
      image : 'string;
      public_name : 'string;
      qualifiers : 'string list;
      aliases : 'string list;
      first_names_aliases : 'string list;
      surnames_aliases : 'string list;
      titles : 'string gen_title list;
      rparents : ('person'string) gen_relation list;
      related : 'person list;
      occupation : 'string;
      sex : sex;
      access : access;
      birth : cdate;
      birth_place : 'string;
      birth_note : 'string;
      birth_src : 'string;
      baptism : cdate;
      baptism_place : 'string;
      baptism_note : 'string;
      baptism_src : 'string;
      death : death;
      death_place : 'string;
      death_note : 'string;
      death_src : 'string;
      burial : burial;
      burial_place : 'string;
      burial_note : 'string;
      burial_src : 'string;
      pevents : ('person'string) gen_pers_event list;
      notes : 'string;
      psources : 'string;
      key_index : 'iper;
      }
      val pp_gen_person : (Stdlib.Format.formatter -> 'iper -> unit) -> (Stdlib.Format.formatter -> 'person -> unit) -> (Stdlib.Format.formatter -> 'string -> unit) -> Stdlib.Format.formatter -> ('iper'person'string) gen_person -> unit

      Printer for gen_person

      val show_gen_person : (Stdlib.Format.formatter -> 'iper -> unit) -> (Stdlib.Format.formatter -> 'person -> unit) -> (Stdlib.Format.formatter -> 'string -> unit) -> ('iper'person'string) gen_person -> string

      Convert gen_person to string

      type fix = Adef.fix
      val pp_fix : Stdlib.Format.formatter -> Adef.fix -> unit

      Printer for fix

      val show_fix : Adef.fix -> string

      Convert fix to string

      type 'family gen_ascend = 'family Def.gen_ascend = {
      parents : 'family option;
      consang : fix;
      }
      val pp_gen_ascend : (Stdlib.Format.formatter -> 'family -> unit) -> Stdlib.Format.formatter -> 'family gen_ascend -> unit

      Printer for gen_ascend

      val show_gen_ascend : (Stdlib.Format.formatter -> 'family -> unit) -> 'family gen_ascend -> string

      Convert gen_ascend to string

      type 'family gen_union = 'family Def.gen_union = {
      family : 'family array;
      }
      val pp_gen_union : (Stdlib.Format.formatter -> 'family -> unit) -> Stdlib.Format.formatter -> 'family gen_union -> unit

      Printer for gen_union

      val show_gen_union : (Stdlib.Format.formatter -> 'family -> unit) -> 'family gen_union -> string

      Convert gen_union to string

      type ('person, 'ifam, 'string) gen_family = ('person'ifam'string) Def.gen_family = {
      marriage : cdate;
      marriage_place : 'string;
      marriage_note : 'string;
      marriage_src : 'string;
      witnesses : 'person array;
      relation : relation_kind;
      divorce : divorce;
      fevents : ('person'string) gen_fam_event list;
      comment : 'string;
      origin_file : 'string;
      fsources : 'string;
      fam_index : 'ifam;
      }
      val pp_gen_family : (Stdlib.Format.formatter -> 'person -> unit) -> (Stdlib.Format.formatter -> 'ifam -> unit) -> (Stdlib.Format.formatter -> 'string -> unit) -> Stdlib.Format.formatter -> ('person'ifam'string) gen_family -> unit

      Printer for gen_family

      val show_gen_family : (Stdlib.Format.formatter -> 'person -> unit) -> (Stdlib.Format.formatter -> 'ifam -> unit) -> (Stdlib.Format.formatter -> 'string -> unit) -> ('person'ifam'string) gen_family -> string

      Convert gen_family to string

      type 'person gen_couple = 'person Adef.gen_couple
      val pp_gen_couple : (Stdlib.Format.formatter -> 'person -> unit) -> Stdlib.Format.formatter -> 'person gen_couple -> unit

      Printer for gen_couple

      val show_gen_couple : (Stdlib.Format.formatter -> 'person -> unit) -> 'person gen_couple -> string

      Convert gen_couple to string

      type 'person gen_descend = 'person Def.gen_descend = {
      children : 'person array;
      }
      val pp_gen_descend : (Stdlib.Format.formatter -> 'person -> unit) -> Stdlib.Format.formatter -> 'person gen_descend -> unit

      Printer for gen_descend

      val show_gen_descend : (Stdlib.Format.formatter -> 'person -> unit) -> 'person gen_descend -> string

      Convert gen_descend to string

      \ No newline at end of file diff --git a/static/doc/geneweb/Futil/.dune-keep b/static/doc/geneweb/Futil/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Futil/index.html b/static/doc/geneweb/Futil/index.html deleted file mode 100644 index 12a39da3bb..0000000000 --- a/static/doc/geneweb/Futil/index.html +++ /dev/null @@ -1,4 +0,0 @@ - -Futil (geneweb.Futil)

      Module Futil

      val map_title_strings : ?fd:(Def.date -> Def.date) -> ('a -> 'b) -> 'a Def.gen_title -> 'b Def.gen_title

      Convert generic type used to represent name, id and the place of Def.gen_title into another one. If fd is present, apply it on the date of the start and date of the end of a title

      val map_pers_event : ?fd:(Def.date -> Def.date) -> ('a -> 'c) -> ('b -> 'd) -> ('a'b) Def.gen_pers_event -> ('c'd) Def.gen_pers_event

      Convert:

      • Generic type used to represent witnesses of Def.gen_pers_event into another one.
      • Generic type used to represent name, place, reason, note and source of Def.gen_pers_event into another one. If fd is present, apply it on date of the personal event.
      val map_fam_event : ?fd:(Def.date -> Def.date) -> ('a -> 'c) -> ('b -> 'd) -> ('a'b) Def.gen_fam_event -> ('c'd) Def.gen_fam_event

      Convert:

      • Generic type used to represent witnesses of Def.gen_fam_event into another one.
      • Generic type used to represent name, place, reason, note and source of Def.gen_fam_event into another one. If fd is present, apply it on date of the familial event.
      val map_relation_ps : ('a -> 'c) -> ('b -> 'd) -> ('a'b) Def.gen_relation -> ('c'd) Def.gen_relation

      Convert:

      • Generic type used to represent father and mother inside Def.gen_relation into another one.
      • Generic type used to represent sources of Def.gen_relation into another one.
      val map_person_ps : ?fd:(Def.date -> Def.date) -> -('b -> 'd) -> ('c -> 'e) -> ('a'b'c) Def.gen_person -> ('a'd'e) Def.gen_person

      Convert:

      • Generic type used to represent related persons (parents, witnesses of a personal event, etc.) of Def.gen_person into another one.
      • Generic type used to represent another large part of information of Def.gen_person into another one. If fd is present, apply it on every date (birth, death, titles,, personal events, etc.). Generic type that is used to represent indexation key isn't converted.
      val map_ascend_f : ('a -> 'b) -> 'a Def.gen_ascend -> 'b Def.gen_ascend

      Convert generic type used to represent family inside Def.gen_ascend into another one.

      val map_union_f : ('a -> 'b) -> 'a Def.gen_union -> 'b Def.gen_union

      Convert generic type used to represent one of the famillies inside Def.gen_union into another one.

      val map_family_ps : ?fd:(Def.date -> Def.date) -> -('a -> 'b) -> ('c -> 'd) -> ('e -> 'f) -> ('a'c'e) Def.gen_family -> ('b'd'f) Def.gen_family

      Convert:

      • Generic type used to represent faimily indexation key into another one.
      • Generic type used to represent witnesses (of the marriage or of a famillial events, etc.) of Def.gen_family into another one.
      • Generic type used to represent another large part of information of Def.gen_family into another one. If fd is present, apply it on it on every date (marriage, divorce, famillial events, etc.).
      val map_couple_p : bool -> ('a -> 'b) -> 'a Def.gen_couple -> 'b Def.gen_couple

      Convert generic type used to represent father and mother inside Def.gen_couple into another one. If first argument is true then use multi-parent functionality.

      val parent : bool -> 'a array -> 'a Def.gen_couple
      • deprecated

        Use Adef.parent instead.

      val map_descend_p : ('a -> 'b) -> 'a Def.gen_descend -> 'b Def.gen_descend

      Convert generic type used to represent children inside Def.gen_descend into another one.

      val eq_lists : ('a -> 'b -> bool) -> 'a list -> 'b list -> bool

      Says if two lists with different element's type are equal with given comparison function.

      val eq_titles : ('a -> 'b -> bool) -> 'a Def.gen_title -> 'b Def.gen_title -> bool

      Says if two titles with different types are equal with given comparison function.

      val eq_title_names : ('a -> 'b -> bool) -> 'a Def.gen_title_name -> 'b Def.gen_title_name -> bool

      Says if two title names with different types are equal with given comparison function.

      val gen_person_misc_names : ('a -> string) -> 'a -> 'a -> 'a -> 'a -> 'a -> 'a list -> 'a list -> 'a list -> 'a list -> 'a Def.gen_title list -> ('a * 'a list) array -> 'a Def.gen_title list -> string list

      Return a list of string corresponding to various mix between all kind of names. It can contain duplicates. Strings are used raw (not lowered).

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/.dune-keep b/static/doc/geneweb/Geneweb/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb/AdvSearchOk/index.html b/static/doc/geneweb/Geneweb/AdvSearchOk/index.html deleted file mode 100644 index fb10b9742d..0000000000 --- a/static/doc/geneweb/Geneweb/AdvSearchOk/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -AdvSearchOk (geneweb.Geneweb.AdvSearchOk)

      Module Geneweb.AdvSearchOk

      advanced_search conf base max_answers extracts advaced request fields from environement conf.env and returns at most max_answers persons from the base that match conditions described by those fields. Seond result represents real number of matches (if less then max_answers).

      val searching_fields : Config.config -> Gwdb.base -> string

      Returns a description string for the current advanced search results in the correct language. e.g. "Search all Pierre, born in Paris, died in Paris"

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/AdvSearchOkDisplay/index.html b/static/doc/geneweb/Geneweb/AdvSearchOkDisplay/index.html deleted file mode 100644 index cb80329075..0000000000 --- a/static/doc/geneweb/Geneweb/AdvSearchOkDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -AdvSearchOkDisplay (geneweb.Geneweb.AdvSearchOkDisplay)

      Module Geneweb.AdvSearchOkDisplay

      val print : Config.config -> Gwdb.base -> unit

      Displays the results of an advanced search

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Alln/index.html b/static/doc/geneweb/Geneweb/Alln/index.html deleted file mode 100644 index 4df68452fb..0000000000 --- a/static/doc/geneweb/Geneweb/Alln/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Alln (geneweb.Geneweb.Alln)

      Module Geneweb.Alln

      val default_max_cnt : int

      Default number of names that could be printed simultaneously on the page

      type t =
      | Result of (string * string * int) list(*

      Exhaustive result with the list of names (key and printable name) with number of persons that have giving name

      *)
      | Specify of string list(*

      Not exhaustive result that specifies all existing names prefixes (their length depends on initial searched prefix)

      *)

      Type that represents result of name selection

      val first_letters : Gwdb.base -> bool -> string list

      Returns list of all first name's first letter present in the base (UTF8 encoded). Used for fast access for base's names

      val select_names : Config.config -> Gwdb.base -> bool -> string -> int -> t * int

      select_names conf base is_surnames ini limit Select up to limit first names/surnames starting with ini. If more values are available, return Specify with different possible prefixes with the length at most equal to the length of ini+1 (for empty ini specifies all first letters of existing names). Otherwise, return the list of values Result with all first names and number of persons that have giving name.

      val ini : int -> string -> string

      Returns prefix of length len of UTF8 encoded name

      val groupby_ini : int -> (string * 'a * 'b) list -> (string * ('a * 'b) list) list

      groupby_ini len results returns alphabeticaly ordered list of grouped by name prefix (with length len) results.

      val groupby_count : t -> (int * string list) list

      Returns ordered (from bigest to smallest) list of grouped by name frequency (number of persons having the name) results. Shouldn't be used when results are represented with Specify.

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/AllnDisplay/index.html b/static/doc/geneweb/Geneweb/AllnDisplay/index.html deleted file mode 100644 index 0276bddc62..0000000000 --- a/static/doc/geneweb/Geneweb/AllnDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -AllnDisplay (geneweb.Geneweb.AllnDisplay)

      Module Geneweb.AllnDisplay

      val print_surnames : Config.config -> Gwdb.base -> unit

      Displays all persons surnames present in the base. Display could be different depending on environement conf.env. These variables affect the display:

      • tri : "F" to display surnames by frequency, "S" to display surnames regrouped by first letter (depends on variable "k") otherwsise display surnames just ordered alphabeticaly
      • k : Defines common prefix for surnames (empty for all)
      • o : "A" to print all surnames (if less then Alln.default_max_cnt) otherwise prints links to access different type of displaying
      val print_first_names : Config.config -> Gwdb.base -> unit

      Same as print_surnames but dealing with first names.

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Ansel/index.html b/static/doc/geneweb/Geneweb/Ansel/index.html deleted file mode 100644 index 635d7618ac..0000000000 --- a/static/doc/geneweb/Geneweb/Ansel/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Ansel (geneweb.Geneweb.Ansel)

      Module Geneweb.Ansel

      val of_iso_8859_1 : string -> string

      Convert ISO-8859-1 encoded string to ANSEL encoding used inside gedcom files

      val to_iso_8859_1 : string -> string

      Convert ANSEL used inside gedcom files to ISO-8859-1 encoding

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Base64/index.html b/static/doc/geneweb/Geneweb/Base64/index.html deleted file mode 100644 index 74987b279d..0000000000 --- a/static/doc/geneweb/Geneweb/Base64/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Base64 (geneweb.Geneweb.Base64)

      Module Geneweb.Base64

      val decode : string -> string

      Decode Base64 binary-to-text encoding used at the moment of basic autorization

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/BirthDeath/index.html b/static/doc/geneweb/Geneweb/BirthDeath/index.html deleted file mode 100644 index 288ab9ba28..0000000000 --- a/static/doc/geneweb/Geneweb/BirthDeath/index.html +++ /dev/null @@ -1,3 +0,0 @@ - -BirthDeath (geneweb.Geneweb.BirthDeath)

      Module Geneweb.BirthDeath

      val select_person : Config.config -> Gwdb.base -> (Gwdb.person -> Def.date option) -> bool -> (Gwdb.person * Def.dmy * Def.calendar) list * int

      select_person conf base get_date find_oldest select 20 persons from the base according to the one of their date (birth, death, marriage, specific event, etc.) that could be get with get_date. Returns sorted by date persons that have the latest (if find_oldest is false) or oldest (otherwise) date. Selection could be different depending on environement conf.env. These variables affect the selection: k - allows to modify default value (20) of selected persons by,bm,bd - allows to set reference date (all dates after the reference one aren't selected) Returns also the number of selected persons

      val select_family : Config.config -> Gwdb.base -> (Gwdb.family -> Def.date option) -> bool -> (Gwdb.family * Def.dmy * Def.calendar) list * int

      Same as select_person but dealing with families

      val death_date : Gwdb.person -> Adef.date option

      Returns person's death date (if exists)

      val make_population_pyramid : nb_intervals:int -> interval:int -> limit:int -> -at_date:Def.dmy -> Config.config -> Gwdb.base -> int array * int array

      make_population_pyramid nb_intervals interval interval at_date conf base Calculates population pyramid of all perons in the base. Population pyramid consists of two separated arrays that regroups number of men's and women's born in each time interval. One array has a size nb_intervals + 1 and every element is a number of persons born in the giving time interval that represents interval years. Calculation starts at the date at_date and persons that are considered in pyramid should be alive at this date. limit allows to limit persons by age (those that has age greater then limit aren't taken into the account)

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/BirthDeathDisplay/index.html b/static/doc/geneweb/Geneweb/BirthDeathDisplay/index.html deleted file mode 100644 index dd5e326d7f..0000000000 --- a/static/doc/geneweb/Geneweb/BirthDeathDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -BirthDeathDisplay (geneweb.Geneweb.BirthDeathDisplay)

      Module Geneweb.BirthDeathDisplay

      val print_birth : Config.config -> Gwdb.base -> unit

      Lists the last births

      val print_death : Config.config -> Gwdb.base -> unit

      Lists the last deaths

      val print_longest_lived : Config.config -> Gwdb.base -> unit

      Lists the persons who lived the longest

      val print_oldest_alive : Config.config -> Gwdb.base -> unit

      Displays the list of the oldest persons that are still alive or, if unknown, whose death are not probable

      val print_marriage : Config.config -> Gwdb.base -> unit

      Lists the last marriages

      val print_oldest_engagements : Config.config -> Gwdb.base -> unit

      Displays the list of the oldest couples that still exist

      val print_statistics : Config.config -> unit

      Displays several links for statistics: latest births, death, marriages, the oldest couples, persons that are alive and who lived the longest, as well as a population pyramid

      val print_population_pyramid : Config.config -> Gwdb.base -> unit

      Displays a population pyramid from the base data

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/BirthdayDisplay/index.html b/static/doc/geneweb/Geneweb/BirthdayDisplay/index.html deleted file mode 100644 index 69b21320dc..0000000000 --- a/static/doc/geneweb/Geneweb/BirthdayDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -BirthdayDisplay (geneweb.Geneweb.BirthdayDisplay)

      Module Geneweb.BirthdayDisplay

      val gen_print : Config.config -> Gwdb.base -> int -> (unit -> Gwdb.person * (Config.config -> Gwdb.base -> Gwdb.person -> string)) -> bool -> unit

      gen_print conf base month (next,txt_of) dead_people displays anniversaries for a given month separated by day. If dead_people is true then displays birth/death anniversaries for dead people with death reason. Otherwise displays birthdays for alive people. next is function that returns next person from iterator and txt_of text/link that describes person's information

      val print_birth : Config.config -> Gwdb.base -> int -> unit

      Displays birthdays for alive people for a given month

      val print_dead : Config.config -> Gwdb.base -> int -> unit

      Displays anniversaries for dead people for a given month

      val print_marriage : Config.config -> Gwdb.base -> int -> unit

      Displays marriage anniversaries for a given month

      val gen_print_menu_birth : Config.config -> Gwdb.base -> (unit -> Gwdb.person * (Config.config -> Gwdb.base -> Gwdb.person -> string)) -> (unit -> 'a) -> unit

      gen_print_menu_birth conf base (next,txt_of) mode displays the main birthdays menu for alive people that contains:

      • Persons that has their birthdays today
      • Persons that has their birthdays tomorrow
      • Persons that has their birthdays after today
      • Form to select the month of birthdays we want to see. next is function that returns next person from iterator, txt_of text/link that describes person's information and mode that add some additional hidden inputs in the month form
      val print_menu_birth : Config.config -> Gwdb.base -> unit

      Displays the main birthdays menu considering all alive people

      val gen_print_menu_dead : Config.config -> Gwdb.base -> (unit -> Gwdb.person * (Config.config -> Gwdb.base -> Gwdb.person -> string)) -> (unit -> 'a) -> unit

      gen_print_menu_dead conf base (next,txt_of) mode displays the main anniversaries menu for dead people that contains:

      • Persons that has their anniversaries today
      • Persons that has their anniversaries tomorrow
      • Persons that has their anniversaries after today
      • Form to select the month of anniversaries we want to see. next is function that returns next person from iterator, txt_of text/link that describes person's information and mode that add some additional hidden inputs in the month form
      val print_menu_dead : Config.config -> Gwdb.base -> unit

      Displays the main anniversaries menu considering all dead people

      val print_menu_marriage : Config.config -> Gwdb.base -> unit

      Displays the main wedding anniversaries menu

      val print_anniversaries : Config.config -> unit

      Displays the menu of anniversaries selection

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/ChangeChildren/index.html b/static/doc/geneweb/Geneweb/ChangeChildren/index.html deleted file mode 100644 index 65b599c458..0000000000 --- a/static/doc/geneweb/Geneweb/ChangeChildren/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -ChangeChildren (geneweb.Geneweb.ChangeChildren)

      Module Geneweb.ChangeChildren

      val digest_children : Gwdb.base -> Gwdb.iper list -> string

      Returns digest (using md5 algorithm) of concatenated for every childran first name, surname and occurence number

      val check_digest : Config.config -> string -> unit

      Checks if children digest in environement conf.env corresponds to specified digest. Other print error page.

      exception ChangeChildrenConflict of Gwdb.person * Gwdb.person

      Exception raised when childran change defines a new childran information (new first name, new surname and new occurence number) are in conflict with another person already existing in the base

      exception FirstNameMissing of Gwdb.iper

      Exception raised when childran change removes it first name

      val change_children : Config.config -> Gwdb.base -> string -> Gwdb.iper list -> ((string * string * int * Gwdb.iper) * (string * string * int * Gwdb.iper)) list

      Change all person's children by looking up information to update inside conf.env that was send by the form. Changes also childran's personal image name. Could raise ChangeChildrenConflict if new childran's key is in conflict with another and FirstNameMissing if new childran's first name is empty. If surname modification is requested but absent then childran takes parent's surname. Returns informations used by Update module to record children's update operation.

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/ChangeChildrenDisplay/index.html b/static/doc/geneweb/Geneweb/ChangeChildrenDisplay/index.html deleted file mode 100644 index 3c62ea8024..0000000000 --- a/static/doc/geneweb/Geneweb/ChangeChildrenDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -ChangeChildrenDisplay (geneweb.Geneweb.ChangeChildrenDisplay)

      Module Geneweb.ChangeChildrenDisplay

      val print : Config.config -> Gwdb.base -> unit

      Displays a form where all person's children with their first names, surnames and occurence numbers are listed and could be modified on submit. Id of person should be mentionned in environement conf.env with binding "ip"=id otherwise displays Bad request page.

      val print_ok : Config.config -> Gwdb.base -> unit

      Performs and displays results of children modification requested by form submiting. If changes of one of children raises an error displays corresponding error page that either just informs user about error source either propose to fix up solution.

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Check/index.html b/static/doc/geneweb/Geneweb/Check/index.html deleted file mode 100644 index a03bdca058..0000000000 --- a/static/doc/geneweb/Geneweb/Check/index.html +++ /dev/null @@ -1,3 +0,0 @@ - -Check (geneweb.Geneweb.Check)

      Module Geneweb.Check

      val print_base_error : Stdlib.out_channel -> Gwdb.base -> CheckItem.base_error -> unit

      Print database specification error on the giving channel

      val print_base_warning : Stdlib.out_channel -> Gwdb.base -> CheckItem.base_warning -> unit

      Print database specification warning on the giving channel

      val check_base : ?verbose:bool -> ?mem:bool -> -Gwdb.base -> (CheckItem.base_error -> unit) -> (CheckItem.base_warning -> unit) -> ((Gwdb.iper * Gwdb.person * Def.sex option * Gwdb.relation list option) -> unit) -> unit

      check_base base onwarning onerror _ makes full database proprety check. Checks every person and family separetely with corresponding function inside CheckItem module. Checks also person's graph in order to find cycles (if person is own ancestor).

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/CheckItem/index.html b/static/doc/geneweb/Geneweb/CheckItem/index.html deleted file mode 100644 index d312c3d193..0000000000 --- a/static/doc/geneweb/Geneweb/CheckItem/index.html +++ /dev/null @@ -1,3 +0,0 @@ - -CheckItem (geneweb.Geneweb.CheckItem)

      Module Geneweb.CheckItem

      type base_error = Gwdb.person Def.error

      Database specification error

      Database specification warning

      type 'string event_name =
      | Psort of 'string Def.gen_pers_event_name(*

      Personal event name

      *)
      | Fsort of 'string Def.gen_fam_event_name(*

      Familial event name

      *)

      Event name that unites personal and familial event names

      val sort_events : ('a -> 'string event_name) -> ('a -> Adef.cdate) -> 'a list -> 'a list

      Sort events (both peronal and familial) by their date and their name

      val merge_events : ('a -> 'string event_name) -> ('a -> Adef.cdate) -> 'a list -> 'a list -> 'a list

      Merge two sorted event lists (returns sorted list)

      val check_siblings : ?onchange:bool -> Gwdb.base -> (base_warning -> unit) -> (Gwdb.ifam * Gwdb.family) -> (Gwdb.person -> unit) -> unit

      check_siblings ?onchange base warning (ifam, fam) callback Checks birth date consistency between siblings. Also calls callback with each child.

      val person : ?onchange:bool -> -Gwdb.base -> (base_warning -> unit) -> Gwdb.person -> (Gwdb.iper * Gwdb.person * Def.sex option * Gwdb.relation list option) list option

      person onchange base warn p checks person's properties:

      • personal events
      • person's age
      • person's titles dates
      • etc. If onchange is set then sort person's events Calls warn on corresponding base_warning when find some inconsistencies.
      val family : ?onchange:bool -> Gwdb.base -> (base_warning -> unit) -> Gwdb.ifam -> Gwdb.family -> unit

      family onchange base warn f checks family properties like :

      • familial events
      • parents marraige
      • children age gap and birth
      • etc. If onchange is set then sort family's events Calls warn on corresponding base_warning when find some inconsistencies.
      val on_person_update : Gwdb.base -> (base_warning -> unit) -> Gwdb.person -> unit

      Unlike person who checks directly the properties of a person, checks the properties of a person in relation to other people (his children, parents, spouses, witnesses, etc). Calls warn on corresponding base_warning when find some inconsistencies.

      val sort_children : Gwdb.base -> Gwdb.iper array -> (Gwdb.iper array * Gwdb.iper array) option

      Sort array of children by their birth date from oldest to youngest. Returns old array and sorted version.

      val check_other_fields : Gwdb.base -> (base_misc -> unit) -> Gwdb.ifam -> Gwdb.family -> unit

      Cheks if family, father and mother have sources. Otherwise call misc on base_misc

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Config/index.html b/static/doc/geneweb/Geneweb/Config/index.html deleted file mode 100644 index 4e10ea45ab..0000000000 --- a/static/doc/geneweb/Geneweb/Config/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Config (geneweb.Geneweb.Config)

      Module Geneweb.Config

      type auth_scheme_kind =
      | NoAuth
      | TokenAuth of token_auth_scheme
      | HttpAuth of http_auth_scheme

      Authentication scheme data type

      and token_auth_scheme = {
      ts_user : string;
      ts_pass : string;
      }

      Authentication via security token

      and http_auth_scheme =
      | Basic of basic_auth_scheme
      | Digest of digest_auth_scheme

      Authentication via HTTP

      and basic_auth_scheme = {
      bs_realm : string;
      bs_user : string;
      bs_pass : string;
      }

      Basic authentication scheme inside Autorization HTTP header

      and digest_auth_scheme = {
      ds_username : string;
      ds_realm : string;
      ds_nonce : string;
      ds_meth : string;
      ds_uri : string;
      ds_qop : string;
      ds_nc : string;
      ds_cnonce : string;
      ds_response : string;
      }

      Digest authentication scheme inside Autorization HTTP header

      type output_conf = {
      status : Def.httpStatus -> unit;
      header : string -> unit;
      body : string -> unit;
      flush : unit -> unit;
      }

      HTTP printer, that prints and sends requests on the user's socket

      type config = {
      from : string;
      api_mode : bool;
      manitou : bool;
      supervisor : bool;
      wizard : bool;
      is_printed_by_template : bool;
      debug : bool;
      friend : bool;
      just_friend_wizard : bool;
      user : string;
      username : string;
      auth_scheme : auth_scheme_kind;
      command : string;
      indep_command : string;
      highlight : string;
      lang : string;
      default_lang : string;
      default_sosa_ref : Gwdb.iper * Gwdb.person option;
      multi_parents : bool;
      authorized_wizards_notes : bool;
      public_if_titles : bool;
      public_if_no_date : bool;
      access_by_key : bool;
      private_years : int;
      hide_names : bool;
      use_restrict : bool;
      no_image : bool;
      no_note : bool;
      bname : string;
      cgi_passwd : string;
      env : (string * string) list;
      mutable senv : (string * string) list;
      mutable henv : (string * string) list;
      base_env : (string * string) list;
      allowed_titles : string list Stdlib.Lazy.t;
      denied_titles : string list Stdlib.Lazy.t;
      request : string list;
      lexicon : (string, string) Stdlib.Hashtbl.t;
      mutable charset : string;
      is_rtl : bool;
      left : string;
      right : string;
      auth_file : string;
      border : int;
      mutable n_connect : (int * int * int * (string * float) list) option;
      today : Def.dmy;
      today_wd : int;
      time : int * int * int;
      ctime : float;
      mutable output_conf : output_conf;
      image_prefix : string;
      cgi : bool;
      forced_plugins : string list;
      plugins : string list;
      }

      Geneweb configuration data type

      val empty : config

      A dummy config value, with uninitialized fields. Used for testing purpose

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Cousins/index.html b/static/doc/geneweb/Geneweb/Cousins/index.html deleted file mode 100644 index c4eec33021..0000000000 --- a/static/doc/geneweb/Geneweb/Cousins/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Cousins (geneweb.Geneweb.Cousins)

      Module Geneweb.Cousins

      val default_max_cnt : int

      Default number of relatives that could be listed at the same page

      val children_of_fam : Gwdb.base -> Gwdb.ifam -> Gwdb.iper list

      Retruns list of children of the giving family

      val siblings : Config.config -> Gwdb.base -> Gwdb.iper -> (Gwdb.iper * (Gwdb.iper * Def.sex)) list

      Returns list of person's siblings that includes also half-blood siblings. Every sibling is annotated with parent's id and parent's sex. For common father's and mother's childran father's annotation is preserved.

      val has_desc_lev : Config.config -> Gwdb.base -> int -> Gwdb.person -> bool

      has_desc_lev conf base lev p tells if person p has descendants at the level lev. lev 2 represents his children, 3 represents grandchildren, etc.

      val br_inter_is_empty : ('a * 'b) list -> ('a * 'c) list -> bool

      Tells if two family branches don't itersect

      val sibling_has_desc_lev : Config.config -> Gwdb.base -> int -> (Gwdb.iper * 'a) -> bool

      Same as has_desc_lev but used for a person's sibling as returned by siblings.

      val sosa_of_persons : Config.config -> Gwdb.base -> Gwdb.iper list -> int

      Returns sosa number calculated from the giving ancestors list.

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/CousinsDisplay/index.html b/static/doc/geneweb/Geneweb/CousinsDisplay/index.html deleted file mode 100644 index d83e1f19ac..0000000000 --- a/static/doc/geneweb/Geneweb/CousinsDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -CousinsDisplay (geneweb.Geneweb.CousinsDisplay)

      Module Geneweb.CousinsDisplay

      val print : Config.config -> Gwdb.base -> Gwdb.person -> unit

      Displays the menu that lists all person's relatives depending on ancestor and his descandant levels specified by conf.env variables v1 (for ancestor) and v2 for his descandant. For exemple :

      "v1" = 1, "v2" = 1 - Displays all person's siblings (mount to the person's parent (ancestor of level 1) and lists all his children (descandant of level 1)); "v1" = 2, "v2" = 2 - Displays all cousins; "v1" = 2, "v2" = 1 - Displays all uncles/aunts; "v1" = 1, "v2" = 2 - Displays all nieces/nephews; etc.

      Variable "t" is used to display anniversaries for relatives like BirthdayDisplay.gen_print. If nor of those variables are defined, prints menu that allows to access the most common relatives (except for direct relatives) like cousins, siblings, uncles/aunts, etc.

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Dag/Pset/index.html b/static/doc/geneweb/Geneweb/Dag/Pset/index.html deleted file mode 100644 index 1f46a10452..0000000000 --- a/static/doc/geneweb/Geneweb/Dag/Pset/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Pset (geneweb.Geneweb.Dag.Pset)

      Module Dag.Pset

      type t = Gwdb.iper list
      type elt = Gwdb.iper
      val add : 'a -> 'a list -> 'a list
      val empty : 'a list
      val elements : 'a list -> 'a list
      val mem : 'a -> 'a list -> bool
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Dag/index.html b/static/doc/geneweb/Geneweb/Dag/index.html deleted file mode 100644 index 07c3dc88cc..0000000000 --- a/static/doc/geneweb/Geneweb/Dag/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Dag (geneweb.Geneweb.Dag)

      Module Geneweb.Dag

      module Pset : sig ... end
      val get_dag_elems : Config.config -> Gwdb.base -> Gwdb.iper list
      type ('a, 'b) sum = ('a'b) Def.choice
      val make_dag : Config.config -> Gwdb.base -> Gwdb.iper list -> (Gwdb.iper, int) Def.choice Dag2html.dag
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Dag2html/index.html b/static/doc/geneweb/Geneweb/Dag2html/index.html deleted file mode 100644 index 72db3c0d7d..0000000000 --- a/static/doc/geneweb/Geneweb/Dag2html/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Dag2html (geneweb.Geneweb.Dag2html)

      Module Geneweb.Dag2html

      type 'a dag = {
      mutable dag : 'a node array;
      }
      and 'a node = {
      mutable pare : idag list;
      valu : 'a;
      mutable chil : idag list;
      }
      and idag
      val int_of_idag : idag -> int
      val idag_of_int : int -> idag
      type 'a table = {
      mutable table : 'a data array array;
      }
      and 'a data = {
      mutable elem : 'a elem;
      mutable span : span_id;
      }
      and 'a elem =
      | Elem of 'a
      | Ghost of ghost_id
      | Nothing
      and span_id
      and ghost_id
      type align =
      | LeftA
      | CenterA
      | RightA
      type ('a, 'b) table_data =
      | TDitem of 'a
      | TDtext of string
      | TDhr of align
      | TDbar of 'b option
      | TDnothing
      type ('a, 'b) html_table_line = (int * align * ('a'b) table_data) array
      type ('a, 'b) html_table = ('a'b) html_table_line array
      val html_table_struct : ('a node -> 'b) -> ('a node -> 'c) -> ('a node -> bool) -> 'a dag -> idag table -> (int * align * ('b'c) table_data) array array
      val table_of_dag : ('a node -> bool) -> bool -> bool -> bool -> 'a dag -> idag table
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/DagDisplay/index.html b/static/doc/geneweb/Geneweb/DagDisplay/index.html deleted file mode 100644 index f7f24a1f10..0000000000 --- a/static/doc/geneweb/Geneweb/DagDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -DagDisplay (geneweb.Geneweb.DagDisplay)

      Module Geneweb.DagDisplay

      val image_txt : Config.config -> Gwdb.base -> Gwdb.person -> string
      type item =
      | Item of Gwdb.person * string
      val make_tree_hts : Config.config -> Gwdb.base -> (Gwdb.person -> item) -> (Gwdb.iper -> string) -> bool -> Gwdb.iper list -> (Gwdb.iper * (Gwdb.iper * Gwdb.ifam option)) list -> (Gwdb.iper'a) Def.choice Dag2html.dag -> (int * Dag2html.align * (string, string) Dag2html.table_data) array array
      type dag_item = string
      val print_slices_menu_or_dag_page : Config.config -> string -> (int * Dag2html.align * (dag_item, string) Dag2html.table_data) array array -> string -> unit
      val make_and_print_dag : Config.config -> Gwdb.base -> (Gwdb.person -> item) -> (Gwdb.iper -> string) -> bool -> Gwdb.iper list -> (Gwdb.iper * (Gwdb.iper * Gwdb.ifam option)) list -> string -> string -> unit
      val print : Config.config -> Gwdb.base -> unit
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/DateDisplay/index.html b/static/doc/geneweb/Geneweb/DateDisplay/index.html deleted file mode 100644 index b7c3a58135..0000000000 --- a/static/doc/geneweb/Geneweb/DateDisplay/index.html +++ /dev/null @@ -1,3 +0,0 @@ - -DateDisplay (geneweb.Geneweb.DateDisplay)

      Module Geneweb.DateDisplay

      val get_wday : Config.config -> Def.date -> string

      get_wday conf date Return the day of the week for this date

      val code_dmy : Config.config -> Def.dmy -> string

      Returns textual representation of the date translated to the current language. Uses different encodings depending on day's, month's and year's accessibility. Doesn't consider precision.

      val string_of_dmy : Config.config -> Def.dmy -> string

      Converts and translate date to the textual representation for the giving language. Considers precision.

      val string_of_date : Config.config -> Def.date -> string

      If date is Dgreg calls for string_of_dmy to convert date to the string else returns content of Dtext. Difference between calendars is not taken into the acount.

      val string_of_ondate : ?link:bool -> Config.config -> Def.date -> string

      Converts and translate date with considering different calendars with prefix "on" before dates (changes for other languages). Date precision is much more verbose then with string_of_date. Decline phrase if needed. If link is true then encapsulates result in HTML link to the page calendar's date converter.

      val string_slash_of_date : Config.config -> Def.date -> string

      Returns date in format dd/mm/yyyy. Format could be different for other languages (defined by !dates order keyword in the lexicon).

      val string_of_age : Config.config -> Def.dmy -> string

      Returns textual representation of the age represented by dmy.

      val prec_year_text : Config.config -> Def.dmy -> string

      Returns textual representation of date's precision and year.

      val prec_text : Config.config -> Def.dmy -> string

      Returns textual representation of date's precision

      val month_text : Def.dmy -> string

      Returns textual representation of date's month number.

      val year_text : Def.dmy -> string

      Returns textual representation of date's year.

      val short_dates_text : Config.config -> Gwdb.base -> Gwdb.person -> string

      Returns concatenation of person's birth and death dates (if exists). Precision is mentionned for each date. For example :

      * 1700-1780 (birth - death) * 1700- (birth - death but don't know when) * 1700 (birth - alive) * †1780 (unknown birth date - death) * † (unknown birth date - death but don't know when)

      val short_marriage_date_text : Config.config -> Gwdb.base -> Gwdb.family -> Gwdb.person -> Gwdb.person -> string

      Retruns year of marriage for given spouses with its precision.

      val death_symbol : Config.config -> string

      death_symbol conf Return the value associated to "death_symbol" in .gwf file if it is defined, or use "†" if it is not.

      val code_french_year : Config.config -> int -> string

      Returns roman number of the year of French calendar

      val string_of_date_aux : ?link:bool -> ?dmy:(Config.config -> Def.dmy -> string) -> ?sep:string -> -Config.config -> Def.date -> string

      Same as string_of_ondate except :

      • Conversion function for Def.dmy could be passed in in dmy argument
      • Doesn't consider phrase declination as string_of_ondate does.
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/DescendDisplay/index.html b/static/doc/geneweb/Geneweb/DescendDisplay/index.html deleted file mode 100644 index 95eb3c1165..0000000000 --- a/static/doc/geneweb/Geneweb/DescendDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -DescendDisplay (geneweb.Geneweb.DescendDisplay)

      Module Geneweb.DescendDisplay

      val display_descendants_level : Config.config -> Gwdb.base -> int -> Gwdb.person -> unit

      Displays only descendants for specified level in unordered lists

      val display_descendants_with_numbers : Config.config -> Gwdb.base -> int -> Gwdb.person -> unit

      Displays descendants with numerated by letter list. Title links to descendats index

      val display_descendant_index : Config.config -> Gwdb.base -> int -> Gwdb.person -> unit

      Displays index of descendants

      val display_spouse_index : Config.config -> Gwdb.base -> int -> Gwdb.person -> unit

      Displays index of descendant's spouses

      val display_descendant_with_table : Config.config -> Gwdb.base -> int -> Gwdb.person -> unit

      Displays descendants in the table where rows are ordered by D'Aboville number.

      val print_tree : Config.config -> Gwdb.base -> int -> Gwdb.person -> unit

      Displays tree of descendants

      val print_aboville : Config.config -> Gwdb.base -> int -> Gwdb.person -> unit

      Displays descendants as follows :

      person | desc1 | desc2 | | desc21 | desc3

      val desmenu_print : Config.config -> Gwdb.base -> Gwdb.person -> unit

      Prints form that allows to customise display of descendants

      val print : Config.config -> Gwdb.base -> Gwdb.person -> unit

      Displays the descendants of the selected in conv.env person. Descendants could be displayed by different ways depending on variable t in conv.env environement:

      • "L" dispalying descendants in unordered list
      • "F" same as "L" but displays only female line
      • "M" same as "L" but displays only female line
      • "H" table dispalying
      • "I" table dispalying with spouses information
      • "A" numerated list (d'Aboville)
      • "V" displaying a tree of descendants

      Previous dispalyings are done by template evaluation. Next ones are done by functions inside this module:

      • "B" for print_aboville
      • "S" for display_descendants_level
      • "K" for display_descendant_with_table
      • "N" for display_descendants_with_numbers
      • "G" for display_descendant_index
      • "C" for display_spouse_index
      • "T" for print_tree

      Variable v is used to select maximal level to descend for descendant displaying (1 for children, 2 for grandchildren, etc). If t variable isn't defined, then displays the form that allows customising of display.

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Difference/index.html b/static/doc/geneweb/Geneweb/Difference/index.html deleted file mode 100644 index a4cc1ee993..0000000000 --- a/static/doc/geneweb/Geneweb/Difference/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Difference (geneweb.Geneweb.Difference)

      Module Geneweb.Difference

      Differences between two arrays.

      val f : 'a array -> 'a array -> bool array * bool array

      Difference.f a1 a2 returns a couple of two arrays of booleans (d1, d2). d1 has the same size as a1. d2 has the same size as a2. d1.(i) is True if a1.(i) has no corresponding value in a2. d2.(i) is True if a2.(i) has no corresponding value in a1. d1 and s2 have the same number of values equal to False.

      Can be used to write the diff program (comparison of two files), the input arrays being the array of lines of each file.

      Can be used also to compare two strings (they must have been exploded into arrays of chars), or two DNA strings, and so on.

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Fixbase/index.html b/static/doc/geneweb/Geneweb/Fixbase/index.html deleted file mode 100644 index 5a68510ce6..0000000000 --- a/static/doc/geneweb/Geneweb/Fixbase/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Fixbase (geneweb.Geneweb.Fixbase)

      Module Geneweb.Fixbase

      All the function of this module scan the base and fix what is considered as corrupted data.

      They all share a same signature : let check_XXX ?report progress base = ...

      The optionnal report function should be used to track changes.

      progress i max keep tracks of the progress of a task. When called, task is about i/max done.

      Note that it does not actually commit the changes, so if you do not want a dry run, apply Gwdb.commit_patches

      type patch =
      | Fix_NBDS of Gwdb.iper
      | Fix_AddedUnion of Gwdb.iper
      | Fix_AddedParents of Gwdb.iper
      | Fix_ParentDeleted of Gwdb.iper
      | Fix_AddedChild of Gwdb.ifam
      | Fix_RemovedUnion of Gwdb.iper * Gwdb.ifam
      | Fix_RemovedDuplicateUnion of Gwdb.iper * Gwdb.ifam
      | Fix_AddedRelatedFromPevent of Gwdb.iper * Gwdb.iper
      | Fix_AddedRelatedFromFevent of Gwdb.iper * Gwdb.iper
      | Fix_MarriageDivorce of Gwdb.ifam
      | Fix_MissingSpouse of Gwdb.ifam * Gwdb.iper
      | Fix_WrongUTF8Encoding of Gwdb.ifam option * Gwdb.iper option * (Gwdb.istr * Gwdb.istr) option
      | Fix_UpdatedOcc of Gwdb.iper * int * int

      All possible patches that could be automatically deducted from incontinent or absent information in the database

      val check_NBDS : ?report:(patch -> unit) -> (int -> int -> unit) -> Gwdb.base -> unit

      For every person in the base synchronise his birth, death, baptism and burial events with his fields and vice versa.

      val check_families_parents : ?report:(patch -> unit) -> (int -> int -> unit) -> Gwdb.base -> unit

      For every family's parent in the base add current family to the parent's union (if absent).

      val check_families_children : ?report:(patch -> unit) -> (int -> int -> unit) -> Gwdb.base -> unit

      For every family's childran in the base add current family to the childran's ascendants (if absent). Doesn't modify consanguinity rate.

      val check_persons_parents : ?report:(patch -> unit) -> (int -> int -> unit) -> Gwdb.base -> unit

      For every person checks it ascendants. If it references to the dummy family, then remove this reference. Otherwise add person to the family's children if he is absent.

      val check_persons_families : ?report:(patch -> unit) -> (int -> int -> unit) -> Gwdb.base -> unit

      For every person in the base removes all duplicate families and families where person isn't a parent

      val check_pevents_witnesses : ?report:(patch -> unit) -> (int -> int -> unit) -> Gwdb.base -> unit

      For every person's event's witness add current person to the list of related persons if absent.

      val check_fevents_witnesses : ?report:(patch -> unit) -> (int -> int -> unit) -> Gwdb.base -> unit

      For every family's event's witness add family's father to the list of related persons if absent.

      val fix_marriage_divorce : ?report:(patch -> unit) -> (int -> int -> unit) -> Gwdb.base -> unit

      For every family in the base synchronise its fields with marriage and divorce events.

      val fix_missing_spouses : ?report:(patch -> unit) -> (int -> int -> unit) -> Gwdb.base -> unit

      For every family's missing parent (or spouse) fix his id and add current family to the parent's union

      val fix_utf8_sequence : ?report:(patch -> unit) -> (int -> int -> unit) -> Gwdb.base -> unit

      For every person's and family's string remplace it with normalized UTF8 version

      val fix_key : ?report:(patch -> unit) -> (int -> int -> unit) -> Gwdb.base -> unit

      For every person in the base update his occurence number if someone with same name and same occurence number already exists in the base.

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/GWPARAM/index.html b/static/doc/geneweb/Geneweb/GWPARAM/index.html deleted file mode 100644 index ce5dfbdf99..0000000000 --- a/static/doc/geneweb/Geneweb/GWPARAM/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -GWPARAM (geneweb.Geneweb.GWPARAM)

      Module Geneweb.GWPARAM

      type syslog_level = [
      | `LOG_ALERT
      | `LOG_CRIT
      | `LOG_DEBUG
      | `LOG_EMERG
      | `LOG_ERR
      | `LOG_INFO
      | `LOG_NOTICE
      | `LOG_WARNING
      ]

      The level of log gravity (`LOG_WARNING the lightest).

      val init : (unit -> unit) Stdlib.ref

      Inititialise assets for gwd server (one in current directory one in /usr/share/geneweb)

      val base_path : (string list -> string -> string) Stdlib.ref

      !base_path pref fname default function that returns path to fname inside base directory where pref is a list of subdirectories between base directory and fname.

      val bpath : (string -> string) Stdlib.ref

      !bpath fname default function that returns path to fname inside base directory

      val output_error : (?headers:string list -> ?content:string -> Config.config -> Def.httpStatus -> unit) Stdlib.ref

      !output_error ?headers ?content conf status default function that send the http status status, headers and content if provided. Otherwise send default content from /etc/<status-code>-<lang>.html

      val p_auth : (Config.config -> Gwdb.base -> Gwdb.person -> bool) Stdlib.ref

      Calculate the access rights to the person's information in according to his age. Returns (in the order of the tests) :

      • True if : requester is wizard or friend or person is public
      • True if : person has at least one title and public_if_title is set to yes in gwf config file
      • False if : person is alive and private_years > 0
      • True if : person is older (depending on the date of birth or baptism date) then privates_years
      • False if : person is younger (depending on the date of birth or baptism date) then privates_years
      • True if : person has been deceased for more than privates_years
      • False if : person has been deceased for less than privates_years
      • True if : person is between 80 and 120 years old and he is not beeing private and public_if_no_date is set to yes in gwf config file
      • True if : person has been married for more than private_years
      • False otherwise
      val syslog : (syslog_level -> string -> unit) Stdlib.ref

      !syslog level log log message log with gravity level level on stderr.

      val wrap_output : (Config.config -> string -> (unit -> unit) -> unit) Stdlib.ref
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/GWPARAM_ITL/index.html b/static/doc/geneweb/Geneweb/GWPARAM_ITL/index.html deleted file mode 100644 index 122fdff886..0000000000 --- a/static/doc/geneweb/Geneweb/GWPARAM_ITL/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -GWPARAM_ITL (geneweb.Geneweb.GWPARAM_ITL)

      Module Geneweb.GWPARAM_ITL

      val init_cache : (Config.config -> Gwdb.base -> Gwdb.iper -> int -> int -> int -> unit) Stdlib.ref

      init_cache conf base ip nb_asc from_gen_desc nb_desc

      val max_ancestor_level : (Config.config -> Gwdb.base -> Gwdb.iper -> string -> int -> int -> int) Stdlib.ref
      val max_descendant_level : (Config.config -> Gwdb.base -> Gwdb.iper -> int -> int) Stdlib.ref
      val tree_generation_list : (Config.config -> Gwdb.base -> string -> Gwdb.person -> (Gwdb.person * Gwdb.ifam * string) option * (Gwdb.person * Gwdb.ifam * string) option) Stdlib.ref
      val get_father : (Config.config -> Gwdb.base -> string -> Gwdb.iper -> ((Gwdb.person * bool) * string) option) Stdlib.ref
      val get_mother : (Config.config -> Gwdb.base -> string -> Gwdb.iper -> ((Gwdb.person * bool) * string) option) Stdlib.ref
      val get_person : (Config.config -> Gwdb.base -> string -> Gwdb.iper -> ((Gwdb.person * bool) * string) option) Stdlib.ref
      val get_father' : (Config.config -> Gwdb.base -> Gwdb.iper -> (string * (Gwdb.person * bool) * Gwdb.ifam * Gwdb.family * (Gwdb.iper * Gwdb.iper * Gwdb.iper)) option) Stdlib.ref
      val get_mother' : (Config.config -> Gwdb.base -> Gwdb.iper -> (string * (Gwdb.person * bool) * Gwdb.ifam * Gwdb.family * (Gwdb.iper * Gwdb.iper * Gwdb.iper)) option) Stdlib.ref
      val get_family : (Config.config -> Gwdb.base -> string -> Gwdb.person -> Gwdb.ifam -> (Gwdb.family * (Gwdb.iper * Gwdb.iper * Gwdb.iper) * bool) option) Stdlib.ref
      val get_families : (Config.config -> Gwdb.base -> Gwdb.person -> (Gwdb.ifam * Gwdb.family * (Gwdb.iper * Gwdb.iper * Gwdb.person) * string * bool) list) Stdlib.ref
      val get_children_of_parents : (Gwdb.base -> string -> Gwdb.ifam -> Gwdb.iper -> Gwdb.iper -> (Gwdb.person * string) list) Stdlib.ref
      val get_children : (Gwdb.base -> string -> Gwdb.ifam -> Gwdb.iper -> Gwdb.iper -> ((Gwdb.person * bool) * string) list) Stdlib.ref
      val get_children' : (Config.config -> Gwdb.base -> Gwdb.iper -> Gwdb.family -> Gwdb.iper -> (string * (Gwdb.iper * Gwdb.iper * Gwdb.iper) * ((Gwdb.person * bool) * string * bool) list) list) Stdlib.ref
      val has_children : (Config.config -> Gwdb.base -> Gwdb.person -> Gwdb.family -> bool) Stdlib.ref
      val has_family_correspondance : (string -> Gwdb.iper -> bool) Stdlib.ref
      val has_siblings : (string -> Gwdb.iper -> bool) Stdlib.ref
      val nb_children : (string -> Gwdb.ifam -> int) Stdlib.ref
      val nb_families : (string -> Gwdb.iper -> int) Stdlib.ref
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Gwlib/index.html b/static/doc/geneweb/Geneweb/Gwlib/index.html deleted file mode 100644 index 4b7926199c..0000000000 --- a/static/doc/geneweb/Geneweb/Gwlib/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Gwlib (geneweb.Geneweb.Gwlib)

      Module Geneweb.Gwlib

      val prefix : string
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/History/index.html b/static/doc/geneweb/Geneweb/History/index.html deleted file mode 100644 index b7c401adcf..0000000000 --- a/static/doc/geneweb/Geneweb/History/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -History (geneweb.Geneweb.History)

      Module Geneweb.History

      val file_name : Config.config -> string

      Retruns path to the file where history of updates is stored

      val record : Config.config -> Gwdb.base -> (Gwdb.iperGwdb.iperGwdb.ifam, string) Def.base_changed -> string -> unit

      record conf change action records new modification in the history files (global file and specific for each concerned by modification person). Additionaly it does:

      • Updates conf.default_sosa_ref if concered by modification person is referenced by default_sosa_ref
      • Notify foreign notify_change about modification on the base (doesn't notify if multiple modifications are done succesively)
      val notify : Config.config -> Gwdb.base -> string -> unit

      notify conf base action Explicit notification of foreign script notify_change that modification action action was executed on the database. Since record already does notify script about unary modification on the base, this function is used exclusively to send notification about multiple modifications and avoid creating indefinite amount of processes for each modification (for example for each concerned person in the list of modified persons).

      val print : Config.config -> Gwdb.base -> unit

      Displays an history of updates

      Same as `print`, but simultaneously searches for text inside the history and higlhight all found matches. Search pattern is available with s variable in environement conf.env.

      val line_fields : string -> (string * string * string * string option) option

      Parses one line of history file that delimits one modification record.

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/HistoryDiff/index.html b/static/doc/geneweb/Geneweb/HistoryDiff/index.html deleted file mode 100644 index 395b04264c..0000000000 --- a/static/doc/geneweb/Geneweb/HistoryDiff/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -HistoryDiff (geneweb.Geneweb.HistoryDiff)

      Module Geneweb.HistoryDiff

      type gen_record = {
      date : string;
      wizard : string;
      gen_p : (Gwdb.iperGwdb.iper, string) Def.gen_person;
      gen_f : (Gwdb.iperGwdb.ifam, string) Def.gen_family list;
      gen_c : Gwdb.iper array list;
      }

      Type that represnets one update record stored in the history file for concerned person.

      val history_file : string -> string -> int -> string

      Returns history filename for the person with the given key. Has format : firstname.occ.surname

      val history_path : Config.config -> string -> string

      Returns path to the history file inside history_d with given filename

      val record_diff : Config.config -> Gwdb.base -> (Gwdb.iperGwdb.iperGwdb.ifam, string) Def.base_changed -> unit

      record_diff conf base change records new updated information change inside the history files of concerned by change persons. 

      val load_person_history : Config.config -> string -> gen_record list

      Loadlist of modification records for a giving person's history file. The most recent modification is at the head of the list

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/HistoryDiffDisplay/index.html b/static/doc/geneweb/Geneweb/HistoryDiffDisplay/index.html deleted file mode 100644 index 0c71bc6958..0000000000 --- a/static/doc/geneweb/Geneweb/HistoryDiffDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -HistoryDiffDisplay (geneweb.Geneweb.HistoryDiffDisplay)

      Module Geneweb.HistoryDiffDisplay

      val print_clean : Config.config -> unit

      Displays page that allows to select all revision of the history file in argument that user may want to clean

      val print_clean_ok : Config.config -> unit

      Cleans the history associated to the history file in argument

      val print : Config.config -> Gwdb.base -> unit

      Displays the page that allows to select (with variable t = "SUM") and to view (with variable t = "DIFF") the difference between all revisions of history file of concerned person in variable f. Intepretate the template file updhist_diff.txt

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Hutil/index.html b/static/doc/geneweb/Geneweb/Hutil/index.html deleted file mode 100644 index d5128bdb24..0000000000 --- a/static/doc/geneweb/Geneweb/Hutil/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Hutil (geneweb.Geneweb.Hutil)

      Module Geneweb.Hutil

      val header_without_http : Config.config -> (bool -> unit) -> unit

      header_without_http conf title pritns HTML page header in the body of the current response on the socket. HTML page header consists of :

      • <!DOCTYPE> Declaration
      • <head> tag where :
      • content of <title> tag is get with title true
      • <meta> and <link> tags are filled due to conf
      • content of <style> tag is evaluated and send by interpretation of template etc/css.txt
      • Opening <body> tag with its attributes
      • If user is a wizard or a friend, then includes all messages send to him.
      val gen_trailer : bool -> Config.config -> unit

      gen_trailer with_logo prints HTML page trailer in the body of the current response on the socket. HTML page header consists of :

      • Copyright message from template etc/copyr.txt with inserted logo if with_logo is true
      • Scripts JS from template etc/js.txt
      • Closing <body> and <html> tags
      val header_without_page_title : Config.config -> (bool -> unit) -> unit

      Calls for Util.html to print HTTP header and for header_without_http to print HTML page header. Additionaly prints opening container <div> tag on the socket.

      val header : Config.config -> (bool -> unit) -> unit

      header conf title calls for header_without_page_title to print HTTP header and HTML page header. Additionaly prints page title with title true (false to print browser tab title).

      val header_no_page_title : Config.config -> (bool -> unit) -> unit

      Same as header but takes page title from conf.env.

      val header_fluid : Config.config -> (bool -> unit) -> unit

      Pritns HTML page header (without HTTP headers) and opens fluid container <div> (see Bootstrap).

      Same as header but insert links to previous and home pages (with print_link_to_welcome) before page title.

      val trailer : Config.config -> unit

      Same as gen_trailer true.

      val rheader : Config.config -> (bool -> unit) -> unit

      Same as header except page's title informs about an occured error (red title).

      Returns the HTML link to the previous (referer) page

      gen_print_link_to_welcome f conf right_alined prints links to previous and to home pages. f is used to print additional content before links.

      Calls gen_print_link_to_welcome with empty function f.

      val incorrect_request : Config.config -> unit

      Sends Bad Request HTTP response (same as GWPARAM.output_error conf Bad_Request)

      val interp : Config.config -> string -> ('a'b) Templ.interp_fun -> 'a Templ.env -> 'b -> unit
      val interp_no_header : Config.config -> string -> ('a'b) Templ.interp_fun -> 'a Templ.env -> 'b -> unit
      val print_calendar : Config.config -> unit

      Displays the calendar; if no key is set, it will use today's date. Based on template file calendar.txt

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/ImageDisplay/index.html b/static/doc/geneweb/Geneweb/ImageDisplay/index.html deleted file mode 100644 index 55c809c562..0000000000 --- a/static/doc/geneweb/Geneweb/ImageDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -ImageDisplay (geneweb.Geneweb.ImageDisplay)

      Module Geneweb.ImageDisplay

      val print_image_file : Config.config -> string -> bool

      print_image_file conf fname send HTTP respose with content of an image file at the path fname. MIME type of an image is deducted from fname extension. Returns false if image wasn't found or couldn't be send.

      val print : Config.config -> Gwdb.base -> unit

      Searhes image's filename in the environement conf.env and sends HTTP respose with its content on the socket. If filename isn't presented, looks up personal image for person's mentionned in conf.env

      val print_html : Config.config -> unit

      Sends HTTP respose with HTML page containg just image specified in arguments.

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/MergeDisplay/index.html b/static/doc/geneweb/Geneweb/MergeDisplay/index.html deleted file mode 100644 index 64fe1c5c1d..0000000000 --- a/static/doc/geneweb/Geneweb/MergeDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -MergeDisplay (geneweb.Geneweb.MergeDisplay)

      Module Geneweb.MergeDisplay

      val print_someone : Config.config -> Gwdb.base -> Gwdb.person -> unit

      Prints person's key on the socket

      val print : Config.config -> Gwdb.base -> Gwdb.person -> unit

      Displays a menu for merging two persons

      val print_possible_continue_merging : Config.config -> Gwdb.base -> unit

      Prints link on the page to continue merging two persons (or two duplications).

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/MergeDupDisplay/index.html b/static/doc/geneweb/Geneweb/MergeDupDisplay/index.html deleted file mode 100644 index 803898cd64..0000000000 --- a/static/doc/geneweb/Geneweb/MergeDupDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -MergeDupDisplay (geneweb.Geneweb.MergeDupDisplay)

      Module Geneweb.MergeDupDisplay

      val main_page : Config.config -> Gwdb.base -> unit

      Displays a menu for merging possible duplications of persons

      val answ_ind_y_n : Config.config -> Gwdb.base -> unit

      Either displays the merge dupliate menu if `answer_y` is not a key of the request, or a form for merging two persons

      val answ_fam_y_n : Config.config -> Gwdb.base -> unit

      Same than `answ_ind_y_n` but for families

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/MergeFamDisplay/index.html b/static/doc/geneweb/Geneweb/MergeFamDisplay/index.html deleted file mode 100644 index e32ab54e61..0000000000 --- a/static/doc/geneweb/Geneweb/MergeFamDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -MergeFamDisplay (geneweb.Geneweb.MergeFamDisplay)

      Module Geneweb.MergeFamDisplay

      val print_differences : Config.config -> Gwdb.base -> (Gwdb.iper * Gwdb.iper) list -> (Gwdb.ifam * Gwdb.family) -> (Gwdb.ifam * Gwdb.family) -> unit

      Displays differences between couples ; relation kind, marriage, marriage place and divorce.

      val print : Config.config -> Gwdb.base -> unit

      Displays a menu for merging families. Couples must be identical (modulo reversion).

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/MergeFamOk/index.html b/static/doc/geneweb/Geneweb/MergeFamOk/index.html deleted file mode 100644 index bc0af02d20..0000000000 --- a/static/doc/geneweb/Geneweb/MergeFamOk/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -MergeFamOk (geneweb.Geneweb.MergeFamOk)

      Module Geneweb.MergeFamOk

      val print_merge : Config.config -> Gwdb.base -> unit
      val print_mod_merge : Config.config -> Gwdb.base -> unit
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/MergeInd/index.html b/static/doc/geneweb/Geneweb/MergeInd/index.html deleted file mode 100644 index 63d29d3245..0000000000 --- a/static/doc/geneweb/Geneweb/MergeInd/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -MergeInd (geneweb.Geneweb.MergeInd)

      Module Geneweb.MergeInd

      val reparent_ind : Gwdb.base -> (CheckItem.base_warning -> unit) -> Gwdb.iper -> Gwdb.iper -> unit
      exception Error_loop of Gwdb.person
      exception Same_person
      exception Different_sexes of Gwdb.person * Gwdb.person
      val kill_ancestors : Config.config -> Gwdb.base -> bool -> Gwdb.person -> int Stdlib.ref -> int Stdlib.ref -> unit
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/MergeIndDisplay/index.html b/static/doc/geneweb/Geneweb/MergeIndDisplay/index.html deleted file mode 100644 index 8b1f25c09d..0000000000 --- a/static/doc/geneweb/Geneweb/MergeIndDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -MergeIndDisplay (geneweb.Geneweb.MergeIndDisplay)

      Module Geneweb.MergeIndDisplay

      val print : Config.config -> Gwdb.base -> unit

      Displays a form for merging two persons

      val print_kill_ancestors : Config.config -> Gwdb.base -> unit

      Displays the page for killing ancestors (undocumented feature)

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/MergeIndOk/index.html b/static/doc/geneweb/Geneweb/MergeIndOk/index.html deleted file mode 100644 index b03f85cb20..0000000000 --- a/static/doc/geneweb/Geneweb/MergeIndOk/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -MergeIndOk (geneweb.Geneweb.MergeIndOk)

      Module Geneweb.MergeIndOk

      val reconstitute : Config.config -> Gwdb.base -> Gwdb.person -> Gwdb.person -> (Gwdb.iper, string * string * int * Update.create * string, string) Def.gen_person
      val effective_mod_merge : Config.config -> Gwdb.base -> (Gwdb.iperGwdb.iper, string) Def.gen_person -> (Gwdb.iperGwdb.iper, string) Def.gen_person -> (Gwdb.iperUpdate.key, string) Def.gen_person -> (Config.config -> Gwdb.base -> CheckItem.base_warning list -> (Gwdb.iperGwdb.iperGwdb.istr) Def.gen_person -> (Gwdb.iperGwdb.ifam) Def.NLDB.page list -> string -> string -> int -> (Gwdb.iperGwdb.ifam) Def.NLDB.page list -> string -> string -> int -> 'a) -> 'a
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/MergeIndOkDisplay/index.html b/static/doc/geneweb/Geneweb/MergeIndOkDisplay/index.html deleted file mode 100644 index e926613da0..0000000000 --- a/static/doc/geneweb/Geneweb/MergeIndOkDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -MergeIndOkDisplay (geneweb.Geneweb.MergeIndOkDisplay)

      Module Geneweb.MergeIndOkDisplay

      val print_merge : Config.config -> Gwdb.base -> unit
      val print_mod_merge : Config.config -> Gwdb.base -> unit
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Notes/index.html b/static/doc/geneweb/Geneweb/Notes/index.html deleted file mode 100644 index eeb6b5d92e..0000000000 --- a/static/doc/geneweb/Geneweb/Notes/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Notes (geneweb.Geneweb.Notes)

      Module Geneweb.Notes

      module StrSet = Mutil.StrSet
      val file_path : Config.config -> Gwdb.base -> string -> string
      val path_of_fnotes : string -> string
      val read_notes : Gwdb.base -> string -> (string * string) list * string
      val merge_possible_aliases : Config.config -> (('a'b) Def.NLDB.page * (string list * 'c list)) list -> (('a'b) Def.NLDB.page * (string list * 'c list)) list
      val commit_notes : Config.config -> Gwdb.base -> string -> string -> unit
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/NotesDisplay/index.html b/static/doc/geneweb/Geneweb/NotesDisplay/index.html deleted file mode 100644 index aff7b26734..0000000000 --- a/static/doc/geneweb/Geneweb/NotesDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -NotesDisplay (geneweb.Geneweb.NotesDisplay)

      Module Geneweb.NotesDisplay

      val print_linked_list : Config.config -> Gwdb.base -> (Gwdb.iperGwdb.ifam) Def.NLDB.page list -> unit

      Displays the page list in argument

      val print : Config.config -> Gwdb.base -> unit

      Displays the base notes

      val print_mod : Config.config -> Gwdb.base -> unit

      Displays a text form for writing notes

      val print_mod_ok : Config.config -> Gwdb.base -> unit

      Updates notes

      val print_misc_notes : Config.config -> Gwdb.base -> unit

      Displays a menu to search in notes

      Same as `print_misc_notes`, with a default search

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/NotesLinks/index.html b/static/doc/geneweb/Geneweb/NotesLinks/index.html deleted file mode 100644 index a7f6391030..0000000000 --- a/static/doc/geneweb/Geneweb/NotesLinks/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -NotesLinks (geneweb.Geneweb.NotesLinks)

      Module Geneweb.NotesLinks

      val char_dir_sep : char
      val check_file_name : string -> (string list * string) option
      val update_db : Gwdb.base -> (Gwdb.iperGwdb.ifam) Def.NLDB.page -> (string list * (Def.NLDB.key * Def.NLDB.ind) list) -> unit
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Output/index.html b/static/doc/geneweb/Geneweb/Output/index.html deleted file mode 100644 index b52a7e772c..0000000000 --- a/static/doc/geneweb/Geneweb/Output/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Output (geneweb.Geneweb.Output)

      Module Geneweb.Output

      val status : Config.config -> Def.httpStatus -> unit

      status conf answer print HTTP status line to the socket where answer is a HTTP status.

      val header : Config.config -> ('a, unit, string, unit) Stdlib.format4 -> 'a

      Formatter printing of the HTTP header (header line) to the socket. If used without seting HTTP status with status, it is set OK.

      val print_string : Config.config -> string -> unit

      Printing the part of HTTP response body on the socket. If used without seting HTTP status with status, it is set OK.

      val printf : Config.config -> ('a, unit, string, unit) Stdlib.format4 -> 'a

      Formatter printing of the part of HTTP response body on the socket. If used without seting HTTP status with status, it is set OK.

      val flush : Config.config -> unit

      Flushes (send) printed previously content of the buffer on the socket.

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Perso/index.html b/static/doc/geneweb/Geneweb/Perso/index.html deleted file mode 100644 index 6410802442..0000000000 --- a/static/doc/geneweb/Geneweb/Perso/index.html +++ /dev/null @@ -1,3 +0,0 @@ - -Perso (geneweb.Geneweb.Perso)

      Module Geneweb.Perso

      type generation_person =
      | GP_person of Sosa.t * Gwdb.iper * Gwdb.ifam option
      | GP_same of Sosa.t * Sosa.t * Gwdb.iper
      | GP_interv of (Sosa.t * Sosa.t * (Sosa.t * Sosa.t) option) option
      | GP_missing of Sosa.t * Gwdb.iper
      val string_of_marriage_text : Config.config -> Gwdb.base -> Gwdb.family -> string
      val interp_templ : ?no_headers:bool -> string -> Config.config -> Gwdb.base -> Gwdb.person -> unit
      val interp_templ_with_menu : (bool -> unit) -> string -> Config.config -> Gwdb.base -> Gwdb.person -> unit
      val interp_notempl_with_menu : (bool -> unit) -> string -> Config.config -> Gwdb.base -> Gwdb.person -> unit
      val print : ?no_headers:bool -> Config.config -> Gwdb.base -> Gwdb.person -> unit

      Displays the HTML page of a person

      val print_ascend : Config.config -> Gwdb.base -> Gwdb.person -> unit

      Displays the ascendants of the selected person

      Displays links to pages associated to the person

      val build_sosa_tree_ht : Config.config -> Gwdb.base -> Gwdb.person -> unit

      Construts from the giving person sosa table strored in the cache. Sosa table contains association person_id -> sosa number for each person in the base. Person has sosa Sosa.one and his ancestors have sosa > Sosa.one. For non ancestor person sosa number is set to Sosa.zero.

      val build_sosa_ht : Config.config -> Gwdb.base -> unit

      Extract referenced person from environement and constructs for him sosa table wiht build_sosa_tree_ht.

      val get_sosa_person : Gwdb.person -> Sosa.t
      val get_single_sosa : Config.config -> Gwdb.base -> Gwdb.person -> Sosa.t
      val print_sosa : Config.config -> Gwdb.base -> Gwdb.person -> bool -> unit
      val get_linked_page : Config.config -> Gwdb.base -> Gwdb.person -> string -> string
      val get_birth_text : Config.config -> Gwdb.person -> bool -> string
      val get_baptism_text : Config.config -> Gwdb.person -> bool -> string
      val get_death_text : Config.config -> Gwdb.person -> bool -> string
      val get_burial_text : Config.config -> Gwdb.person -> bool -> string
      val get_cremation_text : Config.config -> Gwdb.person -> bool -> string
      val get_marriage_date_text : Config.config -> Gwdb.family -> bool -> string
      val linked_page_text : Config.config -> Gwdb.base -> Gwdb.person -> string -> 'a -> string -> ((Gwdb.iperGwdb.ifam) Def.NLDB.page * ('b * ('a * Def.NLDB.ind) list)) -> string
      val max_ancestor_level : Config.config -> Gwdb.base -> Gwdb.iper -> int -> int
      val string_of_died : Config.config -> Gwdb.person -> bool -> string
      val string_of_parent_age : Config.config -> Gwdb.base -> (Gwdb.person * bool) -> (Gwdb.family -> Gwdb.iper) -> string
      val string_of_image_url : Config.config -> Gwdb.base -> (Gwdb.person * bool) -> bool -> string
      val round_2_dec : float -> float
      val has_children : Gwdb.base -> Gwdb.person -> bool
      val string_of_image_size : Config.config -> Gwdb.base -> (Gwdb.person * bool) -> string
      val string_of_image_medium_size : Config.config -> Gwdb.base -> (Gwdb.person * bool) -> string
      val string_of_image_small_size : Config.config -> Gwdb.base -> (Gwdb.person * bool) -> string
      val infinite : int
      val limit_desc : Config.config -> int
      val make_desc_level_table : Config.config -> Gwdb.base -> int -> Gwdb.person -> (Util.IperSet.elt, int) Gwdb.Marker.t * (Gwdb.ifam, int) Gwdb.Marker.t
      val default_max_cousin_lev : int
      type dup =
      | DupFam of Gwdb.ifam * Gwdb.ifam
      | DupInd of Gwdb.iper * Gwdb.iper
      | NoDup
      type excl_dup = (Gwdb.iper * Gwdb.iper) list * (Gwdb.ifam * Gwdb.ifam) list
      val excluded_possible_duplications : Config.config -> excl_dup
      val first_possible_duplication : Gwdb.base -> Gwdb.iper -> excl_dup -> dup
      val nobility_titles_list : Config.config -> Gwdb.base -> Gwdb.person -> (int * Gwdb.istr Def.gen_title_name * Gwdb.istr * Gwdb.istr list * (Adef.date option * Adef.date option) list) list
      val has_history : Config.config -> Gwdb.base -> Gwdb.person -> bool -> bool
      val has_possible_duplications : Config.config -> Gwdb.base -> Gwdb.person -> bool
      val string_of_title : ?link:bool -> -Config.config -> Gwdb.base -> string -> Gwdb.person -> (int * Gwdb.istr Def.gen_title_name * Gwdb.istr * Gwdb.istr list * (Def.date option * Def.date option) list) -> string

      Optionnal link argument is passed to DateDisplay.string_of_ondate

      type event_name =
      | Pevent of Gwdb.istr Def.gen_pers_event_name
      | Fevent of Gwdb.istr Def.gen_fam_event_name
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Place/index.html b/static/doc/geneweb/Geneweb/Place/index.html deleted file mode 100644 index 28e752b192..0000000000 --- a/static/doc/geneweb/Geneweb/Place/index.html +++ /dev/null @@ -1,4 +0,0 @@ - -Place (geneweb.Geneweb.Place)

      Module Geneweb.Place

      val suburb_aux : (string -> int -> int -> int -> 'a) -> (string -> 'a) -> string -> 'a
      val split_suburb : string -> string * string

      split_suburb "[foo-bar] - boobar (baz)" is 9"foo-bar", "boobar (baz)")

      val only_suburb : string -> string

      only_suburb "[foo-bar] - boobar (baz)" is "foo-bar" only_suburb "boobar (baz)" is ""

      val without_suburb : string -> string

      without_suburb "[foo-bar] - boobar (baz)" is "boobar (baz)" without_suburb "boobar (baz)" is "boobar (baz)"

      val normalize : string -> string

      Transform "[foo-bar] - boobar (baz)" into "foo-bar, boobar (baz)"

      val compare_places : string -> string -> int
      val fold_place_long : bool -> string -> string list
      val fold_place_short : bool -> string -> string
      exception List_too_long
      val get_all : Config.config -> Gwdb.base -> add_birth:bool -> add_baptism:bool -> add_death:bool -> -add_burial:bool -> add_marriage:bool -> -'a -> 'c -> (string -> 'a) -> ('a -> bool) -> ('b option -> Gwdb.person -> 'b) -> ('b -> 'c) -> int -> ('a * 'c) array
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/PlaceDisplay/index.html b/static/doc/geneweb/Geneweb/PlaceDisplay/index.html deleted file mode 100644 index c1daf89fd1..0000000000 --- a/static/doc/geneweb/Geneweb/PlaceDisplay/index.html +++ /dev/null @@ -1,6 +0,0 @@ - -PlaceDisplay (geneweb.Geneweb.PlaceDisplay)

      Module Geneweb.PlaceDisplay

      val print_html_places_surnames : Config.config -> Gwdb.base -> (string list * (string * Gwdb.iper list) list) array -> unit
      val print_aux_opt : add_birth:bool -> add_baptism:bool -> add_death:bool -> -add_burial:bool -> add_marriage:bool -> string
      val print_aux : Config.config -> (bool -> unit) -> (unit -> 'a) -> unit
      val print_all_places_surnames_short : Config.config -> Gwdb.base -> add_birth:bool -> add_baptism:bool -> -add_death:bool -> add_burial:bool -> add_marriage:bool -> unit
      val print_all_places_surnames_long : Config.config -> Gwdb.base -> string -> add_birth:bool -> -add_baptism:bool -> add_death:bool -> add_burial:bool -> add_marriage:bool -> -int -> unit
      val print_all_places_surnames : Config.config -> Gwdb.base -> unit
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Relation/index.html b/static/doc/geneweb/Geneweb/Relation/index.html deleted file mode 100644 index 0cb8a30c2a..0000000000 --- a/static/doc/geneweb/Geneweb/Relation/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Relation (geneweb.Geneweb.Relation)

      Module Geneweb.Relation

      val round_2_dec : float -> float
      type 'a dag_ind = {
      di_val : 'a;
      mutable di_famc : 'a dag_fam;
      mutable di_fams : 'a dag_fam;
      }
      and 'a dag_fam = {
      mutable df_pare : 'a dag_ind list;
      df_chil : 'a dag_ind list;
      }
      val dag_ind_list_of_path : ('a * famlink) list -> 'a option dag_ind list
      val add_missing_parents_of_siblings : Config.config -> Gwdb.base -> Gwdb.iper option dag_ind list -> Gwdb.iper option dag_ind list
      val dag_fam_list_of_ind_list : 'a dag_ind list -> 'a dag_fam list
      val add_phony_children : 'a option dag_ind list -> 'a option dag_fam list -> 'a option dag_ind list
      val add_common_parent : Gwdb.base -> Gwdb.iper -> Gwdb.iper -> Gwdb.iper list -> Gwdb.iper list
      val ind_set_of_relation_path : Gwdb.base -> (Gwdb.iper * famlink) list -> Gwdb.iper list
      type node =
      | NotVisited
      | Visited of bool * Gwdb.iper * famlink
      val excl_faml : Config.config -> Gwdb.base -> Gwdb.ifam list
      val get_shortest_path_relation : Config.config -> Gwdb.base -> Gwdb.iper -> Gwdb.iper -> Gwdb.ifam list -> ((Gwdb.iper * famlink) list * Gwdb.ifam) option
      val simplify_path : 'a -> Gwdb.base -> (Gwdb.iper * famlink) list -> (Gwdb.iper * famlink) list

      simplify_path conf base path Removes unnecessary people from the path (e.g. half sibling when only parents are useful)

      (HalfSibling|Sibling|Child) as x -> Child -> HalfSibling becomes x -> Mate -> Child

      HalfSibling -> Parent becomes Parent -> Mate -> Mate -> Parent

      val nb_fields : string -> int
      val belongs_to_branch : 'a -> 'b -> ('b * 'c * 'a list) list -> bool
      val get_piece_of_branch : Config.config -> Gwdb.base -> ((((Gwdb.iper'a) Gwdb.Marker.t * (Gwdb.person * 'b) list) * int) * ('a -> (int * 'c * Gwdb.iper list) list)) -> (int * int) -> Gwdb.iper list
      val compute_simple_relationship : Config.config -> Gwdb.base -> (Gwdb.iper, int) Gwdb.Marker.t -> Gwdb.iper -> Gwdb.iper -> ((int * int * (Gwdb.person * int) list) list * Sosa.t * float * (Gwdb.iperConsang.relationship) Gwdb.Marker.t) option
      val known_spouses_list : Config.config -> Gwdb.base -> Gwdb.person -> Gwdb.person -> Gwdb.person list
      val merge_relations : ('a option * 'b option * (int * int * 'c) * 'd) list -> ('a option * 'b option * (int * int * 'c) * 'd) list -> ('a option * 'b option * (int * int * 'c) * 'd) list
      val combine_relationship : Config.config -> Gwdb.base -> (Gwdb.iper, int) Gwdb.Marker.t -> Gwdb.person list -> Gwdb.person list -> (Gwdb.person -> 'a) -> (Gwdb.person -> 'b) -> (('a * 'b * (int * int * (Gwdb.person * int) list)) list * Sosa.t * (Gwdb.iperConsang.relationship) Gwdb.Marker.t) list -> (('a * 'b * (int * int * (Gwdb.person * int) list)) list * Sosa.t * (Gwdb.iperConsang.relationship) Gwdb.Marker.t) list
      val sp : 'a -> 'a option
      val no_sp : 'a -> 'b option
      val compute_relationship : Config.config -> Gwdb.base -> bool -> Gwdb.person -> Gwdb.person -> ((Gwdb.person option * Gwdb.person option * (int * int * (Gwdb.person * int) list) * (Gwdb.iperConsang.relationship) Gwdb.Marker.t) list * Sosa.t * float) option
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/RelationDisplay/index.html b/static/doc/geneweb/Geneweb/RelationDisplay/index.html deleted file mode 100644 index 765348c0ef..0000000000 --- a/static/doc/geneweb/Geneweb/RelationDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -RelationDisplay (geneweb.Geneweb.RelationDisplay)

      Module Geneweb.RelationDisplay

      val dag_of_ind_dag_list : 'a option Relation.dag_ind list -> ('a, int) Def.choice Dag2html.node list
      val dag_of_relation_path : Config.config -> Gwdb.base -> (Gwdb.iper * Relation.famlink) list -> Gwdb.iper list * (Gwdb.iper, int) Def.choice Dag2html.dag
      val old_print_relationship_dag : Config.config -> Gwdb.base -> (Gwdb.person -> DagDisplay.item) -> (Gwdb.iper -> string) -> (Gwdb.iper * Relation.famlink) list -> string -> unit
      val print_relationship_dag : Config.config -> Gwdb.base -> (Gwdb.person -> DagDisplay.item) -> (Gwdb.iper -> string) -> (Gwdb.iper * Relation.famlink) list -> string -> unit
      val print_relation_path : Config.config -> Gwdb.base -> Gwdb.iper -> Gwdb.iper -> (Gwdb.iper * Relation.famlink) list -> Gwdb.ifam -> Gwdb.ifam list -> unit
      val print_shortest_path : Config.config -> Gwdb.base -> Gwdb.person -> Gwdb.person -> unit
      val parents_label : Config.config -> Gwdb.base -> ((((Gwdb.iper'a) Gwdb.Marker.t * (Gwdb.person * 'b) list) * int) * ('a -> (int * 'c * Gwdb.iper list) list)) -> int -> string
      val parent_in_law_label : Config.config -> Def.sex -> Def.sex -> string
      val ancestor_label : Config.config -> Gwdb.base -> ((((Gwdb.iper'a) Gwdb.Marker.t * (Gwdb.person * 'b) list) * int) * ('a -> (int * 'c * Gwdb.iper list) list)) -> int -> Def.sex -> string
      val child_in_law_label : Config.config -> Def.sex -> Def.sex -> string
      val descendant_label : Config.config -> Gwdb.base -> (((Gwdb.iperConsang.relationship) Gwdb.Marker.t * (Gwdb.person * 'a) list) * int) -> int -> Gwdb.person -> string
      val brother_label : Config.config -> int -> Def.sex -> string
      val half_brother_label : Config.config -> Def.sex -> string
      val brother_in_law_label : Config.config -> Def.sex -> Def.sex -> string
      val uncle_label : Config.config -> Gwdb.base -> (((Gwdb.iperConsang.relationship) Gwdb.Marker.t * (Gwdb.person * 'a) list) * int) -> int -> Gwdb.person -> string
      val nephew_label : Config.config -> int -> Gwdb.person -> string
      val same_parents : Config.config -> Gwdb.base -> Gwdb.person -> Gwdb.person -> bool
      val string_of_big_int : Config.config -> int -> string
      val print_solution_ancestor : Config.config -> Gwdb.base -> bool -> Gwdb.person -> Gwdb.person -> Gwdb.person option -> Gwdb.person option -> int -> int -> (Gwdb.person * int) list -> unit
      val print_solution_not_ancestor : Config.config -> Gwdb.base -> bool -> Gwdb.person -> Gwdb.person -> (Gwdb.person option * Gwdb.person option * (int * int * (Gwdb.person * int) list) * (Gwdb.iperConsang.relationship) Gwdb.Marker.t) -> unit
      val print_solution : Config.config -> Gwdb.base -> bool -> int -> Gwdb.person -> Gwdb.person -> (Gwdb.person option * Gwdb.person option * (int * int * (Gwdb.person * int) list) * (Gwdb.iperConsang.relationship) Gwdb.Marker.t) -> unit
      val max_br : int
      val print_propose_upto : Config.config -> Gwdb.base -> Gwdb.person -> Gwdb.person -> ('a option * 'b option * (int * int * 'c) * 'd) list -> unit
      val print_one_path : Config.config -> Gwdb.base -> ((Gwdb.iper * Def.sex) list * (Gwdb.iper * Def.sex) list) list Stdlib.ref -> Gwdb.person -> Gwdb.person -> Gwdb.person -> Gwdb.person option -> Gwdb.person option -> int -> int -> unit
      val print_path : Config.config -> Gwdb.base -> Gwdb.person -> Gwdb.person -> (Gwdb.person option * Gwdb.person option * (int * int * (Gwdb.person * 'a) list) * 'b) -> unit
      val print_main_relationship : Config.config -> Gwdb.base -> bool -> Gwdb.person -> Gwdb.person -> ((Gwdb.person option * Gwdb.person option * (int * int * (Gwdb.person * int) list) * (Gwdb.iperConsang.relationship) Gwdb.Marker.t) list * Sosa.t * float) option -> unit
      val multi_relation_next_txt : Config.config -> Gwdb.person list -> int -> (Gwdb.iper, string) Stdlib.Hashtbl.t -> string
      val print_no_relationship : Config.config -> Gwdb.base -> Gwdb.person list -> unit
      val print_multi_relation : Config.config -> Gwdb.base -> Gwdb.person list -> int -> (Gwdb.iper, string) Stdlib.Hashtbl.t -> unit
      val print_base_loop : Config.config -> Gwdb.base -> Gwdb.person -> unit
      val relmenu_print : Config.config -> Gwdb.base -> Gwdb.person -> unit
      val print : Config.config -> Gwdb.base -> Gwdb.person -> Gwdb.person option -> unit
      val print_multi : Config.config -> Gwdb.base -> unit
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/RelationLink/index.html b/static/doc/geneweb/Geneweb/RelationLink/index.html deleted file mode 100644 index 2361d62f46..0000000000 --- a/static/doc/geneweb/Geneweb/RelationLink/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -RelationLink (geneweb.Geneweb.RelationLink)

      Module Geneweb.RelationLink

      type info = {
      ip : Gwdb.iper;
      sp : Def.sex;
      ip1 : Gwdb.iper;
      ip2 : Gwdb.iper;
      b1 : (Gwdb.iper * Def.sex) list;
      b2 : (Gwdb.iper * Def.sex) list;
      c1 : int;
      c2 : int;
      pb1 : (Gwdb.iper * Def.sex) list option;
      pb2 : (Gwdb.iper * Def.sex) list option;
      nb1 : (Gwdb.iper * Def.sex) list option;
      nb2 : (Gwdb.iper * Def.sex) list option;
      sp1 : Gwdb.person option;
      sp2 : Gwdb.person option;
      bd : int;
      td_prop : string;
      }
      val threshold : int Stdlib.ref
      val make_dist_tab : Config.config -> Gwdb.base -> Gwdb.iper -> int -> (Gwdb.iper -> int) * (Gwdb.iper -> int)
      val find_first_branch : Config.config -> Gwdb.base -> ((Gwdb.iper -> int) * (Gwdb.iper -> int)) -> Gwdb.iper -> int -> Gwdb.iper -> Def.sex -> (Gwdb.iper * Def.sex) list option
      val print_relation_path : Config.config -> Gwdb.base -> info -> unit
      val print : Config.config -> Gwdb.base -> unit
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/SearchName/index.html b/static/doc/geneweb/Geneweb/SearchName/index.html deleted file mode 100644 index 9db535cfaa..0000000000 --- a/static/doc/geneweb/Geneweb/SearchName/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -SearchName (geneweb.Geneweb.SearchName)

      Module Geneweb.SearchName

      val search_key_aux : (Config.config -> Gwdb.base -> Gwdb.person list -> string -> Gwdb.person list) -> Config.config -> Gwdb.base -> string -> Gwdb.person list

      search_key_aux aux conf base str search persons by misc name str (could be one of the mix). If result is empty tries to it search names with roman number instead of numerals (if they are present in the name). Applies aux on the result and removes all dublicates. Empty persons, persons with private names or persons to which there are no rights to access are not listed.

      val search_by_name : Config.config -> Gwdb.base -> string -> Gwdb.person list

      Search persons by name that has format "firstname surname". Dublicates are possible. Empty persons, persons with private names or persons to which there are no rights to access are not listed.

      val search_partial_key : Config.config -> Gwdb.base -> string -> Gwdb.person list

      Calls search_key_aux with aux fonction that makes calls to search_by_name if result is empty.

      val search_by_sosa : Config.config -> Gwdb.base -> string -> Gwdb.person list
      val search_by_key : Config.config -> Gwdb.base -> string -> Gwdb.person list

      Same as search_by_name but search by key that has format "firstname.occ surname".

      val search_approx_key : Config.config -> Gwdb.base -> string -> Gwdb.person list

      Calls search_key_aux with aux fonction that filter result list and only persons whose fname^sname or one of their misc names are equal to key.

      val print : Config.config -> Gwdb.base -> (Config.config -> Gwdb.base -> string -> Gwdb.person list -> unit) -> (Config.config -> string -> unit) -> unit
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Some/index.html b/static/doc/geneweb/Geneweb/Some/index.html deleted file mode 100644 index 99f468d0f9..0000000000 --- a/static/doc/geneweb/Geneweb/Some/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Some (geneweb.Geneweb.Some)

      Module Geneweb.Some

      val surname_not_found : Config.config -> string -> unit
      val persons_of_fsname : Config.config -> Gwdb.base -> (Gwdb.base -> string -> Gwdb.istr list) -> (Gwdb.istr -> Gwdb.iper list) -> (Gwdb.person -> Gwdb.istr) -> string -> (string * Gwdb.istr * Gwdb.iper list) list * (string -> string)

      persons_of_fsname conf base base_strings_of_fsname find proj x function where:

      • base_strings_of_fsname base x is a function that returns the list of first/surnames (as istr) being equal to x
      • find istr is a function that returns the list of persons having istr as a first/surname id
      • proj iper is a function that returns first/surname id from the giving person id.
      • x is a first/surname or its substring.

      Returns (l,inj) where l is a list of (str,istr,iperl) where istr is id of str and iperl is a list of persons found that has istr as a first/surname such that str = inj x

      val first_name_print : Config.config -> Gwdb.base -> string -> unit
      val surname_print : Config.config -> Gwdb.base -> (Config.config -> string -> unit) -> string -> unit
      val search_surname : Config.config -> Gwdb.base -> string -> Gwdb.iper list
      val search_surname_print : Config.config -> Gwdb.base -> (Config.config -> string -> unit) -> string -> unit
      val search_first_name : Config.config -> Gwdb.base -> string -> (string * (Mutil.StrSet.t * Gwdb.iper list)) list
      val search_first_name_print : Config.config -> Gwdb.base -> string -> unit
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/SrcfileDisplay/index.html b/static/doc/geneweb/Geneweb/SrcfileDisplay/index.html deleted file mode 100644 index c5ecc44014..0000000000 --- a/static/doc/geneweb/Geneweb/SrcfileDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -SrcfileDisplay (geneweb.Geneweb.SrcfileDisplay)

      Module Geneweb.SrcfileDisplay

      type src_mode =
      | Lang
      | Source
      val print : Config.config -> Gwdb.base -> string -> unit
      val print_source : Config.config -> Gwdb.base -> string -> unit
      val print_start : Config.config -> Gwdb.base -> unit
      val incr_welcome_counter : Config.config -> (int * int * string) option
      val incr_request_counter : Config.config -> (int * int * string) option
      val adm_file : string -> string

      Compute administration file path with giving name (search inside cnt directory)

      val source_file_name : Config.config -> string -> string
      val copy_from_stream : Config.config -> Gwdb.base -> char Stdlib.Stream.t -> src_mode -> unit
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Stats/index.html b/static/doc/geneweb/Geneweb/Stats/index.html deleted file mode 100644 index 73ea5870a3..0000000000 --- a/static/doc/geneweb/Geneweb/Stats/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Stats (geneweb.Geneweb.Stats)

      Module Geneweb.Stats

      type stats = {
      mutable men : int;
      mutable women : int;
      mutable neutre : int;
      mutable noname : int;
      mutable oldest_father : int * Gwdb.person;
      mutable oldest_mother : int * Gwdb.person;
      mutable youngest_father : int * Gwdb.person;
      mutable youngest_mother : int * Gwdb.person;
      mutable oldest_dead : int * Gwdb.person;
      mutable oldest_still_alive : int * Gwdb.person;
      }

      Statistic about persons in database

      val stat_base : Gwdb.base -> stats

      Compute stats from the database's persons

      val print_stats : Gwdb.base -> stats -> unit

      Prints statistic stats on stdout

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Templ/index.html b/static/doc/geneweb/Geneweb/Templ/index.html deleted file mode 100644 index 5ee53a7646..0000000000 --- a/static/doc/geneweb/Geneweb/Templ/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Templ (geneweb.Geneweb.Templ)

      Module Geneweb.Templ

      type 'a vother
      type 'a env = (string * 'a) list
      val eval_transl : Config.config -> bool -> string -> string -> string
      type ('a, 'b) interp_fun = {
      eval_var : 'a env -> 'b -> TemplAst.loc -> string list -> 'b TemplAst.expr_val;
      eval_transl : 'a env -> bool -> string -> string -> string;
      eval_predefined_apply : 'a env -> string -> 'b TemplAst.expr_val list -> string;
      get_vother : 'a -> 'b vother option;
      set_vother : 'b vother -> 'a;
      print_foreach : ('a env -> 'b -> TemplAst.ast -> unit) -> ('a env -> 'b -> TemplAst.ast -> string) -> 'a env -> 'b -> TemplAst.loc -> string -> string list -> TemplAst.ast list list -> TemplAst.ast list -> unit;
      }
      val interp_ast : Config.config -> ('a'b) interp_fun -> 'a env -> 'b -> TemplAst.ast list -> unit
      val input_templ : Config.config -> string -> TemplAst.ast list option

      Evaluates and prints content of cpr template. If template wasn't found prints basic copyrigth HTML structure.

      Calls print_copyright with config where variable with_logo is set to "yes"

      val include_hed_trl : Config.config -> string -> unit
      val copy_from_templ : Config.config -> string env -> Stdlib.in_channel -> unit
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/TemplAst/index.html b/static/doc/geneweb/Geneweb/TemplAst/index.html deleted file mode 100644 index bfab1e2890..0000000000 --- a/static/doc/geneweb/Geneweb/TemplAst/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -TemplAst (geneweb.Geneweb.TemplAst)

      Module Geneweb.TemplAst

      type ast =
      | Atext of loc * string
      | Avar of loc * string * string list
      | Atransl of loc * bool * string * string
      | Aconcat of loc * ast list
      | Awid_hei of string
      | Aif of ast * ast list * ast list
      | Aforeach of loc * string * string list * ast list list * ast list
      | Afor of string * ast * ast * ast list
      | Adefine of string * string list * ast list * ast list
      | Aapply of loc * string * ast list list
      | Alet of string * ast list * ast list
      | Aop1 of loc * string * ast
      | Aop2 of loc * string * ast * ast
      | Aint of loc * string
      | Ainclude of string * ast list
      and loc = string * int * int
      type 'a expr_val =
      | VVbool of bool
      | VVstring of string
      | VVother of string list -> 'a expr_val
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/TemplDate/index.html b/static/doc/geneweb/Geneweb/TemplDate/index.html deleted file mode 100644 index 76cd462a66..0000000000 --- a/static/doc/geneweb/Geneweb/TemplDate/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -TemplDate (geneweb.Geneweb.TemplDate)

      Module Geneweb.TemplDate

      val eval_date_var : Config.config -> int -> string list -> 'a TemplAst.expr_val
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Templ_parser/index.html b/static/doc/geneweb/Geneweb/Templ_parser/index.html deleted file mode 100644 index 468fb0350c..0000000000 --- a/static/doc/geneweb/Geneweb/Templ_parser/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Templ_parser (geneweb.Geneweb.Templ_parser)

      Module Geneweb.Templ_parser

      val dump_list : ('a -> string) -> 'a list -> string
      val current_file : string Stdlib.ref
      val wrap : string -> (unit -> 'a) -> 'a
      val line_of_loc : 'a -> (string * int * int) -> (int * int * int) option
      val dummy_pos : int * int
      val pos : Stdlib.Lexing.lexbuf -> string * int * int
      exception Templ_parser_exc of string * int * int
      val fail : Stdlib.Lexing.lexbuf -> ?pos:(string * int * int) -> unit -> 'a
      val dump_ast : ?truncate:int -> ?depth:int -> TemplAst.ast -> string
      val included_files : (string * TemplAst.ast list) list Stdlib.ref
      val flush : TemplAst.ast list -> Stdlib.Buffer.t -> Stdlib.Lexing.lexbuf -> TemplAst.ast list
      val __ocaml_lex_tables : Stdlib.Lexing.lex_tables
      val parse_ast : Config.config -> Stdlib.Buffer.t -> string list -> TemplAst.ast list -> Stdlib.Lexing.lexbuf -> TemplAst.ast list * string
      val __ocaml_lex_parse_ast_rec : Config.config -> Stdlib.Buffer.t -> string list -> TemplAst.ast list -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast list * string
      val parse_ident_list : Stdlib.Lexing.lexbuf -> string list
      val __ocaml_lex_parse_ident_list_rec : Stdlib.Lexing.lexbuf -> int -> string list
      val parse_expr : Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_rec : Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_if : Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_if_rec : Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_if_1 : TemplAst.ast -> Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_if_1_rec : TemplAst.ast -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_if_2 : TemplAst.ast -> TemplAst.ast -> Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_if_2_rec : TemplAst.ast -> TemplAst.ast -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_or : Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_or_rec : Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_or_1 : TemplAst.ast -> Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_or_1_rec : TemplAst.ast -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_and : Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_and_rec : Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_and_1 : TemplAst.ast -> Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_and_1_rec : TemplAst.ast -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_is_substr : Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_is_substr_rec : Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_is_substr_1 : TemplAst.ast -> Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_is_substr_1_rec : TemplAst.ast -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_in : Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_in_rec : Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_in_1 : TemplAst.ast -> Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_in_1_rec : TemplAst.ast -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_3 : Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_3_rec : Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_3_1 : TemplAst.ast -> Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_3_1_rec : TemplAst.ast -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_4 : Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_4_rec : Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_4_1 : TemplAst.ast -> Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_4_1_rec : TemplAst.ast -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_5 : Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_5_rec : Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_5_1 : TemplAst.ast -> Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_5_1_rec : TemplAst.ast -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_simple_expr : Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_simple_expr_rec : Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_simple_expr_1 : Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_simple_expr_1_rec : Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val discard_RPAREN : Stdlib.Lexing.lexbuf -> unit
      val __ocaml_lex_discard_RPAREN_rec : Stdlib.Lexing.lexbuf -> int -> unit
      val parse_tuple : Stdlib.Lexing.lexbuf -> TemplAst.ast list list
      val __ocaml_lex_parse_tuple_rec : Stdlib.Lexing.lexbuf -> int -> TemplAst.ast list list
      val parse_tuple_1 : Stdlib.Lexing.lexbuf -> TemplAst.ast list list
      val __ocaml_lex_parse_tuple_1_rec : Stdlib.Lexing.lexbuf -> int -> TemplAst.ast list list
      val parse_expr_list : Stdlib.Lexing.lexbuf -> TemplAst.ast list list
      val __ocaml_lex_parse_expr_list_rec : Stdlib.Lexing.lexbuf -> int -> TemplAst.ast list list
      val parse_expr_list_1 : TemplAst.ast -> Stdlib.Lexing.lexbuf -> TemplAst.ast list list
      val __ocaml_lex_parse_expr_list_1_rec : TemplAst.ast -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast list list
      val parse_char_stream_semi : (Stdlib.Lexing.lexbuf -> TemplAst.ast) -> (Stdlib.Lexing.lexbuf -> TemplAst.ast) -> Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_char_stream_semi_rec : (Stdlib.Lexing.lexbuf -> TemplAst.ast) -> (Stdlib.Lexing.lexbuf -> TemplAst.ast) -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val discard_opt_semi : Stdlib.Lexing.lexbuf -> unit
      val __ocaml_lex_discard_opt_semi_rec : Stdlib.Lexing.lexbuf -> int -> unit
      val lexicon_word : Stdlib.Lexing.lexbuf -> bool * string * string
      val __ocaml_lex_lexicon_word_rec : Stdlib.Lexing.lexbuf -> int -> bool * string * string
      val lexicon_index : Stdlib.Lexing.lexbuf -> string
      val __ocaml_lex_lexicon_index_rec : Stdlib.Lexing.lexbuf -> int -> string
      val value : Stdlib.Lexing.lexbuf -> string
      val __ocaml_lex_value_rec : Stdlib.Lexing.lexbuf -> int -> string
      val compound_var : Stdlib.Lexing.lexbuf -> string list
      val __ocaml_lex_compound_var_rec : Stdlib.Lexing.lexbuf -> int -> string list
      val variable : Stdlib.Lexing.lexbuf -> [ `comment | `escaped of char | `variable of string list ]
      val __ocaml_lex_variable_rec : Stdlib.Lexing.lexbuf -> int -> [ `comment | `escaped of char | `variable of string list ]
      val variable_ident : Stdlib.Lexing.lexbuf -> string list
      val __ocaml_lex_variable_ident_rec : Stdlib.Lexing.lexbuf -> int -> string list
      val transl_index : Stdlib.Lexing.lexbuf -> string
      val __ocaml_lex_transl_index_rec : Stdlib.Lexing.lexbuf -> int -> string
      val lexicon_word_text : Stdlib.Buffer.t -> int -> Stdlib.Lexing.lexbuf -> string
      val __ocaml_lex_lexicon_word_text_rec : Stdlib.Buffer.t -> int -> Stdlib.Lexing.lexbuf -> int -> string
      val comment : Stdlib.Lexing.lexbuf -> unit
      val __ocaml_lex_comment_rec : Stdlib.Lexing.lexbuf -> int -> unit
      val parse_define : Config.config -> Stdlib.Buffer.t -> string list -> TemplAst.ast list -> Stdlib.Lexing.lexbuf -> TemplAst.ast list * string
      val __ocaml_lex_parse_define_rec : Config.config -> Stdlib.Buffer.t -> string list -> TemplAst.ast list -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast list * string
      val parse_params : Stdlib.Lexing.lexbuf -> string list
      val __ocaml_lex_parse_params_rec : Stdlib.Lexing.lexbuf -> int -> string list
      val parse_params_1 : Stdlib.Lexing.lexbuf -> string list
      val __ocaml_lex_parse_params_1_rec : Stdlib.Lexing.lexbuf -> int -> string list
      val parse_let : Config.config -> Stdlib.Buffer.t -> string list -> TemplAst.ast list -> Stdlib.Lexing.lexbuf -> TemplAst.ast list * string
      val __ocaml_lex_parse_let_rec : Config.config -> Stdlib.Buffer.t -> string list -> TemplAst.ast list -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast list * string
      val parse_include : Config.config -> Stdlib.Buffer.t -> string list -> TemplAst.ast list -> Stdlib.Lexing.lexbuf -> TemplAst.ast list * string
      val __ocaml_lex_parse_include_rec : Config.config -> Stdlib.Buffer.t -> string list -> TemplAst.ast list -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast list * string
      val parse_apply : Config.config -> Stdlib.Buffer.t -> Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_apply_rec : Config.config -> Stdlib.Buffer.t -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_expr_stmt : Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_expr_stmt_rec : Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_if : Config.config -> Stdlib.Buffer.t -> Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_if_rec : Config.config -> Stdlib.Buffer.t -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_for : Config.config -> Stdlib.Buffer.t -> Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_for_rec : Config.config -> Stdlib.Buffer.t -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_foreach : Config.config -> Stdlib.Buffer.t -> Stdlib.Lexing.lexbuf -> TemplAst.ast
      val __ocaml_lex_parse_foreach_rec : Config.config -> Stdlib.Buffer.t -> Stdlib.Lexing.lexbuf -> int -> TemplAst.ast
      val parse_foreach_params : Stdlib.Lexing.lexbuf -> TemplAst.ast list list
      val __ocaml_lex_parse_foreach_params_rec : Stdlib.Lexing.lexbuf -> int -> TemplAst.ast list list
      val parse_templ : Config.config -> Stdlib.Lexing.lexbuf -> TemplAst.ast list
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Title/index.html b/static/doc/geneweb/Geneweb/Title/index.html deleted file mode 100644 index 3016ccb0d0..0000000000 --- a/static/doc/geneweb/Geneweb/Title/index.html +++ /dev/null @@ -1,4 +0,0 @@ - -Title (geneweb.Geneweb.Title)

      Module Geneweb.Title

      module StrSet = Mutil.StrSet
      val date_interval : Config.config -> Gwdb.base -> date_search -> Gwdb.person -> (Def.dmy * Def.dmy) option
      val compare_title_dates : Config.config -> Gwdb.base -> (Gwdb.person * 'a Def.gen_title) -> (Gwdb.person * 'b Def.gen_title) -> int
      val compare_title_order : Config.config -> Gwdb.base -> (Gwdb.person * 'a Def.gen_title) -> (Gwdb.person * 'b Def.gen_title) -> int
      val select_title_place : Config.config -> Gwdb.base -> absolute:bool -> -string -> string -> (Gwdb.person * Gwdb.title) list * string * string * string list
      val select_all_with_place : Config.config -> Gwdb.base -> string -> (Gwdb.person * Gwdb.title) list * string
      val select_title : Config.config -> Gwdb.base -> absolute:bool -> -string -> StrSet.elt list * string * string list
      val select_place : Config.config -> Gwdb.base -> string -> string list * string
      val select_all : (Gwdb.title -> Gwdb.istr) -> Config.config -> Gwdb.base -> StrSet.elt list
      val select_all2 : (Gwdb.title -> Gwdb.istr) -> Config.config -> Gwdb.base -> (string * int) list
      val select_all_titles : Config.config -> Gwdb.base -> (string * int) list
      val select_all_places : Config.config -> Gwdb.base -> StrSet.elt list
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/TitleDisplay/index.html b/static/doc/geneweb/Geneweb/TitleDisplay/index.html deleted file mode 100644 index b21cf0f59f..0000000000 --- a/static/doc/geneweb/Geneweb/TitleDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -TitleDisplay (geneweb.Geneweb.TitleDisplay)

      Module Geneweb.TitleDisplay

      val my_alphabetic : string -> string -> int
      val string_cnt_list_uniq : (string * int) list -> (string * int) list
      val compare_titles2 : (string * 'a) -> (string * 'b) -> int
      val give_access_someone : Config.config -> Gwdb.base -> (Gwdb.person * Gwdb.istr Def.gen_title) -> Gwdb.person list -> unit
      val give_access_title : Config.config -> string -> string -> unit
      val give_access_all_titles : Config.config -> string -> bool -> unit
      val give_access_all_places : Config.config -> string -> unit
      val propose_tree_for_list : (Gwdb.person * 'a) list -> Config.config -> unit
      val print_title_place_list : Config.config -> Gwdb.base -> string -> string -> string list -> (Gwdb.person * Gwdb.istr Def.gen_title) list -> unit
      val print_all_with_place_list : Config.config -> Gwdb.base -> string -> (Gwdb.person * Gwdb.istr Def.gen_title) list -> unit
      val select_title_place : Config.config -> Gwdb.base -> string -> string -> (Gwdb.person * Gwdb.title) list * string * string * string list
      val select_title : Config.config -> Gwdb.base -> string -> Geneweb.Title.StrSet.elt list * string * string list
      val print_title_place : Config.config -> Gwdb.base -> string -> string -> unit
      val print_all_with_place : Config.config -> Gwdb.base -> string -> unit
      val print_places_list : Config.config -> Gwdb.base -> string -> string list -> string list -> unit
      val print_places : Config.config -> Gwdb.base -> string -> unit
      val print_titles : Config.config -> Gwdb.base -> string -> unit
      val print_all_titles : Config.config -> Gwdb.base -> unit
      val print_all_places : Config.config -> Gwdb.base -> unit
      val print : Config.config -> Gwdb.base -> unit
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Translate/index.html b/static/doc/geneweb/Geneweb/Translate/index.html deleted file mode 100644 index f11643fbad..0000000000 --- a/static/doc/geneweb/Geneweb/Translate/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Translate (geneweb.Geneweb.Translate)

      Module Geneweb.Translate

      val inline : string -> char -> (char -> string) -> string -> string * bool
      val language_name : ?sep:char -> string -> string -> string
      val eval : string -> string
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Update/index.html b/static/doc/geneweb/Geneweb/Update/index.html deleted file mode 100644 index 44b788c472..0000000000 --- a/static/doc/geneweb/Geneweb/Update/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Update (geneweb.Geneweb.Update)

      Module Geneweb.Update

      type update_error =
      | UERR of string
      | UERR_sex_married of Gwdb.person
      | UERR_sex_incoherent of Gwdb.base * Gwdb.person
      | UERR_sex_undefined of string * string * int
      | UERR_unknow_person of string * string * int
      | UERR_already_defined of Gwdb.base * Gwdb.person * string
      | UERR_own_ancestor of Gwdb.base * Gwdb.person
      | UERR_digest
      | UERR_bad_date of Def.dmy
      | UERR_missing_field of string
      | UERR_already_has_parents of Gwdb.base * Gwdb.person
      | UERR_missing_surname of string
      | UERR_missing_first_name of string
      exception ModErr of update_error
      type create_info = {
      ci_birth_date : Def.date option;
      ci_birth_place : string;
      ci_death : Def.death;
      ci_death_date : Def.date option;
      ci_death_place : string;
      ci_occupation : string;
      ci_public : bool;
      }
      type create =
      | Create of Def.sex * create_info option
      type key = string * string * int * create * string
      val infer_death : Config.config -> Gwdb.base -> Gwdb.person -> Def.death
      val infer_death_bb : Config.config -> Def.date option -> Def.date option -> Def.death
      val infer_death_from_age : int -> Def.death
      val infer_death_from_parents : Config.config -> Gwdb.base -> Gwdb.family -> Def.death
      val print_same_name : Config.config -> Gwdb.base -> Gwdb.person -> unit
      val print_person_parents_and_spouse : Config.config -> Gwdb.base -> Gwdb.person -> unit
      val insert_person : Config.config -> Gwdb.base -> string -> (Gwdb.iperGwdb.iperGwdb.istr) Def.gen_person list Stdlib.ref -> key -> Gwdb.iper
      val delete_topological_sort_v : Config.config -> Gwdb.base -> unit
      val delete_topological_sort : Config.config -> Gwdb.base -> unit
      val print_return : Config.config -> unit

      Helper function printing a hidden form containing current env, with a submit button "return", plus a hidden field return=on.

      val print_continue : Config.config -> ?continue:string -> string -> string -> unit

      print_continue conf param value Helper function printing a hidden form containing current env, with a submit button "continue", plus a hidden field param=value. Optionnal continue parameter is the label used for the submit button.

      val prerr : Config.config -> update_error -> (unit -> unit) -> 'a

      prerr conf err callback Regular mode: print error page using callback (wrapped in header/trailer) and and raise ModErr err API mode: only raise ModErr err

      val string_of_error : Config.config -> update_error -> string
      val print_error : Config.config -> Gwdb.base -> update_error -> unit
      val print_warnings : Config.config -> Gwdb.base -> CheckItem.base_warning list -> unit
      val print_miscs : Config.config -> Gwdb.base -> CheckItem.base_misc list -> unit
      val print_warnings_and_miscs : Config.config -> Gwdb.base -> CheckItem.base_warning list -> CheckItem.base_misc list -> unit
      val def_error : Config.config -> Gwdb.base -> Gwdb.person Def.error -> unit
      val error : Config.config -> update_error -> 'exn
      val error_locked : Config.config -> unit
      val error_digest : Config.config -> 'exn
      val digest_person : (Gwdb.iperkey, string) Def.gen_person -> Stdlib.Digest.t
      val digest_family : ((key_, string) Def.gen_family * key Def.gen_couple * key Def.gen_descend) -> Stdlib.Digest.t
      val reconstitute_date : Config.config -> string -> Def.date option
      val print_someone : Config.config -> Gwdb.base -> Gwdb.person -> unit
      val update_conf : Config.config -> Config.config
      val bad_date : Config.config -> Def.dmy -> 'a
      val check_greg_day : Config.config -> Def.dmy -> unit
      val check_missing_witnesses_names : Config.config -> ('a -> ((string * string * 'b * 'c * 'd) * 'e) array) -> 'a list -> update_error option
      val check_missing_name : Config.config -> ('a'b, string) Def.gen_person -> update_error option
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/UpdateData/IstrSet/index.html b/static/doc/geneweb/Geneweb/UpdateData/IstrSet/index.html deleted file mode 100644 index 893b9c383e..0000000000 --- a/static/doc/geneweb/Geneweb/UpdateData/IstrSet/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -IstrSet (geneweb.Geneweb.UpdateData.IstrSet)

      Module UpdateData.IstrSet

      type elt = Gwdb.istr
      type t
      val empty : t
      val is_empty : t -> bool
      val mem : elt -> t -> bool
      val add : elt -> t -> t
      val singleton : elt -> t
      val remove : elt -> t -> t
      val union : t -> t -> t
      val inter : t -> t -> t
      val disjoint : t -> t -> bool
      val diff : t -> t -> t
      val compare : t -> t -> int
      val equal : t -> t -> bool
      val subset : t -> t -> bool
      val iter : (elt -> unit) -> t -> unit
      val map : (elt -> elt) -> t -> t
      val fold : (elt -> 'a -> 'a) -> t -> 'a -> 'a
      val for_all : (elt -> bool) -> t -> bool
      val exists : (elt -> bool) -> t -> bool
      val filter : (elt -> bool) -> t -> t
      val partition : (elt -> bool) -> t -> t * t
      val cardinal : t -> int
      val elements : t -> elt list
      val min_elt : t -> elt
      val min_elt_opt : t -> elt option
      val max_elt : t -> elt
      val max_elt_opt : t -> elt option
      val choose : t -> elt
      val choose_opt : t -> elt option
      val split : elt -> t -> t * bool * t
      val find : elt -> t -> elt
      val find_opt : elt -> t -> elt option
      val find_first : (elt -> bool) -> t -> elt
      val find_first_opt : (elt -> bool) -> t -> elt option
      val find_last : (elt -> bool) -> t -> elt
      val find_last_opt : (elt -> bool) -> t -> elt option
      val of_list : elt list -> t
      val to_seq_from : elt -> t -> elt Stdlib.Seq.t
      val to_seq : t -> elt Stdlib.Seq.t
      val add_seq : elt Stdlib.Seq.t -> t -> t
      val of_seq : elt Stdlib.Seq.t -> t
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/UpdateData/PersMap/index.html b/static/doc/geneweb/Geneweb/UpdateData/PersMap/index.html deleted file mode 100644 index a7f02a8def..0000000000 --- a/static/doc/geneweb/Geneweb/UpdateData/PersMap/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -PersMap (geneweb.Geneweb.UpdateData.PersMap)

      Module UpdateData.PersMap

      type key = Gwdb.istr
      type +'a t
      val empty : 'a t
      val is_empty : 'a t -> bool
      val mem : key -> 'a t -> bool
      val add : key -> 'a -> 'a t -> 'a t
      val update : key -> ('a option -> 'a option) -> 'a t -> 'a t
      val singleton : key -> 'a -> 'a t
      val remove : key -> 'a t -> 'a t
      val merge : (key -> 'a option -> 'b option -> 'c option) -> 'a t -> 'b t -> 'c t
      val union : (key -> 'a -> 'a -> 'a option) -> 'a t -> 'a t -> 'a t
      val compare : ('a -> 'a -> int) -> 'a t -> 'a t -> int
      val equal : ('a -> 'a -> bool) -> 'a t -> 'a t -> bool
      val iter : (key -> 'a -> unit) -> 'a t -> unit
      val fold : (key -> 'a -> 'b -> 'b) -> 'a t -> 'b -> 'b
      val for_all : (key -> 'a -> bool) -> 'a t -> bool
      val exists : (key -> 'a -> bool) -> 'a t -> bool
      val filter : (key -> 'a -> bool) -> 'a t -> 'a t
      val partition : (key -> 'a -> bool) -> 'a t -> 'a t * 'a t
      val cardinal : 'a t -> int
      val bindings : 'a t -> (key * 'a) list
      val min_binding : 'a t -> key * 'a
      val min_binding_opt : 'a t -> (key * 'a) option
      val max_binding : 'a t -> key * 'a
      val max_binding_opt : 'a t -> (key * 'a) option
      val choose : 'a t -> key * 'a
      val choose_opt : 'a t -> (key * 'a) option
      val split : key -> 'a t -> 'a t * 'a option * 'a t
      val find : key -> 'a t -> 'a
      val find_opt : key -> 'a t -> 'a option
      val find_first : (key -> bool) -> 'a t -> key * 'a
      val find_first_opt : (key -> bool) -> 'a t -> (key * 'a) option
      val find_last : (key -> bool) -> 'a t -> key * 'a
      val find_last_opt : (key -> bool) -> 'a t -> (key * 'a) option
      val map : ('a -> 'b) -> 'a t -> 'b t
      val mapi : (key -> 'a -> 'b) -> 'a t -> 'b t
      val to_seq : 'a t -> (key * 'a) Stdlib.Seq.t
      val to_seq_from : key -> 'a t -> (key * 'a) Stdlib.Seq.t
      val add_seq : (key * 'a) Stdlib.Seq.t -> 'a t -> 'a t
      val of_seq : (key * 'a) Stdlib.Seq.t -> 'a t
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/UpdateData/PersSet/index.html b/static/doc/geneweb/Geneweb/UpdateData/PersSet/index.html deleted file mode 100644 index 3c706a9b94..0000000000 --- a/static/doc/geneweb/Geneweb/UpdateData/PersSet/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -PersSet (geneweb.Geneweb.UpdateData.PersSet)

      Module UpdateData.PersSet

      type elt = Gwdb.person
      type t
      val empty : t
      val is_empty : t -> bool
      val mem : elt -> t -> bool
      val add : elt -> t -> t
      val singleton : elt -> t
      val remove : elt -> t -> t
      val union : t -> t -> t
      val inter : t -> t -> t
      val disjoint : t -> t -> bool
      val diff : t -> t -> t
      val compare : t -> t -> int
      val equal : t -> t -> bool
      val subset : t -> t -> bool
      val iter : (elt -> unit) -> t -> unit
      val map : (elt -> elt) -> t -> t
      val fold : (elt -> 'a -> 'a) -> t -> 'a -> 'a
      val for_all : (elt -> bool) -> t -> bool
      val exists : (elt -> bool) -> t -> bool
      val filter : (elt -> bool) -> t -> t
      val partition : (elt -> bool) -> t -> t * t
      val cardinal : t -> int
      val elements : t -> elt list
      val min_elt : t -> elt
      val min_elt_opt : t -> elt option
      val max_elt : t -> elt
      val max_elt_opt : t -> elt option
      val choose : t -> elt
      val choose_opt : t -> elt option
      val split : elt -> t -> t * bool * t
      val find : elt -> t -> elt
      val find_opt : elt -> t -> elt option
      val find_first : (elt -> bool) -> t -> elt
      val find_first_opt : (elt -> bool) -> t -> elt option
      val find_last : (elt -> bool) -> t -> elt
      val find_last_opt : (elt -> bool) -> t -> elt option
      val of_list : elt list -> t
      val to_seq_from : elt -> t -> elt Stdlib.Seq.t
      val to_seq : t -> elt Stdlib.Seq.t
      val add_seq : elt Stdlib.Seq.t -> t -> t
      val of_seq : elt Stdlib.Seq.t -> t
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/UpdateData/StringSet/index.html b/static/doc/geneweb/Geneweb/UpdateData/StringSet/index.html deleted file mode 100644 index dc40df1509..0000000000 --- a/static/doc/geneweb/Geneweb/UpdateData/StringSet/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -StringSet (geneweb.Geneweb.UpdateData.StringSet)

      Module UpdateData.StringSet

      type elt = Stdlib.String.t
      type t = Stdlib__set.Make(Stdlib.String).t
      val empty : t
      val is_empty : t -> bool
      val mem : elt -> t -> bool
      val add : elt -> t -> t
      val singleton : elt -> t
      val remove : elt -> t -> t
      val union : t -> t -> t
      val inter : t -> t -> t
      val disjoint : t -> t -> bool
      val diff : t -> t -> t
      val compare : t -> t -> int
      val equal : t -> t -> bool
      val subset : t -> t -> bool
      val iter : (elt -> unit) -> t -> unit
      val map : (elt -> elt) -> t -> t
      val fold : (elt -> 'a -> 'a) -> t -> 'a -> 'a
      val for_all : (elt -> bool) -> t -> bool
      val exists : (elt -> bool) -> t -> bool
      val filter : (elt -> bool) -> t -> t
      val partition : (elt -> bool) -> t -> t * t
      val cardinal : t -> int
      val elements : t -> elt list
      val min_elt : t -> elt
      val min_elt_opt : t -> elt option
      val max_elt : t -> elt
      val max_elt_opt : t -> elt option
      val choose : t -> elt
      val choose_opt : t -> elt option
      val split : elt -> t -> t * bool * t
      val find : elt -> t -> elt
      val find_opt : elt -> t -> elt option
      val find_first : (elt -> bool) -> t -> elt
      val find_first_opt : (elt -> bool) -> t -> elt option
      val find_last : (elt -> bool) -> t -> elt
      val find_last_opt : (elt -> bool) -> t -> elt option
      val of_list : elt list -> t
      val to_seq_from : elt -> t -> elt Stdlib.Seq.t
      val to_seq : t -> elt Stdlib.Seq.t
      val add_seq : elt Stdlib.Seq.t -> t -> t
      val of_seq : elt Stdlib.Seq.t -> t
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/UpdateData/index.html b/static/doc/geneweb/Geneweb/UpdateData/index.html deleted file mode 100644 index f712f4c631..0000000000 --- a/static/doc/geneweb/Geneweb/UpdateData/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -UpdateData (geneweb.Geneweb.UpdateData)

      Module Geneweb.UpdateData

      module PersMap : sig ... end
      module PersSet : sig ... end
      module StringSet : sig ... end
      module IstrSet : sig ... end
      val get_data : Config.config -> (Gwdb.person -> Gwdb.istr) list * (('a'b) Def.gen_pers_event -> 'b) list * (Gwdb.family -> Gwdb.istr) list * (('c'd) Def.gen_fam_event -> 'd) list
      val get_all_data : Config.config -> Gwdb.base -> IstrSet.elt list
      val get_person_from_data : Config.config -> Gwdb.base -> (PersMap.key * PersSet.elt list) list
      val combine_by_ini : string -> ('a * string) list -> (string * ('a * string) list) list
      val reduce_cpl_list : int -> ('a * 'b list) list -> ('a * 'b list) list

      Description : Retourne la sous liste telle que la somme des longueurs des ('b list) soit égale à size. Args :

      • size : la taille de la liste retournée
      • list : la liste originale Retour :
      • list : la nouvelle liste dont la somme des ('b list) est égale à size Rem : Non exporté en clair hors de ce module.
      val update_person : Config.config -> Gwdb.base -> string -> string -> Gwdb.person -> (Gwdb.iperGwdb.iperGwdb.istr) Def.gen_person

      Description : Met à jour le/les champ(s) de la personne. Args :

      • conf : configuration de la base
      • base : base de donnée
      • old : l'ancien contenu
      • new_input : le nouveau contenu
      • p : person Retour :
      • gen_person iper istr : gen_person avec les champs modifiés Rem : Non exporté en clair hors de ce module.
      val update_family : Config.config -> Gwdb.base -> string -> string -> Gwdb.family -> (Gwdb.iperGwdb.ifamGwdb.istr) Def.gen_family

      Description : Met à jour le/les champ(s) de la famille. Args :

      • conf : configuration de la base
      • base : base de donnée
      • old : l'ancien contenu
      • new_input : le nouveau contenu
      • fam : family Retour :
      • gen_family ifam istr : gen_family avec les champs modifiés Rem : Non exporté en clair hors de ce module.
      val update_person_list : Config.config -> Gwdb.base -> string -> (string * Gwdb.person list) list -> int -> int -> unit

      Description : Args :

      • conf : configuration
      • base : base
      • new_input : le nouveau contenu
      • list : la liste des (clé, person list)
      • nb_pers : le nombre de personnes concernées par la mise à jour
      • max_updates = le nombre maximum de persons que l'on met à jour Retour :
      • unit Rem : Non exporté en clair hors de ce module.
      val build_list : Config.config -> Gwdb.base -> (Gwdb.istr * string) list

      Get all the data and filter them if "s" is defined in conf.env

      val build_list_short : Config.config -> ('a * string) list -> StringSet.elt list
      val build_list_long : Config.config -> (Gwdb.istr * string) list -> (string * (Gwdb.istr * string) list) list
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/UpdateDataDisplay/index.html b/static/doc/geneweb/Geneweb/UpdateDataDisplay/index.html deleted file mode 100644 index 342e049f52..0000000000 --- a/static/doc/geneweb/Geneweb/UpdateDataDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -UpdateDataDisplay (geneweb.Geneweb.UpdateDataDisplay)

      Module Geneweb.UpdateDataDisplay

      val print_mod : Config.config -> Gwdb.base -> unit

      Displays a menu for updating Geneweb's dictionary of names, last names, locations, sources and professions.

      val print_mod_ok : Config.config -> Gwdb.base -> unit

      Updates persons linked to the updated data.

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/UpdateFam/index.html b/static/doc/geneweb/Geneweb/UpdateFam/index.html deleted file mode 100644 index 1135708384..0000000000 --- a/static/doc/geneweb/Geneweb/UpdateFam/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -UpdateFam (geneweb.Geneweb.UpdateFam)

      Module Geneweb.UpdateFam

      val person_key : Gwdb.base -> Gwdb.iper -> Update.key

      Returns the update key associated to a person

      val print_update_fam : Config.config -> Gwdb.base -> ((Update.keyGwdb.ifam, string) Def.gen_family * Update.key Def.gen_couple * Update.key Def.gen_descend) -> string -> unit

      The main page for updating families.

      val print_add : Config.config -> Gwdb.base -> unit

      Displays the form for adding families

      val print_mod : Config.config -> Gwdb.base -> unit

      Displays a form for updating a family

      val print_del : Config.config -> Gwdb.base -> unit

      Displays a page for validating the deletion of the family in argument

      val print_inv : Config.config -> Gwdb.base -> unit

      Displays a menu for inverting the order of two families

      val print_add_parents : Config.config -> Gwdb.base -> unit

      Associates parents to a person

      val change_order : Gwdb.person -> Gwdb.ifam -> int -> Gwdb.ifam list

      change_order p f i Returns the families of `p` where `f` is at the ith position. `i` must not be 0.

      val print_change_order : Config.config -> Gwdb.base -> unit

      Displays a menu to change the family order

      val print_change_event_order : Config.config -> Gwdb.base -> unit

      Displays the form for changing the order of events for a family

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/UpdateFamOk/index.html b/static/doc/geneweb/Geneweb/UpdateFamOk/index.html deleted file mode 100644 index c9bca07da8..0000000000 --- a/static/doc/geneweb/Geneweb/UpdateFamOk/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -UpdateFamOk (geneweb.Geneweb.UpdateFamOk)

      Module Geneweb.UpdateFamOk

      val reconstitute_from_fevents : bool -> 'string -> ('person'string) Def.gen_fam_event list -> (Def.relation_kind * Def.cdate * 'string * 'string * 'string) * Def.divorce * ('person * Def.witness_kind) array

      reconstitute_from_fevents nsck empty_string family_events Iterate over family's events and returns a tuple with:

      • marriage information (relation kind, date, place, notes, source);
      • divorce information;
      • marriage witnesses;

      Boolean `nsck' is true if no check have been made on the married persons sex.

      val effective_del : Config.config -> Gwdb.base -> Gwdb.iper -> Gwdb.family -> unit

      Removes a family from the base

      val all_checks_family : Config.config -> Gwdb.base -> Gwdb.ifam -> (Gwdb.iperGwdb.ifamGwdb.istr) Def.gen_family -> Gwdb.iper Def.gen_couple -> Gwdb.iper Def.gen_descend -> (Update.key Def.gen_couple * Update.key Def.gen_descend * (('i array * 'j array) * ('i array * 'j array)) option) -> CheckItem.base_warning list * CheckItem.base_misc list

      Displays a family page in HTML after an update. Used by MergeFamOk

      val print_del : Config.config -> Gwdb.base -> unit

      Deletes a family and displays a page confirming its deletion

      val print_add : Config.config -> Gwdb.base -> unit

      Displays the page after validating the addition of a family in the base

      val print_add_parents : Config.config -> Gwdb.base -> unit
      val print_mod_aux : Config.config -> Gwdb.base -> ((string * string * int * Update.create * string, Gwdb.ifam, string) Def.gen_family -> (string * string * int * Update.create * string) Def.gen_couple -> (string * string * int * Update.create * string) Def.gen_descend -> unit) -> unit
      val print_mod : Config.config -> Gwdb.base -> unit
      val print_inv : Config.config -> Gwdb.base -> unit

      Reverses families

      val print_change_order_ok : Config.config -> Gwdb.base -> unit

      Changes the family order for a person

      val print_change_event_order : Config.config -> Gwdb.base -> unit

      Changes the evenements order for a family

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/UpdateInd/index.html b/static/doc/geneweb/Geneweb/UpdateInd/index.html deleted file mode 100644 index 6cd8bb4a0a..0000000000 --- a/static/doc/geneweb/Geneweb/UpdateInd/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -UpdateInd (geneweb.Geneweb.UpdateInd)

      Module Geneweb.UpdateInd

      val string_person_of : Gwdb.base -> Gwdb.person -> (Gwdb.iperUpdate.key, string) Def.gen_person
      val print_update_ind : Config.config -> Gwdb.base -> (Gwdb.iperUpdate.key, string) Def.gen_person -> string -> unit

      The main HTML page displayed after an update. Based on template updind.txt

      val print_add : Config.config -> Gwdb.base -> unit

      Displays an HTML form with empty fields for adding a person

      val print_del : Config.config -> Gwdb.base -> unit

      Displays a page for validating the deletion of a person

      val print_mod : Config.config -> Gwdb.base -> unit

      Displays a form for updating a person

      val print_change_event_order : Config.config -> Gwdb.base -> unit

      Displays the form for changing the order of events for a person

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/UpdateIndOk/index.html b/static/doc/geneweb/Geneweb/UpdateIndOk/index.html deleted file mode 100644 index 1898b3fa01..0000000000 --- a/static/doc/geneweb/Geneweb/UpdateIndOk/index.html +++ /dev/null @@ -1,3 +0,0 @@ - -UpdateIndOk (geneweb.Geneweb.UpdateIndOk)

      Module Geneweb.UpdateIndOk

      val effective_del_no_commit : Gwdb.base -> (Gwdb.iperGwdb.iper, string) Def.gen_person -> unit

      Removes a person from the base

      val effective_del_commit : Config.config -> Gwdb.base -> (Gwdb.iperGwdb.iper, string) Def.gen_person -> unit

      Adds to the diff the deletion of a person

      val effective_del : Config.config -> Gwdb.base -> Gwdb.person -> unit

      effective_del applies effective_del_no_commit and effective_del_commit

      val effective_mod : ?prerr:(Config.config -> Gwdb.base -> Update.update_error -> unit) -> ?skip_conflict:Gwdb.iper -> -Config.config -> Gwdb.base -> (Gwdb.iperUpdate.key, string) Def.gen_person -> (Gwdb.iperGwdb.iperGwdb.istr) Def.gen_person

      effective_mod prerr ?skip_conflict conf base sp

      val print_mod : ?prerr:(Config.config -> Gwdb.base -> Update.update_error -> unit) -> Config.config -> Gwdb.base -> unit

      Tries to modifies a person and displays a success page if successful

      Patches the informations of a person by checking the order of events: for example, a birth should happen before the death of a mother.

      val print_mod_aux : Config.config -> Gwdb.base -> ((Gwdb.iperUpdate.key, string) Def.gen_person -> unit) -> unit
      val rename_image_file : Config.config -> Gwdb.base -> Gwdb.person -> (Gwdb.iperGwdb.iper, string) Def.gen_person -> unit

      Renames the image associated to a person

      val print_add : Config.config -> Gwdb.base -> unit

      Tries to add a person to the base and displays a success HTML page if successful

      val print_del : Config.config -> Gwdb.base -> unit

      Tries to remove a person from the base and displays a success HTML page if successful

      val print_change_event_order : Config.config -> Gwdb.base -> unit

      Tries to change the order of events for a person and displays a success HTML page if successful

      val raw_get : Config.config -> string -> string
      val strip_person : (Gwdb.iper, string * 'a * 'b * 'c * 'd, string) Def.gen_person -> (Gwdb.iper, string * 'a * 'b * 'c * 'd, string) Def.gen_person
      val check_person : Config.config -> (Gwdb.iper, string * string * 'b * 'c * 'd, string) Def.gen_person -> Update.update_error option
      val error_person : Config.config -> Update.update_error -> unit
      val reconstitute_death : Config.config -> Def.date option -> Def.date option -> string -> Def.burial -> string -> Def.death
      val reconstitute_from_pevents : ('a, string) Def.gen_pers_event list -> bool -> (Def.cdate * string * string * string) -> (Def.cdate * string * string * string) -> (Def.death * string * string * string) -> (Def.burial * string * string * string) -> (Def.cdate * string * string * string) * (Def.cdate * string * string * string) * (Def.death * string * string * string) * (Def.burial * string * string * string) * ('a, string) Def.gen_pers_event list
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Util/IfamSet/index.html b/static/doc/geneweb/Geneweb/Util/IfamSet/index.html deleted file mode 100644 index 4a697e1d90..0000000000 --- a/static/doc/geneweb/Geneweb/Util/IfamSet/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -IfamSet (geneweb.Geneweb.Util.IfamSet)

      Module Util.IfamSet

      include Stdlib.Set.S with type elt = Gwdb.ifam
      type elt = Gwdb.ifam
      type t
      val empty : t
      val is_empty : t -> bool
      val mem : elt -> t -> bool
      val add : elt -> t -> t
      val singleton : elt -> t
      val remove : elt -> t -> t
      val union : t -> t -> t
      val inter : t -> t -> t
      val disjoint : t -> t -> bool
      val diff : t -> t -> t
      val compare : t -> t -> int
      val equal : t -> t -> bool
      val subset : t -> t -> bool
      val iter : (elt -> unit) -> t -> unit
      val map : (elt -> elt) -> t -> t
      val fold : (elt -> 'a -> 'a) -> t -> 'a -> 'a
      val for_all : (elt -> bool) -> t -> bool
      val exists : (elt -> bool) -> t -> bool
      val filter : (elt -> bool) -> t -> t
      val partition : (elt -> bool) -> t -> t * t
      val cardinal : t -> int
      val elements : t -> elt list
      val min_elt : t -> elt
      val min_elt_opt : t -> elt option
      val max_elt : t -> elt
      val max_elt_opt : t -> elt option
      val choose : t -> elt
      val choose_opt : t -> elt option
      val split : elt -> t -> t * bool * t
      val find : elt -> t -> elt
      val find_opt : elt -> t -> elt option
      val find_first : (elt -> bool) -> t -> elt
      val find_first_opt : (elt -> bool) -> t -> elt option
      val find_last : (elt -> bool) -> t -> elt
      val find_last_opt : (elt -> bool) -> t -> elt option
      val of_list : elt list -> t
      val to_seq_from : elt -> t -> elt Stdlib.Seq.t
      val to_seq : t -> elt Stdlib.Seq.t
      val add_seq : elt Stdlib.Seq.t -> t -> t
      val of_seq : elt Stdlib.Seq.t -> t
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Util/IperSet/index.html b/static/doc/geneweb/Geneweb/Util/IperSet/index.html deleted file mode 100644 index 1a5e2f30b7..0000000000 --- a/static/doc/geneweb/Geneweb/Util/IperSet/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -IperSet (geneweb.Geneweb.Util.IperSet)

      Module Util.IperSet

      include Stdlib.Set.S with type elt = Gwdb.iper
      type elt = Gwdb.iper
      type t
      val empty : t
      val is_empty : t -> bool
      val mem : elt -> t -> bool
      val add : elt -> t -> t
      val singleton : elt -> t
      val remove : elt -> t -> t
      val union : t -> t -> t
      val inter : t -> t -> t
      val disjoint : t -> t -> bool
      val diff : t -> t -> t
      val compare : t -> t -> int
      val equal : t -> t -> bool
      val subset : t -> t -> bool
      val iter : (elt -> unit) -> t -> unit
      val map : (elt -> elt) -> t -> t
      val fold : (elt -> 'a -> 'a) -> t -> 'a -> 'a
      val for_all : (elt -> bool) -> t -> bool
      val exists : (elt -> bool) -> t -> bool
      val filter : (elt -> bool) -> t -> t
      val partition : (elt -> bool) -> t -> t * t
      val cardinal : t -> int
      val elements : t -> elt list
      val min_elt : t -> elt
      val min_elt_opt : t -> elt option
      val max_elt : t -> elt
      val max_elt_opt : t -> elt option
      val choose : t -> elt
      val choose_opt : t -> elt option
      val split : elt -> t -> t * bool * t
      val find : elt -> t -> elt
      val find_opt : elt -> t -> elt option
      val find_first : (elt -> bool) -> t -> elt
      val find_first_opt : (elt -> bool) -> t -> elt option
      val find_last : (elt -> bool) -> t -> elt
      val find_last_opt : (elt -> bool) -> t -> elt option
      val of_list : elt list -> t
      val to_seq_from : elt -> t -> elt Stdlib.Seq.t
      val to_seq : t -> elt Stdlib.Seq.t
      val add_seq : elt Stdlib.Seq.t -> t -> t
      val of_seq : elt Stdlib.Seq.t -> t
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Util/index.html b/static/doc/geneweb/Geneweb/Util/index.html deleted file mode 100644 index bba91eb271..0000000000 --- a/static/doc/geneweb/Geneweb/Util/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Util (geneweb.Geneweb.Util)

      Module Geneweb.Util

      val cnt_dir : string Stdlib.ref

      Returns the current dir (changed by `gwd` if geneweb is running on windows)

      val image_prefix : Config.config -> string

      Returns the image prefix (conf.image_prefix)

      val base_path : string list -> string -> string

      Alias for !GWPARAM.base_path

      val bpath : string -> string

      Alias for !GWPARAM.bpath

      val search_in_assets : string -> string

      Checks that the file in argument belong to one of the asserts dir (defined in the Secure module)

      val etc_file_name : Config.config -> string -> string

      Returns the path to the template file in parameter

      val escache_value : Gwdb.base -> string

      Returns the date of the base directory last update

      val commit_patches : Config.config -> Gwdb.base -> unit

      Commits the patches and logs the modification

      val update_wf_trace : Config.config -> string -> unit
      val get_referer : Config.config -> string

      Get referer (the page you came from to the current page) page from HTTP request

      val no_html_tags : string -> string
      val clean_html_tags : string -> string list -> string
      val html : ?content_type:string -> Config.config -> unit

      Prints HTTP response headers with giving content type (default : text/html) on the socket.

      val unauthorized : Config.config -> string -> unit

      Prints HTTP response with code 401 (Unauthorized) and error page with giving message

      val string_of_ctime : Config.config -> string
      val commd : Config.config -> string

      Returns link to the current command (database name after domain name and port in url) with query string that containts bindings from conf.henv and conf.senv. Doesn't add binding (k,v) when:

      • k = "oc" or "ocz" and v = "0"
      • v = ""
      val commd_2 : Config.config -> string

      Same as commd but returns without separator '&' at the end.

      val prefix_base : Config.config -> string
      val prefix_base_password : Config.config -> string
      val prefix_base_2 : Config.config -> string
      val prefix_base_password_2 : Config.config -> string
      val hidden_env : Config.config -> unit

      Creates a hidden HTML input for every key and value in conf.henv and conf.senv. Used to include immutable environement bindings in the HTML form.

      val nobtit : Config.config -> Gwdb.base -> Gwdb.person -> Gwdb.title list

      nobtit conf base p returns list of titles of p from the base that respects constraints imposed by conf.allowed_titles and conf.denied_titles

      val strictly_after_private_years : Config.config -> Def.dmy -> bool
      val authorized_age : Config.config -> Gwdb.base -> Gwdb.person -> bool

      Alias to !GWPARAM.p_auth

      val is_old_person : Config.config -> (Gwdb.iperGwdb.iperGwdb.istr) Def.gen_person -> bool
      val start_with_vowel : string -> bool
      val acces_n : Config.config -> Gwdb.base -> string -> Gwdb.person -> string

      Returns URL query string to access nth person

      val acces : Config.config -> Gwdb.base -> Gwdb.person -> string
      val wprint_hidden_person : Config.config -> Gwdb.base -> string -> Gwdb.person -> unit
      val accessible_by_key : Config.config -> Gwdb.base -> Gwdb.person -> string -> string -> bool

      Tells if person could be accessed by his first name and surname

      geneweb_link conf href s Returns HTML link to actual geneweb's command (database name) with additional (to those defind by commd) argument href and s as textual content of the link.

      Prints on the socket link created by geneweb_link.

      val is_restricted : Config.config -> Gwdb.base -> Gwdb.iper -> bool

      Tells if person is restrited to acccess. If mode `use_restrict` is disabled returns always false.

      val is_hidden : Gwdb.person -> bool

      Tells if person is hiden (if his surname is empty)

      Returns person with giving id from the base. If person is restrited to acccess returns empty person with giving id.

      val string_gen_person : Gwdb.base -> (Gwdb.iperGwdb.iperGwdb.istr) Def.gen_person -> (Gwdb.iperGwdb.iper, string) Def.gen_person

      Remplaces string ids inside person's entry by real strings

      val string_gen_family : Gwdb.base -> (Gwdb.iperGwdb.ifamGwdb.istr) Def.gen_family -> (Gwdb.iperGwdb.ifam, string) Def.gen_family

      Remplaces string ids inside family's entry by real strings

      type p_access = (Gwdb.base -> Gwdb.person -> string) * (Gwdb.base -> Gwdb.person -> string)

      Type that defines couple of functions allowing to access to person's first name and surname.

      val std_access : p_access

      Standard access (p_first_name, p_surname).

      val raw_access : p_access

      Raw access (sou + get_name).

      val gen_person_text : p_access -> Config.config -> Gwdb.base -> Gwdb.person -> string

      Returns person's first name and surname HTML description depending on :

      • his public name
      • his qualifiers If person is hiden returns ".....". If person's names are hiden or access to them is denied returns "x x"
      val gen_person_text_no_html : p_access -> Config.config -> Gwdb.base -> Gwdb.person -> string

      Same as gen_person_text but doesn't encapsulates description in HTML tag <em>.

      val gen_person_text_without_title : p_access -> Config.config -> Gwdb.base -> Gwdb.person -> string

      Returns either person's first name and surname either title and qualifiers HTML description

      val gen_person_title_text : (Config.config -> Gwdb.base -> Gwdb.person -> string -> string) -> p_access -> Config.config -> Gwdb.base -> Gwdb.person -> string

      gen_person_title_text reference paccess conf base p returns HTML structure of person that describes person's first name surname and main title. reference is used to either encapsulate structure in the link (or other type of maniplations).

      val person_text : Config.config -> Gwdb.base -> Gwdb.person -> string

      Makes call to gen_person_text with std_access

      val person_text_no_html : Config.config -> Gwdb.base -> Gwdb.person -> string

      Makes call to gen_person_text_no_html with std_access

      val person_text_without_surname : Config.config -> Gwdb.base -> Gwdb.person -> string

      Same as gen_person_text but doesn't display surname

      val person_text_no_surn_no_acc_chk : Config.config -> Gwdb.base -> Gwdb.person -> string

      Same as gen_person_text but :

      • doesn't display surname
      • returns HTML description even if person's names are hiden or access to them is denied (don't print "x x")
      val person_text_without_title : Config.config -> Gwdb.base -> Gwdb.person -> string

      Makes call to gen_person_text_without_title with std_access

      val main_title : Config.config -> Gwdb.base -> Gwdb.person -> Gwdb.title option

      Returns main person's title. If person doesn't have it, then returns first title from the list.

      val titled_person_text : Config.config -> Gwdb.base -> Gwdb.person -> Gwdb.title -> string

      Returns person's first name and surname text description depending on person's title

      val one_title_text : Gwdb.base -> Gwdb.title -> string

      Returns HTML representation of title's identifier with its place (if exists)

      val person_title_text : Config.config -> Gwdb.base -> Gwdb.person -> string

      Returns HTML structure of person that describes person's first name surname and main title. Calls gen_person_title_text with no_reference.

      val person_title : Config.config -> Gwdb.base -> Gwdb.person -> string

      Returns HTML representation of person's main title (or first title if main doesn't exists). If person doesn't have a title or if access to person isn't granted returns empty string

      val child_of_parent : Config.config -> Gwdb.base -> Gwdb.person -> string
      val reference : Config.config -> Gwdb.base -> Gwdb.person -> string -> string

      reference conf base p desc returns HTML link to the person where desc is content of the link (generaly his first name and surname description). If person is hidden returns desc (do not create link).

      val reference_noid : Config.config -> Gwdb.base -> Gwdb.person -> string -> string

      Same as reference but link doesn't has "id" field

      val no_reference : Config.config -> Gwdb.base -> Gwdb.person -> string -> string

      reference conf base p desc returns desc without creating a link

      val referenced_person_title_text : Config.config -> Gwdb.base -> Gwdb.person -> string

      Retruns HTML link to the person that contains its first name, surname and person's nobility title. Calls gen_person_title_text with reference.

      val referenced_person_text : Config.config -> Gwdb.base -> Gwdb.person -> string

      Returns HTML link to the person that contains its first name and surname.

      val referenced_person_text_without_surname : Config.config -> Gwdb.base -> Gwdb.person -> string

      Returns HTML link to the person that contains its first name.

      val update_family_loop : Config.config -> Gwdb.base -> Gwdb.person -> string -> string
      val p_getenv : (string * string) list -> string -> string option

      Returns value associated to the label in environnement

      val p_getint : (string * string) list -> string -> int option

      Returns integer value associated to the label in environnement

      val create_env : string -> (string * string) list

      Create association list from two types of string. First has format : [k1=v1;k2=v2]. Second : [k1=v1&k2=v2]. For both returns list [("k1","v1"); ("k2","v2")].

      val open_etc_file : string -> (Stdlib.in_channel * string) option

      open_etc_file fname search for template etc/fname.txt inside the base directory or inside one of assets directories. Returns input channel and the path to giving template.

      val open_hed_trl : Config.config -> string -> Stdlib.in_channel option
      val open_templ_fname : Config.config -> string -> (Stdlib.in_channel * string) option

      open_etc_file fname search for template etc/fname.txt using config or inside one of assets directories. Returns input channel and the path to giving template.

      val open_templ : Config.config -> string -> Stdlib.in_channel option

      Same as open_templ_fname but returns only input channel of the giving template file

      val string_of_place : Config.config -> string -> string
      val place_of_string : Config.config -> string -> Def.place option
      val allowed_tags_file : string Stdlib.ref
      val body_prop : Config.config -> string

      Returns additional attributes for <body> tag from config.

      val message_to_wizard : Config.config -> unit

      Prints all messages send to wizard (or friend) on the socket. Messages are located in <basename>/etc/mess_wizzard.txt (messages destinated to all wizards) and in <basename>/etc/mess_wizzard_<user>.txt (messages destinated to considered wizard).

      val of_course_died : Config.config -> Gwdb.person -> bool
      val hexa_string : string -> string
      val surname_particle : Gwdb.base -> string -> string

      surname_particle base sn Extract the particle of sn if there is one. The list of particles to use is defined in base.

      val surname_without_particle : Gwdb.base -> string -> string

      surname_without_particle base sn Remove the particle of sn if there is one. The list of particles to use is defined in base.

      val specify_homonymous : Config.config -> Gwdb.base -> Gwdb.person -> bool -> unit
      val get_approx_birth_date_place : Config.config -> Gwdb.base -> Gwdb.person -> Def.date option * string
      val get_approx_death_date_place : Config.config -> Gwdb.base -> Gwdb.person -> Def.date option * string
      type ('a, 'b) format2 = ('a, unit, string, 'b) Stdlib.format4
      val check_format : ('a'b) format2 -> string -> ('a'b) format2 option
      val valid_format : ('a'b) format2 -> string -> ('a'b) format2
      val transl : Config.config -> string -> string

      Find translation of given english word in conf.lexicon

      val transl_nth : Config.config -> string -> int -> string

      transl_nth conf w n translate word w and returns n'th field of its translation (with nth_field).

      val transl_decline : Config.config -> string -> string -> string
      val ftransl : Config.config -> ('a'b) format2 -> ('a'b) format2
      val ftransl_nth : Config.config -> ('a'b) format2 -> int -> ('a'b) format2
      val fdecline : ('a'b) format2 -> string -> ('a'b) format2
      val fcapitale : ('a'b) format2 -> ('a'b) format2
      val nth_field : string -> int -> string

      nth_field str n gets n'th field of string that separate its fields with "/". Example :

      • nth_field "a/b/</c>/d" 0 = a
      • nth_field "a/b/</c>/d" 1 = b
      • nth_field "a/b/</c>/d" 2 = </c>
      • nth_field "a/b/</c>/d" 3 = d
      val cftransl : Config.config -> string -> string list -> string
      val translate_eval : string -> string
      val transl_a_of_b : Config.config -> string -> string -> string -> string

      transl_a_of_b conf a b b_raw Translate "a of b" using b_raw for declension. i.e. if b is wrapped in html, b_raw should be that texte with no html, and b_raw should be b otherwise.

      val transl_a_of_gr_eq_gen_lev : Config.config -> string -> string -> string -> string
      val std_color : Config.config -> string -> string

      Colorise HTML element with conf.highlight color.

      val index_of_sex : Def.sex -> int

      Sex index (0 for male, 1 for female, 2 for neuter)

      val string_of_pevent_name : Config.config -> Gwdb.base -> Gwdb.istr Def.gen_pers_event_name -> string
      val string_of_fevent_name : Config.config -> Gwdb.base -> Gwdb.istr Def.gen_fam_event_name -> string

      string_of_fevent_name conf base fevent_name

      val string_of_fevent : Config.config -> Gwdb.base -> Gwdb.istr Def.gen_fam_event_name -> string

      string_of_fevent conf base fevent_name

      val string_of_witness_kind : Config.config -> Def.sex -> Def.witness_kind -> string

      string_of_witness_kind conf sex wk Return the string corresponding to wk according to sex and conf.

      val relation_txt : Config.config -> Def.sex -> Gwdb.family -> (('a -> 'b) -> 'b'a'b) Stdlib.format
      val string_of_decimal_num : Config.config -> float -> string
      val person_exists : Config.config -> Gwdb.base -> (string * string * int) -> bool
      val husband_wife : Config.config -> Gwdb.base -> Gwdb.person -> bool -> string
      val find_person_in_env : Config.config -> Gwdb.base -> string -> Gwdb.person option

      find_person_in_env conf base suff Reconstitutes the key of a person from conf.env, using "i" ^ suff or "n" ^ suff + "p" ^ suff + "oc" ^ suff

      val find_person_in_env_pref : Config.config -> Gwdb.base -> string -> Gwdb.person option

      find_person_in_env_pref conf base prefix Same as find_person_in_env except that it uses a prefix instead of a suffix.

      val default_sosa_ref : Config.config -> Gwdb.base -> Gwdb.person option
      val find_sosa_ref : Config.config -> Gwdb.base -> Gwdb.person option
      val update_gwf_sosa : Config.config -> Gwdb.base -> (Gwdb.iper * (string * string * int)) -> unit
      val get_server_string : Config.config -> string

      Returns server host name with its port number (if different from 80).

      val get_request_string : Config.config -> string

      Returns request string. Request string has format scriptname?querystring where scriptname is a path to the script in URI.

      val create_topological_sort : Config.config -> Gwdb.base -> (Gwdb.iper, int) Gwdb.Marker.t
      val p_of_sosa : Config.config -> Gwdb.base -> Sosa.t -> Gwdb.person -> Gwdb.person option

      p_of_sosa conf base sosa p0 Get the sosa sosa of p0 if it exists

      val branch_of_sosa : Config.config -> Gwdb.base -> Sosa.t -> Gwdb.person -> Gwdb.person list option

      branch_of_sosa conf base sosa p0 Get all the lineage to go from p0's ancestor with sosa number sosa to p0

      val sosa_of_branch : Gwdb.person list -> Sosa.t

      sosa_of_branch branch Given a path of person to follow branch, return the sosa number of the last person of this list. No check is done to ensure that given persons are actually parents.

      val old_branch_of_sosa : Config.config -> Gwdb.base -> Gwdb.iper -> Sosa.t -> (Gwdb.iper * Def.sex) list option
      • deprecated

        Use branch_of_sosa instead

      val old_sosa_of_branch : Config.config -> Gwdb.base -> (Gwdb.iper * Def.sex) list -> Sosa.t
      • deprecated

        Use sosa_of_branch instead

      val has_image : Config.config -> Gwdb.base -> Gwdb.person -> bool
      val image_file_name : string -> string

      image_file_name fname search for image images/fname inside the base and assets directories. Retrun the path to found file or fname if file isn't found.

      val source_image_file_name : string -> string -> string

      Returns path to the image file with the giving name in directory sources.

      val image_size : string -> (int * int) option

      Returns width and height of an image.

      val limited_image_size : int -> int -> string -> (int * int) option -> (int * int) option

      limited_image_size max_wid max_hei fname defsize returns image size of fname. If width and height are greater then their limits max_wid and max_hei then returns reduced size with the same proportions. defsize is returned if image filename is empty.

      val image_and_size : Config.config -> Gwdb.base -> Gwdb.person -> (string -> (int * int) option -> (int * int) option) -> (bool * string * (int * int) option) option

      Returns path to the personal image. In details, returns (is_filename,source,size) where is_filename tells if source is a filename or URL and size is a size of image (width x height).

      val default_image_name_of_key : string -> string -> int -> string

      Returns default image name calculated from person's first name, surname and occurence number. For example : Jean Claude DUPOND 3 => jean_claude.3.dupond

      val default_image_name : Gwdb.base -> Gwdb.person -> string

      Returns default image name calculated from person's key.

      val auto_image_file : Config.config -> Gwdb.base -> Gwdb.person -> string option

      Searchs personal image (portrait) inside the base directory by looking up its default name and tryig to deduce its extension. Returns path to the image if found.

      val only_printable : string -> string

      Trims and remplaces all non-printable characters by spaces in the given string.

      val only_printable_or_nl : string -> string

      Same as only_printable but also accepts '\n'.

      val relation_type_text : Config.config -> Def.relation_type -> int -> string
      val rchild_type_text : Config.config -> Def.relation_type -> int -> string
      val has_nephews_or_nieces : Config.config -> Gwdb.base -> Gwdb.person -> bool
      val browser_doesnt_have_tables : Config.config -> bool
      val doctype : Config.config -> string
      val begin_centered : Config.config -> unit

      Prints on the socket beginning of the <table> tag untill first opened <td> where the text is centred

      val end_centered : Config.config -> unit

      Prints on the socket end of the column and table opened by begin_centered

      val print_alphab_list : Config.config -> ('a -> string) -> ('a -> unit) -> 'a list -> unit
      val pre_text_size : string -> int
      val print_pre_center : Config.config -> int -> string -> unit
      val print_pre_left : Config.config -> int -> string -> unit
      val print_pre_right : Config.config -> int -> string -> unit
      val short_f_month : int -> string
      type auth_user = {
      au_user : string;
      au_passwd : string;
      au_info : string;
      }

      Authenticated user from from authorization file.

      val read_gen_auth_file : string -> auth_user list

      Read all authenticated users with their passwords from authorization file (associated to "wizard_passwd_file" in conf.base_env)

      val is_that_user_and_password : Config.auth_scheme_kind -> string -> string -> bool

      is_that_user_and_password auth_sheme user paswd verify if given user with his password correspond to the authentication scheme.

      val in_text : bool -> string -> string -> bool
      val html_highlight : bool -> string -> string -> string
      val wprint_in_columns : Config.config -> ('a -> string) -> ('a -> unit) -> 'a list -> unit
      val is_hide_names : Config.config -> Gwdb.person -> bool

      Tells if person's names are hiden (if person's access is Private or if mode conf.hide_names is enabled).

      val reduce_list : int -> 'a list -> 'a list

      reduce_list n l takes n first elements from the list l

      val print_reference : Config.config -> string -> int -> string -> unit
      val gen_print_tips : Config.config -> string -> unit

      Print a tip with the specified text

      val print_tips_relationship : Config.config -> unit

      Print a tip that tells to Click an individual below to calculate the family link.

      val print_image_sex : Config.config -> Gwdb.person -> int -> unit
      val display_options : Config.config -> string
      type cache_visited_t = (string, (Gwdb.iper * string) list) Stdlib.Hashtbl.t
      val cache_visited : Config.config -> string
      val read_visited : Config.config -> cache_visited_t
      val record_visited : Config.config -> Gwdb.iper -> unit
      val array_mem_witn : Config.config -> Gwdb.base -> Gwdb.iper -> (Gwdb.iper * Def.witness_kind) array -> bool * string

      array_mem_witn conf base ip array checks if ip is in array and returns corresponding string_of_witness_kind if so.

      val name_key : Gwdb.base -> string -> string

      name_key base name is name, with particles put at the end of the string instead of the beginning.

      val nb_char_occ : char -> string -> int

      nb_char_occ c s return the number of times c appears in s.

      val escape_html : string -> string

      escape_html str replaces '&', '"', '\'', '<' and '>' with their corresponding character entities (using entity number)

      val safe_html : string -> string

      safe_html s sanitizes s element in order to fix ill-formed HTML input and to prevent XSS injection

      It removes any tag which is not allowed by geneweb. It removes all attributes starting with "on". It removes any attribute when the value starts with "javascript". Text is escaped using escape_html.

      val string_with_macros : Config.config -> (char * (unit -> string)) list -> string -> string

      string_with_macros conf env s Return a string with "%xxx" macro replaced by their value. Also filter unsafe html tags.

      val is_empty_name : Gwdb.person -> bool

      is_empty_name p false if we knwon the first name or the last name of p.

      module IperSet : sig ... end
      module IfamSet : sig ... end
      val include_template : Config.config -> (string * string) list -> string -> (unit -> unit) -> unit

      include_template conf env fname failure Search fname in templates path and interpret it with global environnement env provided. Interpretation of template write directly its results in the socket. If the file can not be found, failure is called.

      val select_masc : Config.config -> Gwdb.base -> (Gwdb.iper * int) list -> (Gwdb.iper, int * Gwdb.person) Stdlib.Hashtbl.t

      select_masc conf base ips From ips, a list matching ipers to a number of maximum generations, get maximum ascendants of ipers up to these corresponding generations.

      A person is maximum ascendant if their generation matches the maximum, or if they do not have ancestors.

      The result is a Hashtbl matching an iper to the corresponding person and their generation.

      val select_desc : Config.config -> Gwdb.base -> int -> (Gwdb.iper * int) list -> (Gwdb.iperGwdb.person) Stdlib.Hashtbl.t

      select_desc conf base gen_desc ips From ips, a list matching ipers to a number of maximum generations, get spouses and descendants of ipers up to these corresponding generations.

      val select_mascdesc : Config.config -> Gwdb.base -> (Gwdb.iper * int) list -> int -> (Gwdb.iperGwdb.person) Stdlib.Hashtbl.t

      select_ascdesc conf base ips gen_desc Get maximum ascendants with select_masc, and get their desc with select_desc

      val sprintf_today : Config.config -> string

      sprintf_today confo Uses Mutil.sprintf_date in order to print datetime defined in conf.

      val auth_warning : Config.config -> Gwdb.base -> ('aGwdb.personGwdb.ifam'b'c'd'e) Def.warning -> bool

      auth_warning conf base w Check if current user has enough right in order to see w

      val person_warnings : Config.config -> Gwdb.base -> Gwdb.person -> CheckItem.base_warning list

      person_warnings conf base p Shorthand for CheckItem.person and CheckItem.on_person_update on p and CheckItem.check_siblings on they children using auth_warning for filtering.

      val name_with_roman_number : string -> string option

      Convert arabic numerals to roman numerals. Some result is returned if there are numerals, None if not.

      val cut_words : string -> string list

      cut_words str Same output as String.split_on_char ' ' s |> List.map String.trim |> List.filter ((<>) "")

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Version/index.html b/static/doc/geneweb/Geneweb/Version/index.html deleted file mode 100644 index e95ca506bf..0000000000 --- a/static/doc/geneweb/Geneweb/Version/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Version (geneweb.Geneweb.Version)

      Module Geneweb.Version

      val txt : string

      Current Geneweb version

      val available_languages : string list

      List of all supported by Geneweb languages (abbreviations).

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/Wiki/index.html b/static/doc/geneweb/Geneweb/Wiki/index.html deleted file mode 100644 index 2ef6d665d2..0000000000 --- a/static/doc/geneweb/Geneweb/Wiki/index.html +++ /dev/null @@ -1,4 +0,0 @@ - -Wiki (geneweb.Geneweb.Wiki)

      Module Geneweb.Wiki

      type wiki_info = {
      wi_mode : string;
      wi_file_path : string -> string;
      wi_person_exists : (string * string * int) -> bool;
      }
      val html_of_tlsw : Config.config -> string -> string list

      Parses a whole TLSW text to a list of strings

      val html_with_summary_of_tlsw : Config.config -> wiki_info -> (bool * string * string) option -> string -> string

      HTML displaying a table of content for a TLSW file

      val extract_sub_part : string -> int -> string list

      extract_sub_part tlsw i Extracts the `i`th first TLSW sections of `tlsw`

      val split_title_and_text : string -> (string * string) list * string

      The argument is expected to have the form "KEY=value\n"... This function calculates each Key/value pair and puts it in a list; except for the key TITLE, that is the second element of the returned tuple. If there is no title defined, checks if the first line is not empty and does not start with '=' nor contains '<' nor '', in which case it is choosen as a - first line. Otherwise, the title is the empty string. -

      val print_sub_part : Config.config -> wiki_info -> bool -> string -> string -> int -> string list -> unit

      Prints an exctracted sub part

      val print_mod_view_page : Config.config -> bool -> string -> string -> (bool -> unit) -> (string * string) list -> string -> unit

      Prints an editable part

      val print_mod_ok : Config.config -> wiki_info -> (string -> string option) -> (string option -> string) -> (string -> (string * string) list * string) -> (string -> string -> unit) -> (string -> string) -> bool -> unit

      Commits the changes of a page

      val notes_aliases : Config.config -> (string * string) list

      Reads the notes alias file (conf.base_env.notes_alias_file or base_path/notes.alias). File format is "KEY value\n...", returns the list of (KEY,value)

      val map_notes : (string * string) list -> string -> string

      Given an alias list, finds the corresponding alias for a given string

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/WiznotesDisplay/index.html b/static/doc/geneweb/Geneweb/WiznotesDisplay/index.html deleted file mode 100644 index 640077e5f6..0000000000 --- a/static/doc/geneweb/Geneweb/WiznotesDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -WiznotesDisplay (geneweb.Geneweb.WiznotesDisplay)

      Module Geneweb.WiznotesDisplay

      val dir : Config.config -> Gwdb.base -> string

      Returns the path to the wizard notes files associated to the base.

      val print : Config.config -> Gwdb.base -> unit

      Prints the HTML page displaying the wizard notes. Fails if wizard authentification is incorrect

      val print_mod : Config.config -> Gwdb.base -> unit

      Prints the HTML page displaying editable wizard notes. Fails if wizard authentification is incorrect or if current user cannot edit.

      val print_mod_ok : Config.config -> Gwdb.base -> unit

      Commits the modification and displays the `OK` page. Fails if wizard authentification is incorrect

      val print_view : Config.config -> Gwdb.base -> unit

      Same as `print_mod`, but works even if user cannot edit. It still fails in case of wrong authentification.

      Same as `print` but highlights HTML with the speficied string searched (environment key of search is `s`). If no search is specified, just prints the wizard notes.

      val connected_wizards : Config.config -> Gwdb.base -> unit

      Displays the connected wizards.

      val change_wizard_visibility : Config.config -> Gwdb.base -> unit

      Same as `connected_wizards`, but starts by updating the wizard visibility.

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb/index.html b/static/doc/geneweb/Geneweb/index.html deleted file mode 100644 index 09f3adbc6f..0000000000 --- a/static/doc/geneweb/Geneweb/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb (geneweb.Geneweb)

      Module Geneweb

      module AdvSearchOk : sig ... end
      module AdvSearchOkDisplay : sig ... end
      module Alln : sig ... end
      module AllnDisplay : sig ... end
      module Ansel : sig ... end
      module Base64 : sig ... end
      module BirthDeath : sig ... end
      module BirthDeathDisplay : sig ... end
      module BirthdayDisplay : sig ... end
      module ChangeChildren : sig ... end
      module ChangeChildrenDisplay : sig ... end
      module Check : sig ... end
      module CheckItem : sig ... end
      module Config : sig ... end
      module Cousins : sig ... end
      module CousinsDisplay : sig ... end
      module Dag : sig ... end
      module Dag2html : sig ... end
      module DagDisplay : sig ... end
      module DateDisplay : sig ... end
      module DescendDisplay : sig ... end
      module Difference : sig ... end

      Differences between two arrays.

      module Fixbase : sig ... end

      All the function of this module scan the base and fix what is considered as corrupted data.

      module GWPARAM : sig ... end
      module GWPARAM_ITL : sig ... end
      module Gwlib : sig ... end
      module History : sig ... end
      module HistoryDiff : sig ... end
      module HistoryDiffDisplay : sig ... end
      module Hutil : sig ... end
      module ImageDisplay : sig ... end
      module MergeDisplay : sig ... end
      module MergeDupDisplay : sig ... end
      module MergeFamDisplay : sig ... end
      module MergeFamOk : sig ... end
      module MergeInd : sig ... end
      module MergeIndDisplay : sig ... end
      module MergeIndOk : sig ... end
      module MergeIndOkDisplay : sig ... end
      module Notes : sig ... end
      module NotesDisplay : sig ... end
      module Output : sig ... end
      module Perso : sig ... end
      module Place : sig ... end
      module PlaceDisplay : sig ... end
      module Relation : sig ... end
      module RelationDisplay : sig ... end
      module SearchName : sig ... end
      module Some : sig ... end
      module SrcfileDisplay : sig ... end
      module Stats : sig ... end
      module Templ : sig ... end
      module TemplAst : sig ... end
      module TemplDate : sig ... end
      module Templ_parser : sig ... end
      module Title : sig ... end
      module TitleDisplay : sig ... end
      module Translate : sig ... end
      module Update : sig ... end
      module UpdateData : sig ... end
      module UpdateDataDisplay : sig ... end
      module UpdateFam : sig ... end
      module UpdateFamOk : sig ... end
      module UpdateInd : sig ... end
      module UpdateIndOk : sig ... end
      module Util : sig ... end
      module Version : sig ... end
      module Wiki : sig ... end
      module WiznotesDisplay : sig ... end
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__AdvSearchOk/.dune-keep b/static/doc/geneweb/Geneweb__AdvSearchOk/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__AdvSearchOk/index.html b/static/doc/geneweb/Geneweb__AdvSearchOk/index.html deleted file mode 100644 index 4365966aa4..0000000000 --- a/static/doc/geneweb/Geneweb__AdvSearchOk/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__AdvSearchOk (geneweb.Geneweb__AdvSearchOk)

      Module Geneweb__AdvSearchOk

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__AdvSearchOkDisplay/.dune-keep b/static/doc/geneweb/Geneweb__AdvSearchOkDisplay/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__AdvSearchOkDisplay/index.html b/static/doc/geneweb/Geneweb__AdvSearchOkDisplay/index.html deleted file mode 100644 index 127f15a34e..0000000000 --- a/static/doc/geneweb/Geneweb__AdvSearchOkDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__AdvSearchOkDisplay (geneweb.Geneweb__AdvSearchOkDisplay)

      Module Geneweb__AdvSearchOkDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Alln/.dune-keep b/static/doc/geneweb/Geneweb__Alln/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__Alln/index.html b/static/doc/geneweb/Geneweb__Alln/index.html deleted file mode 100644 index ef7aade373..0000000000 --- a/static/doc/geneweb/Geneweb__Alln/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__Alln (geneweb.Geneweb__Alln)

      Module Geneweb__Alln

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__AllnDisplay/.dune-keep b/static/doc/geneweb/Geneweb__AllnDisplay/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__AllnDisplay/index.html b/static/doc/geneweb/Geneweb__AllnDisplay/index.html deleted file mode 100644 index da6f473e26..0000000000 --- a/static/doc/geneweb/Geneweb__AllnDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__AllnDisplay (geneweb.Geneweb__AllnDisplay)

      Module Geneweb__AllnDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Ansel/.dune-keep b/static/doc/geneweb/Geneweb__Ansel/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__Ansel/index.html b/static/doc/geneweb/Geneweb__Ansel/index.html deleted file mode 100644 index a5e6c5d870..0000000000 --- a/static/doc/geneweb/Geneweb__Ansel/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__Ansel (geneweb.Geneweb__Ansel)

      Module Geneweb__Ansel

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Base64/.dune-keep b/static/doc/geneweb/Geneweb__Base64/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__Base64/index.html b/static/doc/geneweb/Geneweb__Base64/index.html deleted file mode 100644 index 0d81b73c02..0000000000 --- a/static/doc/geneweb/Geneweb__Base64/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__Base64 (geneweb.Geneweb__Base64)

      Module Geneweb__Base64

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__BirthDeath/.dune-keep b/static/doc/geneweb/Geneweb__BirthDeath/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__BirthDeath/index.html b/static/doc/geneweb/Geneweb__BirthDeath/index.html deleted file mode 100644 index 4c4b56c7d0..0000000000 --- a/static/doc/geneweb/Geneweb__BirthDeath/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__BirthDeath (geneweb.Geneweb__BirthDeath)

      Module Geneweb__BirthDeath

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__BirthDeathDisplay/.dune-keep b/static/doc/geneweb/Geneweb__BirthDeathDisplay/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__BirthDeathDisplay/index.html b/static/doc/geneweb/Geneweb__BirthDeathDisplay/index.html deleted file mode 100644 index 882db62f4a..0000000000 --- a/static/doc/geneweb/Geneweb__BirthDeathDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__BirthDeathDisplay (geneweb.Geneweb__BirthDeathDisplay)

      Module Geneweb__BirthDeathDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__BirthdayDisplay/.dune-keep b/static/doc/geneweb/Geneweb__BirthdayDisplay/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__BirthdayDisplay/index.html b/static/doc/geneweb/Geneweb__BirthdayDisplay/index.html deleted file mode 100644 index 6b46c643a1..0000000000 --- a/static/doc/geneweb/Geneweb__BirthdayDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__BirthdayDisplay (geneweb.Geneweb__BirthdayDisplay)

      Module Geneweb__BirthdayDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__ChangeChildren/.dune-keep b/static/doc/geneweb/Geneweb__ChangeChildren/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__ChangeChildren/index.html b/static/doc/geneweb/Geneweb__ChangeChildren/index.html deleted file mode 100644 index 3223068011..0000000000 --- a/static/doc/geneweb/Geneweb__ChangeChildren/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__ChangeChildren (geneweb.Geneweb__ChangeChildren)

      Module Geneweb__ChangeChildren

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__ChangeChildrenDisplay/.dune-keep b/static/doc/geneweb/Geneweb__ChangeChildrenDisplay/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__ChangeChildrenDisplay/index.html b/static/doc/geneweb/Geneweb__ChangeChildrenDisplay/index.html deleted file mode 100644 index 6634d7d41e..0000000000 --- a/static/doc/geneweb/Geneweb__ChangeChildrenDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__ChangeChildrenDisplay (geneweb.Geneweb__ChangeChildrenDisplay)

      Module Geneweb__ChangeChildrenDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Check/.dune-keep b/static/doc/geneweb/Geneweb__Check/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__Check/index.html b/static/doc/geneweb/Geneweb__Check/index.html deleted file mode 100644 index ca2fa7f44d..0000000000 --- a/static/doc/geneweb/Geneweb__Check/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__Check (geneweb.Geneweb__Check)

      Module Geneweb__Check

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__CheckItem/.dune-keep b/static/doc/geneweb/Geneweb__CheckItem/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__CheckItem/index.html b/static/doc/geneweb/Geneweb__CheckItem/index.html deleted file mode 100644 index 30ad193df0..0000000000 --- a/static/doc/geneweb/Geneweb__CheckItem/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__CheckItem (geneweb.Geneweb__CheckItem)

      Module Geneweb__CheckItem

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Config/.dune-keep b/static/doc/geneweb/Geneweb__Config/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__Config/index.html b/static/doc/geneweb/Geneweb__Config/index.html deleted file mode 100644 index 23cfcb706c..0000000000 --- a/static/doc/geneweb/Geneweb__Config/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__Config (geneweb.Geneweb__Config)

      Module Geneweb__Config

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Cousins/.dune-keep b/static/doc/geneweb/Geneweb__Cousins/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__Cousins/index.html b/static/doc/geneweb/Geneweb__Cousins/index.html deleted file mode 100644 index 7f76ee835f..0000000000 --- a/static/doc/geneweb/Geneweb__Cousins/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__Cousins (geneweb.Geneweb__Cousins)

      Module Geneweb__Cousins

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__CousinsDisplay/.dune-keep b/static/doc/geneweb/Geneweb__CousinsDisplay/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__CousinsDisplay/index.html b/static/doc/geneweb/Geneweb__CousinsDisplay/index.html deleted file mode 100644 index 731b9fc354..0000000000 --- a/static/doc/geneweb/Geneweb__CousinsDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__CousinsDisplay (geneweb.Geneweb__CousinsDisplay)

      Module Geneweb__CousinsDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Dag/.dune-keep b/static/doc/geneweb/Geneweb__Dag/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__Dag/index.html b/static/doc/geneweb/Geneweb__Dag/index.html deleted file mode 100644 index 2c49ac6ce0..0000000000 --- a/static/doc/geneweb/Geneweb__Dag/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__Dag (geneweb.Geneweb__Dag)

      Module Geneweb__Dag

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Dag2html/.dune-keep b/static/doc/geneweb/Geneweb__Dag2html/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__Dag2html/index.html b/static/doc/geneweb/Geneweb__Dag2html/index.html deleted file mode 100644 index 6668f80aa9..0000000000 --- a/static/doc/geneweb/Geneweb__Dag2html/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__Dag2html (geneweb.Geneweb__Dag2html)

      Module Geneweb__Dag2html

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__DagDisplay/.dune-keep b/static/doc/geneweb/Geneweb__DagDisplay/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__DagDisplay/index.html b/static/doc/geneweb/Geneweb__DagDisplay/index.html deleted file mode 100644 index 08e178c33c..0000000000 --- a/static/doc/geneweb/Geneweb__DagDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__DagDisplay (geneweb.Geneweb__DagDisplay)

      Module Geneweb__DagDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__DateDisplay/.dune-keep b/static/doc/geneweb/Geneweb__DateDisplay/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__DateDisplay/index.html b/static/doc/geneweb/Geneweb__DateDisplay/index.html deleted file mode 100644 index ab3f479072..0000000000 --- a/static/doc/geneweb/Geneweb__DateDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__DateDisplay (geneweb.Geneweb__DateDisplay)

      Module Geneweb__DateDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__DescendDisplay/.dune-keep b/static/doc/geneweb/Geneweb__DescendDisplay/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__DescendDisplay/index.html b/static/doc/geneweb/Geneweb__DescendDisplay/index.html deleted file mode 100644 index b3e91d6d1e..0000000000 --- a/static/doc/geneweb/Geneweb__DescendDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__DescendDisplay (geneweb.Geneweb__DescendDisplay)

      Module Geneweb__DescendDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Difference/.dune-keep b/static/doc/geneweb/Geneweb__Difference/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__Difference/index.html b/static/doc/geneweb/Geneweb__Difference/index.html deleted file mode 100644 index e3ed90451a..0000000000 --- a/static/doc/geneweb/Geneweb__Difference/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__Difference (geneweb.Geneweb__Difference)

      Module Geneweb__Difference

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Fixbase/.dune-keep b/static/doc/geneweb/Geneweb__Fixbase/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__Fixbase/index.html b/static/doc/geneweb/Geneweb__Fixbase/index.html deleted file mode 100644 index 12a3287bb8..0000000000 --- a/static/doc/geneweb/Geneweb__Fixbase/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__Fixbase (geneweb.Geneweb__Fixbase)

      Module Geneweb__Fixbase

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__GWPARAM/.dune-keep b/static/doc/geneweb/Geneweb__GWPARAM/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__GWPARAM/index.html b/static/doc/geneweb/Geneweb__GWPARAM/index.html deleted file mode 100644 index d559c77920..0000000000 --- a/static/doc/geneweb/Geneweb__GWPARAM/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__GWPARAM (geneweb.Geneweb__GWPARAM)

      Module Geneweb__GWPARAM

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__GWPARAM_ITL/.dune-keep b/static/doc/geneweb/Geneweb__GWPARAM_ITL/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__GWPARAM_ITL/index.html b/static/doc/geneweb/Geneweb__GWPARAM_ITL/index.html deleted file mode 100644 index 503ff60f9b..0000000000 --- a/static/doc/geneweb/Geneweb__GWPARAM_ITL/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__GWPARAM_ITL (geneweb.Geneweb__GWPARAM_ITL)

      Module Geneweb__GWPARAM_ITL

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Gwlib/.dune-keep b/static/doc/geneweb/Geneweb__Gwlib/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__Gwlib/index.html b/static/doc/geneweb/Geneweb__Gwlib/index.html deleted file mode 100644 index 5782c6828a..0000000000 --- a/static/doc/geneweb/Geneweb__Gwlib/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__Gwlib (geneweb.Geneweb__Gwlib)

      Module Geneweb__Gwlib

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__History/.dune-keep b/static/doc/geneweb/Geneweb__History/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__History/index.html b/static/doc/geneweb/Geneweb__History/index.html deleted file mode 100644 index fb2aff0ad0..0000000000 --- a/static/doc/geneweb/Geneweb__History/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__History (geneweb.Geneweb__History)

      Module Geneweb__History

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__HistoryDiff/.dune-keep b/static/doc/geneweb/Geneweb__HistoryDiff/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__HistoryDiff/index.html b/static/doc/geneweb/Geneweb__HistoryDiff/index.html deleted file mode 100644 index 115f5cdd04..0000000000 --- a/static/doc/geneweb/Geneweb__HistoryDiff/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__HistoryDiff (geneweb.Geneweb__HistoryDiff)

      Module Geneweb__HistoryDiff

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__HistoryDiffDisplay/.dune-keep b/static/doc/geneweb/Geneweb__HistoryDiffDisplay/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__HistoryDiffDisplay/index.html b/static/doc/geneweb/Geneweb__HistoryDiffDisplay/index.html deleted file mode 100644 index 49bd9778ef..0000000000 --- a/static/doc/geneweb/Geneweb__HistoryDiffDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__HistoryDiffDisplay (geneweb.Geneweb__HistoryDiffDisplay)

      Module Geneweb__HistoryDiffDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Hutil/.dune-keep b/static/doc/geneweb/Geneweb__Hutil/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__Hutil/index.html b/static/doc/geneweb/Geneweb__Hutil/index.html deleted file mode 100644 index 7b38e90a44..0000000000 --- a/static/doc/geneweb/Geneweb__Hutil/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__Hutil (geneweb.Geneweb__Hutil)

      Module Geneweb__Hutil

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__ImageDisplay/.dune-keep b/static/doc/geneweb/Geneweb__ImageDisplay/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__ImageDisplay/index.html b/static/doc/geneweb/Geneweb__ImageDisplay/index.html deleted file mode 100644 index 072a32e27f..0000000000 --- a/static/doc/geneweb/Geneweb__ImageDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__ImageDisplay (geneweb.Geneweb__ImageDisplay)

      Module Geneweb__ImageDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__MergeDisplay/.dune-keep b/static/doc/geneweb/Geneweb__MergeDisplay/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__MergeDisplay/index.html b/static/doc/geneweb/Geneweb__MergeDisplay/index.html deleted file mode 100644 index 60a0871f08..0000000000 --- a/static/doc/geneweb/Geneweb__MergeDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__MergeDisplay (geneweb.Geneweb__MergeDisplay)

      Module Geneweb__MergeDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__MergeDupDisplay/.dune-keep b/static/doc/geneweb/Geneweb__MergeDupDisplay/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__MergeDupDisplay/index.html b/static/doc/geneweb/Geneweb__MergeDupDisplay/index.html deleted file mode 100644 index db555e32a7..0000000000 --- a/static/doc/geneweb/Geneweb__MergeDupDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__MergeDupDisplay (geneweb.Geneweb__MergeDupDisplay)

      Module Geneweb__MergeDupDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__MergeFamDisplay/.dune-keep b/static/doc/geneweb/Geneweb__MergeFamDisplay/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__MergeFamDisplay/index.html b/static/doc/geneweb/Geneweb__MergeFamDisplay/index.html deleted file mode 100644 index f11d73e871..0000000000 --- a/static/doc/geneweb/Geneweb__MergeFamDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__MergeFamDisplay (geneweb.Geneweb__MergeFamDisplay)

      Module Geneweb__MergeFamDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__MergeFamOk/.dune-keep b/static/doc/geneweb/Geneweb__MergeFamOk/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__MergeFamOk/index.html b/static/doc/geneweb/Geneweb__MergeFamOk/index.html deleted file mode 100644 index d2fcf7a1b2..0000000000 --- a/static/doc/geneweb/Geneweb__MergeFamOk/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__MergeFamOk (geneweb.Geneweb__MergeFamOk)

      Module Geneweb__MergeFamOk

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__MergeInd/.dune-keep b/static/doc/geneweb/Geneweb__MergeInd/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__MergeInd/index.html b/static/doc/geneweb/Geneweb__MergeInd/index.html deleted file mode 100644 index 023cdd9e9b..0000000000 --- a/static/doc/geneweb/Geneweb__MergeInd/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__MergeInd (geneweb.Geneweb__MergeInd)

      Module Geneweb__MergeInd

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__MergeIndDisplay/.dune-keep b/static/doc/geneweb/Geneweb__MergeIndDisplay/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__MergeIndDisplay/index.html b/static/doc/geneweb/Geneweb__MergeIndDisplay/index.html deleted file mode 100644 index 477e6e7f10..0000000000 --- a/static/doc/geneweb/Geneweb__MergeIndDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__MergeIndDisplay (geneweb.Geneweb__MergeIndDisplay)

      Module Geneweb__MergeIndDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__MergeIndOk/.dune-keep b/static/doc/geneweb/Geneweb__MergeIndOk/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__MergeIndOk/index.html b/static/doc/geneweb/Geneweb__MergeIndOk/index.html deleted file mode 100644 index b4c762ae19..0000000000 --- a/static/doc/geneweb/Geneweb__MergeIndOk/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__MergeIndOk (geneweb.Geneweb__MergeIndOk)

      Module Geneweb__MergeIndOk

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__MergeIndOkDisplay/.dune-keep b/static/doc/geneweb/Geneweb__MergeIndOkDisplay/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__MergeIndOkDisplay/index.html b/static/doc/geneweb/Geneweb__MergeIndOkDisplay/index.html deleted file mode 100644 index d8187f9ffa..0000000000 --- a/static/doc/geneweb/Geneweb__MergeIndOkDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__MergeIndOkDisplay (geneweb.Geneweb__MergeIndOkDisplay)

      Module Geneweb__MergeIndOkDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Notes/.dune-keep b/static/doc/geneweb/Geneweb__Notes/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__Notes/index.html b/static/doc/geneweb/Geneweb__Notes/index.html deleted file mode 100644 index a8389a1cbd..0000000000 --- a/static/doc/geneweb/Geneweb__Notes/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__Notes (geneweb.Geneweb__Notes)

      Module Geneweb__Notes

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__NotesDisplay/.dune-keep b/static/doc/geneweb/Geneweb__NotesDisplay/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__NotesDisplay/index.html b/static/doc/geneweb/Geneweb__NotesDisplay/index.html deleted file mode 100644 index e024fb4d9f..0000000000 --- a/static/doc/geneweb/Geneweb__NotesDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__NotesDisplay (geneweb.Geneweb__NotesDisplay)

      Module Geneweb__NotesDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__NotesLinks/.dune-keep b/static/doc/geneweb/Geneweb__NotesLinks/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__NotesLinks/index.html b/static/doc/geneweb/Geneweb__NotesLinks/index.html deleted file mode 100644 index 4e1a25414e..0000000000 --- a/static/doc/geneweb/Geneweb__NotesLinks/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__NotesLinks (geneweb.Geneweb__NotesLinks)

      Module Geneweb__NotesLinks

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Output/.dune-keep b/static/doc/geneweb/Geneweb__Output/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__Output/index.html b/static/doc/geneweb/Geneweb__Output/index.html deleted file mode 100644 index c8f3491a7d..0000000000 --- a/static/doc/geneweb/Geneweb__Output/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__Output (geneweb.Geneweb__Output)

      Module Geneweb__Output

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Perso/.dune-keep b/static/doc/geneweb/Geneweb__Perso/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__Perso/index.html b/static/doc/geneweb/Geneweb__Perso/index.html deleted file mode 100644 index ad69908b09..0000000000 --- a/static/doc/geneweb/Geneweb__Perso/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__Perso (geneweb.Geneweb__Perso)

      Module Geneweb__Perso

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Place/.dune-keep b/static/doc/geneweb/Geneweb__Place/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__Place/index.html b/static/doc/geneweb/Geneweb__Place/index.html deleted file mode 100644 index 6b6940d7e7..0000000000 --- a/static/doc/geneweb/Geneweb__Place/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__Place (geneweb.Geneweb__Place)

      Module Geneweb__Place

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__PlaceDisplay/.dune-keep b/static/doc/geneweb/Geneweb__PlaceDisplay/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__PlaceDisplay/index.html b/static/doc/geneweb/Geneweb__PlaceDisplay/index.html deleted file mode 100644 index 9de21160e2..0000000000 --- a/static/doc/geneweb/Geneweb__PlaceDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__PlaceDisplay (geneweb.Geneweb__PlaceDisplay)

      Module Geneweb__PlaceDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Relation/.dune-keep b/static/doc/geneweb/Geneweb__Relation/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__Relation/index.html b/static/doc/geneweb/Geneweb__Relation/index.html deleted file mode 100644 index 2e0c68ab11..0000000000 --- a/static/doc/geneweb/Geneweb__Relation/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__Relation (geneweb.Geneweb__Relation)

      Module Geneweb__Relation

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__RelationDisplay/.dune-keep b/static/doc/geneweb/Geneweb__RelationDisplay/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__RelationDisplay/index.html b/static/doc/geneweb/Geneweb__RelationDisplay/index.html deleted file mode 100644 index d665957229..0000000000 --- a/static/doc/geneweb/Geneweb__RelationDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__RelationDisplay (geneweb.Geneweb__RelationDisplay)

      Module Geneweb__RelationDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__RelationLink/.dune-keep b/static/doc/geneweb/Geneweb__RelationLink/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__RelationLink/index.html b/static/doc/geneweb/Geneweb__RelationLink/index.html deleted file mode 100644 index 7db4c28f30..0000000000 --- a/static/doc/geneweb/Geneweb__RelationLink/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__RelationLink (geneweb.Geneweb__RelationLink)

      Module Geneweb__RelationLink

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__SearchName/.dune-keep b/static/doc/geneweb/Geneweb__SearchName/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__SearchName/index.html b/static/doc/geneweb/Geneweb__SearchName/index.html deleted file mode 100644 index 4e43a7f5d7..0000000000 --- a/static/doc/geneweb/Geneweb__SearchName/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__SearchName (geneweb.Geneweb__SearchName)

      Module Geneweb__SearchName

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Some/.dune-keep b/static/doc/geneweb/Geneweb__Some/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__Some/index.html b/static/doc/geneweb/Geneweb__Some/index.html deleted file mode 100644 index 8f7216bb2c..0000000000 --- a/static/doc/geneweb/Geneweb__Some/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__Some (geneweb.Geneweb__Some)

      Module Geneweb__Some

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__SrcfileDisplay/.dune-keep b/static/doc/geneweb/Geneweb__SrcfileDisplay/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__SrcfileDisplay/index.html b/static/doc/geneweb/Geneweb__SrcfileDisplay/index.html deleted file mode 100644 index 9b3a96af75..0000000000 --- a/static/doc/geneweb/Geneweb__SrcfileDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__SrcfileDisplay (geneweb.Geneweb__SrcfileDisplay)

      Module Geneweb__SrcfileDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Stats/.dune-keep b/static/doc/geneweb/Geneweb__Stats/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__Stats/index.html b/static/doc/geneweb/Geneweb__Stats/index.html deleted file mode 100644 index a888ac3cce..0000000000 --- a/static/doc/geneweb/Geneweb__Stats/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__Stats (geneweb.Geneweb__Stats)

      Module Geneweb__Stats

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Templ/.dune-keep b/static/doc/geneweb/Geneweb__Templ/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__Templ/index.html b/static/doc/geneweb/Geneweb__Templ/index.html deleted file mode 100644 index 4393fb78ce..0000000000 --- a/static/doc/geneweb/Geneweb__Templ/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__Templ (geneweb.Geneweb__Templ)

      Module Geneweb__Templ

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__TemplAst/.dune-keep b/static/doc/geneweb/Geneweb__TemplAst/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__TemplAst/index.html b/static/doc/geneweb/Geneweb__TemplAst/index.html deleted file mode 100644 index b4e23afae0..0000000000 --- a/static/doc/geneweb/Geneweb__TemplAst/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__TemplAst (geneweb.Geneweb__TemplAst)

      Module Geneweb__TemplAst

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__TemplDate/.dune-keep b/static/doc/geneweb/Geneweb__TemplDate/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__TemplDate/index.html b/static/doc/geneweb/Geneweb__TemplDate/index.html deleted file mode 100644 index bc0dbb7c6b..0000000000 --- a/static/doc/geneweb/Geneweb__TemplDate/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__TemplDate (geneweb.Geneweb__TemplDate)

      Module Geneweb__TemplDate

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Templ_parser/.dune-keep b/static/doc/geneweb/Geneweb__Templ_parser/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__Templ_parser/index.html b/static/doc/geneweb/Geneweb__Templ_parser/index.html deleted file mode 100644 index a58262c1a2..0000000000 --- a/static/doc/geneweb/Geneweb__Templ_parser/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__Templ_parser (geneweb.Geneweb__Templ_parser)

      Module Geneweb__Templ_parser

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Title/.dune-keep b/static/doc/geneweb/Geneweb__Title/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__Title/index.html b/static/doc/geneweb/Geneweb__Title/index.html deleted file mode 100644 index 73f67c7627..0000000000 --- a/static/doc/geneweb/Geneweb__Title/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__Title (geneweb.Geneweb__Title)

      Module Geneweb__Title

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__TitleDisplay/.dune-keep b/static/doc/geneweb/Geneweb__TitleDisplay/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__TitleDisplay/index.html b/static/doc/geneweb/Geneweb__TitleDisplay/index.html deleted file mode 100644 index a9267d66c2..0000000000 --- a/static/doc/geneweb/Geneweb__TitleDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__TitleDisplay (geneweb.Geneweb__TitleDisplay)

      Module Geneweb__TitleDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Translate/.dune-keep b/static/doc/geneweb/Geneweb__Translate/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__Translate/index.html b/static/doc/geneweb/Geneweb__Translate/index.html deleted file mode 100644 index 1356d11615..0000000000 --- a/static/doc/geneweb/Geneweb__Translate/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__Translate (geneweb.Geneweb__Translate)

      Module Geneweb__Translate

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Update/.dune-keep b/static/doc/geneweb/Geneweb__Update/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__Update/index.html b/static/doc/geneweb/Geneweb__Update/index.html deleted file mode 100644 index 045d1ba514..0000000000 --- a/static/doc/geneweb/Geneweb__Update/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__Update (geneweb.Geneweb__Update)

      Module Geneweb__Update

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__UpdateData/.dune-keep b/static/doc/geneweb/Geneweb__UpdateData/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__UpdateData/index.html b/static/doc/geneweb/Geneweb__UpdateData/index.html deleted file mode 100644 index 23dac545b6..0000000000 --- a/static/doc/geneweb/Geneweb__UpdateData/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__UpdateData (geneweb.Geneweb__UpdateData)

      Module Geneweb__UpdateData

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__UpdateDataDisplay/.dune-keep b/static/doc/geneweb/Geneweb__UpdateDataDisplay/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__UpdateDataDisplay/index.html b/static/doc/geneweb/Geneweb__UpdateDataDisplay/index.html deleted file mode 100644 index 12a4a53195..0000000000 --- a/static/doc/geneweb/Geneweb__UpdateDataDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__UpdateDataDisplay (geneweb.Geneweb__UpdateDataDisplay)

      Module Geneweb__UpdateDataDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__UpdateFam/.dune-keep b/static/doc/geneweb/Geneweb__UpdateFam/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__UpdateFam/index.html b/static/doc/geneweb/Geneweb__UpdateFam/index.html deleted file mode 100644 index 1740cc5de5..0000000000 --- a/static/doc/geneweb/Geneweb__UpdateFam/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__UpdateFam (geneweb.Geneweb__UpdateFam)

      Module Geneweb__UpdateFam

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__UpdateFamOk/.dune-keep b/static/doc/geneweb/Geneweb__UpdateFamOk/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__UpdateFamOk/index.html b/static/doc/geneweb/Geneweb__UpdateFamOk/index.html deleted file mode 100644 index ada7c7d372..0000000000 --- a/static/doc/geneweb/Geneweb__UpdateFamOk/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__UpdateFamOk (geneweb.Geneweb__UpdateFamOk)

      Module Geneweb__UpdateFamOk

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__UpdateInd/.dune-keep b/static/doc/geneweb/Geneweb__UpdateInd/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__UpdateInd/index.html b/static/doc/geneweb/Geneweb__UpdateInd/index.html deleted file mode 100644 index dcef231258..0000000000 --- a/static/doc/geneweb/Geneweb__UpdateInd/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__UpdateInd (geneweb.Geneweb__UpdateInd)

      Module Geneweb__UpdateInd

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__UpdateIndOk/.dune-keep b/static/doc/geneweb/Geneweb__UpdateIndOk/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__UpdateIndOk/index.html b/static/doc/geneweb/Geneweb__UpdateIndOk/index.html deleted file mode 100644 index 3071d06c79..0000000000 --- a/static/doc/geneweb/Geneweb__UpdateIndOk/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__UpdateIndOk (geneweb.Geneweb__UpdateIndOk)

      Module Geneweb__UpdateIndOk

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Util/.dune-keep b/static/doc/geneweb/Geneweb__Util/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__Util/index.html b/static/doc/geneweb/Geneweb__Util/index.html deleted file mode 100644 index 510be20121..0000000000 --- a/static/doc/geneweb/Geneweb__Util/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__Util (geneweb.Geneweb__Util)

      Module Geneweb__Util

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Version/.dune-keep b/static/doc/geneweb/Geneweb__Version/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__Version/index.html b/static/doc/geneweb/Geneweb__Version/index.html deleted file mode 100644 index 6757c2a894..0000000000 --- a/static/doc/geneweb/Geneweb__Version/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__Version (geneweb.Geneweb__Version)

      Module Geneweb__Version

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__Wiki/.dune-keep b/static/doc/geneweb/Geneweb__Wiki/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__Wiki/index.html b/static/doc/geneweb/Geneweb__Wiki/index.html deleted file mode 100644 index f417b7d6c3..0000000000 --- a/static/doc/geneweb/Geneweb__Wiki/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__Wiki (geneweb.Geneweb__Wiki)

      Module Geneweb__Wiki

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb__WiznotesDisplay/.dune-keep b/static/doc/geneweb/Geneweb__WiznotesDisplay/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb__WiznotesDisplay/index.html b/static/doc/geneweb/Geneweb__WiznotesDisplay/index.html deleted file mode 100644 index 8581ba8044..0000000000 --- a/static/doc/geneweb/Geneweb__WiznotesDisplay/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb__WiznotesDisplay (geneweb.Geneweb__WiznotesDisplay)

      Module Geneweb__WiznotesDisplay

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb_export/.dune-keep b/static/doc/geneweb/Geneweb_export/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb_export/Json_converter/Make/argument-1-D/index.html b/static/doc/geneweb/Geneweb_export/Json_converter/Make/argument-1-D/index.html deleted file mode 100644 index 277457bcc4..0000000000 --- a/static/doc/geneweb/Geneweb_export/Json_converter/Make/argument-1-D/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -D (geneweb.Geneweb_export.Json_converter.Make.1-D)

      Parameter Make.1-D

      type t

      Json value

      val str : string -> t

      Convert to JSON string

      val int : int -> t

      Convert to JSON integer

      val obj : (string * t) array -> t

      Convert to JSON object

      val null : t

      Convert to JSON null value

      val array : 't array -> t

      Convert array to JSON list

      val list : 't list -> t

      Convert list to JSON list

      val bool : bool -> t

      Convert to JSON boolean

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb_export/Json_converter/Make/index.html b/static/doc/geneweb/Geneweb_export/Json_converter/Make/index.html deleted file mode 100644 index ec869f691a..0000000000 --- a/static/doc/geneweb/Geneweb_export/Json_converter/Make/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Make (geneweb.Geneweb_export.Json_converter.Make)

      Module Json_converter.Make

      Functor building JSON convertion functions of the Geneweb data types.

      Parameters

      Signature

      val conv_dmy : Def.dmy -> D.t

      Convert dmy to JSON

      val conv_dmy2 : Def.dmy2 -> D.t

      Convert dmy2 to JSON

      val conv_cdate : Def.cdate -> D.t

      Convert cdate to JSON

      val conv_pevent_name : string Def.gen_pers_event_name -> D.t

      Convert gen_pers_event_name to JSON

      val conv_event_witness_kind : Def.witness_kind -> D.t

      Convert witness_kind to JSON

      val conv_pevent : (Gwdb_driver.iper, string) Def.gen_pers_event -> D.t

      Convert gen_pers_event to JSON

      val conv_title_name : string Def.gen_title_name -> D.t

      Convert gen_title_name to JSON

      val conv_title : string Def.gen_title -> D.t

      Convert gen_title to JSON

      val conv_relation_kind : Def.relation_kind -> D.t

      Convert relation_kind to JSON

      val conv_fevent_name : string Def.gen_fam_event_name -> D.t

      Convert gen_fam_event_name to JSON

      val conv_fevent : (Gwdb_driver.iper, string) Def.gen_fam_event -> D.t

      Convert gen_fam_event to JSON

      val conv_divorce : Def.divorce -> D.t

      Convert divorce to JSON

      val conv_relation_type : Def.relation_type -> D.t

      Convert relation_type to JSON

      val conv_rparent : (Gwdb_driver.iper, string) Def.gen_relation -> D.t

      Convert gen_relation to JSON

      val conv_death : Def.death -> D.t

      Convert death to JSON

      val conv_person : Gwdb.base -> Gwdb.person -> D.t

      Convert person to JSON

      val conv_family : Gwdb.base -> Gwdb.family -> D.t

      Convert family to JSON

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb_export/Json_converter/index.html b/static/doc/geneweb/Geneweb_export/Json_converter/index.html deleted file mode 100644 index 9db2c807f4..0000000000 --- a/static/doc/geneweb/Geneweb_export/Json_converter/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Json_converter (geneweb.Geneweb_export.Json_converter)

      Module Geneweb_export.Json_converter

      module type ConverterDriver = sig ... end

      Json converter driver

      module Make (D : ConverterDriver) : sig ... end

      Functor building JSON convertion functions of the Geneweb data types.

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb_export/Json_converter/module-type-ConverterDriver/index.html b/static/doc/geneweb/Geneweb_export/Json_converter/module-type-ConverterDriver/index.html deleted file mode 100644 index e34d877146..0000000000 --- a/static/doc/geneweb/Geneweb_export/Json_converter/module-type-ConverterDriver/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -ConverterDriver (geneweb.Geneweb_export.Json_converter.ConverterDriver)

      Module type Json_converter.ConverterDriver

      Json converter driver

      type t

      Json value

      val str : string -> t

      Convert to JSON string

      val int : int -> t

      Convert to JSON integer

      val obj : (string * t) array -> t

      Convert to JSON object

      val null : t

      Convert to JSON null value

      val array : 't array -> t

      Convert array to JSON list

      val list : 't list -> t

      Convert list to JSON list

      val bool : bool -> t

      Convert to JSON boolean

      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb_export/index.html b/static/doc/geneweb/Geneweb_export/index.html deleted file mode 100644 index 9844c8c683..0000000000 --- a/static/doc/geneweb/Geneweb_export/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb_export (geneweb.Geneweb_export)

      Module Geneweb_export

      module Json_converter : sig ... end
      \ No newline at end of file diff --git a/static/doc/geneweb/Geneweb_export__Json_converter/.dune-keep b/static/doc/geneweb/Geneweb_export__Json_converter/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Geneweb_export__Json_converter/index.html b/static/doc/geneweb/Geneweb_export__Json_converter/index.html deleted file mode 100644 index fcaba8bab0..0000000000 --- a/static/doc/geneweb/Geneweb_export__Json_converter/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Geneweb_export__Json_converter (geneweb.Geneweb_export__Json_converter)

      Module Geneweb_export__Json_converter

      \ No newline at end of file diff --git a/static/doc/geneweb/Gutil/.dune-keep b/static/doc/geneweb/Gutil/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Gutil/index.html b/static/doc/geneweb/Gutil/index.html deleted file mode 100644 index fe5434b873..0000000000 --- a/static/doc/geneweb/Gutil/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Gutil (geneweb.Gutil)

      Module Gutil

      val spouse : Gwdb.iper -> Gwdb.family -> Gwdb.iper

      spouse p f returns spouse of giving person inside the family.

      val person_not_a_key_find_all : Gwdb.base -> string -> Gwdb.iper list

      Returns list of persons having the giving name as one of the misc names.

      val person_ht_find_all : Gwdb.base -> string -> Gwdb.iper list

      Returns list of persons from the giving key. If key has form "firstname.occ surname" then returns list of one corresponding person. Otherwise calls person_not_a_key_find_all

      val person_of_string_key : Gwdb.base -> string -> Gwdb.iper option

      person_of_string_key base key try to find a key inside key string of the form "firstname.occ surname" and returns a corresponding person. If person doesn't exists or key isn't found then returns None

      val find_same_name : Gwdb.base -> Gwdb.person -> Gwdb.person list

      Returns list of persons having the same first name and surname as the specified person

      val designation : Gwdb.base -> Gwdb.person -> string

      Returns person's key that has form "firstname.occ surname"

      val trim_trailing_spaces : string -> string

      Trim at the end of string

      val alphabetic_utf_8 : string -> string -> int

      Compare two UTF-8 encoded strings by alphabetic order

      val alphabetic : string -> string -> int

      Compare two ISO-8859-1 encoded strings by alphabetic order

      val alphabetic_order : string -> string -> int

      Same as alphabetic_utf_8

      val arg_list_of_string : string -> string list

      Parse line and extract separated arguments ("" and '' are used to indlude spaces inside the argument)

      val sort_person_list : Gwdb.base -> Gwdb.person list -> Gwdb.person list

      Sort list of persons by comparison with following order:

      • Compare by birth and death date
      • Compare by surname
      • Compare by first name
      • Compare by occurence number
      • Compare by id
      val sort_uniq_person_list : Gwdb.base -> Gwdb.person list -> Gwdb.person list

      Same as sort_person_list but also remove duplicates

      val father : 'a Def.gen_couple -> 'a

      Same as Adef.father

      val mother : 'a Def.gen_couple -> 'a

      Same as Adef.mother

      val couple : bool -> 'a -> 'a -> 'a Def.gen_couple

      couple multi f m creates a couple from father f and mother m. If multi true uses multiparent functionality

      val parent_array : 'a Def.gen_couple -> 'a array

      Same as Adef.parent_array

      val find_free_occ : Gwdb.base -> string -> string -> int

      Find first free occurence number for the person with specified first name and surname.

      val get_birth_death_date : Gwdb.person -> Def.date option * Def.date option * bool

      get_birth_death p Return (birth, death, approx). If birth/death date can not be found, baptism/burial date is used and approx is set to true (it is false if both birth and death dates are found).

      \ No newline at end of file diff --git a/static/doc/geneweb/Gwb2gedLib/.dune-keep b/static/doc/geneweb/Gwb2gedLib/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Gwb2gedLib/index.html b/static/doc/geneweb/Gwb2gedLib/index.html deleted file mode 100644 index c330268091..0000000000 --- a/static/doc/geneweb/Gwb2gedLib/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Gwb2gedLib (geneweb.Gwb2gedLib)

      Module Gwb2gedLib

      val gwb2ged : bool -> Gwexport.gwexport_opts -> ((Gwdb.iper -> bool) * (Gwdb.ifam -> bool)) -> unit

      gwb2ged with_indexes opts sel Converts a Geneweb database to a GEDCOM file. * `with_indexes` specifies if indexes are printed or not; * `opts` are the export options * `sel` is a pair of selectors returned by the database export

      \ No newline at end of file diff --git a/static/doc/geneweb/Gwd_lib/.dune-keep b/static/doc/geneweb/Gwd_lib/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Gwd_lib/GwdLog/index.html b/static/doc/geneweb/Gwd_lib/GwdLog/index.html deleted file mode 100644 index 29eb5945d0..0000000000 --- a/static/doc/geneweb/Gwd_lib/GwdLog/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -GwdLog (geneweb.Gwd_lib.GwdLog)

      Module Gwd_lib.GwdLog

      val verbosity : int Stdlib.ref

      Verbosity level: defines the verbosity level that will allow the `syslog` function to print anything.

      val debug : bool Stdlib.ref

      If set to `true`, prints backtrace when printng log.

      val oc : Stdlib.out_channel option Stdlib.ref

      The output channel in which log is written.

      val log : (Stdlib.out_channel -> unit) -> unit

      Prints on `oc`

      type level = [
      | `LOG_EMERG(*

      Print if `!verbosity >= 0`

      *)
      | `LOG_ALERT(*

      Print if `!verbosity >= 1`

      *)
      | `LOG_CRIT(*

      Print if `!verbosity >= 2`

      *)
      | `LOG_ERR(*

      Print if `!verbosity >= 3`

      *)
      | `LOG_WARNING(*

      Print if `!verbosity >= 4`

      *)
      | `LOG_NOTICE(*

      Print if `!verbosity >= 5`

      *)
      | `LOG_INFO(*

      Print if `!verbosity >= 6`

      *)
      | `LOG_DEBUG(*

      Print if `!verbosity >= 7`

      *)
      ]

      The level of log.

      val syslog : level -> string -> unit

      syslog level msg Prints `msg` on `!oc` depending on the verbosity.

      \ No newline at end of file diff --git a/static/doc/geneweb/Gwd_lib/GwdPlugin/index.html b/static/doc/geneweb/Gwd_lib/GwdPlugin/index.html deleted file mode 100644 index 21657428f4..0000000000 --- a/static/doc/geneweb/Gwd_lib/GwdPlugin/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -GwdPlugin (geneweb.Gwd_lib.GwdPlugin)

      Module Gwd_lib.GwdPlugin

      val assets : string Stdlib.ref
      val ht : (string, string * (Geneweb.Config.config -> Gwdb.base option -> bool)) Stdlib.Hashtbl.t
      val register : ns:string -> (string * (string -> Geneweb.Config.config -> Gwdb.base option -> bool)) list -> unit
      val se : (string * (Geneweb.Config.config -> Gwdb.base option -> unit)) list Stdlib.ref
      val register_se : ns:string -> (string -> Geneweb.Config.config -> Gwdb.base option -> unit) -> unit
      \ No newline at end of file diff --git a/static/doc/geneweb/Gwd_lib/Request/index.html b/static/doc/geneweb/Gwd_lib/Request/index.html deleted file mode 100644 index d95dd5e983..0000000000 --- a/static/doc/geneweb/Gwd_lib/Request/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Request (geneweb.Gwd_lib.Request)

      Module Gwd_lib.Request

      val w_base : none:(Geneweb.Config.config -> 'a) -> (Geneweb.Config.config -> Gwdb.base -> 'a) -> Geneweb.Config.config -> Gwdb.base option -> 'a

      w_lock ~none callback conf base Acquire a write lock on the base and call callback, or fail with none.

      val w_lock : onerror:(Geneweb.Config.config -> Gwdb.base -> 'a) -> (Geneweb.Config.config -> Gwdb.base -> 'a) -> Geneweb.Config.config -> Gwdb.base -> 'a

      w_lock ~onerror callback conf base Acquire a write lock on the base and call the callback, or fail with onerror.

      val w_wizard : (Geneweb.Config.config -> Gwdb.base -> unit) -> Geneweb.Config.config -> Gwdb.base -> unit

      w_wizard callback conf base Run callback conf base if conf has wizard rights or return Forbidden or Unauthorized.

      w_person ~none callback conf base Find a person in environement and call callback, or fail with none.

      \ No newline at end of file diff --git a/static/doc/geneweb/Gwd_lib/index.html b/static/doc/geneweb/Gwd_lib/index.html deleted file mode 100644 index 0eb16379d8..0000000000 --- a/static/doc/geneweb/Gwd_lib/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Gwd_lib (geneweb.Gwd_lib)

      Module Gwd_lib

      module GwdLog : sig ... end
      module GwdPlugin : sig ... end
      module Request : sig ... end
      \ No newline at end of file diff --git a/static/doc/geneweb/Gwd_lib__GwdLog/.dune-keep b/static/doc/geneweb/Gwd_lib__GwdLog/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Gwd_lib__GwdLog/index.html b/static/doc/geneweb/Gwd_lib__GwdLog/index.html deleted file mode 100644 index 6b89b71998..0000000000 --- a/static/doc/geneweb/Gwd_lib__GwdLog/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Gwd_lib__GwdLog (geneweb.Gwd_lib__GwdLog)

      Module Gwd_lib__GwdLog

      \ No newline at end of file diff --git a/static/doc/geneweb/Gwd_lib__GwdPlugin/.dune-keep b/static/doc/geneweb/Gwd_lib__GwdPlugin/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Gwd_lib__GwdPlugin/index.html b/static/doc/geneweb/Gwd_lib__GwdPlugin/index.html deleted file mode 100644 index a3078b6ed2..0000000000 --- a/static/doc/geneweb/Gwd_lib__GwdPlugin/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Gwd_lib__GwdPlugin (geneweb.Gwd_lib__GwdPlugin)

      Module Gwd_lib__GwdPlugin

      \ No newline at end of file diff --git a/static/doc/geneweb/Gwd_lib__Request/.dune-keep b/static/doc/geneweb/Gwd_lib__Request/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Gwd_lib__Request/index.html b/static/doc/geneweb/Gwd_lib__Request/index.html deleted file mode 100644 index 27bba479df..0000000000 --- a/static/doc/geneweb/Gwd_lib__Request/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Gwd_lib__Request (geneweb.Gwd_lib__Request)

      Module Gwd_lib__Request

      \ No newline at end of file diff --git a/static/doc/geneweb/Gwdb/.dune-keep b/static/doc/geneweb/Gwdb/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Gwdb/index.html b/static/doc/geneweb/Gwdb/index.html deleted file mode 100644 index d38920fc33..0000000000 --- a/static/doc/geneweb/Gwdb/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Gwdb (geneweb.Gwdb)

      Module Gwdb

      include module type of struct include Gwdb_driver end
      type istr = Gwdb_driver.istr

      String id

      type ifam = Gwdb_driver.ifam

      Family id

      type iper = Gwdb_driver.iper

      Person id

      val string_of_iper : iper -> string

      Convert iper to string

      val string_of_ifam : ifam -> string

      Convert ifam to string

      val string_of_istr : istr -> string

      Convert istr to string

      val iper_of_string : string -> iper

      Convert iper from string

      val ifam_of_string : string -> ifam

      Convert ifam from string

      val istr_of_string : string -> istr

      Convert istr from string

      type person = Gwdb_driver.person

      Person data structure

      type family = Gwdb_driver.family

      Family data structure

      type relation = (iperistr) Def.gen_relation

      Database implementation for Def.gen_relation

      type title = istr Def.gen_title

      Database implementation for Def.gen_title

      type pers_event = (iperistr) Def.gen_pers_event

      Database implementation for Def.pers_event

      type fam_event = (iperistr) Def.gen_fam_event

      Database implementation for Def.fam_event

      type string_person_index = Gwdb_driver.string_person_index

      Data structure for optimised search throughout index by name (surname or first name).

      type base = Gwdb_driver.base

      Database represntation in the memory that regroups data and basic requests over this data.

      val open_base : string -> base

      Open database situated in the specified directory.

      val close_base : base -> unit

      Close database memory representation.

      val dummy_iper : iper

      Dummy person id

      val dummy_ifam : ifam

      Dummy family id

      val eq_istr : istr -> istr -> bool

      Says if strings with the giving ids are equal

      val is_empty_string : istr -> bool

      Says if string with the giving id is empty ("")

      val is_quest_string : istr -> bool

      Says if string with the giving id is a question mark ("?")

      val empty_string : istr

      Id of the empty string ("")

      val quest_string : istr

      Id of the question mark ("?")

      val empty_person : base -> iper -> person

      Returns unitialised person with the giving id.

      val empty_family : base -> ifam -> family

      Returns unitialised family with the giving id.

      val iper_exists : base -> iper -> bool

      Tells if person with giving id exists in the base.

      val ifam_exists : base -> ifam -> bool

      Tells if family with giving id exists in the base.

      Getters

      Getters are used to extract information about person and family. If corresponding information part isn't present, driver load it from the disk and cache it so further gets will return result immediately.

      val get_access : person -> Def.access

      Get rights that defines access to person's data

      val get_aliases : person -> istr list

      Get person's aliases ids

      val get_baptism : person -> Def.cdate

      Get person's baptism date

      val get_baptism_note : person -> istr

      Get person's baptism note id

      val get_baptism_place : person -> istr

      Get person's baptism place id

      val get_baptism_src : person -> istr

      Get person's baptism source id

      val get_birth : person -> Def.cdate

      Get person's birth date

      val get_birth_note : person -> istr

      Get person's birth note id

      val get_birth_place : person -> istr

      Get person's birth place id

      val get_birth_src : person -> istr

      Get person's birth source id

      val get_burial : person -> Def.burial

      Get information about person's burial

      val get_burial_note : person -> istr

      Get person's burial note id

      val get_burial_place : person -> istr

      Get person's burial place id

      val get_burial_src : person -> istr

      Get person's burial source id

      val get_children : family -> iper array

      Get array of family's children ids

      val get_comment : family -> istr

      Get family's comment id

      val get_consang : person -> Adef.fix

      Get person's consanguinity degree with his ascendants

      val get_death : person -> Def.death

      Get person's death status

      val get_death_note : person -> istr

      Get person's death note id

      val get_death_place : person -> istr

      Get person's death place id

      val get_death_src : person -> istr

      Get person's death source id

      val get_divorce : family -> Def.divorce

      Get family's divorce status

      val get_family : person -> ifam array

      Get array of family's ids to which a person belongs as parent (person's union)

      val get_father : family -> iper

      Get family's father id (from the family's couple)

      val get_fevents : family -> fam_event list

      Get family's event list

      val get_first_name : person -> istr

      Get person's first name id

      val get_first_names_aliases : person -> istr list

      Get list of person's first name aliases ids

      val get_fsources : family -> istr

      Get family's sources id

      val get_ifam : family -> ifam

      Get family's id

      val get_image : person -> istr

      Get id of path to person's image

      val get_iper : person -> iper

      Get person's id

      val get_marriage : family -> Def.cdate

      Get family's marriage date

      val get_marriage_note : family -> istr

      Get family's marriage note id

      val get_marriage_place : family -> istr

      Get family's marriage place id

      val get_marriage_src : family -> istr

      Get family's marriage source id

      val get_mother : family -> iper

      Get family's mother id (from the family's couple)

      val get_notes : person -> istr

      Get person's notes id

      val get_occ : person -> int

      Get person's occurence number

      val get_occupation : person -> istr

      Get person's occupation id

      val get_origin_file : family -> istr

      Get family's origin file (.gw filename where family is defined) id

      val get_parent_array : family -> iper array

      Get family's parents ids (father and mother from family's couple)

      val get_parents : person -> ifam option

      Get person's family id to which his parents belong (as family's couple)

      val get_pevents : person -> pers_event list

      Get person's event list

      val get_psources : person -> istr

      Get person's sources id

      val get_public_name : person -> istr

      Get person's public name id

      val get_qualifiers : person -> istr list

      Get list of person's qualifiers ids

      Get person's related persons ids

      val get_relation : family -> Def.relation_kind

      Get relation kind between couple in the family

      val get_rparents : person -> relation list

      Get person's relations with not native parents

      val get_sex : person -> Def.sex

      Get person's sex

      val get_surname : person -> istr

      Get person's surname id

      val get_surnames_aliases : person -> istr list

      Get person's surname aliases ids

      val get_titles : person -> title list

      Get list of person's nobility titles

      val get_witnesses : family -> iper array

      Get array of family's witnesses ids

      val gen_couple_of_family : family -> iper Def.gen_couple

      Extract gen_couple from family.

      val gen_descend_of_family : family -> iper Def.gen_descend

      Extract gen_descend from family.

      val gen_family_of_family : family -> (iperifamistr) Def.gen_family

      Extract gen_family from family.

      val gen_person_of_person : person -> (iperiperistr) Def.gen_person

      Extract gen_person from person.

      val gen_ascend_of_person : person -> ifam Def.gen_ascend

      Extract gen_ascend from person.

      val gen_union_of_person : person -> ifam Def.gen_union

      Extract gen_union from person.

      val family_of_gen_family : base -> ((iperifamistr) Def.gen_family * iper Def.gen_couple * iper Def.gen_descend) -> family

      Create family from associated values.

      val person_of_gen_person : base -> ((iperiperistr) Def.gen_person * ifam Def.gen_ascend * ifam Def.gen_union) -> person

      Create person from associated values.

      val poi : base -> iper -> person

      Create uninitialised person with giving id

      val foi : base -> ifam -> family

      Create uninitialised family with giving id

      val sou : base -> istr -> string

      Returns string that has giving id from the base

      val no_person : iper -> (iperiperistr) Def.gen_person

      Returns unitialised gen_person with giving id

      val no_ascend : ifam Def.gen_ascend

      Returns unitialised gen_ascend

      val no_union : ifam Def.gen_union

      Returns unitialised gen_union

      val no_family : ifam -> (iperifamistr) Def.gen_family

      Returns unitialised gen_family with giving id

      val no_descend : iper Def.gen_descend

      Returns unitialised gen_descend

      val no_couple : iper Def.gen_couple

      Returns unitialised gen_couple

      val nb_of_persons : base -> int

      Returns number of persons inside the database

      val nb_of_real_persons : base -> int

      Returns number of defined persons (without bogus definition "? ?") inside the database

      val nb_of_families : base -> int

      Returns number of families inside the database

      val bname : base -> string

      Returns database name

      val patch_person : base -> iper -> (iperiperistr) Def.gen_person -> unit

      Modify/add person with the giving id in the base. New names are added to the patched name index for the cosidered person and for evey member of family to which he belongs. Modification stay blocked until call of commit_patches.

      val patch_ascend : base -> iper -> ifam Def.gen_ascend -> unit

      Modify/add ascendants of a person with a giving id. Modification stay blocked until call of commit_patches.

      val patch_union : base -> iper -> ifam Def.gen_union -> unit

      Modify/add union of a person with a giving id. Modification stay blocked until call of commit_patches.

      val patch_family : base -> ifam -> (iperifamistr) Def.gen_family -> unit

      Modify/add family with a giving id. Modification stay blocked until call of commit_patches.

      val patch_descend : base -> ifam -> iper Def.gen_descend -> unit

      Modify/add descendants of a family with a giving id. Modification stay blocked until call of commit_patches.

      val patch_couple : base -> ifam -> iper Def.gen_couple -> unit

      Modify/add couple of a family with a giving id. Modification stay blocked until call of commit_patches.

      val insert_string : base -> string -> istr

      Modify/add string with a giving id. If string already exists return its id. Modification stay blocked until call of commit_patches.

      val commit_patches : base -> unit

      Commit blocked modifications (patches) and update database files in order to apply modifications on the disk.

      val commit_notes : base -> string -> string -> unit

      commit_notes fname s Update content of the notes/extended page file fname if exists.

      val new_iper : base -> iper

      Retruns new unused person's id

      val new_ifam : base -> ifam

      Retruns new unused family's id

      val insert_ascend : base -> iper -> ifam Def.gen_ascend -> unit

      Same as patch_ascend

      val insert_union : base -> iper -> ifam Def.gen_union -> unit

      Same as patch_union

      val insert_descend : base -> ifam -> iper Def.gen_descend -> unit

      Same as patch_couple

      val insert_couple : base -> ifam -> iper Def.gen_couple -> unit

      Same as patch_descend

      val delete_ascend : base -> iper -> unit

      Clear person's ascendants data structure

      val delete_union : base -> iper -> unit

      Clear person's union data structure

      val delete_descend : base -> ifam -> unit

      Clear family's descendants data structure

      val delete_couple : base -> ifam -> unit

      Clear family's couple data structure

      val person_of_key : base -> string -> string -> int -> iper option

      person_of_key first_name surname occ returns person from his key information (first name, surname and occurence number)

      val persons_of_name : base -> string -> iper list

      Return list of person ids that have giving name (could be one of the mix).

      val persons_of_first_name : base -> string_person_index

      Returns data structure that allows to make optimised search throughout index by first name

      val persons_of_surname : base -> string_person_index

      Returns data structure that allows to make optimised search throughout index by surname

      val spi_first : string_person_index -> string -> istr

      Returns first first/surname id starting with that string

      val spi_next : string_person_index -> istr -> istr

      Retruns next first/surname id that follows giving name's id by Gutil.alphabetical order

      val spi_find : string_person_index -> istr -> iper list

      Retruns all persons id having that first/surname.

      val base_visible_get : base -> (person -> bool) -> iper -> bool

      base_visible_get base fct ip get visibility of person ip (true for not visible (restrited)) from the base. If file restrict is present then read it to get visibility information. If person's visibility isn't known, then set it with fct. Used when mode `use_restrict` is ativated

      val base_visible_write : base -> unit

      Write updated visibility information to the restricted file.

      val base_particles : base -> Re.re

      Return regular expression that matches all defined in the base particles.

      val base_strings_of_first_name : base -> string -> istr list

      base_strings_of_first_name base x Return the list of first names (as istr) being equal or to x using Name.crush_lower comparison. x could be also a substring of the matched first name.

      val base_strings_of_surname : base -> string -> istr list

      base_strings_of_surname base x Return the list of surnames (as istr) being equal to x using Name.crush_lower comparison. x could be also a substring of the matched surname.

      val load_ascends_array : base -> unit

      Load array of ascendants in the memory and cache it so it could be accessed instantly by other functions unless clear_ascends_array is called.

      val load_unions_array : base -> unit

      Load array of unions in the memory and cache it so it could be accessed instantly by other functions unless clear_unions_array is called.

      val load_couples_array : base -> unit

      Load array of couples in the memory and cache it so it could be accessed instantly by other functions unless clear_couples_array is called.

      val load_descends_array : base -> unit

      Load array of descendants in the memory and cache it so it could be accessed instantly by other functions unless clear_descends_array is called.

      val load_strings_array : base -> unit

      Load array of strings in the memory and cache it so it could be accessed instantly by other functions unless clear_strings_array is called.

      val load_persons_array : base -> unit

      Load array of persons in the memory and cache it so it could be accessed instantly by other functions unless clear_persons_array is called.

      val load_families_array : base -> unit

      Load array of families in the memory and cache it so it could be accessed instantly by other functions unless clear_families_array is called.

      val clear_ascends_array : base -> unit

      Remove array of ascendants from the memory

      val clear_unions_array : base -> unit

      Remove array of unions from the memory

      val clear_couples_array : base -> unit

      Remove array of couples from the memory

      val clear_descends_array : base -> unit

      Remove array of descendants from the memory

      val clear_strings_array : base -> unit

      Remove array of strings from the memory

      val clear_persons_array : base -> unit

      Remove array of persons from the memory

      val clear_families_array : base -> unit

      Remove array of families from the memory

      val base_notes_read : base -> string -> string

      base_notes_read base fname read and return content of fname note (either database note either extended page).

      val base_notes_read_first_line : base -> string -> string

      base_notes_read base fname read and return first line of fname note

      val base_notes_are_empty : base -> string -> bool

      Says if note has empty content

      val base_notes_origin_file : base -> string

      Retruns origin file (.gw file) of the note

      val base_notes_dir : base -> string

      Directory where extended pages are stored

      val base_wiznotes_dir : base -> string

      Directory where wizard notes are stored

      val date_of_last_change : base -> float

      Returns last modification time of the database on disk

      module Collection = Gwdb_driver.Collection

      Collections of elemetns

      module Marker = Gwdb_driver.Marker

      Markers for elements inside Collection.t

      Useful collections

      val ipers : base -> iper Collection.t

      Collection of person's ids

      val persons : base -> person Collection.t

      Collection of persons

      val ifams : ?select:(ifam -> bool) -> base -> ifam Collection.t

      Collection of family's ids

      val families : ?select:(family -> bool) -> base -> family Collection.t

      Collection of families

      val dummy_collection : 'a -> 'a Collection.t

      dummy_collection x create a dummy collection with no element. x is only used for typing. Useful for placeholders or for typing purpose.

      Useful markers

      val iper_marker : iper Collection.t -> 'a -> (iper'a) Marker.t

      iper_marker c v create marker over collection of person's ids and initialise it for every element with v

      val ifam_marker : ifam Collection.t -> 'a -> (ifam'a) Marker.t

      ifam_marker c v create marker over collection of family's ids and initialise it for every element with v

      val dummy_marker : 'a -> 'b -> ('a'b) Marker.t

      dummy_marker k v create a dummy collection with no element. k and v are only used for typing. Useful for placeholders or for typing purpose.

      Database creation

      val make : string -> string list -> (((int, int, int) Def.gen_person array * int Def.gen_ascend array * int Def.gen_union array) * ((int, int, int) Def.gen_family array * int Def.gen_couple array * int Def.gen_descend array) * string array * Def.base_notes) -> base

      make bname particles arrays create a base with bname name and arrays as content.

      val read_nldb : base -> (iperifam) Def.NLDB.t

      TODOOCP : doc

      val write_nldb : base -> (iperifam) Def.NLDB.t -> unit
      val sync : ?scratch:bool -> base -> unit

      sync scratch base Ensure that everything is synced on disk.

      Depending on the backend, it may perform various operation such as indexes rebuilding, and it might be a lengthy operation.

      Use scratch (default false) to sync and rebuild the whole database. Otherwise, only changes that occured since the last sync call are treated.

      insert_person base p a u Add a new person with its union and ascendants in the base. Allocate and returns the fresh new id for this person. p SHOULD be defined using dummy_iper.

      insert_family base f c d Add a new family with its couple and descendants the in the base. Allocate and returns the fresh new id for this family. f SHOULD be defined using dummy_ifam.

      DELETE

      val is_empty_p : ?ifam:ifam -> base -> iper -> bool
      val rm_union : base -> ifam -> iper -> unit
      val delete_person : base -> iper -> unit

      delete_person base iper and delete_family base ifam recursively delete data trying to do clever things:

      • if data to be deleted is linked and useful, it is replaced by empty data (and is actually deleted otherwise)
      • if empty data is linked to deleted data, the former is deleted as well
      val delete_family : base -> ifam -> unit
      \ No newline at end of file diff --git a/static/doc/geneweb/Gwdb_driver/.dune-keep b/static/doc/geneweb/Gwdb_driver/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Gwdb_driver/Collection/index.html b/static/doc/geneweb/Gwdb_driver/Collection/index.html deleted file mode 100644 index eb6a9aaae0..0000000000 --- a/static/doc/geneweb/Gwdb_driver/Collection/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Collection (geneweb.Gwdb_driver.Collection)

      Module Gwdb_driver.Collection

      Collections of elemetns

      type 'a t

      Collections are sets of elements you want to traverse.

      val length : 'a t -> int

      Return the number of elements of a colletion

      val map : ('a -> 'b) -> 'a t -> 'b t

      map fn c Return a collection corresponding to c where fn would have been applied to each of its elements.

      val iter : ('a -> unit) -> 'a t -> unit

      iter fn c Apply fn would have been applied to each elements of c.

      val iteri : (int -> 'a -> unit) -> 'a t -> unit

      iter fn c Apply fn i would have been applied to each elements of c where i is the index (starting with 0) of the element.

      val fold : ?from:int -> ?until:int -> ('a -> 'b -> 'a) -> 'a -> 'b t -> 'a

      fold fn acc c Combine each element of c into a single value using fn. fn first argument is the result computed so far as we traverse the collection, and second element is the current element being combined. acc is the starting combined value. Start at from-nth and finish with until-nth element (included).

      val fold_until : ('a -> bool) -> ('a -> 'b -> 'a) -> 'a -> 'b t -> 'a

      fold_until continue fn acc c Same as fold fn acc c, but computation stops as soon as continue is not satisfied by combined value anymore.

      val iterator : 'a t -> unit -> 'a option

      iterator c Return a function returning Some next_element when it is called, or None if you reached the end of the collection.

      \ No newline at end of file diff --git a/static/doc/geneweb/Gwdb_driver/Marker/index.html b/static/doc/geneweb/Gwdb_driver/Marker/index.html deleted file mode 100644 index 8acf507fbf..0000000000 --- a/static/doc/geneweb/Gwdb_driver/Marker/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Marker (geneweb.Gwdb_driver.Marker)

      Module Gwdb_driver.Marker

      Markers for elements inside Collection.t

      type ('k, 'v) t

      Markers are way to annotate (add extra information to) elements of a Collection.t.

      val get : ('k'v) t -> 'k -> 'v

      get marker key Return the annotation associated to key.

      val set : ('k'v) t -> 'k -> 'v -> unit

      set marker key value Set value as annotation associated to key.

      \ No newline at end of file diff --git a/static/doc/geneweb/Gwdb_driver/index.html b/static/doc/geneweb/Gwdb_driver/index.html deleted file mode 100644 index 35018d8e71..0000000000 --- a/static/doc/geneweb/Gwdb_driver/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Gwdb_driver (geneweb.Gwdb_driver)

      Module Gwdb_driver

      type istr

      String id

      type ifam

      Family id

      type iper

      Person id

      val string_of_iper : iper -> string

      Convert iper to string

      val string_of_ifam : ifam -> string

      Convert ifam to string

      val string_of_istr : istr -> string

      Convert istr to string

      val iper_of_string : string -> iper

      Convert iper from string

      val ifam_of_string : string -> ifam

      Convert ifam from string

      val istr_of_string : string -> istr

      Convert istr from string

      type person

      Person data structure

      type family

      Family data structure

      type relation = (iperistr) Def.gen_relation

      Database implementation for Def.gen_relation

      type title = istr Def.gen_title

      Database implementation for Def.gen_title

      type pers_event = (iperistr) Def.gen_pers_event

      Database implementation for Def.pers_event

      type fam_event = (iperistr) Def.gen_fam_event

      Database implementation for Def.fam_event

      type string_person_index

      Data structure for optimised search throughout index by name (surname or first name).

      type base

      Database represntation in the memory that regroups data and basic requests over this data.

      val open_base : string -> base

      Open database situated in the specified directory.

      val close_base : base -> unit

      Close database memory representation.

      val dummy_iper : iper

      Dummy person id

      val dummy_ifam : ifam

      Dummy family id

      val eq_istr : istr -> istr -> bool

      Says if strings with the giving ids are equal

      val is_empty_string : istr -> bool

      Says if string with the giving id is empty ("")

      val is_quest_string : istr -> bool

      Says if string with the giving id is a question mark ("?")

      val empty_string : istr

      Id of the empty string ("")

      val quest_string : istr

      Id of the question mark ("?")

      val empty_person : base -> iper -> person

      Returns unitialised person with the giving id.

      val empty_family : base -> ifam -> family

      Returns unitialised family with the giving id.

      val iper_exists : base -> iper -> bool

      Tells if person with giving id exists in the base.

      val ifam_exists : base -> ifam -> bool

      Tells if family with giving id exists in the base.

      Getters

      Getters are used to extract information about person and family. If corresponding information part isn't present, driver load it from the disk and cache it so further gets will return result immediately.

      val get_access : person -> Def.access

      Get rights that defines access to person's data

      val get_aliases : person -> istr list

      Get person's aliases ids

      val get_baptism : person -> Def.cdate

      Get person's baptism date

      val get_baptism_note : person -> istr

      Get person's baptism note id

      val get_baptism_place : person -> istr

      Get person's baptism place id

      val get_baptism_src : person -> istr

      Get person's baptism source id

      val get_birth : person -> Def.cdate

      Get person's birth date

      val get_birth_note : person -> istr

      Get person's birth note id

      val get_birth_place : person -> istr

      Get person's birth place id

      val get_birth_src : person -> istr

      Get person's birth source id

      val get_burial : person -> Def.burial

      Get information about person's burial

      val get_burial_note : person -> istr

      Get person's burial note id

      val get_burial_place : person -> istr

      Get person's burial place id

      val get_burial_src : person -> istr

      Get person's burial source id

      val get_children : family -> iper array

      Get array of family's children ids

      val get_comment : family -> istr

      Get family's comment id

      val get_consang : person -> Adef.fix

      Get person's consanguinity degree with his ascendants

      val get_death : person -> Def.death

      Get person's death status

      val get_death_note : person -> istr

      Get person's death note id

      val get_death_place : person -> istr

      Get person's death place id

      val get_death_src : person -> istr

      Get person's death source id

      val get_divorce : family -> Def.divorce

      Get family's divorce status

      val get_family : person -> ifam array

      Get array of family's ids to which a person belongs as parent (person's union)

      val get_father : family -> iper

      Get family's father id (from the family's couple)

      val get_fevents : family -> fam_event list

      Get family's event list

      val get_first_name : person -> istr

      Get person's first name id

      val get_first_names_aliases : person -> istr list

      Get list of person's first name aliases ids

      val get_fsources : family -> istr

      Get family's sources id

      val get_ifam : family -> ifam

      Get family's id

      val get_image : person -> istr

      Get id of path to person's image

      val get_iper : person -> iper

      Get person's id

      val get_marriage : family -> Def.cdate

      Get family's marriage date

      val get_marriage_note : family -> istr

      Get family's marriage note id

      val get_marriage_place : family -> istr

      Get family's marriage place id

      val get_marriage_src : family -> istr

      Get family's marriage source id

      val get_mother : family -> iper

      Get family's mother id (from the family's couple)

      val get_notes : person -> istr

      Get person's notes id

      val get_occ : person -> int

      Get person's occurence number

      val get_occupation : person -> istr

      Get person's occupation id

      val get_origin_file : family -> istr

      Get family's origin file (.gw filename where family is defined) id

      val get_parent_array : family -> iper array

      Get family's parents ids (father and mother from family's couple)

      val get_parents : person -> ifam option

      Get person's family id to which his parents belong (as family's couple)

      val get_pevents : person -> pers_event list

      Get person's event list

      val get_psources : person -> istr

      Get person's sources id

      val get_public_name : person -> istr

      Get person's public name id

      val get_qualifiers : person -> istr list

      Get list of person's qualifiers ids

      Get person's related persons ids

      val get_relation : family -> Def.relation_kind

      Get relation kind between couple in the family

      val get_rparents : person -> relation list

      Get person's relations with not native parents

      val get_sex : person -> Def.sex

      Get person's sex

      val get_surname : person -> istr

      Get person's surname id

      val get_surnames_aliases : person -> istr list

      Get person's surname aliases ids

      val get_titles : person -> title list

      Get list of person's nobility titles

      val get_witnesses : family -> iper array

      Get array of family's witnesses ids

      val gen_couple_of_family : family -> iper Def.gen_couple

      Extract gen_couple from family.

      val gen_descend_of_family : family -> iper Def.gen_descend

      Extract gen_descend from family.

      val gen_family_of_family : family -> (iperifamistr) Def.gen_family

      Extract gen_family from family.

      val gen_person_of_person : person -> (iperiperistr) Def.gen_person

      Extract gen_person from person.

      val gen_ascend_of_person : person -> ifam Def.gen_ascend

      Extract gen_ascend from person.

      val gen_union_of_person : person -> ifam Def.gen_union

      Extract gen_union from person.

      val family_of_gen_family : base -> ((iperifamistr) Def.gen_family * iper Def.gen_couple * iper Def.gen_descend) -> family

      Create family from associated values.

      val person_of_gen_person : base -> ((iperiperistr) Def.gen_person * ifam Def.gen_ascend * ifam Def.gen_union) -> person

      Create person from associated values.

      val poi : base -> iper -> person

      Create uninitialised person with giving id

      val foi : base -> ifam -> family

      Create uninitialised family with giving id

      val sou : base -> istr -> string

      Returns string that has giving id from the base

      val no_person : iper -> (iperiperistr) Def.gen_person

      Returns unitialised gen_person with giving id

      val no_ascend : ifam Def.gen_ascend

      Returns unitialised gen_ascend

      val no_union : ifam Def.gen_union

      Returns unitialised gen_union

      val no_family : ifam -> (iperifamistr) Def.gen_family

      Returns unitialised gen_family with giving id

      val no_descend : iper Def.gen_descend

      Returns unitialised gen_descend

      val no_couple : iper Def.gen_couple

      Returns unitialised gen_couple

      val nb_of_persons : base -> int

      Returns number of persons inside the database

      val nb_of_real_persons : base -> int

      Returns number of defined persons (without bogus definition "? ?") inside the database

      val nb_of_families : base -> int

      Returns number of families inside the database

      val bname : base -> string

      Returns database name

      val patch_person : base -> iper -> (iperiperistr) Def.gen_person -> unit

      Modify/add person with the giving id in the base. New names are added to the patched name index for the cosidered person and for evey member of family to which he belongs. Modification stay blocked until call of commit_patches.

      val patch_ascend : base -> iper -> ifam Def.gen_ascend -> unit

      Modify/add ascendants of a person with a giving id. Modification stay blocked until call of commit_patches.

      val patch_union : base -> iper -> ifam Def.gen_union -> unit

      Modify/add union of a person with a giving id. Modification stay blocked until call of commit_patches.

      val patch_family : base -> ifam -> (iperifamistr) Def.gen_family -> unit

      Modify/add family with a giving id. Modification stay blocked until call of commit_patches.

      val patch_descend : base -> ifam -> iper Def.gen_descend -> unit

      Modify/add descendants of a family with a giving id. Modification stay blocked until call of commit_patches.

      val patch_couple : base -> ifam -> iper Def.gen_couple -> unit

      Modify/add couple of a family with a giving id. Modification stay blocked until call of commit_patches.

      val insert_string : base -> string -> istr

      Modify/add string with a giving id. If string already exists return its id. Modification stay blocked until call of commit_patches.

      val commit_patches : base -> unit

      Commit blocked modifications (patches) and update database files in order to apply modifications on the disk.

      val commit_notes : base -> string -> string -> unit

      commit_notes fname s Update content of the notes/extended page file fname if exists.

      val new_iper : base -> iper

      Retruns new unused person's id

      val new_ifam : base -> ifam

      Retruns new unused family's id

      val insert_person : base -> iper -> (iperiperistr) Def.gen_person -> unit

      Same as patch_person

      val insert_ascend : base -> iper -> ifam Def.gen_ascend -> unit

      Same as patch_ascend

      val insert_union : base -> iper -> ifam Def.gen_union -> unit

      Same as patch_union

      val insert_family : base -> ifam -> (iperifamistr) Def.gen_family -> unit

      Same as patch_family

      val insert_descend : base -> ifam -> iper Def.gen_descend -> unit

      Same as patch_couple

      val insert_couple : base -> ifam -> iper Def.gen_couple -> unit

      Same as patch_descend

      val delete_person : base -> iper -> unit

      Remplace person with the giving id by bogus definition and clear person's data structure.

      val delete_ascend : base -> iper -> unit

      Clear person's ascendants data structure

      val delete_union : base -> iper -> unit

      Clear person's union data structure

      val delete_family : base -> ifam -> unit

      Remplace family with the giving id by dummy family and clear family's data structure.

      val delete_descend : base -> ifam -> unit

      Clear family's descendants data structure

      val delete_couple : base -> ifam -> unit

      Clear family's couple data structure

      val person_of_key : base -> string -> string -> int -> iper option

      person_of_key first_name surname occ returns person from his key information (first name, surname and occurence number)

      val persons_of_name : base -> string -> iper list

      Return list of person ids that have giving name (could be one of the mix).

      val persons_of_first_name : base -> string_person_index

      Returns data structure that allows to make optimised search throughout index by first name

      val persons_of_surname : base -> string_person_index

      Returns data structure that allows to make optimised search throughout index by surname

      val spi_first : string_person_index -> string -> istr

      Returns first first/surname id starting with that string

      val spi_next : string_person_index -> istr -> istr

      Retruns next first/surname id that follows giving name's id by Gutil.alphabetical order

      val spi_find : string_person_index -> istr -> iper list

      Retruns all persons id having that first/surname.

      val base_visible_get : base -> (person -> bool) -> iper -> bool

      base_visible_get base fct ip get visibility of person ip (true for not visible (restrited)) from the base. If file restrict is present then read it to get visibility information. If person's visibility isn't known, then set it with fct. Used when mode `use_restrict` is ativated

      val base_visible_write : base -> unit

      Write updated visibility information to the restricted file.

      val base_particles : base -> Re.re

      Return regular expression that matches all defined in the base particles.

      val base_strings_of_first_name : base -> string -> istr list

      base_strings_of_first_name base x Return the list of first names (as istr) being equal or to x using Name.crush_lower comparison. x could be also a substring of the matched first name.

      val base_strings_of_surname : base -> string -> istr list

      base_strings_of_surname base x Return the list of surnames (as istr) being equal to x using Name.crush_lower comparison. x could be also a substring of the matched surname.

      val load_ascends_array : base -> unit

      Load array of ascendants in the memory and cache it so it could be accessed instantly by other functions unless clear_ascends_array is called.

      val load_unions_array : base -> unit

      Load array of unions in the memory and cache it so it could be accessed instantly by other functions unless clear_unions_array is called.

      val load_couples_array : base -> unit

      Load array of couples in the memory and cache it so it could be accessed instantly by other functions unless clear_couples_array is called.

      val load_descends_array : base -> unit

      Load array of descendants in the memory and cache it so it could be accessed instantly by other functions unless clear_descends_array is called.

      val load_strings_array : base -> unit

      Load array of strings in the memory and cache it so it could be accessed instantly by other functions unless clear_strings_array is called.

      val load_persons_array : base -> unit

      Load array of persons in the memory and cache it so it could be accessed instantly by other functions unless clear_persons_array is called.

      val load_families_array : base -> unit

      Load array of families in the memory and cache it so it could be accessed instantly by other functions unless clear_families_array is called.

      val clear_ascends_array : base -> unit

      Remove array of ascendants from the memory

      val clear_unions_array : base -> unit

      Remove array of unions from the memory

      val clear_couples_array : base -> unit

      Remove array of couples from the memory

      val clear_descends_array : base -> unit

      Remove array of descendants from the memory

      val clear_strings_array : base -> unit

      Remove array of strings from the memory

      val clear_persons_array : base -> unit

      Remove array of persons from the memory

      val clear_families_array : base -> unit

      Remove array of families from the memory

      val base_notes_read : base -> string -> string

      base_notes_read base fname read and return content of fname note (either database note either extended page).

      val base_notes_read_first_line : base -> string -> string

      base_notes_read base fname read and return first line of fname note

      val base_notes_are_empty : base -> string -> bool

      Says if note has empty content

      val base_notes_origin_file : base -> string

      Retruns origin file (.gw file) of the note

      val base_notes_dir : base -> string

      Directory where extended pages are stored

      val base_wiznotes_dir : base -> string

      Directory where wizard notes are stored

      val date_of_last_change : base -> float

      Returns last modification time of the database on disk

      module Collection : sig ... end

      Collections of elemetns

      module Marker : sig ... end

      Markers for elements inside Collection.t

      Useful collections

      val ipers : base -> iper Collection.t

      Collection of person's ids

      val persons : base -> person Collection.t

      Collection of persons

      val ifams : ?select:(ifam -> bool) -> base -> ifam Collection.t

      Collection of family's ids

      val families : ?select:(family -> bool) -> base -> family Collection.t

      Collection of families

      val dummy_collection : 'a -> 'a Collection.t

      dummy_collection x create a dummy collection with no element. x is only used for typing. Useful for placeholders or for typing purpose.

      Useful markers

      val iper_marker : iper Collection.t -> 'a -> (iper'a) Marker.t

      iper_marker c v create marker over collection of person's ids and initialise it for every element with v

      val ifam_marker : ifam Collection.t -> 'a -> (ifam'a) Marker.t

      ifam_marker c v create marker over collection of family's ids and initialise it for every element with v

      val dummy_marker : 'a -> 'b -> ('a'b) Marker.t

      dummy_marker k v create a dummy collection with no element. k and v are only used for typing. Useful for placeholders or for typing purpose.

      Database creation

      val make : string -> string list -> (((int, int, int) Def.gen_person array * int Def.gen_ascend array * int Def.gen_union array) * ((int, int, int) Def.gen_family array * int Def.gen_couple array * int Def.gen_descend array) * string array * Def.base_notes) -> base

      make bname particles arrays create a base with bname name and arrays as content.

      val read_nldb : base -> (iperifam) Def.NLDB.t

      TODOOCP : doc

      val write_nldb : base -> (iperifam) Def.NLDB.t -> unit
      val sync : ?scratch:bool -> base -> unit

      sync scratch base Ensure that everything is synced on disk.

      Depending on the backend, it may perform various operation such as indexes rebuilding, and it might be a lengthy operation.

      Use scratch (default false) to sync and rebuild the whole database. Otherwise, only changes that occured since the last sync call are treated.

      \ No newline at end of file diff --git a/static/doc/geneweb/Gwexport/.dune-keep b/static/doc/geneweb/Gwexport/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Gwexport/index.html b/static/doc/geneweb/Gwexport/index.html deleted file mode 100644 index c8ae78122a..0000000000 --- a/static/doc/geneweb/Gwexport/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Gwexport (geneweb.Gwexport)

      Module Gwexport

      type gwexport_charset =
      | Ansel
      | Ansi
      | Ascii
      | Utf8
      type gwexport_opts = {
      asc : int option;
      ascdesc : int option;
      base : (string * Gwdb.base) option;
      censor : int;
      charset : gwexport_charset;
      desc : int option;
      img_base_path : string;
      keys : string list;
      mem : bool;
      no_notes : [ `nn | `nnn | `none ];
      no_picture : bool;
      oc : string * (string -> unit) * (unit -> unit);
      parentship : bool;
      picture_path : bool;
      source : string option;
      surnames : string list;
      verbose : bool;
      }
      val default_opts : gwexport_opts

      Default set of options

      val speclist : gwexport_opts Stdlib.ref -> (Stdlib.Arg.key * Stdlib.Arg.spec * Stdlib.Arg.doc) list

      Given a set of options, returns default command line arguments for selecting elements from a base. The output of this function is the first input of Arg.parse.

      val anonfun : gwexport_opts Stdlib.ref -> Stdlib.Arg.anon_fun

      anonfun opts = fun base_name -> ... Given a set of options `opts` where `!opts.base` is uninitialized, opens the dir `base_name` and initializes !opts.base with the base name. The output of this function is the second argument of Arg.parse.

      val errmsg : Stdlib.Arg.usage_msg

      Default error message. This is the third argument of Arg.parse.

      val select : gwexport_opts -> Gwdb.iper list -> (Gwdb.iper -> bool) * (Gwdb.ifam -> bool)

      select opts ips Return filters for iper and ifam to be used when exporting a (portion of a) base.

      \ No newline at end of file diff --git a/static/doc/geneweb/GwuLib/.dune-keep b/static/doc/geneweb/GwuLib/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/GwuLib/index.html b/static/doc/geneweb/GwuLib/index.html deleted file mode 100644 index 357376456e..0000000000 --- a/static/doc/geneweb/GwuLib/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -GwuLib (geneweb.GwuLib)

      Module GwuLib

      val out_dir : string Stdlib.ref
      val old_gw : bool Stdlib.ref
      val raw_output : bool Stdlib.ref
      val separate_list : string list Stdlib.ref
      val only_file : string Stdlib.ref
      val sep_limit : int Stdlib.ref
      val prepare_free_occ : ?select:(Gwdb.iper -> bool) -> Gwdb.base -> unit

      Initializes the internal hashtables. Person whose identifier is not selected (`select p = false`) are ignored.

      val gwu : Gwexport.gwexport_opts -> bool -> Gwdb.base -> string -> string -> (string, (string -> unit) * bool Stdlib.ref * (unit -> unit)) Stdlib.Hashtbl.t -> ((Gwdb.iper -> bool) * (Gwdb.ifam -> bool)) -> unit

      Prints the `.gw` file.

      \ No newline at end of file diff --git a/static/doc/geneweb/Lock/.dune-keep b/static/doc/geneweb/Lock/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Lock/index.html b/static/doc/geneweb/Lock/index.html deleted file mode 100644 index 2ab8784dce..0000000000 --- a/static/doc/geneweb/Lock/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Lock (geneweb.Lock)

      Module Lock

      val no_lock_flag : bool Stdlib.ref

      Flag that indicates if the lock should be used.

      val print_error_and_exit : unit -> unit

      Print lock error message and terminate program.

      val print_try_again : unit -> unit

      Print message about locked database.

      val control : onerror:(unit -> 'a) -> string -> bool -> (unit -> 'a) -> 'a

      control ~onerror lname wait f opens file lname, puts a write lock on it and then calls f. If wait is true then if it tries to access locked file it will be blocked until these lock is removed. Otherwise it will fail, and function onerror will be called. If flag no_lock_flag is set then returns f () immediatly.

      val control_retry : onerror:(unit -> 'a) -> string -> (unit -> 'a) -> 'a

      Tries to call control without blocking. If it fail (lock is put) then call again control and waits untill lock is removed. If it fails with another reason calls onerror.

      \ No newline at end of file diff --git a/static/doc/geneweb/Mutil/.dune-keep b/static/doc/geneweb/Mutil/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Mutil/index.html b/static/doc/geneweb/Mutil/index.html deleted file mode 100644 index 21c019ba4f..0000000000 --- a/static/doc/geneweb/Mutil/index.html +++ /dev/null @@ -1,3 +0,0 @@ - -Mutil (geneweb.Mutil)

      Module Mutil

      val verbose : bool Stdlib.ref

      Global variable that indicates either servers should be in verbose mode.

      val list_iter_first : (bool -> 'a -> unit) -> 'a list -> unit

      list_iter_first f l iter over first element with f true and over others with f false.

      val strip_all_trailing_spaces : string -> string

      Remove all trailing spaces in string

      val decline : char -> string -> string
      val nominative : string -> string

      Encodes name for nominative declination format.

      • deprecated
      val mkdir_p : ?perm:int -> string -> unit

      mkdir_p ?perm dir Create the directory dir. No error if existing, make parent directories as needed.

      val remove_dir : string -> unit

      Remove every file in the directory and then remove the directory itself

      val lock_file : string -> string

      Returns the name of a lock file (with extension .lck). Result is generally used as an argument for Lock.control function.

      val initial : string -> int

      Returns position of first capital letter in the name (0 if no capitals).

      val input_particles : string -> string list

      input_particles fname read file and returns list of lines. Empty lines are skipped.

      val surnames_pieces : string -> string list

      Divide surnames on pieces. Every separated word that contains at least 4 character forms one piece. Words that contains less than 4 characters or words "saint" and "sainte" are considered as the particles and are attached to the another word to form a piece. If string contains less than two pieces, returns an empty list.

      val utf_8_of_iso_8859_1 : string -> string

      Convert encoded string with ISO 8859-1 to UTF 8

      val iso_8859_1_of_utf_8 : string -> string

      Convert encoded string with UTF 8 to ISO 8859-1

      val roman_of_arabian : int -> string

      Convert arabic number (int) to roman (string). Number should be < 4000.

      val arabian_of_roman : string -> int

      Convert roman number (string) to arabic (int). Number should be less or equal to MMMCMXCIX (3999).

      val input_lexicon : string -> (string, string) Stdlib.Hashtbl.t -> (unit -> Stdlib.in_channel) -> unit

      input_lexicon lang ht open_file open lexicon.txt file with open_file (), parse it and fill ht where key is a section name (in english) and value is a coresponding traduction associated to a lang language code. If traduction line has a form ->: sect it associates to the current section name the value associated to sect section name inside ht.

      module StrSet : Stdlib.Set.S with type elt = string

      Set of strings

      val tr : char -> char -> string -> string

      tr c1 c2 str Return a new string which is the same as str with all occurences of c1 replaced by c2. If str does not contain c1 str is returned untouched.

      val unsafe_tr : char -> char -> string -> string

      unsafe_tr c1 c2 str Update str in place. Replace all occurences of c1 by c2.

      val array_to_list_map : ('a -> 'b) -> 'a array -> 'b list

      array_to_list_map fn a is almost like Array.to_list a |> List.map fn but is more efficient.

      The list is constructed backward, so if fn have side effects it may not behave as excepted.

      val array_to_list_rev_map : ('a -> 'b) -> 'a array -> 'b list

      array_to_list_revmap fn a is almost like Array.to_list a |> List.rev_map fn but is more efficient.

      val array_assoc : 'k -> ('k * 'v) array -> 'v

      array_assoc k arr returns the value associated with key k in the array of pairs arr. That is, array_assoc k [| ... ; (k,v) ; ... |] = v if (k,v) is the leftmost binding of a in array arr. Raise Not_found if there is no value associated with k in arr.

      val start_with : string -> int -> string -> bool

      start_with prefix off str Test if str starts with prefix (at offset off).

      Raise Invalid_argument if off is not a valid index in str.

      val start_with_wildcard : string -> int -> string -> bool

      start_with_wildcard prefix off str Test if str starts with prefix (at offset off). Occurences of '_' in prefix will match both '_' and ' ' in str and trailing '_' of prefix is treated as an optional '_' ' '.

      Raise Invalid_argument if off is not a valid index in str.

      val contains : string -> string -> bool

      contains str sub Test sub is contained in str.

      val compile_particles : string list -> Re.re

      compile_particles list Compile list so it can be used with get_particle or compare_after_particle function.

      val get_particle : Re.re -> string -> string

      get_particle particles name Return p where p is in particles and is prefix of name. If no such p exists, empty string "" is returned.

      val compare_after_particle : Re.re -> string -> string -> int

      compare_after_particle particles s1 s2 compare strings s1 s2 starting from the first character after particle's match. If they are equal, compare particles.

      val rm : string -> unit

      rm fname Remove fname. If fname does not exists, do nothing.

      val mv : string -> string -> unit

      mv src dst Move src to dst. If src does not exists, do nothing.

      val string_of_int_sep : string -> int -> string

      string_of_int_sep "," 1000000 is "1,000,000"

      val list_compare : ('a -> 'a -> int) -> 'a list -> 'a list -> int

      list_compare cmp l1 l2 Comparison function for lists, using cmp to compare each elements

      val list_find_map : ('a -> 'b option) -> 'a list -> 'b option

      list_find_map fn list OCaml Stdlib's List.find_map (introduced in 4.10.0) backported into GeneWeb

      val list_rev_iter : ('a -> unit) -> 'a list -> unit

      list_rev_iter f l gives the same result as List.rev l |> List.iter fn, but without creating intermediate list (not tail-recursive).

      val list_last : 'a list -> 'a

      list_last list Return the last element of the list. Raises Failure if the list is empty.

      val list_slice : int -> int -> 'a list -> 'a list

      list_slice from_ to_ list Extracts elements from a-nth (starts with zero, inclusive) to b-nth (exclusive). If list is not long enough, result will be shorter than requested, but the function will not fail.

      val check_magic : string -> Stdlib.in_channel -> bool

      check_magic magic ic Read (and consume) the magic string at the beggining of ic and return true. If ic does not start with magic, reset the reading position of ic to where is was before you call check_magic and return false.

      val executable_magic : string

      Magic string are either get from GW_EXECUTABLE_MAGIC environement variable either generated from the md5sum of the running executable. It can be used for volatile files which can be easily corrupted by any change in program or data representation.

      val random_magic : string

      Magic string generated from 30 random bits. It should be different each time you launch the program.

      val array_except : 'a -> 'a array -> 'a array

      array_except value array Return a new array containing all the elements from array except the first occurence of value

      val default_particles : string list

      List of default particles used in GeneWeb

      val array_forall2 : ('a -> 'b -> bool) -> 'a array -> 'b array -> bool

      array_forall2 p a b Checks if all elements of the arrays satisfy the predicate p. That is, it returns (p a1 b1) && (p a2 b2) && ... && (p an bn). Raise Invalid_argument if the two lists are determined to have different lengths.

      val list_replace : 'a -> 'a -> 'a list -> 'a list

      list_replace old_v new_v list Return the same list as list were the first occurence of old_v has been replaced by new_v. If old_v is unbound, the list is returned unchanged.

      val list_except : 'a -> 'a list -> 'a list

      list_except x list Return a list containing all the elements from list except the first occurence of x.

      val list_index : 'a -> 'a list -> int

      list_index element list Finds the index of element in list. Raises Not_found if it does not exists.

      val list_ref_append : 'a list Stdlib.ref -> 'a -> unit

      list_ref_append tl hd Add hd at the beginning of tl ref.

      val input_file_ic : Stdlib.in_channel -> string

      Read the content of a file. Starts from the position where it is when calling input_file_ic, and read until the end of the file.

      This function avoid crashes with text files on Windows platform.

      If the channel is opened on a file that is not a regular file, the result is meaningless.

      val normalize_utf_8 : string -> string

      normalize_utf_8 s Return s normalized using NFC with all malformed UTF-8 character replaced by the replacement character

      val list_map_sort_uniq : ('a -> 'b) -> 'a list -> 'b list

      list_map_sort_uniq f l apply f to every element and return sorted with Merge Sort algorithm list where every element is unique.

      val list_rev_map_append : ('a -> 'b) -> 'a list -> 'b list -> 'b list

      list_rev_map_append f l1 l2 apply f to every element in l1, reverse it and concat with l2.

      val read_or_create_channel : ?magic:string -> ?wait:bool -> -string -> (Stdlib.in_channel -> 'a) -> (Stdlib.out_channel -> 'a) -> 'a

      read_or_create_channel ?magic fname read write

      If fname exists (and starts with magic if this one is provided), read function is used on the file. If it does not, or does not start with magic, or if read raise an exception, write function is used on the file.

      This function takes care of locking and closing files so you must not take care of that in read/write. It also takes care of writing magic at the beginning of the file before calling write

      On Windows, file is not locked.

      val read_or_create_value : ?magic:string -> ?wait:bool -> string -> (unit -> 'a) -> 'a

      read_or_create_value ?magic fname create

      If fname exists (and starts and ends with magic if this one is provided), return the unmarshalled value. If it does not, or does not start with magic, or if unmarshalling raise an exception, create function is used to produce the value to be marshalled.

      On Windows, file is not locked.

      val bench : string -> (unit -> 'a) -> 'a

      bench name fn Execute fn, print stats about time and memory allocation, return fn result.

      val print_callstack : ?max:int -> unit -> unit

      Prints call stack on stderr with at most max entries.

      val encode : string -> string

      encode s Encodes the string s in another string where spaces and special characters are coded. This allows to put such strings in html links <a href=...>. This is the same encoding done by Web browsers in forms.

      val decode : string -> string

      decode s Does the inverse job than code, restoring the initial string. The heading and trailing spaces are stripped.

      val gen_decode : bool -> string -> string

      Like above but heading and trailing spaces are stripped only if bool parameter is true. decode = gen_decode true.

      val extract_param : string -> char -> string list -> string

      extract_param name stopc request can be used to extract some parameter from a browser request (list of strings); name is a string which should match the beginning of a request line, stopc is a character ending the request line. For example, the string request has been obtained by: extract_param "GET /" ' '. Answers the empty string if the parameter is not found.

      val sprintf_date : Unix.tm -> string

      Print a date using "%04d-%02d-%02d %02d:%02d:%02d" format Example : 2021-12-13 22:35:08.

      val rev_input_line : Stdlib.in_channel -> int -> (bytes Stdlib.ref * int Stdlib.ref) -> string * int

      rev_input_line ic pos (rbytes, rpos) Read characters in reverse order from the given input channel, until a newline character is encountered. Return the string of all characters read, without the newline character at the end, and the position of the first character of the returned line (to be used with next rev_input_line call).

      rpos and rbytes are intermediate between ic and reading functions. At the beginig when !rpos = 0 and rbytes is empty, initialise buffer with the size = 1024, then reads last 1024 characters from ci. When rpos comes down to 0, resize buffer *2 and reads 2048 characters before 1024 last characters. rpos and rbytes must be the same in each subsequents calls

      Raises End_of_file if the beginning of the file is reached at the beginning of line.

      val search_file_opt : string list -> string -> string option

      search_file directories file Search for a file in different directories and return then first result or None if not found

      val search_asset_opt : string -> string option

      search_asset fname Searches for a file in assets directories. i.e. directories previously registered with Secure.add_assets

      val eq_key : (string * string * int) -> (string * string * int) -> bool

      eq_key (fn1, sn1, oc1) (fn2, sn2, oc2) Tests if two persons would have the same key

      val ls_r : string list -> string list

      ls_r dirs List directories (and subdirectories) contents of dirs, including dirs themselves.

      val rm_rf : string -> unit

      rm_rf dir Remove directory dir and everything inside dir.

      val filter_map : ('a -> 'b option) -> 'a list -> 'b list

      filter_map fn list is a combination of map and filter. Not tail-recursive.

      val rev_iter : ('a -> unit) -> 'a list -> unit

      rev_iter fn list is like List.iter fn (List.rev list). Not tail-recursive.

      val groupby : key:('a -> 'k) -> value:('a -> 'v) -> 'a list -> ('k * 'v list) list

      groupby ~key ~value list Group the elements returning the same key together. Ordering of elements is unspecified.

      val digest : string -> string

      digest s Returns the (128 bits long, using MD5 algorithm) digest of s.

      \ No newline at end of file diff --git a/static/doc/geneweb/Name/.dune-keep b/static/doc/geneweb/Name/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Name/index.html b/static/doc/geneweb/Name/index.html deleted file mode 100644 index db3eec6355..0000000000 --- a/static/doc/geneweb/Name/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Name (geneweb.Name)

      Module Name

      val forbidden_char : char list

      List of forbidden to use characters

      val unaccent_utf_8 : bool -> string -> int -> string * int

      unaccent_utf_8 lower s i checks UTF-8 characher that starts at position i inside s and returns couple (cs,np) where cs is ASCII representation of this character (characters between 0x00 and 0x7F) and np it's a position of next utf8 character inside s. If lower is true then cs will contain only lowercase letters. Example : unaccent_utf_8 "aÈa" 1 -> ("e",3)

      val next_chars_if_equiv : string -> int -> string -> int -> (int * int) option

      next_chars_if_equiv s1 i1 s2 i2 checks if UTF-8 characters that start at position i1 inside s1 and at i2 inside s2 are equivalent (have the same ASCII representation). In this case returns position of the next charecter for each of them. Otherwise, returns None.

      val lower : string -> string

      Convert every letter to lowercase and use *unidecode* library to represent unicode characters with ASCII. Non-alphanumeric characters (except '.') are remplaced by space.

      val title : string -> string

      Apply uppercasing to the first letter of each name (sequence of alphabetic characters) part, and lowercasing to the rest of the text.

      val abbrev : string -> string

      Remplace by an abbreviation or remove particles inside the name

      val strip : string -> string

      Removes all the spaces inside the name

      val strip_c : string -> char -> string

      strip_c s c removes all the occurences of c inside the name

      val purge : string -> string

      Removes all the forbiden characters from forbidden_char inside the name

      val crush : string -> string

      Converts name to the following format:

      • no spaces
      • roman numbers are keeped
      • vowels are suppressed, except in words starting with a vowel, where this vowel is converted into "e"
      • "k" and "q" replaced by "c"
      • "y" replaced by "i"
      • "z" replaced by "s"
      • "ph" replaced by "f"
      • others "h" deleted
      • s at thr end of words are deleted
      • no double lowercase consons
      val strip_lower : string -> string

      Equivalent to strip o lower. Used as:

      • First comparison of names.
      • Comparison for first names and surnames.
      val crush_lower : string -> string

      Equivalent to crush o abbrev o lower. Used as:

      • Second comparison of names.
      • Key when index by names
      val concat : string -> string -> string

      concat fn sn is fn ^ " " ^ sn but faster.

      val split_sname_callback : (int -> int -> unit) -> string -> unit

      split_sname_callback fn s Same as split_sname, but call fn with substring indexes instead of building a list

      val split_fname_callback : (int -> int -> unit) -> string -> unit

      split_fname_callback fn s Same as split_fname, but call fn with substring indexes instead of building a list

      val split_sname : string -> string list

      split_sname s split the surname s in parts composing it. e.g. split_sname base "Foo-Bar" is [ "Foo" ; "Bar"]

      val split_fname : string -> string list

      split_fname s split the string s representing multiple first names into this list of firstname. e.g. split_fname base "Foo-Bar Baz" is [ "Foo-Bar" ; "Baz"]

      \ No newline at end of file diff --git a/static/doc/geneweb/Opt/.dune-keep b/static/doc/geneweb/Opt/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Opt/index.html b/static/doc/geneweb/Opt/index.html deleted file mode 100644 index 581ae6225c..0000000000 --- a/static/doc/geneweb/Opt/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Opt (geneweb.Opt)

      Module Opt

      val iter : ('a -> unit) -> 'a option -> unit

      iter f o if o=Some x then executes f x.

      val map : ('a -> 'b) -> 'a option -> 'b option

      map f o if o=Some x then returns Some (f x) otherwise returns None.

      val map_default : 'a -> ('b -> 'a) -> 'b option -> 'a

      map_default d f o if o=Some x then returns (f x) otherwise returns d.

      val default : 'a -> 'a option -> 'a

      default d o if o=Some x then returns x otherwise returns d.

      val to_string : string option -> string

      to_string so if so=Some s then returns s otherwise returns empty string.

      \ No newline at end of file diff --git a/static/doc/geneweb/Plugin_gwxjg_lib/.dune-keep b/static/doc/geneweb/Plugin_gwxjg_lib/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_data/Yojson_write/index.html b/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_data/Yojson_write/index.html deleted file mode 100644 index 6646646a9b..0000000000 --- a/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_data/Yojson_write/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Yojson_write (geneweb.Plugin_gwxjg_lib.Gwxjg_data.Yojson_write)

      Module Gwxjg_data.Yojson_write

      val hex : int -> char
      val write_special : string -> int Stdlib.ref -> int -> Stdlib.Buffer.t -> string -> unit
      val write_control_char : string -> int Stdlib.ref -> int -> Stdlib.Buffer.t -> char -> unit
      val finish_string : string -> int Stdlib.ref -> Stdlib.Buffer.t -> unit
      val write_string_body : Stdlib.Buffer.t -> string -> unit
      val write_string : Stdlib.Buffer.t -> string -> unit
      val dec : int -> char
      val write_digits : Stdlib.Buffer.t -> int -> unit
      val write_int : Stdlib.Buffer.t -> int -> unit
      val write_float : Stdlib.Buffer.t -> float -> unit
      val write_null : Stdlib.Buffer.t -> unit -> unit
      val write_bool : Stdlib.Buffer.t -> bool -> unit
      val write_kv : Stdlib.Buffer.t -> (string * Jingoo.Jg_types.tvalue) -> unit
      val write_list_aux : a. (Stdlib.Buffer.t -> 'a -> unit) -> Stdlib.Buffer.t -> 'a list -> unit
      val write_assoc : Stdlib.Buffer.t -> (string * Jingoo.Jg_types.tvalue) list -> unit
      val write_hash : Stdlib.Buffer.t -> (string, Jingoo.Jg_types.tvalue) Stdlib.Hashtbl.t -> unit
      val write_list : Stdlib.Buffer.t -> Jingoo.Jg_types.tvalue list -> unit
      val write_array : Stdlib.Buffer.t -> Jingoo.Jg_types.tvalue array -> unit
      val write_json : Stdlib.Buffer.t -> Jingoo.Jg_types.tvalue -> unit
      \ No newline at end of file diff --git a/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_data/index.html b/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_data/index.html deleted file mode 100644 index 8ae5b8eb0f..0000000000 --- a/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_data/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Gwxjg_data (geneweb.Plugin_gwxjg_lib.Gwxjg_data)

      Module Plugin_gwxjg_lib.Gwxjg_data

      module Ezgw = Gwxjg_ezgw
      module Lexicon_parser = Gwxjg_lexicon_parser
      val person_ht : (Gwdb.iperJingoo.Jg_types.tvalue) Stdlib.Hashtbl.t
      val mk_opt : ('a -> Jingoo.Jg_types.tvalue) -> 'a option -> Jingoo.Jg_types.tvalue
      val mk_source_rs : Geneweb.Config.config -> Gwdb.base -> string -> Jingoo.Jg_types.tvalue * Jingoo.Jg_types.tvalue
      val mk_note_rs : Geneweb.Config.config -> Gwdb.base -> (char * (unit -> string)) list -> string -> Jingoo.Jg_types.tvalue * Jingoo.Jg_types.tvalue
      val mk_person_note_rs : Geneweb.Config.config -> Gwdb.base -> Gwdb.person -> string -> Jingoo.Jg_types.tvalue * Jingoo.Jg_types.tvalue
      val date_compare_aux : Jingoo.Jg_types.tvalue -> Jingoo.Jg_types.tvalue -> Jingoo.Jg_types.tvalue
      val compare_month : Jingoo.Jg_types.tvalue -> Jingoo.Jg_types.tvalue -> Jingoo.Jg_types.tvalue
      val compare_day : Jingoo.Jg_types.tvalue -> Jingoo.Jg_types.tvalue -> Jingoo.Jg_types.tvalue
      val cmp_prec : Jingoo.Jg_types.tvalue -> Jingoo.Jg_types.tvalue -> Jingoo.Jg_types.tvalue
      val field : Jingoo.Jg_types.tvalue -> string -> Jingoo.Jg_types.tvalue
      val mk_family : Geneweb.Config.config -> Gwdb.base -> (Gwdb.ifam * Gwdb.family * (Gwdb.iper * Gwdb.iper * Gwdb.iper) * bool) -> Jingoo.Jg_types.tvalue
      val get_n_mk_family : Geneweb.Config.config -> Gwdb.base -> ?origin:Gwdb.iper -> Gwdb.ifam -> Gwdb.family -> Jingoo.Jg_types.tvalue
      val date_compare : Jingoo.Jg_types.tvalue
      val date_eq : Jingoo.Jg_types.tvalue
      val dtext_eq : Jingoo.Jg_types.tvalue
      val mk_dmy : Def.dmy -> Jingoo.Jg_types.tvalue
      val mk_date : Def.date -> Jingoo.Jg_types.tvalue
      val to_dmy : Jingoo.Jg_types.tvalue -> Def.dmy
      val to_dmy2 : Jingoo.Jg_types.tvalue -> Def.dmy2
      val to_prec : Def.precision -> Jingoo.Jg_types.tvalue
      val of_prec : Jingoo.Jg_types.tvalue -> Def.precision
      val to_gregorian_aux : string -> Jingoo.Jg_types.tvalue -> Def.dmy
      val of_calendar : Jingoo.Jg_types.tvalue -> Def.calendar
      val module_DATE : Geneweb.Config.config -> Jingoo.Jg_types.tvalue
      val lazy_list : a. ('a -> Jingoo.Jg_types.tvalue) -> 'a list -> Jingoo.Jg_types.tvalue
      val lazy_get_n_mk_person : Geneweb.Config.config -> Gwdb.base -> Gwdb.iper -> Jingoo.Jg_types.tvalue
      val ppget : Geneweb.Config.config -> Gwdb.base -> Gwdb.person -> Jingoo.Jg_types.tvalue
      val pget : Geneweb.Config.config -> Gwdb.base -> Gwdb.iper -> Jingoo.Jg_types.tvalue
      val get_n_mk_person : Geneweb.Config.config -> Gwdb.base -> Gwdb.iper -> Jingoo.Jg_types.tvalue
      val mk_rparent_aux : (Def.relation_type -> Jingoo.Jg_types.tvalue) -> Geneweb.Config.config -> Gwdb.base -> Jingoo.Jg_types.tvalue list -> Gwdb.relation -> Jingoo.Jg_types.tvalue list
      val mk_rparent : Geneweb.Config.config -> Gwdb.base -> Jingoo.Jg_types.tvalue list -> Gwdb.relation -> Jingoo.Jg_types.tvalue list
      val mk_rchild : Geneweb.Config.config -> Gwdb.base -> Jingoo.Jg_types.tvalue list -> Gwdb.relation -> Jingoo.Jg_types.tvalue list
      val mk_witness_kind : Def.witness_kind -> Jingoo.Jg_types.tvalue
      val mk_event : Geneweb.Config.config -> Gwdb.base -> (Geneweb.Perso.event_name * Def.cdate * Gwdb.istr * Gwdb.istr * Gwdb.istr * (Gwdb.iper * Def.witness_kind) array * Gwdb.iper option) -> Jingoo.Jg_types.tvalue
      val mk_title : Gwdb.base -> Gwdb.title -> Jingoo.Jg_types.tvalue
      val mk_ancestors : Geneweb.Config.config -> Gwdb.base -> Gwdb.person -> Jingoo.Jg_types.tvalue * Jingoo.Jg_types.tvalue * Jingoo.Jg_types.tvalue
      val mk_rparents : Geneweb.Config.config -> Gwdb.base -> Gwdb.person -> Jingoo.Jg_types.tvalue
      val mk_families_spouses : Gwdb.iper -> Geneweb.Config.config -> Gwdb.base -> Gwdb.person -> Jingoo.Jg_types.tvalue * Jingoo.Jg_types.tvalue
      val mk_str_lst : Gwdb.base -> Gwdb.istr list -> Jingoo.Jg_types.tvalue
      val unsafe_mk_semi_public_person : Geneweb.Config.config -> Gwdb.base -> Gwdb.person -> Jingoo.Jg_types.tvalue
      val get_sosa_person : Geneweb.Config.config -> Gwdb.base -> Gwdb.person -> Jingoo.Jg_types.tvalue
      val find_events : Geneweb.Config.config -> Gwdb.base -> Geneweb.Perso.event_name list -> (Geneweb.Perso.event_name * Def.cdate * Gwdb.istr * Gwdb.istr * Gwdb.istr * (Gwdb.iper * Def.witness_kind) array * Gwdb.iper option) list -> Jingoo.Jg_types.tvalue
      val unsafe_mk_person : Geneweb.Config.config -> Gwdb.base -> Gwdb.person -> Jingoo.Jg_types.tvalue
      val mk_fevent : ?spouse:Gwdb.iper -> Geneweb.Config.config -> Gwdb.base -> (Gwdb.iperGwdb.istr) Def.gen_fam_event -> Jingoo.Jg_types.tvalue
      val mk_pevent : Geneweb.Config.config -> Gwdb.base -> (Gwdb.iperGwdb.istr) Def.gen_pers_event -> Jingoo.Jg_types.tvalue
      val mk_gen_title : Gwdb.base -> Gwdb.istr Def.gen_title -> Jingoo.Jg_types.tvalue
      val module_OPT : Jingoo.Jg_types.tvalue
      val module_NAME : Gwdb.base -> Jingoo.Jg_types.tvalue
      val mk_conf : Geneweb.Config.config -> Jingoo.Jg_types.tvalue
      val mk_env_no_base : Geneweb.Config.config -> Jingoo.Jg_types.tvalue
      val mk_env : Geneweb.Config.config -> Gwdb.base -> Jingoo.Jg_types.tvalue
      val decode_varenv : Jingoo.Jg_types.tvalue
      val encode_varenv : Jingoo.Jg_types.tvalue
      val mk_base : Gwdb.base -> Jingoo.Jg_types.tvalue
      val stringify : string -> string
      val trans : Geneweb.Config.config -> Jingoo.Jg_types.tvalue
      module Yojson_write : sig ... end
      val json_encode : Jingoo.Jg_types.tvalue -> string
      val log : Jingoo.Jg_types.tvalue
      val alphabetic : Jingoo.Jg_types.tvalue
      val module_CAST : Jingoo.Jg_types.tvalue
      val module_GWDB : Geneweb.Config.config -> Gwdb.base -> Jingoo.Jg_types.tvalue
      val default_env_aux : Geneweb.Config.config -> (string * Jingoo.Jg_types.tvalue) list
      val default_env_no_base : Geneweb.Config.config -> (string * Jingoo.Jg_types.tvalue) list
      val default_env : Geneweb.Config.config -> Gwdb.base -> (string * Jingoo.Jg_types.tvalue) list
      \ No newline at end of file diff --git a/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_ezgw/Event/index.html b/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_ezgw/Event/index.html deleted file mode 100644 index 8fad153900..0000000000 --- a/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_ezgw/Event/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Event (geneweb.Plugin_gwxjg_lib.Gwxjg_ezgw.Event)

      Module Gwxjg_ezgw.Event

      val name : Geneweb.Config.config -> Gwdb.base -> (Geneweb.Perso.event_name * 'a * 'b * 'c * 'd * 'e * 'f) -> string
      val kind : (Geneweb.Perso.event_name * 'a * 'b * 'c * 'd * 'e * 'f) -> string
      val date : ('a * Adef.cdate * 'b * 'c * 'd * 'e * 'f) -> Adef.date option
      val place : Geneweb.Config.config -> Gwdb.base -> ('a * 'b * Gwdb.istr * 'c * 'd * 'e * 'f) -> string
      val note : Geneweb.Config.config -> Gwdb.base -> ('a * 'b * 'c * Gwdb.istr * 'd * 'e * 'f) -> string
      val src : Gwdb.base -> ('a * 'b * 'c * 'd * Gwdb.istr * 'e * 'f) -> string
      val witnesses : ('a * 'b * 'c * 'd * 'e * 'f * 'g) -> 'f
      val spouse_opt : ('a * 'b * 'c * 'd * 'e * 'f * 'g) -> 'g
      \ No newline at end of file diff --git a/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_ezgw/Family/index.html b/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_ezgw/Family/index.html deleted file mode 100644 index a88092a5c2..0000000000 --- a/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_ezgw/Family/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Family (geneweb.Plugin_gwxjg_lib.Gwxjg_ezgw.Family)

      Module Gwxjg_ezgw.Family

      val children : ('a * Gwdb.family * 'b * 'c) -> Gwdb.iper array
      val divorce_date : ('a * Gwdb.family * 'b * bool) -> Adef.date option
      val events : ('a * Gwdb.family * ('b * 'c * 'd) * bool) -> (Geneweb.Perso.event_name * Def.cdate * Gwdb.istr * Gwdb.istr * Gwdb.istr * (Gwdb.iper * Def.witness_kind) array * 'd option) list
      val father : ('a * 'b * ('c * 'd * 'e) * 'f) -> 'c
      val ifam : (Gwdb.ifam * 'a * 'b * 'c) -> string
      val marriage_date : ('a * Gwdb.family * ('b * 'c * 'd) * bool) -> Adef.date option
      val marriage_place : ('a * Gwdb.family * 'b * 'c) -> Gwdb.istr
      val marriage_note : ('a * Gwdb.family * 'b * bool) -> Gwdb.istr
      val marriage_source : ('a * Gwdb.family * 'b * bool) -> Gwdb.istr
      val mother : ('a * 'b * ('c * 'd * 'e) * 'f) -> 'd
      val note : Geneweb.Config.config -> Gwdb.base -> ('a * Gwdb.family * 'b * bool) -> string
      val origin_file : Geneweb.Config.config -> Gwdb.base -> ('a * Gwdb.family * 'b * 'c) -> string
      val spouse_iper : ('a * 'b * ('c * 'd * 'e) * 'f) -> 'e
      val witnesses : ('a * Gwdb.family * 'b * bool) -> Gwdb.iper array
      val sources : Gwdb.base -> ('a * Gwdb.family * 'b * bool) -> string
      \ No newline at end of file diff --git a/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_ezgw/Person/index.html b/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_ezgw/Person/index.html deleted file mode 100644 index 7550b865b7..0000000000 --- a/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_ezgw/Person/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Person (geneweb.Plugin_gwxjg_lib.Gwxjg_ezgw.Person)

      Module Gwxjg_ezgw.Person

      val children : Gwdb.base -> Gwdb.person -> Gwdb.iper list
      val consanguinity : Gwdb.person -> float
      val dates : Geneweb.Config.config -> Gwdb.base -> Gwdb.person -> string
      val death : Gwdb.person -> Def.death
      val first_name : Gwdb.base -> Gwdb.person -> string
      val history_file : Gwdb.base -> Gwdb.person -> string
      val image : Gwdb.base -> Gwdb.person -> string
      val is_accessible_by_key : Geneweb.Config.config -> Gwdb.base -> Gwdb.person -> bool
      val linked_page : Geneweb.Config.config -> Gwdb.base -> Gwdb.person -> string -> string
      val note : Geneweb.Config.config -> Gwdb.base -> Gwdb.person -> string
      val relations : Gwdb.person -> Gwdb.iper list
      val siblings : Gwdb.base -> Gwdb.person -> Gwdb.iper list
      val half_siblings : Gwdb.base -> Gwdb.person -> Gwdb.iper list
      val sex : Gwdb.person -> int
      val surname : Gwdb.base -> Gwdb.person -> string
      \ No newline at end of file diff --git a/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_ezgw/index.html b/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_ezgw/index.html deleted file mode 100644 index fb30713421..0000000000 --- a/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_ezgw/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Gwxjg_ezgw (geneweb.Plugin_gwxjg_lib.Gwxjg_ezgw)

      Module Plugin_gwxjg_lib.Gwxjg_ezgw

      type fam = Gwdb.ifam * Gwdb.family * (Gwdb.iper * Gwdb.iper * Gwdb.iper) * bool
      type rel = Gwdb.relation * Gwdb.person option
      type env = {
      all_gp : Geneweb.Perso.generation_person list option;
      baseprefix : string option;
      desc_level_table : (int array * int array) Stdlib.Lazy.t option;
      desc_mark : bool array Stdlib.ref option;
      fam : fam option;
      prev_fam : fam option;
      sosa : (Gwdb.iper * (Sosa.t * Gwdb.person) option) list Stdlib.ref option;
      sosa_ref : Gwdb.person option Stdlib.Lazy.t option;
      src : string option;
      }
      val conf_w_baseprefix : Geneweb.Config.config -> env -> Geneweb.Config.config
      val empty : env
      val env : env
      val get_env : 'a option -> 'a
      val sex_of_index : int -> Def.sex
      module Person : sig ... end
      module Family : sig ... end
      module Event : sig ... end
      \ No newline at end of file diff --git a/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_lexicon_parser/index.html b/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_lexicon_parser/index.html deleted file mode 100644 index f48b9d9d27..0000000000 --- a/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_lexicon_parser/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Gwxjg_lexicon_parser (geneweb.Plugin_gwxjg_lib.Gwxjg_lexicon_parser)

      Module Plugin_gwxjg_lib.Gwxjg_lexicon_parser

      type i18n_expr =
      | Arg of string
      | Str of string
      | Elision of string * string
      | Declension of char * string
      val flush : Stdlib.Buffer.t -> i18n_expr list -> i18n_expr list
      val need_split : string -> bool
      val __ocaml_lex_tables : Stdlib.Lexing.lex_tables
      val p_main : (string * (string * i18n_expr array array) list) list -> Stdlib.Lexing.lexbuf -> (string * (string * i18n_expr array array) list) list
      val __ocaml_lex_p_main_rec : (string * (string * i18n_expr array array) list) list -> Stdlib.Lexing.lexbuf -> int -> (string * (string * i18n_expr array array) list) list
      val p_lang : bool -> (string * i18n_expr array array) list -> Stdlib.Lexing.lexbuf -> (string * i18n_expr array array) list
      val __ocaml_lex_p_lang_rec : bool -> (string * i18n_expr array array) list -> Stdlib.Lexing.lexbuf -> int -> (string * i18n_expr array array) list
      val p_trad : Stdlib.Buffer.t -> i18n_expr list -> Stdlib.Lexing.lexbuf -> i18n_expr array
      val __ocaml_lex_p_trad_rec : Stdlib.Buffer.t -> i18n_expr list -> Stdlib.Lexing.lexbuf -> int -> i18n_expr array
      \ No newline at end of file diff --git a/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_trans/index.html b/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_trans/index.html deleted file mode 100644 index a770dd7b49..0000000000 --- a/static/doc/geneweb/Plugin_gwxjg_lib/Gwxjg_trans/index.html +++ /dev/null @@ -1,14 +0,0 @@ - -Gwxjg_trans (geneweb.Plugin_gwxjg_lib.Gwxjg_trans)

      Module Plugin_gwxjg_lib.Gwxjg_trans

      module Lexicon_parser = Gwxjg_lexicon_parser
      val fast_concat : string list -> string
      val args : Lexicon_parser.i18n_expr list list -> string list
      val import_trad : ('a?kwargs:(string * Jingoo.Jg_types.tvalue) list -> -int -> Jingoo.Jg_types.tvalue) Stdlib.Hashtbl.t -> 'a -> Lexicon_parser.i18n_expr array array -> unit
      val default_lang : string
      val find_lang : string -> (string * 'a) list -> 'a
      val make_lang : ('a * (string * Lexicon_parser.i18n_expr array array) list) list -> int -> string -> ('a?kwargs:(string * Jingoo.Jg_types.tvalue) list --> int -> Jingoo.Jg_types.tvalue) Stdlib.Hashtbl.t
      val lexicon_files : string list Stdlib.ref
      val de_en_es_fi_fr_it_nl_no_pt_sv : ((string, ?kwargs:(string * Jingoo.Jg_types.tvalue) list --> int -> Jingoo.Jg_types.tvalue) Stdlib.Hashtbl.t * (string, ?kwargs:(string * Jingoo.Jg_types.tvalue) list --> int -> Jingoo.Jg_types.tvalue) Stdlib.Hashtbl.t * (string, ?kwargs:(string * Jingoo.Jg_types.tvalue) list --> int -> Jingoo.Jg_types.tvalue) Stdlib.Hashtbl.t * (string, ?kwargs:(string * Jingoo.Jg_types.tvalue) list --> int -> Jingoo.Jg_types.tvalue) Stdlib.Hashtbl.t * (string, ?kwargs:(string * Jingoo.Jg_types.tvalue) list --> int -> Jingoo.Jg_types.tvalue) Stdlib.Hashtbl.t * (string, ?kwargs:(string * Jingoo.Jg_types.tvalue) list --> int -> Jingoo.Jg_types.tvalue) Stdlib.Hashtbl.t * (string, ?kwargs:(string * Jingoo.Jg_types.tvalue) list --> int -> Jingoo.Jg_types.tvalue) Stdlib.Hashtbl.t * (string, ?kwargs:(string * Jingoo.Jg_types.tvalue) list --> int -> Jingoo.Jg_types.tvalue) Stdlib.Hashtbl.t * (string, ?kwargs:(string * Jingoo.Jg_types.tvalue) list --> int -> Jingoo.Jg_types.tvalue) Stdlib.Hashtbl.t * (string, ?kwargs:(string * Jingoo.Jg_types.tvalue) list --> int -> Jingoo.Jg_types.tvalue) Stdlib.Hashtbl.t) lazy_t
      \ No newline at end of file diff --git a/static/doc/geneweb/Plugin_gwxjg_lib/index.html b/static/doc/geneweb/Plugin_gwxjg_lib/index.html deleted file mode 100644 index 052489556f..0000000000 --- a/static/doc/geneweb/Plugin_gwxjg_lib/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Plugin_gwxjg_lib (geneweb.Plugin_gwxjg_lib)

      Module Plugin_gwxjg_lib

      module Gwxjg_data : sig ... end
      module Gwxjg_ezgw : sig ... end
      module Gwxjg_lexicon_parser : sig ... end
      module Gwxjg_trans : sig ... end
      \ No newline at end of file diff --git a/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_data/.dune-keep b/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_data/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_data/index.html b/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_data/index.html deleted file mode 100644 index 6c6b48bf09..0000000000 --- a/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_data/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Plugin_gwxjg_lib__Gwxjg_data (geneweb.Plugin_gwxjg_lib__Gwxjg_data)

      Module Plugin_gwxjg_lib__Gwxjg_data

      \ No newline at end of file diff --git a/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_ezgw/.dune-keep b/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_ezgw/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_ezgw/index.html b/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_ezgw/index.html deleted file mode 100644 index 7ea5f19b63..0000000000 --- a/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_ezgw/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Plugin_gwxjg_lib__Gwxjg_ezgw (geneweb.Plugin_gwxjg_lib__Gwxjg_ezgw)

      Module Plugin_gwxjg_lib__Gwxjg_ezgw

      \ No newline at end of file diff --git a/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_lexicon_parser/.dune-keep b/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_lexicon_parser/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_lexicon_parser/index.html b/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_lexicon_parser/index.html deleted file mode 100644 index a70aed5349..0000000000 --- a/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_lexicon_parser/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Plugin_gwxjg_lib__Gwxjg_lexicon_parser (geneweb.Plugin_gwxjg_lib__Gwxjg_lexicon_parser)

      Module Plugin_gwxjg_lib__Gwxjg_lexicon_parser

      \ No newline at end of file diff --git a/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_trans/.dune-keep b/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_trans/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_trans/index.html b/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_trans/index.html deleted file mode 100644 index 90bf0f5a0d..0000000000 --- a/static/doc/geneweb/Plugin_gwxjg_lib__Gwxjg_trans/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Plugin_gwxjg_lib__Gwxjg_trans (geneweb.Plugin_gwxjg_lib__Gwxjg_trans)

      Module Plugin_gwxjg_lib__Gwxjg_trans

      \ No newline at end of file diff --git a/static/doc/geneweb/Pqueue/.dune-keep b/static/doc/geneweb/Pqueue/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Pqueue/Make/argument-1-Ord/index.html b/static/doc/geneweb/Pqueue/Make/argument-1-Ord/index.html deleted file mode 100644 index 44a329e73a..0000000000 --- a/static/doc/geneweb/Pqueue/Make/argument-1-Ord/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Ord (geneweb.Pqueue.Make.1-Ord)

      Parameter Make.1-Ord

      type t
      val leq : t -> t -> bool
      \ No newline at end of file diff --git a/static/doc/geneweb/Pqueue/Make/index.html b/static/doc/geneweb/Pqueue/Make/index.html deleted file mode 100644 index 8b6069a196..0000000000 --- a/static/doc/geneweb/Pqueue/Make/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Make (geneweb.Pqueue.Make)

      Module Pqueue.Make

      Functor that creates instance of priority queue from given element type.

      Parameters

      module Ord : OrderedType

      Signature

      type elt = Ord.t

      Type of elementes contained in priority queues.

      type t

      Type of priority queues.

      val empty : t

      The empty queue.

      val is_empty : t -> bool

      is_empty q checks the emptiness of q.

      val add : elt -> t -> t

      add x h adds a new element x in heap h.

      val take : t -> elt * t

      take x removes the minimum element of x and returns it; raises Not_found when x is empty.

      val union : t -> t -> t

      union q1 q2 returns heap constructed by union of q1 q2

      \ No newline at end of file diff --git a/static/doc/geneweb/Pqueue/index.html b/static/doc/geneweb/Pqueue/index.html deleted file mode 100644 index 6d4786b49c..0000000000 --- a/static/doc/geneweb/Pqueue/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Pqueue (geneweb.Pqueue)

      Module Pqueue

      Module Pqueue: priority queues.

      This module implements priority queues, given a total ordering function over the elements inserted. All operations are purely applicative (no side effects). The implementation uses binomial queues from Chris Okasaki. "add", "take" and "union" are in o(log n) in the worst case.

      module type OrderedType = sig ... end

      The input signature of the functor Pqueue.Make. t is the type of the inserted elements. leq is a total ordering function over the elements. This is a two-argument function f returning True if the first argument is less or equal to the second one.

      module type S = sig ... end

      Output signature for priority queue

      module Make (Ord : OrderedType) : S with type elt = Ord.t

      Functor that creates instance of priority queue from given element type.

      \ No newline at end of file diff --git a/static/doc/geneweb/Pqueue/module-type-OrderedType/index.html b/static/doc/geneweb/Pqueue/module-type-OrderedType/index.html deleted file mode 100644 index af2366aa87..0000000000 --- a/static/doc/geneweb/Pqueue/module-type-OrderedType/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -OrderedType (geneweb.Pqueue.OrderedType)

      Module type Pqueue.OrderedType

      The input signature of the functor Pqueue.Make. t is the type of the inserted elements. leq is a total ordering function over the elements. This is a two-argument function f returning True if the first argument is less or equal to the second one.

      type t
      val leq : t -> t -> bool
      \ No newline at end of file diff --git a/static/doc/geneweb/Pqueue/module-type-S/index.html b/static/doc/geneweb/Pqueue/module-type-S/index.html deleted file mode 100644 index 7fd59aae2d..0000000000 --- a/static/doc/geneweb/Pqueue/module-type-S/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -S (geneweb.Pqueue.S)

      Module type Pqueue.S

      Output signature for priority queue

      type elt

      Type of elementes contained in priority queues.

      type t

      Type of priority queues.

      val empty : t

      The empty queue.

      val is_empty : t -> bool

      is_empty q checks the emptiness of q.

      val add : elt -> t -> t

      add x h adds a new element x in heap h.

      val take : t -> elt * t

      take x removes the minimum element of x and returns it; raises Not_found when x is empty.

      val union : t -> t -> t

      union q1 q2 returns heap constructed by union of q1 q2

      \ No newline at end of file diff --git a/static/doc/geneweb/ProgrBar/.dune-keep b/static/doc/geneweb/ProgrBar/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/ProgrBar/index.html b/static/doc/geneweb/ProgrBar/index.html deleted file mode 100644 index 66951a3b94..0000000000 --- a/static/doc/geneweb/ProgrBar/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -ProgrBar (geneweb.ProgrBar)

      Module ProgrBar

      val empty : char Stdlib.ref

      Character that represents not passed part of progression bar

      val full : char Stdlib.ref

      Character that represents passed part of progression bar

      val start : unit -> unit

      Prints empty bar with carriage return.

      val run : int -> int -> unit

      run i len modifies progression bar that is now filled proportionally to i by comparison with len.

      val finish : unit -> unit

      Stop printing progression bar and prints a new line.

      val suspend : unit -> unit

      Stop printing progression bar and prints a new line.

      val restart : int -> int -> unit

      restart i len restart progression bar. It's equivalent to call successively run from 0 to i.

      \ No newline at end of file diff --git a/static/doc/geneweb/Secure/.dune-keep b/static/doc/geneweb/Secure/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Secure/index.html b/static/doc/geneweb/Secure/index.html deleted file mode 100644 index c6fcb10d33..0000000000 --- a/static/doc/geneweb/Secure/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Secure (geneweb.Secure)

      Module Secure

      val assets : unit -> string list

      Returns list of allowed to acces assets

      val base_dir : unit -> string

      Returns directory where databases are installed to which acces is allowed

      val add_assets : string -> unit

      Add new asset to the assets list

      val set_base_dir : string -> unit

      Set base directory

      val check : string -> bool

      Check if a filename is safe to read:

      • it must not contain the '\000' character
      • it must either be relative to the local directory OR included in one of the allowed directories (base_dir or assets)
      • the relative part does not contain the '..' directory
      val open_in : string -> Stdlib.in_channel

      Secured version of open_in

      val open_in_bin : string -> Stdlib.in_channel

      Secured version of open_in_bin

      val open_out : string -> Stdlib.out_channel

      Secured version of open_out

      val open_out_bin : string -> Stdlib.out_channel

      Secured version of open_out_bin

      val open_out_gen : Stdlib.open_flag list -> int -> string -> Stdlib.out_channel

      Secured version of open_out_gen

      \ No newline at end of file diff --git a/static/doc/geneweb/Sosa/.dune-keep b/static/doc/geneweb/Sosa/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Sosa/index.html b/static/doc/geneweb/Sosa/index.html deleted file mode 100644 index c1dd31702f..0000000000 --- a/static/doc/geneweb/Sosa/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Sosa (geneweb.Sosa)

      Module Sosa

      type t
      val zero : t

      Initial sosa value

      val one : t

      Sosa number describing the subject itself

      val eq : t -> t -> bool

      Equality between 2 sosa

      val gt : t -> t -> bool

      Tells if one sosa number is greater then another

      val compare : t -> t -> int

      Comparison function between sosa numbers

      val add : t -> t -> t

      Addition of 2 sosa numbers

      val sub : t -> t -> t

      Substraction of 2 sosa numbers

      val twice : t -> t

      Returns sosa number multiplied by 2. Represents father's sosa number of person with the giving sosa.

      val half : t -> t

      Returns sosa number divided by 2. If person has a child then result number will be child's sosa number.

      val even : t -> bool

      Tells if sosa number is even. Even numbers describe fathers, odd - mothers for each generation.

      val inc : t -> int -> t

      Addition of sosa number with a integer

      val mul : t -> int -> t

      Multiply sosa number with an integer

      val exp : t -> int -> t

      The power of the sosa number

      val div : t -> int -> t

      Divide sosa number by an integer

      val modl : t -> int -> t

      Calculate module of sosa number comparing to integer

      val gen : t -> int

      Retruns generation of sosa number.

      val branches : t -> int list

      branches sosa Return the path to follow in order to reach sosa It is encoded as a list of int representing the acendant to choose at each generation. 0 if you have to follow the father branch, 1 if it is the mother branch.

      val of_int : int -> t

      Converts sosa from integer

      val of_string : string -> t

      Converts sosa from string

      val to_string : t -> string

      Converts sosa to string

      val to_string_sep : string -> t -> string
      \ No newline at end of file diff --git a/static/doc/geneweb/Utf8/.dune-keep b/static/doc/geneweb/Utf8/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Utf8/index.html b/static/doc/geneweb/Utf8/index.html deleted file mode 100644 index fa7a957f5a..0000000000 --- a/static/doc/geneweb/Utf8/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Utf8 (geneweb.Utf8)

      Module Utf8

      val nbc : char -> int

      Return the number of bytes composing the UTF8 character starting with c

      val next : string -> int -> int

      Utf8.next s i returns the index of the character comming after the one which starts at i.

      val get : string -> int -> int

      Utf8.get s n returns the index where the n-th character starts in string s.

      val length : string -> int

      Return the length (number of characters, not bytes) of the given string.

      val sub : ?pad:char -> string -> int -> int -> string

      sub ?pad s start len Return a fresh UTF8-friendly substring of len characters, padded if needed. Be careful start is the index of the byte where to start in s, not the start-th UTF8-character.

      val cmap_utf_8 : (Stdlib.Uchar.t -> [< `Self | `Uchars of Stdlib.Uchar.t list ]) -> string -> string

      cmap_utf_8 cmap s returns the UTF-8 encoded string resulting from applying the character map cmap to every character of the UTF-8 encoded string s.

      val lowercase : string -> string

      Returns UTF-8 encoded string with all uppercase letters translated to lowercase

      val uppercase : string -> string

      Returns UTF-8 encoded string with all lowercase letters translated to uppercase

      val capitalize_fst : string -> string

      Returns UTF-8 encoded string where the first letter is capitalised

      val capitalize : string -> string

      Returns UTF-8 encoded string where the first letter is capitalised and others minimalised

      val compare : string -> string -> int

      compare a b compare normalized version of a and b It is case insensitive. It starts with unaccented comparison of a and b, and refine the result with accents comparison.

      Here is an exemple of how letters would be sorted: A À Á  B C Ç Č D E É L Ł Ô Ö Ø Œ P Q R * . ?

      \ No newline at end of file diff --git a/static/doc/geneweb/Wserver/.dune-keep b/static/doc/geneweb/Wserver/.dune-keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/static/doc/geneweb/Wserver/index.html b/static/doc/geneweb/Wserver/index.html deleted file mode 100644 index 9a435772f3..0000000000 --- a/static/doc/geneweb/Wserver/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Wserver (geneweb.Wserver)

      Module Wserver

      val f : ([ `LOG_EMERG | `LOG_ALERT | `LOG_CRIT | `LOG_ERR | `LOG_WARNING | `LOG_NOTICE | `LOG_INFO | `LOG_DEBUG ] -> string -> unit) -> string option -> int -> int -> int option -> ((Unix.sockaddr * string list) -> string -> string -> unit) -> unit

      Wserver.f syslog addr port tmout maxc g Starts an elementary httpd server at port port in the current machine. The variable addr is Some the-address-to-use or None for any of the available addresses of the present machine. The port number is any number greater than 1024 (to create a client < 1024, you must be root). At each connection, the function g is called: g (addr, request) scr cont where addr is the client identification socket, request the browser request, scr the script name (extracted from request) and cont the stdin contents . The function g has tmout seconds to answer some text on standard output. If maxc is Some n, maximum n clients can be treated at the same time; None means no limit. syslog is the function used to log errors or debug info. It is called syslog because it is used with the same gravity levels, but it can be anything.

      See the example below.

      val close_connection : unit -> unit

      Closes the current socket

      val printf : ('aStdlib.out_channel, unit) Stdlib.format -> 'a

      Formatter printing in the out channel associated to the connected socket

      val print_string : string -> unit

      Prints a string in the out channel associated to the socket

      val header : string -> unit

      Prints a header; cannot be called if part of content part already has been sent

      val wflush : unit -> unit

      Flushes the content of the current socket

      val http : Def.httpStatus -> unit

      Output.status conf answer sends the http header where answer represents the answer status.

      val http_redirect_temporarily : string -> unit

      Output.status conf_redirect url sends the http header where url represents the Location where the request needs to be redirected.

      val get_request_and_content : char Stdlib.Stream.t -> string list * string

      Returns the request from a stream read from a socket.

      val wsocket : unit -> Unix.file_descr

      Returns the last used socket

      val woc : unit -> Stdlib.out_channel

      Return the out_channel associated to the socket

      val sock_in : string Stdlib.ref

      Names of the files used in windows implementation to communicate http requests and html answers. Default "wserver.sin" and "wserver.sou". Can have relative or absolute paths.

      val sock_out : string Stdlib.ref
      val stop_server : string Stdlib.ref

      Name of the file whose presence tells the server to stop (at least one request is necessary to unfreeze the server to make it check that this file exits. Default "STOP_SERVER". Can have relative or absolute path.

      val cgi : bool Stdlib.ref

      CGI (Common Gateway Interface) mode (default false).

      \ No newline at end of file diff --git a/static/doc/geneweb/index.html b/static/doc/geneweb/index.html deleted file mode 100644 index 542d668088..0000000000 --- a/static/doc/geneweb/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -index (geneweb.index)

      geneweb index

      Library geneweb

      The entry point of this library is the module: Geneweb.

      Library geneweb.core

      This library exposes the following toplevel modules:

      Library geneweb.def

      This library exposes the following toplevel modules:

      Library geneweb.def_show

      The entry point of this library is the module: Def_show.

      Library geneweb.export

      The entry point of this library is the module: Geneweb_export.

      Library geneweb.gwb2ged_lib

      The entry point of this library is the module: Gwb2gedLib.

      Library geneweb.gwd_lib

      The entry point of this library is the module: Gwd_lib.

      Library geneweb.gwdb

      This library exposes the following toplevel modules:

      Library geneweb.gwdb_driver

      The entry point of this library is the module: Gwdb_driver.

      Library geneweb.gwexport_lib

      The entry point of this library is the module: Gwexport.

      Library geneweb.gwu_lib

      The entry point of this library is the module: GwuLib.

      Library geneweb.plugin_gwxjg_lib

      The entry point of this library is the module: Plugin_gwxjg_lib.

      Library geneweb.sosa.mli

      The entry point of this library is the module: Sosa.

      Library geneweb.util

      This library exposes the following toplevel modules:

      Library geneweb.wserver

      The entry point of this library is the module: Wserver.

      \ No newline at end of file diff --git a/static/doc/highlight.pack.js b/static/doc/highlight.pack.js deleted file mode 100644 index 2e55d49154..0000000000 --- a/static/doc/highlight.pack.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! highlight.js v9.15.8 | BSD3 License | git.io/hljslicense */ -!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs}))}(function(a){var f=[],u=Object.keys,N={},c={},n=/^(no-?highlight|plain|text)$/i,s=/\blang(?:uage)?-([\w-]+)\b/i,t=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,r={case_insensitive:"cI",lexemes:"l",contains:"c",keywords:"k",subLanguage:"sL",className:"cN",begin:"b",beginKeywords:"bK",end:"e",endsWithParent:"eW",illegal:"i",excludeBegin:"eB",excludeEnd:"eE",returnBegin:"rB",returnEnd:"rE",relevance:"r",variants:"v",IDENT_RE:"IR",UNDERSCORE_IDENT_RE:"UIR",NUMBER_RE:"NR",C_NUMBER_RE:"CNR",BINARY_NUMBER_RE:"BNR",RE_STARTERS_RE:"RSR",BACKSLASH_ESCAPE:"BE",APOS_STRING_MODE:"ASM",QUOTE_STRING_MODE:"QSM",PHRASAL_WORDS_MODE:"PWM",C_LINE_COMMENT_MODE:"CLCM",C_BLOCK_COMMENT_MODE:"CBCM",HASH_COMMENT_MODE:"HCM",NUMBER_MODE:"NM",C_NUMBER_MODE:"CNM",BINARY_NUMBER_MODE:"BNM",CSS_NUMBER_MODE:"CSSNM",REGEXP_MODE:"RM",TITLE_MODE:"TM",UNDERSCORE_TITLE_MODE:"UTM",COMMENT:"C",beginRe:"bR",endRe:"eR",illegalRe:"iR",lexemesRe:"lR",terminators:"t",terminator_end:"tE"},b="",h={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};function _(e){return e.replace(/&/g,"&").replace(//g,">")}function E(e){return e.nodeName.toLowerCase()}function v(e,n){var t=e&&e.exec(n);return t&&0===t.index}function l(e){return n.test(e)}function g(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function R(e){var a=[];return function e(n,t){for(var r=n.firstChild;r;r=r.nextSibling)3===r.nodeType?t+=r.nodeValue.length:1===r.nodeType&&(a.push({event:"start",offset:t,node:r}),t=e(r,t),E(r).match(/br|hr|img|input/)||a.push({event:"stop",offset:t,node:r}));return t}(e,0),a}function i(e){if(r&&!e.langApiRestored){for(var n in e.langApiRestored=!0,r)e[n]&&(e[r[n]]=e[n]);(e.c||[]).concat(e.v||[]).forEach(i)}}function m(o){function s(e){return e&&e.source||e}function c(e,n){return new RegExp(s(e),"m"+(o.cI?"i":"")+(n?"g":""))}!function n(t,e){if(!t.compiled){if(t.compiled=!0,t.k=t.k||t.bK,t.k){function r(t,e){o.cI&&(e=e.toLowerCase()),e.split(" ").forEach(function(e){var n=e.split("|");a[n[0]]=[t,n[1]?Number(n[1]):1]})}var a={};"string"==typeof t.k?r("keyword",t.k):u(t.k).forEach(function(e){r(e,t.k[e])}),t.k=a}t.lR=c(t.l||/\w+/,!0),e&&(t.bK&&(t.b="\\b("+t.bK.split(" ").join("|")+")\\b"),t.b||(t.b=/\B|\b/),t.bR=c(t.b),t.endSameAsBegin&&(t.e=t.b),t.e||t.eW||(t.e=/\B|\b/),t.e&&(t.eR=c(t.e)),t.tE=s(t.e)||"",t.eW&&e.tE&&(t.tE+=(t.e?"|":"")+e.tE)),t.i&&(t.iR=c(t.i)),null==t.r&&(t.r=1),t.c||(t.c=[]),t.c=Array.prototype.concat.apply([],t.c.map(function(e){return function(n){return n.v&&!n.cached_variants&&(n.cached_variants=n.v.map(function(e){return g(n,{v:null},e)})),n.cached_variants||n.eW&&[g(n)]||[n]}("self"===e?t:e)})),t.c.forEach(function(e){n(e,t)}),t.starts&&n(t.starts,e);var i=t.c.map(function(e){return e.bK?"\\.?(?:"+e.b+")\\.?":e.b}).concat([t.tE,t.i]).map(s).filter(Boolean);t.t=i.length?c(function(e,n){for(var t=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,r=0,a="",i=0;i')+n+(t?"":b):n}function o(){E+=null!=l.sL?function(){var e="string"==typeof l.sL;if(e&&!N[l.sL])return _(g);var n=e?C(l.sL,g,!0,f[l.sL]):O(g,l.sL.length?l.sL:void 0);return 0")+'"');return g+=n,n.length||1}var s=B(e);if(!s)throw new Error('Unknown language: "'+e+'"');m(s);var a,l=t||s,f={},E="";for(a=l;a!==s;a=a.parent)a.cN&&(E=c(a.cN,"",!0)+E);var g="",R=0;try{for(var d,p,M=0;l.t.lastIndex=M,d=l.t.exec(n);)p=r(n.substring(M,d.index),d[0]),M=d.index+p;for(r(n.substr(M)),a=l;a.parent;a=a.parent)a.cN&&(E+=b);return{r:R,value:E,language:e,top:l}}catch(e){if(e.message&&-1!==e.message.indexOf("Illegal"))return{r:0,value:_(n)};throw e}}function O(t,e){e=e||h.languages||u(N);var r={r:0,value:_(t)},a=r;return e.filter(B).filter(M).forEach(function(e){var n=C(e,t,!1);n.language=e,n.r>a.r&&(a=n),n.r>r.r&&(a=r,r=n)}),a.language&&(r.second_best=a),r}function d(e){return h.tabReplace||h.useBR?e.replace(t,function(e,n){return h.useBR&&"\n"===e?"
      ":h.tabReplace?n.replace(/\t/g,h.tabReplace):""}):e}function o(e){var n,t,r,a,i,o=function(e){var n,t,r,a,i=e.className+" ";if(i+=e.parentNode?e.parentNode.className:"",t=s.exec(i))return B(t[1])?t[1]:"no-highlight";for(n=0,r=(i=i.split(/\s+/)).length;n/g,"\n"):n=e,i=n.textContent,r=o?C(o,i,!0):O(i),(t=R(n)).length&&((a=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=r.value,r.value=function(e,n,t){var r=0,a="",i=[];function o(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset"}function u(e){a+=""}function s(e){("start"===e.event?c:u)(e.node)}for(;e.length||n.length;){var l=o();if(a+=_(t.substring(r,l[0].offset)),r=l[0].offset,l===e){for(i.reverse().forEach(u);s(l.splice(0,1)[0]),(l=o())===e&&l.length&&l[0].offset===r;);i.reverse().forEach(c)}else"start"===l[0].event?i.push(l[0].node):i.pop(),s(l.splice(0,1)[0])}return a+_(t.substr(r))}(t,R(a),i)),r.value=d(r.value),e.innerHTML=r.value,e.className=function(e,n,t){var r=n?c[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}(e.className,o,r.language),e.result={language:r.language,re:r.r},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.r}))}function p(){if(!p.called){p.called=!0;var e=document.querySelectorAll("pre code");f.forEach.call(e,o)}}function B(e){return e=(e||"").toLowerCase(),N[e]||N[c[e]]}function M(e){var n=B(e);return n&&!n.disableAutodetect}return a.highlight=C,a.highlightAuto=O,a.fixMarkup=d,a.highlightBlock=o,a.configure=function(e){h=g(h,e)},a.initHighlighting=p,a.initHighlightingOnLoad=function(){addEventListener("DOMContentLoaded",p,!1),addEventListener("load",p,!1)},a.registerLanguage=function(n,e){var t=N[n]=e(a);i(t),t.aliases&&t.aliases.forEach(function(e){c[e]=n})},a.listLanguages=function(){return u(N)},a.getLanguage=B,a.autoDetection=M,a.inherit=g,a.IR=a.IDENT_RE="[a-zA-Z]\\w*",a.UIR=a.UNDERSCORE_IDENT_RE="[a-zA-Z_]\\w*",a.NR=a.NUMBER_RE="\\b\\d+(\\.\\d+)?",a.CNR=a.C_NUMBER_RE="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",a.BNR=a.BINARY_NUMBER_RE="\\b(0b[01]+)",a.RSR=a.RE_STARTERS_RE="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",a.BE=a.BACKSLASH_ESCAPE={b:"\\\\[\\s\\S]",r:0},a.ASM=a.APOS_STRING_MODE={cN:"string",b:"'",e:"'",i:"\\n",c:[a.BE]},a.QSM=a.QUOTE_STRING_MODE={cN:"string",b:'"',e:'"',i:"\\n",c:[a.BE]},a.PWM=a.PHRASAL_WORDS_MODE={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},a.C=a.COMMENT=function(e,n,t){var r=a.inherit({cN:"comment",b:e,e:n,c:[]},t||{});return r.c.push(a.PWM),r.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),r},a.CLCM=a.C_LINE_COMMENT_MODE=a.C("//","$"),a.CBCM=a.C_BLOCK_COMMENT_MODE=a.C("/\\*","\\*/"),a.HCM=a.HASH_COMMENT_MODE=a.C("#","$"),a.NM=a.NUMBER_MODE={cN:"number",b:a.NR,r:0},a.CNM=a.C_NUMBER_MODE={cN:"number",b:a.CNR,r:0},a.BNM=a.BINARY_NUMBER_MODE={cN:"number",b:a.BNR,r:0},a.CSSNM=a.CSS_NUMBER_MODE={cN:"number",b:a.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},a.RM=a.REGEXP_MODE={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[a.BE,{b:/\[/,e:/\]/,r:0,c:[a.BE]}]},a.TM=a.TITLE_MODE={cN:"title",b:a.IR,r:0},a.UTM=a.UNDERSCORE_TITLE_MODE={cN:"title",b:a.UIR,r:0},a.METHOD_GUARD={b:"\\.\\s*"+a.UIR,r:0},a});hljs.registerLanguage("ocaml",function(e){return{aliases:["ml"],k:{keyword:"and as assert asr begin class constraint do done downto else end exception external for fun function functor if in include inherit! inherit initializer land lazy let lor lsl lsr lxor match method!|10 method mod module mutable new object of open! open or private rec sig struct then to try type val! val virtual when while with parser value",built_in:"array bool bytes char exn|5 float int int32 int64 list lazy_t|5 nativeint|5 string unit in_channel out_channel ref",literal:"true false"},i:/\/\/|>>/,l:"[a-z_]\\w*!?",c:[{cN:"literal",b:"\\[(\\|\\|)?\\]|\\(\\)",r:0},e.C("\\(\\*","\\*\\)",{c:["self"]}),{cN:"symbol",b:"'[A-Za-z_](?!')[\\w']*"},{cN:"type",b:"`[A-Z][\\w']*"},{cN:"type",b:"\\b[A-Z][\\w']*",r:0},{b:"[a-z_]\\w*'[\\w']*",r:0},e.inherit(e.ASM,{cN:"string",r:0}),e.inherit(e.QSM,{i:null}),{cN:"number",b:"\\b(0[xX][a-fA-F0-9_]+[Lln]?|0[oO][0-7_]+[Lln]?|0[bB][01_]+[Lln]?|[0-9][0-9_]*([Lln]|(\\.[0-9_]*)?([eE][-+]?[0-9_]+)?)?)",r:0},{b:/[-=]>/}]}});hljs.registerLanguage("reasonml",function(r){var e="~?[a-z$_][0-9a-zA-Z$_]*",a="`?[A-Z$_][0-9a-zA-Z$_]*",c="("+["||","&&","++","**","+.","*","/","*.","/.","...","|>"].map(function(r){return r.split("").map(function(r){return"\\"+r}).join("")}).join("|")+"|==|===)",n="\\s+"+c+"\\s+",t={keyword:"and as asr assert begin class constraint do done downto else end exception externalfor fun function functor if in include inherit initializerland lazy let lor lsl lsr lxor match method mod module mutable new nonrecobject of open or private rec sig struct then to try type val virtual when while with",built_in:"array bool bytes char exn|5 float int int32 int64 list lazy_t|5 nativeint|5 ref string unit ",literal:"true false"},i="\\b(0[xX][a-fA-F0-9_]+[Lln]?|0[oO][0-7_]+[Lln]?|0[bB][01_]+[Lln]?|[0-9][0-9_]*([Lln]|(\\.[0-9_]*)?([eE][-+]?[0-9_]+)?)?)",s={cN:"number",r:0,v:[{b:i},{b:"\\(\\-"+i+"\\)"}]},b={cN:"operator",r:0,b:c},o=[{cN:"identifier",r:0,b:e},b,s],l=[r.QSM,b,{cN:"module",b:"\\b"+a,rB:!0,e:".",c:[{cN:"identifier",b:a,r:0}]}],u=[{cN:"module",b:"\\b"+a,rB:!0,e:".",r:0,c:[{cN:"identifier",b:a,r:0}]}],_={cN:"function",r:0,k:t,v:[{b:"\\s(\\(\\.?.*?\\)|"+e+")\\s*=>",e:"\\s*=>",rB:!0,r:0,c:[{cN:"params",v:[{b:e},{b:"~?[a-z$_][0-9a-zA-Z$_]*(s*:s*[a-z$_][0-9a-z$_]*((s*('?[a-z$_][0-9a-z$_]*s*(,'?[a-z$_][0-9a-z$_]*)*)?s*))?)?(s*:s*[a-z$_][0-9a-z$_]*((s*('?[a-z$_][0-9a-z$_]*s*(,'?[a-z$_][0-9a-z$_]*)*)?s*))?)?"},{b:/\(\s*\)/}]}]},{b:"\\s\\(\\.?[^;\\|]*\\)\\s*=>",e:"\\s=>",rB:!0,r:0,c:[{cN:"params",r:0,v:[{b:e,e:"(,|\\n|\\))",r:0,c:[b,{cN:"typing",b:":",e:"(,|\\n)",rB:!0,r:0,c:u}]}]}]},{b:"\\(\\.\\s"+e+"\\)\\s*=>"}]};l.push(_);var N={cN:"constructor",b:a+"\\(",e:"\\)",i:"\\n",k:t,c:[r.QSM,b,{cN:"params",b:"\\b"+e}]},d={cN:"pattern-match",b:"\\|",rB:!0,k:t,e:"=>",r:0,c:[N,b,{r:0,cN:"constructor",b:a}]},z={cN:"module-access",k:t,rB:!0,v:[{b:"\\b("+a+"\\.)+"+e},{b:"\\b("+a+"\\.)+\\(",e:"\\)",rB:!0,c:[_,{b:"\\(",e:"\\)",skip:!0}].concat(l)},{b:"\\b("+a+"\\.)+{",e:"}"}],c:l};return u.push(z),{aliases:["re"],k:t,i:"(:\\-|:=|\\${|\\+=)",c:[r.C("/\\*","\\*/",{i:"^(\\#,\\/\\/)"}),{cN:"character",b:"'(\\\\[^']+|[^'])'",i:"\\n",r:0},r.QSM,{cN:"literal",b:"\\(\\)",r:0},{cN:"literal",b:"\\[\\|",e:"\\|\\]",r:0,c:o},{cN:"literal",b:"\\[",e:"\\]",r:0,c:o},N,{cN:"operator",b:n,i:"\\-\\->",r:0},s,r.CLCM,d,_,{cN:"module-def",b:"\\bmodule\\s+"+e+"\\s+"+a+"\\s+=\\s+{",e:"}",rB:!0,k:t,r:0,c:[{cN:"module",r:0,b:a},{b:"{",e:"}",skip:!0}].concat(l)},z]}}); \ No newline at end of file diff --git a/static/doc/index.html b/static/doc/index.html deleted file mode 100644 index d9a7c8616d..0000000000 --- a/static/doc/index.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - index - - - - - -
      -
      -

      OCaml package documentation

      -
        -
      1. geneweb
      2. -
      -
      -
      - - \ No newline at end of file diff --git a/static/doc/odoc.css b/static/doc/odoc.css deleted file mode 100644 index c5d2acb024..0000000000 --- a/static/doc/odoc.css +++ /dev/null @@ -1,782 +0,0 @@ -@charset "UTF-8"; -/* Copyright (c) 2016 The odoc contributors. All rights reserved. - Distributed under the ISC license, see terms at the end of the file. - odoc 2.0.2 */ - -/* Fonts */ -@import url('https://fonts.googleapis.com/css?family=Fira+Mono:400,500'); -@import url('https://fonts.googleapis.com/css?family=Noticia+Text:400,400i,700'); -@import url('https://fonts.googleapis.com/css?family=Fira+Sans:400,400i,500,500i,600,600i,700,700i'); - -:root, -.light:root { - --main-background: #FFFFFF; - - --color: #333333; - --link-color: #2C94BD; - --anchor-hover: #555; - --anchor-color: #d5d5d5; - --xref-shadow: #cc6666; - --header-shadow: #ddd; - --by-name-version-color: #aaa; - --by-name-nav-link-color: #222; - --target-background: rgba(187, 239, 253, 0.3); - --target-shadow: rgba(187, 239, 253, 0.8); - --pre-border-color: #eee; - --code-background: #f6f8fa; - - --li-code-background: #f6f8fa; - --li-code-color: #0d2b3e; - --toc-color: #1F2D3D; - --toc-before-color: #777; - --toc-background: #f6f8fa; - --toc-list-border: #ccc; - - --spec-summary-border-color: #5c9cf5; - --spec-summary-background: var(--code-background); - --spec-summary-hover-background: #ebeff2; - --spec-details-after-background: rgba(0, 4, 15, 0.05); - --spec-details-after-shadow: rgba(204, 204, 204, 0.53); -} - -.dark:root { - --main-background: #202020; - --code-background: #222; - --line-numbers-background: rgba(0, 0, 0, 0.125); - --navbar-background: #202020; - - --color: #bebebe; - --dirname-color: #666; - --underline-color: #444; - --visited-color: #002800; - --visited-number-color: #252; - --unvisited-color: #380000; - --unvisited-number-color: #622; - --somevisited-color: #303000; - --highlight-color: #303e3f; - --line-number-color: rgba(230, 230, 230, 0.3); - --unvisited-margin-color: #622; - --border: #333; - --navbar-border: #333; - --code-color: #ccc; - - --li-code-background: #373737; - --li-code-color: #999; - --toc-color: #777; - --toc-background: #252525; - - --hljs-link: #999; - --hljs-keyword: #cda869; - --hljs-regexp: #f9ee98; - --hljs-title: #dcdcaa; - --hljs-type: #ac885b; - --hljs-meta: #82aaff; - --hljs-variable: #cf6a4c; -} - -@media (prefers-color-scheme: dark) { - :root { - --main-background: #202020; - --code-background: #333; - --line-numbers-background: rgba(0, 0, 0, 0.125); - --navbar-background: #202020; - - --meter-unvisited-color: #622; - --meter-visited-color: #252; - --meter-separator-color: black; - - --color: #bebebe; - --dirname-color: #666; - --underline-color: #444; - --visited-color: #002800; - --visited-number-color: #252; - --unvisited-color: #380000; - --unvisited-number-color: #622; - --somevisited-color: #303000; - --highlight-color: #303e3f; - --line-number-color: rgba(230, 230, 230, 0.3); - --unvisited-margin-color: #622; - --border: #333; - --navbar-border: #333; - --code-color: #ccc; - --by-name-nav-link-color: var(--color); - - --li-code-background: #373737; - --li-code-color: #999; - --toc-color: #777; - --toc-before-color: #777; - --toc-background: #252525; - --toc-list-border: #ccc; - --spec-summary-hover-background: #ebeff2; - --spec-details-after-background: rgba(0, 4, 15, 0.05); - --spec-details-after-shadow: rgba(204, 204, 204, 0.53); - - --hljs-link: #999; - --hljs-keyword: #cda869; - --hljs-regexp: #f9ee98; - --hljs-title: #dcdcaa; - --hljs-type: #ac885b; - --hljs-meta: #82aaff; - --hljs-variable: #cf6a4c; - } -} - -/* Reset a few things. */ - -html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { - margin: 0; - padding: 0; - border: 0; - font: inherit; - vertical-align: baseline; - -} - -table { - border-collapse: collapse; - border-spacing: 0; -} - -*, *:before, *:after { - box-sizing: border-box; -} - -html { - font-size: 15px; -} - -body { - text-align: left; - background: #FFFFFF; - color: var(--color); - background-color: var(--main-background); -} - -body { - max-width: 90ex; - margin-left: calc(10vw + 20ex); - margin-right: 4ex; - margin-top: 20px; - margin-bottom: 50px; - font-family: "Noticia Text", Georgia, serif; - line-height: 1.5; -} - -header { - margin-bottom: 30px; -} - -nav { - font-family: "Fira Sans", Helvetica, Arial, sans-serif; -} - -/* Basic markup elements */ - -b, strong { - font-weight: bold; -} - -i { - font-style: italic; -} - -em, i em.odd{ - font-style: italic; -} - -em.odd, i em { - font-style: normal; -} - -sup { - vertical-align: super; -} - -sub { - vertical-align: sub; -} - -sup, sub { - font-size: 12px; - line-height: 0; - margin-left: 0.2ex; -} - -pre { - margin-top: 0.8em; - margin-bottom: 1.2em; -} - -p, ul, ol { - margin-top: 0.5em; - margin-bottom: 1em; -} -ul, ol { - list-style-position: outside -} - -ul>li { - margin-left: 22px; -} - -ol>li { - margin-left: 27.2px; -} - -li>*:first-child { - margin-top: 0 -} - -/* Text alignements, this should be forbidden. */ - -.left { - text-align: left; -} - -.right { - text-align: right; -} - -.center { - text-align: center; -} - -/* Links and anchors */ - -a { - text-decoration: none; - color: var(--link-color); -} - -a:hover { - box-shadow: 0 1px 0 0 var(--link-color); -} - -/* Linked highlight */ -*:target { - background-color: var(--target-background) !important; - box-shadow: 0 0px 0 1px var(--target-shadow) !important; - border-radius: 1px; -} - -*:hover > a.anchor { - visibility: visible; -} - -a.anchor:before { - content: "#"; -} - -a.anchor:hover { - box-shadow: none; - text-decoration: none; - color: var(--anchor-hover); -} - -a.anchor { - visibility: hidden; - position: absolute; - /* top: 0px; */ - /* margin-left: -3ex; */ - margin-left: -1.3em; - font-weight: normal; - font-style: normal; - padding-right: 0.4em; - padding-left: 0.4em; - /* To remain selectable */ - color: var(--anchor-color); -} - -.spec > a.anchor { - margin-left: -2.3em; - padding-right: 0.9em; -} - -.xref-unresolved { - color: #2C94BD; -} -.xref-unresolved:hover { - box-shadow: 0 1px 0 0 var(--xref-shadow); -} - -/* Section and document divisions. - Until at least 4.03 many of the modules of the stdlib start at .h7, - we restart the sequence there like h2 */ - -h1, h2, h3, h4, h5, h6, .h7, .h8, .h9, .h10 { - font-family: "Fira Sans", Helvetica, Arial, sans-serif; - font-weight: 400; - margin: 0.5em 0 0.5em 0; - padding-top: 0.1em; - line-height: 1.2; - overflow-wrap: break-word; -} - -h1 { - font-weight: 500; - font-size: 2.441em; - margin-top: 1.214em; -} - -h1 { - font-weight: 500; - font-size: 1.953em; - box-shadow: 0 1px 0 0 var(--header-shadow); -} - -h2 { - font-size: 1.563em; -} - -h3 { - font-size: 1.25em; -} - -small, .font_small { - font-size: 0.8em; -} - -h1 code, h1 tt { - font-size: inherit; - font-weight: inherit; -} - -h2 code, h2 tt { - font-size: inherit; - font-weight: inherit; -} - -h3 code, h3 tt { - font-size: inherit; - font-weight: inherit; -} - -h3 code, h3 tt { - font-size: inherit; - font-weight: inherit; -} - -h4 { - font-size: 1.12em; -} - -/* Comment delimiters, hidden but accessible to screen readers and - selected for copy/pasting */ - -/* Taken from bootstrap */ -/* See also https://stackoverflow.com/a/27769435/4220738 */ -.comment-delim { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border: 0; -} - -/* Preformatted and code */ - -tt, code, pre { - font-family: "Fira Mono", courier; - font-weight: 400; -} - -pre { - padding: 0.1em; - border: 1px solid var(--pre-border-color); - border-radius: 5px; - overflow-x: auto; -} - -p code, -li code { - background-color: var(--li-code-background); - color: var(--li-code-color); - border-radius: 3px; - padding: 0 0.3ex; -} - -p a > code { - color: var(--link-color); -} - -/* Code blocks (e.g. Examples) */ - -pre code { - font-size: 0.893rem; -} - -/* Code lexemes */ - -.keyword { - font-weight: 500; -} - -.arrow { white-space: nowrap } - -/* Module member specification */ - -.spec { - background-color: var(--spec-summary-background); - border-radius: 3px; - border-left: 4px solid var(--spec-summary-border-color); - border-right: 5px solid transparent; - padding: 0.35em 0.5em; -} - -div.spec, .def-doc { - margin-bottom: 20px; -} - -.spec.type .variant { - margin-left: 2ch; -} -.spec.type .variant p { - margin: 0; - font-style: italic; -} -.spec.type .record { - margin-left: 2ch; -} -.spec.type .record p { - margin: 0; - font-style: italic; -} - -div.def { - margin-top: 0; - text-indent: -2ex; - padding-left: 2ex; -} - -div.def+div.def-doc { - margin-left: 1ex; - margin-top: 2.5px -} - -div.def-doc>*:first-child { - margin-top: 0; -} - -/* Collapsible inlined include and module */ - -.odoc-include details { - position: relative; -} - -.odoc-include details:after { - z-index: -100; - display: block; - content: " "; - position: absolute; - border-radius: 0 1ex 1ex 0; - right: -20px; - top: 1px; - bottom: 1px; - width: 15px; - background: var(--spec-details-after-background, rgba(0, 4, 15, 0.05)); - box-shadow: 0 0px 0 1px var(--spec-details-after-shadow, rgba(204, 204, 204, 0.53)); -} - -.odoc-include summary { - position: relative; - margin-bottom: 20px; - cursor: pointer; - outline: none; -} - -.odoc-include summary:hover { - background-color: var(--spec-summary-hover-background); -} - -/* FIXME: Does not work in Firefox. */ -.odoc-include summary::-webkit-details-marker { - color: #888; - transform: scaleX(-1); - position: absolute; - top: calc(50% - 5px); - height: 11px; - right: -29px; -} - -/* Records and variants FIXME */ - -div.def table { - text-indent: 0em; - padding: 0; - margin-left: -2ex; -} - -td.def { - padding-left: 2ex; -} - -td.def-doc *:first-child { - margin-top: 0em; -} - -/* Lists of @tags */ - -.at-tags { list-style-type: none; margin-left: -3ex; } -.at-tags li { padding-left: 3ex; text-indent: -3ex; } -.at-tags .at-tag { text-transform: capitalize } - -/* Lists of modules */ - -.modules { list-style-type: none; margin-left: -3ex; } -.modules li { padding-left: 3ex; text-indent: -3ex; margin-top: 5px } -.modules .synopsis { padding-left: 1ch; } - -/* Odig package index */ - -.packages { list-style-type: none; margin-left: -3ex; } -.packages li { padding-left: 3ex; text-indent: -3ex } -.packages li a.anchor { padding-right: 0.5ch; padding-left: 3ch; } -.packages .version { font-size: 10px; color: var(--by-name-version-color); } -.packages .synopsis { padding-left: 1ch } - -.by-name nav a { - text-transform: uppercase; - font-size: 18px; - margin-right: 1ex; - color: var(--by-name-nav-link-color,); - display: inline-block; -} - -.by-tag nav a { - margin-right: 1ex; - color: var(--by-name-nav-link-color); - display: inline-block; -} - -.by-tag ol { list-style-type: none; } -.by-tag ol.tags li { margin-left: 1ch; display: inline-block } -.by-tag td:first-child { text-transform: uppercase; } - -/* Odig package page */ - -.package nav { - display: inline; - font-size: 14px; - font-weight: normal; -} - -.package .version { - font-size: 14px; -} - -.package.info { - margin: 0; -} - -.package.info td:first-child { - font-style: italic; - padding-right: 2ex; -} - -.package.info ul { - list-style-type: none; - display: inline; - margin: 0; -} - -.package.info li { - display: inline-block; - margin: 0; - margin-right: 1ex; -} - -#info-authors li, #info-maintainers li { - display: block; -} - -/* Sidebar and TOC */ - -.odoc-toc:before { - display: block; - content: "Contents"; - text-transform: uppercase; - font-size: 1em; - margin: 1.414em 0 0.5em; - font-weight: 500; - color: var(--toc-before-color); - line-height: 1.2; -} - -.odoc-toc { - position: fixed; - top: 0px; - bottom: 0px; - left: 0px; - max-width: 30ex; - min-width: 26ex; - width: 20%; - background: var(--toc-background); - overflow: auto; - color: var(--toc-color); - padding-left: 2ex; - padding-right: 2ex; -} - -.odoc-toc ul li a { - font-family: "Fira Sans", sans-serif; - font-size: 0.95em; - color: var(--color); - font-weight: 400; - line-height: 1.6em; - display: block; -} - -.odoc-toc ul li a:hover { - box-shadow: none; - text-decoration: underline; -} - -/* First level titles */ - -.odoc-toc>ul>li>a { - font-weight: 500; -} - -.odoc-toc li ul { - margin: 0px; -} - -.odoc-toc ul { - list-style-type: none; -} - -.odoc-toc ul li { - margin: 0; -} -.odoc-toc>ul>li { - margin-bottom: 0.3em; -} - -.odoc-toc ul li li { - border-left: 1px solid var(--toc-list-border); - margin-left: 5px; - padding-left: 12px; -} - -/* Mobile adjustements. */ - -@media only screen and (max-width: 95ex) { - .odoc-content { - margin: auto; - padding: 2em; - } - .odoc-toc { - position: static; - width: auto; - min-width: unset; - max-width: unset; - border: none; - padding: 0.2em 1em; - border-radius: 5px; - } -} - -/* Print adjustements. */ - -@media print { - body { - color: black; - background: white; - } - body nav:first-child { - visibility: hidden; - } -} - -/* Syntax highlighting (based on github-gist) */ - -.hljs { - display: block; - background: var(--code-background); - padding: 0.5em; - color: var(--color); - overflow-x: auto; -} - -.hljs-comment, -.hljs-meta { - color: #969896; -} - -.hljs-string, -.hljs-variable, -.hljs-template-variable, -.hljs-strong, -.hljs-emphasis, -.hljs-quote { - color: #df5000; -} - -.hljs-keyword, -.hljs-selector-tag { - color: #a71d5d; -} - -.hljs-type, -.hljs-class .hljs-title { - color: #458; - font-weight: 500; -} - -.hljs-literal, -.hljs-symbol, -.hljs-bullet, -.hljs-attribute { - color: #0086b3; -} - -.hljs-section, -.hljs-name { - color: #63a35c; -} - -.hljs-tag { - color: #333333; -} - -.hljs-attr, -.hljs-selector-id, -.hljs-selector-class, -.hljs-selector-attr, -.hljs-selector-pseudo { - color: #795da3; -} - -.hljs-addition { - color: #55a532; - background-color: #eaffea; -} - -.hljs-deletion { - color: #bd2c00; - background-color: #ffecec; -} - -.hljs-link { - text-decoration: underline; -} - -/*--------------------------------------------------------------------------- - Copyright (c) 2016 The odoc contributors - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - ---------------------------------------------------------------------------*/ From 942b0a81175a84a27e922c4fa4577209f883362f Mon Sep 17 00:00:00 2001 From: Hernouf Mohamed Date: Tue, 18 Jan 2022 17:25:54 +0100 Subject: [PATCH 73/73] Adding to gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 4e78e7014e..d410766660 100644 --- a/.gitignore +++ b/.gitignore @@ -42,4 +42,4 @@ lib/gwlib.ml hd/etc/version.txt *~ /_opam -static/doc \ No newline at end of file +doc/doc \ No newline at end of file