Модуль:Ссылки

Материал из ВикиФур
Перейти к: навигация, поиск
local p = {} ------------------------------------ --- Список поддерживаемых сайтов --- ------------------------------------ p.known_websites= { da = { template ='Поиск слов %ссылки% на [[deviantART]]', link_type ='da', link_base ='https://www.deviantart.com/search/deviations?order=popular-all-time&q=' }, fa = { template ='Поиск слов %ссылки% на [[Fur Affinity]]', link_type ='fa', link_base ='https://www.furaffinity.net/search/' }, rule34x = { template ='%Метка% %ссылки% в эротической галерее [[rule34.xxx]]', link_type ='rule34x', link_base ='http://rule34.xxx/index.php?page=post&s=list&tags=' }, rule34p = { template ='%Метка% %ссылки% в эротической галерее [[rule34.paheal.net]]', link_type ='rule34p', link_base ='http://rule34.paheal.net/post/list/' }, e621 = { template ='%Метка% %ссылки% в эротической галерее [[e621.net]]', link_type ='e621', link_base ='https://e621.net/post/index/1/' }, e926 = { template ='%Метка% %ссылки% в «чистой» ленте e926.net', link_type ='e621', link_base ='https://e926.net/post/index/1/' }, derpibooru = { template ='%Метка% %ссылки% на [[derpibooru]]', link_type ='derpibooru', link_base ='https://derpibooru.org/tags/' }, fb = { template ='%Метка% %ссылки% в эротической галерее [[FurryBooru]]', link_type ='e621', link_base ='http://furry.booru.org/index.php?page=post&s=list&tags=' }, safefurry= { template ='%Метка% %ссылки% в «чистой» галерее safe furry booru', link_type ='e621', link_base ='http://safefurry.booru.org/index.php?page=post&s=list&tags=' } } ------------------- --- Коды ошибок --- ------------------- p.bad_website ='Неизвестная галерея или библиотека' p.bad_placeholder ='Плохой код в шаблоне' --------------------------- --- Конструкторы ссылок --- --------------------------- -- методы, возвращающие url и title ссылок на поиск в соответствующих сайтах: p.make_link_like= { da =function(tag, base) local encoded_tag = mw.uri.encode(tag, 'PATH') return base .. encoded_tag, tag end, fa =function(tag, base) local encoded_tag = mw.uri.encode(tag, 'PATH') encoded_tag = p.str_replace(encoded_tag,'%%40','@') return base .. encoded_tag, tag end, rule34x =function(tag, base) local encoded_tag = mw.ustring.lower(tag) encoded_tag = mw.uri.encode(encoded_tag, 'WIKI') encoded_tag = p.str_replace(encoded_tag,'%%2B','+') return base .. encoded_tag, encoded_tag end, rule34p =function(tag, base) local encoded_tag = mw.ustring.lower(tag) encoded_tag = mw.uri.encode(encoded_tag, 'WIKI') return base .. encoded_tag .. '/1 ', encoded_tag end, e621=function(tag, base) local encoded_tag = mw.ustring.lower(tag) encoded_tag = mw.uri.encode(encoded_tag, 'WIKI') encoded_tag = p.str_replace(encoded_tag, '%%28', '(') encoded_tag = p.str_replace(encoded_tag, '%%29', ')') label_tag = p.str_replace(encoded_tag,'%%2B','+') label_tag = p.str_replace(label_tag,'%%27','\'') return base..p.str_replace(encoded_tag,'%%2B','%20'), label_tag end, derpibooru=function(tag, base) local lower_tag = mw.ustring.lower(tag) local encoded_tag = mw.uri.encode(lower_tag, 'QUERY') encoded_tag = p.str_replace(encoded_tag,'%%28','(') encoded_tag = p.str_replace(encoded_tag,'%%29',')') encoded_tag = p.str_replace(encoded_tag, '%%3A', '-colon-') return base..encoded_tag, lower_tag end } ------------------------------ --- Коды в шаблонах сайтов --- ------------------------------ p.placeholders= { links =function(context) if not p.make_link_like[context.website.link_type] then return p.bad_placeholder end return p.make_links_by_callback(context.tags, p.make_link_like[context.website.link_type], context.website.link_base) end, Tag =function(context) if #context.tags==1 then return 'Метка' else return 'Метки' end end, website_code =function(context) return context.website.code end } -- русификация p.placeholders['ссылки']=p.placeholders.links p.placeholders['Метка']=p.placeholders.Tag p.placeholders['код']=p.placeholders.website_code ------------------ --- Реализация --- ------------------ for code, template in pairs(p.known_websites) do p[code]=function(frame) p.frame=frame local context=p.create_context_from_frame(frame, code) if not context then return p.bad_website end context.website_code=p.parse_website_code(code) context.tags=p.parse_tags(context.tags) return p.expand_website_template(context) end end -- нормализует аргументы function p.create_context_from_frame(frame, code) code=p.parse_website_code(code) if not p.known_websites[code] then return nil end local context={website=p.known_websites[code]} context.tags=p.parse_tags(frame.args[1]) return context end -- приводит код сайта к общему виду function p.parse_website_code(code) return mw.ustring.lower(code) end -- делает из строкового списка меток массив function p.parse_tags(tags) if not tags then return {} end if (type(tags)=='table') then return tags end return mw.text.split(tags, '%s*,%s*') end -- раскрывает шаблон ссылок указанного в контексте вебсайта function p.expand_website_template(context) return p.expand_template(context.website.template, context) end -- раскрывает текст шаблона согласно контексту function p.expand_template(text, context) for code, placeholder in pairs(p.placeholders) do local pattern='%%'..code..'%%' if mw.ustring.find(text, pattern) then local replacement=placeholder(context) text=p.str_replace(text, pattern, replacement) end end return text end -- создаёт список ссылок через обработку метки вызовом function p.make_links_by_callback(tags, func, base) local result={} for i, tag in ipairs(tags) do local url, title=func(tag, base) table.insert(result, '[' .. url .. ' ' .. title .. ']') end return table.concat(result, ', ') end function p.str_replace(s, from, to) return mw.ustring.gsub(s, from,p.escape_for_gsub(to)) end function p.escape_for_gsub(x) return (x:gsub('%%', '%%%%')) end return p