Logic for {{lang}} and {{lang block}}.


--[=[
Module description
]=]

local p = {} --p stands for package

local getArgs = require('Module:Arguments').getArgs
local yesno = require('Module:Yesno')
local language_name = require('Module:ISO_639').language_name
local make_attribute_string = require('Module:Optional CSS attribute').make_attribute_string

--[=[
Get the appropriate text direction for a language
]=]
function p._text_direction(args)
	local rtl_langs = {
		'Arabic', -- ar
		'Aramaic', -- arc
		'Dhivehi', -- dv
		'Persian', -- fa
        'Persian (India)', -- fa-IN
        'Persian (India) (Urdu imla)', -- fa-Aran-IN
		'Hausa', -- ha
		'Hebrew', -- he, hbo
        'Northern Hindko', -- hno
		'Khowar', -- khw
		'Kashmiri', -- ks
		'Kurdish', -- ku
		'Moabite', -- obm-hebr
        'Western Punjabi', -- pnb
		'Pashto', -- ps
        'Sindhi', -- sd
        'Saraiki', -- skr
		'Syriac', -- syc, syr
		'Urdu', -- ur
		'Yiddish' -- yi
	}
	
	local lang = args.lang or ''
	local stripped_lang = mw.text.split(lang, '-')[1]
	
	local lang_name = language_name(lang) or language_name(stripped_lang)

	-- lang_name can be nil, which will make string.match() blow up
	-- TODO: This should probably emit a tracking category.
	if lang_name ~= nil then
		for k, rtl_lang in pairs(rtl_langs) do
			if string.match(lang_name, rtl_lang) then
				return 'rtl'
			end
		end
	end
	return 'ltr'
end

function p.text_direction(frame)
	return p._text_direction(getArgs(frame))
end

--[=[
Implements [[Template:Lang]] and [[Template:Lang block]]
]=]
function p._lang(args)
	local lang = args.language or args.lang or args[1] or "en"
	local text = args.text or args[2] or ""
	local inline = yesno(args.inline or "yes")
	
	local font = args.fonts or args.font
	local style = args.style
	
	local class = "wst-lang " .. (args.class or '')
	local attr = args.attr or ''
	
	local noclose = yesno(args.noclose or "no")
	
	--[=[
	Define the text direction
	]=]
	local dir = args.direction or args.dir or p._text_direction({['lang'] = lang})
	
	--[=[
	Span or div?
	]=]
	local tag
	if inline then
		tag = "span"
	else
		tag = "div"
	end
	
	--[=[
	Set the attributes.
	]=]
	local attr_table = {
		-- language
		make_attribute_string('lang', {['lang'] = lang}),
		make_attribute_string('xml:lang', {['xml:lang'] = lang}),
		make_attribute_string('dir', {['dir'] = dir}),
		
		-- style
		make_attribute_string('style', {['font-family'] = font, ['style'] = style}),
		
		-- class
		make_attribute_string('class', {['class'] = class}),
		
		-- other attributes
		attr
	}
	local attr_string = table.concat(attr_table, ' ')
	
	--[=[
	Make the tagged content.
	]=]
	local content = "<" .. tag .. " " .. attr_string .. ">" .. text
	if not noclose then
		content = content .. "</" .. tag .. ">"
	end
	return content
end

function p.lang(frame)
	local args = getArgs(frame)
	return p._lang(args)
end

return p