Commit e9f3c891 authored by Sylvain Coulange's avatar Sylvain Coulange
Browse files

mise à jour custom anglais + maj phon2graphEn

parent d69b2470
# The words in the list below should be considered as one word instead of two : gon na → gonna
def getOneWordList():
return {
"gon":"na",
"got":"ta",
"can":"not",
"do":"n't",
"does":"n't",
"did":"n't",
"ca":"n't",
"could":"n't",
"should":"n't",
"is":"n't",
"are":"n't",
"would":"n't",
"wo":"n't",
"have":"n't",
"had":"n't",
"were":"n't",
"ai":"n't",
"has":"n't",
"must":"n't",
"sha":"n't",
"was":"n't",
"might":"n't",
"may":"n't"
}
\ No newline at end of file
......@@ -19,9 +19,9 @@ phonColFile = "../phon2graph/data/api2class.json"
phonGraphFile = "../phon2graph/data/fidel_wikicolor.scsv" # "../phon2graph/data/phoneme-graphies_fr.scsv"
phonGraphFileEn = "../phon2graph/data/fidel_wikicolor_en_global.scsv" # ENGLISH
pinyin2apiFile = "../phon2graph/data/pinyin2api.json" # MANDARIN
pinyin2apiFile = "../phon2graph/data/pinyin2api_v2.json" # MANDARIN
api2classFile = "../phon2graph/data/api2class.json" # MANDARIN
pinyin2zhuyinFile = "../phon2graph/data/pinyin2zhuyin.json" # MANDARIN
########################################
......@@ -119,6 +119,7 @@ print("Nombre d'entrées dans AlemDic-dicoZh :", getLenDic('zh'))
##### LECTURE DU CODE PHONEME-COULEUR #####
with open(phonColFile,"r") as phonFile:
phon2class = json.load(phonFile)
for i in phon2class.keys(): i = i.replace('(','').replace(')','')
##### LECTURE DES LISTES PHONEME-GRAPHIES (FIDEL) #####
......@@ -189,6 +190,9 @@ with open(pinyin2apiFile) as inFile:
with open(api2classFile) as inFile:
api2class = json.load(inFile)
with open(pinyin2zhuyinFile) as inFile:
pinyin2zhuyin = json.load(inFile)
########################################
######### LISTE DES FONCTIONS ##########
......@@ -311,11 +315,11 @@ def traitementzh(mot):
for hanzindex, pintone in enumerate(pinparse):
if pintone[-1] in ['1', '2', '3', '4', '5'] and len(pintone)>1: # Si il y a un ton et que ce n'est pas qu'un chiffre, c'est que la pinyinisation a fonctionné
res = [mot[hanzindex]]
for el in pinyin2phon(pintone, pinyin2api, api2class):
for el in pinyin2phon(pintone, pinyin2api, api2class, pinyin2zhuyin):
res.append(el)
result.append(res)
else:
result.append((mot[hanzindex], "", [], 0))
result.append((mot[hanzindex], "", [], 0, {}))
print(result)
return result
......
......@@ -3,6 +3,7 @@ from . import textPhonographer as txtphono
from .models import Phonograph, Data, Entree, commitData
from django.http import JsonResponse
from .liaisons import *
from .english_spacyExceptions import getOneWordList
import json, spacy, subprocess, re
print('Chargement des modèles de langue...')
......@@ -15,6 +16,10 @@ nlpZh = spacy.load("zh_core_web_sm")
print('OK.')
logFile = "../logs/dico_frwiktionary-20200301_v2.log"
## RÉCUPÉRATION DE LA LISTE DES EXCEPTIONS POUR L'ANGLAIS
asOneWord = getOneWordList()
def redirApp(request):
return HttpResponseRedirect('/')
......@@ -92,7 +97,19 @@ def colorize(request):
print("Saut de ligne.")
outText.append('§')
else:
print("Mot en entrée :",token.text)
thisTokenText = token.text
# TRAITEMENT CONTRACTIONS ANGLAIS AUTRES gonna cannot gotta
if lang == "en":
if thisTokenText in asOneWord.keys() and nlpText[j+1].text == asOneWord[thisTokenText]:
print("CONCATÉNATION CONTRACTION ANGLAIS:", thisTokenText, nlpText[j+1].text)
thisTokenText = thisTokenText + nlpText[j+1].text
elif thisTokenText in asOneWord.values() and nlpText[j-1].text in asOneWord.keys() and asOneWord[nlpText[j-1].text] == thisTokenText:
continue # => si on est passé par le if à l'itération suivante, on passe au token suivant directement (ignorer "n't"..etc)
print("Mot en entrée :",thisTokenText)
if lang == "fr" or lang == "en":
liaison = None
......@@ -106,7 +123,7 @@ def colorize(request):
print("bigram de locution :",bigram)
# appel de la fonction obtenirM1M2
else:
bigram = obtenirM1M2(token.text, nlpText[j+1].text)
bigram = obtenirM1M2(thisTokenText, nlpText[j+1].text)
print("bigram normal :",bigram)
# vérifie les règles de liaisons et denasalisation
if bigram != None:
......@@ -114,7 +131,7 @@ def colorize(request):
liaison = verifliaison(token, nlpText[j+1])
print("type de liaison : ",liaison)
result = txtphono.traitement(token.text,lang,liaison) # LIAISON : ajoute le booléen liaison en argument
result = txtphono.traitement(thisTokenText,lang,liaison) # LIAISON : ajoute le booléen liaison en argument
phonographieList = []
for r in result:
......@@ -131,16 +148,16 @@ def colorize(request):
if lang == 'fr':
## Affichage de la liaison hors du mot
juge = False
if len(tiret) > 0 and token.text in tiret.keys() :
if len(tiret) > 0 and thisTokenText in tiret.keys() :
if liaison != None :
result1 = txtphono.traitement("-͜", lang, token.text+liaison)
result1 = txtphono.traitement("-͜", lang, thisTokenText+liaison)
juge = True
elif liaison == None :
result1 = txtphono.traitement("-", lang, liaison)
juge = True
else:
if liaison != None:
result1 = txtphono.traitement("‿", lang, token.text+liaison)
result1 = txtphono.traitement("‿", lang, thisTokenText+liaison)
juge = True
if juge == True :
phonographieList = []
......@@ -155,7 +172,7 @@ def colorize(request):
outText.append(phonographieList)
elif lang == "zh":
result = txtphono.traitementzh(token.text)
result = txtphono.traitementzh(thisTokenText)
outText.append(result)
print("Résultat en sortie :", result)
......
......@@ -20,7 +20,7 @@ let api2class = {
"ɑː":"phon_a_maj_long",
"ɑ̃":"phon_a_maj_nas",
"ə":"phon_arobase",
"ɚ":"phon_arobase_rho",
"ɚ":"phon_schwarho",
"":"phon_arho",
"ɤ˞":"phon_7rho",
"ɘ":"phon_arobase_slash",
......@@ -133,18 +133,53 @@ let api2class = {
"ʒ":"phon_z_maj",
"ʐ":"phon_z_retr",
"ʑ":"phon_z_slash",
"pour l'anglais i/ɪ":"phon_schwi",
"pour l'anglais ə":"phon_schwa",
"pour l'anglais u/ʊ":"phon_schwu",
"(i/ɪ)":"phon_schwi",
"(ə)":"phon_schwa",
"(ɚ)":"phon_schwarho",
"(u/ʊ)":"phon_schwu",
"j(u/ʊ)":"phon_schwju",
"(ɪ)z":"phon_schwiz",
"(ə)z":"phon_schwaz",
"ɑɹ":"phon_a_majr",
"":"phon_ai_maj",
"aɪə":"phon_ai_majarobase",
"":"phon_au_maj",
"aʊwə":"phon_au_majwarobase",
"əl":"phon_arobasel",
"əm":"phon_arobasem",
"ən":"phon_arobasen",
"əʊ":"phon_arobaseu_maj",
"a(ɪ)":"phon_aschwi",
"aɪ(ə)":"phon_ai_majschwa",
"a(ʊ)":"phon_aschwu",
"aʊw(ə)":"phon_au_majwschwa",
"(ə)l":"phon_schwal",
"(ə)m":"phon_schwam",
"(ə)n":"phon_schwan",
"ə(ʊ)":"phon_arobaseschwu",
"ef":"phon_ef",
"e(ɪ)":"phon_eschwi",
"e(ə)":"phon_eschwa",
"":"phon_er",
"ɪ(ə)":"phon_i_majschwa",
"jʊ(ə)":"phon_ju_majschwa",
"ɥi":"phon_h_maj_i",
"ij":"phon_ij",
"ɪɹ":"phon_i_majr",
"j(ə)":"phon_jschwa",
"juː":"phon_ju_long",
"ju":"phon_ju",
"jʊɹ":"phon_ju_majr",
"o(ʊ)":"phon_oschwu",
"ɔ(ɪ)":"phon_o_majschwi",
"ɔɹ":"phon_o_majr",
"ʊ(ə)":"phon_u_majschwa",
"ʊɹ":"phon_u_majr",
"wa":"phon_wa",
"waɹ":"phon_war",
"":"phon_wa_maj",
"wɑː":"phon_wa_maj_long",
"wa(ɪ)":"phon_waschwi",
"wɛ̃":"phon_we_maj_nas",
"":"phon_wv_maj",
"":"phon_j3_rho",
"(ə)ɹ":"phon_schwar",
"j(ʊ)":"phon_jschwu",
"j(u)":"phon_jschwu",
"d͡z":"phon_dz",
"dz":"phon_dz",
"d͡ʒ":"phon_dz_maj",
......@@ -153,23 +188,11 @@ let api2class = {
"":"phon_dz_retr",
"d͡ʑ":"phon_dz_slash",
"":"phon_dz_slash",
"ef":"phon_ef",
"":"phon_ei_maj",
"":"phon_earobase",
"":"phon_er",
"ɪə":"phon_i_majarobase",
"jʊə":"phon_ju_majarobase",
"ɡ͡b":"phon_gb",
"ɡb":"phon_gb",
"ɡz":"phon_gz",
"ɡʒ":"phon_gz_maj",
"ɥi":"phon_h_maj_i",
"ij":"phon_ij",
"ɪɹ":"phon_i_majr",
"ɲ":"phon_j_maj",
"":"phon_jarobase",
"juː":"phon_ju_long",
"jʊɹ":"phon_ju_majr",
"k͡p":"phon_kp",
"kp":"phon_kp",
"k͡s":"phon_ks",
......@@ -181,9 +204,6 @@ let api2class = {
"kw":"phon_kw",
"lj":"phon_lj",
"nj":"phon_nj",
"":"phon_ou_maj",
"ɔɪ":"phon_o_maji_maj",
"ɔɹ":"phon_o_majr",
"p͡f":"phon_pf",
"pf":"phon_pf",
"sz":"phon_sz",
......@@ -211,18 +231,6 @@ let api2class = {
"":"phon_ts_slash",
"t͡θ":"phon_tt_maj",
"":"phon_tt_maj",
"ʊə":"phon_u_majarobase",
"ʊɹ":"phon_u_majr",
"wa":"phon_wa",
"waɹ":"phon_war",
"":"phon_wa_maj",
"wɑː":"phon_wa_maj_long",
"waɪ":"phon_wai_maj",
"wɛ̃":"phon_we_maj_nas",
"":"phon_wv_maj",
"ju/jʊ":"phon_schwju",
"iz/ɪz":"phon_schwiz",
"əz":"phon_schwaz",
"m͡p":"phon_mp",
"m͡b":"phon_mb",
"n͡t̪":"phon_nt_d",
......@@ -301,9 +309,4 @@ let api2class = {
"ɡw":"phon_gw",
"xw":"phon_xw",
"ɣw":"phon_g_majw",
"":"phon_j3_rho",
"əɹ":"phon_schwar",
"ɪz":"phon_schwiz",
"":"phon_schwju",
"ju":"phon_schwju"
}
\ No newline at end of file
......@@ -53,7 +53,7 @@ function selectLang(lang){
// Region settings
document.getElementById('regionPriorityDiv').style.display = '';
if (thisRegion.length ==0) thisRegion = "UK";
thisRegion = "UK";
}
......
......@@ -526,7 +526,7 @@ function getPopUp() {
var expLong = "text-decoration: underline;";
// On récupère la liste des <span>
const regexSpan = /<span class="tokens.*?>(.*?<\/span>)<\/span>|(<span class="phon_neutre">.*?<\/span>)|(<span> <\/span>)|(<br>)|(<span class="liaison(Obligatoire|Facultative)( phon)? phon_.*?" .*?>.*?<\/span>)/gm;
const regexSpan = /<span class="tokens.*?>(.*?<\/span>)<\/span>|(<span class="phon_neutre">.*?<\/span>)|(<span class="space"> <\/span>)|(<br>)|(<span class="liaison(Obligatoire|Facultative)( phon)? phon_.*?" .*?>.*?<\/span>)/gm;
// group1: word in colors
// group2: punctuation
// group3: space
......
This diff is collapsed.
let lang2phons = {
"fr": {
"vowel": ["i","e","ɛ","y","ø","œ","ə","a","u","o","ɔ","ɑ"],
"vnasal": ["ɛ̃","œ̃","ɔ̃","ɑ̃"],
"semivowel": ["j","ɥ","w"],
"nasal": ["m","n","ɲ","ŋ"],
"plosive": ["p","b","t","d","k","ɡ"],
"fricative": ["f","v","s","z","ʃ","ʒ","ʁ"],
"approximant": ["l"],
"affricate": ["","","ks","ɡz","ts"]
},
"en": {},
"zh": {}
}
var bi = ["ɑː","ɑɹ","ɖʐ","əʊ","ɜː","ɡɣ","ɡʷ","ɡʒ","ɢʁ","ɪə","ɪɹ","ɟʝ","ɴɢ","ɲ","ɲɟ","ɳɖ","ɳʈ","ŋɡ","ŋʷ","ɔː","ɔɪ","ɔɹ","ʈʂ","ʊə","ʊɹ","","aɪə","","aʊwə","","ɡb","bv","","ɲc","","","","","","dz","","","","ef","ʔh","","ɥi","ij","iz","","","jʊə","jʊɹ","jʊɹ","ju","juː","","","ŋk","kp","ks","kw","kx","əl","lj","əm","","","ŋm","mb","mp","ən","","","","","nd","nd̪","nj","ns","nt","nt̪","nz","","","pf","ɴq","","sz","","tɕʰ","","","tʂʰ","","tʃʼ","","ts","tsʰ","tsʼ","","","wɑː","wɛ̃","","wa","waɪ","waɹ","","əz","ɡz","ɪz"];
// let lang2phons = {
// "fr": {
// "vowel": ["i","e","ɛ","y","ø","œ","ə","a","u","o","ɔ","ɑ"],
// "vnasal": ["ɛ̃","œ̃","ɔ̃","ɑ̃"],
// "semivowel": ["j","ɥ","w"],
// "nasal": ["m","n","ɲ","ŋ"],
// "plosive": ["p","b","t","d","k","ɡ"],
// "fricative": ["f","v","s","z","ʃ","ʒ","ʁ"],
// "approximant": ["l"],
// "affricate": ["tʃ","dʒ","ks","ɡz","ts"]
// },
// "en": {},
// "zh": {}
// }
var bi = [
"a(ɪ)","a(ʊ)","aɪ(ə)","aʊw(ə)","ɑɹ","e(ə)","e(ɪ)","ef","","ə(ʊ)","ɪ(ə)",
"(ə)l","(ə)m","(ə)n","(ə)z","(i)z","ɪɹ","(ɪ)z","j(u/ʊ)","j(ə)","j(u)","j(ʊ)","jʊ(ə)",
"juː","ju","jʊɹ","jʊɹ","o(ʊ)","ɔ(ɪ)","ɔɹ","ʊ(ə)","ʊɹ","wa(ɪ)","waɹ","wɑː","",
"wa","","wɛ̃","ɥi","ij",
"ɖʐ","ɡɣ","ɡʷ","ɡʒ","ɢʁ","ɟʝ","ɴɢ","ɲ","ɲɟ","ɳɖ","ɳʈ","ŋɡ","ŋʷ","ʈʂ","","ɡb","bv","","ɲc","","","","","","dz","ʔh","","","ŋk","kp","ks","kw","kx","lj","","","ŋm","mb","mp","","","","","nd","nd̪","nj","ns","nt","nt̪","nz","","pf","ɴq","","sz","","tɕʰ","","","tʂʰ","","tʃʼ","","ts","tsʰ","tsʼ","","ɡz"
];
var longs = ["ɑː","ɜː","ɔː","",""]
document.getElementById('colorPicker-phon_base').value = getComputedStyle(document.documentElement).getPropertyValue('--phon_base');
......@@ -33,12 +40,6 @@ for (c=0; c<document.styleSheets.length; c++) {
var memClass = {}
function setPhon(phon) {
// var q = document.querySelectorAll('.'+phon+'0');
// for (el=0; el<q.length; el++) {
// q[el].classList.remove(phon+'0');
// q[el].classList.add(phon);
// }
// Modification directe de la css : réactiver /s/ revient à remettre les attributs couleurs de .phon_s enregistrés dans memClass
// identifier l'entrée de la css à modifier
for (r=0; r<thisCSS.cssRules.length; r++) {
......@@ -58,12 +59,6 @@ function setPhon(phon) {
}
function unsetPhon(phon) {
// var q = document.querySelectorAll('.'+phon);
// for (el=0; el<q.length; el++) {
// q[el].classList.remove(phon);
// q[el].classList.add(phon+'0');
// }
// Modification directe de la css : désactiver /s/ revient à remplacer les attributs couleurs de .phon_s par .phon_base (et enregistrement des valeurs dans memClass)
// identifier l'entrée de la css à modifier
for (r=0; r<thisCSS.cssRules.length; r++) {
......@@ -85,7 +80,8 @@ function unsetPhon(phon) {
thisCSS.cssRules[r].style['color'] = 'var(--phon_base)'
thisCSS.cssRules[r].style['stop-color'] = 'var(--phon_base)'
thisCSS.cssRules[r].style['-webkit-text-fill-color'] = ''
if (thisCSS.cssRules[r].style['text-decoration'] != '') thisCSS.cssRules[r].style['text-decoration'] = 'underline var(--phon_base)'
// if (thisCSS.cssRules[r].style['text-decoration'] != '') thisCSS.cssRules[r].style['text-decoration'] = 'underline var(--phon_base)'
if (thisCSS.cssRules[r].style['text-decoration'] != '') thisCSS.cssRules[r].style['text-decoration'] = ''
}
}
......@@ -149,11 +145,19 @@ function checkUncheck(thisChecked, classe) {
}
}
function selectRegion(region) {
thisRegion = region
makePhonTable(thisPageLang)
}
function makePhonTable(lang) {
if (lang == 'fr') {
document.getElementById('phonTable').innerHTML = phonTableFr;
} else if (lang == 'en') {
document.getElementById('phonTable').innerHTML = phonTableEn;
if (thisRegion == 'UK') document.getElementById('phonTable').innerHTML = phonTableEnBr;
else if (thisRegion == 'US') document.getElementById('phonTable').innerHTML = phonTableEnUS;
else document.getElementById('phonTable').innerHTML = phonTableEnUS;
} else if (lang == 'zh') {
document.getElementById('phonTable').innerHTML = phonTableZh;
}
......@@ -199,6 +203,16 @@ function makePhonTable(lang) {
custphonList[i].innerHTML = '<div class="form-check m-1"><input class="form-check-input check-phon check-schwa" type="checkbox" onchange="togglePhon(this.id)" id="cb-'+api2class[api]+'" checked><label class="form-check-label" for="cb-'+api2class[api]+'">'+api+colpick+'</label></div>';
}
custphonList = document.querySelectorAll('.custphonvowOther');
for (i=0; i<custphonList.length; i++) {
var api = custphonList[i].dataset.phon;
var colpick = ' <input type="color" id="colorPicker-'+api2class[api]+'" class="colorSetting" onchange="setCol(\''+api2class[api]+'\',this.value)" value="'+ getCol(api2class[api]).trim() +'">';
if (bi.includes(api)){
colpick = '';
}
custphonList[i].innerHTML = '<div class="form-check m-1"><input class="form-check-input check-phon check-vowOther" type="checkbox" onchange="togglePhon(this.id)" id="cb-'+api2class[api]+'" checked><label class="form-check-label" for="cb-'+api2class[api]+'">'+api+colpick+'</label></div>';
}
// déchecker tous les phonèmes déjà désactivés (listés dans memClass)
for (phon in memClass) {
var thisCb = document.getElementById('cb-'+phon);
......@@ -220,12 +234,13 @@ function exportCustom(){
unchecks = unchecks.replace(/&$/,'');
// Récupération liste des couleurs customisées
var cols = document.documentElement.style.cssText.replace(/ /g,'')
var cols = document.documentElement.style.cssText.replace(/--space:.*?em;/,'')
.replace(/ /g,'')
.replace(/--phon_/g,'')
.replace(/#/g,'')
.replace(/:/g,'=')
.replace(/;/g,'&')
.replace(/&$/,'');
.replace(/&$/,'')
// Mémorisation si bicolore ou pas
var bicol = document.getElementById('bicolor').checked;
......@@ -240,7 +255,7 @@ function exportCustom(){
if(!document.getElementById('liaisonsFacultatives').checked) fac=0;
// Mémorisation taille des espaces
var spaceLen = getComputedStyle(document.documentElement).getPropertyValue('--space').replace('em','')*10;
var spaceLen = getComputedStyle(document.documentElement).getPropertyValue('--space');
// Génération du lien
var params = [];
......@@ -249,7 +264,10 @@ function exportCustom(){
if(bicol) params.push('bic');
if(mnc) params.push('mnc');
if(obl==0 || fac==0) params.push('lia'+String(obl)+String(fac));
if(spaceLen!="normal") params.push('spa'+spaceLen);
if(spaceLen!="normal") {
spaceLen = spaceLen.replace(/em/,'')*10;
params.push('spa'+spaceLen);
}
if(defaultBg == "white") params.push('bgw');
if(thisRegion!="FR") params.push('reg'+thisRegion);
......
:root {
--phon_bicolor1: #ff0000;
--phon_bicolor2: #40b9ff;
--phon_bicolorWhite1: #ff0000;
--phon_bicolorWhite2: #00a2ff;
--phon_o_maj_nas: #7f2a18;
--phon_1: #505050;
--phon_2: #c9004d;
--phon_4: #c3ffff;
--phon_7: #B6DB5A;
--phon_9: #ea6b76;
--phon_9_nas: #f89f7d;
--phon_a_maj: #922289;
--phon_a: #ffffff;
--phon_arob_rho: #ffcc99;
--phon_arobase: #fef200;
--phon_a_maj_nas: #f3bbcd;
--phon_b: #156b5e;
--phon_b_maj: #f87407;
--phon_d: #0c843d;
--phon_d_maj: #d65c81;
--phon_e: #44a1ca;
--phon_e_maj: #01b49e;
--phon_e_maj_nas: #597fbf;
--phon_f: #a897b7;
--phon_g: #929896;
--phon_x: #dcede7;
--phon_h_maj: #ffeba2;
--phon_i: #e60004;
--phon_i_maj: #e7236d;
--phon_j: #f591ad;
--phon_k: #feae21;
--phon_k_h: #ff3399;
--phon_l: #007ab6;
--phon_m_maj: #23e915;
--phon_m: #ed5128;
--phon_n_maj: #586329;
--phon_n: #656ea7;
--phon_o: #a64b00;
--phon_o_maj: #bc7b5e;
--phon_p: #90312f;
--phon_p_bilab: #e8ea2d;
--phon_p_h: #00cccc;
--phon_r_maj: #ee863f;
--phon_r_retr: #8C9194;
--phon_s_maj: #019bcf;
--phon_s: #6eab2c;
--phon_s_alvpal: #ffbe86;
--phon_s_retr: #00ffff;
--phon_t: #bb2970;
--phon_t_maj: #e9ea8c;
--phon_t_h: #ffff00;
--phon_u: #007b4e;
--phon_u_maj: #ae9a91;
--phon_v: #9a8d1b;
--phon_w: #7acabf;
--phon_y: #e8bb85;
--phon_z_maj: #126293;
--phon_z: #aa4581;
--phon_z_alvpal: #7fe9ab;
--phon_z_retr: #3333ff;
--phon_neutre: #cccccc;
}
svg {
background-color: black;
}
.null {fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-opacity:1} /*rectangle vide*/
.phon_neutre {fill: var(--phon_neutre); color: var(--phon_neutre);} /*ponctuation etc.*/
.phon_inconnu {fill: var(--phon_neutre); color: var(--phon_neutre);} /* mots inconnus */
.phon_echec {fill: var(--phon_neutre); color: var(--phon_neutre);} /* mots non alignable */
.phon_o_maj_nas { fill: var(--phon_o_maj_nas); color: var(--phon_o_maj_nas);} /*ɔ̃*/
.phon_1 { fill: var(--phon_1); color: var(--phon_1);} /*ɨ*/
.phon_2 { fill: var(--phon_2); color: var(--phon_2);} /*ø*/
.phon_4 { fill: var(--phon_4); color: var(--phon_4);} /*ɾ*/
.phon_7 { fill: var(--phon_7); color: var(--phon_7);} /*ɤ*/
.phon_9 { fill: var(--phon_9); color: var(--phon_9);} /*œ*/
.phon_9_nas { fill: var(--phon_9_nas); color: var(--phon_9_nas);} /*œ̃*/
.phon_a_maj { fill: var(--phon_a_maj); color: var(--phon_a_maj);} /*ɑ*/
.phon_a { fill: var(--phon_a); color: var(--phon_a);}
.phon_arob_rho{fill: var(--phon_arob_rho); color: var(--phon_arob_rho);} /*ɚ @\*/
.phon_arobase {fill: var(--phon_arobase); color: var(--phon_arobase);} /*ə*/
.phon_a_maj_nas { fill: var(--phon_a_maj_nas); color: var(--phon_a_maj_nas);} /*ɑ̃*/
.phon_b { fill: var(--phon_b); color: var(--phon_b);}
.phon_b_maj { fill: var(--phon_b_maj); color: var(--phon_b_maj);} /*β*/
.phon_d { fill: var(--phon_d); color: var(--phon_d);}
.phon_d_maj { fill: var(--phon_d_maj); color: var(--phon_d_maj);} /*ð*/
.phon_e { fill: var(--phon_e); color: var(--phon_e);}
.phon_e_maj { fill: var(--phon_e_maj); color: var(--phon_e_maj);} /*ɛ*/
.phon_e_maj_nas { fill: var(--phon_e_maj_nas); color: var(--phon_e_maj_nas);} /*ɛ̃*/
.phon_f { fill: var(--phon_f); color: var(--phon_f);}
.phon_g { fill: var(--phon_g); color: var(--phon_g);}
.phon_x { fill: var(--phon_x); color: var(--phon_x);}
.phon_h_maj { fill: var(--phon_h_maj); color: var(--phon_h_maj);} /*ɥ*/
.phon_i { fill: var(--phon_i); color: var(--phon_i);}
.phon_i_maj { fill: var(--phon_i_maj); color: var(--phon_i_maj);} /*ɪ*/
.phon_j { fill: var(--phon_j); color: var(--phon_j);}
.phon_k { fill: var(--phon_k); color: var(--phon_k);}
.phon_k_h { fill: var(--phon_k_h); color: var(--phon_k_h);} /*kʰ*/
.phon_l { fill: var(--phon_l); color: var(--phon_l);}
.phon_m_maj { fill: var(--phon_m_maj); color: var(--phon_m_maj);} /*ɯ*/
.phon_m { fill: var(--phon_m); color: var(--phon_m);}
.phon_n_maj { fill: var(--phon_n_maj); color: var(--phon_n_maj);} /*ŋ*/
.phon_n { fill: var(--phon_n); color: var(--phon_n);}
.phon_o { fill: var(--phon_o); color: var(--phon_o);}
.phon_o_maj { fill: var(--phon_o_maj); color: var(--phon_o_maj);} /*ɔ*/
.phon_p { fill: var(--phon_p); color: var(--phon_p);}