diff options
| author | Jan Tuomi <jans.tuomi@gmail.com> | 2024-03-26 19:06:18 +0200 |
|---|---|---|
| committer | Jan Tuomi <jans.tuomi@gmail.com> | 2024-03-26 21:25:10 +0200 |
| commit | 1dcfacfa22cc50a95ab057023ed58dcb0608c05e (patch) | |
| tree | 62176995c34486ec812c01e38ce57b039d5ce064 /vendor | |
| parent | 7debfa9aa2f19ea12345accc5b1213ef01f61f71 (diff) | |
Improve stuff
Diffstat (limited to 'vendor')
| -rwxr-xr-x | vendor/bin/pandoc-rss | 227 | ||||
| -rw-r--r-- | vendor/share/pandoc-rss/data/language-codes | 103 | ||||
| -rw-r--r-- | vendor/share/pandoc-rss/data/templates/date.value | 1 | ||||
| -rw-r--r-- | vendor/share/pandoc-rss/data/templates/item.xml | 14 |
4 files changed, 345 insertions, 0 deletions
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> |
