<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://bukvica.org/w/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3AWDBackend%2Fdoc</id>
	<title>Модуль:WDBackend/doc - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://bukvica.org/w/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3AWDBackend%2Fdoc"/>
	<link rel="alternate" type="text/html" href="https://bukvica.org/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:WDBackend/doc&amp;action=history"/>
	<updated>2026-04-07T15:42:19Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://bukvica.org/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:WDBackend/doc&amp;diff=238713&amp;oldid=prev</id>
		<title>Karaby: 1 версия импортирована</title>
		<link rel="alternate" type="text/html" href="https://bukvica.org/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:WDBackend/doc&amp;diff=238713&amp;oldid=prev"/>
		<updated>2025-07-27T15:38:06Z</updated>

		<summary type="html">&lt;p&gt;1 версия импортирована&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая версия&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия от 15:38, 27 июля 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-notice&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;!-- diff cache key wiki:diff:1.41:old-238712:rev-238713 --&gt;
&lt;/table&gt;</summary>
		<author><name>Karaby</name></author>
	</entry>
	<entry>
		<id>https://bukvica.org/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:WDBackend/doc&amp;diff=238712&amp;oldid=prev</id>
		<title>Буквица&gt;D6194c-1cc: /* Формат схемы */ Дополнено информацией по substInto</title>
		<link rel="alternate" type="text/html" href="https://bukvica.org/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:WDBackend/doc&amp;diff=238712&amp;oldid=prev"/>
		<updated>2024-01-06T20:24:19Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Формат схемы: &lt;/span&gt; Дополнено информацией по substInto&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Модуль предназначен для получения информации из Викиданных по задаваемой схеме. Схема описывается в формате таблицы Lua.&lt;br /&gt;
