/* © Harold H. Ipolyi		11 June 1994

		Requires ScionGenealogist V 3.13+

-------------------------------README----------------------------------------
Short: ScionGenealogist > Mosaic.html
Type: util/rexx
Uploader: ipolyi@pat.mdc.com
Author: Harold H. Ipolyi
USmail: P.O.Box 891206, Houston, Tx 77289-1206
Relsd: 11 June 1994 . ScionGenealogist V 3.06
Rev01: 19 June 1994 . MakeDir(Gdir) fixed; extra comments processed.
Rev02: 25 June 1994 . Fixed descenders; Women in List italicised. Scion V 3.13

Arexx script to convert ScionGenealogist data base to Mosaic hypertext format.


 WHY?	some others in my family don't have Amigas.

	ScionGenealogist is easy to use, comprehensive, and
	provides Arexx ports for extracting data.

	An ARexx script can repeatedly and painlessly recreate Mosaic
	.html files from entries in the ScionGenealogist data base.

	Mosaic is an available common method of presentation.


 TESTED:	on Amiga3000 Kickstart v.37.175 Workbench v.38.35
		w/ ScionGenealogist V 3.06 & Mosaic1.2beta_NoNet
		w/ ScionGenealogist V 3.13 & Mosaic1.2_NoNet

		Mosaic .html file compatibility tested on Sun NCSA Mosaic


	100 ScionGenealogist entries create approx 75Kb of .html files.
-------------------------------README----------------------------------------

  -----------------------------------------------------------------
 | This Script is somewhat dependent on the following conventions  |
 | that I followed in my data base:                                |
 |                                                                 |
 | ·  lastnames are kept pure (no honorifics, Jr's, III's )        |
 |                                                                 |
 | ·  given names have any and all honorifics AFTER a COMMA        |
 |                                                                 |
 |  for example:  LastName      FirstNames, honorifics             |
 |                                                                 |
 |                BAUER-GAUSS   Joseph, Dr.                        |
 |                DAGLEY        Richard Kelley, Jr.                |
 |                                                                 |
 |-----------------------------------------------------------------|
 |                                                                 |
 |  For a name change (not maidenname > marriedname), try this:    |
 |                New           Birth Name > Changed To, Ph. D.    |
 |     which lists as: Birth Name > Changed To New, Ph. D.         |
 |                                                                 |
 |-----------------------------------------------------------------|
 |                                                                 |
 | ·  all dates are in the author's suggested form:  8 Jul 1939    |
 |                                                                 |
 |      ( not only is 7/8/39 ambigous, it will also break )        |
 |      ( my .html file naming convention in a big way    )        |
 |                                                                 |
 | (   To any who may ask: it would be easy code around,         ) |
 | (   but the form suggested by ScionGenealogist author         ) |
 | (   Robbie J Akins makes much more sense to me!               ) |
 |                                                                 |
 | · if Death Date is blank; Death Place can be a COMMENT field    |
 |                                            e.g. Phone #         |
 | · if Burial Date is blank; Burial Place can be a COMMENT field  |
 |                                            e.g. Address         |
  -----------------------------------------------------------------

 * Running 'rx Scion3.13ToMosaic.rexx' gives further directions

 * Briefly, · start ScionGenealogist and load a data base
 *          · 'assign Genealogy: '{Scion data base directory}
 *          · start a Shell, cd to wherever you have or wish to have
 *               the directory of Mosaic .html's
 *          · 'rx Scion3.13ToMosaic.rexx Normal' to automagically create a 
 *              Mosaic .html file for each person in your 
 *              ScionGenealogist data base; following the TEMPLATE:

####################################################################
<TITLE>PERSON Data Sheet</TITLE>
<H2>PERSON (PERSONGENDER) <A HREF="PERSONI.html"><i>more info</i></A> (()) 
<A href="Genealogy/GenealogyFile.html"><B>List of persons.</B></A></H2>
<H3>
Born: BIRTHDATe ^ BIRTHPLACE <P>
<P>
Died: DEATHDATE + DEATHPLACE . Buried: BURIALPLACE <P>
<P>
</H3>
<HR>            /* NEW FORMAT BELOW */
<PRE>
<TT>
  <A HREF="FATHER.html">FATHER</A>_//\_<A HREF="MOTHER.html">MOTHER</A> & MARRIAGEDATE @ MARRIAGEPLACE
  |_____ <A HREF="SIBLING1.html">SIBLING1</A> (SIBLING1GENDER) ^ SIBLING1BIRTHDAT
  |_____ <A HREF="SIBLING2.html">SIBLING2</A> (SIBLING2GENDER) ^ SIBLING2BIRTHDAT
  |_____ <A HREF="SIBLING3.html">SIBLING3</A> (SIBLING3GENDER) ^ SIBLING3BIRTHDAT
  |             
  <B>PERSON</B>_//\_<A HREF="SPOUSE1.html">SPOUSE1</A> & MARRIAGE1DATE @ MARRIAGE1PLACE
  |  |  |_____ <A HREF="mFGRN1c1.html">mFGRN1c1</A> (mFGRN1c1GENDER) ^ mFGRN1c1BIRTHDATE
  |  |  |_____ <A HREF="mFGRN1c2.html">mFGRN1c2</A> (mFGRN1c2GENDER) ^ mFGRN1c2BIRTHDATE
  |  |  |_____ <A HREF="mFGRN1c3.html">mFGRN1c3</A> (mFGRN1c3GENDER) ^ mFGRN1c3BIRTHDATE
  |  |
  |  |_//\_<A HREF="SPOUSE2.html">SPOUSE2</A> & MARRIAGE2DATE @ MARRIAGE2PLACE
  |    |_____ <A HREF="mFGRN2c1.html">mFGRN2c1</A> (mFGRN2c1GENDER) ^ mFGRN2c1BIRTHDATE
  |    |_____ <A HREF="mFGRN2c2.html">mFGRN2c2</A> (mFGRN2c2GENDER) ^ mFGRN2c2BIRTHDATE
  |    |_____ <A HREF="mFGRN2c3.html">mFGRN2c3</A> (mFGRN2c3GENDER) ^ mFGRN2c3BIRTHDATE
  |
  |_//\_<A HREF="SPOUSE3.html">SPOUSE3</A> & MARRIAGE3DATE @ MARRIAGE3PLACE
    |_____ <A HREF="mFGRN3c1.html">mFGRN3c1</A> (mFGRN3c1GENDER) ^ mFGRN3c1BIRTHDATE
    |_____ <A HREF="mFGRN3c2.html">mFGRN3c2</A> (mFGRN3c2GENDER) ^ mFGRN3c2BIRTHDATE
    |_____ <A HREF="mFGRN3c3.html">mFGRN3c3</A> (mFGRN3c3GENDER) ^ mFGRN3c3BIRTHDATE
