bash
set -e
NAME=$1
AUTHOR=$2
COPYRIGHT=$(eval $3)
PROJ_HOME=https://savannah.gnu.org/
echo -e "Retrieving information on project \"$NAME\" ...\n"
curl -d "words=$NAME&type_of_search=soft&Search=Search&exact=1" ${PROJ_HOME}search/ > query-url.html
pkg_path=$(lynx -source query-url.html |\
sed -e '1,/<h3>Unique project search/ d' -e '/<h3>Search results/,$ d' | sed -n "/.*href=.*projects.*>$NAME.*/ p" |\
sed -e "s:.*\(projects.*$NAME\).*:\1:" -e 's:.>.*::' 2> /dev/null)
pkg_path=${pkg_path:-projects/$NAME}
exists=$(lynx -dump ${PROJ_HOME}${pkg_path} |\
sed -n '/[ ]*Error:/,/[ ]*Invalid Group: That group does not exist./ p' |\
sed -n '1 p' |\
sed -e 's/[ ]*//' -e 's/://')
[[ $exists = "Error" ]] && { echo -e "\n\e[31mError:\e[0m Sorry. Project \"$NAME\" does not exist!" >&2; exit 1; }
echo -e "\nAdding header ..."
echo -e "# -*- Mode: Org -*-\n#+TITLE: $NAME - News\n$(sed -n '2,3 p' TODO)\n#+STARTUP: content" > NEWS
echo "Adding description ..."
lynx -dump query-url.html |\
sed -e "1,/Unique project search result for $NAME:/ d" \
-e "/Search results for $NAME/,$ d" \
-e 's/\[.*\]//' \
-e 's/^[ ]*//' |\
sed -e '1,3 s/^\w* //' |\
sed -e '/Description.*/ { s/.*/&\n/ }' -e '2 s/^\(.\)/\* \1/' -e '3,$ s/^\(.\)/ \1/' 2> /dev/null >> NEWS && \
rm query-url.html; echo -e "* News" >> NEWS
NEWS_ARCHIVE=${PROJ_HOME}$(lynx -source ${PROJ_HOME}${pkg_path} |\
sed -n '/news in archive/ p' |\
sed 's:.*\(/news/.group_id=[0-9]*\).>.*:\1:' 2> /dev/null)
FOOTNOTES=$(lynx -dump $NEWS_ARCHIVE |\
sed -e '1,/Latest News Approved/ d' -n -e 's/^[ ]*\[.*/&/p' |\
sed -e '/\[Read more\]/ d' -e '/[ ]-[ ][0-9]*[ ]repl[iesy]/ d' \
-e '/\[Submit News\]/ d' \
-e '/Back to the top/ d' \
-e '/\[[0-9]*\]Source/ d' \
-e '/\[[0-9]*\]Powered by/ d' \
-e '/[0-9]*news in archive/ d' \
-e 's/\(\[[0-9]*\][^ ]*\).*/\1/' \
-e 's/.*\[\(.*\)\].*/\1\\./' 2> /dev/null)
ALL_LINKS=$(lynx -dump $NEWS_ARCHIVE |\
sed -e '1,/Latest News Approved/ d' -n -e 's/^[ ]*[0-9].*/&/p' |\
sed -e '/\[Read more\]/ d' -e '/[ ]-[ ][0-9]*[ ]repl[iesy]/ d' \
-e '/\[Submit News\]/ d' \
-e '/Back to the top/ d' \
-e '/\[[0-9]*\]Source/ d' \
-e '/\[[0-9]*\]Powered by/ d' \
-e '/[0-9]*news in archive/ d' 2> /dev/null)
TITLES=$(lynx -dump $NEWS_ARCHIVE |\
sed -e '1,/Latest News Approved/ d' -n -e 's/^[ ]*\[.*/&/p' |\
sed -e '/\[Read more\]/ d' -e '/[ ]-[ ][0-9]*[ ]repl[iesy]/ d' \
-e '/\[Submit News\]/ d' \
-e '/Back to the top/ d' \
-e '/\[[0-9]*\]Source/ d' \
-e '/\[[0-9]*\]Powered by/ d' \
-e '/[0-9]*news in archive/ d' |\
sed -e 's/^[ ]*\[[0-9]*\]//' -e 's/^\(.\)/\*\* \1/' -e 's/\[.*\]//' -e 's/[ ]posted by.*//' 2> /dev/null)
for footnote in $(echo "$FOOTNOTES")
do
count=${count:-0}; let count+=1
total=$(wc -l <<< "$FOOTNOTES")
article=$(sed -n "$count p" <<< "$TITLES")
link=$(sed -n "s/$footnote/&/p" <<< "$ALL_LINKS" | sed 's/[0-9]*\.[ ]//')
[[ $total -eq 0 ]] && { rm NEWS; echo -e "\n\e[31mError:\e[0m No new articles can be found on project \"$NAME\"" >&2; exit 1; }
[[ $total -eq 1 ]] && plural=article || plural=articles
[[ $count -eq 1 ]] && echo -e "There is a total of #[$total] $plural about \"$NAME\"\nFetching $plural ..."
echo "Appending article #[$count], with title: $article"
echo "$article" >> NEWS
case $4 in
--del-comments)
lynx $link -dump |\
sed -e '1,/\[[0-9]* news in archive/ d' -e '/\[[0-9]*\]Comments:/,$ d' -e 's/\[.*\]//' |\
sed -e '1,2 d' 2> /dev/null >> NEWS
;;
--add-comments)
lynx $link -dump |\
sed -e '1,/\[[0-9]* news in archive/ d' -e 's/\[.*\]//' -e '/Change View/ d' -e '/Back to the top/,$ d' \
-e '/Comments:/,$ s/.*/ &/' \
-e 's/\(.*\)\(Comments:\)/\*\*\* \2/' \
-e '/(posted by/ N; s/\n[ ]*/ /' \
-e 's/\(^[ ]*\)\(.*(posted by.*)\)/\*\*\*\* \2/' \
-e 's/^[ ]\{6,\}/ /' \
-e '/\*\{4,\}.*/ { N; s/\n// }' \
-e 's/\(.*(posted by.*UTC)\)\([ ]*\)\([^ ]$*\)/\1\n \3/' \
-e 's/posted by \[.*\]/posted by /' -e 's/\(.*No messages in \)\(.*\)/\1\[\[\2\][\2]\]/' |\
sed -e '1,2 d' 2> /dev/null >> NEWS
;;
esac
done
sed -i 's/^[ ]*$//' NEWS
sed -i -e '/.*[\."]$/ { s/[ ]*.*/&\n/ }' \
-e '/[ ]*http.*$/ { s_.*http://.*$_&\n_ }' \
-e '/.*: .*tar.gz.*$/ { s_.*tar.gz.*$_&\n_ }' NEWS
sed -i '/^$/ N; /^\n$/ D' NEWS
NEWS=$(< NEWS)
sed -e '/^[ ]*http:.*/ N; s/\n//; /^[ ]*http:.*/ { N; s/\n// }' \
-e '/^[ ]*http:.*/ s/\(^[ ]*http:[^ ]*\)[ ]*\([^ ]*\)$/\1\2/; s/\(^[ ]*http:[^ ]*\)\([ ]*.*\)/\1\n\2/' <<< "$NEWS" |\
sed 's/^[ ]*http:.*/&\n/' > NEWS
sed -i '/^$/ N; /^\n$/ D' NEWS
sed -i -e '/\*\*\* Comments:/ N; s/\n//; /\*\*\* Comments:/ N; s/[ ]\{5,\}/ /' NEWS
NEWS=$(< NEWS)
sed -e 's/\*\*\*Comments:/\n\n\*\*\* Comments:/' \
-e 's/\(http:[^ ]*\)\(http:[^ ]*\)/\1\n \2/' \
-e '/.*\*\*$/,/\*\*\* Comments:$/ { s/^ [^\* ]/\*\*&/ }' \
-e 's/\*\*$//' <<< "$NEWS" |\
sed -e '/^[ ]*http:.*-$/ { N; s/\n// }' \
-e '/^[ ]*http:.*-$/ { N; s/-\n/-/ }' \
-e 's/\(http:[^ ]*-\)[ ]*\([^ ]*$\)/\1\2/' \
-e '/^[ ][^ ]/ { s/.*/ &/; s/\(^[ ]*[^ ]*\)[ ][ ]\(.*\)/\1\2/; N; s/\n// }' \
-e '/\*\*[ ].*/,/\*\*\* Comments:$/ { s/\*\*[ ](/ (/ }' \
-e 's/^[ ][^ ]/ &/' \
-e 's/\([^ ]\) \([^ ]\)/\1\n \2/g' |\
sed -e '/\*\*\*\*/ !{ s/^[ ]\{4,\}/ &/ }' \
-e 's/[ ]\{4,\}/\n /g' \
-e 's/\**$//' \
-e 's/\[[0-9]*\]//' |\
sed -e '/Comments:/ { N; s/\n// }' -e 's/\([ ]*\)\(No messages in .*\)/ \2/' > NEWS
sed -i '/^[ ]*<http:[^>]*$/ { N; s/\n//; N; s/\n//; s/\(^[ ]*<http:[^ ]*\)[ ]*\([^ ]*\)/\1\2/ }' NEWS
sed -i -e "/\* Desc.*/,/\*.*/ { /[^-]GNU s.*$/ { N; s/\(.GNU.*\)\n[ ]/\1/; s_\(GNU.*\)\n_\[\[${PROJ_HOME}${pkg_path}\]\[\1\]\]\n_ }}" \
-e "/\* Desc.*/,/\*.*/ { /non-GNU.*$/ { N; s/\(.*non-GNU.*\)\n[ ]/\1/; s_\(non-GNU.*\)\n_\[\[${PROJ_HOME}${pkg_path}\]\[\1\]\]\n_ }}" \
-e '/\* Desc.*/,/\*.*/ { /\[\[.*/ { N; s/[ ]\(\[\[.*\)/\n \1/ }}' NEWS
sed -i -e '/^\* D.*/ { N; s/\n/&#+BEGIN_QUOTE/ }' \
-e '/^\* D.*/,/^$/ { s/^$/&#+END_QUOTE/ }' \
-e '/^\*\*[^\*].*/ { N; s/\n/&#+BEGIN_QUOTE/ }' \
-e 's/\*\*\*.*/#+END_QUOTE\n&/' NEWS
sed -i 's/\(\*\*\* Comments:\)\(\*\*\*\*.*\)/\1\n\2/' NEWS
sed -i -e '/Comments:/ { N; s/\n// }' -e '/Comments:/ { s/\(Comments:\)\([ ].*\)/\1\n\2/ }' NEWS
sed -i '3 { N; s/\n// }' NEWS
echo -e "$COPYRIGHT" >> NEWS
echo "NEWS file complete!"