mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/VisualEditor
synced 2024-11-24 22:35:41 +00:00
HACK: Don't merge adjacent annotations from Parsoid
Adjacent annotations should not be merged if they both originate from Parsoid. This is a hack because this logic should be in Parsoid, not VE. Bug: 49873 Change-Id: If1e23e3039178300d72b1c0c585931417bb603b5
This commit is contained in:
parent
4c85442047
commit
f2b4998faf
|
@ -535,6 +535,77 @@ ve.dm.mwExample.references = [
|
|||
];
|
||||
|
||||
ve.dm.mwExample.domToDataCases = {
|
||||
'adjacent annotations': {
|
||||
'html':
|
||||
'<body>' +
|
||||
'<b>a</b><b data-parsoid="1">b</b><b>c</b><b data-parsoid="2">d</b> ' +
|
||||
'<b>a</b><b>b</b> ' +
|
||||
'<b data-parsoid="3">ab</b><b data-parsoid="4">c</b>' +
|
||||
'</body>',
|
||||
'data': [
|
||||
{ 'type': 'paragraph', 'internal': { 'generated': 'wrapper' } },
|
||||
[ 'a', [ ve.dm.example.bold ] ],
|
||||
[
|
||||
'b',
|
||||
[ {
|
||||
'type': 'textStyle/bold',
|
||||
'htmlAttributes': [ { 'values': {
|
||||
'data-parsoid': '1'
|
||||
} } ]
|
||||
} ]
|
||||
],
|
||||
[ 'c', [ ve.dm.example.bold ] ],
|
||||
[
|
||||
'd',
|
||||
[ {
|
||||
'type': 'textStyle/bold',
|
||||
'htmlAttributes': [ { 'values': {
|
||||
'data-parsoid': '2'
|
||||
} } ]
|
||||
} ]
|
||||
],
|
||||
' ',
|
||||
[ 'a', [ ve.dm.example.bold ] ],
|
||||
[ 'b', [ ve.dm.example.bold ] ],
|
||||
' ',
|
||||
[
|
||||
'a',
|
||||
[ {
|
||||
'type': 'textStyle/bold',
|
||||
'htmlAttributes': [ { 'values': {
|
||||
'data-parsoid': '3'
|
||||
} } ]
|
||||
} ]
|
||||
],
|
||||
[
|
||||
'b',
|
||||
[ {
|
||||
'type': 'textStyle/bold',
|
||||
'htmlAttributes': [ { 'values': {
|
||||
'data-parsoid': '3'
|
||||
} } ]
|
||||
} ]
|
||||
],
|
||||
[
|
||||
'c',
|
||||
[ {
|
||||
'type': 'textStyle/bold',
|
||||
'htmlAttributes': [ { 'values': {
|
||||
'data-parsoid': '4'
|
||||
} } ]
|
||||
} ]
|
||||
],
|
||||
{ 'type': '/paragraph' },
|
||||
{ 'type': 'internalList' },
|
||||
{ 'type': '/internalList' }
|
||||
],
|
||||
'normalizedHtml':
|
||||
'<body>' +
|
||||
'<b>abcd</b> ' +
|
||||
'<b>ab</b> ' +
|
||||
'<b data-parsoid="3">ab</b><b data-parsoid="4">c</b>' +
|
||||
'</body>'
|
||||
},
|
||||
'mw:Image': {
|
||||
'html': '<body><p>' + ve.dm.mwExample.MWInlineImageHtml + '</p></body>',
|
||||
'data': [
|
||||
|
@ -1433,7 +1504,17 @@ ve.dm.mwExample.domToDataCases = {
|
|||
]
|
||||
},
|
||||
'attribute preservation does not crash due to text node split': {
|
||||
'html': '<body><figure typeof="mw:Image/Thumb" data-parsoid="{}"><a href="Foo" data-parsoid="{}"><img src="Bar" width="1" height="2" resource="FooBar" data-parsoid="{}"></a><figcaption data-parsoid="{}"> foo <a rel="mw:WikiLink" href="./Bar" data-parsoid="{}">bar</a> baz</figcaption></figure></body>',
|
||||
'html':
|
||||
'<body>' +
|
||||
'<figure typeof="mw:Image/Thumb" data-parsoid="{}">' +
|
||||
'<a href="Foo" data-parsoid="{}">' +
|
||||
'<img src="Bar" width="1" height="2" resource="FooBar" data-parsoid="{}">' +
|
||||
'</a>' +
|
||||
'<figcaption data-parsoid="{}">' +
|
||||
' foo <a rel="mw:WikiLink" href="./Bar" data-parsoid="{}">bar</a> baz' +
|
||||
'</figcaption>' +
|
||||
'</figure>' +
|
||||
'</body>',
|
||||
'data': [
|
||||
{
|
||||
'type': 'mwBlockImage',
|
||||
|
|
|
@ -111,4 +111,37 @@ ve.dm.Annotation.prototype.getComparableObjectForSerialization = function () {
|
|||
object.htmlAttributes = htmlAttributes;
|
||||
}
|
||||
return object;
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* HACK: Check if the annotation was generated by the converter
|
||||
*
|
||||
* Used by compareToForSerialization to avoid merging generated annotations.
|
||||
*
|
||||
* @returns {boolean} The annotation was generated
|
||||
*/
|
||||
ve.dm.Annotation.prototype.isGenerated = function () {
|
||||
var attributes = this.getHtmlAttributes();
|
||||
return attributes[0] && attributes[0].values && attributes[0].values['data-parsoid'];
|
||||
};
|
||||
|
||||
/**
|
||||
* HACK: Compare to another annotation for serialization
|
||||
*
|
||||
* Compares two annotations using getComparableObjectForSerialization, unless
|
||||
* they are both generated annotations, in which case they must be identical.
|
||||
*
|
||||
* @param {ve.dm.Annotation} annotation Annotation to compare to
|
||||
* @returns {boolean} The other annotation is similar to this one
|
||||
*/
|
||||
ve.dm.Annotation.prototype.compareToForSerialization = function ( annotation ) {
|
||||
// If both annotations were generated
|
||||
if ( this.isGenerated() && annotation.isGenerated() ) {
|
||||
return ve.compare( this, annotation );
|
||||
}
|
||||
|
||||
return ve.compare(
|
||||
this.getComparableObjectForSerialization(),
|
||||
annotation.getComparableObjectForSerialization()
|
||||
);
|
||||
};
|
||||
|
|
|
@ -268,10 +268,7 @@ ve.dm.AnnotationSet.prototype.containsComparable = function ( annotation ) {
|
|||
*/
|
||||
ve.dm.AnnotationSet.prototype.containsComparableForSerialization = function ( annotation ) {
|
||||
return this.filter( function ( a ) {
|
||||
return ve.compare(
|
||||
annotation.getComparableObjectForSerialization(),
|
||||
a.getComparableObjectForSerialization()
|
||||
);
|
||||
return annotation.compareToForSerialization( a );
|
||||
}, true );
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue