| CGI-Kwiki documentation | Contained in the CGI-Kwiki distribution. |
CGI::Kwiki::Template - HTML Template Base Class for CGI::Kwiki
See installed kwiki pages for more information.
Brian Ingerson <INGY@cpan.org>
Copyright (c) 2003. Brian Ingerson. All rights reserved.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
See http://www.perl.com/perl/misc/Artistic.html
| CGI-Kwiki documentation | Contained in the CGI-Kwiki distribution. |
package CGI::Kwiki::Template; use base 'CGI::Kwiki', 'CGI::Kwiki::Privacy'; $VERSION = '0.18'; use strict; CGI::Kwiki->rebuild if @ARGV and $ARGV[0] eq '--rebuild'; sub directory { 'template' } sub suffix { my ($self, $file) = @_; $file =~ /README/ ? '' : '.html'; } sub process { my ($self, $template, %vars) = @_; my @vars = ( $self->config->all, $self->cgi->all, $self->prefs->all, $self->driver->metadata->all, $self->all, %vars, ); my @templates = ref $template ? @$template : $template; return join '', map { $self->render($self->read_template($_), @vars) } @templates; } sub read_template { my ($self, $template) = @_; my $template_file = -f "local/template/$template.html" ? "local/template/$template.html" : "template/$template.html"; open TEMPLATE, $template_file or die "Can't open $template_file for input\n"; binmode(TEMPLATE, ':utf8') if $self->use_utf8; my $template_text = do {local $/; <TEMPLATE>}; close TEMPLATE; return $template_text; } sub render { my ($self, $template, %v) = @_; $template =~ s{\[%\s+IF\s+(\w+)\s+%\] (.*?) \[%\s+ELSE\s+%\] (.*?) \[%\s+END\s+%\] } {${\(defined $v{$1} && $v{$1} ? $2 : $3)}}gxs; $template =~ s{\[%\s+IF\s+(\w+)\s+%\] (.*?) \[%\s+END\s+%\] } {${\(defined $v{$1} && $v{$1} ? $2 : '')}}gxs; $template =~ s{\{\{(.*?)\}\}} {$self->interpolate($1, \%v)}eg; $template =~ s{([\?=])\[%\s+(\w+)\s+%\]\n?} {$1${\(defined $v{$2} ? $self->escape($v{$2}) : "")}}g; $template =~ s{\[%\s+(\w+)\s+%\]\n?} {${\(defined $v{$1} ? $v{$1} : "<!-- '$1' not defined -->")}}g; $template =~ s{\[%\s+(\w+)\(([^()]*?)\)\s+%\]\n?} {${\ $self->call_function($1, $2)}}g; $template =~ s{\[%\s+(\w+\.\w+)\(([^()]*?)\)\s+%\]\n?} {${\ $self->call_plugin($1, $2)}}g; return $template; } sub interpolate { my ($self, $text, $v) = @_; my $re; $text = $self->loc($text); $re = qr/\[((?:(?>[^\[\]]+)|(??{$re}))*)\]/; $text =~ s{$re} {<a href="[% script %]?$1">$1</a>}g; $text =~ s{\[%\s+(\w+)\s+%\]\n?} {${\(defined $v->{$1} ? $v->{$1} : "<!-- '$1' not defined -->")}}g; $text; } sub can_call { my ($self, $function) = @_; $function eq 'checkbox'; } sub call_function { my ($self, $function, $args) = @_; my @args = split /\s+/, $args; if ($self->can_call($function)) { return $self->$function(@args); } else { return "<!-- Can't call $function() -->" } } sub call_plugin { my ($self, $packed1, $packed2) = @_; my $return; eval { $return = $self->driver->plugin->call_packed($1, $2); }; return "<!-- $@ -->" if $@; return $return; } sub checkbox { my ($self, $boxname) = @_; my $prefs = $self->driver->cookie->prefs; my $checked = $prefs->{$boxname} ? ' checked' : ''; return qq{<input type="checkbox" name="$boxname"$checked>}; } 1; __DATA__
__README__ Any templates that you modify should be copied to a "local/template/" directory first. This will keep them from being clobbered by upgrades to CGI::Kwiki. CGI::Kwiki automatically looks for templates in the local/template/ directory before searching the template/ directory. __basic_footer__ </div><!-- close "blogbody" --> </div><!-- close "blog" --> </div><!-- close "content" --> <div id="links"> <div class="sidetitle"> {{Search}} </div><!-- close "sidetitle" --> <div class="side"> <form method="post" action="[% script %]" enctype="application/x-www-form-urlencoded"> <input type="text" name="search" size="15" value="{{Search}}" onfocus="this.value=''" /> <input type="hidden" name="action" value="search" /> </form> </div><!-- close "side" --> <div class="sidetitle"> {{Import}} </div><!-- close "sidetitle" --> <div class="side"> <form method="post" action="[% script %]" enctype="application/x-www-form-urlencoded"> <input type="text" name="search" size="15" value="{{Import}}" onfocus="this.value=''" /> <input type="hidden" name="action" value="import" /> </form> </div><!-- close "side" --> <div class="sidetitle"> {{KwikiNavigation}} </div><!-- close "sidetitle" --> <div class="side"> <span><a href="[% script %]?[% top_page %]" accesskey="1">[% loc_top_page %]</a></span> [% IF has_privacy %] <span><a href="blog.cgi">[% loc_blog_page %]</a></span> [% END %] <span><a href="[% script %]?[% changes_page %]">[% loc_changes_page %]</a></span> <span><a href="[% script %]?action=prefs">[% loc_preferences_page %]</a></span> </div><!-- close "side" --> <div class="powered"> Powered by:<br /><a href="http://kwiki.org">Kwiki 0.18</a> </div><!-- close "powered" --> </div><!-- close "links" --> </body> </html> __blog_entry__ <div class="blogbody"> <div class="blog-meta"> <span class="blog-date"><h2 class="date"><a href="blog.cgi?[% blog_id %]">[% blog_date %]</a></h2></span> <a id="[% blog_id %]"></a> <span class="blog-title"><h3 class="title"><a href="kwiki.cgi?[% page_id %]">[% page_id %]</a></h3></span> </div> [% entry_text %] </div><!-- close "blogbody" --> __blog_footer__ </div><!-- close "blog" --> </div><!-- close "content" --> <div id="links"> <div class="sidetitle"> {{Search}} </div><!-- close "sidetitle" --> <div class="side"> <form method="post" action="[% script %]" enctype="application/x-www-form-urlencoded"> <input type="text" name="search" size="15" value="{{Search}}" onfocus="this.value=''" /> <input type="hidden" name="action" value="search" /> </form> </div><!-- close "side" --> <div class="sidetitle"> {{Import}} </div><!-- close "sidetitle" --> <div class="side"> <form method="post" action="[% script %]" enctype="application/x-www-form-urlencoded"> <input type="text" name="search" size="15" value="{{Import}}" onfocus="this.value=''" /> <input type="hidden" name="action" value="import" /> </form> </div><!-- close "side" --> <div class="sidetitle"> {{KwikiNavigation}} </div><!-- close "sidetitle" --> <div class="side"> <span><a href="[% script %]?[% top_page %]" accesskey="1">[% loc_top_page %]</a></span> [% IF has_privacy %] <span><a href="blog.cgi">[% loc_blog_page %]</a></span> [% END %] <span><a href="[% script %]?[% changes_page %]">[% loc_changes_page %]</a></span> <span><a href="[% script %]?action=prefs">[% loc_preferences_page %]</a></span> </div><!-- close "side" --> <div class="powered"> Powered by:<br /><a href="http://kwiki.org">Kwiki 0.18</a> </div><!-- close "powered" --> </div><!-- close "links" --> </body> </html> __blog_header__ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=[% encoding %]" /> <title>[% title_prefix %]: {{Blog}}</title> <link rel="stylesheet" type="text/css" href="css/[% stylesheet %]"> <link rel="stylesheet" type="text/css" href="css/Display.css"> <link rel="shortcut icon" href="[% favicon %]" /> <link rel="start" href="index.cgi" title="Home" /> <!-- <script src="javascript/Blog.js"></script> --> </head> <body> <div id="banner"> <img src="[% kwiki_image %]" style="float:right" title="[% slogan %]" alt=""> <h1><a href="blog.cgi">{{Kwiki Blog}}</a></h1> <span class="description">[% slogan %]</span> </div> <div id="content"> <div class="blog"> <h1><a href="blog.cgi">{{Kwiki Blog}}</a></h1> <div class="upper-nav"> </div><!-- close "upper-nav" --> <a id="skip-upper-nav"></a> __display_body__ <div class="wiki"> [% display %] </div> [% IF is_editable %] <hr /> <form class="edit"> <input type="submit" name="button-edit" value="{{EDIT}}"> [% ELSE %] <form action="admin.cgi" class="admin"> <input type="submit" name="button-login" value="{{LOGIN}}"> [% END %] <input type="hidden" name="action" value="edit"> <input type="hidden" name="page_id" value="[% page_id %]"> </form> [% IF show_changed %] <div class="posted"> <i>{{This page last changed on [[% edit_time %]] by [[% edit_by %]]}}</i><br /> </div><!-- close "posted" --> [% END %] </div><!-- close "blogbody" --> <div class="comments-head"> [% Diff.entry_form() %] </div><!-- close "comments-head" --> <div class="comments-body"> <br /><a id="diff"></a> [% Diff.display_diff() %] __display_footer__ </div><!-- close "comments-body" --> </div><!-- close "blog" --> </div><!-- close "content" --> <div id="links"> <div class="sidetitle"> {{Search}} </div><!-- close "sidetitle" --> <div class="side"> <form method="post" action="[% script %]" enctype="application/x-www-form-urlencoded"> <input type="text" name="search" size="15" value="{{Search}}" onfocus="this.value=''" /> <input type="hidden" name="action" value="search" /> </form> </div><!-- close "side" --> <div class="sidetitle"> {{Import}} </div><!-- close "sidetitle" --> <div class="side"> <form method="post" action="[% script %]" enctype="application/x-www-form-urlencoded"> <input type="text" name="import" size="15" value="{{Import}}" onfocus="this.value=''" /> <input type="hidden" name="action" value="import" /> </form> </div><!-- close "side" --> <div class="sidetitle"> {{KwikiNavigation}} </div><!-- close "sidetitle" --> <div class="side"> <span><a href="[% script %]?[% top_page %]" accesskey="1">[% loc_top_page %]</a></span> [% IF has_privacy %] <span><a href="blog.cgi">[% loc_blog_page %]</a></span> [% END %] <span><a href="[% script %]?[% changes_page %]">[% loc_changes_page %]</a></span> <span><a href="[% script %]?action=prefs">[% loc_preferences_page %]</a></span> </div><!-- close "side" --> <div class="powered"> Powered by:<br /><a href="http://kwiki.org">Kwiki 0.18</a> </div><!-- close "powered" --> </div><!-- close "links" --> </body> </html> __display_header__ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=[% encoding %]" /> <title>[% title_prefix %]: [% page_id %]</title> <link rel="stylesheet" type="text/css" href="css/[% stylesheet %]"> <link rel="shortcut icon" href="[% favicon %]" /> <link rel="start" href="index.cgi" title="Home" /> <!-- <script src="javascript/Display.js"></script> --> </head> [% IF is_diff %] <body class="diff"> [% ELSE %] <body> [% END %] <div id="banner"> <img src="[% kwiki_image %]" style="float:right" title="[% slogan %]" alt=""> <h1>[% title_prefix %]</h1> <span class="description">[% slogan %]</span> <span style="display: none"><a href="#skip-upper-nav">>></a></span> </div> <!-- sister_html not available yet --> <div id="content"> <div class="blog"> <div class="blogbody"> <a id="entry"></a> <h2 class="title"><a href="[% script %]?action=search&search=[% page_id %]">[% page_id %]</a></h2> <div class="upper-nav"> <a href="[% script %]?[% top_page %]" accesskey="1">[% loc_top_page %]</a> | [% IF has_privacy %] <a href="blog.cgi">[% loc_blog_page %]</a> | [% END %] <a href="[% script %]?[% changes_page %]">[% loc_changes_page %]</a> | <a href="[% script %]?action=prefs">[% loc_preferences_page %]</a> | <form method="post" action="[% script %]" enctype="application/x-www-form-urlencoded" style="display: inline"> <input type="text" name="search" size="15" value="{{Search}}" onfocus="this.value=''" /> <input type="hidden" name="action" value="search" /> </form> </div><!-- close "upper-nav" --> <a id="skip-upper-nav"></a> <hr /> __edit_body__ <h2 class="comments-head">{{EDIT}}</h2> <div class="comments-post"> <br /> <script src="javascript/Edit.js"></script> <form method="post" action="[% script %]" enctype="application/x-www-form-urlencoded"> <input type="hidden" name="action" value="edit"> <input type="hidden" name="page_id" value="[% page_id %]"> <input type="hidden" name="version_mark" value="[% version_mark %]"> <input type="submit" name="button-save" value="{{SAVE}}"> <input type="text" name="page_id_new" value="[% page_id_new %]" size="15" onfocus="this.value=''"> <input type="submit" name="button-preview" value="{{PREVIEW}}"> <br /> [% IF error_msg %] <br /> <div class="error">[% error_msg %]</div> [% END %] <br /> [% IF is_admin %] <br /> <input type="radio" name="privacy" value="public"[% public_checked %]> <b>{{Public}}</b> <input type="radio" name="privacy" value="protected"[% protected_checked %]> <b>{{Protected}}</b> <input type="radio" name="privacy" value="private"[% private_checked %]> <b>{{Private}}</b><br /> [% END %] <textarea name="wiki_text" rows="25" cols="65" wrap="virtual" >[% wiki_text %]</textarea> <br /> [% history %] <br /> [% IF is_admin %] <br /> <input type="checkbox" name="blog" onclick="setProtected(this)"> <b>{{Blog this page on SAVE}}</b><br /> <input type="checkbox" name="delete" onclick="setForDelete(this)"> <b>{{Permanently delete this page on SAVE}}</b><br /> [% END %] </form> </div><!-- close "comments-post" --> __prefs_body__ [% IF not_admin %] <form method="post" enctype="application/x-www-form-urlencoded" action="admin.cgi" > <input type="submit" name="button-login" value="{{LOGIN}}"> <input type="hidden" name="action" value="prefs"> <b>{{(You must be a site administrator to login)}}</b> </form> <hr /> [% END %] [% IF is_admin %] <form method="post" enctype="application/x-www-form-urlencoded" action="kwiki.cgi" > <input type="submit" name="button-logout" value="{{LOGOUT}}"> <input type="hidden" name="action" value="prefs"> </form> <hr /> [% END %] <form> <p>{{Your [KwikiUserName] will be used to indicate who changed a page. This can be viewed in [[% changes_page %]].}} </p> <span style="color:red">[% error_msg %]</span> {{UserName: }} <input type="text" name="user_name" value="[% user_name %]" size="20"> <br /><br /> [% checkbox(show_changed) %] {{Show changed message at bottom of display.}}<br /> [% checkbox(select_diff) %] {{Show diff pulldown at bottom of display.}}<br /> [% checkbox(show_diff) %] {{Show latest diff at bottom of display.}}<br /> <br /> <input type="submit" name="button-save" value="{{SAVE}}"> <b>{{(Click the SAVE button after making changes)}}</b> <input type="hidden" name="action" value="prefs"> </form> __preview_body__ <h2 class="comments-head">{{PREVIEW}}</h2> <div class="comments-post"> [% preview %] </div><!-- close "comments-post" --> <hr /> __protected_edit_body__ <b>{{This is a protected page. Only the site administrator can edit it.}}</b> __slide_page__ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=[% encoding %]" /> <title>[% page_id %] - {{KwikiSlides}}</title> <link rel="stylesheet" type="text/css" href="css/[% stylesheet %]"> <link rel="stylesheet" type="text/css" href="css/SlideShow.css"> <script src="javascript/SlideShow.js"></script> </head> <body style="[% IF bgcolor %]background-color:[% bgcolor %];[% IF fgcolor %]color: [% fgcolor %];[% END %][% END %]"> <div class="slide-body"> <div class="blogbody"> <div id="banner" style="line-height:100%"> <h2>[% title %]</h2> [% IF subtitle %]<h4>( [% subtitle %] )</h4>[% END %] </div><!-- close "banner" --> <div style="padding:5%"> [% slide %] </div> <form method="POST" action="[% script %]"> <input type="hidden" name="control" value="none"> <input type="hidden" name="slide_num" value="[% slide_num %]"> <input type="hidden" name="line_num" value="[% line_num %]"> <input type="hidden" name="action" value="slides"> <input type="hidden" name="page_id" value="[% page_id %]"> </form> </div><!-- close "blogbody" --> </div><!-- close "slide-body" --> </body> </html>