Документация за този модул може да бъде създадена на Модул:Label/doc

require('Module:No globals')
local labelsData = mw.loadData('Module:Label/data')
local Langs = require('Module:Langs')
local p = {}

local function trimObjVals(args, list)
	local r = {}
	for i, v in ipairs(list) do
		r[v] = mw.text.trim( args[v] or '' )
	end
	return r
end

-- replaces one leading and one trailing underscore with a space
local function undToSp(str)
	return string.gsub(string.gsub(str, '^_', ' '), '_$', ' ')
end

function p.main(frame)
	local inMainNS = mw.title.getCurrentTitle().namespace == 0
	local a = trimObjVals(frame.args, { 'lang', 'note', 'userLang',
		's1', 's2', 's3', 's4', 's5', 's6', 's7', 's8', 's9',   -- separators
		'before1', 'before2', 'before3', 'before4', 'before5', 'before6', 'before7', 'before8', 'before9',  -- notes
		'after1', 'after2', 'after3', 'after4', 'after5', 'after6', 'after7', 'after8', 'after9'})  -- notes
	local ids = trimObjVals(frame.args, {
		'id1', 'id2', 'id3', 'id4', 'id5', 'id6', 'id7', 'id8', 'id9'})  -- IDs from /data
	assert( a.id1 ~= '' or a.note ~= '', 'Липсва стойност на параметъра за етикета' )
	local objs = {}
	local id, iLabelsData, sep
	for i = 1, 9 do
		id = ids['id' .. i]
		if id and id ~= '' then
			iLabelsData = labelsData[id]
			assert(iLabelsData and iLabelsData.label, 'Етикет за ' .. id
				.. ' не е зададен в [[Модул:Label/data]]. Използвайте before1= до 9 и after1= до 9 за уточнения към даден етикет, note= за бележка накрая.')
			objs[#objs + 1] = trimObjVals( iLabelsData, {'link', 'label', 'labelEn', 'topcat'} )
			objs[#objs].id = id
			objs[#objs].noteBefore  =  a['before' .. i] ~= '' and undToSp(a['before' .. i]) or ''
			objs[#objs].noteAfter   =  a['after'  .. i] ~= '' and undToSp(a['after'  .. i]) or ''
			sep = undToSp(a['s' .. i])
			objs[#objs].separ = (sep ~= '' and sep or ',') .. ' '
		end
	end

	local langNameForCat = a.lang ~= ''
			and ( Langs.codeToName_({code = a.lang, toLang = 'bg', 'definite', 'langWord'}) or a.lang )
			or ''

	local r = '<span class="contextlabel">('
	local prevSepar = ''

	for i, o in ipairs(objs) do
		r = r .. prevSepar

		if o.noteBefore ~= '' then
			r = r .. o.noteBefore
		end

		if o.link ~= '' then
			r = r .. '[[' .. o.link .. '|' .. o.label .. ']]'
		else
			r = r .. o.label
		end

		if a.userLang == 'en' and o.labelEn ~= '' then
			r = r .. ' <span class="enTranslation">' .. o.labelEn .. '</span>'
		end

		if o.noteAfter ~= '' then
			r = r .. o.noteAfter
		end

		prevSepar = o.separ

		if inMainNS and o.topcat ~= '' then
				if a.lang == 'none' or a.lang == '' then
					r = r  .. '[[Категория:' .. o.topcat .. ']]'
				else
					r = r .. '[[Категория:' .. o.topcat .. '/' .. langNameForCat .. ']]'
				end
		end
	end

	if a.note ~= '' then
		r = r .. prevSepar .. a.note
	end

	r = r .. ')</span>'

	if a.lang == '' then
		r = r .. '[[Категория:Страници с шаблони с липсващ езиков код]]'
	end

	return r
end

return p