Permanently protected module

모듈:보호 배너

Module

이 모듈은 {pp-meta} 및 다음과 같은 딸 템플릿을 구현합니다. {pp-proxy}, {pp-proxy}, {pp-proxy}, 및 {pp-property}.  필요한 모듈을 초기화합니다. 요구하다('''비공식''') 현지의 makeFileLink = 요구하다('모듈:파일 링크')._본 현지의 유효 보호 수준 = 요구하다('모듈:효과적인 보호 수준')._본 현지의 유효한 보호 만료 = 요구하다('모듈:효과적인 보호 만료')._본 현지의 예 아니오 = 요구하다('모듈:'예스노')  항상 필요하지 않은 모듈과 객체를 게으르게 초기화합니다. 현지의 args를 얻다, 메시지 상자 만들기, 랑그  상수를 설정합니다. 현지의 CONFIG_MODULE = '모듈:보호 배너/구성'  -------------------------------------------------------------------------------- 도우미 기능 --------------------------------------------------------------------------------  현지의 기능. 범주 연결 만들기(고양이, 종류)  한다면 고양이 그리고나서   돌아가다 string.형식(    '[%s:%s %s]',    mw.위치.네임스페이스[14].이름.,    고양이,    종류   )  끝. 끝.  만료 및 보호 날짜에 대한 유효성 검사 기능 현지의 기능. 유효성 검사 날짜(dateString, 날짜 유형)  한다면 것은 아니다. 랑그 그리고나서   랑그 = mw.언어.콘텐츠 언어 가져오기()  끝.  현지의 성공., 결과 = pcall(랑그.formatDate, 랑그, 'U', dateString)  한다면 성공. 그리고나서   결과 = 수에 달하여(결과)   한다면 결과 그리고나서    돌아가다 결과   끝.  끝.  오류(string.형식(   '%s: %s'을(으)로 표시됨),   날짜 유형,   끈으로 묶는(dateString)  ), 4) 끝.  현지의 기능. 전체 URL 만들기(페이지입니다., 문의, 과시하는)  돌아가다 string.형식(   '[%s %s]',   끈으로 묶는(mw.uri.전체 URL(페이지입니다., 문의)),   과시하는  ) 끝.  직접 계승자의 노드 -> 표로 형식이 지정된 방향 그래프를 고려할 때, 지정된 노드에서 도달할 수 있는 모든 노드의 테이블 가져오기(항상 그렇지만) 지정된 노드 포함). 현지의 기능. 도달 가능한 노드 가져오기(그래프, 시작)  현지의 걷기, 철회의 = {[시작] = 진실의}, {}  하는 동안에 진실의 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다   반복하는 동안 항목을 추가하고 제거하기 때문에 쌍()을 사용할 수 없습니다.   현지의 k = 다음 분.(걷기) 이것은 항상 "첫 번째" 키를 받습니다.   한다면 k == 영의 그리고나서    돌아가다 철회의   끝.   걷기[k] = 영의   철회의[k] = 진실의   위해서 _,v  짝을 짓다(그래프[k]) 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다    한다면 것은 아니다. 철회의[v] 그리고나서     걷기[v] = 진실의    끝.   끝.  끝. 끝.  -------------------------------------------------------------------------------- 보호 클래스 --------------------------------------------------------------------------------  현지의 보호. = {} 보호..__index = 보호.  보호..지원되는 작업 = {  편집을 = 진실의,  이사를 = 진실의,  자동 리뷰 = 진실의,  업로드 = 진실의 }  보호..배너구성필드 = {  '텍스트',  '해석',  '도구 설명',  '알트',  '링크',  '이미지' }  기능. 보호..신규(논병아리, cfg, 제목)  현지의 obj = {}  obj._cfg = cfg  obj.제목 = 제목 또는 mw.제목.현재 제목 가져오기()   액션 설정  한다면 것은 아니다. 논병아리.액션. 그리고나서   obj.액션. = '편집'  그렇지 않으면 보호..지원되는 작업[논병아리.액션.] 그리고나서   obj.액션. = 논병아리.액션.  또 다른   오류(string.형식(    '경고 작업: %s',    끈으로 묶는(논병아리.액션.)   ), 3)  끝.   레벨 설정  obj.수평의 = 논병아리.데모 레벨 또는 유효 보호 수준(obj.액션., obj.제목)  한다면 것은 아니다. obj.수평의 또는 (obj.액션. == '이동' 그리고. obj.수평의 == '자동 확인됨') 그리고나서   페이지를 이동하려면 사용자를 자동으로 확인해야 하므로 처리   반 이동 보호된 페이지를 보호되지 않음으로 표시됩니다.   obj.수평의 = '*'  끝.   만료 설정  현지의 유효 만료 = 유효한 보호 만료(obj.액션., obj.제목)  한다면 유효 만료 == '''비공식''' 그리고나서   obj.만기의 = '''비공식'''  그렇지 않으면 유효 만료 ~= '''비공식''' 그리고나서   obj.만기의 = 유효성 검사 날짜(유효 만료, '시작 날짜')  끝.   이유 설정  한다면 논병아리[1] 그리고나서   obj.이유 = mw.ustring.더 낮게(논병아리[1])   한다면 obj.이유:찾아내다(' ') 그리고나서    오류('pipe는 파이프 문자(" ")를 포함할 수 없습니다., 3)   끝.  끝.   보호 날짜 설정  한다면 논병아리.날짜. 그리고나서   obj.보호 날짜 = 유효성 검사 날짜(논병아리.날짜., '보호 날짜')  끝.    배너 구성 설정  하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다   obj.배너구성 = {}   현지의 config 테이블 = {}   한다면 cfg.현수막[obj.액션.] 그리고나서    config 테이블[#config 테이블 + 1] = cfg.현수막[obj.액션.][obj.이유]   끝.   한다면 cfg.기본 배너[obj.액션.] 그리고나서    config 테이블[#config 테이블 + 1] = cfg.기본 배너[obj.액션.][obj.수평의]    config 테이블[#config 테이블 + 1] = cfg.기본 배너[obj.액션.].체납   끝.   config 테이블[#config 테이블 + 1] = cfg.마스터 배너   위해서 i, 들판  짝을 짓다(보호..배너구성필드) 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다    위해서 j, t  짝을 짓다(config 테이블) 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다     한다면 t[들판] 그리고나서      obj.배너구성[들판] = t[들판]      브레이크.     끝.    끝.   끝.  끝.  돌아가다 상을 차리다(obj, 보호.) 끝.  기능. 보호.:isUserScript()  페이지가 사용자 JavaScript인지 CSS 페이지인지 여부.  현지의 제목 = 자신.제목  돌아가다 제목.네임스페이스 == 2 그리고. (   제목.내용 모델 == '스크립트' 또는 제목.내용 모델 == '''비공식'''  ) 끝.  기능. 보호.:보호됨()  돌아가다 자신.수평의 ~= '*' 끝.  기능. 보호.:shouldShowLock()  배너/패드락 출력 여부  돌아가다 자신:보호됨() 그리고. 것은 아니다. 자신:isUserScript() 끝.  이 페이지에 보호 카테고리가 필요한지 여부를 나타냅니다. 보호..보호 범주가 있어야 함 = 보호..shouldShowLock  기능. 보호.:임시임시()  돌아가다 유형(자신.만기의) == '숫자' 끝.  기능. 보호.:보호 카테고리 만들기()  한다면 것은 아니다. 자신:보호 범주가 있어야 함() 그리고나서   돌아가다 ''  끝.   현지의 cfg = 자신._cfg  현지의 제목 = 자신.제목    만료 키 조각을 가져옵니다.  현지의 만료 플래그먼트  한다면 자신.만기의 == '''비공식''' 그리고나서   만료 플래그먼트 = 자신.만기의  그렇지 않으면 유형(자신.만기의) == '숫자' 그리고나서   만료 플래그먼트 = '''비공식'''  끝.   네임스페이스 키 조각을 가져옵니다.  현지의 네임스페이스Fragment = cfg.카테고리 네임스페이스키[제목.네임스페이스]  한다면 것은 아니다. 네임스페이스Fragment 그리고. 제목.네임스페이스 % 2 == 1 그리고나서    네임스페이스Fragment = '말하기'  끝.   키 조각을 테스트할 순서를 정의합니다.이 작업은 다음과 같이 수행됩니다.  테스트할 값을 포함하는 테이블 배열 및 그와 함께  cfg.protectionCategories 테이블의 위치.  현지의 주문 = {   { = 만료 플래그먼트,    키포스 = 1},   { = 네임스페이스Fragment, 키포스 = 2},   { = 자신.이유,       키포스 = 3},   { = 자신.수평의,        키포스 = 4},   { = 자신.액션.,       키포스 = 5}  }   --[[ 기존 보호 템플릿은 임시 보호 범주 시스템을 사용했습니다. 카테고리에서 네임스페이스의 우선순위를 지정하는 일부 템플릿을 사용합니다. 다른 사람들은 보호 이유에 우선순위를 둡니다.이 모듈에서 이를 에뮬레이트하는 방법 구성 테이블 cfg.dll을 사용합니다.NamespacePriority를 사용하여 다음을 설정합니다. 네임스페이스가 보호 이유보다 우선하는 이유입니다. 이러한 이유 중 하나를 처리하는 경우 네임스페이스 테이블을 다음으로 이동합니다. 주문 테이블의 끝, 즉 가장 높은 우선순위를 부여합니다.그렇지 않을 경우, 이유는 가장 높은 우선순위를 가져야 하므로, 그것을 표의 끝으로 이동합니다. 대신에 --]]  표.삽입(주문, 테이블.제거(주문, 자신.이유 그리고. cfg.네임스페이스 우선순위가 있는 이유[자신.이유] 그리고. 2 또는 3))    --[[ 시도 순서를 정의합니다.비활성 하위 테이블("값"이 0인 하위 테이블) 필드)가 끝으로 이동되고, 나중에 키가 주어집니다. "전부"이는 테이블 검색 수를 줄이기 위한 것입니다. cfg.protectionCategories, 이는 다음과 같이 기하급수적으로 증가합니다. 암호화되지 않은 키활성 하위 테이블의 수를 추적합니다. 활성 매개 변수가 없습니다. --]]  현지의 활성화 안 됨, 주문 시도  하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다   현지의 활동적인, 활발하지 않은 = {}, {}   위해서 i, t  짝을 짓다(주문) 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다    한다면 t. 그리고나서     활동적인[#활동적인 + 1] = t    또 다른     활발하지 않은[#활발하지 않은 + 1] = t    끝.   끝.   활성화 안 됨 = #활동적인   주문 시도 = 활동적인   위해서 i, t  짝을 짓다(활발하지 않은) 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다    주문 시도[#주문 시도 + 1] = t   끝.  끝.    --[[ 일치하는 키를 찾을 때까지 점점 더 일반적인 키 조합을 확인합니다. 특정 범주는 핵심 조각의 조합에 대해 존재합니다. 해당 일치 항목이 먼저 발견됩니다.그렇지 않다면, 우리는 계속해서 다른 노력을 합니다. 키를 사용하여 일치할 때까지 키 조각 조합 "올 올 올 올 올 올 올". -- 키를 생성하기 위해 이진 행렬을 사용하여 키 하위 테이블을 인덱싱합니다. 인덱스 i 및 j.j를 사용할 경우 활성 개수까지만 계산됩니다. 부표예를 들어, 세 개의 활성 하위 테이블이 있는 경우 행렬 0이 키 조각 "all"에 해당하는 경우, 다음과 같습니다. 1은 다른 키 조각에 해당합니다. -- j 1 2 3 아이 -- 1   1  1  1 -- 2   0  1  1 -- 3   1  0  1 -- 4   0  0  1 -- 5   1  1  0 -- 6   0  1  0 -- 7   1  0  0 -- 8   0  0  0 -- 활성 하위 테이블 수보다 높은 j 값이 설정됨 "all"이라는 문자열로. -- i의 각 값에 대해 cfg.protectionCategories 키가 생성됩니다. 키에서 값의 위치는 의 키포스 필드에 의해 결정됩니다. 각 하위 테이블 --]]  현지의 고양이들 = cfg.보호 카테고리  위해서 i = 1, 2^활성화 안 됨 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다   현지의 열쇠 = {}   위해서 j, t  짝을 짓다(주문 시도) 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다    한다면 j > 활성화 안 됨 그리고나서     열쇠[t.키포스] = '모두'    또 다른     현지의 상당의 = i / 2 ^ (j - 1)     상당의 = 수학, 수학,수학(상당의)     한다면 상당의 % 2 == 1 그리고나서      열쇠[t.키포스] = t.     또 다른      열쇠[t.키포스] = '모두'     끝.    끝.   끝.   열쇠 = 테이블.콘캣(열쇠, ' ')   현지의 시도 = 고양이들[열쇠]   한다면 시도 그리고나서    돌아가다 범주 연결 만들기(시도, 제목.본문)   끝.  끝.  돌아가다 '' 끝.  기능. 보호.:올바르지 않음()  현지의 만기의 = 자신.만기의  돌아가다 것은 아니다. 자신:보호 범주가 있어야 함()   또는 유형(만기의) == '숫자' 그리고. 만기의 < os.time() 끝.  기능. 보호.:isTemplateProtected비템플릿()  현지의 액션., 네임스페이스 = 자신.액션., 자신.제목.네임스페이스  돌아가다 자신.수평의 == '편집자 권한 없음'   그리고. (    (액션. ~= '편집' 그리고. 액션. ~= '이동')    또는 (네임스페이스 ~= 10 그리고. 네임스페이스 ~= 828)   ) 끝.  기능. 보호.:카테고리 링크 만들기()  현지의 메시지 = 자신._cfg.메시지  현지의 리트 = {자신:보호 카테고리 만들기()}  한다면 자신:올바르지 않음() 그리고나서   리트[#리트 + 1] = 범주 연결 만들기(    메시지['http-http-http-http'],    자신.제목.본문   )  끝.  한다면 자신:isTemplateProtected비템플릿() 그리고나서   리트[#리트 + 1] = 범주 연결 만들기(    메시지['http-http-http-http'],    자신.제목.본문   )  끝.  돌아가다 테이블.콘캣(리트) 끝.  -------------------------------------------------------------------------------- 블러르 클래스 --------------------------------------------------------------------------------  현지의 블러브 = {} 블러브.__index = 블러브  블러브.배너 텍스트 필드 = {  본문 = 진실의,  설명. = 진실의,  도구 설명 = 진실의,  알트의 = 진실의,  링크 = 진실의 }  기능. 블러브.신규(보호 Obj, 논병아리, cfg)  돌아가다 상을 차리다({   _cfg = cfg,   _보호 Obj = 보호 Obj,   _args = 논병아리  }, 블러브) 끝.  개인 방법 --  기능. 블러브:_formatDate(번호)  유닉스 타임스탬프를 dd Month, YYY 형식으로 포맷합니다.  랑그 = 랑그 또는 mw.언어.콘텐츠 언어 가져오기()  현지의 성공., 날짜. = pcall(   랑그.formatDate,   랑그,   자신._cfg.메시지['날짜가 지정된 형식] 또는 'jFY',   '@' .. 끈으로 묶는(번호)  )  한다면 성공. 그리고나서   돌아가다 날짜.  끝. 끝.  기능. 블러브:_확장된 메시지 가져오기(메시지 키)  돌아가다 자신:_대체 매개 변수(자신._cfg.메시지[메시지 키]) 끝.  기능. 블러브:_대체 매개 변수(메시지)  한다면 것은 아니다. 자신._params 그리고나서   현지의 매개 변수 펑스 = {}    매개 변수 펑스.현재 버전     = 자신._makeCurrentVersion 매개 변수   매개 변수 펑스.요청 편집        = 자신._makeEditRequestParameter   매개 변수 펑스.만료             = 자신._makeExpiry 매개 변수   매개 변수 펑스.설명 블러버   = 자신._make설명 블러 매개 변수   매개 변수 펑스.이미지 링크          = 자신._makeImageLink 매개 변수   매개 변수 펑스.인트로 교외         = 자신._makeIntroBurb 매개 변수   매개 변수 펑스.소개 조각      = 자신._makeIntroFragment 매개 변수   매개 변수 펑스.페이지 유형           = 자신._make 페이지 유형 매개 변수   매개 변수 펑스.보호 블러브    = 자신._makeProtectionBurb 매개 변수   매개 변수 펑스.보호 날짜     = 자신._makeProtectionDate 매개 변수   매개 변수 펑스.보호 수준    = 자신._makeProtection수준 매개 변수   매개 변수 펑스.보호 로그      = 자신._makeProtectionLog 매개 변수   매개 변수 펑스.토크 페이지           = 자신._makeTalkPage 매개 변수   매개 변수 펑스.공구 팁 블러버       = 자신._makeTooltipBurb 매개 변수   매개 변수 펑스.공구 팁 조각    = 자신._makeTooltipFragment 매개 변수   매개 변수 펑스.반달             = 자신._makeVandalTemplate 매개 변수      자신._params = 상을 차리다({}, {    __index = 기능. (t, k)     현지의 PARAM.     한다면 매개 변수 펑스[k] 그리고나서      PARAM. = 매개 변수 펑스[k](자신)     끝.     PARAM. = PARAM. 또는 ''     t[k] = PARAM.     돌아가다 PARAM.    끝.   })  끝.    메시지 = 메시지:gsub('${(%u+)}', 자신._params)  돌아가다 메시지 끝.  기능. 블러브:_makeCurrentVersion 매개 변수()  페이지 기록 또는 이동 로그에 대한 링크(다음 유형에 따라 다름)  보호.  현지의 페이지명 = 자신._보호 Obj.제목.접두사 텍스트  한다면 자신._보호 Obj.액션. == '이동' 그리고나서   로그 이동 링크가 필요합니다.   돌아가다 전체 URL 만들기(    '특수:로그',    {유형 = '이동', 페이지입니다. = 페이지명},    자신:_확장된 메시지 가져오기('current-version-move-display')   )  또 다른   우리는 역사 링크가 필요합니다.   돌아가다 전체 URL 만들기(    페이지명,    {액션. = '역사'},    자신:_확장된 메시지 가져오기('current-version-edit-display')   )  끝. 끝.  기능. 블러브:_makeEditRequestParameter()  현지의 mEditRequest = 요구하다('모듈:편집 요청 제출')  현지의 액션. = 자신._보호 Obj.액션.  현지의 수평의 = 자신._보호 Obj.수평의    편집 요청 유형을 가져옵니다.  현지의 요청 유형  한다면 액션. == '편집' 그리고나서   한다면 수평의 == '자동 확인됨' 그리고나서    요청 유형 = '''비공식'''   그렇지 않으면 수평의 == '확인되지 않음' 그리고나서    요청 유형 = '''비공식'''   그렇지 않으면 수평의 == '편집자 권한 없음' 그리고나서    요청 유형 = '''비공식'''   끝.  끝.  요청 유형 = 요청 유형 또는 '만원'    표시 값을 가져옵니다.  현지의 과시하는 = 자신:_확장된 메시지 가져오기('edit-request-display')   돌아가다 mEditRequest._링크{유형 = 요청 유형, 과시하는 = 과시하는} 끝.  기능. 블러브:_makeExpiry 매개 변수()  현지의 만기의 = 자신._보호 Obj.만기의  한다면 유형(만기의) == '숫자' 그리고나서   돌아가다 자신:_formatDate(만기의)  또 다른   돌아가다 만기의  끝. 끝.  기능. 블러브:_make설명 블러 매개 변수()  특수한 경우를 먼저 처리합니다.  한다면 자신._보호 Obj.제목.네임스페이스 == 8 그리고나서   미디어위키 네임스페이스   돌아가다 자신:_확장된 메시지 가져오기('communication-blurb-flock protect')  끝.   설명 블러 테이블 키 가져오기  현지의 액션. = 자신._보호 Obj.액션.  현지의 수평의 = 자신._보호 Obj.수평의  현지의 talkKey = 자신._보호 Obj.제목.isTalk페이지 그리고. '말하기' 또는 '주제'   설명 블러 테이블에서 메시지를 찾고 아무 것이나 대체합니다.  매개 변수  현지의 설명 = 자신._cfg.해설 블러즈  현지의 메시지  한다면 설명[액션.][수평의] 그리고. 설명[액션.][수평의][talkKey] 그리고나서   메시지 = 설명[액션.][수평의][talkKey]  그렇지 않으면 설명[액션.][수평의] 그리고. 설명[액션.][수평의].체납 그리고나서   메시지 = 설명[액션.][수평의].체납  그렇지 않으면 설명[액션.].체납 그리고. 설명[액션.].체납[talkKey] 그리고나서   메시지 = 설명[액션.].체납[talkKey]  그렇지 않으면 설명[액션.].체납 그리고. 설명[액션.].체납.체납 그리고나서   메시지 = 설명[액션.].체납.체납  또 다른   오류(string.형식(    ' 작업 "%s", 수준 "%s" 및 대화 키 "%s"에 대한 설명을 찾을 수 없습니다.,    액션.,    수평의,    talkKey   ), 8)  끝.  돌아가다 자신:_대체 매개 변수(메시지) 끝.  기능. 블러브:_makeImageLink 매개 변수()  현지의 imageLinks = 자신._cfg.imageLinks  현지의 액션. = 자신._보호 Obj.액션.  현지의 수평의 = 자신._보호 Obj.수평의  현지의 메시지  한다면 imageLinks[액션.][수평의] 그리고나서   메시지 = imageLinks[액션.][수평의]  그렇지 않으면 imageLinks[액션.].체납 그리고나서   메시지 = imageLinks[액션.].체납  또 다른   메시지 = imageLinks.편집을.체납  끝.  돌아가다 자신:_대체 매개 변수(메시지) 끝.  기능. 블러브:_makeIntroBurb 매개 변수()  한다면 자신._보호 Obj:임시임시() 그리고나서   돌아가다 자신:_확장된 메시지 가져오기('Intro-blurb-burb-burb')  또 다른   돌아가다 자신:_확장된 메시지 가져오기('Intro-Burb-Expiry 없음')  끝. 끝.  기능. 블러브:_makeIntroFragment 매개 변수()  한다면 자신._보호 Obj:임시임시() 그리고나서   돌아가다 자신:_확장된 메시지 가져오기('소개서-기입')  또 다른   돌아가다 자신:_확장된 메시지 가져오기('내보내기-유효기간 없음')  끝. 끝.  기능. 블러브:_make 페이지 유형 매개 변수()  현지의 페이지 유형 = 자신._cfg.페이지 유형  돌아가다 페이지 유형[자신._보호 Obj.제목.네임스페이스]   또는 페이지 유형.체납   또는 오류('기본 페이지 유형이 정의되지 않음', 8) 끝.  기능. 블러브:_makeProtectionBurb 매개 변수()  현지의 프로텍션 블러즈 = 자신._cfg.프로텍션 블러즈  현지의 액션. = 자신._보호 Obj.액션.  현지의 수평의 = 자신._보호 Obj.수평의  현지의 메시지  한다면 프로텍션 블러즈[액션.][수평의] 그리고나서   메시지 = 프로텍션 블러즈[액션.][수평의]  그렇지 않으면 프로텍션 블러즈[액션.].체납 그리고나서   메시지 = 프로텍션 블러즈[액션.].체납  그렇지 않으면 프로텍션 블러즈.편집을.체납 그리고나서   메시지 = 프로텍션 블러즈.편집을.체납  또 다른   오류('protectionBlurbs.edit.default에 대해 정의된 보호 블러가 없습니다.', 8)  끝.  돌아가다 자신:_대체 매개 변수(메시지) 끝.  기능. 블러브:_makeProtectionDate 매개 변수()  현지의 보호 날짜 = 자신._보호 Obj.보호 날짜  한다면 유형(보호 날짜) == '숫자' 그리고나서   돌아가다 자신:_formatDate(보호 날짜)  또 다른   돌아가다 보호 날짜  끝. 끝.  기능. 블러브:_makeProtection수준 매개 변수()  현지의 보호.레벨 = 자신._cfg.보호.레벨  현지의 액션. = 자신._보호 Obj.액션.  현지의 수평의 = 자신._보호 Obj.수평의  현지의 메시지  한다면 보호.레벨[액션.][수평의] 그리고나서   메시지 = 보호.레벨[액션.][수평의]  그렇지 않으면 보호.레벨[액션.].체납 그리고나서   메시지 = 보호.레벨[액션.].체납  그렇지 않으면 보호.레벨.편집을.체납 그리고나서   메시지 = 보호.레벨.편집을.체납  또 다른   오류('보호에 대해 정의된 보호 수준이 없습니다.Levels.edit.default', 8)  끝.  돌아가다 자신:_대체 매개 변수(메시지) 끝.  기능. 블러브:_makeProtectionLog 매개 변수()  현지의 페이지명 = 자신._보호 Obj.제목.접두사 텍스트  한다면 자신._보호 Obj.액션. == '자동 검토' 그리고나서   우리는 보류 중인 변경 로그가 필요합니다.   돌아가다 전체 URL 만들기(    '특수:로그',    {유형 = '''비공식''', 페이지입니다. = 페이지명},    자신:_확장된 메시지 가져오기('pc-log-display')   )  또 다른   보호 일지가 필요합니다.   돌아가다 전체 URL 만들기(    '특수:로그',    {유형 = '보호', 페이지입니다. = 페이지명},    자신:_확장된 메시지 가져오기('보호 로그 표시')   )  끝. 끝.  기능. 블러브:_makeTalkPage 매개 변수()  돌아가다 string.형식(   '[%s:%s#%s %s]',   mw.위치.네임스페이스[자신._보호 Obj.제목.네임스페이스].말해라..이름.,   자신._보호 Obj.제목.본문,   자신._args.부분 또는 '위',   자신:_확장된 메시지 가져오기('talk-page-link-display')  ) 끝.  기능. 블러브:_makeTooltipBurb 매개 변수()  한다면 자신._보호 Obj:임시임시() 그리고나서   돌아가다 자신:_확장된 메시지 가져오기('tooltip-burb-burb-burb')  또 다른   돌아가다 자신:_확장된 메시지 가져오기('툴팁-블러버-만료 없음')  끝. 끝.  기능. 블러브:_makeTooltipFragment 매개 변수()  한다면 자신._보호 Obj:임시임시() 그리고나서   돌아가다 자신:_확장된 메시지 가져오기('도구 설명-아래쪽-아래쪽')  또 다른   돌아가다 자신:_확장된 메시지 가져오기('도구 설명-삭제-만료 없음')  끝. 끝.  기능. 블러브:_makeVandalTemplate 매개 변수()  돌아가다 mw.현재 프레임 가져오기():확장템플릿{   제목="추가-m",   논병아리={자신._args.사용자 또는 자신._보호 Obj.제목.기본 텍스트}  } 끝.  공개 방법 --  기능. 블러브:배너 텍스트 만들기(열쇠)  입력의 유효성을 검사합니다.  한다면 것은 아니다. 열쇠 또는 것은 아니다. 블러브.배너 텍스트 필드[열쇠] 그리고나서   오류(string.형식(    '%s'는 올바른 배너 구성 필드가 아닙니다.',    끈으로 묶는(열쇠)   ), 2)  끝.   텍스트를 생성합니다.  현지의 메시지 = 자신._보호 Obj.배너구성[열쇠]  한다면 유형(메시지) == '끈' 그리고나서   돌아가다 자신:_대체 매개 변수(메시지)  그렇지 않으면 유형(메시지) == '함수' 그리고나서   메시지 = 메시지(자신._보호 Obj, 자신._args)   한다면 유형(메시지) ~= '끈' 그리고나서    오류(string.형식(     '%s 키를 가진 배너 구성 함수의 출력이 잘못되었습니다.'      .. (예상 문자열, %s을(를) 받았습니다.',     끈으로 묶는(열쇠),     유형(메시지)    ), 4)   끝.   돌아가다 자신:_대체 매개 변수(메시지)  끝. 끝.  -------------------------------------------------------------------------------- BannerTemplate 클래스 --------------------------------------------------------------------------------  현지의 배너 템플릿 = {} 배너 템플릿.__index = 배너 템플릿  기능. 배너 템플릿.신규(보호 Obj, cfg)  현지의 obj = {}  obj._cfg = cfg   이미지 파일 이름을 설정합니다.  현지의 imageFilename = 보호 Obj.배너구성.이미지  한다면 imageFilename 그리고나서   obj._imageFilename = imageFilename  또 다른   배너 구성에 이미지 파일 이름이 명시적으로 지정되지 않은 경우,   보호 상태 및 네임스페이스에서 생성합니다.   현지의 액션. = 보호 Obj.액션.   현지의 수평의 = 보호 Obj.수평의   현지의 네임스페이스 = 보호 Obj.제목.네임스페이스   현지의 이유 = 보호 Obj.이유      특별한 경우를 먼저 처리합니다.   한다면 (    네임스페이스 == 10    또는 네임스페이스 == 828    또는 이유 그리고. obj._cfg.inf 이미지 이유[이유]    )    그리고. 액션. == '편집'    그리고. 수평의 == '스톱'    그리고. 것은 아니다. 보호 Obj:임시임시()   그리고나서    완전히 보호된 모듈 및 템플릿은 특별한 빨간색 "indef"를 얻습니다.    자물쇠    obj._imageFilename = obj._cfg.메시지['image-discovery-discovery']   또 다른    일반 보호 유형을 처리합니다.    현지의 이미지들 = obj._cfg.이미지들    한다면 이미지들[액션.] 그리고나서     한다면 이미지들[액션.][수평의] 그리고나서      obj._imageFilename = 이미지들[액션.][수평의]     그렇지 않으면 이미지들[액션.].체납 그리고나서      obj._imageFilename = 이미지들[액션.].체납     끝.    끝.   끝.  끝.  돌아가다 상을 차리다(obj, 배너 템플릿) 끝.  기능. 배너 템플릿:렌더 이미지()  현지의 파일 이름 = 자신._imageFilename   또는 자신._cfg.메시지['image-module-default']   또는 'Transparent.gif'  돌아가다 makeFileLink{   파일 = 파일 이름,   크기 = (자신.이미지 폭 또는 20) .. '''비공식''',   알트의 = 자신._imageAlt,   링크 = 자신._imageLink,   캡션 = 자신.이미지 캡션  } 끝.  -------------------------------------------------------------------------------- 배너 클래스 --------------------------------------------------------------------------------  현지의 배너 = 상을 차리다({}, 배너 템플릿) 배너.__index = 배너  기능. 배너.신규(보호 Obj, 흐리멍덩한 Obj, cfg)  현지의 obj = 배너 템플릿.신규(보호 Obj, cfg) 이것은 거품이 필요하지 않습니다.  obj.이미지 폭 = 40  obj.이미지 캡션 = 흐리멍덩한 Obj:배너 텍스트 만들기('알트') 큰 배너는 도구 설명의 alt 텍스트를 사용합니다.  obj._reasonText = 흐리멍덩한 Obj:배너 텍스트 만들기('텍스트')  obj._설명 텍스트 = 흐리멍덩한 Obj:배너 텍스트 만들기('해석')  obj._페이지 = 보호 Obj.제목.접두사 텍스트 테스트에 차이가 있을 뿐입니다.  돌아가다 상을 차리다(obj, 배너) 끝.  기능. 배너:__ 문자열로()  배너를 렌더링합니다.  메시지 상자 만들기 = 메시지 상자 만들기 또는 요구하다('모듈:메시지 상자').주된  현지의 이유 텍스트 = 자신._reasonText 또는 오류('이유 텍스트 집합 없음', 2)  현지의 설명 텍스트 = 자신._설명 텍스트  현지의 엠바그 = {   페이지입니다. = 자신._페이지,   유형 = '보호',   이미지 = 자신:렌더 이미지(),   본문 = string.형식(    "'''%s'''%s''',    이유 텍스트,    설명 텍스트 그리고. '<br />' .. 설명 텍스트 또는 ''   )  }  돌아가다 메시지 상자 만들기('mbox', 엠바그) 끝.  -------------------------------------------------------------------------------- 자물쇠 클래스 --------------------------------------------------------------------------------  현지의 자물쇠 = 상을 차리다({}, 배너 템플릿) 자물쇠.__index = 자물쇠  기능. 자물쇠.신규(보호 Obj, 흐리멍덩한 Obj, cfg)  현지의 obj = 배너 템플릿.신규(보호 Obj, cfg) 이것은 거품이 필요하지 않습니다.  obj.이미지 폭 = 20  obj.이미지 캡션 = 흐리멍덩한 Obj:배너 텍스트 만들기('도구 설명')  obj._imageAlt = 흐리멍덩한 Obj:배너 텍스트 만들기('알트')  obj._imageLink = 흐리멍덩한 Obj:배너 텍스트 만들기('링크')  obj._표시기Name = cfg.자물쇠 표시기 이름[보호 Obj.액션.]   또는 cfg.자물쇠 표시기 이름.체납   또는 'pp-default'  돌아가다 상을 차리다(obj, 자물쇠) 끝.  기능. 자물쇠:__ 문자열로()  현지의  = mw.현재 프레임 가져오기()  nowiki 태그는 문서 맨 위에 공백이 없도록 도와줍니다.  돌아가다 :확장 태그{이름. = 'nowiki'} .. :확장 태그{   이름. = '''비공식''',   논병아리 = {이름. = 자신._표시기Name},   내용물 = 자신:렌더 이미지()  } 끝.  -------------------------------------------------------------------------------- 수출품 --------------------------------------------------------------------------------  현지의 p = {}  기능. p._export 클래스()  이것은 테스트 목적으로 사용됩니다.  돌아가다 {   보호. = 보호.,   블러브 = 블러브,   배너 템플릿 = 배너 템플릿,   배너 = 배너,   자물쇠 = 자물쇠,  } 끝.  기능. p._본(논병아리, cfg, 제목)  논병아리 = 논병아리 또는 {}  cfg = cfg 또는 요구하다(CONFIG_MODULE)   현지의 보호 Obj = 보호..신규(논병아리, cfg, 제목)   현지의 리트 = {}   페이지의 편집 보호가 페이지의 편집 보호와 동일하거나 더 제한적인 경우  다른 작업으로부터 보호합니다. 그러면 아무것도 표시할 필요가 없습니다.  다른 작업의 경우(카테고리 제외).  한다면 것은 아니다. 예 아니오(논병아리.고양이 전용의) 그리고. (보호 Obj.액션. == '편집' 또는   논병아리.데모 레벨 또는   것은 아니다. 도달 가능한 노드 가져오기(    cfg.계층 구조,    보호 Obj.수평의   )[유효 보호 수준('편집', 보호 Obj.제목)])  그리고나서   burb 개체 초기화   현지의 흐리멍덩한 Obj = 블러브.신규(보호 Obj, 논병아리, cfg)     배너 렌더링   한다면 보호 Obj:shouldShowLock() 그리고나서    리트[#리트 + 1] = 끈으로 묶는(     (예 아니오(논병아리.작은.) 그리고. 자물쇠 또는 배너)     .신규(보호 Obj, 흐리멍덩한 Obj, cfg)    )   끝.  끝.   범주 렌더링  한다면 예 아니오(논병아리.카테고리) ~= 거짓의 그리고나서   리트[#리트 + 1] = 보호 Obj:카테고리 링크 만들기()  끝.    돌아가다 테이블.콘캣(리트)  끝.  기능. p.주된(, cfg)  cfg = cfg 또는 요구하다(CONFIG_MODULE)   기본 변수가 있으면 찾습니다.  현지의 부모 = .상위 항목 가져오기 그리고. :상위 항목 가져오기()  현지의 defaultArgs = 부모 그리고. cfg.포장지[부모:제목 가져오기():gsub('/tftp
                
, '')] 사용자 인수를 찾고 부모 프레임을 사용합니다. 래퍼 템플릿. args를 얻다 = args를 얻다 또는 요구하다('모듈:인수').args를 얻다 현지의 사용자 인수 = args를 얻다(, { 상위 항목만 = defaultArgs, 프레임 전용 = 것은 아니다. defaultArgs }) Args 테이블을 만듭니다.사용자 지정 인수는 기본 인수를 덮어씁니다. 현지의 논병아리 = {} 위해서 k, v 쌍들(defaultArgs 또는 {}) 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다 논병아리[k] = v 끝. 위해서 k, v 쌍들(사용자 인수) 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다 논병아리[k] = v 끝. 돌아가다 p._본(논병아리, cfg) 끝. 돌아가다 p