2 * @param {String} attrName
3 * @param {String} attrValue
4 * @return {PmCommandHandler}
6 export function setBlockAttr(attrName, attrValue) {
7 return function (state, dispatch) {
8 const ref = state.selection;
11 let applicable = false;
13 state.doc.nodesBetween(from, to, function (node, pos) {
17 if (!node.isTextblock || node.attrs[attrName] === attrValue) {
21 applicable = node.attrs[attrName] !== undefined;
30 tr.doc.nodesBetween(from, to, function (node, pos) {
31 const nodeAttrs = Object.assign({}, node.attrs);
32 if (node.attrs[attrName] !== undefined) {
33 nodeAttrs[attrName] = attrValue;
34 tr.setBlockType(pos, pos + 1, node.type, nodeAttrs)
46 * @param {PmNodeType} blockType
47 * @return {PmCommandHandler}
49 export function insertBlockBefore(blockType) {
50 return function (state, dispatch) {
51 const startPosition = state.selection.$from.before(1);
54 dispatch(state.tr.insert(startPosition, blockType.create()));
62 * @param {Number} rows
63 * @param {Number} columns
64 * @param {Object} tableAttrs
65 * @return {PmCommandHandler}
67 export function insertTable(rows, columns, tableAttrs) {
68 return function (state, dispatch) {
69 if (!dispatch) return true;
72 const nodes = state.schema.nodes;
75 for (let y = 0; y < rows; y++) {
77 for (let x = 0; x < columns; x++) {
78 const cellText = nodes.paragraph.create(null);
79 rowCells.push(nodes.table_cell.create(null, cellText));
81 rowNodes.push(nodes.table_row.create(null, rowCells));
84 const table = nodes.table.create(tableAttrs, rowNodes);
85 tr.replaceSelectionWith(table);
93 * @return {PmCommandHandler}
95 export function removeMarks() {
96 return function (state, dispatch) {
98 dispatch(state.tr.removeMark(state.selection.from, state.selection.to, null));