]> bicyclesonthemoon.info Git - ott/bsta/blobdiff - viewer.1.pl
Generate static viewer pages
[ott/bsta] / viewer.1.pl
index 94bc529e51dce22c2da5170fb14e7531c35e3d69..33c90edcb079ba8a18b60a3830160fbc3515ffbe 100644 (file)
@@ -27,10 +27,13 @@ use Encode ('encode', 'decode');
 
 ###PERL_LIB: use lib /botm/lib/bsta
 use botm_common (
+       'HTTP_STATUS',
        'read_header_env',
        'read_data_file', 'write_data_file',
        'url_query_decode',
-       'join_path'
+       'join_path',
+       'open_encoded',
+       'http_header_status',
 );
 use bsta_lib (
        'STATE', 'TEXT_MODE', 'INTF_STATE',
@@ -49,6 +52,7 @@ use bsta_lib (
 ###PERL_DATA_SETTINGS_PATH: DATA_SETTINGS_PATH = /botm/data/bsta/settings
 ###PERL_DATA_STATE_PATH:    DATA_STATE_PATH    = /botm/data/bsta/state
 ###PERL_DATA_STORY_PATH:    DATA_STORY_PATH    = /botm/data/bsta/story
+###PERL_DATA_WORDS_PATH:    DATA_WORDS_PATH    = /botm/data/bsta/words/
 
 binmode STDIN,  ':encoding(UTF-8)';
 binmode STDOUT, ':encoding(UTF-8)';
@@ -61,16 +65,19 @@ srand ($time-$$);
 my %http;
 my %cgi;
 my %frame_data;
+my %prev_frame_data;
 my %next_frame_data;
 my %default;
 my %settings;
 my %state;
 my %new_state;
 my %goto_list;
+my %words_data;
 
 my $method;
 my $frame;
 my $frame_data_path;
+my $prev_frame_data_path;
 my $next_frame_data_path;
 my $password;
 my $password_ok;
@@ -78,10 +85,12 @@ my $IP;
 my $access;
 my $timer;
 my $timer_unlocked;
-my $state_file;
+my $fh;
 my $show_command;
 my $ongtime;
 my $text_mode;
+my $words_page;
+my $words_data_path;
 
 delete @ENV{qw(IFS CDPATH ENV BASH_ENV)};
 ###PERL_SET_PATH: $ENV{'PATH'} = /usr/local/bin:/usr/bin:/bin;
@@ -90,7 +99,7 @@ if ($ENV{'REQUEST_METHOD'} =~ /^(HEAD|GET|POST)$/) {
        $method = $1;
 }
 else{
-       exit fail_method($ENV{'REQUEST_METHOD'}, 'GET, POST, HEAD');
+       exit fail_method($ENV{'REQUEST_METHOD'}, ['GET', 'POST', 'HEAD']);
 }
 
 %http = read_header_env(\%ENV);
@@ -122,10 +131,10 @@ if ($frame >= 0) {
 $password_ok = ($password eq $settings{'password'});
 
 # state & activation logic
-if (open ($state_file, "+<:encoding(UTF-8)", DATA_STATE_PATH())) {
-       if (flock($state_file, 2)) {
+if (open_encoded($fh, "+<:encoding(UTF-8)", DATA_STATE_PATH())) {
+       if (flock($fh, 2)) {
                
-               %state = read_data_file($state_file);
+               %state = read_data_file($fh);
                
                if ($frame < 0) {
                        $frame = int($state{'last'}) + $frame +1;
@@ -160,7 +169,7 @@ if (open ($state_file, "+<:encoding(UTF-8)", DATA_STATE_PATH())) {
                                else {
                                        $new_state{'state'} = STATE->{'ready'};
                                }
-                               write_data_file($state_file, '', '', \%new_state);
+                               write_data_file($fh, \%new_state);
                        }
                }
                elsif (
@@ -207,7 +216,7 @@ if (open ($state_file, "+<:encoding(UTF-8)", DATA_STATE_PATH())) {
                                        $r = write_index(\%state, \%settings);
                                }
                                if ($r) {
-                                       $r = write_data_file($state_file,     '','', \%state);
+                                       $r = write_data_file($fh, \%state);
                                }
                                unless ($r) {
                                        # FAILED ONG! Story as if it was inactive!
@@ -220,19 +229,12 @@ if (open ($state_file, "+<:encoding(UTF-8)", DATA_STATE_PATH())) {
                # FAILED GET STATE! Story as if it was inactive!
                $state{'state'} = STATE->{'inactive'};
        }
-       close ($state_file);
+       close ($fh);
 }
 else {
        $state{'state'} = STATE->{'inactive'};
 }
 
-$next_frame_data_path = join_path(PATH_SEPARATOR(), DATA_PATH(), $frame+1);
-%next_frame_data = read_data_file($next_frame_data_path);
-
-# apply defaults
-%frame_data      = merge_settings(\%default,      \%frame_data);
-%next_frame_data = merge_settings(\%default, \%next_frame_data);
-
 $timer   = int($state{'nextong'}) - $time;
 $ongtime = int($state{'ongtime'});
 if($ongtime == 0) {
@@ -264,6 +266,16 @@ if (
                )
        ) {
        $access = 1;
+       if ($frame > 0) {
+               $prev_frame_data_path = join_path(PATH_SEPARATOR(), DATA_PATH(), $frame-1);
+               %prev_frame_data = read_data_file($prev_frame_data_path);
+       }
+       $next_frame_data_path = join_path(PATH_SEPARATOR(), DATA_PATH(), $frame+1);
+       %next_frame_data = read_data_file($next_frame_data_path);
+       
+       %frame_data      = merge_settings(\%default,      \%frame_data);
+       %prev_frame_data = merge_settings(\%default, \%prev_frame_data);
+       %next_frame_data = merge_settings(\%default, \%next_frame_data);
 }
 else {
        $access = 0;
@@ -273,15 +285,24 @@ else {
 }
 
 $text_mode = int($cgi{'b'});
-if($text_mode > 2) {
+if($text_mode > TEXT_MODE->{'words'}) {
        $text_mode = TEXT_MODE->{'normal'};
 }
+$words_page = int($cgi{'i'});
+
+$words_data_path = join_path(PATH_SEPARATOR(), DATA_WORDS_PATH(), $frame);
+%words_data = read_data_file(
+       $words_data_path, # file
+       '', # encoding
+       0,  # no header
+       ($text_mode != TEXT_MODE->{'words'}), # header only
+       1,  # as list
+);
 
-print "Content-type: text/html\n";
-if(!$access) {
-       print "Status: 403 Forbidden\n";
+if (!$access) {
+       print http_header_status(HTTP_STATUS->{'forbidden'});
 }
-print "\n";
+print "Content-type: text/html; charset=UTF-8\n\n";
 if($method eq 'HEAD') {
        exit;
 }
@@ -298,9 +319,12 @@ print_viewer_page (
                'static'        => 0,
                'show_command'  => $show_command,
                'text_mode'     => $text_mode,
+               'words_page'    => $words_page
        },
        \%state,
        \%settings,
        \%frame_data,
-       \%next_frame_data
+       $access ? \%prev_frame_data : \%frame_data,
+       $access ? \%next_frame_data : \%frame_data,
+       \%words_data,
 );