1
0
mirror of https://github.com/ianstormtaylor/slate.git synced 2025-03-03 12:39:04 +01:00
slate/lib/components/text.js

111 lines
2.1 KiB
JavaScript
Raw Normal View History

2016-06-15 19:46:53 -07:00
import Leaf from './leaf'
import React from 'react'
import groupByMarks from '../utils/group-by-marks'
import { List } from 'immutable'
2016-06-15 19:46:53 -07:00
/**
* Text.
2016-06-15 19:46:53 -07:00
*/
class Text extends React.Component {
2016-06-15 19:46:53 -07:00
/**
* Properties.
*/
2016-06-15 19:46:53 -07:00
static propTypes = {
2016-06-30 10:43:24 -07:00
editor: React.PropTypes.object.isRequired,
2016-06-15 19:46:53 -07:00
node: React.PropTypes.object.isRequired,
renderMark: React.PropTypes.func.isRequired,
state: React.PropTypes.object.isRequired
};
/**
* Should the component update?
*
* @param {Object} props
* @param {Object} state
* @return {Boolean} shouldUpdate
*/
shouldComponentUpdate(props, state) {
return (
2016-07-07 19:37:34 -07:00
props.state.selection.hasEdgeIn(props.node) ||
props.node.decorations != this.props.node.decorations ||
props.node.characters != this.props.node.characters
)
}
/**
* Render.
*
* @return {Element} element
*/
2016-06-15 19:46:53 -07:00
render() {
return (
2016-06-20 17:38:56 -07:00
<span>
2016-06-17 18:20:26 -07:00
{this.renderLeaves()}
2016-06-15 19:46:53 -07:00
</span>
)
}
/**
* Render the leaf nodes.
*
* @return {Array} leaves
*/
2016-06-17 18:20:26 -07:00
renderLeaves() {
const { node } = this.props
const { characters, decorations } = node
const ranges = groupByMarks(decorations || characters)
2016-07-06 20:19:19 -07:00
return ranges.map((range, i, original) => {
const previous = original.slice(0, i)
2016-06-20 13:21:24 -07:00
const offset = previous.size
2016-07-06 20:19:19 -07:00
? previous.map(r => r.text).join('').length
2016-06-20 13:21:24 -07:00
: 0
2016-07-07 19:37:34 -07:00
return this.renderLeaf(range, i, offset)
2016-06-20 13:21:24 -07:00
})
2016-06-17 18:20:26 -07:00
}
/**
* Render a single leaf node given a `range` and `offset`.
*
* @param {Object} range
2016-07-07 19:37:34 -07:00
* @param {Number} index
* @param {Number} offset
* @return {Element} leaf
*/
2016-07-07 19:37:34 -07:00
renderLeaf(range, index, offset) {
2016-06-15 19:46:53 -07:00
const { node, renderMark, state } = this.props
2016-06-19 00:41:36 -07:00
const text = range.text
const marks = range.marks
2016-06-17 18:20:26 -07:00
const start = offset
const end = offset + text.length
2016-06-15 19:46:53 -07:00
return (
<Leaf
2016-07-07 19:37:34 -07:00
key={`${node.key}-${index}`}
2016-06-30 10:43:24 -07:00
state={state}
2016-06-15 19:46:53 -07:00
node={node}
2016-06-17 18:20:26 -07:00
start={start}
end={end}
text={text}
2016-06-30 10:43:24 -07:00
marks={marks}
renderMark={renderMark}
2016-06-15 19:46:53 -07:00
/>
)
}
}
/**
* Export.
*/
export default Text