home *** CD-ROM | disk | FTP | other *** search
/ The AGA Experience 2 / agavol2.iso / rexx / scion2html.rexx < prev    next >
OS/2 REXX Batch file  |  1995-09-27  |  79KB  |  2,114 lines

  1. /* © Harold H. Ipolyi        11 June 1994, 1995
  2. ======================README======================
  3. Short:    WWW HTML's from Scion Genealogy dbs's
  4. Uploader: ipolyi@pat.mdc.com (Harold H. Ipolyi)
  5. Author:   Harold H. Ipolyi
  6. Type:     util/rexx
  7. LastRev:  24 Sep 1995
  8. _____________________________________________________________________________
  9.  
  10.  Scion Genealogist © Rob Akins (biz/dbase/Scion.lha) is comprehensive,
  11.  easy to use, and provides Arexx ports for extracting data.
  12. _____________________________________________________________________________
  13.  
  14.  Scion2html.rexx can repeatedly and painlessly recreate HTML files from
  15.  entries in Scion data bases for cross-platform viewing via Mosaic, etc.
  16.  
  17.  Scion2html.rexx can also create AmigaGuide style ".guide" hypertexts
  18. _____________________________________________________________________________
  19.  
  20.  GfxCon © Dirk Farin (gfx/conv/gfxcon.lha) is used to make Thumbnails
  21.  from Scion data base pictures as links to Picture Albums
  22. _____________________________________________________________________________
  23.  
  24.  an interesting example Genealogy is included: see after [Release History]
  25. _____________________________________________________________________________
  26.  
  27. Prerequisites:    ScionGenealogist V 4.07+ © Rob Akins
  28.         ARexx (of course :)
  29.         rexxsupport.library
  30.         rexxarplib.library
  31.         HTML/WWW browser (AMosaic, Mosaic, HotJava, ... )
  32.  
  33.      also:        (to incorporate and display in-line pictures)
  34.         GfxCon V1.7+ © Dirk Farin ( in: Sys:Tools)
  35.         Amiga OS 3.0+ for displaying picture datatypes
  36. _____________________________________________________________________________
  37.  
  38.  to install: just drag Scion2html.rexx & its ICON into REXX:
  39.  
  40.     however: can be executed from anywhere by double-clicking the ICON
  41.  
  42. ======================README======================
  43.  
  44.      PICTURES from [P|F]P{IRN}.DBNAME are links to Picture Albums ( ® )
  45.                   (please see PP & FP Notes)
  46.  
  47. Tested:
  48. |¯¯¯¯¯¯¯¯¯¯¯¯¯|    on Amiga3000 Kickstart v.37.175 Workbench v.38.35
  49. |    assume   |    &  Amiga3000 Kickstart v.40.68  Workbench v.40.42
  50. |  TradeMarks |    w/ ScionGenealogist V 3.06 & Mosaic1.2NoNet
  51. |      &      |    w/ ScionGenealogist V 3.13 & Mosaic1.3betaAmitcp
  52. |  CopyRights |    w/ ScionGenealogist V 4.07 & Mosaic2.0Prerelease
  53. |     as      |
  54. | appropriate |    HTML file compatibility tested on: AMosaic, HotJava,
  55. |_____________|    NCSA Mosaic (Sun), Netscape (Sun), Netscape (Mac)
  56.  
  57. Bugs:        If a new Thumbnail format is selected, the user must
  58.         manually edit the Picture Album files to reflect the
  59.         new Thumbnail suffixes.       (It is assumed that the
  60.         Picture Album files may have been  User  modified and
  61.         must therefore be protected against auto-regeneration)
  62.  
  63. Release History:
  64.  
  65.  11 Jun 1994 · ScionToMosaic.rexx for ScionGenealogist V 3.06
  66.  
  67.  19 Jun 1994 · MakeDir(Gdir) fixed; extra comments processed.
  68.  
  69.  25 Jun 1994 · Fixed descenders; Women in List italicised
  70.              · updated for ScionGenealogist V 3.13
  71.  
  72.   3 Sep 1994 · Replaces occurrences of "<ScionIRN>" by NAMES from DB
  73.              ·   e.g. Replaces <101> by Iam Onehundredone, Jr.
  74.              · Added Family Info file processing; Ancestor trees
  75.              · Added descendant charts
  76.              · Women italicised; men boldface everywhere
  77.              · Added creation of a textual file "GenealogyOf..."
  78.  
  79.   1 Mar 1995 · cleaned up bugs in creation of textual files
  80.  
  81.   6 Jun 1995 · renamed ScionToMosaic to Scion2html
  82.              ·   (somehow it kept winding up in "music" on AmiNet)
  83.              · date format in "ancestors" section normalized
  84.              · images used as links to picture albums (see
  85.              ·  PP & FP Notes) and links to pictures
  86.              · GfxCon >V1.5 used for picture copying and reducing
  87.              · recoded for DOS/Windows restricted 8.3 file names
  88.  
  89.  26 Jun 1995 · A little comments cleanup after the last changes
  90.              · skip remaking of files when unnecessary
  91.              · another new wrinkle for one of the users:
  92.              ·     special file name prefixes ( GenPrefix )
  93.  
  94.   1 Jul 1995 · added graphics to Ancestors charts
  95.              · allow family picture album sans family info file
  96.              · Thumbnail size now user settable ( at line 3 )
  97.  
  98.   5 Jul 1995 · (more info) » ( ¶ )
  99.              · (family info) » ( ¶ )
  100.              · (Picture Album) » ( ® )
  101.              · (¶) (®) glyphs added to Ancestor, Descendant charts
  102.              · Thumbnail format {GIF|JPEG} now user settable
  103.              ·  ( suffix still .gif in all cases )
  104.  
  105.   1 Aug 1995 · updated for release with ScionGenealogist V 4.07
  106.              · set correct stack size (21000) for GfxCon
  107.              · JPEG now the default Thumbnail format
  108.              ·     (smaller files, no © problems, looks better)
  109.              · changing of configuration added
  110.              · configuration now saved in S:Scion2html.Config
  111.  
  112.  12 Aug 1995 · fix some bugs that creeped in with updated to Scion4.07
  113.              · handling of more of the new ScionV4.07 data fields
  114.              · using CheckForReplacement to create all anchors
  115.              · changed appearance of family & descendant charts
  116.              · configuration is displayed at startup
  117.  
  118.  24 Sep 1995 · ".guide" style hypertext generation added
  119.              ·  Guide picture VIEWER set to MultiView for OS => 3.0
  120.              · person information now in person.[array]
  121.              · initial settings now in flags.[array]
  122.              · verbose flag for extra progress reporting details
  123.              · bold flag for: male «boldface» & female «italic»
  124.              · removed undocumented buggy feature of replacing ocurrences
  125.              ·  of [ScionIRN] (now only replaces ocurrences of <ScionIRN>)
  126.              · fixed a GenPrefix init bug (couldn't reset back to null)
  127.              · 
  128.  
  129.  (: "uudecode Scion2html.rexx" <- extracts an interesting Genealogy :)
  130.  (:  hint: compare the names of the GreatGrandParents on both sides :)
  131.  
  132.    ( start a shell                  )
  133.    ( cd work:                       ) some work directory
  134.    ( uudecode Rexx:Scion2html.rexx  ) whatever uudecode equiv you use
  135.    ( run Scion Samms                ) load data base into Scion
  136.    ( rx Scion2html.rexx Normal      ) in shell back on WB screen
  137.  
  138.  « the following can be safely left here »
  139.  
  140. begin 755 Samms
  141. M4V-I;VX`-"XP,```3@``%``)```@0P5%9&ET``56:65W``9!1$%-4P`%0T%)U
  142. M3@`%04U%4P`*JU5.2TY/5TZ[``E/3$U35$5!1``&4T%-35,``0`!``(@``(@(
  143. M``(@``(@``(@```!``$!``D&4T%-35,`!U9I<F=I;``"30`!``$``0`6(D9IF
  144. M<G-T($QE;G-M86X@4V%M;7,B``$`*BAD97-C96YD960@9G)O;2!O;FQY(#0@F
  145. M1W)E871'<F%N9%!A<F5N=',I`#A3;VQA<FEA;B!#;W5N8VEL;&]R('P@4')ES
  146. M<VED96YT(&]F('1H92!'86QA8W1I8R!#;W5N8VEL`#]A;&UO<W0M='=I;B!O/
  147. M9B!T=VEN<R`\-CX@)B`\-SXL(&AI<R`B<75A9')U<&QE('-E8V]N9"!C;W5S]
  148. M:6YS(@``````+D-H+C@@;V8@(D9I<G-T($QE;G-M86XB(&)Y($4N($4N(%-M[
  149. M:71H+"!0:"Y$+@`!``$``0`!``$```(``P$``09304U-4P`02F%M97,@06QEN
  150. M>&%N9&5R``)-``$``0`!``$``0`!``$`&V]N;'D@8VAI;&0@;V8@/#@^(&%N/
  151. M9"`\,30^```````N0V@N."!O9B`B1FER<W0@3&5N<VUA;B(@8GD@12X@12X@R
  152. M4VUI=&@L(%!H+D0N``$``0`!``$``0```P`%`0`!"4],35-414%$``9387)AG
  153. M:``"1@`!``$``0`!``$``0`!`!QO;FQY(&-H:6QD(&]F(#PQ,CX@86YD(#PQ+
  154. M,#X``````"Y#:"XX(&]F(")&:7)S="!,96YS;6%N(B!B>2!%+B!%+B!3;6ET:
  155. M:"P@4&@N1"X``0`!``$``0`!```$``8!``()3TQ-4U1%040`!4IO:&X``DT`C
  156. M`0`!``$``0`!``$``0`<;VYL>2!C:&EL9"!O9B`\,3,^(&%N9"`\,3$^````+
  157. M```N0V@N."!O9B`B1FER<W0@3&5N<VUA;B(@8GD@12X@12X@4VUI=&@L(%!H8
  158. M+D0N``$``0`!``$``0``!0`$`0`"!E-!34U3``9)<F5N90`"1@`!``$``0`!]
  159. M``$``0`!`!MO;FQY(&-H:6QD(&]F(#PY/B!A;F0@/#$U/@``````+D-H+C@@^
  160. M;V8@(D9I<G-T($QE;G-M86XB(&)Y($4N($4N(%-M:71H+"!0:"Y$+@`!``$`;
  161. M`0`!``$```8``@`)3TQ-4U1%040`!T=E;W)G90`"30`!``$``0`!``$``0`!C
  162. M`#94=VEN(&)R;W1H97(@;V8@/#<^.R`B<75A9')U<&QE('-E8V]N9"!C;W5SZ
  163. M:6XB(&]F(#PQ/@``````+D-H+C@@;V8@(D9I<G-T($QE;G-M86XB(&)Y($4N5
  164. M($4N(%-M:71H+"!0:"Y$+@`!``$``0`!``$```<``@`)3TQ-4U1%040`!%)A#
  165. M>0`"30`!``$``0`!``$``0`!`#94=VEN(&)R;W1H97(@;V8@/#8^.R`B<75A&
  166. M9')U<&QE('-E8V]N9"!C;W5S:6XB(&]F(#PQ/@``````+D-H+C@@;V8@(D9I@
  167. M<G-T($QE;G-M86XB(&)Y($4N($4N(%-M:71H+"!0:"Y$+@`!``$``0`!``$`8
  168. M``@`!P$``P9304U-4P`%0FEL;``"30`!``$``0`!``$``0`!`#-4=VEN(&)R!
  169. M;W1H97(@;V8@/#D^+"!S:7-T97)S(#PQ,#X@)B`\,3$^(&%R92!T=VEN<P``M
  170. M````&"AN;R!F:7)S="!N86UE(&EN(&)O;VLI``$``0`!``$``0``"0`'`0`$K
  171. M!E-!34U3``57:6QL``)-``$``0`!``$``0`!``$`,U1W:6X@8G)O=&AE<B!OT
  172. M9B`\.#XL('-I<W1E<G,@/#$P/B`F(#PQ,3X@87)E('1W:6YS```````8*&YO8
  173. M(&9I<G-T(&YA;64@:6X@8F]O:RD``0`!``$``0`!```*``<!``4&4T%-35,`7
  174. M!4=I;&P``D8``0`!``$``0`!``$``0`R5'=I;B!S:7-T97(@;V8@/#$Q/BP@G
  175. M8G)O=&AE<G,@/#@^("8@/#D^(&%R92!T=VEN<P``````&"AN;R!F:7)S="!NT
  176. M86UE(&EN(&)O;VLI``$``0`!``$``0``"P`'`0`&!E-!34U3``5*:6QL``)&;
  177. M``$``0`!``$``0`!``$`,E1W:6X@<VES=&5R(&]F(#PQ,#XL(&)R;W1H97)SZ
  178. M(#PX/B`F(#PY/B!A<F4@='=I;G,``````!@H;F\@9FER<W0@;F%M92!I;B!BW
  179. M;V]K*0`!``$``0`!``$```P`"`$`!0E/3$U35$5!1``%2F%C:P`"30`!``$`"
  180. M`0`!``$``0`!`#14=VEN(&)R;W1H97(@;V8@/#$S/BP@<VES=&5R<R`\,30^\
  181. M("8@/#$U/B!A<F4@='=I;G,``````!@H;F\@9FER<W0@;F%M92!I;B!B;V]K;
  182. M*0`!``$``0`!``$```T`"`$`!@E/3$U35$5!1``%36%C:P`"30`!``$``0`!`
  183. M``$``0`!`#14=VEN(&)R;W1H97(@;V8@/#$R/BP@<VES=&5R<R`\,30^("8@?
  184. M/#$U/B!A<F4@='=I;G,``````!@H;F\@9FER<W0@;F%M92!I;B!B;V]K*0`!?
  185. M``$``0`!``$```X`"`$``PE/3$U35$5!1``$1F%Y``)&``$``0`!``$``0`!R
  186. M``$`-%1W:6X@<VES=&5R(&]F(#PQ-3XL(&)R;W1H97)S(#PQ,CX@)B`\,3,^\
  187. M(&%R92!T=VEN<P``````&"AN;R!F:7)S="!N86UE(&EN(&)O;VLI``$``0`!!
  188. M``$``0``#P`(`0`$"4],35-414%$``1-87D``D8``0`!``$``0`!``$``0`TN
  189. M5'=I;B!S:7-T97(@;V8@/#$T/BP@8G)O=&AE<G,@/#$R/B`F(#PQ,SX@87)E>
  190. M('1W:6YS```````8*&YO(&9I<G-T(&YA;64@:6X@8F]O:RD``0`!``$``0`!K
  191. M```0```!``<&4T%-35,`!T%L8F5R=``"30`!``$``0`!``$``0`!``$`````7
  192. M`"Y#:"XX(&]F(")&:7)S="!,96YS;6%N(B!B>2!%+B!%+B!3;6ET:"P@4&@N&
  193. M1"X``0`!``$``0`!```1```!``@)3TQ-4U1%040`"$-H97-T97(``DT``0`!:
  194. M``$``0`!``$``0`!```````N0V@N."!O9B`B1FER<W0@3&5N<VUA;B(@8GD@O
  195. M12X@12X@4VUI=&@L(%!H+D0N``$``0`!``$``0``$@```0`'!D%$04U3``=!B
  196. M9&5L;&4``D8``0`!``$``0`!``$``0`!```````4*&YO="!N86UE9"!I;B!B!
  197. M;V]K*0`!``$``0`!``$``!,```$`"`5#04E.``A#86UI;&QE``)&``$``0`!]
  198. M``$``0`!``$``0``````%"AN;W0@;F%M960@:6X@8F]O:RD``0`!``$``0`!G
  199. M```4``D`!E-!34U3``E6:7)G:6QI80`"1@`!``$``0`!``$``0`!``$`````T
  200. M``$``0`!``$``0`!```!``(``P$``0$``0`!``$```````$``0`!``$``0``7
  201. M`0```@`$``4"``8`!P$``0`!``$```````$``0`!``$``0```0```P`(``X!_
  202. M``(!``$``0`!```````!``$``0`!``$```$```0`"0`/`0`%`0`!``$``0``R
  203. M`````0`!``$``0`!```!```%``P`"@$``P$``0`!``$```````$``0`!``$`M
  204. M`0```0``!@`-``L!``0!``$``0`!```````!``$``0`!``$```$```<`$``28
  205. M!``(``D`"@`+`0`!``$``0```````0`!``$``0`!```!```(`!$`$P0`#``-]
  206. M``X`#P$``0`!``$```````$``0`!``$``0```0``"0`!```!`!0!``$``0`!*
  207. 2```````!``$``0`!``$```$`&
  208. ``
  209. end
  210. size 2988
  211.  
  212.   -----------------------------------------------------------------
  213.  | Conventions that I followed in my ScionGenealogist data base:   |
  214.  |                                                                 |
  215.  | ·  lastnames kept pure (no honorifics, Jr's, III's )            |
  216.  |                                                                 |
  217.  | ·  given names have any and all honorifics AFTER a COMMA        |
  218.  |                                                                 |
  219.  |  for example:  LastName      FirstNames, honorifics             |
  220.  |                                                                 |
  221.  |                BAUER-GAUSS   Joseph, Dr.                        |
  222.  |                DAGLEY        Richard Kelley, Jr.                |
  223.  |                                                                 |
  224.  |-----------------------------------------------------------------|
  225.  |                                                                 |
  226.  |  For a name change (NOT maidenname > marriedname), try this:    |
  227.  |                New           Birth Name > Changed To, Ph. D.    |
  228.  |     which lists as: Birth Name > Changed To New, Ph. D.         |
  229.  |                                                                 |
  230.   -----------------------------------------------------------------
  231. «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
  232. »«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«
  233. «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
  234. »«                                                                »«
  235. «» GetLastName: PROCEDURE at end of script capitalizes Last Names »«
  236. «» -------------------------------------------------------------  «»
  237. »« | it can also be used to handle "non-conforming" Last Names |  »«
  238. «» |                e.g. "MAC ISAAC" --> "MacISAAC"            |  «»
  239. »« |                     "VON NUEMANN" --> "VonNuemann"        |  »«
  240. «» -------------------------------------------------------------  «»
  241. »« BUT: you must add the additional tests yourself (it's easy!)   »«
  242. «»                                                                «»
  243. «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
  244. »«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«
  245. «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
  246.  |-----------------------------------------------------------------|
  247.  |                                                                 |
  248.  | · if Death Date is blank; Death Place can be a COMMENT field    |
  249.  |                                            e.g. Phone #         |
  250.  | · if Burial Date is blank; Burial Place can be a COMMENT field  |
  251.  |                                            e.g. Address         |
  252.   -----------------------------------------------------------------
  253.  
  254.  * 'rx Scion2html.rexx Normal' automagically [re]creates a .htm file for
  255.  * each person in your ScionGenealogist data base; following the TEMPLATE:
  256.  
  257. ############# begin genealogytemplate.html ####################################
  258. <TITLE>Person Data Sheet</TITLE>
  259. <PRE><TT>
  260. <A href="Person#a.html"><img src="Person#I.jpg"></A>
  261. <B>Person</B> (<A HREF="Person#I.html"> ¶ </A>) (<A href="Person#a.html"><B> ® </B></A>) (<A href="Genealogy/GenealogyFile.html"><B>List of Persons.</B></A>)
  262. Born: birthdate * birthplace <BR>
  263. Died: deathdate + deathplace . Buried: burialplace <BR>
  264. <HR>
  265. <H2>List of Persons in data base.</H2><P>
  266. <A HREF="Person#.html"><B>malePerson</B></A> * birthdate + deathdate <A HREF="Father.html"><B>Father</B></A>_&_<A HREF="Mother.html"><I>Mother</I></A><BR>
  267. <A HREF="Person#.html"><I>femalePerson</I></A> * birthdate + deathdate <A HREF="Father.html"><B>Father</B></A>_&_<A HREF="Mother.html"><I>Mother</I></A><BR>
  268. <HR>
  269. <H3>Immediate Family of <I>Person</I></H3> ( Parents, Siblings, Spouse, and Children )
  270.   <A HREF="Father.html"><B>Father</B></A>_&_<A HREF="Mother.html"><I>Mother</I></A> & mdate @ mplace
  271.   |            (<A HREF="Family#I.html"> ¶ </A>) (<A href="Family#a.html"><B> ® </B></A>)
  272.   |_____ <A HREF="sibling1.html">sibling1</A> * sibling1birthdate + sibling1deathdate
  273.   |_____ <A HREF="siblingN.html">siblingN</A> * siblingNbirthdate + siblingNdeathdate
  274.   |             
  275.   <b>Person</b>_&_<A HREF="Spouse1.html"><I>Spouse1</I></A> & m1date @ m1place
  276.   |  |  |            (<A HREF="Family#I.html"> ¶ </A>) (<A href="Family#a.html"><B> ® </B></A>)
  277.   |  |  |_____ <A HREF="m1child1.html"><I>m1child1</I></A> * m1child1birthdate + m1child1birthdate
  278.   |  |  |_____ <A HREF="m1childN.html"><B>m1childN</B></A> * m1childNbirthdate + m1childNbirthdate
  279.   |  |
  280.   |  |_&_<A HREF="Spouse2.html"><I>Spouse2</I></A> & m2date @ m2place
  281.   |    |            (<A HREF="Family#I.html"> ¶ </A>) (<A href="Family#a.html"><B> ® </B></A>)
  282.   |    |_____ <A HREF="m2child1.html"><B>m2child1</B></A> * m2child1birthdate + m2child1birthdate
  283.   |    |_____ <A HREF="m2childN.html"><I>m2childN</I></A> * m2childNbirthdate + m2child2birthdate
  284.   |
  285.   |_&_<A HREF="Spousen.html"><I>Spousen</I></A> & mNdate @ mNplace
  286.     |            (<A HREF="Family#I.html"> ¶ </A>) (<A href="Family#a.html"><B> ® </B></A>)
  287.     |_____ <A HREF="mNchild1.html"><I>mNchild1</I></A> * mNchild1birthdate + mNchild1birthdate
  288.     |_____ <A HREF="mNchildN.html"><I>mNchildN</I></A> * mNchildNbirthdate + mNchildNbirthdate
  289. <HR>
  290. Ancestors
  291.           - <A HREF="GreatGrandFather.html"><B>GreatGrandFather</B></A> (FFF) * birthdate + deathdate
  292.       - <A HREF="GrandFather.html"><B>GrandFather</B></A> (FF) * birthdate + deathdate
  293.           - <A HREF="GreatGrandMother.html"><I>GreatGrandMother</I></A> (FFM) * birthdate + deathdate
  294.   - <A HREF="Father.html"><B>Father</B></A> (F) * birthdate + deathdate
  295.           - <A HREF="GreatGrandFather.html"><B>GreatGrandFather</B></A> (FMF) * birthdate + deathdate
  296.       - <A HREF="GrandMother.html"><I>GrandMother</I></A> (FM) * birthdate + deathdate
  297.           - <A HREF="GreatGrandMother.html"><I>GreatGrandMother</I></A> (FMM) * birthdate + deathdate
  298. Person * birthdate + deathdate
  299.           - <A HREF="GreatGrandFather.html"><B>GreatGrandFather</B></A> (MFF) * birthdate + deathdate
  300.       - <A HREF="GrandFather.html"><B>GrandFather</B></A> (MF) * birthdate + deathdate
  301.           - <A HREF="GreatGrandMother.html"><I>GreatGrandMother</I></A> (MFM) * birthdate + deathdate
  302.   - <A HREF="Mother.html"><I>Mother</I></A> (M) * birthdate + deathdate
  303.           - <A HREF="GreatGrandFather.html"><B>GreatGrandFather</B></A> (MMF) * birthdate + deathdate
  304.       - <A HREF="GrandMother.html"><I>GrandMother</I></A> (MM) * birthdate + deathdate
  305.           - <A HREF="GreatGrandMother.html"><I>GreatGrandMother</I></A> (MMM) * birthdate + deathdate
  306. <HR>
  307. Descendants
  308.   <B>Person</B> * birthdate
  309.   &_<A HREF="Spouse1.html"><I>Spouse1</I></A> * birthdate
  310.    | <A HREF="m1child1.html"><I><B>m1child1</B></I></A> * m1child1birthdate
  311.    | <A HREF="m1child.html"><B><B>m1childN</B></B></A> * m1childNbirthdate
  312.   &_<A HREF="Spouse2.html"><I>Spouse2</I></A> * birthdate
  313.    | <A HREF="m2child1.html"><B>m2child1</B></A> * m2child1birthdate
  314.    | <A HREF="m2childN.html"><I>m2childN</I></A> * m2childNbirthdate
  315.    | &_<A HREF="m2childNSpouse1.html"><I>m2childNSpouse1</I></A>
  316.    |  | <A HREF="m2childNchild1.html"><B>m2childNchild1</B></A>
  317.   &_<A HREF="Spousen.html"><I>Spousen</I></A> * birthdate
  318.    | <A HREF="mNchild1.html"><I>mNchild1</I></A> * mNchild1birthdate
  319.    | <A HREF="mNchildN.html"><I>mNchildN</I></A> * mNchildNbirthdate
  320. <HR>
  321.      a template to represent Genealogy data in HTML hypertext.
  322.  * replace all ocurrences of each appropriate ITEM with ACTUAL DATA
  323.      e.g. search-replace-all Person with: My Name
  324.      e.g. query-search-replace Mother with: My Mother's Name
  325.  * judiciously edit .htm file names in anchors
  326.  * add/remove lines for children, siblings, spouses as necessary
  327. </TT></PRE>
  328. </HTML>
  329. ############### end genealogytemplate.html ###################################
  330.  
  331.  * In an HTML file (maybe HOME PAGE) have an anchor pointing to GenealogyFile:
  332.  
  333.  * ( see the hint at the end of a NORMAL run or specify ANCHOR )
  334. _____________________________________________________________________________
  335.  
  336.  * The PN{IRN}.DBNAME files are used to generate the " ¶ " files.
  337.  
  338.  * Whenever the PN{IRN}.DBNAME is changed or replaced, the corresponding
  339.  * " ¶ " file will be updated if 'rx Scion2html.rexx {IRN}' is re-run.
  340.  
  341.  * PP & FP Notes: (personal & family pictures; picture albums " ® ")
  342.  * ScionGenealogist names pictures as;
  343.  *      PP{IRN}.DBNAME (personal) and FP{mFGRN}.DBNAME (family)
  344.  * {P|F}P{IRN|mFGRN}.DBNAME now used as pictures & links.
  345.  *    GfxCon is used to copy/reduce jpegs from {P|F}P{IRN|mFGRN}.DBNAME
  346.  *    reductions are anchors pointing to HTML's for pictures albums
  347.  *    reductions in pictures albums are anchors pointing to pictures
  348.  *  picture albums will not be overwritten; they may be updated with
  349.  *    additional pictures; links to other pictures, etc.
  350.  
  351.  * Whenever picture {P|F}P{IRN|mFGRN}.DBNAME is changed or replaced,
  352.  *  the corresponding images will be updated
  353.  
  354.  * {P|F}P{IRN|mFGRN}.DBNAME may be any legal GfxCon input picture FORMAT:
  355.  * (ILBM,RGB8,PCX,BMP,RLE8,TIFF,Targa,LBM,RGBN,IMG,RLE4,GIF,JPEG,RGB-Raw)
  356. */
  357.  
  358.             /*   some Intitializations = default        */
  359. flags.Thumbnail = 350    /* Thumbnail maximum dimensions            */
  360. flags.Thmbfmt = "JPEG"    /* Thumbnail format { GIF | JPEG }        */
  361. flags.MakeText = 0    /* 1 to also make printable ASCII text file    */
  362. flags.MakeGuide = 0    /* 1 to also make ".guide" hypertext files    */
  363.  flags.verbose = 0    /* 1 for verbose progress reports        */
  364. flags.bold = 0        /* 0 male «boldface» & female «italic»        */
  365. flags.GenPrefix = ""    /* needs only be set for specific circumstances 
  366.              ( if this makes no sense, you don't need it :) */
  367.  
  368. sayASCII = ' plain ASCII printable files'
  369. sayguide = ' ".guide" hypertext files'
  370. bolditalic = ' using boldface » men and italic » women'
  371. progress = ' progress reports'
  372.  
  373. GoodScion2html = Open('Scion2html','S:Scion2html.Config','r')
  374.  
  375. if GoodScion2html then do
  376.  Mdir = readln('Scion2html')
  377.  flags.Thumbnail = readln('Scion2html')
  378.  flags.Thmbfmt = readln('Scion2html')
  379.  flags.coumpound = readln('Scion2html')
  380.  flags.MakeGuide = bittst(flags.coumpound,2)
  381. /* flags.verbose */
  382.  flags.bold = bittst(flags.coumpound,1)
  383.  flags.MakeText = bittst(flags.coumpound,0)
  384.  flags.GenPrefix = readln('Scion2html')
  385.  Close('Scion2html')
  386.  
  387.  say '                       '
  388.  say '   S:Scion2html.Config  settings:'
  389.  say '  output destination: 'Mdir
  390.  end
  391.  
  392. else do
  393.  say '           '
  394.  say '   default  settings:'
  395.  say '  output destination: (will be set later)'
  396.  end
  397.  
  398. say '  Thumbnail: 'flags.Thmbfmt' max 'flags.Thumbnail'x'flags.Thumbnail
  399. if flags.GenPrefix ~= '' then say '  GeneralPrefix = 'flags.GenPrefix
  400.  else say '  GeneralPrefix = {default} [special circumstance only]'
  401. if flags.MakeGuide then say ' also make'sayguide
  402.  else say '  skip making'sayguide
  403. if flags.MakeText then say ' also make'sayASCII
  404.  else say '  skip making'sayASCII
  405. if ~flags.bold then say ' 'bolditalic
  406.  else say ' NOT'bolditalic
  407. if flags.verbose then say ' verbose'progress
  408.  else say '  minimal'progress' (during normal runs)'
  409. say ' '
  410.  
  411. if flags.GenPrefix = "" then flags.GenPrefix = "GENEAFI"
  412.  
  413. /* add libraries */
  414. libs = 'rexxsupport.library rexxarplib.library'
  415. DO i = 1 TO Words(libs)
  416.  lib = Word(libs,i)
  417.  if ~Show('Lib',lib) then do
  418.   if EXISTS('LIBS:'lib) then call addlib lib, 0, -30
  419.   else do
  420.    'message "ERROR: cannot find' lib 'in LIBS:"'
  421.    AskExit()
  422.    end
  423.   end
  424.  end i
  425.  
  426. Address "SCIONGEN"    /* Point at Scion Genealogist port */
  427. options RESULTS
  428.  
  429. if Show(p,'SCIONGEN') then do
  430.  'GETDBNAME'     /* Issue GET DB NAME command to Scion Genealogist */
  431.  DBNAME = RESULT
  432.  'GETTOTALIRN'
  433.  TOTALIRN = RESULT
  434.  if TOTALIRN = 0 then do
  435.  SAY '                                                                  '
  436.  SAY '   Scion Genealogist is currently displaying an EMPTY data base!  '
  437.  SAY '                                                                  '
  438.  SAY ' '
  439.  AskExit()
  440.   end
  441.  end
  442.  
  443. else do
  444.  SAY '                                                               '
  445.  SAY '   Scion Genealogist is NOT currently displaying a data base:  '
  446.  SAY '                                                               '
  447.  SAY ' Please start Scion; load desired data base; then try again... '
  448.  SAY '                                                               '
  449.  SAY ' '
  450.  AskExit()
  451.  end
  452.  
  453. PARSE ARG flags.target
  454. flags.target = Upper(strip(flags.target,,'"')) /* just in case, remove errant quotes */
  455.  
  456. origThumbnail = flags.Thumbnail
  457. origThumbformat = flags.Thmbfmt
  458.  
  459. blanks = '                                                        '
  460.  
  461. flags.DoPictures = CheckGfxCon()
  462.  
  463. DO WHILE flags.target = '' | flags.target = '?' | flags.target = '/'
  464.  SAY ' '
  465.  if flags.target = '?' | flags.target = '/' then do
  466.   SAY ' please send comments, questions to: ipolyi@pat.mdc.com'
  467.   SAY '                                    or:'
  468.   SAY '             Scion2html.rexx  ©  Harold H. Ipolyi '
  469.   SAY '                                  P.O.Box 891206 '
  470.   SAY '                                  Houston, Tx 77289-1206'
  471.   SAY '   ____________________________________________________________'
  472.   SAY '  /                                                            \'
  473.   SAY ' / to [re]create HTML hypertext from ScionGenealogist data base \'
  474.   SAY ' \ also, optionally, AmigaGuide style hypertexts or plain ASCII /'
  475.   SAY '  \____________________________________________________________/'
  476.   SAY ' '
  477.   SAY '                                 '
  478.   SAY ' defaults: may be changed; RETURN accepts [value]'
  479.   svMdir = Mdir
  480.   SAY '                    'substr(blanks,1,length(DBNAME)+3)''
  481.   call writech(stdout,' HTMLs in directory  'DBNAME'G  within ['Mdir'] ')
  482.   PULL Mdir
  483.   if Mdir = '' then Mdir = svMdir
  484.   SAY ' '
  485.   svGeneralPrefix = flags.GenPrefix
  486.   call writech(stdout,' General Prefix ')
  487.   if flags.GenPrefix ~= 'GENEAFI' then call writech(stdout,'(. to reset) ')
  488.   call writech(stdout,' = [')
  489.   if flags.GenPrefix ~= 'GENEAFI' then call writech(stdout,flags.GenPrefix)
  490.   call writech(stdout,'] ')
  491.   PARSE PULL flags.GenPrefix
  492.   if flags.GenPrefix = '' then flags.GenPrefix = svGeneralPrefix
  493.   else if flags.GenPrefix = '.' then flags.GenPrefix = 'GENEAFI'
  494.   SAY ' '
  495.   if ~flags.MakeGuide then writech(stdout,' NOT')
  496.   else writech(stdout,' Also')
  497.   writech(stdout,' making'sayguide'; ')
  498.   call writech(stdout,' acceptable? [yes] ')
  499.   PULL answer
  500.   if answer ~= '' then do
  501.    if substr(answer,1,1) = 'N' then flags.MakeGuide = ~flags.MakeGuide
  502.    end
  503.   SAY ' '
  504.   if ~flags.MakeText then writech(stdout,' NOT')
  505.   else writech(stdout,' Also')
  506.   writech(stdout,' making'sayASCII'; ')
  507.   call writech(stdout,' acceptable? [yes] ')
  508.   PULL answer
  509.   if answer ~= '' then do
  510.    if substr(answer,1,1) = 'N' then flags.MakeText = ~flags.MakeText
  511.    end
  512.   SAY ' '
  513.   if flags.bold then writech(stdout,' NOT')
  514.   writech(stdout,bolditalic'; ')
  515.   call writech(stdout,' acceptable? [yes] ')
  516.   PULL answer
  517.   if answer ~= '' then do
  518.    if substr(answer,1,1) = 'N' then flags.bold = ~flags.bold
  519.    end
  520.   SAY ' '
  521.   if ~flags.verbose then writech(stdout,' minimal')
  522.   else writech(stdout,' verbose')
  523.   writech(stdout,progress'; ')
  524.   call writech(stdout,' acceptable? [yes] ')
  525.   PULL answer
  526.   if answer ~= '' then do
  527.    if substr(answer,1,1) = 'N' then flags.verbose = ~flags.verbose
  528.    end
  529.   if flags.DoPictures then do
  530.    SAY ' '
  531.    SAY '+-----------------------------------------------------------------+'
  532.    SAY '| NOTE: changing Thumbnail max dim or Thumbnail format will force |'
  533.    SAY '|       regeneration of all Thumbnail pictures. Just so you know! |'
  534.    SAY '+-----------------------------------------------------------------+'
  535.    SAY '|       If Thumbnail format is changed, Picture Albums must then  |'
  536.    SAY '|       be manually edited to reflect the new Thumbnail suffixes. |'
  537.    SAY '+-----------------------------------------------------------------+'
  538.    SAY ' '
  539.    svThumbnail = flags.Thumbnail
  540.    call writech(stdout,' Thumbnail max dim = ['flags.Thumbnail'] ')
  541.    PULL flags.Thumbnail
  542.    if ~IsNumeric(flags.Thumbnail) then flags.Thumbnail = svThumbnail
  543.    if flags.Thumbnail < 100 then flags.Thumbnail = 100
  544.    SAY ' '
  545.    svThumbformat = flags.Thmbfmt
  546.    call writech(stdout,' Thumbnail format = ['flags.Thmbfmt'] ')
  547.    PULL flags.Thmbfmt
  548.    if flags.Thmbfmt ~= 'GIF' & flags.Thmbfmt ~= 'JPEG' then flags.Thmbfmt = ''
  549.    if flags.Thmbfmt = '' then flags.Thmbfmt = svThumbformat
  550.    end
  551.   SAY ' '
  552.   end
  553.  
  554.  SAY '                                   '
  555.  SAY '  choices:   Note:  pressing RETURN accepts [value]'
  556.  SAY '        '
  557.  SAY '   Quit   '
  558.  SAY '       '
  559.  SAY '     ?      about Scion2html.rexx; also can change the settings shown above.'
  560.  SAY '                                              'substr(blanks,1,length(DBNAME)+2)''
  561.  SAY '  Normal    [re]make HTMLs for all persons in  'DBNAME'  data base {'TOTALIRN'}'
  562.  SAY '       '
  563.  SAY '     #      [re]make HTMLs for a specific person: { 1 .. 'TOTALIRN' }'
  564.  SAY '          '
  565.  SAY '  Anchors   hints for: <A href="?">'DBNAME'</A>'
  566.  SAY ' '
  567.  
  568.  SAY ' '
  569.  flags.target = 'Normal'
  570.  call writech(stdout,'['flags.target'] ')
  571.  
  572.  PULL flags.target
  573.  
  574.  if length(flags.target) > 1 & substr(flags.target,1,1) = ' ' then flags.target = substr(flags.target,2,length(flags.target))
  575.  if length(flags.target) > 7 then flags.target = substr(flags.target,1,7)
  576.  if flags.target = '' then flags.target = 'Normal'
  577.  if substr(flags.target,1,1) = '#' then do
  578.   flags.target = ''
  579.   SAY ' '                                    /* :) :) :) :) :) */
  580.   SAY '     NOT #! an actual number, like, you know, from the set { 1 .. 'TOTALIRN' }'
  581.   end
  582.  if flags.target = 'INFO' | flags.target = 'ABOUT' | flags.target = 'HELP' then flags.target = '?'
  583.  if IsNumeric(flags.target) then do
  584.   if flags.target > TOTALIRN | flags.target < 1 then do
  585.     SAY ' '
  586.     SAY '     Lousy shooting:'
  587.     SAY ' 'flags.target' is outside range of { 1 .. 'TOTALIRN' } of persons in data base  'DBNAME' '
  588.     SAY '     Clean your display, rinse your lenses, and try again!'
  589.     flags.target = ''
  590.    end
  591.   end
  592.  flags.target = Upper(strip(flags.target,,'"'))    /* just in case, remove errant quotes */
  593.  end
  594.  
  595. if ~Validtarget(flags.target) then PauseExit()
  596.  
  597. if substr(flags.target,1,1) = 'A' then flags.target = 'ANCHORS'
  598. if substr(flags.target,1,1) = 'N' then flags.target = 'NORMAL'
  599. if substr(flags.target,1,1) = 'T' then flags.target = 'TEST'
  600. if substr(flags.target,1,1) = 'Q' then flags.target = 'QUIT'
  601. if substr(flags.target,1,1) = 'R' then    /* create Scion2html.readme */
  602.  if Open('Scionreadme','ram:Scion2html.readme','w') then do
  603.   Open('Scion','rexx:Scion2html.rexx','r')
  604.   readme = 0
  605.   readmestring = '======================README======================'
  606.   DO While ~EOF('Scion')
  607.    line = ReadLn('Scion')
  608.    if readme then do
  609.     if line = readmestring then PauseExit()
  610.     WriteLn('Scionreadme',line)
  611.     end
  612.    if line = readmestring then readme = ~readme
  613.    end
  614.   end
  615.  else flags.target = 'QUIT'
  616.  
  617. /* SAY flags.target */
  618.  
  619. 'GETPROGVERSION'
  620. VERSION = RESULT
  621.  
  622. if VERSION < 4.07 then do
  623.  SAY ' '
  624.  say 'ERROR: Requires Scion VERSION = 4.07 (or greater)'
  625.  AskExit()
  626.  end
  627. else do
  628.  if exists("sys:utilities/multiview") then
  629.   flags.VIEWER = "sys:utilities/multiview"    /* Guide picture viewer    */
  630.  else do
  631.   if VERSION < 4.09 then flags.VIEWER = "display"
  632.   else do
  633.    'GETVIEWER'
  634.    flags.VIEWER = RESULT
  635.    end
  636.   end
  637. /* say 'Guide picture viewer = 'flags.VIEWER */
  638.  end
  639.  
  640. /* Get path to database so can locate any note files in same location */
  641. 'GETDBPATH'        /* new in Scion V 4.07 */
  642. DBPATH = RESULT
  643. DBPATH = CheckPathName(DBPATH)
  644.  
  645. /*
  646. SAY ' '
  647. Say ' Testing: is data base assignment of 'DBPATH||DBNAME' visible?'
  648. SAY ' '
  649. */
  650.  
  651. PRAGMA('w','n')
  652. if ~Exists(DBPATH||DBNAME) then do
  653.  SAY 'ERROR: Scion data base 'DBNAME' not found in: 'DBPATH
  654.  AskExit()
  655.  end
  656.  
  657. if ~GoodScion2html then do
  658.  Mdir = ''            /* where to put the directories? */
  659.  if Exists(DBNAME'G') then do    /* check current path */
  660.   Mdir = PRAGMA('d')        /* we're already there */
  661.   end
  662.  else do
  663.   Tdir = "RAM:"                /* RAM: */
  664.   if Exists('Work:') then Tdir = "Work:"    /* assume Work: */
  665.   SAY ' '                /* ask, with default prompted */
  666.   if flags.target ~= 'ANCHORS' then call writech(stdout,'Generate ')
  667.   call writech(stdout,'Directory 'DBNAME'G for HTML pages ')
  668.   if flags.target = 'ANCHORS' then call writech(stdout,'is ')
  669.   call writech(stdout,'in: ['Tdir'] ')
  670.   PULL Mdir
  671.   if Mdir = '' then Mdir = Tdir        /* default was accepted */
  672.   end
  673.  end
  674.  
  675. Mdir = CheckPathName(Mdir)
  676.  
  677. PRAGMA('w','w')
  678.  
  679. Gdir = Mdir||DBNAME'G'
  680. Tdir = ''
  681. if flags.MakeText then Tdir = Mdir||DBNAME'T'
  682. if flags.MakeGuide then Adir = Mdir||DBNAME'A'
  683.  
  684. flags.RemakeThumb = ( origThumbnail ~= flags.Thumbnail ) | ( origThumbformat ~= flags.Thmbfmt )
  685.  
  686. Open('Scion2html','S:Scion2html.Config','w')
  687. call writeln('Scion2html',Mdir)
  688. call writeln('Scion2html',flags.Thumbnail)
  689. call writeln('Scion2html',flags.Thmbfmt)
  690. call writeln('Scion2html',flags.MakeText + 2 * flags.bold + 4 * flags.MakeGuide)
  691. if flags.GenPrefix ~= 'GENEAFI' then call writeln('Scion2html',flags.GenPrefix)
  692. Close('Scion2html')
  693.  
  694. if flags.target = 'QUIT' then PauseExit()
  695.  
  696. if ~flags.bold then do
  697.  flags.htmlb = '<B>'
  698.  flags.htmlub = '</B>'
  699.  flags.htmli = '<I>'
  700.  flags.htmlui = '</I>'
  701.  end
  702. else do
  703.  flags.htmlb = ''
  704.  flags.htmlub = ''
  705.  flags.htmli = ''
  706.  flags.htmlui = ''
  707.  end
  708.  
  709. if flags.target ~= "ANCHORS" then do
  710.  if ~Makedir(Gdir) then do
  711.   SAY ' '
  712.   SAY 'ERROR: unable to create directory: 'Gdir
  713.   AskExit()
  714.   end
  715.  
  716.  if Tdir ~= '' then do
  717.   if ~Makedir(Tdir) then do
  718.    SAY ' '
  719.    SAY 'ERROR: unable to create directory: 'Tdir
  720.    AskExit()
  721.    end
  722.   end
  723.  
  724.  if flags.MakeGuide then do
  725.   if ~Makedir(Adir) then do
  726.    SAY ' '
  727.    SAY 'ERROR: unable to create directory: 'Adir
  728.    AskExit()
  729.    end
  730.   end
  731. /*
  732.  Say "Number of people in database " DBNAME " = " TOTALIRN
  733.  SAY ' '
  734. */
  735.  end
  736.  
  737. starttime = Time('e')
  738.  
  739. do i = 1 to TOTALIRN
  740.  person.gotten.i = 0    /* no persons have yet been gotten from "DBNAME" */
  741.  end
  742.  
  743. /* S:Scion2html.Config was here */
  744.  
  745. if IsNumeric(flags.target) then do
  746.  
  747.  GetPerComp(flags.target) /* GetPerComp gets basic info into person. array */
  748.  
  749.  pnumb = flags.target
  750.  
  751. /*
  752.  call writech(stdout,'HTMLs for: 'person.GETFULLNAME.pnumb'? ['yes'] ')
  753.  PULL answer
  754.  if answer = '' then answer = 'YES'
  755.  if substr(answer,1,1) ~= 'Y' then AskExit()
  756. */
  757.  call writech(stdout,'         HTMLs')
  758.  if flags.MakeGuide then
  759.   call writech(stdout,' & guides')
  760.  if flags.MakeText then
  761.   call writech(stdout,' & ASCIItextfile')
  762.  call writeln(stdout,' for: 'person.GETFULLNAME.pnumb)
  763.  
  764.  starttime = Time('e')
  765.  
  766.  if flags.target <= TOTALIRN then do
  767. /*
  768.   Say 'Processing person ' flags.target ' of ' TOTALIRN ' in database ' DBNAME
  769. */
  770.   if Tdir ~= '' then Open('GenealogyText',Tdir'/G'flags.target,'w')
  771.   flags.verbose = 1
  772.   CALL MakeOne(flags.target)
  773.   if Tdir ~= '' then Close('GenealogyText')
  774.   end
  775.  end
  776.  
  777. else do
  778.  
  779.  flags.target = Upper(flags.target)
  780.  
  781.  if flags.target = "TEST" then do
  782.   flags.verbose = 1
  783.   DO i = 1 TO 7
  784.   if flags.MakeText then Open('GenealogyText',Tdir'/G'i,'w')
  785. /*  if flags.MakeGuide then Open('GenealogyPG',Adir'/G'i'.guide,'w') */
  786.   CALL MakeOne(i)
  787. /*  if flags.MakeGuide then Close('GenealogyPG') */
  788.   if flags.MakeText then Close('GenealogyText')
  789.    end
  790.   end
  791.  
  792.  else if flags.target ~= "ANCHORS" then do
  793.  
  794.   flags.target = 'NORMAL'
  795.   Say ' '
  796.   call writech(stdout,' HTMLs')
  797.   if flags.MakeGuide then
  798.    call writech(stdout,' & guides')
  799.   if flags.MakeText then
  800.    call writech(stdout,' & ASCIItextfile')
  801.   call writeln(stdout,' for all ' TOTALIRN ' persons in database ' DBNAME)
  802.  
  803. /* GENEAFIL.htm is a Scion data base IRN order list of all persons in 
  804.    HTML format: person * birthdate + deathdate (()) father & mother */
  805.  
  806.   Say ' '
  807.   Say 'file name: 'Gdir'/'flags.GenPrefix'L.htm for: List of Persons.'
  808.  
  809.   Open('GenealogyFile',Gdir'/'flags.GenPrefix'L.htm','w')
  810.   WriteLn('GenealogyFile','<HTML>')
  811.   WriteLn('GenealogyFile','<TITLE>List of Persons.</TITLE>')
  812.   WriteLn('GenealogyFile','<H2>List of Persons in data base "'DBNAME'". 'flags.htmlb''Time()' - 'Date()''flags.htmlub'</H2>')
  813.   WriteLn('GenealogyFile','<H3>')
  814.  
  815.   if flags.MakeGuide then do
  816.    Say ' '
  817.    Say 'file name: 'Adir'/'flags.GenPrefix'L.guide for: List of Persons.'
  818.    Open('GenealogyGuide',Adir'/'flags.GenPrefix'L.guide','w')
  819.    WriteLn('GenealogyGuide','@database "'flags.GenPrefix'L.guide"')
  820.    WriteLn('GenealogyGuide','@NODE Main "'DBNAME' Genealogy"')
  821.    WriteLn('GenealogyGuide',' ')
  822.    WriteLn('GenealogyGuide','List of Persons in data base "'DBNAME'". @{b}'Time()' - 'Date()'@{ub}')
  823.    WriteLn('GenealogyGuide',' ')
  824.    end
  825.  
  826.   if flags.MakeText then do
  827.    Open('GenealogyText',Tdir'/GenealogyOf'DBNAME,'w')
  828.    WriteLn('GenealogyText','Genealogy Data Base "'GetLastName(DBNAME)'"')
  829.    end
  830.  
  831.   DO i = 1 TO TOTALIRN
  832.    CALL MakeOne(i)
  833.    end
  834.  
  835.   if flags.MakeGuide then do
  836.    WriteLn('GenealogyGuide','_______________________________________________')
  837.    WriteLn('GenealogyGuide','')
  838.    WriteCh('GenealogyGuide','Definitions: ')
  839.    if ~flags.bold then
  840.     WriteCh('GenealogyGuide','@{b}bold=male@{ub}, @{i}italic=fem@{ui},')
  841.    WriteLn('GenealogyGuide',' * birth, + death, ¶ more info')
  842.    WriteLn('GenealogyGuide','_______________________________________________')
  843.    WriteLn('GenealogyGuide','')
  844.    WriteCh('GenealogyGuide','Credits: ')
  845.    WriteCh('GenealogyGuide','(@{i}AMIGA@{ui}) · ')
  846.    WriteCh('GenealogyGuide','(Scion © @{b}Robbie J Akins@{ub}) · ')
  847.    WriteLn('GenealogyGuide','(Scion2html.rexx © @{b}Harold Ipolyi)')
  848.    WriteLn('GenealogyGuide','@ENDNODE')
  849.    Close('GenealogyGuide')
  850.    end
  851.  
  852.   WriteCh('GenealogyFile','</H3>')
  853.   WriteCh('GenealogyFile','<HR>')
  854.   WriteLn('GenealogyFile','<Address>')
  855.   WriteCh('GenealogyFile','Definitions: ')
  856.   if ~flags.bold then
  857.    WriteCh('GenealogyFile',flags.htmlb'bold=male'flags.htmlub', 'flags.htmli'italic=fem'flags.htmlui',')
  858.   WriteLn('GenealogyFile',' * birth, + death, ¶ more info, ® picture album')
  859.   WriteCh('GenealogyFile','<HR>Credits: ')
  860.   WriteCh('GenealogyFile','('flags.htmli'<A href="http://www.omnipresence.com/')
  861.   WriteLn('GenealogyFile','amiga/">AMIGA</A>'flags.htmlui') · ')
  862.   'GETPROGVERSION'
  863.   VERSION = RESULT
  864.   WriteCh('GenealogyFile','(<A href="http://wuarchive.wustl.edu/pub/aminet/')
  865.   WriteCh('GenealogyFile','info/www/dirs/')
  866.   WriteCh('GenealogyFile','biz_dbase.html">'flags.htmlb'Scion')
  867.   if VERSION > 0 then WriteCh('GenealogyFile','V'VERSION)
  868.   WriteLn('GenealogyFile',''flags.htmlub'</A> © 'flags.htmlb'Robbie J Akins'flags.htmlub') · ')
  869.   WriteCh('GenealogyFile','(<A href="http://wuarchive.wustl.edu/pub/aminet/')
  870.   WriteCh('GenealogyFile','info/www/dirs/gfx_co')
  871.   WriteLn('GenealogyFile','nv.html">'flags.htmlb'GfxCon'flags.htmlub'</A> © 'flags.htmlb'Dirk Farin'flags.htmlub') · ')
  872.   WriteCh('GenealogyFile','(<A href="http://wuarchive.wustl.edu/pub/aminet/')
  873.   WriteCh('GenealogyFile','info/www/dirs/')
  874.   WriteCh('GenealogyFile','util_rexx.html">'flags.htmlb'Scion2html.rexx'flags.htmlub'</A> © ')
  875. /*
  876.   WriteCh('GenealogyFile','<A href="http://www.azstarnet.com/~dagley')
  877.   WriteCh('GenealogyFile','/IPOLYIG/P1.htm">'flags.htmlb'Harold Ipolyi'flags.htmlub'</A>)')
  878. */
  879.   WriteLn('GenealogyFile',''flags.htmlb'Harold Ipolyi'flags.htmlub')')
  880.   WriteCh('GenealogyFile','</Address>')
  881.   WriteLn('GenealogyFile','</HTML>')
  882.   end
  883.  
  884.  Say ' '
  885.  Say ' '
  886.  Say ' If you have not already done so, add the following anchor pointing to'
  887.  Say ' "'GetLastName(DBNAME)' Genealogy" to a HTML file (maybe HOME PAGE):  '
  888.  Say ' '
  889.  Say ' <A href="/'Gdir'/'flags.GenPrefix'L.htm">'GetLastName(DBNAME)' Genealogy</A>'
  890.  Say ' '
  891.  Say '          and maybe:'
  892.  Say ' '
  893.  
  894.  GetPerComp(1)
  895.  if flags.GenPrefix = "GENEAFI" then
  896.   Say ' <A href="/'Gdir'/P1.htm">'person.GETFULLNAME.1'</A>'
  897.  else
  898.   Say ' <A href="/'Gdir'/'flags.GenPrefix'P1.htm">'person.GETFULLNAME.1'</A>'
  899.  Say ' '
  900.   end
  901.  
  902. /*
  903.  Open('CreditsFile','ram:Credits.html','w')
  904. */
  905.  
  906.  elapsedtime =  Time('e') - starttime
  907.  
  908.  spacer = substr(blanks,1,Length(elapsedtime))
  909.  
  910.  Say ' '
  911.  Say '                                        'spacer'         '
  912.  Say '  Scion2html.rexx completed normally in 'elapsedtime' seconds '
  913.  Say '                                        'spacer'         '
  914.  
  915.  AskExit()
  916.  
  917.  EXIT    /* redundant */
  918.  
  919. /*************************************************************************
  920. *                                                                        *
  921. *  Makeone procedure extracts data and creates page for a single person  *
  922. *                                                                        *
  923. *************************************************************************/
  924.  
  925. MakeOne: PROCEDURE EXPOSE person. flags. DBPATH DBNAME Adir Gdir Tdir
  926.  PARSE ARG ScionIRN
  927.  
  928. 'EXISTPERSON' ScionIRN
  929. if RESULT = 'YES' then do
  930.  
  931.  if flags.GenPrefix = "GENEAFI" then do
  932.   PersonPrefix = "P"            /* Person file name prefix */
  933.   FamilyPrefix = "F"            /* Family file name prefix */
  934.   end
  935.  else do
  936.   PersonPrefix = flags.GenPrefix"P"    /* Person file name prefix */
  937.   FamilyPrefix = flags.GenPrefix"F"    /* Family file name prefix */
  938.   end
  939.  
  940.  if FamilyPrefix = PersonPrefix then do
  941.   say ' FamilyPrefix MUST NOT EQUAL PersonPrefix'
  942.   say ' 'FamilyPrefix'                           'PersonPrefix
  943.   AskExit()
  944.   EXIT
  945.   end
  946.  
  947.  HasFileFATHER = 0
  948.  HasFileMOTHER = 0
  949.  HasMOTHER = 0
  950.  HasFATHER = 0
  951.  HasPARENTS = 0
  952.  HasCHILDREN = 0
  953.  DoGenText = 0
  954.  'GETPARENTS' ScionIRN
  955.  PARENTS = RESULT
  956.  tPARENTSt = 't'PARENTS't'
  957. /* Say 'PARENTS = 'PARENTS tPARENTSt    ??? EXISTPARENTS IRN ??? */
  958.  if tPARENTSt ~= 'tt' then HasPARENTS = 1
  959.  'GETMARRIAGE' ScionIRN 0    /*      ??? GETTOTMARRIAGES IRN ???     */
  960.  MARRIAGE = RESULT
  961.  tMARRIAGESt = 't'MARRIAGE't'
  962. /*    Say 'MARRIAGES = 'MARRIAGE tMARRIAGESt        */
  963.  if tMARRIAGESt ~= 'tMARRIAGEt' then do
  964.   mFGRN = MARRIAGE
  965.   'GETNUMCHILD' mFGRN
  966.   if RESULT > 0 then HasCHILDREN = 1
  967.  end
  968. /*
  969. Say 'PARENTS = 'PARENTS tPARENTSt 'MARRIAGES = 'MARRIAGES tMARRIAGESt 'HasPARENTS = 'HasPARENTS 'HasCHILDREN = 'HasCHILDREN
  970. */
  971.  if flags.MakeText & ( HasPARENTS + HasCHILDREN ) = 1 then doGenText = 1
  972.  
  973.  GetPerComp(ScionIRN)
  974.  
  975.  'GETBAPTISMDATE' ScionIRN
  976.  BAPTISMDATE = RESULT
  977.  'GETRELIGION' ScionIRN
  978.  RELIGION = RESULT
  979.  'GETBAPTISMPLACE' ScionIRN
  980.  BAPTISMPLACE = RESULT
  981.  'GETBURIALPLACE' ScionIRN
  982.  BURIALPLACE = RESULT
  983.  'GETDIEDOF' ScionIRN
  984.  DIEDOF = RESULT
  985.  'GETEDUCATION' ScionIRN
  986.  EDUCATION = RESULT
  987.  'GETOCCUPATION' ScionIRN
  988.  OCCUPATION = RESULT
  989.  'GETPERSCOMMENT' ScionIRN
  990.  PERSCOMMENT = RESULT
  991.  'GETPERSREFS' ScionIRN
  992.  PERSREFS = RESULT
  993. /*
  994.  ValidInfo = 0
  995.  if LASTNAME||BIRTHDATE||BIRTHPLACE||DEATHDATE||DEATHPLACE||BURIALPLACE||RELIGION||DIEDOF||EDUCATION||OCCUPATION||PERSCOMMENT||PERSREFS ~= "" THEN ValidInfo = 1
  996.  if ~ValidInfo then do
  997. Say "Person " ScionIRN"'s lacking information; no new HTML file being created!"
  998.   return
  999.   end
  1000.  if flags.MakeText & ( ValidInfo | LASTNAME ~= "" ) then DoGenText = 1
  1001. */
  1002.  if flags.MakeText then DoGenText = 1
  1003.  PfilN = PersonPrefix || ScionIRN
  1004.  
  1005.  dPfilN = Gdir'/'PfilN
  1006.  gPfilN = Adir'/'PfilN
  1007.  if flags.verbose then do
  1008.   Say ''
  1009.   Say ' HTML:  'dPfilN'.htm  for: 'person.GETFULLNAME.ScionIRN' {'ScionIRN'}'
  1010.   end
  1011.  else Say person.GETFULLNAME.ScionIRN' {'ScionIRN'}'
  1012.  Open('PERSONFILE',dPfilN'.htm','w')
  1013.  WriteLn('PERSONFILE','<HTML>')
  1014.  WriteLn('PERSONFILE','<TITLE>'person.GETFULLNAME.ScionIRN' Data Sheet</TITLE>')
  1015.  WriteLn('PERSONFILE','<PRE><TT>')
  1016.  
  1017.  if flags.MakeGuide then do
  1018.   if flags.verbose then 
  1019.    Say 'Guide:  'gPfilN'.guide  for: 'person.GETFULLNAME.ScionIRN' {'ScionIRN'}'
  1020.   Open('PERSONGuide',gPfilN'.guide','w')
  1021.   WriteLn('PERSONGuide','@database "'gPfilN'.guide"')
  1022.   WriteLn('PERSONGuide','@NODE Main "'person.GETFULLNAME.ScionIRN' Genealogy"')
  1023.   WriteCh('PERSONGuide',person.GETFULLNAME.ScionIRN)
  1024.   end
  1025.  
  1026.  if Exists(DBPATH'PP'ScionIRN'.'DBNAME) & flags.DoPictures then do
  1027.   if flags.RemakeThumb then do
  1028.    DELETE(dPfilN'.GIF')
  1029.    DELETE(dPfilN'.JPEG')
  1030.    end
  1031.  
  1032.   if AgeTest(DBPATH'PP'ScionIRN'.'DBNAME, dPfilN'.jpg') then do
  1033.    Delete(dPfilN'.'flags.Thmbfmt)
  1034.    end
  1035.  
  1036.   WriteCh('PERSONFILE','   <A HREF="'PfilN'A.htm')
  1037.   WriteLn('PERSONFILE','"><img src="'PfilN'.'flags.Thmbfmt'"></A>')
  1038.   end
  1039.  
  1040.  WriteCh('PERSONFILE',person.MGETFULLNAME.ScionIRN)
  1041.  
  1042.  if Exists(DBPATH'PN'ScionIRN'.'DBNAME) then do
  1043.   if flags.verbose then Say 'Writing info ¶ file 'dPfilN'I.htm'
  1044.   Open('PNDBNAME',DBPATH'PN'ScionIRN'.'DBNAME,'r')
  1045.   Open('PERSONI',dPfilN'I.htm','w')
  1046.   if flags.MakeGuide then do
  1047.    Open('PERSONGI',gPfilN'I.guide','w')
  1048.    WriteLn('PERSONGI','@database "'gPfilN'I.guide"')
  1049.    WriteLn('PERSONGI','@NODE Main "'person.GETFULLNAME.ScionIRN' Information."')
  1050.    end
  1051.   WriteLn('PERSONI','<HTML>')
  1052.   WriteLn('PERSONI','<TITLE>'person.GETFULLNAME.ScionIRN' Information</TITLE>')
  1053.   WriteCh('PERSONI','<A HREF="'PfilN'.htm">'person.MGETFULLNAME.ScionIRN)
  1054.   WriteCh('PERSONI','</A> Information. (<A HREF="'flags.GenPrefix'L.htm">')
  1055.   WriteLn('PERSONI',''flags.htmlb'List of persons.'flags.htmlub'</A>)<PRE><TT>')
  1056.   if DoGenText then WriteLn('GenealogyText',person.PGETFULLNAME.ScionIRN' Information.')
  1057.   DO While ~EOF('PNDBNAME')
  1058.    line = ReadLn('PNDBNAME')
  1059.    WriteLn('PERSONI',CheckForReplacement(line))
  1060.    if flags.MakeGuide then WriteLn('PERSONGI',CheckGuideRepl(line))
  1061.    if DoGenText then WriteLn('GenealogyText',CheckForNAReplacement(line))
  1062.    end
  1063.   Close('PNDBNAME')
  1064.   if DoGenText then WriteLn('GenealogyText',' ')
  1065.   WriteLn('PERSONI','</HTML>')
  1066.   Close('PERSONI')
  1067.   if flags.MakeGuide then do
  1068.    WriteLn('PERSONGI','@ENDNODE')
  1069.    Close('PERSONGI')
  1070.    end
  1071.   WriteCh('PERSONFILE',' (<A HREF="'PfilN'I.htm"> ¶ </A>)')
  1072.   if flags.MakeGuide then
  1073.    WriteCh('PERSONGuide',' @{" More Info (¶) " LINK 'gPfilN'I.guide/Main}')   
  1074.   end
  1075.  
  1076.  if Exists(DBPATH'PP'ScionIRN'.'DBNAME) then do
  1077.   if flags.MakeGuide then do
  1078.    WriteCh('PERSONGuide',' @{" Picture (®) " RXS "address command ')
  1079.    WriteCh('PERSONGuide',"'"flags.VIEWER" ")
  1080.    WriteCh('PERSONGuide',DBPATH'PP'ScionIRN'.'DBNAME"'"'"')
  1081.    WriteCh('PERSONGuide','}')
  1082.    end
  1083.  
  1084.   if flags.DoPictures then do
  1085.    if ~Exists(dPfilN'.jpg') then do
  1086.     Say 'Creating picture 'dPfilN'.jpg'
  1087. /*
  1088. Say 'Sys:Tools/GfxCon 'DBPATH'PP'ScionIRN'.'DBNAME' TO 'dPfilN'.jpg FORMAT JPEG QUALITY 100'
  1089. */
  1090. Say 'Sys:Tools/GfxCon 'DBPATH'PP'ScionIRN'.'DBNAME' TO 'dPfilN'.jpg FORMAT JPEG QUALITY 100'
  1091. OldStackSize = pragma('s',21000)
  1092. address command 'Sys:Tools/GfxCon 'DBPATH'PP'ScionIRN'.'DBNAME' TO 'dPfilN'.jpg FORMAT JPEG QUALITY 100'
  1093. call pragma('s',OldStackSize)
  1094.     end
  1095.    if Exists(dPfilN'.'flags.Thmbfmt) then do
  1096.     if flags.verbose then Say '  ~ image 'dPfilN'.'flags.Thmbfmt'  ...OK... '
  1097.     end
  1098.    else do
  1099.     if flags.verbose then Say 'Creating image 'dPfilN'.'flags.Thmbfmt
  1100. /*
  1101. Say 'Sys:Tools/GfxCon 'DBPATH'PP'ScionIRN'.'DBNAME' TO 'dPfilN'.'flags.Thmbfmt' FORMAT 'flags.Thmbfmt' BOXFIT 'flags.Thumbnail' 'flags.Thumbnail
  1102. */
  1103. Say 'Sys:Tools/GfxCon 'DBPATH'PP'ScionIRN'.'DBNAME' TO 'dPfilN'.'flags.Thmbfmt' FORMAT 'flags.Thmbfmt' BOXFIT 'flags.Thumbnail' 'flags.Thumbnail
  1104. OldStackSize = pragma('s',21000)
  1105. address command 'Sys:Tools/GfxCon 'DBPATH'PP'ScionIRN'.'DBNAME' TO 'dPfilN'.'flags.Thmbfmt' FORMAT 'flags.Thmbfmt' BOXFIT 'flags.Thumbnail' 'flags.Thumbnail
  1106. call pragma('s',OldStackSize)
  1107.     end                   
  1108. WriteCh('PERSONFILE',' (<A HREF="'PfilN'A.htm">'flags.htmlb' ® 'flags.htmlub'</A>)')
  1109.    if Exists(dPfilN'A.htm') then do
  1110.     if flags.verbose then Say '  ~ picture album 'dPfilN'A.htm  ...OK... '
  1111.     end
  1112.    else do
  1113.     Say 'Creating picture album ® 'dPfilN'A.htm'
  1114.     Open('PERSONP',dPfilN'A.htm','w')
  1115.     WriteLn('PERSONP','<HTML>')
  1116.     WriteLn('PERSONP','<TITLE>'person.GETFULLNAME.ScionIRN' Picture Album</TITLE>')
  1117.     WriteCh('PERSONP',person.MGETFULLNAME.ScionIRN' . ')
  1118.     WriteCh('PERSONP','<A HREF="'PfilN'.jpg">')
  1119.     WriteLn('PERSONP','<img src="'PfilN'.'flags.Thmbfmt'"></A>')
  1120.     WriteLn('PERSONP',' . 'flags.htmlb'Picture Album'flags.htmlub'<HR><pre><tt>')
  1121.     WriteCh('PERSONP','<H3>another JPEG picture <A HREF="'PfilN'A1.jpg">')
  1122.     WriteCh('PERSONP','<img src="'PfilN'A1.'flags.Thmbfmt'"></A> anchored by ')
  1123.     WriteLn('PERSONP','thumbnail image created by:')
  1124.     WriteCh('PERSONP','GfxCon 'dPfilN'A1.jpg TO 'dPfilN'A1.'flags.Thmbfmt' FORMAT ')
  1125.     WriteCh('PERSONP',flags.Thmbfmt' BOXFIT 'flags.Thumbnail' 'flags.Thumbnail)
  1126.     WriteLn('PERSONP','<HR></pre></tt>')
  1127.     WriteLn('PERSONP',''flags.htmlb'Edit'flags.htmlub' 'dPfilN'A.htm 'flags.htmlb'to add more pictures to the Picture Album<P>')
  1128.     WriteCH('PERSONP','CAUTION: deleting Directory:'flags.htmlub' 'Gdir' 'flags.htmlb'destroys all Picture ')
  1129.     WriteLn('PERSONP',' Album modifications. YOUR WORK WILL BE LOST!'flags.htmlub'')
  1130.     WriteLn('PERSONP','</HTML>')
  1131.     Close('PERSONP')
  1132.     end
  1133.    end
  1134.   end
  1135.  
  1136.  WriteLn('PERSONFILE',' (<A HREF="'flags.GenPrefix'L.htm">'flags.htmlb'List of persons.'flags.htmlub'</A>)')
  1137.  
  1138.  if flags.MakeGuide then do
  1139.   WriteLn('PERSONGuide',' @{" List of People " LINK 'Adir'/'flags.GenPrefix'L.guide/Main}')
  1140.   end
  1141.  
  1142.  if DoGenText then do
  1143.   if flags.target ~= "NORMAL" then
  1144.    Say 'ASCII:  'Tdir'/G'ScionIRN'  for 'person.GETFULLNAME.ScionIRN' {'ScionIRN'}'
  1145.   WriteLn('GenealogyText','')
  1146.   WriteLn('GenealogyText','-----------------------------------------------------------')
  1147.   WriteLn('GenealogyText','')
  1148.   WriteLn('GenealogyText',person.PGETFULLNAME.ScionIRN' Data Sheet')
  1149.   end
  1150.  if person.GETBIRTHDATE.ScionIRN || person.GETBIRTHPLACE.ScionIRN ~= "" then do
  1151.   if person.GETBIRTHDATE.ScionIRN ~= "" then
  1152.    PersOutputCh('Born: 'person.GETBIRTHDATE.ScionIRN' * ',0)
  1153.   if person.GETBIRTHPLACE.ScionIRN ~= "" then
  1154.    PersOutputCh(person.GETBIRTHPLACE.ScionIRN,0)
  1155.   PersOutputCr()
  1156.   end
  1157.  if BAPTISMDATE || BAPTISMPLACE || RELIGION ~= "" then do
  1158.   PersOutputCh('Baptised: ')
  1159.   PersOutputCh(BAPTISMDATE' ')
  1160.   if RELIGION ~= "" then PersOutputCh('{'RELIGION'} ',0)
  1161.   if BAPTISMPLACE ~= "" then PersOutputCh(BAPTISMPLACE,0)
  1162.   PersOutputCr()
  1163.   end
  1164.  if person.GETDEATHDATE.ScionIRN ~= "" & person.GETDEATHDATE.ScionIRN ~= "dead" then do
  1165.   PersOutputCh('Died: 'person.GETDEATHDATE.ScionIRN,0)
  1166.   if person.GETDEATHPLACE.ScionIRN ~= "" then
  1167.    PersOutputCh(' + 'person.GETDEATHPLACE.ScionIRN,0)
  1168.   if BURIALPLACE ~= "" then PersOutputCh(' . Buried: 'BURIALPLACE,0)
  1169.   PersOutputCr()
  1170.   end
  1171.  else do
  1172.   if person.GETDEATHPLACE.ScionIRN ~= "" then
  1173.    PersOutputLn(person.GETDEATHPLACE.ScionIRN,1)
  1174.   if BURIALPLACE ~= "" then PersOutputLn(BURIALPLACE,1)
  1175.   end
  1176.  if DIEDOF ~= "" then PersOutputLn('Cause of Death: 'DIEDOF,1)
  1177.  if EDUCATION ~= "" then PersOutputLn('Education: 'EDUCATION,1)
  1178.  if OCCUPATION ~= "" then PersOutputLn('Occupation: 'OCCUPATION,1)
  1179.  if PERSCOMMENT ~= "" then PersOutputLn('Comments: 'PERSCOMMENT,1)
  1180.  if PERSREFS ~= "" then PersOutputLn('References: 'PERSREFS,1)
  1181.  
  1182. /* end of personal data; start family tree segment */
  1183.  
  1184.  PersOutputHL()
  1185.  HeadLine = ''
  1186.  if HasPARENTS then HeadLine = HeadLine' ·Parents '
  1187.  'GETNUMSIB' ScionIRN
  1188.  xtra = ''
  1189.  if RESULT > 1 then xtra = 's'
  1190.  if RESULT > 0 then HeadLine = HeadLine' ·Sibling'xtra' '
  1191.  'GETNUMMARRY' ScionIRN
  1192.  xtra = ''
  1193.  if RESULT > 1 then xtra = 's'
  1194.  if RESULT > 0 then HeadLine = HeadLine' ·Spouse'xtra' '
  1195.  'GETTOTALCHILD' ScionIRN
  1196.  xtra = 'Child'
  1197.  if RESULT > 1 then xtra = xtra'ren'
  1198.  if RESULT > 0 then HeadLine = HeadLine' ·'xtra
  1199.  PersOutputLn('Immediate Family: 'HeadLine,0)
  1200.  if DoGenText then WriteLn('GenealogyText','')
  1201.  if HasPARENTS then do
  1202.   'GETPRINCIPAL' PARENTS
  1203.   PRINCIPAL = RESULT
  1204.   'GETSPOUSE' PARENTS
  1205.   SPOUSE = RESULT
  1206.   'GETMARRYDATE' PARENTS
  1207.   PARENTSMARRIAGEDATE = RESULT
  1208.   'GETMARRYPLACE' PARENTS
  1209.   PARENTSmFGRNPLACE = RESULT
  1210.   'GETSEX' PRINCIPAL
  1211.   if RESULT = 'M' then do
  1212.    FATHERIRN = PRINCIPAL
  1213.    MOTHERIRN = SPOUSE
  1214.    end
  1215.   else do
  1216.    FATHERIRN = SPOUSE
  1217.    MOTHERIRN = PRINCIPAL
  1218.    end
  1219.   GetPerComp(FATHERIRN)
  1220.   if person.GETFIRSTNAME.FATHERIRN||person.GETLASTNAME.FATHERIRN ~= "" then
  1221.    HasFATHER = 1
  1222.   GetPerComp(MOTHERIRN)
  1223.   if person.GETFIRSTNAME.MOTHERIRN||person.GETLASTNAME.MOTHERIRN ~= "" then
  1224.    HasMOTHER = 1
  1225.  
  1226.   if FATHERLASTNAME ~= "" then do
  1227.    HasFileFATHER = 1
  1228.    FATHERFILENAME = PersonPrefix || FATHERIRN
  1229.    end
  1230.  
  1231.   if MOTHERLASTNAME ~= "" then do
  1232.    HasFileMOTHER = 1
  1233.    MOTHERFILENAME = PersonPrefix || MOTHERIRN
  1234.    end
  1235.  
  1236.   if HasFileFATHER then do
  1237.    PersOutputCh('  <'FATHERIRN'>',1)
  1238.    PersOutputCh(' & ',0)
  1239.    end
  1240.   PersOutputCh('<'MOTHERIRN'>',1)
  1241.   if PARENTSMARRIAGEDATE ~= "" then PersOutputCh(' & 'PARENTSMARRIAGEDATE,0)
  1242.   if PARENTSmFGRNPLACE ~= "" then PersOutputCh(' @ 'PARENTSmFGRNPLACE,0)
  1243.   PersOutputCr()
  1244.   spcs = '  |'
  1245.   DO i = 0 TO Length(FATHERFULLNAME) /* ################ */
  1246.    spcs = spcs' '     /* ??? GETFAMLBL1 ??? */
  1247.   end            /* ??? GETFAMLBL2 ??? */
  1248.  
  1249.  Minfo = Exists(DBPATH'FN'PARENTS'.'DBNAME)
  1250.  if PARENTSmFGRNCELEBRANT ~= '' | Minfo then do
  1251.   if DoGenText then WriteLn('GenealogyText','  |')   
  1252.   'GETNUMCHILD' PARENTS
  1253.   TOTCHILDREN = RESULT
  1254. /* say 'TOTCHILDREN = 'TOTCHILDREN */
  1255.   DO i = 0 TO TOTCHILDREN - 1
  1256.    'GETCHILD' PARENTS i
  1257.    PARENTSc = RESULT
  1258.    GetPerComp(PARENTSc)
  1259.    if person.GETFIRSTNAME.PARENTSc ~= "" then do
  1260.     if PARENTSc ~= ScionIRN then do
  1261.      LastNameFl = 1
  1262.      if person.GETLASTNAME.PARENTSc = person.GETLASTNAME.FATHERIRN then do
  1263.       LastNameFl = -1
  1264.       LastNameVal = person.GETLASTNAME.FATHERIRN
  1265.       end
  1266.      PersOutputCh('  |_',0)
  1267.      PersOutputCh('<'PARENTSc'>',LastNameFl)
  1268.      LastNameFl = 1
  1269.      BirthDeath(PARENTSc)
  1270.      PersOutputCr()
  1271.      end
  1272.     end
  1273.    end
  1274.   end
  1275.   PersOutputLn('  |',0)
  1276.  END
  1277.  
  1278. /* end of parents, siblings segment; start marriages segment */
  1279.  
  1280. vert.0 = ''
  1281. vert.1 = '|'
  1282. 'GETNUMMARRY' ScionIRN
  1283. TOTMARRIAGES = RESULT
  1284. /* say 'TOTMARRIAGES = 'TOTMARRIAGES */
  1285. DO i = 0 TO TOTMARRIAGES
  1286.  'GETMARRIAGE' ScionIRN i
  1287.  MARRIAGE = RESULT               /* use: 'EXISTFAMILY'   */
  1288.  if MARRIAGE > -1 then do
  1289.   MARRIAGES = i
  1290.   j = i + 1
  1291.   vert.j = vert.1||vert.i
  1292.   end
  1293.  end
  1294. tMARRIAGESt = 't'MARRIAGES't'
  1295.  PersOutputCh('  |_',0) 
  1296.  if tMARRIAGESt ~= 'tMARRIAGESt' then do
  1297.   DO i = 0 TO MARRIAGES
  1298.    'GETMARRIAGE' ScionIRN i
  1299.    mFGRN = RESULT
  1300.    if mFGRN ~= "" then do
  1301.     ki = MARRIAGES - i + 1
  1302.     if ki ~= MARRIAGES + 1 then PersOutputLn('    'vert.ki,0)
  1303.     j = MARRIAGES + 1 - i
  1304.     'GETSPOUSE' mFGRN
  1305.     SPOUSE = RESULT
  1306.     if SPOUSE = ScionIRN then do
  1307.      'GETPRINCIPAL' mFGRN
  1308.      SPOUSE = RESULT
  1309.      end
  1310.     'GETMARRYDATE' mFGRN
  1311.     MARRIAGEDATE = RESULT
  1312.     'GETMARRYPLACE' mFGRN
  1313.     mFGRNPLACE = RESULT
  1314.  
  1315.     SPOUSEFILENAME = PersonPrefix || SPOUSE
  1316.  
  1317.     if i = 0 then do
  1318.      PersOutputCh('<'ScionIRN'> & ',1)
  1319.      PersOutputCh('<'SPOUSE'>',1)
  1320.      end
  1321.  
  1322.     else do
  1323.      PersOutputCh('    'vert.j'_&',0)
  1324.      PersOutputCh('<'SPOUSE'>',1)
  1325.      end
  1326.  
  1327.     if MARRIAGEDATE ~= "" then PersOutputCh(' & 'MARRIAGEDATE,0)
  1328.     if mFGRNPLACE ~= "" then PersOutputCh(' @ 'mFGRNPLACE,0)
  1329.     PersOutputCr()
  1330.     jk = MARRIAGES - i
  1331.     spcs = '    'vert.jk'    |'
  1332.  
  1333.     FfilN = Gdir'/'FamilyPrefix || mFGRN
  1334.     Minfo = 0
  1335.     if Exists(DBPATH'FN'mFGRN'.'DBNAME) then do
  1336.      Minfo = 1
  1337.  
  1338.      if AgeTest(DBPATH'FN'mFGRN'.'DBNAME,FfilN'I.htm') then do
  1339.       Say 'Writing info ¶ file 'FfilN'I.htm'
  1340.       Open('FNDBNAME',DBPATH'FN'mFGRN'.'DBNAME,'r')
  1341.       Open('FAMILYI',FfilN'I.htm','w')
  1342.       WriteLn('FAMILYI','<HTML>')
  1343.       WriteCh('FAMILYI','<TITLE>'person.MGETFULLNAME.ScionIRN' & ')
  1344.       WriteLn('FAMILYI',person.MGETFULLNAME.SPOUSE' Family Information</TITLE>')
  1345.  
  1346.       if Exists(DBPATH'FP'mFGRN'.'DBNAME) & flags.DoPictures then do
  1347.        WriteCh('FAMILYI','<A HREF="'FamilyPrefix || mFGRN'A.htm')
  1348.        WriteCh('FAMILYI','"><img src="'FamilyPrefix || mFGRN'.'flags.Thmbfmt'"></A>')
  1349.        end
  1350.  
  1351.       WriteCh('FAMILYI','<H2>Family of 'person.MGETFULLNAME.ScionIRN' & ')
  1352.       WriteCh('FAMILYI',person.MGETFULLNAME.SPOUSE)
  1353.  
  1354.       if Exists(DBPATH'FP'mFGRN'.'DBNAME) & flags.DoPictures then do
  1355.        WriteCh('FAMILYI',' (<A HREF="'FamilyPrefix || mFGRN'A.htm')
  1356.        WriteCh('FAMILYI','">'flags.htmlb' ® 'flags.htmlub'</A>) ')
  1357.        end
  1358.  
  1359.       WriteCh('FAMILYI',' (<A HREF="'flags.GenPrefix'L.htm">')
  1360.       WriteLn('FAMILYI',''flags.htmlb'List of persons.'flags.htmlub'</A>)</H2><PRE><TT>')
  1361.       DO While ~EOF('FNDBNAME')
  1362.        line = ReadLn('FNDBNAME')
  1363.        WriteLn('FAMILYI',CheckForReplacement(line))
  1364. /*
  1365. if DoGenText then WriteLn('GenealogyText',spcs'  'CheckForNAReplacement(line))
  1366. */
  1367.        end
  1368.       Close('FNDBNAME')
  1369.       WriteLn('FAMILYI','</HTML>')
  1370.       Close('FAMILYI')
  1371.       end
  1372.      end
  1373.  
  1374.     Palbum = 0
  1375.     if Exists(DBPATH'FP'mFGRN'.'DBNAME) & flags.DoPictures then do
  1376.  
  1377.      Palbum = 1
  1378.      if flags.RemakeThumb then do
  1379.       DELETE(FfilN'.GIF')
  1380.       DELETE(FfilN'.JPEG')
  1381.       end
  1382.      if AgeTest(DBPATH'FP'mFGRN'.'DBNAME,FfilN'.jpg') then do
  1383.       Delete(FfilN'.'flags.Thmbfmt)
  1384.       end
  1385.  
  1386.      if flags.DoPictures & ~Exists(FfilN'.jpg') then do
  1387.       Say 'Creating picture 'FfilN'.jpg'
  1388. /*
  1389. Say 'Sys:Tools/GfxCon 'DBPATH'FP'mFGRN'.'DBNAME' TO 'FfilN'.jpg FORMAT JPEG QUALITY 100'
  1390. */
  1391. Say 'Sys:Tools/GfxCon 'DBPATH'FP'mFGRN'.'DBNAME' TO 'FfilN'.jpg FORMAT JPEG QUALITY 100'
  1392. OldStackSize = pragma('s',21000)
  1393. address command 'Sys:Tools/GfxCon 'DBPATH'FP'mFGRN'.'DBNAME' TO 'FfilN'.jpg FORMAT JPEG QUALITY 100'
  1394. call pragma('s',OldStackSize)
  1395.       end
  1396.      if Exists(FfilN'.'flags.Thmbfmt) then do
  1397.       if flags.verbose then Say '  ~ image 'FfilN'.'flags.Thmbfmt'  ...OK... '
  1398.       end
  1399.      else do
  1400.       if flags.verbose then Say 'Creating image 'FfilN'.'flags.Thmbfmt''
  1401. /*
  1402. Say 'Sys:Tools/GfxCon 'DBPATH'FP'mFGRN'.'DBNAME' TO 'FfilN'.'flags.Thmbfmt' FORMAT 'flags.Thmbfmt' BOXFIT 'flags.Thumbnail' 'flags.Thumbnail
  1403. */
  1404. Say 'Sys:Tools/GfxCon 'DBPATH'FP'mFGRN'.'DBNAME' TO 'FfilN'.'flags.Thmbfmt' FORMAT 'flags.Thmbfmt' BOXFIT 'flags.Thumbnail' 'flags.Thumbnail
  1405. OldStackSize = pragma('s',21000)
  1406. address command 'Sys:Tools/GfxCon 'DBPATH'FP'mFGRN'.'DBNAME' TO 'FfilN'.'flags.Thmbfmt' FORMAT 'flags.Thmbfmt' BOXFIT 'flags.Thumbnail' 'flags.Thumbnail
  1407. call pragma('s',OldStackSize)
  1408.       end
  1409.      if Exists(FfilN'A.htm') then do
  1410.       if flags.verbose then Say '  ~ picture album 'FfilN'A.htm  ...OK... '
  1411.       end
  1412.      else do
  1413.       Say 'Creating picture album ® 'FfilN'A.htm'
  1414.       Open('FAMILYP',FfilN'A.htm','w')
  1415. WriteLn('FAMILYP','<HTML>')
  1416. WriteCh('FAMILYP','<TITLE>'person.MGETFULLNAME.ScionIRN' & ')
  1417. WriteCh('FAMILYP',person.MGETFULLNAME.SPOUSE)
  1418. WriteLn('FAMILYP',' Family Picture Album</TITLE>')
  1419. WriteCh('FAMILYP',person.MGETFULLNAME.ScionIRN' & ')
  1420. WriteCh('FAMILYP',person.MGETFULLNAME.SPOUSE)
  1421. WriteCh('FAMILYP',' 'flags.htmlb'Family'flags.htmlub' . ')
  1422. WriteCh('FAMILYP','<A HREF="'FamilyPrefix || mFGRN'.jpg">')
  1423. WriteCh('FAMILYP','<img src="'FamilyPrefix || mFGRN'.'flags.Thmbfmt'"></A>')
  1424. WriteLn('FAMILYP',' . 'flags.htmlb' Picture Album 'flags.htmlub'<HR><pre><tt>')
  1425. WriteCh('FAMILYP','another JPEG picture <A HREF="'FamilyPrefix || mFGRN)
  1426. WriteCh('FAMILYP','A1.jpg"><img src="')
  1427. WriteCh('FAMILYP',FamilyPrefix || mFGRN'A1.'flags.Thmbfmt'"></A> anchored by ')
  1428. WriteLn('FAMILYP','thumbnail image created by:')
  1429. WriteCh('FAMILYP','GfxCon 'FfilN'A1.jpg TO 'FfilN'A1.'flags.Thmbfmt' FORMAT ')
  1430. WriteCh('FAMILYP',flags.Thmbfmt' BOXFIT 'flags.Thumbnail' 'flags.Thumbnail)
  1431. WriteLn('FAMILYP','<HR></pre></tt>')
  1432. WriteLn('FAMILYP',''flags.htmlb'Edit'flags.htmlub' 'FfilN'A.htm 'flags.htmlb'to add more pictures to the Picture Album<P>')
  1433. WriteCH('FAMILYP','CAUTION: deleting Directory:'flags.htmlub' 'Gdir' 'flags.htmlb'destroys all Picture ')
  1434. WriteLn('FAMILYP',' Album modifications. YOUR WORK WILL BE LOST!'flags.htmlub'')
  1435. WriteLn('FAMILYP','</HTML>')
  1436.       Close('FAMILYP')
  1437.       end
  1438.      end
  1439.  
  1440.     if MARRIAGECELEBRANT ~= '' | Minfo | Palbum then do
  1441.      if Minfo then
  1442.       WriteCh('PERSONFILE',spcs'(<A HREF="'FamilyPrefix || mFGRN'I.htm"> ¶ </A>) ')
  1443.  
  1444.      if Exists(DBPATH'FP'mFGRN'.'DBNAME) & flags.DoPictures then do
  1445.       WriteCh('PERSONFILE',' (<A HREF="'FamilyPrefix || mFGRN'A.htm')
  1446.       WriteCh('PERSONFILE','">'flags.htmlb' ® 'flags.htmlub'</A>) ')
  1447.       end
  1448.  
  1449.      if Exists(DBPATH'FP'mFGRN'.'DBNAME) & flags.MakeGuide then do
  1450.       WriteCh('PERSONGuide',spcs' @{" Picture (®) " RXS "address command ')
  1451.       WriteCh('PERSONGuide',"'"flags.VIEWER" ")
  1452.       WriteCh('PERSONGuide',DBPATH'FP'mFGRN'.'DBNAME"'"'"')
  1453.       WriteLN('PERSONGuide','}')
  1454.       end
  1455.  
  1456.      if ( Exists(DBPATH'FP'mFGRN'.'DBNAME) & flags.DoPictures ) | Minfo then 
  1457.       WriteLn('PERSONFILE',' ')
  1458.  
  1459.      'GETCELEBRANT' mFGRN
  1460.      if RESULT ~= "" then PersOutputLn(spcs' Celebrant: 'RESULT,1)
  1461.      'GETWITNESS' mFGRN
  1462.      if RESULT ~= "" then PersOutputLn(spcs'   Witness: 'RESULT,1)
  1463.      'GETFAMCOMMENT' mFGRN
  1464.      if RESULT ~= "" then PersOutputLn(spcs'  Comments: 'RESULT,1)
  1465.      'GETENDDATE' mFGRN
  1466.      ENDDATE = RESULT
  1467.      'GETENDING' mFGRN
  1468.      ENDING = RESULT
  1469.      if ENDDATE ~= "" | ENDING > 0 then do
  1470.       PersOutputCh(spcs,0)
  1471.       PersOutputCh('     Ended: ',0)
  1472.       if ENDDATE ~= "" then PersOutputCh(ENDDATE,0)
  1473.       if ENDING = 1 then PersOutputCh(' · None',0)
  1474.       if ENDING = 2 then PersOutputCh(' · Divorce',0)
  1475.       if ENDING = 3 then PersOutputCh(' · Separation',0)
  1476.       if ENDING = 4 then PersOutputCh(' · Annulment',0)
  1477.       if ENDING = 5 then PersOutputCh(' · Death',0)
  1478.       PersOutputCr()
  1479.       end
  1480.  
  1481.      'GETFAMREFS' mFGRN
  1482.      if RESULT ~= "" then PersOutputLn(spcs'References: 'RESULT,1)
  1483.  
  1484.      if DoGenText then WriteLn('GenealogyText',spcs)
  1485.  
  1486.      if Minfo & ( DoGenText | flags.MakeGuide ) then do
  1487.       if flags.MakeGuide then WriteLn('PERSONGuide',spcs)
  1488.       Open('FNDBNAME',DBPATH'FN'mFGRN'.'DBNAME,'r')
  1489.       DO While ~EOF('FNDBNAME')
  1490.        line = ReadLn('FNDBNAME')
  1491.        if flags.MakeGuide then WriteLn('PERSONGuide',spcs'  'CheckGuideRepl(line))
  1492.        if DoGenText then 
  1493.         WriteLn('GenealogyText',spcs'  'CheckForNAReplacement(line))
  1494.        end
  1495.       Close('FNDBNAME')
  1496.       end
  1497.      end
  1498.  
  1499.      'GETNUMCHILD' mFGRN
  1500.      TOTCHILDREN = RESULT
  1501. /* say 'TOTCHILDREN = 'TOTCHILDREN */
  1502.      DO k = 0 TO TOTCHILDREN - 1
  1503.       'GETCHILD' mFGRN k
  1504.       mFGRNc = RESULT
  1505.  
  1506.       GetPerComp(mFGRNc)
  1507.  
  1508.       if person.GETFIRSTNAME.mFGRNc ~= "" then do
  1509.        HasCHILDREN = 1
  1510.  
  1511.        jk = MARRIAGES - i
  1512.        LastNameFl = 1
  1513.        if person.GETLASTNAME.mFGRNc = person.GETLASTNAME.ScionIRN then do
  1514.         LastNameFl = -1
  1515.         LastNameVal = person.GETLASTNAME.ScionIRN
  1516.         end
  1517.        PersOutputCh('    'vert.jk'    |_<'mFGRNc'>',LastNameFl)
  1518.        LastNameFl = 1
  1519.        BirthDeath(mFGRNc)
  1520.        PersOutputCr()
  1521.        end
  1522.       end
  1523.      end
  1524.     end
  1525.   end
  1526.  else do
  1527.   LastNameFl = 1
  1528.   if LASTNAME = FATHERLASTNAME then do
  1529.   LastNameFl = -1
  1530.    LastNameVal = FATHERLASTNAME
  1531.    end
  1532.   PersOutputLn('<'ScionIRN'>',1)
  1533.   LastNameFl = 1
  1534.  end
  1535.  
  1536.  if HasPARENTS then do
  1537.   if flags.verbose then say ' Ancestors...'
  1538.   PersOutputHL()
  1539.   PersOutputLn('Ancestors',0)
  1540.   if DoGenText then WriteLn('GenealogyText','')
  1541.   Paternal(ScionIRN,'  ')
  1542.   PersOutputCh('<'ScionIRN'>',1)
  1543.   if person.GETBIRTHDATE.ScionIRN ~= "" then
  1544.    PersOutputCh(' * 'person.GETBIRTHDATE.ScionIRN,0)
  1545.   if person.GETDEATHDATE.ScionIRN ~= "" & person.GETDEATHDATE.ScionIRN ~= "dead" then
  1546.    PersOutputCh(' + 'person.GETDEATHDATE.ScionIRN,0)
  1547.   PersOutputCr()
  1548.   Maternal(ScionIRN,'  ')
  1549.   end
  1550.  
  1551.  if HasCHILDREN then do
  1552.   if flags.verbose then say ' Descendants...'
  1553.   PersOutputHL()
  1554.   indent = "  "
  1555.   PersOutputLn('Descendants',0)
  1556.   if DoGenText then WriteLn('GenealogyText','')
  1557.   PersOutputCh(indent'<'ScionIRN'>',1)
  1558.   if person.GETBIRTHDATE.ScionIRN ~= "" then
  1559.    PersOutputCh(' * 'person.GETBIRTHDATE.ScionIRN,0)
  1560.   if person.GETDEATHDATE.ScionIRN ~= "" & person.GETDEATHDATE.ScionIRN ~= "dead" then
  1561.    PersOutputCh(' + 'person.GETDEATHDATE.ScionIRN,0)
  1562.   PersOutputCr()
  1563.   marriagesANDchildren(ScionIRN,indent)
  1564.   end
  1565. /*©*/
  1566.  WriteLn('PERSONFILE','</TT></PRE>')
  1567.  WriteLn('PERSONFILE','</HTML>')
  1568.  Close('PERSONFILE')
  1569.  if flags.MakeGuide then do
  1570.   WriteLn('PERSONGuide','@ENDNODE')
  1571.   Close('PERSONGuide')
  1572.   end
  1573. /*©*/
  1574. /*
  1575.  if flags.target = "NORMAL" & ValidInfo then do
  1576. */
  1577.  if flags.target = "NORMAL" then do
  1578.   if DoGenText then WriteLn('GenealogyText',' ')
  1579.   GeneaOutputCh('<'ScionIRN'>',1)
  1580.   if person.GETBIRTHDATE.ScionIRN ~= "" then
  1581.    GeneaOutputCh('  *'person.GETBIRTHDATE.ScionIRN,0)
  1582.   if person.GETDEATHDATE.ScionIRN ~= "" & person.GETDEATHDATE.ScionIRN ~= "dead" then
  1583.    GeneaOutputCh(' +'person.GETDEATHDATE.ScionIRN,0)
  1584.   if HasFATHER then do
  1585.    GeneaOutputCh(' · <'FATHERIRN'>',1)
  1586.    if HasMOTHER then GeneaOutputCh(' & <'MOTHERIRN'>',1)
  1587.    end
  1588.   else do
  1589.    if HasMOTHER then GeneaOutputCh(' · <'MOTHERIRN'>',1)
  1590.    end
  1591.   GeneaOutputCr() /* do not close, we have many more to go. */
  1592.   end
  1593.  return
  1594.  
  1595.  
  1596.  
  1597.  
  1598.  
  1599. IsNumeric: PROCEDURE
  1600.  PARSE ARG str
  1601.  return DataType(str, 'W')
  1602.  
  1603.  
  1604. /******************************** Makedir **********************************/
  1605.  
  1606. /* Makedir - If a directory under the given name already exists, or can be
  1607.    created, return 1, otherwise return 0. Though this function works
  1608.    correctly under Workbench 1.3, it has the same effect as the existing
  1609.    MAKEDIR; hence it is useful only under 2.0.
  1610. */
  1611. Makedir: procedure
  1612.  ds = statef(arg(1))
  1613.  if ds='' then
  1614.   result = 'MAKEDIR'(arg(1))
  1615.  else
  1616.   result = left(ds,3) = 'DIR'
  1617.  return result
  1618.  
  1619. Paternal: PROCEDURE EXPOSE person. Adir flags. DoGenText PersonPrefix DBNAME DBPATH
  1620.  PARSE ARG irn, indent
  1621.  'GETPARENTS' irn
  1622.  PARENTS = RESULT
  1623.  'GETPRINCIPAL' PARENTS
  1624.  PRINCIPAL = RESULT
  1625.  'GETSPOUSE' PARENTS
  1626.  SPOUSE = RESULT
  1627. /* say 'PRINCIPAL = 'PRINCIPAL' SPOUSE = 'SPOUSE */
  1628.  'GETSEX' PRINCIPAL
  1629.  if RESULT = 'M' then do
  1630.   FIRN = PRINCIPAL
  1631.   MIRN = SPOUSE
  1632.   end
  1633.  else do
  1634.   FIRN = SPOUSE
  1635.   MIRN = PRINCIPAL
  1636.   end
  1637.  pirn = FIRN
  1638.  if 't'pirn't' ~= 'tt' then do
  1639.   Paternal(pirn,indent'    ')
  1640.   PersOutputCh(indent' ,-',0)
  1641.   if pirnLASTNAME ~= "" then PersOutputCh('<'pirn'>',1)
  1642.   if EXISTS(DBPATH'PN'pirn'.'DBNAME) then PersOutputCh(' (¶)',0)
  1643.   if EXISTS(DBPATH'PP'pirn'.'DBNAME) then PersOutputCh(' (®)',0)
  1644.   BirthDeath(pirn)
  1645.   PersOutputCr()
  1646.   Maternal(pirn,indent'|   ')
  1647.   end
  1648.  return 0
  1649.  
  1650. Maternal: PROCEDURE EXPOSE person. Adir flags. DoGenText PersonPrefix DBNAME DBPATH
  1651.  PARSE ARG irn, indent
  1652.  'GETPARENTS' irn
  1653.  PARENTS = RESULT
  1654.  'GETPRINCIPAL' PARENTS
  1655.  PRINCIPAL = RESULT
  1656.  'GETSPOUSE' PARENTS
  1657.  SPOUSE = RESULT
  1658.  'GETSEX' PRINCIPAL
  1659.  if RESULT = 'M' then do
  1660.   FIRN = PRINCIPAL
  1661.   MIRN = SPOUSE
  1662.   end
  1663.  else do
  1664.   FIRN = SPOUSE
  1665.   MIRN = PRINCIPAL
  1666.   end
  1667.  pirn = MIRN
  1668.  if 't'pirn't' ~= 'tt' then do
  1669.   Paternal(pirn,indent'|   ')
  1670.   PersOutputCh(indent' `-',0)
  1671.   if pirnLASTNAME ~= "" then PersOutputCh('<'pirn'>',1)
  1672.   if EXISTS(DBPATH'PN'pirn'.'DBNAME) then PersOutputCh(' (¶)',0)
  1673.   if EXISTS(DBPATH'PP'pirn'.'DBNAME) then PersOutputCh(' (®)',0)
  1674.   BirthDeath(pirn)
  1675.   PersOutputCr()
  1676.   Maternal(pirn,indent'    ')
  1677.   end
  1678.  return 0
  1679.  
  1680. marriagesANDchildren: PROCEDURE EXPOSE person. Adir flags. DoGenText PersonPrefix DBNAME DBPATH
  1681.         PARSE ARG ScionIRN,indent
  1682.  'GETNUMMARRY' ScionIRN
  1683.  TOTMARRIAGES = RESULT
  1684. /* say 'TOTMARRIAGES = 'TOTMARRIAGES */
  1685.  
  1686.  if 't'TOTMARRIAGES't' = 'tt' then return 0
  1687.  
  1688.  DO i = 0 TO TOTMARRIAGES - 1
  1689.   'GETMARRIAGE' ScionIRN i
  1690.   MARRIAGE = RESULT
  1691.   if MARRIAGE > -1 then do
  1692.    MARRIAGES = i
  1693.    end
  1694.  end
  1695.  tMARRIAGESt = 't'MARRIAGES't'
  1696. /* Say 'MARRIAGES = 'MARRIAGES tMARRIAGESt */
  1697.  
  1698.  if tMARRIAGESt ~= 'tMARRIAGESt' then do
  1699.   DO i = 0 TO MARRIAGES
  1700.    'GETMARRIAGE' ScionIRN i
  1701.    mFGRN = RESULT
  1702.    if mFGRN ~= "" then do
  1703.     'GETSPOUSE' mFGRN
  1704.     SPOUSE = RESULT
  1705.     if SPOUSE = ScionIRN then
  1706.      DO
  1707.      'GETPRINCIPAL' mFGRN
  1708.      SPOUSE = RESULT
  1709.      end
  1710.     PersOutputCh(indent' & ',0)
  1711.     mindent = "  "
  1712.     if i <= ( MARRIAGES - 1 ) then mindent = " :"
  1713.     PersOutputCh('<'SPOUSE'>',1)
  1714. if EXISTS(DBPATH'PN'SPOUSE'.'DBNAME) then PersOutputCh(' (¶)',0)
  1715. if EXISTS(DBPATH'PP'SPOUSE'.'DBNAME) then PersOutputCh(' (®)',0)
  1716.     BirthDeath(SPOUSE)
  1717.     PersOutputCr()
  1718.     'GETNUMCHILD' mFGRN
  1719.     TOTCHILDREN = RESULT
  1720. /* say 'TOTCHILDREN = 'TOTCHILDREN */
  1721.     DO k = 0 TO TOTCHILDREN - 1
  1722.      'GETCHILD' mFGRN k
  1723.      mFGRNc = RESULT
  1724.      GetPerComp(mFGRNc)
  1725.      if k = ( TOTCHILDREN - 1 ) then do
  1726.       indent2 = indent||mindent" "
  1727.       PersOutputCh(indent||mindent'|_<'mFGRNc'>',1)
  1728.       end
  1729.      else do
  1730.       indent2 = indent||mindent"|"
  1731.       PersOutputCh(indent2'_<'mFGRNc'>',1)
  1732.       end
  1733. if EXISTS(DBPATH'PN'mFGRNc'.'DBNAME) then PersOutputCh(' (¶)',0)
  1734. if EXISTS(DBPATH'PP'mFGRNc'.'DBNAME) then PersOutputCh(' (®)',0)
  1735.      BirthDeath(mFGRNc)
  1736.      PersOutputCr()
  1737.  
  1738.      marriagesANDchildren(mFGRNc,indent2)
  1739.      end
  1740.     end
  1741.    end
  1742.   end
  1743.  return 0
  1744.  
  1745. PersOutputHL: PROCEDURE EXPOSE person. DoGenText flags.
  1746.  WriteLn('PERSONFILE','<HR>')
  1747.  if flags.MakeGuide then WriteLn('PERSONGuide','')
  1748.  if DoGenText then do
  1749.    WriteLn('GenealogyText','')
  1750.    WriteLn('GenealogyText','-----------------------------------------------------------')
  1751.    WriteLn('GenealogyText','')
  1752.    end
  1753.  return 0
  1754.  
  1755. BirthDeath: PROCEDURE EXPOSE person. DoGenText flags.
  1756.  irn = arg(1)
  1757. /* GetPerComp(irn) */
  1758.  if person.gotten.irn = PERSON.GOTTEN. then return 0
  1759.  if person.GETBIRTHDATE.irn ~= "" then
  1760.   PersOutputCh('   * 'person.GETBIRTHDATE.irn,0)
  1761.  if person.GETDEATHDATE.irn ~= "" then
  1762.   PersOutputCh('   + 'person.GETDEATHDATE.irn,0)
  1763.  return 0
  1764.  
  1765. PersOutputCr: PROCEDURE EXPOSE person. DoGenText flags.
  1766.  WriteLn('PERSONFILE','')
  1767.  if flags.MakeGuide then WriteLn('PERSONGuide','')
  1768.  if DoGenText then WriteLn('GenealogyText','')
  1769.  return 0
  1770.  
  1771. PersOutputCh: PROCEDURE EXPOSE person. Adir DoGenText flags. PersonPrefix LastNameFl LastNameVal
  1772.  if arg(1) ~= "" then do
  1773.   if arg(2) = 0 then do
  1774.    WriteCh('PERSONFILE',arg(1))
  1775.    if flags.MakeGuide then do
  1776.     if arg(1) = ' ('flags.htmlb'®'flags.htmlub')' then WriteCh('PERSONGuide',' (®)')
  1777.     else WriteCh('PERSONGuide',arg(1))
  1778.     end
  1779.    if DoGenText then WriteCh('GenealogyText',arg(1))
  1780.    end
  1781.   else do
  1782.    WriteCh('PERSONFILE',CheckForReplacement(arg(1)))
  1783.    if flags.MakeGuide then WriteCh('PERSONGuide',CheckGuideRepl(arg(1)))
  1784.    if DoGenText then WriteCh('GenealogyText',CheckForNAReplacement(arg(1)))
  1785.    end
  1786.  end
  1787.  return 0
  1788.  
  1789. PersOutputLn: PROCEDURE EXPOSE person. Adir DoGenText flags. PersonPrefix LastNameFl LastNameVal
  1790.  if arg(1) ~= "" then do
  1791.   if arg(2) = 0 then do
  1792.    WriteLn('PERSONFILE',arg(1))
  1793.    if flags.MakeGuide then WriteLn('PERSONGuide',arg(1))
  1794.    if DoGenText then WriteLn('GenealogyText',arg(1))
  1795.    end
  1796.   else do
  1797.    WriteLn('PERSONFILE',CheckForReplacement(arg(1)))
  1798.    if flags.MakeGuide then WriteLn('PERSONGuide',CheckGuideRepl(arg(1)))
  1799.    if DoGenText then WriteLn('GenealogyText',CheckForNAReplacement(arg(1)))
  1800.    end
  1801.  end
  1802.  return 0
  1803.  
  1804. GeneaOutputCr: PROCEDURE EXPOSE person. flags.
  1805.  WriteLn('GenealogyFile','<BR>')
  1806.  if flags.MakeGuide then WriteLn('GenealogyGuide','') 
  1807.  return 0
  1808.  
  1809. GeneaOutputCh: PROCEDURE EXPOSE person. Adir DoGenText flags. PersonPrefix LastNameFl LastNameVal
  1810.  if arg(1) ~= "" then do
  1811.   if arg(2) = 0 then do
  1812.    WriteCh('GenealogyFile',arg(1))
  1813.    if flags.MakeGuide then WriteCh('GenealogyGuide',arg(1))
  1814.    end
  1815.   else do
  1816.    WriteCh('GenealogyFile',CheckForReplacement(arg(1)))
  1817.    if flags.MakeGuide then WriteCh('GenealogyGuide',CheckGuideRepl(arg(1)))
  1818.    end
  1819.  end
  1820.  return 0
  1821.  
  1822. GeneaOutputLn: PROCEDURE EXPOSE person. Adir DoGenText flags. PersonPrefix LastNameFl LastNameVal
  1823.  if arg(1) ~= "" then do
  1824.   if arg(2) = 0 then do
  1825.    WriteLn('GenealogyFile',arg(1))
  1826.    WriteLn('GenealogyGuide',arg(1))
  1827.    end
  1828.   else do
  1829.    WriteLn('GenealogyFile',CheckForReplacement(arg(1)))
  1830.    WriteLn('GenealogyGuide',CheckGuideRepl(arg(1)))
  1831.    end
  1832.  end
  1833.  return 0
  1834.  
  1835. /***************************************************************
  1836. * Check for "<IRN>" and replace with Person Name (with anchor) *
  1837. ***************************************************************/
  1838.  
  1839. CheckForReplacement: PROCEDURE EXPOSE person. flags. PersonPrefix LastNameFl LastNameVal
  1840.  PARSE ARG line "<" last
  1841.  if last = "" then return line
  1842.  RIRN = GetRIRN(last".")
  1843.  if RIRN = 0 then return line"<"last
  1844.  last = CheckforReplacement(last)
  1845.  lastend = GetEnd(last".")
  1846.  GetPerComp(RIRN)
  1847.  RIRNFILENAME = PersonPrefix || RIRN
  1848.  if flags.bold then return line'<A HREF="'RIRNFILENAME'.htm">'person.GETFULLNAME.RIRN'</A>'lastend
  1849.  if LastNameFl = -1 & person.GETLASTNAME.RIRN = LastNameVal then do
  1850.   if person.GETSEX.RIRN = "M" then
  1851.    RIRNFULLNAME = ''flags.htmlb''person.GETFIRSTNAME.RIRN''flags.htmlub''
  1852.   else RIRNFULLNAME = ''flags.htmli''person.GETFIRSTNAME.RIRN''flags.htmlui''
  1853.   end
  1854.  else do
  1855.   if person.GETSEX.RIRN = "M" then
  1856.    RIRNFULLNAME = ''flags.htmlb''person.GETFULLNAME.RIRN''flags.htmlub''
  1857.   else RIRNFULLNAME = ''flags.htmli''person.GETFULLNAME.RIRN''flags.htmlui''
  1858.   end
  1859.  return line'<A HREF="'RIRNFILENAME'.htm">'RIRNFULLNAME'</A>'lastend
  1860.  
  1861. /******************************************************************
  1862. * Check for "<IRN>" and replace with Person Name (without anchor) *
  1863. ******************************************************************/
  1864.  
  1865. CheckForNAReplacement: PROCEDURE EXPOSE person. flags. PersonPrefix LastNameFl LastNameVal
  1866.  PARSE ARG line "<" last
  1867.  if last = "" then return line
  1868. /* if last = "" then return line */
  1869.  RIRN = GetRIRN(last".")
  1870.  if RIRN = 0 then return line"<"last
  1871.  last = CheckForNAReplacement(last)
  1872.  lastend = GetEnd(last".")
  1873.  GetPerComp(RIRN)
  1874.  if ~flags.bold then do
  1875.   if LastNameFl = -1 & person.GETLASTNAME.RIRN = LastNameVal then do
  1876.    if person.GETSEX.RIRN = "M" then
  1877.     RIRNFULLNAME = ''person.GETFIRSTNAME.RIRN''
  1878.    else
  1879.     RIRNFULLNAME = ''person.GETFIRSTNAME.RIRN''
  1880.    return line||RIRNFULLNAME lastend
  1881.    end
  1882.   else do
  1883.    if person.GETSEX.RIRN = "M" then
  1884.     RIRNFULLNAME = ''person.GETFULLNAME.RIRN''
  1885.    else
  1886.     RIRNFULLNAME = ''person.GETFULLNAME.RIRN''
  1887.    return line || RIRNFULLNAME lastend
  1888.    end
  1889.   end
  1890.  else do
  1891.   if LastNameFl = -1 & person.GETLASTNAME.RIRN = LastNameVal then
  1892.    RIRNFULLNAME = person.GETFIRSTNAME.RIRN
  1893.   else RIRNFULLNAME = person.GETFULLNAME.RIRN
  1894.   return line||RIRNFULLNAME lastend
  1895.   end
  1896.  
  1897. /****************************************************************
  1898. * Check for "<IRN>" and replace with Person Name (Guide anchor) *
  1899. ****************************************************************/
  1900.  
  1901. CheckGuideRepl: PROCEDURE EXPOSE Adir person. flags. PersonPrefix LastNameFl LastNameVal
  1902.  PARSE ARG line "<" last
  1903.  if last = "" then return line
  1904. /* if last = "" then return line */
  1905.  RIRN = GetRIRN(last".")
  1906.  if RIRN = 0 then return line"<"last
  1907.  last = CheckGuideRepl(last)
  1908.  lastend = GetEnd(last".")
  1909.  GetPerComp(RIRN)
  1910.  RIRNFILENAME = PersonPrefix || RIRN
  1911.  if LastNameFl = -1 & person.GETLASTNAME.RIRN = LastNameVal then 
  1912.   RIRNFULLNAME = person.GETFIRSTNAME.RIRN
  1913.  else RIRNFULLNAME = person.GETFULLNAME.RIRN
  1914.  if flags.bold then 
  1915.   return line'@{" 'RIRNFULLNAME' " LINK 'Adir'/'RIRNFILENAME'.guide/Main}'lastend
  1916.  thegender = 'i'
  1917.  if person.GETSEX.RIRN = "M" then thegender = 'b'
  1918.  return line'@{" " LINK 'Adir'/'RIRNFILENAME'.guide/Main}@{'thegender'}'RIRNFULLNAME'@{u'thegender'}'lastend
  1919.  
  1920. GetRIRN: PROCEDURE
  1921.  PARSE ARG numb ">" last
  1922.  if last = "" then return 0
  1923.  if IsNumeric(numb) then return numb
  1924.  return 0
  1925.  
  1926. GetEnd: PROCEDURE
  1927.  PARSE ARG line ">" last
  1928.  if last = "" then return substr(line,1,length(line)-1)
  1929.  return substr(last,1,length(last)-1)
  1930.  
  1931. GetLength: PROCEDURE
  1932.  PARSE UPPER ARG names
  1933.  nonletters = length(compress(names, xrange('A','Z')))
  1934.  return Length(names) - nonletters * 4 / 10
  1935.  
  1936.  
  1937. /* create a full name from first, last, and honorifics parts */
  1938.  
  1939. GetFullName: PROCEDURE EXPOSE person. thelastname
  1940.  PARSE ARG firstnames "," hon
  1941.  if hon = "" then do
  1942.   if length(firstnames) > 2 then
  1943.    if substr(firstnames,length(firstnames)-1,length(firstnames)) = "V." then
  1944.     firstnames = substr(firstnames,1,length(firstnames)-2)"v."
  1945.   return firstnames thelastname
  1946.   end
  1947.  return firstnames Space(thelastname)","hon
  1948.  
  1949. MGetFullName: PROCEDURE EXPOSE person. flags. thelastname thegender
  1950.  PARSE ARG firstnames "," hon
  1951.  if flags.bold then return firstnames Space(thelastname)
  1952.  gchar = "B"
  1953.  if thegender = "f" then gchar = "I"
  1954.  if hon = "" then do
  1955.   if length(firstnames) > 2 then
  1956.    if substr(firstnames,length(firstnames)-1,length(firstnames)) = "V." then
  1957.     firstnames = substr(firstnames,1,length(firstnames)-2)"v."
  1958.   return "<"gchar">"firstnames thelastname"</"gchar">"
  1959.   end
  1960.  return "<"gchar">"firstnames Space(thelastname)","hon"</"gchar">"
  1961.  
  1962. PGetFullName: PROCEDURE EXPOSE person. flags. thelastname thegender
  1963.  PARSE ARG firstnames "," hon
  1964.  if flags.bold then return firstnames Space(thelastname)
  1965.  schar = "1"
  1966.  uchar = "2"
  1967.  if thegender = "f" then do
  1968.   schar = "3"
  1969.   uchar = "3"
  1970.   end
  1971.  if hon = "" then do
  1972.   if length(firstnames) > 2 then
  1973.    if substr(firstnames,length(firstnames)-1,length(firstnames)) = "V." then
  1974.     firstnames = substr(firstnames,1,length(firstnames)-2)"v."
  1975.   return ""schar"m"firstnames thelastname""uchar"m"
  1976.   end
  1977.  return ""schar"m"firstnames Space(thelastname)","hon""uchar"m"
  1978.  
  1979. AgeTest: PROCEDURE EXPOSE flags.
  1980.  PARSE ARG DBFile, HTMFile
  1981.  if Exists(DBFile) then do
  1982.   if Exists(HTMFile) then do
  1983. Parse value StateF(DBFile) with type size blk bits DBday DBmin DBtick com
  1984. Parse value StateF(HTMFile) with type size blk bits HTMday HTMmin HTMtick com
  1985. /* Say DBFile DBday DBmin DBtick  HTMFile HTMday HTMmin HTMtick */
  1986.    if ( DBday > HTMday ) | ( DBday = HTMday & DBmin > HTMmin ) then do
  1987.     Delete(HTMFile)
  1988.     Say DBFile 'is newer; removing 'HTMFile
  1989.     return 1
  1990.     end
  1991.    else do
  1992.     if flags.verbose then Say '  ~ 'HTMFile'  ...OK... '
  1993.     return 0
  1994.     end
  1995.   return 1
  1996.   end
  1997.  return 1
  1998.  end
  1999.  
  2000. CheckPathName: PROCEDURE
  2001. PARSE ARG str
  2002. /* Check if path ends with a ":". If not, append a "/" */
  2003. lastchar = right(str,1)
  2004. if right(str,1) ~= ":" & right(str,1) ~= "/" then return str'/'
  2005. return str
  2006.  
  2007. AskExit: PROCEDURE
  2008.  SAY '                 '
  2009.  SAY '===> press RETURN to exit...'
  2010.  SAY ' '
  2011.  PULL target
  2012.  PauseExit()
  2013.  end
  2014.  
  2015. PauseExit: PROCEDURE
  2016.  SAY ' '
  2017.  SAY '    \                   /'
  2018.  SAY '     \                 / '
  2019.  SAY '                         '
  2020.  SAY '                         '
  2021.  SAY '       Scion2html.rexx   '
  2022.  SAY '                         '
  2023.  SAY '              ©          '
  2024.  SAY '                         '
  2025.  SAY '        Harold Ipolyi    '
  2026.  SAY '                         '
  2027.  SAY '                         '
  2028.  SAY '     /                 \ '
  2029.  SAY '    /                   \'
  2030.  SAY ' '
  2031.  EXIT
  2032.  end
  2033.  
  2034. CheckGfxCon: PROCEDURE
  2035. DoPictures = EXISTS("Sys:Tools/GfxCon")
  2036.  
  2037. if ~DoPictures then do
  2038.  SAY ' '
  2039.  say 'GfxCon not found in Sys:Tools - unable to include inline pictures in HTMLs'
  2040.  end
  2041. return DoPictures
  2042.  
  2043. Validtarget: PROCEDURE
  2044.  PARSE UPPER ARG str
  2045.  tval = substr(str,1,1)
  2046.  if verify(' BCDEFGHIJKLMOPSUVWXYZ.,<>-=\|+_)(*&^%$@!~[]{}`',tval,m) > 1 then
  2047.   return 0
  2048.  return 1
  2049.  
  2050.  
  2051. GetPerComp: PROCEDURE EXPOSE person. flags.
  2052.  PARSE ARG irn
  2053.  if irn = '' then return ""
  2054.  
  2055.  if ~person.gotten.irn then do
  2056.   person.gotten.irn = 1
  2057.  
  2058. /* name */
  2059.   'GETFIRSTNAME' irn
  2060.   person.GETFIRSTNAME.irn = RESULT
  2061.   'GETLASTNAME' irn
  2062.   person.GETLASTNAME.irn = RESULT
  2063.   thelastname = GetLastName(person.GETLASTNAME.irn)
  2064. /* requires `thelastname' above */
  2065.   person.GETFULLNAME.irn = GetFullName(person.GETFIRSTNAME.irn)
  2066. /* gender */
  2067.   'GETSEX' irn
  2068.   person.GETSEX.irn = RESULT
  2069.   thegender = GETSEX.irn
  2070. /* special names; requires `thegender' above */
  2071.   person.MGETFULLNAME.irn = MGetFullName(person.GETFIRSTNAME.irn)
  2072.   person.PGETFULLNAME.irn = PGetFullName(person.GETFIRSTNAME.irn)
  2073. /* dates */
  2074.   'GETBIRTHDATE' irn
  2075.   person.GETBIRTHDATE.irn = RESULT
  2076.   'GETDEATHDATE' irn
  2077.   person.GETDEATHDATE.irn = RESULT
  2078. /* places */
  2079.   'GETBIRTHPLACE' irn
  2080.   person.GETBIRTHPLACE.irn = RESULT
  2081.   'GETDEATHPLACE' irn
  2082.   person.GETDEATHPLACE.irn = RESULT
  2083.   end
  2084.  return 0 
  2085.  
  2086.  
  2087.  
  2088.  
  2089.  
  2090.  /* Capitalize last name; also handle special cases! */
  2091.  /* End users may wish to customize this code */
  2092.  
  2093. GetLastName: PROCEDURE
  2094.  
  2095. /* to use last names as is in data base, uncomment the following 2 lines: */
  2096. /* PARSE ARG str */
  2097. /* return str    */
  2098.  
  2099.  PARSE upper ARG str
  2100.  if str = "BAUER-GAUSS" then return "Bauer-Gauss"
  2101.  if ( str = "DE IPOLYI" ) | ( str = "DEIPOLYI" ) then return "deIpolyi"
  2102.  if str = "MC GRADY" then return "McGrady"
  2103.  if str = "MCFEE" then return "McFee"
  2104.  if str = "KIS RED" then return "KisRed"
  2105.  if str = "ROTH-HACKENSCHMIDT" then return "Roth-Hackenschmidt"
  2106.  if str = "SCHüCH-GLICKHFELDEN" then return "Schüch-Glickhfelden"
  2107.  if str = "VONRUDERFRUD" then return "Von Ruderfrud"
  2108.  if str = "VONHARBEN" then return "Von Harben"
  2109.  else
  2110.   DO
  2111.   spart = translate(substr(str,2,length(str)),xrange('a','z'),xrange('A','Z'))
  2112.   end
  2113.  return substr(str,1,1)Space(spart)
  2114.