New annotation API: update tests

Change-Id: I301a1d89c33dd68197d629d187a9a5be8cbf3852
This commit is contained in:
Catrope 2012-10-05 17:34:12 -07:00
parent 8d56cadb82
commit 405581f6b8
5 changed files with 331 additions and 267 deletions

View file

@ -206,7 +206,7 @@ QUnit.test( 'getAnnotationsFromOffset', 1, function ( assert ) {
for ( j = 0; j < doc.getData().length; j++ ) {
annotations = doc.getAnnotationsFromOffset( j );
assert.deepEqual( annotations,
new ve.AnnotationSet( cases[i].expected[j] ),
ve.dm.example.createAnnotationSet( cases[i].expected[j] ),
cases[i].msg[j]
);
}
@ -416,7 +416,7 @@ QUnit.test( 'getAnnotationsFromRange', 1, function ( assert ) {
doc = new ve.dm.Document( cases[i].data );
assert.deepEqual(
doc.getAnnotationsFromRange( new ve.Range( 0, cases[i].data.length ), cases[i].all ),
new ve.AnnotationSet( cases[i].expected ),
ve.dm.example.createAnnotationSet( cases[i].expected ),
cases[i].msg
);
}
@ -461,7 +461,8 @@ QUnit.test( 'offsetContainsAnnotation', 1, function ( assert ) {
ve.dm.example.preprocessAnnotations( cases[i].data );
doc = new ve.dm.Document( cases[i].data );
assert.deepEqual(
doc.offsetContainsAnnotation( 0, cases[i].lookFor ),
doc.offsetContainsAnnotation( 0,
ve.dm.example.createAnnotation( cases[i].lookFor ) ),
cases[i].expected,
cases[i].msg
);
@ -507,13 +508,13 @@ QUnit.test( 'getAnnotatedRangeFromOffset', 1, function ( assert ) {
// 2
'x',
// 3
['l', [ { 'type': 'link/internal' } ]],
['l', [ { 'type': 'link' } ]],
// 4
['i', [ { 'type': 'link/internal' } ]],
['i', [ { 'type': 'link' } ]],
// 5
['n', [ { 'type': 'link/internal' } ]],
['n', [ { 'type': 'link' } ]],
// 6
['k', [ { 'type': 'link/internal' } ]],
['k', [ { 'type': 'link' } ]],
// 7
'x',
// 8
@ -521,7 +522,7 @@ QUnit.test( 'getAnnotatedRangeFromOffset', 1, function ( assert ) {
// 9
'x'
],
'annotation': { 'type': 'link/internal' },
'annotation': { 'type': 'link' },
'offset': 3,
'expected': new ve.Range( 3, 7 )
},
@ -561,7 +562,8 @@ QUnit.test( 'getAnnotatedRangeFromOffset', 1, function ( assert ) {
ve.dm.example.preprocessAnnotations( cases[i].data );
doc = new ve.dm.Document( cases[i].data );
assert.deepEqual(
doc.getAnnotatedRangeFromOffset(cases[i].offset, cases[i].annotation),
doc.getAnnotatedRangeFromOffset( cases[i].offset,
ve.dm.example.createAnnotation( cases[i].annotation ) ),
cases[i].expected,
cases[i].msg
);
@ -1322,15 +1324,15 @@ QUnit.test( 'getBalancedData', function ( assert ) {
'msg': 'range with one character',
'range': new ve.Range( 2, 3 ),
'expected': [
['b', [ { 'type': 'textStyle/bold' } ]]
['b', [ ve.dm.example.bold ]]
]
},
{
'msg': 'range with two characters',
'range': new ve.Range( 2, 4 ),
'expected': [
['b', [ { 'type': 'textStyle/bold' } ]],
['c', [ { 'type': 'textStyle/italic' } ]]
['b', [ ve.dm.example.bold ]],
['c', [ ve.dm.example.italic ]]
]
},
{
@ -1338,8 +1340,8 @@ QUnit.test( 'getBalancedData', function ( assert ) {
'range': new ve.Range( 2, 5 ),
'expected': [
{ 'type': 'heading', 'attributes': { 'level': 1 } },
['b', [ { 'type': 'textStyle/bold' } ]],
['c', [ { 'type': 'textStyle/italic' } ]],
['b', [ ve.dm.example.bold ]],
['c', [ ve.dm.example.italic ]],
{ 'type': '/heading' }
]
},
@ -1348,7 +1350,7 @@ QUnit.test( 'getBalancedData', function ( assert ) {
'range': new ve.Range( 3, 6 ),
'expected': [
{ 'type': 'heading', 'attributes': { 'level': 1 } },
['c', [ { 'type': 'textStyle/italic' } ]],
['c', [ ve.dm.example.italic ]],
{ 'type': '/heading' },
{ 'type': 'table' },
{ 'type': '/table' }

View file

@ -72,39 +72,31 @@ QUnit.test( 'annotate', 1, function ( assert ) {
[
'b',
[
{
'type': 'textStyle/bold'
}
ve.dm.example.bold
]
],
[
'o',
[
{
'type': 'textStyle/bold'
}
ve.dm.example.bold
]
],
[
'l',
[
{
'type': 'textStyle/bold'
}
ve.dm.example.bold
]
],
[
'd',
[
{
'type': 'textStyle/bold'
}
ve.dm.example.bold
]
]
],
'annotate': {
'method': 'set',
'annotation': { 'type': 'textStyle/bold' }
'annotation': ve.dm.example.bold
}
}
];
@ -115,7 +107,8 @@ QUnit.test( 'annotate', 1, function ( assert ) {
ve.dm.example.preprocessAnnotations( cases[i].expected );
surface = new ve.dm.SurfaceStub( cases[i].data );
surface.change( null, new ve.Range( 0, surface.getDocument().getData().length ) );
surface.annotate( cases[i].annotate.method, cases[i].annotate.annotation );
surface.annotate( cases[i].annotate.method,
ve.dm.example.createAnnotation( cases[i].annotate.annotation ) );
assert.deepEqual( surface.getDocument().getData(), cases[i].expected, cases[i].msg );
}
} );

View file

@ -232,7 +232,7 @@ QUnit.test( 'newFromRemoval', function ( assert ) {
'type': 'replace',
'remove': [
'a',
['b', [ { 'type': 'textStyle/bold' } ]]
['b', [ ve.dm.example.bold ]]
],
'insert': []
},
@ -259,8 +259,8 @@ QUnit.test( 'newFromRemoval', function ( assert ) {
'remove': [
{ 'type': 'heading', 'attributes': { 'level': 1 } },
'a',
['b', [ { 'type': 'textStyle/bold' } ]],
['c', [ { 'type': 'textStyle/italic' } ]],
['b', [ ve.dm.example.bold ]],
['c', [ ve.dm.example.italic ]],
{ 'type': '/heading' }
],
'insert': []
@ -293,8 +293,8 @@ QUnit.test( 'newFromRemoval', function ( assert ) {
'remove': [
{ 'type': 'heading', 'attributes': { 'level': 1 } },
'a',
['b', [ { 'type': 'textStyle/bold' } ]],
['c', [ { 'type': 'textStyle/italic' } ]],
['b', [ ve.dm.example.bold ]],
['c', [ ve.dm.example.italic ]],
{ 'type': '/heading' }
],
'insert': []
@ -504,98 +504,99 @@ QUnit.test( 'newFromAttributeChange', function ( assert ) {
} );
QUnit.test( 'newFromAnnotation', function ( assert ) {
var doc = new ve.dm.Document( ve.dm.example.data ),
var bold = ve.dm.example.createAnnotation( ve.dm.example.bold ),
doc = new ve.dm.Document( ve.dm.example.data ),
cases = {
'over plain text': {
'args': [doc, new ve.Range( 1, 2 ), 'set', { 'type': 'textStyle/bold' }],
'args': [doc, new ve.Range( 1, 2 ), 'set', bold],
'ops': [
{ 'type': 'retain', 'length': 1 },
{
'type': 'annotate',
'method': 'set',
'bias': 'start',
'annotation': { 'type': 'textStyle/bold' }
'annotation': bold
},
{ 'type': 'retain', 'length': 1 },
{
'type': 'annotate',
'method': 'set',
'bias': 'stop',
'annotation': { 'type': 'textStyle/bold' }
'annotation': bold
},
{ 'type': 'retain', 'length': 59 }
]
},
'over annotated text': {
'args': [doc, new ve.Range( 1, 4 ), 'set', { 'type': 'textStyle/bold' }],
'args': [doc, new ve.Range( 1, 4 ), 'set', bold],
'ops': [
{ 'type': 'retain', 'length': 1 },
{
'type': 'annotate',
'method': 'set',
'bias': 'start',
'annotation': { 'type': 'textStyle/bold' }
'annotation': bold
},
{ 'type': 'retain', 'length': 1 },
{
'type': 'annotate',
'method': 'set',
'bias': 'stop',
'annotation': { 'type': 'textStyle/bold' }
'annotation': bold
},
{ 'type': 'retain', 'length': 1 },
{
'type': 'annotate',
'method': 'set',
'bias': 'start',
'annotation': { 'type': 'textStyle/bold' }
'annotation': bold
},
{ 'type': 'retain', 'length': 1 },
{
'type': 'annotate',
'method': 'set',
'bias': 'stop',
'annotation': { 'type': 'textStyle/bold' }
'annotation': bold
},
{ 'type': 'retain', 'length': 57 }
]
},
'over elements': {
'args': [doc, new ve.Range( 4, 9 ), 'set', { 'type': 'textStyle/bold' }],
'args': [doc, new ve.Range( 4, 9 ), 'set', bold],
'ops': [
{ 'type': 'retain', 'length': 61 }
]
},
'over elements and content': {
'args': [doc, new ve.Range( 3, 11 ), 'set', { 'type': 'textStyle/bold' }],
'args': [doc, new ve.Range( 3, 11 ), 'set', bold],
'ops': [
{ 'type': 'retain', 'length': 3 },
{
'type': 'annotate',
'method': 'set',
'bias': 'start',
'annotation': { 'type': 'textStyle/bold' }
'annotation': bold
},
{ 'type': 'retain', 'length': 1 },
{
'type': 'annotate',
'method': 'set',
'bias': 'stop',
'annotation': { 'type': 'textStyle/bold' }
'annotation': bold
},
{ 'type': 'retain', 'length': 6 },
{
'type': 'annotate',
'method': 'set',
'bias': 'start',
'annotation': { 'type': 'textStyle/bold' }
'annotation': bold
},
{ 'type': 'retain', 'length': 1 },
{
'type': 'annotate',
'method': 'set',
'bias': 'stop',
'annotation': { 'type': 'textStyle/bold' }
'annotation': bold
},
{ 'type': 'retain', 'length': 50 }
]

View file

@ -11,6 +11,9 @@ QUnit.module( 've.dm.TransactionProcessor' );
QUnit.test( 'commit/rollback', function ( assert ) {
var i, key, originalData, originalDoc, msg, testDocument, tx, expectedData, expectedDocument,
bold = ve.dm.example.createAnnotation( ve.dm.example.bold ),
italic = ve.dm.example.createAnnotation( ve.dm.example.italic ),
underline = ve.dm.example.createAnnotation( ve.dm.example.underline ),
cases = {
'no operations': {
'calls': [],
@ -23,79 +26,76 @@ QUnit.test( 'commit/rollback', function ( assert ) {
'annotating content': {
'calls': [
['pushRetain', 1],
['pushStartAnnotating', 'set', { 'type': 'textStyle/bold' }],
['pushStartAnnotating', 'set', bold],
['pushRetain', 1],
['pushStopAnnotating', 'set', { 'type': 'textStyle/bold' }],
['pushStopAnnotating', 'set', bold],
['pushRetain', 1],
['pushStartAnnotating', 'clear', { 'type': 'textStyle/italic' }],
['pushStartAnnotating', 'set', { 'type': 'textStyle/bold' }],
['pushStartAnnotating', 'set', { 'type': 'textStyle/underline' }],
['pushStartAnnotating', 'clear', italic],
['pushStartAnnotating', 'set', bold],
['pushStartAnnotating', 'set', underline],
['pushRetain', 1],
['pushStopAnnotating', 'clear', { 'type': 'textStyle/italic' }],
['pushStopAnnotating', 'set', { 'type': 'textStyle/bold' }],
['pushStopAnnotating', 'set', { 'type': 'textStyle/underline' }]
['pushStopAnnotating', 'clear', italic],
['pushStopAnnotating', 'set', bold],
['pushStopAnnotating', 'set', underline]
],
'expected': function ( data ) {
var b = { 'type': 'textStyle/bold' },
u = { 'type': 'textStyle/underline' };
data[1] = ['a', new ve.AnnotationSet( [ b ] )];
data[2] = ['b', new ve.AnnotationSet( [ b ] )];
data[3] = ['c', new ve.AnnotationSet( [ b, u ] )];
data[1] = ['a', new ve.AnnotationSet( [ bold ] )];
data[2] = ['b', new ve.AnnotationSet( [ bold ] )];
data[3] = ['c', new ve.AnnotationSet( [ bold, underline ] )];
}
},
'annotating content and leaf elements': {
'calls': [
['pushRetain', 38],
['pushStartAnnotating', 'set', { 'type': 'textStyle/bold' }],
['pushStartAnnotating', 'set', bold],
['pushRetain', 2],
['pushStopAnnotating', 'set', { 'type': 'textStyle/bold' }]
['pushStopAnnotating', 'set', bold]
],
'expected': function ( data ) {
var b = [ { 'type': 'textStyle/bold' } ];
data[38] = ['h', new ve.AnnotationSet( b )];
data[39].annotations = new ve.AnnotationSet( b );
data[38] = ['h', new ve.AnnotationSet( [ bold ] )];
data[39].annotations = new ve.AnnotationSet( [ bold ] );
}
},
'using an annotation method other than set or clear throws an exception': {
'calls': [
['pushStartAnnotating', 'invalid-method', { 'type': 'textStyle/bold' }],
['pushStartAnnotating', 'invalid-method', bold],
['pushRetain', 1],
['pushStopAnnotating', 'invalid-method', { 'type': 'textStyle/bold' }]
['pushStopAnnotating', 'invalid-method', bold]
],
'exception': Error
},
'annotating branch opening element throws an exception': {
'calls': [
['pushStartAnnotating', 'set', { 'type': 'textStyle/bold' }],
['pushStartAnnotating', 'set', bold],
['pushRetain', 1],
['pushStopAnnotating', 'set', { 'type': 'textStyle/bold' }]
['pushStopAnnotating', 'set', bold]
],
'exception': Error
},
'annotating branch closing element throws an exception': {
'calls': [
['pushRetain', 4],
['pushStartAnnotating', 'set', { 'type': 'textStyle/bold' }],
['pushStartAnnotating', 'set', bold],
['pushRetain', 1],
['pushStopAnnotating', 'set', { 'type': 'textStyle/bold' }]
['pushStopAnnotating', 'set', bold]
],
'exception': Error
},
'setting duplicate annotations throws an exception': {
'calls': [
['pushRetain', 2],
['pushStartAnnotating', 'set', { 'type': 'textStyle/bold' }],
['pushStartAnnotating', 'set', bold],
['pushRetain', 1],
['pushStopAnnotating', 'set', { 'type': 'textStyle/bold' }]
['pushStopAnnotating', 'set', bold]
],
'exception': Error
},
'removing non-existent annotations throws an exception': {
'calls': [
['pushRetain', 1],
['pushStartAnnotating', 'clear', { 'type': 'textStyle/bold' }],
['pushStartAnnotating', 'clear', bold],
['pushRetain', 1],
['pushStopAnnotating', 'clear', { 'type': 'textStyle/bold' }]
['pushStopAnnotating', 'clear', bold]
],
'exception': Error
},
@ -210,7 +210,7 @@ QUnit.test( 'commit/rollback', function ( assert ) {
['pushRetain', 3],
[
'pushReplace',
[['c', [ { 'type': 'textStyle/italic' } ]]],
[['c', [ ve.dm.example.italic ]]],
[]
],
['pushRetain', 6],

View file

@ -9,16 +9,66 @@
ve.dm.example = {};
/**
* Convert arrays of shorthand annotations in a data fragment to AnnotationSets with real
* annotation objects.
*
* Shorthand notation for annotations is:
* [ 'a', [ { 'type': 'link', 'data': { 'href': '...' }, 'htmlTagName': 'a', 'htmlAttributes': { ... } } ] ]
*
* The actual storage format has an instance of ve.dm.LinkAnnotation instead of the plain object,
* and an instance of ve.AnnotationSet instead of the array.
*
* @param {Array} data Linear model data. Will be modified.
*/
ve.dm.example.preprocessAnnotations = function ( data ) {
var i, key;
for ( i = 0; i < data.length; i++ ) {
key = data[i].annotations ? 'annotations' : 1;
if ( ve.isArray( data[i][key] ) ) {
data[i][key] = new ve.AnnotationSet( data[i][key] );
data[i][key] = ve.dm.example.createAnnotationSet( data[i][key] );
}
}
};
/**
* Create an annotation object from shorthand notation.
* @param {Object} annotation Plain object with type, data, htmlTagName and htmlAttributes properties
* @return {ve.dm.Annotation} Instance of the right ve.dm.Annotation subclass
*/
ve.dm.example.createAnnotation = function ( annotation ) {
var ann, annKey;
ann = ve.dm.annotationFactory.create( annotation.type );
for ( annKey in annotation ) {
if ( annKey !== 'type' ) {
ann[annKey] = annotation[annKey];
}
}
return ann;
};
/**
* Create an AnnotationSet from an array of shorthand annotations.
*
* This calls ve.dm.example.createAnnotation() for each element and puts the result in an
* AnnotationSet.
*
* @param {Array} annotations Array of annotations in shorthand format
* @return {ve.AnnotationSet}
*/
ve.dm.example.createAnnotationSet = function ( annotations ) {
var i;
for ( i = 0; i < annotations.length; i++ ) {
annotations[i] = ve.dm.example.createAnnotation( annotations[i] );
}
return new ve.AnnotationSet( annotations );
};
/* Some common annotations in shorthand format */
ve.dm.example.bold = { 'type': 'textStyle/bold', 'htmlTagName': 'b', 'htmlAttributes': {} };
ve.dm.example.italic = { 'type': 'textStyle/italic', 'htmlTagName': 'i', 'htmlAttributes': {} };
ve.dm.example.underline = { 'type': 'textStyle/underline', 'htmlTagName': 'u', 'htmlAttributes': {} };
/**
* Serialized HTML.
*
@ -85,9 +135,9 @@ ve.dm.example.data = [
// 1 - Plain "a"
'a',
// 2 - Bold "b"
['b', [ { 'type': 'textStyle/bold' } ]],
['b', [ ve.dm.example.bold ]],
// 3 - Italic "c"
['c', [ { 'type': 'textStyle/italic' } ]],
['c', [ ve.dm.example.italic ]],
// 4 - End of heading
{ 'type': '/heading' },
// 5 - Beginning of table
@ -400,9 +450,9 @@ ve.dm.example.domToDataCases = {
'html': '<p><b>a</b><i>b</i><u>c</u></p>',
'data': [
{ 'type': 'paragraph' },
['a', [ { 'type': 'textStyle/bold' } ]],
['b', [ { 'type': 'textStyle/italic' } ]],
['c', [ { 'type': 'textStyle/underline' } ]],
['a', [ ve.dm.example.bold ]],
['b', [ ve.dm.example.italic ]],
['c', [ ve.dm.example.underline ]],
{ 'type': '/paragraph' }
]
},
@ -458,45 +508,48 @@ ve.dm.example.domToDataCases = {
[
'b',
[ {
'type': 'link/WikiLink',
'type': 'link/MWinternal',
'data': {
'title': 'Foo bar',
'hrefPrefix': '',
'htmlAttributes': {
'data-rt': '{"sHref":"foo bar"}',
'href': 'Foo_bar',
'rel': 'mw:WikiLink'
}
'hrefPrefix': ''
},
'htmlTagName': 'a',
'htmlAttributes': {
'data-rt': '{"sHref":"foo bar"}',
'href': 'Foo_bar',
'rel': 'mw:WikiLink'
}
} ]
],
[
'a',
[ {
'type': 'link/WikiLink',
'type': 'link/MWinternal',
'data': {
'title': 'Foo bar',
'hrefPrefix': '',
'htmlAttributes': {
'data-rt': '{"sHref":"foo bar"}',
'href': 'Foo_bar',
'rel': 'mw:WikiLink'
}
'hrefPrefix': ''
},
'htmlTagName': 'a',
'htmlAttributes': {
'data-rt': '{"sHref":"foo bar"}',
'href': 'Foo_bar',
'rel': 'mw:WikiLink'
}
} ]
],
[
'r',
[ {
'type': 'link/WikiLink',
'type': 'link/MWinternal',
'data': {
'title': 'Foo bar',
'hrefPrefix': '',
'htmlAttributes': {
'data-rt': '{"sHref":"foo bar"}',
'href': 'Foo_bar',
'rel': 'mw:WikiLink'
}
'hrefPrefix': ''
},
'htmlTagName': 'a',
'htmlAttributes': {
'data-rt': '{"sHref":"foo bar"}',
'href': 'Foo_bar',
'rel': 'mw:WikiLink'
}
} ]
],
@ -513,42 +566,45 @@ ve.dm.example.domToDataCases = {
[
'F',
[ {
'type': 'link/WikiLink',
'type': 'link/MWinternal',
'data': {
'title': 'Foo/Bar',
'hrefPrefix': './../../../',
'htmlAttributes': {
'href': './../../../Foo/Bar',
'rel': 'mw:WikiLink'
}
'hrefPrefix': './../../../'
},
'htmlTagName': 'a',
'htmlAttributes': {
'href': './../../../Foo/Bar',
'rel': 'mw:WikiLink'
}
} ]
],
[
'o',
[ {
'type': 'link/WikiLink',
'type': 'link/MWinternal',
'data': {
'title': 'Foo/Bar',
'hrefPrefix': './../../../',
'htmlAttributes': {
'href': './../../../Foo/Bar',
'rel': 'mw:WikiLink'
}
'hrefPrefix': './../../../'
},
'htmlTagName': 'a',
'htmlAttributes': {
'href': './../../../Foo/Bar',
'rel': 'mw:WikiLink'
}
} ]
],
[
'o',
[ {
'type': 'link/WikiLink',
'type': 'link/MWinternal',
'data': {
'title': 'Foo/Bar',
'hrefPrefix': './../../../',
'htmlAttributes': {
'href': './../../../Foo/Bar',
'rel': 'mw:WikiLink'
}
'hrefPrefix': './../../../'
},
'htmlTagName': 'a',
'htmlAttributes': {
'href': './../../../Foo/Bar',
'rel': 'mw:WikiLink'
}
} ]
],
@ -562,39 +618,42 @@ ve.dm.example.domToDataCases = {
[
'[',
[ {
'type': 'link/ExtLink/Numbered',
'type': 'link/MWexternal',
'data': {
'href': 'http://www.mediawiki.org/',
'htmlAttributes': {
'href': 'http://www.mediawiki.org/',
'rel': 'mw:ExtLink/Numbered'
}
},
'htmlTagName': 'a',
'htmlAttributes': {
'href': 'http://www.mediawiki.org/',
'rel': 'mw:ExtLink/Numbered'
}
} ]
],
[
'1',
[ {
'type': 'link/ExtLink/Numbered',
'type': 'link/MWexternal',
'data': {
'href': 'http://www.mediawiki.org/',
'htmlAttributes': {
'href': 'http://www.mediawiki.org/',
'rel': 'mw:ExtLink/Numbered'
}
},
'htmlTagName': 'a',
'htmlAttributes': {
'href': 'http://www.mediawiki.org/',
'rel': 'mw:ExtLink/Numbered'
}
} ]
],
[
']',
[ {
'type': 'link/ExtLink/Numbered',
'type': 'link/MWexternal',
'data': {
'href': 'http://www.mediawiki.org/',
'htmlAttributes': {
'href': 'http://www.mediawiki.org/',
'rel': 'mw:ExtLink/Numbered'
}
},
'htmlTagName': 'a',
'htmlAttributes': {
'href': 'http://www.mediawiki.org/',
'rel': 'mw:ExtLink/Numbered'
}
} ]
],
@ -608,26 +667,28 @@ ve.dm.example.domToDataCases = {
[
'm',
[ {
'type': 'link/ExtLink/URL',
'type': 'link/MWexternal',
'data': {
'href': 'http://www.mediawiki.org/',
'htmlAttributes': {
'href': 'http://www.mediawiki.org/',
'rel': 'mw:ExtLink/URL'
}
},
'htmlTagName': 'a',
'htmlAttributes': {
'href': 'http://www.mediawiki.org/',
'rel': 'mw:ExtLink/URL'
}
} ]
],
[
'w',
[ {
'type': 'link/ExtLink/URL',
'type': 'link/MWexternal',
'data': {
'href': 'http://www.mediawiki.org/',
'htmlAttributes': {
'href': 'http://www.mediawiki.org/',
'rel': 'mw:ExtLink/URL'
}
},
'htmlTagName': 'a',
'htmlAttributes': {
'href': 'http://www.mediawiki.org/',
'rel': 'mw:ExtLink/URL'
}
} ]
],
@ -718,14 +779,14 @@ ve.dm.example.domToDataCases = {
'type': 'paragraph',
'internal': { 'whitespace': [ undefined, ' ', ' ' ] }
},
[ ' ', [ { 'type': 'textStyle/italic' } ] ],
[ ' ', [ { 'type': 'textStyle/italic' } ] ],
[ 'F', [ { 'type': 'textStyle/italic' } ] ],
[ 'o', [ { 'type': 'textStyle/italic' } ] ],
[ 'o', [ { 'type': 'textStyle/italic' } ] ],
[ ' ', [ { 'type': 'textStyle/italic' } ] ],
[ ' ', [ { 'type': 'textStyle/italic' } ] ],
[ ' ', [ { 'type': 'textStyle/italic' } ] ],
[ ' ', [ ve.dm.example.italic ] ],
[ ' ', [ ve.dm.example.italic ] ],
[ 'F', [ ve.dm.example.italic ] ],
[ 'o', [ ve.dm.example.italic ] ],
[ 'o', [ ve.dm.example.italic ] ],
[ ' ', [ ve.dm.example.italic ] ],
[ ' ', [ ve.dm.example.italic ] ],
[ ' ', [ ve.dm.example.italic ] ],
{ 'type': '/paragraph' }
]
},
@ -784,12 +845,12 @@ ve.dm.example.domToDataCases = {
' ',
' ',
' ',
[ ' ', [ { 'type': 'textStyle/bold' } ] ],
[ ' ', [ { 'type': 'textStyle/bold' } ] ],
[ ' ', [ { 'type': 'textStyle/bold' } ] ],
[ ' ', [ { 'type': 'textStyle/bold' } ] ],
[ 'C', [ { 'type': 'textStyle/bold' } ] ],
[ '\t', [ { 'type': 'textStyle/bold' } ] ],
[ ' ', [ ve.dm.example.bold ] ],
[ ' ', [ ve.dm.example.bold ] ],
[ ' ', [ ve.dm.example.bold ] ],
[ ' ', [ ve.dm.example.bold ] ],
[ 'C', [ ve.dm.example.bold ] ],
[ '\t', [ ve.dm.example.bold ] ],
'\t',
'\t',
'D',
@ -802,12 +863,12 @@ ve.dm.example.domToDataCases = {
'\n',
'\n',
'\n',
[ '\n', [ { 'type': 'textStyle/bold' } ] ],
[ '\n', [ { 'type': 'textStyle/bold' } ] ],
[ '\n', [ { 'type': 'textStyle/bold' } ] ],
[ '\n', [ { 'type': 'textStyle/bold' } ] ],
[ 'G', [ { 'type': 'textStyle/bold' } ] ],
[ ' ', [ { 'type': 'textStyle/bold' } ] ],
[ '\n', [ ve.dm.example.bold ] ],
[ '\n', [ ve.dm.example.bold ] ],
[ '\n', [ ve.dm.example.bold ] ],
[ '\n', [ ve.dm.example.bold ] ],
[ 'G', [ ve.dm.example.bold ] ],
[ ' ', [ ve.dm.example.bold ] ],
' ',
' ',
'H',
@ -825,24 +886,24 @@ ve.dm.example.domToDataCases = {
' ',
' ',
' ',
[ ' ', [ { 'type': 'textStyle/bold' } ] ],
[ ' ', [ { 'type': 'textStyle/bold' } ] ],
[ ' ', [ { 'type': 'textStyle/bold' } ] ],
[ ' ', [ { 'type': 'textStyle/bold' } ] ],
[ 'C', [ { 'type': 'textStyle/bold' } ] ],
[ '\t', [ { 'type': 'textStyle/bold' } ] ],
[ '\t', [ { 'type': 'textStyle/bold' }, { 'type': 'textStyle/italic' } ] ],
[ '\t', [ { 'type': 'textStyle/bold' }, { 'type': 'textStyle/italic' } ] ],
[ 'D', [ { 'type': 'textStyle/bold' }, { 'type': 'textStyle/italic' } ] ],
[ '\t', [ { 'type': 'textStyle/bold' }, { 'type': 'textStyle/italic' } ] ],
[ '\t', [ { 'type': 'textStyle/bold' }, { 'type': 'textStyle/italic' } ] ],
[ '\t', [ { 'type': 'textStyle/bold' }, { 'type': 'textStyle/italic' } ] ],
[ '\t', [ { 'type': 'textStyle/bold' } ] ],
[ '\t', [ { 'type': 'textStyle/bold' } ] ],
[ '\t', [ { 'type': 'textStyle/bold' } ] ],
[ '\t', [ { 'type': 'textStyle/bold' } ] ],
[ 'E', [ { 'type': 'textStyle/bold' } ] ],
[ '\n', [ { 'type': 'textStyle/bold' } ] ],
[ ' ', [ ve.dm.example.bold ] ],
[ ' ', [ ve.dm.example.bold ] ],
[ ' ', [ ve.dm.example.bold ] ],
[ ' ', [ ve.dm.example.bold ] ],
[ 'C', [ ve.dm.example.bold ] ],
[ '\t', [ ve.dm.example.bold ] ],
[ '\t', [ ve.dm.example.bold, ve.dm.example.italic ] ],
[ '\t', [ ve.dm.example.bold, ve.dm.example.italic ] ],
[ 'D', [ ve.dm.example.bold, ve.dm.example.italic ] ],
[ '\t', [ ve.dm.example.bold, ve.dm.example.italic ] ],
[ '\t', [ ve.dm.example.bold, ve.dm.example.italic ] ],
[ '\t', [ ve.dm.example.bold, ve.dm.example.italic ] ],
[ '\t', [ ve.dm.example.bold ] ],
[ '\t', [ ve.dm.example.bold ] ],
[ '\t', [ ve.dm.example.bold ] ],
[ '\t', [ ve.dm.example.bold ] ],
[ 'E', [ ve.dm.example.bold ] ],
[ '\n', [ ve.dm.example.bold ] ],
'\n',
'\n',
'F',
@ -860,12 +921,12 @@ ve.dm.example.domToDataCases = {
' ',
' ',
' ',
[ '\t', [ { 'type': 'textStyle/bold' }, { 'type': 'textStyle/italic' } ] ],
[ '\t', [ { 'type': 'textStyle/bold' }, { 'type': 'textStyle/italic' } ] ],
[ 'C', [ { 'type': 'textStyle/bold' }, { 'type': 'textStyle/italic' } ] ],
[ '\t', [ { 'type': 'textStyle/bold' }, { 'type': 'textStyle/italic' } ] ],
[ '\t', [ { 'type': 'textStyle/bold' }, { 'type': 'textStyle/italic' } ] ],
[ '\t', [ { 'type': 'textStyle/bold' }, { 'type': 'textStyle/italic' } ] ],
[ '\t', [ ve.dm.example.bold, ve.dm.example.italic ] ],
[ '\t', [ ve.dm.example.bold, ve.dm.example.italic ] ],
[ 'C', [ ve.dm.example.bold, ve.dm.example.italic ] ],
[ '\t', [ ve.dm.example.bold, ve.dm.example.italic ] ],
[ '\t', [ ve.dm.example.bold, ve.dm.example.italic ] ],
[ '\t', [ ve.dm.example.bold, ve.dm.example.italic ] ],
'\n',
'\n',
'D',
@ -883,14 +944,14 @@ ve.dm.example.domToDataCases = {
' ',
' ',
' ',
[ '\n', [ { 'type': 'textStyle/bold' } ] ],
[ '\t', [ { 'type': 'textStyle/bold' } ] ],
[ '\t', [ { 'type': 'textStyle/bold' }, { 'type': 'textStyle/italic' } ] ],
[ '\t', [ { 'type': 'textStyle/bold' }, { 'type': 'textStyle/italic' } ] ],
[ 'C', [ { 'type': 'textStyle/bold' }, { 'type': 'textStyle/italic' } ] ],
[ '\t', [ { 'type': 'textStyle/bold' }, { 'type': 'textStyle/italic' } ] ],
[ '\t', [ { 'type': 'textStyle/bold' }, { 'type': 'textStyle/italic' } ] ],
[ '\t', [ { 'type': 'textStyle/bold' }, { 'type': 'textStyle/italic' } ] ],
[ '\n', [ ve.dm.example.bold ] ],
[ '\t', [ ve.dm.example.bold ] ],
[ '\t', [ ve.dm.example.bold, ve.dm.example.italic ] ],
[ '\t', [ ve.dm.example.bold, ve.dm.example.italic ] ],
[ 'C', [ ve.dm.example.bold, ve.dm.example.italic ] ],
[ '\t', [ ve.dm.example.bold, ve.dm.example.italic ] ],
[ '\t', [ ve.dm.example.bold, ve.dm.example.italic ] ],
[ '\t', [ ve.dm.example.bold, ve.dm.example.italic ] ],
'\n',
'\n',
'D',
@ -908,14 +969,14 @@ ve.dm.example.domToDataCases = {
' ',
' ',
' ',
[ '\t', [ { 'type': 'textStyle/bold' }, { 'type': 'textStyle/italic' } ] ],
[ '\t', [ { 'type': 'textStyle/bold' }, { 'type': 'textStyle/italic' } ] ],
[ 'C', [ { 'type': 'textStyle/bold' }, { 'type': 'textStyle/italic' } ] ],
[ '\t', [ { 'type': 'textStyle/bold' }, { 'type': 'textStyle/italic' } ] ],
[ '\t', [ { 'type': 'textStyle/bold' }, { 'type': 'textStyle/italic' } ] ],
[ '\t', [ { 'type': 'textStyle/bold' }, { 'type': 'textStyle/italic' } ] ],
[ '\n', [ { 'type': 'textStyle/bold' } ] ],
[ '\t', [ { 'type': 'textStyle/bold' } ] ],
[ '\t', [ ve.dm.example.bold, ve.dm.example.italic ] ],
[ '\t', [ ve.dm.example.bold, ve.dm.example.italic ] ],
[ 'C', [ ve.dm.example.bold, ve.dm.example.italic ] ],
[ '\t', [ ve.dm.example.bold, ve.dm.example.italic ] ],
[ '\t', [ ve.dm.example.bold, ve.dm.example.italic ] ],
[ '\t', [ ve.dm.example.bold, ve.dm.example.italic ] ],
[ '\n', [ ve.dm.example.bold ] ],
[ '\t', [ ve.dm.example.bold ] ],
'\n',
'\n',
'D',
@ -998,55 +1059,58 @@ ve.dm.example.domToDataCases = {
[
'F',
[
{ 'type': 'textStyle/bold' },
ve.dm.example.bold,
{
'type': 'link/WikiLink',
'type': 'link/MWinternal',
'data': {
'hrefPrefix': '',
'title': 'Foo',
'htmlAttributes': {
'href': 'Foo',
'rel': 'mw:WikiLink'
}
'title': 'Foo'
},
'htmlTagName': 'a',
'htmlAttributes': {
'href': 'Foo',
'rel': 'mw:WikiLink'
}
},
{ 'type': 'textStyle/italic' }
ve.dm.example.italic
]
],
[
'o',
[
{ 'type': 'textStyle/bold' },
ve.dm.example.bold,
{
'type': 'link/WikiLink',
'type': 'link/MWinternal',
'data': {
'hrefPrefix': '',
'title': 'Foo',
'htmlAttributes': {
'href': 'Foo',
'rel': 'mw:WikiLink'
}
'title': 'Foo'
},
'htmlTagName': 'a',
'htmlAttributes': {
'href': 'Foo',
'rel': 'mw:WikiLink'
}
},
{ 'type': 'textStyle/italic' }
ve.dm.example.italic
]
],
[
'o',
[
{ 'type': 'textStyle/bold' },
ve.dm.example.bold,
{
'type': 'link/WikiLink',
'type': 'link/MWinternal',
'data': {
'hrefPrefix': '',
'title': 'Foo',
'htmlAttributes': {
'href': 'Foo',
'rel': 'mw:WikiLink'
}
'title': 'Foo'
},
'htmlTagName': 'a',
'htmlAttributes': {
'href': 'Foo',
'rel': 'mw:WikiLink'
}
},
{ 'type': 'textStyle/italic' }
ve.dm.example.italic
]
],
{ 'type': '/paragraph' }
@ -1060,14 +1124,15 @@ ve.dm.example.domToDataCases = {
'F',
[
{
'type': 'link/WikiLink',
'type': 'link/MWinternal',
'data': {
'hrefPrefix': '',
'title': 'Foo',
'htmlAttributes': {
'href': 'Foo',
'rel': 'mw:WikiLink'
}
'title': 'Foo'
},
'htmlTagName': 'a',
'htmlAttributes': {
'href': 'Foo',
'rel': 'mw:WikiLink'
}
}
]
@ -1076,84 +1141,87 @@ ve.dm.example.domToDataCases = {
'o',
[
{
'type': 'link/WikiLink',
'type': 'link/MWinternal',
'data': {
'hrefPrefix': '',
'title': 'Foo',
'htmlAttributes': {
'href': 'Foo',
'rel': 'mw:WikiLink'
}
'title': 'Foo'
},
'htmlTagName': 'a',
'htmlAttributes': {
'href': 'Foo',
'rel': 'mw:WikiLink'
}
},
{ 'type': 'textStyle/bold' }
ve.dm.example.bold
]
],
[
'o',
[
{
'type': 'link/WikiLink',
'type': 'link/MWinternal',
'data': {
'hrefPrefix': '',
'title': 'Foo',
'htmlAttributes': {
'href': 'Foo',
'rel': 'mw:WikiLink'
}
'title': 'Foo'
},
'htmlTagName': 'a',
'htmlAttributes': {
'href': 'Foo',
'rel': 'mw:WikiLink'
}
},
{ 'type': 'textStyle/bold' },
{ 'type': 'textStyle/italic' }
ve.dm.example.bold,
ve.dm.example.italic
]
],
[
'b',
[
{
'type': 'link/WikiLink',
'type': 'link/MWinternal',
'data': {
'hrefPrefix': '',
'title': 'Foo',
'htmlAttributes': {
'href': 'Foo',
'rel': 'mw:WikiLink'
}
'title': 'Foo'
},
'htmlTagName': 'a',
'htmlAttributes': {
'href': 'Foo',
'rel': 'mw:WikiLink'
}
},
{ 'type': 'textStyle/italic' }
ve.dm.example.italic
]
],
[
'a',
[
{ 'type': 'textStyle/italic' }
ve.dm.example.italic
]
],
[
'r',
[
{ 'type': 'textStyle/italic' },
{ 'type': 'textStyle/bold' }
ve.dm.example.italic,
ve.dm.example.bold
]
],
[
'b',
[
{ 'type': 'textStyle/italic' }
ve.dm.example.italic
]
],
[
'a',
[
{ 'type': 'textStyle/italic' },
{ 'type': 'textStyle/underline' }
ve.dm.example.italic,
ve.dm.example.underline
]
],
[
'z',
[
{ 'type': 'textStyle/italic' }
ve.dm.example.italic
]
],
{ 'type': '/paragraph' }