<(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', ref => 'Reference', ); 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 @cmds = @{ $row->{thumb} // [] }; @cmds = ( 'convert', -delete => '1--1', -background => 'white', -gravity => @cmds ? 'northwest' : 'center', @cmds, -resize => '300x200^', -extent => '300x200', '-strip', -quality => '60%', -interlace => 'plane', $imgpath => $thumbpath ); my $status = system @cmds; $status == 0 or Alert([ "Thumbnail image not generated", "Failed to convert source image, error code ".($status >> 8), ], "@cmds"); } else { unlink $thumbpath; } } }} else { $row->{prio} //= 1; $row->{$_} = $get{$_} for keys %get; } my $title = $row->{id} ? "entry #$row->{id}" : 'new entry'; :>

Words <:= $title :>

<: for my $col (pairs @wordcols) { my $val = $row->{$col->key} // ''; $val = '{'.join(',', map {s/,/\\,/gr} @{$val}).'}' if ref $val eq 'ARRAY'; printf '
' . '
', $col->key, $col->value, Entity($val); -e and printf ' %s', $_, $row->{form} for $col->key eq 'source' ? "data/word/org/$row->{id}.jpg" : $col->key eq 'thumb' ? "data/word/eng/$row->{form}.jpg" : (); say '
'; } :>

<: $row->{id} or exit; :>

Hierarchy

<: say '