[add] connection state

This commit is contained in:
Andy Bunce 2025-08-22 15:22:31 +01:00
parent b7d0d8e03d
commit e32ff3d77a
8 changed files with 81 additions and 28 deletions

View file

@ -1,5 +1,5 @@
declare base-uri "../.."; declare base-uri "../..";
import module namespace xq4="java:quodatum.parser.xq4"; import module namespace xq4="java:quodatum.parser.xq4";
(: "test/sample.docs/pdfbox.xqm"=>unparsed-text() :) (: "test/sample.docs/pdfbox.xqm"=>unparsed-text() :)
"2+4" ""
=>xq4:parseModule() =>xq4:parseModule()

View file

@ -12,7 +12,7 @@ import { LSPClient, LSPPlugin, languageServerSupport } from "@codemirror/lsp-cli
// Language // Language
import { xml } from "@codemirror/lang-xml"; import { xml } from "@codemirror/lang-xml";
// no error checking // return promise with socket map or reject if no connect
function simpleWebSocketTransport(uri) { function simpleWebSocketTransport(uri) {
let handlers = []; let handlers = [];
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {

View file

@ -1,5 +1,9 @@
import module namespace pos="lsp/position" at "../webapp/lsp/position.xqm"; import module namespace pos="lsp/position" at "../webapp/lsp/position.xqm";
import module namespace xq4="java:quodatum.parser.xq4";
let $text:="1+2 a" let $text:="1+2 a"
let $xml:=xq4:parseModule($text)=>trace("£ ")
return pos:toPosition($text,5) let $b:=number($xml/@b)-1
let $e:= number($xml/@e)-1
return (pos:toPosition($text,$b),
pos:toPosition($text, min(($e,string-length($text)-1))))

File diff suppressed because one or more lines are too long

View file

@ -6,6 +6,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Codemirror6 example using BaseX LSP</title> <title>Codemirror6 example using BaseX LSP</title>
<link rel="icon" type="image/png" href="../favicon.png" /> <link rel="icon" type="image/png" href="../favicon.png" />
<link href="../bootstrap@5.3.7.css" rel="stylesheet" <link href="../bootstrap@5.3.7.css" rel="stylesheet"
integrity="sha384-LN+7fdVzj6u52u30Kp6M/trliBMCMKTyK833zpbD+pXdCLuTusPj697FH4R/5mcr" crossorigin="anonymous"> integrity="sha384-LN+7fdVzj6u52u30Kp6M/trliBMCMKTyK833zpbD+pXdCLuTusPj697FH4R/5mcr" crossorigin="anonymous">
<link rel="stylesheet" href="styles.css" /> <link rel="stylesheet" href="styles.css" />
@ -17,12 +18,17 @@
<div class="container-fluid"> <div class="container-fluid">
<a class="navbar-brand">BaseX LSP client</a> <a class="navbar-brand">BaseX LSP client</a>
<a href="/dba/logs" target="dba">#</a> <a href="/dba/logs" target="dba">#</a>
<div class="btn-toolbar" role="toolbar" aria-label="Toolbar with button groups">
<form class="d-flex"> <button id="popcon" popovertarget="mypopover" class="btn btn-danger">
<span id="state">🔴</span> <i class="bi bi-router"></i>
<input id="iServer" type="text" value="ws://localhost:3000/ws/lsp2" style="width:25em" /> </button>
<div id="mypopover" popover>
<h2>Connect to LSP</h2>
<div id="state">🔴</div>
<input id="iServer" type="text" value="ws://localhost:3000/ws/lsp" style="width:25em" />
<button id="connect">connect</button> <button id="connect">connect</button>
</form> </div>
</div>
<div class="row"> <div class="row">
<div> <div>
<select id="language"> <select id="language">
@ -33,9 +39,27 @@
</select> </select>
<label for="file">File:</label> <label for="file">File:</label>
<input id="iFile" type="url" value="file:///some/file.xml" /> <input id="iFile" type="url" value="file:///some/file.xml" />
<button id="search">🔍</button>
<button id="lint">⚠️</button>
<button id="sync">🔄</button> <!-- <div class="btn-group mr-2" role="group" aria-label="First group">
<button type="button" class="btn btn-secondary">1</button>
<button type="button" class="btn btn-secondary">2</button>
<button type="button" class="btn btn-secondary">3</button>
<button type="button" class="btn btn-secondary">4</button>
</div> -->
<div class="btn-group btn-group-sm " role="group" aria-label="Second group">
<button id="search" type="button" class="btn btn-light"><i
class="bi bi-search"></i></button>
<button id="lint" type="button" class="btn btn-light"><i
class="bi bi-info-square"></i></button>
<button id="sync" type="button" class="btn btn-light">
<i class="bi bi-arrow-repeat"></i>
</button>
</div>
<div class="btn-group" role="group" aria-label="Third group">
<button type="button" class="btn btn-light"><i class="bi bi-justify-left"></i></button>
</div>
</div>
</div> </div>
</div> </div>
@ -49,15 +73,23 @@
<select id="load"> <select id="load">
<option selected value="">load..</option> <option selected value="">load..</option>
<optgroup label="XQuery3"> <optgroup label="XQuery3">
<option value="https://raw.githubusercontent.com/expkg-zone58/pdfbox/refs/heads/main/src/Pdfbox3.xqm">Pdfbox3.xqm</option> <option
<option value="https://raw.githubusercontent.com/Quodatum/xqdoca/refs/heads/master/src/main/lib/model.xqm">model.xqm</option> value="https://raw.githubusercontent.com/expkg-zone58/pdfbox/refs/heads/main/src/Pdfbox3.xqm">
Pdfbox3.xqm</option>
<option
value="https://raw.githubusercontent.com/Quodatum/xqdoca/refs/heads/master/src/main/lib/model.xqm">
model.xqm</option>
</optgroup> </optgroup>
<optgroup label="XQuery4"> <optgroup label="XQuery4">
<option value="https://git.quodatum.duckdns.org/quodatum/basex-lsp/raw/branch/main/webapp/lsp/lsp-text.xqm">lsp-text.xqm</option> <option
value="https://git.quodatum.duckdns.org/quodatum/basex-lsp/raw/branch/main/webapp/lsp/lsp-text.xqm">
lsp-text.xqm</option>
</optgroup> </optgroup>
<optgroup label="xpath"> <optgroup label="xpath">
<option value="https://raw.githubusercontent.com/dnovatchev/Articles/refs/heads/main/Generators/Code/generator.xpath">generator.xpath</option> <option
value="https://raw.githubusercontent.com/dnovatchev/Articles/refs/heads/main/Generators/Code/generator.xpath">
generator.xpath</option>
</optgroup> </optgroup>
</select> </select>

View file

@ -65,9 +65,10 @@ function connect() {
lsp.simpleWebSocketTransport(server) lsp.simpleWebSocketTransport(server)
.then(transport => { .then(transport => {
transport.subscribe(incoming); transport.subscribe(incoming);
transport.socket.onclose=(event) => $("msg").innerText="sock gone!"; transport.socket.onclose=(event) => connectStatus(false);
transport.socket.oneror=(event) => $("msg").innerText="sock error!"; transport.socket.oneror=(event) => $("msg").innerText="sock error!";
client = new lsp.LSPClient().connect(transport); client = new lsp.LSPClient().connect(transport);
connectStatus(true);
let extLsp=lsp.languageServerSupport(client,file,"xquery"); let extLsp=lsp.languageServerSupport(client,file,"xquery");
extLint=lsp.linter( extLint=lsp.linter(
view=>{ client.sync();return [];}, view=>{ client.sync();return [];},
@ -79,6 +80,15 @@ function connect() {
.catch(r => alert("connection failed: "+ server)); .catch(r => alert("connection failed: "+ server));
}; };
function connectStatus(bool){
if(bool){
$("popcon").classList.remove("btn-danger")
$("popcon").classList.add("btn-success")
}else{
$("popcon").classList.add("btn-danger")
$("popcon").classList.remove("btn-success")
}
}
function incoming(msg) { function incoming(msg) {
const rpc=JSON.parse(msg); const rpc=JSON.parse(msg);
log(rpc); log(rpc);

View file

@ -1,3 +1,5 @@
@import url("../bootstrap-icons.min.css");
/* Set editor dimensions */ /* Set editor dimensions */
#editor { #editor {
height: 400px; height: 400px;

Binary file not shown.