summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--feed.scm79
-rw-r--r--main.scm22
-rw-r--r--static/Merriweather-Black.ttfbin0 -> 141700 bytes
-rw-r--r--static/Merriweather-BlackItalic.ttfbin0 -> 142620 bytes
-rw-r--r--static/Merriweather-Bold.ttfbin0 -> 142040 bytes
-rw-r--r--static/Merriweather-BoldItalic.ttfbin0 -> 143832 bytes
-rw-r--r--static/Merriweather-Italic.ttfbin0 -> 142648 bytes
-rw-r--r--static/Merriweather-Light.ttfbin0 -> 148124 bytes
-rw-r--r--static/Merriweather-LightItalic.ttfbin0 -> 142056 bytes
-rw-r--r--static/Merriweather-Regular.ttfbin0 -> 149120 bytes
-rw-r--r--static/OFL.txt93
-rw-r--r--static/style.css164
-rw-r--r--template.html8
-rw-r--r--utils.scm10
-rwxr-xr-xvendor/bin/pandoc-rss227
-rw-r--r--vendor/share/pandoc-rss/data/language-codes103
-rw-r--r--vendor/share/pandoc-rss/data/templates/date.value1
-rw-r--r--vendor/share/pandoc-rss/data/templates/item.xml14
18 files changed, 713 insertions, 8 deletions
diff --git a/feed.scm b/feed.scm
index de1d4ac..57a0afb 100644
--- a/feed.scm
+++ b/feed.scm
@@ -1,4 +1,4 @@
-(module feed (generate-feed)
+(module feed (generate-feed generate-archive-index)
(import scheme
(chicken base)
(chicken format)
@@ -6,12 +6,16 @@
(chicken io)
(chicken process)
(chicken pathname)
+ (chicken irregex)
+ srfi-1
+ srfi-13
+ srfi-132
utils)
- (define (generate-feed archive-dir out-dir)
+ (define (generate-feed src-dir archive-dir out-dir)
(define paths (glob (format "~A/*" archive-dir)))
(define output-port
- (process "pandoc-rss"
+ (process "vendor/bin/pandoc-rss"
(apply list "-s"
"-t" "jan's garden"
"-d" "RSS feed for Jan's personal digital garden"
@@ -22,5 +26,70 @@
"-w" "https://jan.systems"
paths)))
(define output (read-string #f output-port))
- (with-output-to-file (make-pathname out-dir "feed.xml")
- (λ () (print output)))))
+ (define out-path (make-pathname out-dir "feed.xml"))
+ (printf "[info] writing RSS feed to \"~A\"~%" out-path)
+ (with-output-to-file out-path
+ (λ () (print output))))
+
+ (define (collect-fm-lines lines #!optional (acc '()))
+ (if (string=? "---" (car lines))
+ acc
+ (collect-fm-lines (cdr lines) (cons (car lines) acc))))
+
+ (define (extract-field field fm) (call/cc (@ extract-field* field fm)))
+ (define (extract-field* field fm return)
+ (define (search line)
+ (define irx (format "^~A: (.+?)$" field))
+ (define m (irregex-search irx line))
+ (if m
+ (return (submatch m))))
+
+ (for-each search fm)
+ #f)
+
+ (define (read-md-frontmatter md-path)
+ (define lines (with-input-from-file md-path
+ (λ () (read-lines))))
+
+ (define (inner return)
+ (if (not (string=? "---" (car lines)))
+ (return #f))
+
+ (define fm (collect-fm-lines (cdr lines)))
+ `((title . ,(extract-field "title" fm))
+ (date . ,(extract-field "date" fm))
+ (kind . ,(extract-field "kind" fm))))
+
+ (call/cc (@ inner)))
+
+ (define (generate-archive-index archive-dir src-dir)
+ (define paths (pipe (glob (format "~A/*" archive-dir))
+ (@ filter (@ irregex-search "\\.md$"))))
+
+ (define index-alist (map (λ (path) (cons path (read-md-frontmatter path))) paths))
+ ;; newest first
+ (define (compare a b)
+ (string>? (assocdr 'date (cdr a)) (assocdr 'date (cdr b))))
+
+ (list-sort! compare index-alist)
+
+ (define (to-li pair)
+ (define path (car pair))
+ (define title (assocdr 'title (cdr pair)))
+ (define date (assocdr 'date (cdr pair)))
+ (define kind (assocdr 'kind (cdr pair)))
+ (define link (pipe path
+ (@ replace (format "^~A\\/?" src-dir) "/")
+ (@ replace "\\.md$" ".html")))
+ (format "* [~A (~A) [~A]](~A)" title date kind link))
+
+ (define index-lis (map to-li index-alist))
+ (define out-md (string-append "---\n"
+ "title: Archive\n"
+ "---\n"
+ "# Archive\n\n"
+ (string-join index-lis "\n")))
+
+ (with-output-to-file (make-pathname archive-dir "index.md")
+ (λ () (print out-md))))
+ )
diff --git a/main.scm b/main.scm
index 150c3d4..4459b75 100644
--- a/main.scm
+++ b/main.scm
@@ -27,6 +27,8 @@
"template.html"))
(define feed-dir (or (get-environment-variable "FEED_DIR")
(make-pathname src-dir "archive")))
+(define static-dir (or (get-environment-variable "STATIC_DIR")
+ "static"))
(assert (> (string-length src-dir) 0))
(assert (> (string-length out-dir) 0))
@@ -118,12 +120,28 @@
(delete-file path)))
(for-each (@ delete) (glob (format "~A/*" dir))))
+(define (remove-old-archive-index)
+ (define path (make-pathname feed-dir "index.md"))
+ (if (file-exists? path)
+ (delete-file path)))
+
+(define (copy-directory from to)
+ (read-string #f (process "cp" (list "-r"
+ from
+ to))))
+
;; run
-(printf "[info] generating feed from directory \"~A\"~%" feed-dir)
-(generate-feed feed-dir out-dir)
+(printf "[info] removing old archive index.md~%")
+(remove-old-archive-index)
(printf "[info] cleaning up output directory \"~A\"~%" out-dir)
(clean-dir out-dir)
+(printf "[info] generating feed from archive directory \"~A\"~%" feed-dir)
+(generate-feed src-dir feed-dir out-dir)
+(printf "[info] generating archive index.md~%")
+(generate-archive-index feed-dir src-dir)
(printf "[info] generating site with pages from \"~A\"~%" src-dir)
(process-dir src-dir)
+(printf "[info] copying static files from \"~A\"~%" static-dir)
+(copy-directory static-dir (make-pathname out-dir static-dir))
(printf "[info] done.~%")
diff --git a/static/Merriweather-Black.ttf b/static/Merriweather-Black.ttf
new file mode 100644
index 0000000..50c3b33
--- /dev/null
+++ b/static/Merriweather-Black.ttf
Binary files differ
diff --git a/static/Merriweather-BlackItalic.ttf b/static/Merriweather-BlackItalic.ttf
new file mode 100644
index 0000000..4879aba
--- /dev/null
+++ b/static/Merriweather-BlackItalic.ttf
Binary files differ
diff --git a/static/Merriweather-Bold.ttf b/static/Merriweather-Bold.ttf
new file mode 100644
index 0000000..3e10e02
--- /dev/null
+++ b/static/Merriweather-Bold.ttf
Binary files differ
diff --git a/static/Merriweather-BoldItalic.ttf b/static/Merriweather-BoldItalic.ttf
new file mode 100644
index 0000000..5b9d0ec
--- /dev/null
+++ b/static/Merriweather-BoldItalic.ttf
Binary files differ
diff --git a/static/Merriweather-Italic.ttf b/static/Merriweather-Italic.ttf
new file mode 100644
index 0000000..8e9d03d
--- /dev/null
+++ b/static/Merriweather-Italic.ttf
Binary files differ
diff --git a/static/Merriweather-Light.ttf b/static/Merriweather-Light.ttf
new file mode 100644
index 0000000..034ef03
--- /dev/null
+++ b/static/Merriweather-Light.ttf
Binary files differ
diff --git a/static/Merriweather-LightItalic.ttf b/static/Merriweather-LightItalic.ttf
new file mode 100644
index 0000000..4d19550
--- /dev/null
+++ b/static/Merriweather-LightItalic.ttf
Binary files differ
diff --git a/static/Merriweather-Regular.ttf b/static/Merriweather-Regular.ttf
new file mode 100644
index 0000000..3fecc77
--- /dev/null
+++ b/static/Merriweather-Regular.ttf
Binary files differ
diff --git a/static/OFL.txt b/static/OFL.txt
new file mode 100644
index 0000000..03dd415
--- /dev/null
+++ b/static/OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2016 The Merriweather Project Authors (https://github.com/EbenSorkin/Merriweather), with Reserved Font Name "Merriweather".
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/static/style.css b/static/style.css
new file mode 100644
index 0000000..d6ee94d
--- /dev/null
+++ b/static/style.css
@@ -0,0 +1,164 @@
+body {
+ font-size: 16px;
+ margin: 20px auto;
+ padding: 10px 15px;
+ max-width: 800px;
+
+ font-family: "Merriweather", serif;
+ font-optical-sizing: auto;
+ font-weight: 400;
+ font-style: normal;
+
+ line-height: 35px;
+
+ hyphens: initial;
+}
+
+:root {
+ --dark--text-color: #fff;
+ --dark--link-color: #bbf;
+ --dark--bg-color: #222;
+ --dark--blockquote-color: #ccc;
+ --dark--blockquote-bg-color: #60606020;
+ --dark--code-bg-color: #353535;
+
+ --light--text-color: #1a1a1a;
+ --light--link-color: #0090a0;
+ --light--bg-color: #fff;
+ --light--blockquote-color: #606060;
+ --light--blockquote-bg-color: #c8c8c820;
+ --light--code-bg-color: #eee;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --text-color: var(--dark--text-color);
+ --link-color: var(--dark--link-color);
+ --bg-color: var(--dark--bg-color);
+ --blockquote-color: var(--dark--blockquote-color);
+ --blockquote-bg-color: var(--dark--blockquote-bg-color);
+ --code-bg-color: var(--dark--code-bg-color);
+ }
+}
+@media (prefers-color-scheme: light) {
+ :root {
+ --text-color: var(--light--text-color);
+ --link-color: var(--light--link-color);
+ --bg-color: var(--light--bg-color);
+ --blockquote-color: var(--light--blockquote-color);
+ --blockquote-bg-color: var(--light--blockquote-bg-color);
+ --code-bg-color: var(--light--code-bg-color);
+ }
+}
+
+html.dark {
+ --text-color: var(--dark--text-color);
+ --link-color: var(--dark--link-color);
+ --bg-color: var(--dark--bg-color);
+ --blockquote-color: var(--dark--blockquote-color);
+ --blockquote-bg-color: var(--dark--blockquote-bg-color);
+ --code-bg-color: var(--dark--code-bg-color);
+}
+
+html.light {
+ --text-color: var(--light--text-color);
+ --link-color: var(--light--link-color);
+ --bg-color: var(--light--bg-color);
+ --blockquote-color: var(--light--blockquote-color);
+ --blockquote-bg-color: var(--light--blockquote-bg-color);
+ --code-bg-color: var(--light--code-bg-color);
+}
+
+html {
+ color: var(--text-color);
+ background-color: var(--bg-color);
+}
+
+a, a:visited {
+ color: var(--link-color);
+}
+
+blockquote {
+ color: var(--blockquote-color);
+}
+
+#dark-mode-btn {
+ border: none;
+ background: none;
+ font-size: 30px;
+ cursor: pointer;
+}
+
+.header-row {
+ display: flex;
+ flex-flow: row nowrap;
+ align-items: center;
+ justify-content: space-between;
+
+ margin: 30px 0;
+}
+
+.header-row h1 {
+ margin: 0;
+}
+
+.page-title {
+ text-decoration: none;
+ color: var(--text-color) !important;
+ font-size: 32px;
+ font-weight: 700;
+}
+
+.page-title:hover {
+ text-decoration: underline;
+}
+
+code {
+ padding: 8px 10px;
+ background-color: var(--code-bg-color);
+}
+
+pre, div.sourceCode {
+ padding: 8px 10px;
+ overflow-x: scroll;
+ background-color: var(--code-bg-color);
+}
+
+img {
+ max-width: 100%;
+ width: 100%;
+ margin: 20px 0;
+}
+
+blockquote {
+ display: block;
+ background-color: var(--blockquote-bg-color);
+ border-left: 10px solid var(--link-color);
+ margin: 20px 0;
+ padding: 2px 10px;
+ quotes: "\201C""\201D""\2018""\2019";
+}
+
+figure {
+ max-width: 100%;
+ padding: 0;
+ margin: 10px 0;
+ display: block;
+}
+
+hr {
+ background: none !important;
+ height: 0;
+ margin: 40px auto;
+ border: none;
+ border-top: 2px dotted var(--text-color) !important;
+ width: 50%;
+}
+
+.nojs-hidden {
+ display: none;
+}
+
+small {
+ color: grey;
+}
diff --git a/template.html b/template.html
index d0160cd..b6c4aaf 100644
--- a/template.html
+++ b/template.html
@@ -63,7 +63,7 @@ $endif$
</head>
<body>
<div class="header-row">
- <h1><a class="page-title" href="/">jan&#39;s garden</a></h1>
+ <a class="page-title" href="/">jan&#39;s garden</a>
<div id="dark-mode-btn"></div>
</div>
<nav>
@@ -73,6 +73,12 @@ $endif$
<a href="/archive">archive</a>
</nav>
+ $if(title)$
+ $if(hide-body-title)$
+ $else$
+ <h1>$title$ $if(date)$<small>($date$)</small>$endif$ $if(kind)$<small>[$kind$]</small>$endif$</h1>
+ $endif$
+ $endif$
$body$
<script>
diff --git a/utils.scm b/utils.scm
index 9bb290e..a7f7b17 100644
--- a/utils.scm
+++ b/utils.scm
@@ -35,4 +35,14 @@
(define (submatch m #!optional (index 1))
(irregex-match-substring m index))
+
+ (define (assocar key alist)
+ (match (assoc key alist)
+ [#f #f]
+ [pair (car pair)]))
+
+ (define (assocdr key alist)
+ (match (assoc key alist)
+ [#f #f]
+ [pair (cdr pair)]))
)
diff --git a/vendor/bin/pandoc-rss b/vendor/bin/pandoc-rss
new file mode 100755
index 0000000..f1a1d7d
--- /dev/null
+++ b/vendor/bin/pandoc-rss
@@ -0,0 +1,227 @@
+#!/bin/sh
+
+# Forked from https://github.com/chambln/pandoc-rss
+# MIT/X Consortium License
+
+# © 2020 Gregory Chamberlain <greg@cosine.blue>
+
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+SHARE=${0%/*}/../share/${0##*/}
+TEMPLATES_DIR=$SHARE/data/templates
+DOMAIN=${PWD##*/}
+EMAIL=${EMAIL:-webmaster@$DOMAIN}
+
+usage ()
+{
+ cat <<EOF
+Usage: ${0##*/} [OPTIONS] [FILE]...
+ -s Produce standalone XML
+ -t TITLE 'Example Feed'
+ -d DESCRIPTION 'Short description of the feed'
+ -l LINK http://example.net
+ -f FORMAT blog/%s.html => http://example.net/blog/%s.html
+ -w WEBMASTER 'webmaster@example.net (Real Name)'
+ -c COPYRIGHT 'Year © Name, CC BY-SA 4.0'
+ -n LANGUAGE en-GB
+EOF
+}
+
+get_language_code ()
+{
+ [ -n "$LANG" ] || exit 1
+ code=${LANG%%.*}
+ primary_code=${code%%_*}
+ subcode=${code#$primary_code}
+ subcode=${subcode#_}
+ printf %s\\n "$primary_code${subcode:+-$subcode}"
+}
+
+is_valid_language_code ()
+{
+ arg=$(printf %s "$1" | tr [A-Z] [a-z])
+ while IFS=' ' read -r code _
+ do
+ [ x"$code" = x"#" ] && continue
+ [ x"$code" = x"$arg" ] && return 0
+ done < $SHARE/data/language-codes
+ return 1
+}
+
+get_user_fullname ()
+{
+ while IFS=':' read -r user _ _ _ gecos _
+ do
+ if [ x"$user" = x"$LOGNAME" ]
+ then
+ user_fullname="${gecos%%,*}"
+ [ -n "$user_fullname" ] || exit 1
+ printf %s\\n "$user_fullname"
+ return 0
+ fi
+ done < /etc/passwd
+ return 1
+}
+
+get_user_contact ()
+{
+ user_fullname="${NAME:-$(get_user_fullname)}"
+ printf '%s\n' "$EMAIL${user_fullname:+ ($user_fullname)}"
+}
+
+get_metadata_value ()
+{
+ key=$1
+ shift
+ value=$(pandoc --template="$TEMPLATES_DIR/$key.value" "$@")
+ [ -n "$value" ] || return 1
+ printf %s\\n "$value"
+}
+
+get_date ()
+{
+ input_file=$1
+ shift
+ if date=$(get_metadata_value date "$input_file")
+ then
+ if [ -f /opt/homebrew/bin/gdate ]; then
+ date_cmd=/opt/homebrew/bin/gdate
+ else
+ date_cmd=/usr/bin/date
+ fi
+ $date_cmd --utc --date "$date" +'%a, %d %b %Y %T +0000'
+ fi
+}
+
+generate_feed_item ()
+{
+ input_file=$1
+ shift
+
+ case $guid_format in
+ *%s*)
+ filename=${input_file##*/}
+ basename=${filename%.*}
+ guid=$(printf "$guid_format" "$basename")
+ set -- -V "guid:$guid" "$@"
+ esac
+
+ if date=$(get_date "$input_file")
+ then
+ set -- -V "date:$date" "$@"
+ fi
+
+ if $omit_body
+ then
+ set -- -V body: "$@"
+ fi
+
+ pandoc --template="$TEMPLATES_DIR/item.xml" "$@" "$input_file"
+}
+
+generate_feed_items ()
+{
+ for input_file do
+ generate_feed_item "$input_file"
+ done
+}
+
+print_xml_element ()
+{
+ [ -n "$2" ] || return 1
+ printf '<%s>%s</%s>\n' "$1" "$2" "$1"
+}
+
+generate_standalone_feed ()
+{
+ if [ -z "$channel_language" ]
+ then
+ if language_code=$(get_language_code)
+ then
+ channel_language=$language_code
+ fi
+ fi
+
+ if ! is_valid_language_code "$channel_language"
+ then
+ >&2 printf 'Invalid language code: ‘%s’\n' "$channel_language"
+ >&2 printf 'See %s\n' "$SHARE"/data/language-codes
+ exit 1
+ fi
+
+ echo '<?xml version="1.0" encoding="UTF-8" ?>'
+ echo '<rss version="2.0">'
+ echo '<channel>'
+ print_xml_element title "$channel_title"
+ print_xml_element link "$channel_link"
+ print_xml_element description "$channel_description"
+ print_xml_element language "$channel_language"
+ print_xml_element webMaster "${channel_webmaster:=$(get_user_contact)}"
+ print_xml_element copyright "$channel_copyright"
+ print_xml_element docs https://www.rssboard.org/rss-specification
+ echo '<generator>pandoc-rss</generator>'
+ generate_feed_items "$@"
+ echo '</channel>'
+ echo '</rss>'
+}
+
+channel_title=$DOMAIN
+channel_link=https://$DOMAIN
+channel_description="Posts from $DOMAIN"
+unset channel_webmaster
+unset channel_copyright
+unset channel_language
+omit_body=false
+guid_optarg=auto
+standalone=false
+while getopts t:l:d:w:c:n:of:hs OPT
+do
+ case "$OPT" in
+ t) channel_title=$OPTARG ;;
+ l) channel_link=${OPTARG%/} ;;
+ d) channel_description=$OPTARG ;;
+ w) channel_webmaster=$OPTARG ;;
+ c) channel_copyright=$OPTARG ;;
+ n) channel_language=$OPTARG ;;
+ o) omit_body=true ;;
+ f) guid_optarg=$OPTARG ;;
+ s) standalone=true ;;
+ ?) usage; exit 2 ;;
+ esac
+done
+shift $((OPTIND - 1))
+
+case $guid_optarg in
+ auto) guid_optarg=%s.html
+esac
+case $guid_optarg in
+ omit) guid_format= ;;
+ *://*%s*) guid_format=$guid_optarg ;;
+ *%s*) [ "$channel_link" ] &&
+ guid_format=$channel_link/${guid_optarg#/} ;;
+ *) >&2 printf 'Invalid guid format ‘%s’\n' "$guid_optarg"
+ exit 1
+esac
+
+if $standalone
+then
+ generate_standalone_feed "$@"
+else
+ generate_feed_items "$@"
+fi
diff --git a/vendor/share/pandoc-rss/data/language-codes b/vendor/share/pandoc-rss/data/language-codes
new file mode 100644
index 0000000..a2e774a
--- /dev/null
+++ b/vendor/share/pandoc-rss/data/language-codes
@@ -0,0 +1,103 @@
+# Canonical list of valid RSS 2.0 language codes.
+#
+# Data extracted from "RSS Language Codes" by the RSS Advisory Board
+# https://www.rssboard.org/rss-language-codes#table
+#
+# CC-BY-SA 2.0
+# https://creativecommons.org/licenses/by-sa/2.0/
+af Afrikaans
+sq Albanian
+eu Basque
+be Belarusian
+bg Bulgarian
+ca Catalan
+zh-cn Chinese (Simplified)
+zh-tw Chinese (Traditional)
+hr Croatian
+cs Czech
+da Danish
+nl Dutch
+nl-be Dutch (Belgium)
+nl-nl Dutch (Netherlands)
+en English
+en-au English (Australia)
+en-bz English (Belize)
+en-ca English (Canada)
+en-ie English (Ireland)
+en-jm English (Jamaica)
+en-nz English (New Zealand)
+en-ph English (Phillipines)
+en-za English (South Africa)
+en-tt English (Trinidad)
+en-gb English (United Kingdom)
+en-us English (United States)
+en-zw English (Zimbabwe)
+et Estonian
+fo Faeroese
+fi Finnish
+fr French
+fr-be French (Belgium)
+fr-ca French (Canada)
+fr-fr French (France)
+fr-lu French (Luxembourg)
+fr-mc French (Monaco)
+fr-ch French (Switzerland)
+gl Galician
+gd Gaelic
+de German
+de-at German (Austria)
+de-de German (Germany)
+de-li German (Liechtenstein)
+de-lu German (Luxembourg)
+de-ch German (Switzerland)
+el Greek
+haw Hawaiian
+hu Hungarian
+is Icelandic
+in Indonesian
+ga Irish
+it Italian
+it-it Italian (Italy)
+it-ch Italian (Switzerland)
+ja Japanese
+ko Korean
+mk Macedonian
+no Norwegian
+pl Polish
+pt Portuguese
+pt-br Portuguese (Brazil)
+pt-pt Portuguese (Portugal)
+ro Romanian
+ro-mo Romanian (Moldova)
+ro-ro Romanian (Romania)
+ru Russian
+ru-mo Russian (Moldova)
+ru-ru Russian (Russia)
+sr Serbian
+sk Slovak
+sl Slovenian
+es Spanish
+es-ar Spanish (Argentina)
+es-bo Spanish (Bolivia)
+es-cl Spanish (Chile)
+es-co Spanish (Colombia)
+es-cr Spanish (Costa Rica)
+es-do Spanish (Dominican Republic)
+es-ec Spanish (Ecuador)
+es-sv Spanish (El Salvador)
+es-gt Spanish (Guatemala)
+es-hn Spanish (Honduras)
+es-mx Spanish (Mexico)
+es-ni Spanish (Nicaragua)
+es-pa Spanish (Panama)
+es-py Spanish (Paraguay)
+es-pe Spanish (Peru)
+es-pr Spanish (Puerto Rico)
+es-es Spanish (Spain)
+es-uy Spanish (Uruguay)
+es-ve Spanish (Venezuela)
+sv Swedish
+sv-fi Swedish (Finland)
+sv-se Swedish (Sweden)
+tr Turkish
+uk Ukranian
diff --git a/vendor/share/pandoc-rss/data/templates/date.value b/vendor/share/pandoc-rss/data/templates/date.value
new file mode 100644
index 0000000..fb43da6
--- /dev/null
+++ b/vendor/share/pandoc-rss/data/templates/date.value
@@ -0,0 +1 @@
+$date$
diff --git a/vendor/share/pandoc-rss/data/templates/item.xml b/vendor/share/pandoc-rss/data/templates/item.xml
new file mode 100644
index 0000000..deb86fe
--- /dev/null
+++ b/vendor/share/pandoc-rss/data/templates/item.xml
@@ -0,0 +1,14 @@
+<item>
+$if(pagetitle)$
+<title>$if(kind)$<small>[$kind$]</small> $endif$$pagetitle$</title>
+$endif$
+$if(date)$
+<pubDate>$date$</pubDate>
+$endif$
+$if(guid)$
+<guid>$guid$</guid>
+$endif$
+$if(body)$
+<description><![CDATA[$body$]]></description>
+$endif$
+</item>