Для документации этого модуля может быть создана страница Модуль:Copyright/sandbox/Документация

local p = {}

local r = {t = {}, c ={}}
function r:add(s) table.insert(self.t, s) end
function r:add_category(s) table.insert(self.c, '[[Категория:'..s..']]') end
function r:result() return table.concat(self.t) .. table.concat(self.c)  end

-- инициализация базовых параметров
local countries_words = {['Россия']='России', ['Узбекистан']='Узбекистане', ['Белоруссия']='Белоруссии', ['Украина']='Украине'}
local d = {}
local function init_values(frame)
	local pargs = frame:getParent().args
	d = {
		year_death = nil,                        -- год смерти
		approximate = (pargs[1] == '?'),         -- дата смерти препдоположительна
		year_reability = nil,                    -- год реабилитаци
		country = 'Россия',                      -- страна первых изданий произведений
		years_base_term =  70,                   -- лет, базовый срок действия АП после смерти автора
		year_free = nil,                         -- год когда произведения перейдут в АП, высчитывается
		wikilivres = is(pargs['Wikilivres']),    -- страница автора на Викикливр
		wikilivres_ru = is(pargs['ВИКИЛИВРУ']),  -- страница автора на Викикливр.ру
	}
	
	local year_death = tonumber(pargs['ГОД'])
	-- mw.logObject(pargs, "pargs")
	local entity = mw.wikibase.getEntity()
	if entity then 
		local year_death_wd = get_year_death_wd(entity)  -- из ВД
		if year_death ~= year_death_wd then 
			r:add_category('Викиданные:Год смерти отличается от указанного в шаблоне АП') 
			year_death = year_death_wd
		end
	end
	
	local years_war = 0
	local year_from = nil
	local country = pargs['СТРАНА'] and mw.ustring.lower(pargs['СТРАНА'])
	if country == 'узбекистан' or country == 'узсср' then  -- не учитывается ВОВ/реабилитация
		-- Статья 35. Срок действия авторского права. https://lex.uz/acts/1023494
		d.country = 'Узбекистан'
		d.years_base_term = 50 -- срок охраны
		year_from = year_death
		 
	else
		year_reability = tonumber(pargs['ГОДРЕАБИЛИТАЦИИ'])
		if year_reability and year_death then year_from = math.max(year_reability, year_death) else year_from = tonumber(year_reability) or tonumber(year_death) end
		local war_status = pargs['ВОВ'] and mw.ustring.lower( pargs['ВОВ'] ); if war_status == 'участник' or war_status == 'работник' then 
			years_war = 4 
		end
	end
	d.year_death = year_death
	d.year_reability = year_reability
	
	if not year_from then return end
	d.year_free = year_from + years_war + d.years_base_term + 1  -- Расчёт года перехода в ОД, с 1 января следующего года
	-- mw.logObject(d, "d")
	return d.year_free
end	

function p.year70pma(frame)
	return init_values(frame)
end	

-- Шаблон:АП
function p.template(frame)
	local year_free = init_values(frame)
	local year_death, year_reability = d.year_death, d.year_reability
	local CURRENTYEAR = tonumber(os.date( '%Y' ))
	local year_by_uraa = CURRENTYEAR - 95 - 1
	local NSMAIN; if mw.title.getCurrentTitle().namespace == 0 then NSMAIN = 0 end
	local years_before_free = year_free - CURRENTYEAR
	
	-- если год не указан
	if not year_death and not year_reability then
		r:add(frame:expandTemplate{ title = 'license', args = {image='Red copyright.svg', 
			text = "Публикация произведений этого автора в Викитеке возможна только с его согласия.",
			note = "См. также [[w:Википедия:Получение разрешений|Википедия:Получение разрешений]]."}})
		if NSMAIN then r:add_category("Авторы, публикация произведений которых возможна только с их согласия") end
	
	-- умер до 1917 года
	elseif not year_reability and year_death < 1917 then
		r:add(frame:expandTemplate{ title = 'PD-author-old', 
			-- args = {set_from_module_copyright='true'}  -- [[special:diff/3871262]] → [[Категория:Включения шаблона PD-author-old]]
		})
	
	elseif year_free <= CURRENTYEAR then
		local s = {}
		if d.years_base_term < 70 then 
			table.insert(s, 
				"Произведения этого автора, обнародованные при его жизни в ".. countries_words[d.country] ..", находятся в&nbsp;'''[[Справка:Общественное достояние|общественном достоянии]]''' в этой стране, поскольку истёк "..d.years_base_term.."-летний срок охраны исключительного права." )
		else
			table.insert(s, 
				"Произведения этого автора, обнародованные при его жизни в ".. countries_words[d.country] ..", находятся в&nbsp;'''[[Справка:Общественное достояние|общественном достоянии]]''' в этой стране, поскольку истёк "..d.years_base_term.."-летний срок охраны исключительного права." )  
			-- Дополнительную фразу про другие страны нет смысла упоминать, поскольку законы в разных странах разные, могут меняться, издательства сами знают. Здесь не юридическая консультация.
			--  "Это может распространятся на большинство стран [[w:Бернская конвенция об охране литературных и художественных произведений|Бернской конвенции]].""
		end
		if year_reability or year_death > 1917 then 
			table.insert(s, "Произведения, обнародованные после ".. year_by_uraa .." года могут оставаться под защитой авторских прав в США, в юрисдикции которых расположены сервера Викитеки." )
		end
		table.insert(s, "Переводы и позднейшие редакции произведений этого автора могут являться объектами авторских прав соответствующих лиц согласно [[Гражданский кодекс РФ/Глава 70#Статья 1260|статье 1260 ГК РФ]].")
		r:add(frame:expandTemplate{ title = 'license', args = {image='PD-icon.svg', text = table.concat(s, '\n\n') }})

