1 个不稳定版本

0.1.0 2024 年 5 月 30 日

#377 in 文本处理

MIT 许可证

295KB
10K SLoC

Rust 9K SLoC // 0.0% comments Python 743 SLoC // 0.1% comments JavaScript 309 SLoC // 0.1% comments Shell 10 SLoC // 0.3% comments

vidyut-lipi

印地语转写器

vidyut-lipi 是一个梵文和巴利文转写库,也支持印地语区域使用的大多数脚本。我们的目标是提供一个易于绑定到其他编程语言的标准化转写器。

这个 crate 是 Ambuda 项目的一部分,目前处于积极开发中。如果您喜欢我们的工作并希望为它做出贡献,我们鼓励您 加入我们的 Discord 服务器,在那里您可以与其他梵文程序员和爱好者见面。

在线演示在此 这里

概述

世界各地的人们在不同的环境中使用不同的脚本书写梵文和其他印地语。例如,一个用户可能在 ITRANS 中输入梵文,在卡纳达语中阅读它,并在天城文中发布它。这样的社区通常依赖于一个 转写器,将文本从一种编码方案转换为另一种。

虽然存在各种转写器,但没有一个是高质量且在不同编程语言中广泛可用的。结果是,维护和功能工作分散在多个不同的实现中。

vidyut-lipi 的目标是为梵文生态系统提供一个标准转写器。我们的优先事项包括

  • 质量,包括一个全面的测试套件。
  • 跨常用方案的测试覆盖率。
  • 精确且易用的 API。
  • 在多种语言中的可用性,包括 Python 和 WebAssembly。
  • 在多个指标上的高性能,包括运行时间、启动时间和文件大小。

如果您发现 vidyut-lipi 不支持您的用例,请 提交一个问题。我们特别热衷于支持新的脚本和新的编程语言。

《vidyut-lipi》的替代方案

针对《vidyut-lipi》有两大主要替代方案,它们都对我们的整体设计产生了重要影响

  • Aksharamukha 提供高质量支持超过一百种不同的文字脚本。Aksharamukha 提供了业界领先的转写功能,但仅限于 Python。

  • indic-transliteration 在多种编程语言中实现了相同的基本转写器。indic-transliteration 支持广泛的软件生态系统,但其不同的实现各有其特点和局限性。

我们的长期目标是结合 Aksharamukha 的质量和 indic-transliteration 的可用性。在此之前,《vidyut-lipi》提供以下短期好处

  • 为 Rust 和 WebAssembly 提供高质量的转写。
  • 通过如 pyo3(Python)、magnus(Ruby)、cxx(C++)等项目,为其他编程语言提供流畅的支持。

用法

我们建议通过我们的 Lipika API 使用 vidyut-lipi

use vidyut_lipi::{Lipika, Scheme};

// `Lipika` must be `mut` since its method calls mutate its internal cache.
let mut lipika = Lipika::new();

let result = lipika.transliterate("saMskRtam", Scheme::HarvardKyoto, Scheme::Devanagari);
assert_eq!(result, "संस्कृतम्");

您还可以使用 detect 来检测一段文本可能使用哪种 Scheme

use vidyut_lipi::{Lipika, Scheme, detect};

let some_text = "संस्कृतम्";
let detected = detect(&some_text).unwrap_or(Scheme::HarvardKyoto);

let mut lipika = Lipika::new();
let result = lipika.transliterate(some_text, detected, Scheme::HarvardKyoto);
assert_eq!(result, "saMskRtam");

要获取所有可用 Scheme 的列表,可以使用 Scheme::iter()

use vidyut_lipi::{Lipika, Scheme, detect};

let mut lipika = Lipika::new();
for scheme in Scheme::iter() {
  let result = lipika.transliterate("saMskRtam", Scheme::HarvardKyoto, *scheme);
  println!("{:15} {result}", format!("{:?}", scheme));
}

截至 2024-01-27,此代码将打印以下内容

Balinese        ᬲᬂᬲ᭄ᬓᬺᬢᬫ᭄
BarahaSouth     saMskRutam
Bengali         সংস্কৃতম্
Brahmi          𑀲𑀁𑀲𑁆𑀓𑀾𑀢𑀫𑁆
Burmese         သံသ်ကၖတမ်
Devanagari      संस्कृतम्
Grantha         𑌸𑌂𑌸𑍍𑌕𑍃𑌤𑌮𑍍
Gujarati        સંસ્કૃતમ્
Gurmukhi        ਸਂਸ੍ਕਤਮ੍
HarvardKyoto    saMskRtam
Iast            saṃskṛtam
Iso15919        saṁskr̥tam
Itrans          saMskRRitam
Javanese        ꦱꦁꦱ꧀ꦏꦽꦠꦩ꧀
Kannada         ಸಂಸ್ಕೃತಮ್
Khmer           សំស្ក្ឫតម៑
Malayalam       സംസ്കൃതമ്
Modi            𑘭𑘽𑘭𑘿𑘎𑘵𑘝𑘦𑘿
Newa            𑐳𑑄𑐳𑑂𑐎𑐺𑐟𑐩𑑂
Odia            ସଂସ୍କୃତମ୍
Saurashtra      ꢱꢀꢱ꣄ꢒꢺꢡꢪ꣄
Sharada         𑆱𑆁𑆱𑇀𑆑𑆸𑆠𑆩𑇀
Siddham         𑖭𑖽𑖭𑖿𑖎𑖴𑖝𑖦𑖿
Sinhala         සංස්කෘතම්
Slp1            saMskftam
Tamil           ஸம்ʼஸ்க்ருʼதம்
Telugu          సంస్కృతమ్
Thai            สํสฺกฺฤตมฺ
Tibetan         སཾསྐྲྀཏམ
Tirhuta         𑒮𑓀𑒮𑓂𑒏𑒵𑒞𑒧𑓂
Velthuis        sa.msk.rtam
Wx              saMskqwam

Lipika 是对 transliterate 函数的一个薄封装。我们推荐使用 Lipika,因为它为您处理了一些记账和缓存,但如果您需要更精确的控制,可以直接像这样使用 transliterate

use vidyut_lipi::{transliterate, Mapping, Scheme};

let mapping = Mapping::new(Scheme::HarvardKyoto, Scheme::Devanagari);
let result = transliterate("saMskRtam", &mapping);
assert_eq!(result, "संस्कृतम्");

依赖关系

~2.5–3.5MB
~52K SLoC