├── LICENSE ├── Makefile ├── README.md ├── bin └── pandoc-rss ├── contrib └── reverse-chronological ├── example.net ├── 1960-08-12-green-eggs-and-ham.md ├── 1965-06-19-fox-in-socks.md ├── cdata-injection.md ├── empty.md ├── no-body.md └── no-title.md └── share ├── man └── man1 │ └── pandoc-rss.1 └── pandoc-rss └── data ├── language-codes └── templates ├── date.value └── item.xml /LICENSE: -------------------------------------------------------------------------------- 1 | MIT/X Consortium License 2 | 3 | © 2020 Gregory Chamberlain 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a 6 | copy of this software and associated documentation files (the "Software"), 7 | to deal in the Software without restriction, including without limitation 8 | the rights to use, copy, modify, merge, publish, distribute, sublicense, 9 | and/or sell copies of the Software, and to permit persons to whom the 10 | Software is furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 | THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21 | DEALINGS IN THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | PREFIX = /usr/local 2 | PROGRAM = pandoc-rss 3 | 4 | all: 5 | chmod +x bin/$(PROGRAM) 6 | 7 | install: bin/$(PROGRAM) 8 | mkdir -p $(PREFIX)/bin \ 9 | $(PREFIX)/share/$(PROGRAM)/data/templates \ 10 | $(PREFIX)/share/man/man1 11 | 12 | cp -f bin/$(PROGRAM) $(PREFIX)/bin 13 | chmod 775 $(PREFIX)/bin/$(PROGRAM) 14 | 15 | cp -f share/man/man1/$(PROGRAM).1 $(PREFIX)/share/man/man1 16 | 17 | cp -f share/$(PROGRAM)/data/language-codes $(PREFIX)/share/$(PROGRAM)/data 18 | cp -f share/$(PROGRAM)/data/templates/* $(PREFIX)/share/$(PROGRAM)/data/templates 19 | 20 | uninstall: 21 | rm -f $(PREFIX)/bin/$(PROGRAM) 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # pandoc-rss 2 | 3 | pandoc-rss is a command-line utility for generating partial or 4 | complete RSS feeds from the content and metadata of markup files. 5 | Any markup format which can be read by Pandoc will do. 6 | 7 | It is implemented as a shell script using only the shell command 8 | language sh(1) and other utilities specified by POSIX with the sole 9 | exception that GNU date(1) is used to transform date metadata to 10 | conform with [RSS Best Practices section 11 | 3.2](https://www.rssboard.org/rss-profile#data-types-datetime). Any 12 | other non-POSIX code would be considered a bug. If you're certain 13 | your markup files conform to the standard date format then you can 14 | easily patch the script and drop this dependency. 15 | 16 | There is no official affiliation between pandoc-rss and Pandoc. 17 | 18 | ## Installation 19 | 20 | ### Arch Linux 21 | 22 | pandoc-rss is [available from the 23 | AUR](https://aur.archlinux.org/packages/pandoc-rss). 24 | 25 | ### Manual 26 | 27 | System-wide installation as root: 28 | 29 | make install 30 | 31 | Install for your user only: 32 | 33 | make PREFIX=~/.local install 34 | 35 | ## Usage 36 | 37 | Partial feed of item fragments: 38 | 39 | > **pandoc‑rss** [**‑hop**] [**‑f** *format*|auto|omit] 40 | > [**‑l** *link*] *input‑file*... 41 | 42 | Complete valid XML feed: 43 | 44 | > **pandoc‑rss** **‑s** [‑**hop**] [**‑f** *format*|auto|omit] 45 | > [**‑l** *link*] [**‑t** *title*] [**‑d** *description*] 46 | > [**‑n** *language*] 47 | > [**‑w** "*webmaster@example.net* (*Real Name*)" ] 48 | > [**‑c** *copyright*] *input‑file*... **>** *feed.xml* 49 | 50 | where each *input-file* corresponds to a feed item. Items in the 51 | resulting XML appear in the order they were given on the command-line. 52 | 53 | See pandoc-rss(1) for more detailed information—you can run `man 54 | share/man/man1/pandoc-rss.1` to read this without installing it. 55 | 56 | ### Example 57 | 58 | For example I could render two blog articles `foo.md` and `bar.md` 59 | along with the corresponding `rss.xml` feed using something like the 60 | following: 61 | 62 | $ pandoc --template=page -o foo.html foo.md 63 | $ pandoc --template=page -o bar.html bar.md 64 | $ pandoc-rss foo.md bar.md > rss.xml \ 65 | -t cosine.blue \ 66 | -d 'Blog by Gregory Chamberlain' \ 67 | -l https://cosine.blue \ 68 | -c 'GPLv3+ or CC BY-SA 4.0' \ 69 | -w 'greg@cosine.blue (Gregory Chamberlain)' \ 70 | -n en-GB 71 | 72 | ## Bugs and notes 73 | 74 | - RSS enclosures are not supported. Nobody uses them anyway. 75 | - Any relative links in the body of an input-file will become 76 | relative links in the feed and therefore render the feed invalid. 77 | 78 | ## To-do 79 | 80 | - [x] Add options for specifying channel title, link and description 81 | - [x] Add Makefile rule to install the man page 82 | - [x] Cite pandoc-rss as the generator element 83 | - [x] Produce a standalone feed if and only if at least the channel 84 | title, description and link are provided. 85 | - [x] Add option to specify the channel language 86 | - [x] Infer the guid/permalink format based on the channel link; for 87 | example if the channel link is `http://example.net` then the 88 | format is `http://example.net/%s.html`. 89 | - [x] Finish writing the man page 90 | - [ ] With input-file "-" read file names line-by-line from stdin 91 | - [ ] With no input-file, print the usage message 92 | - [ ] Instead of using a CDATA block, encode special characters in 93 | the body text as HTML entities. 94 | 95 | I think this is not possible using the current template because 96 | Pandoc simply replaces `$body$` with the rendered HTML; I’m not 97 | sure how we could intercept that process to escape all `[&<>]` 98 | characters as required. 99 | - [ ] Print warnings about relative links in the description element 100 | (this is non-trivial). Or better, use the channel link as a base 101 | for relative links. Perhaps only do this with an explicit option, 102 | otherwise this could lead to confusion and spurious links. 103 | - [ ] Support for input files in a directory tree. 104 | -------------------------------------------------------------------------------- /bin/pandoc-rss: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | SHARE=${0%/*}/../share/${0##*/} 4 | TEMPLATES_DIR=$SHARE/data/templates 5 | DOMAIN=${PWD##*/} 6 | EMAIL=${EMAIL:-webmaster@$DOMAIN} 7 | 8 | usage () 9 | { 10 | cat < http://example.net/blog/%s.html 17 | -w WEBMASTER 'webmaster@example.net (Real Name)' 18 | -c COPYRIGHT 'Year © Name, CC BY-SA 4.0' 19 | -n LANGUAGE en-GB 20 | EOF 21 | } 22 | 23 | get_language_code () 24 | { 25 | [ -n "$LANG" ] || exit 1 26 | code=${LANG%%.*} 27 | primary_code=${code%%_*} 28 | subcode=${code#$primary_code} 29 | subcode=${subcode#_} 30 | printf %s\\n "$primary_code${subcode:+-$subcode}" 31 | } 32 | 33 | is_valid_language_code () 34 | { 35 | arg=$(printf %s "$1" | tr [A-Z] [a-z]) 36 | while IFS=' ' read -r code _ 37 | do 38 | [ x"$code" = x"#" ] && continue 39 | [ x"$code" = x"$arg" ] && return 0 40 | done < $SHARE/data/language-codes 41 | return 1 42 | } 43 | 44 | get_user_fullname () 45 | { 46 | while IFS=':' read -r user _ _ _ gecos _ 47 | do 48 | if [ x"$user" = x"$LOGNAME" ] 49 | then 50 | user_fullname="${gecos%%,*}" 51 | [ -n "$user_fullname" ] || exit 1 52 | printf %s\\n "$user_fullname" 53 | return 0 54 | fi 55 | done < /etc/passwd 56 | return 1 57 | } 58 | 59 | get_user_contact () 60 | { 61 | user_fullname="${NAME:-$(get_user_fullname)}" 62 | printf '%s\n' "$EMAIL${user_fullname:+ ($user_fullname)}" 63 | } 64 | 65 | get_metadata_value () 66 | { 67 | key=$1 68 | shift 69 | value=$(pandoc --template="$TEMPLATES_DIR/$key.value" "$@") 70 | [ -n "$value" ] || return 1 71 | printf %s\\n "$value" 72 | } 73 | 74 | get_date () 75 | { 76 | input_file=$1 77 | shift 78 | if date=$(get_metadata_value date "$input_file") 79 | then 80 | /usr/bin/date --utc --date "$date" +'%a, %d %b %Y %T +0000' 81 | fi 82 | } 83 | 84 | generate_feed_item () 85 | { 86 | input_file=$1 87 | shift 88 | 89 | case $guid_format in 90 | *%s*) 91 | filename=${input_file##*/} 92 | basename=${filename%.*} 93 | guid=$(printf "$guid_format" "$basename") 94 | set -- -V "guid:$guid" "$@" 95 | esac 96 | 97 | if date=$(get_date "$input_file") 98 | then 99 | set -- -V "date:$date" "$@" 100 | fi 101 | 102 | if $omit_body 103 | then 104 | set -- -V body: "$@" 105 | fi 106 | 107 | pandoc --template="$TEMPLATES_DIR/item.xml" "$@" "$input_file" 108 | } 109 | 110 | generate_feed_items () 111 | { 112 | for input_file do 113 | generate_feed_item "$input_file" 114 | done 115 | } 116 | 117 | print_xml_element () 118 | { 119 | [ -n "$2" ] || return 1 120 | printf '<%s>%s\n' "$1" "$2" "$1" 121 | } 122 | 123 | generate_standalone_feed () 124 | { 125 | if [ -z "$channel_language" ] 126 | then 127 | if language_code=$(get_language_code) 128 | then 129 | channel_language=$language_code 130 | fi 131 | fi 132 | 133 | if ! is_valid_language_code "$channel_language" 134 | then 135 | >&2 printf 'Invalid language code: ‘%s’\n' "$channel_language" 136 | >&2 printf 'See %s\n' "$SHARE"/data/language-codes 137 | exit 1 138 | fi 139 | 140 | echo '' 141 | echo '' 142 | echo '' 143 | print_xml_element title "$channel_title" 144 | print_xml_element link "$channel_link" 145 | print_xml_element description "$channel_description" 146 | print_xml_element language "$channel_language" 147 | print_xml_element webMaster "${channel_webmaster:=$(get_user_contact)}" 148 | print_xml_element copyright "$channel_copyright" 149 | print_xml_element docs https://www.rssboard.org/rss-specification 150 | echo 'pandoc-rss' 151 | generate_feed_items "$@" 152 | echo '' 153 | echo '' 154 | } 155 | 156 | channel_title=$DOMAIN 157 | channel_link=https://$DOMAIN 158 | channel_description="Posts from $DOMAIN" 159 | unset channel_webmaster 160 | unset channel_copyright 161 | unset channel_language 162 | omit_body=false 163 | guid_optarg=auto 164 | standalone=false 165 | while getopts t:l:d:w:c:n:of:hs OPT 166 | do 167 | case "$OPT" in 168 | t) channel_title=$OPTARG ;; 169 | l) channel_link=${OPTARG%/} ;; 170 | d) channel_description=$OPTARG ;; 171 | w) channel_webmaster=$OPTARG ;; 172 | c) channel_copyright=$OPTARG ;; 173 | n) channel_language=$OPTARG ;; 174 | o) omit_body=true ;; 175 | f) guid_optarg=$OPTARG ;; 176 | s) standalone=true ;; 177 | ?) usage; exit 2 ;; 178 | esac 179 | done 180 | shift $((OPTIND - 1)) 181 | 182 | case $guid_optarg in 183 | auto) guid_optarg=%s.html 184 | esac 185 | case $guid_optarg in 186 | omit) guid_format= ;; 187 | *://*%s*) guid_format=$guid_optarg ;; 188 | *%s*) [ "$channel_link" ] && 189 | guid_format=$channel_link/${guid_optarg#/} ;; 190 | *) >&2 printf 'Invalid guid format ‘%s’\n' "$guid_optarg" 191 | exit 1 192 | esac 193 | 194 | if $standalone 195 | then 196 | generate_standalone_feed "$@" 197 | else 198 | generate_feed_items "$@" 199 | fi 200 | -------------------------------------------------------------------------------- /contrib/reverse-chronological: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | SHARE=${0%/*}/../share/pandoc-rss 4 | 5 | for i; do 6 | printf '%s ' "$i" 7 | pandoc --template="$SHARE"/data/templates/date.value "$i" 8 | done | while IFS=' ' read i d; do 9 | printf '%s\t%s\n' "$(date -d "$d" +%Y%m%d%T)" "$i" 10 | done | LANG= sort -r | cut -f2 11 | -------------------------------------------------------------------------------- /example.net/1960-08-12-green-eggs-and-ham.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: 'Dr. Seuss' 3 | date: 'August 12, 1960' 4 | description: 'Classic 1960 children''s book by Dr. Seuss.' 5 | title: Green Eggs and Ham 6 | --- 7 | 8 | Green Eggs and Ham 9 | ================== 10 | 11 | et cetera. 12 | -------------------------------------------------------------------------------- /example.net/1965-06-19-fox-in-socks.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: 'Dr. Seuss' 3 | date: 'June 19, 1965' 4 | description: 'Classic 1965 children''s book by Dr. Seuss.' 5 | title: Fox in Socks 6 | --- 7 | 8 | Fox in Socks 9 | ============ 10 | 11 | et cetera. 12 | -------------------------------------------------------------------------------- /example.net/cdata-injection.md: -------------------------------------------------------------------------------- 1 | ]]> 2 | -------------------------------------------------------------------------------- /example.net/empty.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chambln/pandoc-rss/80413e8a6719d13ebcc69a77a1590ef54b10d353/example.net/empty.md -------------------------------------------------------------------------------- /example.net/no-body.md: -------------------------------------------------------------------------------- 1 | % Empty Body -------------------------------------------------------------------------------- /example.net/no-title.md: -------------------------------------------------------------------------------- 1 | # Missing Title 2 | 3 | This document has no title value. -------------------------------------------------------------------------------- /share/man/man1/pandoc-rss.1: -------------------------------------------------------------------------------- 1 | .TH PANDOC\-RSS 1 "Tuesday, 18 November 2020" 2 | .SH NAME 3 | pandoc\-rss \- Feed generator 4 | .SH SYNOPSIS 5 | .PP 6 | .B pandoc\-rss 7 | .RB [ \-hop ] 8 | .RB [ \-f 9 | .BR \f[I]format\f[] | auto | omit ] 10 | .RB [ \-l 11 | .IR link ] 12 | .IR input\-file ... 13 | .PP 14 | .B pandoc\-rss \-s 15 | .RB [ \-hop ] 16 | .RB [ \-f 17 | .BR \f[I]format\f[] | auto | omit ] 18 | .RB [ \-l 19 | .IR link ] 20 | .RB [ \-t 21 | .IR title ] 22 | .RB [ \-d 23 | .IR description ] 24 | .RB [ \-n 25 | .IR language ] 26 | .RB [ \-w 27 | .BI \[dq] webmaster@example.net\ 28 | \f[R][\ \f[B](\f[I]Real\ Name\f[B])\f[R]]\f[B]\[dq] \f[R]] 29 | .RB [ \-c 30 | .IR copyright ] 31 | .IR input\-file ... 32 | .BI > feed.xml 33 | .SH DESCRIPTION 34 | .PP 35 | The 36 | .B pandoc\-rss 37 | utility generates an RSS feed from a series of input files. Each 38 | \f[I]input\-file\f[R] corresponds to a feed item, and must be written 39 | in a markup language that can be read by Pandoc. 40 | .PP 41 | GNU \f[B]date\f[R](1) is used to transform dates to conform with RSS 42 | best practices. Therefore, the date metadata of each 43 | \f[I]input\-file\f[R] must be written in a form that will be 44 | interpretted correctly by GNU date. 45 | .SH OPTIONS 46 | .TP 47 | .B \-s 48 | Produce a standalone XML file. 49 | .IP 50 | Without this, only item fragments are produced. 51 | .TP 52 | \f[B]\-t\f[R] \f[I]title\f[R] 53 | The name of the feed. 54 | .TP 55 | \f[B]\-l\f[R] \f[I]link\f[R] 56 | The URL of the web site associated with the feed. 57 | .TP 58 | \f[B]\-d\f[R] \f[I]description\f[R] 59 | A short characterization or summary of the feed. 60 | .TP 61 | \f[B]\-n\f[] \f[I]language\f[] 62 | The language code of the natural language in which the feed items are 63 | written. 64 | .IP 65 | Without this, pandoc-rss infers the language from the LANG environment 66 | variable. 67 | .TP 68 | \f[B]\-w\f[] \f[I]webmaster\@example.net\f[] 69 | .PD 0 70 | .TP 71 | .PD 72 | \f[B]\-w\f[] \[aq]\f[I]webmaster\@example.net\f[] \f[B](\f[]\f[I]Real Name\f[]\f[B])\f[]\[aq] 73 | The e-mail address (and optionally real name) for the person to 74 | contact about technical issues regarding the feed. Without this, 75 | pandoc-rss will fall back on the EMAIL environment variable, if 76 | non-empty, and the user\[cq]s GECOS field in /etc/passwd. 77 | .TP 78 | \f[B]\-c\f[] \f[I]copyright\f[] 79 | Include a copyright statement that applies to the feed. 80 | For example \[oq]Year © Name, CC BY-SA 4.0\[cq]. 81 | .TP 82 | \f[B]\-f\f[R] \f[I]format\f[R]|\f[B]auto\f[]|\f[B]omit\f[] 83 | Format or omit the guid. 84 | Without this, default to \f[B]auto\f[] which is equivalent to a 85 | .I format 86 | of \[oq]%s.html\[cq]. 87 | .IP 88 | .I format 89 | must contain \[oq]%s\[cq] and can be an absolute URI or relative to 90 | the channel \f[I]link\f[]. To include a literal percent sign, use 91 | \[oq]%%\[cq]. 92 | .IP 93 | For example, if an 94 | .I input\-file 95 | \[oq]foo.md\[cq] is available at 96 | \[oq]http://example.net/blog/foo\[cq], then you should use 97 | .B \-l http://example.net \-f blog/%s 98 | or if it is 99 | available at \[oq]http://blog.example.net/foo.html\[cq] you should use 100 | \f[B]\-f http://blog.example.net/%s.html\f[]. 101 | .B 102 | .TP 103 | .B \-p 104 | Indicate that guids should not be regarded as permalinks. 105 | .TP 106 | .B \-o 107 | Omit the document body for all \f[I]input-file\f[]s. 108 | .IP 109 | Without \f[B]-o\f[], default behaviour is to render each 110 | .I input\-file 111 | as HTML using Pandoc and embed it in the feed. This way, one can read 112 | the entire document offline and from the comfort of one\[cq]s feed 113 | reader. 114 | .TP 115 | .B \-h 116 | Print a help message. 117 | .SH ENVIRONMENT 118 | .TP 119 | .B EMAIL 120 | The e\-mail address for the person to contact about technical issues 121 | regarding the feed. 122 | Can be overridden by the 123 | .B \-w 124 | option. 125 | .TP 126 | .B NAME 127 | The real name of the person to contact about technical issues 128 | regarding the feed. 129 | Can be overridden by the 130 | .B \-w 131 | option. 132 | .TP 133 | .B LANG 134 | Used to infer the natural language in which the feed items are 135 | written. Can be overridden by the 136 | .B \-n 137 | option. 138 | .SH FILES 139 | .TP 140 | \f[I]$PREFIX\f[]/share/pandoc-rss/data/language\-codes 141 | Canonical list of valid RSS language codes, assuming the pandoc\-rss 142 | script is in \f[I]$PREFIX\f[]/bin/. 143 | .TP 144 | /etc/passwd 145 | Parsed in an attempt to determine the webmaster’s real name. 146 | See \f[B]chfn\f[](1). Can be overridden by the environment variable 147 | .B NAME 148 | or the 149 | .B \-w 150 | option. 151 | .SH SECURITY 152 | .SS CDATA injections 153 | .PP 154 | The document body is embedded within a CDATA block. CDATA blocks are 155 | vulnerable to an injection attack whereby the literal string 156 | \f[C]]]>\f[] is included in the HTML. Fortunately, Pandoc encodes 157 | \f[C]]]>\f[] as \f[C]]]>\f[] in HTML output to prevent this kind of 158 | attack. You can convince yourself of this by running the following 159 | command: 160 | .IP 161 | .nf 162 | \f[C] 163 | $\ echo\ \[aq]]]>\[aq]\ |\ pandoc 164 |

]]>

