Skip to content

Commit 699b56a

Browse files
Migrate regex scope handlers
1 parent 0e4c9d9 commit 699b56a

File tree

5 files changed

+79
-174
lines changed

5 files changed

+79
-174
lines changed

packages/cursorless-engine/src/processTargets/ModifierStageFactoryImpl.ts

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,6 @@ import ContainingSyntaxScopeStage, {
3636
SimpleEveryScopeModifier,
3737
} from "./modifiers/scopeTypeStages/ContainingSyntaxScopeStage";
3838
import NotebookCellStage from "./modifiers/scopeTypeStages/NotebookCellStage";
39-
import {
40-
CustomRegexModifier,
41-
CustomRegexStage,
42-
NonWhitespaceSequenceStage,
43-
UrlStage,
44-
} from "./modifiers/scopeTypeStages/RegexStage";
4539
import { StoredTargetMap } from "..";
4640

4741
export class ModifierStageFactoryImpl implements ModifierStageFactory {
@@ -131,20 +125,14 @@ export class ModifierStageFactoryImpl implements ModifierStageFactory {
131125
switch (modifier.scopeType.type) {
132126
case "notebookCell":
133127
return new NotebookCellStage(modifier);
134-
case "nonWhitespaceSequence":
135-
return new NonWhitespaceSequenceStage(modifier);
136128
case "boundedNonWhitespaceSequence":
137129
return new BoundedNonWhitespaceSequenceStage(
138130
this.languageDefinitions,
139131
this,
140132
modifier,
141133
);
142-
case "url":
143-
return new UrlStage(modifier);
144134
case "collectionItem":
145135
return new ItemStage(this.languageDefinitions, modifier);
146-
case "customRegex":
147-
return new CustomRegexStage(modifier as CustomRegexModifier);
148136
case "surroundingPair":
149137
return new SurroundingPairStage(
150138
this.languageDefinitions,
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import { CustomRegexScopeType, Direction, ScopeType } from "@cursorless/common";
2+
import { imap } from "itertools";
3+
import { NestedScopeHandler, ScopeHandlerFactory } from ".";
4+
import { generateMatchesInRange } from "../../../util/getMatchesInRange";
5+
import { TokenTarget } from "../../targets";
6+
import { TargetScope } from "./scope.types";
7+
8+
abstract class RegexStageBase extends NestedScopeHandler {
9+
public readonly iterationScopeType: ScopeType = { type: "line" };
10+
protected abstract readonly regex: RegExp;
11+
12+
protected generateScopesInSearchScope(
13+
direction: Direction,
14+
{ editor, domain }: TargetScope,
15+
): Iterable<TargetScope> {
16+
return imap(
17+
generateMatchesInRange(this.regex, editor, domain, direction),
18+
(range) => ({
19+
editor,
20+
domain: range,
21+
getTargets: (isReversed) => [
22+
new TokenTarget({
23+
editor,
24+
contentRange: range,
25+
isReversed,
26+
}),
27+
],
28+
}),
29+
);
30+
}
31+
}
32+
33+
export class NonWhitespaceSequenceScopeHandler extends RegexStageBase {
34+
regex = /\S+/g;
35+
}
36+
37+
export class UrlScopeHandler extends RegexStageBase {
38+
// taken from https://regexr.com/3e6m0
39+
regex =
40+
/(http(s)?:\/\/.)?(www\.)?[-a-zA-Z0-9@:%._+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_+.~#?&//=]*)/g;
41+
42+
constructor(
43+
scopeHandlerFactory: ScopeHandlerFactory,
44+
readonly scopeType: ScopeType,
45+
languageId: string,
46+
) {
47+
super(scopeHandlerFactory, scopeType, languageId);
48+
}
49+
}
50+
51+
export class CustomRegexScopeHandler extends RegexStageBase {
52+
get regex() {
53+
return new RegExp(this.scopeType.regex, "gu");
54+
}
55+
56+
constructor(
57+
scopeHandlerFactory: ScopeHandlerFactory,
58+
readonly scopeType: CustomRegexScopeType,
59+
languageId: string,
60+
) {
61+
super(scopeHandlerFactory, scopeType, languageId);
62+
}
63+
}

packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/ScopeHandlerFactoryImpl.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
import type { ScopeType } from "@cursorless/common";
22
import {
33
CharacterScopeHandler,
4+
CustomRegexScopeHandler,
45
DocumentScopeHandler,
56
IdentifierScopeHandler,
67
LineScopeHandler,
8+
NonWhitespaceSequenceScopeHandler,
79
OneOfScopeHandler,
810
ParagraphScopeHandler,
11+
ScopeHandlerFactory,
912
TokenScopeHandler,
13+
UrlScopeHandler,
1014
WordScopeHandler,
1115
} from ".";
1216
import { LanguageDefinitions } from "../../../languages/LanguageDefinitions";
13-
import { ScopeHandlerFactory } from "./ScopeHandlerFactory";
1417
import type { CustomScopeType, ScopeHandler } from "./scopeHandler.types";
1518

1619
/**
@@ -56,6 +59,16 @@ export class ScopeHandlerFactoryImpl implements ScopeHandlerFactory {
5659
return OneOfScopeHandler.create(this, scopeType, languageId);
5760
case "paragraph":
5861
return new ParagraphScopeHandler(scopeType, languageId);
62+
case "nonWhitespaceSequence":
63+
return new NonWhitespaceSequenceScopeHandler(
64+
this,
65+
scopeType,
66+
languageId,
67+
);
68+
case "url":
69+
return new UrlScopeHandler(this, scopeType, languageId);
70+
case "customRegex":
71+
return new CustomRegexScopeHandler(this, scopeType, languageId);
5972
case "custom":
6073
return scopeType.scopeHandler;
6174
case "instance":

packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,6 @@ export * from "./OneOfScopeHandler";
1717
export { default as OneOfScopeHandler } from "./OneOfScopeHandler";
1818
export * from "./ParagraphScopeHandler";
1919
export { default as ParagraphScopeHandler } from "./ParagraphScopeHandler";
20+
export * from "./RegexScopeHandler";
21+
export * from "./ScopeHandlerFactory";
2022
export * from "./ScopeHandlerFactoryImpl";

packages/cursorless-engine/src/processTargets/modifiers/scopeTypeStages/RegexStage.ts

Lines changed: 0 additions & 161 deletions
This file was deleted.

0 commit comments

Comments
 (0)