#!/usr/bin/perl
## creates crossreferences lists in USFm or OSIS.
# The underlying list of crossreferences come from a 16th century Dutch Bible.
## Licensed under the standard BSD license:
# Copyright (c) 2010 CrossWire Bible Society
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in
# the documentation and/or other materials provided with the
# distribution.
# * Neither the name of the CrossWire Bible Society nor the names of
# its contributors may be used to endorse or promote products
# derived from this software without specific prior written
# permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
# IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
## For general inquiries, comments, suggestions, bug reports, etc. email:
## sword-support@crosswire.org
#########################################################################
use strict;
use warnings;
use Text::CSV;
sub parsekey {
my $return = `parsekey "$_[0]" "$_[1]"`;
$return =~ s/\n$//;
$return;
}
sub vs2osis {
my $return = `vs2osisref "$_[0]" "$_[1]" $_[2]`;
$return =~ s/\n$//;
$return;
}
my @bookname = ("GEN","EXO","LEV","NUM","DEU",
"JOS","JDG","RUT","1SA","2SA","1KI",
"2KI","1CH","2CH","EZR","NEH","EST","JOB",
"PSA","PRO","ECC","SNG","ISA","JER","LAM",
"EZK","DAN","HOS","JOL","AMO","OBA","JON",
"MIC","NAM","HAB","ZEP","HAG","ZEC","MAL",
"MAT","MRK","LUK","JHN","ACT","ROM","1CO",
"2CO","GAL","EPH","PHP","COL","1TH","2TH",
"1TI","2TI","TIT","PHM","HEB","JAS","1PE",
"2PE","1JN","2JN","3JN","JUD","REV",
);
my %OSISbook = (
# taken from usfm2osis.pl
"" => "", "GEN" => "Gen", "EXO" => "Exod", "LEV" => "Lev", "NUM" => "Num",
"DEU" => "Deut", "JOS" => "Josh", "JDG" => "Judg", "RUT" => "Ruth",
"1SA" => "1Sam", "2SA" => "2Sam", "1KI" => "1Kgs", "2KI" => "2Kgs",
"1CH" => "1Chr", "2CH" => "2Chr", "EZR" => "Ezra", "NEH" => "Neh",
"EST" => "Esth", "JOB" => "Job", "PSA" => "Ps", "PRO" => "Prov",
"ECC" => "Eccl", "SNG" => "Song", "ISA" => "Isa", "JER" => "Jer",
"LAM" => "Lam", "EZK" => "Ezek", "DAN" => "Dan", "HOS" => "Hos",
"JOL" => "Joel", "AMO" => "Amos", "OBA" => "Obad", "JON" => "Jonah",
"MIC" => "Mic", "NAM" => "Nah", "HAB" => "Hab", "ZEP" => "Zeph",
"HAG" => "Hag", "ZEC" => "Zech", "MAL" => "Mal", "MAT" => "Matt",
"MRK" => "Mark", "LUK" => "Luke", "JHN" => "John", "ACT" => "Acts",
"ROM" => "Rom", "1CO" => "1Cor", "2CO" => "2Cor", "GAL" => "Gal",
"EPH" => "Eph", "PHP" => "Phil", "COL" => "Col", "1TH" => "1Thess",
"2TH" => "2Thess", "1TI" => "1Tim", "2TI" => "2Tim", "TIT" => "Titus",
"PHM" => "Phlm", "HEB" => "Heb", "JAS" => "Jas", "1PE" => "1Pet",
"2PE" => "2Pet", "1JN" => "1John", "2JN" => "2John", "3JN" => "3John",
"JUD" => "Jude", "REV" => "Rev", "TOB" => "Tob", "JDT" => "Jdt",
"ESG" => "Esth", "WIS" => "Wis", "SIR" => "Sir", "BAR" => "Bar",
"LJE" => "EpJer", "S3Y" => "PrAzar", "SUS" => "Sus", "BEL" => "Bel",
"1MA" => "1Macc", "2MA" => "2Macc", "3MA" => "3Macc", "4MA" => "4Macc",
"1ES" => "1Esd", "2ES" => "2Esd", "MAN" => "PrMan",
# Following this is just an uneducated guess
"PS2" => "Ps151", "ODA" => "Odes", "PSS" => "PssSol", "JSA" => "Josh",
"JSB" => "Josh", "TBS" => "Tob", "SST" => "Sus", "DNT" => "Dan",
"BLT" => "Bel", "ADE" => "AddEsth"
);
my @xref_count = qw( a b c d e f g h i j k l m n
o p q r s t u v w x z);
my $version = "1.0";
my $osisVersion = "2.1.1";
my $date = '$Date: 2010-08-17 05:46:26 +0000 (Tue, 04 Aug 2009) $';
my $rev = '$Rev: 231 $';
my %xrefList;
if (scalar(@ARGV) < 3) {
print "\t xrefmake.pl
\t -- creates a file with localised crossreferences, either in USFM or in OSIS.
\n \t It expects as input a csvfile formatted as follows:
\t A space-separated list of 6 numbers, representing the originating reference and cross reference, each as .
\t A SWORD locale name.
\t Either OSIS or USFM to determine the output format
\t Optionally, the name of a file containing the used canon as a list of book names, each name on a single line. The default canon is that of the KJV.
\n \t \b Usage: xrefmake.pl [canon file name].\n";
exit (-1);
}
my $file = "$ARGV[0]";
my $locale = "$ARGV[1]";
my $type = "$ARGV[2]";
if (exists ($ARGV[3])) {
@bookname = `cat $ARGV[3]` or die $!;
}
my $csv = Text::CSV->new();
my ($ref, $o_ref, $xref, $xrefList, $chapter, $chapter_now, $xref_counter);
open (CSV, "<", $file) or die $!;
if ($type eq "OSIS") {
$o_ref = "GEN.1.1";
$chapter = 1;
$xref_counter = 0;
while () {
if ($csv->parse($_)) {
my @columns = $csv->fields();
$ref = "$OSISbook{ $bookname[ $columns[0] -1 ] }.$columns[1].$columns[2]";
$xref = &parsekey( "$OSISbook{ $bookname[ $columns[3] -1 ] }.$columns[4].$columns[5]", $locale );
$chapter_now = $columns[1];
if ($ref eq $o_ref) {
print &vs2osis($xref,$o_ref,$locale);
}
else {
print "\n\$\$\$$ref\n".&vs2osis($xref,$o_ref,$locale)."; ";
$o_ref = $ref;
if ($chapter_now == $chapter) {
$xref_counter = ($xref_counter + 1) % 26 ;
}
else {
$xref_counter =0;
$chapter = $chapter_now;
}
}
}
else {
my $err = $csv->error_input;
print "Failed to parse line: $err";
}
}
}
elsif ($type eq "USFM") {
my $o_ref = "GEN.0.0";
$xrefList = "";
while () {
if ($csv->parse($_)) {
my @columns = $csv->fields();
$ref = "$bookname[ $columns[0] -1 ].$columns[1].$columns[2]";
$xref = &parsekey( "$OSISbook{ $bookname[ $columns[3] -1 ] }.$columns[4].$columns[5]", $locale );
if ($ref eq $o_ref) {
$xrefList = $xrefList.$xref;
}
else {
print "$o_ref \\x + \\xo $o_ref \\xr $xrefList \\x*\n";
$xrefList = $xref;
$o_ref = $ref;
}
}
else {
my $err = $csv->error_input;
print "Failed to parse line: $err";
}
}
}
else {
print "type $type not recognised";
}
print "\n";
close CSV;