모듈:Diff/샌드박스

Module
----------------------------------------------------------------------------- -- 텍스트를 구분하는 기능을 제공합니다. -- -- (c) 2007, 2008 유리 타크테예프(yuri@freewisdom.org) -- (c) 2007년 히샴 무함마드 -- MediaWiki LUA: [[사용자:Ebraminio]< ebrahim - at - gnu.org > -- -- 라이선스: MIT/X, http://sputnik.freewisdom.org/en/License 참조 -----------------------------------------------------------------------------  SKIP_세퍼레이터 = 진실의  -- 상수  입력   = "입력"」; 나가.  = 아웃; 저도. = "똑같다"  -- 토큰 상태  ----------------------------------------------------------------------------- -- 문자열을 토큰으로 분할합니다. (Gavin Kistner의 분할에서 적용됨) -- http://lua-users.org/wiki/SplitJoin 입니다. -- -- @param text 분할되는 문자열. -- @param separator [ optional ]세퍼레이터 패턴(임의) -- 공백 - %s+). -- @skip skip_skip [ optional ]결과에 구분자를 포함하지 않습니다.      -- @return 토큰 목록. ----------------------------------------------------------------------------- 기능. 분열되다(본문, 분리기, 건너뛰다)    분리기 = 분리기 또는 %s+    현지의 부품. = {}      현지의 개시하다 = 1    현지의 split_start, 스플릿 엔드 = .스트링.발견하다(본문, 분리기, 개시하다)    하는 동안에 split_start 하다       table.insert(부품., .스트링.후보선수(본문, 개시하다, split_start-1))       한다면 것은 아니다. 건너뛰다 그리고나서          table.insert(부품., .스트링.후보선수(본문, split_start, 스플릿 엔드))       끝.       개시하다 = 스플릿 엔드 + 1       split_start, 스플릿 엔드 = .스트링.발견하다(본문, 분리기, 개시하다)    끝.    한다면 .스트링.후보선수(본문, 개시하다) ~= "" 그리고나서       table.insert(부품., .스트링.후보선수(본문, 개시하다))    끝.    돌아가다 부품. 끝.   ----------------------------------------------------------------------------- -- 2개의 문자열 중 가장 긴 공통 서브시퀀스를 도출합니다.이게 더 빨라요. -- stdlib에 의해 제공되는 구현이 아닙니다.히샴 무함마드에 의해 제출되었습니다.  --알고리즘은 다음에서 취득했습니다. -- http://en.wikibooks.org/wiki/Algorithm_implementation/Strings/Longest_common_subsequence -- -- @param t1은 첫 번째 문자열입니다. -- 두 번째 문자열인 @param t2를 지정합니다. -- @가장 일반적인 서브시퀀스를 매트릭스로 반환합니다. ----------------------------------------------------------------------------- 기능. 퀵_LCS(t1, t2)    현지의 m = #t1    현지의 n = #t2     -- 온 디맨드 매트릭스 구축    현지의 C = {}    현지의 설정 가능한 = 설정 가능한    현지의 mt_tbl = {       __인덱스 = 기능.(t, k)          t[k] = 0          돌아가다 0       끝.    }    현지의 MT_C = {       __인덱스 = 기능.(t, k)          현지의 티비례 = {}          설정 가능한(티비례, mt_tbl)          t[k] = 티비례          돌아가다 티비례       끝.    }    설정 가능한(C, MT_C)    현지의 맥스. = math.max    위해서 i = 1, m+1 하다       현지의 ci1 = C[i+1]       현지의 ci = C[i]       위해서 j = 1, n+1 하다          한다면 t1[i-1] == t2[j-1] 그리고나서             ci1[j+1] = ci[j] + 1          또 다른             ci1[j+1] = 맥스.(ci1[j], ci[j+1])          끝.       끝.    끝.    돌아가다 C 끝.    ----------------------------------------------------------------------------- -- 인라인 diff 를 HTML 로서 포맷 합니다.< ins > 및 < del > 태그가 붙어 있습니다. -- -- @token은 {timeout, status}쌍의 테이블을 토큰합니다. -- @HTML 문자열을 반환합니다. ----------------------------------------------------------------------------- 기능. format_as_module(토큰)    현지의 diff_filters(다양한) = ""    현지의 상품권, 상황    위해서 i, token_record(토큰 레코드) 에서 아이페어(토큰) 하다       상품권 = .본문.노우키(token_record(토큰 레코드)[1])       상황 = token_record(토큰 레코드)[2]       한다면 상황 == "입력"」 그리고나서          diff_filters(다양한) = diff_filters(다양한)..'<ins>'..상품권..'/ins>'       그렇지 않으면 상황 == 아웃 그리고나서          diff_filters(다양한) = diff_filters(다양한)..'<del>'..상품권..'/del>'       또 다른           diff_filters(다양한) = diff_filters(다양한)..상품권       끝.    끝.    돌아가다 diff_filters(다양한) 끝.  ----------------------------------------------------------------------------- -- 두 문자열의 차이를 쌍 목록으로 반환합니다.첫 번째 값은 다음과 같습니다. --는 토큰과 두 번째 토큰 상태("same", "in", "out")를 나타냅니다. -- -- @param old "오래된" 텍스트 문자열 -- @param new "새로운" 텍스트 문자열 -- @param separator [ optional ]세퍼레이터 패턴(임의 없음) -- 공백). -- @return 주석이 달린 토큰 목록. ----------------------------------------------------------------------------- 기능. 다르다(늙은, 신규, 분리기)    주장하다(늙은); 주장하다(신규)    신규 = 분열되다(신규, 분리기); 늙은 = 분열되다(늙은, 분리기)     -- 우선 문자열의 시작과 끝을 비교하여 공통을 제거합니다.    -- 프리픽스와 서픽스.토큰의 수가 적습니다.    --중간은 다른데, 이 경우 우리는 스스로를 많이 구할 수 있다.    -- LCS 계산의 관점에서.    현지의 접두사 = "" --처음에는 일반적인 텍스트    현지의 접미사 = "" --결국 공통 텍스트    하는 동안에 늙은[1] 그리고. 늙은[1] == 신규[1] 하다       현지의 상품권 = 테이블.삭제(늙은, 1)       테이블.삭제(신규, 1)       접두사 = 접두사..상품권    끝.    하는 동안에 늙은[#늙은] 그리고. 늙은[#늙은] == 신규[#신규] 하다       현지의 상품권 = 테이블.삭제(늙은)       테이블.삭제(신규)       접미사 = 상품권..접미사    끝.     -- diff(get_diff의 up값)를 저장하는 테이블을 설정합니다.우리는 할 거예요    -- 테일콜을 허용하기 위해 역순으로 저장합니다.저희도 계속    -- 이 표의 기능은 다른 이벤트를 처리하는 기능입니다.    현지의 rev_diff = {       놓다  = 기능.(자신, 상품권, 유형) table.insert(자신, {상품권,유형}) 끝.,       인스톨  = 기능.(자신, 상품권) 자신:놓다(상품권, 입력) 끝.,         = 기능.(자신, 상품권) 자신:놓다(상품권, 나가.) 끝.,       저도. = 기능.(자신, 상품권) 한다면 상품권 그리고나서 자신:놓다(상품권, 저도.) 끝. 끝.,    }     -- 첫 번째 토큰으로 서픽스를 넣습니다(diff는    -- 역순서)     rev_diff:저도.(접미사)     -- LCS 매트릭스를 거꾸로 스캔하여 빌드하는 함수를 정의합니다.    --diff 출력을 재귀적으로 출력합니다.    현지의 기능. get_diff(C, 늙은, 신규, i, j)       현지의 old_i = 늙은[i]       현지의 new_j = 신규[j]       한다면 i >= 1 그리고. j >= 1 그리고. old_i == new_j 그리고나서          rev_diff:저도.(old_i)          돌아가다 get_diff(C, 늙은, 신규, i-1, j-1)       또 다른          현지의 Cij1 = C[i][j-1]          현지의 Ci1j = C[i-1][j]          한다면 j >= 1 그리고. (i == 0 또는 Cij1 >= Ci1j) 그리고나서             rev_diff:인스톨(new_j)             돌아가다 get_diff(C, 늙은, 신규, i, j-1)          그렇지 않으면 i >= 1 그리고. (j == 0 또는 Cij1 < > Ci1j) 그리고나서             rev_diff:(old_i)             돌아가다 get_diff(C, 늙은, 신규, i-1, j)          끝.       끝.    끝.    그럼 불러주세요.    get_diff(퀵_LCS(늙은, 신규), 늙은, 신규, #늙은 + 1, #신규 + 1)     -- 마지막에 프레픽스를 입력합니다.    rev_diff:저도.(접두사)     -- 차이를 반대로 합니다.    현지의 다르다 = {}     위해서 i = #rev_diff, 1, -1 하다       table.insert(다르다, rev_diff[i])    끝.    다르다.행선지 = format_as_module    돌아가다 다르다 끝.  ----------------------------------------------------------------------------- -- Wiki diff style, 현재 회선 전용입니다. ----------------------------------------------------------------------------- 기능. WikiDiff(늙은, 신규, 분리기)   현지의 토큰 = 다르다(늙은, 신규, 분리기)   --[ [ local root = mw . screate . create ( ' )  로컬 토큰, 상태  로컬 plusMinusStyle = '너비: 2%, 패딩: 0.25em, 글꼴-무게: 굵은 글씨;' .. '크기: 1.25em, 텍스트 정렬: 끝' local tdDivStyle = 'word-fords: break-word; 방향: ltr;'  local tdSharedStyle = '너비: 48%, 테두리 스타일: 솔리드, 테두리 간격: 0.33em; ' .. '문자: 0.33em 0.5em, 글꼴 크기: 88%, 공백: 사전 입력, 테두리 폭: 1px 1px 4px; ..' '-webkit-border-end-width: 1px; -webkit-border-start-width: 4px; ' .. '-moz-border-end-width: 1px; -moz-border-start-width: 4px;' -- 브라우저의 기본 테두리 너비보다 우선합니다.공통의 RTL UI에 필요합니다. local insDelSharedStyle = '문자: 0.25em 0, 글꼴-무게: 굵은 글씨, 텍스트 장식: initial;'   로컬 tr = root:tag('table'):addClass('diff'):css('width', '100%'):tagsettr)  tr:태그 부착') : addClass('diff-marker') : cssText(plusMinusStyle) : confirstitext-)  로컬 삭제 = tr : tag '('' ) : cssText ('border-color: #fe49c; '..tdSharedStyle) : addClass('diff-deletedline') : tag "div" ) : cssText(tdDivStyle)  i의 경우 ipairs(ipairs)의 token_record는 토큰 = mw.text.nowiki(token_record[1]) status = token_record [ 2 ] 상태 == OUT이면 삭제했다 : tag del') : cssText ('background: #feeec8; '..insDelSharedStyle) : add Class('diffchange') : add Class('diffchange-inline') : paramitext(표준) else 상태가 == SAME이면 삭제됨: syslogitext(삭제) 끝. 끝.  tr:태그 부착') : cssText(plusMinusStyle) : specitext+)  로컬 삽입 = tr : tag '('' ) : cssText ('border-color: #a3d3ff; '..tdSharedStyle) : add Class ('diff-addline') : tag "div" ) : cssText(tdDivStyle)  i의 경우 ipairs(ipairs)의 token_record는 토큰 = mw.text.nowiki(token_record[1]) status = token_record [ 2 ] 상태가 == IN인 경우 삽입했다 : tagins') : cssText ('background: #d8ecff; '..insDelSharedStyle) : add Class('diffchange') : add Class('diffchange-inline') : paramitext(표준) else 상태가 == SAME이면 삽입: substititext(표준) 끝. 끝. 루트 반환]--   돌아가다 토큰 끝.  기능. 주된()  현지의 wD = WikiDiff(.본문.떼어내다(.본문.해독하다(.args[1])), .본문.해독하다(.본문.떼어내다(.args[2])), .args[3] 또는 '[%s%:-]+')  wD = string.gsub(wD[3][1], '<ins> <ins class="diffchange diffchange-filter" style="background: #d8ecff; 패딩: 0.25em 0; 글꼴 무게: 굵은 글씨; 텍스트 장식: initial;">', "")  돌아가다 wD 끝.  돌아가다 {   다르다 = 다르다,   WikiDiff = WikiDiff,   주된 = 주된 }