package Spork::Slides; use Spork -Base; use mixin 'Spoon::Installer'; require CGI; const class_id => 'slides'; field image_url => ''; field slide_heading => ''; field slide_index => []; field 'first_slide'; field top_config => {}; field config => -init => '$self->hub->config'; sub make_slides { my @slides = $self->split_slides($self->config->slides_file); $self->first_slide($slides[0]); $self->config->add_config($slides[0]->{config}); $self->top_config({$self->config->all}); $self->make_start; for (my $i = 0; $i < @slides; $i++) { my $slide = $slides[$i]; $self->config->add_config($slide->{config}); my $content = $slides[$i]{slide_content}; $slide->{first_slide} = $slides[0]->{slide_name}; $slide->{prev_slide} = $i ? $self->make_link($slides[$i - 1]{slide_name}) : 'start.html'; $slide->{next_slide} = $slides[$i + 1] ? $self->make_link($slides[$i + 1]{slide_name}) : ''; $self->slide_heading(''); $self->image_url(''); my $parsed = $self->hub->formatter->text_to_parsed($content); my $html = $parsed->to_html; $slide->{slide_heading} = $self->slide_heading; $slide->{image_html} = $self->get_image_html; my $output = $self->hub->template->process('slide.html', %$slide, hub => $self->hub, index_slide => 'index.html', slide_content => $html, spork_version => "Spork v$Spork::VERSION", ); my $file_name = $self->config->slides_directory . '/' . $slide->{slide_name}; $output > io($file_name)->assert; push @{$self->slide_index}, $slide if $slide->{slide_name} =~ /^slide\d+a?\.html$/; } $self->make_index; } sub make_link { my $link = shift; return $link unless $self->config->auto_scrolldown; return $link if $link =~ /^slide\d+a?\.html$/; return "$link#end"; } sub make_index { my $output = $self->hub->template->process('index.html', %{$self->top_config}, slides => $self->slide_index, spork_version => "Spork v$Spork::VERSION", next_slide => 'start.html', ); my $file_name = $self->config->slides_directory . '/index.html'; $output > io($file_name)->assert; } sub make_start { my $output = $self->hub->template->process('start.html', spork_version => "Spork v$Spork::VERSION", index_slide => 'index.html', next_slide => $self->first_slide->{slide_name}, ); $output > io($self->start_name)->assert; } sub start_name { $self->config->slides_directory . '/start.html'; } sub split_slides { my $slides_file = shift; my @slide_info; my @slides = grep $_, split /^-{4,}\s*\n/m, io($slides_file)->slurp; my $slide_num = 1; my $config = {}; for my $slide (@slides) { if ($slide =~ /\A(^(---|\w+\s*:.*|-\s+.*|#.*)\n)+\z/m) { $config = $self->hub->config->parse_yaml($slide); next; } my @sub_slides = $self->sub_slides($slide); my $sub_num = @sub_slides > 1 ? 'a' : ''; while (@sub_slides) { my $sub_slide = shift @sub_slides; my $slide_info = { slide_num => $slide_num, slide_content => $sub_slide, slide_name => "slide$slide_num$sub_num.html", last => @sub_slides ? 0 : 1, config => $config, sub_num => $sub_num }; $config = {}; push @slide_info, $slide_info; $sub_num++; } $slide_num++; } return @slide_info; } sub sub_slides { my $raw_slide = shift; my (@slides, $slide); for (split /^\+/m, $raw_slide) { push @slides, $slide .= $_; } return @slides; } sub get_image_html { my $image_url = $self->image_url or return ''; my $image_width; ($image_url, $image_width) = split /\s+/, $image_url; $image_width ||= $self->config->image_width; my $image_file = $image_url; $image_file =~ s/.*\///; my $images_directory = $self->config->slides_directory . '/images'; io->dir($images_directory)->assert->open; my $image_html = qq{}; return $image_html if -f "$images_directory/$image_file"; require Cwd; my $home = Cwd::cwd(); chdir($images_directory) or die; my $method = $self->config->download_method . '_download'; warn "- Downloading $image_url\n"; $self->$method($image_url, $image_file); chdir($home) or die; return -f "$images_directory/$image_file" ? $image_html : ''; } sub wget_download { my ($image_url, $image_file) = @_; system "wget $image_url 2> /dev/null"; } sub curl_download { my ($image_url, $image_file) = @_; system "curl -o $image_file $image_url 2> /dev/null"; } sub lwp_download { my ($image_url, $image_file) = @_; system "lwp-download $image_url > /dev/null"; } __DATA__ =head1 NAME Spork::Slides - Slide Presentations (Only Really Kwiki) =head1 SYNOPSIS =head1 DESCRIPTION =head1 AUTHOR Brian Ingerson =head1 COPYRIGHT Copyright (c) 2004, 2005. 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 =cut __Spork.slides__ ---- presentation_topic: Spork presentation_title: Spork - The Kwiki Way To Do Slideshows presentation_place: Portland, Oregon presentation_date: March 25nd, 2004 ---- == What is Spork? * Spork Stands for: +** Slide Presentation (Only Really Kwiki) +* Spork is an HTML Slideshow Generator ** All slides are in one simple file ** Run |spork -make| to make the slides +* Spork is a CPAN Module +* Spork is Based on Spoon ---- == Using Spork Spork makes setting up a slide presentation very easy. Just follow these easy steps: * mkdir myslides * cd myslides * spork -new * vim config.yaml Spork.slides * spork -make * spork -start ---- show_controls: 0 ---- == Moving About * To Advance Slide: ** Click /Next/ or Click Mouse or ** Hit /Enter/ or /ctl-n/ or /spacebar/ * To Move Backwards: ** Click /Previous/ or ** Hit /Delete/ or /ctl-p/ * Other Movements ** Starting Slide - /ctl-s/ ** Index Slide - /ctl-i/ * Notice The Control Links Have Disappeared ---- == Creating Slides Slides are all done in *Kwiki* markup language. Simple stuff. * Example Slide: == Sample Slide My point is, it's as easy as: * One +* Two +* Three Putting a plus (+) at the start of a line creates a subslide effect. ---- == Using Images * Hey Look. A picture! {image: http://search.cpan.org/s/img/cpan_banner.png} +* Woah, it changed! {image: http://cpan.org/misc/jpg/cpan.jpg} +* Images are cached locally ---- == Linking to Files * Often Times You Want to Show a File * {file: ./Spork.slides This} is the Slide Show Text! * Just Write a Line Like This * {file: ./Spork.slides This} is the Slide Show Text! * {file: ./Spork.slides This} is the Slide Show Text! * For Relative Paths, Set This in the |config.yaml| file_base: /Users/ingy/dev/cpan/Spork ---- banner_bgcolor: lightblue ---- == That's All * The END