Editing parts of an HTML with CGI

From JmPm

Jump to: navigation, search

If you look at the source code of http://www.henyregev.com/index_heb.html you will see tags like: <start_shakuf> bla bla <end_shakuf>

This tags will be ignored by the browser, but will be used by edit.pl (link at the buttom of the page).

Here is the code for it:

#!/usr/bin/perl
use CGI;
use CGI::Carp qw(fatalsToBrowser);

my $q=new CGI;
print $q->header(-charset => "windows-1255");
print '<HTML><HEAD><meta http-equiv="Content-Type" content="text/html; charset=windows-1255"/></HEAD><BODY>',"\n";

my $HTTP_REFERER = $ENV{'HTTP_REFERER'};
if ($HTTP_REFERER =~ /html?/ ) {
  read_file();
} else {
  save_file();
}

print '</BODY></HTML>';
exit;

########################################################
sub read_file {
  my $HTTP_HOST    = $ENV{'HTTP_HOST'};
  $HTTP_REFERER =~ s/$HTTP_HOST//; $HTTP_REFERER =~ s|^http://|..|;
  print "Proccessing file:<b>$HTTP_REFERER</b>";
  
  my $file_edited = $HTTP_REFERER;
  open( my $fh, $file_edited ) or die "cannot open file $file_edited $!\n";
  my $text = do { local( $/ ) ; <$fh> } ; # slurp
  $text =~ s/\n/new_row/g;

  print '<FORM method="POST">';
  while ($text=~m/<start_(.*?)>(.*?)<end_(.*?)>/g ) {
    my $code = $1;
    my $data = $2;
    my $end_code = $3;
    if ($code ne $end_code) {
      print "_____ start code ne end code _____" if $code ne $end_code;
      next;
    }

  $data =~ s/new_row/\n/g;
  my $rows=2;    $rows+=1 while $data=~/\n/g; # count the number of lines
  
  print <<EndOfHTML;
  $code: <br>
  <textarea dir="rtl" id="$code" name="$code" rows="$rows" cols="100" maxlength="10000">$data</textarea>
  <br>
EndOfHTML

  }

  print <<EndOfHTML;
  <input type="hidden" name="file_edited" value="$file_edited">
  Password: <Input type=password name="password">
  <input type="submit" value="Save changes">
</FORM>
EndOfHTML

  $file_edited=~s/\/htdocs//;
  print "<br><a href=$file_edited>To cancel changes press here</a>";

}


########################################################
sub save_file {
  if ($q->param('password') ne '__the_pw__') {
    print "WRONG PASSWORD";
    exit;
  }

  print '<B>Saving:</B>',"\n";
  my $file_edited = $q->param('file_edited');
  print "$file_edited\n";
  print "<br>\n";
  open( my $fh, $file_edited ) or die "cannot open file $file_edited $!\n";
  my $text = do { local( $/ ) ; <$fh> } ; # slurp
  my $backup_text = $text;
  $text =~ s/\n/new_row/g;

  my @param_names = $q->param;
  foreach (@param_names) {
    my $param_name  = $_;
    next if $param_name eq "file_edited" or $param_name eq "password";
    my $param_value = $q->param($param_name);
    #print "$param_name - $param_value  <br>\n";
    $text=~s/<start_$param_name>.*?<end_$param_name>/<start_$param_name>$param_value<end_$param_name>/;
  }

  # backing up file before change:
  rename($file_edited,"$file_edited.old");
  open(FH_OLD, ">$file_edited.old") or die "Cant open $file_edited.old message:$!\n";
  print FH_OLD $backup_text;
  print "Old file saved as $backup_name <br>\n";

  # saved the changed file:
  open(FH_OUT, ">$file_edited") or die "Cant open $file_edited message:$!\n";
  $text =~ s/new_row/\n/g;
  print FH_OUT $text;

  $file_edited=~s/\/htdocs//;
  print "<br><a href=$file_edited>prees here to see changed file</a>";
}

Personal tools