stringtranslate.com

Википедия:Расширенное кодирование шаблонов

Существуют некоторые продвинутые методы кодирования шаблонов для улучшения отображения или редактирования шаблонов в Википедии . Существуют также некоторые тактики отладки параметров шаблонов в языке разметки MediaWiki . Если есть возможность, лучше использовать модули lua .

Многие ошибки связаны с трудностями в работе с некоторыми неудобными функциями в языке разметки, которые приводят к ошибкам кодирования. Несбалансированные метасимволы являются основным источником ошибок. Например, кодирование {{1}}}вместо {{{1}}}заставляет его действовать так, как будто это {{1}} }, тем самым вызывая Template:1 + "}".

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

Уровни вложенности ограничены 40

Внутри одного шаблона ограничение вложенности составляет 40 вложенных выражений, например 40 множественных "if-then-else-if..." . На 41-м вложенном ключевом слове "if" может появиться сообщение об ошибке, например: "Exceeded nesting limit" (Превышен предел вложенности) . Однако, если вложенность не превышает 40 уровней, шаблон может содержать сотни выражений if и ветвей switch, но не все они вложены в другие.

Некоторые шаблоны содержали сложные условные вычисления, вложенные на глубину более 23 уровней, в течение многих лет. Также некоторые шаблоны содержали сотни выражений if, в течение многих лет, просто НЕ все вложенные как одно, гигантское: if-then-else-else-else-else-else... .

MediaWiki вики-форматирует предложения внутри #if

