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