mesdan
Version:
Latinî mesdan ile Osmanî metin yazmak için hazırlanmış bir alettir.
210 lines (209 loc) • 10.6 kB
JavaScript
import { useEffect, useRef, useState } from "react";
import { harfBüyükMü } from "../aletler/harf-buyuk-mu";
import { tebdilAlemMevkisiniMenzilIle } from "../aletler/tebdil-alem-mevkisini";
import { hazırlaAlemMevkisini, hazırlaAlemMevkisiniMenzilli } from "../nev/alem-mevkisi";
import { TadiliMetinEmri } from "../nev/tadili-metin-emri";
import { Talimat_MetniTadilEt } from "../nuve/tadil-et-metni";
export const useMesdan = ({ ibtidaiMetin = "", tekSatırMı, latiniMi = false, aramaTalepEdilince, }) => {
const [yenilemeİbresi, tebdilYenilemeİbresi] = useState(0);
const [metin, tebdilMetin] = useState(ibtidaiMetin);
const metinSahasıİması = useRef(null);
const alemMevkisiİması = useRef(hazırlaAlemMevkisini(ibtidaiMetin.length));
// const harekeTuşlarıFaalMi = useRef<boolean>(false);
const tebdilLatiniAramaMı = (_latiniMi) => {
latiniMi = _latiniMi;
};
useEffect(() => {
if (latiniMi)
return;
let metinSahası = metinSahasıİması.current;
if (!metinSahası)
return;
metinSahası.setAttribute("spellcheck", "false");
metinSahası.setAttribute("autocorrect", "off");
metinSahası.setAttribute("autocapitalize", "off");
metinSahası.setAttribute("autocomplete", "off");
if (tekSatırMı) {
metinSahası.setAttribute("enterkeyhint", "done");
// metinSahası.setAttribute("type", "search");
}
// Sahne hazır olduktan sonra alemin mevkilenmesi için
tebdilAlemMevkisiniMenzilIle(metinSahası, alemMevkisiİması.current.başMevki, alemMevkisiİması.current.sonMevki, true);
let alemMevkisiBaşı = metinSahası.selectionStart || 0;
let alemMevkisiSonu = metinSahası.selectionEnd || 0;
const tuşaBasılıncaFizikiMesdan = async (hadise) => {
// console.log("tuşaBasılıncaFizikiMesdan > keydown");
hadise.preventDefault();
hadise.stopPropagation();
// console.log("Hadise> Key: -" + hadise.key + "-");
// console.log("Hadise> Code: -" + hadise.code + "-");
const metin = metinSahası.value;
alemMevkisiBaşı = metinSahası.selectionStart || 0;
alemMevkisiSonu = metinSahası.selectionEnd || 0;
const alemMevkisi = hazırlaAlemMevkisiniMenzilli(alemMevkisiBaşı, alemMevkisiSonu);
const mesHadisesi = {
latiniHarf: hadise.key,
shiftBasılıMı: hadise.shiftKey,
altBasılıMı: hadise.altKey,
capsLockBasılıMı: harfBüyükMü(hadise.key),
};
// arama 1.2.0 kademesinde hazır değildi, sonradan hazırladım
let tadiliMetinEmri = TadiliMetinEmri.EKLE;
if (tekSatırMı && hadise.key === "Enter") {
tadiliMetinEmri = TadiliMetinEmri.ARA;
if (aramaTalepEdilince) {
aramaTalepEdilince();
}
return;
}
else if (!tekSatırMı && hadise.key === "Enter") {
tadiliMetinEmri = TadiliMetinEmri.EKLE;
mesHadisesi.latiniHarf = "\n";
}
else if (hadise.key === "Delete") {
tadiliMetinEmri = TadiliMetinEmri.SİL_AHİRDEN;
}
else if (hadise.key === "Backspace") {
tadiliMetinEmri = TadiliMetinEmri.SİL_EVVELDEN;
}
else if (hadise.key === "ArrowRight") {
tadiliMetinEmri = TadiliMetinEmri.ALEM_SAĞA;
}
else if (hadise.key === "ArrowLeft") {
tadiliMetinEmri = TadiliMetinEmri.ALEM_SOLA;
}
else if (hadise.key === "ArrowUp") {
tadiliMetinEmri = TadiliMetinEmri.ALEM_YUKARI;
}
else if (hadise.key === "ArrowDown") {
tadiliMetinEmri = TadiliMetinEmri.ALEM_AŞAĞI;
}
else if (hadise.ctrlKey) {
if (hadise.key.toLowerCase() === "c") {
tadiliMetinEmri = TadiliMetinEmri.TENSİH;
}
else if (hadise.key.toLowerCase() === "x") {
tadiliMetinEmri = TadiliMetinEmri.KES;
}
else if (hadise.key.toLowerCase() === "v") {
tadiliMetinEmri = TadiliMetinEmri.YAPIŞTIR;
}
else {
tadiliMetinEmri = TadiliMetinEmri.BOŞ;
}
}
else if (hadise.key === "Shift") {
tadiliMetinEmri = TadiliMetinEmri.BOŞ;
}
else if (hadise.key === "Alt") {
tadiliMetinEmri = TadiliMetinEmri.BOŞ;
}
else if (hadise.key === "AltGraph") {
tadiliMetinEmri = TadiliMetinEmri.BOŞ;
}
else if (hadise.key === "Meta") {
tadiliMetinEmri = TadiliMetinEmri.BOŞ;
}
else if (hadise.key === "Tab") {
tadiliMetinEmri = TadiliMetinEmri.BOŞ;
}
else if (hadise.key === "CapsLock") {
tadiliMetinEmri = TadiliMetinEmri.BOŞ;
}
else if (hadise.key === "Dead") {
tadiliMetinEmri = TadiliMetinEmri.BOŞ;
}
const netice = await Talimat_MetniTadilEt(metinSahası, metin, alemMevkisi, tadiliMetinEmri, mesHadisesi, true);
// console.log("netice: " + JSON.stringify(netice));
alemMevkisiİması.current = netice.alemMevkisiTadilSonrası;
tebdilMetin(netice.metinTadilSonrası);
// Alemin sağa, sola, aşağı ve yukarı hareketi için lazım
tebdilAlemMevkisiniMenzilIle(metinSahası, netice.alemMevkisiTadilSonrası.başMevki, netice.alemMevkisiTadilSonrası.sonMevki, true);
if (netice.sahneYenidenÇizilsinMi) {
tebdilYenilemeİbresi((ibre) => ibre + 1);
}
};
const tuşaBasılıncaSuniMesdan = async (hadise) => {
// console.log("tuşaBasılıncaSuniMesdan > input");
hadise.preventDefault(); // Here event.preventDefault doesn't stop user from typing
hadise.stopPropagation();
const metinHadisesi = hadise;
let harf = "";
if (metinHadisesi.data !== null) {
harf = metinHadisesi.data;
}
// console.log("Hadise> data: -" + harf + "- -" + harf.slice(-1) + "-");
// console.log("Hadise> inputType: -" + metinHadisesi.inputType + "-");
const mesHadisesi = {
// latiniHarf: harf,
latiniHarf: harf.replace(". ", " "),
// latiniHarf: harf.slice(-1),
shiftBasılıMı: false,
altBasılıMı: false,
capsLockBasılıMı: harfBüyükMü(harf),
};
let tadiliMetinEmri = TadiliMetinEmri.EKLE; // insertText
if (tekSatırMı && metinHadisesi.inputType === "Enter") {
tadiliMetinEmri = TadiliMetinEmri.ARA;
}
else if (!tekSatırMı && metinHadisesi.inputType === "insertLineBreak") {
mesHadisesi.latiniHarf = "\n";
tadiliMetinEmri = TadiliMetinEmri.EKLE;
}
else if (metinHadisesi.inputType === "deleteContentBackward") {
tadiliMetinEmri = TadiliMetinEmri.SİL_EVVELDEN;
}
else if (metinHadisesi.inputType === "deleteByCut") {
tadiliMetinEmri = TadiliMetinEmri.KES;
}
else if (metinHadisesi.inputType === "insertFromPaste") {
tadiliMetinEmri = TadiliMetinEmri.YAPIŞTIR;
}
const metin = metinSahası.value;
const alemMevkisi = hazırlaAlemMevkisiniMenzilli(alemMevkisiBaşı, alemMevkisiSonu);
const netice = await Talimat_MetniTadilEt(metinSahası, metin, alemMevkisi, tadiliMetinEmri, mesHadisesi, false);
alemMevkisiİması.current = netice.alemMevkisiTadilSonrası;
tebdilMetin(netice.metinTadilSonrası);
if (netice.sahneYenidenÇizilsinMi) {
tebdilYenilemeİbresi((ibre) => ibre + 1);
}
};
const tuşaBasılıncaEvveliSuniMesdan = (hadise) => {
// console.log("tuşaBasılıncaEvveliSuniMesdan > beforeinput");
alemMevkisiBaşı = metinSahası.selectionStart || 0;
alemMevkisiSonu = metinSahası.selectionEnd || 0;
};
const metinYapıştırmaTalebinde = async (hadise) => {
hadise.preventDefault();
const mesHadisesi = {
latiniHarf: "",
shiftBasılıMı: false,
altBasılıMı: false,
capsLockBasılıMı: false,
};
alemMevkisiBaşı = metinSahası.selectionStart || 0;
alemMevkisiSonu = metinSahası.selectionEnd || 0;
const metin = metinSahası.value;
const alemMevkisi = hazırlaAlemMevkisiniMenzilli(alemMevkisiBaşı, alemMevkisiSonu);
const tadiliMetinEmri = TadiliMetinEmri.YAPIŞTIR;
const netice = await Talimat_MetniTadilEt(metinSahası, metin, alemMevkisi, tadiliMetinEmri, mesHadisesi, true);
alemMevkisiİması.current = netice.alemMevkisiTadilSonrası;
tebdilMetin(netice.metinTadilSonrası);
};
if (window.matchMedia("(pointer: coarse)").matches) {
metinSahası.addEventListener("beforeinput", tuşaBasılıncaEvveliSuniMesdan, false);
metinSahası.addEventListener("input", tuşaBasılıncaSuniMesdan, false);
}
else {
metinSahası.addEventListener("keydown", tuşaBasılıncaFizikiMesdan, false);
metinSahası.addEventListener("paste", metinYapıştırmaTalebinde, false);
}
return () => {
metinSahası.removeEventListener("keydown", tuşaBasılıncaFizikiMesdan);
metinSahası.removeEventListener("beforeinput", tuşaBasılıncaEvveliSuniMesdan);
metinSahası.removeEventListener("input", tuşaBasılıncaSuniMesdan);
metinSahası.removeEventListener("paste", tuşaBasılıncaSuniMesdan);
};
}, [metin, yenilemeİbresi, metinSahasıİması.current, latiniMi]);
return [metin, metinSahasıİması, tebdilMetin, tebdilLatiniAramaMı];
};