Модуль:Copyright/sandbox
Для документации этого модуля может быть создана страница Модуль: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] ..", находятся в '''[[Справка:Общественное достояние|общественном достоянии]]''' в этой стране, поскольку истёк "..d.years_base_term.."-летний срок охраны исключительного права." )
else
table.insert(s,
"Произведения этого автора, обнародованные при его жизни в ".. countries_words[d.country] ..", находятся в '''[[Справка:Общественное достояние|общественном достоянии]]''' в этой стране, поскольку истёк "..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 = [=[В соответствии со [[Гражданский кодекс РФ/Глава 70#Статья 1281. Срок действия исключительного права на произведение|статьёй 1281 ГК РФ]] произведения этого автора, впервые опубликованные (или обнародованные) после 7 ноября 1917 года (по новому стилю) на территории [[w:Российская Федерация|Российской Федерации]] или стран, правопреемником которых является Российская Федерация ([[w:СССР|СССР]], [[w:РСФСР|РСФСР]], [[w:Советская Россия (государство)|Советская Россия]]), перейдут в [[Викитека:Общественное достояние|общественное достояние]] '''1 января ]=] ..year_free.. " года'''." .. 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('Произведения этого автора должны быть удалены из Викитеки, поэтому их нужно срочно перенести на сайт [[wikilivresru:|Wikilivres.ru]].')
w:add_category('Авторы, чьи произведения нужно срочно перенести на сайт Wikilivres.ru')
else
w:add('Содержание данной страницы временно перенесено на сайт [[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