forked from hoppscotch/hoppscotch
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: introduce graphql mode for codemirror
- Loading branch information
1 parent
41a02f0
commit 003400c
Showing
4 changed files
with
85 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
/** | ||
* Copyright (c) 2021 GraphQL Contributors | ||
* All rights reserved. | ||
* | ||
* This source code is licensed under the BSD-style license found in the | ||
* LICENSE file in the root directory of this source tree. An additional grant | ||
* of patent rights can be found in the PATENTS file in the same directory. | ||
*/ | ||
|
||
import CodeMirror from "codemirror" | ||
import { | ||
LexRules, | ||
ParseRules, | ||
isIgnored, | ||
onlineParser, | ||
State, | ||
} from "graphql-language-service-parser" | ||
|
||
/** | ||
* The GraphQL mode is defined as a tokenizer along with a list of rules, each | ||
* of which is either a function or an array. | ||
* | ||
* * Function: Provided a token and the stream, returns an expected next step. | ||
* * Array: A list of steps to take in order. | ||
* | ||
* A step is either another rule, or a terminal description of a token. If it | ||
* is a rule, that rule is pushed onto the stack and the parsing continues from | ||
* that point. | ||
* | ||
* If it is a terminal description, the token is checked against it using a | ||
* `match` function. If the match is successful, the token is colored and the | ||
* rule is stepped forward. If the match is unsuccessful, the remainder of the | ||
* rule is skipped and the previous rule is advanced. | ||
* | ||
* This parsing algorithm allows for incremental online parsing within various | ||
* levels of the syntax tree and results in a structured `state` linked-list | ||
* which contains the relevant information to produce valuable typeaheads. | ||
*/ | ||
CodeMirror.defineMode("graphql", (config) => { | ||
const parser = onlineParser({ | ||
eatWhitespace: (stream) => stream.eatWhile(isIgnored), | ||
lexRules: LexRules, | ||
parseRules: ParseRules, | ||
editorConfig: { tabSize: 2 }, | ||
}) | ||
|
||
return { | ||
config, | ||
startState: parser.startState, | ||
token: parser.token as unknown as CodeMirror.Mode<any>["token"], // TODO: Check if the types are indeed compatible | ||
indent, | ||
electricInput: /^\s*[})\]]/, | ||
fold: "brace", | ||
lineComment: "#", | ||
closeBrackets: { | ||
pairs: '()[]{}""', | ||
explode: "()[]{}", | ||
}, | ||
} | ||
}) | ||
|
||
// Seems the electricInput type in @types/codemirror is wrong (i.e it is written as electricinput instead of electricInput) | ||
function indent( | ||
this: CodeMirror.Mode<any> & { | ||
electricInput?: RegExp | ||
config?: CodeMirror.EditorConfiguration | ||
}, | ||
state: State, | ||
textAfter: string | ||
) { | ||
const levels = state.levels | ||
// If there is no stack of levels, use the current level. | ||
// Otherwise, use the top level, pre-emptively dedenting for close braces. | ||
const level = | ||
!levels || levels.length === 0 | ||
? state.indentLevel | ||
: levels[levels.length - 1] - | ||
(this.electricInput?.test(textAfter) ? 1 : 0) | ||
return (level || 0) * (this.config?.indentUnit || 0) | ||
} |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters