Skip to content

Commit

Permalink
feat: add basic-setup extensions.
Browse files Browse the repository at this point in the history
  • Loading branch information
jaywcjlove committed Jul 12, 2022
1 parent 95f6021 commit 54ab8af
Show file tree
Hide file tree
Showing 16 changed files with 332 additions and 58 deletions.
3 changes: 2 additions & 1 deletion core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,9 @@
"react-dom": ">=16.8.0"
},
"dependencies": {
"@babel/runtime": ">=7.11.0",
"@babel/runtime": "^7.18.6",
"@codemirror/theme-one-dark": "^6.0.0",
"@uiw/codemirror-extensions-basic-setup": "^4.11.1",
"codemirror": "^6.0.0"
},
"keywords": [
Expand Down
4 changes: 2 additions & 2 deletions core/src/index.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import React, { useRef, forwardRef, useImperativeHandle } from 'react';
import { EditorState, EditorStateConfig, Extension } from '@codemirror/state';
import { EditorView, ViewUpdate } from '@codemirror/view';
import { BasicSetupOptions } from '@uiw/codemirror-extensions-basic-setup';
import { useCodeMirror } from './useCodeMirror';
import { Statistics } from './utils';
import { BasicSetupOptions } from './basicSetup';

export * from './basicSetup';
export * from '@uiw/codemirror-extensions-basic-setup';
export * from './useCodeMirror';
export * from './utils';

Expand Down
2 changes: 1 addition & 1 deletion core/src/useCodeMirror.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ import { useEffect, useState } from 'react';
import { EditorState, StateEffect } from '@codemirror/state';
import { indentWithTab } from '@codemirror/commands';
import { EditorView, keymap, ViewUpdate, placeholder } from '@codemirror/view';
import { basicSetup } from '@uiw/codemirror-extensions-basic-setup';
import { oneDark } from '@codemirror/theme-one-dark';
import { basicSetup } from './basicSetup';
import { getStatistics } from './utils';
import { ReactCodeMirrorProps } from '.';

Expand Down
180 changes: 180 additions & 0 deletions extensions/basic-setup/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,180 @@
<!--rehype:ignore:start-->

# Basic Setup Extensions

<!--rehype:ignore:end-->

[![npm version](https://img.shields.io/npm/v/@uiw/codemirror-extensions-basic-setup.svg)](https://www.npmjs.com/package/@uiw/codemirror-extensions-basic-setup)

Basic configuration for the CodeMirror6 code editor. This is the official [basic-setup](https://github.com/codemirror/basic-setup) package fork, making configuration optional.

## Install

```bash
npm install @uiw/codemirror-extensions-basic-setup --save
```

## Usage

⚠️ Integrated into **@uiw/react-codemirror** package

```jsx
import CodeMirror from '@uiw/react-codemirror';

function App() {
return (
<CodeMirror
value="console.log('hello world!');"
height="200px"
basicSetup={{
foldGutter: false,
dropCursor: false,
allowMultipleSelections: false,
indentOnInput: false,
}}
/>
);
}
export default App;
```

```js
import { EditorView } from '@codemirror/view';
import { EditorState } from '@codemirror/state';
import { basicSetup, minimalSetup } from '@uiw/codemirror-extensions-basic-setup';

const state = EditorState.create({
doc: 'my source code',
extensions: [
basicSetup({
foldGutter: false,
dropCursor: false,
allowMultipleSelections: false,
indentOnInput: false,
}),
],
});

const view = new EditorView({
parent: document.querySelector('#editor'),
state,
});
```

```diff
import { EditorView } from '@codemirror/view';
import { EditorState } from '@codemirror/state';
- import { basicSetup, minimalSetup } from 'codemirror';
+ import { basicSetup, minimalSetup } from '@uiw/codemirror-extensions-basic-setup';

const state = EditorState.create({
doc: 'my source code',
extensions: [
- basicSetup
+ basicSetup({
+ foldGutter: false,
+ dropCursor: false,
+ })
],
});

const view = new EditorView({
parent: document.querySelector('#editor'),
state,
});
```

## API

```ts
import { Extension } from '@codemirror/state';
export interface BasicSetupOptions extends MinimalSetupOptions {
lineNumbers?: boolean;
highlightActiveLineGutter?: boolean;
foldGutter?: boolean;
dropCursor?: boolean;
allowMultipleSelections?: boolean;
indentOnInput?: boolean;
bracketMatching?: boolean;
closeBrackets?: boolean;
autocompletion?: boolean;
rectangularSelection?: boolean;
crosshairCursor?: boolean;
highlightActiveLine?: boolean;
highlightSelectionMatches?: boolean;
closeBracketsKeymap?: boolean;
searchKeymap?: boolean;
foldKeymap?: boolean;
completionKeymap?: boolean;
lintKeymap?: boolean;
}
/**
This is an extension value that just pulls together a number of
extensions that you might want in a basic editor. It is meant as a
convenient helper to quickly set up CodeMirror without installing
and importing a lot of separate packages.
Specifically, it includes...
- [the default command bindings](https://codemirror.net/6/docs/ref/#commands.defaultKeymap)
- [line numbers](https://codemirror.net/6/docs/ref/#view.lineNumbers)
- [special character highlighting](https://codemirror.net/6/docs/ref/#view.highlightSpecialChars)
- [the undo history](https://codemirror.net/6/docs/ref/#commands.history)
- [a fold gutter](https://codemirror.net/6/docs/ref/#language.foldGutter)
- [custom selection drawing](https://codemirror.net/6/docs/ref/#view.drawSelection)
- [drop cursor](https://codemirror.net/6/docs/ref/#view.dropCursor)
- [multiple selections](https://codemirror.net/6/docs/ref/#state.EditorState^allowMultipleSelections)
- [reindentation on input](https://codemirror.net/6/docs/ref/#language.indentOnInput)
- [the default highlight style](https://codemirror.net/6/docs/ref/#language.defaultHighlightStyle) (as fallback)
- [bracket matching](https://codemirror.net/6/docs/ref/#language.bracketMatching)
- [bracket closing](https://codemirror.net/6/docs/ref/#autocomplete.closeBrackets)
- [autocompletion](https://codemirror.net/6/docs/ref/#autocomplete.autocompletion)
- [rectangular selection](https://codemirror.net/6/docs/ref/#view.rectangularSelection) and [crosshair cursor](https://codemirror.net/6/docs/ref/#view.crosshairCursor)
- [active line highlighting](https://codemirror.net/6/docs/ref/#view.highlightActiveLine)
- [active line gutter highlighting](https://codemirror.net/6/docs/ref/#view.highlightActiveLineGutter)
- [selection match highlighting](https://codemirror.net/6/docs/ref/#search.highlightSelectionMatches)
- [search](https://codemirror.net/6/docs/ref/#search.searchKeymap)
- [linting](https://codemirror.net/6/docs/ref/#lint.lintKeymap)
(You'll probably want to add some language package to your setup
too.)
This extension does not allow customization. The idea is that,
once you decide you want to configure your editor more precisely,
you take this package's source (which is just a bunch of imports
and an array literal), copy it into your own code, and adjust it
as desired.
*/
export declare const basicSetup: (options?: BasicSetupOptions) => Extension[];
export interface MinimalSetupOptions {
highlightSpecialChars?: boolean;
history?: boolean;
drawSelection?: boolean;
syntaxHighlighting?: boolean;
defaultKeymap?: boolean;
historyKeymap?: boolean;
}
/**
A minimal set of extensions to create a functional editor. Only
includes [the default keymap](https://codemirror.net/6/docs/ref/#commands.defaultKeymap), [undo
history](https://codemirror.net/6/docs/ref/#commands.history), [special character
highlighting](https://codemirror.net/6/docs/ref/#view.highlightSpecialChars), [custom selection
drawing](https://codemirror.net/6/docs/ref/#view.drawSelection), and [default highlight
style](https://codemirror.net/6/docs/ref/#language.defaultHighlightStyle).
*/
export declare const minimalSetup: (options?: MinimalSetupOptions) => Extension[];
```

## Contributors

As always, thanks to our amazing contributors!

<a href="https://github.com/uiwjs/react-codemirror/graphs/contributors">
<img src="https://uiwjs.github.io/react-codemirror/CONTRIBUTORS.svg" />
</a>

Made with [github-action-contributors](https://github.com/jaywcjlove/github-action-contributors).

## License

Licensed under the MIT License.
55 changes: 55 additions & 0 deletions extensions/basic-setup/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
{
"name": "@uiw/codemirror-extensions-basic-setup",
"version": "4.11.1",
"description": "Basic configuration for the CodeMirror6 code editor.",
"homepage": "https://uiwjs.github.io/react-codemirror/#/extensions/basic-setup",
"author": "kenny wong <wowohoo@qq.com>",
"license": "MIT",
"main": "./cjs/index.js",
"module": "./esm/index.js",
"scripts": {
"watch": "tsbb watch",
"build": "tsbb build"
},
"repository": {
"type": "git",
"url": "https://github.com/uiwjs/react-codemirror.git"
},
"files": [
"src",
"esm",
"cjs"
],
"peerDependencies": {
"@codemirror/autocomplete": ">=6.0.0",
"@codemirror/commands": ">=6.0.0",
"@codemirror/language": ">=6.0.0",
"@codemirror/lint": ">=6.0.0",
"@codemirror/search": ">=6.0.0",
"@codemirror/state": ">=6.0.0",
"@codemirror/view": ">=6.0.0"
},
"dependencies": {
"@codemirror/autocomplete": "^6.0.0",
"@codemirror/commands": "^6.0.0",
"@codemirror/language": "^6.0.0",
"@codemirror/lint": "^6.0.0",
"@codemirror/search": "^6.0.0",
"@codemirror/state": "^6.0.0",
"@codemirror/view": "^6.0.0"
},
"keywords": [
"codemirror",
"codemirror6",
"basic-setup",
"extensions",
"ide",
"code"
],
"jest": {
"coverageReporters": [
"lcov",
"json-summary"
]
}
}
62 changes: 46 additions & 16 deletions core/src/basicSetup.ts → extensions/basic-setup/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,19 +22,16 @@ import {
bracketMatching,
foldKeymap,
} from '@codemirror/language';

import { lintKeymap } from '@codemirror/lint';

export interface BasicSetupOptions {
export interface BasicSetupOptions extends MinimalSetupOptions {
lineNumbers?: boolean;
highlightActiveLineGutter?: boolean;
highlightSpecialChars?: boolean;
history?: boolean;
foldGutter?: boolean;
drawSelection?: boolean;
dropCursor?: boolean;
allowMultipleSelections?: boolean;
indentOnInput?: boolean;
syntaxHighlighting?: boolean;
bracketMatching?: boolean;
closeBrackets?: boolean;
autocompletion?: boolean;
Expand All @@ -44,9 +41,7 @@ export interface BasicSetupOptions {
highlightSelectionMatches?: boolean;

closeBracketsKeymap?: boolean;
defaultKeymap?: boolean;
searchKeymap?: boolean;
historyKeymap?: boolean;
foldKeymap?: boolean;
completionKeymap?: boolean;
lintKeymap?: boolean;
Expand Down Expand Up @@ -90,27 +85,27 @@ and an array literal), copy it into your own code, and adjust it
as desired.
*/
export const basicSetup = (options: BasicSetupOptions = {}): Extension[] => {
const keymaps: KeyBinding[][] = [];
let keymaps: KeyBinding[] = [];
if (options.closeBracketsKeymap !== false) {
keymaps.push([...closeBracketsKeymap]);
keymaps = keymaps.concat(closeBracketsKeymap);
}
if (options.defaultKeymap !== false) {
keymaps.push([...defaultKeymap]);
keymaps = keymaps.concat(defaultKeymap);
}
if (options.searchKeymap !== false) {
keymaps.push([...searchKeymap]);
keymaps = keymaps.concat(searchKeymap);
}
if (options.historyKeymap !== false) {
keymaps.push([...historyKeymap]);
keymaps = keymaps.concat(historyKeymap);
}
if (options.foldKeymap !== false) {
keymaps.push([...foldKeymap]);
keymaps = keymaps.concat(foldKeymap);
}
if (options.completionKeymap !== false) {
keymaps.push([...completionKeymap]);
keymaps = keymaps.concat(completionKeymap);
}
if (options.lintKeymap !== false) {
keymaps.push([...lintKeymap]);
keymaps = keymaps.concat(lintKeymap);
}
const extensions: Extension[] = [];
if (options.lineNumbers !== false) extensions.push(lineNumbers());
Expand All @@ -132,5 +127,40 @@ export const basicSetup = (options: BasicSetupOptions = {}): Extension[] => {
if (options.highlightActiveLine !== false) extensions.push(highlightActiveLine());
if (options.highlightSelectionMatches !== false) extensions.push(highlightSelectionMatches());

return [...extensions, keymap.of(keymaps.flat())].filter(Boolean);
return extensions.concat([keymap.of(keymaps.flat())]).filter(Boolean);
};

export interface MinimalSetupOptions {
highlightSpecialChars?: boolean;
history?: boolean;
drawSelection?: boolean;
syntaxHighlighting?: boolean;

defaultKeymap?: boolean;
historyKeymap?: boolean;
}

/**
A minimal set of extensions to create a functional editor. Only
includes [the default keymap](https://codemirror.net/6/docs/ref/#commands.defaultKeymap), [undo
history](https://codemirror.net/6/docs/ref/#commands.history), [special character
highlighting](https://codemirror.net/6/docs/ref/#view.highlightSpecialChars), [custom selection
drawing](https://codemirror.net/6/docs/ref/#view.drawSelection), and [default highlight
style](https://codemirror.net/6/docs/ref/#language.defaultHighlightStyle).
*/
export const minimalSetup = (options: MinimalSetupOptions = {}) => {
let keymaps: KeyBinding[] = [];
if (options.defaultKeymap !== false) {
keymaps = keymaps.concat(defaultKeymap);
}
if (options.historyKeymap !== false) {
keymaps = keymaps.concat(historyKeymap);
}
const extensions: Extension[] = [];
if (options.highlightSpecialChars !== false) extensions.push(highlightSpecialChars());
if (options.history !== false) extensions.push(history());
if (options.drawSelection !== false) extensions.push(drawSelection());
if (options.syntaxHighlighting !== false)
extensions.push(syntaxHighlighting(defaultHighlightStyle, { fallback: true }));
return extensions.concat([keymap.of(keymaps.flat())]).filter(Boolean);
};
9 changes: 9 additions & 0 deletions extensions/basic-setup/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"extends": "../../tsconfig",
"include": ["src"],
"compilerOptions": {
"outDir": "./cjs",
"baseUrl": ".",
"noEmit": false
}
}

0 comments on commit 54ab8af

Please sign in to comment.