datalog-theme 0.6.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +50 -0
  3. data/CITATION.cff +2 -2
  4. data/README.md +3 -2
  5. data/_data/js_meta.json +29 -29
  6. data/_includes/components/author-bio.html +2 -2
  7. data/_includes/components/hero.html +19 -1
  8. data/_includes/head.html +5 -10
  9. data/_includes/header.html +1 -1
  10. data/_includes/meta/math-config.html +23 -1
  11. data/_includes/meta/scripts-loader.html +2 -1
  12. data/_includes/meta/syntax-config.html +19 -0
  13. data/_includes/scripts.html +1 -9
  14. data/_includes/search/index-data.json +156 -0
  15. data/_includes/search/page.html +136 -0
  16. data/_layouts/home.html +6 -0
  17. data/_plugins/math_preprocessor.rb +3 -0
  18. data/_plugins/notebook_converter.rb +0 -39
  19. data/_plugins/search_pages.rb +73 -0
  20. data/_sass/_base.scss +7 -1
  21. data/_sass/_components.scss +25 -3
  22. data/_sass/_font-fallbacks.scss +43 -0
  23. data/_sass/_header.scss +10 -0
  24. data/_sass/_layout.scss +17 -11
  25. data/_sass/_mathematical.scss +1 -1
  26. data/_sass/_phase1-enhancements.scss +45 -0
  27. data/_sass/_search.scss +1 -1
  28. data/_sass/_syntax-highlighting.scss +2 -2
  29. data/_sass/_theme.scss +14 -0
  30. data/_sass/_variables.scss +7 -4
  31. data/assets/img/hero-detail-640.webp +0 -0
  32. data/assets/img/hero-detail.webp +0 -0
  33. data/assets/img/social-card.png +0 -0
  34. data/assets/js/dist/academic.js +1 -0
  35. data/assets/js/dist/analytics-dashboard.js +1 -0
  36. data/assets/js/dist/core.js +1 -0
  37. data/assets/js/dist/loader.js +1 -0
  38. data/assets/js/dist/manifest.json +22 -0
  39. data/assets/js/dist/math.js +1 -0
  40. data/assets/js/dist/meta.json +371 -0
  41. data/assets/js/dist/notebook.js +1 -0
  42. data/assets/js/dist/search.js +1 -0
  43. data/assets/js/dist/visualizations.js +2 -0
  44. data/assets/js/search/filters.js +9 -2
  45. data/datalog-theme.gemspec +10 -2
  46. data/lib/datalog/cli.rb +19 -1
  47. data/lib/datalog/theme/version.rb +1 -1
  48. data/lib/datalog-theme.rb +16 -0
  49. metadata +34 -20
  50. data/_data/config/features.yml +0 -262
  51. data/_data/config/site.yml +0 -42
  52. data/_data/config/theme.yml +0 -181
  53. data/assets/img/20220607123041_detail.001.png +0 -0
