imlogram.uz

Hujjatlar

Uç oçiq kodli npm paketi: @imlogram/core, @imlogram/parser va @imlogram/cli. Barçasi şu yerda örnatiş, API va misollar bilan tuşuntirilgan.

Örnatiş

Kerakli paketni tanlab örnating:

pnpm add @imlogram/core       # konvertatsiya, aniqlaş, statistika
pnpm add @imlogram/parser     # segmentatsiya (core şu ustiga qurilgan)
npx @imlogram/cli migrate .   # loyihadagi kod fayllarini ötkaziş

Node.js, brauzer va Edge runtime'larning (Cloudflare Workers, Vercel Edge) barçasida bir xil işlaydi — heç qanday runtime-specific boğliqlik yöq.

@imlogram/core

Eski va yangi lotin alifbosi hamda kirilça orasida konvertatsiya, aniqlaş va statistika mantiği. Kod bloklari, URL, email va HTML struktura içidagi matnga heç qaçon tegmaydi — bu himoyani @imlogram/parser ta'minlaydi.

Tezkor boşlaş

import { convertToNew, convertToOld, detect, getStatistics } from "@imlogram/core";

convertToNew("Bu shahar juda chiroyli va go'zal.").text;
// "Bu şahar juda çiroyli va gözal."

convertToOld("Bu şahar juda çiroyli va gözal.").text;
// "Bu shahar juda chiroyli va go'zal."

detect("Bu shahar juda gözal.");
// { classification: "mixed", confidence: 0.5, segments: [...] }

Kod bloklari va URL heç qaçon özgarmaydi:

convertToNew("Ko'ring: https://example.com/Shop va `ShoppingCart` klassi.").text;
// "Köring: https://example.com/Shop va `ShoppingCart` klassi."
//          ^ o'zgarmadi                  ^ o'zgarmadi

convertToNew(text, options?) / convertToOld(text, options?)

Eski ↔ yangi lotin alifbosi orasida konvertatsiya.

interface ConversionOptions {
  protectUrls?: boolean;   // standart: true
  protectCode?: boolean;   // standart: true
  protectHtml?: boolean;   // standart: true
}

interface ConversionResult {
  text: string;
  direction: "old_to_new" | "new_to_old" | "cyrillic_to_latin" | "latin_to_cyrillic";
  changes: Change[];   // har bir o'zgarish: { start, end, from, to, reason }
  stats: { charCount, wordCount, changedCount, readingTimeSec };
}

Muhim: yangi→eski yönaliş 100% deterministik (bitta harflik jadval). Eski→yangi yönaliş esa sh/ch digraf yoki ikkita mustaqil undoş ekanini aniqlaşi kerak — buning uçun kiçik, kengaytiriladigan istisnolar luğati işlatiladi. Standart holatda har doim digraf deb hisoblanadi; luğatga kiritilgan sözlardagina ikkita mustaqil undoş sifatida ajratiladi.

Söz (luğat kaliti)Töğri yozilişi
ishoqIs'hoq (tutuq belgisi bilan; apostrofsiz "Ishoq" ham şu qatorga tuşadi)

