Modul:grammar-table

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

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


Syfte[redigera]

Modulens syfte är att generera wikitabellkod som ska användas som byggstenar i grammatiktabeller. Med hjälp av modulen kan grammatikmoduler skapa grammatiktabeller på ett mer läsbart och överskådligt sätt.

Användning[redigera]

Den här modulen bör bara användas av grammatikmoduler, inte av mallar eller andra moduler.
local gt = require("Modul:grammar-table")

local str = gt.getStart(3, "mallnamn", quality_check_bool, "adjektiv")
         .. gt.getRow({"!", "Rubrik"}, "böjningsform")
         .. gt.getRow({"!", "Rubrik"}, "böjningsform")
         .. gt.getEnd(3, "Kommentar", "förled")

Specifikation[redigera]

getStart
Denna funktion används för att skapa den övre delen av grammatiktabellen.
getRow
Denna funktion används för att skapa en tabellrad. Den tar ett löpande antal icke namngivna argument.
1=, 2=, 3=, osv. Ett argument bestående av {"cellmeta", "cellinnehåll", type="css-klass"} alternativt "cellinnehåll" för varje cell.
1= (obligatorisk) "cellmeta": typiskt ! eller |, eventuellt följt av class, rowspan och/eller colspan i wikisyntax:
!, |, |class="min", |rowspan="2", |class="min" colspan="3"
Wiktionary:Stilguide/Grammatik/Skapa en mall finns en mer ingående beskrivning av grammatiktabellens delar, layout och css-klasser.
2= "cellinnehåll": Detta är själva textinnehållet i rutan, vanligtvis rubriknamnet eller böjningsformen.
Parametern kan utelämnas helt och får då "&‌nbsp;" som defaultvärde. Utan "&‌nbsp;" skulle tabellrutan bli helt tom och försvinna eftersom den skulle sakna innehåll.
type= länktyp som används för att ange en css-klass i en omgivande span-tagg runt länken: <span class="infl">[[böjningsform]]</span>
Om ingen länk finns, skapas heller ingen span-tagg.
infl är defaultvärdet och används normalt för alla rutor med böjningsformer. För defaultvärdet kan parametern helt utelämnas.
no-link Det normala är att orden länkas automatiskt, om det är möjligt. Med värdet "no-link" undertrycks länkningen.
link-only Det normala är att texten både länkas och omsluts med en span-tagg. Med värdet "link-only" skapas länken som vanligt, men span-taggen undertrycks.
adv, perfpart, prespart och eventuellt andra värden används likt "infl" som klassnamn och kan användas av css och javascript för annan funktionalitet.
Rubrikrutor påverkas inte av type-parametern och länkas därför inte heller automatiskt. Om en rubrikruta avses länkas, bör länkklamrar skickas med i cellinnehållet.
Om strängvarianten används så ges 1= defaultvärdet "|" och type= ges defaultvärdet "infl". Detta är det normala för alla böjningsformer som endast fyller en enstaka cell.
getEnd
Denna funktion används för att skapa den undre delen av grammatiktabellen.
makeMaybe
Denna funktion skapar och returnerar en färdigformaterad cell att skicka in till "getRow"-funktionen om 2= (format) är "wikitable", eller en textsträng om 2= (format) är "export". Default är oförändrad.
Den används relativt ofta för böjningsformer som är tveksamma (typiskt för svenska adjektivs maskulinumform innan pers=-parametern har angetts).
1= böjningsformen som sträng eller som en cell (där parameter 2= innehåller böjningsformen)
2= format ("wikitable" eller "export")
Textsträngen som skapas från "böjningsformen" är "'''('''böjningsformen''')?'''" om 2= (format) är "wikitable" (+ type anges till "no-link"), eller "böjningsformen?" om 2= (format) är "export". Default är "böjningsformen" och övriga defaultvärden.
makeSlightly
Denna funktion skapar och returnerar en färdigformaterad cell att skicka in till "getRow"-funktionen om 2= (format) är "wikitable". Default är oförändrad.
Vanligtvis åtföljs denna användning av en kommentar i tabellens not-ruta om varför formen är satt inom parentes.
1= böjningsformen som sträng eller som en cell (där parameter 2= innehåller böjningsformen)
2= format ("wikitable" eller "export")
Cellens böjningsparameter motsvarar "'''('''[[böjningsformen]]''')'''" om "wikitable" valts som format, annars "böjningsformen?" om "export" har valts. Default är "böjningsformen".

