basex-lsp/webapp/static/codemirror/index.html
2025-08-02 15:06:08 +01:00

102 lines
No EOL
3.5 KiB
HTML

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Codemirror6 example using BaseX LSP</title>
<link rel="icon" type="image/png" href="favicon.png" />
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.7/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-LN+7fdVzj6u52u30Kp6M/trliBMCMKTyK833zpbD+pXdCLuTusPj697FH4R/5mcr" crossorigin="anonymous">
<link rel="stylesheet" href="styles.css" />
</head>
<body>
<nav class="navbar bg-body-tertiary">
<div class="container-fluid">
<a class="navbar-brand">BaseX LSP client</a>
<a href="/dba/logs" target="dba">#</a>
<form class="d-flex">
<span id="state">🔴</span>
<input id="iServer" type="text" value="ws://localhost:3000/ws/lsp" style="width:25em" />
<button id="connect">connect</button>
</form>
</div>
</div>
</nav>
<div class="container-fluid" >
<div class="row " >
<div class="col-2">
something
</div>
<div class="col flex-grow-1" style="background-color:gainsboro">
<div class="row" >
<div >
<label for="file">File:</label><input id="iFile" type="url" value="file:///some/file.xml" />
<button id="search">🔍</button>
<button id="lint">⚠️</button>
<label for="symbols">Symbols:</label><select id="symbols" disabled="disabled"></select>
</div>
</div>
<!-- Editor goes in here -->
<div id="editor"></div>
</div>
</div>
</div>
<!-- CodeMirror 6 -->
<script src="./lsp.bundle.js"></script>
<script>
let doc = `<foo at=42><bar>test</bar></foo>`;
// Load saved content from localStorage when the page loads
window.addEventListener('load', () => {
const savedText = localStorage.getItem('code');
if (savedText) {
doc = savedText;
}
});
const view = lsp.createEditorView(undefined, document.getElementById("editor"));
view.setState(lsp.createEditorState(doc, lsp.baseExts));
// Save content to localStorage when the page is about to unload
window.addEventListener('beforeunload', () => {
const doc = view.state.doc.toString();
localStorage.setItem('code', doc);
});
document.getElementById("connect").onclick = e => {
connect()
};
document.getElementById("search").onclick = e => {
lsp.openSearchPanel(view);
};
document.getElementById("lint").onclick = e => {
lsp.openLintPanel(view);
};
function connect() {
const server = document.getElementById("iServer").value;
const file = document.getElementById("iFile").value;
lsp.simpleWebSocketTransport(server)
.then(transport => {
let link = lsp.lsp(transport, file);
const state = lsp.createEditorState(doc, [...lsp.baseExts, link]);
view.setState(state);
})
.catch(r => alert("fail"));
};
connect();
</script>
</body>
</html>