Month: November 2002

  • Strong Bad’s Website Design Tips

    UPDATE 22-Jan-03 – HEY YO! Their system is back up! Check out this cool little animation they put together to explain things — just make sure you wait a few seconds for the joke to load. Oh and thanks for the fun comments — I’m going to foward them along.

    UPDATE 20-Jan-03 – CRAP! I appreciate all the visits, but I like you, have no clue what has happened to the HomeStarRunner.com — you’re welcome to try and contact them — let me know if you’re successful or not. Meanwhile, enjoy the rest of my site. I mean, what would Strong Bad do?

    * UPDATE 21-Jan-03 – HOLY CRAP!* I just heard back from the HomeStar Gang — they’re down but not out. They’re suffering some bandwidth crap from all the heavy traffic sites like mine generate. Well, actually its because their content is so killer that we all rush out to see the latest and greatest they have to offer. Then you hit that refresh button about five or six times to show your co-workers and friends. So really, it’s YOUR fault they’re temporarily down. So hang in there! They’ll be up shortly. Meanwhile, leave comments. I’ll ignore them like the rest!-)

    Now quit messing around and visit the rest of my site.

    *** !?! ***

    original article from 27-Nov-02:

    Andrew Careaga over at bloggedy blog sent me this one – blame him – after you read his new book:

     

    (requires Macromedia Flash, Void Where Prohibited. Offer expires 11/31/02. Not valid at all locations. View at your own risk. HealYourChurchWebSite not responsible for any mental or emotional damage the featured link may induce. Any resemblance to a real site that sucks is purely coincidental, though not regretted. For more good examples of bad design, please consult Vincent Flanders’ latest book. See stores for details. Buy in Quantity unlimited.)

  • 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.

  • W3Schools Online Web Tutorials

    Completely Free Web Building Tutorials – Inside W3Schools you will find a large number of free Web building tutorials, from basic HTML and XHTML tutorials, to advanced XML, XSL and WAP tutorials.

    Sometimes, the best things in life are indeed free.

  • PERL program for linking Scripture references

    Here is an article that explains how the author used PERL script to interface thousands of Bible quotations with Bible Gateway. Included on the page is a link to a program that runs through a document an ‘Scripturizes’ Bible references. What I mean by ‘Scripturize’ is that it takes a Bible reference and converts it a hyperlink at the BibleGateway.

    I thought this might be useful to our discussion regarding regular expressions and fun stuff like that. Mostly because I suspect any of you who want to post sermons and Bible studies may also want to do the same. Granted, bib.pl was written back in 1998, so it employs some ‘old-school’ Perl parsing techniques. And later this week, we’re going to see how much of this can be reduced to a simple regular expression. Still, it offers some features and approaches we need to consider in our own “Scripturizer” application.

    One thing it does that my own concept didn’t … it deals with abbreviations for Bible book names..

  • /^Reg(ular)*\s*Exp(?:ression(s)*)*/gi

    For those of you looking to shoot your foot clean off with some programming fun, may I suggest some study in a dialect of pure geek otherwise known as regular expressions … please, you can stop screaming NNNNNNNNOOOOOOOOOO now.

    Arguably the most powerful of text manipulation tools, regular expressions allow you match and/or modify variant text blocks. For example, the following snippet allows me to find books of the Bible within a given text block:
     


    my $BibleBooks = “Genesis|Exodus| … |Jude|Revelation”;
    my $varTextBlk = “In the book of Exodus we find a reference to Genesis …

    if ($varTextBlk =~ m/$BibleBooks/gi) { …

     
    Pretty nifty eh? Well, yes, only if you can actually create some compelling content with it. And I intend to do just that in the form of a little script that will look through text and tag Scripture references to the BibleGateway … yeah, I knew that’d get your attention.

    But before I can make sense of my ‘Scripturizer’ script, you’re going to need to do some homework (you may begin screaming again) … here is a suggested reading list of mostly Perl-centric approaches to regular expressions: