Skip to content

Commit fe2a683

Browse files
authored
Merge pull request #2561 from codecrafters-io/code-mirror/right-side-gutter
Add a right-side gutter CodeMirror extension
2 parents 6513b7c + 3419cf7 commit fe2a683

File tree

4 files changed

+563
-1
lines changed

4 files changed

+563
-1
lines changed

.prettierignore

+3
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,6 @@
2121
# index.html ends up weirdly formatted
2222
/app/index.html
2323
/tests/index.html
24+
25+
# code-mirror-gutter-rs is cloned from @codemirror/view
26+
/app/utils/code-mirror-gutter-rs.ts

app/components/code-mirror.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import { languages } from '@codemirror/language-data';
3838
import { markdown } from '@codemirror/lang-markdown';
3939
import { highlightNewlines } from 'codecrafters-frontend/utils/code-mirror-highlight-newlines';
4040
import { collapseUnchangedGutter } from 'codecrafters-frontend/utils/code-mirror-collapse-unchanged-gutter';
41+
import { highlightActiveLineGutter as highlightActiveLineGutterRS } from 'codecrafters-frontend/utils/code-mirror-gutter-rs';
4142

4243
function generateHTMLElement(src: string): HTMLElement {
4344
const div = document.createElement('div');
@@ -66,7 +67,8 @@ const OPTION_HANDLERS: { [key: string]: OptionHandler } = {
6667
drawSelection: ({ drawSelection: enabled }) => (enabled ? [drawSelection()] : []),
6768
dropCursor: ({ dropCursor: enabled }) => (enabled ? [dropCursor()] : []),
6869
editable: ({ editable }) => [EditorView.editable.of(!!editable)],
69-
highlightActiveLine: ({ highlightActiveLine: enabled }) => (enabled ? [highlightActiveLine(), highlightActiveLineGutter()] : []),
70+
highlightActiveLine: ({ highlightActiveLine: enabled }) =>
71+
enabled ? [highlightActiveLine(), highlightActiveLineGutter(), highlightActiveLineGutterRS()] : [],
7072
highlightNewlines: ({ highlightNewlines: enabled }) => (enabled ? [highlightNewlines()] : []),
7173
highlightSelectionMatches: ({ highlightSelectionMatches: enabled }) => (enabled ? [highlightSelectionMatches()] : []),
7274
highlightSpecialChars: ({ highlightSpecialChars: enabled }) => (enabled ? [highlightSpecialChars()] : []),

app/utils/code-mirror-collapse-unchanged-gutter.ts

+26
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { BlockInfo, EditorView, gutter, GutterMarker, type WidgetType } from '@codemirror/view';
22
import { uncollapseUnchanged } from '@codemirror/merge';
3+
import { gutter as gutterRS, GutterMarker as GutterMarkerRS } from 'codecrafters-frontend/utils/code-mirror-gutter-rs';
34

45
function isCollapseUnchangedWidget(widget: WidgetType) {
56
return 'type' in widget && widget.type === 'collapsed-unchanged-code';
@@ -43,6 +44,23 @@ export class CollapseUnchangedGutterMarker extends GutterMarker {
4344
}
4445
}
4546

47+
export class CollapseUnchangedGutterMarkerRS extends GutterMarkerRS {
48+
line: BlockInfo;
49+
view: EditorView;
50+
widget: WidgetType;
51+
52+
constructor(view: EditorView, widget: WidgetType, line: BlockInfo) {
53+
super();
54+
this.line = line;
55+
this.view = view;
56+
this.widget = widget;
57+
}
58+
59+
toDOM(view: EditorView) {
60+
return renderGutterElement(view, this.widget, this.line);
61+
}
62+
}
63+
4664
export function collapseUnchangedGutter() {
4765
return [
4866
gutter({
@@ -52,5 +70,13 @@ export function collapseUnchangedGutter() {
5270
return isCollapseUnchangedWidget(widget) ? new CollapseUnchangedGutterMarker(view, widget, line) : null;
5371
},
5472
}),
73+
74+
gutterRS({
75+
class: 'cm-collapseUnchangedGutter',
76+
77+
widgetMarker(view, widget, line) {
78+
return isCollapseUnchangedWidget(widget) ? new CollapseUnchangedGutterMarkerRS(view, widget, line) : null;
79+
},
80+
}),
5581
];
5682
}

0 commit comments

Comments
 (0)