Comments (5)
should fix the issue raised in the PR #18 regarding the problem of escaping the html characters.
from codemirror-promql.
fuse.js is a bit weird of how it is matching the element. From my test, the string su
is matching group
.
It's not really a big issue, this lib is a bit more permissive than the other one.
from codemirror-promql.
Looks like the algo is testing every possible combination.
Not sure we want that after all. Or maybe there is an option to avoid that, but so far I didn't find it. Any thoughts on this @juliusv ?
In case someone find how to do a better matching and want to fix the issue, here is the filter method I coded for this purpose:
const fuzzyOption = {
includeScore: true,
includeMatches: true,
findAllMatches: false,
};
export class HybridComplete implements CompleteStrategy {
private filter(
label: string,
text: string,
apply: string | ((view: EditorView, result: CompletionResult, completion: Completion) => void),
context: AutocompleteContext,
type?: string
): Completion | null {
if (context.filterType !== FilterType.Fuzzy) {
// in case the fuzzy filtering is not used, then use the filter method coming from CMN
let score: number | null;
if ((score = context.filter(label, text, false))) {
return { label: escape(label), apply: apply, type: type, score: score };
}
}
const fuse = new Fuse([label], fuzzyOption);
const result = fuse.search(text);
if (!result || result.length === 0) {
return null;
}
const matches = result[0].matches;
if (!matches) {
// weird case, shouldn't happen regarding the fuzzy option set
return null;
}
// in case fuzzyPre and fuzzyPost option are not set, then there is nothing to do to highlight the string matched
if (this.fuzzyPre.length === 0 || this.fuzzyPost.length === 0) {
return { label: escape(label), apply: apply, type: type, score: result[0].score || 0 };
}
// otherwise we have to loop other the different match item and replace it one by one
if (matches.length > 1) {
// for the moment no idea what do to when there is multiple matches
// so far, when playing with the lib, it always returns one result for an array of string
return null;
}
let finalLabel = label;
let shift = 0;
let startIndex = 0;
let endIndex = 0;
for (const idx of matches[0].indices) {
// move to the next substring matched
startIndex = shift + idx[0];
endIndex = startIndex + idx[1] - idx[0];
let sub = label.substr(idx[0], idx[1] - idx[0] + 1);
sub = this.fuzzyPre + escape(sub) + this.fuzzyPost;
finalLabel = finalLabel.substring(0, startIndex) + sub + finalLabel.substring(endIndex + 1);
shift = shift + sub.length - label.substr(idx[0], idx[1] - idx[0] + 1).length;
}
return { label: finalLabel, apply: apply, type: type, score: result[0].score ? 1 - result[0].score : 0 };
}
}
Note: it's not finished. The only thing remains is to escape the substring between two substring that should be highlighted
from codemirror-promql.
Hm yeah, I didn't find an option (immediately) to turn off that over-zealous matching either. We definitely don't want that, I think. Otherwise an approach like this could be interesting.
from codemirror-promql.
lib will be replaced by https://github.com/Nexucis/fuzzy instead
from codemirror-promql.
Related Issues (20)
- Weird behavior when using enricher to autocomplete query history HOT 2
- No autocomplete for the 2nd hard of subquery time selector HOT 1
- Support negative offset HOT 12
- Add the parameters of the function indescription HOT 2
- PromQL autocomplete: impossible to get full labels list after comma HOT 5
- Have a way to warm the cache
- Remove strict node requirement HOT 11
- Support autocompleting NaN and Inf HOT 1
- A valid expression is underlined HOT 1
- Support variable format HOT 4
- Cannot parse metrics beginning with `inf` HOT 2
- fetch series with POST not allowed by Grafana
- How to make the editor read only? HOT 2
- How to override the `apiPrefix` HOT 5
- Version 17 The api that a package depends on does not exist HOT 4
- Update codemirror dependencies to v0.19 HOT 2
- autocomplete stops working after setting initial metric list HOT 1
- autocompletion is calling /metadata instead of /labels and /series HOT 8
- Update to Codemirror 0.20.X HOT 9
- how can I config gutter? HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from codemirror-promql.