Skip to content

Commit 5f46560

Browse files
committed
fix cursor pos for evalCell
1 parent 8675b46 commit 5f46560

File tree

4 files changed

+306
-345
lines changed

4 files changed

+306
-345
lines changed

dist/assets/index-7592d1ba.js renamed to dist/assets/index-923f4b52.js

Lines changed: 291 additions & 291 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<link rel="icon" type="image/svg+xml" href="/lang-clojure-eval/assets/vite-4a748afd.svg" />
66
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
77
<title>Vite App</title>
8-
<script type="module" crossorigin src="/lang-clojure-eval/assets/index-7592d1ba.js"></script>
8+
<script type="module" crossorigin src="/lang-clojure-eval/assets/index-923f4b52.js"></script>
99
<link rel="stylesheet" href="/lang-clojure-eval/assets/index-b488241e.css">
1010
</head>
1111
<body>

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "lang-clojure-eval",
3-
"version": "0.0.17",
3+
"version": "0.0.18",
44
"author": "Bobbi Towers <[email protected]>",
55
"description": "Lezer-based Clojure Codemirror 6 extension with live evaluation",
66
"main": "dist/index.cjs",

src/eval-region.js

Lines changed: 13 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -5,80 +5,40 @@ import {props} from "@nextjournal/lezer-clojure"
55
import {evalString} from "./sci"
66
import {NodeProp} from "@lezer/common"
77

8-
// Node props are marked in the grammar and distinguish categories of nodes
9-
10-
// primitive collection
11-
const collProp = props.coll
12-
// prefix collection - a prefix token that wraps the next element
13-
const prefixCollProp = props.prefixColl
14-
// the prefix edge itself
15-
const prefixEdgeProp = props.prefixEdge
16-
// prefix form - pair of [metadata, target]
17-
const prefixContainerProp = props.prefixContainer
18-
// edges at the beginning/end of collections, + "same" edges (string quotes)
19-
const startEdgeProp = NodeProp.closedBy
20-
const endEdgeProp = NodeProp.openedBy
21-
const sameEdgeProp = props.sameEdge
228
const up = (node) => node.parent;
239
const isTopType = (nodeType) => nodeType.isTop
2410
const isTop = (node) => isTopType(node.type)
2511
const mainSelection = (state) => state.selection.asSingle().ranges[0]
26-
27-
function tree(state, pos, dir) {
28-
switch (arguments["length"]) {
29-
case 1:
30-
return syntaxTree(state);
31-
case 2:
32-
return syntaxTree(state).resolveInner(pos);
33-
case 3:
34-
return syntaxTree(state).resolveInner(pos, dir);
35-
}
36-
}
37-
12+
const tree = (state, pos, dir) => syntaxTree(state).resolveInner(pos, dir)
3813
const nearestTouching = (state, pos) => tree(state, pos, -1)
3914

40-
const isTerminalType = (nodeType) => {
41-
if (isTopType(nodeType || nodeType.prefixCollProp.prop() ||
42-
nodeType.collProp.prop() || nodeType.name == "Meta" ||
43-
nodeType.name == "TaggedLiteral" || nodeType.name == "ConstructorCall")) {
44-
return false
45-
} else {
46-
return true
47-
}
48-
}
49-
5015
const children = (parent, from, dir) => {
5116
let child = parent.childBefore(from)
5217
return children(parent, child.from).unshift(child)
5318
}
5419

55-
function parents(node, p) {
20+
const parents = (node, p) => {
5621
if (isTop(node)) return p;
57-
return parents(up(node), p.concat(node));
22+
return parents(up(node), p.concat(node))
5823
}
5924

6025
const rangeStr = (state, selection) => state.doc.slice(selection.from, selection.to).toString()
6126

6227
// Return node or its highest parent that ends at the cursor position
63-
function uppermostEdge(pos, node) {
28+
const uppermostEdge = (pos, node) => {
6429
const p = parents(node, []).filter(n => pos == n.to && pos == node.to);
6530
return p[p.length - 1] || node
6631
}
6732

68-
function isTerminal(node, pos) {
69-
return isTerminalType(node.type) ||
70-
pos === node.from || pos === node.to
71-
}
72-
73-
function nodeAtCursor(state) {
33+
const nodeAtCursor = (state) => {
7434
const pos = mainSelection(state).from
7535
const n = nearestTouching(state, pos)
7636
return uppermostEdge(pos, n)
7737
}
7838

7939
let posAtFormEnd = 0
8040

81-
function topLevelNode(state) {
41+
const topLevelNode = (state) => {
8242
const pos = mainSelection(state).from
8343
const p = parents(nearestTouching(state, pos), [])
8444
if (p.length === 0) {
@@ -95,7 +55,7 @@ let evalResult = ""
9555
let codeBeforeEval = ""
9656
let posBeforeEval = 0
9757

98-
function updateEditor(view, text, pos) {
58+
const updateEditor = (view, text, pos) => {
9959
const doc = view.state.doc.toString()
10060
codeBeforeEval = doc
10161
const end = doc.length
@@ -107,14 +67,14 @@ function updateEditor(view, text, pos) {
10767

10868
export function tryEval(s) {
10969
try {
110-
return evalString(s)
70+
return evalString(s).trimEnd()
11171
} catch (err) {
11272
console.log(err)
11373
return "\nError: " + err.message
11474
}
11575
}
11676

117-
function evalAtCursor(view) {
77+
const evalAtCursor = (view) => {
11878
const doc = view.state.doc.toString()
11979
codeBeforeEval = doc
12080
posBeforeEval = view.state.selection.main.head
@@ -127,14 +87,14 @@ function evalAtCursor(view) {
12787
return true
12888
}
12989

130-
function clearEval(view) {
90+
const clearEval = (view) => {
13191
if (evalResult.length != 0) {
13292
evalResult = ""
13393
updateEditor(view, codeBeforeEval, posBeforeEval)
13494
}
13595
}
13696

137-
function evalTopLevel(view) {
97+
const evalTopLevel = (view) => {
13898
posAtFormEnd = topLevelNode(view.state).to
13999
const doc = view.state.doc.toString()
140100
posBeforeEval = view.state.selection.main.head
@@ -147,8 +107,9 @@ function evalTopLevel(view) {
147107
return true
148108
}
149109

150-
function evalCell(view) {
110+
const evalCell = (view) => {
151111
const doc = view.state.doc.toString()
112+
posBeforeEval = view.state.selection.main.head
152113
evalResult = tryEval(view.state.doc.text.join(" "))
153114
const codeWithResult = doc + "\n" + " => " + evalResult
154115
updateEditor(view, codeWithResult, posBeforeEval)

0 commit comments

Comments
 (0)