tried to code a syllabe counter into neovim

This commit is contained in:
2026-04-28 11:52:08 +02:00
parent 7022b2379f
commit 6423936957
4 changed files with 196 additions and 11 deletions
+14 -6
View File
@@ -249,11 +249,11 @@
local capabilities = require('cmp_nvim_lsp').default_capabilities()
-- Diagnostics
vim.keymap.set("n", "<leader>e1", function() vim.diagnostic.jump({ prev=true, count = 1 }) end, { desc = "Previous diagnostic" })
vim.keymap.set("n", "<leader>e2", function() vim.diagnostic.jump({ prev=false, count = 1 }) end, { desc = "Next diagnostic" })
vim.keymap.set("n", "<leader>e3", vim.diagnostic.open_float, { desc = "Show diagnostic" })
vim.keymap.set("n", "<leader>e4", vim.diagnostic.setloclist, { desc = "Diagnostic list" })
vim.keymap.set("n", "<leader>e5", vim.lsp.buf.code_action, { desc = "Show correction" })
vim.keymap.set("n", "<leader>e4", function() vim.diagnostic.jump({ prev=true, count = 1 }) end, { desc = "Previous diagnostic" })
vim.keymap.set("n", "<leader>e5", function() vim.diagnostic.jump({ prev=false, count = 1 }) end, { desc = "Next diagnostic" })
vim.keymap.set("n", "<leader>e1", vim.diagnostic.open_float, { desc = "Show diagnostic" })
vim.keymap.set("n", "<leader>e3", vim.diagnostic.setloclist, { desc = "Diagnostic list" })
vim.keymap.set("n", "<leader>e2", vim.lsp.buf.code_action, { desc = "Show correction" })
vim.keymap.set("n", "<leader>e<Tab>", function()
local clients = vim.lsp.get_clients({ name = "ltex" })
@@ -364,7 +364,8 @@
"maldoror",
"evariste",
"galois",
"arno"
"arno",
"dessacrer",
},
},
},
@@ -480,6 +481,13 @@
--==================
vim.keymap.set('n', '<leader>r1', '<cmd>Fugit2<CR>', { desc = 'Open git helper' })
vim.keymap.set("n", "t", function()
local line = vim.api.nvim_get_current_line()
local result = vim.fn.system({ "custom-syllabes" }, line)
print(vim.trim(result))
end, { desc = "Count syllables (current line)" })
-- =========================
-- telescope
-- =======================
+174
View File
@@ -0,0 +1,174 @@
/* old version
{ pkgs, python3Packages, ... }:
pkgs.writers.writePython3Bin "custom-syllabes" {
libraries = [
python3Packages.pyphen
];
} ''
import sys
import pyphen
dic = pyphen.Pyphen(lang="fr")
text = sys.stdin.read().strip()
chunks = []
total = 0
for w in text.split():
hyphenated = dic.inserted(w)
parts = hyphenated.split("-")
chunks.append("/".join(parts))
total += len(parts)
print(f"{total} ({'/'.join(chunks)})")
''*/
/* used IPA but had a deprecated dependency
{ pkgs, python3Packages, ... }:
pkgs.writers.writePython3Bin "custom-syllabes" {
libraries = [
python3Packages.epitran
python3Packages.setuptools
];
} ''
import sys
import epitran
import re
epi = epitran.Epitran("fra-Latn")
def count_syllables_ipa(ipa):
return len(re.findall(r"[aeiouyɑɛœɔ̃ɑ̃ɛ̃œ̃]", ipa))
text = sys.stdin.read().strip()
total = 0
chunks = []
for word in text.split():
ipa = epi.transliterate(word)
syllables = count_syllables_ipa(ipa)
total += syllables
chunks.append(f"{word}/{ipa}")
print(f"{total} ({' | '.join(chunks)})")
''*/
{ pkgs, ... }:
let
lexique = pkgs.fetchurl {
url = "http://www.lexique.org/databases/Lexique383/Lexique383.tsv";
sha256 = "sha256-Y3ujenZ6ZmecSDcdZz7OUMv1QbSaTkDlmJY9Tz+85Ss=";
};
in
pkgs.writers.writePython3Bin "custom-syllabes" {
libraries = [ pkgs.python3Packages.pandas ];
} ''
import os
import sys
import pandas as pd
import re
# ----------------------------
# Load Lexique383
# ----------------------------
LEX_PATH = os.environ.get(
"LEXIQUE_PATH",
"${lexique}"
)
df = pd.read_csv(LEX_PATH, sep="\t", low_memory=False)
lex = dict(zip(df["ortho"].str.lower(), df["phon"]))
# ----------------------------
# phoneme-based syllabification
# ----------------------------
VOWELS = set([
"a", "e", "ɛ", "ə", "i", "o", "ɔ", "u", "y",
"ɑ̃", "ɛ̃", "ɔ̃", "œ̃"
])
def is_vowel(ph):
return any(v in ph for v in VOWELS)
def syllabify_phonemes(phonemes):
syllables = []
cur = ""
for p in phonemes:
cur += p
if is_vowel(p):
syllables.append(cur)
cur = ""
if cur and syllables:
syllables[-1] += cur
elif cur:
syllables.append(cur)
return syllables
# ----------------------------
# poetic adjustment (basic)
# ----------------------------
def apply_rules(word, phon, syllables):
# e muet at end (very rough heuristic)
if phon.endswith("ə") or phon.endswith("e"):
if len(syllables) > 1:
syllables = syllables[:-1]
return syllables
# ----------------------------
# main counter
# ----------------------------
def count_word(word):
w = re.sub(r"[^a-zàâçéèêëîïôûùœæ']", "", word.lower())
if not w:
return 0, []
phon = lex.get(w)
if not phon:
# fallback heuristic
syls = re.findall(r"[aeiouyàâéèêëîïôûùœæ]+", w)
return len(syls), syls
phonemes = phon.split()
syls = syllabify_phonemes(phonemes)
syls = apply_rules(w, phon, syls)
return len(syls), syls
def main():
text = sys.stdin.read().strip()
total = 0
out = []
for w in text.split():
c, syls = count_word(w)
total += c
if syls:
out.append("/".join(syls))
print(f"{total} ({' '.join(out)})")
if __name__ == "__main__":
main()
''