+my @img_variants=(
+ { "id"=>"png","qs"=>1.0,"content-type"=>"image/png" },
+ { "id"=>"gif","qs"=>0.9,"content-type"=>"image/gif" },
+ );
+my $img_variants_re='[.](?:'.join('|',"jpeg",map(($_->{"id"}),@img_variants)).')$';
+
+sub img_src ($)
+{
+my($file_base)=@_;
+
+ if (!url_is_local($file_base)) {
+ return $file_base if !wantarray();
+ return ($file_base,$file_base);
+ }
+ # Known image extension?
+ if ($file_base=~m#$img_variants_re#o) {
+ return $file_base if !wantarray();
+ return ($file_base,$file_base) if $file_base!~m#^/#;
+ return (top_dir($file_base),top_dir_disk().$file_base);
+ }
+
+ my $file_base_disk;
+ my $file_base_uri;
+ if ($file_base!~m#^/#) {
+ $file_base_disk=$file_base_uri=$file_base;
+ }
+ else {
+ $file_base_disk=top_dir_disk().$file_base;
+ $file_base_uri=top_dir($file_base);
+ }
+
+ my @nego_variants;
+ for my $var (@img_variants) {
+ my $file=$file_base_disk.".".$var->{"id"};
+ # TODO: Somehow quickly check dependencies?
+ make('make -s --no-print-directory'
+ .' -C '."'".File::Basename::dirname($file)."' '".File::Basename::basename($file)."'")
+ if !-f $file;
+ push @nego_variants,negotiate_variant(
+ %$var,
+ "size"=>(stat $file)[7],
+ );
+ }
+ # Do not: ,$W->{"r"});
+ # but should we provide somehow either 'HTTP::Headers' or 'HTTP::Request' ?
+ my $ext=HTTP::Negotiate::choose(\@nego_variants);
+ $ext||=$img_variants[0]->{"id"}; # &HTTP::Negotiate::choose failed?
+
+ return $file_base_uri.".".$ext if !wantarray();
+ return ($file_base_uri.".".$ext,$file_base_disk.".".$ext);
+}
+
+sub img ($$;%)
+{
+my($file_base,$alt,%attr)=@_;
+
+ my($file_uri,$file_disk)=img_src $file_base;
+ my($width,$height)=Image::Size::imgsize($file_disk);
+ $alt=~s/<[^>]*>//g;