มอดูล:Citation/CS1/Local

จากวิกิพีเดีย สารานุกรมเสรี
Documentation icon คู่มือการใช้งานมอดูล[สร้าง]
--[[--------------------------< F O R W A R D   D E C L A R A T I O N S >--------------------------------------
]]

local cfg;																		-- table of tables imported from slected Module:Citation/CS1/Configuration


local function _convert_year(val, local_digits)
	val = mw.ustring.gsub (val, '%d', local_digits);			-- translate 'local' digits to Western 0-9
	if val:match("^%d+$") then
		val = val-543;
		-- convert year to 4 digits to prevent it being interpreted as day in en module
		if val<0 then
			--return false; -- TODO: handle this
			return val; -- TODO: handle this?
		--elseif val<1 then
		--	val='000'..val;
		elseif val<10 then -- this should be faster than formatDate()?
			val='000'..val;
		elseif val<100 then
			val='00'..val;
		elseif val<1000 then
			val='0'..val;
		end
		return val;
	end
	return false;
end

local en_month_name = {'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'};
local function _convert_local_date(val, date_names_local, local_digits)
	local dmy = mw.text.split(val, '%s+');
	if #dmy == 3 then
		dmy[2] = date_names_local.long[dmy[2]] or date_names_local.short[dmy[2]];
		if dmy[2] then
			--dmy[1] = tonumber(dmy[1]); if dmy[1]<10 then dmy[1]='0'..dmy[1]; end -- this should be faster than formatDate()
			--dmy[2] = tonumber(dmy[2]); if dmy[2]<10 then dmy[2]='0'..dmy[2]; end
			--return dmy[3]-543 ..'-'..dmy[2]..'-'..dmy[1];
			dmy[1] = mw.ustring.gsub (dmy[1], '%d', local_digits);			-- translate 'local' digits to Western 0-9
			-- always interprete dmy[1] as day
			if dmy[1]:match("^%d%d?$") then
				dmy[1] = tonumber(dmy[1]); if dmy[1]>31 or dmy[1]<1 then return val; end
				dmy[3] = _convert_year(dmy[3], local_digits);
				if dmy[3] then
					return dmy[1]..' '..en_month_name[dmy[2]]..' '..dmy[3];
				end
				return val;
			end
			return val;
		end
		return val;
	elseif #dmy == 2 then
		local dmy1 = date_names_local.long[dmy[1]] or date_names_local.short[dmy[1]];
		if dmy1 then
			dmy[2] = _convert_year(dmy[2], local_digits);
			if dmy[2] then
				return en_month_name[dmy1]..' '..dmy[2];
			end
			return val;
		end
		dmy[2] = date_names_local.long[dmy[2]] or date_names_local.short[dmy[2]];
		if dmy[2] then
			dmy[1] = mw.ustring.gsub (dmy[1], '%d', local_digits);			-- translate 'local' digits to Western 0-9
			-- always interprete dmy[1] as day
			if dmy[1]:match("^%d%d?$") then
				dmy[1] = tonumber(dmy[1]); if dmy[1]>31 or dmy[1]<1 then return val; end
				return dmy[1]..' '..en_month_name[dmy[2]];
			end
			return val;
		end
		return val;
	elseif #dmy == 1 then
		dmy[1] = date_names_local.long[dmy[1]] or date_names_local.short[dmy[1]];
		if dmy[1] then
			return en_month_name[dmy[1]];
		end
		return val;
	else
		return val;
	end
end

--[[

Some local wiki use non-Gregorian calendar.
Use this function to convert local non-Gregorian calendar to Gregorian calendar

]]

local function convert_local_date(k, val)
	if 'year'==k then
		--return 2010;
		return val;
	--elseif 'date'==k or 'access-date'==k or 'archive-date'==k or 'doi-broken-date'==k or 'embargo'==k or 'lay-date'==k or 'publication-date'==k then
	--	return _convert_local_date(val, cfg.date_names['local'], cfg.date_names.local_digits);
	--elseif 'embargo'==k then
	--	return val;
	else
mw.log(k, _convert_local_date(val, cfg.date_names['local'], cfg.date_names.local_digits));
		return _convert_local_date(val, cfg.date_names['local'], cfg.date_names.local_digits);
		--return val;
	end
	--return '2010-04-30';
	--return val;
end

--[[--------------------------< S E T _ S E L E C T E D _ M O D U L E S >--------------------------------------

Sets local imported functions table to same (live or sandbox) as that used by the other modules.

]]

local function set_selected_modules (cfg_table_ptr, utilities_page_ptr)
	cfg = cfg_table_ptr;														-- import tables from selected Module:Citation/CS1/Configuration
end


--[[--------------------------< E X P O R T S >----------------------------------------------------------------
]]

return 	{
	convert_local_date = convert_local_date,
	set_selected_modules = set_selected_modules,
	_convert_local_date = _convert_local_date, -- TODO: split to another separated module?
	_convert_local_year = _convert_year, -- TODO: split to another separated module?
}