Skip to content

Commit 3f05140

Browse files
committed
#9 - Another refinement on selection ranging & trimming
1 parent 1775c04 commit 3f05140

File tree

3 files changed

+35
-42
lines changed

3 files changed

+35
-42
lines changed

src/scripts/modules/ListFormatter.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ const ListFormatter = Module({
9797
commit () {
9898
const { mediator, cleanupListDOM } = this;
9999
mediator.exec('format:import:from:canvas', {
100-
// importFilter: cleanupListDOM
100+
importFilter: cleanupListDOM
101101
});
102102
},
103103

src/scripts/modules/Selection.js

Lines changed: 9 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -293,34 +293,22 @@ const Selection = Module({
293293
endContainer,
294294
endOffset
295295
} = this.getCurrentRange();
296+
296297
let startCoordinates = [];
297298
let endCoordinates = [];
298-
299-
const startTrimmablePrefix = startContainer.textContent.match(/^(\r?\n|\r)?(\s+)?/);
300-
const endTrimmablePrefix = endContainer.textContent.match(/^(\r?\n|\r)?(\s+)?/);
301-
const endTrimmableSuffix = endContainer.textContent.match(/(\r?\n|\r)?(\s+)?$/);
302-
const startElement = DOM.closestElement(startContainer);
303-
const endElement = DOM.closestElement(endContainer);
304299
let startPrefixTrimLength = 0;
305300
let endPrefixTrimLength = 0;
306301
let endSuffixTrimLength = 0;
307302

308-
console.log({
309-
startTrimmablePrefix,
310-
endTrimmablePrefix,
311-
endTrimmableSuffix,
312-
startPrefixLength: startTrimmablePrefix && startTrimmablePrefix[0].length,
313-
endPrefixLength: endTrimmablePrefix && endTrimmablePrefix[0].length,
314-
startContent: startContainer.textContent,
315-
endContent: endContainer.textContent,
316-
endSuffix: endContainer.textContent.match(/(\r?\n|\r)?(\s+)?$/),
317-
startOffset,
318-
endOffset
319-
});
303+
const startTrimmablePrefix = startContainer.textContent.match(/^(\r?\n|\r)?(\s+)?/);
304+
const endTrimmablePrefix = endContainer.textContent.match(/^(\r?\n|\r)?(\s+)?/);
305+
const endTrimmableSuffix = endContainer.textContent.match(/(\r?\n|\r)?(\s+)?$/);
306+
const startTrimmableSides = DOM.trimmableSides(startContainer.firstChild ? startContainer.firstChild : startContainer);
307+
const endTrimmableSides = DOM.trimmableSides(endContainer.lastChild ? endContainer.lastChild : endContainer);
320308

321309
if (startTrimmablePrefix && startTrimmablePrefix[0].length) {
322310
startPrefixTrimLength += startTrimmablePrefix[0].length;
323-
if (DOM.nodeIsInline(startElement)) {
311+
if (!startTrimmableSides.left) {
324312
startPrefixTrimLength -= startTrimmablePrefix[0].match(/\s/) ? 1 : 0;
325313
}
326314
startOffset -= startPrefixTrimLength;
@@ -331,27 +319,21 @@ const Selection = Module({
331319

332320
if (endTrimmablePrefix && endTrimmablePrefix[0].length && endContainer !== startContainer) {
333321
endPrefixTrimLength += endTrimmablePrefix[0].length;
334-
if (DOM.nodeIsInline(endElement)) {
322+
if (!endTrimmableSides.left) {
335323
endPrefixTrimLength -= endTrimmablePrefix[0].match(/\s/) ? 1 : 0;
336324
}
337325
endOffset -= endPrefixTrimLength;
338326
}
339327

340328
if (endTrimmableSuffix && endTrimmableSuffix[0].length) {
341329
endSuffixTrimLength += endTrimmableSuffix[0].length;
342-
if (DOM.nodeIsInline(endElement)) {
330+
if (!endTrimmableSides.right) {
343331
endSuffixTrimLength -= endTrimmableSuffix[0].match(/\s/) ? 1 : 0;
344332
}
345333
let trimmedTextLength = endContainer.textContent.length - endPrefixTrimLength - endSuffixTrimLength;
346-
console.log('>>', { endOffset, trimmedTextLength, textLength: endContainer.textContent.length, endPrefixTrimLength, endSuffixTrimLength });
347334
endOffset = Math.min(trimmedTextLength, endOffset);
348335
}
349336

350-
console.log({
351-
startOffset,
352-
endOffset
353-
});
354-
355337
startOffset = Math.max(0, startOffset);
356338
endOffset = Math.min(endContainer.textContent.length, endOffset);
357339

@@ -687,8 +669,6 @@ const Selection = Module({
687669
const startOffset = startCoordinates.pop();
688670
const endOffset = endCoordinates.pop();
689671

690-
console.log('selectByCoordinates', { rangeCoordinates });
691-
692672
let startContainer = dom.el[0];
693673
let endContainer = dom.el[0];
694674

@@ -702,8 +682,6 @@ const Selection = Module({
702682
endContainer = endContainer.childNodes[endIndex];
703683
}
704684

705-
console.log({ startContainer, endContainer, startLength: startContainer.length, endLength: endContainer.length, startOffset, endOffset });
706-
707685
newRange.setStart(startContainer, startOffset);
708686
newRange.setEnd(endContainer, endOffset);
709687

src/scripts/utils/DOM.js

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -553,13 +553,18 @@ const DOM = {
553553

554554
trimNodeText (node) {
555555
if (node.nodeType === Node.TEXT_NODE) {
556-
const parentElement = DOM.closestElement(node);
556+
const trimmableSides = DOM.trimmableSides(node);
557557
let trimmedText = node.textContent
558558
.replace(/\s{2,}/g, ' ')
559559
.replace(/\r?\n|\r/g, '');
560-
if (!DOM.nodeIsInline(parentElement)) {
561-
trimmedText = trimmedText.trim();
560+
561+
if (trimmableSides.left) {
562+
trimmedText = trimmedText.replace(/^\s+?/, '');
563+
}
564+
if (trimmableSides.right) {
565+
trimmedText = trimmedText.replace(/\s+?$/, '');
562566
}
567+
563568
node.textContent = trimmedText;
564569
} else {
565570
node.childNodes.forEach((childNode) => {
@@ -568,6 +573,18 @@ const DOM = {
568573
}
569574
},
570575

576+
trimmableSides (node) {
577+
const { parentNode } = node;
578+
const isInline = DOM.nodeIsInline(node);
579+
const isFirstChild = parentNode && node === parentNode.firstChild;
580+
const isLastChild = parentNode && node === parentNode.lastChild;
581+
582+
return {
583+
left: !isInline && isFirstChild,
584+
right: !isInline && isLastChild
585+
};
586+
},
587+
571588
nodesToHTMLString (nodes) {
572589
let HTMLString = '';
573590

@@ -585,15 +602,13 @@ const DOM = {
585602
nodeIsInline (node) {
586603
const inlineTagNames = ['B', 'STRONG', 'I', 'U', 'S', 'SUP', 'SUB'];
587604

588-
if (!node) {
589-
return false;
590-
}
591-
605+
if (!node) { return false; }
592606
if (node.nodeType !== Node.ELEMENT_NODE) {
593-
return true;
594-
} else {
595-
return inlineTagNames.indexOf(node.nodeName) < 0;
607+
node = DOM.closestElement(node);
596608
}
609+
if (!node) { return false; }
610+
611+
return inlineTagNames.indexOf(node.nodeName) > -1;
597612
},
598613

599614
//Pseudo-private methods

0 commit comments

Comments
 (0)