Modul:grammar

Definition från Wiktionary, den fria ordlistan.
Hoppa till navigering Hoppa till sök

Dokumentation för denna modul finns på /dok (redigera), /test


Syfte

[redigera]
Den här modulen fungerar som en basmodul för grammatikmoduler. Den innehåller sådana funktioner som är gemensamma för samtliga grammatikmoduler. Denna modul används direkt av modulen som ska ärva funktionerna, "ärvande modul", (aldrig anropas på annat sätt, ex.vis direkt från en grammatikmall).

Specifikation

[redigera]
Ärvande modul måste implementera och exportera följande funktioner:
  • _getMeta (skapa meta-information som behövs som underlag för att generera korrekta böjningsformer, korrekt utformad böjningstabell, korrekta parameterscheman osv)
  • _getForms (skapa själva böjningsformerna; avledningar ska använda namn med prefixet x_, t.ex. x_adv)
  • _getWikitable (skapa själva grammatiktabellen med hjälp av Modul:grammar-table)
  • _getCategories (skapa kategorier specifika för ärvande modul)
  • _getAcceptedParameters (ange alla icke allmänna parametrar som får användas i mallsyntaxen)

Se ett grundläggande exempel: Modul:grammar-example, eller någon befintlig grammatikmodul (t.ex. Modul:sv-adj).

Huvudfunktionalitet

[redigera]

getWikitext (exporteras till ärvande modul)

