README
author Mahlon E. Smith <mahlon@martini.nu>
Thu, 29 Oct 2009 15:27:35 -0700
changeset 3 1b5eb968d2c4
parent 1 1ae1a79094fa
permissions -rw-r--r--
* Use a 'user block' character instead of a 'body block' for the settings line, as suggested by David J. Patrick <djp@linuxcaffe.ca>. * Ignore all user blocks (wrapped or otherwise.) * Display body (not wrapped) text as 'pre' in css. diff --git a/Apache/OTL.pm b/Apache/OTL.pm --- a/Apache/OTL.pm +++ b/Apache/OTL.pm @@ -1,7 +1,7 @@ # # VimOutliner (OTL) XHTML pretty printer for mod_perl2/apache2. # -# Copyright (c) 2006, Mahlon E. Smith <mahlon@martini.nu> +# Copyright (c) 2006-2009, Mahlon E. Smith <mahlon@martini.nu> # All rights reserved. # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: @@ -40,7 +40,7 @@ sub handler { - my $VERSION = '0.5'; + my $VERSION = '0.6'; my $ID = '$Id$'; my $r = shift; my $t0 = Time::HiRes::gettimeofday; @@ -70,7 +70,10 @@ percent => qr/(\[.\]) (\d+)%/, todo => qr/(\[_\]) /, done => qr/(\[X\]) /, - comment => qr/^(?:\t+)?:(.+)/, + user => qr/^(?:\t+)?\<(.+)/, + user_wrap => qr/^(?:\t+)?\>(.+)/, + body_wrap => qr/^(?:\t+)?:(.+)/, + body => qr/^(?:\t+)?;(.+)/, time => qr/(\d{2}:\d{2}:\d{2})/, date => qr/(\d{2,4}-\d{2}-\d{2})/, subitem => qr/^\t(?!\t)/, @@ -104,8 +107,8 @@ # get optional settings and otl title { my $settings = shift @blocks; - if ($settings =~ $re{comment}) { - %opt = map { split /=/ } split /\s?:/, $settings; + if ($settings =~ $re{user}) { + %opt = map { split /=/ } split /\s?:/, $1; } # if the first group wasn't a comment, @@ -116,6 +119,10 @@ } } + # Now that we have tried to detect settings, + # remove any level 0 blocks that are user data. + @blocks = grep { $_ !~ /^[\<\>]/ } @blocks; + # GET args override settings $opt{$_} = $get->{$_} foreach keys %$get; @@ -133,7 +140,7 @@ <!-- generated by otl_handler $VERSION Mahlon E. Smith <mahlon\@martini.nu> - http://www.martini.nu/ + http://projects.martini.nu/apache-otl/ Get VimOutliner at: http://www.vimoutliner.org/ --> @@ -195,13 +202,18 @@ foreach my $block ( sort { sorter(\%opt, \%re) } @blocks ) { # separate outline items - my @lines = grep { $_ !~ /$re{'hideline'}/ } split /\n/, $block; + my @lines; + foreach my $line ( split /\n/, $block ) { + push @lines, $line unless $line =~ $re{hideline} || + $line =~ $re{user} || $line =~ $re{user_wrap}; + } + my $data = []; # build structure and get item counts my ( $subs, $comments, $subsubs ) = ( 0, 0, 0 ); foreach ( @lines ) { - if (/$re{comment}/) { + if (/$re{body_wrap}/) { $comments++; } elsif (/$re{subitem}/) { @@ -245,9 +257,10 @@ } my $li_class = '>'; - $li_class = ' class="todo">' if $line =~ s#$re{todo}##; - $li_class = ' class="done">' if $line =~ s#$re{done}##; - $li_class = ' class="comment">' if $line =~ s#$re{comment}#$1#; + $li_class = ' class="todo">' if $line =~ s#$re{todo}##; + $li_class = ' class="done">' if $line =~ s#$re{done}##; + $li_class = ' class="comment_pre">' if $line =~ s#$re{body}#$1#; + $li_class = ' class="comment">' if $line =~ s#$re{body_wrap}#$1#; if ( $next_level == $level || $next_level == 0 ) { $r->print( "$in<li" . $li_class . "$line</li>\n" ); diff --git a/README b/README --- a/README +++ b/README @@ -45,8 +45,9 @@ --------------------------------------------------------------------- Settings for the otl_handler are stored on the first line of the otl -files themselves, prefixed by a colon. See the sample.otl for an -example settings line. All settings are entirely optional. +files themselves, prefixed by the 'user no wrap' character, '<'. See +the sample.otl for an example settings line. All settings are entirely +optional. title Type: string diff --git a/sample.otl b/sample.otl --- a/sample.otl +++ b/sample.otl @@ -1,4 +1,4 @@ -:title=Sample OTL list :counts=1 :timer=1 :style=styles/theme1.css :legend=1 :last_mod=1 +<:title=Sample OTL list :counts=1 :timer=1 :style=styles/theme1.css :legend=1 :last_mod=1 : Theme examples: : <a href="sample.otl">basic</a> <a href="sample.otl?counts=0&amp;style=styles/theme2.css&amp;legend=0&amp;js=/javascript/jquery.js,/javascript/theme2.js">advanced</a> <a href="sample.otl?counts=0&amp;style=styles/theme3.css&amp;legend=0&amp;timer=0&amp;js=/javascript/jquery.js,/javascript/theme3.js&amp;sort=1">advanced2</a> diff --git a/styles/theme1.css b/styles/theme1.css --- a/styles/theme1.css +++ b/styles/theme1.css @@ -37,6 +37,13 @@ font-family: sans; } +.comment_pre +{ + font-style: normal; + font-family: courier; + white-space: pre; +} + .counts { margin-left: 10px; diff --git a/styles/theme2.css b/styles/theme2.css --- a/styles/theme2.css +++ b/styles/theme2.css @@ -131,6 +131,13 @@ border-right: 1px solid #666; } +.comment_pre +{ + font-style: normal; + font-family: courier; + white-space: pre; +} + .comment:hover { border-top: 1px solid #aaa; diff --git a/styles/theme3.css b/styles/theme3.css --- a/styles/theme3.css +++ b/styles/theme3.css @@ -88,6 +88,13 @@ margin-bottom: 3px; } +#content .comment_pre +{ + font-style: normal; + font-family: courier; + white-space: pre; +} + #content { position: absolute;


                                                       WHAT IS THIS?
