Hi!

I want to share a solution that allows lbdb[1] queries return
Org-contacts[2] email addresses. The solution is done by Russell
Adams who encouraged me to post it here because he did only mention
it in [3] but did not post the results yet. I took Russells solution
and modified it to be of more general use and added a few comments
in the Perl script.

If you are interested in my personal approach for managing contact
information with Org-contacts, please refer to [4].

The set up requires three things:

  1. configuration file .lbdbrc (usually in ~ or ~/.lbdb/)

     - add «m_orgcontact» to the variable «METHODS»
     - add «$HOME/.lbdb/modules» to the variable «MODULES_PATH»

     ,----[ example lines ]
     | METHODS="m_orgcontact m_muttalias m_inmail"
     | MODULES_PATH="/usr/lib/lbdb $HOME/.lbdb/modules"
     `----

  2. ~/.lbdb/modules/m_orgcontact (just a small interface to connect
     lbdb to the script)

     ,----[ m_orgcontact ]
     | #!/bin/sh
     |
     | m_orgcontact_query()
     | {
     |     ${HOME}/.lbdb/modules/orgcontact.pl $1
     | }
     | #end
     `----

  3. ~/.lbdb/modules/orgcontact.pl (the actual script that queries)

     See below footnotes for the whole script.

  1. http://www.spinnaker.de/lbdb/
  2. http://julien.danjou.info/org-contacts.html
  3. http://lists.gnu.org/archive/html/emacs-orgmode/2011-02/msg00459.html
  4. http://article.gmane.org/gmane.emacs.orgmode/47478/

---- ~/.lbdb/modules/orgcontact.pl --------------------------
#!/usr/bin/env perl

use strict;
use warnings;

## FIXXME: error handling when no argument is given (though unlikely)

$/="\n*";  ## split between Org-mode headings (i.e. newline followed by 
asterisk)

## the path to your Org-contacts file:
my $orgmodefile=$ENV{"HOME"} . "/share/all/org-mode/contacts.org";

open(MYFILE,$orgmodefile);
my @rawcontacts = <MYFILE>;  ## read in whole contact file, heading by heading
close(MYFILE);

$/="\n";   ## reset split string to newlines (only)

foreach (@rawcontacts) {
  if ( $_ =~ m/$ARGV[0]/i ){  ## ARGV[0] is the query string

    my $name;

    foreach (split("\n",$_)) {  ## go through it line by line

      # The first line consists of the contact name (followed by tag(s))
      unless (defined $name) {
        $name = $_;
        $name =~ s/^\*+\s(.*)\s+:\S+:.*$/$1/g;  ## extract string between 
asterisks and tags
      }

      # if (m/^\s+:.*EMAIL.*:/i) {
      if (m/^:EMAIL:/i) {  ## for each property «:EMAIL:» print out result
        my $email = $_;
        $email =~ s/^:\S+:\s+(\S+)/$1/g;
        $email =~ s/\s*$//;

        printf("%s\t%s\t(Org)\n", $email, $name);

      }

    }

  }

}

-------------------------------------------------------------

-- 
Karl Voit


Reply via email to