모듈:샌드박스/에루튜온

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