#-*- perl -*-
#
# Copyright (C) 2002,2003,2004,2005,2006,2012 Ken'ichi Fukamachi
# All rights reserved.
#
# $FML: Calendar.pm,v 1.20 2006/10/14 00:43:46 fukachan Exp $
#
package FML::Process::Calendar;
use vars qw($debug @ISA @EXPORT @EXPORT_OK);
use strict;
use Carp;
use FML::Process::Kernel;
@ISA = qw(FML::Process::Kernel);
=head1 NAME
FML::Process::Calendar -- show calendear (as a demonstration).
=head1 SYNOPSIS
use FML::Process::Calendar;
$curproc = new FML::Process::Calendar;
$curproc->run();
=head1 DESCRIPTION
FML::Process::Calendar is a demonstration module to show fml module
usage. This module provides calendar presentation as a simple
scheduler based on FML::Demo::Calendar class.
=head1 METHODS
=head2 new($args)
constructor.
=head2 prepare($args)
load default configuration file to use $path_* variables.
=head2 verify_request($args)
dummy.
=head2 run($args)
main routine.
parse files under ~$user/.schedule/ directory and summarize it.
Lastly, use w3m to show schedule as html table.
=head2 finish($args)
dummy.
=cut
# Descriptions: constructor.
# avoid the default fml new() since we do not need it.
# Arguments: OBJ($self) HASH_REF($args)
# Side Effects: none
# Return Value: OBJ
sub new
{
my ($self, $args) = @_;
my ($type) = ref($self) || $self;
my $me = {};
$me->{ main_cf } = $args->{ main_cf };
$me->{ __parent_args } = $args;
return bless $me, $type;
}
# Descriptions: load default configurations to use $path_* info.
# Arguments: OBJ($curproc) HASH_REF($args)
# Side Effects: none
# Return Value: none
sub prepare
{
my ($curproc, $args) = @_;
# load only "default" configurations.
use FML::Config;
$curproc->{ config } = new FML::Config;
$curproc->config_cf_files_load();
}
# Descriptions: dummy.
# Arguments: OBJ($self) HASH_REF($args)
# Side Effects: none
# Return Value: none
sub verify_request { 1; }
# Descriptions: dummy.
# Arguments: OBJ($self) HASH_REF($args)
# Side Effects: none
# Return Value: none
sub finish { 1; }
# Descriptions: prepare parameters and call FML::Demo::Calendar module.
# we use w3m to show calendar (HTML table).
# Arguments: OBJ($curproc) HASH_REF($args)
# Side Effects: create temporary file and remove it in the last
# Return Value: none
sub run
{
my ($curproc, $args) = @_;
my $config = $curproc->config();
my $argv = $curproc->command_line_raw_argv();
my $option = $curproc->command_line_options();
my $mode = 'text';
# -h or --help
if (defined $option->{ h } || defined $option->{ help }) {
return $curproc->help();
}
use FileHandle;
use FML::Demo::Calendar;
# prepare new() argument
$mode = $option->{ m } if defined $option->{ m };
my $schedule_dir = $option->{ D } if defined $option->{ D };
my $schedule_file = $option->{ F } if defined $option->{ F };
my $schargs = {
schedule_dir => $schedule_dir,
schedule_file => undef,
};
# create a scheduler object.
my $schedule = new FML::Demo::Calendar $schargs;
# prepare output channel
my $tmpf = $schedule->tmpfilepath;
my $wh = new FileHandle $tmpf, "w";
unless (defined $wh) {
my $s = "cannot open temporary file";
$curproc->logerror($s);
croak($s);
}
# set output mode
$schedule->set_mode( $mode );
# -a option: show three monthly calendars for this, next and last month.
if (defined($option->{ a })) {
for my $month ('this', 'next', 'last') {
$schedule->print_specific_month($wh, $month);
}
}
# if "month" option is specified as an argument,
# show the corresponding calendar.
elsif (@$argv) {
# ($month, $yeer) = @$argv;
$schedule->print_specific_month($wh, @$argv);
}
# show this month calendar by default.
else {
$schedule->print_specific_month($wh, 'this');
}
$wh->close;
if ($mode eq 'text') {
my $w3m = $config->{ path_w3m } || 'w3m';
if (-x $w3m) {
system "$w3m -dump $tmpf";
}
else {
$curproc->logerror("w3m not found");
}
}
else {
$curproc->cat( [ $tmpf ] );
}
unlink $tmpf if -f $tmpf;
}
# Descriptions: show help.
# Arguments: OBJ($curproc)
# Side Effects: none
# Return Value: none
sub help
{
my ($curproc) = @_;
my $name = $0;
eval q{ use File::Basename;
$name = basename($0);
if ($name =~ /(\w+)$/) { $name = $1;}
};
print <<"_EOF_";
Usage: $name [-a] [-m mode] [month] [year]
show this month if not specified.
-h show this help
-a show calendar at this, next and last month
-m mode mode is 'text' or 'html'
-D DIR alternative of ~/.schedule/
-F FILE specify schedule file to read
--debug debug mode on
_EOF_
}
=head1 CODING STYLE
See C on fml coding style guide.
=head1 AUTHOR
Ken'ichi Fukamachi
=head1 COPYRIGHT
Copyright (C) 2002,2003,2004,2005,2006,2012 Ken'ichi Fukamachi
All rights reserved. This program is free software; you can
redistribute it and/or modify it under the same terms as Perl itself.
=head1 HISTORY
FML::Process::Calendar first appeared in fml8 mailing list driver package.
See C for more details.
C is renamed to C.
=cut
1;