107 lines
3.2 KiB
Perl
Executable File
107 lines
3.2 KiB
Perl
Executable File
#!/usr/bin/env perl
|
|
|
|
use utf8;
|
|
use strict;
|
|
use warnings;
|
|
use open qw(:std :utf8);
|
|
use JSON qw(decode_json);
|
|
use LWP::UserAgent;
|
|
use Storable qw(store retrieve);
|
|
|
|
## CONFIG
|
|
my $icons_per_line = 6; # how many icons to put per line
|
|
my $debug_output = 0; # set to 1 to enable debug output
|
|
## END CONFIG
|
|
#
|
|
sub print_file($$) {
|
|
my $destination_handle = shift;
|
|
my $file_name = shift;
|
|
debug("Writing $file_name to file.");
|
|
open my $file, '<', $file_name
|
|
or die "couldn't open file $file_name";
|
|
my $content = join('', <$file>);
|
|
close $file;
|
|
print $destination_handle $content;
|
|
}
|
|
|
|
sub debug($) {
|
|
my $msg = shift;
|
|
if($debug_output) {
|
|
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
|
|
my $timestamp = sprintf("%04d-%02d-%02d %02d:%02d:%02d",
|
|
$year + 1900, $mon + 1, $mday, $hour, $min, $sec);
|
|
print "[$timestamp] $msg\n";
|
|
}
|
|
}
|
|
|
|
debug('Reading links.json config file.');
|
|
open my $links_file, '<', 'links.json';
|
|
my $links = decode_json(join('', <$links_file>));
|
|
close $links_file;
|
|
|
|
debug('Opening newtab.html for writing.');
|
|
open my $newtab, '>', 'newtab.html';
|
|
print_file($newtab, 'template/header.html');
|
|
|
|
debug('Reading template/link.html.');
|
|
open my $link_template_file, '<', 'template/link.html'
|
|
or die "couldn't open template/link.html";
|
|
my $link_template = join('', <$link_template_file>);
|
|
close $link_template_file;
|
|
|
|
my $ua = LWP::UserAgent->new();
|
|
$ua->agent('Mozilla/5.0 (X11; Linux x86_64; rv:107.0) Gecko/20100101 Firefox/107.0');
|
|
|
|
my $link_counter = 0;
|
|
foreach my $link(@{$links}) {
|
|
if($link->{placeholder}) {
|
|
print_file($newtab, 'template/link_placeholder.html');
|
|
next;
|
|
}
|
|
|
|
debug("Processing link $link->{title}.");
|
|
my $link_html = $link_template;
|
|
$link_html =~ s/\{\{title\}\}/$link->{title}/g;
|
|
$link_html =~ s/\{\{url\}\}/$link->{url}/g;
|
|
|
|
if(! -d 'icon-cache') {
|
|
mkdir 'icon-cache';
|
|
}
|
|
if (! -e "icon-cache/$link->{icon}") {
|
|
debug("Cache for icon $link->{icon} not found, fetching from web.");
|
|
my $icon_url = "https://icons.getbootstrap.com/icons/$link->{icon}/";
|
|
my $resp = $ua->get($icon_url);
|
|
if(!$resp->is_success) {
|
|
my $status = $resp->status_line;
|
|
die "couldn't fetch icon $icon_url\n$status";
|
|
}
|
|
my $icon_full_html = $resp->decoded_content;
|
|
debug("Icon $link->{icon} page fetched. Parsing html.");
|
|
if($icon_full_html =~ /<div class="icon-demo [^>]+>[^<]*<svg [^>]+viewBox="([^"]+)"[^>]*>(.*?)<\/svg/s) {
|
|
my $icon = {viewBox => $1, paths => $2};
|
|
debug("Saving $link->{icon} icon to cache.");
|
|
store($icon, "icon-cache/$link->{icon}")
|
|
or die "couldn't save icon-cache/$link->{icon}";
|
|
} else {
|
|
die "couldn't parse icon $link->{icon}";
|
|
}
|
|
} else {
|
|
debug("Icon $link->{icon} found in cache.");
|
|
}
|
|
my $icon = retrieve("icon-cache/$link->{icon}");
|
|
|
|
$link_html =~ s/\{\{viewBox\}\}/$icon->{viewBox}/g;
|
|
$link_html =~ s/\{\{icon\}\}/$icon->{paths}/g;
|
|
|
|
debug("Printing $link->{title} link to newtab.html.");
|
|
print $newtab $link_html;
|
|
|
|
if(++$link_counter == $icons_per_line) {
|
|
print_file($newtab, 'template/link_line_separator.html');
|
|
$link_counter = 0;
|
|
}
|
|
}
|
|
|
|
print_file($newtab, 'template/footer.html');
|
|
close $newtab;
|