mesdan
Version:
Latinî mesdan ile Osmanî metin yazmak için hazırlanmış bir alettir.
101 lines (100 loc) • 5.22 kB
JavaScript
import { hazırlaAlemMevkisini } from "../nev/alem-mevkisi";
const cüzleyici = new Intl.Segmenter("ar", { granularity: "grapheme" });
function metinCüzleriniAl(metin) {
return Array.from(cüzleyici.segment(metin), (cüzMutası) => cüzMutası.segment);
}
function bulEvvelkiMetinpareninBaşını(text, index) {
let cüzler = Array.from(cüzleyici.segment(text));
let pos = 0;
for (let i = 0; i < cüzler.length; i++) {
if (cüzler[i].index === index) {
return i > 0 ? cüzler[i - 1].index : 0;
}
else if (cüzler[i].index > index) {
return cüzler[i - 1]?.index ?? 0;
}
}
return cüzler[cüzler.length - 1]?.index ?? 0;
}
function bulSonrakiMetinpareninBaşını(text, index) {
let cüzler = Array.from(cüzleyici.segment(text));
for (let i = 0; i < cüzler.length; i++) {
if (cüzler[i].index > index) {
return cüzler[i].index;
}
}
return text.length;
}
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
export const kaydirAlemiSağa = (mevcudMetin, alemMevkisi) => {
const yeniMevki = bulEvvelkiMetinpareninBaşını(mevcudMetin, alemMevkisi.başMevki);
return hazırlaAlemMevkisini(yeniMevki);
};
export const kaydirAlemiSola = (mevcudMetin, alemMevkisi) => {
const yeniMevki = bulSonrakiMetinpareninBaşını(mevcudMetin, alemMevkisi.başMevki);
return hazırlaAlemMevkisini(yeniMevki);
};
export const kaydirAlemiYukarı = (mevcudMetin, alemMevkisi) => {
const satırlar = mevcudMetin.replace(/\r\n/g, "\n").split("\n");
let metinBaşındanMesafe = 0;
for (let i = 0; i < satırlar.length; i++) {
const satır = satırlar[i];
const satırGeni = satır.length;
const satırBaşı = metinBaşındanMesafe;
const satırSonu = metinBaşındanMesafe + satırGeni;
if (alemMevkisi.başMevki >= satırBaşı && alemMevkisi.başMevki <= satırSonu) {
if (i === 0)
return hazırlaAlemMevkisini(0);
const cüzler = Array.from(cüzleyici.segment(satır));
const aleminSatırİçiMevkii = alemMevkisi.başMevki - satırBaşı;
const aleminSatırdakiMevkii = (() => {
const ibre = cüzler.findIndex((cüzMutası) => cüzMutası.index >= aleminSatırİçiMevkii);
if (ibre === -1 && aleminSatırİçiMevkii === satır.length) {
return cüzler.length;
}
return ibre === -1 ? 0 : ibre;
})();
const evvelkiSatır = satırlar[i - 1];
const evvelkiSatırınMetinpareleri = metinCüzleriniAl(evvelkiSatır);
const evvelkiSatırdakiYeniMevki = Math.min(aleminSatırdakiMevkii, evvelkiSatırınMetinpareleri.length);
const yeniMetinBaşındanMesafe = satırlar.slice(0, i - 1).reduce((yekun, satır) => yekun + satır.length + 1, 0); // \n sebebiyle +1
const yeniMetinpareMesafesi = evvelkiSatırınMetinpareleri.slice(0, evvelkiSatırdakiYeniMevki).join("").length;
return hazırlaAlemMevkisini(yeniMetinBaşındanMesafe + yeniMetinpareMesafesi);
}
metinBaşındanMesafe += satırGeni + 1;
}
return alemMevkisi;
};
export const kaydirAlemiAşağı = (mevcudMetin, alemMevkisi) => {
const satırlar = mevcudMetin.replace(/\r\n/g, "\n").split("\n");
let metinBaşındanMesafe = 0;
for (let i = 0; i < satırlar.length; i++) {
const satır = satırlar[i];
const satırGeni = satır.length;
const satırBaşı = metinBaşındanMesafe;
const satırSonu = metinBaşındanMesafe + satırGeni;
if (alemMevkisi.başMevki >= satırBaşı && alemMevkisi.başMevki <= satırSonu) {
if (i === satırlar.length - 1) {
return hazırlaAlemMevkisini(mevcudMetin.length);
}
const cüzler = Array.from(cüzleyici.segment(satır));
const aleminSatırİçiMevkii = alemMevkisi.başMevki - satırBaşı;
const aleminSatırdakiMevkii = (() => {
const ibre = cüzler.findIndex((cüzMutası) => cüzMutası.index >= aleminSatırİçiMevkii);
if (ibre === -1 && aleminSatırİçiMevkii === satır.length) {
return cüzler.length;
}
return ibre === -1 ? 0 : ibre;
})();
const sonrakiSatır = satırlar[i + 1];
const sonrakiSatırınMetinpareleri = metinCüzleriniAl(sonrakiSatır);
const sonrakiSatırdakiYeniMevki = Math.min(aleminSatırdakiMevkii, sonrakiSatırınMetinpareleri.length);
const yeniMetinBaşındanMesafe = satırlar.slice(0, i + 1).reduce((yekun, satır) => yekun + satır.length + 1, 0); // \n sebebiyle +1
const yeniMetinpareMesafesi = sonrakiSatırınMetinpareleri.slice(0, sonrakiSatırdakiYeniMevki).join("").length;
return hazırlaAlemMevkisini(yeniMetinBaşındanMesafe + yeniMetinpareMesafesi);
}
metinBaşındanMesafe += satırGeni + 1;
}
return alemMevkisi;
};