모듈:샌드박스/에루튜온
Module
현지의 p = {} 기능. p.표시하다(틀) 현지의 페이지입니다. = 틀.args[1] 또는 "사용자: Erutuon/Unicode/DerivedCoreProperties.txt" 현지의 본문 = 주장하다(음.직함.신규(페이지입니다.):컨텐츠의 취득()) 현지의 디폴트 무시 가능 = 본문 :경기("파생 속성:Default_Ignorable_Code_Point.-(%f[^]\n]%x%x%x%x.-)%s*\n총 코드 포인트 수") 현지의 싱글, 범위 = {}, {} 위해서 코드 포인트 1, 코드 포인트 2 에 디폴트 무시 가능:gmatch(%f[^\n%z](%x+)%?%?(%x*)") 하다 코드 포인트 1, 코드 포인트 2 = 톤수(코드 포인트 1, 16), 톤수(코드 포인트 2, 16) 현지의 라스트 레인지 = 범위[#범위] 한다면 라스트 레인지 그리고. 라스트 레인지[2] == 코드 포인트 1 - 1 그리고나서 라스트 레인지[2] = 코드 포인트 2 또는 코드 포인트 1 또 다른 한다면 것은 아니다. 코드 포인트 2 그리고나서 싱글[코드 포인트 1] = 진실의 또 다른 table.insert(범위, { 코드 포인트 1, 코드 포인트 2 }) 끝. 끝. 끝. 현지의 템플릿 = [[ 로컬 데이터 = {} data.defaultIgnorable = { 싱글 = { ... }, 범위 = { ... }, } 데이터를 반환하다 ]] 현지의 어레이 = 요구하다 "모듈: 배열" 현지의 인쇄 범위 = 어레이() 위해서 _, 범위 에 아이페어(범위) 하다 현지의 낮다, 높은, 스크립트_코드 = 개봉하다(범위) 인쇄 범위:삽입하다(('\t\t{ 0x%05X, 0x%05X},):포맷(낮다, 높은)) 끝. 현지의 인쇄싱글 = 어레이() 위해서 코드 포인트 에 요구하다 '모듈:테이블 도구'.정렬 페어(싱글) 하다 인쇄싱글:삽입하다(('\t\t[0x%05X] = 참'):포맷(코드 포인트)) 끝. 현지의 데이터. = 템플릿 :서브('%.%.%.', 인쇄싱글:콘센트('\n'), 1) :서브('%.%.%.', 인쇄 범위:콘센트('\n'), 1) 돌아가다 데이터. 끝. 현지의 Unicode_data = 요구하다 "모듈:Unicode 데이터/샌드박스" 현지의 재밌어요 = 요구하다 "모듈:재미있다" 현지의 m_table = 요구하다 "모듈:테이블 도구" 현지의 기능. 에러(수평, ...) 한다면 유형(수평) == "숫자" 그리고나서 돌아가다 에러(string.format(...), 수평 + 1) 또 다른 -- level은 실제로는 포맷 문자열입니다. 돌아가다 에러(string.format(수평, ...), 2) 끝. 끝. 기능. p.search_for_language_module(틀) 현지의 page_name = 틀.args[1] 또는 "영어" 현지의 성공., title_object(title_object) = pcall(음.직함.신규, page_name) 한다면 것은 아니다. (성공. 그리고. title_object(title_object)) 그리고나서 음.로그("%s'에 대한 제목 개체를 만들 수 없습니다.", page_name) 돌아가다 끝. 현지의 내용 = title_object(title_object):컨텐츠의 취득() 현지의 language_displays(언어_언어) = {} 위해서 lang_module 에 내용:gmatch "{{filter[^}]+" 하다 현지의 template_name = lang_module:경기("{{([^ }]+)") 현지의 language_code 한다면 template_name == "실패" 그리고나서 language_code = lang_module:경기 "{{{{{^}}]+}" 그렇지 않으면 template_name:발견하다 "^****" 그리고나서 language_code = lang_module:경기 "{{cape-([^ }}]+" 끝. 한다면 language_code 그리고나서 language_displays(언어_언어)[language_code] = 진실의 끝. 끝. 돌아가다 table.concat(m_table.Keys To List(키 투 리스트)(language_displays(언어_언어)), ", ") 끝. 현지의 해석된_parsags_mt = { __인덱스 = { -- "error"는 오류 메시지입니다. -- "index"는 오류가 발견된 하위 태그의 서수입니다. 던지다 = 기능. (자신, 에러, 색인) 자신.에러 = 자신.error_module(오류)[에러] 자신.무효한 = table.concat(자신.입력, "-", 색인) 돌아가다 자신:remove_interrary_fields() 끝., remove_interrary_fields = 기능. (자신) --내부에서만 도움이 됩니다. 자신.입력 = 제로 자신:pretty_프린트() p.validate_module_tag(자신) 돌아가다 자신 끝., -- 언어 서브태그 정규화: -- ZH-LATN -> zh-Latn, FR-ca -> fr-CA pretty_프린트 = 기능. (자신) 위해서 열쇠, 기능하다 에 쌍들(자신.print_funcs) 하다 한다면 자신[열쇠] 그리고나서 자신[열쇠] = 기능하다(자신[열쇠]) 끝. 끝. 돌아가다 자신 끝., -- 해석된 서브태그에서 원래 태그를 다시 만듭니다. 취득_태그 = 기능. (자신) 한다면 자신.태그 그리고나서 돌아가다 자신.태그 끝. 현지의 태그 = {} 위해서 _, 서브태그_이름 에 아이페어(자신.서브태그_순서) 하다 한다면 서브태그_이름 == "프라이빗_use" 그리고나서 table.insert(태그, "x") 끝. 한다면 유형(자신[서브태그_이름]) == "테이블" 그리고나서 위해서 _, 서브태그 에 아이페어(자신[서브태그_이름]) 하다 table.insert(태그, 서브태그) 끝. 또 다른 table.insert(태그, 자신[서브태그_이름]) 끝. 끝. 태그 = table.concat(태그, "-") 자신.태그 = 태그 -- 결과를 캐시합니다. 돌아가다 태그 끝., 서브태그_순서 = { "언어", 스크립트, "지역", "실패", "프라이빗_use" }, error_module(오류) = { invalid_invaliders = "문자 표시", 언어 없음 = "언어 서브태그 없음", invalid_invalidag = "서브태그 추가", invalid_private_use = "개인 사용 하위 태그의 길이가 범위를 벗어남", empty_private_use = "빈 개인 사용 하위 태그", } } } 현지의 기능. initial_syslogs_syslogs(초기의, 쉬다) 돌아가다 string.uper(초기의) .. string.lower(쉬다) 끝. 현지의 기능. lower_or_map_lower(스트레이트) 한다면 유형(스트레이트) == "테이블" 그리고나서 돌아가다 재밌어요.지도(string.lower, 스트레이트) 또 다른 돌아가다 string.lower(스트레이트) 끝. 끝. 해석된_parsags_mt.__인덱스.print_funcs = { 언어 = string.lower, 대본 = 기능. (스크립트_코드) 돌아가다 (string.gsub(스크립트_코드, "^(%a)(%a%a%a)$", initial_syslogs_syslogs)) 끝., 지역 = string.uper, 변종 = lower_or_map_lower, 프라이빗 사용 = lower_or_map_lower, } 설정 가능한(해석된_parsags_mt, { __콜 = 기능. (자신, 입력) 돌아가다 설정 가능한({ 입력 = 입력 }, 자신) 끝. }) -- 각 서브태그에 대한 패턴 배열 및 이름에 대한 "type" 필드 -- 서브태그입니다. -- 패턴은 순서대로 체크되어 서브태그 중 하나를 건너뛸 수 있습니다. -- 예를 들어 "language" 서브태그는 "script" 앞에 와야 합니다. -- 서브태그입니다만, 태그에는 「언어」서브태그가 포함되어 있지 않고, 「스크립트」서브태그가 포함되지 않는 경우가 있습니다. -- 다음으로 "지역" 서브태그를 지정합니다. -- 서브태그 전체 목록이 반복된 경우 나머지 서브태그 -- 개인사용 서브태그 패턴과 일치해야 합니다.그렇지 않으면 태그가 비활성화됩니다. 현지의 서브태그_info = { -- 데이터 모듈에 넣을 수 있습니다. { %a%a%a?, '1%a+', 유형 = "언어" }, -- ll 또는 lll; 특수 케이스 -- extlang 포함? { %a%a%a%a", 유형 = 스크립트 }, -- SSS { %a%a, %d%d%d", 유형 = "지역" }, --rr, DDD { %d%d%d%d%d", -- 4자리 %w%w%w%w%w%w?%w?%w?", -- 5~8자(알넘 문자) 유형 = "실패", 반복할 수 = 진실의, --여러 종류가 있을 수 있습니다. } } -- [모듈]의 이전 초안:Lang/sandbox] : -- https://en.wikipedia.org/w/index.php?oldid=812819217 -- https://www.w3.org/International/articles/language-tags/ 를 기반으로 합니다. -- 언어 태그를 해석합니다. -- 태그가 문자열이 아니거나 비어 있으면 0을 반환합니다. --그렇지 않으면 서브태그 타입의 맵을 포함한 테이블을 서브태그에 반환하고, 서브태그 타입의 모든 서브태그에 대해 --가 해석되었습니다. -- 에러가 있었을 경우, 에러의 설명이 기재되어 있는 「error」필드가 반환됩니다. -- error 및 태그의 접미사가 다음에서 시작하는 "displicate" 필드 -- 에러가 발생한 인덱스. -- "u"에 의해 도입된 태그와 같은 "확장" 태그를 인식하지 않습니다. -- Wikipedia 에서는 필요 없습니다."대형" 태그를 인식하지 않습니다. -- "zh-yue"와 같은 확장 언어 하위 태그를 인식하지 않습니다. -- https://www.rfc-editor.org/rfc/rfc6067.txt, https://tools.ietf.org/html/bcp47 -- 구문이 올바른지 확인만 하고 값이 유효한지는 확인합니다.위해서 -- instance는 "zz"와 같은 존재하지 않는 언어 코드를 받아들입니다. 기능. p.해석_IETF(태그) 한다면 유형(태그) ~= "문자열' 또는 태그 == "" 그리고나서 돌아가다 제로 끝. -- 특수 필드 "invalid", "error"가 포함될 수 있습니다. -- 「error」는, 이 에러의 원인을 나타내고 있습니다. -- 태그가 유효하지 않습니다(해당하는 경우). -- 다른 모든 필드는 하위 태그이며 다음 태그에 표시됩니다. -- 주문: -- "language", "script", "region", "private_use", "private" -- 이러한 서브태그는 모두 스트링 또는 제로일 수 있으며, '변수'는 -- 여러 배리언트서브태그가 검출된 경우 문자열 배열. -- "sublic"은 태그의 마지막 유효한 서브태그 뒤의 부분(예: -- 하이픈). 현지의 세그먼트 = 음.본문.분열되다(태그, "-") 현지의 해석된_오류 진단 = 해석된_parsags_mt(세그먼트) -- 언어 태그에는 ASCII 알파벳과 숫자만 포함될 수 있습니다. -- 문자와 하이픈 기호. 한다면 것은 아니다. 태그:발견하다 "^[A-Za-z0-9-]+$" 그리고나서 돌아가다 해석된_오류 진단:던지다( "syslog_syslogs", 재밌어요.색인( 기능. (태그) 돌아가다 태그:발견하다 [^A-Za-z0-9-] 끝., 세그먼트)) 끝. 현지의 서브태그_i = 1 -- subag_info의 현재 항목 인덱스. 현지의 세그먼트_i = 1 -- 현재 세그먼트의 인덱스. 하는 동안에 세그먼트[세그먼트_i] 그리고. 서브태그_info[서브태그_i] 하다 현지의 부분 = 세그먼트[세그먼트_i] 현지의 서브태그_타입 하는 동안에 것은 아니다. 서브태그_타입 그리고. 서브태그_info[서브태그_i] 하다 -- "subtag_info"의 "subtag_i"에서 서브태그 유형의 각 패턴을 확인합니다. 현지의 cur_cursag = 서브태그_info[서브태그_i] 위해서 _, 양식 에 아이페어(cur_cursag) 하다 한다면 부분:발견하다("^" .. 양식 .. "$") 그리고나서 서브태그_타입 = cur_cursag.유형 -- 복수의 「변수」서브태그(및 「확장」)가 존재할 수 있습니다. -- 서브태그(추가되어 있는 경우) 한다면 것은 아니다. cur_cursag.반복할 수 그리고나서 서브태그_i = 서브태그_i + 1 끝. 브레이크. 끝. 끝. 한다면 것은 아니다. 서브태그_타입 그리고나서 --일치하지 않습니다.다음 서브태그를 시도합니다. 서브태그_i = 서브태그_i + 1 끝. 끝. -- 언어 서브태그를 찾을 수 없거나 현재 세그먼트가 없는 경우 -- 서브태그로서 일치하고, 루프를 끊고, --개인용 서브태그. 한다면 세그먼트_i == 1 그리고. 서브태그_타입 ~= "언어" 또는 것은 아니다. 서브태그_타입 그리고나서 브레이크. 또 다른 한다면 해석된_오류 진단[서브태그_타입] 그리고나서 -- 배열을 만듭니다. 한다면 유형(해석된_오류 진단[서브태그_타입]) == "문자열' 그리고나서 해석된_오류 진단[서브태그_타입] = { 해석된_오류 진단[서브태그_타입] } 끝. -- else 테이블 table.insert(해석된_오류 진단[서브태그_타입], 부분) 또 다른 해석된_오류 진단[서브태그_타입] = 부분 끝. last_segment_i = 세그먼트_i 끝. 세그먼트_i = 세그먼트_i + 1 끝. 한다면 세그먼트[세그먼트_i] 그리고나서 -- 스캔할 세그먼트가 더 있습니까? -- 모든 서브태그가 일치하는 것은 아닙니다.전용 서브태그를 확인합니다. -- https://tools.ietf.org/html/bcp47#section-2.2.7 -- 개인사용 서브태그는 1~8의 1개 이상의 시퀀스로 구성됩니다. -- 영숫자 앞에 "x-"가 붙습니다. -- 영숫자는 이미 체크되어 있습니다. -- 태그는 언어 서브태그 또는 개인사용 서브태그로 시작해야 합니다. -- 다음 세그먼트가 "x"가 아닌 경우, 개인용 서브태그를 도입합니다. --는 프라이빗 용도의 서브태그가 아닙니다. 한다면 세그먼트[세그먼트_i] 그리고. 세그먼트[세그먼트_i]:더 낮게() ~= "x" 그리고나서 한다면 것은 아니다. 해석된_오류 진단.언어 그리고나서 돌아가다 해석된_오류 진단:던지다("no_language", 1) 또 다른 돌아가다 해석된_오류 진단:던지다("syslog_syslog", 세그먼트_i) 끝. 그렇지 않으면 것은 아니다. 세그먼트[세그먼트_i + 1] 그리고나서 돌아가다 해석된_오류 진단:던지다("empty_private_use", 세그먼트_i) 끝. -- "x" 뒤에 오는 모든 세그먼트의 길이를 확인합니다. 위해서 i = 세그먼트_i + 1, #세그먼트 하다 현지의 길이 = #세그먼트[i] 한다면 것은 아니다. (1 <=> 길이 그리고. 길이 <=> 8) 그리고나서 돌아가다 해석된_오류 진단 :던지다("private_use", 세그먼트_i) 끝. 끝. 한다면 것은 아니다. 세그먼트[last_segment_i + 3] 그리고나서 --개인용 서브태그는 1개뿐입니다. 해석된_오류 진단.프라이빗 사용 = 세그먼트[세그먼트_i + 1] 또 다른 해석된_오류 진단.프라이빗 사용 = {} 위해서 i = 세그먼트_i + 1, #세그먼트 하다 table.insert(해석된_오류 진단.프라이빗 사용, 세그먼트[i]) 끝. 끝. 끝. 돌아가다 해석된_오류 진단:remove_interrary_fields() 끝. 현지의 lang_name_table = 음.로드 데이터 "모듈:언어/이름/데이터" 현지의 동의어_표 = 음.로드 데이터 "모듈:Lang/ISO 639 동의어" 현지의 lang_data = 음.로드 데이터 "모듈:언어/데이터" 기능. p.validate_module_tag(해석된_오류 진단) -- 태그가 언어 서브태그 또는 개인사용 서브태그로 시작하는 것을 이미 확인했습니다. -- 스크립트 코드는 처음에는 대문자로, 지역 코드는 대문자로, -- 그 외는 모두 소문자입니다. --언어 태그의 존재를 확인합니다. 한다면 해석된_오류 진단.언어 그리고. 것은 아니다. (lang_data.덮어쓰다[해석된_오류 진단.언어] 또는 lang_name_table.언어[해석된_오류 진단.언어]) 그리고나서 음.로그.("잘못된 언어 코드", 해석된_오류 진단.언어, "입력"」, 해석된_오류 진단:취득_태그()) 끝. -- 스크립트 태그의 존재를 확인합니다. 한다면 해석된_오류 진단.대본 그리고나서 현지의 lower_script = 해석된_오류 진단.대본:더 낮게() 한다면 것은 아니다. lang_name_table.대본[lower_script] 그리고나서 음.로그.("잘못된 스크립트 코드", 해석된_오류 진단.대본, "입력"」, 해석된_오류 진단:취득_태그()) 끝. -- 스크립트 태그가 불필요한 것으로 마크되어 있지 않은지 확인합니다(그 이유는 --이것은 언어 디폴트로 간주됩니다). 한다면 lang_name_table.억제되었다[lower_script] 그리고. 해석된_오류 진단.언어 그리고. m_table.어레이 내( lang_name_table.억제되었다[lower_script], 해석된_오류 진단.언어:더 낮게()) 그리고나서 음.로그.(해석된_오류 진단.대본, "로 억제됨", 해석된_오류 진단.언어, "입력"」, 해석된_오류 진단:취득_태그()) 끝. 끝. --지역코드 유무 확인.. 한다면 해석된_오류 진단.지역 그리고. 것은 아니다. lang_name_table.지역[해석된_오류 진단.지역:더 낮게()] 그리고나서 음.로그.("잘못된 지역 코드", 해석된_오류 진단.지역, "입력"」, 해석된_오류 진단:취득_태그()) 끝. -- 바리안트코드가 유효한지, 또한 바리안트코드가 유효한지 확인합니다. -- 언어, 스크립트, 지역 및 바리안트의 조합이 지정됩니다. -- 중복된 변형 서브태그가 있는지 확인하시겠습니까? 한다면 해석된_오류 진단.변종 그리고나서 현지의 lower_tag(lower_tag) = 해석된_오류 진단:취득_태그():더 낮게() 위해서 _, 변종 에 아이페어(유형(해석된_오류 진단.변종) == "테이블" 그리고. 해석된_오류 진단.변종 또는 { 해석된_오류 진단.변종 }) 하다 한다면 것은 아니다. lang_name_table.변종[변종] 그리고나서 음.로그.("잘못된 변형 코드", 변종, "입력"」, 해석된_오류 진단:취득_태그()) 또 다른 현지의 접두사 = 해석된_오류 진단:취득_태그():더 낮게():경기("^(.-)%-" .. 변종) -- 프레픽스 중 적어도1개가 에 있는지 확인합니다. -- lower_tag의 선두. 한다면 것은 아니다. 재밌어요.몇개(기능. (접두사) 돌아가다 lower_tag(lower_tag):발견하다(접두사, 1, 진실의) == 1 끝., lang_name_table.변종[변종].프리픽스) 그리고나서 음.로그.("변수 태그", 변종, "프리픽스에 속하지 않음", 접두사, "입력"」, 해석된_오류 진단:취득_태그()) 끝. 끝. 끝. 끝. --개인용 서브태그가 실제로 Wikipedia에서 사용되고 있는지 확인합니다. 한다면 해석된_오류 진단.프라이빗 사용 그리고. 것은 아니다. lang_data.덮어쓰다[해석된_오류 진단.태그] 그리고나서 음.로그.("잘못된 개인 사용 하위 태그", 해석된_오류 진단:취득_태그()) 끝. 끝. 기능. p.show_COINS(틀) 현지의 레퍼런스 = 틀.args[1] 현지의 태그 = 레퍼런스:경기('<span [^>>*class="Z3988"[^>]*>') 현지의 데이터. = 태그:경기('param='(.-")) 현지의 값 = {} 위해서 아이템 에 음.본문.점등(데이터., "&") 하다 현지의 열쇠, 가치 = 아이템:경기("(.-)=(.*)") 값[열쇠] = 음.uri.해독하다(가치) 끝. 돌아가다 레퍼런스 .. "\n\n" .. table.concat( 요구하다 "모듈:재미있다".맵아이터( 기능. (가치, 열쇠) 돌아가다 (%s: %s):포맷(열쇠, 가치) 끝., m_table.정렬 페어( 값)), ", ") 끝. 돌아가다 p