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