#transliteration #localization #indic-scripts

bin+lib lipilekhika

A transliteration library for Indian Brahmic scripts

16 releases (9 stable)

Uses new Rust 2024

new 1.0.8 Apr 21, 2026
1.0.7 Mar 3, 2026
1.0.6 Feb 20, 2026
1.0.4 Jan 29, 2026
0.0.0-alpha.0 Dec 14, 2025

#376 in Text processing

Download history 4/week @ 2026-02-10 24/week @ 2026-02-17 5/week @ 2026-02-24 31/week @ 2026-03-03 49/week @ 2026-03-24 13/week @ 2026-04-14

62 downloads per month

MIT license

170KB
4.5K SLoC

Lipi Lekhika โ€” Rust

A high-performance transliteration library for Indian Brahmic scripts

crates.io crates.io Tests License: MIT

๐ŸŒ Website โ€ข ๐Ÿ“– Documentation โ€ข ๐Ÿฆ€ Crates.io โ€ข ๐Ÿ“ Changelog


โœจ Features

  • ๐Ÿ”„ Bidirectional Transliteration โ€” Convert between 15+ Indian Brahmic scripts
  • โšก High Performance โ€” Zero-overhead abstractions and optimized algorithms
  • ๐Ÿ›ก๏ธ Type Safe โ€” Leverages Rust's type system for safety and correctness
  • ๐ŸŽฏ Customizable Options โ€” Fine-tune transliteration and typing behaviour
  • โŒจ๏ธ Typing Mode โ€” Stateful context for real-time character-by-character input
  • ๐Ÿ“ฆ Embedded Script Data โ€” All script data bundled at compile time

๐Ÿ“ฅ Installation

cargo add lipilekhika

๐Ÿš€ Quick Start

Basic Transliteration

use lipilekhika::transliterate;

fn main() {
    let result = transliterate(
        "namaskAraH",
        "Normal",
        "Devanagari",
        None
    ).unwrap();
    
    println!("{}", result); // เคจเคฎเคธเฅเค•เคพเคฐเคƒ
}

With Custom Options

use lipilekhika::transliterate;
use std::collections::HashMap;

fn main() {
    let mut options = HashMap::new();
    options.insert(
        "brahmic_to_brahmic:replace_pancham_varga_varna_with_anusvAra".to_string(),
        true
    );
    
    let result = transliterate(
        "เฐ—เฐ‚เฐ—เฐพ",
        "Telugu",
        "Gujarati",
        Some(&options)
    ).unwrap();
    
    println!("{}", result); // เช—เช‚เช—เชพ (instead of เช—เช™เซเช—เชพ)
}

๐Ÿ“š API

Core Functions

transliterate

pub fn transliterate(
    text: &str,
    from: &str,
    to: &str,
    trans_options: Option<&HashMap<String, bool>>,
) -> Result<String, String>

Transliterates text from one script to another.

Parameters:

  • text โ€” Text to transliterate
  • from โ€” Source script/language name (e.g., "Normal", "Devanagari", "Telugu")
  • to โ€” Target script/language name
  • trans_options โ€” Optional custom transliteration options

Returns: Result<String, String> โ€” Transliterated text or error message

get_all_option

pub fn get_all_option(
    from_script_name: &str,
    to_script_name: &str,
) -> Result<Vec<String>, String>

Gets all available custom options for a script pair.

Parameters:

  • from_script_name โ€” Source script/language name
  • to_script_name โ€” Target script/language name

Returns: Result<Vec<String>, String> โ€” List of option keys or error message

get_script_typing_data_map

pub fn get_script_typing_data_map(
    script: &str,
) -> Result<ScriptTypingDataMap, String>

Gets typing data mappings for a script (for building custom input methods).

Parameters:

  • script โ€” Script/language name

Returns: Result<ScriptTypingDataMap, String> โ€” Typing data or error message

Typing Module

For character-by-character real-time input:

use lipilekhika::typing::{TypingContext, TypingContextOptions};

fn main() {
    let mut ctx = TypingContext::new("Devanagari", None).unwrap();
    
    // Process character-by-character input
    let diff = ctx.take_key_input("n").unwrap();
    println!("Delete: {}, Add: '{}'", diff.to_delete_chars_count, diff.diff_add_text);
    
    let diff = ctx.take_key_input("a").unwrap();
    println!("Delete: {}, Add: '{}'", diff.to_delete_chars_count, diff.diff_add_text);
    
    // Clear context when needed
    ctx.clear_context();
}

Types

  • TypingContext โ€” Stateful context for typing mode

    • new(typing_lang: &str, options: Option<TypingContextOptions>) โ€” Create new context
    • take_key_input(&mut self, key: &str) โ€” Process single character input
    • clear_context(&mut self) โ€” Clear internal state
  • TypingContextOptions โ€” Configuration for typing behavior

    • auto_context_clear_time_ms: u64 โ€” Auto-clear timeout (default: 4500ms)
    • use_native_numerals: bool โ€” Use script-native numerals (default: true)
    • include_inherent_vowel: bool โ€” Include inherent vowel/schwa (default: false)
  • TypingDiff โ€” Result of processing a key input

    • to_delete_chars_count: usize โ€” Characters to delete from current state
    • diff_add_text: String โ€” Text to insert
  • ScriptTypingDataMap โ€” Typing data for a script (from get_script_typing_data_map)

    • common_krama_map: Vec<TypingDataMapItem> โ€” Common character mappings
    • script_specific_krama_map: Vec<TypingDataMapItem> โ€” Script-specific mappings
  • ListType โ€” Character type enum: Anya, Vyanjana, Matra, Svara

  • TypingDataMapItem โ€” Type alias for (String, ListType, Vec<String>)

๐ŸŽฏ Supported Scripts

Devanagari, Bengali, Tamil, Telugu, Kannada, Malayalam, Gujarati, Odia, Gurmukhi, Sinhala, Tamil-Extended, Myanmar, Tibetan, Limbu, and more.

๐Ÿ“– Full list: lipilekhika.in/reference/supported_scripts

๐Ÿ”ง Custom Options

See the full list of custom transliteration options:

๐Ÿ“– lipilekhika.in/reference/custom_trans_options

๐Ÿ“– Resources

๐Ÿ“ License

MIT License โ€” See LICENSE for details

Dependencies

~1.6โ€“2.7MB
~49K SLoC