summaryrefslogtreecommitdiff
path: root/lex-serve/assets/script.js
diff options
context:
space:
mode:
authorMartin Fischer <martin@push-f.com>2025-04-11 16:33:59 +0200
committerMartin Fischer <martin@push-f.com>2025-04-13 20:19:48 +0200
commit50ea018252ce69542eab6a107b99ea8179810d1e (patch)
tree25091624110c413bd095581f79b50cd7ab030656 /lex-serve/assets/script.js
parent16b01fd1dfb8797b5529ea444f5b26cd26be9c3c (diff)
refactor: introduce lex-serve package
Diffstat (limited to 'lex-serve/assets/script.js')
-rw-r--r--lex-serve/assets/script.js56
1 files changed, 56 insertions, 0 deletions
diff --git a/lex-serve/assets/script.js b/lex-serve/assets/script.js
new file mode 100644
index 0000000..95b8393
--- /dev/null
+++ b/lex-serve/assets/script.js
@@ -0,0 +1,56 @@
+const searchInput = document.getElementById('search');
+const suggestionsDiv = document.getElementById('suggestions');
+
+async function enableAutocomplete() {
+ const res = await fetch('/laws.json');
+ const laws = await res.json();
+ // TODO: strip accents before searching
+
+ searchInput.addEventListener('input', (e) => {
+ if (searchInput.value == '') {
+ suggestionsDiv.innerHTML = '';
+ return;
+ }
+
+ const titleRegex = new RegExp(searchInput.value, 'i');
+ const abbrRegex = new RegExp('^' + searchInput.value, 'i');
+ const suggestions = [];
+
+ laws.map(l => {
+ const titleMatch = titleRegex.exec(l.title);
+ const abbrMatch = abbrRegex.exec(l.abbr);
+
+ return {
+ law: l,
+ titleScore: titleMatch ? titleMatch.index : Number.MAX_VALUE,
+ abbrScore: abbrMatch ? abbrMatch.index: Number.MAX_VALUE,
+ }
+ })
+ .filter(l => l.titleScore < Number.MAX_VALUE || l.abbrScore < Number.MAX_VALUE)
+ .sort((a,b) => {
+ let abbrDiff = a.abbrScore - b.abbrScore;
+ if (a.law.abbr && b.law.abbr && abbrDiff == 0 && a.abbrScore != Number.MAX_VALUE) {
+ abbrDiff = a.law.abbr.length - b.law.abbr.length;
+ }
+ return abbrDiff || a.titleScore - b.titleScore;
+ })
+ .slice(0, 30)
+ .forEach(x => {
+ const l = x.law;
+ const a = document.createElement('a');
+ if (l.redir)
+ a.href = '/' + l.redir;
+ else
+ a.href = l.url;
+ a.textContent = l.title;
+ const li = document.createElement('li');
+ li.appendChild(a);
+ suggestions.push(li);
+ });
+
+ suggestionsDiv.replaceChildren(...suggestions);
+ });
+}
+
+if ('json' in searchInput.dataset)
+ enableAutocomplete(); \ No newline at end of file