165 | \f[] 166 | .fi 167 | .SS Enclosures 168 | .PP 169 | These are not supported, so this is not an attack vector. 170 | No one uses them anyway. 171 | .SH BUGS 172 | .PP 173 | Any relative links in the body of an 174 | .I input\-file 175 | will become relative links in the feed and therefore render the feed 176 | invalid. 177 | .SH EXAMPLES 178 | .IP 179 | .nf 180 | \f[C] 181 | pandoc\-rss \-t \[aq]Example Feed\[aq] \e 182 | \-l http://example.net \e 183 | \-d \[aq]Generic RSS feed for illustrative purposes.\[aq] \e 184 | \-f blog/%s.html \e 185 | foo.md bar.md > feed.xml 186 | \f[R] 187 | .fi 188 | .SH AUTHORS 189 | Gregory Chamberlain 190 | .SH SEE ALSO 191 | .PP 192 | \f[B]pandoc\f[R](1), 193 | \f[B]date\f[R](1), 194 | \f[B]chfn(1)\f[R] 195 | .PP 196 | https://www.rssboard.org/ 197 | -------------------------------------------------------------------------------- /share/pandoc-rss/data/language-codes: -------------------------------------------------------------------------------- 1 | # Canonical list of valid RSS 2.0 language codes. 2 | # 3 | # Data extracted from "RSS Language Codes" by the RSS Advisory Board 4 | # https://www.rssboard.org/rss-language-codes#table 5 | # 6 | # CC-BY-SA 2.0 7 | # https://creativecommons.org/licenses/by-sa/2.0/ 8 | af Afrikaans 9 | sq Albanian 10 | eu Basque 11 | be Belarusian 12 | bg Bulgarian 13 | ca Catalan 14 | zh-cn Chinese (Simplified) 15 | zh-tw Chinese (Traditional) 16 | hr Croatian 17 | cs Czech 18 | da Danish 19 | nl Dutch 20 | nl-be Dutch (Belgium) 21 | nl-nl Dutch (Netherlands) 22 | en English 23 | en-au English (Australia) 24 | en-bz English (Belize) 25 | en-ca English (Canada) 26 | en-ie English (Ireland) 27 | en-jm English (Jamaica) 28 | en-nz English (New Zealand) 29 | en-ph English (Phillipines) 30 | en-za English (South Africa) 31 | en-tt English (Trinidad) 32 | en-gb English (United Kingdom) 33 | en-us English (United States) 34 | en-zw English (Zimbabwe) 35 | et Estonian 36 | fo Faeroese 37 | fi Finnish 38 | fr French 39 | fr-be French (Belgium) 40 | fr-ca French (Canada) 41 | fr-fr French (France) 42 | fr-lu French (Luxembourg) 43 | fr-mc French (Monaco) 44 | fr-ch French (Switzerland) 45 | gl Galician 46 | gd Gaelic 47 | de German 48 | de-at German (Austria) 49 | de-de German (Germany) 50 | de-li German (Liechtenstein) 51 | de-lu German (Luxembourg) 52 | de-ch German (Switzerland) 53 | el Greek 54 | haw Hawaiian 55 | hu Hungarian 56 | is Icelandic 57 | in Indonesian 58 | ga Irish 59 | it Italian 60 | it-it Italian (Italy) 61 | it-ch Italian (Switzerland) 62 | ja Japanese 63 | ko Korean 64 | mk Macedonian 65 | no Norwegian 66 | pl Polish 67 | pt Portuguese 68 | pt-br Portuguese (Brazil) 69 | pt-pt Portuguese (Portugal) 70 | ro Romanian 71 | ro-mo Romanian (Moldova) 72 | ro-ro Romanian (Romania) 73 | ru Russian 74 | ru-mo Russian (Moldova) 75 | ru-ru Russian (Russia) 76 | sr Serbian 77 | sk Slovak 78 | sl Slovenian 79 | es Spanish 80 | es-ar Spanish (Argentina) 81 | es-bo Spanish (Bolivia) 82 | es-cl Spanish (Chile) 83 | es-co Spanish (Colombia) 84 | es-cr Spanish (Costa Rica) 85 | es-do Spanish (Dominican Republic) 86 | es-ec Spanish (Ecuador) 87 | es-sv Spanish (El Salvador) 88 | es-gt Spanish (Guatemala) 89 | es-hn Spanish (Honduras) 90 | es-mx Spanish (Mexico) 91 | es-ni Spanish (Nicaragua) 92 | es-pa Spanish (Panama) 93 | es-py Spanish (Paraguay) 94 | es-pe Spanish (Peru) 95 | es-pr Spanish (Puerto Rico) 96 | es-es Spanish (Spain) 97 | es-uy Spanish (Uruguay) 98 | es-ve Spanish (Venezuela) 99 | sv Swedish 100 | sv-fi Swedish (Finland) 101 | sv-se Swedish (Sweden) 102 | tr Turkish 103 | uk Ukranian 104 | -------------------------------------------------------------------------------- /share/pandoc-rss/data/templates/date.value: -------------------------------------------------------------------------------- 1 | $date$ 2 | -------------------------------------------------------------------------------- /share/pandoc-rss/data/templates/item.xml: -------------------------------------------------------------------------------- 1 | 2 | $if(pagetitle)$ 3 | $pagetitle$ 4 | $endif$ 5 | $if(date)$ 6 | $date$ 7 | $endif$ 8 | $if(guid)$ 9 | $guid$ 10 | $endif$ 11 | $if(body)$ 12 | 13 | $endif$ 14 | 15 | --------------------------------------------------------------------------------