Files
patrickcanal.it/public/search/index.html
2025-04-07 20:46:15 +02:00

301 lines
7.6 KiB
HTML

<!DOCTYPE html>
<html class="" lang="en-us"><head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<meta name="robots" content="noai, noimageai">
<meta name="viewport" content="width=device-width" />
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=7" />
<link
rel="icon"
href='/favicon.png'
/>
<link
rel="shortcut icon"
href='/favicon.ico'
type="image/x-icon"
/>
<link
rel="apple-touch-icon"
href='/apple-touch-icon.png'
/>
<link
rel="icon"
href='logo.svg'
type="image/svg+xml"
/>
<title>
Search &ndash;
Patrick Canal
</title>
<link href="/symbols-nerd-font/symbols-nerd-font.css" rel="stylesheet" />
<link href="/jetbrains-mono/jetbrains-mono.css" rel="stylesheet" />
<link type="text/css" rel="stylesheet" href=http://localhost:1313/css/styles.abbd6311bb4b6ca58f8e7398140529245ae0f6428b759fcd830742eee2619eabb900ba9914a9affb82aa9a16a9b9ea727bb315315a976a0db0e7513a5f12c504.css integrity="sha512-q71jEbtLbKWPjnOYFAUpJFrg9kKLdZ/NgwdC7uJhnqu5ALqZFKmv&#43;4Kqmhapuepye7MVMVqXag2w51E6XxLFBA==" />
<meta name="author" content="Patrick Canal" />
<meta name="description" content="" />
<meta property="og:site_name"
content='Patrick Canal' />
<meta property="og:title" content="Search" />
<meta property="og:type" content="article" />
<meta
property="article:author" content="Patrick Canal" />
<meta
property="article:published_time"
content='0001-01-01T00:00:00Z&#43;0000' />
<meta property="og:url" content="http://localhost:1313/search/" />
<meta property="og:image"
content="http://localhost:1313/img/icon.svg" />
<meta property="og:description" content="" />
<meta name="twitter:card" content="summary_large_image" />
<meta property="twitter:domain"
content='localhost:1313'
/>
<meta property="twitter:url" content="http://localhost:1313/search/" />
<meta name="twitter:title" content="Search" />
<meta name="twitter:image"
content="http://localhost:1313/img/icon.svg" />
<meta name="twitter:description" content="" />
<link rel="manifest" href="/manifest/index.json" />
</head>
<body>
<div id="baseContainer"><header class="">
<div class="titleAndSearchContainer">
<div id="titleContainer">
<a class="unstyledLink" href="/">
<img src='logo.svg' alt='Logo'/>
</a>
<div class="rightOfLogo">
<div class="titleAndHamburger">
<h1>
<a class="unstyledLink" href="/">Patrick Canal</a>
</h1>
</div>
<div id="wide_nav"><nav>
<ul id="main-nav">
<li><a href="/">Home</a></li>
<li><a href="/posts/">Posts</a></li>
<li><a href="/tags/">Tags</a></li>
</ul>
</nav>
</div>
</div>
</div>
</div>
<div id="links">
<a
rel="noreferrer"
target="_blank"
class="nerdlink"
href="/index.xml">
&#xf09e;
<span>
RSS
</span>
</a>
<a
rel="noreferrer"
target="_blank"
class="nerdlink"
href="https://github.com/Superredstone">
&#xf09b;
<span>
Github
</span>
</a>
</div>
</header>
<div id="contentContainer">
<div id="content">
<main>
<noscript>
You need to enable JavaScript to be able to search.
</noscript><div class="search">
<input id="searchbar" type="text" placeholder='Search' />
<span class="nerdlink" onclick="newSearch();">&#xf002;</span>
</div>
<script>
function newSearch() {
let term = searchbar.value.trim();
if (!term) return;
location.href = `/search/?q=${term}`;
}
searchbar.onkeyup = (ev) => {if (ev.keyCode == 13) newSearch()};
</script>
<div class="postlist " id="postlist">
</div><script>
const tagsStr = 'Tags'
function renderTags(tags) {
if (tags.length <= 0) return '';
let res = `| <span title=''> </span>`;
for (let tag of tags) {
res += `<a href="/tags/${tag}/">#${tag}</a>&#32;`;
}
return res;
}
function renderImage(image, link, alt) {
if (!image) return '';
return `<a href="${link}"><img src="${image}" alt="${alt}" /></a>`;
}
function renderSingleArticle(article) {
const tags = renderTags(article.tags)
const img = ''
const continueReadingStr = 'Continue reading'
const summ = `<div class="articlePreview">
<p>${article.summary}</p>
<p><a href="${article.link}">${continueReadingStr} </a></p>
</div>`
const dateStr = 'Date'
return `
<article class="card postlistitem">
<div>
<h2>
<a href="${article.link}">${article.title}</a>
</h2>
<p class="date">
<span title='${dateStr}'>󰃭 </span>
${article.date}
${tags}
</p>
${img}
${summ}
</div>
<hr />
</article>
`;
}
function renderArticles(articles) {
let rendered = articles.map(a => renderSingleArticle(a)).join('\n');
document.getElementById('postlist').innerHTML += rendered;
}
</script>
<script>
const noResFoundStr = "No results found"
function matchTags(page, term) {
for (let tag of page.tags) {
if (tag.includes(term)) return true;
}
return false;
}
function performSearch(term) {
document.getElementById('postlist').innerHTML = '';
term = term.toLowerCase();
fetch('/search/index.json').then(res => res.json())
.then(res => {
let articles = res.pages.filter(page => (
page.title.toLowerCase().includes(term) ||
matchTags(page, term) ||
page.text.includes(term)
));
if (articles.length > 0) renderArticles(articles);
else document.getElementById('postlist').innerHTML = `
<h3>${noResFoundStr}</h3>
`;
});
}
var url = location.href;
var baseUrl = url.split('?')[0];
var searchbar = document.getElementById('searchbar');
if (url.includes('?')) {
var urlParams = new URLSearchParams(url.split('?')[1]);
if (urlParams.has('q')) {
let searchTerm = urlParams.get('q');
searchbar.value = searchTerm;
performSearch(searchTerm);
}
}
</script>
</main><footer>
<hr />
<p><small>
2025 &copy; Patrick Canal
</small></p>
<p><small>
<a href='https://gitlab.com/gabmus/hugo-ficurinia'>Ficurinia theme</a> for <a href='https://gohugo.io'>Hugo</a> by <a href='https://gabmus.org'>Gabriele Musco</a>. Licensed under <a href='https://www.gnu.org/licenses/agpl-3.0.html'>GNU AGPLv3</a>.
</small></p>
</footer>
</div>
</div>
</div>
</body>
</html>