@@ -1162,6 +1162,7 @@ See README.md or https://github.com/fraywing/textAngular/wiki for requirements a
1162
1162
}
1163
1163
} ;
1164
1164
1165
+ /* istanbul ignore next: phantom js cannot test this for some reason */
1165
1166
var processpaste = function ( savedcontent , _savedSelection ) {
1166
1167
text = element [ 0 ] . innerHTML ;
1167
1168
element [ 0 ] . innerHTML = savedcontent ;
@@ -1176,50 +1177,78 @@ See README.md or https://github.com/fraywing/textAngular/wiki for requirements a
1176
1177
else textFragment = textFragment [ 1 ] ;
1177
1178
textFragment = textFragment . replace ( / < o : p > [ \s \S ] * ?< \/ o : p > / ig, '' ) . replace ( / c l a s s = ( [ " ' ] | ) M s o N o r m a l ( [ " ' ] | ) / ig, '' ) ;
1178
1179
var dom = angular . element ( "<div>" + textFragment + "</div>" ) ;
1180
+ var targetDom = angular . element ( "<div></div>" ) ;
1179
1181
var _list = {
1180
1182
element : null ,
1181
- lastIndent : null ,
1183
+ lastIndent : [ ] ,
1182
1184
lastLi : null ,
1183
1185
isUl : false
1184
1186
} ;
1187
+ _list . lastIndent . peek = function ( ) {
1188
+ var n = this . length ;
1189
+ if ( n > 0 ) return this [ n - 1 ] ;
1190
+ } ;
1191
+ var _resetList = function ( isUl ) {
1192
+ _list . isUl = isUl ;
1193
+ _list . element = angular . element ( isUl ? "<ul>" : "<ol>" ) ;
1194
+ _list . lastIndent = [ ] ;
1195
+ _list . lastIndent . peek = function ( ) {
1196
+ var n = this . length ;
1197
+ if ( n > 0 ) return this [ n - 1 ] ;
1198
+ } ;
1199
+ _list . lastLevelMatch = null ;
1200
+ } ;
1185
1201
for ( var i = 0 ; i <= dom [ 0 ] . childNodes . length ; i ++ ) {
1186
1202
if ( ! dom [ 0 ] . childNodes [ i ] || dom [ 0 ] . childNodes [ i ] . nodeName === "#text" || dom [ 0 ] . childNodes [ i ] . tagName . toLowerCase ( ) !== "p" ) continue ;
1187
1203
var el = angular . element ( dom [ 0 ] . childNodes [ i ] ) ;
1188
1204
var _listMatch = ( el . attr ( 'class' ) || '' ) . match ( / M s o L i s t ( B u l l e t | N u m b e r | P a r a g r a p h ) ( C x S p ( F i r s t | M i d d l e | L a s t ) | ) / i) ;
1189
1205
1190
1206
if ( _listMatch ) {
1191
1207
if ( el [ 0 ] . childNodes . length < 2 || el [ 0 ] . childNodes [ 1 ] . childNodes . length < 1 ) {
1192
- el . remove ( ) ;
1193
1208
continue ;
1194
1209
}
1195
- var isUl = _listMatch [ 1 ] . toLowerCase ( ) === "bullet" || ( _listMatch [ 1 ] . toLowerCase ( ) !== "bullet " && ! ( el [ 0 ] . childNodes [ 1 ] . innerHTML . match ( / ^ [ 0 - 9 a - z ] / ig ) || el [ 0 ] . childNodes [ 1 ] . childNodes [ 0 ] . innerHTML . match ( / ^ [ 0 - 9 a - z ] / ig ) ) ) ;
1210
+ var isUl = _listMatch [ 1 ] . toLowerCase ( ) === "bullet" || ( _listMatch [ 1 ] . toLowerCase ( ) !== "number " && ! ( / ^ [ ^ 0 - 9 a - z < ] * [ 0 - 9 a - z ] + [ ^ 0 - 9 a - z < > ] < / i . test ( el [ 0 ] . childNodes [ 1 ] . innerHTML ) || / ^ [ ^ 0 - 9 a - z < ] * [ 0 - 9 a - z ] + [ ^ 0 - 9 a - z < > ] < / i . test ( el [ 0 ] . childNodes [ 1 ] . childNodes [ 0 ] . innerHTML ) ) ) ;
1196
1211
var _indentMatch = ( el . attr ( 'style' ) || '' ) . match ( / m a r g i n - l e f t : ( [ \- \. 0 - 9 ] * ) / i) ;
1197
1212
var indent = parseFloat ( ( _indentMatch ) ?_indentMatch [ 1 ] :0 ) ;
1213
+ var _levelMatch = ( el . attr ( 'style' ) || '' ) . match ( / m s o - l i s t : l ( [ 0 - 9 ] + ) l e v e l ( [ 0 - 9 ] + ) l f o [ 0 - 9 + ] ( $ | ; ) / i) ;
1214
+ // prefers the mso-list syntax
1198
1215
1199
- if ( ! _listMatch [ 3 ] || _listMatch [ 3 ] . toLowerCase ( ) === "first" || ( _list . lastIndent === null ) || ( _list . isUl !== isUl && _list . lastIndent === indent ) ) {
1200
- _list . isUl = isUl ;
1201
- _list . element = angular . element ( isUl ? "<ul>" : "<ol>" ) ;
1202
- el . after ( _list . element ) ;
1203
- } else if ( ( _list . lastIndent != null ) && _list . lastIndent < indent ) {
1216
+ if ( _levelMatch && _levelMatch [ 2 ] ) indent = parseInt ( _levelMatch [ 2 ] ) ;
1217
+
1218
+ if ( ( _levelMatch && ( ! _list . lastLevelMatch || _levelMatch [ 1 ] !== _list . lastLevelMatch [ 1 ] ) ) || ! _listMatch [ 3 ] || _listMatch [ 3 ] . toLowerCase ( ) === "first" || ( _list . lastIndent . peek ( ) === null ) || ( _list . isUl !== isUl && _list . lastIndent . peek ( ) === indent ) ) {
1219
+ _resetList ( isUl ) ;
1220
+ targetDom . append ( _list . element ) ;
1221
+ } else if ( _list . lastIndent . peek ( ) != null && _list . lastIndent . peek ( ) < indent ) {
1204
1222
_list . element = angular . element ( isUl ? "<ul>" : "<ol>" ) ;
1205
1223
_list . lastLi . append ( _list . element ) ;
1206
- }
1207
- /* istanbul ignore next: phantom js cannot test this for some reason */
1208
- else if ( ( _list . lastIndent != null ) && _list . lastIndent > indent ) {
1209
- _list . element = _list . element . parent ( ) ;
1224
+ } else if ( _list . lastIndent . peek ( ) != null && _list . lastIndent . peek ( ) > indent ) {
1225
+ while ( _list . lastIndent . peek ( ) != null && _list . lastIndent . peek ( ) > indent ) {
1226
+ if ( _list . element . parent ( ) [ 0 ] . tagName . toLowerCase ( ) === 'li' ) {
1227
+ _list . element = _list . element . parent ( ) ;
1228
+ continue ;
1229
+ } else if ( / [ u o ] l / i. test ( _list . element . parent ( ) [ 0 ] . tagName . toLowerCase ( ) ) ) {
1230
+ _list . element = _list . element . parent ( ) ;
1231
+ } else { // else it's it should be a sibling
1232
+ break ;
1233
+ }
1234
+ _list . lastIndent . pop ( ) ;
1235
+ }
1210
1236
_list . isUl = _list . element [ 0 ] . tagName . toLowerCase ( ) === "ul" ;
1211
1237
if ( isUl !== _list . isUl ) {
1212
- _list . isUl = isUl ;
1213
- _list . element = angular . element ( isUl ? "<ul>" : "<ol>" ) ;
1214
- el . after ( _list . element ) ;
1238
+ _resetList ( isUl ) ;
1239
+ targetDom . append ( _list . element ) ;
1215
1240
}
1216
1241
}
1217
1242
1218
- _list . lastIndent = indent ;
1243
+ _list . lastLevelMatch = _levelMatch ;
1244
+ if ( indent !== _list . lastIndent . peek ( ) ) _list . lastIndent . push ( indent ) ;
1219
1245
_list . lastLi = angular . element ( "<li>" ) ;
1220
1246
_list . element . append ( _list . lastLi ) ;
1221
1247
_list . lastLi . html ( el . html ( ) . replace ( / < ! ( - - | ) \[ i f ! s u p p o r t L i s t s \] ( - - | ) > [ \s \S ] * ?< ! ( - - | ) \[ e n d i f \] ( - - | ) > / ig, '' ) ) ;
1222
1248
el . remove ( ) ;
1249
+ } else {
1250
+ _resetList ( false ) ;
1251
+ targetDom . append ( el ) ;
1223
1252
}
1224
1253
}
1225
1254
var _unwrapElement = function ( node ) {
@@ -1228,12 +1257,12 @@ See README.md or https://github.com/fraywing/textAngular/wiki for requirements a
1228
1257
node . remove ( ) ;
1229
1258
} ;
1230
1259
1231
- angular . forEach ( dom . find ( 'span' ) , function ( node ) {
1260
+ angular . forEach ( targetDom . find ( 'span' ) , function ( node ) {
1232
1261
node . removeAttribute ( 'lang' ) ;
1233
1262
if ( node . attributes . length <= 0 ) _unwrapElement ( node ) ;
1234
1263
} ) ;
1235
- angular . forEach ( dom . find ( 'font' ) , _unwrapElement ) ;
1236
- text = dom . html ( ) ;
1264
+ angular . forEach ( targetDom . find ( 'font' ) , _unwrapElement ) ;
1265
+ text = targetDom . html ( ) ;
1237
1266
}
1238
1267
1239
1268
text = taSanitize ( text , '' , _disableSanitizer ) ;
0 commit comments