basex-lsp/webapp/static/clients/codemirror/script.js

97 lines
2.8 KiB
JavaScript

const view = new lsp.EditorView({
extensions: lsp.baseExts,
parent:document.getElementById("editor")
});
let doc = "xquery version '3.1';\n(:~ comment:)\nmodule namespace pdfbox='ns';\n";
var client;
var extLint;
function $(id){ return document.getElementById(id) };
// Load saved content from localStorage when the page loads
window.addEventListener('load', () => {
const savedText = localStorage.getItem('code');
if (savedText) {
doc = savedText;
}
view.setState(lsp.EditorState.create({doc:doc, extensions: lsp.baseExts}));
connect();
});
// Save content to localStorage when the page is about to unload
window.addEventListener('beforeunload', () => {
const doc = view.state.doc.toString();
localStorage.setItem('code', doc);
});
$("connect").onclick = e => { e.preventDefault();connect()};
$("search").onclick = e => lsp.openSearchPanel(view);
$("format").onclick = e => console.log("CMDS",lsp.listCommands(view));
$("lint").onclick = async e => {
console.log("word", view.state.wordAt(1));
lsp.openLintPanel(view);
};
$("sync").onclick = e => { client.sync(); console.log("XXXsync");};
$("load").onchange = e => {
const url = e.target.value;
if (url.length == 0) return
fetch(url)
.then(response => response.text())
.then(t => {
view.dispatch({
changes: {
from: 0,
to: view.state.doc.length,
insert: t
}
})
client.sync();
console.log("SYNC");
});
$("load").value = "";
};
function connect() {
const server = $("iServer").value;
const file = $("iFile").value;
lsp.simpleWebSocketTransport(server)
.then(transport => {
transport.socket.onclose = (event) => connectStatus(false);
transport.socket.oneror = (event) => $("msg").innerText = "sock error!";
client = new lsp.LSPClient({extensions: lsp.languageServerExtensions()});
client.connect(transport);
$("popConnect").hidePopover();
connectStatus(true);
let extLsp =client.plugin( file, "xquery");
view.dispatch({ effects: lsp.StateEffect.appendConfig.of(extLsp) })
})
.catch(r => { connectStatus(false); 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 log(rpc) {
if (rpc.id) return
const text = rpc.method;
const li = document.createElement("li");
li.appendChild(document.createTextNode(text));
$("traffic").insertBefore(li, $("traffic").firstChild)
};