update-display-util.ext.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import { sawCollapsedSpans } from 'codemirror/src/line/saw_special_spans';
  2. import { getLine } from 'codemirror/src/line/utils_line';
  3. import { heightAtLine, visualLineEndNo, visualLineNo } from 'codemirror/src/line/spans';
  4. import { DisplayUpdate } from 'codemirror/src/display/update_display';
  5. import { adjustView } from 'codemirror/src/display/view_tracking';
  6. class UpdateDisplayUtil {
  7. /**
  8. * Transplant 'updateDisplayIfNeeded' method to fix weseek/growi#703
  9. *
  10. * @see https://github.com/weseek/growi/issues/703
  11. * @see https://github.com/codemirror/CodeMirror/blob/5.42.0/src/display/update_display.js#L125
  12. *
  13. * @param {CodeMirror} cm
  14. */
  15. static forceUpdateViewOffset(cm) {
  16. const doc = cm.doc;
  17. const display = cm.display;
  18. const update = new DisplayUpdate(cm, cm.getViewport());
  19. // Compute a suitable new viewport (from & to)
  20. let end = doc.first + doc.size;
  21. let from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first);
  22. let to = Math.min(end, update.visible.to + cm.options.viewportMargin);
  23. if (display.viewFrom < from && from - display.viewFrom < 20) from = Math.max(doc.first, display.viewFrom);
  24. if (display.viewTo > to && display.viewTo - to < 20) to = Math.min(end, display.viewTo);
  25. if (sawCollapsedSpans) {
  26. from = visualLineNo(cm.doc, from);
  27. to = visualLineEndNo(cm.doc, to);
  28. }
  29. adjustView(cm, from, to);
  30. display.viewOffset = heightAtLine(getLine(doc, display.viewFrom));
  31. }
  32. }
  33. export default UpdateDisplayUtil;