mirror of
https://github.com/ianstormtaylor/slate.git
synced 2025-08-16 04:04:06 +02:00
fix trailing newline collapsing logic, closes #430
This commit is contained in:
@@ -441,23 +441,26 @@ class Content extends React.Component {
|
|||||||
const schema = editor.getSchema()
|
const schema = editor.getSchema()
|
||||||
const decorators = document.getDescendantDecorators(key, schema)
|
const decorators = document.getDescendantDecorators(key, schema)
|
||||||
const node = document.getDescendant(key)
|
const node = document.getDescendant(key)
|
||||||
|
const block = document.getClosestBlock(node.key)
|
||||||
const ranges = node.getRanges(decorators)
|
const ranges = node.getRanges(decorators)
|
||||||
const range = ranges.get(index)
|
const lastText = block.getLastText()
|
||||||
|
|
||||||
// Get the text information.
|
// Get the text information.
|
||||||
const isLast = index == ranges.size - 1
|
|
||||||
const { text, marks } = range
|
|
||||||
let { textContent } = anchorNode
|
let { textContent } = anchorNode
|
||||||
const lastChar = textContent.charAt(textContent.length - 1)
|
const lastChar = textContent.charAt(textContent.length - 1)
|
||||||
|
const isLastText = node == lastText
|
||||||
|
const isLastRange = index == ranges.size - 1
|
||||||
|
|
||||||
// If we're dealing with the last leaf, and the DOM text ends in a new line,
|
// If we're dealing with the last leaf, and the DOM text ends in a new line,
|
||||||
// we will have added another new line in <Leaf>'s render method to account
|
// we will have added another new line in <Leaf>'s render method to account
|
||||||
// for browsers collapsing a single trailing new lines, so remove it.
|
// for browsers collapsing a single trailing new lines, so remove it.
|
||||||
if (isLast && lastChar == '\n') {
|
if (isLastText && isLastRange && lastChar == '\n') {
|
||||||
textContent = textContent.slice(0, -1)
|
textContent = textContent.slice(0, -1)
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the text is no different, abort.
|
// If the text is no different, abort.
|
||||||
|
const range = ranges.get(index)
|
||||||
|
const { text, marks } = range
|
||||||
if (textContent == text) return
|
if (textContent == text) return
|
||||||
|
|
||||||
// Determine what the selection should be after changing the text.
|
// Determine what the selection should be after changing the text.
|
||||||
|
@@ -257,7 +257,9 @@ class Leaf extends React.Component {
|
|||||||
* @return {Element}
|
* @return {Element}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
renderText({ parent, text, index, ranges }) {
|
renderText(props) {
|
||||||
|
const { node, state, parent, text, index, ranges } = props
|
||||||
|
|
||||||
// COMPAT: If the text is empty and it's the only child, we need to render a
|
// COMPAT: If the text is empty and it's the only child, we need to render a
|
||||||
// <br/> to get the block to have the proper height.
|
// <br/> to get the block to have the proper height.
|
||||||
if (text == '' && parent.kind == 'block' && parent.text == '') return <br />
|
if (text == '' && parent.kind == 'block' && parent.text == '') return <br />
|
||||||
@@ -269,9 +271,12 @@ class Leaf extends React.Component {
|
|||||||
|
|
||||||
// COMPAT: Browsers will collapse trailing new lines at the end of blocks,
|
// COMPAT: Browsers will collapse trailing new lines at the end of blocks,
|
||||||
// so we need to add an extra trailing new lines to prevent that.
|
// so we need to add an extra trailing new lines to prevent that.
|
||||||
|
const block = state.document.getClosestBlock(node.key)
|
||||||
|
const lastText = block.getLastText()
|
||||||
const lastChar = text.charAt(text.length - 1)
|
const lastChar = text.charAt(text.length - 1)
|
||||||
const isLast = index == ranges.size - 1
|
const isLastText = node == lastText
|
||||||
if (isLast && lastChar == '\n') return `${text}\n`
|
const isLastRange = index == ranges.size - 1
|
||||||
|
if (isLastText && isLastRange && lastChar == '\n') return `${text}\n`
|
||||||
|
|
||||||
// Otherwise, just return the text.
|
// Otherwise, just return the text.
|
||||||
return text
|
return text
|
||||||
|
Reference in New Issue
Block a user