Module:κλίση
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