<(common.inc.plp)><: Html({ title => 'words cheat sheet admin', version => '1.0', nocache => 1, raw => <<'EOT', EOT }); use List::Util qw( pairs pairkeys ); my $db = eval { my @dbinfo = ( 'DBI:Pg:dbname=sheet;host=localhost', 'sheetadmin', 'fairuse', ) or die "database not configured\n"; require DBIx::Simple; DBIx::Simple->new(@dbinfo[0..2], { RaiseError => 1, pg_enable_utf8 => 1, }); } or Abort('Database error', 501, $@); my @wordcols = ( lang => 'Language', cat => 'Category', form => 'Translation', alt => 'Synonyms', wptitle => 'Wikipedia', source => 'Image URL', thumb => 'Convert options', prio => 'Level', cover => undef, # included with prio ref => 'Reference', ); my @prioenum = qw( essential basic common distinctive rare invisible ); my ($find) = map {{id => $_}} $fields{id} || $Request || (); my $row; if ($find) { $row = $db->select(word => '*', $find)->hash or Abort("Word not found", 404); } if (exists $get{copy}) { $row = {%{$row}{ qw(prio lang cat) }}; } elsif ($ENV{REQUEST_METHOD} eq 'POST') {{ my $replace = $row; $row = {%post{ pairkeys @wordcols }}; $_ = length ? $_ : undef for values %{$row}; eval { my %res = (returning => '*'); my $query = $find ? $db->update(word => $row, $find, \%res) : $db->insert(word => $row, \%res); $row = $query->hash; } or do { Alert("Entry could not be saved", $@); next; }; my $imgpath = "data/word/org/$row->{id}.jpg"; if (($row->{source} // '') ne ($replace->{source} // '')) { # copy changed remote url to local file unlink $imgpath if -e $imgpath; if (my $download = $row->{source}) { require LWP::UserAgent; my $ua = LWP::UserAgent->new; $ua->agent('/'); my $status = $ua->mirror($download, $imgpath); $status->is_success or Alert([ "Source image not found", "Download from $download failed: ".$status->status_line, ]); } } elsif ($row->{thumb} ~~ $replace->{thumb}) { # image and conversion unaltered $imgpath = undef; } my $thumbpath = "data/word/eng/$row->{form}.jpg"; if ($imgpath) { if (-e $imgpath) { my $xyres = $row->{cover} ? '600x400' : '300x200'; my @cmds = @{ $row->{thumb} // [] }; @cmds = ( 'convert', -delete => '1--1', -background => 'white', -gravity => @cmds ? 'northwest' : 'center', @cmds, -resize => "$xyres^", -extent => $xyres, '-strip', -quality => '60%', -interlace => 'plane', $imgpath => $thumbpath ); eval { require IPC::Run; my $output; IPC::Run::run(\@cmds, '<' => \undef, '>&' => \$output) or die $output || ($? & 127 ? "signal $?" : "error code ".($? >> 8))."\n"; } or Alert([ "Thumbnail image not generated", "Failed to convert source image.", ], "@cmds\n$@"); } else { unlink $thumbpath; } } }} else { $row->{prio} //= 1; $row->{$_} = $get{$_} for keys %get; } my $title = $row->{id} ? "entry #$row->{id}" : 'new entry'; :>

Words <:= $title :>

<: if ($row->{id}) { :> <: } :>