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'zgarmadiconvertToNew(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 |
|---|---|
| ishoq | Is'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 turi | Misol |
|---|---|
| URL | https://example.com/Shop |
| shukur@example.uz | |
| Kod bloki (fenced) | ```js\nconst x = 1;\n``` |
| Inline kod | `ShoppingCart` |
| HTML teg + atributlar | <div className="rounded-full"> |
| Front-matter | Fayl 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:4321Parametrlar
npx @imlogram/cli migrate [papka] [--to=new|old] [--port=4321]| Parametr | Standart | Tavsif |
|---|---|---|
| papka | . | Qaysi papkani skanerlaş kerak |
| --to | new | new — eski→yangi, old — yangi→eski |
| --port | 4321 | Lokal 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:
- examples/html — oddiy HTML+JS sahifa, heç qanday build vositasisiz
- examples/react — React + Vite loyihasi
Havolalar
- Manba kod: github.com/imlogram/imlogram
- npm: @imlogram/core · @imlogram/parser · @imlogram/cli
- Muammo haqida xabar beriş: GitHub Issues