[mod] re-org

This commit is contained in:
Andy Bunce 2025-08-06 14:57:52 +01:00
parent 198bd66c09
commit 784010fbdc
32 changed files with 114 additions and 14 deletions

85
bundles/src/lsp.js Normal file
View file

@ -0,0 +1,85 @@
import { EditorState } from '@codemirror/state';
import { openSearchPanel, highlightSelectionMatches,searchKeymap } from '@codemirror/search';
import {openLintPanel, lintGutter, lintKeymap} from "@codemirror/lint"
import { indentWithTab, history, defaultKeymap, historyKeymap } from '@codemirror/commands';
import { foldGutter, indentOnInput, indentUnit, bracketMatching, foldKeymap, syntaxHighlighting, defaultHighlightStyle } from '@codemirror/language';
import { closeBrackets, autocompletion, closeBracketsKeymap, completionKeymap } from '@codemirror/autocomplete';
import { lineNumbers, highlightActiveLineGutter, highlightSpecialChars, drawSelection, dropCursor, rectangularSelection, crosshairCursor, highlightActiveLine, keymap, EditorView } from '@codemirror/view';
import {markdown} from "@codemirror/lang-markdown";
// Theme
import { oneDark } from "@codemirror/theme-one-dark";
import { LSPClient, languageServerSupport } from "@codemirror/lsp-client";
// Language
import { xml } from "@codemirror/lang-xml";
// no error checking
function simpleWebSocketTransport(uri) {
let handlers = [];
let sock = new WebSocket(uri);
sock.addEventListener("close", (event) => { alert("sock gone!")})
sock.addEventListener("error", (event) => { alert("sock error!")})
sock.onmessage = e => { for (let h of handlers) h(e.data.toString()); };
return new Promise(resolve => {
sock.onopen = () => resolve({
send: (message) => sock.send(message),
subscribe: (handler) => handlers.push(handler),
unsubscribe: (handler) => handlers = handlers.filter(h => h != handler)
});
});
};
function lsp(transport,fileId){
let client = new LSPClient().connect(transport);
return languageServerSupport(client, fileId);
};
const baseExts = [
lineNumbers(),
highlightActiveLineGutter(),
highlightSpecialChars(),
history(),
foldGutter(),
lintGutter(),
drawSelection(),
indentUnit.of(" "),
EditorState.allowMultipleSelections.of(true),
EditorView.lineWrapping,
indentOnInput(),
bracketMatching(),
closeBrackets(),
autocompletion(),
rectangularSelection(),
crosshairCursor(),
highlightActiveLine(),
highlightSelectionMatches(),
keymap.of([
indentWithTab,
...closeBracketsKeymap,
...defaultKeymap,
...historyKeymap,
...foldKeymap,
...completionKeymap,
...searchKeymap,
...lintKeymap
]),
xml(),
syntaxHighlighting(defaultHighlightStyle, { fallback: true })
];
function createEditorState(initialContents, extensions,options = {}) {
if (options.oneDark)
extensions.push(oneDark);
return EditorState.create({
doc: initialContents,
extensions
});
}
function createEditorView(state, parent) {
return new EditorView({ state, parent });
}
export { createEditorState, createEditorView, openSearchPanel,openLintPanel, languageServerSupport, baseExts ,lsp, simpleWebSocketTransport};

View file

@ -0,0 +1,28 @@
import * as aceBuilds from 'https://esm.run/ace-builds';
import ace from 'https://cdn.jsdelivr.net/npm/ace/+esm'
/* import 'ace-builds/src-noconflict/mode-javascript';
import 'ace-builds/src-noconflict/theme-chrome'; */
/* import {AceLanguageClient} from "ace-linters/build/ace-language-client";
const serverData = {
module: () => import("ace-linters/build/language-client"),
modes: "json|json5",
type: "socket",
socket: new WebSocket("ws://127.0.0.1:3000/ws/lsp"), // your websocket server address
}
*/
// Initialize the editor
const editor = ace.edit("editor", {
theme: "ace/theme/chrome",
mode: "ace/mode/javascript",
fontSize: "14px",
showPrintMargin: false,
useWorker: false // Disable web worker for this simple demo
});
// Create a language provider for WebSocket
//let languageProvider = AceLanguageClient.for(serverData);
//languageProvider.registerEditor(editor);

View file

