Projects page updated.
This commit is contained in:
@@ -39,6 +39,13 @@ If you take something from metanohi that is not under a public-domain-like
|
||||
license, you are required to attribute Niels Serup and metanohi. When doing
|
||||
that, write something like "Niels Serup, [[http://metanohi.name/][metanohi.name]]".
|
||||
|
||||
A few pages, like [[/projects/][this one]], have a lot of Python code for in-page evaluation
|
||||
and execution. This might not be the most secure thing to allow, but since only
|
||||
one person can change it, it is deemed safe enough. Any such nontrivial code is
|
||||
licensed under the same license as [[/projects/mege/][mege]], i.e. AGPLv3+, unless otherwise
|
||||
noted. This might seem like overkill in some situations, but with only one
|
||||
license in use, simplicity is achieved.
|
||||
|
||||
** Source
|
||||
|
||||
If you wish to use [[/projects/mege/][mege]] for a website, you may wish to use metanohi as a
|
||||
@@ -59,6 +66,11 @@ Get the subsites:
|
||||
metanohi was created in 2009 as a spinoff of earlier projects with equally
|
||||
undefined purposes.
|
||||
|
||||
*Note:* While most of the content from the old metanohi has been ported to this
|
||||
improved version, the modification times have not been saved. This is why old
|
||||
projects from 2009 and 2010 appear to have been created in July or
|
||||
August, 2011.
|
||||
|
||||
*** "Why the name?"
|
||||
|
||||
There are several reasons:
|
||||
|
||||
@@ -2,12 +2,189 @@
|
||||
#&summary
|
||||
Where all the prominent projects are listed.
|
||||
#&
|
||||
#+license: bysa
|
||||
#+license: cc0
|
||||
#&fullpage
|
||||
#&toc
|
||||
|
||||
* Projects
|
||||
|
||||
<boxes go here>
|
||||
These are my projects, new and old.
|
||||
|
||||
#++exec
|
||||
#+BEGIN_SRC python3
|
||||
top_projs = (
|
||||
'desurveil',
|
||||
'aeltei',
|
||||
('roptoligs', 'roptoligs', 'RPG project with planned modules and games',
|
||||
'http://roptoligs.metanohi.name/'),
|
||||
'sadbipws',
|
||||
('suum', 'SUUM', 'Webcomic drawn in the art style of <em>banal naivism</em>',
|
||||
'http://suum.metanohi.name/'),
|
||||
'alart',
|
||||
'forbi',
|
||||
'shadowloss',
|
||||
'alp',
|
||||
'electruth',
|
||||
'kvigall',
|
||||
'naghni',
|
||||
'forestquest',
|
||||
'dililatum',
|
||||
'noncrawl',
|
||||
'enigma',
|
||||
'wordwork',
|
||||
'simplechat',
|
||||
('nohix', 'nohiX', 'Small web experiments, some of them useful', 'http://nohix.metanohi.name/'),
|
||||
'movact',
|
||||
'wontofor',
|
||||
'totxt',
|
||||
('natur', "Niels' Nature", 'Watch Niels as he spouts nonsense about nature', 'http://nature.metanohi.name/'),
|
||||
('films', 'nohifilms', "Niels' films", 'http://films.metanohi.name/'),
|
||||
)
|
||||
|
||||
other_projs = (
|
||||
'nanonote',
|
||||
('pdfsplit', 'A small Python script to split PDF files on a page-basis',
|
||||
'http://projects.metanohi.name/misc/pdfsplit.tar.gz'),
|
||||
('poemgen', 'A poem generator using Identi.ca blog posts as its source',
|
||||
'http://projects.metanohi.name/poemgen/'),
|
||||
'dotbox',
|
||||
'vit',
|
||||
'qvikconfig',
|
||||
'htmlentitiesdecode',
|
||||
('gadon', 'Creates scary cirle animations reminiscent of heartbeats',
|
||||
'http://projects.metanohi.name/misc/gadon.tgz'),
|
||||
('colchs', 'A simple GTK color chooser',
|
||||
'http://projects.metanohi.name/misc/colchs.tgz'),
|
||||
('wikiaq', 'A quiz system using Wikipedia articles',
|
||||
'http://projects.metanohi.name/misc/wikiaq-0.1.tar.gz'),
|
||||
('BiBBoB 0.1.1', "A simple sound wave generator (older versions: \
|
||||
<a href='http://projects.metanohi.name/misc/bibbob-0.1.tar.gz'>BiBBoB 0.1</a>)",
|
||||
'http://projects.metanohi.name/misc/bibbob-0.1.1.tar.gz'),
|
||||
('data2wav', 'Converts all data to sound (and back again)',
|
||||
'http://projects.metanohi.name/misc/data2wav.tgz'),
|
||||
('pitivi-smil', "A workaround to make PiTiVi XPTV files get rendered using \
|
||||
Kino. No support for PiTiVi's more advanced features.",
|
||||
'http://projects.metanohi.name/misc/pitivi-smil.tgz'),
|
||||
('googolplex', 'A program that attempts to print one googolplex. \
|
||||
If saved to a file, this requires 1 googol + 1 bytes.',
|
||||
'http://projects.metanohi.name/misc/googolplex.c'),
|
||||
('Japanese web apps', 'Javascript/CSS experiments with a theme',
|
||||
'http://projects.metanohi.name/jap/'),
|
||||
('data2png', 'Save data as a png file, and restore the data from the png file.',
|
||||
'http://projects.metanohi.name/misc/data2png.tar.gz'),
|
||||
('stanimate', 'A bash script to aid in the creation of stop motion films.',
|
||||
'http://projects.metanohi.name/misc/stanimate.gz'),
|
||||
('mssrnm (mass rename)', 'A bash script to rename a bunch of files into files \
|
||||
"001.jpg", "002.jpg", "003.jpg", etc.',
|
||||
'http://projects.metanohi.name/misc/mmsrnm.gz'),
|
||||
)
|
||||
|
||||
old_top_projs = (
|
||||
('words', 'words', 'Words and sentences. Not a blog.', 'http://words.metanohi.name/'),
|
||||
('pictures', 'Pictures', 'Pictures uploaded by me', 'http://pictures.metanohi.name/'),
|
||||
('eonaton', 'Eon Aton', 'An underdeveloped RPG-style JS system and a story', 'http://projects.metanohi.name/eonaton/'),
|
||||
'zita',
|
||||
'cln',
|
||||
('algo', 'Algo', 'A JavaScript window manager', 'http://projects.metanohi.name/algo/'),
|
||||
'an5w',
|
||||
('canvas', 'Experimenting with canvas', 'Old HTML canvas element experiments', 'http://projects.metanohi.name/canvas/'),
|
||||
('bsq', 'Brainy Stickman Quiz', 'Sidescroller/quiz based on the HTML canvas element', 'http://projects.metanohi.name/bsq/'),
|
||||
('snake', 'JavaScript Snake', 'Arrow keys to move, PageUp and PageDown to adjust speed.', 'http://projects.metanohi.name/snake/'),
|
||||
('gt3000', 'GT 3000', 'Retro JS mini racing game.', 'http://projects.metanohi.name/gt3000/'),
|
||||
('sq', "Satan's Quest", 'Retro RPG-style JS minigame. You are Gabruel.', 'http://projects.metanohi.name/sq/'),
|
||||
('evolution', 'Evolution', 'Notice the intelligence.', 'http://projects.metanohi.name/evolution/'),
|
||||
)
|
||||
|
||||
other_old_projs = (
|
||||
'bito',
|
||||
'nalgh',
|
||||
('Graphical web experiments',
|
||||
"Some of them'll work, while some of them might crash your browser.",
|
||||
'http://projects.metanohi.name/x/'),
|
||||
('cheatbibtex', '''\
|
||||
Provides an alternative way of dealing with BiBTeX bibliographies. Use BiBLaTeX
|
||||
instead of cheatbibtex (cheatbibtex isn't that great, while BiBLaTeX is quite
|
||||
the LaTeX package).''', 'http://projects.metanohi.name/misc/cheatbibtex-0.1.tar.gz'),
|
||||
('dsktp', 'A JS wm like Algo',
|
||||
'http://projects.metanohi.name/dsktp/'),
|
||||
('webCLI', 'A CLI lookalike in JavaScript with XML',
|
||||
'http://projects.metanohi.name/webcli/'),
|
||||
('lapyrint', 'A stupid maze solver. Includes example labyrinths.',
|
||||
'http://projects.metanohi.name/misc/lapyrint.tar.gz'),
|
||||
('problist', "Probalistic list generator (isn't as intelligent as it sounds).",
|
||||
'http://projects.metanohi.name/misc/problist.tar.gz'),
|
||||
('The Life of a Snowman', "Life can be cruel towards snowmen. This is proof.",
|
||||
'http://projects.metanohi.name/snowman/'),
|
||||
('Katten Pedro (Pedro the Cat)', "A comic I drew during a vacation in Mallorca.",
|
||||
'http://projects.metanohi.name/pedro/'),
|
||||
('Misc.', 'Very old stuff.',
|
||||
'http://projects.metanohi.name/misc/'),
|
||||
)
|
||||
|
||||
#################################
|
||||
|
||||
boxtemplate = '''\
|
||||
<li>
|
||||
<a href='{url}' style='background-image: url(img/{name}.png);'>
|
||||
{title}
|
||||
</a>
|
||||
<dfn>{description}</dfn>
|
||||
</li>
|
||||
'''
|
||||
|
||||
listtemplate = '''\
|
||||
<dt><a href='{url}'>{title}</a></dt>
|
||||
<dd>{description}</dd>
|
||||
'''
|
||||
|
||||
def getparts(name, no_name=False):
|
||||
if isinstance(name, tuple):
|
||||
if no_name:
|
||||
title, desc, url = name
|
||||
else:
|
||||
name, title, desc, url = name
|
||||
else:
|
||||
orgpath = misc.get_org_path(os.path.join(page.pathdir, name))
|
||||
url = './{name}'.format(name=name)
|
||||
if orgpath.endswith('index.org'):
|
||||
url += '/'
|
||||
a = htmlgen.org_to_abstract(orgpath, isfile=True, only_metadata=True)
|
||||
title, desc = a.title, a.summary
|
||||
if no_name:
|
||||
return title, desc, url
|
||||
else:
|
||||
return name, title, desc, url
|
||||
|
||||
def boxprojs(projs):
|
||||
print("<ul class='projectboxes'>")
|
||||
for name in projs:
|
||||
name, title, desc, url = getparts(name)
|
||||
print(boxtemplate.format(name=name, url=url, title=title, description=desc))
|
||||
print('</ul>')
|
||||
|
||||
def listprojs(projs):
|
||||
print("<dl>")
|
||||
for name in projs:
|
||||
title, desc, url = getparts(name, True)
|
||||
print(listtemplate.format(url=url, title=title, description=desc))
|
||||
print('</dl>')
|
||||
#+END_SRC
|
||||
|
||||
** Relatively new
|
||||
|
||||
<@exec boxprojs(top_projs) @>
|
||||
|
||||
*** Others
|
||||
|
||||
<@exec listprojs(other_projs) @>
|
||||
|
||||
|
||||
#+mark: old
|
||||
** Old
|
||||
|
||||
<@exec boxprojs(old_top_projs) @>
|
||||
|
||||
*** Others
|
||||
|
||||
<@exec listprojs(other_old_projs) @>
|
||||
|
||||
|
||||
BIN
site/projects/nanonote/glorious-nanonote.jpg
Normal file
BIN
site/projects/nanonote/glorious-nanonote.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 65 KiB |
16
site/projects/nanonote/index.org
Executable file
16
site/projects/nanonote/index.org
Executable file
@@ -0,0 +1,16 @@
|
||||
#+title: My NanoNote
|
||||
#&summary
|
||||
I have a NanoNote.
|
||||
#&
|
||||
#+license: bysa
|
||||
|
||||
* My NanoNote
|
||||
|
||||
#&img;url=glorious-nanonote.jpg, alt=Glorious NanoNote, center
|
||||
|
||||
I own a [[http://sharism.cc/][NanoNote]]. I think it's
|
||||
cool (though I haven't found much use for it yet). The default NanoNote
|
||||
distro comes with an [[http://openwrt.org/][OpenWRT]]-based. It's also possible to run Debian on it
|
||||
(with only 32 MiB RAM..), but it's slow.
|
||||
|
||||
(Originally, this page was meant to have a purpose.)
|
||||
290
site/writings/na.org
Normal file
290
site/writings/na.org
Normal file
@@ -0,0 +1,290 @@
|
||||
#+title: Na
|
||||
#&summary
|
||||
A new spoken and written language in development.
|
||||
#&
|
||||
#+license: bysa
|
||||
#&toc
|
||||
|
||||
* Na
|
||||
|
||||
** Introduction
|
||||
|
||||
Na is a probalistic language. The more details you use when explaining an
|
||||
event, the more probable it is that the recipient understands you. This is not
|
||||
very different from typical languages ("a blue building" is more precise than
|
||||
"a building"), but the new thing in Na is that this guesswork is everywhere.
|
||||
|
||||
** Alphabet
|
||||
|
||||
Optimally, Na should have its own alphabet. To aid in its spreading, a subset
|
||||
of the Latin alphabet has been chosen instead:
|
||||
|
||||
: . A E I O B D F G K L N S T V
|
||||
|
||||
All of these letters are pronounced as "short sounds", i.e. "A" is not
|
||||
pronounced as "AAY", but just "AE". This is the same for all wovels. There are
|
||||
two types of correct syllables: those of the form <consonant><wovel> and those
|
||||
of the form <wovel>: "LO" is legal, "LOO", "LLA", "LOI", "AV", and "AEV" are
|
||||
not. Aside from letters, only the period (".") character and space between
|
||||
characters are used. No commas, no colons, no semicolons, nothing else. Also,
|
||||
there is no difference between uppercase and lowercase letters. Sentences are
|
||||
read left-to-right (numbers are written right-to-left; more about that later).
|
||||
|
||||
With only 4 wovels and 10 consonants pronouncations can be very varied and
|
||||
still correct. According to the rules laid out above there are 40 different
|
||||
single-syllable words, 40^2 = 1,600 two-syllable words, 40^3 = 64,000
|
||||
three-syllable words, 40^4 = 2,560,000 four-syllable words, etc. At ten
|
||||
syllables (an extreme case) there are 10,485,760,000,000,000 different
|
||||
10-syllable words and a total number of 10,754,625,641,025,640
|
||||
any-number-of-syllables-less-or-equal-to-10 words.
|
||||
|
||||
|
||||
*** TODO IPA/SAMPA
|
||||
|
||||
The author of this document is not very familiar with IPA, SAMPA, or any other
|
||||
phonetic alphabet.
|
||||
|
||||
** Goals
|
||||
|
||||
Na wants to be a useful language somewhat usable by people. Na has been
|
||||
designed to be fairly global, but since the creator of Na is fluent only in
|
||||
Germanic languages (Danish and English), and because the Latin alphabet is
|
||||
used, Na is non-global. Nevertheless, it /wants/ to be global.
|
||||
|
||||
** Basics
|
||||
|
||||
Na has no nouns, no verbs, no adjectives, no adverbiums, no pronouns, etc. In
|
||||
Na, the core of everything is a word more or less equivalent to the English
|
||||
word "existence". This word is *BA*. All other words are based on this base
|
||||
word (in object oriented programming language terminology, this is equivalent
|
||||
to subclassing classes).
|
||||
|
||||
The groups at the first levels of heritance are:
|
||||
|
||||
+ Existence :: BA
|
||||
+ Number :: BE
|
||||
+ Real number :: BEBA
|
||||
+ Integer :: BEBE
|
||||
+ Fraction :: BEBI
|
||||
+ Imaginary number :: BEBO
|
||||
+ Complex number :: BEDA
|
||||
+ Symbol :: BI
|
||||
+ Letter :: BIBA
|
||||
+ Shape :: BO
|
||||
+ Relation :: DA
|
||||
+ Identity :: DE
|
||||
+ Absolute combiner :: DO
|
||||
+ Identifier :: FA
|
||||
+ Relative combiner :: FE
|
||||
|
||||
|
||||
TODO: Improve on groups.
|
||||
|
||||
These have been chosen not because of perfection, but because Na was designed
|
||||
for human beings (who are not perfect). Nevertheless, these groups should
|
||||
suffice for the time being.
|
||||
|
||||
*Note:* These groups are few on purpose. Many words fit into several
|
||||
groups. Groups are only good for basic things; more complex meanings do not
|
||||
have to be placed in any group.
|
||||
|
||||
Na uses a combination of numbers, identifiers and further subclassing to
|
||||
achieve (some) usability. In Na, what is written as one sentence in
|
||||
e.g. English, can often become more than one sentence. To make a statement in
|
||||
Na, one splits one's sentence into Na sentences, the first ones consisting of
|
||||
definitions and assignments (named variables), and the final one consisting of
|
||||
everything put together in the right order. Often, the order does not matter,
|
||||
and the purpose of the final sentence is really just to point out what
|
||||
definitions you have chosen to use, and that you are done.
|
||||
|
||||
For example, to write "I see a table." in Na, you first extract the objects (in
|
||||
Na, everything is an object) from the sentence. This gives us:
|
||||
|
||||
+ I, the subject
|
||||
+ see, the verb
|
||||
+ a table, the object
|
||||
|
||||
In Na, this is simplified further into:
|
||||
|
||||
+ I
|
||||
+ to see
|
||||
+ table, 1
|
||||
|
||||
The only two possible sense-making combinations using all the words would be to
|
||||
say "I see a table" or "The table sees me". To stress that the first version is
|
||||
wanted, we first combine "I" and "to see", which we then combine with a
|
||||
definition of "table, 1". Finally, we throw the definitions together, so that
|
||||
people will understand that the sentence is over.
|
||||
|
||||
To specify "I", we use one of the members from the identity (*DE*) group. "to
|
||||
see" is also an abstraction, because the "I" can see in different ways (if it's
|
||||
a camera, it doesn't use a human brain to see, for example). Other,
|
||||
non-generalized terms are also available, but they are not part of the
|
||||
abstraction group.
|
||||
|
||||
To create a variable to hold "table, 1", you combine the number 1 with a
|
||||
generic table defined using the shape (*BO*) group.
|
||||
|
||||
A sentence where you combine words into a new word has this structure:
|
||||
|
||||
: <word 1> <word 2>[ <word 3>[...]] DO <new word>.
|
||||
|
||||
This is an absolute combination. It is also possible to make relative
|
||||
combinations where word mixes are not saved in new words:
|
||||
|
||||
: <word 1> <word 2>[...] FE <word(s)>[ ...].
|
||||
|
||||
In these relative cases, the words before an FE mark are evaluated when FE is
|
||||
reached. If FE is left out from such sentences, everything will be evaluated at
|
||||
once. Programmers might find it helpful to think of FE as a stack resetter.
|
||||
|
||||
When you do not use the *DO* or *FE* combiner, you state something:
|
||||
|
||||
: <word 1>[ <word 2>[...]].
|
||||
|
||||
In real languages, this is the equivalent of actually expressing something ---
|
||||
combines do not express anything, they merely aid in preparing for later
|
||||
expressions.
|
||||
|
||||
** Example 1: I see a table
|
||||
|
||||
One can write "I see a table." in two ways: the absolute way with *DO* or the
|
||||
relative way with *FE*.
|
||||
|
||||
Words for "I", "to see", and "table" have not yet been made, but we assume they
|
||||
are BIGUHA, NULASE, and GAVOTI, respectively. The integer 1 is FA BEBE B.
|
||||
|
||||
*** Absolute way
|
||||
|
||||
+ Step 1 :: Combine "I" and "to see" into a sentence using combinations from
|
||||
different groups. Give it a name, e.g. VAVO.
|
||||
+ Step 2 :: Combine the number 1 from the integer (*BEBE*) group with the table
|
||||
from the shape group. Give it a name, e.g. GALO.
|
||||
+ Step 3 :: a) Write VAVO GALO, or b) combine VAVO and GALO into e.g. VALO
|
||||
(could be any word) and go to step four.
|
||||
+ Step 4 :: Write VALO.
|
||||
|
||||
So:
|
||||
|
||||
: biguha nulase do vavo. gavoti fa bebe b do galo. vavo galo do valo. valo.
|
||||
|
||||
or, shorter:
|
||||
|
||||
: biguha nulase do vavo. gavoti fa bebe b do galo. vavo galo.
|
||||
|
||||
The advantage of the first variation is that VALO can be reused again and again
|
||||
until people have forgotten what its temporary meaning is. For example, if you
|
||||
are telling a story where the main character often sees a table, you could do
|
||||
this:
|
||||
|
||||
: valo. valo. valo. valo. valo.
|
||||
|
||||
It is not necessary to define new combinations all the time. Na comes with a
|
||||
small built-in set of combinations which is required learning for all Na
|
||||
speakers. These built-in definitions should be used whenever possible,
|
||||
eventually in subclassed or changed forms, to make it easier to write --- and
|
||||
especially speak --- Na.
|
||||
|
||||
*** Relative way
|
||||
|
||||
The relative way is a bit simpler, shorter and easier to say:
|
||||
|
||||
: biguha nulase fa bebe b fe gavoti.
|
||||
|
||||
In fact, this relative sentence can be made into an absolute sentence:
|
||||
|
||||
: biguha nulase fa bebe b fe gavoti do valo. valo.
|
||||
|
||||
*** Notes
|
||||
|
||||
In speech the relative way is much more useful than the absolute one. Both are
|
||||
useful, though.
|
||||
|
||||
|
||||
** Identifiers
|
||||
|
||||
Some of the groups can be used as identifiers. When an identifier is used one
|
||||
or more arguments are expected. The integer identifier requires one argument
|
||||
(the number), the real number identifier requires two arguments (before and
|
||||
after the point), and the letter identifier requires one argument. To use a
|
||||
group as an identifier, prefix it with *FA*.
|
||||
|
||||
** Numbers
|
||||
|
||||
Numbers in Na are duodecimal, i.e. base 12. The alphabet is used as numbers. A
|
||||
is used for zero, the consonants range from 1 to 10, and O is used for 11. When
|
||||
specifying a number, it should be prefixed with *FA BEBA* (real numbers) or any
|
||||
other name from a subclassed number identifier, and it should be written with
|
||||
the least important bit first (LSB). To pronounce a number, speak the letters
|
||||
of the number one by one.
|
||||
|
||||
Examples:
|
||||
|
||||
+ FA BEBE GB = 16
|
||||
+ FA BEBE D = 2
|
||||
+ FA BEBA D AT = 2.108
|
||||
|
||||
TODO: Improve this strange system
|
||||
|
||||
|
||||
** Example 2: We transported the ship into another dimension
|
||||
|
||||
This sentence is a bit tricky. We start by splitting the sentence into
|
||||
meaningful parts:
|
||||
|
||||
+ we transport (in the past)
|
||||
+ <something specific> ship
|
||||
+ into
|
||||
+ another dimension
|
||||
|
||||
Again, base words have not been defined yet, so we assume that "we (generic)"
|
||||
(we do not know if it is an exclusive or inclusive we) is GELO, "transport" is
|
||||
LOLOTI, the past is BATATO, something specific is SESE, "ship" is MOLOTE,
|
||||
"into" is NIKO, "another" is KOBO, and "dimension" is TILE.
|
||||
|
||||
It appears that it is actually quite easy to create a relative sentence now:
|
||||
|
||||
: batato gelo loloti fe sese molote niko fe fe tile kobo.
|
||||
|
||||
Notice the two FE in the end. Without the second FE, the sentence could also
|
||||
mean "We transported another dimension into the ship.". It would not be wrong
|
||||
to omit the FE, but it would create an ambigious sentence (which can be
|
||||
useful).
|
||||
|
||||
Remember that the following sentence means excactly the same as the previous:
|
||||
|
||||
: loloti batato gelo fe niko molote sese fe fe kobo tile.
|
||||
|
||||
Word order is only important in the case of identifiers and their arguments.
|
||||
|
||||
|
||||
** Example 3: 33+2.4i
|
||||
|
||||
33+2.4i is a complex number. The x+yi notation doesn't fit well in Na. Instead,
|
||||
the *FA BEDA* identifier is used (33+2.4i = 33.0+2.4i):
|
||||
|
||||
: fa beda td a d g.
|
||||
|
||||
Again, this is not perfect.
|
||||
|
||||
|
||||
** TODO Foreign words
|
||||
|
||||
Foreign words present a problem in Na.
|
||||
|
||||
|
||||
** TODO Built-ins
|
||||
|
||||
~1000 words needed to begin with.
|
||||
|
||||
|
||||
** Miscellaneous
|
||||
|
||||
Since there are only 16 characters (14 letters, the period, and space), one
|
||||
character can be stored in only 4 bits, and 2 characters can be stored in one
|
||||
byte.
|
||||
|
||||
Because of the infinitely many relatively different ways to say the same thing,
|
||||
texts and speech can be varied a great deal. This could be quite useful in
|
||||
e.g. poems.
|
||||
|
||||
Reference in New Issue
Block a user