Модуль:HF

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


Документация
-- HF обозначает высокочастотный.
-- Этот модуль дополняет встроенный HF
local HF = mw.InfoboxBuilderHF
----------------------------
-- Библиотеки функций --
----------------------------
-----------------------
-- Библиотеки данных --
-----------------------
-----------------------------------------------------------
-- Локальные функции (используются только в этом модуле) --
-----------------------------------------------------------
----------------------------------------------------------
-- Открытые функции (вызываются из шаблона или статьи) --
----------------------------------------------------------
-- удаляет часть ссылки вики-текста в вызове File: оставляя только имя файла.
function HF.stripFileWrapper(frame)
  local args = getArgs(frame)
  return HF._stripFileWrapper(args[1])
end

---------------------------------------------------------------
-- Внутренние функции (используются в этом и других модулях) --
---------------------------------------------------------------
-- удаляет пробелы в передней и задней части строки
function HF.trim(s)
  if type(s) == 'string' then
    return (s:gsub("^%s*(.-)%s*$", '%1'))
  else
    return false
  end
end

-- Создаёт внешнюю ссылку.
function HF.ExternalLink( target, label, plain )
  local output = string.format('[%s %s]', target, label)

  if plain == true then
    output = string.format('<span class="plainlinks">%s</span>', output)
  end

  return output
end

-- Это создает ссылку на категорию, а также помещает её в эту категорию.
-- `sortkey` и `label` опциональны
-- Если нет заданного ярлыка, он поместит его только в категорию,
-- для чего предназначен HF.Category.
function HF.CategoryLink( category, sortkey, label )
  if not HF.isempty( label ) then
    return HF.LinkToCategory( category, label ) ..
    HF.Category( category, sortkey )
  else
    return HF.Category( category, sortkey )
  end
end

-- Добавляет категорию
-- `sortkey` опционально
function HF.Category( category, sortkey )
  if sortkey == nil then sortkey = '' else sortkey = '|' .. sortkey end
  return string.format('%s'..'Категория:%s%s]]', '[[', category, sortkey)
end

-- Добавляет ссылку в категорию
function HF.LinkToCategory( category, label )
  return string.format('%s'..'Категория:%s|%s]]', '[[:', category,
  label or 'Категория:' .. category )
end

-- Добавляет внутреннюю ссылку
-- `label` опционально
function HF.Link( link, text )
  if not HF.isempty( text ) then
    return string.format('%s'..'%s|%s]]', '[[', link, text)
  else
    return string.format('%s'..'%s]]', '[[', link)
  end
end

-- удаляет часть ссылки вики-текста вызова File: оставляя только имя файла.
function HF._stripFileWrapper (s)
  if type(s) == 'string' then
    return (s
    :gsub("%[*(.*)", '%1') -- ведущие скобки
    :gsub("([%a]*)|+.*", '%1') -- аргументы
    :gsub("([%a]*)%]*", '%1') -- закрывающие скобки
    )
  else
    return false
  end
end

-- Уникальные элементы таблицы
function HF.unique( raw_table )
  local hash = {}
  local unique_results = {}

  for _,v in ipairs( raw_table ) do
    if (not hash[v] and v ~= '') then
      table.insert( unique_results, mw.text.trim(v) )
      hash[v] = true
    end
  end

  return unique_results
end

-- Декалибрует заголовки страниц (см. {{#explode:{{PAGENAME}}|(}} )
function HF.dequalify ( pagetitle )
    if type(pagetitle) == 'string' then
        return pagetitle:match("[^(]*")
    elseif type(pagetitle) == 'table' then
        return pagetitle[1]:match("[^(]*")
    else
        return nil
    end
end

-- Класс, предназначенный для использования в качестве набора для быстрой проверки того, принадлежит ли элемент списку или набору
local Set = {} -- таблицы, представляющей класс, которая будет удваиваться как метатабельная для экземпляров.
Set.__index = Set -- неудачные поиски таблиц на экземплярах должны возвращаться к таблице классов, чтобы получить методы

function Set:new(init, o)
    local obj = o or {}
    setmetatable(obj, self)

    obj.value = init
    obj.prop_set = {}

    for _, val in pairs(init) do
			obj.prop_set[val] = true
    end

    return obj
end

function Set:is_in(key)
    return self.prop_set[key] ~= nil
end

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