Dotfiles, utilities, and other apparatus.
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.
 
 
 
 
 
 

200 lines
3.8 KiB

#!/usr/bin/env perl
=pod
=head1 NAME
notes-tag-summary - show a summary of a given tag
=head1 SYNOPSIS
Currently this is vimwiki-dependent.
# Show tag info for warelogging
notes-tag-summary warelogging
=head1 AUTHOR
Brennen Bearnes
=cut
use warnings;
use strict;
use 5.10.0;
use Carp;
use Cwd;
use Data::Dumper;
use DBI;
use File::Basename;
use File::Spec;
use Getopt::Long;
use Pod::Usage;
use File::HomeDir;
use Term::ANSIColor;
# Handle options, including help generated from the POD above.
my $debug = 0;
my $use_color = 0;
my $from_filename = 0;
GetOptions(
'color' => \$use_color,
'file' => \$from_filename,
'debug' => \$debug,
'help' => sub { pod2usage(0) },
) or pod2usage(2);
my $tag = $ARGV[0];
unless ($tag) {
pod2usage(2);
die;
}
# Pull a tag name out of a path to a wiki page:
if ($from_filename) {
my ($name, $path, $suffix) = fileparse($tag, '.wiki');
$tag = $name;
}
my $HOME = File::HomeDir->my_home;
{
my $dbfile = $HOME . "/notes/metadata.db";
my $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile", "", "");
sub query_onerow {
return query(@_)->fetchrow_hashref();
}
sub query {
my ($query, @bind) = @_;
my $sth = $dbh->prepare($query);
$sth->execute(@bind);
return $sth;
}
}
sub on_p1k3 {
state %lines = map { $_ => 1 } file_get_contents_arr(
File::Spec->catfile($HOME, 'notes', 'p1k3-index')
);
my ($tag) = @_;
return exists $lines{$tag};
}
sub on_pinboard {
state %lines = map { $_ => 1 } file_get_contents_arr(
File::Spec->catfile($HOME, 'notes', 'pinboard-tag-index')
);
my ($tag) = @_;
return exists $lines{$tag};
}
sub file_get_contents_arr {
my ($file) = @_;
open my $fh, '<', $file
or croak "Couldn't open $file: $!\n";
chomp(my @lines = <$fh>);
close $fh or croak "Couldn't close $file: $!";
return @lines;
}
sub colorize {
my ($color) = @_;
return color(@_) if $use_color;
return '';
}
# Total count of pages that link to this tag:
my $link_count = query_onerow(
'SELECT COUNT(*) AS COUNT FROM links WHERE target = ?',
$tag
)->{COUNT};
# Count of pages that link to this tag and are log entries:
my $log_count = query_onerow(
'SELECT COUNT(*) AS COUNT FROM links WHERE target = ? AND page LIKE "log/%"',
$tag
)->{COUNT};
# Head of log for this tag:
my @log_lines;
my $logs_sth = query(
'SELECT l.page, p.title
FROM links l JOIN pages p ON l.page = p.page
WHERE
l.page LIKE "log/%"
AND l.target = ?
LIMIT 10;',
$tag
);
while (my $row = $logs_sth->fetchrow_hashref()) {
push @log_lines, $row->{title};
}
# List of pages to display for this tag:
my @display_pages;
my $pages_sth = query(
'SELECT page FROM links
WHERE target = ?
AND page NOT LIKE "log/%"
AND PAGE NOT LIKE "diary/%"',
$tag
);
while (my $row = $pages_sth->fetchrow_hashref()) {
push @display_pages, $row->{page};
}
# XXX: This doesn't quite work, but digikam-extract could be generalized a bit
# with a little work.
# Photos
# my @photos = `digikam-extract --tag "$tag"`;
# Actual display here:
my $bg = colorize('bold green');
my $reset = colorize('reset');
say "$bg$tag$reset: $link_count links ($log_count log entries)";
print "\n";
say "${bg}pages$reset: " . join ' ', @display_pages;
print "\n";
if (on_pinboard($tag)) {
say "${bg}on pinboard${reset}";
print "\n";
}
if (on_p1k3($tag)) {
say "${bg}topic on p1k3${reset}";
print "\n";
}
my $wikifile = File::Spec->catfile($HOME, 'notes', 'vimwiki', "$tag.wiki");
if (-f $wikifile) {
print `head $wikifile`;
} else {
say "No wiki file found for $tag";
}
print "\n";
if ($log_count > 0) {
say "${bg}log:${reset}";
foreach my $line (@log_lines) {
say " - $line";
}
}
# XXX: put photos here
# print "\n";
# if (@photos > 0) {
# say "${bg}photos:${reset}";
# foreach my $photo (@photos) {
# say $photo;
# }
# }