add post-description post-nav and related-posts
This commit is contained in:
21
layouts/partials/post-description.html
Normal file
21
layouts/partials/post-description.html
Normal file
@ -0,0 +1,21 @@
|
||||
{{- /* Get post description or generate it from the post content */ -}}
|
||||
{{- $max_length := default 200 .Params.max_length -}}
|
||||
|
||||
{{- $description := "" -}}
|
||||
{{- if .Description -}}
|
||||
{{- $description = .Description -}}
|
||||
{{- else if .Params.description -}}
|
||||
{{- $description = .Params.description -}}
|
||||
{{- else -}}
|
||||
{{- /* Remove the line number of the code snippet */ -}}
|
||||
{{- $content := .Content -}}
|
||||
|
||||
{{- if findRE `<td class="rouge-gutter gl"><pre class="lineno">` $content -}}
|
||||
{{- $content = replace $content `<td class="rouge-gutter gl"><pre class="lineno">` `<!-- <td class="rouge-gutter gl"><pre class="lineno">` -}}
|
||||
{{- $content = replace $content `</td><td class="rouge-code">` `</td> --><td class="rouge-code">` -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- $description = $content | markdownify | plainify | replaceRE `\s+` ` ` -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- (trim $description " ") | truncate $max_length | safeHTML -}}
|
32
layouts/partials/post-nav.html
Normal file
32
layouts/partials/post-nav.html
Normal file
@ -0,0 +1,32 @@
|
||||
<nav class="post-navigation d-flex justify-content-between" aria-label="Post Navigation">
|
||||
{{ $previous := i18n "post.button.previous" }}
|
||||
{{ $next := i18n "post.button.next" }}
|
||||
|
||||
{{ with .PrevInSection }}
|
||||
<a
|
||||
href="{{ .RelPermalink }}"
|
||||
class="btn btn-outline-primary"
|
||||
aria-label="{{ $previous }}"
|
||||
>
|
||||
<p>{{ .Title }}</p>
|
||||
</a>
|
||||
{{ else }}
|
||||
<div class="btn btn-outline-primary disabled" aria-label="{{ $previous }}">
|
||||
<p>-</p>
|
||||
</div>
|
||||
{{ end }}
|
||||
|
||||
{{ with .NextInSection }}
|
||||
<a
|
||||
href="{{ .RelPermalink }}"
|
||||
class="btn btn-outline-primary"
|
||||
aria-label="{{ $next }}"
|
||||
>
|
||||
<p>{{ .Title }}</p>
|
||||
</a>
|
||||
{{ else }}
|
||||
<div class="btn btn-outline-primary disabled" aria-label="{{ $next }}">
|
||||
<p>-</p>
|
||||
</div>
|
||||
{{ end }}
|
||||
</nav>
|
95
layouts/partials/related-posts.html
Normal file
95
layouts/partials/related-posts.html
Normal file
@ -0,0 +1,95 @@
|
||||
<!-- Recommend the other 3 posts according to the tags and categories of the current post. -->
|
||||
|
||||
{{ $TOTAL_SIZE := 3 }}
|
||||
{{ $TAG_SCORE := 1 }}
|
||||
{{ $CATEGORY_SCORE := 0.5 }}
|
||||
{{ $SEPARATOR := ":" }}
|
||||
|
||||
{{ $currentPage := . }}
|
||||
{{ $allPosts := where .Site.RegularPages "Type" "post" }}
|
||||
{{ $matchPosts := slice }}
|
||||
|
||||
<!-- Get posts with matching categories -->
|
||||
{{ range $currentPage.Params.categories }}
|
||||
{{ $categoryPosts := where $allPosts "Params.categories" "intersect" (slice .) }}
|
||||
{{ $matchPosts = $matchPosts | union $categoryPosts }}
|
||||
{{ end }}
|
||||
|
||||
<!-- Get posts with matching tags -->
|
||||
{{ range $currentPage.Params.tags }}
|
||||
{{ $tagPosts := where $allPosts "Params.tags" "intersect" (slice .) }}
|
||||
{{ $matchPosts = $matchPosts | union $tagPosts }}
|
||||
{{ end }}
|
||||
|
||||
|
||||
{{ $scoreList := slice }}
|
||||
|
||||
{{ range $i, $post := $matchPosts }}
|
||||
{{ if eq $post.RelPermalink $currentPage.RelPermalink }}
|
||||
{{ continue }}
|
||||
{{ end }}
|
||||
|
||||
{{ $score := 0 }}
|
||||
|
||||
<!-- Calculate tag score -->
|
||||
{{ range $post.Params.tags }}
|
||||
{{ if in $currentPage.Params.tags . }}
|
||||
{{ $score = add $score $TAG_SCORE }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
|
||||
<!-- Calculate category score -->
|
||||
{{ range $post.Params.categories }}
|
||||
{{ if in $currentPage.Params.categories . }}
|
||||
{{ $score = add $score $CATEGORY_SCORE }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
|
||||
{{ if gt $score 0 }}
|
||||
{{ $scoreItem := printf "%s%s%d" (string $score) $SEPARATOR $i }}
|
||||
{{ $scoreList = $scoreList | append $scoreItem }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
|
||||
{{ $indexList := slice }}
|
||||
|
||||
{{ if gt (len $scoreList) 0 }}
|
||||
{{ $scoreList = sort $scoreList "value" "desc" }}
|
||||
{{ range first $TOTAL_SIZE $scoreList }}
|
||||
{{ $parts := split . $SEPARATOR }}
|
||||
{{ $index := index $parts 1 | int }}
|
||||
{{ $indexList = $indexList | append $index }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
|
||||
{{ $relatePosts := slice }}
|
||||
|
||||
{{ range $indexList }}
|
||||
{{ $i := . }}
|
||||
{{ $post := index $matchPosts $i }}
|
||||
{{ $relatePosts = $relatePosts | append $post }}
|
||||
{{ end }}
|
||||
|
||||
{{ if gt (len $relatePosts) 0 }}
|
||||
<aside id="related-posts" aria-labelledby="related-label">
|
||||
<h3 class="mb-4" id="related-label">
|
||||
{{ i18n "post.relate_posts" }}
|
||||
</h3>
|
||||
<nav class="row row-cols-1 row-cols-md-2 row-cols-xl-3 g-4 mb-4">
|
||||
{{ range $relatePosts }}
|
||||
<article class="col">
|
||||
<a href="{{ .RelPermalink }}" class="post-preview card h-100">
|
||||
<div class="card-body">
|
||||
{{ partial "datetime.html" (dict "date" .Date "lang" site.Language.Lang) }}
|
||||
<h4 class="pt-0 my-2">{{ .Title }}</h4>
|
||||
<div class="text-muted">
|
||||
<p>{{ partial "post-description.html" . }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
</article>
|
||||
{{ end }}
|
||||
</nav>
|
||||
</aside>
|
||||
<!-- #related-posts -->
|
||||
{{ end }}
|
Reference in New Issue
Block a user