* preamble #+TITLE: businessprocess.org #+AUTHOR: Eric S Fraga #+EMAIL: e.fraga@ucl.ac.uk #+DATE: 2010-11-15 Mon #+DESCRIPTION: cf. #+KEYWORDS: #+LANGUAGE: en #+OPTIONS: H:3 num:t toc:t \n:nil @:t ::t |:t ^:t -:t f:t *:t <:t #+OPTIONS: TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc #+INFOJS_OPT: view:nil toc:nil ltoc:t mouse:underline buttons:0 path:http://orgmode.org/org-info.js #+EXPORT_SELECT_TAGS: export #+EXPORT_EXCLUDE_TAGS: noexport #+LINK_UP: #+LINK_HOME: #+XSLT: * The problem Look at [[gnus:nnmaildir%2BUCL:lists#87bp5sacnf.fsf@bunting.net.au][this email]]. * the table #+tblname: processtable | Step | Description | Next Steps | | |-------------+-------------------------------------------------------------------------+-------------+-------| | Begin | Begin the process | Choice1 | | | Choice1 | Decide if we are big or small. | Big | Small | | Big | If we are big then do big things | End | | | Small | If we are small then figure out if we are really small or possibly big. | ReallySmall | Big | | ReallySmall | Yes we are really small | End | | | End | The end. | | | |-------------+-------------------------------------------------------------------------+-------------+-------| * the elisp code #+source: esf/business-process #+begin_src emacs-lisp :results value raw :exports results (defun esf/generate-business-process-graph (table name file) (let ((entries (nthcdr 2 table)) (output (format "digraph %s {" name)) ) (message "Initial: %s\n" table) (message "Entries: %s\n" entries) ;; we need to do two iterations through the table, one to define ;; the nodes and then one to connect them. (setq savedentries entries) ;for second iteration (while entries (let ((entry (first entries))) (if (listp entry) (let ((step (first entry)) (description (nth 1 entry)) ) (setq output (format "%s\n %s [label=\"%s\"];" output step description)) ) ) (setq entries (cdr entries)) ) ) (setq entries savedentries) (while entries (let ((entry (first entries))) (if (listp entry) (let ((from (first entry)) (nextsteps (cdr (cdr entry))) ) (message "Nextsteps: %s\n" nextsteps) (while nextsteps (let ((to (first nextsteps))) (if to (if (not (string= to "")) (setq output (format "%s\n %s -> %s;" output from to)))) (setq nextsteps (cdr nextsteps)) ) ) ) ) (setq entries (cdr entries)) ) ) ; end while entries left (format "#+begin_src dot :results file :file %s :exports results %s } ,#+end_src\n" file output) ) ) (esf/generate-business-process-graph table name file) #+end_src * the graph #+call: esf/business-process(table=processtable, file="business.pdf", name="process") #+results: esf/business-process(table=processtable, file="business.pdf", name="process") #+begin_src dot :results file :file business.pdf :exports results digraph process { Begin [label="Begin the process"]; Choice1 [label="Decide if we are big or small."]; Big [label="If we are big then do big things"]; Small [label="If we are small then figure out if we are really small or possibly big."]; ReallySmall [label="Yes we are really small"]; End [label="The end."]; Begin -> Choice1; Choice1 -> Big; Choice1 -> Small; Big -> End; Small -> ReallySmall; Small -> Big; ReallySmall -> End; } #+end_src