위키백과:고급 템플릿 코딩

Wikipedia

Wikipedia에서 템플릿의 표시 또는 편집을 개선하기 위한 고급 템플릿 코딩 기술이 있습니다.MediaWiki 마크업 언어에서 템플릿 매개 변수를 디버깅하기 위한 몇 가지 전술도 있습니다.가능성이 있다면 루아 모듈을 사용하는 것이 좋습니다.

많은 버그는 코딩 오류로 이어지는 마크업 언어의 일부 어색한 기능을 처리하는 어려움과 관련이 있습니다.불균형 메타 문자는 주요 오류 원인입니다.예: 코드화{{1}}}대신에{{{1}}}마치 그런 것처럼 행동하게 합니다.{{1}} }템플릿:1 + "}"을 호출합니다.

#if-expression 내부에서는 매개 변수의 내용에 대한 Wiki 형식의 차이가 있지만 외부에서는 그렇지 않습니다.대체해야 하는 템플릿은 특별한 처리가 필요합니다.매개 변수 기본값 또는 매개 변수 별칭 제공도 다룹니다.

중첩 수준이 40으로 제한됨

단일 템플리트 내에서 중첩 제한은 40개의 중첩된 표현식(예: "if-then-else-if...")입니다.41번째 중첩된 "if" 키워드에 "nesting limit 초과됨"과 같은 오류 메시지가 나타날 수 있습니다.그러나 40개 수준을 초과하여 중첩되지 않은 경우 템플릿에는 수백 개의 if-표현식 및 스위치 분기가 포함될 수 있지만 나머지 항목에 모두 내포된 것은 아닙니다.

일부 템플릿에는 수년 동안 23개 수준 이상의 깊이에 중첩된 복잡한 조건부 계산이 포함되어 있습니다.또한, 몇 년 동안 일부 템플릿에는 수백 개의 if-표현식이 포함되어 있습니다. 모두 하나로 내포되어 있지는 않습니다. 즉, if-then-else-else-else-else-else...

MediaWiki 위키는 #if 내부의 절을 포맷합니다.