-- Две категории для поддержки "Дня общественного достояния"				
		if years_before_free == 0 then r:add_category('Авторы, срок исключительных прав на произведения которых истекает в этом году')
		elseif years_before_free == -1 then r:add_category('Авторы, срок исключительных прав на произведения которых истёк в прошлом году')
		end
	
	else
		r:add(frame:expandTemplate{ title = 'license', args = {image='Red copyright.svg', 
			text = [=[В&nbsp;соответствии&nbsp;со&nbsp;[[Гражданский кодекс РФ/Глава 70#Статья 1281. Срок действия исключительного права на произведение|статьёй&nbsp;1281 ГК&nbsp;РФ]] произведения этого автора, впервые опубликованные (или обнародованные) после 7 ноября 1917 года (по новому стилю) на территории [[w:Российская Федерация|Российской Федерации]] или стран, правопреемником которых является Российская Федерация ([[w:СССР|СССР]], [[w:РСФСР|РСФСР]], [[w:Советская Россия (государство)|Советская Россия]]), перейдут в&nbsp;[[Викитека:Общественное достояние|общественное достояние]] '''1&nbsp;января ]=] ..year_free.. "&nbsp;года'''." .. p.wikilivres() }})
		
		if NSMAIN then 
			r:add_category('Авторы, срок исключительных прав на произведения которых ещё не истёк')
			
			if years_before_free >= 50 then r:add_category('Авторы, срок исключительных прав на произведения которых истекает позднее чем через 50 лет')
			elseif years_before_free >= 40 then r:add_category('Авторы, срок исключительных прав на произведения которых истекает позднее чем через 40 лет')
			elseif years_before_free >= 30 then r:add_category('Авторы, срок исключительных прав на произведения которых истекает позднее чем через 30 лет')
			elseif years_before_free >= 20 then r:add_category('Авторы, срок исключительных прав на произведения которых истекает позднее чем через 20 лет')
			elseif years_before_free >= 10 then r:add_category('Авторы, срок исключительных прав на произведения которых истекает позднее чем через 10 лет')
			end
		end
	
	end
	if approximate then
		r:add("\n<small>'''Примечание.''' Год смерти этого автора точно не известен и оценён как '''"..year_death.."'''.</small>")
	end	
	return r:result()
end

function p.wikilivres()
	Wikilivres = d.wikilivres_ru
	Wikilivres_ru = d.Wikilivres_ru
	local w = {t = {}}
	function w:add(s) table.insert(self.t, s) end
	function w:add_category(s) table.insert(self.t, '[[Категория:'..s..']]') end
	function w:result() return table.concat(self.t) end

	if Wikilivres then
		w:add('<br><small>')
		if Wikilivres == 'Нужно перенести' then
			w:add('Произведения этого автора должны быть удалены из Викитеки, поэтому их нужно срочно перенести на сайт [[Wikilivres:Main Page|Wikilivres]].')
			w:add_category('Авторы, чьи произведения нужно срочно перенести на сайт Wikilivres')
		else
			w:add('Содержание данной страницы временно перенесено на сайт [[Wikilivres:'..Wikilivres..'|Wikilivres]]')
			w:add_category('Авторы, чьи произведения были перенесены на сайт Wikilivres')
		end
		w:add('</small>')
	end
	if Wikilivres_ru then
		w:add('<br><small>')
		if Wikilivres_ru == 'Нужно перенести' then
			w:add('Произведения этого автора должны быть удалены из Викитеки, поэтому их нужно срочно перенести на&nbsp;сайт [[wikilivresru:|Wikilivres.ru]].')
			w:add_category('Авторы, чьи произведения нужно срочно перенести на сайт Wikilivres.ru')
		else
			w:add('Содержание данной страницы временно перенесено на&nbsp;сайт [[wikilivresru:'..Wikilivres_ru..'|Wikilivres.ru]]')
			w:add_category('Авторы, чьи произведения были перенесены на сайт Wikilivres.ru')
		end
		w:add('</small>')
	end
	return w:result()
end

-- год смерти из ВД
function get_year_death_wd(entity)
	local year_death_wd
	for _, s in pairs( entity:getBestStatements( 'P570' ) ) do
		if s.mainsnak.datavalue and s.mainsnak.datavalue.value.time then 
			local d = s.mainsnak.datavalue.value.time 
			return tonumber(mw.ustring.match( d, "(%-?%d+)%-%d+%-%d+T"))
		end	
	end
end

-- проверка переменной, возврат её или nil если пустая
function is(var)
	if (var == '' or var == nil) then return nil  else return var end
end

return p