mesdan
Version:
Latinî mesdan ile Osmanî metin yazmak için hazırlanmış bir alettir.
94 lines (93 loc) • 4.84 kB
JavaScript
import { hazırlaAlemMevkisini } from '../../nevi/alem-mevkisi';
const cüzleyici = new Intl.Segmenter('ar', { granularity: 'grapheme' });
function metinCüzleriniAl(metin) {
return Array.from(cüzleyici.segment(metin));
}
function bulBaşrakiMetinpareninBaşı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 = bulBaşrakiMetinpareninBaşı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 mevzuSatır = satırlar[i];
const mevzuSatırGeni = mevzuSatır.length;
const mevzuSatırBaşı = metinBaşındanMesafe;
const mevzuSatırSonu = mevzuSatırBaşı + mevzuSatırGeni;
if (alemMevkisi.başMevki >= mevzuSatırBaşı && alemMevkisi.başMevki <= mevzuSatırSonu) {
if (i === 0)
return hazırlaAlemMevkisini(0);
const mevzuSatırdaAleminMevkii = alemMevkisi.başMevki - mevzuSatırBaşı;
const başrakiSatır = satırlar[i - 1];
const mevzuSatırCüzleri = metinCüzleriniAl(mevzuSatır);
const başrakiSatırCüzleri = metinCüzleriniAl(başrakiSatır);
let ibreCüz = mevzuSatırCüzleri.findIndex(cüz => cüz.index >= mevzuSatırdaAleminMevkii);
if (ibreCüz === -1)
ibreCüz = mevzuSatırCüzleri.length;
const ibreCüzYeni = Math.min(ibreCüz, başrakiSatırCüzleri.length);
const başrakiSatırBaşı = mevzuSatırBaşı - (başrakiSatır.length + 1);
const başrakiSatırdaAleminMevkii = başrakiSatırCüzleri.slice(0, ibreCüzYeni).reduce((yekun, cüz) => yekun + cüz.segment.length, 0);
const aleminYeniMevkii = hazırlaAlemMevkisini(başrakiSatırBaşı + başrakiSatırdaAleminMevkii);
return aleminYeniMevkii;
}
metinBaşındanMesafe += mevzuSatı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 mevzuSatır = satırlar[i];
const mevzuSatırGeni = mevzuSatır.length;
const mevzuSatırBaşı = metinBaşındanMesafe;
const mevzuSatırSonu = metinBaşındanMesafe + mevzuSatırGeni;
if (alemMevkisi.başMevki >= mevzuSatırBaşı && alemMevkisi.başMevki <= mevzuSatırSonu) {
if (i === satırlar.length - 1) {
return hazırlaAlemMevkisini(mevcudMetin.length);
}
const mevzuSatırdaAleminMevkii = alemMevkisi.başMevki - mevzuSatırBaşı;
const sonrakiSatır = satırlar[i + 1];
const sonrakiSatırınCüzleri = metinCüzleriniAl(sonrakiSatır);
const mevzuSatırınCüzleri = metinCüzleriniAl(mevzuSatır);
let ibreCüz = mevzuSatırınCüzleri.findIndex(c => c.index >= mevzuSatırdaAleminMevkii);
if (ibreCüz === -1)
ibreCüz = mevzuSatırınCüzleri.length;
const ibreCüzYeni = Math.min(ibreCüz, sonrakiSatırınCüzleri.length);
const sonrakiSatırBaşı = mevzuSatırSonu + 1;
const sonrakiSatırdaAleminMevkii = sonrakiSatırınCüzleri.slice(0, ibreCüzYeni).reduce((yekun, cüz) => yekun + cüz.segment.length, 0);
return hazırlaAlemMevkisini(sonrakiSatırBaşı + sonrakiSatırdaAleminMevkii);
}
metinBaşındanMesafe += mevzuSatırGeni + 1;
}
return alemMevkisi;
};