App-SocialCalc-Multiplayer

 view release on metacpan or  search on metacpan

socialcalc/simpleedit14.pl  view on Meta::CPAN


#
# Main routine starts here:
#

sub process_request {

   my ($request) = @_;
   my $q = new CGI($request);

   my $response;

   my ($statusmessage);

   if ($q->param("loadsheet")) { # Ajax request: loadsheet=pagename.sheetname
      my $fullsheetname = $q->param("loadsheet");
      $fullsheetname =~ m/^(.*)\.(.*)$/;
      my $pagename = $1;
      my $sheetname = $2;
      my $page = {};
      load_page($q, $pagename, $page);
      my $sheetstr = $page->{items}{$sheetname}{text};
      my $htmlpos = index($sheetstr, "\nHTML:\n");
      if ($htmlpos >= 0) {
         $sheetstr = substr($sheetstr, 0, $htmlpos);
         }
sleep 1;
      return $sheetstr;
      }

   if ($q->param("wikitext")) { # Ajax request: wikitext=wikitext-url-encoded
      my $wikitext = $q->param("wikitext");
      $wikitext = expand_wikitext($wikitext);
sleep 1;
      return $wikitext;
      }

   my $pagename = $q->param('pagename');

   if ($q->param('newpage')) {
      $pagename = $q->param('newpagename');
      }

   $pagename =~ s/[^a-zA-Z0-9_\-]*//g;
   if (!$pagename) {
      $pagename = "home";
      $statusmessage .= "No pagename given - using '$pagename'<br>";
      }

   if ($q->param('savepageedit')) {
      my $newstr;
      $newstr = $q->param('pagetext');
      if ($q->param('edittype') eq "clean") {
         my $page = {};
         load_page($q, $pagename, $page);
         $newstr =~ s/^\[(spreadsheet|datatable|drawing)\:(.+?)\]/"[$1:$2:\n" . $page->{items}{$2}{text} . "\n:$1]"/gme;
         }
      open (PAGEFILEOUT, ">$datadir$pagename.page.txt");
      print PAGEFILEOUT $newstr;
      close PAGEFILEOUT;
      $statusmessage .= "Saved updated page '$pagename'.<br>";
      }

   if ($q->param("editpage") || $q->param("editrawpage")) { # when one of the "editpage" buttons is pressed
      return do_editpage($q, $pagename, $statusmessage);
      }

   foreach my $p ($q->param) {  # go through all the parameters
      if ($p =~ /^edit(spreadsheet|datatable):(.*)/) { # "editspreadsheet:sheetname" pressed
         return start_editsheet($pagename, $2, $q, $statusmessage);
         }
      if ($p =~ /^editdrawing:(.*)/) { # "editdrawing:sheetname" pressed
         return start_editdrawing($pagename, $1, $q, $statusmessage);
         }
      }

   if ($q->param('savespreadsheet')) { # save the edited spreadsheet
      my $page = {};
      load_page($q, $pagename, $page);
      my $pagestr = $page->{raw};
      my $sheetname = $q->param('sheetname');
      my $sheettype = $page->{items}{$sheetname}{type};

      $pagestr =~ s/^\[$sheettype\:$sheetname:.*?\:$sheettype\]/"[$sheettype:$sheetname:\n" . $q->param('newstr') . "\n:$sheettype]"/sme;

      open (PAGEFILEOUT, ">$datadir$pagename.page.txt");
      print PAGEFILEOUT $pagestr;
      close PAGEFILEOUT;
      $statusmessage =
          "Saved updated $sheettype '$sheetname' on page '$pagename'.<br>";
      }

   $response = do_displaypage($q, $pagename, $statusmessage); # Otherwise, display page

   return $response;

   }

#
# load_page($q, $pagename, \%page)
#
# Loads the specified page and puts the parts into %page:
#
#    %page{raw} - raw page text
#    %page{clean} - page text with embedded items' bodies removed
#    %page{items}{name} - hash with embedded item "name"'s info
#    %page{items}{name}{text} - text of embedded item's body
#    %page{items}{name}{type} - type embedded item (e.g., "spreadsheet")
#

sub load_page {

   my ($q, $pagename, $page) = @_;

   $page->{bodies} = {};

   open (PAGEFILEIN, "$datadir$pagename.page.txt");
   my ($rawstr, $cleanstr);
   while (my $line = <PAGEFILEIN>) {
      $line =~ s/\r//g;
      $rawstr .= $line;
      if ($line =~ m/^\[(spreadsheet|datatable|drawing)\:(.*?)\:/) {
         my $type = $1;
         my $name = $2;
         $page->{items}{$name} = {type => $type, text => ""};
         my $itemstr;
         while (my $sline = <PAGEFILEIN>) {
            $sline =~ s/\r//g;
            $rawstr .= $sline;
            last if substr($sline, 0, length($type)+2) eq ":$type]";
            $itemstr .= $sline;
            }
         $page->{items}{$name}{text} = $itemstr;
         $cleanstr .= "[$type:$name]\n";
         }
      else {
         $cleanstr .= $line;
         }
      }
   close PAGEFILEIN;
   $page->{raw} = $rawstr;
   $page->{clean} = $cleanstr;

   return;
   }

#
# $response = do_displaypage($q, $pagename, $statusmessage) - Display page
#



( run in 1.370 second using v1.01-cache-2.11-cpan-39bf76dae61 )