Highlight simple f-string interpolations
This commit is contained in:
parent
551b5d8f2e
commit
57970d662e
75
src/vendor/rline.c
vendored
75
src/vendor/rline.c
vendored
@ -523,7 +523,42 @@ void paintNHex(struct syntax_state * state, int n) {
|
||||
}
|
||||
}
|
||||
|
||||
void paint_krk_string(struct syntax_state * state, int type) {
|
||||
void paint_krk_string_shared(struct syntax_state * state, int type, int isFormat) {
|
||||
if (charat() == '\\') {
|
||||
if (nextchar() == 'x') {
|
||||
paintNHex(state, 2);
|
||||
} else if (nextchar() == 'u') {
|
||||
paintNHex(state, 4);
|
||||
} else if (nextchar() == 'U') {
|
||||
paintNHex(state, 8);
|
||||
} else if (nextchar() >= '0' && nextchar() <= '7') {
|
||||
paint(2, FLAG_ESCAPE);
|
||||
if (charat() >= '0' && charat() <= '7') {
|
||||
paint(1, FLAG_ESCAPE);
|
||||
if (charat() >= '0' && charat() <= '7') {
|
||||
paint(1, FLAG_ESCAPE);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
paint(2, FLAG_ESCAPE);
|
||||
}
|
||||
} else if (isFormat && charat() == '{') {
|
||||
paint(1, FLAG_NUMERAL);
|
||||
if (charat() == '}') {
|
||||
state->i--;
|
||||
paint(2, FLAG_ERROR); /* Can't do that. */
|
||||
} else {
|
||||
while (charat() != -1 && charat() != '}') {
|
||||
paint(1, FLAG_NUMERAL);
|
||||
}
|
||||
paint(1, FLAG_NUMERAL);
|
||||
}
|
||||
} else {
|
||||
paint(1, FLAG_STRING);
|
||||
}
|
||||
}
|
||||
|
||||
void paint_krk_string(struct syntax_state * state, int type, int isFormat) {
|
||||
/* Assumes you came in from a check of charat() == '"' */
|
||||
paint(1, FLAG_STRING);
|
||||
while (charat() != -1) {
|
||||
@ -532,26 +567,8 @@ void paint_krk_string(struct syntax_state * state, int type) {
|
||||
} else if (charat() == type) {
|
||||
paint(1, FLAG_STRING);
|
||||
return;
|
||||
} else if (charat() == '\\') {
|
||||
if (nextchar() == 'x') {
|
||||
paintNHex(state, 2);
|
||||
} else if (nextchar() == 'u') {
|
||||
paintNHex(state, 4);
|
||||
} else if (nextchar() == 'U') {
|
||||
paintNHex(state, 8);
|
||||
} else if (nextchar() >= '0' && nextchar() <= '7') {
|
||||
paint(2, FLAG_ESCAPE);
|
||||
if (charat() >= '0' && charat() <= '7') {
|
||||
paint(1, FLAG_ESCAPE);
|
||||
if (charat() >= '0' && charat() <= '7') {
|
||||
paint(1, FLAG_ESCAPE);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
paint(2, FLAG_ESCAPE);
|
||||
}
|
||||
} else {
|
||||
paint(1, FLAG_STRING);
|
||||
paint_krk_string_shared(state,type,isFormat);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -610,16 +627,18 @@ int paint_krk_numeral(struct syntax_state * state) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int paint_krk_triple_string(struct syntax_state * state, int type) {
|
||||
int paint_krk_triple_string(struct syntax_state * state, int type, int isFormat) {
|
||||
while (charat() != -1) {
|
||||
if (charat() == type) {
|
||||
if (charat() == '\\' && nextchar() == type) {
|
||||
paint(2, FLAG_ESCAPE);
|
||||
} else if (charat() == type) {
|
||||
paint(1, FLAG_STRING);
|
||||
if (charat() == type && nextchar() == type) {
|
||||
paint(2, FLAG_STRING);
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
paint(1, FLAG_STRING);
|
||||
paint_krk_string_shared(state,type,isFormat);
|
||||
}
|
||||
}
|
||||
return (type == '"') ? 1 : 2; /* continues */
|
||||
@ -636,12 +655,13 @@ int syn_krk_calculate(struct syntax_state * state) {
|
||||
while (c_keyword_qualifier(charat())) paint(1, FLAG_TYPE);
|
||||
return 0;
|
||||
} else if (charat() == '"' || charat() == '\'') {
|
||||
int isFormat = (lastchar() == 'f');
|
||||
if (nextchar() == charat() && charrel(2) == charat()) {
|
||||
int type = charat();
|
||||
paint(3, FLAG_STRING);
|
||||
return paint_krk_triple_string(state, type);
|
||||
return paint_krk_triple_string(state, type, isFormat);
|
||||
} else {
|
||||
paint_krk_string(state, charat());
|
||||
paint_krk_string(state, charat(), isFormat);
|
||||
}
|
||||
return 0;
|
||||
} else if (find_keywords(state, syn_krk_keywords, FLAG_KEYWORD, c_keyword_qualifier)) {
|
||||
@ -660,10 +680,11 @@ int syn_krk_calculate(struct syntax_state * state) {
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
/* rline doesn't support multiline editing anyway */
|
||||
case 1:
|
||||
return paint_krk_triple_string(state, '"');
|
||||
return paint_krk_triple_string(state, '"', 0);
|
||||
case 2:
|
||||
return paint_krk_triple_string(state, '\'');
|
||||
return paint_krk_triple_string(state, '\'', 0);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user