Documentation for this module may be created at Module:κλίση/τεκμηρίωση

--TODO:
--στις επιμέρους συναρτήσεις των κλίσεων
--να αντικατασταθούν οι πίνακες wiki με πίνακες html
--ώστε να αποφύγουμε την κλήση του frame:preprocess που είναι βαρύ
--TODO:
--να βρεθεί τρόπος ώστε να επιστρέφονται οι τοπικοί παράμετροι δημιουργίας του πίνακα
--(οε,γε,αε,κε κλπ)
--για να μπορούμε να παίρνουμε λ.χ. τη γενική πληθυντικού των "μερών του λόγου"
--(ουσιαστικών,επιθέτων,κλπ.)
--χωρίς να εμφανίζουμε τον πίνακα
export = {}

local Lf = {} -- local functions
local Ld = {} -- local params and constants

Ld['μέρη του λόγου'] = require('Module:PartOfSpeech/pos')
Ld['υπόδειξη'] = ''
Ld['κατηγορίες για σφάλματα'] = '[[Κατηγορία:Συντήρηση:Σελίδες με σφάλματα στο Module κλίση/el/ουσιαστικό]]'

Lf['σφάλμα'] = function(errstring)
    output = ''
    errstring = errstring or ''
    if errstring ~= '' then
        output = '<font class="error">' .. errstring .. '</font>'
    end
    output = output .. Ld['υπόδειξη'] .. Ld['κατηγορίες για σφάλματα']
    return output 
end

--Τα Πρότυπα(Templates) κλίσης που έχουν δημιουργηθεί (σχεδόν όλα) μέχρι σήμερα ακουλουθούν την εξής ονοματοδοσία:
--Το όνομα του προτύπου(Template) αποτελείται από τρία μέρη:
--1. Ο κωδικός της γλώσσας (που μπορεί να περιέχει παύλες όπως το zh-min-nan)
--2. Το ένθεμα:  -κλίσ-
--Και το πρότυπο (λέξη-λήμμα) σύμφωνα με το οποίο κλίνεται το λήμμα.

--Ο πίνακας splittednames θα περιέχει τον κωδικό γλώσσας
--και το μέρος του λόγου
export.main = function(frame)
	local lc = {}
    local protypo = Lf['βρες το όνομα του Προτύπου'](frame) or ''
    local allargs = frame:getParent().args
    if protypo == '' then return Lf['σφάλμα']('Σφάλμα! Η κλήση δεν έγινε μέσω προτύπου.') end
    local splittednames = Lf['χωρισμός σε μέρη'](protypo,'%-κλίσ%-')
    --θεωρητικά το -κλίσ- δεν μπορεί να είναι ούτε iso γλώσσας ούτε υποδειγματικό όνομα κλίσης
    --για την περίπτωση που κάποιος έχει δημιουργήσει πρότυπο το οποίο περιέχει  το -κλισ-
    --ως iso γλώσσας ή ως υποδειγματικό όνομα κλίσης ή δεν έχει βάλει καν το -κλισ-
    --ελέγχουμε αν ήρθαν 2 ακριβώς
    if #splittednames ~= 2 then
        Ld['υπόδειξη'] = 'Το Πρότυπο κλίσης θα πρέπει να αρχίζει με κωδικό γλώσσας, να ακολουθεί το -κλισ- και μετά ένα όνομα-υπόδειγμα.'
        return Lf['σφάλμα']('Σφάλμα! Λάθος στο όνομα του προτύπου κλίσης.')
    end
    allargs['isoγλώσσας'] = splittednames[1]
    allargs['τύπος'] = splittednames[2]
    local page = mw.title.getCurrentTitle()
    page.name = page.text:match( "^%s*(.-)%s*$" )
    --local args['όνομα'] = mw.title.getCurrentTitle().text:match( "^%s*(.-)%s*$" )
    --αν η σελίδα είναι σε κύριο ονοματοχώρο θα πρέπει υποχρεωτικά να χρησιμοποιήσουμε το όνομα του λήμματος
    --αν κάποιο λήμμα χρειάζεται να έχει κλίση άλλου λήμματος είτε θα παραπέμπουμε εκεί
    --ή θα βρούμε μελλοντικά άλλο τρόπο
    if page.namespace == 0 then
        allargs['λήμμα'] = page.name
        allargs['ονοματοχώρος'] = 0
    else
    	--Εδώ μπορεί να γίνεται έλεγχος αν προέρχεται από πρότυπο οδηγιών.
    	--Θα πρέπει επίσης να προστεθεί παράμετρος στον κάθε "τύπο" (στο submodule) για το γένος
    	--ώστε να προστίθεται σωστά και η κατηγορία.
    	lc['λήμμα'] = frame:getParent().args['λήμμα'] or ''
        if lc['λήμμα'] == '' then
            return Lf['σφάλμα']('Σφάλμα! δεν δόθηκε η λέξη για την κλίση.')
        else
        	allargs['λήμμα'] = lc['λήμμα']
        end
    end
    --αν το υποδειγματικό όνομα κλίσης αρχίζει και τελειώνει σε μονά εισαγωγικά
    --αφαίρεσέ τα.
    if string.sub(allargs['τύπος'],1,1) == "'" and string.sub(allargs['τύπος'],-1) =="'" then
        allargs['τύπος'] = mw.ustring.sub(allargs['τύπος'],2,-2)
    end
    allargs['κατηγορία κλίσης'] = ''
    allargs['τίτλος αρθρώματος'] = ''
    --αν υπάρχει το συγκεκριμένο όνομα προτύπου κλίσης
    --θα επιστρέψει στις παραμέτρους και το "τίτλοςαρθρώματος"
    if Lf['βρες το όνομα του αρθρώματος'](allargs) then
        --κάλεσε τη συνάρτηση κλίσης,
        --checkpoint = checkpoint .. '#in#'
        mdl = require(allargs['τίτλος αρθρώματος'])
        --checkpoint = checkpoint .. "*" .. allargs['τίτλος αρθρώματος'] .. "*"
        output = mdl[allargs['τύπος']](allargs)
        --και επέστρεψε.
        --Το τι θα επιστραφεί (κείμενο html, preprocessed ή απλό) ας το ξεκαθαρίσουμε στο καλούμενο άρθρωμα.
        return frame:preprocess(output)
    end
    --επέστρεψε σφάλμα
    return Lf['σφάλμα']('Σφάλμα! Παρουσιάστηκε πρόβλημα στο Module για την κλίση.')
