(Note: breaking changes are boldfaced.)
- Bugfixes:
- Etymologies are now added in all situations when processing an MDF file
- Desktop version correctly warns about unsaved changes when opening a file
- Rules such as
[p f] / [f h] / (a) _ #
are no longer applied twice to the same grapheme (as a consequence of changes to rule application, see below) noreplace
categories now tokenise multigraphs as expected
- Documentation (user guides and Haddocks) have been comprensively rewritten
- ‘Tonogenesis’ example has been replaced by ‘Thai’ example
- New support for phonetic features:
- Features can be written as maximal
$name#ident(values)
after another lexeme - Categories named
+Feature
,-Feature
and+Feature+Value
get special interpretation with intersections and subtractions - New category syntax:
&
before category name forces union interpretation even for category names beginning with+
/-
- Change to category syntax: first element of category is always interpreted as union (technically a breaking change, but unlikely in existing sound changes)
- Syntax
&Feature
after set operation (&
/+
/-
) to include both-Feature
and+Feature
(i.e. all graphemes with a setting for that feature) - Declaration
auto <FeaturalCategory>
in category definition block can be used to treat said feature autosegmentally whenever a grapheme in the selected category is mentioned
- Features can be written as maximal
- Other changes to sound change syntax:
report
directive allows for reporting intermediate results in input→output mode- Graphemes followed by
~
are now allowed inside a category block, but disallowed in category names and inextra
declarations (where they would be meaningless) - Category intersection now produces a category with graphemes in the same order as the last category mentioned, rather than the first
- Optional elements or categories can now be prefixed by
%
to make them match greedily - New backreference syntax
@#id
allows categories to be matched by ID rather than number extra
graphemes are now always taken into account for multigraph tokenisation (technically a breaking change, but unlikely in existing sound changes)- Within a category, single graphemes inside braces are now treated the same as single graphemes outside braces (technically a breaking change, but unlikely to change existing sound changes)
- Changes to rule application algorithm:
- Sound change applications can now overlap, such that the replacement from one application can be used as the environment for the next
- New flag
-no
allows for reverting to the previous behaviour (non-overlapping applications) - Make RTL and LTR application symmetric, by reimplementing the former as LTR application with words and rules reversed: consequently category correspondences, backreferences etc. are also reversed
- Improvements to graphical interface:
- Whitespace is now preserved when displaying sound change output on desktop and web
- New keyboard shortcuts in desktop GUI: Ctrl+Enter to apply rules, Ctrl+Tab to toggle between rules and words textboxes
- Some labels have been changed to be more descriptive: ‘Different to input’ to ‘Any rule applied’, and ‘Wordlist’ to ‘Wordlist + glosses’
- Improvements to output from ‘Report rules apply’: most importantly, comments are no longer included next to rules, and outputs are no longer aligned across input words (greatly increasing responsiveness on desktop)
- User can now choose which MDF hierarchy to use for dictionaries
- Web version brought closer to parity with desktop version by adding MDF support and an option to ‘synchronise scroll positions’
- When ‘view results live’ is selected, results are updated on changes to all controls, not just changes to words or sound changes
- Add ‘Edit’ menu to desktop GUI, including ‘Find’ dialog box
- Add ‘Help’ menu to desktop GUI
- Fields of web GUI can now be initialised using URL query parameters
(
r
for rules,w
for words) - Add ‘select all’ buttons to web GUI
- Improve display of web application controls on small screens
- Sound changes editor on web version has been rewritten to work around bug with combining diacritics
- Add option for ‘input→output’ display format to include glosses and whitespace
- CMakeLists for desktop GUI now track Haskell binary dependency correctly
- Renamed
Brassica.SoundChange.Category
toBrassica.SoundChange.Expand
- Renamed constructor
Brassica.SoundChange.Types.DirectiveS
toBrassica.SoundChange.Types.DeclS
- Changes resulting from addition of
report
:- New constructor
ReportS
added toBrassica.SoundChange.Types.Statement
- A constructor
ReportWord
has been added toBrassica.SoundChange.Apply.Internal.LogItem
, while its former record fieldsinput
andoutput
have been replaced with functionslogInput
andlogOutput
. Brassica.SoundChange.Frontend.Internal
has been restructured to allow display of intermediate results- New function
Brassica.SoundChange.Tokenise.joinComponents
added to assist with said restructure
- New constructor
- Changes resulting from addition of features:
- New constructors
Feature
andAutosegment
added toBrassica.SoundChange.Types.Lexeme
(the latter primarily for internal use) - New type
Brassica.SoundChange.Apply.Internal
- New constructor
DefineAuto
added toBrassica.SoundChange.Types.CategoryDefinition
- Changes in category expansion:
new type
Brassica.SoundChange.Expand.AutosegmentDef
, and new constructorInvalidDerivedValue
added toBrassica.SoundChange.Expand.ExpandError
- New constructors
- Changes resulting from new rule application algorithm:
- New constructore
PrevEnd
added toBrassica.SoundChange.Apply.Internal.RuleTag
- New field
nonOverlappingTarget
added toBrassica.SoundChange.Types.Flags
- New constructore
- New constructors
GreedyOptional
andGreedyCategory
forBrassica.SoundChange.Types.Lexeme
Brassica.SoundChange.Frontend.Internal.InputLexiconFormat
now depends on new typeBrassica.SoundChange.Frontend.Internal.MDFHierarchy
- Word boundaries are now simply ordinary graphemes
"#"
:Brassica.SoundChange.Types.Grapheme
is now a type synonym for[Char]
- Expansion now results in sound changes with declaration type
GraphemesList
rather than[Grapheme]
- API of
Brassica.SoundChanges.Apply
(andBrassica.SoundChanges.Apply.Internal
) has been refactored:LogItem
(now re-exported fromBrassica.SoundChanges.Apply
) no longer stores redundant information on input wordsPWordLog
is renamedLog
, and is now based onLogItem
initialWord
is now renamedinputWord
- Former functions
applyRule
andapplyStatement
have been renamed toapplyRuleMZ
andapplyStatementMZ
; - Former functions
applyRuleWithLogs
andapplyStatementWithLog
have been renamed toapplyRule
andapplyStatement
- Function
applyRuleWithLog
has been removed - Set of sound change application functions
applyChanges*
has been replaced with a single functionapplyChanges
returning aPWordLog
, plus a set of functions to extract various outputs from it
- New constructor
WordsWithProtoOutputPreserve
forBrassica.SoundChange.Frontend.Internal.OutputMode
- Remove now-unnecessary pattern
Brassica.SoundChange.Types.Boundary
- In parsing modules, re-export whole module
Text.Megaparsec.Error
rather than only re-exporting the single functionerrorBundlePretty
- Category elements are now represented as simply
[Lexeme category a]
(synonymBrassica.SoundChanges.Types.CategoryElement
), without any special case for single-grapheme elements concatWithBoundary
is now no longer re-exported fromBrassica.SoundChange.Tokenise
- Bugfix: nested categories are now matched up correctly between target and replacement
- Bugfix: Brassica no longer freezes with rules where the target is entirely optional
- Bugfix: Brassica no longer crashes when a rule refers to nonexistent categories
- Wildcard symbols can now be used in the replacement of a rule
- Brassica now applies sound changes to words in parallel, giving a significant speedup on multi-core machines (though not in a webpage)
- New
extra
directive allows specifying characters which should never be replaced through all category redefinitions - Improved placement of etymologies in MDF output
- Target and replacement can now be separated by
->
- New
filter
directive allows removing unwanted results - An improved heuristic for avoiding infinite loops in epenthesis rules,
such that e.g.
/h/a_a
yieldsaaaa
→ahahaha
rather than previous unexpected *ahaaha
- New
-??
flag to allow for per-occurrence sporadicity categories
directive can now be specifiednoreplace
to prevent replacement of unknown graphemes with U+FFFD (�)- Improved method for highlighting words ‘different to last run’ (now using the Myers diff algorithm)
- Added syntax highlighting for flags
- Sound change rules can now be specified on the command-line using new
--eval
or-e
flag - Add CLI option to highlight words different to input
- Currently open files shown in title of desktop window
- Desktop application warns when closing with unsaved changes
- Improve user interface for file management in desktop paradigm builder
- New CLI for paradigm builder: program name
brassica-pb
optparse-applicative
lower bound tightened to 0.17.1- Bugfix:
Brassica.SoundChange.Apply.applyRuleStr
is no longer seriously broken Brassica.SoundChange.Apply.Internal.applyOnce
now returns aRuleStatus
value with more detailed information about the rule application, which is now used byBrassica.SoundChange.Apply.Internal.setupForNextApplication
Wildcard
andKleene
no longer haveOneOf 'Target 'Env
constraintOneOf
type family is no longer used and has been removedTarget
andEnvironment
LexemeType
s have been unified asMatched
Brassica.SoundChange.Frontend.Internal.parseTokeniseAndApplyRules
now takes another argument specifying how to map over the parse output, allowing it to be run both on a single core and in parallel depending on the provided functionBrassica.SoundChange.Types.Directive
has a new constructorExtraGraphemes
for theextra
directive, with corresponding changes in parsing and expansionBrassica.SoundChange.Category.extend
has been renamed toextendCategories
, and now requires pattern-matching on aCategories
directive before useBrassica.SoundChange.Frontend.Internal.parseTokeniseAndApplyRules
no longer implements rule expansion, allowing it to take place only once without needing to be repeated for each rule application.- MDF support has been comprehensively rewritten:
Brassica.MDF
has been removed- New module
Brassica.SFM.SFM
implements generic support for SIL Standard Field Marker hierarchies - New module
Brassica.SFM.MDF
describes the standard and alternate MDF hierarchies, and other necessary utilities for working with MDF documents - Some rewrites to
Brassica.SoundChange.Frontend.Internal
to account for the new architecture
- New type
Brassica.SoundChange.Types.Filter
, resulting in other changes:- New
FilterS
constructor added toBrassica.SoundChange.Types.Statement
LogItem
andPWordLog
(inBrassica.SoundChange.Apply.Internal
) now useMaybe PWord
to show cases where a word was deleted- Corresponding changes to parsing, expansion and application
- New
- Rule sporadicity is now represented by a dedicated type,
Brassica.SoundChange.Types.Sporadicity
Categories
constructor (inBrassica.SoundChange.Types.Directive
) now has an extra field fornoreplace
directive- Add useful function
Brassica.Paradigm.Apply.depth
- Allow grapheme to begin with star
- Allow lexeme sequences in categories using
{…}
syntax - Allow backreferences to occur in the environment
- Allow user to choose separator used between multiple results (previously a space)
- Internal refactor: category expansion is now separate from parsing
- Add
--version
command-line option - Store
MultiZipper
data in aVector
rather than a linked list (for performance) - Bugfix: subtraction now removes all subtracted graphemes
- Store paradigm builder output in a tree data structure, allowing a more compact output format
- Documented abstract features in paradigm builder (previously present but undocumented)
- Rewrote executables with a client/server architecture for better Windows support. The library remains unchanged.
- Add new syntax with
#
in lexicon to create word boundaries which can be manipulated by sound changes - Web interface greatly improved using WebAssembly
- Allow synchronising scroll positions in GUI between input and output textboxes
- Add timeout to desktop GUI to abort long-running computations
- Allow category backreferencing with
@n
before category - Allow forcing nondeterminism with
@?
before category - Add ‘input→output’ format for output words
- Change default output format for MDF input to wordlist in CLI
- Add ‘or environments’ with syntax ‘target / replacement / env1 / env2 / env3 / …’. Former rule exceptions with similar syntax have been changed to syntax ‘target / replacement / env // exception’.
- Improve documentation