(doc, from, to)
| 1334 | |
| 1335 | // Used to 'clip' out readOnly ranges when making a change. |
| 1336 | function removeReadOnlyRanges(doc, from, to) { |
| 1337 | var markers = null |
| 1338 | doc.iter(from.line, to.line + 1, function (line) { |
| 1339 | if (line.markedSpans) { |
| 1340 | for (var i = 0; i < line.markedSpans.length; ++i) { |
| 1341 | var mark = line.markedSpans[i].marker |
| 1342 | if (mark.readOnly && (!markers || indexOf(markers, mark) == -1)) { |
| 1343 | ;(markers || (markers = [])).push(mark) |
| 1344 | } |
| 1345 | } |
| 1346 | } |
| 1347 | }) |
| 1348 | if (!markers) { |
| 1349 | return null |
| 1350 | } |
| 1351 | var parts = [{ from: from, to: to }] |
| 1352 | for (var i = 0; i < markers.length; ++i) { |
| 1353 | var mk = markers[i], |
| 1354 | m = mk.find(0) |
| 1355 | for (var j = 0; j < parts.length; ++j) { |
| 1356 | var p = parts[j] |
| 1357 | if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) { |
| 1358 | continue |
| 1359 | } |
| 1360 | var newParts = [j, 1], |
| 1361 | dfrom = cmp(p.from, m.from), |
| 1362 | dto = cmp(p.to, m.to) |
| 1363 | if (dfrom < 0 || (!mk.inclusiveLeft && !dfrom)) { |
| 1364 | newParts.push({ from: p.from, to: m.from }) |
| 1365 | } |
| 1366 | if (dto > 0 || (!mk.inclusiveRight && !dto)) { |
| 1367 | newParts.push({ from: m.to, to: p.to }) |
| 1368 | } |
| 1369 | parts.splice.apply(parts, newParts) |
| 1370 | j += newParts.length - 3 |
| 1371 | } |
| 1372 | } |
| 1373 | return parts |
| 1374 | } |
| 1375 | |
| 1376 | // Connect or disconnect spans from a line. |
| 1377 | function detachMarkedSpans(line) { |
no test coverage detected