#!/usr/bin/perl
# woj.pl
## Licensed under the standard BSD license:
# Copyright (c) 2011 CrossWire Bible Society <http://www.crosswire.org/>
# 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 XML::LibXML;
use Locale::Language;
## Obtain arguments
if (scalar(@ARGV) < 1) {
print "\nwoj.pl <OSIS File> [-o outputfile] -- - create list of Word of Jesus quotes\n";
print "- Arguments in braces < > are required. Arguments in brackets [ ] are optional.\n";
print "- If no -o option is specified the output will go to <STDOUT>\n";
exit (-1);
}
my $file = @ARGV[0];
my $outputFilename;
if (@ARGV[1] eq "-o") {
$outputFilename = "@ARGV[2]";
open (OUTF, , ">:utf8", "$outputFilename") or die "Could not open file @ARGV[2] for writing.";
select(OUTF);
}
my $parser = XML::LibXML->new();
my $bible = $parser->parse_file($file);
my $xpc = XML::LibXML::XPathContext->new($bible);
my @lang = $xpc->findnodes('//@xml:lang');
if (@lang>0) { $language = lc( code2language($lang[0]->textContent()) );}
else { $language = "english"}
#$xpc->registerNs('x','http://www.bibletechnologies.net/2003/OSIS/namespace');
# Ok, I do not understand that namespace business. When I use an OSIS XML file to work upon
# I delete the name space info from its original first XML line - and then things work fine.
# If you can correct my code or advice me what to do better, please do so.
@module = $xpc->findnodes('//work/@osisWork');
print "<?xml version=\"1.0\"?>\n<quotations>\n";
print "<source>This file was derrived from the OSIS XML source file of the ".$module[0]->textContent()." CrossWire module on ".scalar localtime()."</source>";
@verses = $xpc->findnodes('//verse[q[@who="Jesus"]]');
foreach $verse(@verses) {
my @versebits = $verse->findnodes('q[@who="Jesus"]');
if (@versebits>0) {
my $several = "FALSE";
my $complete = "FALSE";
my $begin = "FALSE";
my $end = "FALSE";
my $id = $verse->getAttribute("osisID");
if (@versebits>1)
{
$several="TRUE";
}
if (($several eq "FALSE") && (@versebits[0]->isEqual($verse->firstChild())) &&
($verse->firstChild()->isEqual($verse->lastChild())))
{
$complete = "TRUE";
}
if (($complete eq "FALSE") && (@versebits[0]->isEqual($verse->firstChild())))
{
$begin = "TRUE";
}
if (($complete eq "FALSE") && (@versebits[@versebits-1]->isEqual($verse->lastChild())))
{
$end="TRUE";
}
print "\t<verse osisID=\"".$id."\"";
if ($several eq "TRUE") {print " several=\"true\"";}
if ($complete eq "TRUE") {print " complete=\"true\"";}
if ($begin eq "TRUE") {print " begin=\"true\"";}
if ($end eq "TRUE") {print " end=\"true\"";}
print ">\n";
foreach $v(@versebits) {
print "<$language>".$v->textContent()."</$language>";
@w=$v->findnodes('w/@lemma');
print "<strongs>";
foreach $w(@w) {print $w->toString()};
print "</strongs>";
}
print "</verse>\n";
}
}
print "</quotations>\n";