####################################################################

 * In a Mosaic file (maybe HOME PAGE) have an anchor pointing to GenealogyFile:

<A href="file://localhost/Doc:Mosaic/DBNAMEGenealogy/GenealogyFile.html">
Genealogy</A>

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^ assumes you ran 'rx Scion3.13ToMosaic.rexx Normal' in directory: Doc:Mosaic ^^
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

 *       You might also create an {MyGenealogy}.html file yourself in directory
 *       Doc:Mosaic/DBNAMEGenealogy as a starting point, with the anchor of

<A href="file://localhost/Doc:Mosaic/DBNAMEGenealogy/MyGenealogyFile.html">
My Genealogy</A>

 e.g.:
_____________________________________________________________

<TITLE>FirstName LastName Genealogy </TITLE>
<H1>FirstName LastName Genealogy</H1>
<HR>
<A HREF="GenealogyFile.html">List of Persons.</A><P>

This is the genealogy of
<A href="FiLast8Jul1939.html">FirstName LastName</A>.
_____________________________________________________________
         ^^^^^^^^^^^^^^
 * Note the convention of first 2 characters from FirstName
 *                        first 4 characters from LastName
 *                        & BirthDate (with all blanks removed)
 *
 * If the BirthDate is not entered, the convention is:
 *                        first 2 characters from FirstName
 *                        first 6 characters from LastName
 *                        & ScionGenealogist IRN
 *
