Ignore:
Timestamp:
2011-06-01T12:33:42+12:00 (13 years ago)
Author:
sjm84
Message:

Updating the ExifTool perl modules

File:
1 edited

Legend:

Unmodified
Added
Removed
  • main/trunk/greenstone2/perllib/cpan/Image/ExifTool/HTML.pm

    r16842 r24107  
    2121require Exporter;
    2222
    23 $VERSION = '1.03';
     23$VERSION = '1.11';
    2424@ISA = qw(Exporter);
    2525@EXPORT_OK = qw(EscapeHTML UnescapeHTML);
     26
     27sub SetHTMLCharset($$);
     28
     29# convert HTML charset (lower case) to ExifTool Charset name
     30my %htmlCharset = (
     31    macintosh     => 'MacRoman',
     32   'iso-8859-1'   => 'Latin',
     33   'utf-8'        => 'UTF8',
     34   'windows-1252' => 'Latin',
     35);
    2636
    2737# HTML 4 character entity references
     
    121131    NOTES => q{
    122132        Meta information extracted from the header of HTML and XHTML files.  This is
    123         a mix of information found in the C<META> elements and the C<TITLE> element.
     133        a mix of information found in the C<META> elements, C<XML> element, and the
     134        C<TITLE> element.
    124135    },
    125136    dc => {
     
    142153        Name => 'HTTP-equiv',
    143154        SubDirectory => { TagTable => 'Image::ExifTool::HTML::equiv' },
     155    },
     156    o => {
     157        Name => 'Office',
     158        SubDirectory => { TagTable => 'Image::ExifTool::HTML::Office' },
    144159    },
    145160    abstract        => { },
     
    157172    keywords        => { List => 1 },
    158173    mssmarttagspreventparsing => { Name => 'NoMSSmartTags' },
     174    originator      => { },
    159175    owner           => { },
    160176    progid          => { Name => 'ProgID' },
     
    195211%Image::ExifTool::HTML::ncc = (
    196212    GROUPS => { 1 => 'HTML-ncc', 2 => 'Document' },
    197     charset         => { },
     213    charset         => { Name => 'CharacterSet' }, # name changed to avoid conflict with -charset option
    198214    depth           => { },
    199215    files           => { },
     
    209225    prodnotes       => { Name => 'ProdNotes' },
    210226    producer        => { },
    211     produceddate    => { Name => 'ProducedDate', Groups => { 2 => 'Time' } }, # yyyy-mm-dd
     227    produceddate    => { Name => 'ProducedDate', Groups => { 2 => 'Time' } }, # YYYY-mm-dd
    212228    revision        => { },
    213229    revisiondate    => { Name => 'RevisionDate', Groups => { 2 => 'Time' } },
     
    220236    sourcetitle     => { Name => 'SourceTitle' },
    221237    tocitems        => { Name => 'TOCItems' },
    222     totaltime       => { Name => 'Duration' }, # hh:mm:ss
     238    totaltime       => { Name => 'Duration' }, # HH:MM:SS
    223239);
    224240
     
    245261   'content-script-type' => { Name => 'ContentScriptType' },
    246262   'content-style-type'  => { Name => 'ContentStyleType' },
    247    'content-type'        => { Name => 'ContentType' },
     263    # note: setting the HTMLCharset like this will miss any tags which come earlier
     264   'content-type'        => { Name => 'ContentType', RawConv => \&SetHTMLCharset },
    248265   'default-style'       => { Name => 'DefaultStyle' },
    249266    expires              => { },
     
    264281);
    265282
     283# MS Office namespace (ref PH)
     284%Image::ExifTool::HTML::Office = (
     285    GROUPS => { 1 => 'HTML-office', 2 => 'Document' },
     286    NOTES => 'Tags written by Microsoft Office applications.',
     287    Subject     => { },
     288    Author      => { Groups => { 2 => 'Author' } },
     289    Keywords    => { },
     290    Description => { },
     291    Template    => { },
     292    LastAuthor  => { Groups => { 2 => 'Author' } },
     293    Revision    => { Name => 'RevisionNumber' },
     294    TotalTime   => { Name => 'TotalEditTime',   PrintConv => 'ConvertTimeSpan($val, 60)' },
     295    Created     => {
     296        Name => 'CreateDate',
     297        Groups => { 2 => 'Time' },
     298        ValueConv => 'Image::ExifTool::XMP::ConvertXMPDate($val)',
     299        PrintConv => '$self->ConvertDateTime($val)',
     300    },
     301    LastSaved   => {
     302        Name => 'ModifyDate',
     303        Groups => { 2 => 'Time' },
     304        ValueConv => 'Image::ExifTool::XMP::ConvertXMPDate($val)',
     305        PrintConv => '$self->ConvertDateTime($val)',
     306    },
     307    LastSaved   => {
     308        Name => 'ModifyDate',
     309        Groups => { 2 => 'Time' },
     310        ValueConv => 'Image::ExifTool::XMP::ConvertXMPDate($val)',
     311        PrintConv => '$self->ConvertDateTime($val)',
     312    },
     313    LastPrinted => {
     314        Name => 'LastPrinted',
     315        Groups => { 2 => 'Time' },
     316        ValueConv => 'Image::ExifTool::XMP::ConvertXMPDate($val)',
     317        PrintConv => '$self->ConvertDateTime($val)',
     318    },
     319    Pages       => { },
     320    Words       => { },
     321    Characters  => { },
     322    Category    => { },
     323    Manager     => { },
     324    Company     => { },
     325    Lines       => { },
     326    Paragraphs  => { },
     327    CharactersWithSpaces => { },
     328    Version     => { Name => 'RevisionNumber' },
     329);
     330
     331#------------------------------------------------------------------------------
     332# Set HTMLCharset member based on content type
     333# Inputs: 0) content type string, 1) ExifTool ref
     334# Returns: original string
     335sub SetHTMLCharset($$)
     336{
     337    my ($val, $exifTool) = @_;
     338    $$exifTool{HTMLCharset} = $htmlCharset{lc $1} if $val =~ /charset=['"]?([-\w]+)/;
     339    return $val;
     340}
     341
    266342#------------------------------------------------------------------------------
    267343# Convert single UTF-8 character to HTML character reference
    268344# Inputs: 0) UTF-8 character sequence
    269 # Returns: HML character reference (ie. "&quot;");
     345# Returns: HTML character reference (ie. "&quot;");
    270346# Note: Must be called via EscapeHTML to load name lookup
    271347sub EscapeChar($)
    272348{
    273349    my $ch = shift;
    274     my ($val) = ($] >= 5.006001) ? unpack('U0U',$ch) : UnpackUTF8($ch);
     350    my $val;
     351    if ($] < 5.006001) {
     352        ($val) = Image::ExifTool::UnpackUTF8($ch);
     353    } else {
     354        # the meaning of "U0" is reversed as of Perl 5.10.0!
     355        ($val) = unpack($] < 5.010000 ? 'U0U' : 'C0U', $ch);
     356    }
    275357    return '?' unless defined $val;
    276358    return "&$entityName{$val};" if $entityName{$val};
     
    297379            delete $entityName{39};  # 'apos' is not valid HTML
    298380        }
    299         # supress warnings
     381        # suppress warnings
    300382        local $SIG{'__WARN__'} = sub { 1 };
    301383        # escape any non-ascii characters for HTML
     
    322404    my ($exifTool, $dirInfo) = @_;
    323405    my $raf = $$dirInfo{RAF};
    324     my $verbose = $exifTool->Options('Verbose');
    325     my ($buff, $err);
     406    my $buff;
    326407
    327408    # validate HTML or XHTML file
    328409    $raf->Read($buff, 256) or return 0;
    329     $buff =~ /^<(!DOCTYPE HTML|HTML|\?xml)/i or return 0;
    330     $buff =~ /<(!DOCTYPE )?HTML/i or return 0 if $1 eq '?xml';
     410    $buff =~ /^<(!DOCTYPE\s+HTML|HTML|\?xml)/i or return 0;
     411    $buff =~ /<(!DOCTYPE\s+)?HTML/i or return 0 if $1 eq '?xml';
    331412    $exifTool->SetFileType();
    332413
    333414    $raf->Seek(0,0) or $exifTool->Warn('Seek error'), return 1;
    334415
    335     my $oldsep = Image::ExifTool::PostScript::SetInputRecordSeparator($raf);
    336     $oldsep or $exifTool->Warn('Invalid HTML data'), return 1;
     416    local $/ = Image::ExifTool::PostScript::GetInputRecordSeparator($raf);
     417    $/ or $exifTool->Warn('Invalid HTML data'), return 1;
    337418
    338419    # extract header information
     
    348429        last if $buff =~ m{</head>}i;
    349430    }
     431    return 1 unless defined $doc;
    350432
    351433    # process all elements in header
     
    371453        }
    372454        my $table = $tagTablePtr;
    373         # parse HTML META element
    374455        if ($tag eq 'meta') {
     456            # parse HTML META element
    375457            undef $tag;
    376458            # tag name is in NAME or HTTP-EQUIV attribute
     
    396478                }
    397479            }
     480        } elsif ($tag eq 'xml') {
     481            $exifTool->VPrint(0, "Parsing XML\n");
     482            # parse XML tags (quick-and-dirty)
     483            my $xml = $val;
     484            while ($xml =~ /<([\w-]+):([\w-]+)(\s.*?)?>([^<]*?)<\/\1:\2>/g) {
     485                ($grp, $tag, $val) = ($1, $2, $4);
     486                my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $grp);
     487                next unless $tagInfo and $$tagInfo{SubDirectory};
     488                $table = GetTagTable($tagInfo->{SubDirectory}->{TagTable});
     489                unless ($$table{$tag}) {
     490                    my $name = ucfirst $tag;
     491                    $name =~ s/_x([0-9a-f]{4})_/chr(hex($1))/gie; # convert hex codes
     492                    $name =~ s/\s(.)/\U$1/g;     # capitalize all words in tag name
     493                    $name =~ tr/-_a-zA-Z0-9//dc; # remove illegal characters (also hex code wide chars)
     494                    Image::ExifTool::AddTagToTable($table, $tag, { Name => $name });
     495                    $exifTool->VPrint(0, "  [adding $tag '$name']\n");
     496                }
     497                $val = $exifTool->Decode($val, $$exifTool{HTMLCharset}) if $$exifTool{HTMLCharset};
     498                $exifTool->HandleTag($table, $tag, UnescapeXML($val));
     499            }
     500            next;
    398501        } else {
    399             # the only non-META element we process is TITLE
     502            # the only other element we process is TITLE
    400503            next unless $tag eq 'title';
    401504        }
     
    408511            $exifTool->VPrint(0, "  [adding $tag '$tagName']\n");
    409512        }
     513        # recode if necessary
     514        $val = $exifTool->Decode($val, $$exifTool{HTMLCharset}) if $$exifTool{HTMLCharset};
    410515        $val =~ s{\s*$/\s*}{ }sg;   # replace linefeeds and indenting spaces
    411516        $val = UnescapeHTML($val);  # unescape HTML character references
    412517        $exifTool->HandleTag($table, $tag, $val);
    413518    }
    414     $/ = $oldsep;   # restore original separator
    415519    return 1;
    416520}
     
    435539=head1 AUTHOR
    436540
    437 Copyright 2003-2007, Phil Harvey (phil at owl.phy.queensu.ca)
     541Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
    438542
    439543This library is free software; you can redistribute it and/or modify it
Note: See TracChangeset for help on using the changeset viewer.