Википедия: Lua / Запросы / Архив 1


< Википедия: Lua | Запросы

Я создал очень простой фреймворк модульного тестирования в Module: UnitTests для сценариев Lua в Википедии. Простой пример из Модуля: Бананы / тесты :

- Модульные тесты для [[Модуль: Бананы]]. Щелкните страницу обсуждения, чтобы запустить тесты. local  p  =  require ( 'Модуль: UnitTests' ) функция  p : test_hello ()  self : preprocess_equals ( '{{#invoke: Bananas | hello}}' ,  'Привет, мир!' ) end вернуть  p

У меня есть более крупный образец в модуле: ConvertNumeric / tests . Было бы здорово начать разработку модульных тестов для всех скриптов, чтобы защититься от регрессий. Дайте мне знать, если у вас есть предложения по улучшению - не стесняйтесь добавлять дополнительные методы по мере необходимости в Module: UnitTests . Ту же среду можно использовать для запуска тестов на обычных шаблонах. Dcoetzee 01:06, 25 февраля 2013 (UTC)

Вышесказанное хорошо и должно хорошо работать. Я расскажу о своем опыте на тот случай, если кто-то захочет сравнить вывод нового модуля с выводом из существующего шаблона. Я использую две тестовые системы для проекта, над которым работаю с другим редактором. Во-первых, это тестовая система, которую он создал для определенной цели. Пример можно увидеть в области тестовых случаев . Согласно документации , это быстрее использовать frame:expandTemplateвместо frame:preprocess(хотя последний проще, поскольку требует простого вики-текста). Я переключил Module: ConvertTestcase с последнего на первый, потому что мы получаем ошибки тайм-аута сценария (сценарии останавливаются через 10 секунд выполнения на странице), но это не помогло. Смотрите здесь и переходите к разделу «Странное время», чтобы узнать больше. В настоящее время кажется, что вызов простого шаблона, который вызывает большой модуль, имеет очень мало накладных расходов с любым из frameвызовов, но вызов сложного шаблона имеет очень большие накладные расходы, однако это делается.
Моя вторая тестовая система запускает сценарий Lua на локальном компьютере. Он загружает в тестируемый модуль сотни строк тестовых примеров за секунду. Каждая строка имеет вид:
{{convert|9680|sqyd|acre|abbr=on}}       9,680 sq yd (2.00 acres)
В моей системе LHS вызывает модуль, над которым я работаю, и RHS является ожидаемым результатом; RHS поступил из Special: ExpandTemplates . Моя тестовая программа не является дружественной к wiki и требует, чтобы модуль можно было запускать как стандартный Lua-скрипт на локальном компьютере, и перед использованием в другом месте потребуется немало усилий, но я упоминаю об этом для полнота. Johnuniq ( разговор ) 02:17, 25 февраля 2013 (UTC)
Теперь я добавил метод preprocess_equals_preprocess в Module: UnitTests для простого сравнения скриптов с шаблонами. Однако в случае сложных шаблонов может не быть простого способа справиться с тайм-аутом, кроме использования автономного инструмента или подстановки результата вызовов шаблона. Преимущество локального инструмента в том, что он в принципе может выполнять ExpandTemplates автоматически и кэшировать результаты, если страница шаблона не была изменена. Dcoetzee 02:59, 25 февраля 2013 (UTC)

Задача
Определите, является ли строка допустимым адресом IPv4 или IPv6 (с помощью регулярных выражений). Это может заменить текущий метод определения IP-адресов в шаблонах, таких как Template: AfC talk, который не может обнаруживать некоторые IPv6-адреса и принимает строки, содержащие только числа и специальные символы, в качестве IP-адресов, даже если они недействительны. jfd34 ( обсуждение ) 17:00, 27 февраля 2013 (UTC)
Небольшое примечание: хотя было предложено сделать это с помощью регулярных выражений, на самом деле это проще сделать с помощью комбинации регулярных выражений и других методов (синтаксический анализ целого числа, убедитесь, что <256 и т. Д.). Мы также можем захотеть посмотреть, какой шаблон исключает MediaWiki. пользователей, потому что они слишком похожи на IP-адреса, и убедитесь, что мы не выходили за рамки этого. Dcoetzee 00:43, 28 февраля 2013 (UTC)
Работаем над этим сейчас в Module: IPAddress, сначала модульные тесты написаны в Module: IPAddress / tests . Dcoetzee 00:46, 28 февраля 2013 (UTC)
если вы пишете тесты, попробуйте:
- [[ функции не являются "локальными", поэтому другие модули могут потребовать этот модуль и вызывать их напрямую. мы возвращаем таблицу с 3 небольшими функциями-заглушками для вызова «настоящих» в стиле scribunto, поэтому функции также можно вызывать из шаблонов. ]]функция  isIpV6 (  s  )  local  dcolon ,  группирует,  если  тип (  ы  )  ~ =  "строка"  или  s : len ()  ==  0  или  s : find (  "[^:% x]"  )  - только двоеточие и шестнадцатеричные цифры допустимые символы  или  s : find (  "^: [^:]"  )  - могут начинаться или заканчиваться на ::, но не на single:  или  s : find (  "[^:]: $"  )  или  s : find (  " ::: "  )  затем  верните  false  end  s ,  dcolon  =  s : gsub (  " :: " ,  ": "  )  если  dcolon  >  1,  то  верните  false  end  - не более одного ::  s  =  s : gsub (  " ^: ? " ,  ": "  )  - добавить: при необходимости  s ,  groups  =  s : gsub (  ":% x% x?% x?% x? " ,  " "  )  - удалить и подсчитать допустимые группы  return  (  (  dcolon  ==  1  и  группы  <  8  )  или  (  dcolon  ==  0  и  группы  ==  8  )  )  и  (  s : len ()  ==  0  или  (  dcolon  ==  1  and  s  ==  ":"  )  )  - могут быть один висящий: если оригинал заканчивается на :: endfunction  isIpV4 (  s  )  локальная  функция  legal (  n  )  return  (  tonumber (  n  )  или  256  )  <  256  end  - 0 истинно. если  type (  s  )  ~ =  "string",  то  вернуть  false  end  local  p1 ,  p2 ,  p3 ,  p4  =  s : match (  "^ (% d +)%. (% d +)%. (% d +)%. (% d +) ) $ "  )  вернуть  законный (  p1  )  и  законный (  p2  )  и  законный (  p3  )  и  законный (  p4  ) конецфункция  isIp (  s  )  возвращает  isIpV4 (  s  )  и  "4"  или  isIpV6 (  s  )  и  "6" конец- вернуть таблицу, позволяющую вызывать функции из шаблонов return  {  [ "isIpV6" ]  =  function (  frame  )  return  isIpV6 (  frame . args [  1  ]  )  и  "1"  или  "0"  конец ,  [ "isIpV4" ]  =  функция (  кадр  )  return  isIpV4 (  frame . args [  1  ]  )  и  "1"  или  "0"  конец ,  [ "isIp" ]  =  function (  frame  )  return  isIp (  frame . args [  1  ]  )  или  ""  конец }
ipV6, как известно, более сложен, и я совсем не уверен, что понял все тонкости.
мир - יפודנחש (он же кипод) ( разговор ) 06:03, 28 февраля 2013 (UTC)
Комментарий
Можно использовать одинарную трехстороннюю функцию isIp: nil (нет), 1 (V4) или 2 (V6). 1 и 2 оцениваются как «истина». Дает подробные ответы, когда это необходимо V4 / V6. - Депип ( разговор ) 09:17, 28 февраля 2013 (UTC)
изменил приведенный выше код и добавил общий "isIp ()" в соответствии с вашим предложением. Я не уверен, следует ли указывать «отрицательный» как «0» или как пустую строку - если у кого-то есть твердое мнение по этому поводу, их можно изменить. «nil» - это нормально возвращаемое значение для функций, вызываемых из других функций lua, но функция, вызываемая шаблоном, должна возвращать строку (может быть пустой). קיפודנחש (aka kipod) ( разговор ) 15:40, 28 февраля 2013 (UTC)
Я не уверен в своем нулевом предложении, я думал, что в Lua "0" оценивается как истина. Действуйте так, как считаете нужным. - Депип ( разговор ) 18:25, 1 марта 2013 г. (UTC)
Я создал 2 набора функций: один для вызова другими функциями Lua, в других модулях lua и один для вызова из шаблонов. Набор, предназначенный для других модулей Lua, возвращает значения lua bollean для isIpV4 и isIpV6, а также «6», «4» или false для isIp. набор для вызова из шаблонов возвращает «1» или «0» для isIpV4 и isIpv6, а также «4», «6» или «0» для isIp.
Мы можем легко изменить «отрицательную» индикацию для 2-го набора с «0» на «» (пустая строка), но я считаю, что все функции «scribunto» (т.е. те, которые принимают объект кадра и вызываются из шаблонов) должны возвращать строка, а не какой-либо другой тип значения. это может быть даже неправильно.
мир - יפודנחש (aka kipod) ( разговор ) 19:04, 1 марта 2013 (UTC)
 Готово. Я изменил предложенный сценарий для использования объектов для точек входа в шаблон в соответствии с соглашением, реализовал набор модульных тестов в Обсуждение модуля: IPAddress / tests и создал тривиальный шаблон в Template: IsIPAddress , используемый, например, для создания 4, 6 или пустая строка. Все модульные тесты проходят, поэтому приведенный выше код выглядит в хорошей форме. Я также модифицировал Template: AfC_talk, чтобы использовать этот шаблон. Dcoetzee 03:22, 6 марта 2013 г. (UTC) {{IsIPAddress|192.168.0.1}}
Я добавил {{ trim }} параметр 1 в шаблон {{ IsIPAddress }}. Модуль возвращает пустое поле (не IP-адрес), когда аргумент имеет начальные или конечные пробелы, в wikicode мы не можем зависеть от другого выхода, когда применяются разные варианты допустимого кода (например, с использованием или без использования 1=). - Депип ( разговор ) 07:47, 6 марта 2013 г. (UTC)

Я создал {{ str mid }}, который использует Module: String.sub для получения подстроки. Этот .sub очень плохо влияет на качество ввода (индексы должны быть в определенных пределах, требуя заранее продумать длину строки перед использованием!). Я закодировал более удобную версию оболочки с помощью шаблона с дополнительной возможностью запрашивать по одному индексу и длине подстроки (вместо двух индексов). Шаблон (функция Module .sub) должен заменить большинство таких шаблонов обработки строк , по крайней мере, при использовании в будущем. См. Также: {{ str mid / core }} {{ str mid / testcases }}.

Шаблон (еще не модуль) пытается максимально использовать параметры, предотвращая ошибки и добавляя интеллектуальные значения по умолчанию. Он работает, но немного неуклюже (находится в коде шаблона, имеет дело с пустым вводом и т. Д.). Я предлагаю добавить в модуль программу-оболочку, которая включает этот шаблон / предложение.

Создание предложения
  • Используйте Module: String.sub для внутренних целей. Нам нужна только оболочка, которая обрабатывает основные входные значения.
  • i, j определены в модуле: String.sub. Принимаются отрицательные значения.
  • i, j могут принимать значения по умолчанию: i = 1, j = len
Основные параметры

Все параметры необязательны. Для удобочитаемости здесь i, sublen, jиспользуются имена ; в шаблоне это безымянные параметры 2, 3, 4.

{{str mid| 1 = [строка]| я =| sublen = [длина подстроки]| j =}}
  • добавление: параметр подстроки для запрошенной длины подстроки . Ввод sublen = n используется для вычисления i или j.
  • sublen тоже может быть отрицательным: отсчет назад от i (или вперед! от j).

Рассчитываются недостающие значения:

j = i + sublen - 1i = j - подменю + 1примечание: "1" меняет знак, если sublen <0

Присвоение значения i и j в текущем коде (по состоянию на 6 марта 2013 г.):

