This repository has been archived on 2019-11-02. You can view files and clone it, but cannot push or open issues or pull requests.
features-tree/README.org

198 lines
6.7 KiB
Org Mode
Raw Normal View History

2019-07-24 18:51:26 +00:00
[[file:https://cdn.rawgit.com/syl20bnr/spacemacs/442d025779da2f62fc86c2082703697714db6514/assets/spacemacs-badge.svg]]
* Features Tree
** Presentation
*Features Tree* is a small utility for linguists and especially conlangers
that allows them to declare trees with any number of children per node. I
especially made it with the option in mind to make feature contrastive trees
as presentented by Joseph Windsor in his talk during the /Language Creation
Conference 8/, with examples below.
[[./img/nyqy-vowel-feature-tree.png]]
[[./img/nyqy-basic-syntax.png]]
** Usage
*** TL;DR
In your *NIX terminal, clone the project, edit the example trees or create a
new one, and execute this:
#+BEGIN_SRC sh
cd features-tree
chicken-csc features-tree.scm # Compile the .scm file
./features-tree | dot -Tpng -o output.png # for PNG output
./features-tree | dot -Tsvg -o output.svg # for SVG output
#+END_SRC
*** More details
For now, the workflow is not the best, as you have to edit yourself the
source code and re-compile it each time you edit your own tree.
You will have to declare a Scheme list containing your tree, and your
typical node should be declared like so:
#+BEGIN_SRC scheme
("text" (child1) (child2) ...)
#+END_SRC
Each child is itself a tree that should follow the same type of declaration,
with as many child as you like per node I discourage you to have more than
nine children though, otherwise it might break the output. If a node does
not have any child, it should be declared like so:
#+BEGIN_SRC scheme
("text")
#+END_SRC
As an example, here is the tree that was used to declare the first example
image:
#+BEGIN_SRC scheme
(define vowels
'("[vowel]"
("[back]"
("[tense]"
("[high]" ("ü"))
("{high}" ("ö")))
("{tense}"
("[high]" ("u"))
("{high}" ("o"))))
("{back}"
("[tense]"
("[high]" ("y"))
("{high}" ("ë")))
("{tense}"
("[high]" ("i"))
("{high}" ("e"))))))
#+END_SRC
And here is the source code of the second example image:
#+BEGIN_SRC scheme
(define syntax-tree '("S"
("Obl")
("S'"
("NPerg"
("NP"))
("VP"
("NPdat"
("NP"))
("VP'"
("NPabs"
("NP"
("S")
("NP'"
("Adj")
("N"))))
("V'"
("Mood")
("Tense")
("V")
("Neg")))))))
#+END_SRC
Once youve declared the tree you want to get, modify the last line of the
source code =(tree-to-dot ...)= by replacing the default argument with the
2019-07-24 18:54:43 +00:00
name of your tree. For the first example, we would call
=(tree-to-dot vowels)=, while for the second we would call
=(tree-to-dot syntax-tree)=.
2019-07-24 18:51:26 +00:00
*Only one =(tree-to-dot)= call can be done at once, else what follows might
break!*
Once youve done that, compile your file! I personally use [[https://call-cc.org/][Chicken]] as my
Scheme compiler, but if you already have another, you can use your own. Just
replace my calls to =chicken-csc= by your own compilers command. Also, be
aware that I use =chicken-csc= as the command for che Chicken compiler, but
if you also use Chicken, you might have to call =csc= instead (this might
mean you have an older version than the one I use).
Now that youve compiled your file, you will have to execute it. If your
edits were alright, you should have some text output that looks like this,
except that it will be way more compact.
#+BEGIN_SRC dot
graph{
node[shape=plaintext];
graph[bgcolor="transparent"];
0[label="[vowel]"];
1[label="[back]"];
0 -- 1;
11[label="[tense]"];
1 -- 11;
111[label="[high]"];
11 -- 111;
1111[label="ü"];
111 -- 1111;
112[label="{high}"];
11 -- 112;
1121[label="ö"];
112 -- 1121;
12[label="{tense}"];
1 -- 12;
121[label="[high]"];
12 -- 121;
1211[label="u"];
121 -- 1211;
122[label="{high}"];
12 -- 122;
1221[label="o"];
122 -- 1221;
2[label="{back}"];
0 -- 2;
21[label="[tense]"];
2 -- 21;
211[label="[high]"];
21 -- 211;
2111[label="y"];
211 -- 2111;
212[label="{high}"];
21 -- 212;
2121[label="ë"];
212 -- 2121;
22[label="{tense}"];
2 -- 22;
221[label="[high]"];
22 -- 221;
2211[label="i"];
221 -- 2211;
222[label="{high}"];
22 -- 222;
2221[label="e"];
222 -- 2221;
}
#+END_SRC
If you get some errors, then you fucked up somewhere in your tree, probably
missing some parenthesis or you forgot to add the ='= before the first
parenthesis after the name of your tree. Go back to your source file and fix
that. Also, it might be easier to edit the file if you have a decent text
editor, Id recommend using something along the lines of VS Code, Atom or
Brackets, or even Emacs if you are not afraid by steep but extremely
rewarding learning curves.
Now, you need to have [[https://graphviz.org/][Graphviz]]s dot tool installed to generate images. In
your terminal, either redirect the output of your newly compiled program
like so:
#+BEGIN_SRC sh
./features-tree | dot -Tpng -o output.png
#+END_SRC
Or simply copy and paste the output in a separate file, then only run the
dot part of the above command. Youve got an ~output.png~ file containing
your tree now!
*** My elements are not aligned/centered, what do?
IDK, Ive tried to look up the answer, but there was no trivial way to do
it. If you found one, please tell me in a new issue, or even better, submit
a PR!
*** How can I do that on Windows?
IDK. Get a UNIX terminal (like the Linux subsystem, Putty(?) or Cygwin) and
apply what has been said before, maybe. If you have a better explanation,
you are more than welcome to either send it with a new issue or a pull
request.
* License
Check out the [[file:LICENSE.org]]. TL;DR: a GPLv3 licence gives you the right to
access, modify, and redistribute the source file at the condition it stays
under the GPLv3 license, and if you somehow fuck up big time because of it
(HOW?), you are responsible.