assert is_word('धर्मक्षेत्रे') and is_word('kṣetre') and is_word('yuyutsavaḥ,')
assert not is_word('॥') and not is_word('।') and not is_word('१८') and not is_word('1.1') and not is_word('')
assert deva_num(18) == '१८' and deva_num('1.1') == '१.१'
# Gītā 1.1 as DharmicData prints it: one line, the speaker glued on, the chapter.verse marker at the end
g11 = 'धृतराष्ट्र उवाच धर्मक्षेत्रे कुरुक्षेत्रे समवेता युयुत्सवः । मामकाः पाण्डवाश्चैव किमकुर्वत सञ्जय ।। 1.1 ।।'
assert padas(g11, 1) == ['धृतराष्ट्र उवाच', 'धर्मक्षेत्रे कुरुक्षेत्रे समवेता युयुत्सवः ।', 'मामकाः पाण्डवाश्चैव किमकुर्वत सञ्जय ॥ १ ॥']
assert padas(g11)[-1].endswith('॥ १.१ ॥') # no number given: the one the verse carries, in Devanagari
assert padas('मामकाः पाण्डवाश्चैव किमकुर्वत सञ्जय')[-1].endswith(' ॥') # no number anywhere: a bare close
# Kumārasambhava 4.1 across two lines with its own daṇḍas: the lines are only re-cut
K41 = 'अथ मोहपरायणा सती विवशा कामवधूर्विबोधिता ।\nविधिना प्रतिपादयिष्यता नववैधव्यमसह्यवेदनम् ॥'
assert padas(K41, 1) == ['अथ मोहपरायणा सती विवशा कामवधूर्विबोधिता ।', 'विधिना प्रतिपादयिष्यता नववैधव्यमसह्यवेदनम् ॥ १ ॥']
# a saṃhitā blob: two mantras, numbered as written, each then split into its pādas
blob = 'इषे त्वोर्जे त्वा वायव स्थ देवो वः सविता प्रार्पयतु ॥ १ ॥ वसोः पवित्रमसि शतधारं । वसोः पवित्रमसि सहस्रधारम् ॥ २ ॥'
ms = split_mantras(blob)
assert [n for n, _ in ms] == ['१', '२'] and ms[0][1].startswith('इषे')
assert padas(ms[1][1], ms[1][0]) == ['वसोः पवित्रमसि शतधारं ।', 'वसोः पवित्रमसि सहस्रधारम् ॥ २ ॥']
assert split_mantras('') == [] and padas('') == []
# DharmicData prints AV 2.36.7's close as `॥७` with no closing daṇḍa and a newline: still a verse end, or 7 merges into 8 and `७` is left glued mid-line
av = 'अन्यं वेत्तवे ॥७\nआ ते नयतु सविता ॥ ८ ॥'
assert split_mantras(av) == [('७', 'अन्यं वेत्तवे'), ('८', 'आ ते नयतु सविता')]
assert padas('अन्यं वेत्तवे ॥७') == ['अन्यं वेत्तवे ॥ ७ ॥']
assert split_mantras('क । १० ख ॥ ११ ॥') == [('११', 'क । १० ख')] # a number after a daṇḍa mid-line is text, not a marker
# a paryāya sūkta (AV 16.8) writes a running count after the marker, `॥४॥ ४। १`: a single daṇḍa before a bare number is not a marker
py = 'पादयामि॥४॥ ४। १\nजितमस्माकम्॥१॥'
assert split_mantras(py) == [('४', 'पादयामि'), ('१', '४। १\nजितमस्माकम्')]
# the speaker tag is cut only where `वाच` ends the word: Chāndogya 4.2.3's `प्रत्युवाचाह` goes on, and so do `वाचं`, `वाचः`, `वाचा`
ch = 'तमु ह परः प्रत्युवाचाह हारेत्वा शूद्र तवैव सह गोभिरस्त्विति ।'
assert padas(ch) == ['तमु ह परः प्रत्युवाचाह हारेत्वा शूद्र तवैव सह गोभिरस्त्विति ॥']
assert padas('श्रीभगवानुवाच कुतस्त्वा कश्मलमिदं विषमे समुपस्थितम् ।')[:2] == ['श्रीभगवानुवाच', 'कुतस्त्वा कश्मलमिदं विषमे समुपस्थितम् ॥']
assert padas(g11)[0] == 'धृतराष्ट्र उवाच' and padas('अर्जुन उवाच ।') == ['अर्जुन उवाच']
for w in ('गुरुवाचं श्रुत्वा', 'तदुवाचः स आह', 'मधुवाचा वदति', 'अनुवाचम् इति'): assert padas(w) == [f'{w} ॥'], w
# DharmicData glues 11 Gītā speaker tags to the pāda with no space (12.1, 12.2, 13.2, 14.1, 14.21, 14.22, 15.1, 17.1, 17.2, 18.73, 18.74): a letter after `वाच` starts the pāda
glued = [
('अर्जुन उवाचएवं सततयुक्ता ये भक्तास्त्वां पर्युपासते।येचाप्यक्षरमव्यक्तं तेषां के योगवित्तमाः।।12.1।।', 1, ['अर्जुन उवाच', 'एवं सततयुक्ता ये भक्तास्त्वां पर्युपासते ।', 'येचाप्यक्षरमव्यक्तं तेषां के योगवित्तमाः ॥ १ ॥']),
('श्री भगवानुवाचमय्यावेश्य मनो ये मां नित्ययुक्ता उपासते।श्रद्धया परयोपेतास्ते मे युक्ततमा मताः।।12.2।।', 2, ['श्री भगवानुवाच', 'मय्यावेश्य मनो ये मां नित्ययुक्ता उपासते ।', 'श्रद्धया परयोपेतास्ते मे युक्ततमा मताः ॥ २ ॥']),
('श्री भगवानुवाचइदं शरीरं कौन्तेय क्षेत्रमित्यभिधीयते।एतद्यो वेत्ति तं प्राहुः क्षेत्रज्ञ इति तद्विदः।।13.2।।', 2, ['श्री भगवानुवाच', 'इदं शरीरं कौन्तेय क्षेत्रमित्यभिधीयते ।', 'एतद्यो वेत्ति तं प्राहुः क्षेत्रज्ञ इति तद्विदः ॥ २ ॥']),
('श्री भगवानुवाचपरं भूयः प्रवक्ष्यामि ज्ञानानां ज्ञानमुत्तमम्।यज्ज्ञात्वा मुनयः सर्वे परां सिद्धिमितो गताः।।14.1।।', 1, ['श्री भगवानुवाच', 'परं भूयः प्रवक्ष्यामि ज्ञानानां ज्ञानमुत्तमम् ।', 'यज्ज्ञात्वा मुनयः सर्वे परां सिद्धिमितो गताः ॥ १ ॥']),
('अर्जुन उवाचकैर्लिंगैस्त्रीन्गुणानेतानतीतो भवति प्रभो।किमाचारः कथं चैतांस्त्रीन्गुणानतिवर्तते।।14.21।।', 21, ['अर्जुन उवाच', 'कैर्लिंगैस्त्रीन्गुणानेतानतीतो भवति प्रभो ।', 'किमाचारः कथं चैतांस्त्रीन्गुणानतिवर्तते ॥ २१ ॥']),
('श्री भगवानुवाचप्रकाशं च प्रवृत्तिं च मोहमेव च पाण्डव।न द्वेष्टि सम्प्रवृत्तानि न निवृत्तानि काङ्क्षति।।14.22।।', 22, ['श्री भगवानुवाच', 'प्रकाशं च प्रवृत्तिं च मोहमेव च पाण्डव ।', 'न द्वेष्टि सम्प्रवृत्तानि न निवृत्तानि काङ्क्षति ॥ २२ ॥']),
('श्री भगवानुवाचऊर्ध्वमूलमधःशाखमश्वत्थं प्राहुरव्ययम्।छन्दांसि यस्य पर्णानि यस्तं वेद स वेदवित्।।15.1।।', 1, ['श्री भगवानुवाच', 'ऊर्ध्वमूलमधःशाखमश्वत्थं प्राहुरव्ययम् ।', 'छन्दांसि यस्य पर्णानि यस्तं वेद स वेदवित् ॥ १ ॥']),
('अर्जुन उवाचये शास्त्रविधिमुत्सृज्य यजन्ते श्रद्धयाऽन्विताः।तेषां निष्ठा तु का कृष्ण सत्त्वमाहो रजस्तमः।।17.1।।', 1, ['अर्जुन उवाच', 'ये शास्त्रविधिमुत्सृज्य यजन्ते श्रद्धयाऽन्विताः ।', 'तेषां निष्ठा तु का कृष्ण सत्त्वमाहो रजस्तमः ॥ १ ॥']),
('श्री भगवानुवाचत्रिविधा भवति श्रद्धा देहिनां सा स्वभावजा।सात्त्विकी राजसी चैव तामसी चेति तां श्रृणु।।17.2।।', 2, ['श्री भगवानुवाच', 'त्रिविधा भवति श्रद्धा देहिनां सा स्वभावजा ।', 'सात्त्विकी राजसी चैव तामसी चेति तां श्रृणु ॥ २ ॥']),
('अर्जुन उवाचनष्टो मोहः स्मृतिर्लब्धा त्वत्प्रसादान्मयाच्युत।स्थितोऽस्मि गतसन्देहः करिष्ये वचनं तव।।18.73।।', 73, ['अर्जुन उवाच', 'नष्टो मोहः स्मृतिर्लब्धा त्वत्प्रसादान्मयाच्युत ।', 'स्थितोऽस्मि गतसन्देहः करिष्ये वचनं तव ॥ ७३ ॥']),
('सञ्जय उवाचइत्यहं वासुदेवस्य पार्थस्य च महात्मनः।संवादमिममश्रौषमद्भुतं रोमहर्षणम्।।18.74।।', 74, ['सञ्जय उवाच', 'इत्यहं वासुदेवस्य पार्थस्य च महात्मनः ।', 'संवादमिममश्रौषमद्भुतं रोमहर्षणम् ॥ ७४ ॥']),
]
for t, n, exp in glued: assert padas(t, n) == exp, (n, padas(t, n))
# no piece opens on a dependent vowel sign, virama, anusvāra or visarga, over verses as vedicreader ships them: Gītā 1.2, 2.1, 2.2, 2.4; Kaṭha 1.1.1, 1.1.4; Kena 1.1, 1.2, 1.5; Chāndogya 4.1.3, 4.1.5, 4.2.3-5
DEP = re.compile('^[\u0900-\u0903\u093a-\u094f\u0951-\u0957\u0962\u0963]')
real = [g11, K41, blob,
'सञ्जय उवाच दृष्ट्वा तु पाण्डवानीकं व्यूढं दुर्योधनस्तदा । आचार्यमुपसङ्गम्य राजा वचनमब्रवीत् ॥ २ ॥',
'सञ्जय उवाच तं तथा कृपयाऽविष्टमश्रुपूर्णाकुलेक्षणम् । विषीदन्तमिदं वाक्यमुवाच मधुसूदनः ॥ १ ॥',
'श्री भगवानुवाच कुतस्त्वा कश्मलमिदं विषमे समुपस्थितम् । अनार्यजुष्टमस्वर्ग्यमकीर्तिकरमर्जुन ॥ २ ॥',
'अर्जुन उवाच कथं भीष्ममहं संख्ये द्रोणं च मधुसूदन । इषुभिः प्रतियोत्स्यामि पूजार्हावरिसूदन ॥ ४ ॥',
'ॐ उशन् ह वै वाजश्रवसः सर्ववेदसं ददौ । तस्य ह नचिकेता नाम पुत्र आस ॥ १ ॥',
'स होवाच पितरं तत कस्मै मां दास्यसीति । द्वितीयं तृतीयं तँ होवाच मृत्यवे त्वा ददामीति ॥ ४ ॥',
'ॐ केनेषितं पतति प्रेषितं मनः केन प्राणः प्रथमः प्रैति युक्तः । केनेषितां वाचमिमां वदन्ति चक्षुः श्रोत्रं क उ देवो युनक्ति ॥ १ ॥',
'श्रोत्रस्य श्रोत्रं मनसो मनो यद् वाचो ह वाचं स उ प्राणस्य प्राणः । चक्षुषश्चक्षुरतिमुच्य धीराः प्रेत्यास्माल्लोकादमृता भवन्ति ॥ २ ॥',
'यद्वाचाऽनभ्युदितं येन वागभ्युद्यते । तदेव ब्रह्म त्वं विद्धि नेदं यदिदमुपासते ॥ ५ ॥',
'तमु ह परः प्रत्युवाच कं वर एनमेतत् सन्तं सयुग्वानमिव रैक्वमात्थ इति । यो नु कथं सयुग्वा रैक्व इति ॥ ३ ॥',
'तदु ह जानश्रुतिः पौत्रायण उपशुश्राव । स ह संजिहान एव क्षत्तारमुवाचाङ्गारे ह सयुग्वानमिव रैक्वमात्थेति । यो नु कथं सयुग्वा रैक्व इति ॥ ५ ॥',
'तमु ह परः प्रत्युवाचाह हारेत्वा शूद्र तवैव सह गोभिरस्त्विति । तदु ह पुनरेव जानश्रुतिः पौत्रायणः सहस्रं गवां निष्कमश्वतरीरथं दुहितरं तदादाय प्रतिचक्रमे ॥ ३ ॥',
'तं हाभ्युवाद । रैक्वेदं सहस्रं गवामयं निष्कोऽयमश्वतरीरथ इयं जायायं ग्रामो यस्मिन्नास्सेऽन्वेव मा भगवः शाधीति ॥ ४ ॥',
'तस्या ह मुखमुपोद्गृह्णन्नुवाचाजहारेमाः शूद्रानेनैव मुखेनालापयिष्यथा इति । ते हैते रैक्वपर्णा नाम महावृषेषु यत्रास्मा उवास । तस्मै होवाच ॥ ५ ॥']
assert all(not DEP.match(p) for v in real for p in padas(v)), [p for v in real for p in padas(v) if DEP.match(p)]