wip
This commit is contained in:
parent
bb24585590
commit
9fe1ef3498
|
@ -1,39 +1,21 @@
|
||||||
#!/usr/bin/env zsh
|
#!/usr/bin/env zsh
|
||||||
|
|
||||||
cd "$(git rev-parse --show-toplevel)" || exit 1
|
cd "$(git rev-parse --show-toplevel)" || exit 1
|
||||||
|
|
||||||
xfic="$1"
|
xfic="$1"
|
||||||
dst="$2"
|
dst="$2"
|
||||||
|
|
||||||
# Directory
|
# Directory
|
||||||
webdir="_site"
|
|
||||||
postsdir="$webdir/posts"
|
|
||||||
indexdir=".cache/rss"
|
indexdir=".cache/rss"
|
||||||
|
|
||||||
# HTML Accessors (similar to CSS accessors)
|
# HTML Accessors (similar to CSS accessors)
|
||||||
dateaccessor='.yyydate'
|
dateaccessor='.yyydate'
|
||||||
# title and keyword shouldn't be changed
|
# title and keyword shouldn't be changed
|
||||||
titleaccessor='title'
|
titleaccessor='title'
|
||||||
keywordsaccessor='meta[name=keywords]::attr(content)'
|
|
||||||
|
|
||||||
formatdate() {
|
|
||||||
# format the date for RSS
|
|
||||||
local d="$1"
|
|
||||||
# echo "DEBUG DATE: $d" >&2
|
|
||||||
LC_TIME=en_US date --date $d +'%a, %d %b %Y %H:%M:%S %z'
|
|
||||||
}
|
|
||||||
finddate(){ < $1 hxselect -c $dateaccessor | sed 's/\[//g;s/\]//g;s/ .*$//' }
|
finddate(){ < $1 hxselect -c $dateaccessor | sed 's/\[//g;s/\]//g;s/ .*$//' }
|
||||||
findtitle(){ < $1 hxselect -c $titleaccessor }
|
findtitle(){ < $1 hxselect -c $titleaccessor }
|
||||||
findkeywords(){ < $1 hxselect -c $keywordsaccessor | sed 's/,/ /g' }
|
|
||||||
mktaglist(){
|
|
||||||
for keyword in $*; do
|
|
||||||
printf "<span class=\"tag\">%s</span>" $keyword
|
|
||||||
done | sed 's#><#>, <#g'
|
|
||||||
}
|
|
||||||
|
|
||||||
autoload -U colors && colors
|
autoload -U colors && colors
|
||||||
|
|
||||||
postfile="$(echo "$xfic"|sed 's#^'$postsdir'/##')"
|
|
||||||
blogfile="$(echo "$xfic"|sed 's#.xml$#.html#;s#^'$indexdir'/#posts/#')"
|
blogfile="$(echo "$xfic"|sed 's#.xml$#.html#;s#^'$indexdir'/#posts/#')"
|
||||||
printf "%-30s" $blogfile
|
printf "%-30s" $blogfile
|
||||||
d=$(finddate $xfic)
|
d=$(finddate $xfic)
|
||||||
|
@ -42,16 +24,10 @@ rssdate=$(formatdate $d)
|
||||||
title=$(findtitle $xfic)
|
title=$(findtitle $xfic)
|
||||||
keywords=( $(findkeywords $xfic) )
|
keywords=( $(findkeywords $xfic) )
|
||||||
printf ": %-55s" "$title ($keywords)"
|
printf ": %-55s" "$title ($keywords)"
|
||||||
taglist=$(mktaglist $keywords)
|
|
||||||
{ printf "\\n<li>"
|
{ printf "\\n<li>"
|
||||||
printf "\\n<span class=\"pubDate\">%s</span>" "$d"
|
printf "\\n<span class=\"pubDate\">%s</span>" "$d"
|
||||||
printf "\\n<a href=\"%s\">%s</a>" "${blogfile}" "$title"
|
printf "\\n<a href=\"%s\">%s</a>" "${blogfile}" "$title"
|
||||||
printf "\\n</li>\\n\\n"
|
printf "\\n</li>\\n\\n"
|
||||||
} >> ${dst}.tmp
|
} >> ${dst}
|
||||||
|
|
||||||
# overwrite only if the value in the index are different
|
|
||||||
if ! cmp -s ${dst} ${dst}.tmp; then
|
|
||||||
echo " [${fg[yellow]}M${reset_color}]"
|
|
||||||
mv -f ${dst}.tmp ${dst}
|
|
||||||
fi
|
|
||||||
echo " [${fg[green]}OK${reset_color}]"
|
echo " [${fg[green]}OK${reset_color}]"
|
||||||
|
|
|
@ -1,61 +1,31 @@
|
||||||
#!/usr/bin/env zsh
|
#!/usr/bin/env zsh
|
||||||
|
|
||||||
|
autoload -U colors && colors
|
||||||
cd "$(git rev-parse --show-toplevel)" || exit 1
|
cd "$(git rev-parse --show-toplevel)" || exit 1
|
||||||
# Directory
|
# Directory
|
||||||
webdir="_site"
|
webdir="_site"
|
||||||
postsdir="$webdir/posts"
|
|
||||||
indexfile="$webdir/index.html"
|
indexfile="$webdir/index.html"
|
||||||
indexdir=".cache/rss"
|
indexdir=".cache/rss"
|
||||||
|
|
||||||
# maximal number of articles to put in the index homepage
|
|
||||||
maxarticles=1000
|
|
||||||
|
|
||||||
# HTML Accessors (similar to CSS accessors)
|
|
||||||
dateaccessor='.yyydate'
|
|
||||||
# title and keyword shouldn't be changed
|
|
||||||
titleaccessor='title'
|
|
||||||
keywordsaccessor='meta[name=keywords]::attr(content)'
|
|
||||||
|
|
||||||
formatdate() {
|
|
||||||
# format the date for RSS
|
|
||||||
local d="$1"
|
|
||||||
# echo "DEBUG DATE: $d" >&2
|
|
||||||
LC_TIME=en_US date --date $d +'%a, %d %b %Y %H:%M:%S %z'
|
|
||||||
}
|
|
||||||
finddate(){ < $1 hxselect -c $dateaccessor | sed 's/\[//g;s/\]//g;s/ .*$//' }
|
|
||||||
findtitle(){ < $1 hxselect -c $titleaccessor }
|
|
||||||
findkeywords(){ < $1 hxselect -c $keywordsaccessor | sed 's/,/ /g' }
|
|
||||||
mktaglist(){
|
|
||||||
for keyword in $*; do
|
|
||||||
printf "<span class=\"tag\">%s</span>" $keyword
|
|
||||||
done | sed 's#><#>, <#g'
|
|
||||||
}
|
|
||||||
|
|
||||||
autoload -U colors && colors
|
|
||||||
tmpdir=$(mktemp -d)
|
tmpdir=$(mktemp -d)
|
||||||
|
|
||||||
echo "Publishing"
|
echo "Publishing"
|
||||||
|
|
||||||
# building the body
|
|
||||||
|
|
||||||
|
|
||||||
dateaccessor='.pubDate'
|
dateaccessor='.pubDate'
|
||||||
finddate(){ < $1 hxselect -c $dateaccessor }
|
finddate(){ < $1 hxselect -c $dateaccessor }
|
||||||
|
# generate files with <DATE>-<FILENAME>.index
|
||||||
previousyear=""
|
|
||||||
for fic in $indexdir/**/*.index; do
|
for fic in $indexdir/**/*.index; do
|
||||||
d=$(finddate $fic)
|
d=$(finddate $fic)
|
||||||
echo "${${fic:h}:t} [$d]"
|
echo "${${fic:h}:t} [$d]"
|
||||||
cp $fic $tmpdir/$d-${${fic:h}:t}.index
|
cp $fic $tmpdir/$d-${${fic:h}:t}.index
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# for every post in reverse order
|
||||||
|
# generate the body (there is some logic to group by year)
|
||||||
previousyear=""
|
previousyear=""
|
||||||
for fic in $(ls $tmpdir/*.index | sort -r); do
|
for fic in $(ls $tmpdir/*.index | sort -r); do
|
||||||
d=$(finddate $fic)
|
d=$(finddate $fic)
|
||||||
echo "${fic:t}"
|
|
||||||
year=$( echo "$d" | perl -pe 's#(\d{4})-.*#$1#')
|
year=$( echo "$d" | perl -pe 's#(\d{4})-.*#$1#')
|
||||||
if (( year != previousyear )); then
|
if (( year != previousyear )); then
|
||||||
echo $year
|
|
||||||
if (( previousyear > 0 )); then
|
if (( previousyear > 0 )); then
|
||||||
echo "</ul>" >> $tmpdir/index
|
echo "</ul>" >> $tmpdir/index
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -62,11 +62,6 @@ absoluteurl="${websiteurl}/${blogfile}"
|
||||||
printf "%s" "$categories"
|
printf "%s" "$categories"
|
||||||
printf "\\n<description><![CDATA[\\n%s\\n]]></description>" "$(getcontent "$xfic" "$absoluteurl")"
|
printf "\\n<description><![CDATA[\\n%s\\n]]></description>" "$(getcontent "$xfic" "$absoluteurl")"
|
||||||
printf "\\n</item>\\n\\n"
|
printf "\\n</item>\\n\\n"
|
||||||
} > "${dst}.tmp"
|
} > "${dst}"
|
||||||
|
|
||||||
# overwrite only if the value in the index are different
|
|
||||||
if ! cmp -s ${dst} ${dst}.tmp; then
|
|
||||||
echo " [${fg[yellow]}M${reset_color}]"
|
|
||||||
mv -f ${dst}.tmp ${dst}
|
|
||||||
fi
|
|
||||||
echo " [${fg[green]}OK${reset_color}]"
|
echo " [${fg[green]}OK${reset_color}]"
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
#+KEYWORDS: blog static
|
#+KEYWORDS: blog static
|
||||||
#+AUTHOR: Yann Esposito
|
#+AUTHOR: Yann Esposito
|
||||||
#+EMAIL: yann@esposito.host
|
#+EMAIL: yann@esposito.host
|
||||||
#+DATE: [2021-05-09 Sun]
|
#+DATE: [2021-05-25 Tue]
|
||||||
#+LANG: en
|
#+LANG: en
|
||||||
#+OPTIONS: auto-id:t
|
#+OPTIONS: auto-id:t
|
||||||
#+STARTUP: showeverything
|
#+STARTUP: showeverything
|
||||||
|
@ -11,6 +11,7 @@
|
||||||
This article will dig a bit deeper about how I generate my static website.
|
This article will dig a bit deeper about how I generate my static website.
|
||||||
In a [[https://her.esy.fun/posts/0017-static-blog-builder/index.html][previous article]] I just gave the rationale and an overview to do it
|
In a [[https://her.esy.fun/posts/0017-static-blog-builder/index.html][previous article]] I just gave the rationale and an overview to do it
|
||||||
yourself.
|
yourself.
|
||||||
|
Mainly it is very fast and portable.
|
||||||
|
|
||||||
A few goal reached by my current build system are:
|
A few goal reached by my current build system are:
|
||||||
|
|
||||||
|
@ -317,14 +318,71 @@ an XML out of it).
|
||||||
So now we just want to generate the main =index.html= page at the root of
|
So now we just want to generate the main =index.html= page at the root of
|
||||||
the site.
|
the site.
|
||||||
This page should list all articles by date in reverse order.
|
This page should list all articles by date in reverse order.
|
||||||
To achieve this I wrote a short shell script but here is the corresponding
|
|
||||||
rule in the Makefile:
|
So the first step is to take advantage of the cache index.
|
||||||
|
For every XML file I generated before I should generate the small HTML
|
||||||
|
block I want for every entry.
|
||||||
|
For this I use a script =mk-index-entry.sh=.
|
||||||
|
He will use =hxclean= to retrieve the date and the title from the cached
|
||||||
|
XML files.
|
||||||
|
Then generate a small file just containing the date and the link.
|
||||||
|
|
||||||
|
Here is the block in the Makefile:
|
||||||
|
|
||||||
|
#+begin_src makefile
|
||||||
|
DST_INDEX_FILES ?= $(patsubst %.xml,%.index, $(DST_XML_FILES))
|
||||||
|
MK_INDEX_ENTRY := ./engine/mk-index-entry.sh
|
||||||
|
INDEX_CACHE_DIR ?= $(CACHE_DIR)/rss
|
||||||
|
$(INDEX_CACHE_DIR)/%.index: $(INDEX_CACHE_DIR)/%.xml $(MK_INDEX_ENTRY)
|
||||||
|
@mkdir -p $(INDEX_CACHE_DIR)
|
||||||
|
$(MK_INDEX_ENTRY) "$<" "$@"
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
which reads, for every =.xml= file generate a =.index= file with
|
||||||
|
=mk-index-entry.sh=.
|
||||||
|
|
||||||
|
#+begin_src sh
|
||||||
|
#!/usr/bin/env zsh
|
||||||
|
|
||||||
|
# prelude
|
||||||
|
cd "$(git rev-parse --show-toplevel)" || exit 1
|
||||||
|
xfic="$1"
|
||||||
|
dst="$2"
|
||||||
|
indexdir=".cache/rss"
|
||||||
|
|
||||||
|
# HTML Accessors (similar to CSS accessors)
|
||||||
|
dateaccessor='.yyydate'
|
||||||
|
# title and keyword shouldn't be changed
|
||||||
|
titleaccessor='title'
|
||||||
|
finddate(){ < $1 hxselect -c $dateaccessor | sed 's/\[//g;s/\]//g;s/ .*$//' }
|
||||||
|
findtitle(){ < $1 hxselect -c $titleaccessor }
|
||||||
|
|
||||||
|
autoload -U colors && colors
|
||||||
|
|
||||||
|
blogfile="$(echo "$xfic"|sed 's#.xml$#.html#;s#^'$indexdir'/#posts/#')"
|
||||||
|
printf "%-30s" $blogfile
|
||||||
|
d=$(finddate $xfic)
|
||||||
|
echo -n " [$d]"
|
||||||
|
rssdate=$(formatdate $d)
|
||||||
|
title=$(findtitle $xfic)
|
||||||
|
keywords=( $(findkeywords $xfic) )
|
||||||
|
printf ": %-55s" "$title ($keywords)"
|
||||||
|
{ printf "\\n<li>"
|
||||||
|
printf "\\n<span class=\"pubDate\">%s</span>" "$d"
|
||||||
|
printf "\\n<a href=\"%s\">%s</a>" "${blogfile}" "$title"
|
||||||
|
printf "\\n</li>\\n\\n"
|
||||||
|
} >> ${dst}
|
||||||
|
|
||||||
|
echo " [${fg[green]}OK${reset_color}]"
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
Then I use these intermediate file to generate a single bigger index file.
|
||||||
|
|
||||||
#+begin_src makefile
|
#+begin_src makefile
|
||||||
# HTML INDEX
|
|
||||||
HTML_INDEX := $(DST_DIR)/index.html
|
HTML_INDEX := $(DST_DIR)/index.html
|
||||||
MKINDEX := engine/mk-index.sh
|
MKINDEX := engine/mk-index.sh
|
||||||
$(HTML_INDEX): $(DST_XML_FILES) $(MKINDEX) $(TEMPLATE)
|
INDEX_TEMPLATE ?= templates/index.html
|
||||||
|
$(HTML_INDEX): $(DST_INDEX_FILES) $(MKINDEX) $(INDEX_TEMPLATE)
|
||||||
@mkdir -p $(DST_DIR)
|
@mkdir -p $(DST_DIR)
|
||||||
$(MKINDEX)
|
$(MKINDEX)
|
||||||
.PHONY: index
|
.PHONY: index
|
||||||
|
@ -332,87 +390,49 @@ index: $(HTML_INDEX)
|
||||||
ALL += index
|
ALL += index
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
My =mk-index.sh= script takes advantage of the index files we constructed
|
This script is a big one, but it is not that complex.
|
||||||
before with =hxclean=.
|
For every file, I generate a new file =DATE-dirname=, I sort them in
|
||||||
Mainly I use =hxselect= to find the information I want to find, the
|
reverse order and put their content in the middle of an HTML file.
|
||||||
title, the date and the keywords.
|
|
||||||
So my script is composed of three parts:
|
|
||||||
|
|
||||||
1. declare the accessors (think CSS-like accessor)
|
The important part is that it is only generated if the index change.
|
||||||
2. for all files in the cache retrieve the metas, and sort them by date
|
So first part of the script handle the creation of file using the date in
|
||||||
3. compose the content
|
their file name which will help us sort them later.
|
||||||
|
|
||||||
#+begin_src bash
|
|
||||||
|
#+begin_src sh
|
||||||
#!/usr/bin/env zsh
|
#!/usr/bin/env zsh
|
||||||
|
|
||||||
|
autoload -U colors && colors
|
||||||
cd "$(git rev-parse --show-toplevel)" || exit 1
|
cd "$(git rev-parse --show-toplevel)" || exit 1
|
||||||
# Directory
|
# Directory
|
||||||
webdir="_site"
|
webdir="_site"
|
||||||
postsdir="$webdir/posts"
|
|
||||||
indexfile="$webdir/index.html"
|
indexfile="$webdir/index.html"
|
||||||
indexdir=".cache/rss"
|
indexdir=".cache/rss"
|
||||||
|
|
||||||
# maximal number of articles to put in the index homepage
|
|
||||||
maxarticles=1000
|
|
||||||
|
|
||||||
# HTML Accessors (similar to CSS accessors)
|
|
||||||
dateaccessor='.yyydate'
|
|
||||||
# title and keyword shouldn't be changed
|
|
||||||
titleaccessor='title'
|
|
||||||
keywordsaccessor='meta[name=keywords]::attr(content)'
|
|
||||||
|
|
||||||
formatdate() {
|
|
||||||
# format the date for RSS
|
|
||||||
local d="$1"
|
|
||||||
# echo "DEBUG DATE: $d" >&2
|
|
||||||
LC_TIME=en_US date --date $d +'%a, %d %b %Y %H:%M:%S %z'
|
|
||||||
}
|
|
||||||
finddate(){ < $1 hxselect -c $dateaccessor | sed 's/\[//g;s/\]//g;s/ .*$//' }
|
|
||||||
findtitle(){ < $1 hxselect -c $titleaccessor }
|
|
||||||
findkeywords(){ < $1 hxselect -c $keywordsaccessor | sed 's/,/ /g' }
|
|
||||||
mktaglist(){
|
|
||||||
for keyword in $*; do
|
|
||||||
printf "\\n<span class=\"tag\">%s</span>" $keyword
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
autoload -U colors && colors
|
|
||||||
tmpdir=$(mktemp -d)
|
tmpdir=$(mktemp -d)
|
||||||
typeset -a dates
|
|
||||||
dates=( )
|
|
||||||
for xfic in $indexdir/**/*.xml; do
|
|
||||||
postfile="$(echo "$xfic"|sed 's#^'$postsdir'/##')"
|
|
||||||
blogfile="$(echo "$xfic"|sed 's#.xml$#.html#;s#^'$indexdir'/#posts/#')"
|
|
||||||
printf "%-30s" $postfile
|
|
||||||
d=$(finddate $xfic)
|
|
||||||
echo -n " [$d]"
|
|
||||||
rssdate=$(formatdate $d)
|
|
||||||
title=$(findtitle $xfic)
|
|
||||||
keywords=( $(findkeywords $xfic) )
|
|
||||||
printf ": %-55s" "$title ($keywords)"
|
|
||||||
taglist=$(mktaglist $keywords)
|
|
||||||
{ printf "\\n<li>"
|
|
||||||
printf "\\n<a href=\"%s\">%s</a>" "${blogfile}" "$title"
|
|
||||||
printf "\\n<span class=\"pubDate\">%s</span>%s" "$d"
|
|
||||||
printf "<span class=\"tags\">%s</span>" "$taglist"
|
|
||||||
printf "\\n</li>\\n\\n"
|
|
||||||
} >> "$tmpdir/${d}-$(basename $xfic).index"
|
|
||||||
dates=( $d $dates )
|
|
||||||
echo " [${fg[green]}OK${reset_color}]"
|
|
||||||
done
|
|
||||||
|
|
||||||
echo "Publishing"
|
echo "Publishing"
|
||||||
|
|
||||||
# building the body
|
dateaccessor='.pubDate'
|
||||||
|
finddate(){ < $1 hxselect -c $dateaccessor }
|
||||||
|
# generate files with <DATE>-<FILENAME>.index
|
||||||
|
for fic in $indexdir/**/*.index; do
|
||||||
|
d=$(finddate $fic)
|
||||||
|
echo "${${fic:h}:t} [$d]"
|
||||||
|
cp $fic $tmpdir/$d-${${fic:h}:t}.index
|
||||||
|
done
|
||||||
|
#+end_src
|
||||||
|
|
||||||
cat templates/index-preamble.html >> $tmpdir/index
|
Then I use these files to generate a file that will contain the =body= of
|
||||||
|
the HTML.
|
||||||
|
|
||||||
|
#+begin_src sh
|
||||||
|
# for every post in reverse order
|
||||||
|
# generate the body (there is some logic to group by year)
|
||||||
previousyear=""
|
previousyear=""
|
||||||
for fic in $(ls $tmpdir/*.index | sort -r | head -n $maxarticles ); do
|
for fic in $(ls $tmpdir/*.index | sort -r); do
|
||||||
echo "${fic:t}"
|
d=$(finddate $fic)
|
||||||
year=$( echo "${fic:t}" | perl -pe 's#(\d{4})-.*#$1#')
|
year=$( echo "$d" | perl -pe 's#(\d{4})-.*#$1#')
|
||||||
if (( year != previousyear )); then
|
if (( year != previousyear )); then
|
||||||
echo $year
|
|
||||||
if (( previousyear > 0 )); then
|
if (( previousyear > 0 )); then
|
||||||
echo "</ul>" >> $tmpdir/index
|
echo "</ul>" >> $tmpdir/index
|
||||||
fi
|
fi
|
||||||
|
@ -421,10 +441,14 @@ for fic in $(ls $tmpdir/*.index | sort -r | head -n $maxarticles ); do
|
||||||
fi
|
fi
|
||||||
cat $fic >> $tmpdir/index
|
cat $fic >> $tmpdir/index
|
||||||
done
|
done
|
||||||
cat templates/index-postamble.html >> $tmpdir/index
|
echo "</ul>" >> $tmpdir/index
|
||||||
|
#+end_src
|
||||||
|
|
||||||
title="Yann Esposito's Posts"
|
And finally, I render the HTML using a template within a shell script:
|
||||||
description="The index of my most recent articles."
|
|
||||||
|
#+begin_src sh
|
||||||
|
title="Y"
|
||||||
|
description="Most recent articles"
|
||||||
author="Yann Esposito"
|
author="Yann Esposito"
|
||||||
body=$(< $tmpdir/index)
|
body=$(< $tmpdir/index)
|
||||||
date=$(LC_TIME=en_US date +'%Y-%m-%d')
|
date=$(LC_TIME=en_US date +'%Y-%m-%d')
|
||||||
|
@ -432,7 +456,7 @@ date=$(LC_TIME=en_US date +'%Y-%m-%d')
|
||||||
# A neat trick to use pandoc template within a shell script
|
# A neat trick to use pandoc template within a shell script
|
||||||
# the pandoc templates use $x$ format, we replace it by just $x
|
# the pandoc templates use $x$ format, we replace it by just $x
|
||||||
# to be used with envsubst
|
# to be used with envsubst
|
||||||
template=$(< templates/post.html | \
|
template=$(< templates/index.html | \
|
||||||
sed 's/\$\(header-includes\|table-of-content\)\$//' | \
|
sed 's/\$\(header-includes\|table-of-content\)\$//' | \
|
||||||
sed 's/\$if.*\$//' | \
|
sed 's/\$if.*\$//' | \
|
||||||
perl -pe 's#(\$[^\$]*)\$#$1#g' )
|
perl -pe 's#(\$[^\$]*)\$#$1#g' )
|
||||||
|
@ -448,3 +472,131 @@ template=$(< templates/post.html | \
|
||||||
rm -rf $tmpdir
|
rm -rf $tmpdir
|
||||||
echo "* HTML INDEX [done]"
|
echo "* HTML INDEX [done]"
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
** RSS
|
||||||
|
:PROPERTIES:
|
||||||
|
:CUSTOM_ID: rss
|
||||||
|
:END:
|
||||||
|
|
||||||
|
So for my RSS generation this is quite similar to the system I use to
|
||||||
|
generate my index file.
|
||||||
|
I just slightly improved the rules.
|
||||||
|
|
||||||
|
The makefile blocks look like:
|
||||||
|
|
||||||
|
#+begin_src makefile
|
||||||
|
# RSS
|
||||||
|
DST_RSS_FILES ?= $(patsubst %.xml,%.rss, $(DST_XML_FILES))
|
||||||
|
MK_RSS_ENTRY := ./engine/mk-rss-entry.sh
|
||||||
|
$(RSS_CACHE_DIR)/%.rss: $(RSS_CACHE_DIR)/%.xml $(MK_RSS_ENTRY)
|
||||||
|
@mkdir -p $(RSS_CACHE_DIR)
|
||||||
|
$(MK_RSS_ENTRY) "$<" "$@"
|
||||||
|
|
||||||
|
RSS := $(DST_DIR)/rss.xml
|
||||||
|
MKRSS := engine/mkrss.sh
|
||||||
|
$(RSS): $(DST_RSS_FILES) $(MKRSS)
|
||||||
|
$(MKRSS)
|
||||||
|
|
||||||
|
.PHONY: rss
|
||||||
|
rss: $(RSS)
|
||||||
|
ALL += rss
|
||||||
|
#+end_src
|
||||||
|
** Gemini
|
||||||
|
:PROPERTIES:
|
||||||
|
:CUSTOM_ID: gemini
|
||||||
|
:END:
|
||||||
|
|
||||||
|
I wrote a minimal script to transform my org files to gemini files.
|
||||||
|
I also need to generate an index and an atom file for gemini:
|
||||||
|
|
||||||
|
#+begin_src makefile
|
||||||
|
# ORG -> GEMINI
|
||||||
|
EXT := .org
|
||||||
|
SRC_GMI_FILES ?= $(shell find $(SRC_DIR) -type f -name "*$(EXT)" $(NO_DRAFT))
|
||||||
|
DST_GMI_FILES ?= $(subst $(EXT),.gmi, \
|
||||||
|
$(patsubst $(SRC_DIR)/%,$(DST_DIR)/%, \
|
||||||
|
$(SRC_GMI_FILES)))
|
||||||
|
GMI := engine/org2gemini.sh
|
||||||
|
$(DST_DIR)/%.gmi: $(SRC_DIR)/%.org $(GMI) engine/org2gemini_step1.sh
|
||||||
|
@mkdir -p $(dir $@)
|
||||||
|
$(GMI) "$<" "$@"
|
||||||
|
ALL += $(DST_GMI_FILES)
|
||||||
|
.PHONY: gmi
|
||||||
|
gmi: $(DST_GMI_FILES)
|
||||||
|
|
||||||
|
# GEMINI INDEX
|
||||||
|
GMI_INDEX := $(DST_DIR)/index.gmi
|
||||||
|
MK_GMI_INDEX := engine/mk-gemini-index.sh
|
||||||
|
$(GMI_INDEX): $(DST_GMI_FILES) $(MK_GMI_INDEX)
|
||||||
|
@mkdir -p $(DST_DIR)
|
||||||
|
$(MK_GMI_INDEX)
|
||||||
|
ALL += $(GMI_INDEX)
|
||||||
|
.PHONY: gmi-index
|
||||||
|
gmi-index: $(GMI_INDEX)
|
||||||
|
|
||||||
|
# RSS
|
||||||
|
GEM_ATOM := $(DST_DIR)/gem-atom.xml
|
||||||
|
MK_GEMINI_ATOM := engine/mk-gemini-atom.sh
|
||||||
|
$(GEM_ATOM): $(DST_GMI_FILES) $(MK_GEMINI_ATOM)
|
||||||
|
$(MK_GEMINI_ATOM)
|
||||||
|
ALL += $(GEM_ATOM)
|
||||||
|
.PHONY: gmi-atom
|
||||||
|
gmi-atom: $(GMI_ATOM)
|
||||||
|
|
||||||
|
.PHONY: gemini
|
||||||
|
gemini: $(DST_GMI_FILES) $(GMI_INDEX) $(GEM_ATOM)
|
||||||
|
#+end_src
|
||||||
|
** Images
|
||||||
|
:PROPERTIES:
|
||||||
|
:CUSTOM_ID: images
|
||||||
|
:END:
|
||||||
|
|
||||||
|
For images, I try to convert all of them with imagemagick to compress them.
|
||||||
|
|
||||||
|
#+begin_src makefile
|
||||||
|
# Images
|
||||||
|
SRC_IMG_FILES ?= $(shell find $(SRC_DIR) -type f -name "*.jpg" -or -name "*.jpeg" -or -name "*.gif" -or -name "*.png")
|
||||||
|
DST_IMG_FILES ?= $(patsubst $(SRC_DIR)/%,$(DST_DIR)/%, $(SRC_IMG_FILES))
|
||||||
|
|
||||||
|
$(DST_DIR)/%.jpg: $(SRC_DIR)/%.jpg
|
||||||
|
@mkdir -p $(dir $@)
|
||||||
|
convert "$<" -quality 50 -resize 800x800\> "$@"
|
||||||
|
|
||||||
|
$(DST_DIR)/%.jpg: $(SRC_DIR)/%.jpeg
|
||||||
|
@mkdir -p $(dir $@)
|
||||||
|
convert "$<" -quality 50 -resize 800x800\> "$@"
|
||||||
|
|
||||||
|
$(DST_DIR)/%.gif: $(SRC_DIR)/%.gif
|
||||||
|
@mkdir -p $(dir $@)
|
||||||
|
convert "$<" -quality 50 -resize 800x800\> "$@"
|
||||||
|
|
||||||
|
$(DST_DIR)/%.png: $(SRC_DIR)/%.png
|
||||||
|
@mkdir -p $(dir $@)
|
||||||
|
convert "$<" -quality 50 -resize 800x800\> "$@"
|
||||||
|
|
||||||
|
.PHONY: img
|
||||||
|
img: $(DST_IMG_FILES)
|
||||||
|
ALL += $(DST_IMG_FILES)
|
||||||
|
#+end_src
|
||||||
|
** Deploy
|
||||||
|
:PROPERTIES:
|
||||||
|
:CUSTOM_ID: deploy
|
||||||
|
:END:
|
||||||
|
|
||||||
|
A nice bonus is that I also deploy my website using make.
|
||||||
|
And note I protect myself from Makefile temporary bugs for the =clean= rule.
|
||||||
|
|
||||||
|
#+begin_src makefile
|
||||||
|
# DEPLOY
|
||||||
|
.PHONY: site
|
||||||
|
site: $(ALL)
|
||||||
|
|
||||||
|
.PHONY: deploy
|
||||||
|
deploy: $(ALL)
|
||||||
|
engine/sync.sh
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
-[ ! -z "$(DST_DIR)" ] && rm -rf $(DST_DIR)/*
|
||||||
|
-[ ! -z "$(CACHE_DIR)" ] && rm -rf $(CACHE_DIR)/*
|
||||||
|
#+end_src
|
||||||
|
|
|
@ -17,9 +17,9 @@
|
||||||
<div id="logo">
|
<div id="logo">
|
||||||
<a href="/">
|
<a href="/">
|
||||||
<svg width="3em" viewBox="0 0 64 64">
|
<svg width="3em" viewBox="0 0 64 64">
|
||||||
<circle cx="32" cy="32" r="30" stroke="#a3aec2" stroke-width="2" fill="#2E3440"/>
|
<circle cx="32" cy="32" r="30" stroke="#a3aec2" stroke-width="1" fill="#2E3440"/>
|
||||||
<circle cx="32" cy="32" r="12" stroke="#e62729" stroke-width="2" fill="#d84100"/>
|
<circle cx="32" cy="32" r="12" stroke="#e60000" stroke-width="1" fill="#d84100"/>
|
||||||
<circle cx="32" cy="32" r="6" stroke-width="0" fill="#c18600"/>
|
<circle cx="32" cy="32" r="5" stroke="#f60" stroke-width="2" fill="#fa0"/>
|
||||||
<ellipse cx="32" cy="14" rx="14" ry="8" stroke-width="0" fill="#FFF"/>
|
<ellipse cx="32" cy="14" rx="14" ry="8" stroke-width="0" fill="#FFF"/>
|
||||||
</svg>
|
</svg>
|
||||||
</a>
|
</a>
|
||||||
|
|
Loading…
Reference in New Issue