Releases: def-gthill/lexurgy
v1.7.5
v1.7.4
This release improves handling of diacritics:
- Performance is improved when there are many diacritics defined.
- Using the fewest possible diacritics is always prioritized when converting feature matrices to symbols.
v1.7.3
- Negating absent features (
[!*voicing]) and feature variables ([!$voicing]) now works as expected. - Adding a filter to a block now works as expected.
v1.7.2
- Allow leaving out the trailing comma in multiline class definitions.
- Fix syllable features sometimes moving during resyllabification.
v1.7.1
Fixed cleanup rules applying after the final romanizer.
v1.7.0
This release introduces a new way of declaring syllable structure, to address some common shortcomings of the existing syntax.
Lexurgy's syllable system has always tried to follow the Maximal Onset Principle, so that a word like banana gets split up as ba.na.na, not ban.an.a. But it actually had no idea where the "onset" was, so the best it could do was to end syllables as early as possible.
This had a particularly counterintuitive result if you tried to allow more than one vowel in the nucleus. Consider this rule:
Class vowel {a, e, i, o, u}
Class cons {p, t, k, s, m, n, l, r}
Syllables:
@cons? @vowel @vowel? @cons?
This seems like it should split up the word paikaoinik as pai.kao.i.nik. But instead the result is pa.i.ka.o.i.nik. Lexurgy tries to end syllables as early as possible, and since pa.i is just as valid as pai, it chooses pa.i, which ends the first syllable one segment earlier.
With the new version, you can instead write:
Class vowel {a, e, i, o, u}
Class cons {p, t, k, s, m, n, l, r}
Syllables:
@cons? :: @vowel @vowel? :: @cons?
This syntax indicates exactly where each part of the syllable is, in the format <onset> :: <nucleus> :: <coda>. Then the Maximal Onset Principle can apply only to the onset, with segments assigned preferentially to the onset rather than the coda. Meanwhile, the nucleus tries to consume as many segments as possible. This results in the expected result, pai.kao.i.nik.
Furthermore, sometimes you don't want the Maximal Onset Principle to apply. To help with this, the new syntax also includes a "reluctant onset" syllable part. Unlike with normal onsets, segments are assigned preferentially to the coda rather than the reluctant onset. For example, suppose you want to allow the following onset clusters:
- Any stop or fricative plus
lorr. - An
splus any consonant except anothers. - Any two stops, but stop-stop word-internal clusters should be split between the two syllables, e.g.
ktaptakshould becomektap.tak, notkta.ptak.
You can now write this as:
Syllables:
{p, t, k, s}? {l, r}? :: @vowel :: @cons?
s (@cons&!s)? :: @vowel :: @cons?
{p, t, k}? ?: {p, t, k} :: @vowel :: @cons?
With the last line using a reluctant onset, in the format <reluctant onset> ?: <onset> :: <nucleus> :: <coda>.
v1.6.0
When tracing, applications of special rule types (romanizers, syllabification, etc.) are recorded with unique names.
v1.5.0
Lexurgy now treats tab characters as "column" separators, i.e. separating multiple phrases on the same line. Sound changes are applied to each "column" separately.
v1.4.0
Add loading from files in CLI Server Mode
v1.3.9
Fix feature assignment in syllable rules with conditions