# Copyright 2006, 2007 Ciaran McCreesh # Distributed under the terms of the GNU General Public License v2 # $Id: $ inherit package-manager DESCRIPTION="Read GLEP 42 news items" MAINTAINER="ciaranm@ciaranm.org" SVN_DATE='$Date: $' VERSION=$(svn_date_to_version "${SVN_DATE}" ) get_data_dir() { local d="${ROOT}/var/lib/gentoo/news" if [[ -d "${d}" ]] ; then echo "${d}" else echo "/var/empty" fi } get_unread() { local repo repos unreadf repos=( $(get_repositories ) ) for repo in ${repos[@]} ; do unreadf="$(get_data_dir)/news-${repo}.unread" [[ -f "${unreadf}" ]] || continue sed -e '/^#/d' -e "/./s,$,::${repo}," < "${unreadf}" done } get_read() { local repo repos readf repos=( $(get_repositories ) ) for repo in ${repos[@]} ; do readf="$(get_data_dir)/news-${repo}.read" [[ -f "${readf}" ]] || continue sed -e '/^#/d' -e "/./s,$,::${repo}," < "${readf}" done } mark_read() { local name=${1%::*} repo=${1##*::} readf readf="$(get_data_dir)/news-${repo}.read" touch "${readf}" || die -q "Couldn't touch read file for ${1}" if ! grep -q "^${name}\$" < "${readf}" ; then echo "${name}" >> "${readf}" || die -q "Couldn't mark ${1} as read" fi sed -i -e "/^${name}\$/d" "$(get_data_dir )"/news-${repo}.unread || \ die -q "Couldn't remove ${1} from unread list" } mark_unread() { local name=${1%::*} repo=${1##*::} unreadf unreadf="$(get_data_dir)/news-${repo}.unread" touch "${unreadf}" || die -q "Couldn't touch unread file for ${1}" if ! grep -q "^${name}\$" < "${unreadf}" ; then echo "${name}" >> "${unreadf}" || die -q "Couldn't mark ${1} as unread" fi sed -i -e "/^${name}\$/d" "$(get_data_dir )"/news-${repo}.read || \ die -q "Couldn't remove ${1} from read list" } purge_read() { local repo for repo in $(get_repositories ) ; do : > "$(get_data_dir )"/news-${repo}.read || \ die -q "Couldn't purge ${repo} read list" done } get_lang() { if [[ -n "${LC_MESSAGES}" ]] ; then echo ${LC_MESSAGES:0:2} elif [[ -n "${LANG}" ]] ; then echo ${LANG:0:2} else echo en fi } get_headers() { local dir=${1} dir=${1}/$(basename ${1%/} ).$(get_lang).txt [[ -f ${dir} ]] || dir=${1}/$(basename ${1%/} ).en.txt sed -e '/^$/,$d' < ${dir} } get_body() { local dir=${1} dir=${1}/$(basename ${1%/} ).$(get_lang).txt [[ -f ${dir} ]] || dir=${1}/$(basename ${1%/} ).en.txt sed -e '1,/^$/d' < ${dir} } get_title() { local f=$(get_news_dir_name ${1} ) if [[ -d ${f} ]] ; then get_headers ${f} | sed -n -e 's/^Title:\s*//p' else echo "(no title available)" fi } ### list action ### describe_list() { echo "List news items" } do_list() { targets=( $(get_unread ) ) write_list_start "Unread news items:" if [[ -n ${targets[@]} ]] ; then local target for target in ${targets[@]} ; do write_kv_list_entry "${target%::*}" "$(get_title ${target} )" done else write_kv_list_entry "(none found)" "" fi targets=( $(get_read ) ) write_list_start "Read news items:" if [[ -n ${targets[@]} ]] ; then local target for target in ${targets[@]} ; do write_kv_list_entry "${target%::*}" "$(get_title ${target} )" done else write_kv_list_entry "(none found)" "" fi } ### read action ### describe_read() { echo "Read a news item" } describe_read_parameters() { echo "" } describe_read_options() { echo "target : News item ID (from 'list' action), or the special" \ "item 'new', to list all new news items, or 'all', to" \ "show all items" } do_read() { [[ -z ${1} ]] && die -q "You didn't tell me what you want to read" local i item= items items=( $(get_unread ) ) if [[ "${1}" == "new" ]] ; then for i in "${items[@]}" ; do do_read "${i%::*}" done return elif [[ "${1}" == "all" ]] ; then items=( "${items[@]}" $(get_read) ) for i in "${items[@]}" ; do do_read "${i%::*}" done return fi for i in ${items[@]} ; do [[ -n "${item}" ]] && break [[ "${i%::*}" == "${1}" ]] || continue item=${i} done items=( $(get_read ) ) for i in ${items[@]} ; do [[ -n "${item}" ]] && break [[ "${i%::*}" == "${1}" ]] || continue item=${i} done [[ -z "${item}" ]] && die -q "Can't find news item '${1}'" write_list_start "${item%::*}" local f=$(get_news_dir_name ${item} ) line get_headers ${f} | \ while read line ; do local k=${line%%:*} case ${k} in Title|Author|Posted|Revision|Translator) write_kv_list_entry "${k}" "${line#*:}" ;; esac done echo get_body ${f} mark_read "${item}" } ### unread action ### describe_unread() { echo "Unread a news item" } describe_unread_parameters() { echo "" } describe_unread_options() { echo "target : News item ID (from 'list' action), or the special" \ "item 'all', to mark all items as unread" } do_unread() { [[ -z ${1} ]] && die -q "You didn't tell me what you want to unread" local i item= items items=( $(get_read ) ) if [[ "${1}" == "all" ]] ; then for i in "${items[@]}" ; do do_unread "${i%::*}" done return fi for i in ${items[@]} ; do [[ -n "${item}" ]] && break [[ "${i%::*}" == "${1}" ]] || continue item=${i} done [[ -z "${item}" ]] && die -q "Can't find read news item '${1}'" mark_unread "${item}" } ### purge action ### describe_purge() { echo "Purge read news items" } do_purge() { purge_read } ### count action ### describe_count() { echo "Show number of unread news items" } do_count() { targets=( $(get_unread ) ) echo "${#targets[@]}" } # vim: ts=4 sw=4 noet :