UNPKG

mesdan

Version:

Latinî mesdan ile Osmanî metin yazmak için hazırlanmış bir alettir.

94 lines (93 loc) 4.84 kB
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; };