매개 변수의 경우 템플릿 처리를 복잡하게 만드는 문제는 if-logic(예: #if 또는 #ifeq) 또는 #switch(또는 lc:, lcfirst:, uc:, ucfirst:) 내부에 있을 때 매개 변수 내용의 위키 형식화입니다.2012년 5월 현재 미디어위키 마크업 파서는 여전히 #if-expression 내부에 있을 때 매개 변수의 내용을 위키 형식으로 지정하고 있습니다.즉, 공백, 리드 세미콜론, 콜론(":") 또는 파운드 기호("#")를 포함하는 매개변수가 if-clause(깜짝!) 내에 있는 동안 값을 변경할 수 있습니다.예를 들어, 매개변수는{{{4}}}#if를 벗어나면 내부와 다르게 표시할 수 있습니다.최악의 충격은 매개 변수 4에 선행 세미콜론이 포함되어 있어 형식이 오래된 굵은 글꼴 세미콜론-헤더 라인이 되도록 트리거하는 경우입니다.

TEST 1: {{#if:{{{4 }}} {{{4 ;}}} <== yes, semicolon no, 4=empty}}
TEST 2: {{#if:{{{4 ;}}} {{{4 ;}}} <== yes, semicolon no, 4=empty}}
테스트 1: 아니요, 4=비어 있음
테스트 2:
<== 예, 세미콜론
<== 세미콜론-디버깅의 별도 예

이 문제는 #if, #ifexpr, #ifeq 또는 #switch 마크업 식 내부에서 발생합니다.매개 변수 앞에 net/else 절이 있는 경우 매개 변수 내부의 Wiki 형식이 발생하지 않습니다.

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}}"
테스트 3:;는 7과 같습니다.
테스트 4:
  1. 9 미만
테스트 5: 9 미만의 번호
테스트 6: "# 9 미만"

테스트 4에서 선행 파운드 기호 "#"이 라인의 자동 번호 매기기("1"로 들여쓰기)를 트리거했습니다.선행 세미콜론, 콜론 또는 "#"을 갖는 상황은 상대적으로 드물 수 있지만, 이것은 단지 주의사항일 뿐입니다: 템플릿 매개변수의 실제 내용을 표시하기 위해, if-statement 절의 시작 부분 밖에 매개변수를 표시하거나, if-logic 내부의 매개변수 앞에 다른 텍스트를 표시합니다.그렇지 않으면 if-logic 내부에 표시하기 위해 매개 변수가 Wiki로 표시될 때 몇 가지 충격적인 결과를 준비합니다.

#if 등의 결과를 포맷하지 않을 경우,&#35;,&#58;,그리고.&#59;대신에#,:,그리고.;잘 될 겁니다.

TEST 7: {{#ifexpr:{{{1 7}}} < 9 {{{4 &#35;}}} LESS THAN 9 not<9}}
테스트 7: 9 미만의 번호

디버깅

코딩 오류가 발생할 가능성이 가장 높은 코드 섹션을 분리하여 많은 코딩 오류를 더 쉽게 디버깅할 수 있습니다.논리 흐름에 대한 강력한 교정은 일반적인 구문 오류를 확인하는 것과 같은 가장 빠른 해결책입니다(아래 참조: "일반적인 코딩 오류").때때로 문제가 있는 코드의 섹션을 짧은 테스트 페이지로 복사한 다음 편집 미리 보기를 통해 별도로 테스트할 수 있습니다.그러나 해당 추가 페이지 창을 편집하는 것이 너무 번거로운 경우에는 코드를 현재 템플리트의 맨 위에 복사하는 것을 고려하십시오.마찬가지로 템플릿은 초기 단계에서 여러 코드 섹션으로 개발되어 각각 개별적으로 디버깅된 다음 if-then-else-if가 있는 중첩 섹션과 같이 함께 결합될 수 있습니다.

이러한 옵션을 검토할 때는 다음을 고려해야 합니다.

  • 문제가 되는 코드를 주의 깊게 교정하여 "{{}"와 "}}"을 일치시키십시오. (메모장++에는 Equazcion의 구문 강조 표시기를 사용하는 것이 좋습니다.)
  • 디버그를 위해 템플릿 섹션을 테스트 페이지 편집 창에 복사합니다.
  • 디버그를 위해 템플릿 섹션을 템플릿 맨 위에 복사합니다.
  • 각 섹션이 더 분리되도록 템플릿을 재구성합니다.

기본 전략은 디버깅할 코드 섹션을 분리하는 것입니다.

다음으로, 코드의 각 섹션에 대한 테스트가 중요합니다.주의해야 할 몇 가지 오래된 격언이 있습니다.

  • 테스트를 하지 않으면 작동하지 않습니다.
  • 검사하는 것을 기대할 수 있습니다. (W. Edwards Deming)

각 템플릿의 문서 하위 페이지에 다양한 예제를 추가하여 개발 초기에 문제를 탐지할 수 있습니다.그러나 복잡한 템플릿의 경우, 대화 페이지 또는 특별 하위 페이지 "/테스트 사례"에는 템플릿 기능의 전체 범위를 보여주는 수많은 예제 섹션이 포함되어야 합니다.

식 및 if-logic의 기본 매개 변수

템플릿 매개 변수를 사용하는 마크업 섹션을 개발할 때는 각 매개 변수를 항상 기본값(특히 내부 식 또는 if-logic 코딩)으로 설정합니다.

  • {{#expr: 109.75 / {{{1 1}}} }}기본값 {1}은(는) 0이 아닌 1입니다.
  • {{#ifeq: {{{answer y}}} y show yes}}

특정 매개 변수에 전체 페이지에서 동일한 기본값이 지정된 경우 텍스트 편집기에서 글로벌 검색 및 바꾸기 문자열 대체를 통해 각 대소문자를 테스트하기 위해 기본값을 다른 값으로 쉽게 변경할 수 있습니다.

이러한 매개 변수에 기본값이 지정되지 않으면 템플릿을 편집하는 동안 편집 미리 보기 중에 코드 섹션을 테스트할 수 없습니다.기본값이 없는 매개 변수는 리터럴 트리플 브레이스 텍스트(예: 리터럴 7 문자)가 됩니다.{{{x}}}) 및 기본값이 아닌 매개 변수는 템플릿 페이지를 편집하는 동안 식 또는 if-logic으로 평가할 수 없습니다.

일반적인 코딩 오류

템플릿을 처리할 때 문제를 일으킬 수 있는 몇 가지 일반적인 코딩 오류가 있습니다.다음은 템플릿이 이상하게 작동하는 경우 문제를 디버깅하는 데 도움이 되는 체크리스트로 사용할 수 있습니다.

  • 닫는 중괄호가 너무 적음:일반적인 문제는 다음과 같은 매개 변수 번호 또는 이름 주위에 닫는 괄호를 2개만 두는 것입니다.{{{1}}클로징 브레이스가 2개뿐입니다.}}에서는 매개 변수를 "Template:1"(단일 "{" 브레이스 앞에 있음)이라는 이름의 템플릿으로 처리할 수 있습니다.
  • 열지 않은 주석:삽입하는 것을 잊었습니다.<!--HTML의 시작 부분에서 설명은 오류 메시지 없이 이상한 결과를 초래할 수 있습니다.느낌표를 잊어버리는 것은 매우 일반적입니다.<--그래야 한다<!--.
  • 비공개 댓글:삽입하는 것을 잊었습니다.-->HTML의 끝에 있는 주석은 오류 메시지 없이 이상한 결과를 초래할 수 있습니다.
  • "#ifexpr"에서 콜론 또는 "#" 생략: "#ifexpr:" 또는 "#expr:"에 "#" 또는 "#expr:"을 삽입하는 것을 잊으면 다른 하위 템플릿으로 전달될 때 이상한 결과가 나올 수 있습니다.
콜론 생략은 리터럴 텍스트가 됩니다.{{#ifexpr {{{1 y}}}=0 then zero else not}}

이러한 일반적인 코딩 오류는 3&2 브레이스가 문제가 될 수 있다는 경고와 같은 간단한 구문 검사기를 통해 쉽게 발견될 수 있습니다.{{{size 180px}}"{Template:크기"가 두 개의 끝 괄호 때문에 180px를 매개 변수로 전달하려고 합니다.

다시 말하지만, 첫 번째 단계로 항상 일반적인 오류를 먼저 확인하면 실제로 존재하지 않았던 "복잡한 오류"에 대한 시간 탐색을 피할 수 있습니다.MediaWiki 마크업 언어는 매우 오류가 발생하기 쉬우므로 많은 코딩 오류가 발생하고 다음과 같은 이유가 있습니다.

위의 내용을 템플릿에 대한 건전성 검사 유형으로 먼저 시도할 체크리스트로 간주합니다.

많은 끔찍한 문제들은 정말로 1분짜리 구문 수정일 뿐입니다.

WP를 허용하도록 템플릿 코딩:SUST 치환

드문 경우이지만 텍스트 대체를 허용하기 위해 템플릿을 다시 작성해야 할 수도 있습니다(WP에 따라).SUST), 여기서 템플릿 실행 결과는 편집-저장 작업 중에 페이지에 저장됩니다.이 경우 안전 하위 접두사는 모든 중첩 논리 수준에서 해당 템플릿 내에서 사용되는 모든 마크업 함수에 삽입되어야 합니다.또한 모든 HTML 주석은 "포함 안 함" 태그로 둘러싸야 합니다.<noinclude><!--HTML comment HERE--></noinclude>그렇지[a] 않으면 트리거된 모든 HTML 주석이 템플릿을 실행하여 실행한 순서대로 SAVEd 페이지 내에 저장됩니다.참고: 추가된 모든 "no include" 및safesubst:<noinclude/>키워드는 추가로 삽입된 텍스트를 모두 맞추기 위해 템플릿의 마크업을 내부에 다시 들여쓰기해야 하므로 원래 마크업 스타일이 확장되고 혼란스러울 수 있습니다.

구체적으로, 텍스트 대체를 허용하도록 템플릿을 변경하려면safesubst:<noinclude/>개구부 이중 나사 안쪽에 삽입해야 합니다.{{해당 템플릿 내의 각 마크업 함수의.템플릿의 마크업 내부에 안전한 하위 접두사를 삽입하는 몇 가지 예:

  • Total articles now: {{NUMBEROFARTICLES}}→ 6,694,380
  • Total articles was: {{ subst:NUMBEROFARTICLES}}→ 3,953,715
  • {{ safesubst:<noinclude/>#ifeq:{{{1 AX}}} AX yes}}
  • {{ safesubst:<noinclude/>lc:THIS LOWERCASE TEXT}}이 소문자 텍스트

일반적으로 더블브레이스로 시작하는 모든 마크업 함수는{{긴 안전 하부 밸브를 삽입하도록 변경해야 합니다.safesubst:<noinclude/>(이후 [b]공백 없음).키워드 "safesubst"의 동작은 전체 템플릿이 {subst:}로 호출될 때 마크업의 조건부 대체를 허용하는 것입니다.내 템플릿...본질적으로 키워드 "safesubst"는 "ifsubst"를 의미로 "ifsubst:"라고 부를 수 있습니다. "만약 'subst:'가 이 템플릿을 호출하는 데 사용되었다면 여기서도 대체하십시오."

기억:안전 하위 접두사는 실제 페이지에서 사용되지 않는 테스트 로직을 제외하고는 템플릿 내의 모든 마크업 함수에 삽입해야 합니다.템플릿이 하위 모드 "{subst:내 템플릿...매개 변수는 변경되지 않으므로{{{1}}}안전한 서브스티커 없이는 변경되지 않을 것입니다.

예외:페이지에 절대 저장되지 않는 논리만이 저장된 페이지 내에서 사용되지 않는 특수 매개 변수 값에 의해 트리거되는 테스트 논리와 같은 "안전 하위 항목"을 생략할 수 있습니다."safesubst"를 생략한 마크업은 일반적인 변환 중에만 작동하지만 하위 모드 접두사 "subst:"를 사용하여 템플릿이 실행되면 실패합니다.자세한 예 및 기술적 설명은 WP:Substitution을 참조하십시오.

긴 줄 들여쓰기:추가된 모든 안전 하위 접두사 텍스트는 행을 넓히므로 가독성을 향상시키기 위해 다음 중 하나보다 먼저 분할하고 들여쓰기할 수 있습니다.safesubst:<noinclude/>접두사예:

  • {{ safesubst:<noinclude/>#ifeq:{{
    safesubst:<noinclude/>padleft: 1 {{{1}}} }} A Begins with "A"}}

해당 들여쓰기 스타일에서 "safesubst:<noinclude/>" 텍스트는 다음 행으로 시작합니다.접두사 뒤에 줄 바꿈 방지safesubst:<noinclude/>왜냐하면 안전한 하위 접두사가 키워드 앞에 바로 붙지 않으면 몇 가지 마크업 기능이 제대로 작동하지 않을 수 있기 때문입니다.{{&nbsp;safesubst:<noinclude/>#ifeq:...}}

매우 큰 템플릿의 예

더 복잡하거나 복잡한 작업을 수행하려고 할 때 템플릿이 필요한 만큼 커질 수 없다는 본능적인 두려움이 있을 수 있습니다.그러나 위키백과에서 수년간 실행되어 온 매우 큰 템플릿이 많이 있습니다. 예를 들어 다음과 같습니다.

소스-각주 포맷터, 템플릿:인용/core는 조건부 마크업 식에서 코어 로직이 621개의 매개 변수 값을 확인하는 수백 개의 매개 변수를 통과하는 여러 래퍼 템플릿에 의해 호출되는 표준 인용 형식을 표시합니다.

프로그래밍을 시도해 보십시오.

스페셜:템플릿 확장 페이지에서는 일부 위키 텍스트를 사용하여 템플릿, {{#if:...}와 같은 파서 함수와 같은 이중 가새로 모든 것을 재귀적으로 확장합니다.그리고 {{CURRENTDAY}}와 같은 변수.

참고 항목

노트

  1. ^ 그러나 예를 들어 사용자 경고 템플릿과 마찬가지로 HTML 주석을 표시하려면 HTML 주석을 다음에 포함하지 마십시오.<noinclude>꼬리표
  2. ^ 정규식에 익숙한 경우 다음과 같이 수행할 수 있습니다.
    • 패턴 검색([^{]){{([^{])그리고 그것을 대체합니다.\1{{ safesubst:<noinclude/>\2
    또는 한 단계에서 정규식의 한 스타일에 대해:
    • s/([^{]){{([^{])/\1{{ safesubst:<noinclude/>\2/g
    긴 줄을 구분해야 할 수도 있습니다. 이 절의 "긴 줄 들여쓰기"를 참조하십시오.실제로 코드 줄을 끊는 것보다 줄에 연결하는 것이 더 쉬우므로 위의 대체 패턴의 공백을 대신 새 줄(및 선택적 공백)로 바꾸면 모든 대체와 줄이 끊어집니다. 이 작업이 끝나면 다시 돌아가서 너무 짧은 줄에 연결하면 됩니다.