mirror of
https://github.com/wassname/talk.git
synced 2026-08-18 12:30:39 +08:00
55 lines
1.2 KiB
JavaScript
55 lines
1.2 KiB
JavaScript
import createToggle from '../factories/createToggle';
|
|
import {
|
|
findIntersecting,
|
|
insertNewLineAfterNode,
|
|
insertNodes,
|
|
getSelectedNodesExpanded,
|
|
outdentNode,
|
|
selectEndOfNode,
|
|
} from '../lib/dom';
|
|
|
|
function execCommand() {
|
|
const bq = findIntersecting('BLOCKQUOTE');
|
|
if (bq) {
|
|
outdentNode(bq, true);
|
|
} else {
|
|
const node = document.createElement('blockquote');
|
|
|
|
// Expanded selection means we always select whole lines.
|
|
const selectedNodes = getSelectedNodesExpanded();
|
|
if (selectedNodes.length) {
|
|
const firstNode = selectedNodes[0];
|
|
firstNode.parentNode.insertBefore(node, firstNode);
|
|
selectedNodes.forEach(n => {
|
|
node.appendChild(n);
|
|
});
|
|
selectEndOfNode(node);
|
|
} else {
|
|
node.appendChild(document.createElement('br'));
|
|
insertNodes(node);
|
|
selectEndOfNode(node);
|
|
}
|
|
}
|
|
this.broadcastChange();
|
|
}
|
|
|
|
function isActive() {
|
|
return !!findIntersecting('BLOCKQUOTE');
|
|
}
|
|
|
|
const onEnter = node => {
|
|
if (node.tagName !== 'BLOCKQUOTE') {
|
|
return;
|
|
}
|
|
insertNewLineAfterNode(node, true);
|
|
return true;
|
|
};
|
|
|
|
const Blockquote = createToggle(execCommand, { onEnter, isActive });
|
|
|
|
Blockquote.defaultProps = {
|
|
children: 'Blockquote',
|
|
};
|
|
|
|
export default Blockquote;
|