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


Syfte redigera

Kan användas av moduler eller mallar för att länka en textsträng om det är möjligt, annars lämna den olänkad, samt svara på om en textsträng över huvud taget kan länkas. Hanterar specialfall som "", "-" och "?". Används typiskt av grammmatikmoduler men används med fördel av alla typer av mallar och moduler där motsvarande funktionalitet är väntad.

Användning redigera

Från modul:

local lk = require("Modul:link")

local can_create_page      = lk.isValidLinkTarget("sidnamn")      -- true
local cannot_create_page   = lk.isValidLinkTarget("[[sidnamn]]")  -- false
local modified_string      = lk.link("sidnamn")                   -- [[sidnamn]]
local unmodified_string    = lk.link("[[sidnamn]]")               -- [[sidnamn]]
local special_case_1       = lk.link("")                          -- &‌nbsp;
local special_case_2       = lk.link("-")                         -- –
local special_case_3       = lk.link("?")                         -- ?
local anchor               = lk.link("[[sidnamn]]", sv)           -- [[sidnamn#Svenska|sidnamn]]
local anchor_other_text_1  = lk.link("[[sidnamn]]et", sv)         -- [[sidnamn#Svenska|sidnamn]]et
local anchor_other_text_2  = lk.link("[[sidnamn|sidnamnet]]", sv) -- [[sidnamn#Svenska|sidnamnet]]

  Från mall:

{{#invoke:link|isValidLinkTarget|sidnamn}}     -- true
{{#invoke:link|isValidLinkTarget|[[sidnamn]]}} -- false
{{#invoke:link|link|sidnamn}}                  -- [[sidnamn]]
{{#invoke:link|link|[[sidnamn]]}}              -- [[sidnamn]]
{{#invoke:link|link|}}                         -- &‌nbsp;
{{#invoke:link|link|-}}                        -- –
{{#invoke:link|link|?}}                        -- ?
{{#invoke:link|link|[[sidnamn]]|sv}}           -- [[sidnamn#Svenska|sidnamn]]
{{#invoke:link|link|[[sidnamn]]et|sv}}         -- [[sidnamn#Svenska|sidnamn]]et
{{#invoke:link|link|[[sidnamn|sidnamnet]]|sv}} -- [[sidnamn#Svenska|sidnamnet]]

Tester redigera

All tests passed. (refresh)

Text Expected Actual
test01_basic:
Passed mut.link("ord") [[ord]] [[ord]]
Text Expected Actual
test02_special_cases:
Passed mut.link("-")
Passed mut.link("?") ? ?
Passed mut.link("")    
Text Expected Actual
test03_namespaces:
Passed mut.link(":Kategori:Index") [[:Kategori:Index]] [[:Kategori:Index]]
Passed mut.link("w:Portal:Huvudsida") [[w:Portal:Huvudsida]] [[w:Portal:Huvudsida]]
Passed mut.link(":en:Wiktionary:Main Page") [[:en:Wiktionary:Main Page]] [[:en:Wiktionary:Main Page]]
Text Expected Actual
test04_links_with_special_chars:
Passed mut.link("abc#åäö") [[abc#åäö]] [[abc#åäö]]
Passed mut.link("...") [[...]] [[...]]
Passed mut.link("(") [[(]] [[(]]
Passed mut.link("\"") [["]] [["]]
Text Expected Actual
test05_phrases:
Passed mut.link("compound word") [[compound word]] [[compound word]]
Passed mut.link("[[Surt, sa räven]]") [[Surt, sa räven]] [[Surt, sa räven]]
Passed mut.link("[[Surt, sa räven om rönnbären.]]") [[Surt, sa räven om rönnbären.]] [[Surt, sa räven om rönnbären.]]
Passed mut.link("[[veni, vidi, vici]]") [[veni, vidi, vici]] [[veni, vidi, vici]]
Text Expected Actual
test06_multiword:
Passed mut.link("ord1, ord2") [[ord1]], [[ord2]] [[ord1]], [[ord2]]
Passed mut.link("[[ord1]], ord2") [[ord1]], [[ord2]] [[ord1]], [[ord2]]
Passed mut.link("[[frasord1, frasord2]], ord1, [[ord2]]") [[frasord1, frasord2]], [[ord1]], [[ord2]] [[frasord1, frasord2]], [[ord1]], [[ord2]]
Text Expected Actual
test07_already_linked_should_not_double_link:
Passed mut.link("[[ord]]") [[ord]] [[ord]]
Passed mut.link("[[ord|text]]") [[ord|text]] [[ord|text]]
Passed mut.link("[[ord]]<sup>1</sup>") [[ord]]<sup>1</sup> [[ord]]<sup>1</sup>
Text Expected Actual
test08_invalid_titles:
Passed mut.link(".") . .
Passed mut.link("..") .. ..
Passed mut.link(":") : :
Passed mut.link("> abc") > abc > abc
Text Expected Actual
test09_anchors:
Passed mut.link("[[ord]]", "en") [[ord#Engelska|ord]] [[ord#Engelska|ord]]
Passed mut.link("ord", "en") [[ord#Engelska|ord]] [[ord#Engelska|ord]]
Passed mut.link("[[ord1]], ord2", "en") [[ord1#Engelska|ord1]], [[ord2#Engelska|ord2]] [[ord1#Engelska|ord1]], [[ord2#Engelska|ord2]]
Passed mut.link("[[w:ord]]", "en") [[w:ord]] [[w:ord]]
Passed mut.link("[[Wiktionary:ord]]", "en") [[Wiktionary:ord]] [[Wiktionary:ord]]
Passed mut.link("[[mumsa i|mumsa i sig]]", "en") [[mumsa i#Engelska|mumsa i sig]] [[mumsa i#Engelska|mumsa i sig]]
Passed mut.link("[[Sverige]]s", "sv") [[Sverige#Svenska|Sverige]]s [[Sverige#Svenska|Sverige]]s
Passed mut.link("[[skratte#Bokmål|skratte]]", "no") [[skratte#Bokmål|skratte]] [[skratte#Bokmål|skratte]]
Passed mut.link("[[Surt, sa räven|Nåt helt annat]]") [[Surt, sa räven|Nåt helt annat]] [[Surt, sa räven|Nåt helt annat]]
Passed mut.link("[[veni, vidi, vici|nåt helt annat]]") [[veni, vidi, vici|nåt helt annat]] [[veni, vidi, vici|nåt helt annat]]
Passed mut.link("[[Surt, sa räven|Nåt helt annat]]", "en") [[Surt, sa räven#Engelska|Nåt helt annat]] [[Surt, sa räven#Engelska|Nåt helt annat]]
Passed mut.link("[[veni, vidi, vici|nåt helt annat]]", "en") [[veni, vidi, vici#Engelska|nåt helt annat]] [[veni, vidi, vici#Engelska|nåt helt annat]]
Passed mut.link("[[abc▶]]", "en") [[abc&#9654;#Engelska|abc&#9654;]] [[abc&#9654;#Engelska|abc&#9654;]]
Passed mut.link("[[abc▶]]", "en") [[abc&#x25b6;#Engelska|abc&#x25b6;]] [[abc&#x25b6;#Engelska|abc&#x25b6;]]
Text Expected Actual
test10_do_add_anchor_even_if_pagename_equals_word:
Passed mut.link("link", "en") [[link#Engelska|link]] [[link#Engelska|link]]
Passed mut.link("[[link]]", "en") [[link#Engelska|link]] [[link#Engelska|link]]
Passed mut.link("link, [[link]]", "en") [[link#Engelska|link]], [[link#Engelska|link]] [[link#Engelska|link]], [[link#Engelska|link]]
Text Expected Actual
test11_entry_name_should_be_used:
Passed mut.link("abdērītānus", "la") [[abderitanus#Latin|abdērītānus]] [[abderitanus#Latin|abdērītānus]]
Passed mut.link("[[abdērītānus]]", "la") [[abderitanus#Latin|abdērītānus]] [[abderitanus#Latin|abdērītānus]]
Passed mut.link("[[abdērītānus#Latin|madeup]]", "la") [[abderitanus#Latin|madeup]] [[abderitanus#Latin|madeup]]
Text Expected Actual
test12_multiword_with_anchors:
Passed mut.link("[[multiple]] [[word]]s", "en") [[multiple#Engelska|multiple]] [[word#Engelska|word]]s [[multiple#Engelska|multiple]] [[word#Engelska|word]]s
Passed mut.link("[[abdērītānus1]] [[abdērītānus2]]", "la") [[abderitanus1#Latin|abdērītānus1]] [[abderitanus2#Latin|abdērītānus2]] [[abderitanus1#Latin|abdērītānus1]] [[abderitanus2#Latin|abdērītānus2]]
Passed mut.link("[[abdērītānus1#Latin|madeup1]] [[abdērītānus2#Latin|madeup2]]", "la") [[abderitanus1#Latin|madeup1]] [[abderitanus2#Latin|madeup2]] [[abderitanus1#Latin|madeup1]] [[abderitanus2#Latin|madeup2]]


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

function export.isValidLinkTarget(arg)
	local str

	if arg == mw.getCurrentFrame() then
		local frame = arg
		str = frame.args[1]
	else
		str = arg
	end

	local success, res = pcall(mw.title.new, str)
	
	return not not res
end

function export.link(arg1, arg2)
	local str
	local lang_code
	if arg1 == mw.getCurrentFrame() then
		local frame = arg1
		str         = frame.args[1] or ""
		lang_code   = frame.args[2] or ""
	else
		str         = arg1 or ""
		lang_code   = arg2 or ""
	end

	local language  = lang.hasLanguage(lang_code) and lang.getLanguageUCFirst(lang_code) 

	while mw.ustring.find(str, "%[%[[^%[%]]*,[^%[%]]*%]%]") do
		str = mw.ustring.gsub(str, "(%[%[[^%[%]]*),([^%[%]]*%]%])", "%1ESCAPE-COMA-EPACSE%2")
	end
	
	str = mw.ustring.gsub(str, "%&%#", "ESCAPE-AMPERSAND-HASH-EPACSE");

	local strs = mw.text.split(str,"%s*,%s*")
	
	local new_str = ""
	for i,s in ipairs(strs) do
		local is_special_string = s == "" or s == "-" or s == "?"
		s = s == "-" and "–" or s
		s = s == "" and "&nbsp;" or s
	
		local should_add_brackets = not is_special_string and export.isValidLinkTarget(s)
		local should_add_anchor   = not not language
		

		if should_add_brackets then
			if should_add_anchor then
				s = "[[" .. lang.getEntryName(lang_code, s) .. "#" .. language .. "|" .. s .. "]]"
			else
				s = "[[" .. s .. "]]"
			end
		else
			if should_add_anchor then
				local matches1 = mw.ustring.gmatch(s, "%[%[([^%]:%|%#]+)#[^%]:%|]+%|[^%]:%|]+%]%]")
				local matches2 = mw.ustring.gmatch(s, "%[%[([^%]:%|%#]+)%|[^%]:%|]+%]%]")
				local matches3 = mw.ustring.gmatch(s, "%[%[([^%]:%|%#]+)%]%]")

				for match in matches1 do
					local entry_name = lang.getEntryName(lang_code, match)
					s = mw.ustring.gsub( s, "%[%[([^%]:%|%#]+)#[^%]:%|]+(%|[^%]:%|]+)%]%]", ("[[" .. entry_name .. "ESCAPE-HASH-EPACSE" .. language .. "%2]]"),1)
				end
				for match in matches2 do
					local entry_name = lang.getEntryName(lang_code, match)
					s = mw.ustring.gsub( s, "%[%[([^%]:%|%#]+)(%|[^%]:%|]+)%]%]", ("[[" .. entry_name .. "#" .. language .. "%2]]"),1)
				end
				for match in matches3 do
					local entry_name = lang.getEntryName(lang_code, match)
					s = mw.ustring.gsub( s, "%[%[([^%]:%|%#]+)%]%]", ("[[" .. entry_name .. "#" .. language .. "|%1]]"),1)
				end
			end
		end
		
		new_str = new_str .. s
		
		if i ~= #strs then
			new_str = new_str .. ", "
		end
	end	

	new_str = mw.ustring.gsub(new_str, "ESCAPE%-AMPERSAND%-HASH%-EPACSE", "&#");
	new_str = mw.ustring.gsub(new_str, "ESCAPE%-HASH%-EPACSE", "#");
	new_str = mw.ustring.gsub(new_str, "ESCAPE%-COMA%-EPACSE", ",")

	return new_str 
end

return export