구글 웨이브 프로토콜의 FAQ에 따르면 [HTML]은 "바람직한 속성이 없으며"HTML은 OT (Operational Transforms)를 불가능하지는 않더라도 어렵게 만듭니다 "[1]라고합니다. 이게 왜 그렇게? HTML이 단순히 일반 텍스트로 처리 된 다음 OT가 적용되는 경우 어떤 문제가 발생합니까?단순히 조작 텍스트가 일반 텍스트로 취급되는 경우 HTML과 같은 구조화 된 문서에서 작동 변환이 작동합니까?
답변
나는 완전한 대답이 없어하지만 오픈 소스 운영 변환 라이브러리 서식있는 텍스트로 작업 기존의 제조에서 수행 더 많은 작업을보고에 관심이 있어요, 그래서 기여할 것이다 무엇 알아.
HTML과 Wave 스키마 사이의 중요한 차이점은 텍스트 서식이 마크 업되는 방식 인 것 같습니다. HTML 용 중첩 태그 대 문서 (Wavelet XML 용 범위 포함) . Out of band annotation은 중첩되지 않은 (non-nested) 포맷을 허용하기 때문에 텍스트 서식을 마크 업하는 좀 더 자연스러운 방법 일 것입니다. 여기,
(b) This is bold (i) while this range is both bold and italic (/b) and this last bit is just italic (/i)
관련 ShareJS 프로젝트의 relevant issue이다 : 그것은 중첩 된 표현을 사용하여 유효한 XML되지 않을 것 (의사 마크 업) 이런 식으로 뭔가를 할 수 있습니다. 아마도 Wave XML 스키마의 일부를 채택하여 서식있는 텍스트 지원을 구현할 수 있습니다.
여기서는 OT의 기본 사항을 이해하고 있다고 가정합니다. HTML에서 OT를 일반 텍스트로 사용하는 데있어서 주요한 문제는 html 태그를 병합하는 것입니다.
Hello world
앨리스는 그 세계가 굵은 글씨로해야 결정 : 간단한 예를 들어, 다음과 같이 우리가 문서를 가지고 말을 개략적으로
Hello <b>world</b>
이것은 구약에서 더블 삽입 작업으로 표현 될 수있다, :
Edit A: Keep 6 : Insert "<b>" : Keep 5 : Insert "</b>"
밥 그가 앨리스의 편집을보기 전에 '세계가'기울임해야한다고 결정한다면, 그는 작업을 추가 할 수
Edit B: Keep 6 : Insert "<i>" : Keep 5 : Insert "</i>"
서버가 Alice의 다음에 Bob의 편집을받은 경우 A에 대해 B를 B '로 변환해야합니다.
Keep 문은 변환을 통해 변경되지 않지만 Insert "를 통해 변형 된 Insert"는 Insert 3 : Insert "또는 Insert" "중 하나가 될 수 있습니다. Keep 3. 일반적으로 서버는 나중에 편집을 수행하도록 구성됩니다 첫 번째 편집.
Edit B': Keep 6 : Keep 3 : Insert "<i>" : Keep 5 : Keep 3 : Insert "</i>"
여기서 문제가 분명해진다. 원래 문자열에 다음 B '를 적용하는 것은 잘못된 HTML 제공 : 이론적으로이 전후 삽입을 변화시킴으로써 해결할 수
Hello <b><i>world</b></i>
을, 그러나 이것은 잠재적에 대한 전체 문서 검색을 포함하는, 더 복잡한 예제 털이 얻을 것 모든 변형.
다른 답변에서 언급했듯이이 혼란은 대역 외 주석 + 일반 텍스트를 사용하여 피할 수 있습니다.
http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.100.74
이의 SGML (상위를 지원 approaches in OT을 있습니다 : 난 단지 학술 논문 지금까지 본 적이 또 다른 방법은 노드 추가, 삭제, 예를 들면위한 OT 작업과 나무로 XML 구조를 치료하는 것입니다 XML)이지만 구현은 없습니다. 그러므로 불가능하지 않습니다! OT는 XML을 활성화하는 최선의 방법이 아닙니다. 이것은 OT가 선형 데이터 구조를 위해 설계 되었기 때문입니다. 그러나 HTML/XML은 훨씬 더 복잡합니다. 특성을 가지고 있으며 트리처럼 만들어졌습니다. 그것이 나무라는 사실은 풀 수 있지만, 정렬 된 연관 배열로 구현 된 속성은 구약에서 지원되지 않습니다. OT가 연관 배열을 지원하지 않기 때문입니다 (현재). 위의 방법은 실제로 속성을 문자열로 처리하도록 권장합니다. 예 : "id = 'myid'value = 'mystuff'" 한 사용자가 모든 속성을 삭제하고 다른 사용자가 "mystuff"바로 뒤에 문자를 삽입하면 'attributes-string'의 전체 구문을 쉽게 손상시킬 수 있습니다. .
CEFX는 XML을 지원하는 것을 목표로하는 프로젝트입니다 - 내 지식 죽은 그러나 사용하여 올바른 구문되지 않습니다 <div ">
과 같은 몇 가지 div 태그에 해결할 수
것은 어쩌면이 관심사. OT 방식을 사용하면 문자열 전용 XML 요소를 편집 할 수 없습니다.
Google 드라이브 SDK는 그래프와 같은 데이터 구조를 지원하지만 독점적이며 nobod y는 어떻게 작동하는지 압니다.
임의의 데이터 구조를 지원하는 프레임 워크를 개발 중입니다. 현재 Text, Json, XML 및 HTML이 지원됩니다. 그것은 다른 접근 방식을 가지고 있습니다 : 체크 아웃 : Yatta!
BTW : 무슨 웨이브 프로토콜, 그리고 에릭 Drechsel 설명한 OT에서 주석으로 알려져 있습니다. 일반적으로 서식있는 텍스트를 지원하기 위해 활용됩니다.
+1 [ShareJS 토론] (https://github.com/josephg/ShareJS/issues/1)! – mb21