1
0
mirror of https://github.com/alexandrev/xslt-lab.git synced 2026-09-22 05:33:16 +00:00

Move Hugo blog source to main, fix workflow, add new articles and llms.txt

- Move site/ Hugo source from gh-pages to main so the workflow can trigger correctly
- Fix publish-hugo.yml: now in main, builds and deploys to gh-pages:docs/ via peaceiris/actions-gh-pages
- Add 3 new SEO articles: XSLT 3.0 features, beginners guide, template matching
- Add llms.txt to blog and frontend so ChatGPT/Gemini can recommend the tool better
- Remove stale /site mkdocs ignore rule, add site/public to gitignore instead

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
alexandrev-tibco
2026-04-08 14:40:12 +02:00
parent 4c76714011
commit 8e8b7eacec
27 changed files with 1150 additions and 1 deletions
+39
View File
@@ -0,0 +1,39 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ block "title" . }}{{ with .Title }}{{ . }} | {{ end }}{{ .Site.Title }}{{ end }}</title>
<meta name="description" content="{{ with .Description }}{{ . }}{{ else }}{{ .Site.Params.subtitle }}{{ end }}">
{{ partial "adsense/head.html" . }}
<link rel="stylesheet" href="{{ "css/main.css" | relURL }}">
</head>
{{- $ethicalAds := and .Site.Params.ethicalads.publisher (ne hugo.Environment "development") -}}
<body{{ if $ethicalAds }} class="has-ethicalads"{{ end }}>
{{ partial "ethicalads.html" . }}
<header class="site-header">
<div class="container header-grid">
<div>
<a class="brand" href="{{ "/" | relURL }}">{{ .Site.Title }}</a>
<p class="tagline">{{ .Site.Params.subtitle }}</p>
</div>
<nav>
<ul class="nav">
{{ range .Site.Menus.main }}
<li><a href="{{ .URL }}">{{ .Name }}</a></li>
{{ end }}
</ul>
</nav>
</div>
</header>
<main class="container">
{{ block "main" . }}{{ end }}
</main>
<footer class="site-footer">
<div class="container footer-grid">
<p>Built with Hugo · {{ now.Format "2006-01-02" }}</p>
<p class="muted">Repo: <a href="https://github.com/alexandrev/xslt-lab">alexandrev/xslt-lab</a></p>
</div>
</footer>
</body>
</html>
+19
View File
@@ -0,0 +1,19 @@
{{ define "main" }}
<section class="page-header">
<p class="eyebrow">{{ .Section | title }}</p>
<h1>{{ .Title }}</h1>
{{ with .Description }}<p class="lead">{{ . }}</p>{{ end }}
</section>
<ul class="post-list spaced">
{{ range .Paginator.Pages }}
<li>
<a href="{{ .RelPermalink }}">{{ .Title }}</a>
<span class="muted">{{ .Date.Format "02 Jan 2006" }}</span>
{{ with .Params.description }}<p class="muted">{{ . }}</p>{{ end }}
</li>
{{ end }}
</ul>
{{ template "_internal/pagination.html" . }}
{{ end }}
+13
View File
@@ -0,0 +1,13 @@
{{ define "main" }}
<article class="post">
<p class="eyebrow">{{ .Section | title }}</p>
<h1>{{ .Title }}</h1>
<p class="muted">{{ .Date.Format "02 Jan 2006" }}</p>
{{ with .Params.description }}<p class="lead">{{ . }}</p>{{ end }}
{{ partial "adsense/in-article.html" . }}
<div class="content">
{{ .Content }}
</div>
<p class="muted back-link"><a href="{{ .CurrentSection.RelPermalink }}">← Back to {{ .CurrentSection.Title }}</a></p>
</article>
{{ end }}
+42
View File
@@ -0,0 +1,42 @@
{{ define "main" }}
<section class="hero">
<p class="eyebrow">Online XSLT Editor</p>
<h1>{{ .Title }}</h1>
<p class="lead">{{ .Params.description | default .Site.Params.lead }}</p>
<div class="cta-row">
<a class="button" href="https://xsltplayground.com">Open the playground</a>
<a class="button ghost" href="{{ "/posts/" | relURL }}">Read updates</a>
<a class="button ghost" href="https://alexandrev.github.io/xslt-lab/index.yaml">Helm chart index</a>
</div>
</section>
<section class="grid">
<article class="card">
<p class="eyebrow">How the playground helps</p>
<h2>Built for real XSLT work</h2>
<p>Run XSLT online with multiple inputs and parameters, see results as you type, and get timing hints to spot regressions before they hit production.</p>
<ul class="checks">
<li>Multi-parameter transforms</li>
<li>Live execution and inline output</li>
<li>Timing to guide optimization</li>
</ul>
</article>
<article class="card">
<p class="eyebrow">Latest posts</p>
<h2>Recent updates</h2>
<ul class="post-list">
{{ $posts := first 3 (where .Site.RegularPages "Section" "posts") }}
{{ if gt (len $posts) 0 }}
{{ range $posts }}
<li>
<a href="{{ .RelPermalink }}">{{ .Title }}</a>
<span class="muted">{{ .Date.Format "02 Jan 2006" }}</span>
</li>
{{ end }}
{{ else }}
<li class="muted">No posts yet. Add more in <code>site/content/posts/</code>.</li>
{{ end }}
</ul>
</article>
</section>
{{ end }}
@@ -0,0 +1,5 @@
{{- $client := .Site.Params.adsense.client -}}
{{- if and $client (ne hugo.Environment "development") -}}
<meta name="google-adsense-account" content="{{ $client }}">
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client={{ $client }}" crossorigin="anonymous"></script>
{{- end -}}
@@ -0,0 +1,15 @@
{{- $client := .Site.Params.adsense.client -}}
{{- $slot := .Site.Params.adsense.inArticleSlot -}}
{{- if and $client $slot (ne hugo.Environment "development") -}}
<div class="ad ad-in-article">
<ins class="adsbygoogle"
style="display:block; text-align:center;"
data-ad-layout="in-article"
data-ad-format="fluid"
data-ad-client="{{ $client }}"
data-ad-slot="{{ $slot }}"></ins>
</div>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
{{- end -}}
+13
View File
@@ -0,0 +1,13 @@
{{- $publisher := .Site.Params.ethicalads.publisher -}}
{{- if and $publisher (ne hugo.Environment "development") -}}
{{ if not (.Scratch.Get "ethicalads_loaded") -}}
<script async src="https://media.ethicalads.io/media/client/ethicalads.min.js"></script>
{{ .Scratch.Set "ethicalads_loaded" true }}
{{- end }}
<div class="ad-bar">
<div class="container ad-bar-inner">
<span class="muted">Sponsored</span>
<div class="ethical-ad" data-ea-publisher="{{ $publisher }}" data-ea-type="image"></div>
</div>
</div>
{{- end -}}