Tester[redigera]

All tests passed.

test01_basic:

Text Expected Actual
mut.getRow({"!", "rubrik", '|rowspan="2"'}, "form1", "form2", "form3") |-

!|rubrik |rowspan="2"|<span class="infl">[[form1]]</span> ||<span class="infl">[[form2]]</span> ||<span class="infl">[[form3]]</span>

|-

!|rubrik |rowspan="2"|<span class="infl">[[form1]]</span> ||<span class="infl">[[form2]]</span> ||<span class="infl">[[form3]]</span>

mut.getRow({"|", "[[form1]], [[form2]]", type="adv"}, "[[form3]], [[form4]]") |-

||<span class="adv">[[form1]]</span>, <span class="adv">[[form2]]</span> ||<span class="infl">[[form3]]</span>, <span class="infl">[[form4]]</span>

|-

||<span class="adv">[[form1]]</span>, <span class="adv">[[form2]]</span> ||<span class="infl">[[form3]]</span>, <span class="infl">[[form4]]</span>

mut.getRow("form1, form2") |-

||<span class="infl">[[form1]]</span>, <span class="infl">[[form2]]</span>

|-

||<span class="infl">[[form1]]</span>, <span class="infl">[[form2]]</span>

test02_only_content:

Text Expected Actual
mut.getRow("form1", "form2", "form3") |-

||<span class="infl">[[form1]]</span> ||<span class="infl">[[form2]]</span> ||<span class="infl">[[form3]]</span>

|-

||<span class="infl">[[form1]]</span> ||<span class="infl">[[form2]]</span> ||<span class="infl">[[form3]]</span>

test03_only_meta:

Text Expected Actual
mut.getRow({"!"}, {"|rowspan=2"}, {'|class="min"'}) |-

!|&nbsp; |rowspan="2"|&nbsp;[[Kategori:Wiktionary:Sidor med tomma celler]] |class="min"|&nbsp;[[Kategori:Wiktionary:Sidor med tomma celler]]

|-

!|&nbsp; |rowspan="2"|&nbsp;[[Kategori:Wiktionary:Sidor med tomma celler]] |class="min"|&nbsp;[[Kategori:Wiktionary:Sidor med tomma celler]]

test04_only_meta_and_type:

Text Expected Actual
mut.getRow({"!", type="no-link"}, {'|rowspan="2"', type="no-link"}) |-

!|&nbsp; |rowspan="2"|&nbsp;[[Kategori:Wiktionary:Sidor med tomma celler]]

|-

!|&nbsp; |rowspan="2"|&nbsp;[[Kategori:Wiktionary:Sidor med tomma celler]]

test05_no_extra_links:

Text Expected Actual
mut.getRow("[[form1]], form2") |-

||<span class="infl">[[form1]]</span>, form2

|-

||<span class="infl">[[form1]]</span>, form2

mut.getRow("[[form1]]<sup>1</sup>") |-

||<span class="infl">[[form1]]</span><sup>1</sup>

|-

||<span class="infl">[[form1]]</span><sup>1</sup>

mut.getRow("[[form1]], vard. [[form2]]") |-

||<span class="infl">[[form1]]</span>, vard. <span class="infl">[[form2]]</span>

|-

||<span class="infl">[[form1]]</span>, vard. <span class="infl">[[form2]]</span>

mut.getRow("([[form1]])") |-

||(<span class="infl">[[form1]]</span>)

|-

||(<span class="infl">[[form1]]</span>)

mut.getRow("[[form1|fōrm1]]") |-

||<span class="infl">[[form1|fōrm1]]</span>

|-

||<span class="infl">[[form1|fōrm1]]</span>

mut.getRow("<nowiki/>form1, form2")
Med nowiki i modul
|-

||<nowiki/>form1, form2

|-

||<nowiki/>form1, form2

mut.getRow("<nowiki/>form1, form2")
Med nowiki i mall
|-

||"`UNIQ--nowiki-00000001-QINU`"'form1, form2

|-

||"`UNIQ--nowiki-00000001-QINU`"'form1, form2

test06_multiple_words:

Text Expected Actual
mut.getRow("ord1 ord2") |-

||ord1 ord2

|-

||ord1 ord2

test07_special_cases:

