줄별 diff 가 아닌 가로 diff

랜덤여신의 이미지

Quote:
저희 위키미디어 재단과 귀중한 시간과 재능지식여러위키미디어 프로젝트에 기여하는 수만 명의 자원봉사자들은 아는 것이 곧 힘이라는 사실을 깨닫고고 생각하고, 따라서 어느 누구에게나 자유롭게 제공되어야 한다고 생각합니다.

여러분과 같은 수많은 일반 사용자들의 폭 넓은많은 지원으로 위키백과는 인류 역사상 가장 방대한 내용을 담은거대한 백과사전이 되었습니다. 불과 몇 년 전까지만 해도 wikipedia.org는 전 세계 웹사이트 중 10,000 위권에도 들지 못하였지만, 이제는 2005년 11월 한 달에 25억번의 페이지 뷰를 자랑하고 세계 30위권 안에 드는 굉장한 웹사이트가 되었습니다. 작년 이맘때 즈음,에는 전 세계 인터넷 사용자들 중 일 퍼센트의 절반0.5%도 채 안되는 사람들만이 wikipedia.org를 이용하곤 했답니다. 하지만지만, 현재 그 숫자는 네 배 이상 많아졌고, 다음 해에도 이 같은 성장이 계속되길 기대하고 있습니다. 내년에도 여러분의 도움으로 수천만명의 더 많은 사용자들이 위키백과 및 다른 자매 프로젝트를 계속 사용할 수 있게 되는 것이지요.


이런식의 '가로 diff' 를 하는 도구가 있을까요?

추가: 이왕이면 터미널에서 쓸 수 있는 도구로 부탁드립니다. 음, 생각해 보니 diff 명령에 뭔가 옵션이 있을 것 같기도 하고;;

File attachments: 
첨부파일 크기
Image icon smartdiff.png27.22 KB
lifthrasiir의 이미지

랜덤여신 wrote:
Quote:
저희 위키미디어 재단과 귀중한 시간과 재능지식여러위키미디어 프로젝트에 기여하는 수만 명의 자원봉사자들은 아는 것이 곧 힘이라는 사실을 깨닫고고 생각하고, 따라서 어느 누구에게나 자유롭게 제공되어야 한다고 생각합니다.

여러분과 같은 수많은 일반 사용자들의 폭 넓은많은 지원으로 위키백과는 인류 역사상 가장 방대한 내용을 담은거대한 백과사전이 되었습니다. 불과 몇 년 전까지만 해도 wikipedia.org는 전 세계 웹사이트 중 10,000 위권에도 들지 못하였지만, 이제는 2005년 11월 한 달에 25억번의 페이지 뷰를 자랑하고 세계 30위권 안에 드는 굉장한 웹사이트가 되었습니다. 작년 이맘때 즈음,에는 전 세계 인터넷 사용자들 중 일 퍼센트의 절반0.5%도 채 안되는 사람들만이 wikipedia.org를 이용하곤 했답니다. 하지만지만, 현재 그 숫자는 네 배 이상 많아졌고, 다음 해에도 이 같은 성장이 계속되길 기대하고 있습니다. 내년에도 여러분의 도움으로 수천만명의 더 많은 사용자들이 위키백과 및 다른 자매 프로젝트를 계속 사용할 수 있게 되는 것이지요.


이런식의 '가로 diff' 를 하는 도구가 있을까요?

이봐요... -_-;;;

몇몇 프로그램은 가로 diff를 해 주기도 합니다. 예를 들어서 AcroEdit에 딸린 AcroDiff 같은 것.....

- 토끼군

cinsk의 이미지

console에서 쓸 수 있는 것은 아니지만, 제가 즐겨 쓰는 도구로, xxdiff가 있습니다. 물론 요청하신 horizontal diff 기능도 있습니다.

raymundo의 이미지

모니위키나 몇몇 위키도 유사하게 diff 를 보여 주던데 (가로 diff라기보다는, 행으로 보여주되 추가,삭제된 글자에만 따로 표식) 이것은 어떤 툴을 쓴 건가요, 아니면 직접 구현한 건가요?

좋은 하루 되세요!

wkpark의 이미지