Returnerar wikitexten som innehåller grammatiktabellen och eventuella kategorier. Detta är funktionen som anropas från grammatikmallarna (genom anrop till ärvande modul): På ordets sida anropas mallen (t.ex.){{sv-adj}}, som i sin tur anropar sin grammatikmodul {{#invoke|sv-adj|getWikitext}}.
getWikitext anropar getFormsAndMeta, _getWikitable (från ärvande modul) samt getCategories.

getFormsAndMeta (lokal funktion)

Anropar och sammanställer information från ärvande moduls funktioner: _getMeta och _getForms.

getCategories (lokal funktion)

Skapar dels generella kategorier och dels kategorier specifika för ärvande modul genom anrop till _getCategories.

Allmänna parametrar

[redigera]
addGeneralMetaAttributes
Tar hand om parametrar - utöver "grundform" - som stödjs av samtliga grammatikmallar (fakta, betydelser, förled, not, bredd?) och genererar meta-information från dessa.
Se Wiktionary:Stilguide/Grammatik/Allmänna parametrar för utförligare information.

Parameterscheman

[redigera]
fillCellArgumentsWithBrackets
{{mallnamnet}} (se lista)
Böjningar av grammar  Positiv Komparativ Superlativ
Attributivt
Obestämd
singular
Utrum {1} {9}  
Neutrum {2}
Bestämd
singular
Maskulinum ({3})? ({10})? ({12})?
Alla {4} {9} {13}
Plural {5}
  Predikativt
Singular Utrum {6} {11} {14}
Neutrum {7}
Plural {8}
Kompareras alternativt med mer och mest.
Adverbavledning ({adv})?
{{mallnamnet}} (se lista)
Böjningar av rolig|  Positiv Komparativ Superlativ
Attributivt
Obestämd
singular
Utrum rolig| rolig|are  
Neutrum rolig|t
Bestämd
singular
Maskulinum (rolig|e)? (rolig|are)? (rolig|aste)?
Alla rolig|a rolig|are rolig|aste
Plural rolig|a
  Predikativt
Singular Utrum rolig| rolig|are rolig|ast
Neutrum rolig|t
Plural rolig|a
Kompareras alternativt med mer och mest.
Adverbavledning (rolig|t)?
{{mallnamnet}} (se lista)
Böjningar av kluv|en  Positiv Komparativ Superlativ
Attributivt
Obestämd
singular
Utrum kluv|en kluv|nare  
Neutrum kluv|et
Bestämd
singular
Maskulinum (kluv|ne)? (kluv|nare)? (kluv|naste)?
Alla kluv|na kluv|nare kluv|naste
Plural kluv|na
  Predikativt
Singular Utrum kluv|en kluv|nare kluv|nast
Neutrum kluv|et
Plural kluv|na
Kompareras alternativt med mer och mest.
Adverbavledning (kluv|et)?
Fyller i alla numrerade parametrar (och ibland särskilda namngivna parametrar) med "{rutans nummer}".
Det är obligatoriskt att på grammatikmallarnas dokumentationssidor bland annat presentera ett parameterschema för att åskådliggöra de numrerade parametrarnas placering i tabellen.
Ange exempelvis:
  • {{parameterschema|sv-adj|{{sv-adj|autonumrera=}} }}
för att skapa ett parameterschema med de numrerade parametrarna (och ibland särskilda namngivna parametrar) automatiskt ifyllda. Byt ut sv-adj mot den mall du vill beskriva.
Andra aspekter av hur grammatikmallen fungerar eller hur böjningsmönstren ser ut kan också visas med hjälp av parameterscheman:
  • {{parameterschema|sv-adj|{{sv-adj|grundform=rolig{{!}} }} }}
  • {{parameterschema|sv-adj-alt|{{sv-adj-alt|grundform=kluv{{!}}en }} }}.
Se exempel på resultat till höger.

makeArgsTable respektive makeArgsTableFromString

Skapar en ny tabell med ett visst antal numrerade argument borttagna.
Detta är användbart för att på konstgjord väg kunna skapa en tabell med argument som normalt genereras automatiskt när modulen anropas från en mall, när anropet istället sker i ett enhetstest eller via MediaWiki-API:et från ett externt script. Se nedan.

Tester

[redigera]

test (exporteras till ärvande modul)

Används för tester av grammatikmodulen. Se exempelvis Modul:sv-adj/test.

Externa skript

[redigera]

getFormsForExport (exporteras till ärvande modul)

Avsett för ett externt script att hämta böjningsformer baserat på mallnamn, sidnamn och lista med argument. Funktionen används av Modul:grammar-export.
Externa script kan t.ex. göra anrop till MediaWiki-API:et: {{#invoke:grammar-export|getJson|pagename=<sidans namn>|template=<hela mallsyntaxen inklusive mallnamnet>}}
Exempel: {{#invoke:grammar-export|getJson|pagename=rolig|template=sv-adj|pers=}} (behöver URL-encodas). modul för export har inte skapats än
{
	"expandtemplates": {
		"wikitext": "{
			\"lang\":\"sv\",
			\"h3\":\"adj\",
			\"forms\": {
				\"x_adv\":\"roligt?\",
				\"pred_sup\":\"roligast\",
				\"attr_obest_sing_neutrum_pos\":\"roligt\",
				\"attr_best_sing_alla_pos\":\"roliga\",
				\"attr_plur_pos\":\"roliga\",
				\"pred_komp\":\"roligare\",
				\"pred_plur_pos\":\"roliga\",
				\"attr_best_sing_mask_sup\":\"roligaste\",
				\"pred_sing_neutrum_pos\":\"roligt\",
				\"pred_sing_utrum_pos\":\"rolig\",
				\"attr_obest_sing_utrum_pos\":\"rolig\",
				\"attr_komp\":\"roligare\",
				\"attr_komp_mask\":\"roligare\",
				\"attr_best_sing_mask_pos\":\"rolige\",
				\"attr_sup\":\"roligaste\"
			}
		}"
	}
}
local export = {}

local base_param          = "grundform"
local quality_param       = "fakta"
local meanings_param      = "betydelser"
local width_param         = "bredd"
local as_first_part_param = "förled"
local note_param          = "not"
local auto_number_param   = "autonumrera"

local function addGeneralMetaAttributes(pagename, templatename, args, meta)
	meta.pagename       = pagename
	meta.templatename   = templatename
	meta.quality_notice = args[quality_param]
	meta.meanings       = args[meanings_param] or ""
	meta.width          = args[width_param]
	meta.as_first_part  = args[as_first_part_param]
	meta.note           = args[note_param] or "-"
	meta.auto_number    = not not args[auto_number_param]

	return meta
end

local function fillCellArgumentsWithBrackets(args, numbered_cells_count, named_cells)
	for i = 1, numbered_cells_count do
		args[i] = args[i] or "{" .. i .. "}"
	end

	for _, v in ipairs(named_cells) do
		args[v] = "{" .. v .. "}"
	end

	return args
end

local function getFormsAndMeta(pagename, templatename, args, format)
	local meta = export._getMeta(pagename, templatename, args)
	meta = addGeneralMetaAttributes(pagename, templatename, args, meta)

	local parameters_should_be_auto_filled_with_numbers = meta.auto_number
	if parameters_should_be_auto_filled_with_numbers then
		args = fillCellArgumentsWithBrackets(args, meta.numbered_cells, meta.named_cells)
	end

	local forms = export._getForms(pagename, templatename, args, meta, format)

	local forms_and_meta = {
		forms = forms, 
		meta  = meta
	}
	
	return forms_and_meta
end

local function makeArgsTable(frame_args, unused_indices)
	local args = {}
	
	for k, v in pairs(frame_args) do
		if (type(k) ~= "number" or k > unused_indices) then
			if type(k) == "number" then
				args[k-unused_indices] = v
			else
				args[k] = v
			end
		end
	end

	return args
end

local function makeArgsTableFromString(full_template_call_without_brackets)
	local args = {}
	local argument_list = mw.text.split(full_template_call_without_brackets, "|")
	local is_templatename_index = 1

	local function hasExplicitKey(arg)
		return not not arg[2];
	end
	
	for i, v in ipairs(argument_list) do
		if i ~= is_templatename_index then
			local splitArgument = mw.text.split(argument_list[i], "=")
			if hasExplicitKey(splitArgument) then
				local key = tonumber(splitArgument[1]) or splitArgument[1]
				local value = splitArgument[2]
				args[key] = value
			else
				local value = splitArgument[1]
				table.insert(args, value)
			end
		end
	end

	return args
end

local function getAcceptedParameters()
	local accepted_parameters = {base_param, quality_param, meanings_param, width_param, as_first_part_param, note_param, auto_number_param}
	
	for _,v in ipairs(export._getAcceptedParameters()) do 
		table.insert(accepted_parameters, v)
	end

	return accepted_parameters
end

local function getCategories(forms, meta, args, modulename)
	local accepted_parameters           = getAcceptedParameters()
	local unallowed_parameters_are_used = false

	local function contains(tbl, val)
	    for _, v in ipairs(tbl) do
	        if v == val then
	            return true
	        end
	    end
	
	    return false
	end

	for k,v in pairs(args) do
		if type(k) == "number" then 
			if k > meta.numbered_cells then
				unallowed_parameters_are_used = true
			end
		else
			if not contains(accepted_parameters, k) then
				unallowed_parameters_are_used = true
			end
		end
	end

	local str = export._getCategories(forms, meta)
	
	if unallowed_parameters_are_used then
		str = str .. "[[Kategori:Wiktionary:" .. modulename .. "/Använder ogiltiga parametrar]]"
	end
	
	return str
end

function export.getWikitext(frame)
	local args                  = frame:getParent().args
	local title                 = mw.title.getCurrentTitle()
	local prefixed_modulename   = frame:getTitle()
	local prefixed_templatename = frame:getParent():getTitle()
	local pagename              = args[base_param] or title.text
	local should_categorize     = title.namespace == 0

	local modulename           = mw.ustring.gsub(prefixed_modulename, "^[^:]+:", "")
	local templatename          = mw.ustring.gsub(prefixed_templatename, "^[^:]+:", "")
	
	local format                = "wikitable"

	local fm                    = getFormsAndMeta(pagename, templatename, args, format)
	local wikitable             = export._getWikitable(fm.forms, fm.meta)
	local categories            = should_categorize and getCategories(fm.forms, fm.meta, args, modulename) or ""
	local str                   = wikitable .. categories

	return str
end

function export.getJson(frame)
	local args         = makeArgsTable(frame.args, 0)
	local pagename     = frame.args["pagename"]
	local templatename = mw.text.split(frame.args["template"], "%|")[1]
	local format       = "export"

	local fm           = getFormsAndMeta(pagename, templatename, args, format)
    local json         = mw.text.jsonEncode(fm.forms)

	return json
end

function export.test(pagename, templatename_with_args, format, meta_args_to_include_in_result)
	local args                    = makeArgsTableFromString(templatename_with_args)
	local templatename            = mw.ustring.match(templatename_with_args, "^([^|]+)|?")

	local include_meta_in_results = not not meta_args_to_include_in_result

	local forms_and_meta          = getFormsAndMeta(pagename, templatename, args, format)

	local result
	if include_meta_in_results then
		local new_meta = {}

		for i, v in ipairs(meta_args_to_include_in_result) do
			new_meta[v] = forms_and_meta.meta[v]
		end

		forms_and_meta.meta = new_meta
		
		result = forms_and_meta	
	else
		result = forms_and_meta.forms
	end
	
	return result
end

return export