Модуль:HF/MediaNav

Материал из Викимультии — энциклопедии мультипликации
Перейти к навигации Перейти к поиску


Документация
local MN = {}
-- Заголовок любой страницы, вызывающей функцию
_G.pageTitle = mw.title.getCurrentTitle().text
----------------------------
-- Библиотеки функций --
----------------------------
-- Модули и функции, используемые внутри этого модуля
-- обозначает высокочастотный
local HF = require('Module:HF')
-- Parses invocation and template parameters, trims whitespace, and removes blanks.
local getArgs = require('Module:Arguments').getArgs
-- Language functions
local language = mw.language.new('ru')

local function chapterFix (chapter)
    if chapter and tonumber(chapter) > 700 then 
        return '700+' .. (tonumber(chapter) - 700) 
    else
        return chapter or ''
    end
end

---------------------------------------------------------
-- Открытые функции (вызываются из шаблона или статьи) --
---------------------------------------------------------
-- Обеспечивает кросс-медиа навигацию
function MN.MediaNav(frame)
    local iargs = getArgs(frame)
    return MN._MediaNav(iargs)
end

---------------------------------------------------------------
-- Внутренние функции (используются в этом и других модулях) --
---------------------------------------------------------------
-- Обеспечивает кросс-медиа навигацию
function MN._MediaNav ( args )
    -- {{tlx|1=MediaNav|2=Media Category|3=Release Number|4=Direction|5=shippuden=Value|6=boruto=Value}}
    local Category = args[1] or args['Category'] or nil
    assert(Category, 'No MediaNav category given')
    local Release = args[2] or args['Release'] or 0
    assert(Release, 'No MediaNav release given')
    local Direction = args[3] or args['Direction'] or 0
    local Shippuden = args[4] or args['ураганные хроники'] or 'Нет'
    if Shippuden == 'Да' then Shippuden = true else Shippuden = false end
    local Boruto = args[5] or args['боруто'] or 'Нет'
    if Boruto == 'Да' then Boruto = true else Boruto = false end
    local DisplayType = args['DisplayType'] or nil
    
    local querystring = { 'mainlabel=main' }
    --local list1 = { ['Эпизод'] = true, ['Фильм'] = true, ['Арка'] = true }
    --local list2 = { ['Том'] = true, ['Датабук'] = true, ['Фанбук'] = true, ['Артбук'] = true }
    -- Эпизоды
    if Category == 'Эпизод' then
        table.insert( querystring,
        	HF.Link( ('Категория:Эпизоды аниме «%s»'):format(
				(Boruto == true and 'Боруто: Новое поколение Наруто' or
					(Shippuden == true and 'Наруто: Ураганные хроники'
						or 'Наруто')
				)
        	) )
        )
	--Тома манги
	elseif Category == 'Том' then
		table.insert( querystring,
			Boruto == true and
			HF.Link('Категория:Тома манги «Боруто: Новое поколение Наруто»') or
			HF.Link('Категория:Тома манги «Наруто»')
		)
	--Главы манги
	elseif Category == 'Глава' then
		table.insert( querystring,
			Boruto == true and
			HF.Link('Категория:Главы манги «Боруто: Новое поколение Наруто»') or
			HF.Link('Категория:Главы манги «Наруто»')
		)
	--Сезон мультсериала
	elseif Category == 'Сезон' then
        table.insert( querystring,
        	HF.Link( ('Категория:Сезоны мультсериала «'.. args[4] .. '»') )
        )
	--Фильмы
	--Сюжетные арки
	--Датабуки
	--Фанбуки
	--Артбуки
    else
        return nil
    end
    table.insert( querystring, 
        HF.Link( ("%s номер::%s")
            :format( Category, 
                (tonumber(Release or nil) or 0) + (tonumber(Direction or nil) or 0) ) )
    )
    if Category == 'Эпизод' then
        querystring['default'] =
            (Boruto == true and
                "''Боруто'' эпизод" or
                (Shippuden == true and
                    "''Наруто: Ураганные хроники'' эпизод" or
                    "''Наруто'' эпизод")) .. ' #' .. Release
        if args['DisplayType'] == 'Number' then
          querystring['userparam'] =
                (Boruto == true and
                    "''Боруто'' эпизод" or
                    (Shippuden == true and
                        "''Наруто: Ураганные хроники'' эпизод" or
                        "''Наруто'' эпизод")) .. ' #' .. chapterFix( Release )
        end
    elseif Category == 'Сезон' then
        querystring['default'] = Release
        if args['DisplayType'] == 'Number' then
          querystring['userparam'] = Release
        end
    elseif Category == 'Глава' then
        querystring['default'] =
            (Boruto == true and
                "''Боруто'' глава" or
                "''Наруто'' глава") .. ' #' .. Release
        if args['DisplayType'] == 'Number' then
          querystring['userparam'] =
            (Boruto == true and
                "''Боруто'' глава" or
                "''Наруто'' глава") .. ' #' .. chapterFix( Release )
        end
  else
    querystring['default'] = Category .. ' #' .. Release
    if args['DisplayType'] == 'Number' then
        querystring['userparam'] = Category .. ' #' .. chapterFix( Release )
    end
  end

  local query = mw.smw.ask( querystring )
  -- для каждого результата есть запись, и первое свойство должно быть пустым именем страницы, а второе - типом
  if query then
    local o = {}
    for _,item in ipairs( query ) do
      -- MediaNav/link
      table.insert(o, 
          HF.Link( 
              item['main']:match('%[%[([^|]*)|?'), 
              querystring['userparam'] or mw.text.trim(item['main']:match('%[%[:?([^|]*)|?'):match("[^(]*")) )
      )
    end
    return table.concat(o, '\n')
  else
    return nil
  end
end

-------------------------------------------------
-- Вывод (отправьте его обратно как угодно) --
-------------------------------------------------
return MN