30 lines
770 B
TypeScript
30 lines
770 B
TypeScript
import type { EditorView } from 'prosemirror-view';
|
|
import { isList } from '../utils';
|
|
|
|
type Style = Record<string, string>;
|
|
|
|
export const setListStyle = (view: EditorView, style: Style | Style[]) => {
|
|
const { state } = view;
|
|
const { schema, selection } = state;
|
|
const tr = state.tr.setSelection(selection);
|
|
|
|
const { doc } = tr;
|
|
if (!doc) return tr;
|
|
|
|
const { from, to } = selection;
|
|
doc.nodesBetween(from, to, (node, pos) => {
|
|
if (isList(node, schema)) {
|
|
if (from - 3 <= pos && to + 3 >= pos + node.nodeSize) {
|
|
const styles = Array.isArray(style) ? style : [style];
|
|
|
|
for (const style of styles) {
|
|
tr.setNodeAttribute(pos, style.key, style.value);
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
});
|
|
|
|
view.dispatch(tr);
|
|
};
|