«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«
«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
»«»«                                                                      »«»«
«»«» GetLastName: this PROCEDURE at the very end of this script           «»«»
»«»«                                 is used to Capitalize Last Names.    »«»«
«»«»     -------------------------------------------------------------    «»«»
»«»«     | it can also be used to handle "non-conforming" Last Names |    »«»«
«»«»     |                e.g. "MAC ISAAC" --> "MacISAAC"            |    «»«»
»«»«     |                     "VON NUEMANN" --> "VonNuemann"        |    »«»«
«»«»     -------------------------------------------------------------    «»«»
»«»«     BUT: you must add the additional tests yourself (it's easy!)     »«»«
«»«»                                                                      «»«»
«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«
«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»

 * The PN{IRN}.DBNAME files are used to generate the "more info" files.

 * Whenever the PN{IRN}.DBNAME is changed or replaced, the corresponding
 * "more info" file will be updated if 'rx Scion3.13ToMosaic.rexx {IRN}' is re-run.

 * TO DO: picture file anchors? PP{IRN}.DBNAME? ILBM not portable. Convert?

*/

IF ~Show(p,'SCIONGEN') THEN DO
	SAY ' '
	SAY '	ScionGenealogist is NOT currently running:'
	SAY ' '
	SAY '		1. Please start ScionGenealogist and'
	SAY ' '
	SAY '		2. load the desired data base. Then:'
	SAY ' '
	SAY '		3. rx Scion3.13ToMosaic.rexx Normal'
	SAY ' '
	EXIT
	END

PARSE ARG target
IF target = "" THEN
	DO
	SAY ' '
	SAY '		please send comments, questions to:'
	SAY ' '
	SAY '			ipolyi@pat.mdc.com'
	SAY '				or:'
	SAY '			Harold H. Ipolyi '
	SAY ' 			P.O.Box 891206 '
	SAY ' 			Houston, Tx 77289-1206 '
	SAY ' '
	SAY ' Convert ScionGenealogist information to Mosaic hypertext '
	SAY ' '
	SAY 'Usage: rx Scion3.13ToMosaic.rexx Normal {recreates all PERSON.html files}'
	SAY '       rx Scion3.13ToMosaic.rexx IRN    {recreates a PERSON.html file}'
	SAY ' '
	EXIT
	END
ELSE	target = Upper(target)

/* add libraries */
        libs = 'rexxsupport.library rexxarplib.library'
        DO i = 1 TO Words(libs)
                lib = Word(libs,i)
                IF ~Show('Lib',lib) THEN DO
                        IF EXISTS('LIBS:'lib) then call addlib lib, 0, -30
                        ELSE DO
                                'message "===> cannot find' lib 'in LIBS:"'
                                EXIT 10
                        END
                END
        END i

Address "SCIONGEN"	/* Point at Scion Genealogist port */
options RESULTS
'GETDBNAME'		/* Issue command to Scion Genealogist */
DBNAME = RESULT
'GETPROGVERSION'
VERSION = RESULT
IF VERSION < 3.13 THEN DO
	SAY ' '
	say ' Requires VERSION = 3.13 or greater'
	SAY ' '
	EXIT
	END
			/* ??? GETDBDIRPATH ??? of Scion data base */

SAY ' '
Say ' Testing: is data base assignment of Genealogy:'DBNAME' visible?'
SAY ' '

PRAGMA('w','n')
IF ~Exists("Genealogy:"DBNAME) THEN DO
	SAY ' 	Genealogy:'DBNAME' not found,'
	SAY ' '
	SAY " 	Please create an assign to data base "DBNAME"'s directory:"
	SAY ' '
	SAY ' assign Genealogy: {Volume:Directory}'
	SAY ' '
	EXIT
	END
PRAGMA('w','w')

Gdir = DBNAME'Genealogy'

IF ~Makedir(Gdir) THEN DO
	SAY ' '
	SAY ' ===> unable to create directory: 'Gdir
	SAY ' '
	EXIT
	END


'GETTOTALIRN'		/* Issue command to Scion Genealogist */
	TOTALIRN = RESULT

Say "Number of people in database " DBNAME " = " TOTALIRN
'GETPERSLABEL' 1
PERSLABEL1 = RESULT
'GETPERSLABEL' 2
PERSLABEL2 = RESULT
'GETPERSLABEL' 3
PERSLABEL3 = RESULT
'GETFAMLABEL' 1
FAMLABEL1 = RESULT
'GETFAMLABEL' 2
FAMLABEL2 = RESULT
IF IsNumeric(target) THEN
	DO
	Say "Processing person " target " of " TOTALIRN " in database " DBNAME
	IF target <= TOTALIRN THEN	CALL MakeOne(target)
	END
ELSE
	DO
	IF target = "TEST" THEN DO
		DO i = 1 TO 7
		CALL MakeOne(i)
			END
		END
	ELSE
		DO
		Say "Processing all " TOTALIRN " persons in database " DBNAME

/* GenealogyFile.html is a Scion data base IRN order list of all persons in 
   Mosaic .html format, format:

   person ^ birthdate + deathdate (()) father //\ mother	*/

Say 'Mosaic file name: 'Gdir'/GenealogyFile.html for: List of Persons.'

		Open('GenealogyFile',Gdir'/GenealogyFile.html','w')
		WriteLn('GenealogyFile','<HTML>')
		WriteLn('GenealogyFile','<TITLE>List of Persons.</TITLE>')
WriteLn('GenealogyFile','<H2>List of Persons in data base "'DBNAME'". <B>'Time()' - 'Date()'</B></H2>')
		WriteLn('GenealogyFile','<H3>')

		DO i = 1 TO TOTALIRN
			CALL MakeOne(i)
			END
		WriteLn('GenealogyFile','</H3>')
		WriteLn('GenealogyFile','<HR>')
		WriteLn('GenealogyFile','<Address>')
		'GETPROGVERSION'
		VERSION = RESULT
		WriteCh('GenealogyFile','<H3>ScionGenealogist')
		IF VERSION > 0 THEN WriteCh('GenealogyFile',' V 'VERSION)
		WriteLn('GenealogyFile',' © Robbie J Akins; ')
		WriteLn('GenealogyFile','Scion3.13ToMosaic.rexx © Harold Ipolyi</H3>')
		WriteLn('GenealogyFile','</Address>')
		WriteLn('GenealogyFile','</HTML>')
		END
Say ' '
ThisPath = PRAGMA('d')
IF Substr(ThisPath,Length(ThisPath),Length(ThisPath)) ~= ":" THEN ThisPath = ThisPath'/'
Say ' ---------------------------------------------------------------------'
Say ' If you have not already done so, add the following anchor pointing to'
Say ' "'GetLastName(DBNAME)' Genealogy" to a Mosaic file (maybe HOME PAGE):'
Say ' ---------------------------------------------------------------------'
Say ' <A href="/'ThisPath||Gdir'/GenealogyFile.html">'GetLastName(DBNAME)' Genealogy</A>'
Say ' ------------------------------------------------------------------'
Say ' '
	END
Say 'Scion3.13ToMosaic.rexx completed normally'
EXIT

/*************************************************************************/

MakeOne: PROCEDURE EXPOSE target DBNAME Gdir FAMLABEL1 FAMLABEL2 PERSLABEL1 PERSLABEL2 PERSLABEL3
	PARSE ARG ScionIRN
'EXISTPERSON' ScionIRN
/**/
if RESULT = 'YES' THEN
	DO
	'GETLASTNAME' ScionIRN
	LASTNAME = GetLastName(RESULT)
	'GETFIRSTNAME' ScionIRN
	FIRSTNAME = RESULT
	thelastname = LASTNAME
	FULLNAME = GetFullName(FIRSTNAME)
	'GETSEX' ScionIRN
	GENDER = translate(RESULT,xrange('a','z'),xrange('A','Z'))
	'GETBIRTHDATE' ScionIRN
	BIRTHDATE = RESULT
	'GETBIRTHPLACE' ScionIRN
	BIRTHPLACE = RESULT
	'GETDEATHDATE' ScionIRN
	DEATHDATE = RESULT
	'GETDEATHPLACE' ScionIRN
	DEATHPLACE = RESULT
	'GETBURIALPLACE' ScionIRN
	BURIALPLACE = RESULT
	'GETPERSUSER1' ScionIRN
	PERSUSER1 = RESULT
	'GETPERSUSER2' ScionIRN
	PERSUSER2 = RESULT
	'GETPERSUSER3' ScionIRN
	PERSUSER3 = RESULT
/**/
	IF LASTNAME = "" THEN
		DO
Say "Person " ScionIRN"'s last name is not defined; no new Mosaic file being created!"
		RETURN
		END
	IF BIRTHDATE = "" THEN
		PERSONFILENAME = Space(substr(FIRSTNAME,1,2) substr(LASTNAME,1,6) ScionIRN)
	ELSE
		PERSONFILENAME = Space(substr(FIRSTNAME,1,2) substr(LASTNAME,1,4) BIRTHDATE)
/**/
	PfilN = Gdir'/'PERSONFILENAME
	Say 'Mosaic file name: 'PfilN'.html for: 'FULLNAME' {'ScionIRN'}'
	Open('PERSONFILE',PfilN'.html','w')
	WriteLn('PERSONFILE','<HTML>')
	WriteLn('PERSONFILE','<TITLE>'FULLNAME' Data Sheet</TITLE>')
	WriteCH('PERSONFILE','<H2>'FULLNAME' ('GENDER') ')
/**/
	IF Exists(PfilN'I.html') THEN DO
		IF Exists('Genealogy:PN'ScionIRN'.'DBNAME) THEN DO
Parse value StateF(PfilN'I.html') with type size blk bits PFday PFmin PFtick com
Parse value StateF('Genealogy:PN'ScionIRN'.'DBNAME) with type size blk bits PNday PNmin PNtick com
/* Say PERSONFILENAME'I.html' PFday PFmin PFtick  'Genealogy:PN'ScionIRN'.'DBNAME PNday PNmin PNtick */
			IF ( PNday > PFday ) | ( PNday = PFday & PNmin > PFmin ) THEN DO
				Delete(PfilN'I.html')
Say 'Scion file Genealogy:PN'ScionIRN'.'DBNAME 'newer than 'PfilN'I.html; replacing!'
				END
			END
		END
/**/
	IF Exists(PfilN'I.html') THEN
WriteCH('PERSONFILE',' <A HREF="'PERSONFILENAME'I.html"><i>more info</i></A>')
	ELSE DO
		IF Exists('Genealogy:PN'ScionIRN'.'DBNAME) THEN DO
			Say 'Writing info file 'PfilN'I.html'
			Open('PNDBNAME','Genealogy:PN'ScionIRN'.'DBNAME,'r')
			Open('PERSONI',PfilN'I.html','w')
	WriteLn('PERSONI','<HTML>')
	WriteLn('PERSONI','<TITLE>'FULLNAME' Information</TITLE>')
	WriteLn('PERSONI','<H2>'FULLNAME' Information.</H2><PRE><TT>')
			DO While ~EOF('PNDBNAME')
				line = ReadLn('PNDBNAME')
				WriteLn('PERSONI',line)
			END
			Close('PNDBNAME')
			WriteLn('PERSONI','</HTML>')
			Close('PERSONI')
WriteCH('PERSONFILE',' <A HREF="'PERSONFILENAME'I.html"><i>more info</i></A>')
			END
		END
/**/
WriteLn('PERSONFILE',' <A HREF="GenealogyFile.html"><B>List of Persons.</B></A></H2><H3>')
	IF BIRTHDATE || BIRTHPLACE ~= "" THEN DO
		WriteCh('PERSONFILE','Born: ')
		IF BIRTHDATE ~= "" THEN WriteCh('PERSONFILE',BIRTHDATE)
		IF BIRTHPLACE ~= "" THEN WriteCh('PERSONFILE',' ^ 'BIRTHPLACE)
		WriteLn('PERSONFILE','<BR>')
		END
	IF DEATHDATE ~= "" THEN
		DO
		WriteCH('PERSONFILE','Died: 'DEATHDATE' + 'DEATHPLACE)
	IF BURIALPLACE ~= "" THEN WriteCH('PERSONFILE',' . Buried: 'BURIALPLACE)
		WriteLn('PERSONFILE','<BR>')
		END
	ELSE
		DO
		IF DEATHPLACE ~= "" THEN WriteLn('PERSONFILE',DEATHPLACE'<BR>')
		IF BURIALPLACE ~= "" THEN WriteLn('PERSONFILE',BURIALPLACE'<BR>')
		END
	IF PERSUSER1 ~= "" THEN WriteLn('PERSONFILE',PERSLABEL1': 'PERSUSER1'<BR>')
	IF PERSUSER2 ~= "" THEN WriteLn('PERSONFILE',PERSLABEL2': 'PERSUSER2'<BR>')
	IF PERSUSER3 ~= "" THEN WriteLn('PERSONFILE',PERSLABEL3': 'PERSUSER3'<BR>')

/* end of personal data; start family tree segment */

	WriteLn('PERSONFILE','<HR>')
	WriteLn('PERSONFILE','<PRE><TT>')
	'GETPARENTS' ScionIRN
	PARENTS = RESULT
        tPARENTSt = 't'PARENTS't'
/* Say 'PARENTS = 'PARENTS tPARENTSt	??? EXISTPARENTS IRN ???	*/
	HasFileFATHER = 0
	HasFileMOTHER = 0
	HasMOTHER = 0
	HasFATHER = 0
/**/
	IF tPARENTSt ~= 'tt' THEN
		DO
		PARENTS = RESULT
		'GETPRINCIPAL' PARENTS
		PRINCIPAL = RESULT
		'GETSPOUSE' PARENTS
		SPOUSE = RESULT
		'GETMARRYDATE' PARENTS
		PARENTSMARRIAGEDATE = RESULT
		'GETMARRYPLACE' PARENTS
		PARENTSmFGRNPLACE = RESULT
		'GETFAMUSER1' PARENTS
		PARENTSmFGRNCELEBRANT = RESULT
		'GETFAMUSER2' PARENTS
		PARENTSmFGRNCOMMENT = RESULT
		'GETSEX' PRINCIPAL
		IF RESULT = 'M' THEN
			DO
			FATHERScionIRN = PRINCIPAL
			MOTHERScionIRN = SPOUSE
			END
		ELSE
			DO
			FATHERScionIRN = SPOUSE
			MOTHERScionIRN = PRINCIPAL
			END
		'GETLASTNAME' FATHERScionIRN
		FATHERLASTNAME = GetLastName(RESULT)
		'GETFIRSTNAME' FATHERScionIRN
		FATHERFIRSTNAME = RESULT
		IF FATHERFIRSTNAME ~= "" THEN HasFATHER = 1
		thelastname = FATHERLASTNAME
FATHERFULLNAME = GetFullName(FATHERFIRSTNAME)
		'GETBIRTHDATE' FATHERScionIRN
		FATHERBIRTHDATE = RESULT
		'GETLASTNAME' MOTHERScionIRN
		MOTHERLASTNAME= GetLastName(RESULT)
		'GETFIRSTNAME' MOTHERScionIRN
		MOTHERFIRSTNAME = RESULT
		IF MOTHERFIRSTNAME ~= "" THEN HasMOTHER = 1
		thelastname = MOTHERLASTNAME
MOTHERFULLNAME = GetFullName(MOTHERFIRSTNAME)
		'GETBIRTHDATE' MOTHERScionIRN
		MOTHERBIRTHDATE = RESULT
/**/
		IF FATHERLASTNAME ~= "" THEN
			DO
			HasFileFATHER = 1
			IF FATHERBIRTHDATE = "" THEN
				DO
FATHERFILENAME = Space(substr(FATHERFIRSTNAME,1,2) substr(FATHERLASTNAME,1,6) FATHERScionIRN)
				END
			ELSE
				DO
FATHERFILENAME = Space(substr(FATHERFIRSTNAME,1,2) substr(FATHERLASTNAME,1,4) FATHERBIRTHDATE)
				END		
			END		
/**/
		IF MOTHERLASTNAME ~= "" THEN
			DO
			HasFileMOTHER = 1
			IF MOTHERBIRTHDATE = "" THEN
				DO
MOTHERFILENAME = Space(substr(MOTHERFIRSTNAME,1,2) substr(MOTHERLASTNAME,1,6) MOTHERScionIRN)
				END
			ELSE
				DO
MOTHERFILENAME = Space(substr(MOTHERFIRSTNAME,1,2) substr(MOTHERLASTNAME,1,4) MOTHERBIRTHDATE)
				END
			END		
/**/
		WriteCH('PERSONFILE','  ')
		IF HasFileFATHER THEN WriteCH('PERSONFILE','<A HREF="'FATHERFILENAME'.html">')
		WriteCH('PERSONFILE',FATHERFULLNAME)
		IF HasFileFATHER THEN WriteCH('PERSONFILE','</A> //\ ')
		IF HasFileMOTHER THEN WriteCH('PERSONFILE','<A HREF="'MOTHERFILENAME'.html">')
		WriteCH('PERSONFILE',MOTHERFULLNAME)
		IF HasFileMOTHER THEN WriteCH('PERSONFILE','</A>')
/**/
		IF PARENTSMARRIAGEDATE ~= "" THEN
WriteCH('PERSONFILE',' & 'PARENTSMARRIAGEDATE)
		IF PARENTSmFGRNPLACE ~= "" THEN
WriteCH('PERSONFILE',' @ 'PARENTSmFGRNPLACE)
/**/
		WriteLn('PERSONFILE','')
		spcs = '  |'
		DO i = 0 TO Length(FATHERFULLNAME)
			spcs = spcs' '		/*	??? GETFAMLBL1 ???	*/
		END				/*	??? GETFAMLBL2 ???	*/
IF PARENTSmFGRNCELEBRANT ~= '' THEN WriteLn('PERSONFILE',spcs FAMLABEL1': 'PARENTSmFGRNCELEBRANT)
IF PARENTSmFGRNCOMMENT ~= '' THEN WriteLn('PERSONFILE',spcs' 'FAMLABEL2': 'PARENTSmFGRNCOMMENT' ')
		DO i = 0 TO 39			/*	??? GETTOTCHILDREN FGRN ???	*/
			'GETCHILD' PARENTS i
			PARENTSc = RESULT
			'GETFIRSTNAME' PARENTSc
			PARENTScFIRSTNAME = RESULT
/**/
			IF PARENTScFIRSTNAME ~= "" THEN
				DO
				IF PARENTSc ~= ScionIRN THEN
					DO
					'GETLASTNAME' PARENTSc
					PARENTScLASTNAME = GetLastName(RESULT)
					'GETFIRSTNAME' PARENTSc
					PARENTScFIRSTNAME = RESULT
					thelastname = PARENTScLASTNAME
PARENTScFULLNAME = GetFullName(PARENTScFIRSTNAME)
					'GETSEX' PARENTSc
PARENTScGENDER = translate(RESULT,xrange('a','z'),xrange('A','Z'))
					'GETBIRTHDATE' PARENTSc
					PARENTScBIRTHDATE = RESULT
					'GETDEATHDATE' PARENTSc
					PARENTScDEATHDATE = RESULT
/**/
					IF PARENTScBIRTHDATE = "" THEN
PARENTScFILENAME = Space(substr(PARENTScFIRSTNAME,1,2) substr(PARENTScLASTNAME,1,6) PARENTSc)
					ELSE
PARENTScFILENAME = Space(substr(PARENTScFIRSTNAME,1,2) substr(PARENTScLASTNAME,1,4) PARENTScBIRTHDATE)
/**/
WriteCH('PERSONFILE','  |_____ <A HREF="'PARENTScFILENAME'.html">')
/**/
					IF PARENTScLASTNAME ~= FATHERLASTNAME THEN
WriteCH('PERSONFILE',' 'PARENTScFULLNAME)
					ELSE
WriteCH('PERSONFILE',PARENTScFIRSTNAME )
/**/
WriteCH('PERSONFILE','</A> ('PARENTScGENDER') 'PARENTScBIRTHDATE)
/**/
					IF PARENTScDEATHDATE ~= "" THEN
WriteCH('PERSONFILE','   + 'PARENTScDEATHDATE)
/**/
Writeln('PERSONFILE','')
					END
				END
			END
		END
	END

/* end of parents, siblings segment; start marriages segment */

        vert.0 = ''
        vert.1 = ' |'
        DO i = 0 TO 39                  /*      ??? GETTOTMARRIAGES IRN ???     */
                'GETMARRIAGE' ScionIRN i
                MARRIAGE = RESULT               /* use: 'EXISTFAMILY'   */
                IF MARRIAGE > -1 THEN
                        DO
                        MARRIAGES = i
                        j = i + 1
                        vert.j = vert.i vert.1
                        END
        END
        tMARRIAGESt = 't'MARRIAGES't'
/*	Say 'MARRIAGES = 'MARRIAGES tMARRIAGESt	*/

	IF tMARRIAGESt ~= 'tMARRIAGESt' THEN

		DO
		WriteLn('PERSONFILE','  |')
		DO i = 0 TO MARRIAGES
			'GETMARRIAGE' ScionIRN i
			mFGRN = RESULT
			IF mFGRN ~= "" THEN
				DO
				ki = MARRIAGES - i + 1
				IF ki ~= MARRIAGES + 1 THEN WriteLn('PERSONFILE',vert.ki)
				j = MARRIAGES + 1 - i
				'GETSPOUSE' mFGRN
				SPOUSE = RESULT
				IF SPOUSE = ScionIRN THEN
					DO
					'GETPRINCIPAL' mFGRN
					SPOUSE = RESULT
					END
				'GETLASTNAME' SPOUSE
				SPOUSELASTNAME = GetLastName(RESULT)
				'GETFIRSTNAME' SPOUSE
				SPOUSEFIRSTNAME = RESULT
				thelastname = SPOUSELASTNAME
SPOUSEFULLNAME = GetFullName(SPOUSEFIRSTNAME)
				'GETBIRTHDATE' SPOUSE
				SPOUSEBIRTHDATE = RESULT
				'GETMARRYDATE' mFGRN
				MARRIAGEDATE = RESULT
				'GETMARRYPLACE' mFGRN
				mFGRNPLACE = RESULT
				'GETFAMUSER1' mFGRN
				MARRIAGECELEBRANT = RESULT
				'GETFAMUSER2' mFGRN
				MARRIAGECOMMENT = RESULT
/**/
				IF SPOUSEBIRTHDATE = "" THEN
SPOUSEFILENAME = Space(substr(SPOUSEFIRSTNAME,1,2) substr(SPOUSELASTNAME,1,6) SPOUSE)
				ELSE
SPOUSEFILENAME = Space(substr(SPOUSEFIRSTNAME,1,2) substr(SPOUSELASTNAME,1,4) SPOUSEBIRTHDATE)
/**/
				IF i = 0 THEN
					DO
WriteCH('PERSONFILE','  <B>'FULLNAME'</B> //\ ')

					IF SPOUSELASTNAME ~= "" THEN
WriteCH('PERSONFILE','<A HREF="'SPOUSEFILENAME'.html">')

WriteCH('PERSONFILE',SPOUSEFULLNAME)

					IF SPOUSELASTNAME ~= "" THEN
WriteCH('PERSONFILE','</A>')

					END

				ELSE DO
WriteCH('PERSONFILE',vert.j'_ //\ ')

					IF SPOUSELASTNAME ~= "" THEN
WriteCH('PERSONFILE','<A HREF="'SPOUSEFILENAME'.html">')

WriteCH('PERSONFILE',SPOUSEFULLNAME)

					IF SPOUSELASTNAME ~= "" THEN
WriteCH('PERSONFILE','</A>')

					END

				IF MARRIAGEDATE ~= "" THEN
WriteCH('PERSONFILE',' & 'MARRIAGEDATE)
				IF mFGRNPLACE ~= "" THEN
WriteCH('PERSONFILE',' @ 'mFGRNPLACE)

				WriteLn('PERSONFILE','')
		jk = MARRIAGES - i
		spcs = vert.jk'      |     '
/*		ll = 2
		IF i = 0 THEN ll = GetLength(FULLNAME) - Length(vert.j)
		DO l = 0 TO ll
			spcs = spcs' '
		END						*/
IF MARRIAGECELEBRANT ~= '' THEN WriteLn('PERSONFILE',spcs FAMLABEL1': 'MARRIAGECELEBRANT)
IF MARRIAGECOMMENT ~= '' THEN WriteLn('PERSONFILE',spcs'  'FAMLABEL2': 'MARRIAGECOMMENT)
/*********************************************************************************/

	DO k = 0 TO 39			/*	??? GETTOTCHILDREN FGRN ???	*/			
		'GETCHILD' mFGRN k
		mFGRNc = RESULT
		'GETFIRSTNAME' mFGRNc
		mFGRNcFIRSTNAME = RESULT
/**/
		IF mFGRNcFIRSTNAME ~= "" THEN
			DO
			'GETLASTNAME' mFGRNc
			mFGRNcLASTNAME = GetLastName(RESULT)
			'GETFIRSTNAME' mFGRNc
			mFGRNcFIRSTNAME = RESULT
			thelastname = mFGRNcLASTNAME
mFGRNcFULLNAME = GetFullName(mFGRNcFIRSTNAME)
			'GETSEX' mFGRNc
mFGRNcGENDER = translate(RESULT,xrange('a','z'),xrange('A','Z'))
			'GETBIRTHDATE' mFGRNc
			mFGRNcBIRTHDATE = RESULT
			'GETDEATHDATE' mFGRNc
			mFGRNcDEATHDATE = RESULT
/**/
			IF mFGRNcBIRTHDATE = "" THEN
mFGRNcFILENAME = Space(substr(mFGRNcFIRSTNAME,1,2) substr(mFGRNcLASTNAME,1,6) mFGRNc)
			ELSE
mFGRNcFILENAME = Space(substr(mFGRNcFIRSTNAME,1,2) substr(mFGRNcLASTNAME,1,4) mFGRNcBIRTHDATE)

			jk = MARRIAGES - i
WriteCH('PERSONFILE',vert.jk'      |_____ <A HREF="'mFGRNcFILENAME'.html">')
/**/
			IF mFGRNcLASTNAME ~= LASTNAME THEN
WriteCH('PERSONFILE',' 'mFGRNcFULLNAME)
			ELSE
WriteCH('PERSONFILE',mFGRNcFIRSTNAME )

WriteCH('PERSONFILE','</A> ('mFGRNcGENDER') 'mFGRNcBIRTHDATE)
/**/
			IF mFGRNcDEATHDATE ~= "" THEN
WriteCH('PERSONFILE','   + 'mFGRNcDEATHDATE)

Writeln('PERSONFILE','')
			END
		END
	END
/*********************************************************************************/
				END
		END
	ELSE DO
		WriteLn('PERSONFILE','  |')
		WriteLn('PERSONFILE','  <B>'FULLNAME'</B>')
	END
	WriteLn('PERSONFILE','</TT></PRE>')
/*	WriteLn('PERSONFILE','<HR>')
	WriteLn('PERSONFILE','<Address>')
	'GETPROGVERSION'
	VERSION = RESULT
	WriteCh('PERSONFILE','<H3>ScionGenealogist')
	IF VERSION > 0 THEN WriteCh('PERSONFILE',' V 'VERSION)
	WriteLn('PERSONFILE',' © Robbie J Akins; ')
	WriteLn('PERSONFILE','Scion3.13ToMosaic.rexx © Harold H. Ipolyi</H3>')
	WriteLn('PERSONFILE','</Address>')					*/
	WriteLn('PERSONFILE','</HTML>')
	Close('PERSONFILE')
	IF target = "NORMAL" & LASTNAME ~= "" THEN DO
		WriteCH('GenealogyFile','<A HREF="'PERSONFILENAME'.html">')
		IF GENDER = 'f' THEN WriteCH('GenealogyFile','<I>')
			ELSE WriteCH('GenealogyFile','<B>')
		WriteCH('GenealogyFile',FULLNAME)
		IF GENDER = 'f' THEN WriteCH('GenealogyFile','</I>')
			ELSE WriteCH('GenealogyFile','</B>')
		WriteCH('GenealogyFile','</A>')
		IF BIRTHDATE ~= "" THEN WriteCH('GenealogyFile',' ^ 'BIRTHDATE)
		IF DEATHDATE ~= "" THEN WriteCH('GenealogyFile',' + 'DEATHDATE' ')
/*********************************************************************************/
IF HasFATHER THEN DO
	WriteCH('GenealogyFile',' (()) ')
	IF HasFileFATHER THEN WriteCH('GenealogyFile','<A HREF="'FATHERFILENAME'.html">')
	WriteCH('GenealogyFile','<B>'FATHERFULLNAME'</B>')
	IF HasFileFATHER THEN WriteCH('GenealogyFile','</A>')
	IF HasMOTHER THEN DO
		IF HasFATHER THEN WriteCH('GenealogyFile',' //\ ')
		IF HasFileMOTHER THEN WriteCH('GenealogyFile','<A HREF="'MOTHERFILENAME'.html">')
		WriteCH('GenealogyFile','<I>'MOTHERFULLNAME'</I>')
		IF HasFileMOTHER THEN WriteCH('GenealogyFile','</A>')
		END
	END
/*********************************************************************************/
	WriteLn('GenealogyFile','<BR>')	/* do not close, we have many more to go. */
END
	RETURN





IsNumeric: PROCEDURE
	PARSE ARG str
	RETURN DataType(str, 'W')


	/* create a file name short but unique */

FilName: PROCEDURE
	PARSE ARG finm lanm bdate
	RETURN Space(substr(finm,1,2) substr(lanm,1,4) bdate)

/******************************** Makedir **********************************/

/* Makedir - If a directory under the given name already exists, or can be
   created, return 1, otherwise return 0. Though this function works
   correctly under Workbench 1.3, it has the same effect as the existing
   MAKEDIR; hence it is useful only under 2.0.
*/
Makedir: procedure
   ds = statef(arg(1))

   if ds='' then
      result = 'MAKEDIR'(arg(1))
   else
      result = left(ds,3) = 'DIR'

   return result


GetLength: PROCEDURE
	PARSE UPPER ARG names
	nonletters = length(compress(names, xrange('A','Z')))
	RETURN Length(names) - nonletters * 4 / 10

	/* create a full name from first, last, and honorifics parts */

GetFullName: PROCEDURE EXPOSE thelastname
	PARSE ARG firstnames "," hon
	IF hon = "" THEN RETURN firstnames thelastname
	RETURN firstnames Space(thelastname) || ","hon
	


	/* Capitalize last name; also handle special cases! */
	/* End users must customize this code to aviod trashy output */

GetLastName: PROCEDURE
	PARSE ARG str
	IF str = "BAUER-GAUSS" THEN RETURN "Bauer-Gauss"
        IF str = "DE IPOLYI" THEN RETURN "deIpolyi"
        IF str = "MC GRADY" THEN RETURN "McGrady"
	IF str = "V.BAUER" THEN RETURN "v.Bauer"
        IF str = "KIS RED" THEN RETURN "KisRed"
        IF str = "ROTH-HACKENSCHMIDT" THEN RETURN "Roth-Hackenschmidt"
	ELSE
		DO
		spart = translate(substr(str,2,length(str)),xrange('a','z'),xrange('A','Z'))
		END
	RETURN substr(str,1,1)Space(spart)
