news.sh 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. # SPDX-License-Identifier: GPL-3.0-or-later
  2. # SPDX-FileCopyrightText: 2017,2021-2023 Leah Rowe <leah@libreboot.org>
  3. # SPDX-FileCopyrightText: 2017 Alyssa Rosenzweig <alyssa@rosenzweig.io>
  4. # SPDX-FileCopyrightText: 2017 Michael Reed <michael@michaelreed.io>
  5. mknews()
  6. {
  7. find -L "${1}/site/" -type f -name "MANIFEST" > "${tmpdir}/xmanifest"
  8. while read -r y; do
  9. check_path f "${y}" || continue
  10. mkarticle "${1}" "${y}"
  11. done < "${tmpdir}/xmanifest"
  12. }
  13. mkarticle()
  14. {
  15. _sitedir="${1}"
  16. y="${2}"
  17. [ -f "${y}" ] || return 0
  18. eval "$(setvars "News" BLOGTITLE BLOGDESCRIPTION)"
  19. _manifestdir="${y##"${_sitedir}/site/"}"
  20. _manifestdir="${_manifestdir%MANIFEST}"
  21. _manifestdir="${_manifestdir%/}"
  22. check_path f "$_sitedir/site/${_manifestdir}/news-list.md.include" || \
  23. return 0
  24. newspages "${_sitedir}/site/${_manifestdir}" "${y}" > "${tmpdir}/xnews"
  25. while read -r f; do
  26. check_path f "${f}" || return 0
  27. done < "${tmpdir}/xnews"
  28. eval "$(getConfigValues \
  29. "${_sitedir}/site/${_manifestdir}/news.cfg" \
  30. BLOGTITLE BLOGDESCRIPTION)"
  31. [ -z "${BLOGTITLE}" ] && BLOGTITLE="News"
  32. [ -z "${BLOGDESCRIPTION}" ] && BLOGDESCRIPTION="News"
  33. # generate the index file
  34. cat "$_sitedir/site/${_manifestdir}/news-list.md.include" \
  35. > "${_sitedir}/site/${_manifestdir}/index.md"
  36. if [ "${_manifestdir}" = "${BLOGDIR%/}" ]; then
  37. printf "\nSubscribe to RSS: [/feed.xml](/feed.xml)\n\n" \
  38. >> "${_sitedir}/site/${_manifestdir}/index.md"
  39. else
  40. printf "\nSubscribe to RSS: [/%sfeed.xml](/%sfeed.xml)\n\n" \
  41. "${_manifestdir}" "${_manifestdir}" \
  42. >> "${_sitedir}/site/${_manifestdir}/index.md"
  43. fi
  44. while read -r f; do
  45. _page="$(sanitizefilename "${f#"${_sitedir}/site/"}")"
  46. _protocol="$(echo "${DOMAIN%/}" | sed 's#://.*##')"
  47. _domain="$(echo "${DOMAIN%/}" | \
  48. sed "s#${_protocol}://##" | sed 's#/.*##')"
  49. _path="$(echo "${DOMAIN%/}" | \
  50. sed "s#^${_protocol}://${_domain}/\?##")"
  51. meta "${_page}" "${_sitedir}/site" "${_path}" \
  52. >> "${_sitedir}/site/${_manifestdir}/index.md"
  53. done < "${tmpdir}/xnews"
  54. # generate the RSS index
  55. rss_header "$BLOGTITLE" "$DOMAIN" "$BLOGDESCRIPTION" "$_manifestdir" \
  56. > "${_sitedir}/site/${_manifestdir}/feed.xml"
  57. while read -r f; do
  58. _page="$(sanitizefilename "${f#"${_sitedir}/site/"}")"
  59. rss_main "$_page" "$_sitedir" "$DOMAIN" \
  60. >> "${_sitedir}/site/${_manifestdir}/feed.xml"
  61. done < "${tmpdir}/xnews"
  62. rss_footer >> "${_sitedir}/site/${_manifestdir}/feed.xml"
  63. if [ "${_sitedir}/site/${_manifestdir}/feed.xml" \
  64. != "${_sitedir}/site/feed.xml" ] && \
  65. [ "${_manifestdir}" = "${BLOGDIR%/}" ] && \
  66. [ -n "${BLOGDIR%/}" ]; then
  67. rm -f "${_sitedir}/site/feed.xml"
  68. [ -f "${_sitedir}/site/${_manifestdir}/feed.xml" ] && \
  69. cp "${_sitedir}/site/${_manifestdir}/feed.xml" \
  70. "${_sitedir}/site/feed.xml"
  71. fi
  72. mkhtml "$_sitedir/site/${_manifestdir}/index.md" "${_sitedir##*/}"
  73. }
  74. # usage: meta file filedir
  75. meta()
  76. {
  77. if [ -n "${3}" ] ; then
  78. printf '%s\n' \
  79. "[$(mktitle "${2}/${1}")](/${3}/${1}){.title}"
  80. else
  81. printf '%s\n' \
  82. "[$(mktitle "${2}/${1}")](/${1}){.title}"
  83. fi
  84. printf '%s\n' \
  85. "[$(sed -n 3p "${2}/${1}" | sed -e s-^..--)]{.date}"
  86. printf "\n\n"
  87. }
  88. # usage: rss_header
  89. rss_header()
  90. {
  91. _blogtitle="${1}"
  92. _domain="${2}" # without a / at the end, but with http:// or https://
  93. _blogdescription="${3}"
  94. _blog="${4}"
  95. printf "%s\n" "<rss version=\"2.0\">"
  96. printf "%s\n" "<channel>"
  97. printf "%s\n" "<title>${_blogtitle}</title>"
  98. printf "%s\n" "<link>${_domain}${_blog}</link>"
  99. printf "%s\n" "<description>$_blogdescription</description>"
  100. }
  101. # usage: rss_main file
  102. rss_main()
  103. {
  104. _file="${1}"
  105. _sitedir="${2}"
  106. _domain="${3}"
  107. # render content and escape
  108. _htmlfile="${_file%.md}.html"
  109. _pagetitle=$(mktitle "${_sitedir}/site/${_file}")
  110. _pageurl="${_domain}${_htmlfile}"
  111. printf "%s\n" '<item>'
  112. printf "%s\n" "<title>${_pagetitle}</title>"
  113. printf "%s\n" "<link>${_pageurl}</link>"
  114. printf "%s" "<description><p>Article: ${_pagetitle}</p>"
  115. printf "%s\n" "<p>Web link: ${_pageurl}</p></description>"
  116. printf "</item>\n"
  117. }
  118. # usage: title file
  119. mktitle()
  120. {
  121. _firstchar=$(head -c 1 "${1}")
  122. _firstthreechars=$(head -c 3 "${1}")
  123. _titlestr="$(head -n1 "${1}")"
  124. if [ "${_firstchar}" = "%" ] || [ "${_firstchar}" = "#" ]; then
  125. _titlestr="$(sed -n 1p "${1}" | sed -e s-^..--)"
  126. elif [ "${_firstthreechars}" = "---" ]; then
  127. _titlestr="$(sed -n 2p "${1}" | sed -e s-^..--)"
  128. _titlestr="${_titlestr#* }"
  129. fi
  130. printf "%s\n" "${_titlestr}"
  131. }
  132. # usage: rss_footer
  133. rss_footer()
  134. {
  135. printf '%s\n' '</channel>'
  136. printf '%s\n' '</rss>'
  137. }