Beefy Boxes and Bandwidth Generously Provided by pair Networks
more useful options
 
PerlMonks  

Shortcuts Engine: Packaged Version

by munchie (Monk)
on Apr 06, 2002 at 21:42 UTC ( #157183=sourcecode: print w/ replies, xml ) Need Help??

Category: Text Processing
Author/Contact Info Steven Rubin (munchie) steven@ssrubin.com
Description: This is the shortcuts engine I made put into packaged format. It is now more portable, and offers more flexibility. I have never submitted anything to CPAN, so I want fellow monks' opinion on wheter or not this module is ready for submission to CPAN.

This module requires Text::xSV by tilly. If you have any suggestions on making this better, please speak up.

UPDATE 1: Took out the 3Arg open statements for slightly longer 2Args, to make sure that older versions of Perl will like my program. (thanks to crazyinsomniac)

UPDATE 2: I just uploaded this on PAUSE, so very soon you'll all be able to get it on CPAN! (My first module!)

# Made by Steven Rubin steven@ssrubin.com (April 2002)

package Text::Shortcuts;
$VERSION = 0.02;
use strict;
use Text::xSV;
sub new {
    my $invocant = shift;
    my $class = ref($invocant) || $invocant;
    my $self = { SF => shift, OF => shift };
    
    bless($self, $class);
    unless (-s $self->{SF}) {
                my $file = $self->{SF};
        open(SF, ">>$file");
        print SF "shortcut,output\n";
        close(SF);
    }
    return $self;
}
sub set_shortcut {
    my $self = shift;
    
    my $is_taken=0;
    my $char = shift;
    my $text = shift;
    my $csv = new Text::xSV;
    $csv->open_file($self->{SF});
    $csv->bind_header();
    while ($csv->get_row()) {
        my ($shortcut) = $csv->extract(qw(shortcut));
        if ($char eq $shortcut) {
            warn "Shortcut character already used!";
            $is_taken=1;
            last;
        } 
    }
    unless ($is_taken) {
                my $file = $self->{SF};
        open(SF, ">>$file");
        print SF "$char,$text\n";
        close(SF);
    }
}
sub get_shortcuts {
    my $self = shift;

    my $csv = new Text::xSV;
    $csv->open_file($self->{SF});
    $csv->bind_header();
    while ($csv->get_row()) {
        my ($shortcut, $output) = $csv->extract(qw(shortcut output));
          print "\[$shortcut\] produces $output\n";
    }
}
sub new_doc {
    my $self = shift;
        
        my $file = $self->{OF};
    open(OF, ">>$file");
    while (my $line = <STDIN>) {
        last if $line =~ /^(end)$/;
        my %shortcuts;
        my $csv = new Text::xSV;
        $csv->open_file($self->{SF});
        $csv->bind_header();
        while ($csv->get_row()) {
            my ($shortcut, $output) = $csv->extract(qw(shortcut output
+));
            $shortcuts{$shortcut} = $output;
        }
        $line =~ s/\[(\w)\]+/$shortcuts{$1}/g;
        print OF $line;
    }
    close(OF);
}
sub get_doc {
    my $self = shift;

        my $file = $self->{OF};
    open(OF, "<$file");
    while (<OF>) {
        print;
    }
    close(OF);
}
1;

__END__

=head1 NAME

Text::Shortcuts - A shortcut creation & usage engine

=head1 SYNOPSIS

    use Text::Shortcuts;
    my $sc = Text::Shortcuts->new($shortcut_file, $output_file);
    
    while(1) {
        print "Choose option:\n
            \t1. Set Shortcut\n
            \t2. Get Shortcuts\n
            \t3. Start Note\n
            \t4. Read Note\n";
        print "Choice: ";
        chomp(my $choice = <STDIN>);
        
        unless ($choice == 1
            || $choice == 2
            || $choice == 3 ||                 #--Quick Gettaway
            $choice == 4) {
            print "Invalid Choice: $choice";
            redo;
        }
        
        if ($choice == 1) {
            print "What letter do you want to make this shortcut? ";
            chomp (my $letter = <STDIN>);
            print "What do you want \[$letter\] to produce?\n";
            chomp (my $produce = <STDIN>);
            $sc->set_shortcut($letter, $produce);
        } elsif ($choice == 2) {
            $sc->get_shortcuts;
        } elsif ($choice == 3) {
            print "type 'end' to end\n";
            $sc->new_doc;
        } elsif ($choice == 4) {
            $sc->get_doc;
        }
}

=head1 DESCRIPTION

This module is for use in creating a shortcuts engine. Shortcuts engin
+e?
you ask. Text::Shortcuts lets you define shortcuts (such as [j] or [R]
+)
and then lets you write documents using your shortcuts to stand for
longer pieces of text.

For example, you might set [y] to equal Yoonsdock, Mars. When you crea
+te
a new document using C<new_doc>, it will change all occurences of
[y] in that document to Yoonsdock, Mars.

This modules allows for creating and viewing of shortcuts, and creatin
+g and
viewing of documents. When a document is typed using C<$sc->new_doc>, 
+the 
module sends the I<real> text to the output file, not the shortcut.

=head1 USAGE

=over 4

=item C<new($shortcut_file, $output_file)>

This is the constructor method. It must have the args for the file tha
+t
contains the shortcut definitions, and the file that the output will g
+o to.

=item C<set_shortcut($shortcut_letter, $shortcut_expanded)>

This method sets shortcuts, so [$shortcut_letter] will acess $shortcut
+_expanded.

=item C<get_shortcuts>

This method print out a list of every shortcut, and what it produces.

=item C<new_doc>

This method allows you to type to your output file using shortcuts
you've defined earlier.

=item C<get_doc>

A method for people who are too lazy to C<open> their output file. It
simply opens the output file and prints what's in it.

=back

=head1 BUGS

None known yet. Email me at steven@ssrubin.com if any are found.

=head1 AUTHOR

Steven S. Rubin (steven@ssrubin.com)

=head1 COPYRIGHT

Copyright 2002.  This may be modified and distributed on the same
terms as Perl.

Comment on Shortcuts Engine: Packaged Version
Download Code
Replies are listed 'Best First'.
C-h i g (xemacs)Abbrevs
by Fletch (Chancellor) on Apr 07, 2002 at 22:05 UTC

    Both x?emacs and vim offer similar `abbrev' modes that operate inline (i.e. when you type it it's expanded immediately). Check the info file for x?emacs (in xemacs's the node is (xemacs)Abbrevs, and vim's :help map.txt for its abbrevs functions.

      That's very cool, but even if I had known about, I still wouldv'e made this module.

    • 1: It's part of a note taking suite I'm making for my dad.
    • 2: I don't use emacs or vim, and I'm sure there are many others like me that may be able to benefit from this module.

      > munchie, the number munchin newb
      Llama: The other other white meat!
      (you had to be there :-P)

Back to Code Catacombs

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: sourcecode [id://157183]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others musing on the Monastery: (12)
As of 2015-07-31 16:11 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (279 votes), past polls