added function to create graphviz trees
This commit is contained in:
		
							parent
							
								
									8e6a12d91d
								
							
						
					
					
						commit
						e2339aeb1a
					
				
							
								
								
									
										53
									
								
								funcs.el
									
									
									
									
									
								
							
							
						
						
									
										53
									
								
								funcs.el
									
									
									
									
									
								
							| @ -9,6 +9,59 @@ | ||||
| ;; | ||||
| ;;; License: GPLv3 | ||||
| 
 | ||||
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||
|                                         ;                 Tree                ; | ||||
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||
| (defun conlanging//declare-node (node-text node-generation) | ||||
|   "Declares a node in the graphviz source code. The node’s identifier will be | ||||
| ~node-generation~, and it will bear the label ~node-text~." | ||||
|   (concat (number-to-string node-generation) | ||||
|           "[label=\"" | ||||
|           node-text | ||||
|           "\"];")) | ||||
| 
 | ||||
| (defun conlanging//make-link (previous-node current-node) | ||||
|   "This creates a link in the graphviz source code between the two nodes | ||||
| bearing ~previous-node~ and ~current-node~ respectively as their node | ||||
| identifier." | ||||
|   (concat (number-to-string previous-node) " -- " | ||||
|           (number-to-string current-node) ";")) | ||||
| 
 | ||||
| (defun conlanging//tree-to-dot-helper (tree current-generation previous-generation) | ||||
|   "Helper to ~tree-to-dot~ that translates an Elisp tree with any number of | ||||
| children per node to a corresponding graphviz file that can be executed from | ||||
| dot. | ||||
| Arguments: | ||||
| - tree :: tree-to-convert | ||||
| - current-generation :: Generation number, incremented when changing from a node | ||||
|      to another node from the same generation, multiplied by 10 when going from | ||||
|      a node to one of its children. | ||||
| - previous-generation :: generation number from previous named node" | ||||
|   (cond | ||||
|    ((null tree) "") | ||||
|    ((atom (car tree)) ;; '("text" () () ()) | ||||
|     (concat (conlanging//declare-node (car tree) current-generation) | ||||
|             (conlanging//make-link previous-generation current-generation) | ||||
|             (conlanging//tree-to-dot-helper (cdr tree) | ||||
|                                 (+ 1 (* 10 current-generation)) | ||||
|                                 current-generation))) | ||||
|    ((listp (car tree)) ;; '(() () ()) | ||||
|     (concat (conlanging//tree-to-dot-helper (car tree) ;; child of current node | ||||
|                                 current-generation | ||||
|                                 previous-generation) | ||||
|             (conlanging//tree-to-dot-helper (cdr tree) | ||||
|                                 (+ 1 current-generation) | ||||
|                                 previous-generation))))) | ||||
| 
 | ||||
| (defun conlanging/tree-to-dot (tree) | ||||
|   "Returns a graphviz’s dot compatible string representing an Elisp tree" | ||||
|   (if (null tree) "" | ||||
|     (concat | ||||
|      "graph{node[shape=plaintext];graph[bgcolor=\"transparent\"];" | ||||
|      (conlanging//declare-node (car tree) 0) | ||||
|      (conlanging//tree-to-dot-helper (cdr tree) 1 0) | ||||
|      "}"))) | ||||
| 
 | ||||
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||
|                                         ;                Common               ; | ||||
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||
|  | ||||
		Reference in New Issue
	
	Block a user