You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
270 lines
13 KiB
HTML
270 lines
13 KiB
HTML
5 years ago
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
|
||
|
<!-- Created by htmlize-1.56 in css mode. -->
|
||
|
<html>
|
||
|
<head>
|
||
|
<title>generate-blog.bash</title>
|
||
|
<style type="text/css">
|
||
|
<!--
|
||
|
body {
|
||
|
color: #f6f3e8;
|
||
|
background-color: #242424;
|
||
|
}
|
||
|
.builtin {
|
||
|
/* font-lock-builtin-face */
|
||
|
color: #e5786d;
|
||
|
}
|
||
|
.comment {
|
||
|
/* font-lock-comment-face */
|
||
|
color: #99968b;
|
||
|
}
|
||
|
.comment-delimiter {
|
||
|
/* font-lock-comment-delimiter-face */
|
||
|
color: #99968b;
|
||
|
}
|
||
|
.function-name {
|
||
|
/* font-lock-function-name-face */
|
||
|
color: #cae682;
|
||
|
}
|
||
|
.keyword {
|
||
|
/* font-lock-keyword-face */
|
||
|
color: #8ac6f2;
|
||
|
font-weight: bold;
|
||
|
}
|
||
|
.negation-char {
|
||
|
}
|
||
|
.sh-heredoc {
|
||
|
/* sh-heredoc */
|
||
|
color: #ffff00;
|
||
|
font-weight: bold;
|
||
|
}
|
||
|
.sh-quoted-exec {
|
||
|
/* sh-quoted-exec */
|
||
|
color: #fa8072;
|
||
|
}
|
||
|
.string {
|
||
|
/* font-lock-string-face */
|
||
|
color: #95e454;
|
||
|
}
|
||
|
.variable-name {
|
||
|
/* font-lock-variable-name-face */
|
||
|
color: #cae682;
|
||
|
}
|
||
|
|
||
|
a {
|
||
|
color: inherit;
|
||
|
background-color: inherit;
|
||
|
font: inherit;
|
||
|
text-decoration: inherit;
|
||
|
}
|
||
|
a:hover {
|
||
|
text-decoration: underline;
|
||
|
}
|
||
|
-->
|
||
|
</style>
|
||
|
</head>
|
||
|
<body>
|
||
|
<pre>
|
||
|
<span class="comment-delimiter">#</span><span class="comment">!/bin/</span><span class="keyword">bash</span><span class="comment">
|
||
|
</span><span class="comment-delimiter">##</span><span class="comment">
|
||
|
</span><span class="comment-delimiter"># </span><span class="comment">Generate html page with blog article excerpts from ./posts.txt. Post file names should
|
||
|
</span><span class="comment-delimiter"># </span><span class="comment">be added to ./posts.txt in the exact order that they are supposed to appear on the blog
|
||
|
</span><span class="comment-delimiter"># </span><span class="comment">page.
|
||
|
</span>
|
||
|
<span class="comment-delimiter"># </span><span class="comment">Check if required executables can be found
|
||
|
</span><span class="keyword">if ! </span><span class="builtin">type</span> readlink dirname html2text mv cat cksum base64; <span class="keyword">then</span>
|
||
|
<span class="builtin">echo</span> <span class="string">'One or more required executables are not present. Generation cancelled'</span> >&2
|
||
|
<span class="keyword">exit</span> 1
|
||
|
<span class="keyword">fi</span>
|
||
|
|
||
|
<span class="comment-delimiter"># </span><span class="comment">Determine script directory (requires GNU readlink)
|
||
|
</span><span class="variable-name">here</span>=<span class="string">"$(</span><span class="sh-quoted-exec">dirname</span><span class="string"> "$(</span><span class="sh-quoted-exec">readlink</span><span class="string"> -f "${BASH_SOURCE[0]}")")"</span>
|
||
|
|
||
|
<span class="builtin">printf</span> <span class="string">'Changing directory: '</span>
|
||
|
<span class="builtin">pushd</span> <span class="string">"$here"</span> || <span class="keyword">exit</span> $<span class="variable-name">?</span>
|
||
|
|
||
|
<span class="variable-name">posts_file</span>=<span class="string">"$here/posts.txt"</span>
|
||
|
|
||
|
<span class="keyword">if</span> <span class="negation-char">!</span> [[ -f <span class="string">"$posts_file"</span> ]]; <span class="keyword">then</span>
|
||
|
<span class="builtin">printf</span> <span class="string">'Posts file "%s" not found. Generation cancelled.\n'</span> <span class="string">"$posts_file"</span> >&2
|
||
|
<span class="keyword">exit</span> 1
|
||
|
<span class="keyword">fi</span>
|
||
|
|
||
|
<span class="function-name">escape-html</span>() {
|
||
|
sed <span class="string">'s/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g; s/"/\&quot;/g; s/'"'"'/\&#39;/g'</span>
|
||
|
}
|
||
|
|
||
|
<span class="function-name">html-to-text</span>() {
|
||
|
html2text -nobs -style compact <span class="string">"$@"</span>
|
||
|
}
|
||
|
|
||
|
<span class="function-name">print-blog-html-top</span>() {
|
||
|
<span class="builtin">echo</span> <span class="string">'<html>
|
||
|
<head>
|
||
|
<title>Blog</title>
|
||
|
<meta charset="UTF-8">
|
||
|
</head>
|
||
|
|
||
|
<style type="text/css">
|
||
|
html {
|
||
|
font-family: Helvetica, Arial, sans-serif;
|
||
|
color: #5b4636;
|
||
|
background-color: #f4ecd8;
|
||
|
}
|
||
|
|
||
|
body {
|
||
|
padding: 1em;
|
||
|
margin: auto;
|
||
|
}
|
||
|
|
||
|
@media only all and (pointer: coarse), (pointer: none) {
|
||
|
body {
|
||
|
font-size: 5.5vmin;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@media only all and (pointer: fine) {
|
||
|
body {
|
||
|
font-size: calc(16px + 0.6vmin);
|
||
|
min-width: 500px;
|
||
|
max-width: 50em;
|
||
|
}
|
||
|
}
|
||
|
</style>
|
||
|
|
||
|
<body>
|
||
|
<div style="display: flex; flex-direction: horizontal;">
|
||
|
<a href="index.html">Home</a>
|
||
|
<span style="margin-left: 1em; margin-right: 1em;">|</span>
|
||
|
<a href="feed.xml">RSS Feed</a>
|
||
|
</div>
|
||
|
<h1>Blog</h1>
|
||
|
'</span>
|
||
|
}
|
||
|
|
||
|
<span class="function-name">print-blog-html-bottom</span>() {
|
||
|
<span class="builtin">echo</span> <span class="string">' </body>
|
||
|
</html>'</span>
|
||
|
}
|
||
|
|
||
|
<span class="comment-delimiter"># </span><span class="comment">Note: pubDate and lastBuildDate are both set to the current time.
|
||
|
</span><span class="function-name">print-blog-rss-top</span>() {
|
||
|
cat <<EOF<span class="sh-heredoc">
|
||
|
<?xml version="1.0"?>
|
||
|
<rss version="2.0">
|
||
|
<channel>
|
||
|
<title>Hugot Blog</title>
|
||
|
<link>https://hugot.nl/blog.html</link>
|
||
|
<description>Hugo's personal blog</description>
|
||
|
<language>en-us</language>
|
||
|
<pubDate>$(</span><span class="sh-quoted-exec">date</span><span class="sh-heredoc">)</pubDate>
|
||
|
<lastBuildDate>$(</span><span class="sh-quoted-exec">date</span><span class="sh-heredoc">)</lastBuildDate>
|
||
|
<docs>http://blogs.law.harvard.edu/tech/rss</docs>
|
||
|
<generator>Hugo's Custom Bash Script</generator>
|
||
|
<managingEditor>social@hugot.nl</managingEditor>
|
||
|
<webMaster>infra@hugot.nl</webMaster>
|
||
|
EOF
|
||
|
</span>}
|
||
|
|
||
|
<span class="function-name">print-blog-rss-bottom</span>() {
|
||
|
<span class="builtin">echo</span> <span class="string">'</channel>
|
||
|
</rss>'</span>
|
||
|
}
|
||
|
|
||
|
<span class="function-name">el</span>() {
|
||
|
<span class="variable-name">format_string</span>=<span class="string">"$1"</span>
|
||
|
<span class="builtin">shift</span>
|
||
|
|
||
|
<span class="builtin">printf</span> <span class="string">"<$format_string>"</span> <span class="string">"$@"</span>
|
||
|
}
|
||
|
|
||
|
<span class="function-name">el-close</span>() {
|
||
|
<span class="builtin">echo</span> <span class="string">"</$1>"</span>
|
||
|
}
|
||
|
|
||
|
<span class="function-name">el-enclose</span>() {
|
||
|
<span class="variable-name">element_name</span>=<span class="string">"$1"</span>
|
||
|
<span class="builtin">shift</span>
|
||
|
|
||
|
<span class="builtin">printf</span> <span class="string">'%s'</span> <span class="string">"<$element_name>"</span>
|
||
|
<span class="builtin">printf</span> <span class="string">'%s'</span> <span class="string">"$@"</span>
|
||
|
<span class="builtin">printf</span> <span class="string">'%s'</span> <span class="string">"</$element_name>"</span>
|
||
|
}
|
||
|
|
||
|
<span class="variable-name">site_url</span>=<span class="string">"https://hugot.nl"</span>
|
||
|
|
||
|
<span class="variable-name">blog_html</span>=<span class="string">"$here/blog.html"</span>
|
||
|
<span class="variable-name">new_html</span>=<span class="string">"$blog_html.new"</span>
|
||
|
|
||
|
<span class="variable-name">blog_rss</span>=<span class="string">"$here/feed.xml"</span>
|
||
|
<span class="variable-name">new_rss</span>=<span class="string">"$blog_rss.new"</span>
|
||
|
|
||
|
print-blog-html-top > <span class="string">"$new_html"</span>
|
||
|
print-blog-rss-top > <span class="string">"$new_rss"</span>
|
||
|
|
||
|
<span class="keyword">while </span><span class="builtin">read</span> -r post_html; <span class="keyword">do</span>
|
||
|
<span class="comment-delimiter"># </span><span class="comment">Convert the post's html to text to make it easier to use the blog's text
|
||
|
</span> <span class="variable-name">text</span>=<span class="string">"$(</span><span class="sh-quoted-exec">html-to-text</span><span class="string"> "$post_html" | escape-html)"</span> || <span class="keyword">exit</span> $<span class="variable-name">?</span>
|
||
|
|
||
|
<span class="comment-delimiter"># </span><span class="comment">The title should be on the 2nd line of text, right after the link to the
|
||
|
</span> <span class="comment-delimiter"># </span><span class="comment">homepage. This is a bit inflexible but it will do for now.
|
||
|
</span> <span class="variable-name">title</span>=<span class="string">"$(</span><span class="sh-quoted-exec">tail</span><span class="string"> -n +2 <<<"$text" | head -n 1 | tr -d '*')"</span> || <span class="keyword">exit</span> $<span class="variable-name">?</span>
|
||
|
|
||
|
<span class="comment-delimiter"># </span><span class="comment">Use the first 5 lines after the title as post excerpt.
|
||
|
</span> <span class="variable-name">excerpt</span>=<span class="string">"$(</span><span class="sh-quoted-exec">tail</span><span class="string"> -n +3 <<<"$text" | head -n 5)"</span> || <span class="keyword">exit</span> $<span class="variable-name">?</span>
|
||
|
|
||
|
<span class="comment-delimiter"># </span><span class="comment">Escape the post html file name to safely use it in the generated html.
|
||
|
</span> <span class="variable-name">href</span>=<span class="string">"$(</span><span class="sh-quoted-exec">escape-html</span><span class="string"> <<<"$post_html")"</span> || <span class="keyword">exit</span> $<span class="variable-name">?</span>
|
||
|
|
||
|
<span class="variable-name">post_dir</span>=<span class="string">"$(</span><span class="sh-quoted-exec">dirname</span><span class="string"> "$post_html")"</span> || <span class="keyword">exit</span> $<span class="variable-name">?</span>
|
||
|
<span class="variable-name">pubdate_file</span>=<span class="string">"$post_dir/publish_date.txt"</span>
|
||
|
|
||
|
<span class="comment-delimiter"># </span><span class="comment">Determine a publishing date for the post
|
||
|
</span> <span class="keyword">if</span> [[ -f <span class="string">"$pubdate_file"</span> ]]; <span class="keyword">then</span>
|
||
|
<span class="builtin">read</span> -r pubdate < <span class="string">"$pubdate_file"</span>
|
||
|
<span class="keyword">else</span>
|
||
|
<span class="variable-name">pubdate</span>=<span class="string">"$(</span><span class="sh-quoted-exec">date</span><span class="string">)"</span>
|
||
|
<span class="builtin">echo</span> <span class="string">"$pubdate"</span> > <span class="string">"$pubdate_file"</span>
|
||
|
<span class="keyword">fi</span>
|
||
|
|
||
|
{
|
||
|
el div
|
||
|
|
||
|
el <span class="string">'a href="%s"'</span> <span class="string">"$href"</span>
|
||
|
<span class="builtin">printf</span> <span class="string">'<h2 style="margin-bottom: 0.1em;">%s</h2>'</span> <span class="string">"$title"</span>
|
||
|
el-close a
|
||
|
|
||
|
<span class="builtin">printf</span> <span class="string">'<i style="font-size: 0.8em;">%s</i>'</span> <span class="string">"$pubdate"</span>
|
||
|
|
||
|
el <span class="string">'p style="margin-top: 0.5em;"'</span>
|
||
|
<span class="builtin">printf</span> <span class="string">'%s ... <a href="%s">Continue reading</a>'</span> <span class="string">"$excerpt"</span> <span class="string">"$href"</span>
|
||
|
el-close p
|
||
|
|
||
|
el-close div
|
||
|
|
||
|
el hr
|
||
|
} >> <span class="string">"$new_html"</span>
|
||
|
|
||
|
{
|
||
|
el item
|
||
|
el-enclose title <span class="string">"$title"</span>
|
||
|
el-enclose link <span class="string">"$site_url/$href"</span>
|
||
|
el-enclose description <span class="string">"$excerpt"</span>
|
||
|
el-enclose pubDate <span class="string">"$pubdate"</span>
|
||
|
|
||
|
<span class="builtin">echo</span> <span class="string">"<guid isPermaLink=\"false\">$title$(</span><span class="sh-quoted-exec">base64</span><span class="string"> <(cksum <<<"$text"))</guid>"</span>
|
||
|
|
||
|
el-close item
|
||
|
} >> <span class="string">"$new_rss"</span>
|
||
|
<span class="keyword"> done</span> < <span class="string">"$posts_file"</span>
|
||
|
|
||
|
print-blog-html-bottom >> <span class="string">"$new_html"</span>
|
||
|
print-blog-rss-bottom >> <span class="string">"$new_rss"</span>
|
||
|
|
||
|
mv -v <span class="string">"$new_html"</span> <span class="string">"$blog_html"</span> || <span class="keyword">exit</span> $<span class="variable-name">?</span>
|
||
|
mv -v <span class="string">"$new_rss"</span> <span class="string">"$blog_rss"</span> || <span class="keyword">exit</span> $<span class="variable-name">?</span>
|
||
|
|
||
|
<span class="builtin"> echo</span> <span class="string">'SUCCESS!'</span>
|
||
|
</pre>
|
||
|
</body>
|
||
|
</html>
|