Перейти до вмісту

Модуль:grk-stems

Неперевірена версія
Матеріал з Вікісловника

Документацію для цього модуля можна створити у Модуль:grk-stems/документація

-- 2020.03.21. Sarri.greek
--[=[
STEM PRODUCTION for Greek monotonic or polytonic scripts (with character conversions at [[Module:grk-stems/data]])
	Produce stems for inflection tables
	from lemma or a given λήμμα=xxxx
	Trials, at [[Module:grk-stems/trials]]

Authors:
	2020.03.Sarri.greek
	previous modules by Flyax, Xoristzatziki. 

STRUCTURE
	1) MAIN FUNCTIONS
		1. has_accent ? (chekcing if true or false) - export.hasaccent
		2. accent_0 removeaccent
		3. accent_1 put accent on the ultima
		4. accent_2 put accent on the penultima without synizesis
		5. accent_2syn put accent on the penultima, asking editor for synizesis number 
		6. Convert perispomene to oxia
		7. Convert oxia to perispomene
	2) export functions (used at declension Module)
	Also see [[Module:stems]]

Terms:
	stemL = the stem as found at lemma (minus letters from the end)
	stem = lemma minus letters from the end, as defined in the inflection modules
	word0 or stem0 = no accent - Function: removeaccent or accent0
	word1 or stem1 = accent on the ultima: the last syllable's vowel
	word2 or stem2 = accent on the penultima: the syllable before the last
		+Modern Greek: consideration for synizisis: when 2 vowels are taken as one

PROBLEMS
main function:
	For function accent_penultima, I get 'time allocated expired'
function accent_2
	[[σκίουρος]], stem σκίουρ It analyses it as: σκί-ο-υρ = accent_3 instead of σκί-ουρ = accent_2
Umlaut - διαλυτικά
	cf /data page Why word-1 does not see the diaeresis? ο Βάιος του Βαΐου, ο Μάιος του Μαΐου
]=]--

local export = {}

local module_path = 'Module:grk-stems'
local m_data = require(module_path .."/data") --all character conversions


--------------------------------------------------------------------------
--                             MAIN CODES                               --
--------------------------------------------------------------------------


-- ===================== true or false: inquies whether it has an accent
-- previously Lf['έχει τόνο'] in  Module:κλίση/el/ουσιαστικό 
function has_accent(anygreekstring)
    --για κάθε χαρακτήρα
    for codepoint in mw.ustring.gcodepoint( anygreekstring ) do
        if m_data.accented_to_unaccented[mw.ustring.char(codepoint)] ~= nil then
            return true
        end
    end
    return false
end

-- export it
function export.hasaccent(frame)
return has_accent(term)
end

-- ===================== removeaccent or accent_0
-- previously in Module:grc-nouns-decl
-- Η συνάρτηση αφαιρεί τον τόνο από οποιαδήποτε λέξη
-- DO NOT add export.
function removeaccent(word)
    -- for every character / για κάθε χαρακτήρα
    local wordproduced = ''
    for codepoint in mw.ustring.gcodepoint( word ) do -- BUG It does not read capitals+diacritics like Ἶσις
        -- replace it according to instructions / αντικατάστησέ τον με βάση τον πίνακα
        mychar = mw.ustring.char(codepoint)
        convertedchar = m_data.accented_to_unaccented[mychar]            
        -- if an accented character is found / αν βρήκε τονισμένο γράμμα προς για αντικατάσταση
        if convertedchar ~= nil then
            -- add it / πρόσθεσέ το στη δημιουργούμενη κλείδα
            wordproduced = wordproduced .. convertedchar
        else
            -- let it be / αλλιώς άσε το ίδιο
            wordproduced = wordproduced .. mychar        
        end
    end
    return wordproduced
end

