added placeholders
This commit is contained in:
parent
7006df37a5
commit
9b3844c5a1
4 changed files with 55 additions and 16 deletions
56
generate.pl
56
generate.pl
|
@ -9,20 +9,41 @@ use LWP::UserAgent;
|
|||
use Storable qw(store retrieve);
|
||||
|
||||
## CONFIG
|
||||
my $icons_per_line = 5;
|
||||
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');
|
||||
|
||||
open my $header, '<', 'template/header.html'
|
||||
or die "couldn't open template/header.html";
|
||||
print $newtab join('', <$header>);
|
||||
close $header;
|
||||
|
||||
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>);
|
||||
|
@ -33,6 +54,12 @@ $ua->agent('Mozilla/5.0 (X11; Linux x86_64; rv:107.0) Gecko/20100101 Firefox/107
|
|||
|
||||
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;
|
||||
|
@ -41,6 +68,7 @@ foreach my $link(@{$links}) {
|
|||
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) {
|
||||
|
@ -48,33 +76,31 @@ foreach my $link(@{$links}) {
|
|||
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) {
|
||||
open my $line_separator, '<', 'template/link_line_separator.html'
|
||||
or die "couldn't open template/link_line_separator.html";
|
||||
print $newtab join('', <$line_separator>);
|
||||
close $line_separator;
|
||||
print_file($newtab, 'template/link_line_separator.html');
|
||||
$link_counter = 0;
|
||||
}
|
||||
}
|
||||
|
||||
open my $footer, '<', 'template/footer.html'
|
||||
or die "couldn't open template/footer.html";
|
||||
print $newtab join('', <$footer>);
|
||||
close $footer;
|
||||
|
||||
print_file($newtab, 'template/footer.html');
|
||||
close $newtab;
|
||||
|
|
|
@ -23,5 +23,6 @@
|
|||
"title": "YouTube",
|
||||
"url": "https://www.youtube.com/feed/subscriptions",
|
||||
"icon": "youtube"
|
||||
}
|
||||
},
|
||||
{ "placeholder": true }
|
||||
]
|
||||
|
|
|
@ -28,6 +28,10 @@
|
|||
li a:hover {
|
||||
color: #a6e3a1;
|
||||
}
|
||||
li a.placeholder:hover {
|
||||
color: #313244;
|
||||
cursor: default;
|
||||
}
|
||||
li a span {
|
||||
display: none;
|
||||
}
|
||||
|
|
8
template/link_placeholder.html
Normal file
8
template/link_placeholder.html
Normal file
|
@ -0,0 +1,8 @@
|
|||
<li>
|
||||
<a class='placeholder' href='#' title='' onclick='return false;'>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
|
||||
<path d="M2.5 0c-.166 0-.33.016-.487.048l.194.98A1.51 1.51 0 0 1 2.5 1h.458V0H2.5zm2.292 0h-.917v1h.917V0zm1.833 0h-.917v1h.917V0zm1.833 0h-.916v1h.916V0zm1.834 0h-.917v1h.917V0zm1.833 0h-.917v1h.917V0zM13.5 0h-.458v1h.458c.1 0 .199.01.293.029l.194-.981A2.51 2.51 0 0 0 13.5 0zm2.079 1.11a2.511 2.511 0 0 0-.69-.689l-.556.831c.164.11.305.251.415.415l.83-.556zM1.11.421a2.511 2.511 0 0 0-.689.69l.831.556c.11-.164.251-.305.415-.415L1.11.422zM16 2.5c0-.166-.016-.33-.048-.487l-.98.194c.018.094.028.192.028.293v.458h1V2.5zM.048 2.013A2.51 2.51 0 0 0 0 2.5v.458h1V2.5c0-.1.01-.199.029-.293l-.981-.194zM0 3.875v.917h1v-.917H0zm16 .917v-.917h-1v.917h1zM0 5.708v.917h1v-.917H0zm16 .917v-.917h-1v.917h1zM0 7.542v.916h1v-.916H0zm15 .916h1v-.916h-1v.916zM0 9.375v.917h1v-.917H0zm16 .917v-.917h-1v.917h1zm-16 .916v.917h1v-.917H0zm16 .917v-.917h-1v.917h1zm-16 .917v.458c0 .166.016.33.048.487l.98-.194A1.51 1.51 0 0 1 1 13.5v-.458H0zm16 .458v-.458h-1v.458c0 .1-.01.199-.029.293l.981.194c.032-.158.048-.32.048-.487zM.421 14.89c.183.272.417.506.69.689l.556-.831a1.51 1.51 0 0 1-.415-.415l-.83.556zm14.469.689c.272-.183.506-.417.689-.69l-.831-.556c-.11.164-.251.305-.415.415l.556.83zm-12.877.373c.158.032.32.048.487.048h.458v-1H2.5c-.1 0-.199-.01-.293-.029l-.194.981zM13.5 16c.166 0 .33-.016.487-.048l-.194-.98A1.51 1.51 0 0 1 13.5 15h-.458v1h.458zm-9.625 0h.917v-1h-.917v1zm1.833 0h.917v-1h-.917v1zm1.834-1v1h.916v-1h-.916zm1.833 1h.917v-1h-.917v1zm1.833 0h.917v-1h-.917v1zM8.5 4.5a.5.5 0 0 0-1 0v3h-3a.5.5 0 0 0 0 1h3v3a.5.5 0 0 0 1 0v-3h3a.5.5 0 0 0 0-1h-3v-3z"/>
|
||||
</svg>
|
||||
<span></span>
|
||||
</a>
|
||||
</li>
|
Reference in a new issue