Modul:categorize

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]

Modulens syfte är att bistå mallar med kategorisering. Med hjälp av modulen kan mallar kategorisera sidor från huvudnamnrymden i lämpliga kategorier, eller kategorisera sig själva för att på så sett bidra till en överblick av alla mallar som finns.

Användning[redigera]

Den här modulen bör bara användas av mallar, inte av andra moduler.
getWikitext
{{#invoke:categorize|getWikitext|Kategori1|Kategori2|...}}
Denna funktion kan användas av alla mallar som vill kategorisera ett uppslag.
getSortedWikitext
{{#invoke:categorize|getSortedWikitext|språkkod|Kategori1|Kategori2|...}}
Denna funktion kan användas av alla mallar som vill kategorisera uppslag inkluderande en sorteringsnyckel.
getMainWikitext
{{#invoke:categorize|getMainWikitext|språkkod|h3-kod}}
Denna funktion kan användas av alla ordklassmallar och grammatikmallar.
För mallar som är tvärspråkliga, ange is-always-translingual= (används av {{kod}} och {{tecken}}). Språkkoden för tvärspråklighet är "--".
{{#invoke:categorize|getMainWikitext|språkkod|h3-kod|is-always-translingual=}}
För mallar som stödjer alternativa kategorier, ange support-alternative-categories= (används av {{förkortning}}, {{kod}} och {{tecken}}).
{{#invoke:categorize|getMainWikitext|språkkod|h3-kod|support-alternative-categories=}}
getInflectionWikitext
{{#invoke:categorize|getInflectionWikitext|språkkod|h3-kod}}
Denna funktion kan användas av böjningsformsmallen {{böjning}}.
getTemplateWikitext
{{#invoke:categorize|getTemplateWikitext}}
Denna funktion kan användas av alla ordklassmallar och grammatikmallar för att kategorisera den egna mallen. Fler kommer.

Specifikation[redigera]

Samtliga funktioner returnerar wikitext bestående av en eller flera kategorier. Information om sorteringsnycklar hittas på Modul:sort.
 
getWikitext
1=, 2=, ... osv. explicit angivna kategorier
Returnerar en kategori för varje argument som angivits, versaliserad på första bokstaven. Ingen sorteringsnyckel. [[Kategori:<Argument1>]][[Kategori:<Argument2>]]
getSortedWikitext
1= språkkod (används för sorteringsnyckel)
2=, 3=, ... osv. explicit angivna kategorier
Returnerar en kategori för varje argument som angivits, versaliserad på första bokstaven och med sorteringsnyckel. [[Kategori:<Argument2>|<sorteringsnyckel>]][[Kategori:<Argument3>|<sorteringsnyckel>]]
getMainWikitext
1= språkkod (används för sorteringsnyckel samt första delen i kategorinamnet)
2= h3-kod (används för kategorinamnet)
Returnerar de två standardkategorierna för huvuduppslag: [[Kategori:<Språk>/Alla uppslag|<sorteringsnyckel>]] samt [[Kategori:<Språk>/<H3 i plural>|<sorteringsnyckel>]]
is-always-translingual= anger att sidan saknar språkdimension i kategorierna.
Returnerar endast den andra standardkategorin ("Alla uppslag"-kategorin returneras inte). Språkargumentet ignoreras. Sorteringsnyckel skapas inte på det vanliga sättet via sortmodulen, utan genom "*" + "<sidnamnet>": [[Kategori:<H3 i plural>|*<sidnamnet>]]
support-alternative-categories= anger att alternativa kategorier ska läsas av från det ursprungliga mallanropet och, om sådana finns, användas versaliserade istället för standardkategorin som baseras på h3-koden.
{{mall|<språkkod>|<alternativ kategori1>|<alternativ kategori2>}} ger "Alla uppslag"-kategorin som vanligt samt [[Kategori:<Språk>/<Alternativ kategori1>|<sorteringsnyckel>]][[Kategori:<Språk>/<Alternativ kategori2>|<sorteringsnyckel>]]
Om tillsammans med is-always-translingual= så tas språkdelen av kategorinamnet bort: [[Kategori:<Alternativ kategori1>|<sorteringsnyckel>]][[Kategori:<Alternativ kategori2>|<sorteringsnyckel>]]
Om inga alternativa kategorier anges i det usprungliga mallanropet, baseras kategorin på h3-koden som anges av 2= i modulanropet.
Funktionen är tänkt att utökas med stöd för diverse specialkategorier, t.ex. [[Kategori:<Språk>Palindrom|<sorteringsnyckel>]]
getTemplateWikitext
Anropas utan argument.
Koden tolkar den anropande mallens namn och returnerar kategorin för den mallen.
Om mallen är på formen {{<språkkod>-<h3-kod>(-...)}} returneras kategorin [[Kategori:Wiktionary:Grammatikmallar för <språk>|*<mallens namn>]]
Om mallen är på formen {{<h3-kod>}} returneras kategorin [[Kategori:Wiktionary:Ordklassmallar|*<mallens namn>]] (stödjer även språkkoder innehållande ett bindestreck, t.ex. gmq-fsv för fornsvenska).
Om mallen inte matchar ovanstående mönster, returneras kategorin [[Kategori:Wiktionary:Mallar|*<mallens namn>]].
Funktionen är tänkt att kompletteras med stöd för fler typer av mallar.

Tester[redigera]

All tests passed. (refresh)

Text Expected Actual
test1_basic:
Passed {{#invoke:categorize|getWikitext|Kategorinamn}} [[Kategori:Kategorinamn]] [[Kategori:Kategorinamn]]
Passed {{#invoke:categorize|getWikitext|Kategorinamn1|Kategorinamn2}} [[Kategori:Kategorinamn1]][[Kategori:Kategorinamn2]] [[Kategori:Kategorinamn1]][[Kategori:Kategorinamn2]]
Text Expected Actual
test2_basic_dont_capitalize:
Passed {{#invoke:categorize|getWikitext|gement kategorinamn}} [[Kategori:gement kategorinamn]] [[Kategori:gement kategorinamn]]
Text Expected Actual
test3_basic_with_sort:
Passed {{#invoke:categorize|getSortedWikitext|sv|Kategorinamn}} [[Kategori:Kategorinamn|kategorinamn]] [[Kategori:Kategorinamn|kategorinamn]]
Passed {{#invoke:categorize|getSortedWikitext|sv|Kategori1|Å-kategori}} [[Kategori:Kategori1|kategori:1]][[Kategori:Å-kategori|z~kategori]] [[Kategori:Kategori1|kategori:1]][[Kategori:Å-kategori|z~kategori]]
Text Expected Actual
test4_main:
Passed {{#invoke:categorize|getMainWikitext|en|subst|test-pagename=pagename}} [[Kategori:Engelska/Alla uppslag|pagename]][[Kategori:Engelska/Substantiv|pagename]] [[Kategori:Engelska/Alla uppslag|pagename]][[Kategori:Engelska/Substantiv|pagename]]
Passed {{#invoke:categorize|getMainWikitext|sv|adv|test-pagename=zåäö}} [[Kategori:Svenska/Alla uppslag|zz~z¡z°]][[Kategori:Svenska/Adverb|zz~z¡z°]] [[Kategori:Svenska/Alla uppslag|zz~z¡z°]][[Kategori:Svenska/Adverb|zz~z¡z°]]
Text Expected Actual
test6_template:
Passed {{#invoke:categorize|getTemplateWikitext|test-templatename=sv-verb-er}} [[Kategori:Wiktionary:Mallar för svenska|*sv-verb-er]] [[Kategori:Wiktionary:Mallar för svenska|*sv-verb-er]]
Passed {{#invoke:categorize|getTemplateWikitext|test-templatename=@}} [[Kategori:Wiktionary:Mallar|*@]] [[Kategori:Wiktionary:Mallar|*@]]
Passed {{#invoke:categorize|getTemplateWikitext|test-templatename=subst}} [[Kategori:Wiktionary:Ordklassmallar|*subst]] [[Kategori:Wiktionary:Ordklassmallar|*subst]]
Text Expected Actual
test7_main_with_special_h3_codes_by_template_call:
Passed {{förkortning|sv|test-pagename=osv.}} [[Kategori:Svenska/Alla uppslag|osv]][[Kategori:Svenska/Förkortningar|osv]] [[Kategori:Svenska/Alla uppslag|osv]][[Kategori:Svenska/Förkortningar|osv]]
Passed {{förkortning|--|auktorsförkortningar|test-pagename=A.Becker}} [[Kategori:Tvärspråkligt/Alla uppslag|abecker]][[Kategori:Tvärspråkligt/Auktorsförkortningar|abecker]] [[Kategori:Tvärspråkligt/Alla uppslag|abecker]][[Kategori:Tvärspråkligt/Auktorsförkortningar|abecker]]
Passed {{tecken|tecken=test|test-pagename=♆}} <div class="symbol-display"><div class="symbol">test</div></div>[[Kategori:Tecken|*♆]] <div class="symbol-display"><div class="symbol">test</div></div>[[Kategori:Tecken|*♆]]
Passed {{tecken|tecken=test|test-pagename=♆|mytologiska tecken|astronomiska tecken|astrologiska tecken}} <div class="symbol-display"><div class="symbol">test</div></div>[[Kategori:Mytologiska tecken|*♆]][[Kategori:Astronomiska tecken|*♆]][[Kategori:Astrologiska tecken|*♆]] <div class="symbol-display"><div class="symbol">test</div></div>[[Kategori:Mytologiska tecken|*♆]][[Kategori:Astronomiska tecken|*♆]][[Kategori:Astrologiska tecken|*♆]]
Passed {{kod|kod=test|test-pagename=SEK}} <div class="symbol-display"><div class="symbol">test</div></div>[[Kategori:Koder|*SEK]] <div class="symbol-display"><div class="symbol">test</div></div>[[Kategori:Koder|*SEK]]
Passed {{kod|valutakoder|kod=test|test-pagename=SEK}} <div class="symbol-display"><div class="symbol">test</div></div>[[Kategori:Valutakoder|*SEK]] <div class="symbol-display"><div class="symbol">test</div></div>[[Kategori:Valutakoder|*SEK]]


local sort = require("Modul:sort")
local lang = require("Modul:lang")
local h3 = require("Modul:h3")
	
local export = {}

local function ucFirst(str)
	return mw.ustring.gsub(str, "^%l", mw.ustring.upper)
end

local function extractLanguageCode(templatename)
	local language_code = ""
	local parts = mw.text.split(templatename, "-", true)

	if parts[1] then
		if lang.hasLanguage(parts[1]) then
			language_code = parts[1]
		elseif parts[2] and lang.hasLanguage(parts[1] .. "-" .. parts[2]) then
			language_code = parts[1] .. "-" .. parts[2]
		end
	end

	return language_code
end

local function isPalindrome(str, short_h3)
	return false; --ej aktiverat ännu	
	
	--exkludera tecken, koder och förkortningar (den senaste borde nog tas med ändå)
	--if short_h3 == "tecken" or short_h3 == "kod" or short_h3 == "förkortning" then
	--	return false
	--end

	--skapa omvänd textsträng
	--local temp_str = ""
	--reversed_str = mw.ustring.gsub(str, ".", function(c) temp_str = c .. temp_str end)
	
	--ta bort alla tecken som inte är bokstäver eller siffror och gör inte skillnad på gemener och versaler
	--str = mw.ustring.gsub(mw.ustring.lower(str), "%W", "")
	--reversed_str = mw.ustring.gsub(mw.ustring.lower(reversed_str), "%W", "")
	--return reversed_str == str
end

function export.getWikitext(frame)
	local categories = frame.args
	
	local text = ""
	for k, v in pairs(categories) do
		text = text .. "[[Kategori:" .. v .. "]]"
	end
	
	return text
end

function export.getSortedWikitext(frame)
	local language_code = frame.args[1] or "xx"

	local text = ""
	for k, v in pairs(frame.args) do
		if k ~= 1 then
			local sort_key = sort.getSortKey(language_code, v)
			text = text .. "[[Kategori:" .. v .. "|" .. sort_key .. "]]"
		end
	end

	return text
end

function export.getTemplateWikitext(frame)
	local title                      = mw.title.getCurrentTitle()
	local is_test                    = title.rootText == "categorize" and title.nsText == "Modul"
	local templatename               = is_test and frame.args["test-templatename"] or title.text 
	local language_code              = extractLanguageCode(templatename)
	local is_grammar_template        = language_code ~= ""
	local is_part_of_speech_template = h3.hasH3(templatename)

	local text = ""
	if is_grammar_template then
		local language = lang.getLanguage(language_code)
		text = "[[Kategori:Wiktionary:Mallar för " .. language .. "|*" .. templatename .. "]]"
	elseif is_part_of_speech_template then
		text = "[[Kategori:Wiktionary:Ordklassmallar|*" .. templatename .. "]]"
	else
		text = "[[Kategori:Wiktionary:Mallar|*" .. templatename .. "]]"
	end

	return text
end

function export.getMainWikitext(frame)
	local title                   = mw.title.getCurrentTitle()
	local is_test                 = title.rootText == "categorize" and title.nsText == "Modul"
	local language_code           = frame.args[1] or "xx"
	local short_h3                = frame.args[2] or ""
	local pagename                = is_test and (frame:getParent().args["test-pagename"] or frame.args["test-pagename"]) or title.text
	local is_always_translingual  = not not frame.args["is-always-translingual"]
	local supports_alt_categories = not not frame.args["support-alternative-categories"]

	local alternative_categories_args        = frame:getParent().args
	local alternative_categories_start_index = is_always_translingual and 1 or 2

	local language  = lang.getLanguageUCFirst(language_code)
	local h3_plural = h3.getLongPlurUCFirst(short_h3)
	
	local sort_key            = is_always_translingual and "*" .. pagename or sort.getSortKey(language_code, pagename)
	local language_slash_text = is_always_translingual and "" or language .. "/"

	local text = ""
	if title:inNamespace(0) or is_test then
		if not is_always_translingual then
			text = "[[Kategori:" .. language_slash_text .. "Alla uppslag|" .. sort_key .. "]]"
		end
		
		if supports_alt_categories and alternative_categories_args[alternative_categories_start_index] then
			for k, v in pairs(alternative_categories_args) do
				if type(k) == "number" and k >= alternative_categories_start_index then
					text = text .. "[[Kategori:" .. language_slash_text .. ucFirst(v) .. "|" .. sort_key .. "]]"
				end
			end
		else
			text = text .. "[[Kategori:" .. language_slash_text .. h3_plural .. "|" .. sort_key .. "]]"
		end			

		if isPalindrome(pagename, short_h3) then
			text = text .. "[[Kategori:" .. language .. "/Palindrom|" .. sort_key .. "]]"
		end
	end
	
	return text
end

return export