# # content items used for media items. In reality this is just # used as a placeholder for metadata. package HTML::WebMake::MediaContent; use HTML::WebMake::Content; use Carp; use strict; use locale; use vars qw{ @ISA $MIN_FMT_CACHE_LEN }; @ISA = qw(HTML::WebMake::Content); $MIN_FMT_CACHE_LEN = 1024; ########################################################################### sub new { my $class = shift; $class = ref($class) || $class; my ($main, $name, $attrs) = @_; my $self = $class->SUPER::new ($name, $main->{ignore_for_dependencies}, $attrs, '', undef); bless ($self, $class); # do some references now to avoid doing them later, minor speedup my $util = $main->{util}; my $metadata = $main->{metadata}; my $attrval; # see if we have 'map=false' as an attribute. default to 0 $self->{no_map} = 1; $attrval = $attrs->{'map'}; $attrval ||= $metadata->get_attrdefault ('map'); if (defined $attrval) { if ($util->parse_boolean ($attrval)) { $self->{no_map} = 0; } delete $self->{'map'}; # in case it was set as an attr } $self->{keep_as_is} = 1; $metadata->add_metadefaults ($self); $main->add_new_content_to_map ($name, $self); $self; } sub dbg { HTML::WebMake::Main::dbg (@_); } sub dbg2 { HTML::WebMake::Main::dbg2 (@_); } sub vrb { HTML::WebMake::Main::vrb (@_); } # ------------------------------------------------------------------------- sub as_string { my ($self) = @_; "\$\{".$self->{name}."\}"; } # ------------------------------------------------------------------------- sub is_generated_content { 0; } # ------------------------------------------------------------------------- sub expand { my ($self) = @_; return $self->{main}->curly_subst ($self->{name}, $self->{name}); } sub expand_no_ref { my ($self) = @_; return $self->{main}->fileless_subst ($self->{name}, '${'.$self->{name}.'}'); } # ------------------------------------------------------------------------- sub get_metadata { my ($self, $key) = @_; if (!defined $self->{cached_metas}) { $self->{cached_metas} = { }; } my $val = $self->{cached_metas}->{$key}; my $main = $self->{main}; if (!defined $val) { $val = $main->quiet_curly_meta_subst ($HTML::WebMake::Main::SUBST_META, $self->{name}.".".$key); $val ||= $main->{metadata}->get_default_value ($key); $val = $main->{metadata}->convert_to_type ($key, $val); $self->{cached_metas}->{$key} = $val; } return $val; } # ------------------------------------------------------------------------- sub create_extra_metas_if_needed { my ($self) = @_; if (!defined $self->{extra_metas}) { $self->{extra_metas} = { }; } } # ------------------------------------------------------------------------- sub load_metadata { my ($self) = @_; if (!defined ($self->{parsed_metadata_tags})) { $self->add_extra_metas ($self->{name}); $self->infer_implicit_metas(); $self->{parsed_metadata_tags} = 1; } } # ------------------------------------------------------------------------- sub parse_metadata_tags { return; } # ------------------------------------------------------------------------- sub infer_implicit_metas { my ($self) = @_; if (defined $self->{main}->{metadatas}->{"this.title"} && defined $self->{main}->{metadatas}->{$self->{name}.".title"}) { return; # no need to infer it, it's already defined } # TODO? read titles from GIF comments etc? my $val = $self->{name}; $val =~ s,^.*[/\\],,g; $val =~ s,\.(?:gif|jp[eg]+|mp[eg3]+|xpm|bmp|tif+|mov|ra|ram|png|mng)$,,ig; $val =~ s/_/ /gs; $self->add_inferred_metadata ("title", $val); } # ------------------------------------------------------------------------- sub add_inferred_metadata { my ($self, $name, $val) = @_; my $attrs = { }; $val =~ s/<[^>]+>//g; # trim wayward HTML tags $val =~ s/^\s+//; $val =~ s/\s+$//; dbg ("inferring $name metadata from image: \"$val\""); $self->{main}->add_metadata ($self->{name}, $name, $val, $attrs, 0); } # ------------------------------------------------------------------------- sub add_extra_metas { my ($self, $from) = @_; # also add our own extra metadata from nav links, tags # etc. my ($metaname, $val); while (($metaname, $val) = each %{$self->{extra_metas}}) { $self->{main}->add_metadata ($from, $metaname, $val, { }, 1); } } # ------------------------------------------------------------------------- sub get_score { my ($self) = @_; return $self->get_metadata ("score"); } sub get_title { my ($self) = @_; return $self->get_metadata ("title"); } # ------------------------------------------------------------------------- sub get_modtime { my ($self) = @_; return $self->{main}->cached_get_modtime ($self->get_filename()); } # ------------------------------------------------------------------------- sub get_text_as { my ($self, $format) = @_; # TODO -- return an tag for images etc.? return ''; } # ------------------------------------------------------------------------- sub load_text_if_needed { return; } sub unload_text { return; } sub is_from_datasource { return 0; } sub touch_last_used { return; } # ------------------------------------------------------------------------- sub add_ref_from_url { my ($self, $filename) = @_; return if ($filename =~ /^\(/); # (eval), (dep_ignore) etc. if (!defined $self->{reffed_in_url}) { $self->{reffed_in_url} = $filename; } } sub get_url { my ($self) = @_; my $url = $self->{reffed_in_url}; if (defined $url) { return $url; } $url = $self->{main}->getcache()->get_metadata ($self->{name}.".url"); if (defined $url) { $self->{reffed_in_url} = $url; return $url; } $url = $self->{main}->make_deferred_url ($self->{name}); return $url; } # ------------------------------------------------------------------------- sub add_navigation_metadata { my ($self) = @_; return if ($self->{no_map} || $self->is_generated_content()); return if ($self->{added_nav_metas_flag}); $self->{added_nav_metas_flag} = 1; $self->create_extra_metas_if_needed(); if (defined ($self->{up_content})) { $self->{extra_metas}->{'nav_up'} = $self->{up_content}->get_name(); } if (defined ($self->{next_content})) { $self->{extra_metas}->{'nav_next'} = $self->{next_content}->get_name(); } if (defined ($self->{prev_content})) { $self->{extra_metas}->{'nav_prev'} = $self->{prev_content}->get_name(); } } sub invalidate_cached_nav_metadata { my ($self) = @_; $self->{added_nav_metas_flag} = 0; } # ------------------------------------------------------------------------- sub is_only_usable_from_deferred_refs { 0; } # ------------------------------------------------------------------------- 1;