colorpicker hotkey: find color at cursor in strings/comments
This commit is contained in:
parent
8c5471092c
commit
e0ea76a940
|
@ -21,7 +21,6 @@
|
||||||
rgba: /rgba\((?:\s*\d{1,3}\s*,\s*){3}\d*\.?\d+\s*\)/yi,
|
rgba: /rgba\((?:\s*\d{1,3}\s*,\s*){3}\d*\.?\d+\s*\)/yi,
|
||||||
hsl: /hsl\(\s*(?:-?\d+|-?\d*\.\d+)\s*(?:,\s*(?:-?\d+|-?\d*\.\d+)%\s*){2}\)/yi,
|
hsl: /hsl\(\s*(?:-?\d+|-?\d*\.\d+)\s*(?:,\s*(?:-?\d+|-?\d*\.\d+)%\s*){2}\)/yi,
|
||||||
hsla: /hsla\(\s*(?:-?\d+|-?\d*\.\d+)\s*(?:,\s*(?:-?\d+|-?\d*\.\d+)%\s*){2},\s*(?:-?\d+|-?\d*\.\d+)\s*\)/yi,
|
hsla: /hsla\(\s*(?:-?\d+|-?\d*\.\d+)\s*(?:,\s*(?:-?\d+|-?\d*\.\d+)%\s*){2},\s*(?:-?\d+|-?\d*\.\d+)\s*\)/yi,
|
||||||
named: new RegExp([...NAMED_COLORS.keys()].join('|'), 'i'),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const CodeMirrorEvents = {
|
const CodeMirrorEvents = {
|
||||||
|
@ -214,6 +213,34 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function parseColorAtCursor(lineText, lineTextLC = lineText.toLowerCase(), ch) {
|
||||||
|
const iHex = lineTextLC.lastIndexOf('#', ch);
|
||||||
|
const iParen = lineTextLC.lastIndexOf('(', ch);
|
||||||
|
let start = Math.max(iHex, iParen);
|
||||||
|
let match, end, color, colorValue;
|
||||||
|
if (start >= 0) {
|
||||||
|
if (start === iHex) {
|
||||||
|
match = RX_COLOR.hex;
|
||||||
|
} else {
|
||||||
|
const tokenLen = lineTextLC.charAt(start - 1) === 'a' ? 4 : 3;
|
||||||
|
start -= tokenLen;
|
||||||
|
match = RX_COLOR[lineTextLC.substr(start, tokenLen)];
|
||||||
|
}
|
||||||
|
if (match) {
|
||||||
|
match.lastIndex = start;
|
||||||
|
([color] = match.exec(lineText) || []);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const isLetterAt = (i, code = lineTextLC.charCodeAt(i)) => code >= 97 && code <= 122;
|
||||||
|
for (start = ch; isLetterAt(start); start--) {} // eslint-disable-line no-empty
|
||||||
|
for (end = ch; isLetterAt(end); end++) {} // eslint-disable-line no-empty
|
||||||
|
start++;
|
||||||
|
(color = lineTextLC.slice(start, end));
|
||||||
|
colorValue = NAMED_COLORS.get(color);
|
||||||
|
}
|
||||||
|
return color && {ch: start, color, colorValue};
|
||||||
|
}
|
||||||
|
|
||||||
function getNamedColorsMap() {
|
function getNamedColorsMap() {
|
||||||
return new Map([
|
return new Map([
|
||||||
['aliceblue', '#f0f8ff'],
|
['aliceblue', '#f0f8ff'],
|
||||||
|
@ -401,17 +428,20 @@
|
||||||
|
|
||||||
openPopup(color) {
|
openPopup(color) {
|
||||||
let {line, ch} = this.cm.getCursor();
|
let {line, ch} = this.cm.getCursor();
|
||||||
const lineText = this.cm.getLine(line);
|
const lineText = this.cm.getLine(line).toLowerCase();
|
||||||
const atImportant = lineText.lastIndexOf('!important', ch);
|
const lineTextLC = lineText.toLowerCase();
|
||||||
|
const atImportant = lineTextLC.lastIndexOf('!important', ch);
|
||||||
ch -= (atImportant >= Math.max(0, ch - '!important'.length)) ? '!important'.length : 0;
|
ch -= (atImportant >= Math.max(0, ch - '!important'.length)) ? '!important'.length : 0;
|
||||||
const lineCache = this.cm.state.colorpicker.cache.get(lineText);
|
const lineCache = this.cm.state.colorpicker.cache.get(lineText);
|
||||||
const data = {line, ch, colorValue: color, isShortCut: true};
|
const data = {line, ch, colorValue: color, isShortCut: true};
|
||||||
for (const [start, {color, colorValue = color}] of lineCache && lineCache.entries() || []) {
|
for (const [start, {color, colorValue = color}] of lineCache && lineCache.entries() || []) {
|
||||||
if (start <= ch && ch <= start + color.length) {
|
if (start <= ch && ch <= start + color.length) {
|
||||||
Object.assign(data, {ch: start, color, colorValue});
|
Object.assign(data, {ch: start, color, colorValue});
|
||||||
break;
|
this.openPopupForToken({colorpickerData: data});
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Object.assign(data, parseColorAtCursor(lineText, lineTextLC, ch));
|
||||||
this.openPopupForToken({colorpickerData: data});
|
this.openPopupForToken({colorpickerData: data});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user