package HtmlMonolithWr; use strict; use warnings; require Exporter; our @ISA = qw(Exporter); our @EXPORT_OK = qw(); use Fcntl qw(O_RDONLY O_WRONLY O_CREAT O_TRUNC); use File::Spec::Functions qw(catfile); use MIME::Base64; use JsonWr; sub new { my $classname = shift; my $self = {}; bless($self, $classname); $self->_init(@_); return $self; } sub set_logger { my $self = shift; my ($logger) = @_; $self->{logger} = $logger; } sub output { my $self = shift; my $src = $self->{src}; my $dest = $self->{dest}; if ($self->{json_writer}) { $self->{json_writer}->done(); $self->{json_writer} = undef; print $dest ";\n \n"; print $dest $self->{following}; } while (<$src>) { my $line = $_; my ($preceeding, $file, $following, $replace, $before, $after, $mime); if ($line =~ m%^(.*)(.*)$%) { $preceeding = $1; $file = $2; $following = $3; $replace = $self->{scripts}->{$file}; $before = "\n"; } elsif ($line =~ m%^(.*)(.*)$%) { $preceeding = $1; $file = $2; $following = $3; $before = "\n"; } elsif ($line =~ m%^(.*)\n"; print $dest ' // @JSON_VAR '. $replace . "\n"; print $dest ' var ' . $replace . ' = '; $self->{json_writer} = new JsonWr($dest, 6, 2, 80); $self->{json_writer}->set_logger($self->{logger}); $self->{following} = $following; return $self->{json_writer}; } elsif ($file) { print $dest $preceeding; my $path = catfile($self->{search_dir}, $file); my $fh; die("Required file $path does not exist!\n") unless (-e $path); sysopen($fh, $path, O_RDONLY); print $dest $before; if ($mime) { print $dest "data:$mime;base64,"; my $raw = do{ local $/ = undef; <$fh>; }; my $encoded = encode_base64($raw, ""); print $dest $encoded; } else { while(<$fh>) { print $dest $_; } } close($fh); print $dest $after; print $dest $following; } else { print $dest $line; } } close($dest); close($src); } sub _init { my $self = shift; my ($search_dir, $primary_source, $dest_path, %scripts_to_replace) = @_; $self->{search_dir} = $search_dir; my $primary_path = catfile($search_dir, $primary_source); sysopen($self->{src}, $primary_path, O_RDONLY) or die("Failed to open HTML ". "template file \"$primary_path\" for reading\n"); sysopen($self->{dest}, $dest_path, O_WRONLY | O_CREAT | O_TRUNC) or die( "Failed to open HTML output file \"$dest_path\" for writing\n"); binmode($self->{dest}, ":utf8"); $self->{scripts} = \%scripts_to_replace; } 1;