Страница нового запроса
Я создал новую страницу запросов для сценариев Lua в Википедии: Запросы Lua . Если вы разработчик Lua, просмотрите его. Если вы хотите сделать запрос, сделайте это тоже! Dcoetzee 23:09, 23 февраля 2013 (UTC)
Расположение экспериментального / практического кода
В настоящее время в техническом насосе обсуждается, где разместить код, с которым вы экспериментируете; в результате был создан Module: Sandbox . - Hex ( ❝ ?! ❞) 16:39, 24 февраля 2013 г. (UTC)
Лучше факториальный код?
следующий код, возможно, лучше, чем текущий ;-) [Примечание: он также выделяет больше возможностей Lua - утверждение, проверку типов, локальную область видимости, рекурсию хвостового вызова и т. д.]
функция факториал ( k ) assert ( type ( k ) == "число" и k > = 0 , "факториал: аргумент должен быть числом> = 0" ) локальная функция facto_helper ( n , p ) если n == 0 или n == 1, тогда вернуть p иначе return facto_helper ( n - 1 , p * n ) end end вернуть facto_helper ( k , 1 )конец
- Хвостовые вызовы - это круто, но ... если дело в том, что вы просто возвращаете функцию, поэтому нет необходимости отслеживать исходный кадр после перехода к хвостовому вызову, тогда кажется, что это просто цикл : т.е. вы проверяете свои переменные, выполняете умножение и снова переходите к началу функции, точно так же, как вы выполняли переход. Я не уверен, что ценю его уникальную силу. Wnt ( разговорное ) 21:50, 24 марта 2013 (UTC)
Lua - функции парсера - отношения шаблонов
Таким образом, шаблоны могут вызывать модули Lua, функции парсера и страницы в пространстве имен MediaWiki. Можно ли вызывать шаблоны, страницы MediaWiki или функции парсера из Lua? Можно ли вызвать функцию lua, которая возвращает несколько строк и передать их в шаблон? - Ярект ( разговор ) 16:24, 14 марта 2013 г. (UTC)
- Вы можете вызвать шаблон из модуля Lua, используя frame: expandTemplate . Содержимое страницы можно получить с помощью метода getContent () титровального объекта . Поддержка вызова функции синтаксического анализатора появится в ближайшее время с помощью frame: callParserFunction , или вы могли бы сделать это сегодня, передав разметку в frame: preprocess . Toohool ( разговор ) 19:25, 14 марта 2013 (UTC)
Лицензирование
Разрешено ли авторам модулей использовать другие лицензии (предположительно в дополнение к лицензии CC-BY-SA) для модулей, которые они разрабатывают? - счастливое 5214 14:32, 15 марта 2013 г. (UTC)
- Это очень хороший вопрос. Лицензии Creative Commons явно не рекомендуются для программного обеспечения . - Hex ( ❝ ?! ❞) 15:57, 15 марта 2013 г. (UTC)
Вам принадлежат авторские права, вы можете предоставлять любые лицензии, которые хотите (в дополнение, как вы говорите, к лицензии CC-BY-SA, которую вы уже предоставили). Однако это будет относиться только к вашим материалам, а не к последующим изменениям, внесенным другими редакторами. Обычно это делается с помощью шаблона авторского права, размещенного на вашей странице пользователя ... хотя вы можете изменить один из них, чтобы указать, что он применяется только к модулям Lua. Toohool ( разговор ) 18:13, 15 марта 2013 (UTC)
- В WMF говорят о предложении центрального репозитория Lua и, возможно, об использовании там более разрешительных лицензий. Конечно, это хорошо в будущем. Полет драконов ( разговор ) 03:46, 16 марта 2013 (UTC)
Указатель модуля и комментарии
Я просто быстро отсортировал существующие модули Lua в Википедии: Lua / Modules / Overview . Просматривая их повсюду, я хотел бы пока сделать несколько замечаний по поводу наименования ...
- У нас есть равное разделение на людей, которые проводят персональное тестирование в Sandbox / ... и людей, которые делают это в User: ... На этом этапе любой из нас может поднять ставки и довольно легко перейти к другому. Мы действительно должны решить, подбросить монетку, что-нибудь, чтобы довести такие вещи до предсказуемой точки.
- У нас есть много случаев, когда связанные модули имеют одно и то же имя с «/» для обозначения подстраниц, а в некоторых других случаях, очевидно, связанные модули просто расширяют имя. С ними не совсем понятно, должны ли они идти вместе или нет. Обычно это не было бы проблемой, за исключением того, что мне было интересно ... если вы пишете модуль Lua, для которого требуется другой модуль Lua или файл данных mw.title.new () sa, будет ли целевой модуль или файл защищен, когда основной модуль каскадная защита? Я не знаю, но с учетом того, что некоторые из этих вещей включены на каждую страницу вики и обладают развитыми полномочиями писать все, что они могут проскользнуть через интерфейс, мы должны опасаться дыр в безопасности, и первым шагом будет знать Я думаю, быстро и определенно, которые являются единым целым.
- Подход Module: Sandbox - когда каждый пользователь помещает скрипты в общую емкость - кажется неработоспособным. Вы не могли отслеживать свои старые эксперименты, и мой опыт показывает, что да, я действительно забыл, как я делал что-то, и должен оглядываться на них. Я думаю, мы могли бы отказаться от этого предложения.
- Почти все из нас должны лучше размещать комментарии в модуле и / или документации, говорящие, для чего, черт возьми, предназначены наши модули. Wnt ( разговорное ) 23:28, 17 марта 2013 (UTC)
- Если нам нужно решить, я лично предпочитаю "Пользователь: ...", поскольку это также дает место для вещей, которые не являются песочницей. Например, если кому-то нужен какой-то собственный метод Lua для своей пользовательской страницы или есть некоторые фрагменты кода, которые они хотели бы использовать для отладки или копирования и вставки. Но почему бы не разрешить и то, и другое? Anomie ⚔ 11:36, 18 марта 2013 г. (UTC)
- Каскадная защита должна работать нормально, поскольку использование модулей записывается в таблице шаблонных ссылок. И я вижу, что модуль: Math в настоящее время используется на главной странице и правильно показывает уведомление о каскадной защите, когда я пытаюсь его отредактировать. Бьорш (WMF) ( разговор ) 11:41, 18 марта 2013 (UTC)
- Я это заметил - мой вопрос в том, решил ли человек, написавший Module: Math, включить некоторый код file = mw.title.new («Обсуждение модуля: Math / TableOfUnicodeMathCharacters») и использовать его для синтаксического анализа определенных символов (чтобы сделать так, чтобы он мог точно настроить шрифт, размер пи и т. д. независимо от модуля), может ли случайный вандал отредактировать этот файл и вставить изображение большого красивого дна? Если это так, то очевидно, что вам нужен более тонкий контроль, возможно, люди будут выполнять номинальный вызов всех подшаблонов с главной страницы шаблона или что-то в этом роде. Wnt ( разговорное ) 14:06, 18 марта 2013 (UTC)
title:getContent()
записи в качестве включения, поэтому каскадная защита будет распространяться на страницы, извлеченные таким образом. Бьорш (WMF) ( разговорное ) 00:31, 19 марта 2013 (UTC)
- Я это заметил - мой вопрос в том, решил ли человек, написавший Module: Math, включить некоторый код file = mw.title.new («Обсуждение модуля: Math / TableOfUnicodeMathCharacters») и использовать его для синтаксического анализа определенных символов (чтобы сделать так, чтобы он мог точно настроить шрифт, размер пи и т. д. независимо от модуля), может ли случайный вандал отредактировать этот файл и вставить изображение большого красивого дна? Если это так, то очевидно, что вам нужен более тонкий контроль, возможно, люди будут выполнять номинальный вызов всех подшаблонов с главной страницы шаблона или что-то в этом роде. Wnt ( разговорное ) 14:06, 18 марта 2013 (UTC)
- Документация должна быть размещена на странице документации модуля, поскольку любое изменение самого модуля, даже обновление комментариев, приводит к повторному анализу всего, что использует модуль (как и в случае с шаблонами). Вот почему мы в конечном итоге решили не пытаться анализировать комментарии luadoc для автоматического создания документации. Комментарии к самому коду, конечно, должны идти вместе с кодом. Бьорш (WMF) ( разговор ) 11:41, 18 марта 2013 (UTC)
- Хорошая точка зрения! Wnt ( разговорное ) 14:06, 18 марта 2013 (UTC)
Дружественный к новичкам учебник
Я попытался начать изучать Lua и сразу ударил по стене после части «привет, мир», и все, что я получил после, это «ошибка сценария». Интересно, есть ли какое-нибудь действительно полезное руководство для тех, кто уже знаком с Wikisyntax, но не имеет опыта работы с другими компьютерными языками, такими как Lua или C.Учебники, которые я находил, обычно начинаются с простого кода, который говорит вам копировать и вставлять (привет, мир), а затем посмотрите на результат. Сразу после этого он дает вам еще одну строку кода, которую я совершенно не знаю, куда ее вставить, чтобы она вообще работала. Учебник, который мне действительно нужен, - это то, как шаблон с функциями синтаксического анализатора переводится в модуль Lua с объяснением того, какой синтаксис соответствует какой переменной / функции или чему-то еще. Это может звучать как просьба присматривать за ребенком или кормить с ложечки, но я полностью застрял. - Sameboat - 同舟( разговор ) 07:07, 18 марта 2013 (UTC)
- На этой неделе в IRC будет два рабочих часа, в ходе которых обсуждение будет сосредоточено на Lua. Кроме того, вы можете задавать вопросы на вики MediaWiki . Если ничего не помогает, здесь есть множество людей, желающих помочь, в том числе и я. - счастливое 5214 08:12, 18 марта 2013 г. (UTC)
- Чтобы дать другой ответ на тот же вопрос: это руководство на веб-сайте Lua - отличный источник информации. Это также помогает взглянуть на существующие модули, чтобы получить представление о том, как они будут выглядеть. - счастливый
5214 08:12, 18 марта 2013 г. (UTC)
- Я не знаю, могу ли я задать какой-нибудь вопрос, потому что мне действительно сложно добраться до базового уровня. Я думаю, что Lua для Wiki не хватает полезной документации, такой как help: table, с которой я могу в значительной степени самообучаться, не задавая никаких вопросов. Для меня mw: Extension: Справочное руководство Scribunto / Lua - это просто длинный список спецификаций, без обучения новичков вроде меня чему-либо, с чего начать. mw: Lua scripting / Tutorial тоже очень не хватает. Я просто застрял на локальном arg2 = frame.args [2] или "", и я не знаю, куда его добавить, чтобы он работал. - Sameboat - 同舟( разговор ) 08:35, 18 марта 2013 (UTC)
- Эта строка будет помещена в p.hello (в учебнике) перед оператором return. Затем замените frame.args [2] в конце оператора return на arg2. Также см. Module: BananasArgs для получения дополнительной помощи с аргументами. - happy
5214 08:45, 18 марта 2013 г. (UTC)
- Нравится этот модуль: песочница / самбоат ? - Sameboat - 同舟( разговор ) 09:03, 18 марта 2013 (UTC)
- Плохо, я имел в виду оператор return в функции p.hello. - happy
5214 09:08, 18 марта 2013 г. (UTC)
- Вот так! То же самое можно сделать и с первым аргументом. - happy
5214 09:12, 18 марта 2013 г. (UTC)
- Я должен сказать, что в этом руководстве пропущена одна чертовски важная инструкция. (Если возможно, вы бы переписали эту часть учебника? Потому что я не могу сделать это естественным.) Но мне любопытно, можно ли опустить .hello, как в шаблоне? - Sameboat - 同舟( разговор ) 09:18, 18 марта 2013 (UTC)
- Какая инструкция? Где разместить объявление переменной? Отвечая на второй вопрос, нет, его нельзя пропустить. p.hello в основном означает, что функция хранится в записи «hello» таблицы «p», которая возвращается модулем в MediaWiki. - happy
5214, 09:22, 18 марта 2013 г. (UTC)
- mw: Lua_scripting / Tutorial , from " приводит к тому, что frame.args [2] является пустой строкой (что не будет, хотя результирующий текст будет выглядеть странно). Один из способов обойти это - присвоить желаемые параметры локальной переменной , и заменяя на этом шаге nils пустыми строками, например, ". Эта инструкция упрощает полную процедуру добавления этого кода ( local arg2 = ... ) и того, что следует заменить. - Sameboat - 同舟( разговор ) 09:30, 18 марта 2013 (UTC)
- Опять же, официальный учебник на веб-сайте Lua, вероятно, объяснит это намного лучше. - счастливое 5214 09:32, 18 марта 2013 г. (UTC)
- В частности, в этом разделе рассматриваются локальные переменные в Lua. - счастливое
5214 09:33, 18 марта 2013 г. (UTC)
- Назовите меня глупым, пожалуйста. Я мгновенно застреваю на странице 1 [1] . Как мне, честно говоря, вызвать такой простой код, как print («Hello World») в Википедии ( Module_talk: Sandbox / sameboat ). Я думаю, что моя проблема в том, что я изучаю Lua только для того, чтобы вносить вклад в Википедию, поэтому я хочу знать, что то, что я делаю в Wiki, получит то, что правильно в вики. Я не хочу возиться с отдельным программным обеспечением, таким как исполняемый файл lua, потому что я предполагаю, что его использование отличается от того, как вы вызываете код lus в Wiki. - Sameboat - 同舟( разговор ) 01:53, 19 марта 2013 (UTC)
- mw: Lua_scripting / Tutorial , from " приводит к тому, что frame.args [2] является пустой строкой (что не будет, хотя результирующий текст будет выглядеть странно). Один из способов обойти это - присвоить желаемые параметры локальной переменной , и заменяя на этом шаге nils пустыми строками, например, ". Эта инструкция упрощает полную процедуру добавления этого кода ( local arg2 = ... ) и того, что следует заменить. - Sameboat - 同舟( разговор ) 09:30, 18 марта 2013 (UTC)
- Какая инструкция? Где разместить объявление переменной? Отвечая на второй вопрос, нет, его нельзя пропустить. p.hello в основном означает, что функция хранится в записи «hello» таблицы «p», которая возвращается модулем в MediaWiki. - happy
5214, 09:22, 18 марта 2013 г. (UTC)
- Я должен сказать, что в этом руководстве пропущена одна чертовски важная инструкция. (Если возможно, вы бы переписали эту часть учебника? Потому что я не могу сделать это естественным.) Но мне любопытно, можно ли опустить .hello, как в шаблоне? - Sameboat - 同舟( разговор ) 09:18, 18 марта 2013 (UTC)
- Вот так! То же самое можно сделать и с первым аргументом. - happy
5214 09:12, 18 марта 2013 г. (UTC)
- Плохо, я имел в виду оператор return в функции p.hello. - happy
5214 09:08, 18 марта 2013 г. (UTC)
- Нравится этот модуль: песочница / самбоат ? - Sameboat - 同舟( разговор ) 09:03, 18 марта 2013 (UTC)
- Эта строка будет помещена в p.hello (в учебнике) перед оператором return. Затем замените frame.args [2] в конце оператора return на arg2. Также см. Module: BananasArgs для получения дополнительной помощи с аргументами. - happy
5214 08:45, 18 марта 2013 г. (UTC)
- Я не знаю, могу ли я задать какой-нибудь вопрос, потому что мне действительно сложно добраться до базового уровня. Я думаю, что Lua для Wiki не хватает полезной документации, такой как help: table, с которой я могу в значительной степени самообучаться, не задавая никаких вопросов. Для меня mw: Extension: Справочное руководство Scribunto / Lua - это просто длинный список спецификаций, без обучения новичков вроде меня чему-либо, с чего начать. mw: Lua scripting / Tutorial тоже очень не хватает. Я просто застрял на локальном arg2 = frame.args [2] или "", и я не знаю, куда его добавить, чтобы он работал. - Sameboat - 同舟( разговор ) 08:35, 18 марта 2013 (UTC)
- Первое и самое главное, что нужно сделать на видном месте на каждой странице, на которую может попасть новичок, - это то, что ошибка сценария - это ссылка, если вы включите Javascript. (Что я не хочу делать, потому что он позволяет использовать этот ужасный пользовательский редактор, но это уже другая история ...) Wnt ( разговор ) 14:14, 18 марта 2013 г. (UTC)
- Я знаю, что "ошибка сценария" что-то объясняет, когда вы нажимаете на нее, но для меня это сообщение отнюдь не полезно. - Sameboat - 同舟( разговор ) 14:35, 18 марта 2013 (UTC)
- Разные люди учатся по-разному, и я надеюсь, что мы все сможем работать вместе, чтобы привлечь людей, которые учатся с помощью видео, людей, которые учатся с помощью рабочих примеров и таблиц эквивалентности, людей, которые учатся, читая справочные материалы, и людей, которые учатся с помощью пошаговых инструкций. Пожалуйста, ознакомьтесь с PDF-файлом Брэда Йорша с одиннадцатью слайдами и, возможно, посмотрите сопроводительное видео. Похоже, что в разделе « Начало работы» («привет, мир») справочной документации по Lua не было того, что вам нужно - возможно, вы могли бы добавить заметки «чего не хватает в привет, мир» на страницу обсуждения, чтобы помочь нам исправить это упущение. ?
- Я слышу, что Sameboat хочет создать таблицу эквивалентности («раньше вы делали x, чтобы получить результат y, теперь сделайте z вместо этого»), и попытаюсь поддержать ее - кто-то уже создал ее? Сумана Харихаресвара, менеджер инженерного сообщества Фонда Викимедиа ( выступление ) 15:54, 18 марта 2013 г. (UTC)
- Я ценю сравнение до и после {{ convert }}, но этот шаблон очень недоступен для большинства википедистов. Так что да, я надеюсь на гораздо более простой пример ... - Sameboat - 同舟( разговор ) 01:45, 19 марта 2013 (UTC)
Спасибо Dragons flight за то, что кое-что очистили для меня. Но с запретом функции печати и дополнительными шагами для проверки кода lua в Wiki я не могу сказать, действительно ли учебник lua.org мне помог, поскольку я не знаю, как преобразовать все эти примеры в соответствии с Стандарт lua от MediaWiki. В конечном итоге MediaWiki должна выпустить еще один учебник для википедистов (без предварительного знания C и Lua) из-за отличий от стандартного Lua . (По крайней мере, при обнаружении функции печати должна отображаться ошибка сценария .) - Sameboat - 同舟( обсуждение ) 04:26, 19 марта 2013 г. (UTC)
- Отмечу Help: Lua для новичков сейчас в разработке. Wnt ( разговор ) 21:46, 24 марта 2013 (UTC)
Документация
Теперь у нас есть система / doc, которая несколько интегрирована / принудительно реализована через расширение Scribunto. Я предпринял некоторые шаги, чтобы частично привести его в соответствие с нашей системой документации по шаблонам.
- Добавлено автоматическое включение шаблонов защиты. MediaWiki: Scribunto-doc-page-show и MediaWiki: Scribunto-doc-page-does-not-exist
- Автоматическая вставка зеленого «хрома» в нашу документацию по шаблону. MediaWiki: Scribunto-doc-page-show
- Автоматическая вставка шаблона {{ documentation subpage }}. MediaWiki: Scribunto-doc-page-header
- Editnotice для страницы / doc. {{ Editnotices / Namespace / Module }}
- Link / Create testcases ссылка для страниц модуля. {{ Editnotices / Namespace / Module }}
Конечно, предстоит еще много работы
- Это хорошая идея - отклониться от стандартного шаблона вызова страниц с тестовыми наборами, тестами для пространства имен модуля? Не думаю, что это было действительно активное решение.
- Сообщения для включения / doc в настоящее время добавляются как contentlanguage, где на самом деле только их параметр должен быть включен как таковой. Также объясняет, почему хак uselang = qqq не работает для отображения сообщений scribunto.
- Создайте набор инструментов для MediaWiki: Scribunto-doc-page-does-not-exist для создания страниц документов и предоставления доступа к тестам.
- Инструментарий документации еще не знает о тестовых наборах модулей (хотя «вроде» editnotice знает).
Но это только начало - че е DJ ( разговор • вклад ) 22:18, 18 марта 2013 (UTC)
- Так что это в разработке. А пока есть {{ ml }}. - Депип ( разговор ) 22:43, 18 марта 2013 г. (UTC)
- Сегодня должно быть немного дальше. Некоторые примеры страниц и уведомлений об их редактировании:
- Модуль: UnitTests ( править ) - модуль со страницей документации
- Модуль: Математика ( править ) - модуль без документации и без тестовых примеров
- Модуль: HtmlBuilder ( редактировать ) - модуль без страницы документации, но с тестовыми примерами
- Модуль: UnitTests / doc ( править ) - сама страница документации
- Модуль: HtmlBuilder / testcases ( edit ) - страница с тестовыми наборами
- Чтобы это работало, у меня в настоящее время есть шаблон {{ documentation / link box }}, который по сути является форком {{ documentation / end box }}. Идея состоит в том, чтобы в какой-то момент объединить их снова, если часть модуля будет немного более развитой / стабильной. Конечно, их также, вероятно, легче сгенерировать с помощью lua, потому что в них довольно много логики. Если у вас есть идеи, как улучшить.
- Приветствуются идеи для ссылок и советы, которые должны быть в элементах. - Th е DJ ( разговор • вклад ) 22:29, 19 марта 2013 (UTC)
- Я могу показаться раздражительным, но к чему вы стремитесь? Мы знаем {{ документацию }} в шаблонах, и я очень хорошо начал {{ ml }} (спасибо). Что вы хотите добавить? - Депип ( разговор ) 23:55, 19 марта 2013 г. (UTC)
- Как и в случае с шаблонами, структура, которая помогает убедиться, что мы используем одни и те же подстраницы для одних и тех же целей, указывает на пояснительные ссылки для тех, кто не знаком с технологией, напоминает людям об обновлении тестовых сценариев и документации, имеет предварительно загруженные шаблоны, которые помогут вам начать документацию / тестовые страницы с нуля в последовательной манере и т. д. Некоторые из них уже есть, некоторые требуют переформулировки, некоторые требуют ссылки на лучшие практики lua / scribunto в пространстве имен Википедии, некоторые более мелкие вещи все еще отсутствуют. - Th е DJ ( разговор • вклад ) 09:46, 20 марта 2013 (UTC)
- Спасибо за объяснение. Думаю, теперь я понял. - Депип ( разговор ) 12:20, 20 марта 2013 г. (UTC)
- Как и в случае с шаблонами, структура, которая помогает убедиться, что мы используем одни и те же подстраницы для одних и тех же целей, указывает на пояснительные ссылки для тех, кто не знаком с технологией, напоминает людям об обновлении тестовых сценариев и документации, имеет предварительно загруженные шаблоны, которые помогут вам начать документацию / тестовые страницы с нуля в последовательной манере и т. д. Некоторые из них уже есть, некоторые требуют переформулировки, некоторые требуют ссылки на лучшие практики lua / scribunto в пространстве имен Википедии, некоторые более мелкие вещи все еще отсутствуют. - Th е DJ ( разговор • вклад ) 09:46, 20 марта 2013 (UTC)
- Я могу показаться раздражительным, но к чему вы стремитесь? Мы знаем {{ документацию }} в шаблонах, и я очень хорошо начал {{ ml }} (спасибо). Что вы хотите добавить? - Депип ( разговор ) 23:55, 19 марта 2013 г. (UTC)
- Сегодня должно быть немного дальше. Некоторые примеры страниц и уведомлений об их редактировании:
Защита и управление скриптами?
См. Обсуждение в Village Pump (политика) # Защита и управление скриптами? . Относится к Lua, пользовательским скриптам и пользовательским скриптам в целом. Комментарии приветствуются.
FT2 ( Обсуждение | электронная почта ) 02:07, 20 марта 2013 (UTC)
Руководство для новичков
Я нашел это руководство, чтобы узнать, как кодировать Lua, может помочь или использовать www.lua.org/pil/contents.html#P1
- Ссылка находится в заголовке страницы «Ресурсы». - Депип ( разговор ) 00:10, 21 марта 2013 г. (UTC)
- Как я уже говорил в предыдущей ветке. Если никто не скажет новичку, как преобразовать функцию печати (отключенную Scribunto) в отдачу , они могут застрять на странице 1, как я. - Sameboat - 同舟( разговор ) 01:18, 21 марта 2013 (UTC)
- Я только что начал Help: Lua для новичков , просто тороплюсь ... Я уверен, что есть еще много чего добавить и, возможно, несколько вещей, которые нужно перефразировать . Wnt ( разговорное ) 20:09, 22 марта 2013 (UTC)
- Ссылка добавлена в Википедию: Lua / Resources - DePiep ( обсуждение ) 22:14, 22 марта 2013 г. (UTC)
- Я только что начал Help: Lua для новичков , просто тороплюсь ... Я уверен, что есть еще много чего добавить и, возможно, несколько вещей, которые нужно перефразировать . Wnt ( разговорное ) 20:09, 22 марта 2013 (UTC)
Шаблон: Mlx
Мне кажется, что я, должно быть, заново изобрел колесо здесь, но я скопировал Template: Tlx в Template: Mlx с небольшими изменениями, так что мы можем ввести
{{Mlx | ConvertNumeric | decToHex | 99 33}}
и получить {{#invoke:ConvertNumeric|decToHex|99 33}}
Было бы хорошо, если бы кто-нибудь мог проверить это на предмет каких-либо недостатков, прежде чем он будет чем-то защищен каскадом. Wnt ( разговорное ) 23:14, 21 марта 2013 (UTC)
- На самом деле, я мог бы предложить, чтобы кто-то мог написать простой модуль для замены Tlx, Mlx и связанных с ними расширенных семейств параметров чем-то, что с радостью принимает и форматирует произвольное количество параметров, вместо того, чтобы иметь гигантское дерево #if. Полет драконов ( разговор ) 23:29, 21 марта 2013 (UTC)
- Я сделал это для {{ tlx }} в Викиучебниках с модулем: шаблон , если кто-то хочет попробовать адаптировать его для Википедии. - темный лама 01:36, 26 марта 2013 г. (UTC)
#invoke накладные расходы и сроки
- Я видел, как люди говорят об накладных расходах #invoke и т. Д. Известно ли, что лучше? (Можем ли мы попробовать с модулем и шаблоном и просто сравнить данные в комментариях к источнику HTML, или это не означает и то, и другое?) Wnt ( обсуждение ) 00:58, 22 марта 2013 г. (UTC)
- Накладные расходы довольно скромные, если вы не выполняете команду 100 раз. Я бы не стал беспокоиться о чем-то таком простом. Если вы можете улучшить функциональность или сделать код менее запутанным, то, как правило, это стоит делать. Чтобы привести конкретный пример, я оцениваю, что Module: Citation форматирует цитату примерно за 10,5 миллисекунд. Из этих 10,5 мс около 4,5 мс - это накладные расходы Lua, которые будут присутствовать при типичном вызове. Даже в этом случае вам придется сгенерировать довольно большое количество итераций, прежде чем воздействие станет заметным для пользователя. Из любопытства я также попробовал синхронизировать {{ Mlx }} и сейчас оценил его как работающее примерно 6,5 мс на итерацию. Пока модуль прост (в любом случае намного проще, чем Citation), вы, вероятно, получите модульную версию Mlx, аналогичную по скорости текущему шаблону. Полет драконов ( разговор ) 05:32, 22 марта 2013 (UTC)
- Вы где-то упоминали, как синхронизировать скрипты или шаблоны, такие как Mlx? Я знаю об отчете NewPP и скрипте Anomie , но я видел много различий в использовании времени NewPP Lua и не уверен в результатах. Существует дразнящий замечание с «Я повторил свои 10 × тесты двадцать раз» здесь , но я еще не пытался выяснить , что именно это имел в виду.
- Это не имеет особого значения, но мне любопытны какие-либо методы получения таймингов. В моей песочнице 1689 вызовов {{ convert / sandboxlua }}, а текущее использование времени Lua составляет 2,062 с, что составляет 2062/1689 = 1,2 мс / вызов. Конечно, 1689 вызовов - это очень нетипично, и у меня больше страниц с 10 и 2 вызовами в test2 - они показывают 4,5 мс / вызов для 10 вызовов и 12 мс / вызов для 2 вызовов. Johnuniq ( разговор ) 08:30, 22 марта 2013 (UTC)
- Во-первых, вы должны знать, на что смотрите. «Используемое время Lua» - это просто время внутри Lua и не включает такие вещи, как #invoke overhead. Использование времени Lua должно быть достаточно согласованным для нескольких синтаксических анализов одного и того же ввода. Время «Обслужено» - это все время, необходимое для страницы, включая задержки во внутренней сети и время, потерянное из-за многозадачности, и может значительно варьироваться в зависимости от различных факторов. Последний использовался в Dragons flight для измерения накладных расходов #invoke путем сравнения времени, необходимого для рендеринга пустой страницы и страницы с множеством вызовов модуля с единственной функцией ничего не делать. Что касается фразы «Я повторил ваши 10-кратные тесты двадцать раз», это означает именно следующее: у вас есть тест, который включает шаблон 10 раз. Я провел (вариант) этот тест 20 раз, записал время для каждого прогона и усреднил. Что касается «4,5 мс / вызов для 10 вызовов и 12 мс / вызов для 2 вызовов», это отражает тот факт, что
mw.loadData
намного быстрее выполняется запуск после первого, поэтому чем больше вызовов будет, тем больше амортизируется медлительность первого вызова. Бьорш (WMF) ( разговор ) 11:39, 22 марта 2013 (UTC) - С другой стороны, накладные расходы 4,5 мс на #invoke должны снизиться примерно до 2–2,5 мс с 1,22wmf1 , и у меня есть ожидающие рассмотрения изменения, чтобы отображать информацию о времени в нижней части страницы предварительного просмотра вместо того, чтобы требовать, чтобы источник был просмотрено. Бьорш (WMF) ( разговор ) 11:39, 22 марта 2013 (UTC)
- Использование времени Lua варьируется от 1% до 60% в зависимости от загруженных серверов: хотя часть общего времени переформатирования Lua более стабильна, чем синтаксический анализ разметки, который часто изменяется более чем на 200% медленнее (редко более чем на 300% медленнее), часы времени Lua имеют тенденцию оставайтесь в пределах ± 20% от затраченных секунд. Однако время использования Lua также может сильно варьироваться, иногда на + 30%, и однажды я измерил часы Lua как почти на + 60% дольше, чем самый быстрый тайминг. Следовательно, если объединенные функции Lua обычно выполняются более 6,3 секунды, тогда существует редкая опасность 10-секундного тайм-аута Lua на загруженных серверах, так как 6,3 * 160% = 10,08 секунды. К счастью, интерфейс Lua проверяет часы перед следующей функцией Lua, поэтому утомительная функция Lua могла работать 11 секунд, но без тайм-аута, если превышение произошло во время последнего запуска функции Lua (без других ожидающих выполнения функций Lua). - Wikid77 ( обсуждение ) 19:29, 22 марта 2013 г. (UTC)
- Во-первых, вы должны знать, на что смотрите. «Используемое время Lua» - это просто время внутри Lua и не включает такие вещи, как #invoke overhead. Использование времени Lua должно быть достаточно согласованным для нескольких синтаксических анализов одного и того же ввода. Время «Обслужено» - это все время, необходимое для страницы, включая задержки во внутренней сети и время, потерянное из-за многозадачности, и может значительно варьироваться в зависимости от различных факторов. Последний использовался в Dragons flight для измерения накладных расходов #invoke путем сравнения времени, необходимого для рендеринга пустой страницы и страницы с множеством вызовов модуля с единственной функцией ничего не делать. Что касается фразы «Я повторил ваши 10-кратные тесты двадцать раз», это означает именно следующее: у вас есть тест, который включает шаблон 10 раз. Я провел (вариант) этот тест 20 раз, записал время для каждого прогона и усреднил. Что касается «4,5 мс / вызов для 10 вызовов и 12 мс / вызов для 2 вызовов», это отражает тот факт, что
- Накладные расходы довольно скромные, если вы не выполняете команду 100 раз. Я бы не стал беспокоиться о чем-то таком простом. Если вы можете улучшить функциональность или сделать код менее запутанным, то, как правило, это стоит делать. Чтобы привести конкретный пример, я оцениваю, что Module: Citation форматирует цитату примерно за 10,5 миллисекунд. Из этих 10,5 мс около 4,5 мс - это накладные расходы Lua, которые будут присутствовать при типичном вызове. Даже в этом случае вам придется сгенерировать довольно большое количество итераций, прежде чем воздействие станет заметным для пользователя. Из любопытства я также попробовал синхронизировать {{ Mlx }} и сейчас оценил его как работающее примерно 6,5 мс на итерацию. Пока модуль прост (в любом случае намного проще, чем Citation), вы, вероятно, получите модульную версию Mlx, аналогичную по скорости текущему шаблону. Полет драконов ( разговор ) 05:32, 22 марта 2013 (UTC)
Direct #invoke на 20% -30% быстрее для крошечных функций
Я провел много тестов времени, чтобы сравнить использование шаблонов оболочки, содержащих #invoke, с прямым использованием {#invoke:}, а для крошечных шаблонов, таких как функции обработки строк, версии шаблонов часто работали на 50% медленнее, чем прямые # вызывать каждую крошечную функцию Lua. Связанная, но отдельная проблема, касающаяся скорости #invoke, может ускорить каждое использование Lua, если 1.22wmf1 успешно удвоит скорость каждого #invoke. Скорость #invoke в марте 2013 года составляла около 180 в секунду по сравнению с короткими шаблонами, работающими со скоростью 350-600 в секунду, или функциями синтаксического анализатора, превышающими 750 в секунду, или шаблонами вставки символов, работающими со скоростью 2400 в секунду. Подобно тому, как избегать использования предыдущих служебных шаблонов, при написании других служебных шаблонов я бы рекомендовал использовать прямой #invoke для доступа к функциям Lua из служебного шаблона. Каждый уровень «шаблонов оболочки» (для # вызова функции Lua) также увеличивает глубину раскрытия примерно на +2 уровня от 41-уровневого лимита (показано «41/40»). Для информационных ящиков, которые используют всего несколько функций Lua, запуск версий шаблона оболочки, а не прямой #invoke в информационном поле, будет достаточно эффективным, но все же следует остерегаться глубины раскрытия +2 при запуске версии шаблона оболочки. прямого #invoke в информационном окне. - Wikid77 ( обсуждение ) 19:29, 22 марта 2013 г. (UTC)
Перемещение модулей
При перемещении модуля не остается перенаправления, и существующие вызовы должны быть исправлены. Сообщение от MediaWiki: Movepagetext-noredirectfixer должно предупреждать об этом, возможно, такое предупреждение, как MediaWiki: Moveuserpage-warning . В настоящее время советовать проверять двойное перенаправление является ошибочным. Кроме того, эта страница должна объяснять, что невозможно переместить модуль в другое пространство имен или наоборот, кроме страниц документации (я думаю). - Вриуллоп ( разговор ) 11:07, 22 марта 2013 г. (UTC)
Шаблон именования песочницы
На данный момент у нас есть три шаблона для наименования страницы изолированной программной среды модуля:
- Модуль: Citation / CS1 / sandbox
- Модуль: Пользователь: Dcoetzee / Sandbox
- Модуль: Sandbox / isaacl / ColourSpace / Tuple
Я полагаю, это уже перебор. Чтобы сохранить сходство с другими страницами песочницы (в пространстве шаблона и пространстве пользователя), я предлагаю:
- В шаблоне №2 должны использоваться строчные буквы
/sandbox
. - Избавьтесь от
Module:Sandbox/isaacl ...
шаблона.
Если мы с этим согласны, мы можем поощрять / препятствовать шаблонам. - Депип ( разговор ) 11:51, 22 марта 2013 г. (UTC)
- Думаю, я запустил шаблон Module: User / Sandbox до того, как начались все страницы Module: X / testcases. Но прежде чем я переключусь ... откуда мы берём строчные буквы? У нас есть такие страницы, как WP: Lua / Modules , WP: Reference desk / Science . Я помню, что есть некоторая ошибка, связанная с верхним регистром и песочницами, но я думаю, что это влияет только на шаблон Module: Sandbox / Name, которого вы бы избегали (хотя не уверен, что у меня это право). Тем не менее, я согласен со стремлением к согласованности - в какой-то момент мы хотим, чтобы девственники Lua могли щелкнуть ссылку на «Моя песочница Lua» и перейти в стандартное место. Wnt ( разговорное ) 13:20, 22 марта 2013 (UTC)
- Строчные буквы используются как в шаблоне, так и в пользовательском пространстве. Это возможно, потому что они всегда являются подстраницами (по обычной практике). Подстраницы являются полностью чувствительны к регистру (Х / Песочница = / = Х / песочнице). Различия между пробелами утомительны, поэтому я также предложил строчные буквы в модуле.
- Я не знаю, есть ли ошибка, связанная с Module: Sandbox / .... Но, конечно, первая буква заголовка страницы пишется с заглавной буквы (также при создании Module: cherry ). Это помешало бы нам везде писать строчные буквы последовательно. В любом случае, если мы откажемся от третьего варианта, этот вопрос исчезнет. - Депип ( разговор ) 16:46, 22 марта 2013 г. (UTC)
- Я начал использовать шаблон 3. Я должен сказать, что мне не нравится шаблон 2. Псевдо-пространство имен «User:», встроенное в него, весьма непохоже на шаблон именования любых существующих страниц и выглядит как кладж. Другое преимущество Module: Sandbox заключается в том, что он доступен для поиска с помощью Special: PrefixIndex, что позволяет учащемуся Lua (большинству людей на данный момент) исследовать любой другой экспериментальный код, который там размещен. Образец 2 создает бункеры. - Hex ( ❝ ?! ❞) 16:09, 22 марта 2013 г. (UTC)
- Хорошие моменты. Основная цель - иметь только два шаблона, в зависимости от того, какой из них. И это легче достичь на ранней стадии разработки. Напишу в ВПТ. - Депип ( разговор ) 16:55, 22 марта 2013 г. (UTC)
- Могу я повторить. Проблема ограничивается только пользовательскими песочницами. В противном случае любой модуль может использовать песочницу. - Депип ( разговор ) 01:18, 23 марта 2013 г. (UTC)
- Когда я думаю об этом, я вижу тонкую разницу между значениями между «Module: User:» и «Module: Sandbox /». Я проверил WP: О песочнице и заметил следующее определение: «Песочница Википедии - это страница, предназначенная для тестирования и экспериментов с синтаксисом вики»; поэтому для меня «Модуль: Песочница /» предназначен только для временного тестирования. Что касается «Модуль: Пользователь:», я полагаю, что это место для размещения любых модулей для долгосрочного личного использования (хотя сейчас я не могу придумать вариант использования для этого). Для меня это похоже на разницу между страницей пользователя и WP: Sandbox ; в то время как можно использовать собственную страницу пользователя для активного экспериментирования с синтаксисом вики, страница пользователя должна содержать полезное долгосрочное содержание.
- И в конце концов, я согласен пораньше разобраться с неймингом. - Peter CX и Talk, 01:05, 23 марта 2013 г. (UTC)
- Хорошие моменты. Основная цель - иметь только два шаблона, в зависимости от того, какой из них. И это легче достичь на ранней стадии разработки. Напишу в ВПТ. - Депип ( разговор ) 16:55, 22 марта 2013 г. (UTC)
- Я не уверен, что такое «изолированность», но привлекательность сохранения отдельного модуля «пользовательское пространство» заключается в том, что люди часто хотят работать над модулем, но затем откладывают его на некоторое время. Чтобы выяснить ошибки, html-код и т. Д., Не допуская его, чтобы люди не останавливались на нем для шаблона и неожиданно погружали его в воду. Wnt ( разговор ) 03:46, 23 марта 2013 (UTC)
- Является ли запрос на bugzilla способом разместить модули Lua в каком-либо пользовательском пространстве - хорошей идеей? Может быть, пространство имен «Пользовательский модуль:»? Мартин Хоэкстра ( разговор ) 15:27, 14 мая 2013 (UTC)
Передача 1000 параметров экспоненциально медленнее
Выполняя тесты для моделирования большой функции #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 =".
Формула задержки времени: начальные тесты показывают формулу задержки времени примерно как delay = 3 ^ ( n / 2000) секунд, где n - количество переданных параметров, а для n = 6000 задержка была 3 ^ 3 или 27 секунд, или для n = 7000 задержка составила 3 ^ 3,5 или 47 секунд. Формула: Конечно, конкретная задержка зависит от загрузки сервера, но следует общей формуле экспоненциального замедления, где 7000 параметров намного медленнее, чем линейное расширение 7000/6000 или на 17% медленнее, и работает ближе к 47 секундам (+ 70% медленнее) а не 27 + 17% = 31,6 секунды.
Влияет на Lua, шаблоны и функции синтаксического анализатора: Опять же, накладные расходы на задержку по времени для передачи тысяч параметров не только влияют на интерфейс Lua #invoke, они расширяют такое же экспоненциальное замедление задержки при передаче параметров в шаблоны, а также "| x = "выбор ветвей в функции #switch (которая также занимает 27 секунд для обработки 6000 ветвей). Передача всего 1000 параметров занимает около 1 секунды, а разделение 6000 на группы 6 × 1000 может обработать все 6000 параметров в течение 6 секунд, а не 27.
Следовательно, для Lua альтернативой является передача меньшего количества параметров, но в виде строк вариантов, разделенных символами-разделителями внутри каждой строки. - Wikid77 ( обсуждение ) 12:07, 24 марта 2013 г. (UTC)
- Зачем вы построили коммутатор на основе Lua таким образом? Если вы хотите, чтобы это было быстро, параметры переключения должны быть сохранены в Lua и кэшированы с помощью mw.loadData. Попытка импортировать тысячи параметров через invoke кажется неправильным способом. Вот пример альтернативного коммутатора, который обрабатывает 6000 параметров примерно за 10 мс с использованием Module: Switch :,
{{#invoke: Switch | switch | list=Switch/LongTest | case=6000 }}
где значения case хранятся в Module: Switch / LongTest . Полет драконов ( разговор ) 15:52, 24 марта 2013 (UTC)
когда использовать mw.title.new
- Пока мы находимся на этом - может ли кто-нибудь объяснить наше дерево решений, когда использовать mw.title.new, mw.title.makeTitle, mw.loadData или передать страницу в модуль в качестве включенного параметра? Wnt ( разговорное ) 21:44, 24 марта 2013 (UTC)
- Пока мы говорим, вы говорите - я не понимаю шутки. Я сделал это в новой ветке. - Депип ( разговор ) 00:05, 25 марта 2013 г. (UTC)
mw.title.new()
использует пространство имен в строке, если оно есть, в то время какmw.title.makeTitle()
форсирует указанное пространство имен. mw: Extension: Справочное руководство Scribunto / Lua # mw.title.makeTitle содержит пример, иллюстрирующий разницу. Я не знаю, что «лучше» - использоватьmw.title.getCurrentTitle().prefixedText
или передать в{{FULLPAGENAME}}
качестве параметра.mw.loadData()
может использоваться вместоrequire()
загрузки очень большого подмодуля, который возвращает только данные, когда требуемый модуль, вероятно, будет использоваться несколько раз на странице. Это не имеет ничего общего с методами mw.title. Anomie ⚔ 23:48, 24 марта 2013 г. (UTC)- Что ж, вы также можете получить данные, открыв страницу с mw.title или путем включения. Есть ли преимущества при загрузке модуля с данными? Мне кажется, что удобнее иметь файлы данных, независимые от кода Lua, чтобы люди, которые этого не знают, могли работать с ними. Не так ли? Wnt ( разговор ) 03:32, 25 марта 2013 (UTC)
- Информация, загруженная через mw.loadData, анализируется в таблице Lua один раз за отрисовку страницы. Информация, передаваемая через mw.title или через включение, должна анализироваться при каждом вызове #invoke, что может приводить к множеству вхождений на рендеринг страницы. Следовательно, если большая таблица может потребоваться во время множества отдельных вызовов invoke, то использование mw.loadData имеет неотъемлемое преимущество. Полет драконов ( разговор ) 04:10, 25 марта 2013 (UTC)
- Ох, хорошо. Таким образом, Module: Sprite был бы хорошим кандидатом для этого: я думал использовать его для страниц со 170 флагами, то есть 170 вызовов, и весь смысл в том, чтобы быть суперэффективным, если это возможно. Wnt ( разговор ) 04:23, 25 марта 2013 (UTC)
- Ну, я передал его, чтобы использовать это ... одна «особенность» заключается в том, что данные для loadData должны находиться в Module: space. Учитывая крайние ограничения, я бы поинтересовался, можно ли ослабить это ограничение, но ... ну, в любом случае, пока я могу это сделать, но я чувствую цунами дополнительных модулей: имена (в данном случае по одному для каждого файла; для остальных модулей по одному на каждую страницу). Wnt ( разговор ) 05:04, 25 марта 2013 (UTC)
- Информация, загруженная через mw.loadData, анализируется в таблице Lua один раз за отрисовку страницы. Информация, передаваемая через mw.title или через включение, должна анализироваться при каждом вызове #invoke, что может приводить к множеству вхождений на рендеринг страницы. Следовательно, если большая таблица может потребоваться во время множества отдельных вызовов invoke, то использование mw.loadData имеет неотъемлемое преимущество. Полет драконов ( разговор ) 04:10, 25 марта 2013 (UTC)
- Что ж, вы также можете получить данные, открыв страницу с mw.title или путем включения. Есть ли преимущества при загрузке модуля с данными? Мне кажется, что удобнее иметь файлы данных, независимые от кода Lua, чтобы люди, которые этого не знают, могли работать с ними. Не так ли? Wnt ( разговор ) 03:32, 25 марта 2013 (UTC)
- Пока мы находимся на этом - может ли кто-нибудь объяснить наше дерево решений, когда использовать mw.title.new, mw.title.makeTitle, mw.loadData или передать страницу в модуль в качестве включенного параметра? Wnt ( разговорное ) 21:44, 24 марта 2013 (UTC)
Рамочный вопрос
Я пытался разобраться с концепцией рамок, и мне кажется, что я почти у цели. Однако есть еще несколько вещей, в которых я не уверен. Например, Module: Navbar содержит код:
местное происхождение - Если вызывается через #invoke, используйте аргументы, переданные в вызывающий шаблон. - В противном случае в целях тестирования предположим, что аргументы передаются напрямую. если frame == mw.getCurrentFrame (), то origArgs = frame: getParent (). args еще origArgs = frame конец
В каком случае frame
не было бы равно mw.getCurrentFrame()
? Применимо ли это, если вы обращаетесь к модулю из другого модуля Lua, а не напрямую со страницы вики? Или что-то еще? Если бы кто-нибудь мог помочь мне разобраться, я был бы очень благодарен. Лучший - Мистер Страдивари ♪ выступление ♪ 10:42, 27 марта 2013 г. (UTC)
- Судя по этому, операторы if и else соответственно соответствуют строке 1 и строке 2 комментариев вверху . Похоже, здесь описаны локальные аргументы (например, для тестирования), а не аргументы, передаваемые через invoke ; возможно относится к этому примеру . LittleBen ( разговор ) 11:21, 27 марта 2013 (UTC)
Вы все правильно поняли. Это немного шаблонного кода, который я использовал во всех модулях, которые я пишу. Первое предложение поддерживает случай, когда модуль вызывается из шаблона как {{#invoke: Navbar | navbar}}
. Второй пункт поддерживает простой способ вызова функции из другого модуля (например, от модуля: НавБокс ), или из консоли отладки: Navbar.navbar({arg1 = 'foo', arg2 = 'bar'});
. В модуле: боковая панель я расширил шаблон, чтобы разрешить третий способ, вызывая модуль из шаблона и явно передавая аргументы (вместо использования любых аргументов, переданных в шаблон), например {{#invoke: Navbar | arg1 = foo | arg2 = bar}}
. Toohool ( разговор ) 17:18, 27 марта 2013 (UTC)
- Спасибо за ответы! Теперь это имеет больше смысла - в основном, мне нужно начать использовать консоль отладки. :) Я тоже собираюсь извлечь этот код из Module: Sidebar , так как это как раз то, что мне нужно. - Г-н Страдивари ♪ выступление ♪ 18:29, 27 марта 2013 г. (UTC)
У меня есть еще один связанный с этим вопрос. Я пытался использовать некоторые другие функции фрейма, и я могу заставить их работать с помощью #invoke, но не через консоль отладки. Например, Модуль: Пользователь: Мистер. Stradivarius / sandbox2 дает правильный результат при использовании через вызов пользователя: Mr. Stradivarius / Sandbox , но когда я использую код = p.test()
в консоли отладки, я получаю сообщение об ошибке «Ошибка Lua в строке 4: попытка проиндексировать локальный 'фрейм' (нулевое значение)». Что я делаю неправильно? - Г-н Страдивари ♪ выступление ♪ 16:45, 29 марта 2013 г. (UTC)
- Вы не передаете ему фрейм, поэтому
frame
в вашей функции ноль. - Вы можете использовать
mw.getCurrentFrame()
для получения фрейма (т.е. вызывать свою функцию как=p.test( mw.getCurrentFrame() )
), и если вам нужно поместить аргументы в фрейм, вы можете использоватьmw.getCurrentFrame():newChild()
. Anomie ⚔ 01:00, 30 марта 2013 г. (UTC) - mw: getCurrentFrame (): newChild () также может использоваться в качестве альтернативы добавлению исключения для функций, когда фрейм не является mw: getCurrentFrame (). - темный лама 01:20, 30 марта 2013 г. (UTC)
- Спасибо вам обоим, это действительно помогает. Я начал использовать код в консоли отладки для тестирования:
frame = mw.getCurrentFrame ()frame.args = {"a", "b", c = "d"}= p.test (кадр)
- Так все работает как надо. В какой-то момент мне придется добавить все это на страницы справки, так как я уверен, что у других будут те же проблемы. Лучший - Мистер Страдивари, выступление 04:28, 30 марта 2013 г. (UTC)
p.test(mw:getCurrentFrame():newChild{title='A', args={"a", "b", c="d"}});
похож на ваш пример с использованием newChild с добавлением заголовка, который может потребоваться для некоторых методов frame. Двойное использование newChild также может быть полезно для проверки случаев getParent (), которые, как могут предполагать некоторые функции, существуют:
p.test ((mw: getCurrentFrame (): newChild { title = 'B', args = {"a", "b", c = "d"} }): newChild { title = 'А', args = {} })
- Также ваш пример может иметь непреднамеренный побочный эффект изменения атрибута для текущего кадра в любом месте, где используется текущий кадр, где newChild создает новую копию. - темный лама 13:19, 30 марта 2013 г. (UTC)
Замена Lua для {{ Repeat }}
Я решил реализовать замену Lua внутренностям {{ Repeat }} в качестве учебного проекта для моего первого модуля Lua. Пожалуйста, взгляните на Module: RepeatString и Template talk: Repeat и посмотрите, что вы думаете. Моя первоначальная мысль заключалась в том, что наличие модуля, названного в честь одной строковой функции, может быть немного экстравагантным, поэтому, возможно, было бы лучше сгруппировать его с другими аналогичными функциями, если они где-то существуют. - Hex ( ❝ ?! ❞) 16:49, 3 апреля 2013 г. (UTC)
- По какой причине вы не используете встроенный "string.rep (str, n)"? Полет драконов ( разговор ) 17:01, 3 апреля 2013 (UTC)
- Потому что я не знал об этом? Ну , что делает , что легче, а затем. Хмм! Тогда я исправлю это завтра, когда у меня будет немного времени на код. Спасибо за чаевые! - Hex ( ❝ ?! ❞) 17:17, 3 апреля 2013 г. (UTC)
- Хммм, вы вдохновили меня на написание Module: LuaCall с одной небольшой оговоркой ... это не работает. Очевидно, что tostring (_G ["string.rep"]) имеет значение "nil", а не "function". Если кто-нибудь укажет мне на нужное дерево, я буду благодарен. (Нет, сопрограммы не реализованы) Wnt ( обсуждение ) 16:01, 17 апреля 2013 г. (UTC)
- Это потому, что если вы используете "string.rep", Lua пытается найти ключ с именем "string.rep" в таблице _G, но этот ключ не существует - есть только один, называемый "string". Вместо этого вы можете использовать
tostring(_G.string.rep)
илиtostring(_G["string"]["rep"])
. - Г-н Страдивари, выступление, 16:36, 17 апреля 2013 г. (UTC)- Я должен был подумать об этом! Почему-то я просто предположил, что периоды будут анализироваться, как и все остальное. В любом случае, теперь у меня это работает, так что
- {{#invoke: LuaCall | main | a = test | b = 7 | string.rep (a, b)}} производит
- тест
- Wnt ( разговорное ) 19:49, 17 апреля 2013 (UTC)
- Это потому, что если вы используете "string.rep", Lua пытается найти ключ с именем "string.rep" в таблице _G, но этот ключ не существует - есть только один, называемый "string". Вместо этого вы можете использовать
Рейтинг модуля Lua
Я создал пять категорий для разных уровней прогресса модуля Lua: поскольку каждая объясняет другие, должно быть достаточно Category: Modules in alpha . Короче говоря, я установил следующие категории: пре-альфа, альфа, бета, выпуск и защищенный. Прямо сейчас я выставляю оценки на подстраницах документации, и я думаю, что это то, что кто-то ранее предлагал для категорий. Мои собственные модули заполняют только категории пре-альфа и альфа, но есть некоторые из них, которые, как я знаю, достигли других уровней. Я приветствовал бы комментарии, и если люди думают, что схема в порядке, оцените свои модули ... Wnt ( обсуждение ) 23:31, 16 апреля 2013 г. (UTC)
- Похоже, хорошая идея, и категории выглядят разумно. Как насчет использования шаблона вместо того, чтобы каждый раз вводить всю категорию? Я думаю о чем-то, где вы могли бы ввести, скажем, в верхней части подстраницы / doc, и это создало бы уведомление и классифицировало бы модуль за один раз. - Г-н Страдивари, выступление 02:15, 17 апреля 2013 г. (UTC)
{{module rating|alpha}}
- Фактически, я пошел дальше и создал предварительную альфа-версию {{ module rating }}. Поиграйте с ним и посмотрите, что вы думаете. - Г-н Страдивари, выступление 02:49, 17 апреля 2013 г. (UTC)
- Милорд, но вы только что поделились со мной идеей ужасного взлома, который, как я думаю, заставит Аноми хихикать (надеюсь). Мы могли бы иметь editnotice для всего пространства имен Module:, которое # вызывает модуль, который читает пространство имен doc и ищет ваш шаблон, а затем возвращает тег Category: для отображения в модуле вместо страницы документа ... нет, забудьте Я когда-либо говорил что-нибудь. :) Кроме того, я совсем не такой - я до сих пор не понял, как чертов модуль: BananasArgs / testcases помещается в категорию, а это программа "hello world"! Wnt ( обсуждение ) 14:27, 17 апреля 2013 (UTC)
- Это будет {{ Замечание о тестовых примерах модуля }}. Я обнаружил это в разделе «Просмотреть шаблоны на этой странице» на экране редактирования шаблона . Я предполагаю, что это делается какой-то магией где-то в пространстве имен MediaWiki, но мне было недостаточно, чтобы найти, где это. :) Взлом, который я использовал, должен иметь тот же эффект - шаблон просто проверяет, что имя подстраницы не "doc", и классифицирует все остальные страницы - что да, включает страницы модуля. Я уже применил это в своих модулях - см. Module: Csdcheck и Module: UrlToWiki для пары примеров. - Г-н Страдивари ♪ выступление ♪ 14:51, 17 апреля 2013 г. (UTC)
- О Конечно! Я должен был понять, что, поскольку документ уже включен, вы можете просто сделать это. В то же время, я нашел код на Шаблон: Editnotices / пространство имен / Module - но не надлежащим способом, а путем объявления HOMINEM поиска редактора TheDJ на уведомления вы нашли. Wnt ( разговорное ) 15:13, 17 апреля 2013 (UTC)
- Этот поиск ad hominem был хорошей идеей - страницы MediaWiki - это MediaWiki: Scribunto-doc-page-show , MediaWiki: Scribunto-doc-page-does-not-exist и MediaWiki: Scribunto-doc-page-header . Возможно, мы сможем сотворить с ними некую магию категорий, если для этого есть веская причина. - Г-н Страдивари, выступление 15:43, 17 апреля 2013 г. (UTC)
- Спасибо. Кстати, вы уже сделали большой выбор иконок, и мне было интересно, можете ли вы предложить еще одну: у нас должна быть категория для страниц, которые никогда не будут оцениваться, потому что это программы «Привет, мир», обучающие демонстрации , примеры ошибок, пользовательские скрипты, песочницы и т. д. Wnt ( обсуждение ) 16:29, 17 апреля 2013 г. (UTC)
- Этот поиск ad hominem был хорошей идеей - страницы MediaWiki - это MediaWiki: Scribunto-doc-page-show , MediaWiki: Scribunto-doc-page-does-not-exist и MediaWiki: Scribunto-doc-page-header . Возможно, мы сможем сотворить с ними некую магию категорий, если для этого есть веская причина. - Г-н Страдивари, выступление 15:43, 17 апреля 2013 г. (UTC)
- О Конечно! Я должен был понять, что, поскольку документ уже включен, вы можете просто сделать это. В то же время, я нашел код на Шаблон: Editnotices / пространство имен / Module - но не надлежащим способом, а путем объявления HOMINEM поиска редактора TheDJ на уведомления вы нашли. Wnt ( разговорное ) 15:13, 17 апреля 2013 (UTC)
- Это будет {{ Замечание о тестовых примерах модуля }}. Я обнаружил это в разделе «Просмотреть шаблоны на этой странице» на экране редактирования шаблона . Я предполагаю, что это делается какой-то магией где-то в пространстве имен MediaWiki, но мне было недостаточно, чтобы найти, где это. :) Взлом, который я использовал, должен иметь тот же эффект - шаблон просто проверяет, что имя подстраницы не "doc", и классифицирует все остальные страницы - что да, включает страницы модуля. Я уже применил это в своих модулях - см. Module: Csdcheck и Module: UrlToWiki для пары примеров. - Г-н Страдивари ♪ выступление ♪ 14:51, 17 апреля 2013 г. (UTC)
- Милорд, но вы только что поделились со мной идеей ужасного взлома, который, как я думаю, заставит Аноми хихикать (надеюсь). Мы могли бы иметь editnotice для всего пространства имен Module:, которое # вызывает модуль, который читает пространство имен doc и ищет ваш шаблон, а затем возвращает тег Category: для отображения в модуле вместо страницы документа ... нет, забудьте Я когда-либо говорил что-нибудь. :) Кроме того, я совсем не такой - я до сих пор не понял, как чертов модуль: BananasArgs / testcases помещается в категорию, а это программа "hello world"! Wnt ( обсуждение ) 14:27, 17 апреля 2013 (UTC)
- Фактически, я пошел дальше и создал предварительную альфа-версию {{ module rating }}. Поиграйте с ним и посмотрите, что вы думаете. - Г-н Страдивари, выступление 02:49, 17 апреля 2013 г. (UTC)
Я начал обсуждение здесь: en: Module_talk: String # Репликация на других вики . Cya. - Ротпункт ( разговор ) 12:35, 1 мая 2013 г. (UTC)
- Было бы неплохо, например, если бы модули на Commons ( http://commons.wikimedia.org/wiki/Commons:Lua/Modules ) могли вызываться из всех вики, чтобы мы могли поместить туда наиболее используемые библиотеки (например, String) , точно так же, как мы используем Commons для изображений. - Ротпункт ( разговор ) 12:46, 1 мая 2013 г. (UTC)
- Планируется создание центральной вики по коду, но дата начала работы над ней еще не назначена. Обратите внимание, что эта центральная вики-страница с кодом не будет принадлежать сообществу Commons; они не хотят этого, и я знаю, что есть некоторые в сообществе, которые тоже не хотят этого. Бьорш (WMF) ( разговорное ) 00:15, 2 мая 2013 (UTC)
- Спасибо за ответ. Каковы проблемы с совместным использованием модулей на Викискладе между вики так же, как мы уже обмениваемся изображениями из них? Я новичок в Scribunto, но я подумал, что это идеальный образец. В любом случае, если под "центральной вики кодами" вы имеете в виду способ обмена модулями, как мы сейчас делимся изображениями из Commons, это было бы идеально! Я думаю, что такой репозиторий (Commons на что-то еще) для совместного использования кода без копирования и вставки между вики необходим уже на первых этапах этого проекта, чтобы избежать бесполезной фрагментации (например, 22 версии String [2] ). - Ротпункт ( разговор ) 10:53, 2 мая 2013 (UTC)
- Потому что код был специально написан для изображений, и существующий код для попытки этого не работает. И конкретно для Commons, как я уже сказал, Commons не хочет быть центральной вики для кода, а некоторые люди этого не хотят. Бьорш (WMF) ( разговор ) 11:14, 2 мая 2013 (UTC)
- Еще раз спасибо за объяснение. Как бы то ни было, вы говорили о «запланированной центральной вики-странице кода». Будет ли он работать таким же образом («напиши один раз и запусти на каждой вики»)? могу я найти обсуждение или проектную документацию по этому поводу? заранее спасибо. - Ротпункт ( разговор ) 17:45, 2 мая 2013 (UTC)
- Потому что код был специально написан для изображений, и существующий код для попытки этого не работает. И конкретно для Commons, как я уже сказал, Commons не хочет быть центральной вики для кода, а некоторые люди этого не хотят. Бьорш (WMF) ( разговор ) 11:14, 2 мая 2013 (UTC)
- Спасибо за ответ. Каковы проблемы с совместным использованием модулей на Викискладе между вики так же, как мы уже обмениваемся изображениями из них? Я новичок в Scribunto, но я подумал, что это идеальный образец. В любом случае, если под "центральной вики кодами" вы имеете в виду способ обмена модулями, как мы сейчас делимся изображениями из Commons, это было бы идеально! Я думаю, что такой репозиторий (Commons на что-то еще) для совместного использования кода без копирования и вставки между вики необходим уже на первых этапах этого проекта, чтобы избежать бесполезной фрагментации (например, 22 версии String [2] ). - Ротпункт ( разговор ) 10:53, 2 мая 2013 (UTC)
- Планируется создание центральной вики по коду, но дата начала работы над ней еще не назначена. Обратите внимание, что эта центральная вики-страница с кодом не будет принадлежать сообществу Commons; они не хотят этого, и я знаю, что есть некоторые в сообществе, которые тоже не хотят этого. Бьорш (WMF) ( разговорное ) 00:15, 2 мая 2013 (UTC)
Есть ли еще модуль счетного элемента страницы?
Здравствуйте, мне интересно, есть ли в настоящее время модуль, который считает элементы на странице. Возможно, li в списке или tr в таблице? Технический 13 ( разговор ) 12:12, 9 мая 2013 (UTC)
- Scribunto предназначен для вставки на страницу вики-текста, возвращенного при запуске сценария Lua. Однако входные данные для сценария Lua состоят из аргументов, явно переданных в том,
{{#invoke}}
который запускает сценарий, и любых аргументов, переданных wikitext в шаблон, где шаблон вызывает сценарий. Другими словами, невозможно передать HTML или выбранную часть викитекста на странице в Lua. Есть несколько «дорогих» (то есть медленных) процедур, которые позволяют сценарию читать викитекст всей страницы. Я не пробовал это, но подозреваю, что это не пригодится для более чем периодического использования. Johnuniq ( разговор ) 01:18, 10 мая 2013 (UTC) - Что ж, есть модуль: TextMarkup . Подсчитывает количество шаблонов {{inc}} на странице. Я полагаю, вы можете изменить его под свои нужды. Просто используйте его осторожно, как упоминал Джонуник, - Снаевар ( разговор ) 10:41, 10 мая 2013 г. (UTC)
- Спасибо вам обоим за ваши ответы. На самом деле этот вопрос был не для меня, а скорее как ответ на запрос {{ Help me }} на Help talk: Template # Подсчет элементов в нумерованном списке (и впоследствии я узнал, что WT: WikiProject Templates # Подсчет предметов в нумерованном списке и в Википедии: Справочная служба # Подсчет элементов и в нумерованном списке ). Я сделал ссылку здесь, так что, если первоначальный задающий вопрос хотел бы попробовать использовать модуль User: Snaevar , упомянутый Snaevar, у него, вероятно, будет много вопросов, требующих некоторой помощи в этом. В любом случае, я чувствую, что моя работа сделана для этого запроса. Хорошего дня! Технический 13 ( разговор ) 11:38, 10 мая 2013 (UTC)
эквивалент магического слова fullurl
Что эквивалентно {{fullurl:page name}}
?
Я использовал библиотеку mw.title с вызовом like mw.title.new(page_name):fullUrl({uselang=lang})
, но mw.title.new () отмечен как дорогостоящая функция, поэтому я хотел бы знать, есть ли альтернатива, - Моробоши ( выступление ) 07:06, 18 мая 2013 (UTC)
mw.uri.fullUrl(mw.title.getCurrentTitle().text)
- Билити ( разговор ) 07:22, 18 мая 2013 г. (UTC)
Использование Mediawiki API
Есть ли способ использовать Mediawiki API внутри Lua? Привет, Стефан Кулла ( разговор ) 15:54, 19 мая 2013 (UTC)
- Нет, и общее мнение таково, что Lua не должен иметь возможность выполнять HTTP-вызовы, поэтому маловероятно, что будет добавлен какой-либо доступ к API. Тем не менее, предполагается, что Lua в конечном итоге будет расширен, чтобы разрешить доступ к большей части той же информации Mediawiki, которую можно получить из API. Полет драконов ( разговор ) 19:54, 19 мая 2013 (UTC)
- Спасибо за ответ Стефан Кулла ( разговор ) 20:26, 19 мая 2013 (UTC)
Справка по модулю
(Извините за то, что написали здесь. Если вы можете мне помочь )
Я импортировал Module: Citation , Module: Citation / CS1 / Configuration , Module: Citation / CS1 в bn.wikipedia . после импорта я обнаружил ошибку в статье с этой категорией: Страницы с ошибками скрипта . теперь я хотел перевести Категория: Страницы с ошибками скрипта на язык bn. как я могу это сделать (в каком модуле я нахожу эту категорию для перевода). - Aftab1995 ( разговор ) 15:50, 23 мая 2013 г. (UTC)
- Вы можете перевести «Страницы с ошибками сценария» на сайте betawiki: MediaWiki: Scribunto-common-error-category / bn , в translatewiki. Если вы раньше не переводили, вам нужно будет создать учетную запись и запросить права переводчика. - Снаевар ( разговор ) 20:40, 23 мая 2013 г. (UTC)
- Спасибо - Aftab1995 ( обсуждение ) 14:32, 25 мая 2013 г. (UTC)
Шаблон: FlagiconLua достигает функционального паритета с шаблоном: Flagicon
Я очень рад сообщить, что Template: FlagiconLua достиг паритета функций с Template: Flagicon ! Он полагается на Module: Sandbox / QuimGil / Flagicon , который предоставляет логику, и Module: Sandbox / QuimGil / FlagTranslations , где хранятся данные флагов. См. Демонстрации и дополнительную информацию в шаблоне флага WikiProject . Я новичок! Ваша помощь в указании путей улучшения приветствуется. Кроме того , ваша обратная связь здесь о лучшем способе организации данных , также приветствуется. Спасибо! - QuimGil ( разговор ) 07:52, 21 июня 2013 (UTC)
ошибка mw.ustring.byteoffset
Правильно ли mw.ustring.byteoffset работает с отрицательными смещениями? Ввод следующего в окно отладки дает показанные значения:
для i = -1, -5, -1 выполните print (i, mw.ustring.byteoffset ('abcde', 0, i)) end-1 3-2 2-3 1-4 ноль-5 ноль
Мне эта функция не нужна - я просто спрашиваю, есть ли в ней ошибка. Johnuniq ( разговор ) 02:22, 25 июня 2013 (UTC)
- Да, это ошибка. Аномия ⚔ 14:07, 25 июня 2013 (UTC)
Возврат конкатенации множества слов
Извините, если это обсуждалось раньше, но я не нашел соответствующих ссылок за пару минут.
В модуле: DisplayLuaTableContents я вижу многочисленные циклы как
для , б , в пар ( J ) делают выход = выход .. бла - бла - бла конец
, но я узнал, что строки неизменяемы, и, следовательно, это назначение стоит довольно дорого. Что мне делать, чтобы вернуть большой текст, состоящий из множества более мелких элементов? Должен ли я возвращать последовательность из сотен строк, полагаясь на Scribunto при ее объединении? Incnis Mrsi ( разговор ) 11:59, 2 июля 2013 (UTC)
- PS mediawikiwiki: Расширение: Справочное руководство Scribunto / Lua # table.concat, по-видимому, является решением, но я еще не тестировал его. Incnis Mrsi ( разговор ) 12:11, 2 июля 2013 (UTC)
- Возможно, вы найдете это
string.format
полезным - см. Это обсуждение для некоторых примеров. Я не уверен, насколько дорого обходится конкатенация, но мне было бы интересно услышать больше, если кто-нибудь знает. - Г-н Страдивари, выступление, 12:28, 2 июля 2013 г. (UTC)
- Возможно, вы найдете это
- Вы можете вставить свои слова в таблицу (
table.insert(output_table, word)
) и связать эту таблицу в конце с функцией, которую предоставил Incnis Mrsi (output = table.concatenate(output_table)
). Таким образом, строкуoutput
не нужно будет воссоздавать каждый раз, когда к ней добавляется новое слово. Darkdadaah ( разговор ) 15:00, 2 июля 2013 (UTC)- Я предпочитаю не беспокоиться о мелочах. Если что-то подобное более читабельно, а таблица содержит 10 элементов, я не думаю, что кому-то будет важно, насколько производительным будет ваше решение. Если это 10.000 элементов, это может быть другой случай. Мартин Хоэкстра ( разговор ) 15:47, 2 июля 2013 (UTC)
- Я написал некоторые из этих более крупных функций обработки данных, и это определенно так - от этого абсолютно зависит, можно ли запустить сценарий или нет; вы можете сократить общее время работы более чем в 10 раз. Wnt ( разговор ) 17:02, 18 июля 2013 (UTC)
- Вы можете посмотреть на user: Incnis Mrsi / карту UCS для вики-таблицы, построенной с помощью table.concat примерно из 1500 элементов. Модуль использует string.format только для шестнадцатеричных чисел и (пока) не имеет ни одного
output = output .. blah-blah-blah
. Incnis Mrsi ( разговор ) 17:26, 12 августа 2013 (UTC)
- Я предпочитаю не беспокоиться о мелочах. Если что-то подобное более читабельно, а таблица содержит 10 элементов, я не думаю, что кому-то будет важно, насколько производительным будет ваше решение. Если это 10.000 элементов, это может быть другой случай. Мартин Хоэкстра ( разговор ) 15:47, 2 июля 2013 (UTC)
Нам нужен общий репозиторий для модулей и шаблонов Scribunto
Привет, ваши отзывы приветствуются в Ошибке 50329 - Нам нужен общий репозиторий для модулей и шаблонов Scribunto . Пожалуйста, не воспринимайте эти * личные * предложения как критику Википедии: Lua . Я сам с удовольствием пользуюсь этим пространством с домашними проектами, над которыми работаю в свободное время. Просто центральный репозиторий был бы настолько полезен для всех (включая разработчиков / редакторов en.wiki), и en.wiki не может быть (по моему честному и личному мнению) этим местом. Имея четкую перспективу в центральном месте, таком как mediawiki.org, тогда en.wiki и другие проекты Викимедиа могли бы лучше работать с местной поддержкой и всем, что характерно для их сообществ. Спасибо за внимание! - Qgil ( разговор ) 21:16, 2 июля 2013 (UTC)
Модуль для сравнения двух шаблонов
Я создал таблицу Module: Testcase , и, похоже, она работает очень хорошо (см. Текущие включения ). Мне было интересно, есть ли способ улучшить производительность. например, заставить эту работу работать без копирования аргументов в новую таблицу? Я собирался развернуть его в Template: Year в других календарях / тестовых наборах , но в моем предварительном просмотре время истекает к тому времени, когда он дойдет до последнего теста. Кроме того, если кто-то уже написал модуль, который делает то же самое, дайте мне знать, и я удалю этот модуль. Спасибо. Frietjes ( разговор ) 00:03, 4 июля 2013 (UTC)
- Я попробовал, и вы не можете передавать аргументы напрямую из объекта фрейма, поскольку Lua извлекает их только по запросу. Я также использовал mw.ustring.format () вместо конкатенации для создания таблицы результатов, что может иметь некоторое (небольшое) преимущество в производительности. Но большая часть медлительности исходит от самих шаблонов, а не от вашего модуля. На самом деле я подумывал переписать Template: Year в других календарях , так как математические вычисления в Lua были бы намного эффективнее. В любом случае, по какой-то причине мне удалось преобразовать Template: Year в других календарях / тестовых наборах для использования {{ testcase table }}, так что это, по крайней мере, работает. - Г-н Страдивари ♪ выступление 44 14:44, 4 июля 2013 г. (UTC)
- благодарю вас! Я удаляю промежуточные переменные res1 и res2, что тоже, похоже, помогло, хотя, возможно, мне повезло и для его анализа был использован более быстрый сервер. переписать шаблон {{ год в других календарях }} кажется хорошей идеей. Frietjes ( разговор ) 15:08, 4 июля 2013 (UTC)
- Я не думаю, что тот факт, что отображаемые тестовые примеры имеют какое-либо отношение к этой правке . В отличие от использования тройных фигурных скобок в викитексте, присвоение подобных переменных в Lua почти не требует ресурсов, поэтому вы можете пойти дальше и сделать это, если это облегчит чтение кода. Фактически, прирост производительности в Lua по сравнению с функциями синтаксического анализатора настолько велик, что совсем не сложно добавить проверки ввода для всех ваших функций или использовать метамодули, такие как Module: HtmlBuilder . В некоторых ситуациях производительность имеет значение, но обычно важнее удобочитаемость и ремонтопригодность кода. Best - г-н Страдивари ♪ доклад ♪ 14:15, 5 июля 2013 (UTC)
- хорошо знать. у меня сложилось впечатление, что если я получаю ошибку сценария нехватки времени, она часто исчезает при второй попытке сохранить страницу. Итак, похоже, что сервер кешировал код, и во второй раз он работал быстрее. в любом случае, любые улучшения в исполнении шаблона «год в других календарях», безусловно, улучшат ситуацию. еще раз спасибо. Frietjes ( разговорное ) 15:34, 5 июля 2013 (UTC)
- Я не думаю, что тот факт, что отображаемые тестовые примеры имеют какое-либо отношение к этой правке . В отличие от использования тройных фигурных скобок в викитексте, присвоение подобных переменных в Lua почти не требует ресурсов, поэтому вы можете пойти дальше и сделать это, если это облегчит чтение кода. Фактически, прирост производительности в Lua по сравнению с функциями синтаксического анализатора настолько велик, что совсем не сложно добавить проверки ввода для всех ваших функций или использовать метамодули, такие как Module: HtmlBuilder . В некоторых ситуациях производительность имеет значение, но обычно важнее удобочитаемость и ремонтопригодность кода. Best - г-н Страдивари ♪ доклад ♪ 14:15, 5 июля 2013 (UTC)
- благодарю вас! Я удаляю промежуточные переменные res1 и res2, что тоже, похоже, помогло, хотя, возможно, мне повезло и для его анализа был использован более быстрый сервер. переписать шаблон {{ год в других календарях }} кажется хорошей идеей. Frietjes ( разговор ) 15:08, 4 июля 2013 (UTC)
Шаблон разговора Lua
На данный момент у нас есть шаблон {{ lua talk }} для использования на страницах обсуждения шаблонов, преобразованных в Lua. Однако я думаю, что это менее эффективно, чем могло бы быть. Как насчет расширения функции шаблона, чтобы мы также могли размещать его в верхней части страниц шаблона / документа? Таким образом было бы сразу очевидно, какие шаблоны были преобразованы, и это помогло бы рекламировать тот факт, что у нас есть доступный новый аккуратный язык программирования и что нам нужны люди для преобразования существующих шаблонов. Мы также могли бы использовать шаблон для автоматического добавления шаблонов на основе Category: Lua, чтобы упростить отслеживание преобразованных шаблонов. Что думают люди? - Г-н Страдивари, выступление, 12:54, 10 июля 2013 г. (UTC)
- Хорошая идея, я поддерживаю это, - Козуч ( разговор ) 09:05, 19 июля 2013 г. (UTC)
- Спасибо! Собственно, вчера я реализовал это во всех своих модульных шаблонах. См., Например, Шаблон: Для цикла . Я пройдусь и сделаю еще несколько, оставив здесь ссылку на случай, если люди захотят прокомментировать. - Г-н Страдивари, выступление 09:45, 19 июля 2013 г. (UTC)
- Я просмотрел и добавил {{ lua }} примерно на половину страниц в Категории: шаблоны на основе Lua (от A до O). Если нет возражений, все остальное я сделаю в ближайшие дни. - Г-н Страдивари, выступление, 11:07, 19 июля 2013 г. (UTC)
- Улучшение. Можно ли разрешить исключение кота для подкатегории, например Category: Lua Шаблоны на основе строк (существующие) или Category: математические шаблоны Lua . У меня нет актуального запроса на такую категорию. - Депип ( разговор ) 23:25, 19 июля 2013 г. (UTC)
- Хорошая идея, и готово. Я подумал, что нам, вероятно, тоже нужно было это сделать. - Г-н Страдивари, выступление ♪ 03:33, 20 июля 2013 г. (UTC)
- Улучшение. Можно ли разрешить исключение кота для подкатегории, например Category: Lua Шаблоны на основе строк (существующие) или Category: математические шаблоны Lua . У меня нет актуального запроса на такую категорию. - Депип ( разговор ) 23:25, 19 июля 2013 г. (UTC)
- Я просмотрел и добавил {{ lua }} примерно на половину страниц в Категории: шаблоны на основе Lua (от A до O). Если нет возражений, все остальное я сделаю в ближайшие дни. - Г-н Страдивари, выступление, 11:07, 19 июля 2013 г. (UTC)
- Спасибо! Собственно, вчера я реализовал это во всех своих модульных шаблонах. См., Например, Шаблон: Для цикла . Я пройдусь и сделаю еще несколько, оставив здесь ссылку на случай, если люди захотят прокомментировать. - Г-н Страдивари, выступление 09:45, 19 июля 2013 г. (UTC)
Заголовок Lua: неполный список модулей
У нас есть {{ WikiProject Lua / header }}, который делает вкладки заголовков (я начал) . Теперь вкладка «Модули» не показывает все модули и не имеет ссылки «следующая страница». Может ли кто-нибудь сделать приятную настройку SpecialPages? - Депип ( разговор ) 23:30, 19 июля 2013 г. (UTC)
- Есть {{ Alpha prefix pages }}, но если бы мы использовали это, то модули, начинающиеся с не буквенно-цифровых символов, не были бы в списке. Возможно, это было бы лучше, чем если бы половина модулей вообще не отображалась. - Г-н Страдивари, выступление, 12:05, 26 июля 2013 г. (UTC)
Эти модули делают то же самое?
Действительно ли Module: WikiLink и voy: ru: Module: Wikilinks стремятся к одному и тому же? Если это так, я могу добавить Module: WikiLink к d: Q14746829 . Спасибо. Это я здесь t / c 15:08, 3 сентября 2013 г. (UTC)
- Извините за очень поздний ответ. Ответ - нет, они действительно делают совершенно разные вещи. Вероятно, они не должны входить в одну и ту же запись Викиданных. - Г-н Страдивари ♪ выступление ♪ 14:27, 7 октября 2013 г. (UTC)
- Спасибо ! Это я здесь t / c 17:02, 10 октября 2013 г. (UTC)
Проблема с Scribunto, когда на выходе есть предварительные теги
Должен ли модуль делать что-то умное, чтобы выводить теги? Я хочу вывести вики-текст следующим образом:
Первая строка.Вторая линия.
Раньше я делал это, и это работало хорошо, но когда текст между тегами более разнообразен, что-то ломается. Очень простой тест:
- Модуль: Sandbox / Johnuniq / testpre ∙ выводит некоторый фиксированный текст в предварительных тегах.
- Обсуждение модуля: Sandbox / Johnuniq / testpre ∙ current content
{{#invoke:sandbox/Johnuniq/testpre|main}}
- Обсуждение модуля: Sandbox / Johnuniq / grosstonnage ∙ created with content
{{subst:#invoke:sandbox/Johnuniq/testpre|main}}
Результат №2 нарушен - первая строка включает в себя работающую вики-ссылку (не должно быть внутри pre, но могло бы произойти, если бы в начале строки был один пробел, без pre). Результат №3 работает правильно. Это проблема в моем модуле или в Scribunto? То, что я пытаюсь сделать, намного сложнее, см. Модуль: Convert / makeunits , но это та же проблема. Johnuniq ( разговор ) 09:37, 7 октября 2013 (UTC)
- Я тоже это замечал. Я согласен с тем, что это похоже на то, что, вероятно, не должно происходить - я предлагаю зарегистрировать ошибку в bugzilla и посмотреть, что говорят разработчики. Тем временем, чтобы получить желаемый результат, вы можете либо предварительно обработать текст с помощью frame: preprocess, либо использовать mw.text.nowiki в строке между тегами. (Функция nowiki избегает HTML-сущностей, но предварительная обработка - нет.) - Г-н Страдивари, выступление, 11:38, 7 октября 2013 г. (UTC)
- Это не ошибка.
имеющий эффект
обрабатывается как теги расширения (
само по себе тоже). И, как указано в документации , теги расширения не обрабатываются в викитексте, возвращаемом Scribunto, поэтому вы получаететег HTML, а не
тег викитекст.
- И да, поскольку
он обрабатывается как тег расширения, вы можете сделать
если вы действительно хотели, хотя использование mw.text.nowiki могло бы быть лучше. Anomie ⚔ 18:39, 7 октября 2013 г. (UTC)frame : extensionTag ( 'pre' , html , {} )
- Спасибо всем. Я поэкспериментировал с четырьмя методами - см . Обсуждение модулей: Sandbox / Johnuniq / testpre, где показаны все упомянутые выше методы. Только «mw.text.nowiki (plain_text) в тегах» полностью сохраняет текст (другие отображают «& nbsp;» как единый неразрывный пробел, что и делает per). Другой незначительный интерес заключается в том, что этот метод сохраняет символы табуляции в тексте, в то время как другие - нет. По поводу документов Scribunto: в целом они очень хороши, но необходимо еще тридцать строк, чтобы объяснить значение некоторых из более эзотерических моментов. Johnuniq ( разговор ) 01:37, 8 октября 2013 (UTC)
- Это не ошибка.
Еще одна тестовая система
Любой, кто интересуется шаблонами тестирования, может захотеть попробовать Module: Convert / tester, который позволяет легко определять сотни тестов. Система сравнивает фактический вывод шаблона с фиксированным текстом и подходит только для достаточно коротких шаблонов и результатов, поскольку каждый шаблон и его ожидаемый результат должны быть в одной строке. Если эти ограничения не являются проблемой, новый тестер предоставляет удобный способ настройки тестов на любой странице, например:
{{convert | 12 | m}} 12 метров (39 футов){{age | 1989 | 7 | 23 | 2003 | 7 | 14}} 13{{возраст в днях | 2007 | 5 | 24 | 2008 | 4 | 23}} 335
Если бы вышеперечисленные тесты были на странице «Шаблон: пример / тесты», то в следующем примере была бы вставлена таблица, показывающая результаты раскрытия каждого шаблона и сравнения его вывода с ожидаемым текстом.
{{#invoke: convert / tester | run_tests | page = Template: Example / tests}}
Johnuniq ( разговор ) 06:53, 11 октября 2013 (UTC)
- Это действительно выглядит неплохо. Я могу использовать это в будущем. - Г-н Страдивари, выступление, 13:56, 13 октября 2013 г. (UTC)
- Я добавил
make_tests
иcheck_sandbox
. Первый генерирует ожидаемый результат в требуемом формате, а второй сравнивает модуль с его версией песочницы, см. Документ . Johnuniq ( разговор ) 00:54, 14 октября 2013 (UTC)
- Я добавил
GetURL?
Разве версия Lua для Википедии не поддерживает функцию GetURL (или ее эквивалент)? Когда я его использую, я получаю сообщение об ошибке. - Предшествующий неподписанный комментарий добавлен Ryn78 ( обсуждение • вклад ) 03:27, 13 октября 2013 г. (UTC)
- В Scribunto есть множество функций для обработки URL-адресов (так называется версия Lua для Википедии). Что именно вы собираетесь делать? - Г-н Страдивари, выступление, 13:56, 13 октября 2013 г. (UTC)
- Scribunto не включает функцию для получения произвольного URL-адреса. GetURL также не отображается в стандартном Lua; по-видимому, это что-то добавленное любой другой платформой, использующей Lua, с которой вы привыкли работать. Scribunto действительно включает функции для доступа к содержимому страниц в локальной вики, а также для создания и анализа URL-адресов. Anomie
⚔ 20:35, 13 октября 2013 г. (UTC)
- Включает ли он функции для получения имени пользователя и / или IP-адреса человека, обращающегося к странице? Ryn78 ( разговорное ) 20:58, 13 октября 2013 (UTC)
- Нет. Scribunto запускается во время синтаксического анализа страницы, и посетители получают максимально возможное количество кэшированных страниц. См. Mw: Extension: Справочное руководство Scribunto / Lua, чтобы узнать, что включено. Anomie ⚔ 22:04, 13 октября 2013 г. (UTC)
- Включает ли он функции для получения имени пользователя и / или IP-адреса человека, обращающегося к странице? Ryn78 ( разговорное ) 20:58, 13 октября 2013 (UTC)
Вызов модуля из другого модуля?
Может ли модуль вызвать другой модуль? Я не видел упоминания об этом в руководстве. - greenrd ( обсуждение ) 10:04, 19 октября 2013 г. (UTC)
- Да, это так - вам нужна функция require . :) - Mr. Stradivarius ♪ talk ♪ 10:16, 19 октября 2013 (UTC)
Использовать табуляцию вместо четырех пробелов?
Я начал новое обсуждение этого вопроса на лекции в Википедии: Руководство по стилю Lua # CodeEditor переключился на вкладки . Пожалуйста, прокомментируйте там, если вам интересно. - Г-н Страдивари, выступление 01:15, 29 октября 2013 г. (UTC)
Безопасность?
Насколько хорошо Scribunto защищает себя от DoS или, возможно, XSS, но особенно от DoS, поскольку мы имеем дело с языком, полным по Тьюрингу? Я провел несколько локальных тестов, и кажется, что его довольно легко вывести из строя, но опять же, я все равно запускаю его в нестабильной среде, поэтому он может не отражать, как все работает здесь, в Википедии. Тот факт, что даже IP-пользователь может редактировать пространство имен модуля, предполагает, что оно должно быть действительно стабильным и безопасным. Были ли еще какие-то серьезные инциденты? Гинсулофт ( разговор ) 13:39, 30 октября 2013 (UTC)
- Я понимаю, что существует ряд мер безопасности. Например, возникает ошибка, если Lua исчерпывается выделенный объем памяти (не уверен, сколько именно), и возникает другая ошибка, если общее время выполнения сценария Lua (или, возможно, всех сценариев Lua на странице ?) больше 10 секунд. Я столкнулся с обоими из них при написании кода Scribunto здесь. Другие редакторы, более знакомые с внутренним устройством Scribunto, могут дать вам более конкретные указания. - Г-н Страдивари ♪ выступление ♪ 14:27, 30 октября 2013 г. (UTC)
- О, так это MemoryLimit и CPULimit документированы здесь . Надеюсь, это для каждой страницы, а не для каждого пользователя, иначе это было бы довольно серьезным DoS! Очевидно, пока что это только для Linux («принудительно с использованием ulimit»). Они должны перенести его на Windows, чтобы я мог больше с ним поиграться; вот совет на тот случай, если разработчики читают это: GetProcessTimes () . Гинсулофт ( разговор ) 15:01, 30 октября 2013 (UTC)
- Ограничения указаны на страницу. Для движка «luastandalone», да, они принудительно применяются с помощью ulimit, который недоступен в Windows, в то время как для движка «luasandbox» ограничения применяются для всех платформ. Не стесняйтесь отправлять код для реализации механизма, подобного ulimit, в Windows .
- Что касается XSS, модули Scribunto выводят вики-текст, поэтому через Scribunto невозможно выполнять какие-либо XSS-операции, что также невозможно в вики-тексте. Если вы найдете способ, сообщите об этом как об ошибке безопасности . Бьорш (WMF) ( разговор ) 17:31, 30 октября 2013 (UTC)
- О, так это MemoryLimit и CPULimit документированы здесь . Надеюсь, это для каждой страницы, а не для каждого пользователя, иначе это было бы довольно серьезным DoS! Очевидно, пока что это только для Linux («принудительно с использованием ulimit»). Они должны перенести его на Windows, чтобы я мог больше с ним поиграться; вот совет на тот случай, если разработчики читают это: GetProcessTimes () . Гинсулофт ( разговор ) 15:01, 30 октября 2013 (UTC)
formatnum
в настоящее время в Модуле: Исторические популяции я использую несколько запутанный метод для доступа к 'formatnum', который включает передачу 'frame' и использование 'callParserFunction'. Есть лучший способ это сделать? Спасибо. Frietjes ( разговорное ) 16:17, 30 октября 2013 (UTC)
- Да, это будет mw.language: formatnum . Наслаждаться. :) - Мистер Страдивари ♪ доклад ♪ 16:40, 30 октября 2013 г. (UTC)
- Отлично. Я предполагаю, что parseFormattedNumber совпадает с {{#formatnum: ... | R}}? Я это попробую. Спасибо. Frietjes ( разговорное ) 17:01, 30 октября 2013 (UTC)
- тьфу, похоже, что formatNum требует ввода числа, а функция синтаксического анализа использует строку, но она работает! Спасибо. Frietjes ( разговорное ) 17:27, 30 октября 2013 (UTC)
Создайте ссылку
Я пытаюсь создать веб-ссылку, объединив 2 строки и избегая отображения полной ссылки в информационном окне. Итак, идея следующая:
self.text = self.text .. '' .. args.value .. ' '
Но у lua есть особый способ обработки веб-ссылок, и сейчас невозможно использовать веб-адрес как строку. Есть ли у кого-нибудь идеи, как кодировать эту функцию? Снайпр ( разговор ) 07:52, 31 октября 2013 (UTC)
- Это не проблема Lua, это проблема вики-текста - вы не можете использовать
...
теги в вики-тексте. Вместо этого вам нужно использовать формат wikitext для внешних ссылок, например:
'[' .. args . ссылка .. '' .. args . значение .. ']'
- Посмотрите, работает ли это для вас. Best - Мистер Страдивари в туре ♪ обсуждение ♪ 08:04, 31 октября 2013 г. (UTC)
- Кроме того, посмотрите Help: Link, чтобы получить дополнительную помощь по синтаксису ссылок вики-текста. - Мистер Страдивари в туре ♪ выступление ♪ 08:09, 31 октября 2013 г. (UTC)
- Оно работает. спасибо Snipre ( разговор ) 08:20, 31 октября 2013 (UTC)
- вас также может заинтересовать Module: URL , который выполняет то же самое, что и то, что вы описываете. Frietjes ( разговорное ) 17:57, 31 октября 2013 (UTC)
- Оно работает. спасибо Snipre ( разговор ) 08:20, 31 октября 2013 (UTC)
Ифексист
Есть ли метод LUA для #ifexist, который не генерирует ложные входящие ссылки? Об этом говорилось в беседе о шаблоне: Историческое население . Самую серьезную проблему я обошел, но почему-то метод генерирует входящие ссылки на несуществующие статьи. Например, отметьте Special: WhatLinksHere / 3000 United States Census . Спасибо! Пластикспорк ―Œ (обсуждение) 22:08, 2 ноября 2013 (UTC)
- #ifexist также генерирует "ложные" входящие ссылки. Именно так MediaWiki отслеживает, что страница, использующая #ifexist, зависит от существования целевой страницы. Anomie ⚔ 01:51, 3 ноября 2013 (UTC)
- Чтобы узнать больше, см. Объяснение Anomie на VPT здесь, что любой метод проверки существования страницы (например,
mw.title.new(page).exists
в Module: Historical Populations ) будет генерировать запись «какие ссылки здесь», чтобы тест можно было повторно запустить, если существование страницы изменится. . Johnuniq ( разговор ) 02:25, 3 ноября 2013 (UTC)
Модуль: Тип страницы
Я создал Module: Pagetype , замену {{ pagetype }}, и я думаю об обновлении шаблона до версии Lua позже на этой неделе. Версия Lua имеет некоторые отличия от текущего шаблона, поэтому я хотел бы получить комментарии других, прежде чем делать переход. Пожалуйста, дайте мне знать, что вы думаете о шаблоне: Pagetype # Module: Pagetype . - Г-н Страдивари ♪ выступление ♪ 14:16, 4 ноября 2013 г. (UTC)
Замена для {{ unsubst }}
Если вы не знаете, {{ unsubst }} (вместе с несколькими другими шаблонами) используется для того, чтобы ввести {{ subst: citation required }} в статью, {{Citation needed| date=November 2013}}
а не выгрузить весь код шаблона в статью. .
Итак, сегодня вечером я собрал Module: Unsubst , который можно использовать для того же, без всех ограничений {{ unsubst }}. Пожалуйста, взгляните, критикуйте, протестируйте и дайте мне знать, если что-то должно измениться, прежде чем я посмотрю на развертывание этого в некоторых шаблонах обслуживания. Anomie ⚔ 03:36, 1 ноября 2013 (UTC)
- Многие вещи находятся далеко у меня над головой, но мне интересно, было ли задумано следующее:
если string.find ( v , '=' , 1 , true ), то - вероятно, что-то вроде 1 = foo = bar, нам нужно сделать это как именованный arg break end
- Если встретится «1 = foo = bar», цикл завершится без параметров обработки 2, 3, ... Не похоже, чтобы что-то случилось, но логика кажется странной. Johnuniq ( разговор ) 07:00, 1 ноября 2013 (UTC)
- Нет, он будет обрабатывать их точно так же, как именованные параметры, а не нумерованные параметры. - Г-н Страдивари, выступление 07:41, 1 ноября 2013 г. (UTC)
- Конечно, и, как я уже сказал, ничего плохого не происходит, но логика странная - зачем нужен цикл, обрабатывающий нумерованные параметры, если он завершится, если первым таким параметром будет «foo = bar»? Если можно пропустить параметры 2 и 3, зачем вообще нужен цикл для нумерованных параметров? Johnuniq ( разговор ) 09:16, 1 ноября 2013 (UTC)
- Если пользователь входит
{{subst:foo|bar|baz}}
, было бы неплохо вывести эквивалент, а не{{foo|1=bar|2=baz}}
потому, что последнее не то, что пользователи ожидают. Но если пользователь входит{{subst:foo|bar|baz|3=a=b}}
, мы должны сделать последнее с явным указанием,3=
и мы должны сделать все последующие нумерованные параметры таким же образом. Anomie ⚔ 11:39, 1 ноября 2013 г. (UTC)- Спасибо - я задумался над сопутствующими вопросами при выполнении
frame:expandTemplate(t)
. Я думаю, что урок состоит в том, что если шаблон вызывается с помощью{{foo|aaa|bbb|3=x=y|ccc}}
, шаблон никогда не видит "x=y
", потому что параметр 3 заменяется на "ccc
", поэтому, если этот модуль получает "x=y
" в качестве параметра 3, для любых следующих пронумерованных параметров потребуется префикс, чтобы избежать замены знак "x=y
", который, поскольку он был замечен, не был заменен на практике. Johnuniq ( разговор ) 06:56, 2 ноября 2013 (UTC)- Я не думаю, что мы можем что-то с этим поделать или должны что-то делать. Пользователь, подставивший шаблон с этим кодом, потеряет свой "
x=y
" независимо от того, использовал ли шаблон Module: Unsubst или нет. И ограничения в модуле, вызванные моей системой шаблонов MediaWiki, не кажутся достаточно серьезными, чтобы перевесить преимущества использования модуля. Я действительно задавался вопросом, будут ли пользователи сбиты с толку порядком, в котором параметры, которые они вводят, меняются местами, но это лучше, если некоторые из них вообще исчезнут (как в текущем {{ unsubst }}), или сбросить загрузку кода шаблона в их статье. Проблем с кодом не заметил - очень хорошая работа Anomie. :) - Mr. Stradivarius ♪ talk ♪ 11:50, 2 ноября 2013 (UTC)
- Я не думаю, что мы можем что-то с этим поделать или должны что-то делать. Пользователь, подставивший шаблон с этим кодом, потеряет свой "
- Спасибо - я задумался над сопутствующими вопросами при выполнении
- Если пользователь входит
- Конечно, и, как я уже сказал, ничего плохого не происходит, но логика странная - зачем нужен цикл, обрабатывающий нумерованные параметры, если он завершится, если первым таким параметром будет «foo = bar»? Если можно пропустить параметры 2 и 3, зачем вообще нужен цикл для нумерованных параметров? Johnuniq ( разговор ) 09:16, 1 ноября 2013 (UTC)
- Нет, он будет обрабатывать их точно так же, как именованные параметры, а не нумерованные параметры. - Г-н Страдивари, выступление 07:41, 1 ноября 2013 г. (UTC)
- Так что, если кто-то хочет попробовать, я применил его к Template: Citation required / sandbox . Но поскольку изменение Gerrit 93019 фактически было объединено быстро, я думаю, что подожду до 14 ноября (когда я смогу использовать mw.isSubsting () вместо взлома frame: preprocess), чтобы развернуть его вживую. Anomie ⚔ 02:50, 7 ноября 2013 (UTC)
Стиль шаблона Lua
Пользователь: У нас с Wnt возникли небольшие разногласия по поводу параметра типа шаблона {{ lua }}. Wnt считает, что шаблон должен использовать тип «стиль» (с желтым фоном), и я думаю, что он должен использовать тип «уведомление» (с серым фоном). Я знаю, что здесь мы довольно далеко зашли на территорию WP: DEW , но я был бы признателен, если бы люди могли прокомментировать обсуждение на Template talk: Lua # Style . - Г-н Страдивари ♪ выступление ♪ 09:47, 11 ноября 2013 г. (UTC)
Новая функция обзора
Я обновил Википедию: Lua / Модули / Обзор, используя модуль Lua для создания таблицы из различных простых данных вырезания и вставки. Надеюсь, это снова будет полу-полезным. :) Wnt ( разговор ) 08:16, 20 ноября 2013 (UTC)
содержимое страницы как импорт
Может ли Lua взять содержимое Wiki-страницы и повторно обработать его? Например, я могу обработать сообщения на странице обсуждения и добавить дополнительное форматирование. - Янтресман ( разговор ) 18:29, 7 декабря 2013 (UTC)
- Как вы можете прочитать здесь: mw: Extension: Scribunto / Lua_reference_manual # Returning_text модуль просто возвращает строку, поэтому он не может редактировать существующий текст на странице. В любом случае вы можете прочитать содержимое любой страницы с помощью библиотеки Title и getContent () и повторно обработать его на другой (пустой) странице (только с модулем #invoke:). - Ротпункт ( разговор ) 20:07, 7 декабря 2013 (UTC)
Плохая идея
Раньше я был редактором шаблонов выше среднего, внося значительный вклад даже в такие сложные шаблоны, как Ambox и Fix. Это стало возможным, потому что язык вики-разметки был очень интуитивно понятным и легким для понимания даже непрофессионала. Теперь, с этим новым языком LUA, редактирование шаблонов становится все более и более прерогативой технических специалистов. Я очень сожалею об этом. Я мог бы продолжить работу над этими и другими интересными шаблонами. Дебрессер ( разговор ) 10:57, 8 декабря 2013 (UTC)
- Всегда было разделение между логикой и представлением данных. Представление данных - это поле шаблонов (шаблон идеально подходит для инфобокса, навигационных панелей, ...). Логика - это область lua и модулей. В любом фреймворке / языке писать сложную логику на языке шаблонов неправильно. - Ротпункт ( разговор ) 11:37, 8 декабря 2013 г. (UTC)
- @ Debresser Мне интересно, что вы так на это смотрите. Я согласен с тем, что для простых шаблонов без использования Lua легче увидеть, что именно происходит; но более сложные шаблоны без Lua выглядят кошмаром: задействовано так много скобок, что даже простые изменения могут потребовать серьезной концентрации, чтобы добиться правильного результата. - Нджардарлогар ( разговор ) 13:39, 8 декабря 2013 г. (UTC)
- Эти скобки легко пересчитать, как слои союза. :) И раскладка (отступы) тоже полезный показатель, как обычно в программировании. Дебрессер ( разговор ) 14:45, 8 декабря 2013 (UTC)
- @ Debresser Мне интересно, что вы так на это смотрите. Я согласен с тем, что для простых шаблонов без использования Lua легче увидеть, что именно происходит; но более сложные шаблоны без Lua выглядят кошмаром: задействовано так много скобок, что даже простые изменения могут потребовать серьезной концентрации, чтобы добиться правильного результата. - Нджардарлогар ( разговор ) 13:39, 8 декабря 2013 г. (UTC)
- Я думаю, что это первый раз, когда я когда-либо слышал, что викитекст интенсивно использует функции синтаксического анализатора, описанные как «очень интуитивно понятные и легкие для понимания», а не «почти такие же плохие, как ебать мозги ». После знакомства с новым синтаксисом Lua становится легче следовать, и он дает нам огромные преимущества, такие как замена старых версий Template: str len и Template: str sub и их различных подшаблонов.
- К сожалению, увеличение мощности, доступной Lua, вызвало некоторую особенность некоторых более сложных шаблонов. И всем-таки можно написать непонятный код (Ото, функции синтаксического анализа не дают вам вариант писать непонятный код, они требуют его) . У нас действительно есть Help: Lua для новичков , но я не совсем квалифицирован, чтобы сказать, действительно ли он полезен для новичков, или исправить проблемы, которые могут возникнуть. Если вы хотите взять на себя задачу написать лучшую справочную страницу для новичков, я (и я уверен, что другие здесь) были бы очень рады ответить на любые ваши вопросы. Anomie
⚔ 13:49, 8 декабря 2013 г. (UTC)
- @Rotpunkt Я понимаю вашу точку зрения, но не думайте, что такие шаблоны, как Fix или Ambox, являются скорее логикой, чем представлением.
- @Anomie Спасибо за ваше предложение. Сомневаюсь, что в ближайшее время у меня будет время принять ваше предложение, но спасибо. Я действительно находил WikiText интуитивно понятным большую часть времени и чувствовал себя очень хорошо с ним. Возможно, это связано с Паскалем или HTML - двумя языками, с которыми я в некоторой степени знаком. Дебрессер ( разговор ) 14:43, 8 декабря 2013 (UTC)
Информационное окно пространства имен
Обязательно ли вверху справа информационное окно «Пространства имен Википедии»? Я бы предпочел полезные ссылки на LUA. Что-то среднее между ресурсами, документацией и полезными ссылками. - Янтресман ( разговор ) 13:14, 8 декабря 2013 (UTC)
Итерация библиотечных функций
Я могу получить аргументы, используя объект frame.args, переданный скрипту с помощью функции итератора:
для имени , значения в парах ( frame . args ) do result = result .. ' \ n *' .. name .. ':' .. value end
Но, похоже, это не работает для такой библиотеки, как mw.site. *
для имени , значения в парах ( mw . site ) do result = result .. ' \ n *' .. name .. ':' .. value end
Я хотел бы узнать, какие параметры библиотеки mw.site доступны, и распечатать их значение, без необходимости указывать каждый из них по отдельности, т.е. mw.site.currentVersion, mw.site.scriptPath и т. д. и т. д. - Янтресман ( доклад ) 14:50, 8 декабря 2013 г. (UTC)
Эээ, вы хотели опубликовать одно и то же дважды?(теперь исправлено)- Когда я пробую цитируемый код, выдается сообщение об ошибке: «Ошибка Lua в вводе консоли в строке 7: попытка объединить локальное« значение »(значение таблицы)». Это потому, что Lua не будет автоматически преобразовывать что-либо, кроме строки или числа. Попробуйте использовать вместо этого, или, если вы действительно хотите пофантазировать, вы можете посмотреть на реализацию mw.logObject . Anomie ⚔ 15:42, 8 декабря 2013 г. (UTC)
tostring( value )
- Ой, теперь исправлено. Спасибо за это. Имеет смысл. Где я могу найти сообщение об ошибке? - Янтресман ( разговор ) 16:12, 8 декабря 2013 (UTC)
- Если вы выполнили это с помощью вызова где-нибудь на странице, это должно появиться, когда вы нажмете на отображаемую «Ошибка сценария». Если вы сделаете это в консоли отладки внизу любой страницы модуля, он появится там. Anomie
⚔ 16:43, 8 декабря 2013 г. (UTC)
- Легко, когда вы знаете, как, никогда не знали, что "Ошибка сценария" была ссылкой, а консоль отладки очень полезна! - Янтресман ( разговор ) 17:44, 8 декабря 2013 г. (UTC)
- Если вы выполнили это с помощью вызова где-нибудь на странице, это должно появиться, когда вы нажмете на отображаемую «Ошибка сценария». Если вы сделаете это в консоли отладки внизу любой страницы модуля, он появится там. Anomie
⚔ 16:43, 8 декабря 2013 г. (UTC)
- Ой, теперь исправлено. Спасибо за это. Имеет смысл. Где я могу найти сообщение об ошибке? - Янтресман ( разговор ) 16:12, 8 декабря 2013 (UTC)
Рекурсивная итерация библиотечных функций mw
Это подходящее место для запросов программирования Lua?
Мой новый тестовый модуль Модуль: Песочница / iantresman / Песочница / архив / mw.recursive печатает «frame.args» аргументы , переданные ему, но не рекурсивно печати « mw.site » библиотечные функции / таблицы при обращении с пользователем: Iantresman / песочница / архив / mw.recursive . Например, он не печатает строку «mw.site.currentVersion», а только две строки таблицы «mw.site.stats», что может означать, что он не рекурсивно повторяется должным образом, или, возможно, что-то еще. Есть ли программный мастер, который может помочь увидеть, сделал ли я что-нибудь глупое? - Янтресман ( разговор ) 11:31, 9 декабря 2013 (UTC)
- Он неправильно распечатывает переданные ему аргументы "frame.args", он выводит только один. В вашем цикле вы возвращаетесь после первой пары ключ / значение, вместо того, чтобы создавать строку со всеми парами ключ / значение и возвращать объединенную строку. Anomie
⚔ 12:41, 9 декабря 2013 (UTC)
- Я взломал его, чтобы заставить работать базовую рекурсию, но он дважды возвращает значение f по причинам, в которых я не совсем уверен. Он также взрывается, когда вы пытаетесь использовать его с метатаблицами; при использовании с mw.site я получал ошибку «недостаточно памяти». - Г-н Страдивари, выступление, 13:01, 9 декабря 2013 г. (UTC)
- Большое спасибо за это. Как вы думаете, это ошибка в Lua, возможно, в сборке мусора. Я бы не подумал, что память будет проблемой. Должен ли я сообщить об этом Mediawiki? - Янтресман ( разговор ) 14:36, 9 декабря 2013 (UTC)
- Нет. Проблема в том, что
mw.site.namespaces[0].talk.subject
это ссылка наmw.site.namespaces[0]
самого себя, и то же самое для множества других свойств. Посмотрите, как mw.logObject отслеживает уже просмотренные подтаблицы. Хотя даже это не работает с объектами mw.title, потому что они создают новый титровальный объект для некоторых из своих свойств. Anomie ⚔ 19:11, 9 декабря 2013 (UTC)- Есть ли смысл в том, что они ссылаются на себя? Есть ли способ проверить это и предпринять альтернативные действия? - Янтресман ( разговор ) 01:33, 11 декабря 2013 (UTC)
- Это очень удобно в некоторых ситуациях. Например, чтобы получить ссылку для редактирования базовой страницы, все, что вам нужно сделать, это
mw.title.new(pagename).basePageTitle:fullUrl{action='edit'}
. Для этого потребовалось бы еще несколько строк кода, если бы метатаблицы не были настроены. Чтобы проверить таблицы, которые ссылаются на себя подобным образом, вы можете попробоватьgetmetatable()
предпринять альтернативное действие, если метатаблица существует. (Хотя даже это не сработает, если__metatable
в метатаблице настроено поле.) - Г-н Страдивари, выступление, 04:17, 11 декабря 2013 г. (UTC)
- Это очень удобно в некоторых ситуациях. Например, чтобы получить ссылку для редактирования базовой страницы, все, что вам нужно сделать, это
- Есть ли смысл в том, что они ссылаются на себя? Есть ли способ проверить это и предпринять альтернативные действия? - Янтресман ( разговор ) 01:33, 11 декабря 2013 (UTC)
- Нет. Проблема в том, что
- Большое спасибо за это. Как вы думаете, это ошибка в Lua, возможно, в сборке мусора. Я бы не подумал, что память будет проблемой. Должен ли я сообщить об этом Mediawiki? - Янтресман ( разговор ) 14:36, 9 декабря 2013 (UTC)
- Я взломал его, чтобы заставить работать базовую рекурсию, но он дважды возвращает значение f по причинам, в которых я не совсем уверен. Он также взрывается, когда вы пытаетесь использовать его с метатаблицами; при использовании с mw.site я получал ошибку «недостаточно памяти». - Г-н Страдивари, выступление, 13:01, 9 декабря 2013 г. (UTC)
Вызов другого модуля
Могут ли модули «вызывать» другие модули? Я вижу, что могу получить доступ к библиотекам Mediawiki так же просто, как "mw.stat", доступны ли модули в Википедии так же легко? Я хотел бы включить некоторые функции модуля: Page в свой модуль, не изобретая велосипед. - Янтресман ( разговор ) 00:06, 12 декабря 2013 (UTC)
- Да, в самом деле. Вам нужна функция require . В руководстве есть довольно хороший пример, но дайте мне знать, если что-то неясно. - Г-н Страдивари, выступление ♪ 01:00, 12 декабря 2013 г. (UTC)
- Хотя глядя на то, что на самом деле делает Module: Page , было бы лучше просто использовать объект mw.title и использовать его. Модуль: Страница - это просто модуль-оболочка для функций, доступных с объектами mw.title, и использование mw.title напрямую должно быть более быстрым и интуитивно понятным. Что именно вы собираетесь делать? Может, мы сможем помочь. :) - Mr. Stradivarius ♪ talk ♪ 03:27, 12 декабря 2013 (UTC)
- В этом есть смысл, хотя на самом деле я сейчас просто играю. - Янтресман ( разговор ) 10:52, 12 декабря 2013 (UTC)
- Хотя глядя на то, что на самом деле делает Module: Page , было бы лучше просто использовать объект mw.title и использовать его. Модуль: Страница - это просто модуль-оболочка для функций, доступных с объектами mw.title, и использование mw.title напрямую должно быть более быстрым и интуитивно понятным. Что именно вы собираетесь делать? Может, мы сможем помочь. :) - Mr. Stradivarius ♪ talk ♪ 03:27, 12 декабря 2013 (UTC)
Замена аргумента
Это работает для меня:
вернуться в строку ( mw . site . currentVersion )
Это не так, и я надеялся, что это будет эквивалентно:
a = "currentVersion" вернуть строку ( mw . site . a )
И как мне сделать обратное и преобразовать mw.site.currentVersion в строку «mw.site.currentVersion»? - Янтресман ( разговор ) 14:56, 12 декабря 2013 (UTC)
- Вам нужно сделать это:
a = "currentVersion" вернуть строку ( mw . site [ a ])
mw.site.a
фактически эквивалентенmw.site["a"]
, поэтому вы получаете строку "a", а не переменнуюa
. Обратный процесс немного сложнее, и мне придется подождать, пока я не буду печатать на своем телефоне. - Мистер Страдивари в турне ♪ выступление ♪ 15:07, 12 декабря 2013 г. (UTC)- Хорошо, теперь обратное. На самом деле, в случае с mw.site.currentVersion это невозможно, по крайней мере, не для всех. Если у вас есть текущая версия, и вы также знаете, что используете
mw.site
, то вы можете найти значение ключа таблицы, используяpairs
:
- Хорошо, теперь обратное. На самом деле, в случае с mw.site.currentVersion это невозможно, по крайней мере, не для всех. Если у вас есть текущая версия, и вы также знаете, что используете
local version = "1.23wmf6 (c138cf8)" для k , v в парах ( mw . site ) делать, если v == version, затем вернуть k end end
- Однако, если вы не знаете, что находитесь внутри
mw.site
, нет никакого способа сделать это. - Г-н Страдивари, выступление, 00:04, 13 декабря 2013 г. (UTC)- Спасибо за все, очень признателен. - Янтресман ( разговор ) 09:11, 13 декабря 2013 (UTC)
- И еще раз спасибо, я только что заметил настройки, которые вы сделали на моей странице песочницы / заголовков, которая дает довольно интересный результат. Большое спасибо. - Янтресман ( разговор ) 09:24, 13 декабря 2013 (UTC)
- Спасибо за все, очень признателен. - Янтресман ( разговор ) 09:11, 13 декабря 2013 (UTC)
- Однако, если вы не знаете, что находитесь внутри
- Я только что заметил следующее, используя подчеркивание вместо переменной для значения массива в "for _, property". Означает ли это, что переменная не используется, или знак подчеркивания имеет какое-то другое особое значение?
for _ , свойство в ipairs ( properties ) do result = result .. " \ n #" .. property .. ":" .. tostring ( currentTitle [ property ]) end
- Янтресман ( разговор ) 09:36, 13 декабря 2013 (UTC)
- Подчеркивания являются допустимыми переменными, и они обычно используются в качестве переменных-заполнителей, где переменная требуется, но на самом деле не используется. В этом случае ipairs возвращает ключ (1, 2, 3 и т. Д.) И значение ('id', 'interwiki', 'namespace' и т. Д.) Таблицы свойств, но нам нужно только значение. - Г-н Страдивари, выступление, 09:57, 13 декабря 2013 г. (UTC)
- Кроме того, я заметил, что вы вносили много тестовых изменений в этот модуль песочницы - на самом деле, вы можете протестировать свой код, не сохраняя страницу. Просто введите
=p.main()
в консоль отладки, и она запустит код, находящийся в настоящее время в окне редактирования. - Г-н Страдивари, выступление, 10:03, 13 декабря 2013 г. (UTC)- Я помню, как читал об окне консоли, но я не вижу его в последней версии Firefox 26. Похоже, нашел в Chrome. Я попытался перезапустить Firefox без надстроек и очистил его кеш. Также отмечу, что блок «Это страница модуля Scribunto» появляется на странице дважды (в Firefox). Мне нужно перейти в Chrome и посмотреть, не возникают ли проблемы с Firefox у кого-нибудь еще. - Янтресман ( разговор ) 12:05, 13 декабря 2013 г. (UTC)
- Теперь исправлено, это был редактор WikiEd , который я отключил. - Янтресман ( разговор ) 12:09, 13 декабря 2013 г. (UTC)
- Я помню, как читал об окне консоли, но я не вижу его в последней версии Firefox 26. Похоже, нашел в Chrome. Я попытался перезапустить Firefox без надстроек и очистил его кеш. Также отмечу, что блок «Это страница модуля Scribunto» появляется на странице дважды (в Firefox). Мне нужно перейти в Chrome и посмотреть, не возникают ли проблемы с Firefox у кого-нибудь еще. - Янтресман ( разговор ) 12:05, 13 декабря 2013 г. (UTC)
Если (Пользователь вошел в систему) / условное ветвление на основе имени пользователя?
Разрешает ли наша реализация доступ сценариям Lua к тому, вошел ли пользователь в систему или нет? Могут ли сценарии Lua получить доступ к имени пользователя, вошедшего в систему? - HectorMoffet ( разговор ) 11:05, 29 декабря 2013 г. (UTC)
- Нет. Мы можем сообщить имя последнего пользователя, который редактировал страницу, с помощью волшебного слова
{{REVISIONUSER}}
, но мы не можем сказать имя пользователя текущего пользователя или вошли ли они в систему. Если я правильно помню, есть функция доступный в MediaWiki, чтобы сообщить имя текущего пользователя, но он был отключен в английской Википедии из-за возможности злоупотребления. - Г-н Страдивари ♪ выступление ♪ 14:13, 29 декабря 2013 г. (UTC)- Не столько «злоупотреблять», сколько «нарушает кеширование». Хотя я не помню, есть ли эта функция на самом деле сейчас в MediaWiki или ее просто постоянно отклоняли на том основании, что это нарушит кеширование. (Это оставляет в стороне прежнее использование REVISIONUSER в уведомлениях об изменении, чтобы получить имя пользователя, вносящего изменения, которые были отключены без какой-либо конкретной причины, о которой я знаю.) Anomie ⚔ 16:08, 29 декабря 2013 г. (UTC)
- Спасибо за отзыв, Anomie & Mr. Stradivarius . У меня было ощущение, что кеширование сделает это принципиально невозможным.
- Следующий вопрос: как лучше всего отображать сообщение, которое увидят только вошедшие в систему пользователи (как требуется для Template: DraftChecker )? Следует ли это делать на стороне клиента или на стороне сервера?
- Шаблон: ShowOnlyToLoggedInUsers требует одну или две строки пользовательского javascript для выполнения этой работы, но, конечно, это может быть сделано и на стороне сервера. Преимущество JS в том, что он отлично работает с кешированием и требует установки только двух строк JS (и они уже написаны). Я менее знаком с нашей серверной архитектурой, поэтому не знаю, какой вариант лучше. HectorMoffet ( разговор ) 22:05, 29 декабря 2013 (UTC)
Как получить шаблоны, переданные в качестве параметров, без их замены?
Я пытаюсь реализовать {{ Горизонтальную временную шкалу }} как модуль. Синтаксис шаблона отправляет другой шаблон в качестве параметра. Есть ли предложения о том, как получить этот шаблон параметра в виде таблицы, а не замененной строки?
Например: {{example | row1 = {{template2 | height = 52}}}}
В приведенном выше примере мы можем получить row1 как frame.args.row1, но возможно ли получить высоту из row1. Например, как: frame.args.row1
Если это невозможно: предложите альтернативный метод реализации.
П: S Создание отдельного модуля для template2 в приведенном выше примере невозможно, потому что я пытаюсь уменьшить количество подстановок шаблонов, а написание отдельных модулей приведет к нарушению этой цели, - Джаяратина ( доклад ) 05:20, 24 декабря 2013 г. (UTC)
- Невозможно получить параметры в виде чего-либо, кроме строки. Когда вы запускаете #invoke, MediaWiki разворачивает весь викитекст в каждом из параметров #invoke перед их отправкой в Lua. Это означает, что Lua никогда не видит код
{{template2|height=52}}
; он видит только строку, выводимую в результате вызова шаблона. Чтобы обойти это, вам нужно будет реализовать оба шаблона в одном модуле (или вы можете сделать это в разных модулях и использовать функцию require , которая делает примерно то же самое). Трудно быть более конкретным, не зная больше о вашей ситуации. Какой шаблон вам нужно отправить на {{ Horizontal timeline }}? - Г-н Страдивари, выступление 05:43, 24 декабря 2013 г. (UTC)
- @ Г-н Страдивари : Спасибо за ответ. Шаблон следует отправить {{ Горизонтальное график }} может быть {{ Масштаб строки }} или {{ Временная шкала строки }} (который , в свою очередь , вызывает {{ Турник }}, {{ горизонтальный масштаб }} и {{ горизонтального масштаба / Текущий номер }}) Реализовать эти твемплейты очень просто. Именно таким способом получить эти коляски сложно. Вот рабочий пример (см. Код в режиме редактирования):
{{Horizontal timeline}}
- Даже если это невозможно, не могли бы вы подсказать, как реализовать такой шаблон, как модуль? Я не спрашиваю о технических деталях реализации графа и т. Д., Я спрашиваю о получении параметра от пользователя в шаблоне. Я имею в виду, есть ли способ получить группу или пару ключ-значение в одном параметре, как это сделано выше (row1, row2, row3). (Вид многомерного стола). - Джаяратхина ( разговор ) 07:02, 24 декабря 2013 г. (UTC)
- Это невозможно сделать именно так, как вы себе представляете. Вы можете реализовать каждый из шаблонов как отдельный модуль (что, я знаю, вы не хотите делать), или вы можете написать все это как модуль и изменить все вызовы шаблонов, чтобы использовать новые параметры модуля. Если бы вы написали все это как модуль, это могло бы выглядеть примерно так:
Пример кода модуля |
---|
local getArgs = require ( 'Модуль: аргументы' ). getArgs local TableTools = require ( 'Модуль: TableTools' )местный p = {}функция p . main ( frame ) local args = getArgs ( frame ) return p . horizontalTimeline ( args ) конецфункция p . horizontalTimeline ( args ) local rowNums = TableTools . affixNums ( args , 'row' ) - получает числа для row1, row2 и т. д. с удаленными нулевыми аргументами. local ret = {} для _ , num в ipairs ( rowNums ) do local rowType = args [ 'rowtype' .. num ] - получает args.rowtype1, args.rowtype2 и т. д. с удаленными аргументами nil. - Код для создания rowArgs: - local rowArgs = {x, y, z}, если rowType = 'timeline', то ret [ # ret + 1 ] = p . timelineRow ( rowArgs ) elseif rowType = 'scale', затем ret [ # ret + 1 ] = p . scaleRow ( rowArgs ) конец конец return table.concat ( ret ) конецфункция p . timelineRow ( rowArgs ) - Делайте что-нибудь с rowArgs. конецфункция p . scaleRow ( rowArgs ) - Работайте с rowArgs. конецвернуть p |
- Возможно, лучше всего было бы написать модуль, как в примере выше, а затем использовать AWB для обновления всех включений. Их всего 162, так что, если вы хорошо разбираетесь в использовании AWB, это не займет много времени. Или вам может повезти, если вы вежливо спросите в WP: Bot запросы . Надеюсь это поможет. - Г-н Страдивари, выступление 07:43, 24 декабря 2013 г. (UTC)
- @ Мистер Страдивари : Большое спасибо. TableTools.affixNums сделает свое дело .. :) - Джаяратхина ( разговор ) 08:09, 24 декабря 2013 г. (UTC)
- Я думаю, вы могли бы перетянуть шаблон, чтобы вернуть строковую копию его параметров внутри - это не было бы замечено обычными пользователями (хотя это все равно добавляет к счетчику байтов страницы с шаблоном, но не с модулем), и ваша программа может выполнить mw.ustring.match для захвата данных, а затем gsub, чтобы вырезать диапазон из вывода. Wnt ( разговорное ) 14:26, 2 января 2014 (UTC)
- @ Мистер Страдивари : Большое спасибо. TableTools.affixNums сделает свое дело .. :) - Джаяратхина ( разговор ) 08:09, 24 декабря 2013 г. (UTC)
- Возможно, лучше всего было бы написать модуль, как в примере выше, а затем использовать AWB для обновления всех включений. Их всего 162, так что, если вы хорошо разбираетесь в использовании AWB, это не займет много времени. Или вам может повезти, если вы вежливо спросите в WP: Bot запросы . Надеюсь это поможет. - Г-н Страдивари, выступление 07:43, 24 декабря 2013 г. (UTC)
Это надоедливое "лишнее" поле #invoke
Я думаю, стоит еще раз проверить, насколько далеко мы можем зайти к идеальному голому формату {{#invoke: SomeName}}, поскольку дополнительный параметр только мешает / сбивает с толку многих пользователей, не использующих Lua.
- Самая простая часть - «избавиться от имени функции»: предполагая, что p - это переменная в последней строке программы, просто скажите
p[""] = function (frame)
вместоfunction p.main (frame)
. (Или просто назначьте его с помощью p.main ...)
- Однако я не вижу способа избавиться от канала - это должно быть {{#invoke: SomeName |}} или {{#invoke: SomeName || param = something}}, насколько мне известно ...
- Также можно сделать функцию параметром, если она поступает из определенного списка вариантов - просто загрузите свои данные и установите цикл, который p [xyz] = function (frame) return p.main (frame, xyz) end.
- Однако я не думаю, что вы можете получить метатабильную работу. Я бы хотел, чтобы p [somethingnotrecognized] переходил к функции индекса q .__, а затем возвращал, например, p.main (frame) или ошибку, или повторно использовал имя функции в качестве первого безымянного параметра. Но ты можешь это сделать? Мне пока не удалось.
Wnt ( разговорное ) 15:07, 2 января 2014 (UTC)
- Почему бы вам просто не передать #invoke в шаблон? Это было одной из целей исходной спецификации Scribunto, и поэтому у нас есть frame: getParent. И если вам не нравится писать неудобный код frame: getParent, вы можете просто использовать Module: Arguments, который сделает это за вас. :) - Mr. Stradivarius ♪ talk ♪ 16:39, 2 января 2014 (UTC)
- Конечно, это то, что мы делаем сейчас ... хотя это лишняя страница, с которой можно дурачиться. В основном, просто интересно посмотреть, на что мы способны. Правда, нигде не рядом так полезно , как возможность получить поиск передается через Lua , как показано в разделе выше этого, что только начало всех видов хороших вещей! Wnt ( разговорное ) 18:29, 2 января 2014 (UTC)
Можно ли получить список всех страниц с префиксом, как в Special: PrefixIndex?
В настоящее время существует разумное количество шаблонов, которые пытаются определить, существует ли какой-либо из набора страниц, чтобы предоставить ссылки на эти страницы. Я вижу, что это обычно делается в шаблонах, которые возвращают ссылки на архивы страниц обсуждения. Общий метод, который использовался, состоит в том, чтобы принять формат для имени архива страниц, а затем проверить наличие всех таких возможных страниц с помощью {{#ifexist:}}. Учитывая, что каждая {{#ifexist:}} является дорогостоящей функцией синтаксического анализатора (EPF), эти шаблоны могут потреблять чрезмерное количество EPF. По крайней мере, один такой шаблон превысит ограничение в 500 EPF на страницу в 2015 году.
Есть ли способ получить список (массив) всех страниц с префиксом (например, результаты, которые может получить пользователь со страницей Special: PrefixIndex)? Макиен ( разговор ) 05:58, 1 января 2014 (UTC)
- Я не знаю метода, и если бы он был, он, вероятно, имел бы примерно такие же накладные расходы, как использование шаблона с функциями синтаксического анализатора. Скрываясь в разговоре с пользователем: Джимбо Уэльс , я иногда думал, что решение состоит в том, чтобы вручную создать страницу индекса (или создать бота для этого) - на активной странице обсуждения будут отображаться ссылки на последние архивы + ссылка на фиксированный индекс страница старых архивов. Еще одним фактором является то, что WP: FLOW заменит страницы обсуждения и лишит возможности архивировать их (я думаю - я давно не изучал документы, и они меняются, потому что они находятся в разработке). Johnuniq ( разговор ) 06:29, 1 января 2014 (UTC)
- ( редактировать конфликт ) : Нет, я не знаю способа сделать это в Lua. Возможно, попробуйте отправить запрос в Bugzilla, чтобы узнать, не захочет ли кто-нибудь добавить в Scribunto код, который заставил бы эту работу работать? - Мистер Страдивари в туре ♪ выступление ♪ 06:37, 1 января 2014 г. (UTC)
- Если я правильно понимаю, lua может видеть только отрисованную версию страницы, не могли бы вы использовать его для очистки отрендеренной версии Special: PrefixIndex, чтобы получить список? Технический 13 ( разговор ) 13:01, 1 января 2014 (UTC)
- Я только что попробовал с помощью Special: PrefixIndex / User: Mr. Страдивари , и, похоже, нам не повезло. Использование mw.title: getContent возвращает
nil
, а использованиеframe:preprocess('{{Special:PrefixIndex/User:Mr. Stradivarius}}')
возвращает маркер полосы (я получил «? UNIQ98c31e5a41fdf151-item-0 - QINU?»). - Г-н Страдивари, выступление, 13:33, 1 января 2014 г. (UTC)- Но вы можете передать маркер полосы
mw.text.unstrip()
, а затем вытащить список страниц с помощьюstring.gmatch()
. Не очень элегантно, но возможно. Keφr 19:59, 1 января 2014 г. (UTC)- Я только что попробовал и получил результат «Special: PrefixIndex / User: Mr. Stradivarius». Похоже, что преобразование в вывод специальной страницы происходит на более позднем этапе обработки, поэтому просто расстегнуть маркер полосы не получится. - Г-н Страдивари ♪ выступление ♪ 20:13, 1 января 2014 г. (UTC)
- Объясни это . Keφr 21:31, 1 января 2014 г. (UTC)
- (Подсказка: объясните это и это .) Keφr 21:41, 1 января 2014 г. (UTC)
- Ага, ты прав. Во второй раз забыла фигурные скобки - школьная ошибка. (Но было ли «Отстой» действительно необходимо?) - выступление г-на Страдивари, ♪ 22:18, 1 января 2014 г. (UTC)
- Однако настоящий ответ более сложен. Полосовые маркеры, похоже, ведут себя по-разному при запросе только расширения шаблона (как и
action=raw&templates=expand
делает). И Special: ExpandTemplates расширяет шаблоны, выводит викитекст без шаблонов, а затем отображает его, что не эквивалентно выполнению полного синтаксического анализа страницы. И я полагаю, вы это использовали. Так что есть предостережение, что он может вести себя не так, как ожидалось, во всех контекстах. - ( «Отстой» было раньше, по какой-то причине я предпочитаю его оставить.: P) Keφr 22:42, 1 января 2014 г. (UTC)
- Однако настоящий ответ более сложен. Полосовые маркеры, похоже, ведут себя по-разному при запросе только расширения шаблона (как и
- Ага, ты прав. Во второй раз забыла фигурные скобки - школьная ошибка. (Но было ли «Отстой» действительно необходимо?) - выступление г-на Страдивари, ♪ 22:18, 1 января 2014 г. (UTC)
- (Подсказка: объясните это и это .) Keφr 21:41, 1 января 2014 г. (UTC)
- Объясни это . Keφr 21:31, 1 января 2014 г. (UTC)
- Я только что попробовал и получил результат «Special: PrefixIndex / User: Mr. Stradivarius». Похоже, что преобразование в вывод специальной страницы происходит на более позднем этапе обработки, поэтому просто расстегнуть маркер полосы не получится. - Г-н Страдивари ♪ выступление ♪ 20:13, 1 января 2014 г. (UTC)
- Но вы можете передать маркер полосы
- Я только что попробовал с помощью Special: PrefixIndex / User: Mr. Страдивари , и, похоже, нам не повезло. Использование mw.title: getContent возвращает
- Если я правильно понимаю, lua может видеть только отрисованную версию страницы, не могли бы вы использовать его для очистки отрендеренной версии Special: PrefixIndex, чтобы получить список? Технический 13 ( разговор ) 13:01, 1 января 2014 (UTC)
В этом есть смысл. Однако я не использовал Special: ExpandTemplates - я действительно просто забыл о фигурных скобках. : P В любом случае, я взял эту идею и добавил некоторые проверки параметров и некоторую документацию, и назвал это Module: User: Mr. Страдивари / PrefixIndex . Макиен , это похоже на то, что ты хотела? - Г-н Страдивари ♪ выступление ♪ 23:06, 1 января 2014 г. (UTC); Страница перемещена без редиректа. Обновленная ссылка. - Макиен ( разговор ) 04:02, 8 мая 2014 г. (UTC)
- Спасибо вам всем. Прочитав приведенные выше комментарии и бегло взглянув на модуль, я понял, что это именно то, что мне нужно. Я ожидаю, что буду использовать его позже в будние / выходные дни. Еще раз спасибо. Макиен ( разговор ) 11:06, 2 января 2014 (UTC)
- Я только что понял, что это вернет только первые 200 совпадений из-за того, как работает страница Special: PrefixIndex . Так что, если вам нужно использовать его для чего-то, что даст более 200 результатов, вам может не повезти. Возможно, есть обходной путь с помощью Special: AllPages , но похоже, что он будет еще уродливее, чем текущий хак PrefixIndex ... - Г-н Страдивари ♪ доклад ♪ 19:09, 2 января 2014 г. (UTC)
- Собственно, вы можете пройти,
|from=
и он будет работать так же, как с обычным Special: PrefixIndex . Вы можете передать последнюю появившуюся ссылку, а затем пропустить ее в следующем пакете. Keφr 09:26, 3 января 2014 г. (UTC)
- Собственно, вы можете пройти,
- Я только что понял, что это вернет только первые 200 совпадений из-за того, как работает страница Special: PrefixIndex . Так что, если вам нужно использовать его для чего-то, что даст более 200 результатов, вам может не повезти. Возможно, есть обходной путь с помощью Special: AllPages , но похоже, что он будет еще уродливее, чем текущий хак PrefixIndex ... - Г-н Страдивари ♪ доклад ♪ 19:09, 2 января 2014 г. (UTC)
- Это отличный шаг вперед в наших возможностях Lua. К сожалению (но во многих случаях это вполне понятно), не все страницы Special: работают таким образом. При запуске программы-песочницы [3] выясняется, что из всех Special: ссылок на Help: Special pages только Special: AllPages , Special: ListFiles , Special: RecentChanges , Special: RecentChangesLinked , Special: PendingChanges , Special: NewPages , Special: NewFiles , Special: ListUsers , Special: ValidationStatistics , Special: WantedPages и Special: PrefixIndex создают содержимое, которое можно просматривать в распакованном виде; остальные доставляют только ссылки на себя. Тем не менее, даже в этом списке есть несколько полезных модулей! Wnt ( разговорное ) 22:06, 2 января 2014 (UTC)
- Я на практике использовал Обзор Special: AllPages in Module: Module , который теперь просматривает каждый из сегментов AllPages (namespace = 828) и извлекает из них имена модулей для текущего списка. Wnt ( разговор ) 07:27, 5 января 2014 (UTC)
Модуль Lua работает на каждой странице _access_
Я довольно давно слышал, что сценарии Lua запускаются только при анализе страницы, что исключает многие интерактивные функции, но эффективно. Однако после написания Module: Hex , который выводит содержимое строк в шестнадцатеричном формате, я смотрел на страницу обсуждения, когда заметил, что шестнадцатеричный дамп содержимого маркера полосы (пример с UNIQ ... QINU) является меняется каждый раз, когда я нажимаю вкладку «Обсуждение» или кнопку перезагрузки браузера, чтобы перезагрузить страницу, даже когда я полностью выхожу из системы с отключенными скриптами! Безусловно, это маркер полосы для функции текущего времени, но я думаю, что это либо ошибка, либо функция, и мы должны выяснить, какая именно! :) Wnt ( разговор ) 02:58, 6 января 2014 (UTC)
- Похоже, включение специальной страницы отключает кеширование ( строка 3410 Parser.php ). Я бы не рекомендовал злоупотреблять этим, иначе вы можете удалить его. Anomie
⚔ 03:20, 6 января 2014 г. (UTC)
- Фактически, даже версии истории этой страницы обсуждения получают новое значение при каждой перезагрузке ( [4] ).
- Например, ранее сегодня (я заметил это только сейчас) я переделал Wikipedia: Lua / Modules с обновленным индексом из AllPages, который, как я думал, будет обновляться автоматически при очистке или редактировании страницы. Как вы думаете, мне нужно заменить на вставленную версию? Есть ли способ продолжить работу с проанализированными данными, чтобы снова включить кеширование? Wnt ( разговорное ) 03:38, 6 января 2014 (UTC)
- Пока "историческая" версия включает специальную страницу, это будет сделано. Если вы не включаете специальные страницы, все будет в порядке. Anomie ⚔ 14:12, 6 января 2014 г. (UTC)
- Более важный пример: модуль: FindFeatures, о котором я упоминал выше, выполняет предварительную обработку frame: для PAGENAME. Это специальная страница, которая отключает кеширование? Поскольку никто не прокомментировал это, я был почти готов в любой момент поместить это в информационное окно, которое появилось бы на тысячах страниц! Если это проблема производительности, возможно, нам лучше решить ее как можно скорее. Wnt ( разговорное ) 03:45, 6 января 2014 (UTC)
- PAGENAME в порядке, это не специальная страница. Но почему вы выполняете предварительную обработку frame: на PAGENAME вместо использования mw.title.getCurrentTitle ()? Anomie
⚔ 14:12, 6 января 2014 г. (UTC)
- Что ж, со старой точки зрения шаблонного кодирования включение страницы не кажется большим делом. Если я скажу frame: preprocess ("{{PAGENAME}}"), я "знаю", что сразу же получу знакомый текстовый ответ, тогда как mw.title.getCurrentTitle (). FullText требует двойной проверки руководства о том, в каком поле указано название, и, возможно, методом проб и ошибок, чтобы убедиться, что это правильная функция. Я был в блаженном игнорировании соображений производительности (и действительно, только недавно я понял, что для некоторых специальных страниц я возвращал то, что я не мог обработать как текст, что побудило меня написать модуль шестнадцатеричного дампа в первом место), так что казалось, что эти двое в худшем случае эквивалентны, поэтому я придерживался того, что было мне знакомо. Есть ли причина избегать предварительной обработки такой функции синтаксического анализатора? У меня возникло ощущение, что это как-то неуклюже - конечно, это напоминает мне дыры в безопасности eval () или SQL-инъекции в других системах, но такого рода соображения безопасности здесь просто не актуальны. Wnt ( разговорное ) 14:50, 6 января 2014 (UTC)
- Использование frame: preprocess будет намного медленнее, чем прямой вариант, поскольку он должен вызывать PHP и запускать препроцессор. Это также плохая привычка, поскольку трудно правильно экранировать параметры при их интерполяции в строку - frame: expandTemplate или frame: callParserFunction или frame: extensionTag (что на самом деле просто frame: callParserFunction с #tag), как правило, было бы лучше там. Anomie ⚔ 20:26, 6 января 2014 г. (UTC)
- Что ж, со старой точки зрения шаблонного кодирования включение страницы не кажется большим делом. Если я скажу frame: preprocess ("{{PAGENAME}}"), я "знаю", что сразу же получу знакомый текстовый ответ, тогда как mw.title.getCurrentTitle (). FullText требует двойной проверки руководства о том, в каком поле указано название, и, возможно, методом проб и ошибок, чтобы убедиться, что это правильная функция. Я был в блаженном игнорировании соображений производительности (и действительно, только недавно я понял, что для некоторых специальных страниц я возвращал то, что я не мог обработать как текст, что побудило меня написать модуль шестнадцатеричного дампа в первом место), так что казалось, что эти двое в худшем случае эквивалентны, поэтому я придерживался того, что было мне знакомо. Есть ли причина избегать предварительной обработки такой функции синтаксического анализатора? У меня возникло ощущение, что это как-то неуклюже - конечно, это напоминает мне дыры в безопасности eval () или SQL-инъекции в других системах, но такого рода соображения безопасности здесь просто не актуальны. Wnt ( разговорное ) 14:50, 6 января 2014 (UTC)
- PAGENAME в порядке, это не специальная страница. Но почему вы выполняете предварительную обработку frame: на PAGENAME вместо использования mw.title.getCurrentTitle ()? Anomie
⚔ 14:12, 6 января 2014 г. (UTC)
- Да, и еще один пример - в [5] я предложил решение для перечисления порталов, на которые есть ссылки из различных проектов Wiki, с помощью frame: preprocess () по крайней мере первого полного раздела страницы обсуждения. Если какая-либо специальная страница, включенная где-либо в любом из этих шаблонов, может отключить кеширование, это, в случае необходимости, может повлиять на ... бесчисленные страницы, если они будут запущены. Wnt ( разговор ) 03:48, 6 января 2014 (UTC)
- Я надеюсь, что эти шаблоны все равно не включают специальные страницы. Обратите внимание, что если что-то включает специальные страницы в страницы обсуждения, то кеширование для этих страниц обсуждения уже отключено (т.е. это не имеет никакого отношения к Scribunto). Anomie ⚔ 14:12, 6 января 2014 г. (UTC)
- Выдающийся! Я действительно не понимаю всего этого препроцессора / распаковки, но это очень впечатляет (и дает разработчикам / операторам повод для беспокойства)! Я не изучал код, но может быть интересно следующее. Одиночный байт можно преобразовать в шестнадцатеричный следующим образом (при запуске интерактивного Lua следующее отображает «<41>»):
c = 'A'; print(string.format('<%02x>', c:byte()))
- Шестнадцатеричную строку можно преобразовать в десятичную следующим образом (здесь показано «175»).
hex = 'aF'; print(tonumber('0x'..hex))
- Johnuniq ( разговор ) 04:52, 6 января 2014 (UTC)
- Что ж, посмотрите на источник для обсуждения модуля: Hex - параметры там говорят модулю постепенно заключать имя страницы в фигурные скобки, предварительно обрабатывать его для включения (которое возвращается как маркер полосы, по крайней мере, для специальных страниц) , и распаковать его (что превращает его в HTML). Маркеры полосы кажутся относительно простыми, время от времени меняющимися, но не в очень большом диапазоне значений, и предоставление старых маркеров полосы или точечное изменение существующего маркера полосы, кажется, делает их инертными (то есть отображается как UNIQ ... QINU вместо расширения в HTML). Мне действительно нужно прочитать исходный код PHP (и лучше изучить PHP), но я полагал, что эмпирически проверить, что происходит, не должно быть вреда. В любом случае, способ преобразования состоит в том, что я генерирую словари прямого и обратного направления из 256 значений, так что я могу просто найти d2h [dec], h2d [hex], чтобы получить свой ответ. Это немного накладные расходы, но я думаю, что как только я сгенерирую этот массив на самом высоком уровне в модуле, он должен оставаться доступным для функций, которые я вызываю каждый раз, когда я делаю шестнадцатеричный дамп любой строки на всей странице. (Хотел бы я лучше понять масштаб, чтобы знать, правда ли это!) Wnt ( разговор ) 06:39, 6 января 2014 (UTC)
- Что меня раздражает, если я представляю себе злоупотребление этими модулями с отключенным кешем (чего мне не следовало бы делать, потому что я чувствую, что они скоро исчезнут), так это то, что когда модуль фактически запускается повторно каждый раз при просмотре страницы, вы Можно представить себе, что если бы вы могли каким-то образом передавать ему параметры, вы могли бы получить пользовательские прогоны с пользовательскими данными. (Например, модуль Мандельброта, в котором вы можете щелкнуть любой сегмент, чтобы повторно вычислить и многократно расширить область в нем). Я все думаю, что есть способ сделать это, но каким-то образом он ускользает от моего понимания. Я также подозреваю, что вы можете подстроить какие-то сумасшедшие взаимодействия, например, модуль, который показывает красный флаг в предварительном просмотре (только) вашей подписи, если кто-то прочитал вашу страницу обсуждения. Все очень заманчиво ... несомненно, очень плохая идея. возможно, оправданным во имя ... фундаментальных исследований. :) Wnt ( разговор ) 06:48, 6 января 2014 (UTC)
- Эммм, да, быстро просматривая код, я увидел таблицу преобразования, и это побудило меня опубликовать вышеупомянутое. Я действительно впечатлен результатом - я смутно осознаю, что HTML может делать умные вещи, но шестнадцатеричный дамп потрясающий.
- С сожалением сообщаю, что модуль загружается с нуля каждый раз, когда он вызывается, поэтому, если бы у вас было 100 шестнадцатеричных дампов на странице, таблица преобразования была бы создана 100 раз. Только если вы обращаетесь к таблице данных, доступной только для чтения (без кода)
mw.loadData()
, таблица кэшируется и загружается один раз на страницу. Один из способов убедиться в истинности этого утверждения - иметь переменную, которую вы тестируете на ранней стадии - скажем, вы возвращаете «SET», если ее значение не равно нулю, в противном случае вы выполняете обычную обработку. После тестирования переменной установите для нее какое-то значение. Вы обнаружите, что он никогда не устанавливается, даже если вы вызываете модуль десять раз на странице (по крайней мере, так было, и я подозреваю, что до сих пор). - Вики полагаются на обслуживание кэшированных страниц, и если будет найден способ взлома этого, метод будет устранен, а злоумышленнику либо будет назначена награда за обнаружение уязвимости, либо будет нанесен удар за злоупотребление системой. Johnuniq ( разговор ) 09:56, 6 января 2014 (UTC)
- Хммм ... Я думал, что смогу выполнить loadData, но [чушь отредактирована, извините - и спасибо!] Wnt ( обсуждение ) 16:25, 6 января 2014 г. (UTC)
- Спасибо за все ответы здесь. Я рад, что масштабы проблемы ограничены. Даже в этом случае, когда я думаю об этом, я не могу не думать, что тебе придется принять жесткие меры раньше, чем позже. Потому что в конечном итоге вандал найдет способ включить одно из этих специальных предложений в какой-нибудь шаблон, используемый на пяти миллионах страниц, включая главную страницу, и что тогда происходит? Wnt ( разговор ) 01:18, 7 января 2014 (UTC)
Может ли loadData возвращать произвольные данные?
Я просто пытался вернуть эти шестнадцатеричные таблицы через loadData и, похоже, натолкнулся на неприятный сюрприз. Похоже, что синтаксический анализатор отвергает любые попытки инициализировать таблицу в операторе return, если один из индексов интерпретируется или может интерпретироваться как число.
Например,, return {84 = 132}
или return {'84' = 132}
, или return {0 = 00}
, выдают ошибки, требующие} рядом с =.
Есть ли способ, чтобы таблица loadData содержала эти ключи? Wnt ( разговорное ) 15:56, 6 января 2014 (UTC)
- Это не проблема mw.loadData, это проблема синтаксиса - вам нужно
{[84] = 132}
,{['84'] = 132}
и{[0] = 0}
. (Обратите внимание, что для последнего00
и0
эквивалентны.) Сам mw.loadData принимает логические значения, числа и строки в качестве ключей таблицы. - Г-н Страдивари, выступление, 17:11, 6 января 2014 г. (UTC)
- Решено
- О, хорошо, спасибо! Мне следовало бы присмотреться - обычно работает чтение первых двух страниц, которые вы видите в поисковом запросе, но не в этот раз. Я должен обновить Help: Lua для начинающих, чтобы не забыть. :) Wnt ( разговор ) 19:42, 6 января 2014 (UTC)
- Хорошо, я добавил справку: Lua_for_beginners # Initializing_a_table - надеюсь, я смогу сослаться на это и оставить прямо сейчас. :) Wnt ( разговор ) 20:13, 6 января 2014 (UTC)
Проблема с string.format
Привет, есть ли способ указать string.format не создавать конечные нули с десятичной записью? Например:
- string.format ('% f% f% f', 0.00001, 1.2, 3) => 0.000010 1.200000 3.000000
- string.format ('% г% г% г', 0,00001, 1,2, 3) => 1e-05 1,2 3
Вместо этого мне нужно вывести: «0,00001 1,2 3». Нужно ли использовать% f и удалять завершающие нули с помощью string.match или string.gsub? Это было бы немного странно. - Ротпункт ( разговор ) 13:50, 9 января 2014 г. (UTC)
- Боюсь, что это уродливый выбор. Причина в том, что в таком значении, как 0,00001, последняя цифра «1» может быть действительной, или она может быть нежелательной из-за ограничений с плавающей запятой после серии вычислений, поэтому программист должен форсировать то, что он хочет.
- Использование
s = string.format('%f', 1.2):gsub('0+$', '')
дает результат «1,2», но дает пустую строку, если значение равно нулю. Другая проблема заключается в том, что «% f» - это сокращение от «% .6f», поэтому все, что находится после шести десятичных знаков, теряется (string.format('%f', 0.0000001)
дает «0,000000»). Johnuniq ( разговор ) 22:32, 9 января 2014 (UTC)
mediawikiwiki: Обсуждение расширений: справочное руководство Scribunto / Lua # Пример для string.format? может иметь отношение к этой проблеме. Incnis Mrsi ( разговор ) 22:46, 9 января 2014 (UTC)
- @Incnis Mrsi, спасибо, я уже читал это, но это не помогает для печати числа, такого как 0,00001, с десятичной записью и без конечных нулей
- @Johnuniq, спасибо, к счастью, мое наименьшее значение - 0,000001, так что все в порядке. Тогда буду работать над gsub. - Rotpunkt ( разговор ) 00:41, 10 января 2014 (UTC)
- Вы можете сделать это в string.format следующим образом:
string.format('%.5f %.1f %d', 0.00001, 1.2, 3)
→ «0.00001 1.2 3». Внизу ветки, на которую связалась Инкнис Мисси, есть еще некоторые подробности. В стороне, я думаю, что было бы неплохо расширить ввод вручную примером или еще одним объяснением, так как на данный момент это трудно понять, и я подозреваю, что люди просто пропускают его. - Г-н Страдивари ♪ выступление ♪ 03:21, 10 января 2014 г. (UTC)- Но в целом мы не знаем, с каким значением имеем дело (иначе был бы просто код
s = "0.00001 1.2 3"
). Вы можете взять журнал значения и вычислить его величину и угадать спецификатор формата по нему, но это непросто. Johnuniq ( разговор ) 03:51, 10 января 2014 (UTC)- Привет, мистер Страдивари, спасибо, поскольку Джонуник сказал, что эти значения не известны до времени выполнения, 0,00001 1,2 и 3 были всего лишь примерами. У меня есть модуль, который возвращает значения от 0,000001 до 360. Мне не нужна научная нотация (например, для 0,00001 Lua print 1e-05), поэтому мне нужно использовать string.format с% f. Но есть проблема с конечными нулями. Ротпункт ( разговор ) 10:31, 10 января 2014 (UTC)
- @Johnuniq насчет:
string.format('%f', myValue):gsub('0+$', ''):gsub('%.$', '')
? Это дает: для 0 => 0; 1 => 1; 1.1 => 1.1; 0,000001 => 0,000001. Вы видите какие-нибудь проблемы? - Rotpunkt ( разговор ) 13:50, 10 января 2014 г. (UTC)- Вы должны быть в состоянии сделать это только с одним GSUB:
string.format('%f', myValue):gsub('%.?0+$', '')
. Anomie ⚔ 15:52, 10 января 2014 г. (UTC)- Спасибо, Anomie! верно. Самый последний вопрос: можно ли переопределить функцию по умолчанию tostring (number) (и как) или нет? Ротпункт ( разговор ) 18:25, 10 января 2014 (UTC)
- Вы должны быть в состоянии сделать это только с одним GSUB:
- @Johnuniq насчет:
- Привет, мистер Страдивари, спасибо, поскольку Джонуник сказал, что эти значения не известны до времени выполнения, 0,00001 1,2 и 3 были всего лишь примерами. У меня есть модуль, который возвращает значения от 0,000001 до 360. Мне не нужна научная нотация (например, для 0,00001 Lua print 1e-05), поэтому мне нужно использовать string.format с% f. Но есть проблема с конечными нулями. Ротпункт ( разговор ) 10:31, 10 января 2014 (UTC)
- Но в целом мы не знаем, с каким значением имеем дело (иначе был бы просто код
- Вы можете сделать это в string.format следующим образом:
Да, вы можете заменить встроенные функции, потому что это просто функции, доступ к которым осуществляется из глобальных переменных. Осторожность желательна, потому что это очень сбивает с толку любого, кто позже читает код, если tostring()
он не делает то, что обычно делает, однако идея заключается в следующем.
local lua_tostring = tostring локальная функция tostring ( n ), если type ( n ) == 'number', то локальное целое число , fracpart = math.modf ( n ), если fracpart == 0, то вернуть string.format ( '% .0f' , n ) end - Здесь "%.? 0" не нужно, но полезно, если не указывать выше. - Скобки убирают "количество изменений", возвращаемое gsub. return ( string.format ( '% f' , n ): gsub ( '%.? 0 + $' , '' )) end return lua_tostring ( n ) end
Для разнообразия и для соответствия тому факту, что если вы знаете, с какими значениями вы имеете дело, у вас могут быть некоторые операторы «if ... then ... else» для их обработки, я сделал формат несколько иначе. Требуется изучение, чтобы гарантировать правильность! Johnuniq ( разговор ) 22:58, 10 января 2014 (UTC)
- Большое спасибо, хорошие идеи здесь. Таким образом, будет ли эта функция автоматически вызываться, когда я объединяю число со строкой? Rotpunkt ( разговор ) 00:01, 11 января 2014 (UTC)
- Нет. Я предполагаю, что оценка
'abc'..42
выполняется внутри интерпретатора Lua, и он вызывает свой собственный «tostring». Чтобы вызвать пользовательскую функцию, вам нужно переопределить..
оператор, а это невозможно сделать в Lua (за что мой простой ум очень благодарен). Johnuniq ( разговор ) 00:43, 11 января 2014 (UTC)- ОК. Предыдущего кода мне более чем достаточно, так что еще раз спасибо, cya! Ротпункт ( разговор ) 10:39, 11 января 2014 (UTC)
- Нет. Я предполагаю, что оценка
Противоядие от отключения кеша на страницах Special:?
Поскольку свойство из Викиданных не обновляется mw.message, я решил попробовать его на одной из этих надоедливых страниц Special:, отменяющих кеширование.
Код Wiki песочницы {{Special:AllPages|namespace=666}} {{CURRENTTIMESTAMP}}
возвращает временную метку, которая изменяется каждый раз при перезагрузке страницы, поскольку кэширование отключено.
Однако я обнаружил, что при возврате mw.message.newRawMessage("{{User:Wnt/Templates/Sandbox2}}"):parse()
создается отметка времени, которая никогда не меняется при перезагрузке страницы, вызывающей модуль, потому что включенная страница вообще не проверяется.
К сожалению, я еще не смог придумать способ смешать эту логику, чтобы получить то, что я хочу, а именно способ контролировать, обновляются ли результаты ежедневно или еженедельно и т. Д., Потому что я не придумал способ, которым логика того, прошло ли время, всегда будет оцениваться, но логика содержимого страницы не будет оцениваться, если только не придет время, после чего кэширование должно быть обновлено на этой странице . Все-таки вариантов много ... может кто что придумает? Wnt ( разговорное ) 15:43, 13 января 2014 (UTC)
(Для ясности ... к этому моменту я думаю, что было бы лучше просто разработать явный инструмент для управления кешированием и некоторые механизмы (если они еще не существуют) для проверки того, какие страницы не кэшируются и определения худшие перезагрузчики) Wnt ( обсуждение ) 15:48, 13 января 2014 (UTC)
Форматирование в аргументах
Форматирование текста (полужирный, курсив) прерывается, если теги '' / '' 'не закрываются для каждого аргумента. В настоящее время я использую следующую функцию для получения аргументов шаблона.
[закомментировал]
Как я могу это исправить? - SocietyBox ( разговор ) 02:26, 20 января 2014 г. (UTC)
- Повторите код getArgs: я предполагаю, что вместо возврата «parent.args» вы намеревались вернуть «args»? Поскольку вы используете #invoke, а не шаблон, parent.args отсутствует. Возможно, вы захотите увидеть Модуль: Аргументы .
- Аргументы, выделенные жирным шрифтом / курсивом: я не знаю, что сработает, но почему бы не удалить все
'
из каждого аргумента, а затем вставить форматирование в вывод? Это при условии, что модуль знает, что должно быть выделено жирным шрифтом или курсивом. Johnuniq ( разговор ) 03:56, 20 января 2014 (UTC)- Нет, модуль не знает. Вот более простой пример. - SocietyBox ( разговор ) 07:33, 20 января 2014 г. (UTC)
local text1 = ' \' \ '\' bold ' local text2 = ' normal ' local tbl = HtmlBuilder . создать ( 'div' ); табл . тег ( 'диапазон' ). вики - текст ( текст1 ); табл . тег ( 'диапазон' ). вики - текст ( текст2 ); возврат в строку ( табл. )
- Итак, дело с аргументами (в закомментированном тексте) было решено?
- Это пример отчета об ошибке в HtmlBuilder? Было бы лучше кратко описать, чего вы ожидали и что пошло не так, но легко предположить, что смешивание неработающего wikitext (
'''bold
) с html не даст удовлетворительных результатов. На самом деле, вероятно, было бы безопаснее придерживаться либо wikitext, либо html, а не смешивать их. Johnuniq ( разговор ) 08:36, 20 января 2014 (UTC)- Извините за недоразумение. Я начну сначала. Я хотел преобразовать шаблон, генерирующий таблицу (например, Template: Round8 ), в шаблон Lua без другого поведения для неработающего викитекста. Неработающие полужирные теги отлично работают с шаблонами, отличными от Lua (и эти сломанные теги широко используются). Я не уверен, есть ли ошибка или это предполагаемое поведение. Первоначально я думал, что, возможно, неправильно читаю аргументы. - SocietyBox ( обсуждение ) 12:31, 20 января 2014 г. (UTC)
- Вероятно, это потому, что вы не добавили новые строки. Болидное и курсивное форматирование с помощью '' / '' 'влияет только на одну строку викитекста. Например:
- Извините за недоразумение. Я начну сначала. Я хотел преобразовать шаблон, генерирующий таблицу (например, Template: Round8 ), в шаблон Lua без другого поведения для неработающего викитекста. Неработающие полужирные теги отлично работают с шаблонами, отличными от Lua (и эти сломанные теги широко используются). Я не уверен, есть ли ошибка или это предполагаемое поведение. Первоначально я думал, что, возможно, неправильно читаю аргументы. - SocietyBox ( обсуждение ) 12:31, 20 января 2014 г. (UTC)
'' Жирный текстЭтот текст не жирный ''
производит:
Некоторый полужирный текст Этот текст не полужирный
- Если вы используете Module: HtmlBuilder, вы можете попробовать добавить его
.newline()
и посмотреть, имеет ли это значение. - Г-н Страдивари ♪ выступление ♪ 15:34, 20 января 2014 г. (UTC)- Это сработало. Спасибо. - SocietyBox ( разговор ) 23:45, 20 января 2014 г. (UTC)
- Если вы используете Module: HtmlBuilder, вы можете попробовать добавить его
Должны ли защищенные модули использовать локальные копии для require ()?
[6] вопрос в модуле: Перенаправление напомнило мне о замечательном заявлении @ Wikid77 : что обновление некоторых модулей Lua может вызвать 7 миллионов страниц переформатировать на WP: очереди заданий . Ясно, что стоит подумать о том, как максимально уменьшить это воздействие.
Первый вопрос, конечно, заключается в том, нужно ли вообще использовать require (). Часто связанный модуль содержит ненужные навороты; почему бы не поместить его в модуль и не уменьшить?
Но то , что я хотел бы спросить теперь: как вопрос общей политики, она всегда имеет смысл ссылку из модуля , который находится в таких широко используется , что она должна быть защищена от текущей копии другого модуля? Вместо того, чтобы требовать Module: Redirect из защищенного модуля (или, в данном случае, шаблона, Template: Submit an edit request , который обслуживает MediaWiki: Protectedpagetext ), вы просто потребуете или создадите ссылку на копию ( Module: Submit an edit request / Redirect ).
Преимущества: а) редактирование перенаправления для добавления нерелевантных функций не приводит к массовому использованию очереди, б) перенаправление не требует защиты и в) если требуемый модуль не защищен, вы не получаете сбиты с толку и дурачатся с модулем, который, по вашему мнению, используется ограниченно, только для того, чтобы узнать, что вы создали огромную нагрузку на сервер. (В случае Module: Redirect, когда я смотрю на страницы, которые ссылаются на него, я легко мог подумать, что он даже не используется на 50 страницах, почему бы не начать делать серию небольших правок, пока они предварительно просматриваются нормально? )
Недостатком, конечно же, является то, что исправления ошибок в таких модулях, как Redirect, не передаются. Однако, если мы стандартизируем это, с дословно скопированными именами и довольно отчетливой заглавной буквой после /, должно быть легко заставить бота уведомить автора (ов) модуля: автоматически отправлять запрос на редактирование при обновлении Redirect. (хорошо, бот может пропустить этот, если только он не знает, что нужно вернуться и проверить шаблон с тем же именем, но вы понимаете) Я считаю, что если повторный пользователь собирается поместить миллионы страниц в очередь, он должен иметь возможность решить , хочет ли он, чтобы последнее обновление в модуле было передано вместе, или оно может подождать. Wnt ( разговорное ) 15:52, 22 января 2014 (UTC)
- Я бы сказал нет. В (на самом деле довольно редком) случае, когда вам нужно обновить широко распространенный модуль, чтобы добавить некоторые функции, я думаю, что лучше просто принять попадание в очередь заданий, чтобы избежать фрагментации кодовой базы. Чтобы иметь пространство имен модуля, которое имеет какой-то смысл, лучше всего иметь только один модуль, который выполняет одно действие, не беспокоясь о копиях модуля, которые могут или не могут делать то же самое, немного по-другому. Кроме того, посмотрите графики очереди заданий на Ganglia, чтобы узнать, насколько быстро очередь заданий сокращается. Это может быть быстрее, чем вы думаете, но есть также несоответствие между скоростью, показанной на графиках, и моим опытом в отношении того, насколько быстро категории обновлялись в последнее время. Может быть, кто-то, кто знает больше об очереди заданий, сможет рассказать вам, что именно там происходит. - Г-н Страдивари ♪ выступление ♪ 16:21, 22 января 2014 г. (UTC)
- Точно, если мы действительно столкнемся с долгосрочными проблемами с очередью заданий, мы, вероятно, сможем сделать некоторые запросы для дальнейшей оптимизации ее для этих сценариев. Обновление страниц категорий - это работа с очень низким приоритетом и завершается каскадным эффектом обновления шаблона, поэтому вы видите несоответствие в темпах. В остальном действуют те же правила, что и всегда. Не беспокойтесь о производительности, но не делайте того, что, как вы знаете, проблематично, без причины. Так что не обновляйте один и тот же шаблон / модуль с более чем миллиардом использований, 3 дня подряд, если бы вы могли сделать это за один раз. - Th е DJ ( разговор • вклад ) 16:29, 22 января 2014 (UTC)
- Похоже, что аргумент, который вы делаете, соразмерен: поскольку очередь заданий может уменьшаться до миллиона страниц в день (если я правильно прочитал эти графики), нам не о чем сильно беспокоиться. Но я должен спросить - есть ли у нас представление об абсолютных затратах? Электричество, углеродный след и все такое? Если Википедия достаточно велика, то может стоить дополнительная работа в человеческом масштабе. Кроме того, Lua все еще новый, а модули стоит потребовать даже немного новее. Можем ли мы быть уверены, что по мере увеличения количества требований мы не достигнем точки, когда человек внесет одно изменение, скажем, в модуль: аргументы , и весь кеш будет уничтожен? Wnt ( разговорное ) 16:49, 22 января 2014 (UTC)
- Не беспокойтесь о затратах. Человеческие усилия никоим образом не соответствуют технологиям здесь по углеродному следу, я совершенно уверен: D Однако микромодули, такие как аргументы, действительно, возможно, лучше не использовать в более крупных шаблонах. Однако копирование htmlbuilder в другой модуль кажется менее умным. Элементарная математика, возможно, еще раз внедрите ее для больших мальчиков. Просто подумайте об этом как следует. Как часто это реально может меняться, насколько он маленький / большой и сколько других модулей его используют. Это не ограничивается скриптами lua, это на самом деле золотое правило любой программной системы. (обычно вы не собираетесь опрашивать другой сервер на предмет небольшого факта, если вы можете получить те же данные локально, повторно реализовав их). - Th е DJ ( Обсуждение • вклад ) 17:00, 22 января 2014 (UTC)
- Обсудив вакансии в IRC, Чад создал bugzilla: 60348 для улучшения очереди заданий. - Th е DJ ( разговор • вклад ) 16:53, 22 января 2014 (UTC)
- Похоже, что аргумент, который вы делаете, соразмерен: поскольку очередь заданий может уменьшаться до миллиона страниц в день (если я правильно прочитал эти графики), нам не о чем сильно беспокоиться. Но я должен спросить - есть ли у нас представление об абсолютных затратах? Электричество, углеродный след и все такое? Если Википедия достаточно велика, то может стоить дополнительная работа в человеческом масштабе. Кроме того, Lua все еще новый, а модули стоит потребовать даже немного новее. Можем ли мы быть уверены, что по мере увеличения количества требований мы не достигнем точки, когда человек внесет одно изменение, скажем, в модуль: аргументы , и весь кеш будет уничтожен? Wnt ( разговорное ) 16:49, 22 января 2014 (UTC)
- Точно, если мы действительно столкнемся с долгосрочными проблемами с очередью заданий, мы, вероятно, сможем сделать некоторые запросы для дальнейшей оптимизации ее для этих сценариев. Обновление страниц категорий - это работа с очень низким приоритетом и завершается каскадным эффектом обновления шаблона, поэтому вы видите несоответствие в темпах. В остальном действуют те же правила, что и всегда. Не беспокойтесь о производительности, но не делайте того, что, как вы знаете, проблематично, без причины. Так что не обновляйте один и тот же шаблон / модуль с более чем миллиардом использований, 3 дня подряд, если бы вы могли сделать это за один раз. - Th е DJ ( разговор • вклад ) 16:29, 22 января 2014 (UTC)
- Создание локальных избыточных вилок часто происходит быстрее, но требует планирования: десятилетия назад, когда персональные компьютеры были намного медленнее / меньше, мне приходилось разбивать исходный код на избыточные локальные копии функций языка программирования C , не из-за переформатирования для клиентов, а скорее из-за обширных наборов тестовых данных, необходимых для выявления сбоев во время громоздкого регрессионного тестирования финансового программного обеспечения, которое, если бы оно не было разделено на разделы, длилось бы месяцами. Помимо простой ракетостроения , изобретенные правила финансов (спросите Джимбо) превосходят скудные проблемы путешествий в пространстве-времени с более чем 18 независимыми переменными благодаря специальным вариантам расчета для единовременного / совместного кредитного страхования жизни финансовых выплат. Конечно, вероятность появления ошибки в базовых модулях «require ()» может казаться редкой, но как только такая ошибка возникает, вся задержка становится «двойной проблемой» для повторного развертывания с новым исправлением ошибки, как сейчас удвоить усилия, чтобы установить вторую новую версию. Конструкция вилок конфигурации с почти дублированием требует некоторого дополнительного отслеживания (и документации), но она работает: космические шаттлы НАСА фактически были технологическими вилками предыдущих шаттлов, позволяя новые функции (новые компьютерные технологии) в следующем шаттле, но предоставляя некоторая базовая совместимость, которая оставалась постоянной между различными шаттлами. Я думаю, что разделение между избыточными вилками конфигурации было бы больше похоже на правило 80/20 (а не на разветвление на 50-50%), и поэтому 80% страниц будут использовать стабильную вилку (редко изменяемую), но остальные 20 % использования может составлять 5 разных (но похожих) вилок, которые обновляются чаще, и иногда все 5 дополнительных вилок из 20% будут обновлены для одной и той же новой функции, но отдельно от исходной 80% -ной версии, которая может быть спустя несколько месяцев переоборудовали. Реальный пример ужасов развертывания (когда вилки запрещены) см. В разделе: « Template_talk: Convert # Развертывание обновлений теперь в 18 000 раз медленнее ». Чтобы разделить шаблон: преобразование в вилки конфигурации, разделение может быть выполнено по типу единиц: м / фут, км / мили, фунты / кг будут отдельными вилками (редко меняются), в то время как, возможно, 25% преобразований используют другие единицы, которые требуют большего новые возможности. Идея состоит в том, чтобы дублировать базу кода в соответствии с вероятностью появления новых / измененных функций в определенных подмножествах общего количества, затем стабилизировать и отделить неизменяемые части (которые, вероятно, будут составлять ~ 70% -80% использования). - Wikid77 ( обсуждение ) 17:29, 22 января 2014 г. (UTC)
Номинация MfD от Википедии: Lua / To do
Википедия: Lua / To do , страница, в которую вы внесли существенный вклад, была номинирована на удаление . Ваше мнение по этому поводу приветствуется; пожалуйста, примите участие в обсуждении, добавив свои комментарии в Википедию: Разное для удаления / Википедия: Lua / Сделать и не забудьте подписать свои комментарии четырьмя тильдами (~~~~). Вы можете редактировать содержимое Wikipedia: Lua / To do во время обсуждения, но не должны удалять шаблон для удаления из верхней части страницы; такое удаление не завершит обсуждение удаления. Спасибо. Депип ( разговор ) 23:55, 21 мая 2015 (UTC)
- В результате получился Keep . - Депип ( разговор ) 11:27, 9 июня 2015 (UTC)