@ -0,0 +1,44 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<title>BaseX LSP</title>
<script src="https://www.unpkg.com/ace-builds@latest/src-noconflict/ace.js"></script>
<script src="https://www.unpkg.com/ace-builds@latest/src-noconflict/ext-language_tools.js"></script>
<script src="https://www.unpkg.com/ace-linters@latest/build/ace-linters.js"></script>
<script src="https://www.unpkg.com/ace-linters@latest/build/ace-language-client.js"></script>
</head>
<body>
<div>something</div>
<div id="editor" style="height: 100px">some text</div>
<script>
let servers = [
{
module: () => import("ace-linters/build/language-client"),
modes: "astro",
type: "socket",
socket: new WebSocket("ws://127.0.0.1:8080/ws/lsp"
//"ws://127.0.0.1:3000/exampleserver"
),
}
];
let languageProvider = AceLanguageClient.for(servers);
ace.require("ace/ext/language_tools"); //To allow autocompletion
var editor = ace.edit("editor", {
enableBasicAutocompletion: true,
enableLiveAutocompletion: true,
mode: "ace/mode/json"
});
languageProvider.registerEditor(editor);
editor.session.setMode("astro"); // mode now contains "ace/mode/javascript".
</script>
</body>
</html>

View file

@ -0,0 +1,39 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Editor</title>
<style type="text/css" media="screen">
body {
overflow: hidden;
}
#editor {
margin: 0;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
}
</style>
</head>
<body>
<pre id="editor">function foo(items) {
var i;
for (i = 0; i &lt; items.length; i++) {
alert("Ace Rocks " + items[i]);
}
}</pre>
<script src="src-noconflict/ace.js" type="text/javascript" charset="utf-8"></script>
<script>
var editor = ace.edit("editor");
editor.setTheme("ace/theme/twilight");
editor.session.setMode("ace/mode/javascript");
</script>
</body>
</html>

View file

@ -0,0 +1,3 @@
REM default port 5008
REM https://download.eclipse.org/lemminx/releases/0.31.0/
java -cp org.eclipse.lemminx-uber.jar org.eclipse.lemminx.XMLServerSocketLauncher

View file

@ -0,0 +1,72 @@
(:~ web socket for ace
:)
module namespace lsp="urn:quodatum:vscode";
import module namespace ws = "http://basex.org/modules/ws";
declare
%ws:connect('/ws/exampleServer')
function lsp:connect()
as empty-sequence(){
let $_:=trace(ws:id(),"BaseX socket id: ")
return ()
};
(:~
: Processes a WebSocket message.
: @param $message message
:)
declare
%ws:message('/ws/exampleServer', '{$message}')
function lsp:message(
$message as xs:string
) as empty-sequence() {
let $json:=json:parse($message, map{ 'format': 'xquery' })
let $id:=$json?id
let $_:=trace($id,"MESSAGE id: ")
return switch($json?method=>trace("method: "))
case "initialize" return
let $a:=map{
"capabilities":map{"textDocumentSync":2,
"completionProvider":map{"resolveProvider":false(),"triggerCharacters":["\",":"]},
"hoverProvider":true(),
"documentSymbolProvider":true(),
"documentRangeFormattingProvider":false(),
"colorProvider":map{},
"foldingRangeProvider":true(),
"selectionRangeProvider":true(),
"documentLinkProvider":map{}
}
}
let $a:=trace($a,"A: ")
return lsp:send-result($a,$id,ws:id())
default
return error()
};
declare %ws:error('/ws/exampleServer', '{$error}')
function lsp:error($error)
{
let $_:=trace($error,"ERROR ")
return ()
};
(:~
: Closes a WebSocket connection. Unregisters the user and notifies all clients.
:)
declare
%ws:close('/ws/exampleServer')
function lsp:close() as empty-sequence() {
let $_:=trace("CLOSE")
return ()
};
declare
function lsp:send-result($result as map(*),$rpcId as xs:string, $wsId as xs:string)
as empty-sequence()
{
let $json:=map{"jsonrpc":"2.0","id":$rpcId,"result":$result}=>trace("RESULT: ")
return ws:send($json,$wsId)
};

Binary file not shown.

View file

@ -0,0 +1,4 @@
<script>
const webSocket = new WebSocket("ws://localhost:5008");
alert("hi");
</script>