Phonet is a CLI tool and library to validate phonotactic patterns for constructed languages. It is compatible with either romanization and phonetic transcription. Words can be randomly generated (see Argument Syntax).
Syntax Highlighting Extension for VSCode
Formerly named 'Phoner'
This project can be used as a rust library crate, or as a binary executable.
``` Usage: phonet.exe [OPTIONS]
Options:
-t, --tests
-f, --file
Eg. `phonet -f ./myfile.phonet`
[default: phonet]
-d, --display-level
Options can be single letter
Eg. `phonet -d only-fails` or `phonet -do`
[default: show-all]
Possible values:
- show-all: Show everything: passed or failed tests, and notes
- ignore-passes: Show failed tests and notes, but not passes
- only-fails: Show only failed tests, not passed tests or notes
- hide-all: Show nothing: not passed or failed tests, or notes
-m, --minify Minify file and save
-w, --with-tests Include tests in minified file
-g, --generate [
Default count 1, specify with number
--gmin <GENERATE_MIN_LEN>
Set minimum length for generated words
Use with the `--generate` or `-g` flag
Note: This increases generation time exponentially
--gmax <GENERATE_MAX_LEN>
Set maximum length for generated words
Use with the `--generate` or `-g` flag
-n, --no-color Display output in default color
Use for piping standard output to a file
-h, --help Print help (see a summary with '-h')
-V, --version Print version ```
```bash
phonet
phonet -t some,words
phonet -f myfile.phonet
phonet -df
phonet -d only-fails phonet -d fails
phonet -m
phonet -f myfile.phonet -dh -mw
phonet -g
phonet -g10 -f myfile.phonet
phonet -n > phonet.txt
phonet -f myfile.phonet -ndh -g 3 --gmin 6 --gmax 8 > ./phonet.txt ```
Replace <path_to_file>
with the directory of the downloaded binary.
Add alias in .bashrc
in user directory
```bash
alias phonet="
Add to $env:PATH
ps1
$env:Path = "$env:Path;<path_to_file>\phonet.exe"
Add phonet = "0.9.0"
to your Crates.toml
file
```rs use phonet::Draft;
fn main() { let file = std::fs::readtostring("phonet").unwrap();
// Parse draft
Draft::from(&file).unwrap()
// Run tests
.run()
// Display results
.display(Default::default())
} ```
```rs use std::fs;
use phonet::{ draft::{Message::Test, TestDraft}, getminfilename, DisplayLevel, Draft, };
fn main() { let filename = "myfile.phonet";
// Read file
let file = fs::read_to_string(filename).expect("Could not read phonet file");
// Parse file
let mut draft = Draft::from(&file).expect("Failed to parse file");
// Add a custom test
draft.messages.push(Test(TestDraft {
intent: true,
word: "taso".to_string(),
}));
// Minify file
fs::write(
get_min_filename(filename),
draft.minify(false).expect("Failed to minify"),
)
.expect("Could not write minified file");
// Generate 10 words, each between 5 and 8 in length
let generated = draft.generate(10, 5..8).expect("Failed to generate words");
// Run tests and display only failed tests
draft.run().display(DisplayLevel::OnlyFails, true);
// Display generated words
println!("Randomly generated words:");
for word in generated {
println!(" - {}", word);
}
} ```
A Phonet file is used to define the rules, classes, and tests for the program.
The file should either be called phonet
, or end in .phonet
Syntax Highlighting Extension for VSCode
The syntax is a statements, each separated by a semicolon ;
or a linebreak.
Use a Ampersand &
to denote a multi-line statement. This can only be ended with a semicolon ;
.
Comments will end with a linebreak or a semicolon ;
.
All whitespace is ignored, except to separate words in tests.
Note! This will replace spaces in Regex as well! Use
\s
if you need a space
Each statement must begin with an operator:
#
Hashtag: A whole line comment. A linebreak (not a semicolon) ends the comment$
Dollar: Define a class+
Plus or !
Bang: Define a rule*
Star: Create a test note, and define a reason if a test fails?
Question: Create a test~
Tilde: Define the mode of the fileClasses are used as shorthand Regular Expressions, substituted into rules at runtime.
Note: Angle brackets will not parse as class names directly after:
- An opening round bracket and a question mark:
(?
- An opening round bracket, question mark, and letter 'P':
(?P
- A backslash and letter 'k':
\k
This is the syntax used for look-behinds and named groups
Syntax:
$
Dollar=
Equals<>
or ⟨⟩
(as with rules)The 'any' class, defined with $_ = ...
, is used for random word generation.
Example:
```phonet
$C = [ptksmn]
$V = [iueoa]
$C_s = [sz] ```
Rules are Regular Expressions used to test if a word is valid.
Rules are defined with an intent, either +
for positive, or !
for negative.
To use a class, use the class name, surrounded by angle brackets <>
or ⟨⟩
.
Syntax:
+
Plus or !
Bang - Plus for positive rule, Bang for negative rule<>
or ⟨⟩
Example (with predefined *classes*):
```phonet
!
Tests are checked against all rules, and the result is displayed in the output.
Tests are ran in the order of definition.
Like rules, tests must have a defined intent, either +
for positive, or !
for negative.
Syntax:
?
Question mark+
Plus or !
Bang - Plus for positive test, Bang for negative testExample (with predefined *rules*):
```phonet
?+ taso
?! tax
?+ taso sato tasa ```
Notes are printed to the terminal output, alongside tests.
They are used as a reason for any proceeding rules, as an explanation if a test fails.
Syntax:
*
StarExample:
```phonet
* Syllable structure
+ ^ (
?+ tasto
?+ taso ```
The mode of a Phonet file can be one of these:
<>
(not ⟨⟩
)//
[]
This can optionally be specified in a file, although it does not add any functionality.
Syntax:
~
Tilde<.>
, /./
, or [.]
- Mode identifier, with .
being any string, or blankExamples:
```phonet
~<> ```
```phonet
~ / this is the mode / ```
See the examples folder for Phonet file examples.
These formatting tips are not required, but recommended to make the file easier to read.
Example (this is from example.phonet):
```phonet ~<> ;# Mode (optional) - This file uses romanized letters
$_ = [ptkmnswjlaeiou] ;# Any / all letters (required for generating words) $C = [ptkmnswjl] ;# Consonants $V = [aeiou] ;# Vowels
Invalid letters ;# Note - Prints to standard output, and used as reason if test fails
Examples of failing tests ?+ tyxo ;# This test will fail - with the reason 'Invalid Letters' (above) ?! taso ;# This test will fail, as a false positive
Syllable structure
Some more tests ?+ silo tila ?! aka axe
No repeated letters
! (.)\1 ;# This is an unnamed back-reference
! (?
2 tests should have failed! ```