@@ -0,0 +1,371 @@
1
+ {
2
+ "inputs": {
3
+ "assets/js/core/dark-mode.js": {
4
+ "bytes": 2409,
5
+ "imports": [],
6
+ "format": "esm"
7
+ },
8
+ "assets/js/core/github-cards.js": {
9
+ "bytes": 3406,
10
+ "imports": [],
11
+ "format": "esm"
12
+ },
13
+ "assets/js/core/language-filter.js": {
14
+ "bytes": 2032,
15
+ "imports": [],
16
+ "format": "esm"
17
+ },
18
+ "assets/js/core/navigation.js": {
19
+ "bytes": 4747,
20
+ "imports": [],
21
+ "format": "esm"
22
+ },
23
+ "assets/js/core/scroll-progress.js": {
24
+ "bytes": 1511,
25
+ "imports": [],
26
+ "format": "esm"
27
+ },
28
+ "assets/js/core/search-hotkeys.js": {
29
+ "bytes": 1635,
30
+ "imports": [],
31
+ "format": "esm"
32
+ },
33
+ "assets/js/core/skip-links.js": {
34
+ "bytes": 1479,
35
+ "imports": [],
36
+ "format": "esm"
37
+ },
38
+ "assets/js/main.js": {
39
+ "bytes": 746,
40
+ "imports": [
41
+ {
42
+ "path": "assets/js/core/dark-mode.js",
43
+ "kind": "import-statement",
44
+ "original": "./core/dark-mode.js"
45
+ },
46
+ {
47
+ "path": "assets/js/core/github-cards.js",
48
+ "kind": "import-statement",
49
+ "original": "./core/github-cards.js"
50
+ },
51
+ {
52
+ "path": "assets/js/core/language-filter.js",
53
+ "kind": "import-statement",
54
+ "original": "./core/language-filter.js"
55
+ },
56
+ {
57
+ "path": "assets/js/core/navigation.js",
58
+ "kind": "import-statement",
59
+ "original": "./core/navigation.js"
60
+ },
61
+ {
62
+ "path": "assets/js/core/scroll-progress.js",
63
+ "kind": "import-statement",
64
+ "original": "./core/scroll-progress.js"
65
+ },
66
+ {
67
+ "path": "assets/js/core/search-hotkeys.js",
68
+ "kind": "import-statement",
69
+ "original": "./core/search-hotkeys.js"
70
+ },
71
+ {
72
+ "path": "assets/js/core/skip-links.js",
73
+ "kind": "import-statement",
74
+ "original": "./core/skip-links.js"
75
+ }
76
+ ],
77
+ "format": "esm"
78
+ },
79
+ "assets/js/loader.js": {
80
+ "bytes": 4692,
81
+ "imports": [],
82
+ "format": "esm"
83
+ },
84
+ "assets/js/search/analytics.js": {
85
+ "bytes": 2547,
86
+ "imports": [],
87
+ "format": "esm"
88
+ },
89
+ "assets/js/search/utils.js": {
90
+ "bytes": 2472,
91
+ "imports": [],
92
+ "format": "esm"
93
+ },
94
+ "assets/js/search/autocomplete.js": {
95
+ "bytes": 3165,
96
+ "imports": [
97
+ {
98
+ "path": "assets/js/search/utils.js",
99
+ "kind": "import-statement",
100
+ "original": "./utils.js"
101
+ }
102
+ ],
103
+ "format": "esm"
104
+ },
105
+ "assets/js/search/engine.js": {
106
+ "bytes": 7122,
107
+ "imports": [
108
+ {
109
+ "path": "assets/js/search/utils.js",
110
+ "kind": "import-statement",
111
+ "original": "./utils.js"
112
+ }
113
+ ],
114
+ "format": "esm"
115
+ },
116
+ "assets/js/search/filters.js": {
117
+ "bytes": 1269,
118
+ "imports": [],
119
+ "format": "esm"
120
+ },
121
+ "assets/js/search/render.js": {
122
+ "bytes": 7012,
123
+ "imports": [
124
+ {
125
+ "path": "assets/js/search/utils.js",
126
+ "kind": "import-statement",
127
+ "original": "./utils.js"
128
+ }
129
+ ],
130
+ "format": "esm"
131
+ },
132
+ "assets/js/search/app.js": {
133
+ "bytes": 7902,
134
+ "imports": [
135
+ {
136
+ "path": "assets/js/search/analytics.js",
137
+ "kind": "import-statement",
138
+ "original": "./analytics.js"
139
+ },
140
+ {
141
+ "path": "assets/js/search/autocomplete.js",
142
+ "kind": "import-statement",
143
+ "original": "./autocomplete.js"
144
+ },
145
+ {
146
+ "path": "assets/js/search/engine.js",
147
+ "kind": "import-statement",
148
+ "original": "./engine.js"
149
+ },
150
+ {
151
+ "path": "assets/js/search/filters.js",
152
+ "kind": "import-statement",
153
+ "original": "./filters.js"
154
+ },
155
+ {
156
+ "path": "assets/js/search/render.js",
157
+ "kind": "import-statement",
158
+ "original": "./render.js"
159
+ }
160
+ ],
161
+ "format": "esm"
162
+ },
163
+ "assets/js/search.js": {
164
+ "bytes": 10020,
165
+ "imports": [
166
+ {
167
+ "path": "assets/js/search/app.js",
168
+ "kind": "import-statement",
169
+ "original": "./search/app.js"
170
+ }
171
+ ],
172
+ "format": "esm"
173
+ },
174
+ "assets/js/math.js": {
175
+ "bytes": 26480,
176
+ "imports": [],
177
+ "format": "esm"
178
+ },
179
+ "assets/js/visualizations.js": {
180
+ "bytes": 26322,
181
+ "imports": [],
182
+ "format": "esm"
183
+ },
184
+ "assets/js/notebook.js": {
185
+ "bytes": 5227,
186
+ "imports": [],
187
+ "format": "esm"
188
+ },
189
+ "assets/js/academic.js": {
190
+ "bytes": 8556,
191
+ "imports": [],
192
+ "format": "esm"
193
+ },
194
+ "assets/js/analytics-dashboard.js": {
195
+ "bytes": 12160,
196
+ "imports": [],
197
+ "format": "esm"
198
+ }
199
+ },
200
+ "outputs": {
201
+ "assets/js/dist/core.js": {
202
+ "imports": [],
203
+ "exports": [
204
+ "initializeCore"
205
+ ],
206
+ "entryPoint": "assets/js/main.js",
207
+ "inputs": {
208
+ "assets/js/core/dark-mode.js": {
209
+ "bytesInOutput": 750
210
+ },
211
+ "assets/js/core/github-cards.js": {
212
+ "bytesInOutput": 1333
213
+ },
214
+ "assets/js/core/language-filter.js": {
215
+ "bytesInOutput": 470
216
+ },
217
+ "assets/js/core/navigation.js": {
218
+ "bytesInOutput": 1851
219
+ },
220
+ "assets/js/core/scroll-progress.js": {
221
+ "bytesInOutput": 542
222
+ },
223
+ "assets/js/core/search-hotkeys.js": {
224
+ "bytesInOutput": 563
225
+ },
226
+ "assets/js/core/skip-links.js": {
227
+ "bytesInOutput": 537
228
+ },
229
+ "assets/js/main.js": {
230
+ "bytesInOutput": 125
231
+ }
232
+ },
233
+ "bytes": 6200
234
+ },
235
+ "assets/js/dist/loader.js": {
236
+ "imports": [],
237
+ "exports": [
238
+ "bootstrapFeatures"
239
+ ],
240
+ "entryPoint": "assets/js/loader.js",
241
+ "inputs": {
242
+ "assets/js/loader.js": {
243
+ "bytesInOutput": 1534
244
+ }
245
+ },
246
+ "bytes": 1566
247
+ },
248
+ "assets/js/dist/search.js": {
249
+ "imports": [],
250
+ "exports": [
251
+ "debounce",
252
+ "setupSearchEnhancements",
253
+ "updateLiveRegion"
254
+ ],
255
+ "entryPoint": "assets/js/search.js",
256
+ "inputs": {
257
+ "assets/js/search/analytics.js": {
258
+ "bytesInOutput": 1057
259
+ },
260
+ "assets/js/search/utils.js": {
261
+ "bytesInOutput": 1374
262
+ },
263
+ "assets/js/search/autocomplete.js": {
264
+ "bytesInOutput": 1566
265
+ },
266
+ "assets/js/search/engine.js": {
267
+ "bytesInOutput": 2886
268
+ },
269
+ "assets/js/search/filters.js": {
270
+ "bytesInOutput": 631
271
+ },
272
+ "assets/js/search/render.js": {
273
+ "bytesInOutput": 3641
274
+ },
275
+ "assets/js/search/app.js": {
276
+ "bytesInOutput": 3441
277
+ },
278
+ "assets/js/search.js": {
279
+ "bytesInOutput": 4357
280
+ }
281
+ },
282
+ "bytes": 19029
283
+ },
284
+ "assets/js/dist/math.js": {
285
+ "imports": [],
286
+ "exports": [],
287
+ "entryPoint": "assets/js/math.js",
288
+ "inputs": {
289
+ "assets/js/math.js": {
290
+ "bytesInOutput": 14151
291
+ }
292
+ },
293
+ "bytes": 14152
294
+ },
295
+ "assets/js/dist/visualizations.js": {
296
+ "imports": [],
297
+ "exports": [],
298
+ "entryPoint": "assets/js/visualizations.js",
299
+ "inputs": {
300
+ "assets/js/visualizations.js": {
301
+ "bytesInOutput": 12621
302
+ }
303
+ },
304
+ "bytes": 12622
305
+ },
306
+ "assets/js/dist/notebook.js": {
307
+ "imports": [],
308
+ "exports": [
309
+ "annotateCells",
310
+ "handleScrollSpy",
311
+ "initNotebookFeatures",
312
+ "initPlotly",
313
+ "initVega",
314
+ "loadScript"
315
+ ],
316
+ "entryPoint": "assets/js/notebook.js",
317
+ "inputs": {
318
+ "assets/js/notebook.js": {
319
+ "bytesInOutput": 2548
320
+ }
321
+ },
322
+ "bytes": 2669
323
+ },
324
+ "assets/js/dist/academic.js": {
325
+ "imports": [],
326
+ "exports": [
327
+ "attachCopyHandler",
328
+ "initAcademicFeatures",
329
+ "initCalendarFilter",
330
+ "initCopyHandlers",
331
+ "initOpenScienceBadges",
332
+ "initSubmissionFilter",
333
+ "populateCitationMetrics",
334
+ "populateCitationTimeline",
335
+ "populatePublicationCitations"
336
+ ],
337
+ "entryPoint": "assets/js/academic.js",
338
+ "inputs": {
339
+ "assets/js/academic.js": {
340
+ "bytesInOutput": 3573
341
+ }
342
+ },
343
+ "bytes": 3823
344
+ },
345
+ "assets/js/dist/analytics-dashboard.js": {
346
+ "imports": [],
347
+ "exports": [
348
+ "ensurePlaceholder",
349
+ "formatDateLabel",
350
+ "formatNumber",
351
+ "onReady",
352
+ "parseRows",
353
+ "render",
354
+ "renderEngagementChart",
355
+ "renderKeyEvents",
356
+ "renderMonthlyReports",
357
+ "renderScholar",
358
+ "renderSearchTerms",
359
+ "renderTopPosts",
360
+ "renderVisitorChart"
361
+ ],
362
+ "entryPoint": "assets/js/analytics-dashboard.js",
363
+ "inputs": {
364
+ "assets/js/analytics-dashboard.js": {
365
+ "bytesInOutput": 6918
366
+ }
367
+ },
368
+ "bytes": 7189
369
+ }
370
+ }
371
+ }
@@ -0,0 +1 @@
1
+ var c=t=>new Promise((r,o)=>{if(document.querySelector(`script[src="${t}"]`)){r();return}let e=document.createElement("script");e.src=t,e.async=!0,e.onload=()=>r(),e.onerror=n=>o(n),document.head.appendChild(e)}),i=()=>{let t=document.querySelectorAll(".notebook-output-plotly");return t.length?(typeof window.Plotly!="undefined"?Promise.resolve(window.Plotly):c("https://cdn.plot.ly/plotly-2.27.0.min.js").then(()=>window.Plotly)).then(o=>{t.forEach(e=>{try{let n=JSON.parse(e.dataset.plotly||"{}"),l=n.layout||{},a=Array.isArray(n.data)?n.data:Array.isArray(n)?n:[];o.newPlot(e,a,l,{responsive:!0})}catch(n){e.replaceChildren(),e.insertAdjacentHTML("afterbegin",'<p class="notebook-output__warning">Plotly figure could not be rendered. Open in Binder or Colab to interact.</p>')}})}):Promise.resolve()},d=()=>{let t=document.querySelectorAll(".notebook-output-vega");return t.length?c("https://cdn.jsdelivr.net/npm/vega@5").then(()=>c("https://cdn.jsdelivr.net/npm/vega-lite@5")).then(()=>c("https://cdn.jsdelivr.net/npm/vega-embed@6")).then(()=>{t.forEach(o=>{try{let e=JSON.parse(o.dataset.vega||"{}");window.vegaEmbed(o,e,{actions:!1})}catch(e){o.replaceChildren(),o.insertAdjacentHTML("afterbegin",'<p class="notebook-output__warning">Vega specification could not be parsed. Open in Binder for the interactive version.</p>')}})}):Promise.resolve()},p=()=>{document.querySelectorAll(".notebook-segment").forEach((r,o)=>{let e=r.id||`cell-${o+1}`;r.id=e,r.setAttribute("data-cell-anchor",e)})},u=()=>{let t={root:null,rootMargin:"0px 0px -65%",threshold:0},r=document.querySelectorAll(".notebook-segment"),o=document.querySelectorAll("[data-cell-anchor-link]");if(!r.length||!o.length)return;let e=new IntersectionObserver(n=>{n.forEach(l=>{l.isIntersecting&&o.forEach(a=>{a.classList.toggle("is-active",a.hash===`#${l.target.id}`)})})},t);r.forEach(n=>e.observe(n))},s=()=>{p(),i().catch(()=>{document.querySelectorAll(".notebook-output-plotly").forEach(t=>{t.replaceChildren(),t.insertAdjacentHTML("afterbegin",'<p class="notebook-output__warning">Plotly assets failed to load. Launch Binder/Colab to view the interactive chart.</p>')})}),d().catch(()=>{document.querySelectorAll(".notebook-output-vega").forEach(t=>{t.replaceChildren(),t.insertAdjacentHTML("afterbegin",'<p class="notebook-output__warning">Vega assets failed to load. Launch Binder/Colab to view the interactive chart.</p>')})}),u()};typeof window!="undefined"&&document.readyState==="loading"?document.addEventListener("DOMContentLoaded",s):typeof window!="undefined"&&s();export{p as annotateCells,u as handleScrollSpy,s as initNotebookFeatures,i as initPlotly,d as initVega,c as loadScript};
@@ -0,0 +1 @@
1
+ var j="datalog-search-analytics";function K({panel:e,list:n,empty:t,onSelect:o}){if(!e||!n||!t)return{record(){},render(){}};let r=g(),f="";function g(){let v=Object.create(null);try{let s=window.localStorage.getItem(j);if(s){let i=JSON.parse(s);i&&typeof i=="object"&&Object.entries(i).forEach(([d,u])=>{typeof u=="number"&&Number.isFinite(u)&&(v[d]=u)})}}catch(s){}return v}function w(){try{window.localStorage.setItem(j,JSON.stringify(r))}catch(v){}}function c(v){let s=(v||"").trim();!s||s===f||(f=s,r[s]=(r[s]||0)+1,w(),h())}function h(){let v=Object.entries(r).filter(([i])=>i&&i.trim().length>1).sort((i,d)=>d[1]-i[1]).slice(0,5);if(n.replaceChildren(),v.length===0){t.hidden=!1;return}t.hidden=!0;let s=document.createDocumentFragment();v.forEach(([i,d])=>{let u=document.createElement("li"),p=document.createElement("button");p.type="button",p.className="search-analytics__query",p.textContent=`${i} (${d})`,p.addEventListener("click",()=>{typeof o=="function"&&o(i)}),u.appendChild(p),s.appendChild(u)}),n.appendChild(s)}return{record:c,render:h}}function z(e=""){let n=e==null?"":String(e);try{return n.toLowerCase().normalize("NFKD").replace(new RegExp("\\p{Diacritic}","gu"),"")}catch(t){return n.toLowerCase()}}function F(e=""){return z(e).replace(/\s+/g,"")}function P(e=""){return z(e).split(/[^a-z0-9\\._]+/).filter(Boolean)}function H(e=""){return/\\|\^|_|\{|\}|\$/.test(e)}function B(e=""){return/`|::|->|=>|\(|\)|\{|\}|\[|\]|=|\bdef\b|\bfunction\b|\bclass\b/.test(e)}function X(e,n){if(!e||!n)return!1;let t=0;for(let o=0;o<e.length&&t<n.length;o+=1)e[o]===n[t]&&(t+=1);return t===n.length}function oe(e){if(!e)return"";let n=document.createElement("div");return n.innerHTML=e,n.textContent||n.innerText||""}function O(e,n,t){if(!e)return"";let o=oe(e),r=Math.max(0,n-80),f=Math.min(o.length,n+t+80);return`${o.slice(r,f)}${f<o.length?"\u2026":""}`}function se(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function _(e,n){if(!e||!n)return e;let t=Array.from(new Set(P(n))).sort((r,f)=>f.length-r.length),o=e;return t.forEach(r=>{if(!r)return;let f=new RegExp(`(${se(r)})`,"gi");o=o.replace(f,"<mark>$1</mark>")}),o}function M(e){return(e||"").toString().split(/[-_\s]+/).map(n=>n.charAt(0).toUpperCase()+n.slice(1)).join(" ")}function J(e){switch(e){case"post":return"Tutorial & Blog";case"project":return"Project";case"research":return"Research";case"dataset":return"Dataset";default:return M(e||"Page")}}function Y({panel:e,limit:n=8,onSelect:t}){if(!e)return{setSuggestions(){},update(){},close(){},handleNavigation(){}};let o=[],r=-1;function f(s){o=Array.isArray(s)?[...s]:[]}function g(s){r=-1;let i=(s||"").trim().toLowerCase();if(!i){h();return}let d=o.filter(p=>p&&p.toLowerCase().includes(i)).slice(0,n);if(d.length===0){h();return}let u=document.createDocumentFragment();d.forEach((p,E)=>{let y=document.createElement("button");y.type="button",y.className="search-autocomplete__option",y.setAttribute("role","option"),y.dataset.autocompleteOption="",y.dataset.value=p,y.setAttribute("aria-selected",E===r?"true":"false"),y.replaceChildren(),y.insertAdjacentHTML("beforeend",_(p,i)),u.appendChild(y)}),e.replaceChildren(),e.appendChild(u),e.hidden=!1}function w(s,i){if(e.hidden)return;let d=Array.from(e.querySelectorAll("[data-autocomplete-option]"));if(d.length!==0){if(s.key==="ArrowDown")s.preventDefault(),r=(r+1)%d.length,c(d);else if(s.key==="ArrowUp")s.preventDefault(),r=(r-1+d.length)%d.length,c(d);else if(s.key==="Enter"&&r>=0){s.preventDefault();let u=d[r],p=u?u.dataset.value:"";p&&i&&(i.value=p),typeof t=="function"&&t(p),v()}}}function c(s){s.forEach((i,d)=>{let u=d===r;i.setAttribute("aria-selected",u?"true":"false"),i.classList.toggle("is-active",u)})}function h(){e.replaceChildren(),e.hidden=!0,r=-1}function v(){h()}return e.addEventListener("click",s=>{let i=s.target.closest("[data-autocomplete-option]");if(!i)return;let d=i.dataset.value||"";d&&typeof t=="function"&&t(d),v()}),{setSuggestions:f,update:g,close:v,handleNavigation:w}}function V(e=[]){let n=Array.isArray(e)?[...e]:[];function t(g){n=Array.isArray(g)?[...g]:[]}function o(g,w={}){let c=(g||"").trim();if(!c)return[];let h=z(c),v=P(c),s=H(c),i=B(c),{type:d="",language:u="",difficulty:p="",tags:E=new Set}=w;return n.map(y=>le(y,{rawQuery:c,normalizedQuery:h,queryTokens:v,mathQuery:s,codeQuery:i,typeFilter:d,languageFilter:u,difficultyFilter:p,selectedTags:E})).filter(y=>y&&y.score>0).sort((y,C)=>C.score-y.score||y.title.localeCompare(C.title))}function r(g=150){return ce(n,g)}function f(){return[...n]}return{setDocuments:t,search:o,suggestions:r,getDocuments:f}}function ce(e=[],n=150){let t=new Set;return e.forEach(o=>{o.title&&t.add(o.title),Array.isArray(o.languages)&&o.languages.forEach(r=>t.add(r)),Array.isArray(o.tags)&&o.tags.forEach(r=>t.add(`#${r}`)),Array.isArray(o.math)&&o.math.slice(0,3).forEach(r=>t.add(r))}),Array.from(t).slice(0,n)}function le(e,n){let{rawQuery:t,normalizedQuery:o,queryTokens:r,mathQuery:f,codeQuery:g,typeFilter:w,languageFilter:c,difficultyFilter:h,selectedTags:v}=n;if(w&&e.type!==w)return null;let s=Array.isArray(e.languages)?e.languages:[];if(c&&!s.includes(c))return null;if(h){let a=String(e.difficulty||"").toLowerCase();if(!a||a!==h)return null}if(v&&v.size>0){let a=ue(e,"tags");for(let S of v)if(!a.has(S))return null}if(!t)return null;let i=e.normalized||{},d=i.content||z(e.content||""),u=i.summary||z(e.summary||""),p=i.title||z(e.title||""),E=G(i.tags,e.tags),y=G(i.languages,e.languages),C=i.difficulty||z(e.difficulty||""),T=Array.isArray(e.code)?e.code:[],k=Array.isArray(e.math)?e.math:[],m=0,q="",x=null,L=null;if(p.includes(o)&&(m+=40),r.forEach(a=>{a&&(p.includes(a)&&(m+=12),u.includes(a)&&(m+=8),d.includes(a)&&(m+=6),E.forEach(S=>{S.includes(a)&&(m+=4)}),y.forEach(S=>{S.includes(a)&&(m+=4)}),C.includes(a)&&(m+=2))}),T.length>0){let a=F(t);for(let S of T){let b=String(S.language||"").toLowerCase(),I=S.code||"",N=F(I);if(N.includes(a)){m+=30,x={language:b,code:I};break}if(g&&X(N,a)){m+=18,x={language:b,code:I};break}}!x&&T[0]&&(x={language:String(T[0].language||"").toLowerCase(),code:T[0].code||""})}if(k.length>0){let a=o.replace(/\\/g,"");for(let S of k)if(z(String(S)).includes(a)){m+=26,L=S;break}f&&!L&&k[0]&&(L=k[0],m+=10)}if(d.includes(o)){let a=d.indexOf(o);q=O(e.content||"",a,t.length),m+=10}else if(u.includes(o)){let a=u.indexOf(o);q=O(e.summary||"",a,t.length),m+=6}return m===0?null:{id:`${e.url}`,title:e.title,url:e.url,summary:e.summary,snippet:q,codeSnippet:x,mathSnippet:L,tags:e.tags||[],languages:e.languages||[],difficulty:e.difficulty||"",type:e.type||"page",date:e.date,readingTime:e.reading_time,score:m}}function G(e,n){return Array.isArray(e)&&e.length>0?e:Array.isArray(n)?n.map(t=>z(t)):[]}function ue(e,n){let o=(e.normalized||{})[n];if(Array.isArray(o)&&o.length>0)return new Set(o);let r=Array.isArray(e[n])?e[n]:[];return new Set(r.map(f=>z(f)))}function W(e,n,t){if(!e)return;let o=new Set;n.forEach(g=>{(g.tags||g.topics||[]).forEach(c=>{if(!c)return;let h=String(c).trim().toLowerCase();h&&o.add(h)})});let r=Array.from(o).sort();if(r.length===0){let g=document.createElement("p");g.className="search-filter__empty",g.textContent="No tags available yet.",e.replaceChildren(g);return}let f=document.createDocumentFragment();r.forEach(g=>{let w=document.createElement("button");w.type="button",w.className="search-filter__tag",w.textContent=g,w.dataset.filterTag=g,w.setAttribute("aria-pressed",t.has(g)?"true":"false"),f.appendChild(w)}),e.replaceChildren(),e.appendChild(f)}function Z(e,n,t){let{resultsList:o,resultsMeta:r,emptyState:f,template:g}=t;if(!o||!r||!f||!g)return;if(o.replaceChildren(),!n){r.textContent="Enter a query to begin.",f.hidden=!0;return}if(e.length===0){r.textContent=`No matches for \u201C${n}\u201D.`,f.hidden=!1;return}f.hidden=!0,r.textContent=`${e.length} result${e.length===1?"":"s"} for \u201C${n}\u201D.`;let w=document.createDocumentFragment();e.forEach(c=>{let h=g.content.cloneNode(!0),v=h.querySelector("[data-result-type]"),s=h.querySelector("[data-result-difficulty]"),i=h.querySelector("[data-result-languages]"),d=h.querySelector("[data-result-link]"),u=h.querySelector("[data-result-summary]"),p=h.querySelector("[data-result-code]"),E=p?p.querySelector("code"):null,y=h.querySelector("[data-result-math]"),C=h.querySelector("[data-result-math-preview]"),T=h.querySelector("[data-result-math-code]"),k=h.querySelector("[data-result-math-copy]"),m=h.querySelector("[data-result-excerpt]"),q=h.querySelector("[data-result-tags]"),x=h.querySelector("[data-result-date]");if(v&&(v.textContent=J(c.type)),s&&(c.difficulty?(s.textContent=`Difficulty: ${M(c.difficulty)}`,s.hidden=!1):s.hidden=!0),i&&(c.languages&&c.languages.length>0?(i.textContent=`Languages: ${c.languages.map(L=>M(L)).join(", ")}`,i.hidden=!1):i.hidden=!0),d&&(d.textContent=c.title||c.url,d.setAttribute("href",c.url)),u&&(u.replaceChildren(),u.insertAdjacentHTML("beforeend",_(c.summary||"",n))),y&&T&&(c.mathSnippet?(y.hidden=!1,T.textContent=c.mathSnippet,C&&(window.DatalogMath&&typeof window.DatalogMath.renderLatex=="function"?window.DatalogMath.renderLatex(C,c.mathSnippet,{display:!1,enhance:!1}):window.MathJax&&typeof window.MathJax.typesetPromise=="function"?(C.innerHTML=`\\(${c.mathSnippet}\\)`,window.MathJax.typesetPromise([C]).catch(()=>{C.textContent=c.mathSnippet})):C.textContent=c.mathSnippet),k&&k.addEventListener("click",()=>de(c.mathSnippet,y))):y.hidden=!0),m&&(c.snippet?(m.replaceChildren(),m.insertAdjacentHTML("beforeend",_(c.snippet,n)),m.hidden=!1):m.hidden=!0),p&&E)if(c.codeSnippet&&c.codeSnippet.code){let L=c.codeSnippet.language||"text";p.classList.remove("language-none"),p.classList.add(`language-${L}`),E.className=`language-${L}`;let a=c.codeSnippet.code;if(window.Prism&&window.Prism.languages){let S=window.Prism.languages[L]||window.Prism.languages.markup;E.innerHTML=window.Prism.highlight(a,S,L)}else E.textContent=a;p.hidden=!1}else p.hidden=!0;if(q&&(q.replaceChildren(),(c.tags||[]).forEach(L=>{let a=document.createElement("li");a.textContent=`#${L}`,q.appendChild(a)})),x)if(c.date){let L=new Date(c.date);Number.isNaN(L.getTime())?x.hidden=!0:(x.textContent=L.toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"}),x.hidden=!1)}else x.hidden=!0;w.appendChild(h)}),o.appendChild(w)}function de(e,n){if(!e)return;let t=()=>{if(!n)return;let r=n.querySelector("[data-result-math-copy]"),f=r?r.querySelector(".visually-hidden"):null;if(r&&f){let g=r.getAttribute("data-sr-original")||f.textContent;r.getAttribute("data-sr-original")||r.setAttribute("data-sr-original",g||"Copy LaTeX"),f.textContent="Copied LaTeX",r.classList.add("is-copied"),window.setTimeout(()=>{f.textContent=r.getAttribute("data-sr-original")||"Copy LaTeX",r.classList.remove("is-copied")},2e3)}},o=()=>{let r=document.createElement("textarea");r.value=e,r.setAttribute("aria-hidden","true"),r.style.position="fixed",r.style.opacity="0",document.body.appendChild(r),r.select();try{document.execCommand("copy"),t()}catch(f){}document.body.removeChild(r)};navigator.clipboard&&navigator.clipboard.writeText?navigator.clipboard.writeText(e).then(()=>t()).catch(()=>o()):o()}var fe=8;function ee(){let e=document.querySelector("[data-search-app]");if(!e)return;let n=e.querySelector("[data-search-form]"),t=e.querySelector("[data-search-input]"),o=e.querySelector("[data-search-results]"),r=e.querySelector("[data-search-meta]"),f=e.querySelector("[data-search-empty]"),g=e.querySelector("[data-search-autocomplete]"),w=e.querySelector("[data-search-analytics]"),c=w?w.querySelector(".search-app__analytics-list"):null,h=w?w.querySelector(".search-app__analytics-empty"):null,v=document.getElementById("search-result-template"),s=e.querySelector("[data-filter-type]"),i=e.querySelector("[data-filter-language]"),d=e.querySelector("[data-filter-difficulty]"),u=e.querySelector("[data-filter-tags]"),p=e.getAttribute("data-search-index")||"/search.json",E=new Set,y=V(),C=K({panel:w,list:c,empty:h,onSelect:a=>{t&&(t.value=a,x())}}),T=Y({panel:g,limit:fe,onSelect:a=>{a&&t&&(t.value=a,t.focus(),x())}}),k=!1,m=new URLSearchParams(window.location.search);t&&m.has("q")&&(t.value=m.get("q")||""),s&&m.has("type")&&(s.value=m.get("type")),i&&m.has("language")&&(i.value=m.get("language")),d&&m.has("difficulty")&&(d.value=m.get("difficulty")),m.has("tags")&&m.get("tags").split(",").map(a=>a.trim().toLowerCase()).filter(Boolean).forEach(a=>E.add(a)),he(t,()=>{T.close(),x()}),ge(p).then(a=>{let S=a.documents||[];y.setDocuments(S),T.setSuggestions(y.suggestions()),W(u,S,E),k=!0,q()}).catch(a=>{r&&(r.textContent="Unable to load the search index. Please try again later.")}),n&&n.addEventListener("submit",a=>{a.preventDefault(),x()}),t&&(t.addEventListener("input",()=>{T.update(t.value)}),t.addEventListener("keydown",a=>{T.handleNavigation(a,t)}),t.addEventListener("focus",()=>{T.update(t.value)})),s&&s.addEventListener("change",x),i&&i.addEventListener("change",x),d&&d.addEventListener("change",x),e.addEventListener("click",a=>{let S=a.target;if(S.matches("[data-filter-tag]")){let b=S.getAttribute("data-filter-tag");b&&(E.has(b)?(E.delete(b),S.setAttribute("aria-pressed","false")):(E.add(b),S.setAttribute("aria-pressed","true")),x())}}),document.addEventListener("click",a=>{!g||g.hidden||e.contains(a.target)||T.close()}),document.addEventListener("keydown",a=>{let S=document.activeElement?document.activeElement.tagName:"";["INPUT","TEXTAREA"].includes(S)||(a.key==="/"&&!a.ctrlKey&&!a.metaKey&&!a.altKey||(a.key==="k"||a.key==="K")&&(a.ctrlKey||a.metaKey))&&(a.preventDefault(),t&&(t.focus(),t.select()))}),C.render();function q(){t&&t.value.trim()?x():L()}function x(){if(!t)return;if(!k){r&&(r.textContent="Loading technical index\u2026");return}let a=t.value.trim(),S={type:s?s.value:"",language:i?i.value:"",difficulty:d?d.value:"",tags:E},b=y.search(a,S);Z(b,a,{resultsList:o,resultsMeta:r,emptyState:f,template:v}),L(a),C.record(a)}function L(a){let S=new URL(window.location.href),b=S.searchParams;a?b.set("q",a):b.delete("q"),s&&s.value?b.set("type",s.value):b.delete("type"),i&&i.value?b.set("language",i.value):b.delete("language"),d&&d.value?b.set("difficulty",d.value):b.delete("difficulty"),E.size>0?b.set("tags",Array.from(E).join(",")):b.delete("tags");let I=b.toString(),N=I?`${S.pathname}?${I}`:S.pathname;window.history.replaceState({},"",N)}}function ge(e){return fetch(e,{credentials:"same-origin"}).then(n=>{if(!n.ok)throw new Error(`HTTP ${n.status}`);return n.json()})}function he(e,n){e&&e.addEventListener("keydown",t=>{t.key==="Escape"&&(e.value="",typeof n=="function"&&n())})}var pe=300,me="search-result-",U=500;function ye(e,n=pe){let t,o=(...r)=>{t&&window.clearTimeout(t),t=window.setTimeout(()=>{t=void 0,e.apply(null,r)},n)};return o.cancel=()=>{t&&(window.clearTimeout(t),t=void 0)},o}function $(e,n){if(!e)return;let t=String(n||"");e.textContent===t?e.textContent=`${t}\xA0`:e.textContent=t,t.trim()?e.removeAttribute("hidden"):e.setAttribute("hidden","")}function Se(){let e=document.querySelector("[data-search-app]");if(!e)return;let n=e.querySelector("[data-search-form]"),t=e.querySelector("[data-search-input]"),o=e.querySelector("[data-search-results]"),r=e.querySelector("[data-search-empty]"),f=e.querySelector("[data-search-loading]"),g=e.querySelector("[data-search-region]"),w=e.querySelector('[data-search-live="count"]'),c=e.querySelector('[data-search-live="selection"]'),h=e.querySelector('[data-search-live="status"]'),v=e.querySelector("[data-search-filters]"),s=e.querySelector("[data-filter-tags]");if(!t||!o)return;let i=-1,d=0,u=[],p=!1,E=[],y=0,C=null,T=ye(()=>{n&&(p=!0,Q(),$(h,"Loading results\u2026"),n.dispatchEvent(new Event("submit",{cancelable:!0})))});new MutationObserver(()=>{I()}).observe(o,{childList:!0}),I(),q(),s&&new MutationObserver(()=>{q()}).observe(s,{childList:!0}),t.addEventListener("input",()=>{S(!1),T()}),t.addEventListener("keydown",l=>{if(!x(l)&&l.key==="Tab"&&E.length>0){l.preventDefault();let A=l.shiftKey?E.length-1:0;E[A].focus()}});function m(l){if(l.key!=="Tab"||E.length===0)return;l.preventDefault();let A=E.indexOf(l.currentTarget);if(A===-1)return;let D=l.shiftKey?-1:1,R=(A+D+E.length)%E.length;E[R].focus()}function q(){if(!v)return;let l=Array.from(v.querySelectorAll("select")),A=s?Array.from(s.querySelectorAll("[data-filter-tag]")):[];E=[...l,...A],E.forEach(D=>{D.removeEventListener("keydown",m),D.addEventListener("keydown",m)})}function x(l){if(!u.length&&["ArrowDown","ArrowUp","Enter"].includes(l.key))return!1;switch(l.key){case"ArrowDown":return l.preventDefault(),L(1),!0;case"ArrowUp":return l.preventDefault(),L(-1),!0;case"Enter":return i>=0?(l.preventDefault(),re(),!0):!1;case"Escape":return l.preventDefault(),ae(),!0;default:return!1}}function L(l){if(!u.length)return;let A=i===-1?l>0?0:u.length-1:(i+l+u.length)%u.length;a(A)}function a(l){if(!(l<-1||l>=u.length)&&i!==l)if(i>=0&&u[i]&&u[i].classList.remove("is-active"),i=l,i>=0){let A=u[i];if(!A)return;A.classList.add("is-active");let D=b(A);t.setAttribute("aria-activedescendant",D);let R=ie(A);$(c,`Result ${i+1} of ${u.length}: ${R}`),A.scrollIntoView({block:"nearest"})}else t.removeAttribute("aria-activedescendant"),$(c,"Search results selection cleared.")}function S(l=!0){i>=0&&u[i]&&u[i].classList.remove("is-active"),i=-1,t.removeAttribute("aria-activedescendant"),l&&$(c,"Search results selection cleared.")}function b(l){if(l.id)return l.id;d+=1;let A=`${me}${d}`;return l.id=A,A}function I(){u=Array.from(o.querySelectorAll(".search-result")),u.forEach(l=>{b(l),l.setAttribute("role","option"),l.setAttribute("tabindex","-1")}),i>=u.length&&S(!1),p&&(p=!1,$(h,"Results updated.")),ne(),N()}function N(){if(!w)return;let l=t.value.trim();if(!l){$(w,"Enter a query to begin.");return}if(r&&!r.hidden&&u.length===0){$(w,`No results found for \u201C${l}\u201D.`);return}$(w,`${u.length} result${u.length===1?"":"s"} found for \u201C${l}\u201D.`)}function Q(){g&&g.setAttribute("aria-busy","true"),f&&(C&&(window.clearTimeout(C),C=null),y=Date.now(),f.hidden=!1,f.removeAttribute("hidden"))}function ne(){if(g&&g.setAttribute("aria-busy","false"),f){let l=()=>{f.hidden=!0,f.setAttribute("hidden",""),C=null,y=0},A=y?Date.now()-y:U;if(A<U){let D=U-A;C&&window.clearTimeout(C),C=window.setTimeout(l,D)}else l()}}function re(){let l=i>=0?u[i]:null;if(!l)return;let A=l.querySelector("[data-result-link]");A&&A.href&&window.location.assign(A.href)}function ae(){T.cancel(),t.value="",S(),$(h,"Search cleared."),n&&(p=!0,Q(),n.dispatchEvent(new Event("submit",{cancelable:!0})))}function ie(l){let A=l.querySelector("[data-result-link]");if(A&&A.textContent)return A.textContent.trim();let D=l.querySelector(".search-result__title");return D&&D.textContent?D.textContent.trim():"Result"}}var we=typeof process!="undefined"&&process.env&&process.env.VITEST==="true";function te(){ee(),Se()}we||(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",te):te());export{ye as debounce,Se as setupSearchEnhancements,$ as updateLiveRegion};
@@ -0,0 +1,2 @@
1
+ (function(){let Y=typeof process!="undefined"&&process.env&&process.env.VITEST==="true",T="[data-viz-type]",O='script[type="application/json"]',F='script[type="application/vnd.jupyter.widget-state+json"]',H='script[type="application/vnd.jupyter.widget-view+json"]',C=new Map,_=new Set,k="viz-table-fallback-template",v=(t,r={})=>{if(!t)return Promise.reject(new Error("Missing script source"));if(C.has(t))return C.get(t);let e=new Promise((n,s)=>{let o=document.createElement("script");o.src=t,o.async=r.async!==!1,r.integrity&&(o.integrity=r.integrity,o.crossOrigin=r.crossOrigin||"anonymous"),o.onload=()=>n(o),o.onerror=a=>s(a),document.head.appendChild(o)});return C.set(t,e),e},I=t=>!t||_.has(t)?Promise.resolve():new Promise((r,e)=>{let n=document.createElement("link");n.rel="stylesheet",n.href=t,n.onload=()=>{_.add(t),r(n)},n.onerror=s=>e(s),document.head.appendChild(n)}),g=t=>Object.prototype.toString.call(t)==="[object Object]",f=t=>t===null||typeof t=="undefined"?"":t instanceof Date?t.toISOString():Array.isArray(t)?t.map(r=>f(r)).join(", "):g(t)?Object.entries(t).map(([r,e])=>`${r}: ${f(e)}`).join("; "):typeof t=="boolean"?t?"Yes":"No":typeof t=="number"?Number.isFinite(t)?`${t}`:"":String(t),j=(t,r=[])=>g(t)?Object.entries(t).reduce((e,[n,s])=>{let o=r.concat([n]);return g(s)?Object.assign(e,j(s,o)):Array.isArray(s)?e[o.join(" \u203A ")]=s.map(a=>f(a)).join(", "):e[o.join(" \u203A ")]=s,e},{}):{[r.join(" \u203A ")||"Value"]:t},m=t=>{if(!t)return[];if(Array.isArray(t)){if(!t.length)return[];if(t.every(r=>g(r)))return t.map(r=>j(r));if(Array.isArray(t[0])){let r=t[0],e=r.every(o=>typeof o=="string"||typeof o=="number"),n=r.map((o,a)=>e?f(o):`Column ${a+1}`),s=e?1:0;return t.slice(s).map((o,a)=>{let i={};return Array.isArray(o)?(n.forEach((c,l)=>{i[c]=o[l]}),n.length||o.forEach((c,l)=>{i[`Column ${l+1}`]=c})):i[`Row ${a+1}`]=o,i})}return t.map((r,e)=>({Index:e+1,Value:r}))}return g(t)?Array.isArray(t.data)?m(t.data):Array.isArray(t.values)?m(t.values):Array.isArray(t.rows)?m(t.rows):[j(t)]:[{Value:t}]},X=t=>{let r=["Series","Trace","Group","Category","Index","X","Y","Z","Value","Text"],e=[];return r.forEach(n=>{t.includes(n)&&e.push(n)}),t.filter(n=>!r.includes(n)).sort().forEach(n=>e.push(n)),e},Z=t=>{let r=t.getAttribute("data-viz-title");if(r)return r;let e=t.querySelector(".viz-title");return e&&e.textContent?e.textContent.trim():t.getAttribute("data-viz-slug")||"Visualization data"},U=()=>{let t=document.getElementById(k);if(t)return t;t=document.createElement("template"),t.id=k;let r=document.createElement("div");return r.insertAdjacentHTML("afterbegin",'<div class="viz-table-container" data-viz-table-container><button type="button" class="viz-table-toggle" data-viz-table-toggle aria-expanded="false">Show data table</button><div class="viz-table-wrapper" data-viz-table-wrapper hidden><table class="viz-table" data-viz-table><caption data-viz-table-caption></caption><thead data-viz-table-head></thead><tbody data-viz-table-body></tbody></table></div></div>'),t.content.appendChild(r.firstElementChild),document.body.appendChild(t),t},E=(t,r={})=>{let{caption:e,rows:n}=r,s=m(n);if(!s.length)return;let o=Array.from(s.reduce((p,y)=>(Object.keys(y).forEach(P=>p.add(P)),p),new Set));if(!o.length)return;let a=X(o),c=U().content.firstElementChild.cloneNode(!0),l=c.querySelector("[data-viz-table-toggle]"),u=c.querySelector("[data-viz-table-wrapper]"),w=c.querySelector("[data-viz-table]"),S=c.querySelector("[data-viz-table-caption]"),h=c.querySelector("[data-viz-table-head]"),A=c.querySelector("[data-viz-table-body]"),z=`${t.getAttribute("data-viz-slug")||t.id||"viz"}-table`;w.id=z,l.setAttribute("aria-controls",z),S.textContent=e||Z(t);let x=document.createElement("tr");a.forEach(p=>{let y=document.createElement("th");y.scope="col",y.textContent=p,x.appendChild(y)}),h.appendChild(x),s.forEach(p=>{let y=document.createElement("tr");a.forEach((P,lt)=>{let J=f(p[P]);if(lt===0){let b=document.createElement("th");b.scope="row",b.textContent=J,y.appendChild(b)}else{let b=document.createElement("td");b.textContent=J,y.appendChild(b)}}),A.appendChild(y)}),l.addEventListener("click",()=>{let p=l.getAttribute("aria-expanded")==="true";l.setAttribute("aria-expanded",String(!p)),l.textContent=p?"Show data table":"Hide data table",p?u.setAttribute("hidden",""):u.removeAttribute("hidden")});let G=t.querySelector("[data-viz-table-container]");G&&G.remove(),t.appendChild(c),(t.querySelector("[data-viz-canvas]")||t).setAttribute("aria-describedby",z)},N=(t=[])=>{let r=[];return t.forEach((e,n)=>{let s=e.name||`Series ${n+1}`,o=Array.isArray(e.x)?e.x:[],a=Array.isArray(e.y)?e.y:[],i=Array.isArray(e.text)?e.text:[],c=e.z;if(Array.isArray(c)&&c.length&&Array.isArray(c[0])){let u=o.length?o:c[0].map((S,h)=>h+1);(a.length?a:c.map((S,h)=>h+1)).forEach((S,h)=>{let A=c[h]||[];u.forEach((z,x)=>{r.push({Series:s,Y:S,X:z,Value:Array.isArray(A)?A[x]:A,Text:i[h]?f(i[h]):""})})});return}let l=Math.max(o.length,a.length,i.length);for(let u=0;u<l;u+=1)r.push({Series:s,X:o[u],Y:a[u],Text:i[u]})}),r.length?r:null},L=t=>t?Array.isArray(t)?t:g(t)&&Array.isArray(t.data)?t.data:t:null,V=t=>{let r=t.querySelector("script[data-observable-data]");if(!r)return null;try{return JSON.parse(r.textContent||"null")}catch(e){return null}},D=()=>(typeof window.Plotly!="undefined"?Promise.resolve():v("https://cdn.plot.ly/plotly-2.27.0.min.js")).then(()=>window.Plotly),K=()=>typeof window.d3!="undefined"?Promise.resolve(window.d3):v("https://cdn.jsdelivr.net/npm/d3@7/dist/d3.min.js").then(()=>window.d3),Q=()=>Promise.all([v("https://cdn.bokeh.org/bokeh/release/bokeh-3.3.3.min.js"),I("https://cdn.bokeh.org/bokeh/release/bokeh-3.3.3.min.css")]).then(()=>window.Bokeh),tt=()=>typeof window.requirejs!="undefined"?Promise.resolve(window.requirejs):v("https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js",{async:!1}).then(()=>window.requirejs),et=()=>tt().then(t=>{let r=window.__datalogWidgetManagerPromise;if(r)return r;let e=new Promise((n,s)=>{t.config({paths:{"@jupyter-widgets/html-manager":"https://cdn.jsdelivr.net/npm/@jupyter-widgets/html-manager@1.0.8/dist/embed-amd","@jupyter-widgets/base":"https://cdn.jsdelivr.net/npm/@jupyter-widgets/base@6.0.7/dist/index","@jupyter-widgets/controls":"https://cdn.jsdelivr.net/npm/@jupyter-widgets/controls@5.0.7/dist/index","@lumino/coreutils":"https://cdn.jsdelivr.net/npm/@lumino/coreutils@2.1.1/dist/index","@lumino/widgets":"https://cdn.jsdelivr.net/npm/@lumino/widgets@2.3.1/dist/index"}}),t(["@jupyter-widgets/html-manager"],o=>n(o),o=>s(o))});return window.__datalogWidgetManagerPromise=e,e}),rt=(t,r)=>{let e=document.createElement("button");return e.type="button",e.className="viz-toolbar__button",e.textContent=t,e.addEventListener("click",n=>{n.preventDefault(),r(n)}),e},d=(t,r,e="info")=>{let n=t.querySelector("[data-viz-status]");n&&(n.textContent=r,n.dataset.tone=e)},M=t=>{let r=t.getAttribute("data-viz-version"),e=t.getAttribute("data-viz-updated"),n=t.querySelector("[data-viz-meta]");if(!n)return;let s=[];r&&s.push(`v${r}`),e&&s.push(`Updated ${e}`),n.textContent=s.join(" \xB7 ")},nt=t=>{let r=t.querySelector("[data-viz-canvas]")||t,e=t.querySelector(O);if(!e)return d(t,"Missing Plotly specification","error"),Promise.resolve();let n={};try{n=JSON.parse(e.textContent||"{}")}catch(a){return d(t,"Invalid Plotly specification","error"),Promise.resolve()}let s=Array.isArray(n.data)?n.data:[],o=Object.assign({autosize:!0},n.layout||{});return D().then(a=>a.newPlot(r,s,o,{responsive:!0,displaylogo:!1})).then(()=>{d(t,"Interactive");let a=t.querySelector("[data-viz-export]");a&&(a.replaceChildren(),a.appendChild(rt("Download PNG",()=>{D().then(c=>{c.downloadImage(r,{format:"png",filename:t.getAttribute("data-viz-slug")||"visualization"})})})));let i=N(s);i&&E(t,{caption:o&&o.title?f(o.title.text||o.title):void 0,rows:i})}).catch(()=>{d(t,"Plotly failed to load","error")})},ot=t=>{let r=t.querySelector("[data-d3-script]");return r?K().then(e=>{let n=r.textContent||"",s=t.querySelector("[data-viz-canvas]")||t;s.replaceChildren();let o=[],a=i=>{typeof i!="undefined"&&o.push(i)};try{let i=`${n}
2
+ ;try { if (typeof data !== 'undefined') captureData(data); } catch (instrumentationError) {}`,l=new Function("d3","element","captureData",i)(e,s,a);typeof l!="undefined"&&a(l);let u=o.length?o[o.length-1]:null,w=L(u);w&&E(t,{rows:w}),d(t,"Interactive")}catch(i){s.replaceChildren(),d(t,"D3 rendering error","error")}}).catch(()=>d(t,"D3 assets failed to load","error")):(d(t,"Missing D3 rendering instructions","error"),Promise.resolve())},st=t=>{let r=t.getAttribute("data-observable-src");if(!r)return d(t,"Missing Observable notebook source","error"),Promise.resolve();let e=document.createElement("iframe");e.src=r,e.loading="lazy",e.title=t.getAttribute("data-viz-title")||"Observable visualization",e.setAttribute("allowfullscreen",""),e.setAttribute("sandbox","allow-scripts allow-same-origin allow-popups allow-forms"),e.className="viz-embed",(t.querySelector("[data-viz-canvas]")||t).replaceChildren(e),d(t,"Embedded");let s=V(t);return s&&E(t,{rows:s}),Promise.resolve()},at=t=>{let r=t.querySelector(O),e=t.querySelector("[data-bokeh-script]"),n=t.querySelector("[data-viz-canvas]")||t;return!r&&!e?(d(t,"Missing Bokeh specification","error"),Promise.resolve()):Q().then(s=>{if(r){let o={};try{o=JSON.parse(r.textContent||"{}")}catch(i){d(t,"Invalid Bokeh specification","error");return}let a=n.id||`bokeh-${Math.random().toString(36).slice(2)}`;n.id=a;try{s.embed.embed_item(o,a),d(t,"Interactive")}catch(i){d(t,"Bokeh rendering error","error")}return}if(e){let o=e.textContent||"";n.replaceChildren();try{new Function("Bokeh","element",o)(s,n),d(t,"Interactive")}catch(a){d(t,"Bokeh rendering error","error")}}}).catch(()=>{d(t,"Bokeh assets failed to load","error")})},it=t=>{let r=t.getAttribute("data-shiny-src");if(!r)return d(t,"Missing Shiny application source","error"),Promise.resolve();let e=document.createElement("iframe");e.src=r,e.loading="lazy",e.title=t.getAttribute("data-viz-title")||"R Shiny application",e.className="viz-embed",e.setAttribute("allow","fullscreen"),e.setAttribute("sandbox","allow-scripts allow-forms allow-same-origin");let n=t.getAttribute("data-shiny-height");return e.style.height=n||"640px",(t.querySelector("[data-viz-canvas]")||t).replaceChildren(e),d(t,"Embedded"),Promise.resolve()},ct=t=>{let r=t.querySelector(F),e=t.querySelector(H);if(!r||!e)return d(t,"Missing widget state payload","error"),Promise.resolve();let n,s;try{n=JSON.parse(r.textContent||"{}"),s=JSON.parse(e.textContent||"{}")}catch(a){return d(t,"Invalid widget payload","error"),Promise.resolve()}let o=t.querySelector("[data-viz-canvas]")||t;return o.replaceChildren(),et().then(a=>{let i=new a.WidgetManager;return i.set_state(n).then(()=>i.get_model(s.model_id)).then(c=>i.create_view(c)).then(c=>i.display_view(void 0,c,{el:o})).then(()=>d(t,"Interactive")).catch(c=>{d(t,"Widget rendering error","error")})}).catch(()=>d(t,"Widget assets failed to load","error"))},q=t=>{let r=t.getAttribute("data-viz-type");switch(M(t),r){case"plotly":return nt(t);case"observable":return st(t);case"d3":return ot(t);case"bokeh":return at(t);case"shiny":return it(t);case"ipywidgets":return ct(t);default:return d(t,"Unsupported visualization type","error"),Promise.resolve()}},B=()=>{if(!("IntersectionObserver"in window)){document.querySelectorAll(T).forEach(r=>{q(r)});return}let t=new IntersectionObserver((r,e)=>{r.filter(n=>n.isIntersecting).forEach(n=>{let s=n.target;e.unobserve(s),q(s)})},{rootMargin:"200px 0px"});document.querySelectorAll(T).forEach(r=>{t.observe(r)})},R=t=>{document.querySelectorAll("[data-viz-card]").forEach(e=>{let n=!t.tech||e.dataset.vizTech===t.tech,s=(e.dataset.vizTags||"").split(",").map(a=>a.trim()).filter(Boolean),o=!t.tag||s.includes(t.tag);e.hidden=!(n&&o)})},$=()=>{let t=document.querySelector("[data-viz-gallery]");if(!t)return;let r=t.querySelector('[data-viz-filter="tech"]'),e=t.querySelector('[data-viz-filter="tag"]'),n=()=>{R({tech:r&&r.value!=="all"?r.value:"",tag:e&&e.value!=="all"?e.value:""})};r&&r.addEventListener("change",n),e&&e.addEventListener("change",n),n()},W=()=>{B(),$()},dt={loadScript:v,loadStyle:I,normalizeRecords:m,stringifyValue:f,buildDataTable:E,annotateVersionMetadata:M,buildPlotlyRecords:N,buildD3Records:L,buildObservableRecords:V,filterGallery:R,renderVisualization:q,initializeVisualizations:B,initializeGallery:$};typeof globalThis!="undefined"&&(globalThis.__DATALOG_VIZ_INTERNALS__=dt),Y||(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",W):W())})();
@@ -7,8 +7,15 @@ export function renderTagFilters(container, documents, selectedTags) {
7
7
  documents.forEach((item) => {
8
8
  const source = item.tags || item.topics || [];
9
9
  source.forEach((tag) => {
10
- if (tag) {
11
- tagSet.add(String(tag).toLowerCase());
10
+ if (!tag) {
11
+ return;
12
+ }
13
+
14
+ // Trim as well: a whitespace-only tag is truthy and used to render a
15
+ // button with no accessible name at all.
16
+ const normalized = String(tag).trim().toLowerCase();
17
+ if (normalized) {
18
+ tagSet.add(normalized);
12
19
  }
13
20
  });
14
21
  });
@@ -33,7 +33,7 @@ Gem::Specification.new do |spec|
33
33
  # tooling, Dockerfiles, etc.). Theme consumers get layouts/includes/sass/assets/
34
34
  # plugins/data/lib/bin and the licensing/changelog metadata.
35
35
  spec.files = Dir.chdir(__dir__) do
36
- `git ls-files -z`.split("\x0").select do |f|
36
+ tracked = `git ls-files -z`.split("\x0").select do |f|
37
37
  f.match?(%r{\A(?:_layouts|_includes|_sass|_plugins|_data|assets|lib|bin)/}) ||
38
38
  %w[
39
39
  LICENSE
@@ -43,6 +43,14 @@ Gem::Specification.new do |spec|
43
43
  datalog-theme.gemspec
44
44
  ].include?(f)
45
45
  end
46
+
47
+ # The browser bundles are build output, so git does not track them, but
48
+ # _data/js_manifest.json points every page at them: a gem without them
49
+ # gives consumers a site whose scripts all 404. Run `npm run build:js`
50
+ # before packaging; scripts/verify_gem_package.rb checks the result.
51
+ built = Dir.glob("assets/js/dist/**/*").select { |f| File.file?(f) }
52
+
53
+ (tracked + built).uniq.sort
46
54
  end
47
55
 
48
56
  spec.add_runtime_dependency "jekyll", "~> 4.3"
@@ -53,13 +61,13 @@ Gem::Specification.new do |spec|
53
61
  spec.add_runtime_dependency "sass-embedded", ">= 1.71"
54
62
  spec.add_runtime_dependency "jekyll-paginate", ">= 1.1"
55
63
  spec.add_runtime_dependency "jekyll-include-cache", ">= 0.2"
56
- spec.add_runtime_dependency "jekyll-jupyter-notebook", "~> 0.0.6"
57
64
  spec.add_runtime_dependency "jekyll-archives", ">= 2.2"
58
65
  spec.add_runtime_dependency "jekyll-remote-theme", ">= 0.4"
59
66
  spec.add_runtime_dependency "jekyll-redirect-from", ">= 0.16"
60
67
  spec.add_runtime_dependency "kramdown-parser-gfm", ">= 1.1"
61
68
  spec.add_runtime_dependency "webrick", ">= 1.8"
62
69
  spec.add_runtime_dependency "fastimage", ">= 2.2"
70
+ spec.add_runtime_dependency "loofah", ">= 2.19"
63
71
  spec.add_runtime_dependency "nokogiri", ">= 1.15"
64
72
  spec.add_runtime_dependency "mini_magick", ">= 4.12"
65
73
  spec.add_runtime_dependency "logger", ">= 1.6"
data/lib/datalog/cli.rb CHANGED
@@ -448,8 +448,26 @@ module Datalog
448
448
  false
449
449
  end
450
450
 
451
+ # Searches PATH directly instead of shelling out: `command -v` is a POSIX
452
+ # shell builtin with no executable behind it, so on Windows every lookup
453
+ # failed and `datalog check` reported all dependencies as missing.
451
454
  def command_available?(command)
452
- system("command", "-v", command, out: File::NULL, err: File::NULL)
455
+ return true if File.file?(command) && File.executable?(command)
456
+
457
+ extensions = if Gem.win_platform?
458
+ (ENV["PATHEXT"] || ".COM;.EXE;.BAT;.CMD").split(";")
459
+ else
460
+ [""]
461
+ end
462
+
463
+ ENV.fetch("PATH", "").split(File::PATH_SEPARATOR).any? do |directory|
464
+ next false if directory.empty?
465
+
466
+ extensions.any? do |extension|
467
+ candidate = File.join(directory, "#{command}#{extension}")
468
+ File.file?(candidate) && File.executable?(candidate)
469
+ end
470
+ end
453
471
  end
454
472
 
455
473
  def config_valid?(root)
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Datalog
4
4
  module Theme
5
- VERSION = "0.6.1" unless const_defined?(:VERSION)
5
+ VERSION = "0.7.0" unless const_defined?(:VERSION)
6
6
  end
7
7
  end
data/lib/datalog-theme.rb CHANGED
@@ -12,6 +12,22 @@ module Datalog
12
12
  def assets_path
13
13
  File.join(root, "assets")
14
14
  end
15
+
16
+ def plugins_path
17
+ File.join(root, "_plugins")
18
+ end
19
+
20
+ # Jekyll loads `_plugins/` for a site but not for a theme gem, so the
21
+ # tags and filters the layouts rely on ({% t %}, add_sri, tocify and the
22
+ # rest) have to be required here. Sites opt in by naming the theme in
23
+ # their `plugins:` list, which is what makes Jekyll require this file.
24
+ def load_plugins
25
+ Dir.glob(File.join(plugins_path, "*.rb")).sort.each do |plugin|
26
+ require plugin
27
+ end
28
+ end
15
29
  end
16
30
  end
17
31
  end
32
+
33
+ Datalog::Theme.load_plugins