Dokumentation för denna modul finns på /dok (redigera), /test
Implementerar {{kategorinavigering-härledningar}}
.
All information hämtas från sidnamnet som måsta vara på formen:
Kategori:
<Språk 1>/Härledningar från
<språk 2>
en
") härledda från svenska (kod "sv
").en
") härledda från latin (kod "la
").
Mallanvändning -- "Mall:kategorinavigering-härledningar" används enbart på särskilda kategorisidor.
Se dokumentationen.
sv
") härledda från samiska (kod "h-smi
" , reserverad för härledningar).
Mallanvändning -- "Mall:kategorinavigering-härledningar" har upptäckt okänt språknamn "samiska" i sidnamnet.
3 olika fel detekteras. Spårningskategori Kategori:Mallanvändning och andra. Tydliga röda varningar visas alltid.
-- no parameters, depends on pagename and namespace
local exporttbl = {}
local import_lang = require ("Modul:lang")
local import_param = require ("Modul:param")
local name_short = 'kategorinavigering-härledningar'
local name_long = '"Mall:' .. name_short .. '"' -- quoted
local separation_string = "/Härledningar från "
local function ucFirst(str)
return mw.ustring.gsub(str, "^%l", mw.ustring.upper)
end
local function expandTwo (control_string, insert_m_string, insert_v_string)
local temp_string = ''
local expanded_string = ''
local x_length = 0
local x_index = 0
local chark = 0
local charl = 0
x_length = string.len (control_string)
while true do
if (x_index==x_length) then
break
end--if
chark = string.byte (control_string,(x_index+1),(x_index+1))
x_index = x_index + 1
charl = 0
if (x_index<x_length) then
charl = string.byte (control_string,(x_index+1),(x_index+1))
end--if
if ((chark==64) and (charl==77)) then -- @M cannot be empty
temp_string = insert_m_string
x_index = x_index + 1
else
if ((chark==64) and (charl==86)) then -- @V can be empty
temp_string = insert_v_string
x_index = x_index + 1
else
temp_string = string.char (chark)
end--if
end--if
expanded_string = expanded_string .. temp_string
end--while
return expanded_string
end--function expandTwo
local function ifExistEnhanced (arxinp3,strpgname,aggressive_mode)
local boomemangada = false
local metaa = 0
if (aggressive_mode) then -- does NOT work with substitution
boomemangada = ( '[[:' .. strpgname .. ']]' ~= arxinp3:preprocess ('{{msgnw::' .. strpgname .. '}}') )
else
metaa = mw.title.new (strpgname) -- 1 param
boomemangada = metaa.exists -- expensive
end--if
return boomemangada
end--function ifExistEnhanced
function exporttbl.go (arxframent)
local arxsomons = 0
local legal_params = {}
local many_complaints = {}
local list_bad_params = ''
local violating_string = ''
local problem_1_main = ''
local problem_2_desc = ''
local problem_3_hint = ''
local p_2_desc_expanded = ''
local pagename = '' -- crucial, override exists
local lang_lemma = ''
local lang_etymo = ''
local lang_lemma_ucf = ''
local lang_etymo_ucf = ''
local code_lemma = ''
local code_etymo = ''
local cat_opposite = ''
local error_visible = ''
local error_cat = ''
local good_visible = ''
local good_cat = ''
local final_result = ''
local error_code = 0
local pagename_len = 0
local num_namespace = 0 -- must be 14, override exists
local position_a = 0
local position_b = 0
local boo_no_cat_true = false
local boo_bad_pagename = false
local boo_no_lemma_code = false
local boo_opposite_exists = false
arxsomons = arxframent.args -- "args" from our own "frame"
if (arxsomons=="true") then
arxsomons = arxframent:getParent().args -- "args" from caller's "frame"
end--if
legal_params = {=0,"nocat","pagenameoverridetestonly","nsnumberoverridetestonly"}
list_bad_params = import_param.go (arxsomons,legal_params)
pagename = arxsomons or mw.title.getCurrentTitle().text
num_namespace = tonumber (arxsomons or mw.title.getCurrentTitle().namespace)
boo_no_cat_true = (arxsomons=="true")
many_complaints = {'Ogiltiga parametrar','@M använder inte @V','Den här mallen behöver inga parametrar alls.'}
many_complaints = {'Mallanvändning','@M används enbart på särskilda kategorisidor','Se dokumentationen.'}
many_complaints = {'Mallanvändning','@M har upptäckt okänt språknamn @V i sidnamnet'}
boo_bad_pagename = (num_namespace~=14)
if not boo_bad_pagename then
pagename_len = string.len(pagename)
boo_bad_pagename = (pagename_len<24)
end--if
if not boo_bad_pagename then
position_a = (string.find(pagename,separation_string,1,true) or 1) - 1 -- inclusive last pos ONE-based, ZERO if NOT found
boo_bad_pagename = (position_a<2) -- minimal length of lang name 2 chars "yi"
end--if
if not boo_bad_pagename then
position_b = position_a + string.len(separation_string) + 1 -- inclusive beginning pos ONE-based
boo_bad_pagename = ((position_b+1)>pagename_len) -- minimal length of lang name 2 chars "yi"
end--if
if not boo_bad_pagename then
lang_lemma = mw.ustring.lower(string.sub(pagename,1,position_a)) -- wrong capitalization will fire error "bad pagename"
lang_etymo = mw.ustring.lower(string.sub(pagename,position_b,pagename_len)) -- wrong capitalization will fire error "bad pagename"
lang_lemma_ucf = ucFirst(lang_lemma)
lang_etymo_ucf = ucFirst(lang_etymo)
boo_bad_pagename = (pagename~=(lang_lemma_ucf..separation_string..lang_etymo)) or (lang_lemma==lang_etymo) -- wrong capitalization or are same
end--if
if not boo_bad_pagename then
code_lemma = import_lang.getCode (lang_lemma) -- do NOT accept etymological codes here
code_etymo = import_lang.getCode (lang_etymo,"alsoetym") -- YES do accept etymological codes here
boo_no_lemma_code = (import_lang.getCode(lang_etymo)=="xx")
end--if
while true do
if list_bad_params ~= '' then
error_code = 1
violating_string = list_bad_params
break
end--if
if boo_bad_pagename then
error_code = 2 -- no violating string here
break
end--if
if (code_lemma=="xx") then
error_code = 3 -- code 3 used two times
violating_string = '"' .. lang_lemma .. '"'
break
end--if
if (code_etymo=="xx") then
error_code = 3 -- code 3 used two times
violating_string = '"' .. lang_etymo .. '"'
end--if
break
end--while
if (error_code~=0) then
problem_1_main = many_complaints
problem_2_desc = many_complaints -- @M cannot be empty, @V can be empty but NOT nil
problem_3_hint = many_complaints or '' -- optional, can be empty
p_2_desc_expanded = expandTwo (problem_2_desc, name_long, violating_string)
error_cat = ']]'
error_visible = '<br><span class="error"><b>' .. problem_1_main .. ' -- ' .. p_2_desc_expanded .. '.</b></span></br>'
if (problem_3_hint~='') then
error_visible = error_visible .. problem_3_hint
end--if
end--if
if (error_code==0) then
good_visible = '<div style="margin:0.7em;">Den här kategorin innehåller uppslag på ' .. lang_lemma
good_visible = good_visible .. ' (kod "<code>' .. code_lemma .. '</code>") härledda från '
good_visible = good_visible .. lang_etymo .. ' (kod "<code>' .. code_etymo .. '</code>"'
if boo_no_lemma_code then
good_visible = good_visible .. " , reserverad för härledningar"
end--if
good_visible = good_visible .. ").</div>"
good_visible = good_visible .. '<div style="margin:0.7em;"><i>Se även kategorierna:</i> ]'
good_visible = good_visible .. ", <b>]</b>"
good_visible = good_visible .. ", <b>]</b>."
if not boo_no_lemma_code then
cat_opposite = lang_etymo_ucf .. separation_string .. lang_lemma -- omit ns prefix
boo_opposite_exists = ifExistEnhanced (arxframent,("Kategori:"..cat_opposite),false)
good_visible = good_visible .. " Motsatt kategori "
if (boo_opposite_exists) then
good_visible = good_visible .. 'är <b>]</b>.'
else
good_visible = good_visible .. '"Kategori:' .. cat_opposite .. '" saknas.'
end--if
end--if
good_visible = good_visible .. "</div>"
good_cat= "]]"
end--if (error_code==0) then
if (error_code==0) then
final_result = good_visible -- do NOT warn since the template is used on very short pages only
else
final_result = error_visible
end--if
if (not boo_no_cat_true) then
if (error_code==0) then
final_result = final_result .. good_cat
else
final_result = final_result .. error_cat
end--if
end--if
return final_result
end--function
return exporttbl