Supported directions
- Latin/IAST → Devanagari
- Latin/IAST → Gujarati
- Latin/IAST → plain English / Hunterian
- Devanagari → IAST (canonical / smart / exact)
- Gujarati → IAST (canonical / smart / exact)
- Devanagari ↔ Gujarati (canonical / smart / exact)
lipimala · v1.0.0
Exact round-trip Indic transliteration across Dart, JavaScript, Python, and PHP. Same conversion tables, profiles, Vedic handling, metadata trailer format, and result envelopes on every runtime.
toDevanagariFromIast()
live
Converts between scholarly Latin (IAST / extended Indic / ISO-style tables), Devanagari, Gujarati, and plain-English / Hunterian views. Visible Brahmic rendering is many-to-one—case, aliases, and normalization collapse—so exact recovery uses an envelope or an invisible metadata trailer.
restoreOriginal().
embedExactSourceMetadata: true so the
string carries a checksummed Unicode-Tag payload (LIT1:).| Language | Install | Import / use |
|---|---|---|
| Python (opens in new tab) | pip install lipimala |
from lipimala import to_devanagari, to_devanagari_from_gujarati, ... |
| JavaScript (opens in new tab) | npm install lipimala |
import { toDevanagari, toDevanagariFromGujarati } from 'lipimala' |
| Dart (opens in new tab) | dart pub add lipimala |
import 'package:lipimala/lipimala.dart';Extensions on String |
| PHP (opens in new tab) | composer require jayeshmepani/lipimala |
use function Lipimala\toDevanagari;use Lipimala\IastToDevanagariOptions;
|
| Layer | Returns | When to use |
|---|---|---|
String converterstoDevanagariFromIast |
string |
Rendered text only; optional invisible trailer for later exact reverse. |
Envelope converterstoDevanagari |
TransliterationResult |
Structured output, issues, profile metadata, JSON, restoreOriginal(). |
| Variant | Behavior | Fails when |
|---|---|---|
toIastFromDevanagari |
Exact trailer if present, else canonical reverse | Never throws for missing trailer |
toExactIastFromDevanagari |
Requires valid embedded metadata | Throws if trailer missing/corrupt (empty → empty) |
toCanonicalIastFromDevanagari |
Always visible-script reverse | Does not throw for missing trailer |
Same pattern for Gujarati→IAST and Deva↔Gujr with typed markers
ISC:D: / ISC:G:.
Enum UnicodeNormalizationForm:
preserve
nfc
nfd
Envelope defaults: input nfd, output nfc. Reverse APIs use
ScriptToIastOptions.
The table below maps all primary public functions, envelope APIs, reverse converters, script-to-script transformers, and metadata helpers across Dart, JavaScript, Python, and PHP environments.
| Concept / Functionality | Dart (package:lipimala/lipimala.dart) |
JavaScript (lipimala) |
Python (lipimala) |
PHP (IndicScriptConverter\*) |
|---|---|---|---|---|
| Devanagari Envelope | toDevanagari()text.toDevanagari() |
toDevanagari()to_devanagari() |
to_devanagari()toDevanagari() |
toDevanagari()to_devanagari() |
| Gujarati Envelope | toGujarati()text.toGujarati() |
toGujarati()to_gujarati() |
to_gujarati()toGujarati() |
toGujarati()to_gujarati() |
| Plain English Envelope | toPlainEnglish()text.toPlainEnglish() |
toPlainEnglish()to_plain_english() |
to_plain_english()toPlainEnglish() |
toPlainEnglish()to_plain_english() |
| IAST → Devanagari String | toDevanagariFromIast()text.toDevanagariFromIast() |
toDevanagariFromIast()to_devanagari_from_iast() |
to_devanagari_from_iast()toDevanagariFromIast() |
toDevanagariFromIast()to_devanagari_from_iast() |
| IAST → Gujarati String | toGujaratiFromIast()text.toGujaratiFromIast() |
toGujaratiFromIast()to_gujarati_from_iast() |
to_gujarati_from_iast()toGujaratiFromIast() |
toGujaratiFromIast()to_gujarati_from_iast() |
| IAST → Plain English String | toPlainEnglishFromIast()text.toPlainEnglishFromIast() |
toPlainEnglishFromIast()to_plain_english_from_iast() |
to_plain_english_from_iast()toPlainEnglishFromIast() |
toPlainEnglishFromIast()to_plain_english_from_iast() |
| Bulk Array / List Transliteration | items.toDevanagariFromIast()toDevanagariFromIastList() |
toDevanagariFromIastList() |
to_devanagari_from_iast_list() |
toDevanagariFromIastList() |
| Devanagari → Smart IAST | toIastFromDevanagari() |
toIastFromDevanagari()to_iast_from_devanagari() |
to_iast_from_devanagari()toIastFromDevanagari() |
toIastFromDevanagari()to_iast_from_devanagari() |
| Devanagari → Canonical IAST | toCanonicalIastFromDevanagari() |
toCanonicalIastFromDevanagari()to_canonical_iast_from_devanagari()
|
to_canonical_iast_from_devanagari()toCanonicalIastFromDevanagari()
|
toCanonicalIastFromDevanagari()to_canonical_iast_from_devanagari()
|
| Devanagari → Exact IAST | toExactIastFromDevanagari() |
toExactIastFromDevanagari()to_exact_iast_from_devanagari() |
to_exact_iast_from_devanagari()toExactIastFromDevanagari() |
toExactIastFromDevanagari()to_exact_iast_from_devanagari() |
| Gujarati → Smart IAST | toIastFromGujarati() |
toIastFromGujarati()to_iast_from_gujarati() |
to_iast_from_gujarati()toIastFromGujarati() |
toIastFromGujarati()to_iast_from_gujarati() |
| Gujarati → Canonical IAST | toCanonicalIastFromGujarati() |
toCanonicalIastFromGujarati()to_canonical_iast_from_gujarati()
|
to_canonical_iast_from_gujarati()toCanonicalIastFromGujarati()
|
toCanonicalIastFromGujarati()to_canonical_iast_from_gujarati()
|
| Gujarati → Exact IAST | toExactIastFromGujarati() |
toExactIastFromGujarati()to_exact_iast_from_gujarati() |
to_exact_iast_from_gujarati()toExactIastFromGujarati() |
toExactIastFromGujarati()to_exact_iast_from_gujarati() |
| Devanagari → Smart Gujarati | toGujaratiFromDevanagari() |
toGujaratiFromDevanagari()to_gujarati_from_devanagari() |
to_gujarati_from_devanagari()toGujaratiFromDevanagari() |
toGujaratiFromDevanagari()to_gujarati_from_devanagari() |
| Devanagari → Canonical Gujarati | toCanonicalGujaratiFromDevanagari() |
toCanonicalGujaratiFromDevanagari()to_canonical_gujarati_from_devanagari()
|
to_canonical_gujarati_from_devanagari()toCanonicalGujaratiFromDevanagari()
|
toCanonicalGujaratiFromDevanagari()to_canonical_gujarati_from_devanagari()
|
| Devanagari → Exact Gujarati | toExactGujaratiFromDevanagari() |
toExactGujaratiFromDevanagari()to_exact_gujarati_from_devanagari()
|
to_exact_gujarati_from_devanagari()toExactGujaratiFromDevanagari()
|
toExactGujaratiFromDevanagari()to_exact_gujarati_from_devanagari()
|
| Gujarati → Smart Devanagari | toDevanagariFromGujarati() |
toDevanagariFromGujarati()to_devanagari_from_gujarati() |
to_devanagari_from_gujarati()toDevanagariFromGujarati() |
toDevanagariFromGujarati()to_devanagari_from_gujarati() |
| Gujarati → Canonical Devanagari | toCanonicalDevanagariFromGujarati() |
toCanonicalDevanagariFromGujarati()to_canonical_devanagari_from_gujarati()
|
to_canonical_devanagari_from_gujarati()toCanonicalDevanagariFromGujarati()
|
toCanonicalDevanagariFromGujarati()to_canonical_devanagari_from_gujarati()
|
| Gujarati → Exact Devanagari | toExactDevanagariFromGujarati() |
toExactDevanagariFromGujarati()to_exact_devanagari_from_gujarati()
|
to_exact_devanagari_from_gujarati()toExactDevanagariFromGujarati()
|
toExactDevanagariFromGujarati()to_exact_devanagari_from_gujarati()
|
| Check IAST Source Metadata |
hasExactGujaratiIastSourceMetadatahasExactDevanagariIastSourceMetadata
|
hasExactGujaratiIastSourceMetadatahasExactDevanagariIastSourceMetadata
|
has_exact_gujarati_iast_source_metadatahas_exact_devanagari_iast_source_metadata
|
hasExactGujaratiIastSourceMetadata()hasExactDevanagariIastSourceMetadata()
|
| Check Direct Metadata |
hasExactGujaratiSourceMetadata()hasExactDevanagariSourceMetadata()
|
hasExactGujaratiSourceMetadata()hasExactDevanagariSourceMetadata()
|
has_exact_gujarati_source_metadata()has_exact_devanagari_source_metadata()
|
hasExactGujaratiSourceMetadata()hasExactDevanagariSourceMetadata()
|
| Strip Direct Metadata | visibleWithoutExactSourceMetadata() |
visibleWithoutExactSourceMetadata() |
visible_without_exact_source_metadata() |
visibleWithoutExactSourceMetadata() |
| Embed Source Metadata | embedExactSourceMetadata() |
embedExactSourceMetadata()embed_exact_source_metadata() |
embed_exact_source_metadata()embedExactSourceMetadata() |
embedExactSourceMetadata()embed_exact_source_metadata() |
| Decode Metadata | tryDecodeExactSourceMetadata() |
tryDecodeExactSourceMetadata()try_decode_exact_source_metadata()
|
try_decode_exact_source_metadata()tryDecodeExactSourceMetadata()
|
tryDecodeExactSourceMetadata()try_decode_exact_source_metadata()
|
| Strip Tag Metadata | stripExactSourceMetadata() |
stripExactSourceMetadata()strip_exact_source_metadata() |
strip_exact_source_metadata()stripExactSourceMetadata() |
stripExactSourceMetadata()strip_exact_source_metadata() |
| Recover Original Source | recoverEmbeddedExactSource() |
recoverEmbeddedExactSource()recover_embedded_exact_source() |
recover_embedded_exact_source()recoverEmbeddedExactSource() |
recoverEmbeddedExactSource()recover_embedded_exact_source() |
| Check Tag Metadata | hasEmbeddedExactSource() |
hasEmbeddedExactSource()has_embedded_exact_source() |
has_embedded_exact_source()hasEmbeddedExactSource() |
hasEmbeddedExactSource()has_embedded_exact_source() |
| Unicode Normalization | normalizeUnicode() |
normalizeUnicode()normalize_unicode() |
normalize_unicode()normalizeUnicode() |
Unicode::normalize() |
Return TransliterationResult. Always set
renderingIsInjective = false for script/plain views.
toDevanagari / to_devanagari| Parameter | Type | Default | Description |
|---|---|---|---|
text |
string | required | Latin/IAST (or extended) source |
options |
IastToDevanagariOptions | defaults | Profile + policies — see §13 |
inputNormalization |
UnicodeNormalizationForm | nfd | Applied before conversion |
outputNormalization |
UnicodeNormalizationForm | nfc | Applied to visible rendered text |
Issue attached: SOURCE_METADATA_REQUIRED_FOR_EXACT_REVERSE (info).
Dart: method on String. JS: second arg is
{ options, inputNormalization, outputNormalization }.
toGujarati / to_gujaratiSame shape as toDevanagari with IastToGujaratiOptions.
toPlainEnglish / to_plain_englishUses IastPlainEnglishOptions. Result profile is hunterian or
plainEnglish.
Issue: HUNTERIAN_VIEW_IS_INTRINSICALLY_LOSSY or
PLAIN_ENGLISH_VIEW_IS_INTRINSICALLY_LOSSY (info).
import 'package:lipimala/lipimala.dart';
final r = 'Kṛṣṇa ā́tman'.toDevanagari();
print(r.rendered); // कृष्ण आ॑त्मन्
print(r.restoreOriginal()); // Kṛṣṇa ā́tman
import { toDevanagari } from 'lipimala';
const r = toDevanagari('Kṛṣṇa ā́tman');
console.log(r.rendered);
console.log(r.restoreOriginal());
from lipimala import to_devanagari
r = to_devanagari('Kṛṣṇa ā́tman')
print(r.rendered)
print(r.restore_original())
use function Lipimala\toDevanagari;
$r = toDevanagari('Kṛṣṇa ā́tman');
echo $r->rendered, PHP_EOL;
echo $r->restoreOriginal(), PHP_EOL;
toDevanagariFromIast / to_devanagari_from_iast
| Parameter | Type | Default |
|---|---|---|
text |
string | required |
options |
IastToDevanagariOptions | all defaults (§13) |
When: you only need the rendered script string, or you will reverse later via metadata.
How exact reverse works: pass embedExactSourceMetadata: true, then
call toExactIastFromDevanagari(tagged).
toGujaratiFromIast / to_gujarati_from_iast
Mirror of the Devanagari string API with IastToGujaratiOptions and Gujarati
profile/policy enums.
Exact reverse: toExactIastFromGujarati.
toPlainEnglishFromIast / to_plain_english_from_iast
ASCII-friendly transcription. Keep the envelope for exact Latin recovery. Options control final-a, jñ, ñ, glottal stop, Hunterian features — see §14.
Bulk convert an array, list, or sequence of text values (["Kṛṣṇa", "Rāma", "jñāna"])
in a single operation without manual iteration loops across all conversion directions:
toDevanagariFromIastList(), toGujaratiFromIastList(),
toPlainEnglishFromIastList()
toCanonicalIastFromDevanagariList(), toCanonicalIastFromGujaratiList(),
toIastFromDevanagariList(), toIastFromGujaratiList()
toCanonicalGujaratiFromDevanagariList(),
toCanonicalDevanagariFromGujaratiList(), toGujaratiFromDevanagariList(),
toDevanagariFromGujaratiList()
toDevanagariList(),
toGujaratiList(), toPlainEnglishList()
// Dart List Extension
final devaList = ['Kṛṣṇa', 'Rāma', 'jñāna'].toDevanagariFromIast();
// -> ['कृष्ण', 'राम', 'ज्ञान']
// JavaScript / Node.js
import { toDevanagariFromIastList, toCanonicalGujaratiFromDevanagariList } from 'lipimala';
const deva = toDevanagariFromIastList(['Kṛṣṇa', 'Rāma', 'jñāna']);
const gujr = toCanonicalGujaratiFromDevanagariList(deva);
# Python
from lipimala import to_devanagari_from_iast_list, to_canonical_iast_from_devanagari_list
deva = to_devanagari_from_iast_list(['Kṛṣṇa', 'Rāma', 'jñāna'])
iast = to_canonical_iast_from_devanagari_list(deva)
// PHP
use function Lipimala\toDevanagariFromIastList;
$deva = toDevanagariFromIastList(['Kṛṣṇa', 'Rāma', 'jñāna']);
Lipimala provides three distinct reverse conversion strategies for translating Devanagari or Gujarati text back into Latin IAST. Choose between smart metadata-aware recovery, pure canonical visible reverse, or strict metadata verification.
| Function Signature | Expected Parameters | Output Type | Behavior & Strategy |
|---|---|---|---|
toIastFromDevanagari(text, options?)to_iast_from_devanagari(text, options?)
|
text: stringoptions: ScriptToIastOptions? |
string |
Smart Reverse: If an embedded exact-source metadata trailer is present and valid, recovers exact original Latin. Otherwise, performs canonical visible reverse transliteration. |
toCanonicalIastFromDevanagari(text, options?)to_canonical_iast_from_devanagari(text, options?)
|
text: stringoptions: ScriptToIastOptions? |
string |
Canonical Reverse: Always performs deterministic visible reverse conversion from Devanagari to lower-case IAST, completely ignoring any embedded metadata trailer. |
toExactIastFromDevanagari(text)to_exact_iast_from_devanagari(text)
|
text: string |
string |
Strict Exact Recovery: Decodes and verifies the embedded metadata trailer. Returns exact original Latin input (with original casing/aliases). Throws/raises an exception if metadata is missing or checksum validation fails. |
toIastFromGujarati(text, options?)to_iast_from_gujarati(text, options?)
|
text: stringoptions: ScriptToIastOptions? |
string |
Smart Reverse: Recovers exact original Latin if embedded metadata trailer is valid; falls back to canonical Gujarati → IAST visible reverse. |
toCanonicalIastFromGujarati(text, options?)to_canonical_iast_from_gujarati(text, options?)
|
text: stringoptions: ScriptToIastOptions? |
string |
Canonical Reverse: Always performs visible reverse conversion from Gujarati to lower-case IAST, ignoring metadata trailers. |
toExactIastFromGujarati(text)to_exact_iast_from_gujarati(text)
|
text: string |
string |
Strict Exact Recovery: Decodes and verifies the Gujarati metadata trailer. Returns exact original Latin input. Throws/raises an error if trailer is missing or corrupted. |
Options object controlling reverse transliteration behavior. Parameter fields, default values, and effects are detailed in §15 Reverse options.
Direct script conversion maps characters natively between Devanagari and Gujarati.
Because the two scripts have unequal Unicode repertoires, Lipimala supports direct-script metadata
trailers (using markers DEV1 and GUJ1) for 100% exact round-trip source script
recovery.
| Function Signature | Parameters | Output Type | Behavior & Description |
|---|---|---|---|
toGujaratiFromDevanagari(input, options?)to_gujarati_from_devanagari()
|
input: stringoptions: IndicScriptConversionOptions? |
string |
Smart Direct Conversion: Converts Devanagari to Gujarati. If an exact
Gujarati source trailer (GUJ1) is present, recovers original Gujarati; otherwise
performs canonical conversion. |
toCanonicalGujaratiFromDevanagari(input, options?)to_canonical_gujarati_from_devanagari()
|
input: stringoptions: IndicScriptConversionOptions? |
string |
Canonical Conversion: Maps Devanagari code points directly to Gujarati equivalents, ignoring any metadata trailers. |
toExactGujaratiFromDevanagari(input)to_exact_gujarati_from_devanagari()
|
input: string |
string |
Strict Exact Recovery: Decodes exact Gujarati source trailer
(GUJ1). Returns exact original Gujarati input text. Throws/raises an error if
trailer is missing or invalid. |
hasExactGujaratiSourceMetadata(input)has_exact_gujarati_source_metadata()
|
input: string |
bool |
Returns true if the input text contains a valid direct Gujarati exact-source
metadata trailer (GUJ1). |
toDevanagariFromGujarati(input, options?)to_devanagari_from_gujarati()
|
input: stringoptions: IndicScriptConversionOptions? |
string |
Smart Direct Conversion: Converts Gujarati to Devanagari. Recovers exact
Devanagari if a DEV1 trailer is present; otherwise performs canonical conversion.
|
toCanonicalDevanagariFromGujarati(input, options?)to_canonical_devanagari_from_gujarati()
|
input: stringoptions: IndicScriptConversionOptions? |
string |
Canonical Conversion: Maps Gujarati code points directly to Devanagari equivalents, ignoring metadata trailers. |
toExactDevanagariFromGujarati(input)to_exact_devanagari_from_gujarati()
|
input: string |
string |
Strict Exact Recovery: Decodes exact Devanagari source trailer
(DEV1). Returns exact original Devanagari text. Throws/raises an error if trailer
is missing or invalid. |
hasExactDevanagariSourceMetadata(input)has_exact_devanagari_source_metadata()
|
input: string |
bool |
Returns true if the input text contains a valid direct Devanagari exact-source
metadata trailer (DEV1). |
visibleWithoutExactSourceMetadata(input)visible_without_exact_source_metadata()
|
input: string |
string |
Strips any embedded metadata trailer (whether Latin LIT1, Devanagari
DEV1, or Gujarati GUJ1) and returns clean visible script text.
|
Low-level functions for manually manipulating embedded Unicode tag trailers, decoding checksummed metadata payloads, and performing Unicode 17.0.0 normalization and mark classification.
| Function Signature | Parameters & Types | Output Type | Usage & Behavior |
|---|---|---|---|
embedExactSourceMetadata(rendered, originalSource)embed_exact_source_metadata()
|
rendered: stringoriginalSource: string |
string |
Manually attaches an invisible Unicode tag trailer encoding originalSource onto
the end of rendered visible script string. |
tryDecodeExactSourceMetadata(text)try_decode_exact_source_metadata()
|
text: string |
EmbeddedExactSource | null |
Parses and verifies checksums of any embedded metadata trailer. Returns an
EmbeddedExactSource object if valid, or null if missing/corrupted.
|
stripExactSourceMetadata(text)strip_exact_source_metadata()
|
text: string |
string |
Strips any trailing invisible Unicode tag metadata sequence from text, returning
pure display-only visible script string. |
recoverEmbeddedExactSource(text)recover_embedded_exact_source()
|
text: string |
string |
Decodes embedded metadata trailer and returns original source text. Throws/raises an exception if metadata is missing or invalid. |
hasEmbeddedExactSource(text)has_embedded_exact_source()
|
text: string |
bool |
Returns true if text ends with a valid, checksum-verified embedded
exact-source metadata trailer. |
normalizeUnicode(input, form)normalize_unicode()
|
input: stringform: UnicodeNormalizationForm |
string |
Performs canonical Unicode normalization (NFC, NFD,
NFKC, or NFKD) using Unicode 17.0.0 rules.
|
isUnicodeCombiningMark(value)is_unicode_combining_mark()
|
value: string | int (char/code point) |
bool |
Returns true if the specified character or code point is classified as a Unicode
combining mark (Mn, Mc, or Me). |
isEncodedVedicMark(value)is_encoded_vedic_mark()
|
value: string | int (char/code point) |
bool |
Returns true if the specified character or code point is a recognized Vedic
accent mark (e.g., svara, anudātta, svarita). |
| Field / method | Type | Description |
|---|---|---|
original |
string | Exact source string from caller |
normalizedInput |
string | Source after input normalization |
rendered |
string | Converted view (may include trailer) |
profile |
TransliterationProfile | Profile used for this conversion |
inputNormalization / outputNormalization |
UnicodeNormalizationForm | Forms applied |
renderingIsInjective |
bool | Always false for these views |
issues |
list of TransliterationIssue | Diagnostics |
originalCodePoints |
list<int> | Integrity codes of original |
restoreOriginal() |
string | Returns original |
hasErrors |
bool | Any issue with severity error |
toJson() / fromJson |
object / factory | Serialize / rebuild with integrity check |
toJsonText / fromJsonText |
string / factory | JSON text form |
{
"schema": "indic-script-converter/1" | "exact round-trip-indic-transliteration/1",
"original": "Kṛṣṇa",
"originalCodePoints": [75, 7771, 7779, 7751, 97],
"normalizedInput": "...",
"rendered": "कृष्ण",
"profile": "extendedIndic",
"inputNormalization": "nfd",
"outputNormalization": "nfc",
"renderingIsInjective": false,
"issues": [
{ "code": "...", "message": "...", "severity": "info", "sourceRuneOffset": null }
]
}
| Field | Type | Default |
|---|---|---|
| code | string | required |
| message | string | required |
| severity | info | warning | error | warning |
| sourceRuneOffset | int | null | null |
Fields: visibleText, originalSource.
| Field | Values | Default | Effect |
|---|---|---|---|
| profile | strictIast | iso15919Core | extendedIndic | extendedIndic | Accepted Latin inventory |
| unknownLatinPolicy | passThrough | bracket | throwError | passThrough | Unknown Latin handling |
| digitPolicy | preserveAscii | convertToScript | preserveAscii | ASCII vs script digits |
| punctuationPolicy | preserve | indicDanda | preserve | Period → danda |
| omPolicy | transliterateLetters | useOmSign | transliterateLetters | oṃ → letters vs ॐ/ૐ |
| ambiguousLPolicy | context | preferVocalic | preferConsonant | context | Resolve ḷ |
| acceptAsciiLongVowels | bool | false | Allow aa/ii/uu |
| acceptPlainSh | bool | true | Plain sh |
| acceptPlainXAsKha | bool | true | Compatibility for x |
| acceptWAsVa | bool | true | Treat w as v |
| preserveVedicAccentMarks | bool | true | Keep svara marks |
| collapseWhitespace | bool | false | Collapse whitespace runs |
| embedExactSourceMetadata | bool | false | Append exact-source trailer |
Gujarati types mirror the same fields with Gujarati-prefixed enum type names.
| Field | Values | Default | Effect |
|---|---|---|---|
| finalA | keep | drop | smart | smart | Trailing inherent a |
| jna | gya | jnya | jna | gya | jñ conjunct |
| nya | na | nya | gna | na | Standalone ñ |
| profile | strictIast | extendedIndic | hunterian | extendedIndic | Input inventory / style |
| glottalStop | remove | apostrophe | remove | ʔ handling |
| convertCToCh | bool | true | c → ch style |
| assimilateAnusvara | bool | true | Anusvara assimilation |
| removeAvagraha | bool | true | Strip avagraha-like marks |
| collapseWhitespace | bool | false | Whitespace collapse |
| enableInternalSchwaSyncope | bool | false | Hunterian schwa drop |
| useWForVAfterConsonants | bool | false | Hunterian v/w |
| preserveVedicAccentMarks | bool | false | Usually stripped |
| keepFinalAForWords | set/list | empty | Force keep final a |
Options class controlling Brahmic → IAST reverse transliteration (Devanagari → IAST and Gujarati → IAST).
| Field Name | Type / Allowed Values | Default Value | Description & Behavior |
|---|---|---|---|
targetProfile |
TransliterationProfile( strictIast | extendedIndic)
|
strictIast |
Target character inventory profile for visible reverse mapping. strictIast uses
standard academic IAST diacritics. |
preserveVedicAccents |
bool |
true |
When true, preserves Vedic accent marks (svara, anudātta, svarita) in the
reversed IAST output. |
unknownPolicy |
passThrough | bracket | throwError |
passThrough |
Policy for unmapped input characters. passThrough keeps them as-is;
bracket wraps them in [...]; throwError raises an
exception.
|
digitPolicy |
preserveScriptDigits | convertToAsciiDigits |
preserveScriptDigits |
Determines whether Indic script digits (e.g. ०-९ or ૦-૯) are
converted to ASCII digits (0-9) or preserved. |
punctuationPolicy |
preserveDanda | convertToPeriod |
preserveDanda |
Determines whether Indic dandas (।, ॥) are converted to standard
periods (.) or preserved. |
collapseWhitespace |
bool |
false |
When true, collapses multiple consecutive whitespace characters into a single
space. |
ignoreEmbeddedMetadata |
bool |
false |
When true, forces toIastFromDevanagari() /
toIastFromGujarati() to ignore any embedded metadata trailer and execute canonical
visible reverse.
|
| Field | Values | Default | Effect |
|---|---|---|---|
| inputNormalization | preserve | nfc | nfd | nfd | Input normalize |
| outputNormalization | preserve | nfc | nfd | nfc | Output normalize |
| unknownPolicy | preserve | throwError | preserve | Unmapped chars |
| digitPolicy | convertToTarget | preserveSource | convertToTarget | Digit block conversion |
| collapseWhitespace | bool | false | Whitespace collapse |
| embedExactSourceMetadata | bool | false | Typed exact source trailer |
The Dart implementation (package:lipimala) targets Dart 3.0+ and
Flutter. It exposes both functional APIs and natural extensions on String.
import 'package:lipimala/lipimala.dart';
(exports all converters, options, enums, and result models).'Kṛṣṇa'.toDevanagari(),
'Kṛṣṇa'.toGujarati(), 'Kṛṣṇa'.toPlainEnglish() directly on String instances.
IastToDevanagariString, IastToGujaratiString, and
IastToPlainEnglish subclasses which provide .toExactIast() and
.restoreOriginal() helper methods.
IastToDevanagariOptions(profile: DevanagariRomanizationProfile.extendedIndic, embedExactSourceMetadata: true).
ArgumentError on invalid options or corrupted
metadata trailers.import 'package:lipimala/lipimala.dart';
void main() {
const input = 'Kṛṣṇa / Kr̥ṣṇa / ḫāna';
// 1. Extension method envelope conversion
final result = input.toDevanagari(
options: const IastToDevanagariOptions(embedExactSourceMetadata: true),
);
print('Rendered: ${result.rendered}');
print('Restored: ${result.restoreOriginal()}');
// 2. Direct script conversion
final gujarati = toGujaratiFromDevanagari(
result.rendered,
options: const IndicScriptConversionOptions(embedExactSourceMetadata: true),
);
print('Gujarati: $gujarati');
// 3. Exact recovery from Gujarati
final exactDeva = toExactDevanagariFromGujarati(gujarati);
assert(exactDeva == result.rendered);
}
The JavaScript implementation supports Node.js ≥ 20 and modern browsers via ES Modules (ESM) and CommonJS (CJS).
import { toDevanagari, toDevanagariFromIast } from 'lipimala';const { toDevanagari, toDevanagariFromIast } = require('lipimala');
toDevanagariFromIast) and
snake_case (to_devanagari_from_iast) aliases for all functions.new IastToDevanagariOptions({...})) or plain JS objects
({ embedExactSourceMetadata: true }). Both camelCase and snake_case keys are supported.
IastToDevanagariString, IastToGujaratiString, or
IastToPlainEnglish extending native String, offering
.toExactIast().
TypeError or Error on bad
arguments or metadata decoding failures.import {
toDevanagari,
toGujaratiFromDevanagari,
toExactDevanagariFromGujarati,
IastToDevanagariOptions
} from 'lipimala';
const input = 'Kṛṣṇa / Kr̥ṣṇa / ḫāna';
// 1. Envelope conversion
const result = toDevanagari(input, { embedExactSourceMetadata: true });
console.log('Rendered:', result.rendered);
console.log('Restored:', result.restoreOriginal());
// 2. Direct script conversion Devanagari -> Gujarati
const guj = toGujaratiFromDevanagari(result.rendered, { embedExactSourceMetadata: true });
console.log('Gujarati:', guj);
// 3. Exact source recovery
const exactDeva = toExactDevanagariFromGujarati(guj);
console.assert(exactDeva === result.rendered);
The Python package (pip install lipimala) requires Python ≥ 3.12,
utilizing modern type hints and dataclasses.
from lipimala import to_devanagari, to_devanagari_from_iast, to_devanagari_from_gujarati
snake_case
functions and camelCase aliases for cross-language parity. Enums inherit (str, Enum) and
support both EXTENDED_INDIC and extendedIndic member access.@dataclass objects instantiated
with keyword arguments: IastToDevanagariOptions(embed_exact_source_metadata=True).IastToDevanagariString,
IastToGujaratiString, IastToPlainEnglish subclasses of str with
.to_exact_iast() / .restore_original().
ValueError on invalid option configurations or
corrupted metadata.from lipimala import (
to_devanagari,
IastToDevanagariOptions,
to_gujarati_from_devanagari,
to_exact_devanagari_from_gujarati,
IndicScriptConversionOptions
)
input_text = "Kṛṣṇa / Kr̥ṣṇa / ḫāna"
# 1. Envelope conversion
result = to_devanagari(input_text, options=IastToDevanagariOptions(embed_exact_source_metadata=True))
print("Rendered:", result.rendered)
print("Restored:", result.restore_original())
# 2. Direct script conversion
gujarati = to_gujarati_from_devanagari(
result.rendered,
options=IndicScriptConversionOptions(embed_exact_source_metadata=True)
)
print("Gujarati:", gujarati)
# 3. Exact recovery
exact_deva = to_exact_devanagari_from_gujarati(gujarati)
assert exact_deva == result.rendered
The PHP port (composer require jayeshmepani/lipimala) requires PHP ≥
8.3 with strict typing throughout.
Lipimala. Import functions with
use function Lipimala\toDevanagariFromIast;.
toDevanagariFromIast() and
to_devanagari_from_iast() namespaced functions.
final readonly class instances
with promoted constructor properties and default values. Options parameters are nullable (pass
null for defaults).
mbstring or intl extensions.InvalidArgumentException on invalid parameters
or failed metadata verification.<?php
declare(strict_types=1);
require __DIR__ . '/vendor/autoload.php';
use IndicScriptConverter\IastToDevanagariOptions;
use IndicScriptConverter\IndicScriptConversionOptions;
use function IndicScriptConverter\toDevanagari;
use function IndicScriptConverter\toGujaratiFromDevanagari;
use function IndicScriptConverter\toExactDevanagariFromGujarati;
$input = 'Kṛṣṇa / Kr̥ṣṇa / ḫāna';
// 1. Envelope conversion
$result = toDevanagari($input, new IastToDevanagariOptions(embedExactSourceMetadata: true));
echo "Rendered: {$result->rendered}
";
echo "Restored: " . $result->restoreOriginal() . "
";
// 2. Direct script conversion
$gujarati = toGujaratiFromDevanagari(
$result->rendered,
new IndicScriptConversionOptions(embedExactSourceMetadata: true)
);
echo "Gujarati: {$gujarati}
";
// 3. Exact recovery
$exactDeva = toExactDevanagariFromGujarati($gujarati);
assert($exactDeva === $result->rendered);
Each runtime has a comprehensive example that exercises public APIs with option permutations.
| Language | Path | Run |
|---|---|---|
| Python | python/examples/public_api_examples.py |
PYTHONPATH=python python3 python/examples/public_api_examples.py |
| JavaScript | javascript/examples/public-api-examples.js |
node javascript/examples/public-api-examples.js |
| Dart | dart/example/public_api_examples.dart |
cd dart && dart run example/public_api_examples.dart |
| PHP | php/examples/public_api_examples.php |
php php/examples/public_api_examples.php |
| Situation | Typical outcome |
|---|---|
| unknownLatinPolicy = throwError | Throws / raises on unmapped Latin |
| unknownPolicy = throwError (direct) | Throws / raises on unmapped script chars |
| toExact* without trailer | FormatException / TypeError / ValueError / InvalidArgumentException |
| toExact* with empty string | Returns empty string |
| fromJson integrity failure | Throws; schema or code-point mismatch |
| Tampered metadata trailer | Checksum fails; treated as no exact source |