-- ===================== accent_ultima, place accent on the last vowel
--[=[
-- previously named neostonos in [[Module:grc-nouns-decl]] by Flyax
The function begins at the last letter of stem going backwards.
	When it reaches the first unaccented vowel, it adds accent
	The stem paramters should not have any accented vowels.
Η συνάρτηση αρχίζει από το τελευταίο γράμμα του θέματος και πηγαίνει προς το πρώτο. 
	Όταν συναντήσει το πρώτο (άτονο) φωνήεν, το τονίζει και τέλος
	Εννοείται ότι η μεταβλητή stem δεν πρέπει να περιέχει τονισμένα φωνήεντα.
]=]--
function accent_1(word)
    stempoint = mw.ustring.len(word)
    wordproduced = ""
    while stempoint > 0 do
       mychar = mw.ustring.sub(word, stempoint, stempoint)
       newchar = m_data.unaccented_to_accented[mychar]
       if newchar ~= nil then
          if stempoint > 1 then
              return mw.ustring.sub(word, 1, stempoint-1 ) .. newchar .. wordproduced
          else
              return newchar .. wordproduced
          end
       else
           wordproduced = mychar .. wordproduced
           stempoint = stempoint -1
       end
    end
    return wordproduced
end

-- ===================== accent_2  to penulitma, no synizesis
-- previously named tonospro in [[Module:grc-nouns-decl]] by Flyax
--[=[
It finds the vowel of the penultima and adds oxia.
	It supposes that the second vowel from the end, of the stem
	belongs to the penultima.
Η συνάρτηση βρίσκει το φωνήεν της προπαραλήγουσας και του βάζει οξεία.
	Σε αυτή τη φάση υποθέτει ότι το δεύτερο φωνήεν του θέματος από το τέλος
	ανήκει στην προπαραλήγουσα
]=]--
function accent_2(stem)
    stempoint = mw.ustring.len(stem)
    wordproduced = ""
    profound = false
    while stempoint > 0 do
       mychar = mw.ustring.sub(stem, stempoint, stempoint)
       newchar = m_data.unaccented_to_accented[mychar]
       if newchar ~= nil and profound then
            if stempoint > 1 then
                return mw.ustring.sub(stem, 1, stempoint-1 ) .. newchar .. wordproduced
            else
                return newchar .. wordproduced
            end
       else
       	   if newchar ~= nil then profound = true end
           wordproduced = mychar .. wordproduced
           stempoint = stempoint -1
       end
    end
    return wordproduced
end

-- !!!!!!!!semiCHECKED at function export.word2syn(arg)
-- ===================== accent to penulitma + synizesis
-- previously as neostonos in [[Module:el-verb-conj]] by Flyax, 2013
-- move accent to penultima or accent_2 (check synizesis)
-- μετάθεση του τόνου στην παραλήγουσα ελέγχοντας αν υπάρχει συνίζηση
function accent_2syn(word, syniz)
    local wordproduced = ""
    -- for every combination with accent+dialytics / για κάθε συνδυασμό γραμμάτων με τόνο και διαλυτικά
    -- for doubleaccented, newvalue in pairs(m_data.digraphs2) do
    for diplotonismeno, neatimh in pairs(m_data.digraphs2) do
    	-- beginning, ending = mw.ustring.find(word, doubleaccented)
        arxi, telos = mw.ustring.find(word, diplotonismeno)
        if arxi ~= nil then
            return mw.ustring.gsub(word, diplotonismeno, neatimh, 1) --replace once / μια φορά αντικατάσταση
            --accent was found and moved / βρέθηκε ο τόνος και μετατέθηκε
        end        
    end
    -- if dialytics are not found, we start from the end looking for an accent
    -- αν δεν βρέθηκαν διαλυτικά αρχίζουμε από το τέλος για να βρούμε πού είναι ο τόνος
    stempoint = mw.ustring.len(word)
    accentNotFound = true
    while accentNotFound do
       mychar = mw.ustring.sub(word, stempoint, stempoint)
       newchar = m_data.accented_to_unaccented[mychar]
       if newchar ~= nil then
           wordproduced = newchar .. wordproduced
           accentNotFound = false
       else
           wordproduced = mychar .. wordproduced
       end
       stempoint = stempoint -1
    end
    -- check if there is synizesis: defined by the editor
    -- να εξετάσουμε αν υπάρχει συνίζηση: πρέπει να μας το πει ο χρήστης, 
    -- EXAMPLES: αιφνιδιάζω (συνίζ=nil), μεριάζω (συνίζ=1), αδειάζω (συνίζ=2) (number of vowels counting as one)
    if syniz ~= nil then
        syniz = tonumber(syniz)
        wordproduced = mw.ustring.sub(word, stempoint+1-syniz, stempoint) .. wordproduced
        stempoint = stempoint - syniz
    end
    -- check if accent is on a digraph / να εξετάσουμε αν ο τόνος ήταν σε δίψηφο φωνήεν
    twoletters = mw.ustring.sub(word, stempoint, stempoint) .. newchar
    for _,v in pairs(m_data.digraphs) do
        if v == twoletters then
            wordproduced = mw.ustring.sub(word, stempoint, stempoint) .. wordproduced
            stempoint = stempoint -1
        end
    end
    return accent_1(mw.ustring.sub(word, 1, stempoint)) .. wordproduced
