Hi Sacha,

I am trying to understand this better and I have a query. How is this functionality different from the mail-alias field. Even that can have multiple tags and you can list all entries containing a certain tag.

regards
--
mitra

Sacha Chua wrote:

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!






------------------------------------------------------- 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