Tag: scripturizer

  • Hyperlink Bible References using Scripturizer 1.3

    After almost a year of people emailing me and leaving comments, I’ve finally made the time to update my Scripturizer Perl Module. The changes aren’t big, but they provide dramatic relief to a series of annoyances that have encumbered some of you from adding more Scripture references to your blogs, church websites and other electronically distributed information. I apologize for taking so long to get around to such an important issue.

    Addition of Abbreviations:

    I think a comment by Werner Peters (no relation) on Rob Hulson’s blog sums up the need for this addition best when he writes:

    “It gets a little tedious writing out Deuteronomy every time!”

    Yeah, you’ve said a mouth full. So I’ve added various abbreviations to the new and improved version. I’ve done so a more hard-coded format than I like, but the regular expressions are complex enough. I want a novice to be able to look at the existing expressions for Books in the Bible and add or alter their own (expressions) as they need.

    This was a painstaking process I automated to some degree with some Perl to split book names after the first three characters, then again at the fourth or fifth character depending on the length and vowel placement. I then went through each of the expressions and added or subtracted based upon a list of common Bible queries over at the ESV Bible. Many thanks to Stephen Smith for directing my attention to this data, it was incredibly helpful!

    Finally, I took care of a small handful of typos, involving pluralization. I still need to write a “mop-up” option to weed-out typos such as “revalations” and “mathew.”

    Eliminate the addition of a space before non-white space bug.

    This bug is exceptionally annoying to those who like to encapsulate their scripture references between brackets or parenthesis, such as (1 John 1:9). So annoying that back last August, Jason Rust left a comment on my blog with a fix. A fix later tried and tested and nicely documented by Joseph Markey.

    Essentially, the bug was introduced when evaluating the space between a volume reference, e.g. 1 John 1:9, which in turn put a space in front of a non-volume reference such as John 1:9. The bug occurred when the character directly before the non-volume number scripture reference was anything other than a space.

    What the fix does is it pushes the evaluation for the space into a variable, then pushes it in front of the hyperlink. An approach that works much better than a hard-coded space as nothing before the reference is then accurately rendered as nothing just before the hyperlink.

    Eliminate the ‘c’ in the gcex modifier in the regular expression.

    This regular expression mode modifier did nothing in this context, except possibily eat up CPU and sometimes throw errors in the latest version of Perl.

    ESV Bible flip-flop

    The great people at the ESV Bible have been so helpful and responsive in the past, I figured why not say thanks in the form of directing those who select the English Standard Version option to the ESV online Bible website.

    In MovableType, that would be <$MTBodyEntry scripturize=”ESV”$>

    Using Scripturizer as a Perl Module, that would be print scripturize(”Phil. 4:6-7″, “ESV”).

    XHTML compliant hyperlinks

    Ampersands are now represented as &amp;

    Usage Notes

    Well, this is sorta a no-brainer. For those of you using the MovableType Scripturizer plug-in, leave the file /plugins/Scripturizer.pl alone.

    Replace the file /extlib/Sermonizer/Scripture.pm with the referenced code below. That should be it, but first make a backup of the old one just in case.

    Here is where I have it set-up on my PC for general purposes using ActiveState’s Perl Dev Kit: c:\perl\site\lib\Sermonizer\Scripturizer.pm.

    Future Iterations

    That’s pretty much it. If you can think of anything else, let me know and we’ll see about adding it.

    Otherwise, I’d like to work on something else Stephen Smith of ESV sent me, a routine that fetches a snippet via their webservice. His code works but I have some MT centric things I want to tackle when slicing-n-dicing an XML stream of Matthew 5. That and I feel a full-blown ESV.pm module coming on. Well, Stephen has already created one, but I’ve got these ideas … and this compiler … well, you get the picture.

    There is also a much needed death-blow to typos method subroutine that needs to be written. The question is, do I write it into the same pass, or do I run first a clean-up pass filter, then scripturize? Any thoughts would be appreciated.

    Again, thanks to everyone for their input. I couldn’t have done any of this without your valuable input. Even if I could, it wouldn’t have been as much fun.

    Download the PM … Sermonizer::Scripturizer.pm

    view it as text: Sermonizer::Scripturizer.pm

    Find a bug? Have a suggestion? Leave a comment. We’ll do our best to see it gets taken care of … quickly. Get it to me in the next couple of days and I’ll try to add it as an update to this article.

  • How To: The Scripturizer for Dummies

    A week or two ago, I had a friendly back-n-forth with Ted Olsen at Christianity Today over what’s “worthwhile” on the blogosphere. My perception is that what is trash to one reader, is treasure to another. That the beauty of the blogosphere, especially the Christian blogosphere, is that it represents the many varied and talented parts of the Body.

    “There are different kinds of gifts, but the same Spirit. There are different kinds of service, but the same Lord. There are different kinds of working, but the same God works all of them in all men. Now to each one the manifestation of the Spirit is given for the common good … The body is a unit, though it is made up of many parts; and though all its parts are many, they form one body. So it is with Christ.” – 1 Cor. 12:4-7,12

    Case in point: Rob Hulson’s blog

    While this blog may not be worthwhile to the overall CT demographic, yesterday’s post is certainly useful to those of us who are Christian, and blog … and/or run church websites. Especially those of us who like to hyperlink our Scripture references to online Bibles.

    This is why I wrote the Scripturizer module and MT-plug-in. And seeing a need for documentation, this is why Rob so generously offers us ‘How To: The Scripturizer for Dummies‘.

    So instead of one member of the Body tearing the other down, we sharpen each other as ‘iron sharpens iron’. In fact Rob along with a few others, have offered suggestions to improve and or fix Scripturizer. Changes that are needed. Changes I need to get make time for and publish. Changes I’m now inspired to make because of such good works like those of Rob!

    “A word fitly spoken is like apples of gold in a setting of silver. Like a gold ring or an ornament of gold is a wise reprover to a listening ear.” – Proverbs 25:11-12

    Thank you.

    Now go read his post, then come back after this weekend and bug me if I haven’t improved the Scripturizer based on your loving and constructive criticisms.

  • Sermonizer::Scripturizer

    UPDATE * 30-mar-03,  UPDATE2 * 14-Feb-04 this code has been modified and updated (twice). Please refer to the article entitled “Scripturizer 1.2, now with MT Plugin-ability” for a new and improved version that also includes a MovableType plugin.

    I’ve been working on a tool that will take sermons from my pastor and format and post them to my church web site. The first and biggest step was “scripturizing” – that is, hyperlinking Scripture References to the BibleGateway. Which we did in my article entitled “Scripturizer – core engine.”

    One of the excellent comments I recieved (from Jonathan Fox) mentioned that my original implementation was a bit too “greedy” … meaning that phrases such as “my new job will start if john acts up” would have “Scripturized” job, john and acts even though they were not scripture references. Moreover, the BibleGateway link would not validate due to not encoding the & sign. So I wrote a subroutine that would make sure we were dealing with verse/references and would encode properly.

    Once this was done, the next step was to convert it into a Perl module so it could be reused in any variety of situations. Please to not breeze past this point. Regardless of the language you prefer, abtracting your work into modules and classes is an important time saver downline as are common practices in the world of software resuability and reliability. If you don’t believe me, just check out the CPAN – which is the primary reason I still prefer Perl for many projects.

    You can find some pretty good how-to information regarding Perl Modules over at the Perl Circus for as long as that site lasts. The end product is something that looks like this (sans comments):

     package Sermonizer::Scripturizer;
     #############################################################
     # Sermonizer::Scripturizer             (c) 2002 Dean Peters #
     #                      http://www.healyourchurchwebsite.com #
     #############################################################
     #   This package hyperlinks Scripture references in text    #
     #############################################################
     require Exporter;
     @ISA = qw(Exporter);
     @EXPORT = qw(addLinks encodePassage);
    
    sub addLinks {
        my @data = @_;
        my @output;
    
       my $volumes = "I+|1st|2nd|3rd|First|Second|Third|1|2|3";
        my $books = "Genesis|Exodus|Leviticus|Numbers|Deuteronomy|Joshua|Judges|Ruth|Samuel|Kings|Chronicles|Ezra|Nehemiah|Esther|Job|Psalm|Proverbs|Ecclesiastes|Song of Solomon|Isaiah|Jeremiah|Lamentations|Ezekiel|Daniel|Hosea|Joel|Amos|Obadiah|Jonah|Micah|Nahum|Habakkuk|Zephaniah|Haggai|Zechariah|Malachi|Matthew|Mark|Luke|John|Acts|Romans|Corinthians|Galatians|Ephesians|Philippians|Colossians|Thessalonians|Timothy|Titus|Philemon|Hebrews|James|Peter|Jude|Revelation";
        my $link  = "http://biblegateway.com/cgi-bin/bible?language=english&version=NIV&passage=";
    
       foreach (@data) {
           # include instances of James 2:1-13, 14 - 16, 17 & 18
           my $verses = qr{ \d+ (: \d+)* \s* (?: [-&] \s* \d+)*    }x;
           my $passage;
    
          # don't just match, replace
           s/
              (?:($volumes)\s*)*         # any number of vols.
              \s*
              ($books)                               # the book
              \s*
              ( $verses (?: \s* , \s* $verses)* )
           /$passage = ($1 ? "$1 ":"").($2 ? $2:"").($3 ? " $3":"");
           "<a>$passage"
           /gcex;
    
          push (@output, $_);
        }
        return @output;
    
    }
    
    sub encodePassage {
    
       my ($vol, $bk, $ver) = @_;
        $ver =~ s/:/%3A/gi;          # convert to encoded colon
        $ver =~ s/[,&;]/%2C/gi;       # convert to encoded comma
        $ver =~ s/\s*//gi;
        my $passage = ($vol ? "$vol+":"").($bk ? "$bk+":"").($ver ? "$ver":"");
        return $passage;
     }
    
    1;
     __END__
    
    =head1 NAME
    
    Sermonizer::Scripturizer - hyperlink Scripture references in text
    
    =head1 SYNOPSIS
    
    use Sermonizer::Scripturizer;
     foreach (addLinks()) { print $_; }; 
    
    =head1 DESCRIPTION
    
    Sermonizer::Scripturizer searches a text stream and replaces any
     instances of a Scripture reference with a hyperlink to the to the
     Bible Gateway online Bible.
    
    =head1 BUGS
    
    Need to allow user to define which online Bible to use
     Need to not link up Scripture already linked
     It's probably make sense to create instance variables global to the scope of the module to contain the book volumes, etc.
    
    =head1 AUTHOR
    
    Copyright Dean Peters 2002, 
    
    =head1 EXAMPLE
    
    BEGIN { push(@INC, "C:/Inetpub/wwwroot/perl/lib/"); }
     use Sermonizer::Scripturizer;
    
    my $filename = "sermon01.txt";
     open(FILE, $filename ) or die "Couldn't open the file '$filename'. \n$!";
    
    foreach (addLinks()) {
        print $_;
     }
     close FILE;
    
    =cut

    Installation and Use

    I suspect a number of you will have some problems with your scripts not finding “Sermonizer::Scripturizer” … an error that reads “Can’t locate Sermonizer/Scripturizer.pm in @INC (@INC contains: /perl/lib /perl/sit
    e/lib .)
    “. This is because the @INC array contains a list of directories that are use to search for all external files/modules that are used by the perl script – and Scripturizer.pm ain’t in that path. Since the @INC array tells the Perl interpreter where to look for the files/modules/external scripts you need to create as subdirectory named “Sermonizer.” Then you copy Scripturizer.pm into that directory. Then atop perl program that needs ‘Scripturizing’, you write ‘BEGIN { push(@INC, “C:/Inetpub/wwwroot/lib/”); }‘. In the end, your test script may look like this:

    BEGIN { push(@INC, “C:/Inetpub/wwwroot/perl/lib/”); }
    use Sermonizer::Scripturizer;

    my $filename = “sermon01.txt”;
    open(FILE, $filename ) or die “Couldn’t open the file ‘$filename’. \n$!”;

    foreach (addLinks(<FILE>)) {
    print $_;
    }
    close FILE;

    As always, your mileage may vary

  • Scripturizer – core engine

    All week I’ve been leading you on, telling you that I’d give you some code that would encode your plain text with hyperlinks to the online Bible of your choosing. After some throwing some raw meat out into the comp.lang.perl.misc usenet group, I received fillet-mignon snippet from Jeff ‘japhy’ Pinyan that gave me enough of a match to compress the 400 some odd lines of Steve Lihn’s code into about 40 lines of code (provided you don’t count where I had to split long statements to fit this posting).

    This will obviously need to be rolled into a Perl module that might also include some other elements such as slicing and dicing sermons, dealing with acronyms and madding stuff like “Revelations” instead of “Revelation.”
    my $volumes = “I+|1st|2nd|3rd|First|Second|Third|1|2|3”;# I chopped these up so they’d stay within the margins of my blog
    my $books = “Genesis|Exodus|Leviticus|Numbers|Deuteronomy|Joshua|”;
    $books .= “Judges|Ruth|Samuel|Kings|Chronicles|Ezra|Nehemiah|Esther|”;
    $books .= “Job|Psalm|Proverbs|Ecclesiastes|Song of Solomon|Isaiah|”;
    $books .= “Jeremiah|Lamentations|Ezekiel|Daniel|Hosea|Joel|Amos|”;
    $books .= “Obadiah|Jonah|Micah|Nahum|Habakkuk|Zephaniah|Haggai|”;
    $books .= “Zechariah|Malachi|Matthew|Mark|Luke|John|Acts|Romans|”;
    $books .= “Corinthians|Galatians|Ephesians|Philippians|Colossians|”;
    $books .= “Thessalonians|Timothy|Titus|Philemon|Hebrews|James|Peter|”;
    $books .= “Jude|Revelation”;

    my $link = “http://biblegateway.com/cgi-bin/bible?passage=”;

    while(<DATA>) {

    my $passage;

    # this string will sit inside following expression
    my $verses = qr{ \d+ (: \d+)* \s* (?: [-&] \s* \d+)* }x;

    # replace instances
    s/
    (?:($volumes)\s*)*
    \s*
    ($books)
    \s*
    ( $verses (?: \s* , \s* $verses)* )
    /$passage = ($1 ? “$1 “:””).($2 ? $2:””).($3 ? ” $3″:””);
    ” <a href=\”$link”.encodePassage($1,$2,$3).”\”>$passage<\/a>”
    /gcex;

    print $_;
    }

    # make it validate
    sub encodePassage {
    my ($vol, $bk, $ver) = @_;
    $ver =~ s/:/%3A/gi;
    $ver =~ s/[,&;]/%2C/gi;
    $ver =~ s/\s*//gi;
    my $passage = ($vol ? “$vol+”:””).($bk ? “$bk+”:””).($ver ? “$ver”:””);
    return $passage;
    }

    __DATA__
    $Date: October 20, 2002
    $Type: Sermon
    $Scripture: James 2:1-13, 14 & 15
    $Version: NIV
    $Title: How Faith Works: “Determining the Worth of a Person”
    Foo

    $Text:
    … what Paul was thinking of when he wrote in Galatians 3 and said, “There is neither Jew nor Greek, SLAVE NOR FREE, male nor female, for you are all ONE in Christ Jesus.” (Galatians 3:28)

    Bar
    … and they were-it was the rich Sadducees who arrested Peter and John in Acts 4. Acts 13:50 says it was the wealthy “leading men” of the city of Antioch who persecuted Paul and Barnabas. Acts 16 says the wealthy owners of a demon-possessed girl dragged Paul into court and Acts 19 tells of the wealthy silversmiths in Ephesus who very nearly led a mob to kill him. James also says that it was the rich of that day who slandered the name of Jesus.