#!/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; # } # }