#!/usr/bin/env perl
|
|
|
|
=pod
|
|
|
|
=head1 NAME
|
|
|
|
notes-pages - work with pages within my notes
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
Currently this is vimwiki-dependent.
|
|
|
|
# List pages
|
|
notes pages
|
|
|
|
# All pages with a date of July 18th, 2022:
|
|
notes pages --date 2022-07-18
|
|
|
|
# Set output format:
|
|
notes pages --format [vimwiki, tsv, location, full, name]
|
|
|
|
# All pages with a date:
|
|
notes pages --with-date
|
|
|
|
# All pages without a date:
|
|
notes pages --no-date
|
|
|
|
# Print this help:
|
|
notes pages --help
|
|
|
|
# Debug queries
|
|
notes pages --debug
|
|
|
|
=head1 AUTHOR
|
|
|
|
Brennen Bearnes
|
|
|
|
=cut
|
|
|
|
use warnings;
|
|
use strict;
|
|
use 5.10.0;
|
|
|
|
use Cwd;
|
|
use Data::Dumper;
|
|
use DBI;
|
|
use File::Basename;
|
|
use File::Spec;
|
|
use Getopt::Long;
|
|
use Pod::Usage;
|
|
use SQL::Abstract;
|
|
use Sys::Hostname;
|
|
|
|
# Display formats:
|
|
my %FORMATS = (
|
|
vimwiki => sub {
|
|
my ($data) = @_;
|
|
my $timestamp = '';
|
|
if (defined $data->{timestamp}) {
|
|
$timestamp = $data->{timestamp} . " ";
|
|
}
|
|
|
|
return ' - '
|
|
. $timestamp
|
|
. '[[/' . $data->{page} . '|'
|
|
. $data->{title}
|
|
. "]]\n";
|
|
},
|
|
|
|
tsv => sub {
|
|
my ($data) = @_;
|
|
my $timestamp = '(null)';
|
|
if (defined $data->{timestamp}) {
|
|
$timestamp = $data->{timestamp};
|
|
}
|
|
return (join "\t", ($timestamp, $data->{page}, $data->{title})) . "\n";
|
|
},
|
|
|
|
# vim location list
|
|
location => sub {
|
|
my ($data) = @_;
|
|
|
|
my $result = "$ENV{HOME}/notes/vimwiki/$data->{page}.wiki";
|
|
if ($data->{title}) {
|
|
$result .= ":1:$data->{title}";
|
|
} else {
|
|
$result .= print ":1:$data->{page}"
|
|
}
|
|
|
|
return $result . "\n";
|
|
},
|
|
|
|
# Bare names of wiki pages (no extension):
|
|
name => sub {
|
|
my ($data) = @_;
|
|
return $data->{page} . "\n";
|
|
},
|
|
|
|
# Fulltext of vimwiki pages:
|
|
full => sub {
|
|
my ($data) = @_;
|
|
my $result = '';
|
|
my $pagepath = "$ENV{HOME}/notes/vimwiki/$data->{page}.wiki";
|
|
$result .= "%% $pagepath {{{\n\n";
|
|
$result .= file_get_contents($pagepath);
|
|
$result .= "\n%% }}}\n\n";
|
|
},
|
|
);
|
|
|
|
# Handle options, including help generated from the POD above.
|
|
my $debug = 0;
|
|
my $with_date = 0;
|
|
my $date;
|
|
my $file;
|
|
my $no_date;
|
|
my $format = 'location';
|
|
GetOptions(
|
|
'debug' => \$debug,
|
|
'date=s' => \$date,
|
|
'format=s' => \$format,
|
|
'with-date' => \$with_date,
|
|
'no-date' => \$no_date,
|
|
'help' => sub { pod2usage(0) },
|
|
) or pod2usage(2);
|
|
|
|
my %where = ();
|
|
|
|
# Get only links from pages that have a datetime:
|
|
if ($with_date) {
|
|
# NOT NULL:
|
|
$where{'pages.datetime'} = { '!=', undef };
|
|
}
|
|
|
|
# Get only links from pages that lack a datetime:
|
|
if ($no_date) {
|
|
# IS NULL:
|
|
$where{'pages.datetime'} = undef;
|
|
}
|
|
|
|
# Get only links from pages that have a given specific datetime:
|
|
if ($date) {
|
|
$where{'date'} = $date;
|
|
}
|
|
|
|
my $dbfile = $ENV{HOME} . "/notes/metadata.db";
|
|
my $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile", "", "");
|
|
|
|
my $sql = SQL::Abstract->new;
|
|
my ($query, @bind) = $sql->select(
|
|
'pages',
|
|
# timestamp will be null if datetime is
|
|
"*,
|
|
DATETIME(datetime, 'localtime') AS timestamp,
|
|
DATE(datetime, 'localtime') AS date",
|
|
\%where,
|
|
{-asc => [ 'date', 'page' ] }
|
|
);
|
|
|
|
if ($debug) {
|
|
say STDERR $query;
|
|
say STDERR Dumper(%where);
|
|
}
|
|
|
|
my $sth = $dbh->prepare($query);
|
|
$sth->execute(@bind);
|
|
|
|
while (my $data = $sth->fetchrow_hashref())
|
|
{
|
|
if ($debug) {
|
|
print STDERR Dumper($data);
|
|
}
|
|
|
|
print $FORMATS{$format}->($data);
|
|
}
|
|
|
|
$sth->execute();
|
|
|
|
# PHP-style file-content grabbing:
|
|
sub file_get_contents {
|
|
my ($file) = @_;
|
|
|
|
open my $fh, '<', $file
|
|
or die "Couldn't open $file: $!\n";
|
|
|
|
my $contents;
|
|
{
|
|
# line separator:
|
|
local $/ = undef;
|
|
$contents = <$fh>;
|
|
}
|
|
|
|
close $fh or die "Couldn't close $file: $!";
|
|
return $contents;
|
|
}
|
|
|
|
1;
|