Modul:grammar-table

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 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