위키백과:낙서 가이드

Wikipedia
"쉿! 템플릿을 스크라이브하는 방법에 대해 읽고 있습니다."

이것은 낙서 가이드입니다.루아피케이션(Luafification)이라고도 하는 스크리빙은 스크리빙미디어위키로 확장하기 위해 템플릿을 작성하거나 템플릿을 변환하는 행위입니다.Scribunto[a] 확장은 Tim Starling과 Victor Vasiliev의해 개발되었으며 미디어위키에 스크립트 언어를 포함할 수 있습니다.현재 지원되는 스크립트 언어는 Lua뿐입니다.이 안내서는 스크립블링에 대한 광범위한 개요와 다양한 위치의 추가 정보에 대한 포인터를 제공하는 것을 목표로 합니다.

스크라이브된 템플릿은 템플릿 자체와 하나 이상의 백엔드 모듈의 두 부분으로 나뉩니다.Module:네임스페이스 - 템플릿이 확장되는 위키 텍스트를 생성하기 위해 위키 서버에서 실행되는 프로그램을 포함합니다.템플릿은 다음과 같은 이름의 새 파서 함수를 사용하여 모듈 내의 함수를 호출합니다.{{#invoke:}}.

Scribbling의 개념은 템플릿 처리 성능을 향상시키는 것입니다.스크라이브는 , , , 와 같은 파서 함수를 사용하는 템플릿 파서 함수 프로그래밍의 필요성을 제거합니다. 이 모든 것은 대신에 실제로 프로그래밍 언어가 되도록 설계된 언어로 모듈에서 수행됩니다.프로그래밍 [b]언어로 만들기 위해 시간이 지남에 따라 다양한 확장자를 볼트로 고정시킨 템플릿 시스템보다.또한 스크라이브를 사용하면 템플릿을 추가 템플릿으로 확장할 필요가 없으며 확장 깊이 제한에 도달할 수 있습니다.완전히 스크라이브된 템플릿은 다른 [c]템플릿을 제외할 필요가 없습니다.

루아

모듈이 작성되는 언어는 Lua입니다.템플릿 파서 함수 시스템과 달리 Lua는 실제로 적절한 프로그래밍 언어일 뿐만 아니라 임베디드 스크립팅이라고 알려진 것에 적합한 프로그래밍 언어가 되도록 설계되었습니다.MediaWiki의 모듈은 포함된 스크립트의 예입니다.REXX와 tcl포함하여 사용될 수 있는 몇 가지 내장된 스크립트 언어가 있습니다. 실제로 Scribunto의 원래 목적은 이러한 언어를 선택할 수 있도록 하는 것이었습니다.그러나 현재는 Lua만 사용할 수 있습니다.

Lua의 공식 참조 매뉴얼은 Ierusalimschy, de Figueiredo & Celes 2006입니다.참고 자료이지 튜토리얼이 아닙니다.어떤 것에 대한 구문이나 의미를 알고 싶다면 그것을 참고하세요.튜토리얼은 Ierusalimschy 2006(Ierusalimschy 2003도 사용할 수 있지만 물론 구식입니다.) 또는 Jung & Brown 2007을 참조하십시오.이 책들의 단점은 그들이 여러분에게 말하는 꽤 많은 것들이 미디어위키 모듈에서 루아를 사용하는 것과 관련이 없다는 것입니다.Lua를 설치하는 방법과 인터프리터를 프로그램에 통합하거나 독립적으로 실행하는 방법을 알 필요가 없습니다.미디어위키 개발자들이 이 모든 것을 해냈습니다.마찬가지로 많은 Lua 라이브러리 함수는 보안을 위해 모듈에서 사용할 수 없습니다. (예를 들어, 파일 I/O를 수행하거나 MediaWiki 모듈에서 운영 체제를 호출할 수 없습니다.)그래서, 이 책들이 루아 표준 도서관 기능과 언어와 함께 제공되는 변수에 대해 설명하는 것의 대부분은 여기서 관련이 없거나 사실이 아닙니다.

원래 API 사양인 모듈에서 사용할 수 있어야 하는 Lua 표준 라이브러리 함수 및 변수는 MW:Extension:/API 규격으로 스크리빙합니다.하지만, 그것조차도 사실이 아닙니다.실제로 사용할 수 있는 내용은 MW:Extension에 설명되어 있습니다.Scribunto/Lua 참조 매뉴얼은 Scribunto/Lua 참조 매뉴얼로 팀 스털링이 Scribbling의 현실에 맞게 편집 및 수정한 1st Edition Lua 매뉴얼의 컷다운 버전입니다.하지만 다시 말하지만, 이것은 참고 매뉴얼이지 튜토리얼이 아닙니다.

루아에서 여러분이 주로 관심을 가질 것은 스크라이브된 템플릿을 작성하는 것입니다. 테이블, 문자열 번호, 불리언,nil,if then else end,while do end,for in do end(생성된for),for do end(계속)for),repeat until,function end,local,return,break식 및 다양한 연산자(포함)#,..산술 연산자+,-,*,/,^,그리고.%), 및string,math,그리고.mw전역 테이블(즉, 라이브러리).

템플릿 구조

이것은 간단합니다.템플릿은 다음 중 하나의 확장으로 구성됩니다.{{#invoke:}}보통의 경우에는다음은 {{Harbard coptation}}입니다. 예는 다음과 같습니다.

<메시지만>{#메시지:각주 harvard_backet_left=(괄호_오른쪽 = )}}//backetonly><noinclude>{noinclude>{noinclude>{noinclude><!--/doc 하위 페이지에 카테고리를 추가하고, 위키백과를 여기에 추가합니다. --> </noinclude>

템플릿 내에서 다른 템플릿을 사용하거나 템플릿 파서 기능을 사용하거나 다음 이외의 다른 기능을 사용하려는 경우{{#invoke:}}변수를 인수로 사용하면 잘못된 접근 방식을 사용할 수 있습니다.

모듈 기본 사항

전체구조

가상 모듈인 모듈에 대해 생각해 보겠습니다.인구.(모듈 참조:비슷하지만 더 복잡한 모듈에 대한 모집단 클럭.두 가지 방법 중 하나로 구성할 수 있습니다.

명명된 로컬 테이블

현지의 p = {}  기능. p.인도()     돌아가다 "(명목적으로) 2011-03-01 00:00 +0530에 1,21,01,93,422명" 끝.  돌아가다 p 

명명되지 않은 테이블이 즉시 생성됨

돌아가다 {     인도 = 기능.()         돌아가다 "(명목적으로) 2011-03-01 00:00 +0530에 1,21,01,93,422명"     끝. } 

실행

모듈의 실행은 다음과 같습니다.{{#invoke:}}실제로는 두 가지입니다.

  1. 모듈이 로드되고 전체 스크립트가 실행됩니다.그러면 모듈에 필요한 추가 모듈이 로드됩니다(사용자 이름:require()function), 모듈이 템플릿에 제공할 (invocable) 함수를 빌드하고 테이블을 반환합니다.
  2. 에서 명명된 함수{{#invoke:}}1단계에서 작성된 테이블에서 선택되어 템플릿에 제공된 인수와 함께 호출됩니다.{{#invoke:}}(자세한 내용은 나중에).

첫 번째 Lua 스크립트는 단계 1을 상당히 명시적으로 수행합니다.로컬 변수를 생성합니다.p테이블에 초기화된 1행에서, 함수에 이름을 부여하여 함수를 빌드하고 추가합니다(3-5행).India라는 표에.p(function p.India라고 말하는 것과 같습니다.p["India"] = function그런 다음 테이블을 스크립트의 마지막 줄로 반환합니다[d](7행).이러한 스크립트를 더 많은 (호출 가능한) 기능으로 확장하기 위해, 그것들을 다음과 같은 사이에 추가합니다.local맨 위와 맨 위에 있는 진술return맨 아래에 있는 진술.호출되지 않는 로컬 함수는 다음과 같이 추가할 수 있습니다.local진술.)로컬 변수의 이름을 지정할 필요가 없습니다.p원하는 유효한 Lua 변수 이름으로 지정할 수 있습니다.p는 단순히 이 목적을 위한 일반적인 이름이며 모듈 편집기의 디버그 콘솔에서 스크립트를 테스트하는 데 사용할 수 있는 이름이기도 합니다.

두 번째 루아 스크립트는 동일한 작업을 수행하지만 더 "이념적"으로 수행합니다.이름이 지정된 변수를 테이블로 만드는 대신, 테이블 중간에 익명 테이블을 즉시 만듭니다.return스크립트에서 유일한(첫 번째 단계에서 실행되는) 문입니다.India = function(frame) end2-4행에서 (또한 익명) 함수를 만들고 이름으로 표에 삽입합니다.India이러한 스크립트를 더 많은 (호출 가능한) 함수로 확장하려면 테이블의 추가 필드로 추가합니다.(비호출 가능한 로컬 함수는 다음과 같이 다음과 같이 추가할 수 있습니다.)return진술.)

두 경우 모두, 작성하는 템플릿 코드는 템플릿 코드는{{#invoke:Population India}}이름이 붙은 함수를 호출합니다.India모듈 모듈에서:인구.또한 참고:function 호출할 함수를 개체로 만듭니다.다른 프로그래밍 언어에서 익숙한 것처럼 선언하지 않으며 호출될 때까지 함수가 실행되지 않습니다.

물론 이것보다 더 복잡한 일을 할 수 있습니다.예:다른 로컬 변수를 선언할 수 있습니다.p모듈이 사용하는 데이터 테이블(예: 언어 또는 국가 이름 목록)을 저장합니다.하지만 이것은 모듈의 기본 구조입니다.당신은 물건들로 가득 찬 테이블을 만들고, 그것을 돌려줍니다.

수신 템플릿 인수

Lua의 일반 함수는 (효과적으로) 임의의 수의 인수를 취할 수 있습니다.모듈에서 이 기능을 확인합니다.0에서 3 사이의 인수로 호출할 수 있는 Wikitext:

기능. z.옥스퍼드 리스트(논병아리,구분자,앰퍼샌드) 

호출된 함수{{#invoke:}}특별합니다.그들은 정확히 하나의 인수, 즉 프레임이라고 불리는 테이블이 전달되기를 기대합니다(따라서 일반적으로 매개 변수 이름이 주어집니다).frame함수의 매개 변수 목록에서).불행하게도, 개발자들이 그들의 편리함을 위해 그것의 이름을 선택했기 때문에 그것은 프레임이라고 불립니다.미디어위키 자체의 코드 안에 있는 내부 구조의 이름을 따서 명명되었습니다. 미디어위키 자체[e]일종의 표현입니다.

이 프레임 안에 이름이 지정된 (하위) 테이블이 있습니다.args또한 상위 프레임(미디어위키에 있는 것의 이름을 따서 명명됨)에 액세스할 수 있는 수단이 있습니다.또한 상위 프레임에는 (하위) 테이블이 있으며 이름도 다음과 같습니다.args.

  • (자녀라고 가정하는) 프레임의 인수 - 즉, 값frame함수에 대한 매개 변수 - 전달된 인수입니다.{{#invoke:}} 템플릿의 위키 텍스트 안에 있습니다.예를 들어, 만약 당신이 글을 쓴다면,{{#invoke:Population India a b class="popdata"}}템플릿에서 하위 프레임의 인수 하위 테이블은 (Lua 형식으로 작성된 대로).{ "a", "b", class="popdata" }.
  • 상위 프레임의 인수는 템플릿이 제외되었을 때 템플릿에 전달된 인수입니다.예를 들어, 템플릿의 사용자는 다음과 같이 기록합니다.{{Population of India c d language=Hindi}}그런 다음 부모 프레임의 인수 하위 테이블은 (루아 형식으로 작성된 것입니다.{ "c", "d", language="Hindi" }.

이 모든 것을 조금 더 쉽게 만들기 위해 사용할 수 있는 편리한 프로그래머 관용어는 로컬 변수의 이름을 지정하는 것입니다(예:config그리고.args함수에서 이 두 개의 인수 테이블을 가리킵니다.모듈에서 이 항목을 참조하십시오.Wikidata 검사:

기능. p.위키데이터체크()  현지의 p프레임 = :상위 항목 가져오기()  현지의 설정 = .논병아리 템플릿 자체의 위키 텍스트에서 템플릿을 통해 전달된 인수  현지의 논병아리 = p프레임.논병아리 템플릿을 포함하지 않는 위키 텍스트에서 템플릿에 전달된 인수 

에 있는 모든 것config따라서 템플릿에서 다음과 같은 코드로 참조할 수 있도록 지정한 인수입니다.config[1]그리고.config["class"]이것들은 모듈 기능에 "구성"(예: 사용되는 템플릿에 따라 달라질 수 있는 CSS 클래스 이름)을 알려주는 것이 될 것입니다.

에 있는 모든 것args따라서 템플릿의 사용자가 지정한 인수이며, 템플릿이 포함된 위치는 다음과 같은 코드로 참조할 수 있습니다.args[1]그리고.args["language"]이것들은 당신의 템플릿에 문서화된 것처럼 일반적인 템플릿 인수가 될 것입니다./doc페이지입니다.

두 가지 템플릿 모두 {{기타 장소}} 및 {{기타 선박}} 참조{{#invoke:Other uses otherX x}}하지만 대신 다른 주장으로 그렇게 하라.x따라서 하나의 공통 Lua 함수에서 다른 결과를 얻습니다.

두 인수 집합 모두 명명된 매개 변수의 선행 및 후행 공백이 할인된다는 점을 제외하고는 인수의 이름과 값이 위키 텍스트와 동일합니다.유효한 Lua 변수 이름이 아닌 트랜스클루전/호출 인수 이름을 지원하거나 사용하기로 결정하면 코드에 영향을 미칩니다.이러한 경우 테이블 룩업의 "점" 형식을 사용할 수 없습니다.예를 들어:args.author-first여기 구문 색상화에서 알 수 있듯이, 에 대한 참조가 아닙니다. author-first=논쟁, 하지만 에 대한 언급. author=논쟁과 afirst중간에 감산 연산자가 있는 변수입니다.이러한 인수에 액세스하려면 테이블 룩업의 "사각 괄호" 형식을 사용합니다.args["author-first"].

명명된 인수는 에서 인덱싱됩니다.args물론 그들의 이름 문자열에 의한 표.위치 인수(명시적 결과인지 여부)1=또는 그 외의 경우)는 에서 색인됩니다.args문자열이 아닌 숫자별로 테이블을 표시합니다.args[1]와 동일하지 않습니다.args["1"]그리고 후자는 사실상 위키텍스트에서 설정할 수 없습니다.

마지막으로 Lua 모듈은 위키 텍스트에 사용되어 빈 문자열로 설정된 인수와 위키 텍스트에 전혀 없는 인수를 구별할 수 있습니다.후자는 존재하지 않습니다.args표, 그리고 그것들을 색인화하려는 시도는 평가될 것입니다.nil전자는 표에 존재하고 빈 문자열로 평가하는 반면,"".

오류

처음부터 한 가지만 짚고 넘어가죠. 스크립트 오류는 하이퍼링크입니다. 마우스 포인터를 놓고 클릭할 수 있습니다.

우리는 오류 메시지를 빨간색으로 표시하는 (비구독) 템플릿에 의해 너무 제약을 받아 Scribunto "Script error" 오류 메시지는 동일한 것에 불과하다고 생각합니다.절대 아닙니다.WWW 브라우저에서 JavaScript를 사용할 수 있는 경우 오류에 대한 세부 정보, 콜 백 트레이스 및 관련 모듈에서 오류가 발생한 코드 위치로 이동하는 하이퍼링크를 제공하는 창이 나타납니다.

다음을 호출하여 오류를 발생시킬 수 있습니다.error()기능.

팁 및 요령

인수 테이블은 "특수"입니다.

[f]가이드의 범위를 벗어나는 이유로,args프레임의 하위 테이블은 일반 테이블과 전혀 다릅니다.빈칸으로 시작하며,[g] 이를 찾는 코드를 실행할 때 인수로 채워집니다.(Metatables라고 불리는 것들을 사용하여 Lua 프로그램에서 이렇게 작동하는 테이블을 만드는 것이 가능합니다.그것도 이 가이드의 적용범위에 포함되지 않습니다.)

이것의 불행한 부작용은 일반적인 루아테이블 연산자 중 일부가 다음에서 작동하지 않는다는 것입니다.args표. 길이 연산자,#작동하지 않을 것이고, 루아의 기능도 작동하지 않을 것입니다.table도서관.이들은 표준 테이블에서만 작동하며 특수 테이블과 함께 제공되면 실패합니다.args테이블. 하지만,pairs()그리고.ipairs()개발자들에 의해 그들의 사용을 가능하게 하는 코드가 추가되었기 때문에, 기능들은 둘 다 작동할 것입니다.

테이블 내용을 로컬 변수로 복사합니다.

Lua의 이름은 로컬 변수의 액세스 또는 테이블 [3]룩업입니다. math.floor테이블 룩업(문자열의)입니다."floor") (글로벌)에서math예를 들어, 테이블.테이블 룩업은 로컬 변수 룩업보다 런타임에 느립니다.다음과 같은 테이블에서 테이블 검색args"특수성"있는 테이블은 훨씬 느립니다.

Lua의 함수는 최대 250개의 로컬 [4]변수를 가질 수 있습니다.따라서 이를 자유롭게 사용하십시오.

  • 전화하시면math.floor여러 번 로컬 변수에 복사하고 [4]대신 다음을 사용합니다.
    현지의 바닥. = 수학.플로어 현지의 a = 바닥.((14 - 날짜..) / 12) 현지의 y = 날짜..연도 + 4800 - a 현지의 m = 날짜.. + 12 * a - 3 돌아가다 날짜..낮의 + 바닥.((153 * m + 2) / 5) + 365 * y + 바닥.(y / 4) - 바닥.(y / 100) + 바닥.(y / 400) - 2432046 
  • 사용 안 함args.something몇 번이고로컬 변수에 복사하고 다음을 사용합니다.
    현지의  = 논병아리. 
    (심지어는args변수 자체가 조회를 피하는 방법입니다."args"에서frame테이블을 반복합니다.

인수를 로컬 변수로 복사할 때 두 가지 유용한 작업을 수행할 수 있습니다.

  • 동일한 인수 트릭의 대체 이름입니다.템플릿 인수가 대문자와 소문자 형태 또는 다른 영어 철자와 같은 다른 이름으로 갈 수 있는 경우 Lua의or연산자가 실제로 제공되는 가장 높은 우선 순위 이름을 선택합니다.
    현지의 제목 = 논병아리.제목 또는 논병아리.백과사전 또는 논병아리.백과사전 또는 논병아리.사전 현지의 ISBN = 논병아리.isbn13 또는 논병아리.isbn 또는 논병아리.ISBN 
    이는 두 가지 이유로 작동합니다.
    • nil와 동일합니다.false까지or우려됩니다.
    • 루아의or연산자는 "유효한" 의미론으로 알려진 것을 가집니다.왼쪽 피연산자가 아닌 것으로 평가하는 경우false또는nil오른쪽 피연산자의 값을 계산하는 것조차 귀찮지 않습니다.(따라서 그 첫 번째 예는 언뜻 보기에는 네 가지 검색을 수행하는 것처럼 보일 수 있지만, 가장 일반적인 경우에는 다음과 같습니다. title=템플릿과 함께 사용되며, 실제로는 하나만 수행합니다.)
  • 문자열 트릭의 기본값입니다.때때로 생략된 템플릿 인수가nil유용합니다.그러나 그렇지 않은 경우도 있으며 누락된 인수의 동작이 빈 문자열이기를 원할 수 있습니다.간단한or ""표현식의 끝에는 다음과 같이 충분합니다.
    현지의 아이디 = 논병아리.이드 또는 논병아리.아이디 또는 논병아리[1] 또는 "" 

템플릿을 확장할 수 있더라도 확장하지 마십시오.

로컬 변수가 저렴하고 테이블 검색 비용이 많이 든다면 템플릿 확장은 가격대를 훨씬 상회합니다.

피하다frame:preprocess()역병처럼미디어를 사용하여 중첩된 템플릿 확장위키의 전처리기는 결국 우리가 벗어나려고 하는 것입니다.이를 통해 수행할 대부분의 작업은 단순한 Lua 기능을 사용하여 보다 단순하고, 보다 신속하며, 보다 유지보수적으로 수행됩니다.

마찬가지로 w:사용하지 마십시오.템플릿:ISO 639 nameaze(2020년 8월 삭제): 데이터베이스에 항목을 효과적으로 저장합니다.이것을 읽는 것은 문자열을 다른 문자열에 매핑하기 위해 수반되는 데이터베이스 쿼리와 함께 중첩된 파서 호출입니다.모듈에 모듈의 표와 같이 간단한 데이터 테이블을 배치합니다.언어.

각주

  1. ^ "Critunto"라는 이름은 라틴어입니다."cribunto"는 "cribere"의 3인칭 복수 미래 활성 명령어이며 "그들은 쓸 것이다"를 의미합니다."스크라이브"는 물론 중세 라틴어 "스크라이브"를 [1]통해 라틴어에서 파생된 영어 단어입니다.
  2. ^ 소프트웨어 설계와 관련하여 "볼트 온"이 무엇을 의미하는지에 대한 아이디어는 드라이브 스루의 리브 랙이 너무 무거워서 플린트스톤의 차가 옆으로 넘어지게 만드는 플린트스톤 만화를 참조하십시오.
  3. ^ Scribunto용으로 지정된 API 전체를 모듈에서 사용할 수 있을 때까지 마법 단어를 제외해야 할 수 있습니다.요령 섹션을 참조하십시오.하지만 마법의 단어는 템플릿이 아닙니다.
  4. ^ 언어의 발명가들은 이것을 통사적 [2]설탕이라고 부릅니다.
  5. ^ MediaWiki 적절한 경우 프레임이 두 개 이상 있습니다.
  6. ^ 만약 당신이 알고 싶다면, 미디어위키가 부분적으로 오래된 템플릿-조건부 배제-템플릿 시스템에 의해 부과된 부담 때문에 어떻게 템플릿 인수에 대한 게으른 평가를 하는지에 대해 읽어보세요.
  7. ^ 따라서 일반적인 템플릿 인수 참조라고 생각했던 다른 모듈로의 호출을 보여주는 콜 백트레이스를 발견하더라도 놀라지 마십시오.이는 해당 인수의 확장이 스크라이브된 다른 템플릿을 확장하는 것을 포함했기 때문입니다.

레퍼런스

상호 참조

  1. ^ MW 2003a, 1116페이지
  2. ^ Ierusalimschy, de Figueiredo & Celes 2011, §DATA.
  3. ^ Ierusalimschy, de Figuiredo & Celes 2011, §Eval and Environments.
  4. ^ a b Ierrusalimschy 2008, 페이지 17.

인용문

  • "scribble". Merriam-Webster's Collegiate Dictionary: Eleventh Edition. Merriam-Webster's Collegiate Dictionary (11th ed.). Merriam-Webster. 2003. p. 1116. ISBN 9780877798095.
  • Ierusalimschy, Roberto; de Figueiredo, Luiz Henrique; Celes, Waldemar (12 May 2011). "Passing a Language through the Eye of a Needle". Queue. Association for Computing Machinery. 9 (5). ACM 1542-7730/11/0500.
  • Ierusalimschy, Roberto (December 2008). "Lua Performance Tips" (PDF). In de Figueiredo, Luiz Henrique; Celes, Waldemar; Ierusalimschy, Roberto (eds.). Lua Programming Gems. Lua.org. ISBN 978-85-903798-4-3.

진일보한 내용

루아