Bu röyxat qasddan tor tutiladi — har bir yangi söz manba (masalan lug'at yoki adabiyot misoli) bilan asoslanişi kerak, aks holda notöğri istisno haqiqiy sözlarni buzişi mumkin. Manba kod şu yerda — yana söz bilasizmi? GitHub'da issue oçing yoki PR yuboring.

convertCyrillicToLatin(text, options?) / convertLatinToCyrillic(text, options?)

Özbek kirilçasi ↔ yangi lotin alifbosi. Lotin tomoni ham eski, ham yangi skriptni qabul qiladi (shahar va şahar ikkalasi ham töğri işlaydi).

convertCyrillicToLatin("Бу шаҳар гўзал.").text;   // "Bu şahar gözal."
convertLatinToCyrillic("Bu shahar go'zal.").text;   // "Бу шаҳар гўзал."

detect(text): DetectionResult

Matn eski, yangi yoki aralaş yozuvda ekanini aniqlaydi, gap darajasida:

interface DetectionResult {
  classification: "old" | "new" | "mixed";
  confidence: number;
  segments: { start: number; end: number; classification: "old" | "new" }[];
}

getStatistics(text): LetterStatistics

getStatistics("Shahar chiroyli, bog'da o'ynayapmiz.");
// { letterCounts: { sh: 1, ch: 1, "gʻ": 1, "oʻ": 1 }, totalSpecialChars: 4 }

convertCodeToNew(sourceCode) / convertCodeToOld(sourceCode)

.ts/.tsx fayllar içidagi UI matnini konvertatsiya qiladi — özgaruvçi nomlari, import yöllari, JSX teglari va Tailwind klasslariga tegmasdan:

convertCodeToNew(`
  const [showChanges, setShowChanges] = useState(true);
  return <label placeholder="Matnni shu yerga yozing...">Kirish matni</label>;
`).text;
// showChanges — o'zgarmadi (identifikator)
// "Matnni shu yerga yozing..." → "Matnni şu yerga yozing..." (placeholder — matn)
// "Kirish matni" → "Kiriş matni" (JSX matn tuguni)

@imlogram/parser

Matnni himoyalangan zonalar (URL, email, kod bloklari, HTML teglari, front-matter) va oddiy matnga ajratadigan segmentatsiya dvigateli. @imlogram/core şu paket ustiga qurilgan — u qaysi qismlarni özgartiriş mumkinligini, qaysilarini özgartirib bölmasligini şu yerdan biladi.

Odatda bu paketni töğridan-töğri emas, @imlogram/core orqali işlatasiz. Faqat özingizning maxsus matn-qayta-işlaş vositangizni qurmoqçi bölsangiz, buni alohida işlatişingiz mumkin.

import { segment } from "@imlogram/parser";

const segments = segment("Sayt: https://example.com/Shop haqida gapiraylik.");

for (const seg of segments) {
  console.log(seg.kind, JSON.stringify(seg.raw));
}
// text  "Sayt: "
// url   "https://example.com/Shop"
// text  " haqida gapiraylik."

Manba kod fayllari (.ts/.tsx) uçun alohida rejim bor — bunda standart teskari: hamma narsa kod deb hisoblanadi, faqat tabiiy-tilga öxşagan string literal va JSX matn tugunlari "matn" deb belgilanadi:

import { segmentSourceCode } from "@imlogram/parser";

const segments = segmentSourceCode(`
  const label = "Kirish matni"; // matn — konvertatsiya qilinadi
  const className = "rounded-full px-4"; // kod-shaklidagi satr — himoyalangan
`);

Nima himoyalanadi

Zona turiMisol
URLhttps://example.com/Shop
Emailshukur@example.uz
Kod bloki (fenced)```js\nconst x = 1;\n```
Inline kod`ShoppingCart`
HTML teg + atributlar<div className="rounded-full">
Front-matterFayl boşidagi ---\n...\n--- bloki

@imlogram/cli

Skanerlaydi. Körsatadi. Siz tasdiqlaysiz. Şundan keyingina fayllarga yozadi.

Loyihangizdagi .ts/.tsx/.js/.jsx fayllarni topib, ularning içidagi tabiiy-tilga öxşagan matnlarni (@imlogram/core orqali) aniqlaydi — özgaruvçi nomlari, importlar, JSX teglari va Tailwind klasslariga tegmasdan. Keyin brauzerda lokal bir sahifa oçadi: har bir topilgan matnni körasiz, keraksizlarini bekor qilasiz, va faqat tasdiqlangan özgarişlar diskdagi fayllarga yoziladi.

npx @imlogram/cli migrate .

# Skanerlanmoqda: /path/to/loyiha
# 14 ta matn topildi (5 ta faylda).
#
# Körib çiqiş uçun brauzerda oçing: http://localhost:4321

Parametrlar

npx @imlogram/cli migrate [papka] [--to=new|old] [--port=4321]
ParametrStandartTavsif
papka.Qaysi papkani skanerlaş kerak
--tonewnew — eski→yangi, old — yangi→eski
--port4321Lokal serverning porti

Nega bu CLI kerak, sayt yetarli emasmi

imlogram.uz dagi Aylantirgiç bitta matn parçasini qabul qiladi. Bu CLI esa butun loyihani — önlab fayllarni bir yöla — skanerlab, har bir özgarişni köz bilan körib tasdiqlaş imkonini beradi, va natijani töğridan-töğri fayllaringizga yozadi. Katta kod bazasini yangi alifboga ötkaziş uçun möljallangan.

Xavfsizlik

CLI heç qanday tarmoqqa (internet) sörov yubormaydi — hammasi lokal maşinangizda, lokal serverda işlaydi. Fayllarga yozişdan oldin har doim git status/git diff bilan tekşirib çiqiş, yoki avval commit qilib oliş tavsiya etiladi (özgarişlarni qaytarib bölmaydigan holatga tuşmaslik uçun).

Nega ikki yönaliş har xil murakkablikda

Yangi → eski — sof jadval, heç qanday noaniqlik yöq: har bir yangi harf eski yozuvda faqat bitta körinişga ega. Eski → yangi esa unday emas: sh harflar birikmasi köpinça ş digrafi, lekin ba'zan (masalan Is'hoq ismida — tutuq belgisi s va h orasida) ikkita mustaqil undoş sifatida alohida talaffuz qilinadi.

Bu noaniqlikni hal qiliş uçun kiçik, qölda tuzilgan istisnolar luğati işlatiladi: standart holatda har doim digraf deb hisoblanadi, faqat luğatda röyxatga olingan sözlarda ikkita mustaqil undoş sifatida ajratiladi. Şu sababli yangi → eski yönaliş 100% deterministik, eski → yangi esa emas — bu loyihaning markaziy texnik muammosi.

Misollar

Kutubxonani haqiqiy loyihada qanday işlatişni köriş uçun ikkita mustaqil namuna loyiha bor — ikkalasi ham npm registridan çiqargan haqiqiy paketni işlatadi, workspace içidagi manba kodni emas:

Havolalar