Text Expected Actual
mut.getRow(nil) |-

||&nbsp;[[Kategori:Wiktionary:Sidor med tomma celler]]

|-

||&nbsp;[[Kategori:Wiktionary:Sidor med tomma celler]]

mut.getRow("") |-

||&nbsp;[[Kategori:Wiktionary:Sidor med tomma celler]]

|-

||&nbsp;[[Kategori:Wiktionary:Sidor med tomma celler]]

mut.getRow("-") |-

||–

|-

||–

mut.getRow("?") |-

||?

|-

||?

", type="no-link"})) |-

||&nbsp;[[Kategori:Wiktionary:Sidor med tomma celler]]

|-

||&nbsp;[[Kategori:Wiktionary:Sidor med tomma celler]]

", "", type="no-link"})) |-

||&nbsp;[[Kategori:Wiktionary:Sidor med tomma celler]]

|-

||&nbsp;[[Kategori:Wiktionary:Sidor med tomma celler]]

", "-", type="no-link"})) |-

||–

|-

||–

", "?", type="no-link"})) |-

||?

|-

||?

test_08_words_containg_special_chars:

Text Expected Actual
mut.getRow("e-post") |-

||<span class="infl">[[e-post]]</span>

|-

||<span class="infl">[[e-post]]</span>

mut.getRow("word's") |-

