--- make_poll.pl 2003/10/11 11:40:36 1.10
+++ make_poll.pl 2003/10/23 22:13:30 1.16
@@ -10,6 +10,7 @@
use XML::Parser;
use common;
+use Carp;
$|=1;
@@ -22,15 +23,15 @@
my $poll;
my $dowarn = 1;
-my $pitanje_nr = 0; # curr. pitanje
-my $pitanje_tag = ""; # originalni oblik broja pitanja
-my $page_nr = 1; # prvo pitanje na strani
+my $question_nr = 0; # curr. question
+my $question_tag = ""; # originalni oblik broja questions
+my $page_nr = 1; # prvo question na strani
my $p_suffix=""; # if more than one box per question
my $curr_suffix=""; # trenutni suffix
-my @stack_pit; # stack pitanja (pitanje, suffix)
+my @stack_que; # stack of questions (question, suffix)
my @sql_create = ("id serial",
"http_referer character varying(500)",
@@ -66,10 +67,44 @@
# and users will see just "red" and "black"
my $remove_nrs_in_answers=0;
+# This defines files which will be included in various places to produce
+# design. You could desing them using your faviourite html editor (vim :-)
+# and then split them into separate files
+
+my %include_files = (
+# this file is included at top of each paAge
+ 'header' => "header.html",
+# this file is used to separate questions
+ 'separator' => "separator.html",
+# this file is used to show "submit" button, which under multi-page
+# polls will also bring next page
+ 'submit' => "next.html",
+# this file is included at bottom of each page
+ 'footer' => "footer.html",
+# this file will be showen after poll is completed
+ 'thanks' => "thanks.html"
+);
+
+# buffer for suck(_file)ed html files
+# and additional markup before and after tags
+my %html = (
+ 'hr_before' => " ",
+ 'hr_after' => "
",
+ 'que_before' => "
",
+ 'que_after' => "
",
+ 'subque_before' => '
',
+ 'subque_after' => "
",
+ 'ans_before' => "
",
+ 'ans_after' => "
",
+ 'html_before' => "
",
+ 'html_after' => "
",
+
+);
+
#------------------------------------------------------------------
sub suck_file {
- my $file = shift @_;
+ my $file = shift || croak "suck_file called without argument";
open(H,$file) || die "can't open '$file': $!";
my $content;
while () { $content .= $_; } ;
@@ -77,10 +112,10 @@
return $content;
}
-my $html_header=suck_file("header.html");
-my $html_separator=suck_file("separator.html");
-my $html_next=suck_file("next.html");
-my $html_footer=suck_file("footer.html");
+$html{'header'}=suck_file($include_files{'header'});
+$html{'separator'}=suck_file($include_files{'separator'});
+$html{'submit'}=suck_file($include_files{'submit'});
+$html{'footer'}=suck_file($include_files{'footer'});
#------------------------------------------------------------------
@@ -117,7 +152,7 @@
#------------------------------------------------------------------
-my $html_kraj=suck_file("thanks.html");
+$html{'thanks'}=suck_file($include_files{'thanks'});
#------------------------------------------------------------------
@@ -201,7 +236,7 @@
$page_nr++;
open(PAGE, ">$poll/$next_fn") or die "Couldn't open $next_fn for writing:\n$!";
print PAGE php_header($page_nr,@last_sql_update);
-print PAGE "$html_header $html_kraj $html_footer";
+print PAGE "$html{'header'} $html{'thanks'} $html{'footer'}";
close(PAGE);
# dump sql structure
@@ -244,215 +279,199 @@
## End of main
################
-# return unique name of pitanje
-sub new_pit {
- my $out="p".$pitanje_nr;
+# return unique name of question
+sub new_que {
+ my $out="p".$question_nr;
$out .= "_".$p_suffix if ($p_suffix);
$curr_suffix=$p_suffix;
$p_suffix++;
return $out;
}
-# current pitanje
-sub curr_pit {
- return "p".$pitanje_nr.$curr_suffix;
+# current question
+sub curr_que {
+ return "p".$question_nr.$curr_suffix;
}
#----------------------------------------------------------
sub starthndl {
- my ($xp, $el, %atts) = @_;
+ my ($xp, $el, %atts) = @_;
-# return unless ($in_poll or $el eq 'slideshow');
+# return unless ($in_poll or $el eq 'slideshow');
- unless ($in_poll) {
- $in_poll = $xp->depth + 1;
- return;
- }
+ unless ($in_poll) {
+ $in_poll = $xp->depth + 1;
+ return;
+ }
+
+ if ($Mode) {
+ if ($Mode eq 'pass') {
+ $Markedup_Text .= "\n" . $xp->recognized_string;
+ } elsif ($Mode eq 'object') {
+ push(@Ostack, $Object);
+
+ $Object = {
+ _Atts => \%atts,
+ _Text => ''
+ };
+ bless $Object, "Slideobj::$el";
+ }
- if ($Mode) {
+ # skip does nothing
+ return;
+ }
- if ($Mode eq 'pass') {
- $Markedup_Text .= "\n" . $xp->recognized_string;
- }
- elsif ($Mode eq 'object') {
- push(@Ostack, $Object);
+ unless ($after_head) {
+ if ($el eq 'head') {
+ $after_head = 1;
+ start_mode($xp, 'object');
- $Object = {_Atts => \%atts,
- _Text => ''
- };
- bless $Object, "Slideobj::$el";
- }
+ push(@closure_stack, $closure);
+ $closure = sub {
+ my ($xp, $text) = @_;
- # skip does nothing
- return;
- }
-
- unless ($after_head) {
- if ($el eq 'head') {
- $after_head = 1;
- start_mode($xp, 'object');
-
- push(@closure_stack, $closure);
- $closure =
- sub {
- my ($xp, $text) = @_;
-
- unless (defined $text) {
-
- $header = $Object;
- }
- };
+ unless (defined $text) {
+ $header = $Object;
+ }
+ };
+ return;
+ }
- return;
- }
+# die "The head element must be the first thing in the slideshow";
+ }
-# die "The head element must be the first thing in the slideshow";
- }
+ my $new_closure;
- my $new_closure;
+ my $subname = "Poll::$el";
- my $subname = "Poll::$el";
+ if (defined &$subname) {
+ no strict 'refs';
- if (defined &$subname) {
- no strict 'refs';
+ &$subname($xp, $el, \%atts, \$new_closure);
+ } else {
+ $body .= x($xp->recognized_string);
+ $new_closure = sub {
+ my ($xp, $text) = @_;
- &$subname($xp, $el, \%atts, \$new_closure);
- }
- else {
- $body .= x($xp->recognized_string);
- $new_closure =
- sub {
- my ($xp, $text) = @_;
-
- if (defined $text) {
- $body .= x($text);
- }
- else {
- $body .= x("$el>");
+ if (defined $text) {
+ $body .= x($text);
+ } else {
+ $body .= x("$el>");
+ }
+ };
}
- };
- }
- push(@closure_stack, $closure);
- $closure = $new_closure;
-} # End starthndl
+ push(@closure_stack, $closure);
+ $closure = $new_closure;
+} # End starthndl
sub endhndl {
- my ($xp, $el) = @_;
+ my ($xp, $el) = @_;
- return unless $in_poll;
+ return unless $in_poll;
- my $lev = $xp->depth;
+ my $lev = $xp->depth;
- if ($lev == $in_poll - 1) {
- $in_poll = 0;
- $xp->finish;
- return;
- }
-
- if ($Mode_level == $lev) {
-
- if ($Mode eq 'pass') {
- &$closure($xp, $Markedup_Text)
- if (defined $closure);
- }
+ if ($lev == $in_poll - 1) {
+ $in_poll = 0;
+ $xp->finish;
+ return;
+ }
+
+ if ($Mode_level == $lev) {
+
+ if ($Mode eq 'pass') {
+ &$closure($xp, $Markedup_Text) if (defined $closure);
+ }
- $Mode = $Mode_level = 0;
- }
+ $Mode = $Mode_level = 0;
+ }
- if ($Mode) {
- if ($Mode eq 'pass') {
- $Markedup_Text .= "$el>";
- }
- elsif ($Mode eq 'object') {
- my $this = $Object;
- if (2 == keys %$this) {
- $this = $this->{_Text};
- }
-
- $Object = pop(@Ostack);
-
- my $slot = $Object->{$el};
- if (defined $slot) {
- if (ref($slot) eq 'ARRAY') {
- push(@$slot, $this);
- }
- else {
- $Object->{$el} = [$slot, $this];
- }
- }
- else {
- $Object->{$el} = $this;
- }
- }
+ if ($Mode) {
+ if ($Mode eq 'pass') {
+ $Markedup_Text .= "$el>";
+ } elsif ($Mode eq 'object') {
+ my $this = $Object;
+ if (2 == keys %$this) {
+ $this = $this->{_Text};
+ }
- return;
- }
+ $Object = pop(@Ostack);
+
+ my $slot = $Object->{$el};
+ if (defined $slot) {
+ if (ref($slot) eq 'ARRAY') {
+ push(@$slot, $this);
+ } else {
+ $Object->{$el} = [$slot, $this];
+ }
+ } else {
+ $Object->{$el} = $this;
+ }
+ }
- &$closure($xp)
- if defined $closure;
+ return;
+ }
+
+ &$closure($xp) if defined $closure;
- $closure = pop(@closure_stack);
+ $closure = pop(@closure_stack);
} # End endhndl
#----------------------------------------------------------
sub text {
- my ($xp, $data) = @_;
+ my ($xp, $data) = @_;
- return unless $in_poll;
+ return unless $in_poll;
- if ($Mode ) {
+ if ($Mode) {
- if ($Mode eq 'pass') {
- my $safe = sgml_escape($data);
+ if ($Mode eq 'pass') {
+ my $safe = sgml_escape($data);
- $Text .= $safe;
- $Markedup_Text .= $safe;
- }
- elsif ($Mode eq 'object') {
- $Object->{_Text} .= $data
- if $data =~ /\S/;
- }
+ $Text .= $safe;
+ $Markedup_Text .= $safe;
+ } elsif ($Mode eq 'object') {
+ $Object->{_Text} .= $data if $data =~ /\S/;
+ }
- return;
- }
+ return;
+ }
- &$closure($xp, sgml_escape($data))
- if (defined $closure);
+ &$closure($xp, sgml_escape($data)) if (defined $closure);
} # End text
sub start_mode {
- my ($xp, $mode) = @_;
+ my ($xp, $mode) = @_;
- if ($mode eq 'pass') {
- $Text = '';
- $Markedup_Text = '';
- }
- elsif ($mode eq 'object') {
- $Object = {_Atts => undef,
- _Text => undef
- };
- }
+ if ($mode eq 'pass') {
+ $Text = '';
+ $Markedup_Text = '';
+ } elsif ($mode eq 'object') {
+ $Object = {
+ _Atts => undef,
+ _Text => undef
+ };
+ }
- $Mode = $mode;
- $Mode_level = $xp->depth;
+ $Mode = $mode;
+ $Mode_level = $xp->depth;
} # End start_mode
sub sgml_escape {
- my ($str) = @_;
+ my ($str) = @_;
- $str =~ s/\&/\&/g;
- $str =~ s/\</g;
- $str =~ s/>/\>/g;
+ $str =~ s/\&/\&/g;
+ $str =~ s/\</g;
+ $str =~ s/>/\>/g;
- $str;
+ $str;
} # End sgml_escape
-
################################################################
package Poll;
@@ -483,7 +502,7 @@
@sql_update = ();
$last_fn=sprintf("%02d.php",$page_nr);
- $last_page="$html_header $body $html_next $html_footer";
+ $last_page="$html{'header'} $body $html{'submit'} $html{'footer'}";
# delete vars for next page
$page_nr++;
$body="";
@@ -496,18 +515,18 @@
my ($xp, $el, $attref, $ncref) = @_;
- $pitanje_tag="";
+ $question_tag="";
$$ncref = sub {
my ($xp, $text) = @_;
if (defined($text)) {
$body.=x($text);
chomp $text;
- $pitanje_tag .= x($text);
+ $question_tag .= x($text);
} else {
- $pitanje_nr = $pitanje_tag;
- $pitanje_nr =~ s/[^0-9a-zA-Z]//g;
- print "$pitanje_nr ";
+ $question_nr = $question_tag;
+ $question_nr =~ s/[^0-9a-zA-Z]//g;
+ print "$question_nr ";
}
$p_suffix="";
};
@@ -515,19 +534,15 @@
sub hr {
- $body .= "