end


-- ===================== Convert perispomene (circumflex) to oxia (= acute = tonos)
-- previously [[Module:grc-nouns-decl]] by Flyax
-- Η συνάρτηση αλλάζει την περισπωμένη του θέματος σε οξεία. Αν δεν βρει περισπωμένη δεν κάνει τίποτα.
function export.PerispomeniToOxia(stem)
    stempoint = mw.ustring.len(stem)
    wordproduced = ""
    while stempoint > 0 do
       mychar = mw.ustring.sub(stem, stempoint, stempoint)
       newchar = m_data.perispomeni_to_oxeia[mychar]
       if newchar ~= nil then
          if stempoint > 1 then
              return mw.ustring.sub(stem, 1, stempoint-1 ) .. newchar .. wordproduced
          else
              return newchar .. wordproduced
          end
       else
           wordproduced = mychar .. wordproduced
           stempoint = stempoint -1
       end
    end
    return wordproduced
end


-- ===================== Convert oxia (acute) to persipomeni (circumflex)
-- previously in [[Module:grc-nouns-decl]] by Flyax
-- Η συνάρτηση αλλάζει την οξεία του θέματος σε περισπωμένη. Αν δεν βρει οξεία δεν κάνει τίποτα.

-- use as ...path...OxiaToPerispomeni in inflection Modules. If i take away the word export. it does not work
-- but it cannot work for (see below) function wordpi
function export.OxiaToPerispomeni(stem)
    stempoint = mw.ustring.len(stem)
    wordproduced = ""
    while stempoint > 0 do
       mychar = mw.ustring.sub(stem, stempoint, stempoint)
       newchar = m_data.oxeia_to_perispomeni[mychar]
       if newchar ~= nil then
          if stempoint > 1 then
              return mw.ustring.sub(stem, 1, stempoint-1 ) .. newchar .. wordproduced
          else
              return newchar .. wordproduced
          end
       else
           wordproduced = mychar .. wordproduced
           stempoint = stempoint -1
       end
    end
    return wordproduced
end

function OxiaToPerispomeni_invoke(stem)
    stempoint = mw.ustring.len(stem)
    wordproduced = ""
    while stempoint > 0 do
       mychar = mw.ustring.sub(stem, stempoint, stempoint)
       newchar = m_data.oxeia_to_perispomeni[mychar]
       if newchar ~= nil then
          if stempoint > 1 then
              return mw.ustring.sub(stem, 1, stempoint-1 ) .. newchar .. wordproduced
          else
              return newchar .. wordproduced
          end
       else
           wordproduced = mychar .. wordproduced
           stempoint = stempoint -1
       end
    end
    return wordproduced
end