end

--βρες το όνομα του Προτύπου που κάλεσε το Module
--αλλά μόνο αν κληθηκε από σελίδα η οποία κάλεσε το πρότυπο
Lf['βρες το όνομα του Προτύπου'] = function(frame)
    if type(frame.args) == 'table' and type(frame.getParent) == 'function' then
        local templateobj = mw.title.new(frame:getParent():getTitle())
        if templateobj.namespace == 10 then -- NS_TEMPLATE
            return templateobj.text:match( "^%s*(.-)%s*$" )
        else
            return nil
        end
    else
        return nil
    end
end

Lf['βρες το όνομα του αρθρώματος'] = function(args)
    --για κάθε "μέρος του λόγου"
    --checkpoint = checkpoint .. '#inβρες το όνομα του αρθρώματος#'
    for code, data in pairs(Ld['μέρη του λόγου']) do
        --δημιούργησε όνομα αντίστοιχου αρθρώματος
        local tmpmodulename = "Module:κλίση/" .. args['isoγλώσσας'] .. '/' .. code
        --δες αν υπάρχει τέτοιο άρθρωμα
        if Lf['αν υπάρχει το άρθωμα'](tmpmodulename ) then
            --δες αν έχει υπάρχει εκεί αυτό το υπόδειγμα κλίσης
            local test1 = Lf['αν υπάρχει το υπόδειγμα'](tmpmodulename, args['τύπος'])
            if  test1 == true then
                --πρόσθεσε στις παραμέτρους και το όνομα για την κατηγορία κλίσης
                args['κατηγορία κλίσης'] = data['κατηγορία']
                args['τίτλος αρθρώματος'] = "Module:κλίση/" .. args['isoγλώσσας'] .. '/' .. code
                --και επέστρεψε ΑΛΗΘΕΙΑ
                return true
            end
        end
    end
    --αλλιώς σβήσε τη μεταβλητή με το όνομα και επέστρεψε ΨΕΜΑ
    args['τίτλος αρθρώματος'] = nil
    return false
end

Lf['αν υπάρχει το υπόδειγμα'] = function(tmpmodulename, tmptype)
    --ήδη ελέγξαμε ότι υπάρχει το άρθρωμα π.χ. Module:κλίση/el/ουσιαστικό
    --το φορτώνουμε και αναζητάμε αν υπάρχει η συνάρτηση
    local tmprequest = require(tmpmodulename)
    --θα πρέπει να είναι συνάρτηση
    if type(tmprequest[tmptype]) =='function' then
        return true
    else
        return false
    end
end

Lf['αν υπάρχει το άρθωμα'] = function(modulefulltitle)
    local ok, err = pcall(require, modulefulltitle)
    if ok then
        return true
    else
        return false
    end
end

Lf['χωρισμός σε μέρη'] = function(s, inSplitPattern, outResults )
   if not outResults then
      outResults = {}
   end
   local theStart = 1
   local theSplitStart, theSplitEnd = mw.ustring.find( s, inSplitPattern, theStart )
   while theSplitStart do
      table.insert( outResults, mw.ustring.sub( s, theStart, theSplitStart-1 ) )
      theStart = theSplitEnd + 1
      theSplitStart, theSplitEnd = mw.ustring.find( s, inSplitPattern, theStart )
   end
   table.insert( outResults, mw.ustring.sub( s, theStart ) )
   return outResults
end

return export