diff --git a/src/node.js b/src/node.js index bafdddbb..e50aabe5 100644 --- a/src/node.js +++ b/src/node.js @@ -19,24 +19,33 @@ function isBlank (node) { } function flankingWhitespace (node) { - var leading = '' - var trailing = '' + if (node.isBlock) return { leading: '', trailing: '' } - if (!node.isBlock) { - var hasLeading = /^\s/.test(node.textContent) - var hasTrailing = /\s$/.test(node.textContent) - var blankWithSpaces = node.isBlank && hasLeading && hasTrailing + var edges = edgeWhitespace(node.textContent) - if (hasLeading && !isFlankedByWhitespace('left', node)) { - leading = ' ' - } + // abandon leading ASCII WS if left-flanked by ASCII WS + if (edges.leadingAscii && isFlankedByWhitespace('left', node)) { + edges.leading = edges.leadingNonAscii + } - if (!blankWithSpaces && hasTrailing && !isFlankedByWhitespace('right', node)) { - trailing = ' ' - } + // abandon trailing ASCII WS if right-flanked by ASCII WS + if (edges.trailingAscii && isFlankedByWhitespace('right', node)) { + edges.trailing = edges.trailingNonAscii } - return { leading: leading, trailing: trailing } + return { leading: edges.leading, trailing: edges.trailing } +} + +function edgeWhitespace (string) { + var m = string.match(/^(([ \t\r\n]*)(\s*))[\s\S]*?((\s*?)([ \t\r\n]*))$/) + return { + leading: m[1], // whole string for whitespace-only strings + leadingAscii: m[2], + leadingNonAscii: m[3], + trailing: m[4], // empty for whitespace-only strings + trailingNonAscii: m[5], + trailingAscii: m[6] + } } function isFlankedByWhitespace (side, node) { diff --git a/test/index.html b/test/index.html index 4dd70aa0..31c5f968 100644 --- a/test/index.html +++ b/test/index.html @@ -930,7 +930,7 @@
Foo Bar
Foo Bar+
Foo Bar
Foo Bar
+Foo Bar+
1. First + 2. Second+
_foo_ bar+
_foo_ bar+
_foo_ bar+
_foo_ bar+
foo _bar_+
foo _bar_+
foo _bar_+
foo _bar_+