sub parsetext {
my $num = qr/\d+/;
my $roman_numeral = qr/\b(?=[IVXLCDM])(?>M{0,4}(?:CM|CD|D?C{0,3})(?:XC|XL|L?X{0,3})(?:IX|IV|V?I{0,3}))\b/i;
my $chapter = qr/$num|$roman_numeral/;
my $replace = sub {
my $REFERENCE = $1;
my $BOOK = $2||$7;
my $three = $3;
my $VERSION = "";
#NEED TO INCORPORATE SOME VERSION CHECKING ON $6
$VERSION = $VERSION || $DEFAULT_VER;
if ($abbrev{$BOOK}) { $BOOK = $abbrev{$BOOK} };
my $ThML = qq'$Lbracket\scripRef version="$VERSION" passage="$REFERENCE" parsed="$VERSION|$BOOK';
chomp $three;
$three=~s/^\.//;
$three=~s/;\s*$//;
my ($chapverse,$chap,$verses,$verse_start,$verse_end,$segment,$i) = '';
while ($three) {
($chapverse,$three) = split(/;/, $three, 2);
($chap, $verses) = split(/:|\./, $chapverse);
$chap =~ s/\s//g;
$chap = arabic($chap) if isroman($chap);
while ($verses) {
($segment,$verses) = split(/,|\s(?:and|\&)\s/i, $verses, 2);
$segment=~s/\s//g;
($verse_start,$verse_end) = split(/\-/, $segment);
unless ($verse_end) { $verse_end=$verse_start };
for ($i=$verse_start; $i<=$verse_end; $i++) {
$ThML .= "|$chap|$i";
}
}
if ($three) { $ThML .= ";$VERSION|$BOOK" } else { $ThML .= "|" };
}
$ThML .= qq|"$Rbracket$REFERENCE$Lbracket/scripRef$Rbracket|;
return $ThML;
};
###
$text =~ s%
( # BEGIN CAPTURE OF $1 ***
(?: # *LOOK FOR USUAL GRAMMAR FIRST (CAPTURED SEPARATELY)
($book) # MATCH BIBLE BOOK NAMES FROM ASSEMBLED REGEX $2
( # BEGIN CAPTURE OF $3
\.?\s # MATCH A SPACE FOLLOWING BOOK NAME
( (?:$chapter)+ # MATCH A CHAPTER
(?:[:\-,. ]* # MATCH A DELIMITER BETWEEN CHAPTERS AND VERSES
(?: (?:and|\&) \s+)? # MATCH AN OPTIONAL "AND" OR "&" BETWEEN VERSES
\d+)* # MATCH VERSE DIGITS
) # MATCH A NUMBER (USUALLY A CHAPT.)=$4
# OPTIONALLY FOLLOWED BY VERSE NUMBERS
# WHICH MAY BE DELIMITED BY THE [:-, ]
(\; # .MATCH A SEMI-COLON...ETC. (BELOW)=$5
(?:\s*(?:$chapter) # .MATCH AN OPTIONAL SPACE, THEN A NUMBER
(?:[:\-,. ]* # .MATCH A DELIMITER BETWEEN CHAPTERS AND VERSES
(?:(?:and|\&)\s+)* # .MATCH AN OPTIONAL "AND" OR "&" BETWEEN VERSES
\d+)* ) # .MATCH ZERO+ VERSE DELIMITERS/NUMBERS
)* # .MAKE CLAUSE OPTIONAL & REPEATABLE
) # CLOSE CAPTURE OF $3
) | (Book\sof\s($book)) # *OR CAPTURE WHOLE BOOK IN ABSENCE OF CHAP/VERSE
# ABOVE LINE CAPTURES TO $7 & $8
) # CLOSE CAPTURE OF $1 ***
####
( # >LOOK FOR OPTIONAL VERSION NOTATION=$6
(?:\(\w+\)*) # >MATCH WORD IN PARENTHESES
| # > -OR-
(?:[, ]+(?!$book)\w+){0,6} # >MATCH COMMA OR SPACE FOLLOWED BY WORD
)* # >CLOSE CAPTURE FOR $6
####
%$replace->()%egx;
=item Example
<scripRef version="NIV" passage="Rom. viii. 27,28; x. 8-13"
parsed="NIV|Romans|8|27|8|28;NIV|Romans|10|8|10|13">
Romans viii. 27,28; x. 8-13
</scripRef>
=cut
} #END SUB parsetext