mirror of https://github.com/jeelabs/esp-link.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
2.2 KiB
114 lines
2.2 KiB
#!/usr/bin/perl
|
|
|
|
use strict;
|
|
use Data::Dumper;
|
|
|
|
my $dir = shift @ARGV;
|
|
my $out = shift @ARGV;
|
|
|
|
my $espfs = '';
|
|
|
|
my @structured = read_dir_structure($dir, "");
|
|
|
|
for my $file (@structured)
|
|
{
|
|
my $flags = 0;
|
|
my $name = $file;
|
|
my $compression = 0;
|
|
|
|
if( $name =~ /\.gz$/ )
|
|
{
|
|
$flags |= 2;
|
|
$name =~ s/\.gz$//;
|
|
}
|
|
|
|
my $head = '<!doctype html><html><head><title>esp-link</title><link rel=stylesheet href="/pure.css"><link rel=stylesheet href="/style.css"><meta name=viewport content="width=device-width, initial-scale=1"><script src="/ui.js"></script></head><body><div id=layout>';
|
|
|
|
open IF, "<", "$dir/$file" or die "Can't read file: $!";
|
|
my @fc = <IF>;
|
|
close(IF);
|
|
my $cnt = join("", @fc);
|
|
|
|
if( $name =~ /\.html$/ )
|
|
{
|
|
if( ! ( $flags & 2 ) )
|
|
{
|
|
$cnt = "$head$cnt";
|
|
}
|
|
else
|
|
{
|
|
printf("TODO: prepend headers to GZipped HTML content!\n");
|
|
}
|
|
}
|
|
|
|
$name .= chr(0);
|
|
$name .= chr(0) while( (length($name) & 3) != 0 );
|
|
|
|
my $size = length($cnt);
|
|
|
|
$espfs .= "ESfs";
|
|
$espfs .= chr($flags);
|
|
$espfs .= chr($compression);
|
|
$espfs .= chr( length($name) & 255 );
|
|
$espfs .= chr( length($name) / 256 );
|
|
$espfs .= chr( $size & 255 );
|
|
$espfs .= chr( ( $size / 0x100 ) & 255 );
|
|
$espfs .= chr( ( $size / 0x10000 ) & 255 );
|
|
$espfs .= chr( ( $size / 0x1000000 ) & 255 );
|
|
$espfs .= chr( $size & 255 );
|
|
$espfs .= chr( ( $size / 0x100 ) & 255 );
|
|
$espfs .= chr( ( $size / 0x10000 ) & 255 );
|
|
$espfs .= chr( ( $size / 0x1000000 ) & 255 );
|
|
|
|
$espfs .= $name;
|
|
|
|
|
|
|
|
$cnt .= chr(0) while( (length($cnt) & 3) != 0 );
|
|
$espfs .= $cnt;
|
|
}
|
|
|
|
$espfs .= "ESfs";
|
|
$espfs .= chr(1);
|
|
for(my $i=0; $i < 11; $i++)
|
|
{
|
|
$espfs .= chr(0);
|
|
}
|
|
|
|
open FH, ">", $out or die "Can't open file for write, $!";
|
|
print FH $espfs;
|
|
close(FH);
|
|
|
|
|
|
exit(0);
|
|
|
|
sub read_dir_structure
|
|
{
|
|
my ($dir, $base) = @_;
|
|
|
|
my @files;
|
|
|
|
opendir my $dh, $dir or die "Could not open '$dir' for reading: $!\n";
|
|
|
|
while (my $file = readdir $dh) {
|
|
if ($file eq '.' or $file eq '..') {
|
|
next;
|
|
}
|
|
|
|
my $path = "$dir/$file";
|
|
if( -d "$path" )
|
|
{
|
|
my @sd = read_dir_structure($path, "$base/$file");
|
|
push @files, @sd ;
|
|
}
|
|
else
|
|
{
|
|
push @files, "$base/$file";
|
|
}
|
|
}
|
|
|
|
close( $dh );
|
|
|
|
$_ =~ s/^\/// for(@files);
|
|
return @files;
|
|
}
|
|
|