Hiya, everyone!

I was thinking about contact management with BBDB
(http://sacha.free.net.ph/notebook/wiki/2005.05.06.php#1). Tags seemed
like a neat way to organize my contacts, and I thought I'd share the
results of an hour's fun hacking with you. If you add a tags: field to
your BBDB records and set this to a space-delimited list of tags
(case-sensitive for now), then you can use sacha/bbdb-search-tags to
display all records matching a set of tags.

You can also use sacha/planner-bbdb-insert-tags-alist to insert an
index of entries into a PlannerMode page. (Planner is this ultracool
personal information manager for Emacs that I'm so totally in love
with. http://www.emacswiki.org/cgi-bin/wiki/PlannerMode)

----------------------------------------------------------------
(defun sacha/bbdb-get-tags (record)
  "Return the tags for RECORD as a list."
  (let ((tags (bbdb-record-getprop record 'tags)))
    (when tags (split-string tags)))) 

(defun sacha/bbdb-test-tags (query tags)
  "Return non-nil if QUERY is a subset of TAGS."
  (let ((result t))
    (while (and result query)
      (unless (member (car query) tags)
        (setq result nil))
      (setq query (cdr query)))
    result))
  
(defun sacha/bbdb-search-tags-internal (records tags)
  "Return a list of RECORDS matching TAGS."
  (when (stringp tags) (setq tags (split-string tags)))
  (let (result)
    (while records
      (when (sacha/bbdb-test-tags tags
                                  (sacha/bbdb-get-tags (car records)))
        (setq result (cons (car records) result)))
      (setq records (cdr records)))
    result))

(defun sacha/bbdb-search-tags (tags)
  "Display all the records that match TAGS."
  (interactive "MTags: ")
  (bbdb-display-records (sacha/bbdb-search-tags-internal (bbdb-records) tags)))

(defun sacha/planner-bbdb-link (record)
  "Return a link to RECORD."
  (or (bbdb-record-getprop record 'plan)
      ;; From a BBDB entry with a plan page; use that. Yay!
      (concat "[[bbdb://"
              (emacs-wiki-replace-regexp-in-string
               " " "."
               (bbdb-record-name record))
              "][" (or (bbdb-record-getprop record 'nick) (bbdb-record-name 
record))
              "]]")))

(defun sacha/bbdb-get-tags-index ()
  "Return a list of tags and records."
  (let ((tags-alist '())
        (records (bbdb-records))
        tags
        entry
        list
        link)
    (while records
      (setq tags (sacha/bbdb-get-tags (car records)))
      (while tags
        (setq entry (assoc (car tags) tags-alist))
        (setq list (cdr entry))
        (add-to-list 'list (car records))
        (if entry
            (setcdr entry list)
          (add-to-list 'tags-alist (cons (car tags) list)))
        (setq tags (cdr tags)))
      (setq records (cdr records)))
    tags-alist))

(defun sacha/planner-bbdb-insert-tags-alist (&optional tag-alist)
  "Insert TAG-ALIST into the current buffer."
  (interactive)
  (unless tag-alist (setq tag-alist (sacha/bbdb-get-tags-index)))
  (insert (mapconcat
           (lambda (item)
             (concat (car item) " | "
                     (mapconcat
                      'sacha/planner-bbdb-link
                      (cdr item)
                      ",")))
           tag-alist
           "\n")))
----------------------------------------------------------------          

I'm going to refine this by making it easier to insert lists for a
single tag. I'm also going to tweak the linking function because I'm
starting to have problems disambiguating BBDB records. I'm thinking of
using a numeric ID field and then letting hippie-expansion and
functions convert familiar names into links containing the IDs.
Then I'm going to improve the cross-referencing with my wiki pages... =)

I might also just move all of this information into a set of wiki
pages (one page per person) but BBDB lets me prototype quickly. It's
so cool!

-- 
Sacha Chua <[EMAIL PROTECTED]> - open source geekette
http://sacha.free.net.ph/ - PGP Key ID: 0xE7FDF77C
interests: emacs, gnu/linux, personal information management, CS ed
sachac on irc.freenode.net#emacs . YM: sachachua83


-------------------------------------------------------
This SF.Net email is sponsored by: NEC IT Guy Games.
Get your fingers limbered up and give it your best shot. 4 great events, 4
opportunities to win big! Highest score wins.NEC IT Guy Games. Play to
win an NEC 61 plasma display. Visit http://www.necitguy.com/?r=20
_______________________________________________
bbdb-info@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bbdb-info
BBDB Home Page: http://bbdb.sourceforge.net/

Reply via email to