This repository has been archived on 2020-12-27. You can view files and clone it, but cannot push or open issues or pull requests.
conlang-layer/README.org

7.1 KiB
Raw Blame History

Conlanging layer

https://cdn.rawgit.com/syl20bnr/spacemacs/442d025779da2f62fc86c2082703697714db6514/assets/spacemacs-badge.svg

/phundrak/conlang-layer/media/commit/6a182b2085d0a4c34b961c6a411203d033b72ee0/img/conlang_flag.png

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:

/phundrak/conlang-layer/media/commit/6a182b2085d0a4c34b961c6a411203d033b72ee0/img/vowels-example.png

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, lets simply describe the layer.el file.

  (configuration-layer/declare-layer 'conlanging)

And thats 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, its 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 nodes 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. Lets 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)))))