- Timestamp:
- 2021-02-26T19:39:51+13:00 (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
main/trunk/greenstone2/perllib/cpan/Image/ExifTool/HtmlDump.pm
r24107 r34921 14 14 use Image::ExifTool::HTML qw(EscapeHTML); 15 15 16 $VERSION = '1.3 0';17 18 sub DumpTable($$$;$$$$$ );16 $VERSION = '1.39'; 17 18 sub DumpTable($$$;$$$$$$); 19 19 sub Open($$$;@); 20 20 sub Write($@); … … 33 33 my $htmlHeader2 = <<_END_PART_2_; 34 34 </title> 35 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 35 36 <style type="text/css"> 36 37 <!-- … … 61 62 position: absolute; 62 63 background: #ffffdd; 64 zoom: 1; 65 -moz-opacity: 0.8; 66 -khtml-opacity: 0.8; 67 -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=80)'; 68 filter: alpha(opacity=80); 63 69 opacity: 0.8; 64 -moz-opacity: 0.8;65 filter: alpha(opacity=80);66 -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=80)';67 70 z-index: 2; 68 71 } … … 95 98 var ie6 = navigator.userAgent.toLowerCase().indexOf('msie 6') >= 0; 96 99 var mspan = new Array; 97 var hlist, tt, tb; 100 var clicked = 0; 101 var hlist, tt, tb, firstOutEvt, lastInEvt; 98 102 99 103 function GetElementsByClass(classname, tagname) { … … 110 114 } 111 115 } 112 delete list;113 116 return found; 117 } 118 119 // click mouse 120 function doClick(e) 121 { 122 if (!clicked) { 123 firstOutEvt = lastInEvt = undefined; 124 high(e, 2); 125 if (hlist) clicked = 1; 126 } else { 127 clicked = 0; 128 if (firstOutEvt) high(firstOutEvt, 0); 129 if (lastInEvt) high(lastInEvt, 1); 130 } 114 131 } 115 132 … … 161 178 // highlight/unhighlight text 162 179 function high(e,on) { 180 if (on) { 181 lastInEvt = e; 182 } else { 183 if (!firstOutEvt) firstOutEvt = e; 184 } 185 if (clicked) return; 163 186 var targ; 164 187 if (e.target) targ = e.target; … … 170 193 if (hlist) { 171 194 for (var i=0; i<hlist.length; ++i) { 172 hlist[i].style.background = 'transparent'; 195 for (var j=0; j<hlist[i].length; ++j) { 196 hlist[i][j].style.background = 'transparent'; 197 } 173 198 } 174 199 hlist = null; … … 189 214 } 190 215 // highlight anchor elements with the same name 191 hlist = document.getElementsByName(targ.name); 216 hlist = new Array; 217 hlist.push(document.getElementsByName(targ.name)); 218 // is this an IFD pointer? 219 var pos = targ.className.indexOf('Offset_'); 220 if (pos > 0) { 221 // add elements from this IFD to our highlight list 222 hlist.push(document.getElementsByClassName(targ.className.substr(pos+7))); 223 } 192 224 // use class name to highlight span elements if necessary 193 225 for (var i=0; i<mspan.length; ++i) { 194 226 if (mspan[i] != targ.name) continue; 195 var slist = GetElementsByClass(targ.name, 'span'); 196 // add elements from hlist collection to our array 197 for (var j=0; j<hlist.length; ++j) { 198 slist[slist.length] = hlist[j]; 199 } 200 hlist = slist; 227 // add these span elements to our highlight list 228 hlist.push(GetElementsByClass(targ.name, 'span')); 201 229 break; 202 230 } 203 for (var j=0; j<hlist.length; ++j) { 204 hlist[j].style.background = '#ffcc99'; 231 for (var i=0; i<hlist.length; ++i) { 232 for (var j=0; j<hlist[i].length; ++j) { 233 hlist[i][j].style.background = on == 2 ? '#ffbbbb' : '#ffcc99'; 234 } 205 235 } 206 236 } … … 218 248 <tr><td valign='top'><pre>]; 219 249 220 my $preMouse = q(<pre onmouseover="high(event,1)" onmouseout="high(event,0)" onmousemove="move(event)" >);250 my $preMouse = q(<pre onmouseover="high(event,1)" onmouseout="high(event,0)" onmousemove="move(event)" onmousedown="doClick(event)">); 221 251 222 252 #------------------------------------------------------------------------------ … … 235 265 # Inputs: 0) HTML dump hash ref, 1) absolute offset in file, 2) data size, 236 266 # 3) comment string, 4) tool tip (or SAME to use previous tip), 237 # 5) bit flags (see below) 267 # 5) bit flags (see below), 6) IFD name 238 268 # Bits: 0x01 - print at start of line 239 269 # 0x02 - print red address … … 243 273 # 0x100 - (reserved) 244 274 # Notes: Block will be shown in 'unused' color if comment string begins with '[' 245 sub Add($$$$;$ )275 sub Add($$$$;$$) 246 276 { 247 my ($self, $start, $size, $msg, $tip, $flag ) = @_;277 my ($self, $start, $size, $msg, $tip, $flag, $ifd) = @_; 248 278 my $block = $$self{Block}; 249 279 $$block{$start} or $$block{$start} = [ ]; … … 262 292 ++$self->{TipNum}; 263 293 } 264 push @{$$block{$start}}, [ $size, $msg, $htip, $flag, $self->{TipNum} ];294 push @{$$block{$start}}, [ $size, $msg, $htip, $flag, $self->{TipNum}, $ifd ]; 265 295 } 266 296 … … 313 343 # only do dump if we didn't have a serious error 314 344 @starts = sort { $a <=> $b } keys %$block unless $$self{Error}; 315 for ($i=0; $i< @starts; ++$i) {345 for ($i=0; $i<=@starts; ++$i) { 316 346 my $start = $starts[$i]; 317 my $parmList = $$block{$start}; 347 my $parmList; 348 if (defined $start) { 349 $parmList = $$block{$start}; 350 } elsif ($bkgEnd and $pos < $bkgEnd and not defined $wasUnused) { 351 $start = $bkgEnd; # finish last bkg block 352 } else { 353 last; 354 } 318 355 my $len = $start - $pos; 319 356 if ($len > 0 and not $wasUnused) { 320 # we have a nunused bytes before this data block321 --$i; 357 # we have a unused bytes before this data block 358 --$i; # dump the data block next time around 322 359 # split unused data into 2 blocks if it spans end of a bkg block 323 360 my ($nextBkgEnd, $bkg); … … 343 380 my $parms; 344 381 foreach $parms (@$parmList) { 345 my ($len, $msg, $tip, $flag, $tipNum ) = @$parms;382 my ($len, $msg, $tip, $flag, $tipNum, $ifd) = @$parms; 346 383 next unless $len > 0; 347 384 $flag = 0 unless defined $flag; … … 359 396 } 360 397 if ($flag & 0x14) { 398 my $class = $flag & 0x04 ? "$name M" : $name; 399 $class .= " $ifd" if $ifd; 361 400 my %bkg = ( 362 Class => $ flag & 0x04 ? "$name M" : $name,401 Class => $class, 363 402 Start => $start - $dataPos, 364 403 End => $start - $dataPos + $len, … … 375 414 $end = $start + $len; 376 415 # only load as much of the block as we are going to dump 377 my $size = ($len > $limit) ? $limit / 2 : $len; 416 # (read 32 more bytes than necessary just in case there 417 # is only one skipped line that we decide to print) 418 my $size = ($len > $limit + 32) ? $limit / 2 + 16 : $len; 378 419 if ($start >= $dataPos and $end <= $dataEnd) { 379 420 $buff = substr($$dataPt, $start-$dataPos, $size); … … 418 459 } 419 460 $self->DumpTable($start-$dataPos, \$buff, $msg, $name, 420 $flag, $len, $pos-$dataPos );461 $flag, $len, $pos-$dataPos, $ifd); 421 462 undef $buff; 422 463 $pos = $end if $pos < $end; … … 548 589 # Inputs: 0) HtmlDump object ref, 1) data position, 2) block pointer, 549 590 # 3) message, 4) object name, 5) flag, 6) full block length (actual 550 # data may be shorter), 7) data end position 551 sub DumpTable($$$;$$$$$ )591 # data may be shorter), 7) data end position, 8) IFD name 592 sub DumpTable($$$;$$$$$$) 552 593 { 553 my ($self, $pos, $blockPt, $msg, $name, $flag, $len, $endPos ) = @_;594 my ($self, $pos, $blockPt, $msg, $name, $flag, $len, $endPos, $ifd) = @_; 554 595 $len = length $$blockPt unless defined $len; 555 596 $endPos = 0 unless $endPos; … … 578 619 ++$id unless $dblRef; 579 620 } 580 $name = "<a name=$name class=$id>"; 621 my $class = $ifd ? "'$id $ifd'" : $id; 622 $name = "<a name=$name class=$class>"; 581 623 $msg and $msg = "$name$msg</a>"; 582 624 } else { … … 643 685 $dblRef = 0; 644 686 ++$id; 645 $name =~ s/class=\w\b/class=$id/; 687 my $class = $ifd ? "'$id $ifd'" : $id; 688 $name =~ s/class=\w\b/class=$class/; 646 689 $f0 = ''; 647 690 $self->Open('fgd', $f0, 0); … … 713 756 sub FinishTiffDump($$$) 714 757 { 715 my ($self, $e xifTool, $size) = @_;758 my ($self, $et, $size) = @_; 716 759 my ($tag, $key, $start, $blockInfo, $i); 717 760 … … 729 772 MPImageStart => 'MPImageLength', 730 773 IDCPreviewStart => 'IDCPreviewLength', 774 SamsungRawPointersOffset => 'SamsungRawPointersLength', 731 775 ); 732 776 733 777 # add TIFF data to html dump 734 778 foreach $tag (keys %offsetPair) { 735 my $info = $e xifTool->GetInfo($tag);779 my $info = $et->GetInfo($tag); 736 780 next unless %$info; 737 781 # Panasonic hack: StripOffsets is not valid for Panasonic RW2 files, 738 782 # and StripRowBytes is not valid for some RAW images 739 if ($tag eq 'StripOffsets' and $ exifTool->{TAG_INFO}{$tag}{PanasonicHack}) {783 if ($tag eq 'StripOffsets' and $$et{TAG_INFO}{$tag}{PanasonicHack}) { 740 784 # use RawDataOffset instead if available since it is valid in RW2 741 my $info2 = $e xifTool->GetInfo('RawDataOffset');785 my $info2 = $et->GetInfo('RawDataOffset'); 742 786 $info2 = $info unless %$info2; 743 787 my @keys = keys %$info2; 744 788 my $offset = $$info2{$keys[0]}; 745 my $raf = $$e xifTool{RAF};789 my $raf = $$et{RAF}; 746 790 # ignore StripByteCounts and assume raw data runs to the end of file 747 791 if (@keys == 1 and $offset =~ /^\d+$/ and $raf) { … … 759 803 foreach $key (keys %$info) { 760 804 my $name = Image::ExifTool::GetTagName($key); 761 my $grp1 = $e xifTool->GetGroup($key, 1);762 my $info2 = $e xifTool->GetInfo($offsetPair{$tag}, { Group1 => $grp1 });805 my $grp1 = $et->GetGroup($key, 1); 806 my $info2 = $et->GetInfo($offsetPair{$tag}, { Group1 => $grp1 }); 763 807 my $key2 = $offsetPair{$tag}; 764 808 $key2 .= $1 if $key =~ /( .*)/; # use same instance number as $tag … … 791 835 } 792 836 } 793 my $msg = $e xifTool->GetGroup($key, 1) . ':' . $tag;837 my $msg = $et->GetGroup($key, 1) . ':' . $tag; 794 838 $msg =~ s/(Offsets?|Start)$/ /; 795 839 if ($num > 1) { … … 815 859 } 816 860 my $diff = $size - $last; 817 if ($diff > 0 and ($last or $e xifTool->Options('Unknown'))) {861 if ($diff > 0 and ($last or $et->Options('Unknown'))) { 818 862 if ($diff > 1 or $size & 0x01) { 819 863 $self->Add($last, $diff, "[unknown data]", "Size: $diff bytes", 0x08); … … 874 918 =head1 AUTHOR 875 919 876 Copyright 2003-20 11, Phil Harvey (phil at owl.phy.queensu.ca)920 Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com) 877 921 878 922 This library is free software; you can redistribute it and/or modify it
Note:
See TracChangeset
for help on using the changeset viewer.