7.1 KiB
Conlanging layer
Description
This layer adds features for conlanging.
Features
- Generate graphviz trees based on Elisp trees
- Replace some text by its runic equivalent (supports the Mattér and Eittlandic languages)
- Adds phonetics to Proto-Ñyqy text
- Provides custom shortcuts
Graphviz trees
The conlanging
layer provides one public function called
conlanging/tree-to-dot
. It accepts as its sole argument a list of strings
or lists, such as the following:
(setq-local vowels
'("[vowel]"
("[back]"
("[tense]"
("[high]" ("ü"))
("{high}" ("ö")))
("{tense}"
("[high]" ("u"))
("{high}" ("o"))))
("{back}"
("[tense]"
("[high]" ("y"))
("{high}" ("ë")))
("{tense}"
("[high]" ("i"))
("{high}" ("e"))))))
When passed in the above mentioned function, and the result itself is passed through graphviz, we get the following result:
This example tree is only a binary tree, but a single node can have up to ten children. See some examples in the Ñyqy source file.
It is planned to merge this project into this layer in order to facilitate the creation of trees based on distinctive features.
Install
To install this layer, either clone this project in your ~/.emacs.d/private/
folder, or symlink it from there to your actual clone location. Then, add
conlanging
in your dotspacemacs file in the
dotspacemacs-configuration-layers
list:
(setq-default dotspacemacs-configuration-layers '(conlanging))
You can then reload your configuration file with SPC f e R
, or restart Emacs
with SPC q r
or SPC q R
.
Licence
All the code included in this repository is licensed under the GPLv3 license. See /phundrak/conlang-layer/src/commit/6a182b2085d0a4c34b961c6a411203d033b72ee0/LICENCE.
Documentation
The following is the documentation of the source code of the conlanging
layer. It is divided in two main parts, describing the two main files of the
layer: funcs.el
and keybindings.el
. First of all, let’s simply describe
the layer.el
file.
(configuration-layer/declare-layer 'conlanging)
And that’s enough for the layer.el
file! Now, onto the funcs.el
file.
Functionalities
Here will be detailed the functionalities of the conlanging
layer. It can
be divided in several parts.
Graphviz trees generation
As described above, it is possible to create graphviz trees from Elisp trees
made from lists. This feature is coded in two functions: one that creates
the tree itself, and one that generates nodes. The first one that generates
nodes is declared as a private function (actually, it’s just prefixed with
conlanging//
following Spacemacs’ naming convention).
(defun conlanging//declare-node (t-node-text t-node-generation)
"Declares a node in the graphviz source code. The node’s identifier will be
`t-node-generation', and it will bear the label `t-node-text'."
(format "%d[label=\"%s\"];" t-node-generation
t-node-text))
This can result in a graphviz node declared like so:
231[label="This is a label"];
All nodes generated by the function have a unique identifier in the form of a number, and its content is only defined by its label. By default, the tree created from the graphviz code gives a tree from top to bottom with the label not surrounded by anything. Let’s declare our whole function:
(defun conlanging/tree-to-dot (t-tree &optional t-current-generation t-previous-generation)
"Translates an Elisp t-tree with any number of children per node
to a corresponding graphviz file that can be executed from dot.
Arguments:
- `t-tree': t-tree to convert
- `t-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.
- `t-previous-generation': generation number from previous named
node"
(cond
((null t-previous-generation) ;; first call
(concat "graph{graph[dpi=300];node[shape=plaintext];graph[bgcolor=\"transparent\"];"
(conlanging//declare-node (car t-tree) 0)
(conlanging/tree-to-dot (cdr t-tree) 1 0)
"}"))
((null t-tree) "") ;; last call in this branch
((atom (car t-tree)) ;; '("text" () () ()) manage the label
(concat (conlanging//declare-node (car t-tree)
t-current-generation)
;; make link
(concat (number-to-string t-previous-generation) " -- "
(number-to-string t-current-generation) ";")
(conlanging/tree-to-dot (cdr t-tree)
(+ 1
(* 10 t-current-generation))
t-current-generation)))
((listp (car t-tree)) ;; '(() () ()) manage the branches
(concat (conlanging/tree-to-dot (car t-tree) ;; child of current node
t-current-generation
t-previous-generation)
(conlanging/tree-to-dot (cdr t-tree)
(+ 1 t-current-generation)
t-previous-generation)))))