Проблема, которая усложняет обработку шаблонов для параметров, заключается в вики-форматировании содержимого параметров внутри if-logic (например, #if или #ifeq) или #switch (или lc:, lcfirst:, uc:, ucfirst:). По состоянию на май 2012 года анализатор разметки MediaWiki все еще вики-форматирует содержимое параметров внутри #if-выражений (но не снаружи). Это означает, что параметры, содержащие пробелы, начальную точку с запятой, двоеточие (":") или знак фунта ("#"), могут изменять свои значения, находясь внутри if-предложений (сюрприз!). Так, например, параметр, {{{4}}}находящийся вне #if, может отображаться иначе, чем внутри {{#ifeq:{{{1}}}=0|{{{4}}} ...}}. Хуже всего, когда параметр 4 содержит начальную точку с запятой, что приводит к форматированию, становящемуся ye-olde жирным шрифтом заголовочной строки точки с запятой :

TEST 1: {{#if:{{{4|}}}|{{{4|;}}} <== yes, semicolon|no, 4=empty}}
TEST 2: {{#if:{{{4|;}}}|{{{4|;}}} <== yes, semicolon|no, 4=empty}}

Проблема возникает внутри выражений разметки #if, #ifexpr, #ifeq или #switch. Если параметру предшествует текст в любом из предложений then/else, то вики-форматирование внутри параметра не выполняется.

TEST 3: {{#ifexpr:{{{1|7}}}=7|<b></b>{{{4|;}}} equals 7|not 7}}
TEST 4: {{#ifexpr:{{{1|7}}} < 9|{{{4|#}}} LESS THAN 9|not<9}}
TEST 5: {{#ifexpr:{{{1|7}}} < 9|&#32;{{{4|#}}} LESS THAN 9|not<9}}
TEST 6: "{{#ifexpr:{{{1|7}}} < 9|&#32;{{{4|#}}} LESS THAN 9|not<9}}"

В ТЕСТЕ 4 начальный знак решетки "#" вызвал автоматическую нумерацию строки (с отступом "1."). Ситуация с начальной точкой с запятой, двоеточием или "#" может быть относительно редкой, но это просто напоминание: для отображения истинного содержимого параметра шаблона попробуйте отобразить параметр вне начала любых предложений оператора if или отобразить другой текст перед параметром внутри логики if, или же приготовьтесь к шокирующим результатам, когда параметр отформатирован в вики для отображения внутри логики if.

Если результат #if и т. д. не подлежит форматированию, то использование &#35;, &#58;, и &#59;вместо #, :, и ;будет работать нормально.

TEST 7: {{#ifexpr:{{{1|7}}} < 9|{{{4|&#35;}}} LESS THAN 9|not<9}}

Отладка

Многие ошибки кодирования можно отладить, что проще, попытавшись изолировать раздел кода, где ошибки кодирования, скорее всего, произошли. Интенсивная вычитка логического потока, как правило, является самым быстрым исправлением, например, проверка на типичные синтаксические ошибки (см. ниже: «Распространенные ошибки кодирования»). Иногда раздел проблемного кода можно скопировать на короткую тестовую страницу, а затем с помощью edit-preview протестировать его там отдельно. Однако, если редактирование этого окна дополнительной страницы кажется слишком трудоемким, то рассмотрите возможность простого копирования кода в начало текущего шаблона. Аналогично, шаблон может быть разработан на ранних стадиях как несколько разделов кода, каждый из которых будет отлаживаться отдельно, а затем в конечном итоге объединен вместе, например, вложенные разделы с if-then-else-if.

В качестве обзора этих вариантов рассмотрите:

Основная стратегия: изолировать участок кода, подлежащий отладке.

Далее, тестирование каждого раздела кода имеет решающее значение. Есть несколько старых поговорок, которые стоит принять во внимание:

Возможно, поместите множество примеров на подстраницу документации каждого шаблона, чтобы помочь обнаружить проблемы на ранних этапах разработки. Однако для сложных шаблонов, тогда страница обсуждения или специальная подстраница "/testcases" должны содержать раздел с многочисленными примерами (целым множеством примеров), чтобы продемонстрировать весь спектр возможностей шаблона.

Параметры по умолчанию в выражениях и if-логике

При разработке разделов разметки, использующих параметры шаблона, старайтесь всегда задавать каждому параметру значение по умолчанию, особенно внутри выражений или кодирования if-logic:

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

Если этим параметрам не заданы значения по умолчанию, то эти разделы кода не могут быть протестированы во время редактирования-предварительного просмотра при редактировании шаблона. Любой параметр без значения по умолчанию станет буквальным текстом в тройных скобках (например, буквальными 7 символами: ), а не заданные по умолчанию параметры не могут быть оценены в выражениях или if-логике во время редактирования-предварительного просмотра страницы шаблона.{{{x}}}

Распространенные ошибки кодирования

Существует несколько распространенных ошибок кодирования, которые могут вызвать проблемы при обработке шаблонов. Ниже приведен контрольный список, который поможет отладить проблемы, когда шаблон ведет себя странно:

При пропуске двоеточия текст становится буквальным:{{#ifexpr {{{1|y}}}=0|then zero|else not}}

Обратите внимание, что эти распространенные ошибки кодирования можно было бы легко обнаружить с помощью простого средства проверки синтаксиса, например, предупреждение о том, что 3 и 2 фигурные скобки могут вызвать проблемы: рассматривается как «{Template:Size», пытающееся передать 180px в качестве параметра из-за всего 2 конечных фигурных скобок.{{{size|180px}}

Опять же, всегда проверяйте сначала на наличие распространенных ошибок, как первый шаг, чтобы избежать траты времени на поиск "сложных ошибок", которых на самом деле никогда не было. Помните: язык разметки MediaWiki чрезвычайно подвержен ошибкам, поэтому так много ошибок кодирования, и вот почему:

Рассматривайте вышеизложенное как контрольный список, который следует попробовать в первую очередь, как своего рода проверку работоспособности шаблона.

Многие ужасные проблемы на самом деле можно решить всего лишь исправлением синтаксиса за 1 минуту.

Кодирование шаблона, позволяющего подстановку WP:SUBST

  • WP:ПОДСТАВИТЬ

В редких случаях может потребоваться переписать шаблон, чтобы разрешить подстановку текста (согласно WP:SUBST ), где результаты запуска шаблона будут сохранены на странице во время операции edit-SAVE. В этом случае safesubst-prefix должен быть вставлен в каждую функцию разметки, используемую внутри этого шаблона, на каждом уровне вложенной логики. Кроме того, каждый комментарий HTML должен быть окружен тегами "noinclude": . [a] В противном случае все запущенные комментарии HTML будут сохранены внутри СОХРАНЕННОЙ страницы в последовательности, выполненной при запуске шаблона. ПРИМЕЧАНИЕ. Все дополнительные "noinclude" и ключевые слова, вероятно, потребуют повторного отступа разметки шаблона внутри, чтобы вместить весь этот дополнительный вставленный текст, что расширит и загромоздит исходный стиль разметки.<noinclude><!--HTML comment HERE--></noinclude>safesubst:<noinclude/>

В частности, чтобы изменить шаблон, чтобы разрешить замену текста, префикс должен быть вставлен внутри открывающей двойной скобки каждой функции разметки внутри этого шаблона. Несколько примеров вставки safesubst-prefix в разметку шаблона:safesubst:<noinclude/>{{

В общем случае, каждая функция разметки, которая начинается с двойной скобки, {{должна быть изменена для вставки длинного safesubst-префикса (без пробела после него). [b] Действие ключевого слова "safesubst" заключается в том, чтобы разрешить условную подстановку разметки, когда весь шаблон вызывается как {{subst:MyTemplate|...}}. По сути, ключевое слово "safesubst" можно было бы назвать "ifsubst", что означает, "если 'subst:' был использован для вызова этого шаблона, то подставить и здесь".safesubst:<noinclude/>

Помните: safesubst-prefix должен быть вставлен в каждую функцию разметки внутри этого шаблона, за исключением тестовой логики, которая никогда не используется на реальной странице. Любая разметка, в которой отсутствует "safesubst", завершится ошибкой, если шаблон будет выполнен в режиме subst, "{{subst:MyTemplate|...}}". Параметры не изменяются, поэтому останутся неизменными без safesubst-prefix.{{{1}}}

Исключения: Только логика, которая никогда не будет сохранена на странице, может опускать "safesubst", например, тестовая логика, которая запускается специальными значениями параметров, никогда не используемыми внутри сохраненной страницы. Любая разметка, которая опускает "safesubst", будет работать только во время обычного включения, но не будет работать, если шаблон выполняется с использованием префикса subst-mode "subst:". Дополнительные примеры и технические пояснения см. в разделе: WP:Substitution .

Отступы длинных строк: Весь добавленный текст safesubst-prefix расширит строки, поэтому для улучшения читаемости их можно разделить и сделать отступ перед любым из префиксов. Например:safesubst:<noinclude/>

В этом стиле отступа текст "safesubst:<noinclude/>" начинает следующую строку. Избегайте переноса строки после префикса , поскольку несколько функций разметки могут работать некорректно, если префикс safesubst не будет добавлен непосредственно перед ключевым словом, напримерsafesubst:<noinclude/>{{&nbsp;safesubst:<noinclude/>#ifeq:...}}

Примеры очень больших шаблонов

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

Форматировщик исходных сносок Template:Citation/core отображает стандартизированный формат цитаты, вызываемый несколькими шаблонами-оболочками, которые передают сотни параметров, где основная логика проверяет 621 значение параметра в выражениях условной разметки.

Попробуйте программирование

Страница Special:ExpandTemplates берет некоторый викитекст и рекурсивно расширяет все, что заключено в двойные скобки: шаблоны, функции синтаксического анализатора , такие как {{#if:...}}, и переменные, такие как {{CURRENTDAY}}.

Смотрите также

Примечания

  1. ^ Но если вы хотите, чтобы HTML-комментарий отображался, как, например, в шаблонах предупреждений для пользователей , то не заключайте HTML-комментарий в <noinclude>теги.
  2. ^ Если вы знакомы с регулярными выражениями , вы можете сделать это следующим образом:
    • Найдите шаблон ([^{]){{([^{])и замените его на\1{{ safesubst:<noinclude/>\2
    Или, за один шаг, для одного стиля регулярного выражения:
    • s/([^{]){{([^{])/\1{{ safesubst:<noinclude/>\2/g
    Вам может понадобиться разбить длинные строки; см. "Отступы длинных строк" в этом разделе. С практической точки зрения проще объединять строки кода, чем разбивать их, поэтому если вы замените пробел в шаблоне замены выше на новую строку (плюс необязательный пробел), это приведет к разрыву строк при каждой замене; когда это будет сделано, просто вернитесь и объедините все слишком короткие строки.