Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer

Win32: Shell extension for viewing POD (proof of concept)

by osfameron (Hermit)
on Oct 31, 2001 at 16:06 UTC ( #122327=sourcecode: print w/replies, xml ) Need Help??
Category: Win32 Stuff
Author/Contact Info
Description: We had an interesting chat about Shell extensions in WinNT in the Thread "Windows Drag and Drop".

I think that viewing POD from the Explorer window would be a useful use of Windows Shell extensions.

So this code is a) a wrapper around pod2html, and b) some instructions on how to create the Shell extensions.

As per Drag and Drop thread, I'd appreciate any clarification from a WinNT guru, but it works for me.

Proof of concept: please note all warnings in documentation

Update:v 0.002: Added an option to create a hyperlink to the source code the POD is taken from. You can switch this off by setting constant SOURCE=>0

use strict; use warnings;
use Win32; # Yes, this is a Win32 module: see POD
use HTML::Entities qw(encode_entities);

my $PERLBIN='c:\perl\bin';
use constant SOURCE=>1;

my $time=time;
my $file=$ARGV[0];
my $temp=$ENV{TEMP} || $ENV{TMP} || '.';

# 'cos we're being lazy and just redirecting HTML to a file
# I don't think we want to use array form of 'system'.  So
# I'm checking that the File is a genuine file and Temp is
# a genuine directory (e.g. this means that they can't contain
# any shell escapes).  Is this robust enough ?

unless ($file && -e $file) {
    $file ||="no file specified";
    my $error= "File doesn't exist! [$file] \n" ;
    die $error;
unless (-d $temp) {
    my $error= "Temp directory isn't a directory! [$temp] \n"; 
    die $error;

if (SOURCE) {
    open (FILE, $file) or die;
    my @file = <FILE>;
    close FILE or die;
    open (SRC,  ">$temp\\$time.src");
    open (SRCHTML,  ">$temp\\$time.src.html");
    # prepend source file with html instructions for viewing source
    print SRC qq(=begin html\n<a href="file://$temp/$time.src.html">Vi
+ew source</a>\n\n=cut\n\n);
    print SRCHTML <<EOF_HEAD;
<head><title>Source of $file</title></head>
    for (@file) { 
        print SRC $_;
        # encode_entities escapes any characters that might be
        # special in HTML
        print SRCHTML encode_entities($_);
    print SRCHTML <<EOF_FOOT;
    close SRC or die;
    close SRCHTML or die;

system qq($PERLBIN\\pod2html $file --title="POD from $file" > $temp\\$
system qq(start $temp\\$time.html);
system "pause";


=head1 NAME



A wrapper around the standard pod2html utility to view POD.

Following a thread on about Drag and Drop for callin
+g Perl
scripts (which I think is a bad thing by the way) I thought this might
+ be a
better use of Windows NT Shell extensions to make WinNT more useful fo
+r Perl

(Not the other way round obviously).

If you implement the WinNT registry changes listed, you should be able
+ to 
right-click on a .pl, .pm or .pod file and choose a "View as HTML" opt
This B<should> open in your default browser.

=head1 WARNING

This is proof of concept.  It involves manually editing the registry. 

(I am only doing this because 

=over 4

=item *

I know why it's bad  (!)

=item *

I don't have anything too important on my Win2K box

=item *

I won't whinge at myself if it all goes 


For more warnings about how dangerous editing the registry is, try

=head1 HOW TO SET UP

I'm assuming that your perl is in C:\perl\bin\perl.exe.  If not please
+ edit the
variable in this script, and in the registry entries I mention.

=item 1

Save this script in C:\perl\bin as

Note that you can now use the script as a wrapper around pod2html by c
+alling {filename}

Where {filename} contains some POD.

=item 2

Open the registry. Then read again the warnings above.

 Go to 
     My Computer\HKEY_CLASSES_ROOT

 Make sure that keys exist for the following 

     .pl     Perl
     .pm     PerlModule
     .pod    POD

 I've suggested what I think could be values in the "Default" value.  
 If you have different values already existing then another program (a
+ Perl
 IDE for example) may have registered them, so just make a note of wha
+t that
 value is.

 For each of the above values go to
     My Computer\HKEY_CLASSES_ROOT\{value}
 for example

     My Computer\HKEY_CLASSES_ROOT\Perl\Shell

 Notice that there is already a sub-key called "Open".  In Open there 
+is a 
 subkey called "Command".
 This has a value like:
     C:\Perl\bin\perl.exe "%1" %*

 This is the command that will be run when you double click on a Perl 
 in the GUI, or you right-click on it and choose "Open".

 Under Shell, create a key called "View POD", and under that a key cal
 "Command" Now you have a key called

     My Computer\HKEY_CLASSES_ROOT\Perl\Shell\View POD\Command

 All we need to do is to add a command in here.  Double click on the d
 value and add the following

     C:\Perl\bin\perl.exe C:\Perl\bin\ "%1"

 We need to put %1 (the parameter - e.g. the name of the file being vi
 in quotes in case the name has any spaces in it!)

=item 3

Now test: right click on a .pl, .pm or .pod file.  Do you have the C<V
+iew Pod>
option?  Choose it.  If it opens up your POD in a browser that's good.
If not something went wrong.  Check that you typed the Registry value 
(I managed to type it wrong 3 times while testing).

=head1 AUTHOR, VERSION, ETC (osfameron on / www.perlmonks.or

version 0.002

This is Proof Of Concept.  Use at your own risk: no warranty express o

I cannot offer any support on this, but would welcome any comments.

=head1 BUGS

If the document has no POD a blank HTML document will be opened.

Did I mention that this was test code?  Let me know!

Replies are listed 'Best First'.
Re: Win32: Shell extension for viewing POD (proof of concept)
by Anonymous Monk on Sep 16, 2010 at 23:59 UTC
    I was just searching by Google perl win32 shell because I just migrate a software from a ActiveState Perl version from 1999.

    There is

    use Win32::Shell;

    with typical calls like

    Win32::Shell::Execute( "open", "bathfile.bat", "", ".\\", "SW_SHOWMAXIMIZED" ); Win32::Shell::Execute( "open", $path::convert, "$colors $geometry -interlace plane -comment \"Chevalier Roland Mösl\" $url::path_use.bmp $target", ".\\", "SW_HIDE" );

    opening batch files or other programms

    Now I need a actual version for this 11 years old module.

      I haven't managed to track it down. There's no Win32::Shell on cpan or backpan - according to the Win32-GUI-1.06 FAQ (as of June 2001) it was available only as a ppm package from ActiveState. That was probably the case back in June 2001, but it seems ActiveState no longer provides that ppm package. (If they do, I couldn't find it.)

      Presumably there's a recommendation as an alternative to Win32::Shell, but I don't know what that recommendation would be. Perhaps if you start a new thread here titled (something like) "What happened to Win32::Shell", you might attract the attention of someone who knows a bit more about it.

      Or, you could post to the perl-win32-users mailing list (which is hosted by ActiveState) and see if anyone there can help out.


Log In?

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

How do I use this? | Other CB clients
Other Users?
Others perusing the Monastery: (3)
As of 2022-08-18 22:39 GMT
Find Nodes?
    Voting Booth?

    No recent polls found