&lt;br /&gt;
Модуль используется в модуле [[Модуль:CiteGost/WDSource]] для получения информации об источниках информации. Модуль WDSource, в свою очередь, используется в модуле [[Модуль:CiteGost]] для оформления библиографических записей.&lt;br /&gt;
&lt;br /&gt;
== Использование ==&lt;br /&gt;
Создать экземпляр объекта форматирования можно функцией модуля &amp;#039;&amp;#039;&amp;#039;new&amp;#039;&amp;#039;&amp;#039;() с указанием языка получения данных. Для получения данных по схеме можно использовать методы полученного объекта:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;fetchEntity&amp;#039;&amp;#039;&amp;#039;(&amp;#039;&amp;#039;таблица&amp;#039;&amp;#039;, &amp;#039;&amp;#039;элемент&amp;#039;&amp;#039;, &amp;#039;&amp;#039;схема&amp;#039;&amp;#039;) — получить данных по схеме из указанного элемента Викиданных.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;fetch&amp;#039;&amp;#039;&amp;#039;(&amp;#039;&amp;#039;таблица&amp;#039;&amp;#039;, &amp;#039;&amp;#039;схема&amp;#039;&amp;#039;) — получить данных по схеме (элементы Викиданных уже указаны в схеме).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;ensureLang&amp;#039;&amp;#039;&amp;#039;() — ассерт на то, что язык точно выбран.&lt;br /&gt;
&lt;br /&gt;
== Формат схемы ==&lt;br /&gt;
Формат схемы в общем виде:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Lua&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  -- Поле с указаным элементом Викиданных:&lt;br /&gt;
  {&lt;br /&gt;
    name = &amp;#039;Имя поля с QID&amp;#039;,&lt;br /&gt;
    -- Получить из элемента данные:&lt;br /&gt;
    get = {&lt;br /&gt;
      -- 1-е поле&lt;br /&gt;
      {&lt;br /&gt;
        name = &amp;#039;Имя получаемого поля&amp;#039;,&lt;br /&gt;
&lt;br /&gt;
        property = &amp;#039;P-идентификатор свойства&amp;#039;,&lt;br /&gt;
&lt;br /&gt;
        match = Значение, по которому будут обрабатываться квалификаторы (работает совместно с qualifiers),&lt;br /&gt;
&lt;br /&gt;
        getValue = Опциональная функция получения значения (должна возвращать два аргумента: текст и язык текста),&lt;br /&gt;
&lt;br /&gt;
        getData = Опциональная функция получения данных о значении (помимо значения, например, может возвращать его язык и флаг fromLabel получения данных из метки элемента),&lt;br /&gt;
&lt;br /&gt;
        getLabel = Опциональный флаг получения метки элемента Викиданных по его идентификатору, заданному через параметр entity или уже присутствующему в таблице.&lt;br /&gt;
&lt;br /&gt;
        max = Опциональное максимальное количество обрабатываемых значений,&lt;br /&gt;
&lt;br /&gt;
        -- Подмена элементов Викиданных согласно отображению (ключ заменяется на значение):&lt;br /&gt;
        mapEntities = { QID 1 = &amp;#039;QID 2&amp;#039;, ... },&lt;br /&gt;
&lt;br /&gt;
        -- Фильтрация по разрешённых элементам Викиданных:&lt;br /&gt;
        allowedEntities = { QID 1, QID 2, ... },&lt;br /&gt;
&lt;br /&gt;
        defaultUnit = QID единицы измерения по умолчанию,&lt;br /&gt;
&lt;br /&gt;
        -- Фильтрация по разрешённым единицам измерения:&lt;br /&gt;
        allowedUnits = { QID единицы измерения 1, QID единицы измерения 2, ... },&lt;br /&gt;
&lt;br /&gt;
        -- Перезаписать поле, если у него уже задано значение:&lt;br /&gt;
        overwrite = true,&lt;br /&gt;
&lt;br /&gt;
        -- Перезаписать идентификатор элемента Викиданных родительского поля (для безымянных полей):&lt;br /&gt;
        overwriteEntity = true,&lt;br /&gt;
&lt;br /&gt;
        -- Перезаписать значение родительского поля (для безымянных полей):&lt;br /&gt;
        overwriteValue = true,&lt;br /&gt;
&lt;br /&gt;
        -- Сделать поле вложенным полем для родительского (поместить в components):&lt;br /&gt;
        isLocal = true,&lt;br /&gt;
&lt;br /&gt;
        -- Пометить значение как точное (например, как указано в источнике):&lt;br /&gt;
        exact = true,&lt;br /&gt;
&lt;br /&gt;
        -- Принудительно делать из поля массив:&lt;br /&gt;
        isArray = true,&lt;br /&gt;
&lt;br /&gt;
        -- Подставить значение текущего поля в другое по шаблону, заданному ещё одним полем:&lt;br /&gt;
        substInto = {&lt;br /&gt;
          name = &amp;#039;Целевое поле (куда записываем)&amp;#039;,&lt;br /&gt;
          template = {&lt;br /&gt;
            name = &amp;#039;Имя поля, в значении которого записан шаблон&amp;#039;,&lt;br /&gt;
          },&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        -- Получить другие поля из элемента Викиданных данного поля:&lt;br /&gt;
        get = {&lt;br /&gt;
          -- ...&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        -- Если текущее поле не удалось получить, то получить другие поля:&lt;br /&gt;
        elseGet = {&lt;br /&gt;
          -- ...&lt;br /&gt;
        },&lt;br /&gt;
      },&lt;br /&gt;
      -- ...&lt;br /&gt;
    },&lt;br /&gt;
  },&lt;br /&gt;
  -- ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Общий формат отдельного поля:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Lua&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  value = Значение (в случае даты — таблица)&lt;br /&gt;
  entity = Идентификатор элемента Викиданных&lt;br /&gt;
  unitEntity = Идентификатор элемента Викиданных единицы измерения, соответствующей значению value&lt;br /&gt;
  retrieved = Флаг, обозначающий, что поле было получено из Викиданных (а не заполнено вручную)&lt;br /&gt;
  exact = Флаг, обозначающий, что получено уточнённое значение поля&lt;br /&gt;
  lang = Язык, соответствующий значению&lt;br /&gt;
  components = {&lt;br /&gt;
    -- Вложенные поля&lt;br /&gt;
    -- ...&lt;br /&gt;
  },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Принцип работы ==&lt;br /&gt;
При обходе полей схемы, если в поле уже есть значение, то второй раз оно уже не будет получено, если только не указано &amp;lt;code&amp;gt;overwrite=true&amp;lt;/code&amp;gt;, что подразумевает перезапись ранее заданного или полученного значения. Таким образом, можно в одно и то же поле пытаться получать значение по очереди из разных свойств. Получено будет первое попавшееся значение. По этому принципу (порядок получения) можно выстраивать приоритет получения данных из разных ствойств.&lt;br /&gt;
&lt;br /&gt;
Если при обходе элементов значение очередного элемента было получено (ранее не было задано), то обходятся квалификаторы соответствующего элемента. В противном случае квалификаторы не обходятся. В случае неименованных аргументов квалификаторы обходятся всегда.&lt;br /&gt;
&lt;br /&gt;
Если в поле не задано имя, то полученное значение никуда не записывается. Если же задан параметр &amp;lt;code&amp;gt;overwriteEntity&amp;lt;/code&amp;gt;, перезаписывается идентификатор родительского элемента. Если задан параметр &amp;lt;code&amp;gt;overwriteValue&amp;lt;/code&amp;gt;, — значение родительского элемента. Безымянные поля удобны для перезаписи значений родительских полей из квалификаторов, либо же для получения свойств из полученного в безымянном поле элемента через &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Внесение изменений ==&lt;br /&gt;
При исправлении ошибки, пожалуйста, сначала добавьте &amp;#039;&amp;#039;&amp;#039;тест&amp;#039;&amp;#039;&amp;#039;, который будет проваливаться из-за обнаруженной &amp;#039;&amp;#039;&amp;#039;ошибки&amp;#039;&amp;#039;&amp;#039;, и только затем вносите исправление. При внесении исправления проверьте, чтобы все тесты проходили. Вносить исправление можно только, если оно не ломает другие тесты.&lt;br /&gt;
&lt;br /&gt;
Добавление нового функционала рекомендуется делать у себя в &amp;#039;&amp;#039;&amp;#039;песочнице&amp;#039;&amp;#039;&amp;#039;, скопировав в неё модуль. В правке копирования необходимо указать тот факт, что делается копирование, и сделать ссылку на оригинальный модуль в виде викитекста. При добавлении нового функционала сначала желательно добавить тест на этот функционал, затем добавить сам функционал, убедившись, что все тесты при этом проходят.&lt;br /&gt;
&lt;br /&gt;
== Тесты ==&lt;br /&gt;
{{См. также|{{replace|{{FULLPAGENAME}}|/doc|}}/testcases}}&lt;br /&gt;
{{#invoke:{{replace|{{PAGENAME}}|/doc|}}/testcases|run|displayMode=table}}&lt;br /&gt;
&lt;br /&gt;
== Разработка ==&lt;br /&gt;
{{todo|содержание=&lt;br /&gt;
* Объединение полей из разных свойств (применимость под вопросов).&lt;br /&gt;
* Автоматизированное получение маски URL (для избавления от параметра urlMaskProp в WDFormat).&lt;br /&gt;
* Указание свойства, из которого были получены данные (необходимо для добавления к ссылке на Google Books номера страницы).&lt;br /&gt;
* Поддержка загрузки из сторонних источников (например, заполняемых вручную таблиц) для отсутствующих в Викиданных свойств.&lt;br /&gt;
* Перепродумать получение информации через {{P|1932}}. У свойства не указывается язык и из-за этого не работает общая схема с выборкой по языкам на нижнем уровне. Как вариант не указывать язык и допускать выборку элементов, у которых язык не указан.&lt;br /&gt;
* Параметр для получения названия статьи через mw.wikibase.getSitelink() в качестве эксперимента по получению всех данных в одном месте.&lt;br /&gt;
* Внутренний автоматически формируемый кэш свойств, для которых данные получаются напрямую, чтобы при повторном получении указывалась лишь ссылка на уже существующую таблицу.&lt;br /&gt;
* Тест на получение неизвестного значения с выполнением над ним пользовательской функции через getValue.&lt;br /&gt;
* Сделать класс с метатаблицей для полей, чтобы можно было в упрощённом порядке обращаться к дочерним полям. Можно было бы переопределить оператор __call для доступа к дочерним полям, либо же переопределить __index и __newindex для доступа ко вложенной структуре дочерних полей, а __call использовать для доступа к параметрам value, entity и т. д. Второй вариант пока видится более удобным при обращении к элементам.&lt;br /&gt;
* Параметр условия для получения значения поля в зависимости от наличия другого поля или наличия в нём определённого значения (depends).&lt;br /&gt;
* Поддержка задания пути к полю в рамках иерархии (через фигурные скобки). Необходимо для записи вложенных в другие поля полей.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;includeonly&amp;gt;[[Категория:Модули:Викиданные]]&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Буквица&gt;D6194c-1cc</name></author>
	</entry>
</feed>