Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

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

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

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

Внутри одного шаблона ограничение на вложение составляет 40 вложенных выражений, например 40 множественных «if-then-else-if ...» . При 41-м вложенном ключевом слове «if» может появиться сообщение об ошибке, например: «Превышен предел вложенности» . Однако, если он не вложен более 40 уровней, шаблон может содержать сотни if-выражений и ветвей-переключателей, но не все вложенные внутри других.

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

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

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

ТЕСТ 1: {{#if: {{{4 |}}} | {{{4 |;}}} <== да, точка с запятой | нет, 4 = пусто}}
ТЕСТ 2: {{#if: {{{4 |;}}} | {{{4 |;}}} <== да, точка с запятой | нет, 4 = пусто}}

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

ТЕСТ 3: {{#ifexpr: {{{1 | 7}}} = 7 | <b> </b> {{{4 |;}}} равно 7 | а не 7}}
ТЕСТ 4: {{#ifexpr: {{{1 | 7}}} <9 | {{{4 | #}}} МЕНЬШЕ 9 | не <9}}
ТЕСТ 5: {{#ifexpr: {{{1 | 7}}} <9 | & # 32; {{{4 | #}}} МЕНЬШЕ 9 | не <9}}
ТЕСТ 6: "{{#ifexpr: {{{1 | 7}}} <9 | & # 32; {{{4 | #}}} МЕНЬШЕ 9 | не <9}}"

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

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

ТЕСТ 7: {{#ifexpr: {{{1 | 7}}} <9 | {{{4 | & # 35;}}} МЕНЬШЕ 9 | не <9}}

Отладка [ править ]

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

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

  • Попробуйте внимательно вычитать проблемный код, сопоставив "{{" с "}}". (рассмотрите возможность использования подсветки синтаксиса Equazcion для Notepad ++ )
  • Скопируйте раздел шаблона в окно редактирования тестовой страницы для отладки.
  • Скопируйте раздел шаблона в верхнюю часть шаблона для отладки.
  • Измените структуру шаблона, чтобы каждый раздел был более отделен.

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

Затем решающее значение имеет тестирование каждого раздела кода. Следует прислушаться к некоторым старинным пословицам:

  • Если он не был протестирован, значит, он не работает.
  • Вы можете ожидать того, что проверяете. ( У. Эдвардс Деминг )

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

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

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

  • {{#expr: 109.75 / {{{1|1}}} }} → по умолчанию {1} равно 1, а не нулю.
  • {{#ifeq: {{{answer|y}}}|y|show yes}}

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

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

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

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

  • Слишком мало закрывающих фигурных скобок. Распространенная проблема - поставить только две закрывающие фигурные скобки вокруг номера или имени параметра, например . Наличие только двух закрывающих фигурных скобок может рассматривать параметр как шаблон с именем «Шаблон: 1» (которому предшествует одиночная фигурная скобка «{»).{{{1}}}}
  • Неоткрытые комментарии: если вы забудете вставить комментарий<!-- в начале HTML-комментария, это может привести к странным результатам без сообщения об ошибке. Очень часто забывают восклицательный знак: должно быть .<--<!--
  • Незакрытые комментарии: если вы забудете вставить комментарий--> в конце HTML-комментария, это может привести к странным результатам без сообщения об ошибке.
  • Отсутствие двоеточия или «#» в «#ifexpr»: если вы забудете вставить «#» или двоеточие для «#ifexpr:» или «#expr:», это может привести к странным результатам при передаче в другие подшаблоны.
Отсутствие двоеточия становится буквальным текстом: {{#ifexpr {{{1|y}}}=0|then zero|else not}}

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

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

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

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

Кодирование шаблона, разрешающего замену WP: SUBST [ править ]

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

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

  • Total articles now: {{NUMBEROFARTICLES}} → 6 283 614
  • Total articles was: {{ subst:NUMBEROFARTICLES}} → 3 953 715
  • {{ {{{|safesubst:}}}#ifeq:{{{1|AX}}}|AX|yes}}
  • {{ {{{|safesubst:}}}lc:THIS LOWERCASE TEXT}} → этот строчный текст

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

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

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

Отступ для длинных строк: весь добавленный текст safesubst-prefix будет расширять строки, поэтому для улучшения читаемости они могут быть разделены и с отступом после тройных скобок "в любом из префиксов. Например:"{{{""{{{|safesubst:}}}"

  • {{ {{{|safesubst:}}}#ifeq:{{ {{{
           |safesubst:}}}padleft:|1|{{{1}}} }}|A|Begins with "A"}}

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

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

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

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

Попробуй программировать [ править ]

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

См. Также [ править ]

  • WP: Подавление категорий
  • WP: Расширенное редактирование статей
  • WP: Расширенное форматирование сносок
  • WP: Расширенное форматирование таблиц
  • WP: расширенное форматирование текста
  • РГ: Мышление вне информационного бокса
  • РГ: Предупреждение
  • Справка: знаки препинания
  • РГ: Ошибка Фонда Викимедиа
  • РГ: О переводе немецкой Википедии
  • РГ: Lua
  • {{ if }} и {{ Ifequal }}.
  • Шаблон: шаблон оболочки
  • m: Справка: Расчет

Заметки [ править ]

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