UNPKG

mesdan

Version:

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

101 lines (100 loc) 5.22 kB
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; };