--------------------------------------------------------------------------
--                 EXPORTS for inflection Modules                      --
--                 plus i variants for direct invoke                    --
-- the words minus letters, also at [[Module:stems]] for all languages
--------------------------------------------------------------------------
-- ΔΗΜΙΟΥΡΓΙΑ ΘΕΜΑΤΩΝ από το ΛΗΜΜΑ
-- PRODUCE STEMS from LEMMA

-- ============= wordi_1 =============== --
-- wordi= word invoked
-- lemma minus 1 letter, direct invoke
function export.wordi_1(frame)
--	myarg = frame:getParent().args --  for Template only
	myarg = frame.args -- for invoke only
    PAGENAME = mw.title.getCurrentTitle().text
    lemma = PAGENAME:match( "^%s*(.-)%s*$" )
	lemma_target = myarg['lemma'] or myarg['λήμμα'] or ''
	if lemma_target ~= '' then lemma = lemma_target end
    if lemma == '' then lemma = PAGENAME:match( "^%s*(.-)%s*$" ) end
return mw.ustring.sub(lemma,1,-2)
end

-- ============= word_2 =============== --
-- lemma minus 2 letters, for [[Template:word-2]]
function export.word_2(arg)
	if type(arg) == 'table' and type(arg.getParent) == 'function' then
		local frame = arg
		local args = frame:getParent().args
		term = args['λήμμα'] or args['lemma'] or ''
	else
		term = arg
	end
    PAGENAME = mw.title.getCurrentTitle().text
    lemma = PAGENAME:match( "^%s*(.-)%s*$" )
	if term ~= '' then lemma = term end
    if lemma == '' then lemma = PAGENAME:match( "^%s*(.-)%s*$" ) end
return mw.ustring.sub(lemma,1,-3)	
end


-- ============= wordi_2 =============== --
-- lemma minus 2 letters, direct invoke
function export.wordi_2(frame)
--	myarg = frame:getParent().args --  for Template only
	myarg = frame.args -- for invoke only
    PAGENAME = mw.title.getCurrentTitle().text
    lemma = PAGENAME:match( "^%s*(.-)%s*$" )
	lemma_target = myarg['lemma'] or myarg['λήμμα'] or ''
	if lemma_target ~= '' then lemma = lemma_target end
    if lemma == '' then lemma = PAGENAME:match( "^%s*(.-)%s*$" ) end
return mw.ustring.sub(lemma,1,-3)
end


-- ============= word_3 =============== --
-- lemma minus 3 letters, for Template --όπως καπετάν-ιος, καπεταν-αίοι
function export.word_3(arg)
	if type(arg) == 'table' and type(arg.getParent) == 'function' then
		local frame = arg
		local args = frame:getParent().args
		term = args['λήμμα'] or args['lemma'] or ''
	else
		term = arg
	end
    PAGENAME = mw.title.getCurrentTitle().text
    lemma = PAGENAME:match( "^%s*(.-)%s*$" )
	if term ~= '' then lemma = term end
    if lemma == '' then lemma = PAGENAME:match( "^%s*(.-)%s*$" ) end
return mw.ustring.sub(lemma,1,-4)	
end


-- ============= wordi_3 =============== --
-- lemma minus 3 letters, direct invoke --όπως καπετάν-ιος, καπεταν-αίοι
function export.wordi_3(frame)
--	myarg = frame:getParent().args --  for Template only
	myarg = frame.args -- for invoke only
    PAGENAME = mw.title.getCurrentTitle().text
    lemma = PAGENAME:match( "^%s*(.-)%s*$" )
	lemma_target = myarg['lemma'] or myarg['λήμμα'] or ''
	if lemma_target ~= '' then lemma = lemma_target end
    if lemma == '' then lemma = PAGENAME:match( "^%s*(.-)%s*$" ) end
return mw.ustring.sub(lemma,1,-4)
end


-- ΒΑΖΟΥΜΕ ΤΟΝΟΥΣ
-- PUT ACCENTS on them

