So you're imagining storing rich text like this?

{doc: 'hi there!', annotations: [{from:0, to:2, bold:true}]} or something?

Every change to the document is going to need to manually update every
single annotation which has start / end points after the edit. But it
wouldn't work - if you insert some text and I edit an annotation later
in the document, my annotation will float forwards / backwards when I
get your op because I don't know how I should change it.

This idea comes up about every 6 months on the sharejs mailing list.
Several solutions have been proposed, but none of them work correctly.
I think we just need a separate set of transform / apply / ...
functions for rich text.

-J


On Thu, Jun 13, 2013 at 1:19 AM, Michael MacFadden
<michael.macfad...@gmail.com> wrote:
> Joseph,
>
> I disagree.  The annotations themselves are just another data structure.
> You add them, remove them and modify them like anything else.  You can
> manage annotations as another structure within the blip model.  There is
> no reason why you can interface them though a JSON Style operations
> structure.
>
> ~Michael
>
> On 6/13/13 12:11 AM, "Joseph Gentle" <jose...@gmail.com> wrote:
>
>>The conversation *model* yes, but not the rich text documents
>>themselves. You can't really make text annotations work properly on
>>top of JSON operations. We should keep something like the current
>>system for actual blips.
>>
>>-J
>>
>>
>>On Wed, Jun 12, 2013 at 4:06 PM, Michael MacFadden
>><michael.macfad...@gmail.com> wrote:
>>> Actually I just went and took a look at your operations.  The JSON OT
>>>type
>>> is probably the closest to what I would suggest we use.  JSON Objects
>>>are
>>> not just for javascript.  They define arbitrary objects structures.  We
>>> don't need a specific wave XML type, we could use the JSNO operations to
>>> modify the conversation model
>>>
>>> Potentially.
>>>
>>>
>>> On 6/12/13 10:55 PM, "Joseph Gentle" <jose...@gmail.com> wrote:
>>>
>>>>Really?
>>>>
>>>>My method for ShareJS was to simply have a JSON OT type and a
>>>>plaintext OT type. I'd like to add a rich text OT type as well. Then
>>>>people can just pick which one based on what kind of data they have.
>>>>
>>>>For Wave I'd like to be able to do something similar - JSON is
>>>>obviously useful for storing application data. It'd be nice to have
>>>>some sort of hybrid for wavelets where we can put multiple different
>>>>kinds of data inside a wavelet. One option is to use a JSON OT type as
>>>>the root of all wavelets and support subdocuments at arbitrary paths
>>>>(so the object could be:
>>>>{projectName:"ruby on rails", files:[{name:'foo/bar.rb', ...}],
>>>>documentation:{_type:richtext, _data:"<Rich text data>"}}
>>>>
>>>>Or wavelets could simply each have a type (defaulting to the current
>>>>wavey XML type).
>>>>
>>>>-J
>>>>
>>>>
>>>>On Wed, Jun 12, 2013 at 2:41 PM, Michael MacFadden
>>>><michael.macfad...@gmail.com> wrote:
>>>>> You have stumbled upon one of the weaknesses of wave OT.  Best
>>>>>practices
>>>>> would say to NOT bind your OT directly to the data type, because then
>>>>>you
>>>>> don't have an extendable model. For example if you have all of your
>>>>> operations figured out and validated, and then you need to change your
>>>>> data model, you have to go back and mess with your transformation
>>>>> functions.  Not good.  Or you have to try to bend new data models in
>>>>>to
>>>>> the existing one, also not good.
>>>>>
>>>>> Best practice is to create a generic OT model and operate on that.
>>>>>There
>>>>> is debate as to what the model should be, but most agree on the
>>>>>concept.
>>>>>
>>>>> For example in wave they tried to create a map like collection that OT
>>>>> could operate on. Essentially though that had to implement the map as
>>>>>if
>>>>> its underlying model was a bunch of XMLish type tags.  This we very
>>>>> convoluted.
>>>>>
>>>>> ~Michael
>>>>>
>>>>> On 6/12/13 10:26 PM, "Joseph Gentle" <jose...@gmail.com> wrote:
>>>>>
>>>>>>Yeah exactly. The google wave OT code uses special operations that can
>>>>>>understand the XML structure. It doesn't just edit the plaintext.
>>>>>>Formatting annotations are stored in a special way - operations can
>>>>>>say something like "At position 10 add bold. At position 20 stop
>>>>>>adding bold".
>>>>>>
>>>>>>-J
>>>>>>
>>>>>>On Wed, Jun 12, 2013 at 1:56 PM, Bruno Gonzalez (aka stenyak)
>>>>>><sten...@gmail.com> wrote:
>>>>>>> I suspected something like that. I assume it also correctly handles
>>>>>>> variable-length UTF8 characters, so it's not necessarily 1-byte
>>>>>>>patches?
>>>>>>>
>>>>>>> This starts to make sense. OT can only compute conflict-free merges
>>>>>>>using
>>>>>>> the "character" primitive (because that's how Wave was originally
>>>>>>> designed). As an unfortunate consequence, you can then only
>>>>>>>OT-operate
>>>>>>>on
>>>>>>> plain text. Otherwise you could get conflict-free xml text that
>>>>>>><loo<ks
>>>>>>> li<>ke>this>, and that of course isn't legal xml.
>>>>>>> But we still want rich text in Google Wave, therefore all the
>>>>>>>formatting
>>>>>>> stuff is stored some place else, specifically in the blip
>>>>>>>annotations.
>>>>>>>The
>>>>>>> modifications to annotations are (sometimes) simply derived from the
>>>>>>> transformations that the plain text suffers after merges?
>>>>>>>
>>>>>>> I suppose there could be other OT algorithms that don't use a
>>>>>>>"character"
>>>>>>> primitive, but rather an "xml tag" primitive, a json item, a
>>>>>>>"pixel",
>>>>>>>or
>>>>>>> anything else, right?
>>>>>>>
>>>>>>> (sorry for only contributing with questions... :-)
>>>>>>>
>>>>>>>
>>>>>>> On Wed, Jun 12, 2013 at 10:27 PM, Joseph Gentle <jose...@gmail.com>
>>>>>>>wrote:
>>>>>>>
>>>>>>>> On Wed, Jun 12, 2013 at 12:13 PM, Bruno Gonzalez (aka stenyak)
>>>>>>>> <sten...@gmail.com> wrote:
>>>>>>>> > My assumption was that conflicts were simply mathematically
>>>>>>>>inevitable
>>>>>>>> in a
>>>>>>>> > DVCSs, that's why your mention about lack of conflict markers
>>>>>>>>sparked my
>>>>>>>> > interest... you mention conflicts like they can be optional? If
>>>>>>>>so,
>>>>>>>>are
>>>>>>>> > conflicts "eliminated" by choosing an arbitrary merging strategy
>>>>>>>>when
>>>>>>>> > conflicts *do* happen (e.g. "choose the last timestamped patch
>>>>>>>>and
>>>>>>>>lose
>>>>>>>> > information on the way, we don't care"), or can they be prevented
>>>>>>>>from
>>>>>>>> ever
>>>>>>>> > happening in the first place?
>>>>>>>>
>>>>>>>> They're inevitable in patch based systems because patches usually
>>>>>>>>have
>>>>>>>> a line level granularity. OT usually uses individual character
>>>>>>>> positions. In OT, if two operations both delete the same character,
>>>>>>>> the character gets deleted once. If two clients insert a character
>>>>>>>>at
>>>>>>>> the same position, one of the characters will be first in the
>>>>>>>> resultant document and one will be second. Conflict markers just
>>>>>>>> aren't necessary.
>>>>>>>>
>>>>>>>> -J
>>>>>>>>
>>>>>>>> > --
>>>>>>>> > Saludos,
>>>>>>>> >      Bruno González
>>>>>>>> >
>>>>>>>> > _______________________________________________
>>>>>>>> > Jabber: stenyak AT gmail.com
>>>>>>>> > http://www.stenyak.com
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Saludos,
>>>>>>>      Bruno González
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> Jabber: stenyak AT gmail.com
>>>>>>> http://www.stenyak.com
>>>>>
>>>>>
>>>
>>>
>
>

Reply via email to