emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Karl Voit <devnull@Karl-Voit.at>
To: emacs-orgmode@gnu.org
Subject: Re: Process diagrams with dot and some glue using Org-mode
Date: Thu, 27 Jun 2013 08:47:14 +0200	[thread overview]
Message-ID: <2013-06-27T08-37-17@devnull.Karl-Voit.at> (raw)
In-Reply-To: 4c174089656ce0b08177f464325c4bf9@mail.rickster.com

* Rick Frankel <rick@rickster.com> wrote:
> On 2013-06-26 13:03, Karl Voit wrote:
>> * Rick Frankel <rick@rickster.com> wrote:
>> 
>> However, the header information seems to get lost. This requires
>> hard-coded column content which is a minor drawback of this method.
>
> Just use `:colnames no':

I love Org-mode :-)

> Regardless, here's a hack which does what you want. Note to things:
> 		- it executes the dot code directly and uses the :file
> 	          header argument for output, because you need the
> 		  colnames of the graph table but not of the node table.

Got it.

> 		- It requires you to specify the range on the node table

Sorry, I did not understand this since I could not locate any range
specification below except that one for foobar-node-table in the
header. Is this the thing you mentioned? If so, I do not consider
this as an issue at all because [2:-1] is right for any number of
rows.

> 	#+HEADER: :var nodes=foobar-node-table[2:-1]
> 	#+HEADER: :var graph=foobar-graph-table
> 	#+BEGIN_SRC emacs-lisp :results file :file "./t.png"
> 	  (org-babel-execute:dot
> 	   (concat
> 		"  digraph {"
> 		(mapconcat
> 		 (lambda (x)
> 		   (format "%s [label=\"%s\" shape=%s fillcolor=%s]"
> 				   (car x) (nth 1 x)
> 				   (if (string= "" (nth 2 x)) "box" (nth 2 x))
> 				   (if (string= "" (nth 3 x)) "none" (nth 3 x)))) nodes "\n")
> 		"\n"
> 		(let* ((to-nodes (car graph)) (len (length to-nodes)))
> 		  (mapconcat
> 		   (lambda (x)
> 			 (let ((name (car x)))
> 			   (mapconcat
> 				'identity
> 				(loop with result = '()
> 					  for i from 1 to len
> 					  do
> 					  (when (> (length (nth i x)) 0)
> 						(add-to-list 'result
> 									 (format "%s -> %s [label=\"%s\"]\n"
> 											 name
> 											 (nth i to-nodes)
> 											 (substring (nth i x) 0 -1))))
> 					  finally
> 					  return result) "\n"))) (cdr graph) ""))
> 		"}") params)
> 	#+END_SRC

I'll have to take a look at this.

> And here's a simplier version which uses a graph table in the
> following format:
>
> 	#+name: foobar-graph
> 	| from       | to         | label |
> 	|------------+------------+-------|
> 	| S_start    | S_fill     |       |
> 	| S_fill     | S_send     |       |
> 	| S_send     | S_complete |       |
> 	| S_complete | S_fill     | N     |
> 	| S_complete | S_do       | Y     |
> 	| S_do       | S_end      |       |
>
> 	#+HEADER: :var nodes=foobar-node-table graph=foobar-graph
> 	#+BEGIN_SRC emacs-lisp :file ./t2.png :colnames yes
> 	  (org-babel-execute:dot
> 	   (concat
> 		"digraph {\n"
> 		(mapconcat
> 		 (lambda (x)
> 		   (format "%s [label=\"%s\" shape=%s fillcolor=%s]"
> 				   (car x) (nth 1 x)
> 				   (if (string= "" (nth 2 x)) "box" (nth 2 x))
> 				   (if (string= "" (nth 3 x)) "none" (nth 3 x)))) nodes "\n")
> 		"\n"
> 		(mapconcat
> 		 (lambda (x)
> 		   (format "%s -> %s [taillabel=\"%s\"]"
> 				   (car x) (nth 1 x) (nth 2 x))) graph "\n")
> 		"}\n") params)
> 	#+END_SRC

Wow, this looks great to me!

Most likely, I will stick to this simpler version. Thank you very
much for your effort! And thank you for the ELISP example I will try
to fully understand.

I love this community :-)

Where should I place this method? Org-tutorials? [1] probably? New
section in [2]?

  1. http://orgmode.org/worg/org-tutorials/#sec-3-2
  2. http://orgmode.org/worg/org-tutorials/#sec-4
-- 
mail|git|SVN|photos|postings|SMS|phonecalls|RSS|CSV|XML to Org-mode:
       > get Memacs from https://github.com/novoid/Memacs <

https://github.com/novoid/extract_pdf_annotations_to_orgmode + more on github

  reply	other threads:[~2013-06-27  6:47 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-06-26 15:23 Process diagrams with dot and some glue using Org-mode Karl Voit
2013-06-26 15:41 ` Karl Voit
2013-06-26 15:44 ` Rick Frankel
2013-06-26 17:03   ` Karl Voit
2013-06-26 18:25     ` Rick Frankel
2013-06-27  6:47       ` Karl Voit [this message]
2013-06-27 13:06         ` Rick Frankel
2013-06-27 13:56           ` Bastien
2013-06-28  9:20       ` Karl Voit
2013-06-28 15:34         ` Rick Frankel
2013-07-01 17:44           ` Karl Voit
2013-06-26 16:40 ` Eric S Fraga
2013-06-27  6:56   ` Karl Voit
2013-06-26 16:54 ` Thorsten Jolitz
2013-06-27  6:36   ` Karl Voit
2013-07-03 19:18 ` Karl Voit
2013-07-03 20:57   ` Nick Dokos
2013-07-05 16:15   ` Eric S Fraga

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=2013-06-27T08-37-17@devnull.Karl-Voit.at \
    --to=devnull@karl-voit.at \
    --cc=emacs-orgmode@gnu.org \
    --cc=news1142@Karl-Voit.at \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).