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 lang_code         = "sv"
local part_of_speech    = "adj"
local number_of_columns = 3
local has_warning       = "false"

local str = gt.getStart(number_of_columns, lang_code, part_of_speech, has_warning)
         .. gt.getRow({"!", "Rubrik"}, "böjningsform")
         .. gt.getRow({"!", "Rubrik"}, "böjningsform")
         .. gt.getEnd(number_of_columns, "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.

Tester redigera

20 tests failed. (refresh)

Text Expected Actual
test01_basic:
Failed 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 data-grammar-link="infl">[[form1]]</span> ||<span data-grammar-link="infl">[[form2]]</span> ||<span data-grammar-link="infl">[[form3]]</span>

Failed 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 data-grammar-link="adv">[[form1]]</span>, <span data-grammar-link="adv">[[form2]]</span> ||<span data-grammar-link="infl">[[form3]]</span>, <span data-grammar-link="infl">[[form4]]</span>

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

||<span class="infl">[[form1]]</span>, <span class="infl">[[form2]]</span> || |- ||<span data-grammar-link="infl">[[form1]]</span>, <span data-grammar-link="infl">[[form2]]</span>

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

||<span class="infl">[[form1]]</span> ||<span class="infl">[[form2]]</span> ||<span class="infl">[[form3]]</span> || |- ||<span data-grammar-link="infl">[[form1]]</span> ||<span data-grammar-link="infl">[[form2]]</span> ||<span data-grammar-link="infl">[[form3]]</span>

Text Expected Actual
test03_only_meta:
Passed 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]]

Text Expected Actual
test04_only_meta_and_type:
Passed 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]]

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

||<span class="infl">[[form1]]</span>, <span class="infl">[[form2]]</span> || |- ||<span data-grammar-link="infl">[[form1]]</span>, <span data-grammar-link="infl">[[form2]]</span>

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

||<span class="infl">[[form1]]</span><sup>1</sup> || |- ||<span data-grammar-link="infl">[[form1]]</span><sup>1</sup>

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

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

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

||'''('''<span class="infl">[[form1]]</span>''')''' || |- ||'''('''<span data-grammar-link="infl">[[form1]]</span>''')'''

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

||<span class="infl">[[form1|fōrm1]]</span> || |- ||<span data-grammar-link="infl">[[form1|fōrm1]]</span>

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

||<nowiki/>form1, <span class="infl">[[form2]]</span> || |- ||<nowiki/>form1, <span data-grammar-link="infl">[[form2]]</span>

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

||"`UNIQ--nowiki-00000001-QINU`"'form1, <span class="infl">[[form2]]</span> || |- ||"`UNIQ--nowiki-00000001-QINU`"'form1, <span data-grammar-link="infl">[[form2]]</span>

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

||ord1 ord2 || |- ||ord1 ord2

Text Expected Actual
test07_special_cases:
Passed mut.getRow(nil) |- |-
Passed mut.getRow("") |-

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

Passed mut.getRow("-") |-

||– || |- ||–

Passed mut.getRow("?") |-

||? || |- ||?

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

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

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

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

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

||– || |- ||–

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

||? || |- ||?

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

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

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

||<span class="infl">[[word's]]</span> || |- ||<span data-grammar-link="infl">[[word's]]</span>

Failed mut.getRow("words'") |-

||<span class="infl">[[words']]</span> || |- ||<span data-grammar-link="infl">[[words']]</span>

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

||<span class="infl">[[tv:n]]</span> || |- ||<span data-grammar-link="infl">[[tv:n]]</span>

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

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

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

||''<span class="infl">[[Betula]]</span>'' || |- ||''<span data-grammar-link="infl">[[Betula]]</span>''

Text Expected Actual
test_09_basic_with_lang_code:
Passed mut.setLanguage("de") (nil) (nil)
Failed mut.getRow({"!", "rubrik", '|rowspan="2"'}, "form1", "form2", "form3") |-

