Source code for sanskrit_grammar.stem_generator

import re


# Placeholder for various operations
[docs] def alaukikavigraha(component1, component2): """ Function to handle the formation of an alaukikavigraha. Here, it combines the two components into a raw form. """ return component1 + component2 # In a real-world example, additional rules would apply.
[docs] def samasa_anta(component): """ Adds the samāsānta element to the component. In real-world cases, there would be grammatical rules. """ return component + " समासान्त" # Placeholder; samāsānta may vary.
[docs] def upasarjana_operations(component, position="before"): """ Applies the upasarjana operation (prefix or suffix). This function handles the placement of upasarjana based on the position. """ if position == "before": return "उपसर्ग " + component elif position == "after": return component + " उपसर्ग" return component
[docs] def padakarya_operations(component): """ Apply padakārya operations on the words: phonological adjustments, etc. """ return component # Placeholder for phonological operations like sandhi, vowel merging.
[docs] def finalize_case_and_gender(component, case="nominative", gender="masculine", number="singular"): """ Finalize the gender, number, and case ending for the generated compound. Args: component (str): The base compound stem case (str): Grammatical case (nominative, accusative, instrumental, etc.) gender (str): Grammatical gender (masculine, feminine, neuter) number (str): Grammatical number (singular, plural) Returns: str: The compound with appropriate grammatical ending """ # Comprehensive Sanskrit case and gender endings endings = { # Masculine endings "masculine": { "singular": { "nominative": "ः", "accusative": "म्", "instrumental": "एण", "dative": "आय", "ablative": "आत्", "genitive": "स्य", "locative": "इ", "vocative": "ः" }, "plural": { "nominative": "आः", "accusative": "ान्", "instrumental": "एः", "dative": "एभ्यः", "ablative": "एभ्यः", "genitive": "आनाम्", "locative": "एषु", "vocative": "आः" } }, # Feminine endings "feminine": { "singular": { "nominative": "आ", "accusative": "आम्", "instrumental": "आया", "dative": "आयै", "ablative": "आयाः", "genitive": "आयाः", "locative": "आयाम्", "vocative": "ए" }, "plural": { "nominative": "आः", "accusative": "आः", "instrumental": "आभिः", "dative": "आभ्यः", "ablative": "आभ्यः", "genitive": "आनाम्", "locative": "आसु", "vocative": "आः" } }, # Neuter endings "neuter": { "singular": { "nominative": "म्", "accusative": "म्", "instrumental": "एण", "dative": "आय", "ablative": "आत्", "genitive": "स्य", "locative": "इ", "vocative": "म्" }, "plural": { "nominative": "आनि", "accusative": "आनि", "instrumental": "एः", "dative": "एभ्यः", "ablative": "एभ्यः", "genitive": "आनाम्", "locative": "एषु", "vocative": "आनि" } } } # Validate inputs if gender not in endings: raise ValueError(f"Unsupported gender: {gender}") if number not in endings[gender]: raise ValueError(f"Unsupported number: {number}") if case not in endings[gender][number]: raise ValueError(f"Unsupported case: {case}") # Return the component with the appropriate ending return component + endings[gender][number][case]
# Main function to generate the compound
[docs] def generate_sanskrit_compound(paraphrase): # Step 1: Get the components from the paraphrase component1 = paraphrase["first_component"] component2 = paraphrase["second_component"] # Step 2: Apply alaukikavigraha to combine components samasa = alaukikavigraha(component1, component2) # Step 3: Apply samāsānta (final adjustment) to the combined components samasa_with_anta = samasa_anta(samasa) # Step 4: Apply upasarjana operations (prefix or suffix) based on placement samasa_with_upasarjana = upasarjana_operations(samasa_with_anta) # Step 5: Apply padakārya operations samasa_with_padakarya = padakarya_operations(samasa_with_upasarjana) # Step 6: Finalize the case and gender final_compound = finalize_case_and_gender(samasa_with_padakarya, paraphrase.get("case", "nominative"), paraphrase.get("gender", "masculine"), paraphrase.get("number", "singular")) return final_compound