Перейти к содержанию
Главное меню
Главное меню
переместить в боковую панель
скрыть
Темы
Урбанистика
Физическая география
Транспорт
Примите участие!
Поддержите нас
Портал сообщества
Справка
Свежие правки
Янтарная ноосфера
Поиск
Найти
русский
Создать учётную запись
Войти
Персональные инструменты
Создать учётную запись
Войти
Страницы для неавторизованных редакторов
узнать больше
Вклад
Обсуждение
Редактирование:
Модуль:CiteWeb
Модуль
Обсуждение
English
Читать
Править код
История
Инструменты
Инструменты
переместить в боковую панель
скрыть
Действия
Читать
Править код
История
Общие
Ссылки сюда
Связанные правки
Служебные страницы
Сведения о странице
Внимание:
Вы не вошли в систему. Ваш IP-адрес будет общедоступен, если вы запишете какие-либо изменения. Если вы
войдёте
или
создадите учётную запись
, её имя будет использоваться вместо IP-адреса, наряду с другими преимуществами.
Анти-спам проверка.
Не
заполняйте это!
local p = {}; require('strict'); local listRef = require('Module:Languages').list_ref; local boxDate = require('Module:Calendar').bxDate; local error_cats = { ['noname_param'] = 'К:Википедия:Cite web (некорректное использование: непустой неименованный параметр)', ['empty_title'] = 'К:Википедия:Cite web (некорректное использование: не указан title)', ['empty_url'] = 'К:Википедия:Cite web (некорректное использование: не указан url)', ['bad_archive'] = 'К:Википедия:Cite web (некорректное использование: параметры архивации)', ['deadlink'] = 'К:Википедия:Cite web (недоступные ссылки без архивной копии)', -- ['bad_lang'] = 'К:Википедия:Cite web (неверный код языка)', -- ['deadlink_old'] = 'К:Википедия:Cite web (устаревшие параметры мёртвых ссылок)', ['empty_lang'] = 'К:Википедия:Cite web (не указан язык)', ['bad_url'] = 'К:Википедия:Cite web (некорректный url)', ['webcitation_no'] = 'К:Википедия:Cite web (заменить webcitation-архив: deadlink no)', ['webcitation_yes'] = 'К:Википедия:Cite web (заменить webcitation-архив: deadlink yes)', } local errors = { ['noname_param'] = '{{error|Все параметры шаблона {{tl|cite web}} должны [[T:cite web#Неименованные_параметры|иметь имя]].}}', ['empty_title'] = '{{error|Необходимо задать параметр {{code|title{{=}}}} в шаблоне {{tl|cite web}}.}}', ['empty_url'] = '{{error|Необходимо задать параметр {{code|url{{=}}}} в шаблоне {{tl|cite web}}.}}', ['bad_archive'] = '{{error|Если в шаблоне {{tl|cite web}} задаётся параметр {{code|archive-url{{=}}}}, должен задаваться и параметр {{code|archive-date{{=}}}}, и наоборот.}}', } local replace_params = { ['accessdate'] = 'access-date', ['archivedate'] = 'archive-date', ['archiveurl'] = 'archive-url', ['authorlink'] = 'author-link', ['first1'] = 'first', ['last1'] = 'last', ['deadurl'] = 'deadlink', ['dead-url'] = 'deadlink', ['language'] = 'lang', ['datepublished'] = 'date', ['work'] = 'website', } -- проверка существования переменной. возврат её, или nil если пустая local function is(var) if (var == '' or var == nil) then return nil else return var end end -- замена устаревших аргументов на их аналоги local function prepareArgs(args) local bad_args = {}; local new_args = {}; for param, value in pairs(args) do if is(replace_params[param]) and not is(args[replace_params[param]]) then param = replace_params[param]; end new_args[param] = value; end return new_args, bad_args end -- добавление скрытого языка local function hiddenRef(code) return '<span class="hidden-ref" style="display:none;"> ' .. code .. '</span>' end local function insertDot(str, insert) if insert == false then return end table.insert(str, '.') end local function needDot(source_str) if mw.ustring.find(source_str, '[.?!:…]»?$') ~= nil then return false else return true end end local function nowiki(text) local frame = mw.getCurrentFrame(); return frame:callParserFunction('#tag', { 'nowiki', text }) end local function replace(source_str, pattern, replace) return mw.ustring.gsub(source_str, pattern, replace) end -- форматирование даты; в случае ошибки - возврат переданного значения без изменений local function formatDate(strFormat, txtDateIn, params) local txtDateOut, date, status = boxDate(txtDateIn, strFormat, params) if status.brk then return txtDateIn else return txtDateOut end end -- отрисовка ошибки по коду local function expandError(code) return mw.getCurrentFrame():preprocess(errors[code]) .. ' ' end -- отрисовка всех категорий по их кодам local function expandCats(cats) local str = {}; local frame = mw.getCurrentFrame(); for _, cat in pairs(cats) do table.insert(str, '[[' .. error_cats[cat] .. ']]') end return frame:preprocess(table.concat(str)) end -- разделение их local function splitBySlash(string) local args = {}; local iterator = mw.ustring.gmatch(string, "[^/]+"); for w in iterator do table.insert(args, w) end return args end -- оборачиваем главную ссылку в span с указанным языком (может быть полезно для rtl) local function wrapLang(link, langs) local lang_code = 'und'; if is(langs) then local args = splitBySlash(langs); if #args ~= 0 then lang_code = args[1]; end end return '<span lang="' .. lang_code .. '">' .. link .. '</span>' end -- обёртка в тег цитирования local function wrapCite(str, args) if is(args['ref']) then table.insert(str, 1, '<span class="citation" id="CITEREF' .. mw.uri.anchorEncode(args['ref']) .. '">'); if is(args['date']) then table.insert(str, 2, '<span class="citation" id="CITEREF' .. mw.uri.anchorEncode(args['ref'] .. formatDate('Y', args['date'])) .. '">'); table.insert(str, '</span>'); end else table.insert(str, 1, '<span class="citation">'); end table.insert(str, '</span>'); end -- генерирум список языков (аргумент - список языков через слеш) local function refLang(lang) local args = splitBySlash(lang); local frame = mw.getCurrentFrame(); frame.args = args local lang_result = listRef(frame) local hidden = false; if #args == 1 and (args[1] == 'ru' or args[1] == 'ru-RU') then hidden = true; end return lang_result, hidden end function p.render(frame) local str = {} local cats = {} local pFrame = frame:getParent(); local args = mw.clone(pFrame.args); setmetatable(args, nil); args = prepareArgs(args); -- Проверки -- Проверка отсутствия неименованных параметров if is(args[1]) or is(args[2]) or is(args[3]) or is(args[4]) or is(args[5]) or is(args[6]) then table.insert(str, expandError('noname_param')); table.insert(cats, 'noname_param'); end -- Проверка корректности заполнения параметров archiveurl и archivedate if (is(args['archive-date']) ~= nil and is(args['archive-url']) == nil) or (is(args['archive-date']) == nil and is(args['archive-url']) ~= nil) then table.insert(str, expandError('bad_archive')); table.insert(cats, 'bad_archive'); end -- Проверка устаревших параметров мёртвых ссылок -- if is(args['dead-url']) or is(args['deadurl']) then -- table.insert(cats, error_cats['deadlink_old']) -- end local urlstatus = 'live'; if args['url-status'] == 'live' or args['url-status'] == 'dead' or args['url-status'] == 'unfit' then urlstatus = args['url-status'] elseif args['deadlink'] == 'yes' then urlstatus = 'dead' elseif args['deadlink'] == 'unfit' then urlstatus = 'unfit' end if is(args['archive-url']) then if mw.ustring.find(args['archive-url'], 'webcitation.org', 1, true) then if urlstatus == 'dead' or urlstatus == 'unfit' then table.insert(cats, 'webcitation_yes') else table.insert(cats, 'webcitation_no') end end elseif urlstatus == 'dead' then table.insert(cats, 'deadlink') end -- Проверка заполнения параметра url if is(args['url']) then if mw.ustring.find(args['url'], '^https?://', 1, false) ~= 1 and mw.ustring.find(args['url'], '^ftp://', 1, false) ~= 1 or mw.ustring.find(args['url'], ' ', 1, true) ~= nil then table.insert(cats, 'bad_url') end else table.insert(str, expandError('empty_url')); table.insert(cats, 'empty_url') end -- Проверка заполнения параметра title if not is(args['title']) then table.insert(str, expandError('empty_title')); table.insert(cats, 'empty_title') elseif not is(args['lang']) and mw.ustring.find(args['title'], '^[0-9А-яЁёXVILC«»„“:;,…!?•∙→ \194\160\n\226\128\175%(%)%.%"\'—№–%/%|%&%#+-]+$') == nil then table.insert(cats, 'empty_lang') end -- Формирование вывода -- Автор if is(args['author']) or is(args['last']) then table.insert(str, '<i>') local author = args['author']; if is(args['last']) then author = args['last'] if is(args['first']) then author = author .. ', ' .. args['first'] end elseif not is(args['last2']) and not is(args['coauthors']) then author = replace(author, '^(%[*)(.-[^%.%]])(%]*)$', '%1%2%3.') end if is(args['author-link']) then table.insert(str, '[[' .. args['author-link'] .. '|' .. author .. "]]") else table.insert(str, author) end -- Дополнительные сведения об авторах for i = 2, 5 do if is(args['last' .. i]) then local author = nowiki(';') .. ' ' .. args['last' .. i]; if is(args['first' .. i]) then author = author .. ', ' .. args['first' .. i] end table.insert(str, author) end end if is(args['coauthors']) then table.insert(str, nowiki(';') .. ' ' .. replace(args['coauthors'], '^(.-)%.?$', '%1.') .. ': ') end table.insert(str, '</i> ') end -- Редактор if is(args['editor']) then table.insert(str, ' ' .. args['editor'] .. ': ') end -- URL, заголовок local link; local title = replace(replace(args['title'] or '', '%[', '['), '%]', ']'); local dot = needDot(title); if (urlstatus == 'dead' or urlstatus == 'unfit') and is(args['archive-url']) then link = '[' .. (args['archive-url'] or '') .. ' ' .. title .. ']' elseif urlstatus == 'unfit' then link = title else link = '[' .. (args['url'] or '') .. ' ' .. title .. ']' end table.insert(str, wrapLang(link, args['lang'])) -- Подзаголовок if is(args['subtitle']) then insertDot(str, dot) table.insert(str, ' ' .. args['subtitle']) dot = needDot(args['subtitle']); end -- Отображение названия языка источника local langs; local hidden = false; if is(args['lang']) then langs, hidden = refLang(args['lang']); else langs = frame:expandTemplate { title = 'ref-und' }; hidden = true; end if hidden == true then langs = hiddenRef(langs); else dot = true; end table.insert(str, langs) -- Формат источника if is(args['format']) then dot = true; table.insert(str, ' (' .. args['format'] .. ')') end -- Пометка о недоступности if (urlstatus == 'dead' or urlstatus == 'unfit') and not is(args['archive-url']) then dot = true; table.insert(str, frame:expandTemplate { title = 'ref-info', args = { 'недоступная ссылка — [//web.archive.org/web/*/' .. args['url'] .. ' <i>история</i>]' } }) end -- Название сайта или проекта if is(args['website']) then insertDot(str, dot) dot = true; table.insert(str, ' <i>' .. args['website'] .. '</i>') end -- Страницы if is(args['pages']) then dot = true; table.insert(str, ' ' .. args['pages']) end -- Страница if is(args['page']) then dot = true; table.insert(str, ' ' .. args['page']) end -- Место, издательство if is(args['publisher']) then insertDot(str, dot) dot = true; table.insert(str, ' '); if is(args['location']) then table.insert(str, args['location'] .. ': ') end table.insert(str, args['publisher']) end -- Дата if is(args['date']) then dot = true; table.insert(str, ' (' .. formatDate('j xg Y', args['date']) .. ')') elseif is(args['year']) then dot = true; if is(args['month']) then table.insert(str, ' (' .. args['month'] .. ' ' .. args['year'] .. ')') else table.insert(str, ' (' .. args['year'] .. ')') end end -- Точка insertDot(str, dot) -- DOI if is(args['doi']) then table.insert(str, ' [[Идентификатор цифрового объекта|doi]]:[http://dx.doi.org/' .. args['doi'] .. ' ' .. args['doi'] .. '].') end -- Описание if is(args['description']) then table.insert(str, ' — ' .. args['description']) insertDot(str, needDot(args['description'])) end -- Цитата if is(args['quote']) then table.insert(str, ' — «' .. args['quote'] .. '»') insertDot(str, needDot(args['quote'])) end -- Дата обращения if is(args['access-date']) then table.insert(str, ' Дата обращения: ' .. formatDate('j xg Y', args['access-date']) .. '.') end -- Дата архивирования if is(args['archive-date']) and is(args['archive-url']) then if urlstatus == 'live' then table.insert(str, ' [' .. args['archive-url'] .. ' Архивировано] ' .. formatDate('j xg Y', args['archive-date']) .. ' года.') elseif urlstatus == 'unfit' then table.insert(str, ' Архивировано ' .. formatDate('j xg Y', args['archive-date']) .. ' года.') else table.insert(str, ' Архивировано из [' .. args['url'] .. ' оригинала] ' .. formatDate('j xg Y', args['archive-date']) .. ' года.') end end wrapCite(str, args); if #cats ~= 0 and mw.title.getCurrentTitle():inNamespace(0) then table.insert(str, expandCats(cats)); end return table.concat(str) end return p;
Описание изменений:
Обратите внимание, что все изменения в Янтарная ноосфера рассматриваются как выпущенные на условиях лицензии Creative Commons Attribution Share Alike (см.
Проект:Авторские права
). Если вы не хотите, чтобы ваши тексты свободно распространялись и редактировались любым желающим, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений или скопировали их из источника в общественном достоянии или под совместимой лицензией.
Не размещайте без разрешения материалы, защищённые авторским правом!
Отменить
Справка по редактированию
(в новом окне)
Шаблон, используемый на этой странице:
Модуль:CiteWeb/doc
(
посмотреть исходный код
)
Отобразить/Скрыть ограниченную ширину содержимого