Модуль:Navbar

Матеріал з Wikiситет
Перейти до навігації Перейти до пошуку

local p = {}

function trim(s)

   return mw.ustring.match( s, "^%s*(.-)%s*$" )

end

function error(s)

   local span = mw.html.create('span')
   span
       :addClass('error')
       :css('float', 'left')
       :css('white-space', 'nowrap')
       :wikitext('Помилка: ' .. s)
   return tostring(span)

end

function getTitle( pageName )

   pageName = trim( pageName );
   local page_title, talk_page_title;
   
   if mw.ustring.sub(pageName, 1, 1) == ':' then
       page_title = mw.title.new( mw.ustring.sub(pageName, 2) );
   else
       page_title = mw.title.new( pageName, 'Шаблон' );
   end    
   
   if page_title then 
       talk_page_title = page_title.talkPageTitle;
   else
       talk_page_title = nil;
   end
   
   return page_title, talk_page_title;    

end

function _navbar( args )

   if not args[1] then
       return error('Не задано назву')
   end

   local good, title, talk_title;
   good, title, talk_title = pcall( getTitle, args[1] );
   if not good then
       return error('Перевищено ліміт дорогих парсерних функцій');
   end    
   if not title then
       return error('Сторінка не існує')
   end

   local mainpage = title.fullText;
   local talkpage = talk_title and talk_title.fullText or 
   local editurl = title:fullUrl( 'action=edit' ); 

   local viewLink, talkLink, editLink = 'переглянути', 'обговорити', 'редагувати'
   if args.mini then
       viewLink, talkLink, editLink = 'п', 'о', 'р'
   end

   local div = mw.html.create('div')
   div
       :addClass( 'noprint' )
       :addClass( 'plainlinks' )
       :addClass( 'hlist' )
       :addClass( 'navbar')
       :cssText( args.style )

   if args.mini then div.addClass('mini') end

   if not (args.mini or args.plain) then
       div
           :tag( 'span' )
               :css( 'word-spacing', 0 )
               :cssText( args.fontstyle )
               :wikitext( args.text or 'Цей шаблон:' )
               :wikitext( ' ' )
   end

   if args.brackets then
       div
           :tag('span')
               :css('margin-right', '-0.125em')
               :cssText( args.fontstyle )
               :wikitext( '[' )
               :newline();
   end

   local ul = div:tag('ul');

   ul
       :tag( 'li' )
           :addClass( 'nv-view' )
           :wikitext( '' )
            :tag( 'span' )
                :attr( 'title', 'Переглянути цей шаблон' )
                :cssText( args.fontstyle or  )
                :wikitext( viewLink )
                :done()
            :wikitext( '' )
           :done()
       :tag( 'li' )
           :addClass( 'nv-talk' )
           :wikitext( '' )
            :tag( 'span' )
                :attr( 'title', 'Обговорити цей шаблон' )
                :cssText( args.fontstyle or  )
                :wikitext( talkLink )
                :done()
            :wikitext( '' );

   if not args.noedit then 
       ul
           :tag( 'li' )
               :addClass( 'nv-edit' )
               :wikitext( '[' .. editurl .. ' ' )
               :tag( 'span' )
                   :attr( 'title', 'Редагувати цей шаблон' )
                   :cssText( args.fontstyle or  )
                   :wikitext( editLink )
                   :done()
               :wikitext( ']' );
   end

   if args.brackets then
       div
           :tag('span')
               :css('margin-left', '-0.125em')
               :cssText( args.fontstyle or  )
               :wikitext( ']' )
               :newline();
   end

   return tostring(div)

end

function p.navbar(frame)

   local origArgs
   -- Якщо викликаний через #invoke, використовувати аргументи, передані через шаблон, що викликає.
   -- Інакше, у цілях тестування, припустити, що аргументи передані напряму.
   if frame == mw.getCurrentFrame() then
       origArgs = frame:getParent().args
   else
       origArgs = frame
   end

   -- ParserFunctions розглядають порожній рядок як false, тож, щоб дотриматися попередньої
   -- поведінки Помилка: Не задано назву, міняємо всі порожні аргументи на nil, тож Lua розгляне
   -- їх також як false.
   args = {}
   for k, v in pairs(origArgs) do
       if v ~=  then
           args[k] = v
       end
   end

   return _navbar(args)

end

return p