<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://massarn.com/w/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3AWikidataSelectors</id>
	<title>Модуль:WikidataSelectors - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://massarn.com/w/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3AWikidataSelectors"/>
	<link rel="alternate" type="text/html" href="https://massarn.com/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:WikidataSelectors&amp;action=history"/>
	<updated>2026-10-13T06:42:11Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://massarn.com/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:WikidataSelectors&amp;diff=1887&amp;oldid=prev</id>
		<title>Buto: Новая страница: «local i18n = {     [&quot;errors&quot;] = {         [&quot;rank-not-valid&quot;] = &quot;Некорректное значение приоритета (rank)&quot;,         [&quot;cant-parse-condition&quot;] = &quot;Не удалось разобрать условие&quot;     } }  local validRanks = {     &#039;best&#039;,     &#039;preferred&#039;,     &#039;normal&#039;,     &#039;deprecated&#039; }  -- Внутренняя функция для вывода ошибок (сделана безопасной) local function throwError( key )...»</title>
		<link rel="alternate" type="text/html" href="https://massarn.com/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:WikidataSelectors&amp;diff=1887&amp;oldid=prev"/>
		<updated>2026-10-11T16:00:53Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «local i18n = {     [&amp;quot;errors&amp;quot;] = {         [&amp;quot;rank-not-valid&amp;quot;] = &amp;quot;Некорректное значение приоритета (rank)&amp;quot;,         [&amp;quot;cant-parse-condition&amp;quot;] = &amp;quot;Не удалось разобрать условие&amp;quot;     } }  local validRanks = {     &amp;#039;best&amp;#039;,     &amp;#039;preferred&amp;#039;,     &amp;#039;normal&amp;#039;,     &amp;#039;deprecated&amp;#039; }  -- Внутренняя функция для вывода ошибок (сделана безопасной) local function throwError( key )...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local i18n = {&lt;br /&gt;
    [&amp;quot;errors&amp;quot;] = {&lt;br /&gt;
        [&amp;quot;rank-not-valid&amp;quot;] = &amp;quot;Некорректное значение приоритета (rank)&amp;quot;,&lt;br /&gt;
        [&amp;quot;cant-parse-condition&amp;quot;] = &amp;quot;Не удалось разобрать условие&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local validRanks = {&lt;br /&gt;
    &amp;#039;best&amp;#039;,&lt;br /&gt;
    &amp;#039;preferred&amp;#039;,&lt;br /&gt;
    &amp;#039;normal&amp;#039;,&lt;br /&gt;
    &amp;#039;deprecated&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Внутренняя функция для вывода ошибок (сделана безопасной)&lt;br /&gt;
local function throwError( key )&lt;br /&gt;
    -- Вместо критической ошибки возвращаем текст, чтобы не ломать страницы&lt;br /&gt;
    mw.log( i18n.errors[key] or &amp;quot;Неизвестная ошибка фильтра&amp;quot; )&lt;br /&gt;
    return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
  Безопасная загрузка свойств для сайта Тептар (без зависимости от Wikidata)&lt;br /&gt;
]]&lt;br /&gt;
function p.load( entityId, propertySelector )&lt;br /&gt;
    local propertyId = mw.ustring.match( propertySelector, &amp;#039;^[Pp]%d+&amp;#039; )&lt;br /&gt;
    if not propertyId then&lt;br /&gt;
        return nil&lt;br /&gt;
    end&lt;br /&gt;
    propertyId = string.upper( propertyId )&lt;br /&gt;
&lt;br /&gt;
    local allStatements = {}&lt;br /&gt;
    &lt;br /&gt;
    -- БЕЗОПАСНАЯ ПРОВЕРКА: Если расширение Wikibase отсутствует, отдаем пустую таблицу,&lt;br /&gt;
    -- чтобы скрипт фильтрации отработал вхолостую, но без красных ошибок Lua.&lt;br /&gt;
    if mw.wikibase and mw.wikibase.getAllStatements then&lt;br /&gt;
        allStatements[ propertyId ] = mw.wikibase.getAllStatements( entityId, propertyId )&lt;br /&gt;
    else&lt;br /&gt;
        allStatements[ propertyId ] = {}&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return p.filter( allStatements, propertySelector )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
  Разбор селекторов и фильтрация утверждений&lt;br /&gt;
]]&lt;br /&gt;
function p.filter( allClaims, propertySelector )&lt;br /&gt;
    propertySelector = mw.text.trim( propertySelector or &amp;#039;&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
    local propertyId = mw.ustring.match( propertySelector, &amp;#039;^[Pp]%d+&amp;#039; )&lt;br /&gt;
    if not propertyId then&lt;br /&gt;
        propertyId = &amp;#039;&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    local initPos = #propertyId + 1&lt;br /&gt;
    propertyId = string.upper( propertyId )&lt;br /&gt;
    &lt;br /&gt;
    if ( not allClaims ) then&lt;br /&gt;
        return nil&lt;br /&gt;
    end&lt;br /&gt;
    local allPropertyClaims = allClaims[propertyId]&lt;br /&gt;
    if ( not allPropertyClaims ) then&lt;br /&gt;
        return nil&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local rules = p.matchSelectors( propertySelector, initPos )&lt;br /&gt;
&lt;br /&gt;
    local isRanked = false&lt;br /&gt;
    for i, subRules in ipairs( rules ) do&lt;br /&gt;
        for j, rule in ipairs( subRules ) do&lt;br /&gt;
            if rule[&amp;#039;type&amp;#039;] == &amp;#039;rank&amp;#039; then&lt;br /&gt;
                isRanked = true&lt;br /&gt;
                break&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if not isRanked then&lt;br /&gt;
        table.insert( rules, 1, { { type = &amp;#039;rank&amp;#039;, value = &amp;#039;best&amp;#039; } } )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    allPropertyClaims = p.applyRules( allPropertyClaims, rules )&lt;br /&gt;
&lt;br /&gt;
    return allPropertyClaims&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
  Сбор правил селекторов&lt;br /&gt;
]]&lt;br /&gt;
function p.matchSelectors( selectorsString, initPos )&lt;br /&gt;
    local rules = {}&lt;br /&gt;
    local rawRulePattern = &amp;#039;^%s*%[%s*[^%[%]]+%s*%]%s*&amp;#039;&lt;br /&gt;
    local rulePattern = &amp;#039;^%s*%[%s*([^%[%]]+)%s*%]%s*$&amp;#039;&lt;br /&gt;
    &lt;br /&gt;
    if not initPos then&lt;br /&gt;
        initPos = 1&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local rawRule = mw.ustring.match( selectorsString, rawRulePattern, initPos )&lt;br /&gt;
&lt;br /&gt;
    while rawRule do&lt;br /&gt;
        initPos = initPos + #rawRule&lt;br /&gt;
        local rule = mw.ustring.match( rawRule, rulePattern )&lt;br /&gt;
        rule = mw.text.trim( rule )&lt;br /&gt;
&lt;br /&gt;
        local subRules = mw.text.split( rule, &amp;#039;%s*,%s*&amp;#039; )&lt;br /&gt;
        local commands = {}&lt;br /&gt;
&lt;br /&gt;
        for i, subRule in ipairs( subRules ) do&lt;br /&gt;
            local isInversed = false&lt;br /&gt;
            if mw.ustring.match( subRule, &amp;#039;^!&amp;#039; ) then&lt;br /&gt;
                isInversed = true&lt;br /&gt;
                subRule = mw.ustring.match( subRule, &amp;#039;^!%s*(.+)$&amp;#039; )&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
            if mw.ustring.match( subRule, &amp;#039;^%d+$&amp;#039; ) then&lt;br /&gt;
                table.insert( commands, {&lt;br /&gt;
                    type = &amp;#039;position&amp;#039;,&lt;br /&gt;
                    value = subRule,&lt;br /&gt;
                    inversed = isInversed&lt;br /&gt;
                } )&lt;br /&gt;
    &lt;br /&gt;
            elseif mw.ustring.match( subRule, &amp;#039;^rank%s*:%s*(%a+)$&amp;#039; ) then&lt;br /&gt;
                local rank = mw.ustring.match( subRule, &amp;#039;^rank%s*:%s*(%a+)$&amp;#039; )&lt;br /&gt;
                table.insert( commands, {&lt;br /&gt;
                    type = &amp;#039;rank&amp;#039;,&lt;br /&gt;
                    value = rank,&lt;br /&gt;
                    inversed = isInversed&lt;br /&gt;
                } )&lt;br /&gt;
&lt;br /&gt;
            elseif mw.ustring.match( subRule, &amp;#039;^language%s*:%s*([%a%-]+)$&amp;#039; ) then&lt;br /&gt;
                local value = mw.ustring.match( subRule, &amp;#039;^language%s*:%s*([%a%-]+)$&amp;#039; )&lt;br /&gt;
                table.insert( commands, {&lt;br /&gt;
                    type = &amp;#039;language&amp;#039;,&lt;br /&gt;
                    value = value,&lt;br /&gt;
                    inversed = isInversed&lt;br /&gt;
                } )&lt;br /&gt;
&lt;br /&gt;
            elseif mw.ustring.match( subRule, &amp;#039;^language%s*!:%s*([%a%-]+)$&amp;#039; ) then&lt;br /&gt;
                local value = mw.ustring.match( subRule, &amp;#039;^language%s*!:%s*([%a%-]+)$&amp;#039; )&lt;br /&gt;
                table.insert( commands, {&lt;br /&gt;
                    type = &amp;#039;language&amp;#039;,&lt;br /&gt;
                    value = value,&lt;br /&gt;
                    inversed = not isInversed&lt;br /&gt;
                } )&lt;br /&gt;
&lt;br /&gt;
            elseif mw.ustring.match( subRule, &amp;#039;^min$&amp;#039; ) then&lt;br /&gt;
                table.insert( commands, { type = &amp;#039;value_min&amp;#039; } )&lt;br /&gt;
&lt;br /&gt;
            elseif mw.ustring.match( subRule, &amp;#039;^max$&amp;#039; ) then&lt;br /&gt;
                table.insert( commands, { type = &amp;#039;value_max&amp;#039; } )&lt;br /&gt;
&lt;br /&gt;
            elseif mw.ustring.match( subRule, &amp;#039;^min%s*:%s*[Pp]%d+$&amp;#039; ) then&lt;br /&gt;
                local value = mw.ustring.match( subRule, &amp;#039;:%s*([Pp]%d+)$&amp;#039; )&lt;br /&gt;
                table.insert( commands, {&lt;br /&gt;
                    type = &amp;#039;qualifier_min&amp;#039;,&lt;br /&gt;
                    qualifier = value&lt;br /&gt;
                } )&lt;br /&gt;
&lt;br /&gt;
            elseif mw.ustring.match( subRule, &amp;#039;^max%s*:%s*[Pp]%d+$&amp;#039; ) then&lt;br /&gt;
                local value = mw.ustring.match( subRule, &amp;#039;:%s*([Pp]%d+)$&amp;#039; )&lt;br /&gt;
                table.insert( commands, {&lt;br /&gt;
                    type = &amp;#039;qualifier_max&amp;#039;,&lt;br /&gt;
                    qualifier = value&lt;br /&gt;
                } )&lt;br /&gt;
&lt;br /&gt;
            elseif mw.ustring.match( subRule, &amp;#039;^unit%s*:%s*[^%[%],:]+$&amp;#039; ) then&lt;br /&gt;
                local value = mw.ustring.match( subRule, &amp;#039;:%s*([^%[%],:]+)$&amp;#039; )&lt;br /&gt;
                table.insert( commands, {&lt;br /&gt;
                    type = &amp;#039;unit&amp;#039;,&lt;br /&gt;
                    value = value,&lt;br /&gt;
                    inversed = isInversed&lt;br /&gt;
                } )&lt;br /&gt;
&lt;br /&gt;
            elseif mw.ustring.match( subRule, &amp;#039;^unit%s*!:%s*[^%[%],:]+$&amp;#039; ) then&lt;br /&gt;
                local value = mw.ustring.match( subRule, &amp;#039;!:%s*([^%[%],:]+)$&amp;#039; )&lt;br /&gt;
                table.insert( commands, {&lt;br /&gt;
                    type = &amp;#039;unit&amp;#039;,&lt;br /&gt;
                    value = value,&lt;br /&gt;
                    inversed = not isInversed&lt;br /&gt;
                } )&lt;br /&gt;
&lt;br /&gt;
            elseif mw.ustring.match( subRule, &amp;#039;^[Pp]%d+$&amp;#039; ) then&lt;br /&gt;
                local qualifier = mw.ustring.match( subRule, &amp;#039;^[Pp]%d+&amp;#039; )&lt;br /&gt;
                table.insert( commands, {&lt;br /&gt;
                    type = &amp;#039;qualifier&amp;#039;,&lt;br /&gt;
                    qualifier = qualifier,&lt;br /&gt;
                    value = nil,&lt;br /&gt;
                    inversed = isInversed&lt;br /&gt;
                } )&lt;br /&gt;
&lt;br /&gt;
            elseif mw.ustring.match( subRule, &amp;#039;^[Pp]%d+%s*:%s*[^%[%],:]+$&amp;#039; ) then&lt;br /&gt;
                local qualifier = mw.ustring.match( subRule, &amp;#039;^([Pp]%d+)%s*:?&amp;#039; )&lt;br /&gt;
                local value = mw.ustring.match( subRule, &amp;#039;:%s*([^%[%],:]+)$&amp;#039; )&lt;br /&gt;
                table.insert( commands, {&lt;br /&gt;
                    type = &amp;#039;qualifier&amp;#039;,&lt;br /&gt;
                    qualifier = qualifier,&lt;br /&gt;
                    value = value,&lt;br /&gt;
                    inversed = isInversed&lt;br /&gt;
                } )&lt;br /&gt;
&lt;br /&gt;
            elseif mw.ustring.match( subRule, &amp;#039;^[Pp]%d+%s*!:%s*[^%[%],:]+$&amp;#039; ) then&lt;br /&gt;
                local qualifier = mw.ustring.match( subRule, &amp;#039;^([Pp]%d+)%s*!:?&amp;#039; )&lt;br /&gt;
                local value = mw.ustring.match( subRule, &amp;#039;!:%s*([^%[%],:]+)$&amp;#039; )&lt;br /&gt;
                table.insert( commands, {&lt;br /&gt;
                    type = &amp;#039;qualifier&amp;#039;,&lt;br /&gt;
                    qualifier = qualifier,&lt;br /&gt;
                    value = value,&lt;br /&gt;
                    inversed = not isInversed&lt;br /&gt;
                } )&lt;br /&gt;
&lt;br /&gt;
            elseif mw.ustring.match( subRule, &amp;#039;^[Qq]%d+$&amp;#039; ) then&lt;br /&gt;
                local value = mw.ustring.match( subRule, &amp;#039;^[Qq]%d+&amp;#039; )&lt;br /&gt;
                table.insert( commands, {&lt;br /&gt;
                    type = &amp;#039;value&amp;#039;,&lt;br /&gt;
                    value = value,&lt;br /&gt;
                    inversed = isInversed&lt;br /&gt;
                } )&lt;br /&gt;
            else&lt;br /&gt;
                -- Игнорируем неизвестные условия, вместо того чтобы крашить парсер&lt;br /&gt;
                mw.log( i18n.errors[&amp;#039;cant-parse-condition&amp;#039;] )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if #commands &amp;gt; 0 then&lt;br /&gt;
            table.insert( rules, commands )&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        rawRule = mw.ustring.match( selectorsString, rawRulePattern, initPos )&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return rules&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
  Перехват и фильтрация утверждений&lt;br /&gt;
]]&lt;br /&gt;
function p.applyRules( claims, rules )&lt;br /&gt;
    for i, subRules in ipairs( rules ) do&lt;br /&gt;
        local newClaims = {}&lt;br /&gt;
        for j, rule in ipairs( subRules ) do&lt;br /&gt;
            if rule[&amp;#039;type&amp;#039;] == &amp;#039;rank&amp;#039; then&lt;br /&gt;
                table.insert( newClaims, p.filterByRank( claims, rule[&amp;#039;value&amp;#039;], rule[&amp;#039;inversed&amp;#039;] ) )&lt;br /&gt;
            elseif rule[&amp;#039;type&amp;#039;] == &amp;#039;language&amp;#039; then&lt;br /&gt;
                table.insert( newClaims, p.filterByLanguage( claims, rule[&amp;#039;value&amp;#039;], rule[&amp;#039;inversed&amp;#039;] ) )&lt;br /&gt;
            elseif rule[&amp;#039;type&amp;#039;] == &amp;#039;unit&amp;#039; then&lt;br /&gt;
                table.insert( newClaims, p.filterByUnit( claims, rule[&amp;#039;value&amp;#039;], rule[&amp;#039;inversed&amp;#039;] ) )&lt;br /&gt;
            elseif rule[&amp;#039;type&amp;#039;] == &amp;#039;position&amp;#039; then&lt;br /&gt;
                table.insert( newClaims, p.filterByPosition( claims, rule[&amp;#039;value&amp;#039;], rule[&amp;#039;inversed&amp;#039;] ) )&lt;br /&gt;
            elseif rule[&amp;#039;type&amp;#039;] == &amp;#039;qualifier&amp;#039; then&lt;br /&gt;
                table.insert( newClaims, p.filterByQualifier( claims, rule[&amp;#039;qualifier&amp;#039;], rule[&amp;#039;value&amp;#039;], rule[&amp;#039;inversed&amp;#039;] ) )&lt;br /&gt;
            elseif rule[&amp;#039;type&amp;#039;] == &amp;#039;qualifier_min&amp;#039; then&lt;br /&gt;
                table.insert( newClaims, p.filterUtterByQualifier( claims, rule[&amp;#039;qualifier&amp;#039;], true ) )&lt;br /&gt;
            elseif rule[&amp;#039;type&amp;#039;] == &amp;#039;qualifier_max&amp;#039; then&lt;br /&gt;
                table.insert( newClaims, p.filterUtterByQualifier( claims, rule[&amp;#039;qualifier&amp;#039;], false ) )&lt;br /&gt;
            elseif rule[&amp;#039;type&amp;#039;] == &amp;#039;value&amp;#039; then&lt;br /&gt;
                table.insert( newClaims, p.filterByValue( claims, rule[&amp;#039;value&amp;#039;], rule[&amp;#039;inversed&amp;#039;] ) )&lt;br /&gt;
            elseif rule[&amp;#039;type&amp;#039;] == &amp;#039;value_min&amp;#039; then&lt;br /&gt;
                table.insert( newClaims, p.filterUtter( claims, true ) )&lt;br /&gt;
            elseif rule[&amp;#039;type&amp;#039;] == &amp;#039;value_max&amp;#039; then&lt;br /&gt;
                table.insert( newClaims, p.filterUtter( claims, false ) )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        claims = {}&lt;br /&gt;
&lt;br /&gt;
        for j, newSubClaims in ipairs( newClaims ) do&lt;br /&gt;
            for k, newClaim in ipairs( newSubClaims ) do&lt;br /&gt;
                local isNew = true&lt;br /&gt;
                for l, oldClaim in ipairs( claims ) do&lt;br /&gt;
                    if oldClaim[&amp;#039;id&amp;#039;] == newClaim[&amp;#039;id&amp;#039;] then&lt;br /&gt;
                        isNew = false&lt;br /&gt;
                        break&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
                if isNew then&lt;br /&gt;
                    table.insert( claims, newClaim )&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return claims&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.filterByRank( claims, rank, inversed )&lt;br /&gt;
    if not inversed then inversed = false end&lt;br /&gt;
    if not rank then rank = &amp;#039;best&amp;#039; end&lt;br /&gt;
    &lt;br /&gt;
    local isValidRank = false&lt;br /&gt;
    for i, validRank in ipairs( validRanks ) do&lt;br /&gt;
        if rank == validRank then&lt;br /&gt;
            isValidRank = true&lt;br /&gt;
            break&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if not isValidRank then return claims end -- Безопасный возврат вместо ошибки&lt;br /&gt;
&lt;br /&gt;
    if rank == &amp;#039;best&amp;#039; then&lt;br /&gt;
        rank = &amp;#039;normal&amp;#039; &lt;br /&gt;
        for i, statement in pairs( claims ) do&lt;br /&gt;
            if (statement.rank == &amp;#039;preferred&amp;#039;) then&lt;br /&gt;
                rank = &amp;#039;preferred&amp;#039;&lt;br /&gt;
                break&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local resultClaims = {};&lt;br /&gt;
    for i, statement in pairs( claims ) do&lt;br /&gt;
        if ( statement.rank == rank ) ~= inversed then&lt;br /&gt;
            table.insert( resultClaims, statement )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return resultClaims&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.filterByLanguage( claims, language, inversed )&lt;br /&gt;
    if not inversed then inversed = false end&lt;br /&gt;
&lt;br /&gt;
    local resultClaims = {}&lt;br /&gt;
    local mulStatement = {}&lt;br /&gt;
    for i, statement in ipairs( claims ) do&lt;br /&gt;
        local isMatchLanguage = false&lt;br /&gt;
        if statement[&amp;#039;mainsnak&amp;#039;]&lt;br /&gt;
                and statement[&amp;#039;mainsnak&amp;#039;][&amp;#039;datavalue&amp;#039;]&lt;br /&gt;
                and statement[&amp;#039;mainsnak&amp;#039;][&amp;#039;datavalue&amp;#039;][&amp;#039;value&amp;#039;]&lt;br /&gt;
                and statement[&amp;#039;mainsnak&amp;#039;][&amp;#039;datavalue&amp;#039;][&amp;#039;value&amp;#039;][&amp;#039;language&amp;#039;] then&lt;br /&gt;
                &lt;br /&gt;
            if statement[&amp;#039;mainsnak&amp;#039;][&amp;#039;datavalue&amp;#039;][&amp;#039;value&amp;#039;][&amp;#039;language&amp;#039;] == language then&lt;br /&gt;
                isMatchLanguage = true&lt;br /&gt;
            end&lt;br /&gt;
            if statement[&amp;#039;mainsnak&amp;#039;][&amp;#039;datavalue&amp;#039;][&amp;#039;value&amp;#039;][&amp;#039;language&amp;#039;] == &amp;#039;mul&amp;#039; then&lt;br /&gt;
                mulStatement = statement&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if isMatchLanguage ~= inversed then&lt;br /&gt;
            table.insert( resultClaims, statement )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if next(resultClaims) == nil and next(mulStatement) ~= nil then&lt;br /&gt;
        table.insert( resultClaims, mulStatement )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return resultClaims&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.filterByUnit( claims, unit, inversed )&lt;br /&gt;
    if not inversed then inversed = false end&lt;br /&gt;
    unit = &amp;#039;http://www.wikidata.org/entity/&amp;#039; .. string.upper( unit )&lt;br /&gt;
&lt;br /&gt;
    local resultClaims = {}&lt;br /&gt;
    for i, statement in ipairs( claims ) do&lt;br /&gt;
        local isMatchUnit = false&lt;br /&gt;
        if statement[&amp;#039;mainsnak&amp;#039;]&lt;br /&gt;
                and statement[&amp;#039;mainsnak&amp;#039;][&amp;#039;datavalue&amp;#039;]&lt;br /&gt;
                and statement[&amp;#039;mainsnak&amp;#039;][&amp;#039;datavalue&amp;#039;][&amp;#039;value&amp;#039;]&lt;br /&gt;
                and statement[&amp;#039;mainsnak&amp;#039;][&amp;#039;datavalue&amp;#039;][&amp;#039;value&amp;#039;][&amp;#039;unit&amp;#039;]&lt;br /&gt;
                and statement[&amp;#039;mainsnak&amp;#039;][&amp;#039;datavalue&amp;#039;][&amp;#039;value&amp;#039;][&amp;#039;unit&amp;#039;] == unit then&lt;br /&gt;
            isMatchUnit = true&lt;br /&gt;
        end&lt;br /&gt;
        if isMatchUnit ~= inversed then&lt;br /&gt;
            table.insert( resultClaims, statement )&lt;br /&gt;
            break&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return resultClaims&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.filterByPosition( claims, position, inversed )&lt;br /&gt;
    if not inversed then inversed = false end&lt;br /&gt;
&lt;br /&gt;
    local resultClaims = {};&lt;br /&gt;
    for statementPosition, statement in ipairs( claims ) do&lt;br /&gt;
        if ( statementPosition == tonumber( position ) ) ~= inversed then&lt;br /&gt;
            table.insert( resultClaims, statement )&lt;br /&gt;
            break&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return resultClaims&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.filterByQualifier( claims, qualifierId, value, inversed )&lt;br /&gt;
    if not inversed then inversed = false end&lt;br /&gt;
    qualifierId = string.upper( qualifierId )&lt;br /&gt;
&lt;br /&gt;
    local resultClaims = {}&lt;br /&gt;
    for i, statement in ipairs( claims ) do&lt;br /&gt;
        if statement[&amp;#039;qualifiers&amp;#039;] and statement[&amp;#039;qualifiers&amp;#039;][qualifierId] then&lt;br /&gt;
            if value == nil then&lt;br /&gt;
                if ( #statement[&amp;#039;qualifiers&amp;#039;][qualifierId] &amp;gt; 0 ) ~= inversed then&lt;br /&gt;
                    table.insert( resultClaims, statement )&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                local isQualifierFound = false&lt;br /&gt;
                for j, qualifier in ipairs( statement[&amp;#039;qualifiers&amp;#039;][qualifierId] ) do&lt;br /&gt;
                    if qualifier[&amp;#039;datavalue&amp;#039;] then&lt;br /&gt;
                        local qualifierValue = qualifier[&amp;#039;datavalue&amp;#039;][&amp;#039;value&amp;#039;]&lt;br /&gt;
                        if qualifier[&amp;#039;datavalue&amp;#039;][&amp;#039;type&amp;#039;] == &amp;#039;wikibase-entityid&amp;#039; then&lt;br /&gt;
                            qualifierValue = qualifierValue.id&lt;br /&gt;
                            value = string.upper( value )&lt;br /&gt;
                        end&lt;br /&gt;
            &lt;br /&gt;
                        if qualifierValue == value then&lt;br /&gt;
                            isQualifierFound = true&lt;br /&gt;
                            break&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
                if isQualifierFound ~= inversed then&lt;br /&gt;
                    table.insert( resultClaims, statement )&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        elseif inversed then&lt;br /&gt;
            table.insert( resultClaims, statement )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return resultClaims&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.filterByValue( claims, value, inversed )&lt;br /&gt;
    inversed = inversed or false&lt;br /&gt;
&lt;br /&gt;
    local resultClaims = {}&lt;br /&gt;
    for i, statement in ipairs( claims ) do&lt;br /&gt;
        local statementValue&lt;br /&gt;
        if statement[&amp;#039;mainsnak&amp;#039;] &lt;br /&gt;
        and statement[&amp;#039;mainsnak&amp;#039;][&amp;#039;datavalue&amp;#039;] &lt;br /&gt;
        and statement[&amp;#039;mainsnak&amp;#039;][&amp;#039;datavalue&amp;#039;][&amp;#039;type&amp;#039;]&lt;br /&gt;
        then &lt;br /&gt;
            statementValue = statement[&amp;#039;mainsnak&amp;#039;][&amp;#039;datavalue&amp;#039;][&amp;#039;value&amp;#039;]&lt;br /&gt;
            if statement[&amp;#039;mainsnak&amp;#039;][&amp;#039;datavalue&amp;#039;][&amp;#039;type&amp;#039;] == &amp;#039;quantity&amp;#039; then&lt;br /&gt;
                statementValue = statementValue.amount&lt;br /&gt;
            end&lt;br /&gt;
            if statement[&amp;#039;mainsnak&amp;#039;][&amp;#039;datavalue&amp;#039;][&amp;#039;type&amp;#039;] == &amp;#039;time&amp;#039; then&lt;br /&gt;
                statementValue = statementValue.time&lt;br /&gt;
            end&lt;br /&gt;
            if statement[&amp;#039;mainsnak&amp;#039;][&amp;#039;datavalue&amp;#039;][&amp;#039;type&amp;#039;] == &amp;#039;wikibase-entityid&amp;#039; then&lt;br /&gt;
                statementValue = statementValue.id&lt;br /&gt;
                value = string.upper( value )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if ( statementValue == value ) ~= inversed then&lt;br /&gt;
            table.insert( resultClaims, statement )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return resultClaims&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.filterUtter( claims, asc, inversed )&lt;br /&gt;
    local resultValue = nil&lt;br /&gt;
    for i, statement in ipairs( claims ) do&lt;br /&gt;
        local statementValue&lt;br /&gt;
        if statement[&amp;#039;mainsnak&amp;#039;] and&lt;br /&gt;
            statement[&amp;#039;mainsnak&amp;#039;][&amp;#039;datavalue&amp;#039;] and&lt;br /&gt;
            statement[&amp;#039;mainsnak&amp;#039;][&amp;#039;datavalue&amp;#039;][&amp;#039;type&amp;#039;]&lt;br /&gt;
        then&lt;br /&gt;
            statementValue = statement[&amp;#039;mainsnak&amp;#039;][&amp;#039;datavalue&amp;#039;][&amp;#039;value&amp;#039;]&lt;br /&gt;
            if statement[&amp;#039;mainsnak&amp;#039;][&amp;#039;datavalue&amp;#039;][&amp;#039;type&amp;#039;] == &amp;#039;quantity&amp;#039; then&lt;br /&gt;
                statementValue = statementValue.amount&lt;br /&gt;
            end&lt;br /&gt;
            if statement[&amp;#039;mainsnak&amp;#039;][&amp;#039;datavalue&amp;#039;][&amp;#039;type&amp;#039;] == &amp;#039;time&amp;#039; then&lt;br /&gt;
                statementValue = statementValue.time&lt;br /&gt;
            end&lt;br /&gt;
            if statement[&amp;#039;mainsnak&amp;#039;][&amp;#039;datavalue&amp;#039;][&amp;#039;type&amp;#039;] == &amp;#039;wikibase-entityid&amp;#039; then&lt;br /&gt;
                statementValue = statementValue.id&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
            if not resultValue or ( statementValue &amp;lt; resultValue ) == asc then&lt;br /&gt;
                resultValue = statementValue&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return p.filterByValue( claims, resultValue, inversed )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.filterUtterByQualifier( claims, qualifierId, asc )&lt;br /&gt;
    qualifierId = string.upper( qualifierId )&lt;br /&gt;
&lt;br /&gt;
    local resultValue = nil&lt;br /&gt;
    local resultStatement = nil&lt;br /&gt;
    for i, statement in ipairs( claims ) do&lt;br /&gt;
        if not statement[&amp;#039;qualifiers&amp;#039;] and not statement[&amp;#039;qualifiers&amp;#039;][qualifierId] then&lt;br /&gt;
            if resultStatement == nil then&lt;br /&gt;
                resultStatement = statement&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            for _, qualifier in ipairs( statement[&amp;#039;qualifiers&amp;#039;][qualifierId] ) do&lt;br /&gt;
                if qualifier[&amp;#039;datavalue&amp;#039;] then&lt;br /&gt;
                    local qualifierValue = qualifier[&amp;#039;datavalue&amp;#039;][&amp;#039;value&amp;#039;]&lt;br /&gt;
                    if qualifier[&amp;#039;datavalue&amp;#039;][&amp;#039;type&amp;#039;] == &amp;#039;quantity&amp;#039; then&lt;br /&gt;
                        qualifierValue = qualifierValue.amount&lt;br /&gt;
                    end&lt;br /&gt;
                    if qualifier[&amp;#039;datavalue&amp;#039;][&amp;#039;type&amp;#039;] == &amp;#039;time&amp;#039; then&lt;br /&gt;
                        qualifierValue = qualifierValue.time&lt;br /&gt;
                    end&lt;br /&gt;
                    if qualifier[&amp;#039;datavalue&amp;#039;][&amp;#039;type&amp;#039;] == &amp;#039;wikibase-entityid&amp;#039; then&lt;br /&gt;
                        qualifierValue = qualifierValue.id&lt;br /&gt;
                    end&lt;br /&gt;
&lt;br /&gt;
                    if not resultValue or ( qualifierValue &amp;lt; resultValue ) == asc then&lt;br /&gt;
                        resultStatement = statement&lt;br /&gt;
                        resultValue = qualifierValue&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if resultStatement then&lt;br /&gt;
        return { resultStatement }&lt;br /&gt;
    else&lt;br /&gt;
        return {}&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Buto</name></author>
	</entry>
</feed>