raymundo wrote:
모니위키나 몇몇 위키도 유사하게 diff 를 보여 주던데 (가로 diff라기보다는, 행으로 보여주되 추가,삭제된 글자에만 따로 표식) 이것은 어떤 툴을 쓴 건가요, 아니면 직접 구현한 건가요?

phpwiki에 있는 diff와 diff3를 가져다 쓰고 모니위키에 맞게 수정한것입니다. 그런데 phpwiki는 줄단위 말고 단어 단위 기능을 사용하지 않고 있었고, 단어단위 diff를 쓸 수 있도록 조금 고쳤습니다.
(php5에서도 돌아가도록 버그도 잡고..)

단어 단위 diff는 줄당 고쳐진 단어수가 몇개 되지 않을때 유용합니다.
많이고쳐 진 경우는 단어 단위 diff보다는 줄별diff가 유용하더군요. 아예 wiki랜더링할 때 diff mode를 두어서 보다 자연스러운 diff방식을 구현하려 계획중이고 일부 구현해두었습니다.

온갖 참된 삶은 만남이다 --Martin Buber

wkpark의 이미지

wkpark wrote:

단어 단위 diff는 줄당 고쳐진 단어수가 몇개 되지 않을때 유용합니다.
많이고쳐 진 경우는 단어 단위 diff보다는 줄별diff가 유용하더군요. 아예 wiki랜더링할 때 diff mode를 두어서 보다 자연스러운 diff방식을 구현하려 계획중이고 일부 구현해두었습니다.

모니위키에서 writeboard식 diff를 구현했습니다. 제법 쓸만해진 것 같고 차기버전 모니위키에서 지원될것입니다~
댓글 첨부 파일: 
첨부파일 크기
Image icon 0바이트

온갖 참된 삶은 만남이다 --Martin Buber

raymundo의 이미지

wkpark wrote:
wkpark wrote:

단어 단위 diff는 줄당 고쳐진 단어수가 몇개 되지 않을때 유용합니다.
많이고쳐 진 경우는 단어 단위 diff보다는 줄별diff가 유용하더군요. 아예 wiki랜더링할 때 diff mode를 두어서 보다 자연스러운 diff방식을 구현하려 계획중이고 일부 구현해두었습니다.

모니위키에서 writeboard식 diff를 구현했습니다. 제법 쓸만해진 것 같고 차기버전 모니위키에서 지원될것입니다~

멋지네요. 기존의 php 라이브러리를 필요로 하나요? 제가 직접 고쳐가며 쓰고 있는 usemodwiki 에도 적용하고 싶은데 php는 완전 문외한이고 perl도 기존의 위키 소스 보면서 흉내내는 정도라서요. 라이브러리를 쓰지 않고 있다면 제가 모니위키 소스를 보면서 perl로 똑같이 흉내내는 것까지는 해볼 수 있지 않을까 소망하고 있습니다 ^^;;

좋은 하루 되세요!

wkpark의 이미지

raymundo wrote:
wkpark wrote:
wkpark wrote:

단어 단위 diff는 줄당 고쳐진 단어수가 몇개 되지 않을때 유용합니다.
많이고쳐 진 경우는 단어 단위 diff보다는 줄별diff가 유용하더군요. 아예 wiki랜더링할 때 diff mode를 두어서 보다 자연스러운 diff방식을 구현하려 계획중이고 일부 구현해두었습니다.

모니위키에서 writeboard식 diff를 구현했습니다. 제법 쓸만해진 것 같고 차기버전 모니위키에서 지원될것입니다~

멋지네요. 기존의 php 라이브러리를 필요로 하나요? 제가 직접 고쳐가며 쓰고 있는 usemodwiki 에도 적용하고 싶은데 php는 완전 문외한이고 perl도 기존의 위키 소스 보면서 흉내내는 정도라서요. 라이브러리를 쓰지 않고 있다면 제가 모니위키 소스를 보면서 perl로 똑같이 흉내내는 것까지는 해볼 수 있지 않을까 소망하고 있습니다 ^^;;


