home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #3 / amigamamagazinepolishissue1998.iso / bazy / scion407 / scionarexx.lha / Scion2html.rexx < prev    next >
OS/2 REXX Batch file  |  1995-07-08  |  62KB  |  1,706 lines

  1. /* © Harold H. Ipolyi        11 June 1994, 1995        */
  2.  
  3.  Thumbnail = 250    /* Thumbnail maximum dimension        */
  4.  Thumbformat = "GIF"    /* Thumbnail format { GIF | JPEG }    */
  5.  GeneralPrefix = ""    /* needs only be set for specific circumstances 
  6.              ( if this makes no sense, you don't need it :)
  7.  
  8. -------------------------------README----------------------------------------
  9. Short:    makes html's from ScionGenealogist database
  10. Uploader: ipolyi@pat.mdc.com (Harold H. Ipolyi)
  11. Author:   Harold H. Ipolyi
  12. Type:     util/rexx
  13. LastRev:  5 July 1995
  14.  
  15.  to make/remake html hypertexts from ScionGenealogist data bases
  16.  
  17.  WHY?    ScionGenealogist by Rob Akins is easy to use, comprehensive,
  18.     and provides Arexx ports for extracting data.
  19.  
  20.     An ARexx script can repeatedly and painlessly recreate
  21.     html files from entries in a ScionGenealogist data base.
  22.  
  23.     Mosaic, etc are available common methods of presentation.
  24.  
  25.  Notes:    at line 3, the Thumbnail image size may be specifed
  26.         at line 4, the Thumbnail image format may be specifed
  27.         at line 5, a specific file name prefix may be set
  28.  
  29.    (:  "uudecode Scion2html.rexx" <- extracts an interesting Genealogy :)
  30.    (:   hint: compare the names of the GreatGrandParents on both sides :)
  31.  
  32. IMPORTANT: replaces the original script called "ScionToMosaic.rexx"
  33.  
  34. -------------------------------README----------------------------------------
  35.  
  36. New: now includes PICTURES culled from PP{IRN}.DBNAME as inline links
  37.                   (please see PP & FP Notes)
  38.  
  39. Prerequisites: ScionGenealogist V 3.13 (or greater) by Rob Akins
  40.                rexxsupport.library
  41.                rexxarplib.library
  42.                html viewer (Mosaic, etc.)
  43.  
  44.          also:  (to incorporate and display pictures:)
  45.  
  46.                GfxCon V1.6 (or greater) by Dirk Farin (in Sys:Tools)
  47.                Amiga OS 3.0 (or greater) for picture datatypes
  48.  
  49. TESTED:        on Amiga3000 Kickstart v.37.175 Workbench v.38.35
  50.         &  Amiga3000 Kickstart v.40.68  Workbench v.40.42
  51.         w/ ScionGenealogist V 3.06 & Mosaic1.2NoNet
  52.         w/ ScionGenealogist V 3.13 & Mosaic1.3betaAmitcp
  53.  
  54.         html file compatibility tested on Sun NCSA Mosaic
  55.  
  56. Release History:
  57.  
  58.  11 Jun 1994 · ScionToMosaic.rexx for ScionGenealogist V 3.06
  59.  
  60.  19 Jun 1994 · MakeDir(Gdir) fixed; extra comments processed.
  61.  
  62.  25 Jun 1994 · Fixed descenders; Women in List italicised
  63.              · updated for ScionGenealogist V 3.13
  64.  
  65.   3 Sep 1994 · Replace occurrences of "<ScionIRN>" by NAMES from DB
  66.              · e.g. Replace <101> by Iam Onehundredone, Jr.
  67.              · Added Family Info file processing; Ancestor trees
  68.              · Added descendant charts
  69.              · Women italicised; men boldface everywhere
  70.              · Added creation of a textual file "GenealogyOf..."
  71.  
  72.   1 Mar 1995 · cleaned up bugs in creation of textual files
  73.  
  74.   6 Jun 1995 · renamed ScionToMosaic to Scion2html
  75.              ·   (somehow it kept winding up in "music" on AmiNet)
  76.              · date format in "ancestors" section normalized
  77.              · images used as links to picture albums (see
  78.              ·  PP & FP Notes) and links to pictures
  79.              · GfxCon V1.6 used for picture copying and reducing
  80.              · recoded for DOS/Windows restricted 8.3 file names
  81.  
  82.  26 Jun 1995 · A little comments cleanup after the last changes
  83.              · skip remaking of files when unnecessary
  84.              · another new wrinkle for one of the users:
  85.              ·     special file name prefixes     ( remember to  )
  86.              ·        look for and change:        ( change names )
  87.              ·     PersonPrefix & FamilyPrefix    ( of albums to )
  88.              ·      definitions ( if desired )    ( conform...   )
  89.  
  90.   1 Jul 1995 · added graphics to Ancestors charts
  91.              · allow family picture album sans family info file
  92.              · Thumbnail size now user settable ( at line 3 )
  93.  
  94.   5 Jul 1995 · (more info) » ( ¶ )
  95.              · (family info) » ( ¶ )
  96.              · (Picture Album) » ( ® )
  97.              · (¶) (®) glyphs added to Ancestor, Descendant charts
  98.              · Thumbnail format {GIF|JPEG} now user settable
  99.              ·  ( suffix still .gif in all cases )
  100.              ·
  101.              · for release with Scion4 distribution; but does not
  102.              · yet take advantage of new Scion4 ARexx commands:
  103.              · ( look for updates on AmiNet soon; say August )
  104.              ·
  105.  
  106.   -----------------------------------------------------------------
  107.  | Conventions that I followed in my ScionGenealogist data base:   |
  108.  |                                                                 |
  109.  | ·  lastnames kept pure (no honorifics, Jr's, III's )            |
  110.  |                                                                 |
  111.  | ·  given names have any and all honorifics AFTER a COMMA        |
  112.  |                                                                 |
  113.  |  for example:  LastName      FirstNames, honorifics             |
  114.  |                                                                 |
  115.  |                BAUER-GAUSS   Joseph, Dr.                        |
  116.  |                DAGLEY        Richard Kelley, Jr.                |
  117.  |                                                                 |
  118.  |-----------------------------------------------------------------|
  119.  |                                                                 |
  120.  |  For a name change (NOT maidenname > marriedname), try this:    |
  121.  |                New           Birth Name > Changed To, Ph. D.    |
  122.  |     which lists as: Birth Name > Changed To New, Ph. D.         |
  123.  |                                                                 |
  124.   -----------------------------------------------------------------
  125. «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
  126. »«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«
  127. «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
  128. »«                                                                »«
  129. «» GetLastName: PROCEDURE at end of script capitalizes Last Names »«
  130. «» -------------------------------------------------------------  «»
  131. »« | it can also be used to handle "non-conforming" Last Names |  »«
  132. «» |                e.g. "MAC ISAAC" --> "MacISAAC"            |  «»
  133. »« |                     "VON NUEMANN" --> "VonNuemann"        |  »«
  134. «» -------------------------------------------------------------  «»
  135. »« BUT: you must add the additional tests yourself (it's easy!)   »«
  136. «»                                                                «»
  137. «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
  138. »«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«
  139. «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
  140.  |-----------------------------------------------------------------|
  141.  |                                                                 |
  142.  | · if Death Date is blank; Death Place can be a COMMENT field    |
  143.  |                                            e.g. Phone #         |
  144.  | · if Burial Date is blank; Burial Place can be a COMMENT field  |
  145.  |                                            e.g. Address         |
  146.   -----------------------------------------------------------------
  147.  
  148.  * Run 'rx Scion2html.rexx' for further directions
  149.  
  150.  * 'rx Scion2html.rexx Normal' automagically [re]creates a .htm file
  151.  * for each person in your ScionGenealogist data base;
  152.  * following the TEMPLATE:
  153.  
  154. ############# begin genealogytemplate.html ####################################
  155. <HTML>
  156. <TITLE>Person Data Sheet</TITLE>
  157. <A href="P#A.htm"><img src="P#.gif"></A>
  158. <H2>Person (<A HREF="P#I.htm"><I> ¶ </I></A>) 
  159.  (<A href="P#A.htm"><B> ® </B></A>)
  160.  (<A href="Genealogy/GENEAFIL.htm"><B>List of Persons.</B></A>)
  161. </H2>
  162. <H3>
  163. Born: birthdate * birthplace <BR>
  164. Died: deathdate + deathplace . Buried: burialplace <BR>
  165. </H3>
  166. <HR>
  167. <H2>List of Persons in data base.</H2><P>
  168. <A HREF="P#.htm"><B>malePerson</B></A> * birthdate + deathdate <A HREF="Father.htm"><B>Father</B></A>_//\_<A HREF="Mother.htm"><I>Mother</I></A><BR>
  169. <A HREF="P#.htm"><I>femalePerson</I></A> * birthdate + deathdate <A HREF="Father.htm"><B>Father</B></A>_//\_<A HREF="Mother.htm"><I>Mother</I></A><BR>
  170. <HR>
  171. <H3>Immediate Family of <I>Person</I></H3>
  172. <PRE><TT>
  173.   <A HREF="Father.htm"><B>Father</B></A>_//\_<A HREF="Mother.htm"><I>Mother</I></A> & mdate @ mplace
  174.   |            <A HREF="Family#I.htm"><I> ¶ </i></A>
  175.   |_____ <A HREF="sibling1.htm">sibling1</A> * sibling1birthdate + sibling1deathdate
  176.   |_____ <A HREF="siblingN.htm">siblingN</A> * siblingNbirthdate + siblingNdeathdate
  177.   |             
  178.   <b>Person</b>_//\_<A HREF="Spouse1.htm">Spouse1</A> & m1date @ m1place
  179.   |  |  |            <A HREF="Family#I.htm"><I> ¶ </i> <B> ® </B></A>
  180.   |  |  |_____ <A HREF="m1child1.htm">m1child1</A> * m1child1birthdate + m1child1birthdate
  181.   |  |  |_____ <A HREF="m1childN.htm">m1childN</A> * m1childNbirthdate + m1childNbirthdate
  182.   |  |
  183.   |  |_//\_<A HREF="Spouse2.htm">Spouse2</A> & m2date @ m2place
  184.   |    |            <A HREF="Family#I.htm"><I> ¶ </i></A>
  185.   |    |_____ <A HREF="m2child1.htm">m2child1</A> * m2child1birthdate + m2child1birthdate
  186.   |    |_____ <A HREF="m2childN.htm">m2childN</A> * m2childNbirthdate + m2child2birthdate
  187.   |
  188.   |_//\_<A HREF="SpouseN.htm">SpouseN</A> & mNdate @ mNplace
  189.     |            <A HREF="Family#I.htm"><I> ¶ </i></A>
  190.     |_____ <A HREF="mNchild1.htm">mNchild1</A> * mNchild1birthdate + mNchild1birthdate
  191.     |_____ <A HREF="mNchildN.htm">mNchildN</A> * mNchildNbirthdate + mNchildNbirthdate
  192. </TT><PRE>
  193. <HR>
  194. <H3>Ancestors of <I>Person</I></H3>
  195. <TT>
  196.           ,-<A HREF="GreatGrandFather.htm"><B>GreatGrandFather</B></A> (FFF) * birthdate + deathdate
  197.       ,-<A HREF="GrandFather.htm"><B>GrandFather</B></A> (FF) * birthdate + deathdate
  198.      |    `-<A HREF="GreatGrandMother.htm"><I>GreatGrandMother</I></A> (FFM) * birthdate + deathdate
  199.   ,-<A HREF="Father.htm"><B>Father</B></A> (F) * birthdate + deathdate
  200.  |   |    ,-<A HREF="GreatGrandFather.htm"><B>GreatGrandFather</B></A> (FMF) * birthdate + deathdate
  201.  |    `-<A HREF="GrandMother.htm"><I>GrandMother</I></A> (FM) * birthdate + deathdate
  202.  |        `-<A HREF="GreatGrandMother.htm"><I>GreatGrandMother</I></A> (FMM) * birthdate + deathdate
  203. Person * birthdate + deathdate
  204.  |        ,-<A HREF="GreatGrandFather.htm"><B>GreatGrandFather</B></A> (MFF) * birthdate + deathdate
  205.  |    ,-<A HREF="GrandFather.htm"><B>GrandFather</B></A> (MF) * birthdate + deathdate
  206.  |   |    `-<A HREF="GreatGrandMother.htm"><I>GreatGrandMother</I></A> (MFM) * birthdate + deathdate
  207.   `-<A HREF="Mother.htm"><I>Mother</I></A> (M) * birthdate + deathdate
  208.      |    ,-<A HREF="GreatGrandFather.htm"><B>GreatGrandFather</B></A> (MMF) * birthdate + deathdate
  209.       `-<A HREF="GrandMother.htm"><I>GrandMother</I></A> (MM) * birthdate + deathdate
  210.           `-<A HREF="GreatGrandMother.htm"><I>GreatGrandMother</I></A> (MMM) * birthdate + deathdate
  211. </TT></PRE>
  212. <HR>
  213. <H3>
  214. <PRE><TT>
  215.      a template to represent Genealogy data in HTML hypertext.
  216.  * replace all ocurrences of each appropriate ITEM with ACTUAL DATA
  217.      e.g. search-replace-all Person with: My Name
  218.      e.g. query-search-replace Mother with: My Mother's Name
  219.  * judiciously edit .htm file names in anchors
  220.  * add/remove lines for children, siblings, spouses as necessary
  221. </TT></PRE>
  222. </H3>
  223. </HTML>
  224. ############### end genealogytemplate.html ###################################
  225.  
  226.  * In an HTML file (maybe HOME PAGE) have an anchor pointing to GenealogyFile:
  227.  
  228.  * ( see the hint at the end of a NORMAL run )
  229. _____________________________________________________________________________
  230.  
  231.  * The PN{IRN}.DBNAME files are used to generate the "more info" " ¶ " files.
  232.  
  233.  * Whenever the PN{IRN}.DBNAME is changed or replaced, the corresponding " ¶ "
  234.  * "more info " file will be updated if 'rx Scion2html.rexx {IRN}' is re-run.
  235.  
  236.  * PP & FP Notes: (personal & family pictures; picture albums " ® ")
  237.  * ScionGenealogist names pictures as;
  238.  *      PP{IRN}.DBNAME (personal) and FP{mFGRN}.DBNAME (family)
  239.  * {P|F}P{IRN|mFGRN}.DBNAME now used as pictures & links.
  240.  *    GfxCon is used to copy/reduce jpegs from {P|F}P{IRN|mFGRN}.DBNAME
  241.  *    reductions are anchors pointing to html's for pictures albums
  242.  *    reductions in pictures albums are anchors pointing to pictures
  243.  *  picture albums will not be overwritten; they may be updated with
  244.  *    additional pictures; links to other pictures, etc.
  245.  
  246.  * Whenever picture {P|F}P{IRN|mFGRN}.DBNAME is changed or replaced,
  247.  *  the corresponding jpegs will be updated
  248.  
  249.  * {P|F}P{IRN|mFGRN}.DBNAME may be any legal GfxCon input picture FORMAT
  250.  * (ILBM,RGB8,PCX,BMP,RLE8,TIFF,Targa,LBM,RGBN,IMG,RLE4,GIF,JPEG,RGB-Raw)
  251.  
  252. */
  253.  
  254.   IF GeneralPrefix = "" then GeneralPrefix = "GENEAFI"
  255.  
  256.  
  257. /* add libraries */
  258.         libs = 'rexxsupport.library rexxarplib.library'
  259.         DO i = 1 TO Words(libs)
  260.                 lib = Word(libs,i)
  261.                 IF ~Show('Lib',lib) THEN DO
  262.                         IF EXISTS('LIBS:'lib) then call addlib lib, 0, -30
  263.                         ELSE DO
  264.                                 'message "===> cannot find' lib 'in LIBS:"'
  265.                                 EXIT 10
  266.                         END
  267.                 END
  268.         END i
  269.  
  270. DoPictures = EXISTS("Sys:Tools/GfxCon")
  271.  
  272. IF ~DoPictures THEN DO
  273.  SAY ' '
  274.  say 'GfxCon not found in Sys:Tools - unable to include pictures'
  275.  END
  276.  
  277. Address "SCIONGEN"    /* Point at Scion Genealogist port */
  278. options RESULTS
  279.  
  280. P1 = ""
  281.  
  282. IF Show(p,'SCIONGEN') THEN DO
  283.  'GETDBNAME'     /* Issue GET DB NAME command to Scion Genealogist */
  284.  DBNAME = RESULT
  285.  END
  286.  
  287. PARSE ARG target
  288. target = Upper(strip(target,,'"')) /* just in case, remove errant quotes */
  289.  
  290. DO WHILE target = '' | target = '?' | target = 'INFO' | target = 'HELP'
  291.  SAY ' '
  292.  SAY '    please send comments, questions to:  ipolyi@pat.mdc.com'
  293.  SAY '                                        or:'
  294.  SAY '                 Scion2html.rexx  ©  Harold H. Ipolyi '
  295.  SAY '                                      P.O.Box 891206 '
  296.  SAY '                                      Houston, Tx 77289-1206 '
  297.  SAY '  _________________________________________________________'
  298.  SAY ' /                                                         \'
  299.  SAY '  [re]create html hypertext from ScionGenealogist data base '
  300.  SAY ' \_________________________________________________________/'
  301.  SAY ' '
  302.  SAY ' Usage: start Scion & load a genealogy database;'
  303.  SAY ' '
  304.  SAY '        back on WB, start a Shell;'
  305.  SAY ' '
  306.  SAY '        assign Genealogy: {Volume:Directory} (of Genealogy data base)'
  307.  SAY ' '
  308.  SAY '        cd to a target directory; i.e. wherein directory of html''s will/does exist'
  309.  SAY ' '
  310.  SAY '        execute:'
  311.  SAY ' '
  312.  SAY '           rx Scion2html.rexx Normal  -> recreates all .htm files'
  313.  SAY '                   or:'
  314.  SAY '           rx Scion2html.rexx IRN     -> specific person''s P{IRN}.htm file'
  315.  SAY ' '
  316.  IF DBNAME = "DBNAME" THEN EXIT
  317. /* EXIT
  318.  END
  319. */
  320.  SAY ' Enter "Normal" to recreate all P#.htm files; or'
  321.  SAY ' '
  322.  SAY ' a 'DBNAME' Scion data base "IRN" to recreate a specific P{IRN}.htm file.'
  323.  SAY ' '
  324.  PULL target
  325.  
  326. target = Upper(strip(target,,'"'))    /* just in case, remove errant quotes */
  327. END
  328.  
  329. IF target = '' | target = 'Q' | target = 'EXIT' | target = 'QUIT' THEN
  330.  EXIT
  331.  
  332. IF ~Show(p,'SCIONGEN') THEN DO
  333.  SAY ' '
  334.  SAY ' Cannot proceed because ScionGenealogist is NOT currently running:'
  335.  SAY ' '
  336.  SAY '    Please start Scion, load desired data base, then try again...'
  337.  SAY ' '
  338.  EXIT
  339.  END
  340.  
  341. IF target = 'N' THEN
  342.  target = 'NORMAL'
  343. IF target = 'T' THEN
  344.  target = 'TEST'
  345.  
  346. /* SAY target */
  347.  
  348. 'GETPROGVERSION'
  349. VERSION = RESULT
  350.  
  351. IF VERSION < 3.13 THEN DO
  352.  SAY ' '
  353.  say ' Requires VERSION = 3.13 or greater'
  354.  SAY ' '
  355.  EXIT
  356.  END
  357.          /* ??? GETDBDIRPATH ??? of Scion data base */
  358.  
  359. SAY ' '
  360. Say ' Testing: is data base assignment of Genealogy:'DBNAME' visible?'
  361. SAY ' '
  362.  
  363. PRAGMA('w','n')
  364. IF ~Exists("Genealogy:"DBNAME) THEN DO
  365.  SAY '      Genealogy:'DBNAME' not found,'
  366.  SAY ' '
  367.  SAY "     Please create an assign to directory containing data base "DBNAME":"
  368.  SAY ' '
  369.  SAY ' assign Genealogy: {Volume:Directory}'
  370.  SAY ' '
  371.  EXIT
  372.  END
  373.  
  374. PRAGMA('w','w')
  375.  
  376. Gdir = DBNAME'G'
  377. Tdir = DBNAME'T'
  378.  
  379. IF ~Makedir(Gdir) THEN DO
  380.  SAY ' '
  381.  SAY ' ===> unable to create directory: 'Gdir
  382.  SAY ' '
  383.  EXIT
  384.  END
  385.  
  386. IF ~Makedir(Tdir) THEN DO
  387.  SAY ' '
  388.  SAY ' ===> unable to create directory: 'Tdir
  389.  SAY ' '
  390.  EXIT
  391.  END
  392.  
  393.  
  394. 'GETTOTALIRN'        /* Issue command to Scion Genealogist */
  395.  TOTALIRN = RESULT
  396.  
  397. Say "Number of people in database " DBNAME " = " TOTALIRN
  398. SAY ' '
  399.  
  400. 'GETPERSLABEL' 1
  401. PERSLABEL1 = RESULT
  402. 'GETPERSLABEL' 2
  403. PERSLABEL2 = RESULT
  404. 'GETPERSLABEL' 3
  405. PERSLABEL3 = RESULT
  406. 'GETFAMLABEL' 1
  407. FAMLABEL1 = RESULT
  408. 'GETFAMLABEL' 2
  409. FAMLABEL2 = RESULT
  410. IF IsNumeric(target) THEN
  411.  DO
  412.  Say 'Processing person ' target ' of ' TOTALIRN ' in database ' DBNAME
  413.  
  414.  IF target <= TOTALIRN THEN DO
  415.   Open('GenealogyText',Tdir'/G'target,'w')
  416.   CALL MakeOne(target,0)
  417.   Close('GenealogyText')
  418.   END
  419.  END
  420. ELSE DO
  421.  target = Upper(target)
  422.  IF target = "TEST" THEN DO
  423.  
  424.   DO i = 1 TO 7
  425.   Open('GenealogyText',Tdir'/G'i,'w')
  426.   CALL MakeOne(i,0)
  427.   Close('GenealogyText')
  428.    END
  429.   END
  430.  ELSE DO
  431.   Say "Processing all " TOTALIRN " persons in database " DBNAME
  432.  
  433. /* GENEAFIL.htm is a Scion data base IRN order list of all persons in 
  434.    html format:
  435.  
  436.    person * birthdate + deathdate (()) father //\ mother */
  437.  
  438.   Say 'file name: 'Gdir'/'GeneralPrefix'L.htm for: List of Persons.'
  439.  
  440.   Open('GenealogyFile',Gdir'/'GeneralPrefix'L.htm','w')
  441.   WriteLn('GenealogyFile','<HTML>')
  442.   WriteLn('GenealogyFile','<TITLE>List of Persons.</TITLE>')
  443. WriteLn('GenealogyFile','<H2>List of Persons in data base "'DBNAME'". <B>'Time()' - 'Date()'</B></H2>')
  444.   WriteLn('GenealogyFile','<H3>')
  445.  
  446.   Open('GenealogyText',Tdir'/GenealogyOf'DBNAME,'w')
  447.   WriteLn('GenealogyText','Genealogy Data Base "'GetLastName(DBNAME)'"')
  448.   WriteLn('GenealogyText','')
  449.   WriteLn('GenealogyText','-----------------------------------------------------------')
  450.   WriteLn('GenealogyText','')
  451.  
  452.   DO i = 1 TO TOTALIRN
  453.    CALL MakeOne(i,1)
  454.    END
  455.   WriteLn('GenealogyFile','</H3>')
  456.   WriteLn('GenealogyFile','<HR>')
  457.   WriteCh('GenealogyFile','<Address><H3>')
  458.   WriteCh('GenealogyFile','<B>Amiga</B>® ')
  459.   'GETPROGVERSION'
  460.   VERSION = RESULT
  461.   WriteCh('GenealogyFile','(<A href="http://www.netnet.net/~aminet/dirs/')
  462.   WriteCh('GenealogyFile','biz_dbase.html"><B>Scion')
  463.   IF VERSION > 0 THEN WriteCh('GenealogyFile','V'VERSION)
  464.   WriteLn('GenealogyFile','</B></A> © <B>Robbie J Akins</B>) ')
  465.   if DoPictures THEN DO
  466.    WriteCh('GenealogyFile','(<A href="http://www.netnet.net/~aminet/dirs/')
  467.   WriteLn('GenealogyFile','gfx_conv.html"><B>GfxCon</B></A> © <B>Dirk Farin</B>) ')
  468.    END
  469.   WriteCh('GenealogyFile','(<A href="http://www.netnet.net/~aminet/dirs/')
  470.   WriteCh('GenealogyFile','util_rexx.html"><B>Scion2html.rexx</B></A> © ')
  471.   WriteCh('GenealogyFile','<A href="http://www.azstarnet.com/~dagley')
  472.   WriteCh('GenealogyFile','/IPOLYIG/P1.htm"><B>Harold Ipolyi</B></A>)')
  473.   WriteCh('GenealogyFile','</H3></Address>')
  474.   WriteLn('GenealogyFile','</HTML>')
  475.   END
  476. Say ' '
  477. ThisPath = PRAGMA('d')
  478. IF Substr(ThisPath,Length(ThisPath),Length(ThisPath)) ~= ":" THEN ThisPath = ThisPath'/'
  479. Say ' ---------------------------------------------------------------------'
  480. Say ' If you have not already done so, add the following anchor pointing to'
  481. Say ' "'GetLastName(DBNAME)' Genealogy" to a html file (maybe HOME PAGE):  '
  482. Say ' ---------------------------------------------------------------------'
  483. Say ' <A href="/'ThisPath||Gdir'/'GeneralPrefix'L.htm">'GetLastName(DBNAME)' Genealogy</A>'
  484. Say ' ---------------------------------------------------------------------'
  485. Say ' and maybe:'
  486. Say ' ---------------------------------------------------------------------'
  487. IF GeneralPrefix = "GENEAFI" THEN
  488.  Say ' <A href="/'ThisPath||Gdir'/P1.htm">Genealogy of 'P1'</A>'
  489. ELSE
  490.  Say ' <A href="/'ThisPath||Gdir'/'GeneralPrefix'P1.htm">Genealogy of 'P1'</A>'
  491. Say ' ---------------------------------------------------------------------'
  492.  END
  493. SAY ' '
  494. Say 'Scion2html.rexx completed normally'
  495. EXIT
  496.  
  497. /*************************************************************************/
  498.  
  499. MakeOne: PROCEDURE EXPOSE target Thumbnail Thumbformat P1 DBNAME GeneralPrefix Gdir Tdir DoPictures FAMLABEL1 FAMLABEL2 PERSLABEL1 PERSLABEL2 PERSLABEL3
  500.  PARSE ARG ScionIRN, EndOfFile
  501. 'EXISTPERSON' ScionIRN
  502. /**/
  503. if RESULT = 'YES' THEN DO
  504. /**/
  505.  
  506.  IF GeneralPrefix = "GENEAFI" THEN DO
  507.   PersonPrefix = "P"            /* Person file name prefix */
  508.   FamilyPrefix = "F"            /* Family file name prefix */
  509.   END
  510.  ELSE DO
  511.   PersonPrefix = GeneralPrefix"P"    /* Person file name prefix */
  512.   FamilyPrefix = GeneralPrefix"F"    /* Family file name prefix */
  513.   END
  514.  
  515.  IF FamilyPrefix = PersonPrefix THEN DO
  516.   say ' FamilyPrefix MUST NOT EQUAL PersonPrefix'
  517.   say ' 'FamilyPrefix'                           'PersonPrefix
  518.   EXIT
  519.   END
  520.  
  521.  HasFileFATHER = 0
  522.  HasFileMOTHER = 0
  523.  HasMOTHER = 0
  524.  HasFATHER = 0
  525.  HasPARENTS = 0
  526.  HasCHILDREN = 0
  527.  DoGenText = 0
  528.  'GETPARENTS' ScionIRN
  529.  PARENTS = RESULT
  530.  tPARENTSt = 't'PARENTS't'
  531. /* Say 'PARENTS = 'PARENTS tPARENTSt    ??? EXISTPARENTS IRN ??? */
  532.  IF tPARENTSt ~= 'tt' THEN HasPARENTS = 1
  533.  'GETMARRIAGE' ScionIRN 0    /*      ??? GETTOTMARRIAGES IRN ???     */
  534.  MARRIAGE = RESULT
  535.  tMARRIAGESt = 't'MARRIAGE't'
  536. /*    Say 'MARRIAGES = 'MARRIAGE tMARRIAGESt        */
  537.  IF tMARRIAGESt ~= 'tMARRIAGEt' THEN DO
  538.   mFGRN = MARRIAGE
  539.   'GETCHILD' mFGRN 0    /*    ??? GETTOTCHILDREN FGRN ???    */
  540.   'EXISTPERSON' RESULT
  541.   if RESULT = 'YES' then HasCHILDREN = 1
  542.  END
  543. /*
  544. Say 'PARENTS = 'PARENTS tPARENTSt 'MARRIAGES = 'MARRIAGES tMARRIAGESt 'HasPARENTS = 'HasPARENTS 'HasCHILDREN = 'HasCHILDREN
  545. */
  546.  IF ( HasPARENTS + HasCHILDREN ) = 1 THEN DoGenText = 1
  547. /**/
  548.  'GETLASTNAME' ScionIRN
  549.  LASTNAME = GetLastName(RESULT)
  550.  'GETFIRSTNAME' ScionIRN
  551.  FIRSTNAME = RESULT
  552.  'GETSEX' ScionIRN
  553.  GENDER = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  554.  thelastname = LASTNAME
  555.  thegender = GENDER
  556.  FULLNAME = GetFullName(FIRSTNAME)
  557.  IF ScionIRN = 1 THEN P1 = FULLNAME
  558.  MFULLNAME = MGetFullName(FIRSTNAME)
  559.  PFULLNAME = PGetFullName(FIRSTNAME)
  560.  'GETBIRTHDATE' ScionIRN
  561.  BIRTHDATE = RESULT
  562.  'GETBIRTHPLACE' ScionIRN
  563.  BIRTHPLACE = RESULT
  564.  'GETDEATHDATE' ScionIRN
  565.  DEATHDATE = RESULT
  566.  'GETDEATHPLACE' ScionIRN
  567.  DEATHPLACE = RESULT
  568.  'GETBURIALPLACE' ScionIRN
  569.  BURIALPLACE = RESULT
  570.  'GETPERSUSER1' ScionIRN
  571.  PERSUSER1 = CheckForReplacement(RESULT)
  572.  PERSUSERn1 = CheckForNAReplacement(RESULT)
  573.  'GETPERSUSER2' ScionIRN
  574.  PERSUSER2 = CheckForReplacement(RESULT)
  575.  PERSUSERn2 = CheckForNAReplacement(RESULT)
  576.  'GETPERSUSER3' ScionIRN
  577.  PERSUSER3 = CheckForReplacement(RESULT)
  578.  PERSUSERn3 = CheckForNAReplacement(RESULT)
  579.  ValidInfo = 0
  580.  IF LASTNAME ~= "" | PERSUSER1 ~= "" | PERSUSER2 ~= "" | PERSUSER3 ~= "" | BIRTHDATE ~= "" | BIRTHPLACE ~= "" | DEATHDATE ~= "" | DEATHPLACE ~= "" | BURIALPLACE ~= "" THEN ValidInfo = 1
  581. /**/
  582.  IF ~ValidInfo THEN DO
  583. Say "Person " ScionIRN"'s lacking information; no new html file being created!"
  584.   RETURN
  585.   END
  586.  IF target ~= "NORMAL" | ValidInfo | LASTNAME ~= "" THEN DoGenText = 1
  587.  PfilN = PersonPrefix || ScionIRN
  588. /**/
  589.  dPfilN = Gdir'/'PfilN
  590.  Say ''
  591.  Say 'html: 'dPfilN'.htm for: 'FULLNAME' {'ScionIRN'}'
  592.  Open('PERSONFILE',dPfilN'.htm','w')
  593.  WriteLn('PERSONFILE','<HTML>')
  594.  WriteLn('PERSONFILE','<TITLE>'FULLNAME' Data Sheet</TITLE>')
  595.  WriteLn('PERSONFILE','<PRE><TT>')
  596. /**/
  597.  IF Exists('Genealogy:PP'ScionIRN'.'DBNAME) & DoPictures THEN DO
  598. /**/
  599.   IF AgeTest('Genealogy:PP'ScionIRN'.'DBNAME, dPfilN'.jpg') THEN DO
  600.    Delete(dPfilN'.gif')
  601.    END
  602. /**/
  603.   WriteCh('PERSONFILE','   <A HREF="'PfilN'A.htm')
  604.   WriteLn('PERSONFILE','"><img src="'PfilN'.gif"></A>')
  605.   END
  606. /**/
  607. /* WriteCh('PERSONFILE','<H2>'MFULLNAME) */
  608.  WriteCh('PERSONFILE',MFULLNAME)
  609. /**/
  610.  IF Exists('Genealogy:PN'ScionIRN'.'DBNAME) THEN DO
  611.   IF AgeTest('Genealogy:PN'ScionIRN'.'DBNAME, dPfilN'I.htm') THEN DO
  612.    Say 'Writing info ¶ file 'dPfilN'I.htm'
  613.    Open('PNDBNAME','Genealogy:PN'ScionIRN'.'DBNAME,'r')
  614.    Open('PERSONI',dPfilN'I.htm','w')
  615.    WriteLn('PERSONI','<HTML>')
  616.    WriteLn('PERSONI','<TITLE>'FULLNAME' Information</TITLE>')
  617.    WriteCh('PERSONI','<A HREF="'PfilN'.htm">'MFULLNAME)
  618.    WriteCh('PERSONI','</A> Information. (<A HREF="'GeneralPrefix'L.htm">')
  619. /*   WriteLn('PERSONI','<B>List of persons.</B></A>)</H2><PRE><TT>') */
  620.    WriteLn('PERSONI','<B>List of persons.</B></A>)<PRE><TT>')
  621.    IF DoGenText THEN WriteLn('GenealogyText',PFULLNAME' Information.')
  622.    DO While ~EOF('PNDBNAME')
  623.     line = ReadLn('PNDBNAME')
  624.     WriteLn('PERSONI',CheckForReplacement(line))
  625.     IF DoGenText THEN WriteLn('GenealogyText',CheckForNAReplacement(line))
  626.     END
  627.    Close('PNDBNAME')
  628.    IF DoGenText THEN WriteLn('GenealogyText',' ')
  629.    WriteLn('PERSONI','</HTML>')
  630.    Close('PERSONI')
  631.    END
  632.    WriteCh('PERSONFILE',' (<A HREF="'PfilN'I.htm"> ¶ </A>)')
  633.   END
  634. /**/
  635.  IF Exists('Genealogy:PP'ScionIRN'.'DBNAME) & DoPictures THEN DO
  636. /**/
  637.  
  638.   IF ~Exists(dPfilN'.jpg') THEN DO
  639.    Say 'Creating picture 'dPfilN'.jpg'
  640. /*
  641. Say 'Sys:Tools/GfxCon Genealogy:PP'ScionIRN'.'DBNAME' TO 'dPfilN'.jpg FORMAT JPEG QUALITY 100'
  642. */
  643. address command 'Sys:Tools/GfxCon Genealogy:PP'ScionIRN'.'DBNAME' TO 'dPfilN'.jpg FORMAT JPEG QUALITY 100'
  644.    END
  645.   IF Exists(dPfilN'.gif') THEN DO
  646.    Say '  ~ image 'dPfilN'.gif  ...OK... '
  647.    END
  648.   ELSE DO
  649.    Say 'Creating image 'dPfilN'.gif'
  650. /*
  651. Say 'Sys:Tools/GfxCon Genealogy:PP'ScionIRN'.'DBNAME' TO 'dPfilN'.gif FORMAT 'Thumbformat' BOXFIT 'Thumbnail' 'Thumbnail
  652. */
  653. address command 'Sys:Tools/GfxCon Genealogy:PP'ScionIRN'.'DBNAME' TO 'dPfilN'.gif FORMAT 'Thumbformat' BOXFIT 'Thumbnail' 'Thumbnail
  654.    END                   
  655. WriteCh('PERSONFILE',' (<A HREF="'PfilN'A.htm"><B> ® </B></A>)')
  656.   IF Exists(dPfilN'A.htm') THEN DO
  657.    Say '  ~ picture album 'dPfilN'A.htm  ...OK... '
  658.    END
  659.   ELSE DO
  660.    Say 'Creating picture album ® 'dPfilN'A.htm'
  661.    Open('PERSONP',dPfilN'A.htm','w')
  662.    WriteLn('PERSONP','<HTML>')
  663.    WriteLn('PERSONP','<TITLE>'FULLNAME' Picture Album</TITLE>')
  664.    WriteCh('PERSONP',MFULLNAME' . ')
  665.    WriteCh('PERSONP','<A HREF="'PfilN'.jpg">')
  666.    WriteLn('PERSONP','<img src="'PfilN'.gif"></A>')
  667.    WriteLn('PERSONP',' . <B>Picture Album</B><HR>')
  668.    WriteCH('PERSONP','<H3>another JPEG picture <A HREF="'PfilN'A1.jpg"><img src="')
  669.    WriteLn('PERSONP',PfilN'A1.gif"></A> anchored by image')
  670.    WriteLn('PERSONP',' created by:<P>GfxCon 'dPfilN'A1.jpg TO 'dPfilN'A1.gif FORMAT ')
  671.    WriteLn('PERSONP',Thumbformat' BOXFIT 'Thumbnail' 'Thumbnail'<HR>')
  672.    WriteLn('PERSONP','Edit 'dPfilN'A.htm to add more pictures to the Picture Album<P>')
  673.    WriteCH('PERSONP','<B>CAUTION</B>: deleting Directory: 'Gdir' destroys all Picture ')
  674.    WriteLn('PERSONP',' Album modifications. YOUR WORK WILL BE LOST!</H3>')
  675.    WriteLn('PERSONP','</HTML>')
  676.    Close('PERSONP')
  677.    END
  678.   END
  679. /**/
  680.  WriteLn('PERSONFILE',' (<A HREF="'GeneralPrefix'L.htm"><B>List of persons.
  681. </B></A>)')
  682.  IF DoGenText THEN DO
  683.   IF target ~= "NORMAL" THEN Say 'Printable file: 'Tdir'/G'ScionIRN' for 'FULLNAME' {'ScionIRN'}'
  684.   WriteLn('GenealogyText','')
  685.   WriteLn('GenealogyText','-----------------------------------------------------------')
  686.   WriteLn('GenealogyText','')
  687.   WriteLn('GenealogyText',PFULLNAME' Data Sheet')
  688.   END
  689.  IF BIRTHDATE || BIRTHPLACE ~= "" THEN DO
  690.   WriteCh('PERSONFILE','Born: ')
  691.   IF BIRTHDATE ~= "" THEN WriteCh('PERSONFILE',BIRTHDATE)
  692.   IF BIRTHPLACE ~= "" THEN WriteCh('PERSONFILE',' * 'BIRTHPLACE)
  693.   WriteLn('PERSONFILE','')
  694.   IF BIRTHDATE ~= "" THEN IF DoGenText THEN WriteCh('GenealogyText','Born: 'BIRTHDATE)
  695.   IF BIRTHPLACE ~= "" THEN IF DoGenText THEN WriteCh('GenealogyText',' * 'BIRTHPLACE)
  696.   IF DoGenText THEN WriteLn('GenealogyText','')
  697.   END
  698.  IF DEATHDATE ~= "" THEN DO
  699.   WriteCh('PERSONFILE','Died: 'DEATHDATE' + 'DEATHPLACE)
  700.   IF DoGenText THEN WriteCh('GenealogyText','Died: 'DEATHDATE' + 'DEATHPLACE)
  701.   IF BURIALPLACE ~= "" THEN DO
  702.    WriteCh('PERSONFILE',' . Buried: 'BURIALPLACE)
  703.    IF DoGenText THEN WriteCh('GenealogyText',' . Buried: 'BURIALPLACE)
  704.    END
  705.   WriteLn('PERSONFILE','')
  706.   IF DoGenText THEN WriteLn('GenealogyText','')
  707.   END
  708.  ELSE DO
  709.   IF DEATHPLACE ~= "" THEN DO
  710.    WriteLn('PERSONFILE',DEATHPLACE)
  711.    IF DoGenText THEN WriteLn('GenealogyText',DEATHPLACE)
  712.    END
  713.   IF BURIALPLACE ~= "" THEN DO
  714.    WriteLn('PERSONFILE',BURIALPLACE)
  715.    IF DoGenText THEN WriteLn('GenealogyText',BURIALPLACE)
  716.    END
  717.   END
  718.  IF PERSUSER1 ~= "" THEN DO
  719.   WriteLn('PERSONFILE',PERSLABEL1': 'PERSUSER1)
  720.   IF DoGenText THEN WriteLn('GenealogyText',PERSLABEL1': 'PERSUSERn1)
  721.   END
  722.  IF PERSUSER2 ~= "" THEN DO
  723.   WriteLn('PERSONFILE',PERSLABEL2': 'PERSUSER2)
  724.   IF DoGenText THEN WriteLn('GenealogyText',PERSLABEL2': 'PERSUSERn2)
  725.   END
  726.  IF PERSUSER3 ~= "" THEN DO
  727.   WriteLn('PERSONFILE',PERSLABEL3': 'PERSUSER3)
  728.   IF DoGenText THEN WriteLn('GenealogyText',PERSLABEL3': 'PERSUSERn3)
  729.   END
  730.  
  731. /* end of personal data; start family tree segment */
  732.  
  733. /* WriteLn('PERSONFILE','<PRE><TT>') */
  734.  WriteLn('PERSONFILE','<HR>')
  735.  IF DoGenText THEN DO
  736.   WriteLn('GenealogyText','')
  737.   WriteLn('GenealogyText','-----------------------------------------------------------')
  738.   WriteLn('GenealogyText','')
  739.   END
  740.  WriteCh('PERSONFILE','<LI>Immediate Family of 'MFULLNAME)
  741.  WriteLn('PERSONFILE',' ( Parents, Siblings, Spouse, and Children )')
  742.  IF DoGenText THEN DO
  743.   WriteLn('GenealogyText','Immediate Family of 'PFULLNAME)
  744.   WriteLn('GenealogyText',' ( Parents, Siblings, Spouse, and Children )')
  745.   END
  746. /**/
  747.  IF HasPARENTS THEN DO
  748.   'GETPRINCIPAL' PARENTS
  749.   PRINCIPAL = RESULT
  750.   'GETSPOUSE' PARENTS
  751.   SPOUSE = RESULT
  752.   'GETMARRYDATE' PARENTS
  753.   PARENTSMARRIAGEDATE = RESULT
  754.   'GETMARRYPLACE' PARENTS
  755.   PARENTSmFGRNPLACE = RESULT
  756.   'GETFAMUSER1' PARENTS
  757.   PARENTSmFGRNCELEBRANT = CheckForReplacement(RESULT)
  758.   PARENTSnmFGRNCELEBRANT = CheckForNAReplacement(RESULT)
  759.   'GETFAMUSER2' PARENTS
  760.   PARENTSmFGRNCOMMENT = CheckForReplacement(RESULT)
  761.   PARENTSnmFGRNCOMMENT = CheckForNAReplacement(RESULT)
  762.   'GETSEX' PRINCIPAL
  763.   IF RESULT = 'M' THEN
  764.    DO
  765.    FATHERScionIRN = PRINCIPAL
  766.    MOTHERScionIRN = SPOUSE
  767.    END
  768.   ELSE
  769.    DO
  770.    FATHERScionIRN = SPOUSE
  771.    MOTHERScionIRN = PRINCIPAL
  772.    END
  773.   'GETLASTNAME' FATHERScionIRN
  774.   FATHERLASTNAME = GetLastName(RESULT)
  775.   'GETFIRSTNAME' FATHERScionIRN
  776.   FATHERFIRSTNAME = RESULT
  777.   IF FATHERFIRSTNAME ~= "" | FATHERLASTNAME ~= "" THEN HasFATHER = 1
  778.   thelastname = FATHERLASTNAME
  779.   thegender = "m"
  780.   FATHERFULLNAME = GetFullName(FATHERFIRSTNAME)
  781.   MFATHERFULLNAME = MGetFullName(FATHERFIRSTNAME)
  782.   PFATHERFULLNAME = PGetFullName(FATHERFIRSTNAME)
  783.   'GETBIRTHDATE' FATHERScionIRN
  784.   FATHERBIRTHDATE = RESULT
  785.   'GETLASTNAME' MOTHERScionIRN
  786.   MOTHERLASTNAME = GetLastName(RESULT)
  787.   'GETFIRSTNAME' MOTHERScionIRN
  788.   MOTHERFIRSTNAME = RESULT
  789.   IF MOTHERFIRSTNAME ~= "" | MOTHERLASTNAME ~= "" THEN HasMOTHER = 1
  790.   thelastname = MOTHERLASTNAME
  791.   thegender = "f"
  792.   MOTHERFULLNAME = GetFullName(MOTHERFIRSTNAME)
  793.   MMOTHERFULLNAME = MGetFullName(MOTHERFIRSTNAME)
  794.   PMOTHERFULLNAME = PGetFullName(MOTHERFIRSTNAME)  
  795.   'GETBIRTHDATE' MOTHERScionIRN
  796.   MOTHERBIRTHDATE = RESULT
  797. /**/
  798.   IF FATHERLASTNAME ~= "" THEN DO
  799.    HasFileFATHER = 1
  800.    FATHERFILENAME = PersonPrefix || FATHERScionIRN
  801.    END
  802. /**/
  803.   IF MOTHERLASTNAME ~= "" THEN DO
  804.    HasFileMOTHER = 1
  805.    MOTHERFILENAME = PersonPrefix || MOTHERScionIRN
  806.    END
  807. /**/
  808.   WriteCh('PERSONFILE','  ')
  809.   IF HasFileFATHER THEN WriteCh('PERSONFILE','<A HREF="'FATHERFILENAME'.htm">')
  810.   WriteCh('PERSONFILE',MFATHERFULLNAME)
  811.   IF HasFileFATHER THEN WriteCh('PERSONFILE','</A> //\ ')
  812.   IF HasFileMOTHER THEN WriteCh('PERSONFILE','<A HREF="'MOTHERFILENAME'.htm">')
  813.   WriteCh('PERSONFILE',MMOTHERFULLNAME)
  814.   IF HasFileMOTHER THEN WriteCh('PERSONFILE','</A>')
  815. /**/
  816.   IF PARENTSMARRIAGEDATE ~= "" THEN
  817. WriteCh('PERSONFILE',' & 'PARENTSMARRIAGEDATE)
  818.   IF PARENTSmFGRNPLACE ~= "" THEN
  819. WriteCh('PERSONFILE',' @ 'PARENTSmFGRNPLACE)
  820. /**/
  821.   WriteLn('PERSONFILE','')
  822.   IF DoGenText THEN DO
  823.    WriteCh('GenealogyText','  'PFATHERFULLNAME' //\ 'PMOTHERFULLNAME)
  824.  IF PARENTSMARRIAGEDATE ~= "" THEN WriteCh('GenealogyText',' & 'PARENTSMARRIAGEDATE)
  825.  IF PARENTSmFGRNPLACE ~= "" THEN WriteCh('GenealogyText',' @ 'PARENTSmFGRNPLACE)
  826.    WriteLn('GenealogyText','')
  827.    END
  828.   spcs = '  |'
  829.   DO i = 0 TO Length(FATHERFULLNAME)
  830.    spcs = spcs' '  /* ??? GETFAMLBL1 ??? */
  831.   END    /* ??? GETFAMLBL2 ??? */
  832. /**/
  833.  Minfo = Exists('Genealogy:FN'PARENTS'.'DBNAME)
  834.  IF PARENTSmFGRNCELEBRANT ~= '' | Minfo THEN DO
  835.   WriteCh('PERSONFILE',spcs)
  836.   IF Minfo THEN 
  837.    WriteCh('PERSONFILE','(<A HREF="'FamilyPrefix || PARENTS'I.htm"> ¶ </A>) ')
  838.   IF PARENTSmFGRNCELEBRANT ~= '' THEN DO
  839.    WriteCh('PERSONFILE',FAMLABEL1': 'PARENTSmFGRNCELEBRANT)
  840.    IF DoGenText THEN WriteLn('GenealogyText',spcs||FAMLABEL1': 'PARENTSnmFGRNCELEBRANT)
  841.    END
  842.   WriteLn('PERSONFILE','')
  843.   END
  844. IF PARENTSmFGRNCOMMENT ~= '' THEN DO
  845.  WriteLn('PERSONFILE',spcs' 'FAMLABEL2': 'PARENTSmFGRNCOMMENT)
  846.  IF DoGenText THEN WriteLn('GenealogyText',spcs' 'FAMLABEL2': 'PARENTSnmFGRNCOMMENT)
  847.   END
  848.   DO i = 0 TO 39   /* ??? GETTOTCHILDREN FGRN ??? */
  849.    'GETCHILD' PARENTS i
  850.    PARENTSc = RESULT
  851.    'GETFIRSTNAME' PARENTSc
  852.    PARENTScFIRSTNAME = RESULT
  853. /**/
  854.    IF PARENTScFIRSTNAME ~= "" THEN DO
  855.     IF PARENTSc ~= ScionIRN THEN DO
  856.      'GETLASTNAME' PARENTSc
  857.      PARENTScLASTNAME = GetLastName(RESULT)
  858.      'GETFIRSTNAME' PARENTSc
  859.      PARENTScFIRSTNAME = RESULT
  860.      'GETSEX' PARENTSc
  861.      PARENTScGENDER = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  862.      thelastname = PARENTScLASTNAME
  863.      thegender = PARENTScGENDER
  864.      PARENTScFULLNAME = GetFullName(PARENTScFIRSTNAME)
  865.      MPARENTScFULLNAME = MGetFullName(PARENTScFIRSTNAME)
  866.      PPARENTScFULLNAME = PGetFullName(PARENTScFIRSTNAME)
  867.      'GETBIRTHDATE' PARENTSc
  868.      PARENTScBIRTHDATE = RESULT
  869.      'GETDEATHDATE' PARENTSc
  870.      PARENTScDEATHDATE = RESULT
  871. /**/
  872.      PARENTScFILENAME = PersonPrefix || PARENTSc
  873. /**/
  874.      WriteCh('PERSONFILE','  |_____ <A HREF="'PARENTScFILENAME'.htm">')
  875. /**/
  876.      IF PARENTScLASTNAME ~= FATHERLASTNAME THEN
  877.       WriteCh('PERSONFILE',MPARENTScFULLNAME)
  878.     ELSE DO
  879.      IF PARENTScGENDER = "m" THEN WriteCh('PERSONFILE','<B>'PARENTScFIRSTNAME'</B>')
  880.      IF PARENTScGENDER = "f" THEN WriteCh('PERSONFILE','<I>'PARENTScFIRSTNAME'</I>')
  881.      END
  882. /**/
  883.     WriteCh('PERSONFILE','</A> ')
  884. /**/
  885.     IF PARENTScBIRTHDATE ~= "" THEN
  886.      WriteCh('PERSONFILE','   * 'PARENTScBIRTHDATE)
  887. /**/
  888.     IF PARENTScDEATHDATE ~= "" THEN
  889.      WriteCh('PERSONFILE','   + 'PARENTScDEATHDATE)
  890. /**/
  891.     WriteLn('PERSONFILE','')
  892.     IF DoGenText THEN DO
  893.      WriteCh('GenealogyText','  |_____  'PPARENTScFULLNAME)
  894.      IF PARENTScBIRTHDATE ~= "" THEN WriteCh('GenealogyText','   * 'PARENTScBIRTHDATE)
  895.      IF PARENTScDEATHDATE ~= "" THEN WriteCh('GenealogyText','   + 'PARENTScDEATHDATE)
  896.      WriteLn('GenealogyText','')
  897.      END
  898.     END
  899.    END
  900.   END
  901.  END
  902. END
  903.  
  904. /* end of parents, siblings segment; start marriages segment */
  905.  
  906. vert.0 = ''
  907. vert.1 = ' |'
  908. DO i = 0 TO 39                  /*      ??? GETTOTMARRIAGES IRN ???     */
  909.  'GETMARRIAGE' ScionIRN i
  910.  MARRIAGE = RESULT               /* use: 'EXISTFAMILY'   */
  911.  IF MARRIAGE > -1 THEN DO
  912.   MARRIAGES = i
  913.   j = i + 1
  914.   vert.j = vert.i vert.1
  915.   END
  916.  END
  917. tMARRIAGESt = 't'MARRIAGES't'
  918. /* Say 'MARRIAGES = 'MARRIAGES tMARRIAGESt */
  919.  
  920.  IF tMARRIAGESt ~= 'tMARRIAGESt' THEN DO
  921.   WriteLn('PERSONFILE','  |')
  922.   IF DoGenText THEN WriteLn('GenealogyText','  |')
  923.   DO i = 0 TO MARRIAGES
  924.    'GETMARRIAGE' ScionIRN i
  925.    mFGRN = RESULT
  926.    IF mFGRN ~= "" THEN DO
  927.     ki = MARRIAGES - i + 1
  928.     IF ki ~= MARRIAGES + 1 THEN DO
  929.      WriteLn('PERSONFILE',vert.ki)
  930.      IF DoGenText THEN WriteLn('GenealogyText',vert.ki)
  931.      END
  932.     j = MARRIAGES + 1 - i
  933.     'GETSPOUSE' mFGRN
  934.     SPOUSE = RESULT
  935.     IF SPOUSE = ScionIRN THEN DO
  936.      'GETPRINCIPAL' mFGRN
  937.      SPOUSE = RESULT
  938.      END
  939.     'GETLASTNAME' SPOUSE
  940.     SPOUSELASTNAME = GetLastName(RESULT)
  941.     'GETFIRSTNAME' SPOUSE
  942.     SPOUSEFIRSTNAME = RESULT
  943.     thelastname = SPOUSELASTNAME
  944.     'GETSEX' SPOUSE
  945.     thegender = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  946.     SPOUSEFULLNAME = GetFullName(SPOUSEFIRSTNAME)
  947.     MSPOUSEFULLNAME = MGetFullName(SPOUSEFIRSTNAME)
  948.     PSPOUSEFULLNAME = PGetFullName(SPOUSEFIRSTNAME)
  949.     'GETBIRTHDATE' SPOUSE
  950.     SPOUSEBIRTHDATE = RESULT
  951.     'GETMARRYDATE' mFGRN
  952.     MARRIAGEDATE = RESULT
  953.     'GETMARRYPLACE' mFGRN
  954.     mFGRNPLACE = RESULT
  955.     'GETFAMUSER1' mFGRN
  956.     MARRIAGECELEBRANT = CheckForReplacement(RESULT)
  957.     MARRIAGEnCELEBRANT = CheckForNAReplacement(RESULT)
  958.     'GETFAMUSER2' mFGRN
  959.     MARRIAGECOMMENT = CheckForReplacement(RESULT)
  960.     MARRIAGEnCOMMENT = CheckForNAReplacement(RESULT)
  961. /**/
  962.     SPOUSEFILENAME = PersonPrefix || SPOUSE
  963. /**/
  964.     IF i = 0 THEN DO
  965.      WriteCh('PERSONFILE','  'MFULLNAME' //\ ')
  966.      IF SPOUSELASTNAME ~= "" THEN WriteCh('PERSONFILE','<A HREF="'SPOUSEFILENAME'.htm">')
  967.      WriteCh('PERSONFILE',MSPOUSEFULLNAME)
  968.      IF SPOUSELASTNAME ~= "" THEN WriteCh('PERSONFILE','</A>')
  969.      IF DoGenText THEN DO
  970.       WriteCh('GenealogyText','  'PFULLNAME' //\ 'PSPOUSEFULLNAME)
  971.       IF MARRIAGEDATE ~= "" THEN WriteCh('GenealogyText',' & 'MARRIAGEDATE)
  972.       IF mFGRNPLACE ~= "" THEN WriteCh('GenealogyText',' @ 'mFGRNPLACE)
  973.       WriteLn('GenealogyText','')
  974.       END
  975.      END
  976.  
  977.     ELSE DO
  978.      WriteCh('PERSONFILE',vert.j'_ //\ ')
  979.      IF SPOUSELASTNAME ~= "" THEN WriteCh('PERSONFILE','<A HREF="'SPOUSEFILENAME'.htm">')
  980.      WriteCh('PERSONFILE',MSPOUSEFULLNAME)
  981.      IF SPOUSELASTNAME ~= "" THEN WriteCh('PERSONFILE','</A>')
  982.      IF DoGenText THEN DO
  983.       WriteCh('GenealogyText',vert.j'_ //\ 'PSPOUSEFULLNAME)
  984.       IF MARRIAGEDATE ~= "" THEN WriteCh('GenealogyText',' & 'MARRIAGEDATE)
  985.       IF mFGRNPLACE ~= "" THEN WriteCh('GenealogyText',' @ 'mFGRNPLACE)
  986.       WriteLn('GenealogyText','')
  987.       END
  988.      END
  989.  
  990.     IF MARRIAGEDATE ~= "" THEN WriteCh('PERSONFILE',' & 'MARRIAGEDATE)
  991.     IF mFGRNPLACE ~= "" THEN WriteCh('PERSONFILE',' @ 'mFGRNPLACE)
  992.     WriteLn('PERSONFILE','')
  993.     jk = MARRIAGES - i
  994.     spcs = vert.jk'      |     '
  995. /**/
  996.     FfilN = Gdir'/'FamilyPrefix || mFGRN
  997.     Minfo = 0
  998.     IF Exists('Genealogy:FN'mFGRN'.'DBNAME) THEN DO
  999.      Minfo = 1
  1000. /**/
  1001.      IF AgeTest('Genealogy:FN'mFGRN'.'DBNAME,FfilN'I.htm') THEN DO
  1002.       Say 'Writing info ¶ file 'FfilN'I.htm'
  1003.       Open('FNDBNAME','Genealogy:FN'mFGRN'.'DBNAME,'r')
  1004.       Open('FAMILYI',FfilN'I.htm','w')
  1005.       WriteLn('FAMILYI','<HTML>')
  1006.       WriteCh('FAMILYI','<TITLE>'MFULLNAME' //\ ')
  1007.       WriteLn('FAMILYI',MSPOUSEFULLNAME' Family Information</TITLE>')
  1008. /**/
  1009.       IF Exists('Genealogy:FP'mFGRN'.'DBNAME) & DoPictures THEN DO
  1010.        WriteCh('FAMILYI','<A HREF="'FamilyPrefix || mFGRN'A.htm')
  1011.        WriteCh('FAMILYI','"><img src="'FamilyPrefix || mFGRN'.gif"></A>')
  1012.        END
  1013. /**/
  1014.       WriteCh('FAMILYI','<H2>Family of 'MFULLNAME' //\ ')
  1015.       WriteCh('FAMILYI',MSPOUSEFULLNAME)
  1016. /**/
  1017.       IF Exists('Genealogy:FP'mFGRN'.'DBNAME) & DoPictures THEN DO
  1018.        WriteCh('FAMILYI',' (<A HREF="'FamilyPrefix || mFGRN'A.htm')
  1019.        WriteCh('FAMILYI','"><B> ® </B></A>) ')
  1020.        END
  1021. /**/
  1022.       WriteCh('FAMILYI',' (<A HREF="'GeneralPrefix'L.htm">')
  1023.       WriteLn('FAMILYI','<B>List of persons.</B></A>)</H2><PRE><TT>')
  1024.       DO While ~EOF('FNDBNAME')
  1025.        line = ReadLn('FNDBNAME')
  1026.        WriteLn('FAMILYI',CheckForReplacement(line))
  1027. IF DoGenText THEN WriteLn('GenealogyText',spcs'  'CheckForNAReplacement(line))
  1028.        END
  1029.       Close('FNDBNAME')
  1030.       WriteLn('FAMILYI','</HTML>')
  1031.       Close('FAMILYI')
  1032.       END
  1033.      END
  1034. /**/
  1035.     Palbum = 0
  1036.     IF Exists('Genealogy:FP'mFGRN'.'DBNAME) & DoPictures THEN DO
  1037. /**/
  1038.      Palbum = 1
  1039.      IF AgeTest('Genealogy:FP'mFGRN'.'DBNAME,FfilN'.jpg') THEN DO
  1040.       Delete(FfilN'.gif')
  1041.       END
  1042. /**/
  1043.      IF ~Exists(FfilN'.jpg') THEN DO
  1044.       Say 'Creating picture 'FfilN'.jpg'
  1045. /*
  1046. Say 'Sys:Tools/GfxCon Genealogy:FP'mFGRN'.'DBNAME' TO 'FfilN'.jpg FORMAT JPEG QUALITY 100'
  1047. */
  1048. address command 'Sys:Tools/GfxCon Genealogy:FP'mFGRN'.'DBNAME' TO 'FfilN'.jpg FORMAT JPEG QUALITY 100'
  1049.       END
  1050.      IF Exists(FfilN'.gif') THEN DO
  1051.       Say '  ~ image 'FfilN'.gif  ...OK... '
  1052.       END
  1053.      ELSE DO
  1054.       Say 'Creating image 'FfilN'.gif'
  1055. /*
  1056. Say 'Sys:Tools/GfxCon Genealogy:FP'mFGRN'.'DBNAME' TO 'FfilN'.gif FORMAT 'Thumbformat' BOXFIT 'Thumbnail' 'Thumbnail
  1057. */
  1058. address command 'Sys:Tools/GfxCon Genealogy:FP'mFGRN'.'DBNAME' TO 'FfilN'.gif FORMAT 'Thumbformat' BOXFIT 'Thumbnail' 'Thumbnail
  1059.       END
  1060.      IF Exists(FfilN'A.htm') THEN DO
  1061.       Say '  ~ picture album 'FfilN'A.htm  ...OK... '
  1062.       END
  1063.      ELSE DO
  1064.       Say 'Creating picture album ® 'FfilN'A.htm'
  1065.       Open('FAMILYP',FfilN'A.htm','w')
  1066. WriteLn('FAMILYP','<HTML>')
  1067. WriteCh('FAMILYP','<TITLE>'MFULLNAME' //\ ')
  1068. WriteCh('FAMILYP',MSPOUSEFULLNAME)
  1069. WriteLn('FAMILYP',' Family Picture Album</TITLE>')
  1070. WriteCh('FAMILYP',MFULLNAME' //\ ')
  1071. WriteCh('FAMILYP',MSPOUSEFULLNAME)
  1072. WriteCh('FAMILYP',' <B>Family</B> . ')
  1073. WriteCh('FAMILYP','<A HREF="'FamilyPrefix || mFGRN'.jpg">')
  1074. WriteCh('FAMILYP','<img src="'FamilyPrefix || mFGRN'.gif"></A>')
  1075. WriteLn('FAMILYP',' . <B> ® </B><HR>')
  1076. WriteCH('FAMILYP','another JPEG picture <A HREF="'FamilyPrefix || mFGRN'A1.jpg"><img src="')
  1077. WriteLn('FAMILYP',FamilyPrefix || mFGRN'A1.gif"></A> anchored by image')
  1078. WriteLn('FAMILYP',' created by:<P>GfxCon 'FfilN'A1.jpg TO 'FfilN'A1.gif FORMAT ')
  1079. WriteLn('FAMILYP',Thumbformat' BOXFIT 'Thumbnail' 'Thumbnail'<HR>')
  1080. WriteLn('FAMILYP','<B>Edit 'FfilN'A.htm to add more pictures to the Picture Album<P>')
  1081. WriteCH('FAMILYP','CAUTION: deleting Directory: 'Gdir' destroys all Picture ')
  1082. WriteLn('FAMILYP',' Album modifications. YOUR WORK WILL BE LOST!</B>')
  1083. WriteLn('FAMILYP','</HTML>')
  1084.       Close('FAMILYP')
  1085.       END
  1086.      END
  1087. /**/
  1088.     IF MARRIAGECELEBRANT ~= '' | Minfo | Palbum THEN DO
  1089.      WriteCh('PERSONFILE',spcs)
  1090.      IF Minfo THEN
  1091. WriteCh('PERSONFILE','(<A HREF="'FamilyPrefix || mFGRN'I.htm"> ¶ </A>) ')
  1092. /**/
  1093.      IF Exists('Genealogy:FP'mFGRN'.'DBNAME) & DoPictures THEN DO
  1094.       WriteCh('PERSONFILE',' (<A HREF="'FamilyPrefix || mFGRN'A.htm')
  1095.       WriteCh('PERSONFILE','"><B> ® </B></A>) ')
  1096.       END
  1097. /**/
  1098.      IF MARRIAGECELEBRANT ~= '' THEN DO
  1099. WriteCh('PERSONFILE',FAMLABEL1': 'MARRIAGECELEBRANT)
  1100. IF DoGenText THEN WriteLn('GenealogyText',spcs||FAMLABEL1': 'MARRIAGEnCELEBRANT)
  1101.       END
  1102.      WriteLn('PERSONFILE','')
  1103.      END
  1104.     IF MARRIAGECOMMENT ~= '' THEN DO
  1105. WriteLn('PERSONFILE',spcs'  'FAMLABEL2': 'MARRIAGECOMMENT)
  1106. IF DoGenText THEN WriteLn('GenealogyText',spcs'  'FAMLABEL2': 'MARRIAGEnCOMMENT)
  1107.      END
  1108. /*********************************************************************************/
  1109.      DO k = 0 TO 39            /*    ??? GETTOTCHILDREN FGRN ???    */
  1110.       'GETCHILD' mFGRN k
  1111.       mFGRNc = RESULT
  1112.       'GETFIRSTNAME' mFGRNc
  1113.       mFGRNcFIRSTNAME = RESULT
  1114. /**/
  1115.       IF mFGRNcFIRSTNAME ~= "" THEN DO
  1116.        HasCHILDREN = 1
  1117.        'GETLASTNAME' mFGRNc
  1118.        mFGRNcLASTNAME = GetLastName(RESULT)
  1119.        'GETFIRSTNAME' mFGRNc
  1120.        mFGRNcFIRSTNAME = RESULT
  1121.        'GETSEX' mFGRNc
  1122.        mFGRNcGENDER = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  1123.        thelastname = mFGRNcLASTNAME
  1124.        thegender = mFGRNcGENDER
  1125.        mFGRNcFULLNAME = GetFullName(mFGRNcFIRSTNAME)
  1126.        MmFGRNcFULLNAME = MGetFullName(mFGRNcFIRSTNAME)
  1127.        PmFGRNcFULLNAME = PGetFullName(mFGRNcFIRSTNAME)
  1128.        'GETBIRTHDATE' mFGRNc
  1129.        mFGRNcBIRTHDATE = RESULT
  1130.        'GETDEATHDATE' mFGRNc
  1131.        mFGRNcDEATHDATE = RESULT
  1132. /**/
  1133.        mFGRNcFILENAME = PersonPrefix || mFGRNc
  1134.        jk = MARRIAGES - i
  1135.        WriteCh('PERSONFILE',vert.jk'      |_____ <A HREF="'mFGRNcFILENAME'.htm">')
  1136. /**/
  1137.        IF mFGRNcLASTNAME ~= LASTNAME THEN WriteCh('PERSONFILE',MmFGRNcFULLNAME)
  1138.        ELSE DO
  1139.         IF mFGRNcGENDER = "m" THEN WriteCh('PERSONFILE','<B>'mFGRNcFIRSTNAME'</B>')
  1140.         IF mFGRNcGENDER = "f" THEN WriteCh('PERSONFILE','<I>'mFGRNcFIRSTNAME'</I>')
  1141.         END
  1142.        WriteCh('PERSONFILE','</A> ')
  1143. /**/
  1144.        IF mFGRNcBIRTHDATE ~= "" THEN WriteCh('PERSONFILE','   * 'mFGRNcBIRTHDATE)
  1145. /**/
  1146.        IF mFGRNcDEATHDATE ~= "" THEN WriteCh('PERSONFILE','   + 'mFGRNcDEATHDATE)
  1147.        Writeln('PERSONFILE','')
  1148.        IF DoGenText THEN DO
  1149.         WriteCh('GenealogyText',vert.jk'      |_____ 'PmFGRNcFULLNAME)
  1150.         IF mFGRNcBIRTHDATE ~= "" THEN WriteCh('GenealogyText','   * 'mFGRNcBIRTHDATE)
  1151.         IF mFGRNcDEATHDATE ~= "" THEN WriteCh('GenealogyText','   + 'mFGRNcDEATHDATE)
  1152.         WriteLn('GenealogyText','')
  1153.         END
  1154.        END
  1155.       END
  1156.      END
  1157. /*********************************************************************************/
  1158.     END
  1159.   END
  1160.  ELSE DO
  1161.   WriteLn('PERSONFILE','  |')
  1162.   IF DoGenText THEN WriteLn('GenealogyText','  |')
  1163.   WriteLn('PERSONFILE','  'MFULLNAME)
  1164.   IF DoGenText THEN WriteLn('GenealogyText','  'PFULLNAME)
  1165.  END
  1166. /* WriteLn('PERSONFILE','</TT></PRE>') */
  1167.  IF HasPARENTS THEN DO
  1168.   say ' Ancestors...'
  1169.   WriteLn('PERSONFILE','<HR>')
  1170. /*  WriteLn('PERSONFILE','<TT><PRE>') */
  1171.   IF DoGenText THEN DO
  1172.    WriteLn('GenealogyText','')
  1173.    WriteLn('GenealogyText','-----------------------------------------------------------')
  1174.    WriteLn('GenealogyText','')
  1175.    END
  1176.   WriteLn('PERSONFILE','<LI>Ancestors')
  1177.   IF DoGenText THEN WriteLn('GenealogyText',' Ancestors')
  1178.   IF DoGenText THEN WriteLn('GenealogyText','')
  1179.   Paternal(ScionIRN,'  ')
  1180.   WriteCh('PERSONFILE',MFULLNAME)
  1181.   IF BIRTHDATE ~= "" THEN WriteCh('PERSONFILE',' * 'BIRTHDATE)
  1182.   IF DEATHDATE ~= "" THEN WriteCh('PERSONFILE',' + 'DEATHDATE)
  1183.   WriteLn('PERSONFILE','')
  1184.   IF DoGenText THEN DO
  1185.    WriteCh('GenealogyText',PFULLNAME)
  1186.    IF BIRTHDATE ~= "" THEN WriteCh('GenealogyText',' * 'BIRTHDATE)
  1187.    IF DEATHDATE ~= "" THEN WriteCh('GenealogyText',' + 'DEATHDATE)
  1188.    WriteLn('GenealogyText','')
  1189.    END
  1190.   Maternal(ScionIRN,'  ')
  1191. /*  WriteLn('PERSONFILE','</TT></PRE>') */
  1192.   END
  1193. /* ELSE */
  1194. IF HasCHILDREN THEN DO
  1195.  say ' Descendants...'
  1196.   WriteLn('PERSONFILE','<HR>')
  1197. /*  WriteLn('PERSONFILE','<PRE><TT>') */
  1198.   IF DoGenText THEN DO
  1199.    WriteLn('GenealogyText','')
  1200.    WriteLn('GenealogyText','-----------------------------------------------------------')
  1201.    WriteLn('GenealogyText','')
  1202.    WriteLn('GenealogyText',' Descendants')
  1203.    WriteLn('GenealogyText','')
  1204.    END
  1205.   indent = "  "
  1206.   WriteLn('PERSONFILE','<LI>Descendants')
  1207.   WriteCh('PERSONFILE',indent||MFULLNAME)
  1208.   IF BIRTHDATE ~= "" THEN WriteCh('PERSONFILE',' * 'BIRTHDATE)
  1209.   IF DEATHDATE ~= "" THEN WriteCh('PERSONFILE',' + 'DEATHDATE)
  1210.   WriteLn('PERSONFILE','')
  1211.   IF DoGenText THEN DO
  1212.    WriteCh('GenealogyText',indent || PFULLNAME)
  1213.    IF BIRTHDATE ~= "" THEN WriteCh('GenealogyText',' * 'BIRTHDATE)
  1214.    IF DEATHDATE ~= "" THEN WriteCh('GenealogyText',' + 'DEATHDATE)
  1215.    WriteLn('GenealogyText','')
  1216.    END
  1217.   marriagesANDchildren(ScionIRN,indent)
  1218.   END
  1219. /*©*/
  1220.  WriteLn('PERSONFILE','</TT></PRE>')
  1221.  WriteLn('PERSONFILE','</HTML>')
  1222.  Close('PERSONFILE')
  1223.  IF EndOfFile & DoGenText THEN WriteLn('GenealogyText',' ')
  1224.  IF target = "NORMAL" & ValidInfo THEN DO
  1225.   WriteCh('GenealogyFile','<A HREF="'PfilN'.htm">')
  1226.   WriteCh('GenealogyFile',MFULLNAME)
  1227.   WriteCh('GenealogyFile','</A>')
  1228.   IF BIRTHDATE ~= "" THEN WriteCh('GenealogyFile','  *'BIRTHDATE)
  1229.   IF DEATHDATE ~= "" THEN WriteCh('GenealogyFile',' +'DEATHDATE)
  1230. /*********************************************************************************/
  1231. IF HasFATHER THEN DO
  1232.  WriteCh('GenealogyFile',' (()) ')
  1233.  IF HasFileFATHER THEN WriteCh('GenealogyFile','<A HREF="'FATHERFILENAME'.htm">')
  1234.  WriteCh('GenealogyFile',' 'MFATHERFULLNAME)
  1235.  IF HasFileFATHER THEN WriteCh('GenealogyFile','</A>')
  1236.  IF HasMOTHER THEN DO
  1237.   IF HasFATHER THEN WriteCh('GenealogyFile',' //\ ')
  1238.   IF HasFileMOTHER THEN WriteCh('GenealogyFile','<A HREF="'MOTHERFILENAME'.htm">')
  1239.   WriteCh('GenealogyFile',MMOTHERFULLNAME)
  1240.   IF HasFileMOTHER THEN WriteCh('GenealogyFile','</A>')
  1241.   END
  1242.  END
  1243. /*********************************************************************************/
  1244.  WriteLn('GenealogyFile','<BR>') /* do not close, we have many more to go. */
  1245. END
  1246.  
  1247.  RETURN
  1248.  
  1249.  
  1250.  
  1251.  
  1252.  
  1253. IsNumeric: PROCEDURE
  1254.  PARSE ARG str
  1255.  RETURN DataType(str, 'W')
  1256.  
  1257.  
  1258.  /* create a file name short but unique */
  1259.  
  1260. FilName: PROCEDURE
  1261.  PARSE ARG finm lanm bdate
  1262.  RETURN Space(substr(finm,1,2) substr(lanm,1,4) bdate)
  1263.  
  1264. /******************************** Makedir **********************************/
  1265.  
  1266. /* Makedir - If a directory under the given name already exists, or can be
  1267.    created, return 1, otherwise return 0. Though this function works
  1268.    correctly under Workbench 1.3, it has the same effect as the existing
  1269.    MAKEDIR; hence it is useful only under 2.0.
  1270. */
  1271. Makedir: procedure
  1272.    ds = statef(arg(1))
  1273.  
  1274.    if ds='' then
  1275.       result = 'MAKEDIR'(arg(1))
  1276.    else
  1277.       result = left(ds,3) = 'DIR'
  1278.  
  1279.    return result
  1280.  
  1281. CheckForReplacement: PROCEDURE EXPOSE PersonPrefix
  1282.  PARSE ARG line "<" last
  1283.  IF last = "" THEN RETURN CheckReplacement(line)
  1284.  RIRN = GetRIRN(last || ".")
  1285.  IF RIRN = 0 THEN RETURN line || "<" || last
  1286.  last = CheckForReplacement(last)  /* recursion */
  1287.  lastend = GetEnd(last || ".")
  1288.  'GETLASTNAME' RIRN
  1289.  RIRNLASTNAME = GetLastName(RESULT)
  1290.  'GETFIRSTNAME' RIRN
  1291.  RIRNFIRSTNAME = RESULT
  1292.  thelastname = RIRNLASTNAME
  1293.  'GETBIRTHDATE' RIRN
  1294.  RIRNBIRTHDATE = RESULT
  1295.  'GETSEX' RIRN
  1296.  IF translate(RESULT,xrange('a','z'),xrange('A','Z')) = "m" THEN
  1297.   RIRNFULLNAME = '<B>' || GetFullName(RIRNFIRSTNAME) || '</B>'
  1298.  ELSE
  1299.   RIRNFULLNAME = '<I>' || GetFullName(RIRNFIRSTNAME) || '</I>'
  1300.  IF RIRNLASTNAME = "" THEN
  1301.   RETURN line || RIRNFULLNAME || lastend
  1302.  RIRNFILENAME = PersonPrefix || RIRN
  1303.  RETURN line || '<A HREF="'RIRNFILENAME'.htm">'RIRNFULLNAME'</A>' || lastend
  1304.  
  1305. CheckReplacement: PROCEDURE EXPOSE PersonPrefix
  1306.  PARSE ARG line "[" last
  1307.  IF last = "" THEN RETURN line
  1308.  RIRN = GetaRIRN(last || ".")
  1309.  IF RIRN = 0 THEN RETURN line || "[" || last
  1310.  last = CheckForReplacement(last)  /* recursion */
  1311.  lastend = GetaEnd(last || ".")
  1312.  'GETLASTNAME' RIRN
  1313.  RIRNLASTNAME = GetLastName(RESULT)
  1314.  'GETFIRSTNAME' RIRN
  1315.  RIRNFIRSTNAME = RESULT
  1316.  thelastname = RIRNLASTNAME
  1317.  'GETBIRTHDATE' RIRN
  1318.  RIRNBIRTHDATE = RESULT
  1319.  'GETSEX' RIRN
  1320.  IF translate(RESULT,xrange('a','z'),xrange('A','Z')) = "m" THEN
  1321.   RIRNFULLNAME = '<B>' || GetFullName(RIRNFIRSTNAME) || '</B>'
  1322.  ELSE
  1323.   RIRNFULLNAME = '<I>' || GetFullName(RIRNFIRSTNAME) || '</I>'
  1324.  IF RIRNLASTNAME = "" THEN
  1325.   RETURN line || RIRNFULLNAME || lastend
  1326.  RIRNFILENAME = PersonPrefix || RIRN
  1327.  RETURN line || '<A HREF="'RIRNFILENAME'.htm">'RIRNFULLNAME'</A>' || lastend
  1328.  
  1329. CheckForNAReplacement: PROCEDURE EXPOSE PersonPrefix
  1330.  PARSE ARG line "<" last
  1331.  IF last = "" THEN RETURN CheckNAReplacement(line)
  1332.  RIRN = GetRIRN(last || ".")
  1333.  IF RIRN = 0 THEN RETURN line || "<" || last
  1334.  last = CheckForNAReplacement(last)  /* recursion */
  1335.  lastend = GetEnd(last || ".")
  1336.  'GETLASTNAME' RIRN
  1337.  RIRNLASTNAME = GetLastName(RESULT)
  1338.  'GETFIRSTNAME' RIRN
  1339.  RIRNFIRSTNAME = RESULT
  1340.  thelastname = RIRNLASTNAME
  1341.  'GETBIRTHDATE' RIRN
  1342.  RIRNBIRTHDATE = RESULT
  1343.  'GETSEX' RIRN
  1344.  GENDER = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  1345. /* thelastname = GetFullName(RIRNLASTNAME)    */
  1346.  thegender = GENDER
  1347.  IF thegender = "m" THEN
  1348.   RIRNFULLNAME = '' || GetFullName(RIRNFIRSTNAME) || ''
  1349.  ELSE
  1350.   RIRNFULLNAME = '' || GetFullName(RIRNFIRSTNAME) || ''
  1351.  RETURN line || RIRNFULLNAME lastend
  1352.  
  1353. CheckNAReplacement: PROCEDURE EXPOSE PersonPrefix
  1354.  PARSE ARG line "[" last
  1355.  IF last = "" THEN RETURN line
  1356.  RIRN = GetaRIRN(last || ".")
  1357.  IF RIRN = 0 THEN RETURN line || "[" || last
  1358.  last = CheckForNAReplacement(last)  /* recursion */
  1359.  lastend = GetaEnd(last || ".")
  1360.  'GETLASTNAME' RIRN
  1361.  RIRNLASTNAME = GetLastName(RESULT)
  1362.  'GETFIRSTNAME' RIRN
  1363.  RIRNFIRSTNAME = RESULT
  1364.  thelastname = RIRNLASTNAME
  1365.  'GETBIRTHDATE' RIRN
  1366.  RIRNBIRTHDATE = RESULT
  1367.  'GETSEX' RIRN
  1368.  GENDER = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  1369. /* thelastname = GetFullName(RIRNLASTNAME)    */
  1370.  thegender = GENDER
  1371.  IF thegender = "m" THEN
  1372.   RIRNFULLNAME = '' || GetFullName(RIRNFIRSTNAME) || ''
  1373.  ELSE
  1374.   RIRNFULLNAME = '' || GetFullName(RIRNFIRSTNAME) || ''
  1375.  RETURN line || RIRNFULLNAME lastend
  1376.  
  1377. Paternal: PROCEDURE EXPOSE DoGenText PersonPrefix DBNAME
  1378.  PARSE ARG irn, indent
  1379.  'GETPARENTS' irn
  1380.  PARENTS = RESULT
  1381.  'GETPRINCIPAL' PARENTS
  1382.  PRINCIPAL = RESULT
  1383.  'GETSPOUSE' PARENTS
  1384.  SPOUSE = RESULT
  1385.  'GETSEX' PRINCIPAL
  1386.  IF RESULT = 'M' THEN DO
  1387.   FIRN = PRINCIPAL
  1388.   MIRN = SPOUSE
  1389.   END
  1390.  ELSE DO
  1391.   FIRN = SPOUSE
  1392.   MIRN = PRINCIPAL
  1393.   END
  1394.  pirn = FIRN
  1395.  IF 't'pirn't' ~= 'tt' THEN DO
  1396.   Paternal(pirn,indent'      ')
  1397.   'GETLASTNAME' pirn
  1398.   pirnLASTNAME = GetLastName(RESULT)
  1399.   thelastname = pirnLASTNAME
  1400.   'GETFIRSTNAME' pirn
  1401.   pirnFIRSTNAME = RESULT
  1402.   pirnFULLNAME = GetFullName(pirnFIRSTNAME)
  1403.   'GETBIRTHDATE' pirn
  1404.   pirnBIRTHDATE = RESULT
  1405.   IF pirnLASTNAME ~= "" THEN
  1406.    pirnPfilN = PersonPrefix || pirn
  1407.   WriteCh('PERSONFILE',indent' ,-')
  1408.   IF pirnLASTNAME ~= "" THEN WriteCh('PERSONFILE','<A HREF="'pirnPfilN'.htm">')
  1409.   WriteCh('PERSONFILE','<B>'pirnFULLNAME'</B>')
  1410.   IF EXISTS('Genealogy:PN'pirn'.'DBNAME) THEN WriteCh('PERSONFILE',' (¶)')
  1411.   IF EXISTS('Genealogy:PP'pirn'.'DBNAME) THEN WriteCh('PERSONFILE',' (<B>®</B>)')
  1412.   IF pirnLASTNAME ~= "" THEN WriteCh('PERSONFILE','</A>')
  1413.   IF pirnBIRTHDATE ~= "" THEN WriteCh('PERSONFILE',' * 'pirnBIRTHDATE)
  1414.   'GETDEATHDATE' pirn
  1415.   pirnDEATHDATE = RESULT
  1416.   IF pirnDEATHDATE ~= "" THEN WriteCh('PERSONFILE',' + 'pirnDEATHDATE)
  1417.   WriteLn('PERSONFILE','')
  1418.   IF DoGenText THEN DO
  1419.    WriteCh('GenealogyText',indent' ,-'pirnFULLNAME)
  1420.    IF pirnBIRTHDATE ~= "" THEN WriteCh('GenealogyText',' * 'pirnBIRTHDATE)
  1421.    IF pirnDEATHDATE ~= "" THEN WriteCh('GenealogyText',' + 'pirnDEATHDATE)
  1422.    WriteLn('GenealogyText','')
  1423.    END
  1424.   Maternal(pirn,indent'|     ')
  1425.   END
  1426.  RETURN 0
  1427.  
  1428. Maternal: PROCEDURE EXPOSE DoGenText PersonPrefix DBNAME
  1429.  PARSE ARG irn, indent
  1430.  'GETPARENTS' irn
  1431.  PARENTS = RESULT
  1432.  'GETPRINCIPAL' PARENTS
  1433.  PRINCIPAL = RESULT
  1434.  'GETSPOUSE' PARENTS
  1435.  SPOUSE = RESULT
  1436.  'GETSEX' PRINCIPAL
  1437.  IF RESULT = 'M' THEN DO
  1438.   FIRN = PRINCIPAL
  1439.   MIRN = SPOUSE
  1440.   END
  1441.  ELSE DO
  1442.   FIRN = SPOUSE
  1443.   MIRN = PRINCIPAL
  1444.   END
  1445.  pirn = MIRN
  1446.  IF 't'pirn't' ~= 'tt' THEN DO
  1447.   Paternal(pirn,indent'|     ')
  1448.   'GETLASTNAME' pirn
  1449.   pirnLASTNAME = GetLastName(RESULT)
  1450.   thelastname = pirnLASTNAME
  1451.   'GETFIRSTNAME' pirn
  1452.   pirnFIRSTNAME = RESULT
  1453.   pirnFULLNAME = GetFullName(pirnFIRSTNAME)
  1454.   'GETBIRTHDATE' pirn
  1455.   pirnBIRTHDATE = RESULT
  1456.   IF pirnLASTNAME ~= "" THEN
  1457.    pirnPfilN = PersonPrefix || pirn
  1458.   WriteCh('PERSONFILE',indent' `-')
  1459.   IF pirnLASTNAME ~= "" THEN WriteCh('PERSONFILE','<A HREF="'pirnPfilN'.htm">')
  1460.   WriteCh('PERSONFILE','<I>'pirnFULLNAME'</I>')
  1461.   IF EXISTS('Genealogy:PN'pirn'.'DBNAME) THEN WriteCh('PERSONFILE',' (¶)')
  1462.   IF EXISTS('Genealogy:PP'pirn'.'DBNAME) THEN WriteCh('PERSONFILE',' (<B>®</B>)')
  1463.   IF pirnLASTNAME ~= "" THEN WriteCh('PERSONFILE','</A>')
  1464.   IF pirnBIRTHDATE ~= "" THEN WriteCh('PERSONFILE',' * 'pirnBIRTHDATE)
  1465.   'GETDEATHDATE' pirn
  1466.   pirnDEATHDATE = RESULT
  1467.   IF pirnDEATHDATE ~= "" THEN WriteCh('PERSONFILE',' + 'pirnDEATHDATE)
  1468.   WriteLn('PERSONFILE','')
  1469.   IF DoGenText THEN DO
  1470.    WriteCh('GenealogyText',indent' `-'pirnFULLNAME)
  1471.    IF pirnBIRTHDATE ~= "" THEN WriteCh('GenealogyText',' * 'pirnBIRTHDATE)
  1472.    IF pirnDEATHDATE ~= "" THEN WriteCh('GenealogyText',' + 'pirnDEATHDATE)
  1473.    WriteLn('GenealogyText','')
  1474.    END
  1475.   Maternal(pirn,indent'      ')
  1476.   END
  1477.  RETURN 0
  1478.  
  1479. marriagesANDchildren: PROCEDURE EXPOSE DoGenText PersonPrefix DBNAME
  1480.         PARSE ARG ScionIRN,indent
  1481.  DO i = 0 TO 39   /* ??? GETTOTMARRIAGES IRN ??? */
  1482.   'GETMARRIAGE' ScionIRN i
  1483.   MARRIAGE = RESULT
  1484.   IF MARRIAGE > -1 THEN DO
  1485.    MARRIAGES = i
  1486.    END
  1487.  END
  1488.  tMARRIAGESt = 't'MARRIAGES't'
  1489. /*      Say 'MARRIAGES = 'MARRIAGES tMARRIAGESt */
  1490.  
  1491.  IF tMARRIAGESt ~= 'tMARRIAGESt' THEN DO
  1492.   DO i = 0 TO MARRIAGES
  1493.    'GETMARRIAGE' ScionIRN i
  1494.    mFGRN = RESULT
  1495.    IF mFGRN ~= "" THEN DO
  1496.     'GETSPOUSE' mFGRN
  1497.     SPOUSE = RESULT
  1498.     IF SPOUSE = ScionIRN THEN
  1499.      DO
  1500.      'GETPRINCIPAL' mFGRN
  1501.      SPOUSE = RESULT
  1502.      END
  1503.     'GETLASTNAME' SPOUSE
  1504.     SPOUSELASTNAME = GetLastName(RESULT)
  1505.     'GETFIRSTNAME' SPOUSE
  1506.     SPOUSEFIRSTNAME = RESULT
  1507.     thelastname = SPOUSELASTNAME
  1508.     'GETSEX' SPOUSE
  1509.     thegender = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  1510.     SPOUSEFULLNAME = GetFullName(SPOUSEFIRSTNAME)
  1511. IF SPOUSEFULLNAME ~= "" THEN DO
  1512.     MSPOUSEFULLNAME = MGetFullName(SPOUSEFIRSTNAME)
  1513.     PSPOUSEFULLNAME = PGetFullName(SPOUSEFIRSTNAME)
  1514.     'GETBIRTHDATE' SPOUSE
  1515.     SPOUSEBIRTHDATE = RESULT
  1516.     'GETDEATHDATE' SPOUSE
  1517.     SPOUSEDEATHDATE = RESULT
  1518.     SPOUSEFILENAME = PersonPrefix || SPOUSE
  1519.     WriteCH('PERSONFILE',indent'&_')
  1520.     IF SPOUSELASTNAME ~= "" THEN
  1521. WriteCh('PERSONFILE','<A HREF="'SPOUSEFILENAME'.htm">')
  1522. WriteCh('PERSONFILE',MSPOUSEFULLNAME)
  1523.   IF EXISTS('Genealogy:PN'SPOUSE'.'DBNAME) THEN WriteCh('PERSONFILE',' (¶)')
  1524.   IF EXISTS('Genealogy:PP'SPOUSE'.'DBNAME) THEN WriteCh('PERSONFILE',' (<B>®</B>)')
  1525.     IF SPOUSELASTNAME ~= "" THEN WriteCh('PERSONFILE','</A>')
  1526.     IF SPOUSEBIRTHDATE ~= "" THEN
  1527. WriteCh('PERSONFILE','   * 'SPOUSEBIRTHDATE)
  1528.     IF SPOUSEDEATHDATE ~= "" THEN
  1529. WriteCh('PERSONFILE','   + 'SPOUSEDEATHDATE)
  1530.     IF DoGenText THEN DO
  1531. WriteCh('GenealogyText',indent'&_'PSPOUSEFULLNAME)
  1532.      IF SPOUSEBIRTHDATE ~= "" THEN
  1533. WriteCh('GenealogyText','   * 'SPOUSEBIRTHDATE)
  1534.      IF SPOUSEDEATHDATE ~= "" THEN
  1535. WriteCh('GenealogyText','   + 'SPOUSEDEATHDATE)
  1536. WriteLn('GenealogyText','')
  1537.      END
  1538.     WriteLn('PERSONFILE','')
  1539. /*
  1540.  END
  1541. ELSE DO
  1542.  WriteLn('PERSONFILE',indent'&_?')
  1543.  WriteLn('GenealogyText',indent'&_?')
  1544. */
  1545.  END 
  1546.  
  1547.     indent2 = indent || " | "
  1548.     DO k = 0 TO 39   /* ??? GETTOTCHILDREN FGRN ??? */   
  1549.      'GETCHILD' mFGRN k
  1550.      mFGRNc = RESULT
  1551.      'GETFIRSTNAME' mFGRNc
  1552.      mFGRNcFIRSTNAME = RESULT
  1553. /**/
  1554.      IF mFGRNcFIRSTNAME ~= "" THEN DO
  1555.       'GETLASTNAME' mFGRNc
  1556.       mFGRNcLASTNAME = GetLastName(RESULT)
  1557.       'GETFIRSTNAME' mFGRNc
  1558.       mFGRNcFIRSTNAME = RESULT
  1559.       'GETSEX' mFGRNc
  1560.       mFGRNcGENDER = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  1561.       thelastname = mFGRNcLASTNAME
  1562.       thegender = mFGRNcGENDER
  1563.       mFGRNcFULLNAME = GetFullName(mFGRNcFIRSTNAME)
  1564.       MmFGRNcFULLNAME = MGetFullName(mFGRNcFIRSTNAME)
  1565.       PmFGRNcFULLNAME = PGetFullName(mFGRNcFIRSTNAME)
  1566.       'GETBIRTHDATE' mFGRNc
  1567.       mFGRNcBIRTHDATE = RESULT
  1568.       'GETDEATHDATE' mFGRNc
  1569.       mFGRNcDEATHDATE = RESULT
  1570. /**/
  1571.       mFGRNcFILENAME = PersonPrefix || mFGRNc
  1572. /**/
  1573. WriteCh('PERSONFILE',indent2||'<A HREF="'mFGRNcFILENAME'.htm">'MmFGRNcFULLNAME)
  1574.   IF EXISTS('Genealogy:PN'mFGRNc'.'DBNAME) THEN WriteCh('PERSONFILE',' (¶)')
  1575.   IF EXISTS('Genealogy:PP'mFGRNc'.'DBNAME) THEN WriteCh('PERSONFILE',' (<B>®</B>)')
  1576. WriteCh('PERSONFILE','</A> ')
  1577. /**/
  1578.       IF mFGRNcBIRTHDATE ~= "" THEN WriteCh('PERSONFILE','   * 'mFGRNcBIRTHDATE)
  1579. /**/
  1580.       IF mFGRNcDEATHDATE ~= "" THEN WriteCh('PERSONFILE','   + 'mFGRNcDEATHDATE)
  1581.       Writeln('PERSONFILE','')
  1582.       IF DoGenText THEN DO
  1583.        WriteCh('GenealogyText',indent2||PmFGRNcFULLNAME)
  1584.        IF mFGRNcBIRTHDATE ~= "" THEN WriteCh('GenealogyText','   * 'mFGRNcBIRTHDATE)
  1585.        IF mFGRNcDEATHDATE ~= "" THEN WriteCh('GenealogyText','   + 'mFGRNcDEATHDATE)
  1586.        WriteLn('GenealogyText','')
  1587.        END
  1588. /**********************/
  1589.       marriagesANDchildren(mFGRNc,indent2)
  1590.       END
  1591.      END
  1592.     END
  1593.    END
  1594.   END
  1595.  RETURN 0
  1596.  
  1597. GetRIRN: PROCEDURE
  1598.  PARSE ARG numb ">" last
  1599.  IF last = "" THEN RETURN 0
  1600.  IF IsNumeric(numb) THEN RETURN numb
  1601.  RETURN 0
  1602.  
  1603. GetaRIRN: PROCEDURE
  1604.  PARSE ARG numb "]" last
  1605.  IF last = "" THEN RETURN 0
  1606.  IF IsNumeric(numb) THEN RETURN numb
  1607.  RETURN 0
  1608.  
  1609. GetEnd: PROCEDURE
  1610.  PARSE ARG line ">" last
  1611.  IF last = "" THEN RETURN substr(line,1,length(line)-1)
  1612.  RETURN substr(last,1,length(last)-1)
  1613.  
  1614. GetaEnd: PROCEDURE
  1615.  PARSE ARG line "]" last
  1616.  IF last = "" THEN RETURN substr(line,1,length(line)-1)
  1617.  RETURN substr(last,1,length(last)-1)
  1618.  
  1619. GetLength: PROCEDURE
  1620.  PARSE UPPER ARG names
  1621.  nonletters = length(compress(names, xrange('A','Z')))
  1622.  RETURN Length(names) - nonletters * 4 / 10
  1623.  
  1624.  /* create a full name from first, last, and honorifics parts */
  1625.  
  1626. GetFullName: PROCEDURE EXPOSE thelastname
  1627.  PARSE ARG firstnames "," hon
  1628.  IF hon = "" THEN DO
  1629.   IF length(firstnames) > 2 THEN
  1630.    IF substr(firstnames,length(firstnames)-1,length(firstnames)) = "V." THEN
  1631.     firstnames = substr(firstnames,1,length(firstnames)-2) || "v."
  1632.   RETURN firstnames thelastname
  1633.   END
  1634.  RETURN firstnames Space(thelastname) || ","hon
  1635.  
  1636. MGetFullName: PROCEDURE EXPOSE thelastname thegender
  1637.  PARSE ARG firstnames "," hon
  1638.  gchar = "B"
  1639.  IF thegender = "f" THEN gchar = "I"
  1640.  IF hon = "" THEN DO
  1641.   IF length(firstnames) > 2 THEN
  1642.    IF substr(firstnames,length(firstnames)-1,length(firstnames)) = "V." THEN
  1643.     firstnames = substr(firstnames,1,length(firstnames)-2) || "v."
  1644.   RETURN "<"gchar">"firstnames thelastname"</"gchar">"
  1645.   END
  1646.  RETURN "<"gchar">"firstnames Space(thelastname) || ","hon"</"gchar">"
  1647.  
  1648. PGetFullName: PROCEDURE EXPOSE thelastname thegender
  1649.  PARSE ARG firstnames "," hon
  1650.  schar = "1"
  1651.  uchar = "2"
  1652.  IF thegender = "f" THEN DO
  1653.   schar = "3"
  1654.   uchar = "3"
  1655.   END
  1656.  IF hon = "" THEN DO
  1657.   IF length(firstnames) > 2 THEN
  1658.    IF substr(firstnames,length(firstnames)-1,length(firstnames)) = "V." THEN
  1659.     firstnames = substr(firstnames,1,length(firstnames)-2) || "v."
  1660.   RETURN ""schar"m"firstnames thelastname""uchar"m"
  1661.   END
  1662.  RETURN ""schar"m"firstnames Space(thelastname) || ","hon""uchar"m"
  1663.  
  1664. AgeTest: PROCEDURE
  1665.  PARSE ARG DBFile, HTMFile
  1666.  IF Exists(DBFile) THEN DO
  1667.   IF Exists(HTMFile) THEN DO
  1668. Parse value StateF(DBFile) with type size blk bits DBday DBmin DBtick com
  1669. Parse value StateF(HTMFile) with type size blk bits HTMday HTMmin HTMtick com
  1670. /* Say DBFile DBday DBmin DBtick  HTMFile HTMday HTMmin HTMtick */
  1671.    IF ( DBday > HTMday ) | ( DBday = HTMday & DBmin > HTMmin ) THEN DO
  1672.     Delete(HTMFile)
  1673.     Say DBFile 'is newer; removing 'HTMFile
  1674.     RETURN 1
  1675.     END
  1676.    ELSE DO
  1677.     Say '  ~ 'HTMFile'  ...OK... '
  1678.     RETURN 0
  1679.     END
  1680.   RETURN 1
  1681.   END
  1682.  RETURN 1
  1683.  END
  1684.  
  1685.  
  1686.  
  1687.  
  1688.  
  1689.  /* Capitalize last name; also handle special cases! */
  1690.  /* End users must customize this code to avoid trashy output */
  1691.  
  1692. GetLastName: PROCEDURE
  1693.  PARSE ARG str
  1694.  IF str = "BAUER-GAUSS" THEN RETURN "Bauer-Gauss"
  1695.  IF str = "DE IPOLYI" THEN RETURN "deIpolyi"
  1696.  IF str = "DEIPOLYI" THEN RETURN "deIpolyi"
  1697.  IF str = "MC GRADY" THEN RETURN "McGrady"
  1698.  IF str = "KIS RED" THEN RETURN "KisRed"
  1699.  IF str = "ROTH-HACKENSCHMIDT" THEN RETURN "Roth-Hackenschmidt"
  1700.  IF str = "SCHüCH-GLICKHFELDEN" THEN RETURN "Schüch-Glickhfelden"
  1701.  ELSE
  1702.   DO
  1703.   spart = translate(substr(str,2,length(str)),xrange('a','z'),xrange('A','Z'))
  1704.   END
  1705.  RETURN substr(str,1,1)Space(spart)
  1706.