| 1234567891011121314151617181920212223242526272829303132333435363738394041 |
- import { sawCollapsedSpans } from 'codemirror/src/line/saw_special_spans';
- import { getLine } from 'codemirror/src/line/utils_line';
- import { heightAtLine, visualLineEndNo, visualLineNo } from 'codemirror/src/line/spans';
- import { DisplayUpdate } from 'codemirror/src/display/update_display';
- import { adjustView } from 'codemirror/src/display/view_tracking';
- class UpdateDisplayUtil {
- /**
- * Transplant 'updateDisplayIfNeeded' method to fix weseek/growi#703
- *
- * @see https://github.com/weseek/growi/issues/703
- * @see https://github.com/codemirror/CodeMirror/blob/5.42.0/src/display/update_display.js#L125
- *
- * @param {CodeMirror} cm
- */
- static forceUpdateViewOffset(cm) {
- const doc = cm.doc;
- const display = cm.display;
- const update = new DisplayUpdate(cm, cm.getViewport());
- // Compute a suitable new viewport (from & to)
- let end = doc.first + doc.size;
- let from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first);
- let to = Math.min(end, update.visible.to + cm.options.viewportMargin);
- if (display.viewFrom < from && from - display.viewFrom < 20) from = Math.max(doc.first, display.viewFrom);
- if (display.viewTo > to && display.viewTo - to < 20) to = Math.min(end, display.viewTo);
- if (sawCollapsedSpans) {
- from = visualLineNo(cm.doc, from);
- to = visualLineEndNo(cm.doc, to);
- }
- adjustView(cm, from, to);
- display.viewOffset = heightAtLine(getLine(doc, display.viewFrom));
- }
- }
- export default UpdateDisplayUtil;
|