Skip to content

Releases: def-gthill/lexurgy

v1.7.5

16 Apr 14:36

Choose a tag to compare

This release fixes a bug in the parser that caused non-space whitespace (e.g. tab characters) to be treated as sounds instead of whitespace.

v1.7.4

16 Apr 14:28

Choose a tag to compare

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

01 Jan 21:38

Choose a tag to compare

  • 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

28 Dec 19:06

Choose a tag to compare

  • Allow leaving out the trailing comma in multiline class definitions.
  • Fix syllable features sometimes moving during resyllabification.

v1.7.1

05 Jul 14:26

Choose a tag to compare

Fixed cleanup rules applying after the final romanizer.

v1.7.0

26 May 01:38

Choose a tag to compare

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 l or r.
  • An s plus any consonant except another s.
  • Any two stops, but stop-stop word-internal clusters should be split between the two syllables, e.g. ktaptak should become ktap.tak, not kta.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

28 Apr 06:17

Choose a tag to compare

When tracing, applications of special rule types (romanizers, syllabification, etc.) are recorded with unique names.

v1.5.0

23 Mar 17:51

Choose a tag to compare

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

23 Jan 20:03

Choose a tag to compare

Add loading from files in CLI Server Mode

v1.3.9

27 Dec 14:32

Choose a tag to compare

Fix feature assignment in syllable rules with conditions