Module:CTD

From Teopedia library
Jump to navigation Jump to search

local ctd = {} -- See main module at https://ru.teopedia.org/lib/Module:CTD

local function isempty(s)
  return s == nil or s == ''
end

-------------------------------------------------
-- Convert local links [[link|text]] and URL [link text] to plain text.
-- See original function in module PM.
local function remove_links( wiki_str )
	local str = wiki_str

	-- remove local links
	i = mw.ustring.find(str,'[[',1,true)
	j = mw.ustring.find(str,']]',i,true)
	while i ~= nil do
		local link_text = mw.ustring.sub(str, i+2, j-1)
		local k = mw.ustring.find(link_text, '|', 1, true) 
		if k ~= nil then
			link_text = mw.ustring.sub(link_text, k+1)
		end
		str = mw.ustring.sub(str, 1, i-1) .. link_text .. mw.ustring.sub(str, j+2, -1)
		i = mw.ustring.find(str,'[[',1,true)
		j = mw.ustring.find(str,']]',i,true)
	end	
	
	-- remove URL
	i = mw.ustring.find(str,'[http',1,true)
	j = mw.ustring.find(str,']',i,true)
	while i ~= nil do
		local link_text = mw.ustring.sub(str, i+1, j-1)
		local k = mw.ustring.find(link_text, ' ', 1, true) 
		if k ~= nil then
			link_text = mw.ustring.sub(link_text, k+1)
		end
		str = mw.ustring.sub(str, 1, i-1) .. link_text .. mw.ustring.sub(str, j+1, -1)
		i = mw.ustring.find(str,'[http',1,true)
		j = mw.ustring.find(str,']',i,true)
	end	
	
	return str
end

-------------------------------------------------
-- Create short description without hyper links
-- Used in : Template:CTD article
-- Call example: 
-- {{#invoke: CTD | shortly 
--  | short_text = Short description, if exist 
--  | long_text  = Long description
-- }}
function ctd.shortly( frame )
	local result = ''

	-- check if sort description specified
	if not isempty(frame.args['short_text']) then
		result = frame.args['short_text']
	else 
		result = frame.args['long_text']
		-- keep only text before Category
		local i = mw.ustring.find(result,'[[Категория',1,true)
		if i ~= nil then
			result = mw.ustring.sub(result, 1, i-1)
		end
		-- convert all links to plain text
		result = remove_links(result)
		-- take only first 100 characters; string.sub() uses bytes instead of chars
		if mw.ustring.len(result) > 100 then
			result = mw.ustring.sub( result, 1, 100) .. '...'
		end
	end
	
	-- Use function point_at_end() when finished
	-- return point_at_end(result)
	return result
end

return ctd