||<span class="infl">[[word's]]</span>

|-

||<span class="infl">[[word's]]</span>

mut.getRow("words'") |-

||<span class="infl">[[words']]</span>

|-

||<span class="infl">[[words']]</span>

mut.getRow("tv:n") |-

||<span class="infl">[[tv:n]]</span>

|-

||<span class="infl">[[tv:n]]</span>

mut.getRow("[[Övriga_uppslagsord#EU:s|EU:s]]") |-

||<span class="infl">[[Övriga_uppslagsord#EU:s|EU:s]]</span>

|-

||<span class="infl">[[Övriga_uppslagsord#EU:s|EU:s]]</span>

mut.getRow("''[[Betula]]''") |-

||''<span class="infl">[[Betula]]</span>''

|-

||''<span class="infl">[[Betula]]</span>''

test_09_maybe_slightly:

Text Expected Actual
mut.getRow(mut.makeMaybe("test", "wikitable")) |-

||'''('''test''')?'''

|-

||'''('''test''')?'''

mut.getRow(mut.makeMaybe({"|", "test", type="no-link"}, "wikitable")) |-

||'''('''test''')?'''

|-

||'''('''test''')?'''

mut.getRow(mut.makeSlightly("test", "wikitable")) |-

||'''('''<span class="infl">[[test]]</span>''')'''

|-

||'''('''<span class="infl">[[test]]</span>''')'''

mut.getRow(mut.makeSlightly({"|", "test", type="perfpart"}, "wikitable")) |-

||'''('''<span class="perfpart">[[test]]</span>''')'''

|-

||'''('''<span class="perfpart">[[test]]</span>''')'''


local lk = require("Modul:link")

local export = {}

local function link(str, link_type)
	str = str or ""
	local new_str = ""
	local magic_characters_set = "[%^%$%(%)%%%.%[%]%*%+%-%?]";

	local function trimLeft(s)
		return mw.ustring.gsub(s, "^%s*", "")
	end
	
	local function escapeMagicCharacters(s)
		return string.gsub(s, magic_characters_set, "%%%1")
	end
	
	local function addSpanTagsForEachLink(s)
		for link_str in mw.ustring.gmatch(s, "%[%[[^%[%]]*%]%]") do
			local link_str_with_span_tag = '<span class="' .. link_type .. '">' .. link_str .. '</span>'
			local escaped_link_str = escapeMagicCharacters(link_str)
			s = mw.ustring.gsub(s, escaped_link_str, link_str_with_span_tag)
		end
		
		return s
	end
	
	local function isSpecialCase(s)
		return not not (s == "&nbsp;" or s == "–" or s == "?")
	end
	
	local function addCategoryIfCellIsEmpty(s)
		return s == "&nbsp;" and s .. "[[Kategori:Wiktionary:Sidor med tomma celler]]" or s
	end

	local function maybeLink(s)
		local contains_no_space = not mw.ustring.find(s, " ")
		local should_try_to_add_link = link_type ~= "no-link" and contains_no_space
		local should_add_spans = link_type ~= "link-only" and not isSpecialCase(s)
		
		if should_try_to_add_link then
			s = lk.link(s)
		end

		if should_add_spans then
			s = addSpanTagsForEachLink(s)
		end

		s = s == "" and "&nbsp;" or s
		s = s == "-" and "–" or s

		return s
	end
	
	if lk.isValidLinkTarget(str) then
		for word_str in mw.ustring.gmatch(str, '([^,]+)') do
			word_str = trimLeft(word_str)
	
			word_str = maybeLink(word_str)
			
			new_str = new_str .. (new_str == "" and "" or ", ") .. word_str
		end
	else
		new_str = maybeLink(str)
	end
	
	new_str = addCategoryIfCellIsEmpty(new_str)

	return new_str
end

function export.getStart(columns, templatename, quality_check, pagename, width)
	local talk_page = "Diskussion:" .. pagename
	local class = "grammar"
	           .. (templatename and (" template-" .. templatename) or "")
	           .. (tonumber(width) ~= nil and " min" or "")
	           .. (quality_check and " grammar-warning" or "")
	local width = tonumber(width) == nil and "10" or tostring(width)
	local quality_check_text = "Innehåller ifrågasatta uppgifter. Se [[" .. talk_page .. "|diskussion]]."
	local quality_check_section = '|class="grammar-warning min" colspan="' .. columns .. '"|Faktakoll: ' .. quality_check_text .. '\n'
	
	local str = '{| class="' .. class ..  '" cellspacing="0" width="' .. width .. '"\n'
	           .. (quality_check and quality_check_section or "")
	return str
end

function export.getRow(...)
	local row = "|-\n"
	local cell = {}
	local default_meta = "|"
	local default_type = "infl"
	arg[1] = arg[1] or ""
	
	local function makeContentNonEmpty(str)
		return (type(str) ~= "string" or str == "" or str == " ") and "&nbsp;" or str
	end

	local function isHeading(meta)
		return mw.ustring.sub(meta, 1, 1) == "!"
	end

	local function addCell()
		local extended_content = isHeading(cell.meta) and makeContentNonEmpty(cell.content) or link(cell.content, cell.type)
		row = row .. cell.meta .. "|" .. extended_content .. "\n"
	end
	
	for i,v in ipairs(arg) do
		if type(v) == "table" then
			cell.meta = v[1]
			cell.content = v[2]
			cell.type = v["type"] or default_type
		else
			cell.meta = default_meta
			cell.content = v
			cell.type = default_type
		end

		addCell()
	end

	return row
end

function export.getEnd(columns, note, as_first_part)
	local str = ""
	
	if as_first_part then
		str = str .. export.getRow({'!colspan="' .. columns .. '" class="min"', "''Som förled i sammansättningar används " .. (lk.isValidLinkTarget(as_first_part) and "'''" .. as_first_part .. "-'''" or as_first_part) .. "''."})
	end

	if note then
		str = str .. export.getRow({'|colspan="' .. columns .. '" class="note"', "<div><table><tr><th>Not:</th><td>" .. note .. "</td></tr></table></div>"})
	end

	str = str .. '|}' 

	return str
end

function export.makeMaybe(str_or_cell_table, format)
	local is_string = type(str_or_cell_table) == "string"
	local is_table  = type(str_or_cell_table) == "table"

	if format == "wikitable" then
		if is_string then
			str_or_cell_table = {'|', "'''('''" .. str_or_cell_table .. "''')?'''", type='no-link'}
		elseif is_table then
			str_or_cell_table[2] = "'''('''" .. str_or_cell_table[2] .. "''')?'''"
		end
	elseif format == "export" then
		if is_string then
			str_or_cell_table = str_or_cell_table .. "?"
		elseif is_table then
			str_or_cell_table = str_or_cell_table[2]
		end
	end
	
	return str_or_cell_table
end

function export.makeSlightly(str_or_cell_table, format)
	local is_string = type(str_or_cell_table) == "string"
	local is_table  = type(str_or_cell_table) == "table"

	if format == "wikitable" then
		if is_string then
			str_or_cell_table = "'''('''[[" .. str_or_cell_table .. "]]''')'''"
		elseif is_table then
			str_or_cell_table[2] = "'''('''[[" .. str_or_cell_table[2] .. "]]''')'''"
		end
	end

	return str_or_cell_table
end

return export