From d6496d0ea297fadb7881503fb8153992fa30c299 Mon Sep 17 00:00:00 2001
From: Gerhard Gonter <ggonter@gmail.com>
Date: Sun, 8 Jun 2014 22:22:26 +0200
Subject: [PATCH] added "tom" script as a more general tool to work with Tomboy
 files

---
 perl/Gnome-Tomboy/lib/Tomboy/TOC.pm | 106 ++++++++++++++++++++
 perl/Gnome-Tomboy/tom               | 148 ++++++++++++++++++++++++++++
 2 files changed, 254 insertions(+)
 create mode 100644 perl/Gnome-Tomboy/lib/Tomboy/TOC.pm
 create mode 100755 perl/Gnome-Tomboy/tom

diff --git a/perl/Gnome-Tomboy/lib/Tomboy/TOC.pm b/perl/Gnome-Tomboy/lib/Tomboy/TOC.pm
new file mode 100644
index 0000000..617ed3b
--- /dev/null
+++ b/perl/Gnome-Tomboy/lib/Tomboy/TOC.pm
@@ -0,0 +1,106 @@
+#!/usr/bin/perl
+
+package Tomboy::TOC;
+
+use strict;
+
+use Tomboy::Directory;
+
+sub new
+{
+  my $class= shift;
+
+  my $self= {};
+  bless $self, $class;
+  $self->set (@_);
+
+  $self;
+}
+
+sub set
+{
+  my $self= shift;
+  my %par= @_;
+
+  foreach my $par (keys %par) { $self->{$par}= $par{$par}; }
+}
+
+sub find
+{
+  my $self= shift;
+  my $pattern= shift;
+
+print "find: pattern=[$pattern]\n";
+  my ($mode, $toc, $rows)= $self->load_toc();
+  my @res;
+  foreach my $row (@$rows)
+  {
+    next unless ($row->{'title'} =~ m#$pattern#i);
+    # print "row: ", main::Dumper ($row);
+    push (@res, $row);
+  }
+  @res;
+}
+
+sub scan_dir
+{
+  my $self= shift;
+
+print main::Dumper ($self);
+  my ($note_dir, $toc_file)= map { $self->{$_} } qw(note_dir toc_file);
+
+  $note_dir=~ s#/+$##;
+  my $tb_d= new Tomboy::Directory ();
+  # print "tb_d: ", Dumper ($tb_d);
+  print "scanning [$note_dir]\n";
+
+  my ($mode, $toc, $rows)= $self->load_toc();
+
+  my $toc_data= $tb_d->scan_dir ($note_dir, $rows, $mode);
+  # TODO: if verbose or so print "toc_data: ", Dumper ($toc_data);
+
+  $toc->{'data'}= $toc_data;
+  # TODO: optionally sort the returned values
+  $toc->sort ('uuid');
+  # print "toc: ", Dumper ($toc);
+  $toc->save_csv_file ('filename' => $toc_file, 'separator' => "\t", 'UTF8' => 1);
+}
+
+sub load_toc
+{
+  my $self= shift;
+
+  my $mode= 0;
+  my $toc;
+
+print "load_toc\n";
+  return (1, $toc, $toc->{'data'}) if (defined ($toc= $self->{'_toc'}));
+
+  my ($toc_file)= map { $self->{$_} } qw(toc_file);
+print "load_toc: toc_file=[$toc_file]\n";
+
+  my $toc= new Util::Simple_CSV ('UTF8' => 1, 'no_array' => 1, 'separator' => "\t", 'UTF8' => 1);
+  my $rows= [];
+  if (-f $toc_file)
+  {
+    print "loading $toc_file\n";
+    $toc->load_csv_file ($toc_file);
+
+    $mode= 1;
+    $rows= $toc->{'data'};
+    print "preparing quick scan, loaded [$toc_file]\n";
+    # print "toc: ", Dumper ($toc);
+    # print "rows: ", Dumper ($rows);
+    # exit;
+  }
+  else
+  {
+    $toc->define_columns (Tomboy::Directory::TB_attrs());
+  }
+  $self->{'_toc'}= $toc;
+
+  ($mode, $toc, $rows);
+}
+
+1;
+
diff --git a/perl/Gnome-Tomboy/tom b/perl/Gnome-Tomboy/tom
new file mode 100755
index 0000000..8a57ae0
--- /dev/null
+++ b/perl/Gnome-Tomboy/tom
@@ -0,0 +1,148 @@
+#!/usr/bin/perl
+
+=head1 NAME
+
+  tom
+
+=head1 DESCRIPTION
+
+do stuff with Tomboy files
+
+=head1 USAGE
+
+  tom <op-code> @options @parameters
+
+=head1 OPTIONS
+
+  ...
+
+=head1 OP-CODES
+
+=head2 show
+
+=head2 diff
+
+=cut
+
+use strict;
+
+use Data::Dumper;
+$Data::Dumper::Indent= 1;
+
+use Util::Simple_CSV;
+
+use Tomboy::Note::Simple;
+use Tomboy::Directory;
+use Tomboy::TOC;
+
+my $toc_file;
+my $note_dir= $ENV{'HOME'} . '/.local/share/tomboy';
+
+my $start_tb= 0;
+my $toc;
+my $op_code;
+my @PAR;
+
+while (my $arg= shift (@ARGV))
+{
+  if ($arg =~ /^-/)
+  {
+       if ($arg eq '-d') { $note_dir= shift (@ARGV); }
+    elsif ($arg eq '-t') { $toc_file= shift (@ARGV); }
+    elsif ($arg eq '-e') { $start_tb= 1; }
+    else
+    {
+      usage();
+    }
+  }
+  else
+  {
+    push (@PAR, $arg);
+  }
+}
+
+my $op_code= shift (@PAR) unless (defined ($op_code));
+
+
+   if ($op_code eq 'help') { usage(); }
+elsif ($op_code eq 'dump') { dump_note ($_) foreach (@PAR); }
+elsif ($op_code eq 'toc')  { tom_toc(); }
+elsif ($op_code eq 'find') { find_note(@PAR); }
+elsif ($op_code eq 'diff')
+{
+  my $f1= shift (@PAR);
+  my $n1= parse Tomboy::Note::Simple ($f1);
+
+  foreach my $f2 (@PAR)
+  {
+    my $n2= parse Tomboy::Note::Simple ($f2);
+    diff_note ($n1, $n2);
+  }
+}
+else
+{
+  usage();
+}
+
+exit (0);
+
+sub usage
+{
+  system ('perldoc', $0);
+  exit;
+}
+
+sub setup_toc
+{
+  $toc_file= join ('/', $note_dir, 'Tomboy-TOC.csv') unless (defined ($toc_file));
+  $toc= new Tomboy::TOC('note_dir' => $note_dir, 'toc_file' => $toc_file);
+  # print "toc: ", Dumper ($toc);
+}
+
+sub tom_toc
+{
+  setup_toc();
+  $toc->scan_dir();
+}
+
+sub find_note
+{
+  setup_toc();
+
+  my %uuid;
+  foreach my $pattern (@_)
+  {
+    my @res= $toc->find ($pattern);
+    foreach my $res (@res) { $uuid{$res->{'uuid'}}= $res; } # TODO: count hits
+  }
+
+  foreach my $uuid (keys %uuid)
+  {
+    if ($start_tb)
+    {
+      Tomboy::start_tb ('uuid', $uuid);
+    }
+    else
+    {
+      print Dumper ($uuid{$uuid});
+    }
+  }
+}
+
+sub dump_note
+{
+  my $note_fnm= shift;
+
+  my $n1= parse Tomboy::Note::Simple ($note_fnm);
+  $n1->update();
+  print "n1: ", Dumper ($n1);
+}
+
+sub diff_note
+{
+  my $n1= shift;
+  my $n2= shift;
+  print "n1: ", Dumper ($n1);
+  print "n2: ", Dumper ($n2);
+}
+
-- 
GitLab