i = {{# if: {{{2 |}}}} | {{{2 |}}} | {{# ifexpr: ({{# if: {{{3 |}}} | 1 | 0}} и {{#if: {{{4 |}}} | 1 | 0}}) | {{# expr: {{min | {{{4 |}}} | {{# invoke: String | len | {{trim | {{{1 |}}}}}}}}} - {{{ 3 |}}} + {{# ifexpr: {{{3 |}}} <0 | -1 | 1}}}} | 1 }}}}j = {{min | {{# invoke: String | len | {{trim | {{{1 |}}}}}}} | {{# if: {{{4 |}}} | {{{4 |}}} | {{# if: {{{3 |}}} | {{# expr: {{# if: {{{2 |}}} | {{{2 |}}} | 1}} + {{{3 |}}} + {{# ifexpr: {{{ 3 |}}} <0 | 1 | -1}}}} | }}}}}}

Если sublen <0, то модуль (не пользователь) должен переключить i и j (после присвоения значения) для корректности.

Остаточные проблемы
  • Может возникнуть одна новая ошибка: если пользователь вводит три неподходящих параметра: i = 5, j = 8, sublen = 11? → ошибка.
  • Также по умолчанию: если len = 0 или sublen = 0 → вернуть пустое поле (пустая строка). Зачем проверять наличие проблем?
  • Предстоит решить: что должно произойти, когда используется только "sublen = -3"? (ответ: отсчитывать до конца по той же логике)
  • Цель: обратите внимание, что у пользователя будет много вариантов (я говорю, интуитивно понятные), все в рамках одной логики: не нужно напрямую определять «i = 1» из «j = min (j, string len)». запросить длину подстроки независимо от длины большой строки len.

- Депип ( разговор ) 00:08, 2 марта 2013 г. (UTC)

Просто интересно, можно ли было бы добавить что-то так, чтобы if был вызван, вместо того, чтобы выдавать ошибку или возвращать пустое значение, если ignore errors = true, он мог бы вернуть, какой символ доступен, который был бы "defg" - WOSlinker ( talk ) 00:44 , 2 марта 2013 г. (UTC) {{str mid|Abcdefg|4|5}}
  • {{str mid|Abcdefg|4|5}} -> defg
  • {{str mid|Abcdefg|-2|5}} -> fg
Это и есть текущее предполагаемое поведение по умолчанию! За исключением: в демонстрации что-то не так, нужно использовать i = named param :-(: (решено)
текущий код: {{str mid | Abcdefg | 4 | 200}} → {{str mid | Abcdefg | 4 | 200}}
Причина фундаментальна: пользователю (редактору) не нужно беспокоиться о длине строки. Может быть, выбор должен быть: |please show errors=yes. Скорее вариант отладки. - Депип ( разговор ) 01:22, 2 марта 2013 г. (UTC)
Код настроен и отлажен; только безымянные параметры. Соответственно изменен исходный код выше. Запрос без изменений. - Депип ( разговор ) 11:17, 6 марта 2013 г. (UTC)

Какое именно заклинание мне нужно сделать, чтобы использовать модуль mw? По какой-то причине вызов mw.log приводит к тому, что Module: LegendRJL выдает ошибку, и я не могу понять, почему.

Кроме того, есть ли способ получить более конкретное сообщение об ошибке, чем удручающе непрозрачное сообщение «Ошибка сценария»? Я понимаю, что мы не хотим перегружать пользователей нерелевантными сообщениями об ошибках, когда они возникают случайно, но это делает изучение языка чрезвычайно трудным, когда количество вещей, которые могут быть причиной ошибки, приближается к бесконечности, потому что сообщение настолько неспецифично. - Scott5114 ↗ [ТОЧНОЕ ИЗМЕНЕНИЕ] 04:27, 8 марта 2013 г. (UTC)

Щелкните «Ошибка сценария», чтобы получить полное сообщение об ошибке и трассировку стека. В вашем случае это не проблема с mw.log, а ошибка конкатенации строк, потому что она aравна нулю. Toohool ( разговор ) 05:13, 8 марта 2013 (UTC)
Интересно, что я этого не пробовал; не думал, что это ссылка. Спасибо. Однако даже после решения проблемы, из-за которой возникает ошибка сценария, я не могу передать строку в консоль. - Scott5114 ↗ [ТОЧНОЕ ИЗМЕНЕНИЕ] 05:24, 8 марта 2013 г. (UTC)
Как вы пытаетесь это проверить? Если я запускаю =p.colspan({getParent = function() end, args = {}})из консоли отладки на странице редактирования модуля, она печатает «Test, test», а затем вывод функции. Если вы используете его #invokeдля запуска, журналы нигде не будут отображаться, если вы явно не вызовете mw.getLogBuffer()и не отобразите его каким-либо образом. Toohool ( разговор ) 06:32, 8 марта 2013 (UTC)
Я сделал ошибочное предположение, что код может выводиться на консоль при использовании функции «предварительный просмотр» для предварительного просмотра страницы, использующей шаблон, использующий #invoke для вызова модуля. Спасибо за информацию; Я кое-что узнал о том, как работает окружающая среда. Я собираюсь добавить несколько примечаний к документации на тот случай, если кто-то сделает такое же ошибочное предположение. - Scott5114 ↗ [ТОЧНОЕ ИЗМЕНЕНИЕ] 07:46, 8 марта 2013 г. (UTC)

Стандартная библиотека, предоставляемая Lua, довольно скудна. Lua - это, как говорится, «батарейки в комплект не входят». Существует ряд проектов, которые стремятся предоставить «расширенную стандартную библиотеку», например Penlight , stdlib , Underscore.lua и Nucleo . Все эти библиотеки можно импортировать как модули Scribunto с небольшими изменениями, кроме удаления тех частей, которые зависят от недоступных функций, таких как файловый ввод-вывод.

Должны ли мы иметь руководство по поводу таких библиотек «швейцарского армейского ножа»? Запретить их полностью? Выберите один и придерживайтесь его? Некоторые факторы, которые следует учитывать:

  • Производительность Легко представить себе сложный модуль, в конечном итоге импортирующий 10 или более модулей Penlight или stdlib с более чем 250 КБ кода. Если модуль повторно вызывается на одной странице, все его зависимости также повторно загружаются и выполняются. Он может быстро накапливаться, особенно с такими шаблонами, как {{ convert }} и шаблонами цитирования, которые можно многократно использовать на странице. Но, возможно, для контекстов за пределами этих часто используемых шаблонов снижение производительности будет приемлемым.
  • Стандартизация У каждого есть своя любимая библиотека, и кажется неизбежным, что в конце концов все они будут перенесены в Википедию. Придется ли редакторам освоить 20 различных библиотек для работы над сложными шаблонами? Будет ли более крутая кривая обучения оправдать более простую разработку для тех, кто действительно знаком с библиотеками?
  • Блокировка версий После того, как мы импортируем текущую версию, скажем, Penlight, и она станет широко использоваться, было бы очень рискованно когда-либо обновляться до более новой версии, поскольку некоторые страницы наверняка будут полагаться на ошибки и недокументированное поведение в текущей версии. . Похоже, мы бы фактически разветвили нашу собственную версию, застывшую во времени, без всяких проблем и прочего.

Эти факторы, кажется, противоречат использованию этих библиотек, но я думаю, что альтернативой является то, что мы будем в основном разрабатывать наши собственные базовые библиотеки по частям, без лет тестирования и доработки, через которые прошли некоторые из этих проектов. Так что я думаю, что лучше было бы действовать как можно раньше и импортировать одну или несколько из этих библиотек, чтобы предотвратить неизбежное переизобрение колес. Что думают все остальные? Toohool ( разговор ) 09:54, 4 марта 2013 (UTC)

Я не думаю, что это нужно обсуждать, и решился на enwiki. Я думаю, что будет гораздо разумнее обсудить и принять решение об этом на странице расширений в mediawiki ( mw: Extension: Scribunto , если я не ошибаюсь). Будет очень печально, если enwiki решит стандартизировать один из них, frwiki - другой, dewiki - третий, а itwiki, hewiki и eswiki решат стать коммандос. то же, что и с JS: пока mediawiki не решила стандартизировать jQuery, все вики стали коммандос. Представьте, какой беспорядок у нас был бы, если бы некоторые вики решили использовать другие фреймворки до внедрения jQuery в ядро. Несмотря на то, что сценарии JS и гаджеты не унифицированы, мало кто осознает, насколько много перекрестного опыления существует в пространстве JS между различными вики (просто для иллюстрации: практически каждая отдельная вики, которую я пробовал до сих пор, предлагает гаджет "hotcat", многие предлагают navpop, а некоторые предлагают кошачьи). Peace - יפודנחש (aka kipod) ( разговор ) 16:08, 4 марта 2013 (UTC)
Если все основные сценарии Lua имеют правильные модульные тесты, интеграция новой версии библиотеки на самом деле не такая уж большая проблема. Тесты выявят большинство проблем, вызванных обновлением. Чтобы избежать сбоев, его можно протестировать на автономной вилке enwp, после чего все необходимые изменения будут внесены ботом сразу. Стандартизация была бы чрезвычайно полезной, поскольку многие сценарии Lua обязательно копируются между проектами (кстати, разветвление сценариев между проектами - это возможность для ошибок, которые исправлены в одном, чтобы не исправляться где-либо еще, что довольно проблематично). многое из того, что мы делаем, требует очень сложного Lua, и у Scribunto есть свои собственные строковые библиотеки и прочее, которые, очевидно, еще не интегрированы с этими библиотеками, поэтому на данный момент я не хочу включать одну из них. Dcoetzee 05:06, 6 марта 2013 (UTC)
Дкоутзи хорошо резюмировал это, указав, что многое из того, что мы делаем, не сильно пересекается с добавленными функциями в этих библиотеках; посмотрите, что мы удалили из встроенных библиотек . Также стоит отметить, что mwобъект Scribunto сам по себе является "стандартной библиотекой" , и что любая сторонняя библиотека, которая может быть интегрирована, должна быть чистой Lua или должна иметь запасной вариант на чистом Lua для поддержки копирования наших модули в вики, не относящиеся к WMF, которые могут использовать движок LuaStandalone. Бьорш (WMF) ( обсуждение ) 15:14, 11 марта 2013 (UTC)

Penlight , который мне кажется лучшим кандидатом на внедрение, - это чистый Lua. Большинство его модулей, вероятно, можно было бы импортировать как модули Scribunto с небольшими изменениями и иметь дело с общими темами, такими как структуры данных, алгоритмы, функциональное программирование и общие методы строк и таблиц. Это такие вещи, которые могут быть полезны любому, кто создает умеренно сложные модули. Это может показаться излишним для модулей, которые в настоящее время пишутся для замены существующих шаблонов, но я думаю, что наши модули будут становиться все более сложными по мере того, как люди будут находить более интересные вещи, связанные со Scribunto, которые ранее были невозможны, например Module: DiscussionIndex , и более богатая стандартная библиотека, безусловно, была бы благом в этом процессе. Это не то, что нужно решать сегодня, но, возможно, просто о чем подумать в будущем. Toohool ( разговор ) 07:42, 13 марта 2013 (UTC)

Я экспериментировал со способами использования Lua для создания сводки существующих страниц обсуждения. Мои нынешние усилия являются грубыми с рядом ошибок, см . Обсуждение модуля: DiscussionIndex , но дают представление о том, какие вещи должны быть возможны. Код для этого в настоящее время распространяется в Module: DiscussionIndex и Module: ParsePage . Я также знаю, что Wnt  ( talk  · contribs ) работал над чем-то похожим с Module: RDIndex (см .: Шаблон: RDIndex ). Я думаю, что что-то подобное может быть полезно для доступа к различным страницам обсуждений и архивам. Полет драконов ( разговор ) 21:21, 28 февраля 2013 (UTC)

Я был в отъезде какое-то время, но теперь все выглядит отлично! В тот момент, когда я его увидел, это стало способом №1 для просмотра обсуждения. :) Я все еще беспокоюсь об общей загрузке / стоимости сервера как для вашего, так и для моего - есть ли способ отслеживать, что это такое, по мере продвижения вперед? Wnt ( разговор ) 15:03, 11 марта 2013 (UTC)
Должна быть возможность значительно снизить нагрузку, используя недавно добавленный mw.title: getContent () для доступа к необработанному викитексту, вместо того, чтобы полагаться на расширение шаблона предварительной обработки. Если вы еще не нашли его, любая страница, использующая Lua, имеет HTML-комментарий, добавленный в конце, который явно упоминает эту среду выполнения Lua. Я подозреваю, что для большинства страниц обсуждения мы можем проанализировать их за секунду или меньше. Полет драконов ( разговор ) 22:12, 13 марта 2013 (UTC)
Звучит здорово, но ... глядя на [1] , который в этой ревизии модуля в настоящее время настроен на перечисление (я надеюсь) каждого mw.thingy до шести уровней, я не вижу в нем никакого "getcontent", кроме " getcontentLanguage ", а значение mw.title.getcontent равно нулю. Я также не вижу комментариев по этому поводу в исходнике HTML. Где ты это видел? Wnt ( разговорное ) 15:32, 14 марта 2013 (UTC)
Я был немного неточным. getContent () - это метод титровального объекта, а не его часть, вызываемая напрямую из mw.title. Пример использования см. В разделе Модуль: CiteConversionTest . Полет драконов ( разговор ) 22:55, 14 марта 2013 (UTC)

Я знаю, что a.test = a ["test"], который позволяет вам создавать / получать доступ к произвольному полю любого массива на основе параметров, переданных в модуль.

Есть ли способ сделать это без a. часть?

Я написал Module: DisplayLuaTableContents, чтобы посмотреть, что все в mw. на самом деле (иногда мне непонятно, является ли что-то текстовым полем или функцией, которая возвращает текст, например). По общему признанию, этот подход с треском проваливается, например, в полях mw.title.new (); вы должны знать «пароль» к функции заранее, то есть, что именно она ожидает от нее.

Тем не менее, я хотел бы иметь возможность заменить mw. с произвольным допустимым параметром, чтобы я мог исследовать содержимое любой переменной в каком-нибудь скрипте, который я пишу как черный ящик, что слишком часто кажется таковым. Wnt ( разговор ) 19:09, 15 марта 2013 (UTC)

Если я правильно понимаю, вы хотите иметь возможность делать что-то вроде того {{#invoke: DisplayLuaTableContents | main | foo }}, где fooимя глобальной переменной для проверки? Вы ищете _Gтаблицу глобальных переменных. _G['foo']должен предоставить вам глобальную переменную foo. Toohool ( разговор ) 19:40, 15 марта 2013 (UTC)
Спасибо! Я вроде бы немного прочитал это, но совершенно не понял сути. В самом деле, я могу даже использовать поле _G для отображения содержимого _G: [2] . Wnt ( разговор ) 21:04, 15 марта 2013 (UTC)

Поскольку мы возимся с этими библиотеками, появляются всевозможные «типы переменных», которые не так-то легко понять из руководства, что вы можете с ними делать. Например:

  • Списки через запятую. а, б, в = г, д, е.
  • Титульные объекты. Вещи, имеющие тип () = "таблица", но tostring (of it) = "одно случайное поле", невосприимчивы к ipair и парам.
  • Итераторные функции. Каждый раз, когда я пытаюсь использовать gmatch, слышно плач и скрежет зубов. Я, кажется, шлепаюсь с ним, как рыба, выброшенная из воды, и не могу заставить его делать все, что хочу, если только я точно не скопирую какое-то известное использование.
  • mw.loadData, где пары будут работать, а next () - нет.

Я чувствую, что этот список только начинается ... Wnt ( разговор ) 19:10, 15 марта 2013 (UTC)

a, b, c сами по себе не являются «списком». это просто эффективный способ объявления и назначения переменной, а также для функций, возвращающих несколько значений. есть 2 полезных "трюка", которые связаны с этими "многозначными значениями": вы можете извлечь первое, заключив их в скобки, и вы можете преобразовать их в список, заключив их в фигурные скобки:
функция  f ()  return  1 , 2 , 3  end a , b , c  =  f ()  - теперь a == 1; b == 2 и c == 3. a , b , c  =  (  f ()  )  - теперь a == 1, b == nil, c == nil. a  =  {  f ()  }  - a == {1, 2, 3}, т.е. a [1] == 1; а [2] == 2; a [3] == 3;
Не знаю, насколько это проясняет ситуацию. Я также никогда не писал перечислитель lua (то есть что-то, что вызывает "yield"), я предлагаю вам пока оставить это волшебникам с более высокими магическими способностями. Peace - יפודנחש (aka kipod) ( разговор ) 21:28, 15 марта 2013 (UTC)
На самом деле, RRTFM я понимаю, что, как это написано сейчас, «список выражений» действительно объясняется как очень отдельный объект, и концептуально я полагаю, что легко сказать, что (exp-list) извлекает первое значение, {exp-list} преобразуется в числовую таблицу. (На данный момент я не уверен, есть ли какой-нибудь простой способ преобразовать числовую таблицу в список ... Я должен немного поиграть в своей песочнице) Wnt ( разговор ) 00:15, 16 марта 2013 г. (UTC)
Это unpack()то, что вы ищете? Anomie ⚔ 00:24, 16 марта 2013 г. (UTC)
Спасибо, попробую [3] Я вижу, что это работает. Я не уверен, может ли какая-либо «переменная» содержать список запятых, но поскольку unpack ({a, b, c}) = abc и т. Д., Всегда можно перенести эти списки. Wnt ( разговор ) 00:37, 16 марта 2013 (UTC)
coroutine.yield()а остальная часть библиотеки стандартных программ недоступна в Scribunto. Кстати, можно написать функцию итератора без использования сопрограмм. Бьорш (WMF) ( разговорное ) 22:44, 15 марта 2013 (UTC)
Что касается титровальных объектов, я отправил исправление, чтобы исправить это: gerrit change 54091 BJorsch (WMF) ( talk ) 22:44, 15 марта 2013 г. (UTC)
Для использования чего-то, что возвращает итератор, например pairsили mw.ustring.gmatch, это просто: вы просто вставляете вызов функции в forцикл, как показано в примере для pairs(). Дать функцию итератора является немного более сложным; В этом может помочь глава 7 « Программирования на Lua» . Но не часто нужно писать функцию итератора. Бьорш (WMF) ( разговорное ) 22:44, 15 марта 2013 (UTC)
Хорошо - читая это, я начинаю понимать. Я совершенно не понимал, что когда я создавал переменную a = string.gmatch (x, pattern), «функция» a не была просто копией последнего оператора. Теперь я понимаю, что на самом деле могу иметь контроль, установив переменную, и, предположительно, этот элемент управления позволяет мне независимо сканировать следующее вхождение того или другого в той и той строке на лету, без необходимости захватывать каждое вхождение в любой конкретный момент. Я думаю, что что-то вроде [4] (с небольшим редактированием) было бы очень полезно включить в местное руководство. Wnt ( разговор ) 01:00, 16 марта 2013 (UTC)
К сожалению, нет простого способа next()работать с объектами, где используется __pairsметаметод. Вы можете немного схитрить, чтобы получить что-то, что частично работает:
 локальный  mynext ,  суррогат ,  k0  =  пары (  объект  ) - Сейчас это в основном как следующий (объект, ноль)  локальной  k1 ,  v1  =  mynext (  суррогат ,  k0  ) - И это в основном похоже на next (object, k1)  local  k2 ,  v2  =  mynext (  суррогат ,  k1  )
Проблема заключается в том , что вызов во второй раз может вернуться и снова , как это происходит с , или он может игнорировать то , что вы прошли и возвращение независимо и это до на основе количества вызовов. FWIW, этот трюк будет работать как с чем-то возвращенным , но сработает иначе . Бьорш (WMF) ( разговорное ) 22:44, 15 марта 2013 (UTC) mynext( surrogate, kn )kn+1vn+1next()kmvmnext()mw.loadData()frame:args
TWISI, у каждого языка есть свой «стиль» или «вкус», если хотите. если создать итератор непросто, тогда нам следует научиться писать элегантный код без итераторов, вместо того, чтобы использовать их.

однако есть некоторые полезные функции, которые на самом деле довольно естественны, и я бы хотел увидеть их в mw.libraryUtil, которые могут сделать жизнь более удобной:

мв . libraryUtil . unzip  =  function (  t  )  if  type (  t  )  ~ =  'table',  тогда  return  end ;  local  tk ,  tv  =  {},  {}  для  k ,  v  в  парах (  t  )  do  table.insert (  tv ,  v  )  table . вставка (  tk ,  k  )  конец  return  tk ,  tv конецмв . libraryUtil . zip  =  function (  tk ,  tv  ),  если  type (  tk  )  ~ =  'table'  или  type (  tv  )  ~  'table',  тогда  вернуть  end  local  res  =  {}  для  i  =  1 ,  math.min (  # tk ,  # tv  )  do  res [ tk [ i ]]  =  tv [ i ]  end  return  res endмв . librarhUtil . new  =  function (  t  )  retrun  setmetatable (  {},  {  __index  =  t  }  ) end

первые два говорят сами за себя. последний позволит вам делать такие вещи, как

х  =  мвт . libraryUtil . новый (  таблица  )x : insert (  12  ) y  =  x : remove () x : sort ( comp ) - и т. д.или j  =  {  a  =  function (  t  )  table . вставка (  t ,  44  )  конец  } k  =  mw . libraryUtil . новый (  j  ) k : a ()
мир - יפודנחש (он же кипод) ( разговор ) 02:03, 16 марта 2013 (UTC)

Было бы здорово, если бы у нас было что-то подобное;

{{Таблица автонумерации| 1 = {| class = "wikitable"| -| ### || abc || def| -| ### || ghi || jkl|}}}

какой дисплей

- Nullzero ( разговор ) 05:46, 16 марта 2013 (UTC)

Является ли Шаблон: Autotable5 достаточно хорошо?
  • Шаблон: Autotable5 может обрабатывать узкие таблицы с пустыми параметрами: чтобы иметь только 2 столбца данных в автоматически пронумерованной таблице, просто поместите пустые параметры для столбцов 3/4/5, например:
 {{Autotable5 | numfmt = width = 20px | colfmt1 = width = 90px | colfmt2 = width = 105 пикселей | row1col1 | row1col2 | | | | row2col1 | row2col2 | | | | row3col1 | row3col2 | | | }}

{{Autotable5 | numfmt = width = 20px | colfmt1 = width = 90px | colfmt2 = width = 105px | row1col1 | row1col2 | | | | row2col1 | row2col2 | | | | row3col1 | row3col2 | | | }}

Использование {autotable5} происходит очень быстро, когда небольшая таблица, состоящая всего из 10 строк, может быть переформатирована за 1/10 секунды. См .: Шаблон: Autotable5 , для получения дополнительных примеров и настройки стиля / ширины каждого столбца. - Wikid77 ( обсуждение ) 18:10, 16 марта 2013 г. (UTC)

Текущий шаблон истории статей - беспорядок; его надо переделывать через Lua. (Например, цикл for значительно упростил бы это.) - Ypnypn ( обсуждение ) 15:03, 14 марта 2013 г. (UTC)

Шаблоны манипуляций со строками

Все, что находится в категории «Шаблоны манипуляций со строками», должно быть преобразовано; это будет большим приростом производительности. Сумана Харихаресвара, менеджер инженерного сообщества Фонда Викимедиа ( выступление ) 01:06, 13 марта 2013 г. (UTC)

Почти все они были обращены несколько дней назад. Полет драконов ( разговор ) 22:09, 13 марта 2013 (UTC)
См. Это обсуждение выше. Богхог ( разговор ) 19:07, 15 марта 2013 (UTC)

Математические шаблоны

Это поможет производительности преобразовать математические шаблоны . Сумана Харихаресвара, менеджер инженерного сообщества Фонда Викимедиа ( выступление ) 01:06, 13 марта 2013 г. (UTC)

Вы должны быть более конкретными. Подавляющее большинство шаблонов в этой категории не имеют ничего стоящего перед преобразованием. Wnt ( обсуждение ) 14:29, 13 марта 2013 (UTC)

Шаблон координат

Эта ошибка указывает на то, что шаблоны Coord было бы неплохо преобразовать. Сумана Харихаресвара, менеджер инженерного сообщества Фонда Викимедиа ( выступление ) 01:12, 13 марта 2013 г. (UTC)

{{ corre }} был преобразован в Lua неделю назад. Toohool ( разговор ) 02:18, 13 марта 2013 (UTC)

Арабская Википедия

Если у вас есть время, ознакомьтесь с этой ошибкой и этим комментарием относительно шаблонов в арабской Википедии, которые могут использовать оптимизацию. Сумана Харихаресвара, менеджер инженерного сообщества Фонда Викимедиа ( выступление ) 01:18, 13 марта 2013 г. (UTC)

  • Также ниже: в разметке #Remember есть #switch: 1 для любого условия . - Wikid77 ( обсуждение ) 18:40, 16 марта 2013 г. (UTC)

Я хотел бы отправить запрос на функцию переключения, которая позволит находить совпадения в диапазоне номеров. Что-то вроде

{{xswitch | {{{1 |}}} 
| 0..127 = Один байт
| 128..2047 = Два байта
| 2047..55295 | 57088..65535 = Три байта
| 65536..1114111 = Четыре байта
| #default = Неверно кодовая точка
}}

где {{example|65279}}бы вернули "Три байта". Van Isaac WS Vex внес вклад 12:23, 28 февраля 2013 г. (UTC)

Очевидно, что могут потребоваться некоторые изменения, например, знак равенства может потребоваться перейти на стрелку " ->", чтобы избежать синтаксиса именованной переменной. Van Isaac WS Vex внес вклад 21:29, 28 февраля 2013 г. (UTC)
В Module: xswitch я работал на начальном уровне . См. [5] [6] [7] для некоторых примеров вызовов. Я запрограммировал его с некоторыми глупыми функциями, такими как возможность включения в файл "профиля", содержащий значения, разделенные знаком "|" и преднамеренная, хотя, возможно, непродуманная функция, заключающаяся в том, что если значение меньше первого числа, оно сопоставляется так же, как и выше последнего числа, поскольку предполагается, что это значение выходит за пределы допустимого диапазона. У меня есть всевозможные параноидальные тесты после получения большого количества нулевых ошибок. Я не обижусь, если мало что останется от моей работы к тому времени, когда это увидит реальное использование в вики, но эй ... это "работает". То есть, пока вы не поймаете какое-то дело, которое я пропустил. Wnt ( разговорное ) 04:31, 11 марта 2013 (UTC)
Итак, из вашего третьего примера похоже, что он соответствует наибольшему значению, которое меньше входного, поэтому диапазон выражается как текущее значение соответствия до меньшего, чем следующее совпадение, верно? Ван Исаак WS Векс вклад 3:05, 13 марта 2013 (UTC)
Да. С предостережением я должен был упомянуть, что пороги должны быть в порядке; по крайней мере, сейчас он их не сортирует (хотя мог). Wnt ( разговорное ) 14:31, 13 марта 2013 (UTC)
[[MediaWiki: {{{1}}}]]  ([{{fullurl: MediaWiki: {{{1}}} | action = edit}} редактировать] | [[Обсуждение MediaWiki: {{{1}}} | обсуждение]] | [{{fullurl: MediaWiki: {{{1}}} | action = history}} история] | [{{fullurl: Special: Whatlinkshere / MediaWiki: {{{1}}}}} ссылки] | [{{fullurl: MediaWiki: {{{1}}} | action = watch}} смотреть] | журналы )
Добавлено m ссылок. - Депип ( разговор ) 14:50, 13 марта 2013 г. (UTC)
( редактировать конфликт ) я не думаю, что " |2047..55295 |57088..65535 = Three bytes" имеет смысл, и даже не уверен, возможно ли это. Расширение parserfunctions может использовать этот противоречивый синтаксис, потому что оно берет на себя полный контроль над синтаксическим анализом, но в модуле нет разумного способа узнать, какой параметр идет первым, а какой - вторым. вам, вероятно, нужно изменить его, чтобы использовать более разумный разделитель (вместо |), например, " |2047..55295,57088..65535 = Three bytes" или даже что-то вроде " |77 42 30..39 101 = Unoccupied seats ". легко разрешить и то, и другое, т.е. любая последовательность анутинга, отличная от цифры, знака минус или точки, будет считаться разделителем (вам нужно остерегаться использовать 2 000 000 для "2 миллионов", потому что это будет интерпретировано как 2, 0 или 0). Кроме того, я не могу придумать простой и эффективный код, чтобы гарантировать отсутствие перекрытия двух диапазонов, а в случае перекрытия нет хорошего способа гарантировать согласованный возврат. во всех остальных случаях это должно быть достаточно просто. относительно "типа" (т.е. сравнение лексическое / строковое против числового: я бы не стал использовать дополнительный параметр, чтобы указать, какой это тип - я бы предпочел использовать две отдельные функции и два отдельных шаблона. Peace - יפודנחש (aka kipod ) ( разговор ) 15:52, 13 марта 2013 (UTC)
Приведенный выше пример не предназначался для предписания синтаксиса или разделителей, а просто для примера. По сути, я просто скопировал текущий #switchсинтаксис и расширил его, чтобы он занял числовой диапазон (и использовал простой тестовый диапазон, с которым я работал над недавним шаблоном), и я хорошо знаю, что для работы Lua могут потребоваться совершенно иные разделители, чем в текущий парсер #switch. Van Isaac WS Vex внес вклад в 22:06, 13 марта 2013 г. (UTC)
Я понимаю эту просьбу так: сделайте это расчетом (логической проверкой), где каждая опция означает «между x и y». Звучит здорово. (Таким образом, это не совсем более «надежный» #switch, а больше похоже на расширение идеи #switch). Тем не менее просьба - улучшение. Конечно, могут быть добавлены параметры (например, между [min .. max], [min .. max), (min .. max), то есть включая / исключая). Оператор «и» должен быть четким. Суть в том, что мы вводим расчетный диапазон . Это ново. - Депип ( разговор ) 23:00, 13 марта 2013 г. (UTC)
Я создал Module: Range . в настоящее время у него есть одна функция: iswitch. идея (возможно) состоит в том, чтобы добавить "tswitch" для аналогичного утверждения, которое будет основано на лексическом (текстовом), а не числовом сравнении. он позволяет использовать как диапазоны, так и дискретные числа, с произвольным количеством диапазонов и дискретных чисел для каждой опции, разделенных пробелами.
есть некоторая оговорка: если есть перекрытие между несколькими диапазонами, так что значение попадает в более чем один из них, функция вернет один из них, но непредсказуемо, какой именно.
другое, более коварное предостережение: у вас не может быть «44 = something», потому что нет никакого способа отличить этот параметр от настоящего безымянного параметра, номер которого равен 44. Если вы хотите, чтобы 44 было допустимым значением, используйте «44». "," 44..44 "или" +44 ".

см. пример ниже:

{{#invoke: Range | iswitch| 12| 1 2 3 48 = один, два, три или сорок восемь| -1000000..2,45 = от минус одного миллиона до двух целых сорок пять сотых| 60..70 1.5e2..2e9 = от шестидесяти до семидесяти или от ста пятидесяти до 2 миллиардов| по умолчанию = ничего из вышеперечисленного}}
предполагая, что это соответствует требованиям, было бы неплохо, если бы кто-нибудь мог создать Module: Range / tests и Module: Range / doc . я мог бы добраться до этого, если бы не другие добровольцы. конечно, если вы напишете несколько тестов и обнаружите, что текущий код не работает, исправьте это или дайте мне крик.
мир - יפודנחש (он же кипод) ( разговор ) 04:41, 14 марта 2013 (UTC)
В приведенном выше примере, что происходит / должно происходить, когда на входе «12»? - Депип ( разговор ) 15:28, 15 марта 2013 г. (UTC)
что должно произойти - это интересный вопрос. что на самом деле происходит в текущем коде, так это то, что этот конкретный ввод (12 = двенадцать) игнорируется. если вы хотите иметь «12» как отдельную запись, вы можете использовать «+12», «12» или «12..12». Я могу изменить это поведение, но стоимость будет связана с использованием имени для «основного» параметра, то есть числа, с которым мы сравниваем, который в настоящее время является безымянным параметром 1. Если мы разрешим «голые» числа, кто-то, скорее или позже захотят использовать «1 = One», и тогда все развалится.
это поведение можно легко изменить, если мы согласимся с тем, что клавиша переключения будет не параметром №1, а скорее именованным параметром. какое было бы хорошее имя? я могу придумать «значение» или «переключатель», но может быть название получше.
мир - קיפודנחש (он же кипод) ( разговор ) 16:37, 15 марта 2013 (UTC)
Тогда это именованный параметр. Я думаю, что простота использования превалирует (вместо сложных ограничений, если их вообще можно объяснить). Может быть, n = для числа? - Депип ( разговор ) 17:41, 15 марта 2013 г. (UTC)
 Готово , за исключением того, что я действительно не думаю, что "n" достаточно информативно, поэтому я назвал его "значением". открыт для изменений, конечно, когда кто-то придет с лучшим именем для переменной switch. В настоящее время 0 тестов ... если кто-нибудь может создать Module: Range / tests и Module talk: Range / tests, это было бы здорово, иначе я надеюсь добраться до него когда-нибудь. мир - קיפודנחש (он же кипод) ( разговор ) 18:36, 15 марта 2013 (UTC)

некоторые дополнения

Я немного расширил код, чтобы разрешить открытые диапазоны (т.е. строго «меньше / больше, чем», а не нормальное «меньше или равно»: т.е. «(1..2)» означает любое значение от 1 до 2, не включая 1 или 2. Для завершения допускаются полностью лишние «[» и «]», т.е. «[1..2]» совпадает с «1..2» и «[1..2)» то же самое, что "1..2)"

Кроме того, я добавил открытые диапазоны: «..10» означает 10 или меньше, «10 ..» означает 10, а «большой», «..10)» означает меньше 10, а «(10 ..» означает больше, чем 10.

Помните, что в разметке есть #switch: 1 для любого условия.

Прежде чем создавать слишком много вариантов, помните, что функции wp: parser часто работают быстрее, чем шаблоны на основе Lua, а #switch: 1 может ветвиться при любой комбинации тестов диапазона или сложных условий, состоящих из нескольких частей, как описано в Help: Switch . Вспомните, как любую ветвь #switch можно записать как:

{{#ifexpr: {{{a}}} <34,5 и {{{b}}}> 8 * 67-14 или {{{w}}} = 3 * {{{a}}} + {{{ b}}} | <--then--> 1}} = выполнить эту ветку

Тактика для #switch: 1 состоит в том, чтобы каждое сложное условие давало истинное значение как "1", которое соответствует значению #switch "1", и чтобы эта ветвь запускалась всякий раз, когда сложное условие истинно.

Будет очень сложно превзойти #switch в сложных условиях / условиях диапазона, хотя может быть трудно напомнить всем, что #switch может справиться с многочисленными сложными условиями. Между тем, нам действительно нужна функция Lua {#invoke: x | fastswitch} для перехода по списку из «800» значений, намного быстрее, чем #switch может обработать 800 ветвей. - Wikid77 18:40, 16 марта 2013 г. (UTC)

это не о «напоминании всем». речь идет о разумном и поддерживаемом синтаксисе. можно использовать #ifexpr, чтобы написать что-то, что будет делать что-то эквивалентное:
{{#invoke: Range | iswitch| value = {{какой-то сумасшедший шаблон, возвращающий число | param1 | param2 | param3 | param4}}| -200 ..- 150-50 ..- 5 5..10 20..40 = группа диапазонов 1| (-150 ..- 140 12..17 120..140 = группа диапазонов 2| 180..220 (1e7 .. = группа диапазонов 3| по умолчанию = ничего из вышеперечисленного}}
но это будет нечитаемый, не подлежащий ремонту беспорядок, который заставит ослепить любого, кто слишком долго смотрит на него.
производительность - это еще не все. если мы хотим, чтобы статьи и шаблоны поддерживались, мы не всегда можем прибегать к простейшему синтаксису, даже если иногда он может работать немного лучше (не говоря уже о том, что обычно это не так). мир - יפודנחש (он же кипод) ( разговор ) 01:05, 18 марта 2013 (UTC)

Есть ли у нас форум для справки по HTML или мы делаем это здесь? (Например, у меня возникла проблема с [8], когда я не могу понять, как вставить кучу помеченных div в абсолютном режиме, чтобы они не двигались все дальше и дальше от того места, где они должны были быть из-за новые строки в тексте) PS В конце концов я понял, что часть Wnt ( разговор ) 03:34, 17 марта 2013 (UTC)

  • Используйте другой форум, так как запросы Lua-функции находятся здесь: Мы должны обсудить на Module_talk: ImportProtein или в другом месте с любым, кто предлагает решения для использования HTML-тегов div, потому что эта страница предназначена для запросов Lua-функций. - Wikid77 11:12, 17 марта 2013 г. (UTC)
Вовсе нет смысла использовать другой форум ... однако, если он не существует, мы определенно должны его создать. Для многих приложений Lua HTML будет самой сложной и самой важной частью упражнения, и, конечно же, то же самое верно и для многих шаблонов. Wnt ( разговорное ) 13:39, 17 марта 2013 (UTC)

Пару раз я сталкивался с загадочными ошибками с модулями, которые не могут вызвать getParent. В этом случае [9] модуль не смог вызвать mw.title.getCurrentTitle (): попытаться вызвать глобальный «getContent» (нулевое значение). Поскольку это происходит в начале, до сих пор я обрабатывал этот вид ошибка, отказавшись от того, с чем это случилось. Но есть ли этому объяснение? Wnt ( разговор ) 21:38, 17 марта 2013 (UTC)

getContent- это метод титровального объекта. Таким образом, вы можете сделать content = page:getContent()или content = page.getContent( page ), но content = getContent( page )это ошибка, потому что getContentв глобальном пространстве нет функции. Полет драконов ( разговор ) 21:44, 17 марта 2013 (UTC)
Дерьмо - тогда я просто все запутал - я был уверен, что эти ошибки были частью какой-то грандиозной концепции, но это было действительно глупо. Клянусь, я делал код лучше, чем это, но спасибо! Wnt ( разговор ) 22:08, 17 марта 2013 (UTC)
Черт побери, как это работает. Мне пришлось использовать "frame: preprocess", чтобы заставить nowiki работать; в противном случае все выходные данные были связаны. Если бы я только мог вспомнить, как открыть текст в окне редактирования ... Wnt ( обсуждение ) 22:17, 17 марта 2013 г. (UTC)

Можно ли сделать модуль, выводящий рейтинг статьи для любой данной статьи? Это поможет, например, поддерживать актуальность символов на VA . - Ypnypn ( разговор ) 14:20, 18 марта 2013 (UTC)

Это определенно возможно. Но есть ли бот, который уже делает это для рейтинговых таблиц Википроекта? Я не уверен, какой подход будет более эффективным, или он представляет собой дублирование усилий в обоих направлениях? Wnt ( разговор ) 18:52, 18 марта 2013 (UTC)
С ботом сложно использовать одноразовый случай. Допустим, я пытаюсь отслеживать всего несколько статей на своей пользовательской странице; Больно найти бота, настроить его, отключить, когда я закончу, и т. д. Также обратите внимание, что многие страницы, такие как WP: Vital статьи, вообще не обновлены. (Недавно я изменил рейтинг развлечений с B на GA.) - Ypnypn ( разговор ) 19:46, 18 марта 2013 г. (UTC)

Это можно сделать, используя mw.title:getContent()для получения содержимого страницы обсуждения статьи. Разобрать его было бы немного сложно, так как он должен был бы выяснить, какие из шаблонов на странице являются баннерами WikiProject, и решить, что делать, если есть несколько баннеров с разными рейтингами, и, возможно, обработать некоторые другие крайние случаи. Кроме того, я считаю, что получение титульного объекта - «дорогостоящая операция», и поэтому она ограничена 500 на страницу, поэтому его нельзя будет использовать на такой странице, как WP: VA, с таким большим количеством списков. Toohool ( разговор ) 20:10, 18 марта 2013 (UTC)

Между прочим, в [10] указано, что максимальное число - 99. Как мне узнать, что такое $ wgExhibitedParserFunctionLimit на этом сервере? Wnt ( разговорное ) 20:26, 18 марта 2013 (UTC)
Просмотрите исходный код HTML любой страницы и выполните поиск по запросу «Количество дорогостоящих функций синтаксического анализатора». - WOSlinker ( разговор ) 07:23, 20 марта 2013 (UTC)

Я был настолько уверен , что раздел в справке: Lua отладки о проблемах строчных устарел , что я создал [11] , чтобы опровергнуть его - и был поражен , чтобы найти его на самом деле до сих пор не работает на самом деле это сделал работу, я просто оставил заблудший "модуль" в нем как идиот, извините !, но [12] делает. Тем не менее, есть миллиард страниц Sandbox / isaac / .., которые, как я полагаю, работают? Я хотел бы прояснить точные детали ошибки.

На данный момент я просто изменю его, включив "Module:" в начале приведенной ссылки на пример, поскольку вы не можете ничего запускать в User: space (да, я даже это проверил [13] ). Wnt ( разговорное ) 16:29, 22 марта 2013 (UTC)

О, еще текст гласит. Итак, первый шаг в «песочнице» - скопировать Module: String на личную страницу User: Lua Developer / sandbox / Module: String . Теперь наш разработчик может редактировать модуль, как ей нравится. В любой момент она может открыть Special: TemplateSandbox , используя "префикс песочницы" по умолчанию, которым в ее случае будет "Пользователь: Разработчик Lua / песочница". Это означает, что при просмотре любой страницы со страницы песочницы всякий раз, когда синтаксический анализатор обнаруживает шаблон T или модуль M , он сначала проверяет, есть ли страница с именем «User: Lua Developer / sandbox / Template: T» или «User: Lua Developer» / sandbox / Module / M "существует

Верно ли все это для Module: User: Lua Developer / sandbox / pages? Потому что я знаю, что не могу запустить то, что там говорят. Wnt ( разговорное ) 16:33, 22 марта 2013 (UTC)

Я думаю, вы путаете здесь две разные вещи. существует псевдопространство имен «Песочница» под пространством имен «Модуль», где люди могут размещать «псевдоприватные» страницы в общедоступном пространстве имен, т. е. имя страницы - «Модуль / Песочница / имя_пользователя / имя модуля». Раздел справки: Отладка Lua посвящен использованию страниц в пользовательском пространстве для разработки модулей, используя синергию между расширением "Scribunto" и расширением "TemplateSandbox". расширение TempateSandbox имеет функцию / ограничение, заключающееся в том, что оно не обрабатывает "автоматический регистр" (т.е. преобразование первого символа имени страницы в верхний регистр) так интуитивно, как ожидалось, поэтому пользователь должен быть осведомлен о внутренней работе и убедиться, что первый символ имени _after_ префикса песочницы, который она использует, всегда прописной. Я тот, кто написал сбивающий с толку абзац, на который вы ссылались, и на самом деле я также открыл об этом билет bugzilla, который был закрыт с помощью «wontfix», так что так оно и есть. Если вы можете найти способ улучшить этот запутанный абзац, чтобы он стал более ясным, пожалуйста, сделайте это. Peace - יפודנחש (aka kipod) ( разговор ) 17:08, 22 марта 2013 (UTC)
Код в обоих файлах примеров у меня тоже не работает (генерируется "Ошибка сценария"). Я его переписал, и теперь все в порядке: Модуль: Пользователь: DePiep / sandbox2 . Могу я предложить вам переписать код, чтобы доказать / продемонстрировать ошибку? - Депип ( разговор ) 17:32, 22 марта 2013 г. (UTC)
На самом деле, каким бы странным ни был этот код [он вызывается с {{#invoke: user: wnt / sandbox / all lowercase | 1}} :)], он работал на обеих страницах. Wnt ( разговор ) 18:47, 22 марта 2013 (UTC)
Тогда проблема с User: Lua Developer / sandbox / Module: String (в пространстве пользователя!) Не зависит от модуля. Так работает именование страниц WP. Вдобавок ко всему: сохранение кода в вашем пользовательском пространстве - это нормально, но вы не можете вызывать его оттуда. Думаю, этот абзац можно убрать со справочной страницы. - Депип ( разговор ) 17:35, 22 марта 2013 г. (UTC)
нет нет нет. Модуль: Пользователь: DePiep / sandbox2 - это совсем другое: эта страница находится в пространстве имен «Модуль».
Расширение TemplateSandbox позволяет вам использовать страницы в _пространстве_пользователя_ в качестве модулей. Страница будет называться Пользователь: DePiep / Sandbox / Module: Testmodule . После того, как вы разместите там модуль, откройте Special: TemplateSandbox и выберите «Пользователь: DePiep / Sandbox» в качестве «Префикса песочницы». На этом этапе вы сможете использовать что-то вроде {{#invoke: Testmodule}}, а система будет использовать код из «User: DePiep / Sandbox / Module: Testmodule» вместо «Module: Testmodule». Однако автоматический верхний регистр работает только для первого символа после пространства имен (в данном случае «Пользователь»), поэтому, если страница, которую вы создаете, будет User: DePiep / Sandbox / Module: testmodule вместо User: DePiep / Sandbox / Module: Testmodule , вы не сможете вызвать его из Special: TemplateSandbox , поскольку автоматический верхний регистр будет _по-прежнему_ выполняться на стороне "вызова", но не на фактическом имени страницы. надеюсь, что это немного яснее, чем объяснение в Help: Lua debugging . мир - יפודנחש (он же кипод) ( разговор ) 17:56, 22 марта 2013 (UTC)
Я понял. Помимо песочницы в моем собственном пользовательском пространстве, какая будет прибыль? Я играю в песочнице в пространстве модуля. - Депип ( разговор ) 18:01, 22 марта 2013 г. (UTC)
Извините - на самом деле у меня просто в одном тесте был случайный текст, а не в другом, имитирующий то, что я думал об ошибке. Как я теперь понимаю, нет причин беспокоиться о нижнем или верхнем регистре при именовании чего-либо в Module: space, то есть всего, что можно просмотреть за пределами специальной программы просмотра песочницы шаблонов. Wnt ( разговорное ) 18:45, 22 марта 2013 (UTC)
Удалите все ассоциации Special: TemplateSandbox (справка, ссылки, страницы, ...) из модуля, который решает эту проблему. Все эти вопросы следует решать в Special: TemplateSandbox . - Депип ( разговор ) 22:35, 22 марта 2013 г. (UTC)

позвольте мне вернуться к обсуждению вопроса, который был задан выше: «Зачем нам вообще нужен Special: TemplateSandbox для разработки модулей? Почему недостаточно« псевдо-песочницы »в« Module: Sandbox »?

Итак, дело в том, что для разработки новых скриптов нет огромного преимущества. Лично я предпочитаю работать и развиваться в своем пользовательском пространстве. возможно, я чувствую, что это дает мне некоторое ощущение "конфиденциальности", но на самом деле нет никакого преимущества (кстати: страницы в моем пользовательском пространстве, которые имеют расширение ".js", _are_ защищены: только я и пользователи с "editinterface" право (что в enwiki означает администраторов) может редактировать их. Мне бы очень понравилось, если бы такая же защита была предоставлена ​​для страниц в моем пользовательском пространстве, имя которых содержит "Модуль:")

Итак, как я уже сказал, для разработки нового сценария lua нет особой разницы. однако при изменении существующего модуля, особенно модуля, который широко используется. расширение TemplateSandbox позволяет вам проверить, какой эффект ваши изменения будут иметь на _фактических_ страницах, когда модификация все еще находится в вашем пользовательском пространстве, и только после того, как вы протестируете эффект на достаточном количестве реальных страниц, чтобы чувствовать себя комфортно, вы копируете измененный модуль из своей песочницы на страница в пространстве имен «Модуль:».

для этого вам нужно быть в курсе всего фиаско с прописными / строчными буквами, иначе вы можете даже * подумать *, что тестируете модифицированный модуль в своем пользовательском пространстве, но из-за неправильного регистра ("строка / строка") вы на самом деле буду запускать «настоящий» модуль, а не проверять ваши изменения.

Peace - יפודנחש (aka kipod) ( разговор ) 00:50, 23 марта 2013 (UTC)

Модуль должен разрешать «примечание = этот тест проверяет дополнительный столбец отрицательного ввода». - Депип ( выступление ) 00:59, 24 марта 2013 г. (UTC)

Как отмечалось ранее, некоторые функции #switch имеют сотни ветвей, а функция выбора переключателя Lua может работать быстрее на сотни. Для сравнения с крошечным #switch в { yesno }, у нас могла бы быть функция Lua для запуска проверки перехода-перехода для более чем трехсот вариантов, например, в Template: Metadata_population_AT-7 (на основе немецкой Википедии), который был отображение населения городов в австрийском регионе Тироль (с 2011 г.). Этот шаблон имеет почти 288 ветвей в #switch, и было бы интересно вызвать функцию полезности Lua для сравнения 288 кодов городов, чтобы назначить каждому из 288 номеров населения. Общая концепция состоит в том, чтобы иметь несколько десятков шаблонов населения для каждой нации, а затем копировать последние данные о численности населения (из немецкого WP), чтобы в течение 1 часа все статьи о "3000" городах были обновлены из списка последних данных о населении. Если переключение Lua выполняется быстро, то, возможно, мы могли бы указать 2000 городов в каждом шаблоне metadata_population. Кроме того, в статьях о субатомных частицах используются десятки форматированных символов частиц, которые могут выиграть от быстрого поиска в Lua для преобразования кодов частиц в глифы с надстрочными / подстрочными индексами. Раньше каждый символ частицы хранился в отдельном шаблоне, быстрее, чем # переключение многих кодов частиц в одном шаблоне, но затем люди запутались в сотнях имен шаблонов и больше не поддерживали правильное форматирование всех частиц. Когда много частиц перечислено в одном шаблоне #switch, легче корректировать форматирование, чем утомительно проверять внутри сотен шаблонов. У нас есть аналогичная проблема для шаблонов значков флагов, где около 300 стран могут все использовать один шаблон "{Country_data_common}" с быстрым переключением, а затем более старые годы или другие территории могут продолжать использовать редкие, отдельные тысячи {Country_data_ *}, но только 1 {Country_data_common} для флагов 300 основных стран. - Wikid77 ( обсуждение ) 22:29, 23 марта 2013 г. (UTC)

не мог понять вышеперечисленное. Буду признателен, если вы попытаетесь резюмировать это в трех отдельных и ясных предложениях, в которых будет указано, что вы предлагаете (если вы действительно что-то предлагаете). спасибо - יפודנחש (aka kipod) ( обсуждение ) 23:38, 23 марта 2013 (UTC)
В моем эксперименте с Template: SymbolForElement в Template: SymbolForElement / sandbox есть переключатель на основе Lua, использующий loadData, который работает чуть более чем в два раза быстрее (160 в секунду против 70 в секунду). В этом случае насчитывается примерно 270 перечисленных случаев, дающих примерно 135 возможных результатов. Таким образом, кажется, что Lua предлагает преимущество для больших операторов switch. Не уверен, где находится точка безубыточности, за исключением того, что 10 случаев, вероятно, слишком мало, чтобы оправдать использование Lua, в то время как 200 случаев, вероятно, более чем достаточно. Полет драконов ( разговор ) 05:44, 24 марта 2013 (UTC)
  • Использование 1000 параметров экспоненциально медленнее: передача тысяч параметров переключателя в Lua приводит к экспоненциальному замедлению работы анализатора, поэтому нам нужно закодировать множество вариантов внутри строк с разделителями, чтобы Lua выполнял поиск, как выбор первого подходящего варианта для подстроки результата. Выполняя тесты для моделирования большой функции #switch из 3000 ветвей, я неоднократно подтверждал, что передача тысяч параметров обычно экспоненциально медленнее, чем первые 500 параметров. Следовательно, передача 2000 параметров выполняется за 3 секунды, 4000 параметров выполняется за 13 секунд или 6000 параметров выполняется за 27 секунд. Было бы намного быстрее передать один параметр в виде одной строки с разделителями вариантов, чередующихся с результирующими значениями, чем пытаться передать 3000 вариантов в качестве 6000 параметров, которые выполнялись в анализаторе около 27 секунд. Хотя Lua все еще может обрабатывать 6000 параметров, для сравнения вариантов в течение «0,02» Lua секунды время загрузки интерфейса #invoke составляет 27 секунд. Парсер NewPP сталкивается с огромными задержками при передаче 6000 параметров в Lua, или в шаблон, или в функцию синтаксического анализатора #switch для 6000 ветвей "| x =". См. Расширенное описание и формулу задержки по адресу: « WT: Lua # Передача 1000 параметров экспоненциально медленнее ». Подробнее позже. - Wikid77 ( обсуждение ) 12:32, 24 марта 2013 г. (UTC)
  • Разделяйте варианты, возможно, в форме «| ^ x = 7 ^ yy = 4 ^ w = zz»: поскольку параметры разделены вертикальной чертой «|» тогда варианты выбора ветви переключателя Lua могут быть разделены внутри одного параметра символом "^", непосредственно перед каждым выбором, например, "^ xxx = n", где двойной курсор будет буквальным символом курсора, а выбор "^^ = caret" точно соответствует одному '^'. Если все варианты выбора объединены в строку с разделителями, то многие сотни или тысячи вариантов могут быть обработаны за доли секунды. Однако для ситуаций, когда имеется всего несколько сотен ветвей, наличие другой функции Lua для сравнения отдельных параметров по-прежнему будет достаточно быстрым, при этом допускаются тысячи вариантов в отдельном формате строк с разделителями. - Wikid77 13:48, 24 марта 2013 г. (UTC)
Есть также другой тип переключателя, чтобы исследовать, где используется множество подшаблонов. См. Пример в {{ ISO 639 name }}. - WOSlinker ( разговор ) 15:29, 24 марта 2013 г. (UTC)

Википедия не позволяет нам вставлять на страницы общего назначения, а также не позволяет нам вводить в заблуждение CSS-листы для обычных пользователей. Тем не менее, я знаю, что если у вас есть div со скрытым переполнением, вы можете отобразить часть изображения. Можем ли мы получить такую ​​эффективность, которую вы ожидаете от хорошей страницы, используя одно изображение с флагами каждой страны для очень быстрого создания спрайтов изображений? Или мы побеждены? (Фон: [14] ) Wnt ( разговор ) 01:26, 24 марта 2013 (UTC)

Если у вас есть URL-адрес изображения, вы можете использовать его в качестве фона для div с помощью свойства backgroud-image. Я считаю, что вы можете использовать вызов «предварительной обработки» в сочетании с тем или иным типом [[File: image name]] и извлечь из него URL-адрес. не уверен, что это хорошая идея, и я не смотрел, какие из этих вызовов попадают в категорию "дорогих", но я вполне уверен, что это можно сделать, используя свойство "background-image" (я действительно собираюсь разрешить это для штучки с гистограммой, как альтернатива сплошным полосам). мир - יפודנחש (он же кипод) ( разговор ) 02:04, 24 марта 2013 (UTC)
Фоновое изображение CSS также должно быть запрещено MediaWiki. Если вы найдете способ заставить его работать (без редактирования страниц пространства имен MediaWiki или вашего личного JS / CSS), напишите по адресу [email protected] или сообщите об ошибке в компоненте «Безопасность» . Бьорш (WMF) ( обсуждение ) 02:48, 24 марта 2013 (UTC)
Хммм, быстро взглянув вверх, похоже, вы можете сделать это с помощью обычного встроенного изображения [15] . Я знаю, что у меня есть фрагменты изображений для отображения в моей песочнице, хотя по какой-то причине я не мог создавать интерактивные ссылки из очень крошечных полосок, которые я использовал в своем протеиновом модуле последние два раза, когда я пытался (я полагаю, что есть поле?). Wnt ( разговор ) 04:26, 24 марта 2013 (UTC)
Это примерно единственный способ «обрезки» изображений в CSS. См. Также {{ Обрезка изображения CSS }}. Anomie ⚔ 14:52, 24 марта 2013 г. (UTC)
С тех пор я реализовал это как Module: Sprite . Wnt ( разговор ) 17:17, 24 марта 2013 (UTC)

Я не думаю, что кто-то пробовал это, но я хотел указать, что Lua дает нам возможность писать инструменты, которые можно использовать для преобразования текста страницы, а затем навсегда сохранить эти изменения.

Например, если у вас есть сценарий:

p = {};
function p.run( frame ) local title = mw.title.getCurrentTitle(); local wiki_text = title:getContent(); ---Operations on wiki_text go here--- return transformed_text;
end
return p;

Затем вы берете любую вики-страницу и заменяете ее на:

{{subst:#invoke:MyModule|run}}

При сохранении он найдет ранее сохраненный викитекст страницы, выполнит преобразование, а затем сохранит преобразованный текст.

Этот метод можно использовать для создания любого количества инструментов очистки, например, для сортировки категорий и ссылок. В любом случае, я просто хочу указать на эту возможность, потому что подозреваю, что большинство людей не думали об использовании Lua для подобных вещей. Полет драконов ( разговор ) 22:08, 13 марта 2013 (UTC)

Конечно, каждый шаблон трансформирует содержимое страницы. Эта идея зависит от старого subst:поведения. Пожалуйста, объясните, что Lua может добавить. - Депип ( разговор ) 23:28, 14 марта 2013 г. (UTC)
Вы знаете, можно ли это использовать для добавления содержимого в сводку редактирования? Я знаю, что часто выполняю повторяющуюся задачу, когда копирую информационное окно / шаблон / другое содержимое в несколько статей в категории, и я могу копировать содержимое статьи, заполняя значения и информацию по ходу, но редактировать резюме, как правило, носит произвольный характер. Возможность скопировать сводку редактирования вместе с новым содержанием статьи была бы невероятно полезной. Van Isaac WS Vex внес вклад 13:29, 25 марта 2013 г. (UTC)

Я хочу удалить страницу в пространстве модуля ( Модуль: Пользователь: DePiep / sandbox2 ). Как? {{ db-g7 }} (самоудаление автора) не принимается. - Депип ( разговор ) 01:38, 25 марта 2013 г. (UTC)

Хороший вопрос. Я удалил страницу для вас, но я понятия не имею, как / если мы можем разместить шаблоны в пространстве модуля. Мартин Хоэкстра ( разговор ) 09:29, 25 марта 2013 (UTC)
Спасибо. Конечно, я имел в виду эту проблему. - Депип ( разговор ) 10:12, 25 марта 2013 г. (UTC)
Единственный способ - разместить его на странице документации модуля. Anomie ⚔ 12:41, 25 марта 2013 г. (UTC)

Время от времени люди упоминают «модульные тесты» как тип документации или выше как нечто, что должен иметь каждый модуль. Этот термин не используется в Справочном руководстве Lua. В Интернете есть информация о них, чья точка зрения полностью ускользает от меня (если false - это правда ?? [16] ). С модульным тестированием я начинаю понимать идею, но она все еще очень абстрактна - зачем авторам одного модуля, используемого в только одна вики это делает? Действительно ли возможно составить несколько небольших выборок входных данных, если это то, что они означают, и знать, что модуль работает так, как вы хотите, во всех отношениях? Может кто - то пожалуйста , напишите файл справки на модульном тестировании Lua, говоря , что это такое, кто должен это делать, почему они должны это делать, и как это сделать? Спасибо! Wnt ( разговорное ) 15:40, 14 марта 2013 (UTC)

  • Эссе, вероятно, является лучшим описанием модульного тестирования: я объяснил следующие проблемы в новом эссе « wp: модульное тестирование Lua ». Общая концепция заключается в том, что существуют связанные проблемы « модульного тестирования » в сочетании с более масштабным « интеграционным тестированием », чтобы передать пожелания клиента в « приемочном тестировании », где не все возможные варианты должны работать, потому что « YAGNI » ( вам это не понадобится ) когда модуль реально используется для реальных «заказчиков». После серьезного обновления вся подсистема обычно проходит « регрессионное тестирование », чтобы снова убедиться, что основные функции все еще работают. Если продукт будет широко использоваться для «промышленной надежности», то лучше провести « стресс-тестирование », чтобы убедиться, что он может справиться с тяжелой рабочей нагрузкой, например, тестирование ссылок на Lua с помощью огромной статьи, содержащей 450 ссылок и т. Д. . Подробнее см. В эссе. - Wikid77 ( обсуждение ) 08:50, 15 марта 2013 г. (UTC)
  • Модульные тесты сейчас повсеместны во всех средах разработки, но особенно важны для динамических языков, таких как Lua, где они по существу заменяют роль ошибок компилятора. Их основная цель состоит в том, что при изменении сценария и / или его зависимостей вам необходимо убедиться, что ваши изменения не испортили его каким-то неожиданным образом и не привели к тому, что он больше не работает должным образом. Выполнение этого вручную возможно, но может быть утомительным - модульные тесты можно легко запускать после каждого отдельного редактирования, что позволяет быстрее обнаруживать ошибки, что, в свою очередь, упрощает их локализацию и исправление. Конечно, модульное тестирование, как и любое другое тестирование, никогда не бывает исчерпывающим и обычно расширяется со временем для устранения новых ошибок и непредвиденных случаев. Dcoetzee 02:36, 20 марта 2013 г. (UTC)
  • Я заметил две вещи: во-первых, кажется, что ошибки завершают полный тестовый прогон. Можно ли отловить некоторые из них с помощью xpcall ()? в mw: Extension: Scribunto / Lua reference manual # В отличиях от стандартного Lua указано, что не все ошибки можно отловить, но, возможно, отлов некоторых уже поможет. В качестве секунды мимолетная проверка (так что не сжигайте меня на костре, если я ошибаюсь!) Deep_compare, кажется, указывает на то, что она выйдет в бесконечный цикл, когда я попытаюсь сравнить t1 и t2, построенные из t1 = { }; t1 [1] = t1; t2 = {}; t2 [1] = t2. Мартин Хоэкстра ( разговор ) 15:10, 25 марта 2013 (UTC)
Вы правы насчет deep_compare, я только что добавил это вчера и хотел, чтобы это было быстро и просто, поэтому я взял реализацию, которая не обрабатывает циклические ссылки. Я пока добавил примечание в документацию об этом. Toohool ( разговор ) 01:48, 26 марта 2013 (UTC)

Я написал парсер CSV в Module: CSV , который может использоваться другими модулями. (На самом деле это было намного сложнее, чем ожидалось, из-за разницы между цитируемыми и некотируемыми полями) и были бы признательны за комментарии и проверку кода. Мартейн Хоэкстра ( разговор ) 18:19, 24 марта 2013 (UTC)

3 комментария: 1-й, я не думаю, что CSV имеет смысл для этого модуля / шаблона - как упоминалось выше, я думаю, мы должны разрешить "языковое форматирование", что означает для enwiki, что числа могут отображаться как 12 432,33, а для некоторых на других языках это может означать использование запятой как «десятичной точки». 2-й комментарий: вы можете посмотреть mw.text.split () (см. Mw: Extension: Scribunto / Lua reference manual ). этот модуль еще не находится в официальном развертывании, но скоро появится. Я скопировал код в свой экспериментальный модуль, но как только mw.text будет развернут, я удалю его. wnd останется с вызовом elegnt. и 3-й комментарий: вы можете захотеть открыть новый раздел для обсуждения вашего CSV-модуля, а не скрывать его внутри обсуждения «гистограммы». мир - קיפודנחש (aka kipod) ( разговор ) 22:14, 24 марта 2013 (UTC)
Привет, спасибо за обзор! Что касается языкового форматирования: до сих пор я писал модуль только как функцию Lua: строка преобразуется в таблицу таблиц, где каждая таблица представляет собой строку, а каждое значение - поле в строковом формате. Если вы хотите, чтобы числовые данные выводились из него, данные все равно должны быть преобразованы в число, поэтому обработка значения 12 432,33 будет оставлена ​​вызывающей функции.

mw.text.split () по-прежнему имеет проблему с полями в кавычках. «blabla, blabla» - это совершенно законное поле, и его будет нелегко проанализировать с помощью split, поскольку тогда вам придется «повторно собрать» плохо разделенные поля. Еще хуже обстоит дело с повторной сборкой полей, включая пробелы. Возможно, Anomie все еще может помочь здесь, поскольку мой код в настоящее время вызывает mw.ustring.explode-utf8 для каждого символа как минимум один раз и до трех раз. Это можно было бы исправить на стороне пользователя, но мне почти пришлось бы заново реализовать все с mw.ustring, и я, вероятно, сильно испортил бы это (я просмотрел это, в настоящее время он немного выше моего уровня навыков, а не для упомянуть, что у меня не так много опыта UTF-8).

по поводу вашего третьего пункта: отличный момент! Я перенес это в новый раздел. - Предшествующий неподписанный комментарий добавлен Мартейн Хекстра ( обсуждение • вклад ) 23:03, 24 марта 2013 г. (UTC)

Поскольку единственные символы, которые вам нужны - кавычки, запятая, может быть обратная косая черта - это ASCII, вы должны иметь возможность делать это, используя строковые функции вместо mw.ustring. Также, кстати, обратите внимание, что в Scribunto с LuaSandbox (установленным на вики-сайтах WMF) вообще не будет вызывать эту функцию «explode_utf8», поскольку в этом случае почти все в mw.ustring переопределяется вызовом PHP. Anomie ⚔ 23:28, 24 марта 2013 г. (UTC)
Спасибо, Anomie, это облегчение, поскольку перспектива O (n ^ 2) выглядела довольно уродливо. Я мог бы ограничить выбор разделителей полей и записей набором ASCII, но я все равно хотел бы читать содержимое полей в utf-8. так как большинство символов в формате должны быть посвящены данным, а не метасимволам, это помогает, но пока не выводит меня из леса (кстати, обратная косая черта не является специальным символом в CSV, кавычки в цитируемых полях экранируются с помощью повторяя их). В этом модуле я вызываю mw.ustring (данные, индекс, индекс) для каждого индекса. Это все еще O (n) при текущей реализации? Мартейн Хоэкстра ( разговор ) 23:52, 24 марта 2013 (UTC)
Предполагая, что mw.ustring.sub действительно является линейным, можно получить более эффективную реализацию, используя вместо этого mw.ustring.gcodepoint для получения всех отдельных символов. Toohool ( разговор ) 03:49, 25 марта 2013 (UTC)
В вики-сайтах WMF большинство основных функций ustring реализовано с использованием библиотеки PHP mbstring. Функции сопоставления с образцом реализуются путем преобразования образца в регулярное выражение PCRE и использования библиотеки PHP pcre. А функции нормализации Unicode реализованы с помощью нормализации Unicode MediaWiki, которая может использовать библиотеку intl PHP. Обратите внимание, что gcodepoint не очень эффективен с точки зрения памяти, поскольку он создает таблицу, содержащую все кодовые точки как целые числа, и выполняет итерацию по ней. Лучше всего протестировать его. Anomie ⚔ 12:54, 25 марта 2013 г. (UTC)
В некоторых реализациях вместо удвоения кавычек используется обратная косая черта. А некоторые просто слепо предполагают, что внутри цитируемых значений не будет кавычек. Несмотря на RFC, настоящего «стандарта» для CSV не существует.
Хорошая вещь в UTF-8 заключается в том, что если вы заботитесь только о разделителях ASCII и слепо пропускаете все, что находится между ними, вы можете игнорировать многобайтовость UTF-8 и просто использовать stringмодуль. Anomie ⚔ 12:54, 25 марта 2013 г. (UTC)
Я не думал об этом, спасибо. Дело в том, что переписывание регулярных выражений с помощью Dragons flight в некотором роде спорно, но помните об этом позже. Мартейн Хоэкстра ( разговор ) 13:17, 25 марта 2013 (UTC)
Надеюсь, вы простите меня за такие слова, но это выглядит ужасно. Я настоятельно рекомендую вам действительно использовать регулярное выражение, то есть gmatch, для определения шаблонов. Чтение строк по одному символу за раз будет довольно медленным, вдвойне, потому что ustring имеет довольно жесткое снижение производительности при индексировании позиции в длинных строках. Было бы полезно, если бы вы привели несколько примеров ожидаемого ввода и ожидаемого результата. Без примеров немного сложно понять, что вы пытаетесь сделать для каждого случая. Полет драконов ( разговор ) 23:20, 24 марта 2013 (UTC)
Ну, в основном реализуйте RFC: http://tools.ietf.org/html/rfc4180#page-2 Я сомневаюсь, что регулярное выражение будет работать намного быстрее, чем текущий подход рекурсивного спуска, но мы могли видеть. Текущее снижение производительности происходит из-за повторного вызова explode, который индексирует строку в таблицу charnum -> codepoint. Это нужно сделать только один раз, но в настоящий момент библиотека так не работает. В качестве примечания, я не думаю, что регулярные выражения (или любое другое решение) могут читать более одного символа за раз. что касается ожидаемого ввода и вывода: я ожидал бы строку
item11, item12, item "13," item14 "item21, «элемент, 22», элемент 23, item24"item" "31", "item32 ", элемент 33,", элемент, 34 "
быть проанализированным как таблица
{{"item11", "item12", "item \" 13 "," item14 "}, {"item21", "item, 22", "item 23", "item24"},{"item \" 31 "," item \ n32 "," item33 ",", item, 34 "}}

Я добавил несколько модульных тестов в Module: CSV / testcases (включая несколько функций, которые, как я знаю, еще не реализованы, например, параметр ignoreEmptyLines и экранирование символов кавычек). Один тест закомментирован, потому что он вызвал тайм-аут скрипта. Toohool ( разговор ) 00:06, 25 марта 2013 (UTC)

Спасибо, Toohool! Мартин Хоекстра ( разговор ) 00:10, 25 марта 2013 (UTC)
В настоящее время не работает с ",a"- добавлен тестовый пример. - WOSlinker ( разговор ) 13:23, 25 марта 2013 г. (UTC)
Остался только один неудачный тестовый набор. Код был изменен на подход, основанный на регулярных выражениях. (спасибо Dragons flight!). Мартин Хоэкстра ( разговор ) 16:07, 26 марта 2013 (UTC)

Запрос 1: Мне бы очень хотелось (и я уверен, что другие тоже) одноразовый заменяющий модуль, который перевернул бы мою страницу обсуждения пользователя так, чтобы самые новые разделы были вверху. Может ли быть применима идея из [[#Transforming page content |]]? Возможно, модуль можно спроектировать так, чтобы страницу не нужно было сначала очищать - просто добавьте {#module: flip section order} в любом месте страницы, и при сохранении он изменит порядок разделов на всей странице, а затем исчезнет. Это перевернет разделы верхнего уровня, а также все подразделы внутри них. Обычный текст в каждом разделе не будет переупорядочен и будет цепляться, как и раньше, начиная с самого нового внизу. Все, что находится перед первым разделом, например вступительный текст, должно оставаться вверху страницы. Точно так же теги категорий должны оставаться внизу страницы.

Запрос 2: (для включения с помощью обычного шаблона {самый новый раздел вверху}, который говорит: «Эта страница обсуждения организована самым новым разделом вверху» ) модуль, который заставит функцию добавления раздела помещать новые разделы поверх существующих разделов, сразу после любого вступительного текста вверху страницы, а не внизу страницы. Или, если это невозможно сделать с модулем, возможно, это может быть настройка пользователя. Прокрутите страницу вниз, чтобы узнать, что нового, ну, ну, неуклюжий и неинтуитивный дизайн интерфейса. Я понятия не имею, как программировать. Так что это просьба / идея для тех из вас, у кого есть смелость кода. Спасибо!

- Rogerhc ( разговор ) 00:58, 17 марта 2013 г. (UTC)

  • Некоторые преимущества, но много недостатков. Порядок «новейшие наверху» может показаться выгодным, когда самая новая запись будет отображаться первой, но есть много недостатков. Рассмотрим долгосрочное влияние тысяч других редакторов:
  • Необычно для прежних читателей: очевидно, что большой проблемой будут люди, привыкшие просто добавлять что-то внизу страницы.
  • Читатели думают, что перемещенное сообщение потеряно: после автоматического перемещения многие читатели могут прийти к выводу, что они опубликовали «потерянное сообщение», и продолжат репостинг внизу 5 раз, прежде чем выгорят.
  • Старые темы скрываются ниже: самые новые вверху будут скрывать старые темы, которые ранее просматривались при прокрутке вниз.
  • Не перечитывать список дел: скрытие старых тем, скорее всего, увеличит количество забытых дел по мере продвижения вниз по списку.
  • Подразделы снизу вверх и сверху вниз: логические подразделы подразделов могут работать вопреки потоку параграфов, поэтому будет список записей снизу вверх, записанный как параграфы сверху вниз, но с подразделами либо сверху вниз в порядок абзацев или переупорядочение снизу вверх для имитации общего списка записей. Такой выбор нисходящих или нисходящих подразделов приведет к бесконечной путанице, когда читатели будут структурировать подразделы статей сверху вниз, но, возможно, подразделы страниц обсуждения будут восходящими, и вы знаете, что люди будут отчаянно искать даты подписей сообщений, чтобы определить, какое вложенное сообщение было опубликовано и в какое время, независимо от размещения снизу вверх.
  • Копирование частичных бесед может конфликтовать по порядку: в редких случаях при цитировании / копировании другого текста обсуждения порядок сообщений может запускать встречный поток.
  • Предлагаемые текстовые подразделы могут показаться перевернутыми: при использовании страницы обсуждения для предложения текста из 5 подразделов эти 5 подразделов могут показаться перевернутыми, если ожидается, что более поздний текст будет в более высоких подразделах.

Как будто не было достаточно проблем для читателей, страдающих дислексией (которые часто пишут свои слова «в обратном направлении»), эта концепция новичка на вершине, вероятно, увеличит уровни замешательства и крайнего разочарования у читателей, которые были доведен до края, имея дело с тысячами страниц статей и многочисленными редакторами. Затем они отправляют сообщения на страницу обсуждения, где нижнее сообщение продолжает исчезать, перемещаясь вверх. Не круто. - Wikid77 ( обсуждение ) 03:33, 20 марта 2013 г. (UTC)

Поэтому используйте функцию «Добавить тему», чтобы добавлять темы вверху, а не внизу на страницах, которые содержат виджет «Новые вверху». Как только страница будет сохранена, читатель увидит свое новое сообщение прямо здесь, вверху, на первом экране страницы, в отличие от текущей системы добавления снизу, которая скрывает его за экраном даже на мало используемых страницах. А для старательно слепого нижнего фидера, который прокручивает страницу вниз, даже не глядя на первый экран перед собой, припаркуйте {новейшую вверху} заметку внизу страницы (и вверху). Сделанный. Исправлена ​​проблема с перевернутым интерфейсом.
Подразделы вывернуты вверх тормашками? Не меняйте порядок подразделов. Подразделы могут быть самыми новыми внизу. Конечно, может, это не сработает. Это может сработать. Я бы хотел попробовать, потому что, честно говоря, самое новое - это сломанный интерфейс с самого начала.
Возможно, это не приоритет. Мы справляемся. Но было бы полезно поэкспериментировать с новейшими на ведущих страницах обсуждения. Виджет, который делает это, если бы его можно было легко создать, облегчил бы такие эксперименты. И спасибо за предостережения. Я не думаю, что они запрещают экспериментировать, но я не знаю, как программировать. Так что, если кто-то здесь захочет написать это, я хочу попробовать использовать его на своей странице обсуждения. - Роджерк ( разговор ) 00:32, 22 марта 2013 г. (UTC)
Черт возьми, я попробовал кодировать это: Обсуждение модуля: NewestAtTop, который в основном закончен, я думаю - у меня возникли некоторые проблемы с придуманием `` элегантного '' способа поиска текста последнего раздела (я полагаю, вы можете рассчитывать числа ... может быть, я вернусь к этому позже. Wnt ( разговор ) 05:05, 26 марта 2013 (UTC) Хорошо, теперь похоже, что это работает ... как задумано ... но философия может быть для обсуждения! Wnt ( обсуждение ) 16:53, 26 марта 2013 (UTC)

Я начал пытаться сделать это в Module: TrainingPages , но быстро вышел из своей глубины. Я пытаюсь создать более удобный и легко поддерживаемый шаблон для учебных модулей в Википедии: Обучение . Я хочу, чтобы работало вот так:

У меня есть индексная страница вики-текста, на которой перечислен набор страниц в определенном порядке (например, все страницы в модуле «Редактирование» тренинга для студентов ). Я хочу, чтобы модуль мог принимать индексную страницу (форматирование которой не имеет особого значения, но чем проще, тем лучше) и заголовок страницы, который находится на этой индексной странице, и он возвращает имя предыдущей страницы или следующей page, или номер текущей страницы, или общее количество страниц.

Например, примерно так:

{{#invoke: TrainingPages | next_page | currentpage = {{PAGENAME}} | index = Wikipedia: Training / For_students / Editing_module_index}}

будет использовать волшебное слово PAGENAME для определения текущей страницы и использовать список страниц в индексе для определения следующей страницы в последовательности. Точно так же модуль previous_page найдет страницу перед текущей, модуль page_number определит номер страницы (начиная с 1 как первой страницы в индексе), а модуль total_pages вернет количество страниц в индексе. - Сейдж Росс (WMF) ( разговор ) 01:35, 26 марта 2013 г. (UTC)

Википедия: Training / For_students / Editing_module_index - это красная ссылка. Если вы дадите нам индекс, это легко сделать. Также желательны особенности форматирования. Wnt ( разговор ) 01:55, 26 марта 2013 (UTC)
Кроме того, можно избежать параметра pagename (хотя он может быть необязательным) - мы можем просто использовать page = mw.title.getCurrentTitle (); linkto = page.fullText (я думаю), чтобы увидеть текущую страницу из модуля. Wnt ( разговор ) 01:58, 26 марта 2013 (UTC)
Хорошо, я нацарапал кое-что, что вроде работает. Размышляя об этом, я склонен помещать разметку в другой модуль или в старомодный шаблон - я думаю, что на самом деле можно было бы переместить его под какое-то более общее имя и просто пролистать любой индекс. Wnt ( разговор ) 03:42, 26 марта 2013 (UTC)
Спасибо!!! Я создал пример index. При необходимости форматирование указателя можно упростить; не стесняйтесь менять это. Идея состоит в том, чтобы использовать это для новых версий Википедии: Обучение / заголовок и Википедия: Обучение / нижний колонтитул, чтобы для отдельных страниц, таких как Википедия: Обучение / Для студентов / Моя песочница , не нужно было редактировать их все каждый раз при заказе. страниц или количество страниц переключается. Для меня имеет смысл переместить модуль в общий заголовок и оставить его без определенной разметки форматирования, - Сейдж Росс (WMF) ( доклад ) 10:07, 26 марта 2013 г. (UTC)
Я изменил модуль таким образом , что он может принимать либо ваши данные в обработанном виде (потенциально более эффективным) , как в модуле: TrainingPages / индекс по умолчанию или он может получить доступ к индексный файл напрямую. Единственный недостаток, который у меня все еще есть, заключается в том, что он не работает, когда у вас есть непрерывная ссылка в формате nowiki (или внутри другой ссылки каким-либо другим способом, я полагаю). Проблема в том, что для mw.ustring.gsub нет "простой" функции, поэтому, чтобы использовать ее, мне пришлось бы помещать escape-символы во все и безупречно извлекать их снова, или же убирать числовые позиции для каждой скобки. а nowiki и сделайте замену подстроками ... излишне раздражает. (Кого мне вообще приставать к такой функции? .. Это не ошибка, но определенно не функция.) Wnt ( обсуждение ) 18:18, 26 марта 2013 г. (UTC) (Чтобы уточнить, краткосрочный период исправление было [17] )
Это отлично, именно на то, на что я надеялся! Он уже сможет делать с ним многое из того, что я хотел бы сделать. Еще несколько полезных дополнений для моего варианта использования:
  • page_number и total_pages методы для возврата номера текущей страницы
  • Методы next_page и previous_page не должны возвращать ничего (или какой-то нулевой индикатор), если текущая страница является последней или первой страницей соответственно.
  • необязательные аргументы для отмены вышеуказанного поведения и возврата указанной страницы вместо предыдущей / следующей в начале / конце, в идеале определяемых как часть формата индекса модуля (но не как часть основной последовательности для целей подсчета). Сейдж Росс (WMF) ( разговор ) 01:11, 27 марта 2013 (UTC)
Хорошо, я думаю, что предоставил правильные методы page_number и total_pages. Другое поведение было возможно до использования defaultpage =, поэтому мне потребовалось несколько минут на wtfm  ;). Wnt ( разговор ) 05:51, 27 марта 2013 (UTC)

Нам нужна дополнительная поддержка администратора для установки Lua-версий Template: Cite_web / lua и Template: Citation / lua в предыдущие имена шаблонов. В настоящее время акцент на редких, крошечных деталях подавляет более широкий прогресс в продвижении вперед, поскольку « паралич анализа » в обсуждении мелочей, используемых на нескольких страницах, вместо того, чтобы устанавливать улучшения, уже написанные для использования на других 1,6 миллиона страниц с использованием wp. : Формат цитирования CS1 . Отвлечение серьезно мешает прогрессу, когда вы пытаетесь сделать все «идеальным», прежде чем делать что-либо еще. Вместо этого нам нужно сначала установить версии Lua, а затем обсуждать, обсуждать и беспокоиться о крошечных, тривиальных различиях в форматах. Интерфейс Lua внутри Template: Cite_web должен иметь следующую разметку:

 {{#invoke: Citation / CS1 | citation| CitationClass = сеть}} {{документация}}

Все основные параметры были протестированы для базовой работы на типичной странице тестовых сценариев:

  • Module_talk: Citation / CS1 / test / web - протестируйте все параметры, а также типичные примеры

В редких случаях, когда формат отличается, то предыдущая версия, { cite_web / old } может использоваться на любой странице для любого цитирования, которое обязательно должно сохранять предыдущий формат цитирования. ВОЗДЕЙСТВИЕ: более 1,4 миллиона страниц будут переформатированы для использования в 6 раз более быстрого модуля Lua : Citation / CS1 , а вспомогательный шаблон на основе разметки Template: Citation / core будет отделен от почти 1 миллиона страниц. Аналогичное обновление было сделано для Template: Cite_news , у которого почти такие же параметры. - Wikid77 ( обсуждение ) 08:15, 26 марта 2013 г. (UTC)

Для всех, кто ответит на это: Прежде чем вы это сделаете, вам, вероятно, следует просмотреть обсуждение на Module talk: Citation / CS1 # Transition for Cite Book . Anomie ⚔ 10:34, 26 марта 2013 г. (UTC)
То, что вы делаете, великолепно - я имею в виду, что это серьезно работа из Википедии, которую вы могли бы включить в резюме, и вы настаивали на ее выполнении в то время, когда никто не думал о преимуществах. Но не поддавайтесь нетерпению. «Крошечные, тривиальные различия в форматах» было бы легче рассмотреть и отбросить, если бы они были тщательно задокументированы, например, в Module: Citation / doc (сейчас это красная ссылка). Wnt ( разговорное ) 14:52, 26 марта 2013 (UTC)
Скрипт Lua для wp: CS1 cites находится в Module: Citation / CS1 с / doc page Module: Citation / CS1 / doc . Однако эти крошечные различия формата были исправлены во время задержек, поэтому документировать здесь нечего. - Wikid77 ( разговор ) 09:53, 27 марта 2013 г. (UTC)
Я не уверен, почему Wikid77 становится нетерпеливым. Некоторое время мы устанавливаем один шаблон цитирования Lua каждые несколько дней. В процессе работы мы уделяли время проверке каждого случая на предмет каких-либо регрессов и исправлению ошибок по мере их поступления. {{ cite book }} был установлен поздно вечером 24 числа. Я думаю, что все известные ошибки, связанные с этим, теперь исправлены либо в живой версии, либо в копии для песочницы . Моя цель - попытаться установить {{ cite web }} примерно в четверг на этой неделе. На этом этапе мы перейдем ко всей большой четверке (книги, журналы, новости и Интернет). Это по-прежнему оставляет {{ citation }} и большое количество редко используемых шаблонов, но после cite Web мы уже должны были реализовать большинство преимуществ в производительности. Полет драконов ( разговор ) 15:53, 26 марта 2013 (UTC)
Когда {cite_web} переходит на Lua, он исправляет около 100 000 канцелярских ошибок в форматировании ссылок (например, «inc ..» или «pp.7» для использования «p.»), В том числе более 4900 статей, в которых отсутствует точки (или запятые) между тысячами параметров цитирования. См. «Ссылки» (пропущенные точки) в статьях « Библиография Южной Америки », « Телефонный код 868 » или « Артур Рот ». Кроме того, переход {cite_web} восстановит около 20 миллионов тегов span-тегов метаданных COinS на более чем 1,3 миллиона страниц для использования DASHBot для обновления URL-адресов мертвых ссылок, чтобы также перечислить предлагаемые URL-адреса архивов. Я сожалею, что казался «нетерпеливым», пытаясь обновить эти 1,3 миллиона статей раньше. Возможно, мне следовало отметить миллионы существующих ошибок при обработке этих страниц ранее и то, как переход {cite_web} на Lua раньше мог исправить эти миллионы ошибок форматирования в течение нескольких дней. Конечно, не то чтобы кого-то действительно беспокоят ошибки в цитировании. Это просто вещи, над которыми стоит задуматься. - Wikid77 ( обсуждение ) 20:22, 26 марта 2013 г. (UTC)

Привет! Вероятно, еще слишком рано, но я не знаю, сколько времени потребуется для реализации следующей идеи: когда включение свойств из Викиданных развертывается в английской Википедии, возможно, стоит реализовать универсальное навигационное окно, которое показывает подразделения административная единица конкретной страны. Эти подразделения следует сгруппировать по типу. Если это удастся сделать (я верю, что это возможно), мы сможем избавиться от тысяч отдельных шаблонов и использовать один шаблон, который всегда отражает текущие данные из Викиданных и не нуждается в обновлении. Есть предположения? - DixonD ( разговор ) 11:05, 27 марта 2013 г. (UTC)

Если у вас есть пример в виде на викиданном, пожалуйста , ссылку непосредственно к нему , чтобы мы могли увидеть , что мы можем сделать. Существуют серьезные ограничения на то, что шаблон Lua может напрямую импортировать - например, я не знаю, как получить доступ к содержимому категории, набору результатов поиска или к содержимому файла в Википедии, не говоря уже о любом другом месте. Wnt ( разговорное ) 15:45, 27 марта 2013 (UTC)
Например, чтобы выбрать файл d: Q383842 :
  • Простое включение {{d: Q383842}} ==> {{d: Q383842}}. Никаких кубиков.
  • Доступ к {{#invoke: Page | id | d: Q383842}} ==> 0 - т.е. страница не существует, что касается mw.title.new.
  • {{#invoke: Page | exists | d: Q383842}} ==> - страница не существует.
  • {{#invoke: Page | getContent | d: Q383842}} ==>
    . Не происходит.
Насколько я знаю (надеюсь, я что-то пропустил!), Мы по-прежнему придерживаемся того, что люди переносят путем вырезания и вставки в браузере. Wnt ( разговорное ) 15:56, 27 марта 2013 (UTC)
Он еще не размещен в английской Википедии. Возьмем, например, d: Q54150 . Синтаксис включения должен быть {{#property: P150 | id = Q54150}}, а d: P150, по- видимому, является тем свойством, которое нам, вероятно, нужно. - DixonD ( разговор ) 17:14, 27 марта 2013 г. (UTC)
Хотел бы я знать, как это найти. Благодаря вам я теперь знаю, что есть тег #property и что он содержится в файле $ wgExtensionMessagesFiles, но я понятия не имею, как получить доступ к этому файлу. Я не могу найти #property в руководстве Mediawiki, потому что такие вещи, как "{" и "#", повсеместно игнорируются, везде, всеми, при любом поиске и никогда не могут быть рассмотрены. Вы полагаетесь на молву, чтобы найти подобные вещи? Wnt ( разговорное ) 17:58, 27 марта 2013 (UTC)
Вы можете проверить документацию здесь и здесь - DixonD ( обсуждение ) 20:43, 27 марта 2013 г. (UTC)

Я не знаю, делалось ли это раньше, поэтому я создал список шаблонов, которые используют большинство функций парсера в en.wikipedia (с paserfunctioncount.py из pywikipedia): см. User: Darkdadaah / Parserfunctioncount . Darkdadaah ( разговор ) 16:28, 27 марта 2013 (UTC)

Отличная работа! Этот шаблон: рейтинг ACE по сезону ураганов определенно выглядит так, будто его шея стоит на рубеже - 3090 функций парсера для одной изящной маленькой таблицы, и пользователи должны оставить пустые столбцы и иметь дело с лимитом в 30 штормов, который мы хотели бы, чтобы не нарушать скоро! Я думаю, что этот тег также является отличным призом для необходимого программирования. Приятно оставить простые шаблоны в качестве шаблонов, чтобы многие люди могли их редактировать, но если один из них уже находится под баннером «2313374u», он также может быть написан чем-то разумным. Wnt ( разговорное ) 16:50, 27 марта 2013 (UTC) {{intricate}}
удивительный. прочитав код некоторых из этих «лучших списков», например Template: Albumchart , вы поймете, что вдохновило создателей Brainfuck . (это также объясняет, что не так в комментарии #Remember, разметка имеет #switch: 1 для любого условия выше ...) Peace - קיפודנחש (aka kipod) ( обсуждение ) 17:00, 27 марта 2013 г. (UTC)

Задача

Преобразуйте целочисленные числовые значения в эквивалентный эквивалент на соответствующем языке.

Контекст

Преобразование цифр, представленных в статьях в числовой или другой форме, и для использования в шаблонах.

Тестовые кейсы

Sfan00 IMG ( обсуждение ) 23:54, 23 февраля 2013 (UTC)

Обсуждение

Для преобразования римских чисел может потребоваться контекст. Sfan00 IMG ( обсуждение ) 00:48, 24 февраля 2013 (UTC)

Я удалил ваши шестнадцатеричные тесты выше. Помимо того факта, что он не входит в область видимости (предлагаемый вывод не является текстовой формой числа), невозможно отличить некоторые шестнадцатеричные числа от десятичных чисел с такими же цифрами. С другой стороны, римские цифры должно быть довольно легко сделать, просто комбинируя их со скриптом преобразования римских цифр, который имеет и другие потенциальные применения. Dcoetzee 01:05, 24 февраля 2013 (UTC)
Я начинаю работать над этим в Module: ConvertNumeric . Dcoetzee 01:09, 24 февраля 2013 (UTC)

{{ Numtext }} или {{ spellnum }} могут преобразовывать текст в десятичную дробь. Шестнадцатеричные числа можно сначала преобразовать в десятичные с помощью {{ hex2dec }}. У нас есть преобразование десятичной системы в римскую в {{ Roman }}; Я не знаю, есть ли где-нибудь преобразование из римского в десятичный, но я не могу представить, что оно принесет много пользы. Toohool ( разговор ) 01:57, 24 февраля 2013 (UTC)

Теперь у меня есть Module: ConvertNumeric, выполняющий базовое преобразование десятичных чисел в текст, но он еще не поддерживает все функции {{ Numtext }} и {{ spellnum }}. Как только все параметры поддерживаются, он сможет заменить эти сложные шаблоны. Все еще работаю над этим. Dcoetzee 02:37, 24 февраля 2013 (UTC)
Действительно ли используется {{ Numtext }} или его можно просто перенаправить на {{ Spellnum }}? - WOSlinker ( разговор ) 08:27, 24 февраля 2013 г. (UTC)
Я закончил Module: ConvertNumeric (numeral_to_english), как описано на Module talk: ConvertNumeric, и изменил как {{ Numtext }}, так и {{ Spellnum }}, чтобы использовать его. Он должен воспроизводить все функции исходных шаблонов, но все же может содержать небольшие проблемы или проблемы со стилем - я мог бы использовать обзор кода от кого-то другого. Относительно того, почему существует два шаблона: похоже, Numtext поддерживает множество функций, которых не было в Spellnum, например округление, а Spellnum использовал слово «отрицательный» вместо «минус» для отрицательных чисел. Так что они не совсем взаимозаменяемы. Я не выполнял преобразование римских цифр. Dcoetzee 13:07, 24 февраля 2013 г. (UTC)
Я добавил функцию roman_to_numeral для практики, развлечения и выгоды, которая преобразует все разрешенные и самые незаконные римские числа в числовые значения. Хотя я борюсь с размахом. Может ли кто-нибудь увидеть, как я могу сделать roman_numerals локальными и по-прежнему вызываемыми? Я еще не добавил для этого функцию # invoke'able в таблицу, ни какие-либо модульные тесты (они должны появиться завтра, когда у меня будет время взглянуть на структуру модульного тестирования). Я был бы признателен за обзор кода. Мартин Хоэкстра ( разговор ) 22:13, 20 марта 2013 (UTC)
AFAIK, нет способа вызвать функцию извне модуля, не добавив ее в возвращаемую таблицу (p). Код выглядит хорошо. roman:upper()Вызов на входе может быть полезным , поэтому он может обрабатывать строчной ввод. Toohool ( разговор ) 22:55, 20 марта 2013 (UTC)
Я думаю, что я бы предпочел вызвать это из вызывающей функции, что-то вроде {{#invoke|ConvertNumeric|convert_roman|xi}} => p.convert_roman(frame) convert_roman(tostring(frame.args[1]):upper()) end , но я не знаю, каковы соглашения по этому поводу, и, возможно, у меня есть дополнительный параметр для преобразования его в английский, как запрашивается в приведенных выше тестовых примерах. (но я действительно не знаю, как это можно использовать). Как вы, ребята, думаете, что проще сделать это так или перебрать назад по необратимой строке? (то есть, бросьте рев и продолжайте roman:sub(-i, -i)) Мартейн Хекстра ( разговор ) 23:40, 20 марта 2013 г. (UTC)

Задача

Преобразование спецификатора числа и валюты в текст. (Т.е. проверьте алгоритм печати)

Контекст

Расширение валютных сумм в статьях и шаблонах.

Тестовые примеры (с использованием фунтов)

Sfan00 IMG ( обсуждение ) 23:54, 23 февраля 2013 (UTC)

  • Рассмотрите возможность использования {Spellnum}: в большинстве случаев быстрый Template: Spellnum (50 в секунду) может обрабатывать написание числа в слово или может служить основой для нового шаблона. Например:
  • {{spellnum | 121.99}} → сто двадцать одна целая девять целых девять десятых десятых
Главный вопрос, оправдывающий создание нового шаблона: « Будет ли эта функция нужна во многих статьях?» В большинстве случаев идея применима только к нескольким статьям, и ее можно было бы вручную закодировать, так что другим редакторам было бы намного проще ее изменить. Шаблон: Spellnum существует потому, что во многих статьях указывается первое число при преобразовании, которое кодируется как числовые цифры, но должно отображаться как слова в тексте статьи. Помните: новые шаблоны могут сбивать с толку при редактировании, поэтому старайтесь использовать старые стандартные шаблоны. - Wikid77 ( обсуждение ) 08:01, 24 февраля 2013 г. (UTC)
Викид, можете ли вы мне сказать, как вы профилируете скорость шаблона или скрипта? Недавно я заменил Spellnum сценарием Lua (в основном для удобства сопровождения и дополнительных функций), и я хотел бы посмотреть, какой удар по производительности он получил в процессе. Спасибо. :-) Dcoetzee 03:49, 25 февраля 2013 (UTC)

Задача

Преобразование британской меры (длины) в текст.

Контекст

В ряде старых технических документов (до 1970 г.) будут использоваться единицы измерения США или имперские единицы, а не метрические единицы. Этот сценарий позволит расширить эти единицы до соответствующего текстового формата.

Тестовые кейсы

Sfan00 IMG ( обсуждение ) 23:52, 23 февраля 2013 (UTC)

Обсуждение

Нужен параметр контекста? В некоторых случаях вполне допустимы значения от 24 до 24 дюймов. Sfan00 IMG ( talk ) 00:07, 24 февраля 2013 г. (UTC)

Я не совсем понимаю, где бы вы это использовали. Если вы меняете эти единицы в том месте, где они появляются в статье, не проще (и безопаснее) перепечатать их самостоятельно, а не как параметр шаблона? Если вы хотите публиковать в Wikisource исходные документы целиком, вероятно, лучше не обижаться на такие стилистические мелочи, как это. Может быть, что касается постобработки - у вас есть модуль, который принимает в качестве входных данных включенную статью, которую вы хотите обновить, и он выявляет все потенциальные преобразования и распечатывает их красным цветом в новом текстовом выводе nowiki, чтобы вы могли проверить их и скопировать и вставить? Но, вероятно, я упустил суть на милю. Wnt ( разговор ) 07:07, 24 февраля 2013 (UTC)
  • Подумайте об использовании настройки {Convert}: годы использования пользовательских преобразований измерения показали, что они, как правило, приводят к добавлению нескольких связанных преобразований, и вскоре они становятся отдельным конкурентом Template: Convert , который имеет десятки функций, позволяющих избежать необходимости в таком большом количестве пользовательские шаблоны преобразования. Для редких случаев старых цитируемых форм (например: 2'3 ") wp: MOS рекомендует использовать обозначения мирового стандарта (например: 2 фута 3 дюйма); однако в цитируемом тексте {Convert} может отображать эквивалентная метрика:
  • Викитекст: Ваш рост был 5 футов 3 дюйма [{{convert | 5 | ft | 3 | in | m | 2 | disp = out}}].
  • Результаты:   рост был 5 футов 3 дюйма [1,60 м].
  • Викитекст: Ковбой сказал: «Я доставил девять 50 # [{convert | 50 | lb | 0 | disp = out}}] мешков корма для лошадей».
  • Результаты   . Ковбой сказал: «Я доставил девять мешков по 50 # [23 кг] корма для лошадей».
В общем, для цитирования старых буквальных измерений используйте стандартный шаблон: Convert, но с опцией "disp = out", чтобы разрешить прямые кавычки любых архаичных или редких символов, но отображать современные суммы преобразования в редакционных скобках [...] . Существует множество символов старого стиля, превышающих 2 фута 3 дюйма (например, «фунты» вместо «фунта»), и именно поэтому мы избегаем создания дополнительных шаблонов для каждого старого символа, а, скорее, цитируем старый символ и показываем только « disp = out "results. Однако, если имеется много случаев 2'3", то мы могли бы рассмотреть подшаблон {Convert}, чтобы использовать "тик", чтобы показать 2'3 ". С помощью этого метода мы можем избежать распространения редких - используйте шаблоны, которые, как правило, разрастаются, чтобы дублировать типичные функции {Convert}. - Wikid77 ( обсуждение ) 08:01, 24 февраля 2013 г. (UTC)
  • Похоже, что {{ Convert }} следует расширить для поддержки тех же единиц in as out и других форм вывода, чтобы их |abbr=*можно было использовать для таких преобразований.
    В приведенной выше таблице потребуется как минимум |abbr=параметр для управления используемым выходным форматом. Также, если используется заглавная буква «2 Ft. 3 in.» было преднамеренно, для |cap=значений потребуется параметр (использование заглавных букв) first, none, all.
    Кажется, что интерпретация «23 м 40» как 23 мили и 40 цепей должна быть очень контекстно-зависимой - я думаю, что большинство людей даже не знают, что такое цепь, не говоря уже о том, чтобы интерпретировать или записать это как 23,5 мили. - [ Алан М 1 ( разговор ) ] - 19:13, 26 февраля 2013 г. (UTC)
23:40 - это условность, которую я видел в некоторых заметках о железнодорожных линиях. Я также видел 23m40c и различные другие комбинации

интервалы и пунктуация .. Sfan00 IMG ( обсуждение ) 21:15, 27 февраля 2013 (UTC)

Задача

Создайте короткий заголовок (и ссылку) для короткого заголовка в стиле Содружества.

Контекст

Создание коротких заголовков в стиле Содружества в соответствующих статьях и указателях. Краткие заголовки широко используются в Великобритании (и других юрисдикциях Содружества) для обозначения конкретных положений законодательства.

Прецедент

Sfan00 IMG ( обсуждение ) 23:52, 23 февраля 2013 (UTC)

Обсуждение

В Wikisource есть короткий шаблон заголовка, но он достаточно сложен, и я не осмеливаюсь его менять. Переход на версию lua через Wikisource и Wikipedia повысит удобство обслуживания. Sfan00 IMG ( обсуждение ) 01:35, 28 февраля 2013 (UTC)

Задача

Создавайте таблицы с использованием разнообразного макета в исходном коде.

Контекст

В некоторых статьях может быть проще указать исходные данные таблицы в формате, отличном от того, который используется в текущем синтаксисе мультимедийных вики-таблиц, например, в виде столбцов цифр, а не строк. Такой подход с использованием сценариев также упростил бы обработку данных, извлеченных из определенных источников, когда они представляют собой столбцы.

Параметры
  • макет: строки / столбцы
  • набор данных:
  • блоксеп:
Прецедент

{{#invoke: Tables | maketable | rows |; |: | 1; 2; 3; 4: 5; 6; 7; 8: 9; 10; 11; 12;}}

Создает:

{{#invoke: Tables | maketable | cols |; |: | 1; 2; 3; 4: 5; 6; 7; 8: 9; 10; 11; 12;}}

Sfan00 IMG ( обсуждение ) 01:01, 24 февраля 2013 (UTC)

Комментарий

Я бы очень опасался начинать второй формат таблицы для использования в любой статье - отслеживание того, что у нас есть, уже требует больших усилий от редакторов-добровольцев. Кроме того, вам нужно будет решить, что делать с разделителями - в вашем примере вы не можете отобразить какую-либо запись таблицы с помощью: или; в нем, если вы не определите некоторые escape-последовательности ... Однако ваш комментарий об упрощении преобразования исходных данных может быть чем-то другим. Один из инструментов, о котором я могу думать, это было бы довольно простое упражнение (и боль в задней части): шаблон принимает включенную статью Википедии в качестве входных данных и выводит ту же страницу (в исходном формате Nowiki), но со всеми строки и столбцы каждой таблицы поменялись местами. Это инструмент для редакторов, а не для статей. Wnt ( разговор ) 07:15, 24 февраля 2013 (UTC)

  • Шаблон: Autocol уже генерирует таблицы столбцов: Быстрый шаблон: Autocol уже позволяет указать список записей, которые могут отображаться в таблице с несколькими столбцами (для любого браузера), с очень высокой скоростью (доли секунды). Например:
  • {{autocol | n = 6 | ncols = 3 | * aa | * bb | * cc | * dd | * ee | * ff}}
{{autocol | n = 6 | ncols = 3 | * aa | * bb | * cc | * dd | * ee | * ff}}
  • {{autocol | style = border: 1px solid # 777
                  | n = 12 | ncols = 4 | wrap = y | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12}}
{{autocol | style = border: 1px solid # 777

| n = 12 | ncols = 4 | wrap = y | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12}}

Благодарим вас за предложение однострочного формата ввода, который помогает подтвердить необходимость в предыдущем шаблоне { autocol }. Опять же, из-за высокой скорости {autocol}, нет необходимости иметь модуль Lua, обеспечивающий функцию избыточного форматирования столбцов, а шаблоны на основе разметки подходят для форматирования многоколоночных таблиц. В общем, Lua требуется только для сложных, вложенных вычислений или интенсивных операций строк поиска, или глубоко вложенных дерев решений поражающих МедиаВиков РГ: расширение предельной глубины . Короткие шаблоны работают со скоростью сотни в секунду, некоторые шаблоны для вставки символов работают со скоростью 2400 в секунду. - Wikid77 ( обсуждение ) 08:01, 24 февраля 2013 г. (UTC)
Wikid77 , пожалуйста, не воспринимайте следующее как личную атаку, но я категорически не согласен с тем, что вы написали выше: «Опять же, из-за высокой скорости {autocol}, нет необходимости, чтобы модуль Lua предоставлял избыточный столбец. -Функция форматирования ».
Скорость, конечно, важна и даже может быть решающим фактором во многих случаях, но определенно не единственным . вы единственный автор {{ Autocol }}, поэтому, пожалуйста, не воспринимайте это как нападение на себя или шаблон, а скорее как критику ограничений вики-кода: {{ Autocol }} - это мерзость против Бога и человек . любой, кто откроет этот шаблон в режиме «редактирования», сразу поймет, почему такого не должно существовать, когда можно найти разумное решение той же проблемы на основе Lua. Ваш успех в решении проблемы перед лицом ограничений викикода достоин восхищения, но как только инструмент, который может делать это разумным образом, существует, этой мерзости не должно оставаться или, по крайней мере, не следует использовать. он имеет некоторые ограничения (например, жестко запрограммированное максимальное количество ячеек), но его основная проблема заключается в том, что он не обслуживается. пока никто, кроме вас, не трогал его, и как только Lua станет доступным, я не думаю, что кто-то еще когда-нибудь это сделает. мир - קיפודנחש (он же кипод) ( разговор ) 16:59, 26 февраля 2013 (UTC)
Вообще говоря, я полностью согласен с тем, что переключение сложных шаблонов на Lua для удобства сопровождения важно, даже если в результате они работают медленнее. Dcoetzee 22:55, 27 февраля 2013 г. (UTC)
Проблема с разделителем заключалась в том, почему я выбрал его, т.е. в качестве разделителей можно использовать что угодно, кроме | # * (которые имеют особое значение в разметке). Другой довод в пользу этого заключается в том, что наборы данных CSV можно использовать без необходимости их настройки, как в настоящее время, поскольку разделителями являются, и; соответственно IIRC. Sfan00 IMG ( обсуждение ) 09:42, 24 февраля 2013 (UTC)

Задача

Для данной строки возвращает измененную строку, в которой все вхождения указанной подстроки заменены другой подстрокой.

Контекст

Базовая строковая функция для замены ограниченной строковой функции {{ Str repc }}, которая заменяет только первое появление подстроки в строке. Было бы полезно, например, в шаблоне {{ Infobox ferme }}, который устранит необходимость в отдельном параметре IUBMB_EC_number (строка IUBMB_EC_number может быть сгенерирована из EC_number путем замены точек косой чертой).

Параметры
  • нить
  • search_string
  • replace_st`ring
Прецедент

{{#invoke: String replace | 1.1.1.1 |. | /}}

Создает: 1/1/1/1

Комментарий

Я не уверен, что это подходящее место для выполнения такого очень простого запроса, который уже мог бы быть возможен без какого-либо специального кода. Если да, то будут приветствоваться указатели на соответствующую документацию. Спасибо. Богхог ( разговор ) 09:28, 24 февраля 2013 (UTC)

Я создал Module: StringReplace : {{#invoke: StringReplace | replace_all | 1.1.1.1 |. | /}}: 1/1/1/1. Как вы думаете? Inkbug ( разговор ) 13:36, 24 февраля 2013 (UTC)
Спасибо за ваш быстрый ответ! Я протестировал новый модуль в {{ Infobox энзим / песочнице }}, и он отлично работает (см. Шаблон: Infobox_enzyme / testcases ). Я протестирую этот модуль в нескольких других информационных боксах, прежде чем перейти в производство. Если предположить, что все тесты выглядят хорошо, есть ли причина не использовать этот модуль в производственных версиях шаблонов? Шаблон фермента infobox включен примерно в 5000 статей, и я просто хотел убедиться, что он готов к работе. Богхог ( разговор ) 14:44, 24 февраля 2013 (UTC)
Пожалуйста. Что касается причин для использования / неиспользования этого в производстве, я абсолютно не знаю (сомневаюсь, что знаю об этом больше, чем вы - это был мой первый код Lua, который я когда-либо писал). Inkbug ( обсуждение ) 14:48, 24 февраля 2013 (UTC)
Впечатляющая первая попытка! Как вы, вероятно, уже имели в виду, модуль StringReplace также должен иметь параметры replace_first и replace_last, чтобы модуль был более гибким, но параметр replace_all - это все, что мне сейчас нужно. Существует большое количество связанных шаблонов, которые в какой-то момент стоит систематически преобразовывать. Один вопрос: лучше иметь большое количество модулей специального назначения или меньшее количество модулей общего назначения? Богхог ( разговор ) 15:24, 24 февраля 2013 (UTC)
Я также добавил replace_plain в Module: String . Моя часть шаблона не так хороша, как в Module: StringReplace, и еще не работает с "." но у него есть возможность заменить только первое вхождение, что позволило бы заменить шаблон {{ str rep }}. Возможно, их можно объединить в одну версию. - WOSlinker ( обсуждение ) 15:43, 24 февраля 2013 г. (UTC)
У меня нет проблем с перемещением Module: StringReplace в Module: String - если мы хотим, чтобы все строковые функции были в одном месте, меня это устраивает. Если вы хотите скопировать мой escape_patternкод, у меня нет проблем - все, что я сделал, это скопировал список специальных символов из ссылки Lua и добавил %перед каждым из них. Inkbug ( разговор ) 18:48, 24 февраля 2013 (UTC)
Я не уверен, есть ли веские причины для того, чтобы все было в одном месте или для отдельных модулей. Просто до сих пор все строковые функции попали в Module: String, а все числовые функции оказались в Module: Math . Я обновлю код в Module: String, чтобы использовать вашу функцию escape_pattern. - WOSlinker ( обсуждение ) 19:34, 24 февраля 2013 г. (UTC)
Я включил в Module: String более общую функцию замены, которая позволяет пользователю указывать, использовать ли регулярные выражения или нет (по умолчанию нет), и позволяет указать количество замен, которые нужно сделать (по умолчанию все). Полет драконов ( разговор ) 19:36, 24 февраля 2013 (UTC)
Кроме того, в escape-коде в Module: StringReplace отсутствовала закрывающая скобка "]", и я использовал UTF8-безопасный класс ustring, а не строку, чтобы сделать escape. Я не уверен, есть ли какие-либо случаи UTF-8, когда это имеет значение или нет. Полет драконов ( разговор ) 19:39, 24 февраля 2013 (UTC)
Для любопытных: я намерен поработать над раскрытием всех основных строковых операций и обновить все нетривиально используемые функции в Template: Шаблоны String см. Также текст . Пока что мы сделали {{ str len }}, {{ str find }}, {{ str sub }}, {{ str index }} и несколько их вариантов. Полет драконов ( разговор ) 19:44, 24 февраля 2013 (UTC)
Звучит неплохо. Inkbug ( разговор ) 19:53, 24 февраля 2013 (UTC)
И мне тоже. Спасибо всем. Богхог ( разговор ) 20:07, 24 февраля 2013 (UTC)
Перед тем, как увидеть это обсуждение, я просто сделал новую {{ Заменить }} на то же самое. Старый шаблон {{ str rep }} используется для count = 1 (одна замена), и, поскольку это старое использование, мы не можем изменить его на поведение по умолчанию «заменить все вхождения». - Депип ( разговор ) 09:44, 27 февраля 2013 (UTC)

Задача и контекст

Я хочу предложить и запросить новую функцию Module:RGB color convert. Он должен преобразовывать жизнеспособные определения цветов RGB (по имени, RGBhex, триплету RGB и т. Д.) В любые другие подобные обозначения.

Поведение по шаблону будет следующим:

  • {{Color convert | gold}} → # ffd700 (по умолчанию)
  • {{Color convert | 255 | 215 | 0}} → # ffd700 (по умолчанию)
  • {{Преобразование цвета | 100% | 84% | 0%}} → # ffd700 (по умолчанию)
  • {{Color convert | # ffd700 | to = name}} → золото
  • {{Преобразование цвета | золото | в = RGBdec}} → RGB (255, 215, 0)
  • {{Преобразование цвета | 51 ° | 100% | 100% | from = HSV}} → # ffd700
  • {{Преобразование цвета | 51 ° | 100% | 50% | from = HSL}} → # ffd700
Применение

Его основным использованием будет WP (шаблон) внутри и в статьях, описывающих тему самого RGB. На данный момент такие преобразования (преобразования) недоступны, в основном из-за неэффективности шаблонов pre-Lua. Они вводятся вручную на страницах WP.

Сфера

Ниже представлена ​​таблица с предлагаемым объемом. Основные определения доступны в связанной документации W3C. Само по себе значение RGB является основной и первой целью; позже в модуль могут быть добавлены другие преобразования (HSV, HSL, прозрачность).


  • Пользователь: DePiep / cc ( редактировать  · говорить  · история  · ссылки  · / подстраницы  · / doc  · / редактировать документ  · / sbox  · / sbox diff  · / test )
  • Пользователь: DePiep / cc / data / colornames ( редактировать  · обсуждение  · история  · ссылки  · / подстраницы  · / doc  · / редактировать документ  · / sbox  · / sbox diff  · / test )
  • Пользователь: DePiep / sandbox ( редактировать  · обсуждение  · история  · ссылки  · / подстраницы  · / doc  · / редактирование документа  · / sbox  · / sbox diff  · / test )
  • РГ: LUA
  • Аргументы ( редактировать  · обсуждение  · история  · ссылки  · / подстраницы  · / doc  · / редактировать документ  · / sbox  · / sbox diff  · / test · шаблон: аргументы ) 
  • Пользователь: DePiep / sandbox13 = названия цветов
  • Пользователь: DePiep ( редактировать  · говорить  · история  · ссылки  · / подстраницы  · / doc  · / doc edit  · / sbox  · / sbox diff  · / test )

Внутренности

Всегда работайте с обозначением значения # RGBhex6 и обратно (треугольное преобразование: всегда отскакивайте от одного и того же пола ).

См. Примечание ниже о тройнях
Разработка

Основные функции RGB - это первый уровень требований. HSV, HSL, прозрачность и другие могут быть добавлены позже (не следует делать невозможным). Кроме того, в качестве опции могут быть добавлены версии, такие как варианты X11.

Вход

По умолчанию базовый ввод RGB (единственный аргумент) должен распознаваться и обрабатываться. То есть: RGBhex6, RGBhex3, с / без # (?), X11 (W3C?) Имен, sRGB-имен. Возможно, нам потребуется определиться с вариантами версии (названия X11, W3C); другие версии могут быть введены с уведомлением о пробеле.

Вход с тремя аргументами (триплет функции RGB) также может быть задан по умолчанию (в процентах, в десятичном формате). Другой ввод требует пространственной идентификации: HSL, HSV, другие версии и определения названий цветов.

Ввод всегда не зависит от регистра. Все убранные пробелы (в том числе и промежуточные) должны обрабатываться правильно, чтобы уловить общепринятое, приемлемое написание "#AC DF 09".

Выход

Вывод по умолчанию (предложение): # RGBhex6 для автоматизации и охвата большинства опций. Другие обозначения по аргументам. tbd: вывод с несколькими аргументами, например «RGB (r, b, g)» в виде строки? Требуемый вывод должен быть определен более точно, чем пространство ввода.

Нецветные и ошибочные ситуации

Цвет не распознан или неправильный: вывод "" (пусто), если W3C не указал иное. Вариант для ситуации с ошибкой / отсутствием цвета: может быть установлено выходное значение (например, "default = my error text "). Префиксы, постфиксы, разделитель триплетов необязательны, возможно, другое форматирование вывода.

Список параметров

Чтобы получить представление: - 4 безымянных параметра предназначены для значений. Требуется только первый . 1, 2, 3 при использовании составляют триплет, 4-й - для прозрачности (будущая функция). - Все остальные параметры указаны и не являются обязательными. Они предназначены для настроек, а не значений.

{{Color convert| [1-й безымянный параметр, одно значение (также: триплет-1)]| [2-й безымянный параметр, триплет-2]| [3-й безымянный параметр, триплет-3]| [4-й безымянный параметр, прозрачность]| from = [по умолчанию: RGB; другой: HSV, HSL, ...]| to = [по умолчанию: # RGBhex6; в противном случае более конкретный, чем from id]| непрозрачность = [= 1 минус прозрачность]| format = [вывод; например, uc или lc]| разделитель = [в тройках; по умолчанию - <запятая> <пробел>]| префикс =| постфикс =| по умолчанию = [возвращается, если не цвет или ошибка]}}

В основном, если используются параметры 2 и 3, это триплет (в% или десятичном виде). Если они пусты, вводится одно значение цвета. Можно проверить одно значение для названия цвета, для RGBhex3, и это RGBhex6.

Смотрите также
  • Категория: Шаблоны преобразования цвета
  • Категория: Шаблоны числовых преобразований
  • Шаблон: цветовое пространство (обзор цветового пространства)
  • HTML_color_names
  • Названия цветов X11
Вне рамок
  • Международная комиссия по освещению CIE
  • ПМС , RAL . Не полностью цифровой. Собственный. Будущая особенность?
Следующий

Думаю, это предложение требует доработки. Мои первоначальные обозначения и имена носят описательный характер и могут быть слишком далекими для хорошего понимания или даже правильного определения. Пожалуйста, не стесняйтесь улучшать, особенно таблицу. - Депип ( разговор ) 15:54, 25 февраля 2013 г. (UTC)

Тестовые кейсы

параметры

CoCo Комментарий

Конечно, можно иметь один шаблон (скажем, «Convert»), который будет выполнять все виды преобразований и будет смотреть на его параметры, чтобы угадать, какое преобразование требуется при каждом конкретном вызове. Но какова в этом ценность? ИМО, было бы лучше и для кода, и для редакторов прямо сказать, что мы хотим делать. Таким образом, говоря языком шаблонов, это означает наличие одного отдельного шаблона для каждого типа преобразования, например, «Преобразовать имя цвета в RGB», «Преобразовать имя цвета в шестнадцатеричное», «Преобразовать RGB в имя цвета», «Преобразовать шестнадцатеричное имя в имя цвета» и т. Со стороны Lua у вас будет Module: Color с такими методами, как rgb_to_name (), hex_to_name (), rgb_to_hex (), name_to_rgb () и т. Д.

IMO, это лучше, чем наличие одного шаблона и метода Lua под названием «Convert», который должен будет вывести из своих параметров, что пользователь фактически передал ему, и из некоторого специального параметра с именем «to», каков ожидаемый результат. .

Предлагаемый мной способ упрощает жизнь, а сообщения об ошибках - более понятными: при вызове «hex_to_name» вы знаете, что ожидаемый параметр выглядит так: #xxxxxx, где «x» - это цифра или буква в [a-fA-f] диапазон, и вы можете это проверить. если вы определите умное "преобразование", которое будет смотреть на свой ввод и решать, в каком режиме он был (это входной RGB? это шестнадцатеричный? это имя цвета?) - когда ни один из "законных" входов не был найден, он будет Было бы труднее дать связное сообщение об ошибке.

мир - קיפודנחש (он же кипод) ( разговор ) 18:14, 25 февраля 2013 (UTC)

Не гадать нужно. Он вычитается (из фактического ввода). И да, мы хотим сказать, какое преобразование мы хотим. Но А. мы можем сделать это с помощью параметров, а не с помощью разных шаблонов. И б. мы можем установить предпочтение по умолчанию в отношении того, что мы хотим, что так же хорошо, как и явное указание. - Депип ( разговор ) 11:39, 26 февраля 2013 г. (UTC)
Я подумал об этом, и в том, чтобы иметь один шаблон, есть некоторая логика, но не в том виде, который предлагает DePiep. Я думал что-то вроде "{{Преобразование цвета | исходная форма | целевая форма | ... (входные данные здесь) ...}}". Например, {{Convert color | RGB | HSL | 100 | 30 | 23}}. Причина этого в том, что в принципе можно захотеть преобразовать непосредственно из любой формы цвета непосредственно в любую другую форму, и наличие отдельного шаблона для каждой потребовало бы шаблона для каждой возможной пары форм. Шаблон, который я предлагаю, был бы столь же простым для реализации без необходимости угадывать форму ввода (поскольку исходная форма / целевая форма поступает из фиксированного списка), а с использованием внутреннего промежуточного представления его можно было бы реализовать с линейным размером кода по количеству форм, а не по квадратичной. Dcoetzee 20:05, 25 февраля 2013 г. (UTC)
Несколько комментариев:
  • Во-первых, я думаю, что предложение Дкотзи подходит для тех случаев, когда известна исходная форма. Тем не менее, мы должны поддерживать предоставление пустой исходной формы ({{Convert color || target form | ...}} или {{Convert color |? | Target form | ...}}), которая определит это сама.
  • Во-вторых, что касается структуры модуля, я думаю, что у нас должны быть функции следующих типов:
    • Функции, преобразующие разные обозначения RGB в одну стандартную (кортеж с тремя десятичными числами от 0 до 255?).
    • Функции, которые преобразуют этот стандарт в другие стандартные формы (имена, HSL, RGBA и т. Д.).
    • Функции, которые преобразуют стандартную форму RGB в другие обозначения RGB (например, (16,16,16) -> # 111111).
  • В-третьих, это отличный модуль для разработки через тестирование .
Inkbug ( разговор ) 06:59, 26 февраля 2013 (UTC)
Зачем нужно определять как входящую, так и исходящую форму? Большинство форматов RGB уже можно различить (и по умолчанию я говорю), и если кто-то решает ввести другую форму (скажем, три значения HSV), только тогда форма ввода должна быть явной. Мы можем использовать первые четыре (безымянных) параметра для чисел. Другие параметры, которые в основном являются переключателями, должны быть названы (поэтому нам не нужно подсчитывать каналы входных параметров, часто пустые). Форма вывода по умолчанию может быть #rrggbb, в противном случае она может быть установлена ​​с помощью именованного параметра. Примеры находятся в верхней части предложения, включая действия по умолчанию. Это уменьшает требуемый ввод без потери правильности. - Депип ( разговор ) 11:20, 26 февраля 2013 г. (UTC)
Я расширил список параметров, чтобы отразить мою идею. Общая форма: {{Преобразовать цвет ||||| named_param1 = ... | named_param2 = ...}}. - Депип ( разговор ) 11:34, 26 февраля 2013 г. (UTC)
re Inkbug: нет никаких догадок . Он вычитается . И действительно, внутренняя форма, которую я уже предложил (а именно "#rrggbb"). Кажется, основное отличие, на которое вы указываете, - это избавиться от настройки по умолчанию и требовать ее каждый раз. Я не вижу в этом необходимости. - Депип ( разговор ) 11:45, 26 февраля 2013 г. (UTC)

Если подумать, о моей строке всегда-calc-to RGB (а затем в другой fromat оттуда ). Хотя треугольное вычисление должно быть сохранено, я понимаю, что в Lua он может использовать набор аргументов, поэтому мы могли бы вычислить триплет (rr, gg, bb) как отдельные значения (шестнадцатеричный из dec?). Внутреннее форматирование в строку (6 шестнадцатеричных) не требуется. - Депип ( разговор ) 20:47, 1 марта 2013 г. (UTC)

Я создал доказательство реализации концепции, чтобы проверить некоторые идеи реализации, которые у меня были. Это все еще незавершенная работа, но основная структура предназначена для добавления дополнительных форматов и преобразований между ними. Тем не менее, было бы полезно узнать предлагаемые варианты использования этого шаблона, особенно при рассмотрении того, каким должен быть вывод по умолчанию. Изначально мой код не заключал вывод в круглые скобки, но первые знаки # для шестнадцатеричных чисел интерпретировались как разметка вики для нумерованного списка. Было бы полезно знать, как будет использоваться шаблон, чтобы понять, желателен ли лучший обходной путь. Вы можете увидеть примеры тестовых случаев на Module talk: Sandbox / isaacl / ColourSpace / tests isaacl ( talk ) 04:13, 2 марта 2013 г. (UTC)

О том, как это используется: преобразование любого формата цветового пространства в любой формат цветового пространства. Ни больше ни меньше. В таблице перечислены параметры (таблица в процессе).
Вторичный: в модуле перехватить параметры ввода WP (например, пустые или отсутствующие параметры ввода или значение «40%»). Запрограммировать эту логику в коде шаблона - это ужасно. Также есть еще одна разумная логика: если заполнен только param1, рассматривать как одно значение. Если используется параметр param2 или param3, считается вводом триплета.
О выходе по умолчанию. 1. Решите: строчные буквы по умолчанию. Нам нужно это обсудить?
О выходе по умолчанию. 2. Формат "# 3af7e" был бы предпочтительнее, потому что его можно использовать в коде напрямую (подумайте: