generate-rss.sh 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #!/usr/bin/env bash
  2. set -e
  3. set -u
  4. set -o pipefail
  5. get_desc() {
  6. echo $(sed -n -e 's/<meta name=\"description\" content=\"//p' $1 | sed -n -e 's/\"//p')
  7. }
  8. get_link() {
  9. echo ${1:1}
  10. }
  11. get_date() {
  12. echo $(sed -n '/<p class=\"date\">Date:/,/<\/p>/p; /<\/p>/q' $1 \
  13. | sed -n -e 's/<\/p>//p' \
  14. | sed -n -e 's/<p class=\"date\">Date: //p' \
  15. )
  16. }
  17. get_titl() {
  18. echo $(sed -n -e 's/<title>//p' $1 | sed -n -e 's/<\/title>//p')
  19. }
  20. generate_rss_main() {
  21. local name=${1:-Site}
  22. local max_entries=${2:-10}
  23. local file=feeds/file.rss.xml
  24. if [[ ! $max_entries =~ ^-?[0-9]+$ ]] || [ "$max_entries" -lt 1 ]; then
  25. echo "Must have at least one entry, defaulting to 1."
  26. max_entries=1
  27. fi
  28. if [ ! -d feeds ]; then
  29. mkdir feeds
  30. fi
  31. if [ -f "$file" ]; then
  32. rm ${file}
  33. else
  34. echo "Create new rss feed."
  35. fi
  36. touch ${file}
  37. echo "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" >> ${file}
  38. echo -e "<rss version=\"2.0\">\n <channel>" >> ${file}
  39. echo -e " <description/>" >> ${file}
  40. echo -e " <lastBuildDate>$(date)</lastBuildDate>" >> ${file}
  41. echo -e " <link>/</link>" >> ${file}
  42. echo -e " <title>${name}</title>" >> ${file}
  43. local array=()
  44. local arra2=()
  45. while IFS= read -r -d $'\0'; do
  46. array+=("$REPLY")
  47. done < <(find . -type f -name "*.html" -print0)
  48. for i in "${array[@]}"
  49. do
  50. arra2+=("`get_date $i`|`get_titl $i`|`get_desc $i`|`get_link $i`")
  51. done
  52. IFS=$'\n' sorted=($(sort --reverse <<<"${arra2[*]}")); unset IFS
  53. for j in "${sorted[@]}"
  54. do
  55. if [ "$max_entries" -lt 1 ]; then
  56. break
  57. fi
  58. IFS='|' read -ra faux <<< "$j"
  59. if [ ! -z "${faux[0]}" ]; then
  60. max_entries=$((max_entries-1))
  61. echo -e " <item>" >> ${file}
  62. echo -e " <pubDate>${faux[0]}</pubDate>" >> ${file}
  63. echo -e " <description>${faux[2]}</description>" >> ${file}
  64. echo -e " <link>${faux[3]}</link>" >> ${file}
  65. echo -e " <title>${faux[1]}</title>" >> ${file}
  66. echo -e " </item>" >> ${file}
  67. fi
  68. done
  69. echo -e " </channel>\n</rss>" >> ${file}
  70. }
  71. generate_rss_main $@