Skip to content

Commit f379754

Browse files
committed
foreign_capture_group: number → foreign_capture_groups: number[]
1 parent 8db7f97 commit f379754

File tree

7 files changed

+42
-39
lines changed

7 files changed

+42
-39
lines changed

packages/jupyterlab-lsp/src/extractors/regexp.spec.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ describe('RegExpForeignCodeExtractor', () => {
4242
let r_cell_extractor = new RegExpForeignCodeExtractor({
4343
language: 'R',
4444
pattern: '^%%R( .*?)?\n([^]*)',
45-
foreign_capture_group: 2,
45+
foreign_capture_groups: [2],
4646
keep_in_host: true,
4747
is_standalone: false,
4848
file_extension: 'R'
@@ -51,7 +51,7 @@ describe('RegExpForeignCodeExtractor', () => {
5151
let r_line_extractor = new RegExpForeignCodeExtractor({
5252
language: 'R',
5353
pattern: '(^|\n)%R (.*)\n?',
54-
foreign_capture_group: 2,
54+
foreign_capture_groups: [2],
5555
keep_in_host: true,
5656
is_standalone: false,
5757
file_extension: 'R'
@@ -60,7 +60,7 @@ describe('RegExpForeignCodeExtractor', () => {
6060
let python_cell_extractor = new RegExpForeignCodeExtractor({
6161
language: 'python',
6262
pattern: '^%%(python|python2|python3|pypy)( .*?)?\n([^]*)',
63-
foreign_capture_group: 3,
63+
foreign_capture_groups: [3],
6464
keep_in_host: true,
6565
is_standalone: true,
6666
file_extension: 'py'
@@ -123,7 +123,7 @@ describe('RegExpForeignCodeExtractor', () => {
123123
let html_extractor = new RegExpForeignCodeExtractor({
124124
language: 'HTML',
125125
pattern: '(<(.*?)( .*?)?>([^]*?)</\\2>)',
126-
foreign_capture_group: 1,
126+
foreign_capture_groups: [1],
127127
keep_in_host: false,
128128
is_standalone: false,
129129
file_extension: 'html'
@@ -160,7 +160,7 @@ describe('RegExpForeignCodeExtractor', () => {
160160
let extractor = new RegExpForeignCodeExtractor({
161161
language: 'R',
162162
pattern: '^%%R( .*?)?\n([^]*)',
163-
foreign_capture_group: 2,
163+
foreign_capture_groups: [2],
164164
keep_in_host: false,
165165
is_standalone: false,
166166
file_extension: 'R'
@@ -178,7 +178,7 @@ describe('RegExpForeignCodeExtractor', () => {
178178
let r_line_extractor = new RegExpForeignCodeExtractor({
179179
language: 'R',
180180
pattern: '(^|\n)%R (.*)\n?',
181-
foreign_capture_group: 2,
181+
foreign_capture_groups: [2],
182182
keep_in_host: false,
183183
is_standalone: false,
184184
file_extension: 'R'

packages/jupyterlab-lsp/src/extractors/regexp.ts

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -71,14 +71,18 @@ export class RegExpForeignCodeExtractor implements IForeignCodeExtractor {
7171
let match: RegExpExecArray = this.global_expression.exec(code);
7272
let host_code_fragment: string;
7373

74-
let new_api_replacer =
75-
typeof this.options.foreign_replacer !== 'undefined'
76-
? this.options.foreign_replacer
77-
: '$' + this.options.foreign_capture_group;
78-
const replacer =
79-
typeof this.options.extract_to_foreign !== 'undefined'
80-
? this.options.extract_to_foreign
81-
: new_api_replacer;
74+
let chosen_replacer: string | replacer;
75+
let is_new_api_replacer: boolean = false;
76+
77+
if (typeof this.options.foreign_replacer !== 'undefined') {
78+
chosen_replacer = this.options.foreign_replacer;
79+
is_new_api_replacer = true;
80+
} else if (typeof this.options.foreign_capture_groups !== 'undefined') {
81+
chosen_replacer = '$' + this.options.foreign_capture_groups.join('$');
82+
is_new_api_replacer = true;
83+
} else {
84+
chosen_replacer = this.options.extract_to_foreign;
85+
}
8286

8387
while (match != null) {
8488
let matched_string = match[0];
@@ -88,7 +92,7 @@ export class RegExpForeignCodeExtractor implements IForeignCodeExtractor {
8892
this.expression,
8993
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
9094
// @ts-ignore
91-
replacer
95+
chosen_replacer
9296
);
9397
let prefix = '';
9498
if (typeof this.options.extract_arguments !== 'undefined') {
@@ -118,10 +122,10 @@ export class RegExpForeignCodeExtractor implements IForeignCodeExtractor {
118122

119123
let foreign_code_group_value = foreign_code_fragment;
120124

121-
if (new_api_replacer) {
125+
if (is_new_api_replacer) {
122126
foreign_code_group_value = matched_string.replace(
123127
this.expression,
124-
'$' + this.options.foreign_capture_group
128+
'$' + Math.min(...this.options.foreign_capture_groups)
125129
);
126130
}
127131

@@ -179,18 +183,17 @@ namespace RegExpForeignCodeExtractor {
179183
*/
180184
pattern: string;
181185
/**
182-
* String specifying match groups to be extracted from the regular expression match,
186+
* Array of numbers specifying match groups to be extracted from the regular expression match,
183187
* for the use in virtual document of the foreign language.
184188
* For the R example this should be `3`. Please not that these are 1-based, as the 0th index is the full match.
189+
* If multiple groups are given, those will be concatenated.
185190
*
186-
* If more than one capture group is needed to extract the code (which is rarely the case:
187-
* usually one can use non-capturing groups rather than multiple adjacent capturing groups),
188-
* specify the first capturing group to allow for proper calculation of the start offset,
189-
* and handle any additional groups using `foreign_replacer`.
191+
* If additional code is needed in between the groups, use `foreign_replacer` in addition to
192+
* `foreign_capture_groups` (but not instead!).
190193
*
191-
* `foreign_capture_group` is required for proper offset calculation and will no longer be optional in 4.0.
194+
* `foreign_capture_groups` is required for proper offset calculation and will no longer be optional in 4.0.
192195
*/
193-
foreign_capture_group?: number;
196+
foreign_capture_groups?: number[];
194197
/**
195198
* Function to compose the foreign document code, in case if using a capture group alone is not sufficient;
196199
* If specified, `foreign_capture_group` should be specified as well, so that it points to the first occurrence

packages/jupyterlab-lsp/src/transclusions/ipython-bigquery/extractors.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export let foreign_code_extractors: IForeignCodeExtractorsRegistry = {
2727
new RegExpForeignCodeExtractor({
2828
language: 'sql',
2929
pattern: `^%%bigquery(?: (?:${SQL_URL_PATTERN}|${COMMAND_PATTERN}|(?:\\w+ << )|(?:\\w+@\\w+)))?\n?((?:.+\n)?(?:[^]*))`,
30-
foreign_capture_group: 1,
30+
foreign_capture_groups: [1],
3131
is_standalone: true,
3232
file_extension: 'sql'
3333
})

packages/jupyterlab-lsp/src/transclusions/ipython-rpy2/extractors.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ export let foreign_code_extractors: IForeignCodeExtractorsRegistry = {
4141
new RegExpForeignCodeExtractor({
4242
language: 'r',
4343
pattern: '^%%R' + rpy2_args_pattern(RPY2_MAX_ARGS) + '\n([^]*)',
44-
foreign_capture_group: RPY2_MAX_ARGS * 2 + 1,
44+
foreign_capture_groups: [RPY2_MAX_ARGS * 2 + 1],
4545
// it is important to not strip any leading spaces
4646
foreign_replacer: rpy2_code_extractor_non_stripping,
4747
extract_arguments: rpy2_args,
@@ -53,7 +53,7 @@ export let foreign_code_extractors: IForeignCodeExtractorsRegistry = {
5353
// it is very important to not include the space which will be trimmed in the capture group,
5454
// otherwise the offset will be off by one and the R language server will crash
5555
pattern: '(?:^|\n)%R' + rpy2_args_pattern(RPY2_MAX_ARGS) + ' ?(.*)?\n?',
56-
foreign_capture_group: RPY2_MAX_ARGS * 2 + 1,
56+
foreign_capture_groups: [RPY2_MAX_ARGS * 2 + 1],
5757
foreign_replacer: create_rpy_code_extractor(true),
5858
extract_arguments: rpy2_args,
5959
is_standalone: false,

packages/jupyterlab-lsp/src/transclusions/ipython-sql/extractors.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,14 @@ export let foreign_code_extractors: IForeignCodeExtractorsRegistry = {
2727
new RegExpForeignCodeExtractor({
2828
language: 'sql',
2929
pattern: `^%%sql(?: (?:${SQL_URL_PATTERN}|${COMMAND_PATTERN}|(?:\\w+ << )|(?:\\w+@\\w+)))?\n?((?:.+\n)?(?:[^]*))`,
30-
foreign_capture_group: 1,
30+
foreign_capture_groups: [1],
3131
is_standalone: true,
3232
file_extension: 'sql'
3333
}),
3434
new RegExpForeignCodeExtractor({
3535
language: 'sql',
3636
pattern: `(?:^|\n)%sql (?:${SQL_URL_PATTERN}|${COMMAND_PATTERN}|(.*))\n?`,
37-
foreign_capture_group: 1,
37+
foreign_capture_groups: [1],
3838
is_standalone: false,
3939
file_extension: 'sql'
4040
})

packages/jupyterlab-lsp/src/transclusions/ipython/extractors.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,35 +11,35 @@ export let foreign_code_extractors: IForeignCodeExtractorsRegistry = {
1111
new RegExpForeignCodeExtractor({
1212
language: 'python',
1313
pattern: '^%%(python|python2|python3|pypy)( .*?)?\n([^]*)',
14-
foreign_capture_group: 3,
14+
foreign_capture_groups: [3],
1515
is_standalone: true,
1616
file_extension: 'py'
1717
}),
1818
new RegExpForeignCodeExtractor({
1919
language: 'perl',
2020
pattern: '^%%(perl)( .*?)?\n([^]*)',
21-
foreign_capture_group: 3,
21+
foreign_capture_groups: [3],
2222
is_standalone: true,
2323
file_extension: 'pl'
2424
}),
2525
new RegExpForeignCodeExtractor({
2626
language: 'ruby',
2727
pattern: '^%%(ruby)( .*?)?\n([^]*)',
28-
foreign_capture_group: 3,
28+
foreign_capture_groups: [3],
2929
is_standalone: true,
3030
file_extension: 'rb'
3131
}),
3232
new RegExpForeignCodeExtractor({
3333
language: 'sh',
3434
pattern: '^%%(sh|bash)( .*?)?\n([^]*)',
35-
foreign_capture_group: 3,
35+
foreign_capture_groups: [3],
3636
is_standalone: true,
3737
file_extension: 'sh'
3838
}),
3939
new RegExpForeignCodeExtractor({
4040
language: 'html',
4141
pattern: '^%%(html --isolated)( .*?)?\n([^]*)',
42-
foreign_capture_group: 3,
42+
foreign_capture_groups: [3],
4343
is_standalone: true,
4444
file_extension: 'html'
4545
}),
@@ -49,28 +49,28 @@ export let foreign_code_extractors: IForeignCodeExtractorsRegistry = {
4949
new RegExpForeignCodeExtractor({
5050
language: 'javascript',
5151
pattern: '^%%(js|javascript)( .*?)?\n([^]*)',
52-
foreign_capture_group: 3,
52+
foreign_capture_groups: [3],
5353
is_standalone: false,
5454
file_extension: 'js'
5555
}),
5656
new RegExpForeignCodeExtractor({
5757
language: 'html',
5858
pattern: '^%%(?!html --isolated)(html)( .*?)?\n([^]*)',
59-
foreign_capture_group: 3,
59+
foreign_capture_groups: [3],
6060
is_standalone: false,
6161
file_extension: 'html'
6262
}),
6363
new RegExpForeignCodeExtractor({
6464
language: 'latex',
6565
pattern: '^%%(latex)( .*?)?\n([^]*)',
66-
foreign_capture_group: 3,
66+
foreign_capture_groups: [3],
6767
is_standalone: false,
6868
file_extension: 'tex'
6969
}),
7070
new RegExpForeignCodeExtractor({
7171
language: 'markdown',
7272
pattern: '^%%(markdown)( .*?)?\n([^]*)',
73-
foreign_capture_group: 3,
73+
foreign_capture_groups: [3],
7474
is_standalone: false,
7575
file_extension: 'md'
7676
})

packages/jupyterlab-lsp/src/virtual/editor.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ describe('VirtualEditor', () => {
1717
let r_line_extractor = new RegExpForeignCodeExtractor({
1818
language: 'R',
1919
pattern: '(^|\n)%R (.*)\n?',
20-
foreign_capture_group: 2,
20+
foreign_capture_groups: [2],
2121
is_standalone: false,
2222
file_extension: 'R'
2323
});

0 commit comments

Comments
 (0)