-- ============= WORD 0 =============== --
-- remove accent, for Templates
function export.word0(arg)
	if type(arg) == 'table' and type(arg.getParent) == 'function' then
		local frame = arg
		local args = frame:getParent().args
		term = args['λήμμα'] or args['lemma'] or ''
	else
		term = arg
	end
    PAGENAME = mw.title.getCurrentTitle().text
    lemma = PAGENAME:match( "^%s*(.-)%s*$" )
	if term ~= '' then lemma = term end
    if lemma == '' then lemma = PAGENAME:match( "^%s*(.-)%s*$" ) end
return removeaccent(lemma)		-- or lemma = (mw.ustring.sub(lemma,1,-1)	
end


-- ============= 0i =============== --
-- remove accent, direct invoke [[Πρότυπο:θ0]]
function export.word0i(frame)
--	myarg = frame:getParent().args --  for Template only
	myarg = frame.args -- for invoke only
    PAGENAME = mw.title.getCurrentTitle().text
    lemma = PAGENAME:match( "^%s*(.-)%s*$" )
	lemma_target = myarg['lemma'] or myarg['λήμμα'] or ''
	if lemma_target ~= '' then lemma = lemma_target end
    if lemma == '' then lemma = PAGENAME:match( "^%s*(.-)%s*$" ) end
return removeaccent(mw.ustring.sub(lemma,1,-1))	
end

-- ============= WORD 1 =============== --
-- accent on ultima, for Templates
function export.word1(arg)
	if type(arg) == 'table' and type(arg.getParent) == 'function' then
		local frame = arg
		local args = frame:getParent().args
		term = args['λήμμα'] or args['lemma'] or ''
	else
		term = arg
	end	
    PAGENAME = mw.title.getCurrentTitle().text
    lemma = PAGENAME:match( "^%s*(.-)%s*$" )
	if term ~= '' then lemma = term end
    if lemma == '' then lemma = PAGENAME:match( "^%s*(.-)%s*$" ) end
return accent_1(removeaccent(lemma))		--or lemma = (mw.ustring.sub(lemma,1,-1)
end

-- ============= 1i =============== --
-- accent on ultima, direct invoke
function export.word1i(frame)
--	myarg = frame:getParent().args --  for Template only
	myarg = frame.args -- for invoke only
    PAGENAME = mw.title.getCurrentTitle().text
    lemma = PAGENAME:match( "^%s*(.-)%s*$" )
	lemma_target = myarg['lemma'] or myarg['λήμμα'] or ''
	if lemma_target ~= '' then lemma = lemma_target end
return accent_1(removeaccent(mw.ustring.sub(lemma,1,-1)))	
end

-- ============= WORD 2 =============== --
-- accent on penultima, for Templates
function export.word2(arg)
	if type(arg) == 'table' and type(arg.getParent) == 'function' then
		local frame = arg
		local args = frame:getParent().args
		term = args['λήμμα'] or args['lemma'] or ''
	else
		term = arg
	end	
    PAGENAME = mw.title.getCurrentTitle().text
    lemma = PAGENAME:match( "^%s*(.-)%s*$" )
	if term ~= '' then lemma = term end
    if lemma == '' then lemma = PAGENAME:match( "^%s*(.-)%s*$" ) end
return accent_2(removeaccent(lemma))	-- or lemma = (mw.ustring.sub(lemma,1,-1))
end

-- ============= 2i =============== --
-- accent on penultima, direct invoke [[Πρότυπο:θ1]]
function export.word2i(frame)
--	myarg = frame:getParent().args --  for Template only
	myarg = frame.args -- for invoke only
    PAGENAME = mw.title.getCurrentTitle().text
    lemma = PAGENAME:match( "^%s*(.-)%s*$" )
	lemma_target = myarg['lemma'] or myarg['λήμμα'] or ''
	if lemma_target ~= '' then lemma = lemma_target end
    if lemma == '' then lemma = PAGENAME:match( "^%s*(.-)%s*$" ) end
return accent_2(removeaccent(mw.ustring.sub(lemma,1,-1)))	
end

-- ============= WORD p (π) oksia to perispomeni =============== --
--  for Templates
function export.wordp(arg)
	if type(arg) == 'table' and type(arg.getParent) == 'function' then
		local frame = arg
		local args = frame:getParent().args
		term = args['λήμμα'] or args['lemma'] or ''
	else
		term = arg
	end
    PAGENAME = mw.title.getCurrentTitle().text
    lemma = PAGENAME:match( "^%s*(.-)%s*$" )
	if term ~= '' then lemma = term end
    if lemma == '' then lemma = PAGENAME:match( "^%s*(.-)%s*$" ) end
return OxiaToPerispomeni_invoke(lemma)		-- or lemma = (mw.ustring.sub(lemma,1,-1)	
end


-- ============= pi (π) oksia to perispomeni =============== --
-- direct invoke [[Πρότυπο:θπ]]
function export.wordpi(frame)
--	myarg = frame:getParent().args --  for Template only
	myarg = frame.args -- for invoke only
    PAGENAME = mw.title.getCurrentTitle().text
    lemma = PAGENAME:match( "^%s*(.-)%s*$" )
	lemma_target = myarg['lemma'] or myarg['λήμμα'] or ''
	if lemma_target ~= '' then lemma = lemma_target end
    if lemma == '' then lemma = PAGENAME:match( "^%s*(.-)%s*$" ) end
return OxiaToPerispomeni_invoke(mw.ustring.sub(lemma,1,-1))	
end



--------------------------------------------------------------------------
--              SYNIZESIS   partially used, semiCHECKED                 --
--------------------------------------------------------------------------

-- ============= WORD 2syn =============== --
-- accent on penultima plus synizesis, for Templates
function export.synizesis(arg)
	if type(arg) == 'table' and type(arg.getParent) == 'function' then
		local frame = arg
		local args = frame:getParent().args
		term = args['συνίζ'] or ''
	else
		term = arg
	end
	if syniz ~= '' then syniz = term end
return term
end
-- examples: [[Module:el-nouns-decl/functions]] ΔΙΑΛΥΤΙΚΑ DIALYTICS at κλίση #δύναμη ([[καταπράυνση]])
	-- at κλίση #όνομα ([[θρόισμα]], [[ράισμα]], [[χάιδεμα]])
-- example: ancient greek verb δανείζω used at Module:grc-verbs-cong/1 #καταφέρω
function export.word2syn(arg)
	if type(arg) == 'table' and type(arg.getParent) == 'function' then
		local frame = arg
		local args = frame:getParent().args
		term = args['λήμμα'] or args['lemma'] or ''
	else
		term = arg
	end	
    PAGENAME = mw.title.getCurrentTitle().text
    lemma = PAGENAME:match( "^%s*(.-)%s*$" )
	if term ~= '' then lemma = term end
    if lemma == '' then lemma = PAGENAME:match( "^%s*(.-)%s*$" ) end
return accent_2syn(lemma, synizesis)	-- or lemma = (mw.ustring.sub(lemma,1,-1))
end


-- ============= 2syn_i =============== --
-- accent on penultima plus synizesis, direct invoke
function export.word2syn_i(frame)
--	myarg = frame:getParent().args --  for Template only
	myarg = frame.args -- for invoke only
    PAGENAME = mw.title.getCurrentTitle().text
    lemma = PAGENAME:match( "^%s*(.-)%s*$" )
	lemma_target = myarg['lemma'] or myarg['λήμμα'] or ''
	if lemma_target ~= '' then lemma = lemma_target end
    if lemma == '' then lemma = PAGENAME:match( "^%s*(.-)%s*$" ) end
    if syniz ~= '' then syniz = myarg['συνίζ'] end
return accent_2syn(lemma, syniz)	-- or lemma = (mw.ustring.sub(lemma,1,-1))	
end



return export