원리적으로는 간단합니다. phpwiki에서 사용하던 difflib.php를 약간 고쳐서 사용한 것이고 (고친 부분이 핵심적으로 필요한 부분이 아닙니다) difflib.php에 있는 WordLevelDiff()라는 class가 가장 핵심적인 부분이며, 기존 텍스트와 word diff된 텍스트를 합해서 위키마크업 + <ins><del>태크가 조합된 텍스트를 랜더링해서 보여주는 것입니다. (이때 몇가지 트릭이 필요)

diff source를 word diff source로 만든 후에 word diff source를 기존 위키텍스트와 적절히 병합시키는 것입니다.
(예를 들으면 훨씬 이해하기 쉬울것인데...)

perl이나 python이 이미 wordleveldiff()관련 클래스나 함수가 있을 것이므로 구현하실 수 있을것으로 생각되고요, 모니위키에서 구현된 소스는 워낙 제가 지저분하게 짜서 보시기 좀 괴로울 것으로 생각되지만 ^^;; 아무튼 원리는 상당히 간단합니다. (difflib.php와 plugin/Diff.php의 smart_diff(), macro_diff()를 참조하시면 됩니다.

위키텍스트 + <ins><del> 혹은 <div class="diff-added|diff-removed"> html 태그를 함께 사용하여서 이와 관련된 html태그를 특별 처리를 하는 식으로 코드가 좀 지저분해졌습니다. ㅡㅡ;;
------
방금 살펴보니, mediawiki도 dokuwiki도 모두 phpwiki의 difflib.php를 사용하는 것 같습니다.

온갖 참된 삶은 만남이다 --Martin Buber

feanor의 이미지

wdiff(word diff)라는 프로그램도 있습니다.

http://www.gnu.org/software/wdiff/

wkpark의 이미지

feanor wrote:
wdiff(word diff)라는 프로그램도 있습니다.

http://www.gnu.org/software/wdiff/


네 첨에 저도 wdiff를 참고했는데, 관련 문서를 좀 읽어보니 내부적으로 diff된 그대로 내용을 그냥 가져다 쓰는 것 같더군요.
(게다가 difflib.php에 이미 wordleveldiff()가 구현되어 있었으므로
wdiff 외부프로그램보다는 직접 구현하는 식으로 했습니다. 또한
[[Maco]] 같은 문법을 한 덩어리로 취급하거나 하려면 wordleveldiff()의 split관련된 정규식을 직접 고쳐서 써야지만
좀 더 그럴듯 한 diff가 얻어집니다.
)

perl에 라이브러리를 쓸 수 없다면 wdiff를 쓰면 되겠군요.

옵션에 이런게 있습니다.

  -w, --start-delete=STRING  string to mark beginning of delete region
  -x, --end-delete=STRING    string to mark end of delete region
  -y, --start-insert=STRING  string to mark beginning of insert region
  -z, --end-insert=STRING    string to mark end of insert region

이 옵션을 함께 쓰면 (예를 들어 -w "<del>" -x "</del>" )
될 듯

온갖 참된 삶은 만남이다 --Martin Buber

raymundo의 이미지

wkpark wrote:

모니위키에서 writeboard식 diff를 구현했습니다. 제법 쓸만해진 것 같고 차기버전 모니위키에서 지원될것입니다~

생각해보니 이전의 모니위키도 한 줄 내에서 삭제된 내용과 추가된 내용 (단어 단위라기보다 아니고 글자 단위이려나요?)을 표시해 주지 않았나요? writeboard식 diff의 특징이 무엇인지요? 모니위키를 제대로 써보지 않아서 그런지, 스크린샷을 봐서는 뭐가 달라진 건지 잘 모르겠습니다. 글꼴이나 배경색 등이야 설정하기 나름일테고...

그나저나 UseModWiki에 넣어보려고 펄 모듈과 wdiff를 각각 찾아봤습니다.

perl 모듈 중에 Text::WordDiff 가 있는데 한글이 처리가 안 되네요.

wdiff 를 호출하고 그 결과를 사용하도록 하는 건 쉽게 되는군요. 그냥 diff를 썼을 때처럼 "변경이 일어난 라인에서 위 아래 3줄 정도만 출력"하는 옵션이 없어서, 출력 결과를 다시 읽어서 해당 부분만 뽑아내게 하는 걸로 끝입니다.

물론 단점은 띄어쓰기된 단어별로 처리를 하기 때문에 "했삽니다"->"했습니다"의 경우 한 글자 바뀐 것만 표기를 한다거나 하는 게 안 되는게 아쉽다면 아쉽군요. (짧은 단어라면 상관이 없는데 긴 URL등에 한 글자만 바뀐 경우도 이전 URL과 새 URL 전부가 각각 표시되니까요.

wdiff 를 추가로 설치하게 하는 단점이 있긴 한데, 펄 모듈을 추가로 설치해야 할 수도 있으니 딱히 단점도 아닐 듯 하고.

고로 일단 wdiff 를 써서 단어 단위 diff 정도로 만들어 두고, 나중에 다시 모니위키 등을 보면서 개선해 볼까 합니다. (뭐 사실 줄 별 diff 도 상관은 없는데, 다른 위키에 있는 기능 보면 꼭 달고 싶어져서 ^^;;;;)

좋은 하루 되세요!

wkpark의 이미지

raymundo wrote:
wkpark wrote:

모니위키에서 writeboard식 diff를 구현했습니다. 제법 쓸만해진 것 같고 차기버전 모니위키에서 지원될것입니다~

생각해보니 이전의 모니위키도 한 줄 내에서 삭제된 내용과 추가된 내용 (단어 단위라기보다 아니고 글자 단위이려나요?)을 표시해 주지 않았나요? writeboard식 diff의 특징이 무엇인지요? 모니위키를 제대로 써보지 않아서 그런지, 스크린샷을 봐서는 뭐가 달라진 건지 잘 모르겠습니다. 글꼴이나 배경색 등이야 설정하기 나름일테고...


1.0.x 이후로 주욱 지원하던 것은 raw text에 대한 word diff였고
(위키문법이 생으로 그대로 보여집니다.)
이번에 지원하게 되는 것은, raw text가 아닌 자연스러운 위키문법으로 그대로 랜더링 해준다는 것이 다릅니다. (heading 및 리스트 등등을 적당히(?) 랜더링해서 보여줍니다.) writeboard라는 것이 이걸 지원했지만, 그 자체가 상당히 간단한 문법에 속하고, 모니위키의 모인모인 문법은 이보다 훨씬 복잡하며, 이런 식으로 위키문법 랜더링 결과에 대한 word level diff를 지원하는 위키엔진은 없는것 같더군요 :)

raymundo wrote:

그나저나 UseModWiki에 넣어보려고 펄 모듈과 wdiff를 각각 찾아봤습니다.

perl 모듈 중에 Text::WordDiff 가 있는데 한글이 처리가 안 되네요.


perl 자체가 UTF-8을 지원하므로 조금만 고치면 문제 없을것 같군요.
반면 php는 perl보다 훨씬 못한 지원을 하고있죠.
raymundo wrote:

wdiff 를 호출하고 그 결과를 사용하도록 하는 건 쉽게 되는군요. 그냥 diff를 썼을 때처럼 "변경이 일어난 라인에서 위 아래 3줄 정도만 출력"하는 옵션이 없어서, 출력 결과를 다시 읽어서 해당 부분만 뽑아내게 하는 걸로 끝입니다.

물론 단점은 띄어쓰기된 단어별로 처리를 하기 때문에 "했삽니다"->"했습니다"의 경우 한 글자 바뀐 것만 표기를 한다거나 하는 게 안 되는게 아쉽다면 아쉽군요. (짧은 단어라면 상관이 없는데 긴 URL등에 한 글자만 바뀐 경우도 이전 URL과 새 URL 전부가 각각 표시되니까요.

wdiff 를 추가로 설치하게 하는 단점이 있긴 한데, 펄 모듈을 추가로 설치해야 할 수도 있으니 딱히 단점도 아닐 듯 하고.

고로 일단 wdiff 를 써서 단어 단위 diff 정도로 만들어 두고, 나중에 다시 모니위키 등을 보면서 개선해 볼까 합니다. (뭐 사실 줄 별 diff 도 상관은 없는데, 다른 위키에 있는 기능 보면 꼭 달고 싶어져서 ^^;;;;)

온갖 참된 삶은 만남이다 --Martin Buber

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.