Bivio::UI::HTML::Widget::LocalFileAggregator
# Copyright (c) 2014 Bivio Software, Inc. All Rights Reserved. # $Id$ package Bivio::UI::HTML::Widget::LocalFileAggregator; use strict; use Bivio::Base 'UI.Widget'; b_use('UI.ViewLanguageAUTOLOAD'); my($_VALUE_ATTRS) = [qw(base_values widget_values view_values)]; sub NEW_ARGS { return [map("?$_", @$_VALUE_ATTRS)]; } sub initialize { my($self, $source) = @_; _do( $self, sub { my($value, $name, $attr) = @_; $self->initialize_value($name, $value, $source); return; }, ); return shift->SUPER::initialize(@_); } sub render { my($self, $source, $buffer) = @_; my($type); my($rendered) = $source->req->get_if_exists_else_put($self->package_name, {}); #TODO: Verify all types in an instance are the same my($final_render); _do( $self, sub { my($value, $name, $attr) = @_; my($b); $self->unsafe_render_value($name, $value, $source, \$b); return unless $b; $type = _type($b); $final_render = $type if $attr eq $_VALUE_ATTRS->[0]; push(@{($rendered->{$type} ||= {})->{$attr} ||= []}, $b) if $b; return; }, ); _render($self, delete($rendered->{$final_render}), $source, $buffer) if $final_render; return; } sub _do { my($self, $op, $rendered) = @_; foreach my $attr (@$_VALUE_ATTRS) { my($i) = 0; foreach my $v (@{ ($rendered && $rendered->{$attr} || $self->unsafe_get($attr)) || [], }) { $op->($v, $attr . $i++, $attr); } } return; } sub _is_inline { my($value) = @_; return $value =~ m{[\n<]}; } sub _render { my($self, $rendered, $source, $buffer) = @_; my($seen) = {}; _do( $self, sub { my($value, $name, $attr) = @_; return unless $value; _render_value($self, $value, $source, $buffer) unless $seen->{$value}++; return; }, $rendered, ); return; } sub _render_value { my($self, $value, $source, $buffer) = @_; if (_is_inline($value)) { $$buffer .= $value; } else { HTMLWidget_LocalFileLink($value)->initialize_and_render($source, $buffer) } return; } sub _type { my($value) = @_; return _is_inline($value) ? $value =~ m{type=.*?(text/(?:javascript|css))}s ? $1 : b_die($value, ': must be text/javascript or text/css') : HTMLWidget_LocalFileLink()->to_html_type_attr($value); } 1;