38 lines
No EOL
1 KiB
JavaScript
38 lines
No EOL
1 KiB
JavaScript
export function setBlockAttr(attrName, attrValue) {
|
|
return function (state, dispatch) {
|
|
const ref = state.selection;
|
|
const from = ref.from;
|
|
const to = ref.to;
|
|
let applicable = false;
|
|
|
|
state.doc.nodesBetween(from, to, function (node, pos) {
|
|
if (applicable) {
|
|
return false
|
|
}
|
|
if (!node.isTextblock || node.attrs[attrName] === attrValue) {
|
|
return
|
|
}
|
|
|
|
applicable = node.attrs[attrName] !== undefined;
|
|
});
|
|
|
|
if (!applicable) {
|
|
return false
|
|
}
|
|
|
|
if (dispatch) {
|
|
const tr = state.tr;
|
|
tr.doc.nodesBetween(from, to, function (node, pos) {
|
|
const nodeAttrs = Object.assign({}, node.attrs);
|
|
if (node.attrs[attrName] !== undefined) {
|
|
nodeAttrs[attrName] = attrValue;
|
|
tr.setBlockType(pos, pos+1, node.type, nodeAttrs)
|
|
}
|
|
});
|
|
|
|
dispatch(tr);
|
|
}
|
|
|
|
return true
|
|
}
|
|
} |