!|rubrik |rowspan="2"|<span class="infl">[[form1#Tyska|form1]]</span> ||<span class="infl">[[form2#Tyska|form2]]</span> ||<span class="infl">[[form3#Tyska|form3]]</span> || |- !|rubrik |rowspan="2"|<span data-grammar-link="infl">[[form1#Tyska|form1]]</span> ||<span data-grammar-link="infl">[[form2#Tyska|form2]]</span> ||<span data-grammar-link="infl">[[form3#Tyska|form3]]</span>

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

||<span class="adv">[[form1#Tyska|form1]]</span>, <span class="adv">[[form2#Tyska|form2]]</span> ||<span class="infl">[[form3#Tyska|form3]]</span>, <span class="infl">[[form4#Tyska|form4]]</span> || |- ||<span data-grammar-link="adv">[[form1#Tyska|form1]]</span>, <span data-grammar-link="adv">[[form2#Tyska|form2]]</span> ||<span data-grammar-link="infl">[[form3#Tyska|form3]]</span>, <span data-grammar-link="infl">[[form4#Tyska|form4]]</span>

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

||<span class="infl">[[form1#Tyska|form1]]</span>, <span class="infl">[[form2#Tyska|form2]]</span> || |- ||<span data-grammar-link="infl">[[form1#Tyska|form1]]</span>, <span data-grammar-link="infl">[[form2#Tyska|form2]]</span>


local lk = require("Modul:link")
local glk = require("Modul:grammar-link")

local export = {}
local m_lang_code

local function getStart(number_of_columns, lang_code, part_of_speech, has_warning, minimize_width)
	local class = minimize_width and "grammar min" or "grammar"
	local str = '{| class="' .. class ..  '" data-lang="' .. lang_code .. '" data-h3="' .. part_of_speech .. '" cellspacing="0" width="10"\n'
	
	if has_warning then
		local talk_page = mw.title.getCurrentTitle().talkPageTitle.fullText
		str = str .. '|class="grammar-warning min" colspan="' .. number_of_columns .. '"|Faktakoll: Innehåller ifrågasatta uppgifter. Se [[' .. talk_page .. '|diskussion]].\n'
	end

	return str
end

function export.getStart(number_of_columns, lang_code, part_of_speech, has_warning)
	return getStart(number_of_columns, lang_code, part_of_speech, has_warning, false)
end
	
function export.getMinimalStart(number_of_columns, lang_code, part_of_speech, has_warning)
	return getStart(number_of_columns, lang_code, part_of_speech, has_warning, true)
end

function export.getHiddenStart(number_of_columns, lang_code, part_of_speech, has_warning)
	return "" --not implemented
end

function export.setLanguage(lc)
	m_lang_code = lc
end

function export.getRow(...)
	local row = "|-\n"
	local cell = {}
	local default_meta = "|"
	local default_type = "infl"
	local has_empty_cell = false
	
	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 = ""

		if isHeading(cell.meta) then
			extended_content = makeContentNonEmpty(cell.content)
		else
			extended_content = glk.link(cell.content, cell.type, m_lang_code)
			if extended_content == "&nbsp;" then
				has_empty_cell = true
				extended_content = extended_content .. "[[Kategori:Wiktionary:Sidor med tomma celler]]"
			end
		end
		
		row = row .. cell.meta .. "|" .. extended_content .. "\n"
	end
	
	local arg = {...} -- this allows for the correct rendering when using more recent lua engines (post 5.0)
	for _,v in pairs(arg) do
		if type(v) == "table" then
			cell.meta = v[1]
			cell.content = v[2]
			cell.type = v["type"] or default_type
			addCell()
		elseif type(v) == "string" then
			cell.meta = default_meta
			cell.content = v
			cell.type = default_type
			addCell()
		end
	end
	
	return row
end

function export.getEnd(number_of_columns, note, as_first_part)
	local str = ""
	local note_exists = note ~= "-"

	if as_first_part then
		str = str .. '|-\n!colspan="' .. number_of_columns .. '" class="min"|' .. "''Som förled i sammansättningar används " .. (lk.isValidLinkTarget(as_first_part) and "'''" .. as_first_part .. "-'''" or as_first_part) .. "''.\n"
	end

	if note_exists then
		str = str .. '|-\n|colspan="' .. number_of_columns .. '" class="note"|' .. "<div><table><tr><th>Not:</th><td>" .. note .. "</td></tr></table></div>\n"
	end

	str = str .. '|}' 

	return str
end

return export