---------------------------------------------------------------------

Vimoutliner already comes with some otl to HTML converters that work
quite well.  I maintain a few different otl files, that are displayed
on a internal intranet - the step of converting to HTML on every little
change before upload was becoming mildly irritating, and countering my
near legendary laziness.

This mod_perl handler teaches apache how to pretty print otl natively.

Now, I can just edit the otl files directly - skip the conversion step
altogether, and let Apache make some delicious looking outlines.


                                                        INSTALLATION
---------------------------------------------------------------------

First of all, prerequisites!

    - apache2
    - mod_perl2
    - libapreq2 (Apache2::Request)

Add the following lines in your httpd.conf, or in a
separate otl.conf in the apache Includes directory:

    -------------------------
    PerlSwitches -I/path/to/perl/libraries
    PerlModule Apache::OTL

    <FilesMatch ".*\.otl">
        SetHandler perl-script
        PerlResponseHandler Apache::OTL
    </FilesMatch>
    -------------------------

Doublecheck that your apreq2 module is setup to load, as well.

That's it.  Apache will now pretty-print all your otl files.


                                                            SETTINGS
---------------------------------------------------------------------

Settings for the otl_handler are stored on the first line of the otl
files themselves, prefixed by the 'user no wrap' character, '<'. See
the sample.otl for an example settings line.  All settings are entirely
optional.

title
    Type: string
    Default: filename

    The title of the OTL.  Used as a header, and the html title.
    If this is not set, the html title is derived from the filename.


style
    Type: string
    Default: none

    A path to css style(s).
    Comma separated values load different files in order.
    Media type defaults to 'screen', if the css name contains the
    string 'print' anywhere, the media type is changed to print.

    :style=/css/otl_style.css,/css/print_style.css

js
    Type: string
    Default: none

    Use javascript?  If set, loads an external javascript library.
    Comma separated values load diff files in order.


last_mod
    Type: boolean
    Default: 0

    Show modification time of the otl file?

    
legend
    Type: boolean
    Default: 0

    Display small legend for todo and done items?


sort
    Type: boolean
    Default: 0

    Show sort links?


sorttype
    Type: string
    Default: none

    Default sorting method.  Valid values are
        percent
        alpha


sortrev
    Type: boolean
    Default: 0

    Should we default to reverse sorting?


counts
    Type: boolean
    Default: 0

    Count and display sub items?


timer
    Type: boolean
    Default: 0

    Display how long the parser took to generate the html?



                                                      INCLUDED FILES
---------------------------------------------------------------------

/Apache/OTL.pm
    The mod_perl content handler.

/javascript/*
    Example (but functional!) javascript.  Create line numbers,
    various eye candies, and clickable folds.

    This requires the 'jquery.js' library, also included.

/sample.otl
    An example vimoutliner file, with optional settings.

/styles/*
    "Theme" examples for customizing OTL display.


                                                    ACKNOWLEDGEMENTS
---------------------------------------------------------------------

Thanks to Nathan Dabney <nathan.dabney@gmail.com> and
Michael Granger <ged@faeriemud.org> for their help and advice!