X-Git-Url: http://git.shiar.net/sheet.git/blobdiff_plain/15f691a9a975a2072734e9a422a53fe837de8b9d..3a619ed93038baf5568d87d3d4a24056e813e8af:/writer.plp?ds=inline
diff --git a/writer.plp b/writer.plp
index b8e5f2d..bae010c 100644
--- a/writer.plp
+++ b/writer.plp
@@ -6,22 +6,83 @@ Html({
nocache => 1,
raw => <<'EOT',
+
+
EOT
});
@@ -39,49 +100,180 @@ my $db = eval {
} or Abort('Database error', 501, $@);
my @wordcols = (
- form => 'Translation',
- ref => 'Reference',
- cat => 'Category',
lang => 'Language',
- source => 'Image URL',
- thumb => 'Convert options',
+ cat => 'Category',
+ ref => undef, # included with cat
+ prio => 'Level',
+ cover => undef, # included with prio
+ form => 'Translation',
+ alt => 'Synonyms',
wptitle => 'Wikipedia',
+ source => 'Image',
+ thumb => 'Convert options',
);
-my $find = $Request ? {id => $Request} : undef;
+my @prioenum = qw( essential basic common distinctive rare invisible );
+my ($find) = map {{id => $_}} $fields{id} || $Request || ();
my $row;
-if ($ENV{REQUEST_METHOD} eq 'POST') {
+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 => $Request ? '*' : 'lang, cat');
+ my %res = (returning => '*');
my $query = $find ? $db->update(word => $row, $find, \%res) :
$db->insert(word => $row, \%res);
$row = $query->hash;
- } or Alert("Entry could not be saved", $@);
-}
-elsif ($find) {
- $row = $db->select(word => '*', $find)->hash
- or Abort("Word not found", 404);
+ } or do {
+ Alert("Entry could not be saved", $@);
+ next;
+ };
+
+ my $imgpath = "data/word/org/$row->{id}.jpg";
+ my $reimage = eval {
+ ($row->{source} // '') ne ($replace->{source} // '') or return;
+ # copy changed remote url to local file
+ unlink $imgpath if -e $imgpath;
+ my $download = $row->{source} or return 1;
+ require LWP::UserAgent;
+ my $ua = LWP::UserAgent->new;
+ $ua->agent('/');
+ my $status = $ua->mirror($download, $imgpath);
+ $status->is_success
+ or die "Download from $download
failed: ".$status->status_line."\n";
+ };
+ !$@ or Alert(["Source image not found", $@]);
+
+ $reimage ||= $row->{thumb} ~~ $replace->{thumb}; # different convert
+ $reimage ||= $row->{cover} ~~ $replace->{cover}; # resize
+ $reimage++ if $fields{rethumb}; # force refresh
+
+ my $thumbpath = "data/word/eng/$row->{form}.jpg";
+ if ($reimage) {
+ 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 = $find ? "entry #$Request" : 'new entry';
+my $title = $row->{id} ? "entry #$row->{id}" : 'new entry';
:>