wok rev 16921

Add sdft.
author Aleksej Bobylev <al.bobylev@gmail.com>
date Thu Jul 17 20:58:52 2014 +0300 (2014-07-17)
parents c8d463cdcdb3
children 371ffcd4f10c 952382c025de
files sdft/receipt sdft/stuff/sdft
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/sdft/receipt	Thu Jul 17 20:58:52 2014 +0300
     1.3 @@ -0,0 +1,16 @@
     1.4 +# SliTaz package receipt.
     1.5 +
     1.6 +PACKAGE="sdft"
     1.7 +VERSION="140717"
     1.8 +CATEGORY="development"
     1.9 +SHORT_DESC="SliTaz Desktop Files Tools"
    1.10 +MAINTAINER="al.bobylev@gmail.com"
    1.11 +LICENSE="GPL3"
    1.12 +WEB_SITE="http://www.slitaz.org/"
    1.13 +
    1.14 +# Rules to gen a SliTaz package suitable for Tazpkg.
    1.15 +genpkg_rules()
    1.16 +{
    1.17 +	mkdir -p $fs/usr/bin
    1.18 +	install -m 755 -o root $stuff/sdft $fs/usr/bin/sdft
    1.19 +}
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/sdft/stuff/sdft	Thu Jul 17 20:58:52 2014 +0300
     2.3 @@ -0,0 +1,124 @@
     2.4 +#!/bin/sh
     2.5 +# sdft - SliTaz Desktop Files Tools
     2.6 +#      - tools for edit and pretty print .desktop files for SliTaz GNU/Linux
     2.7 +# Aleksej Bobylev <al.bobylev@gmail.com>, 2014
     2.8 +
     2.9 +VERSION="040717"
    2.10 +
    2.11 +### functions ###
    2.12 +usage() {
    2.13 +	cat << "EOT"
    2.14 +sdft - SliTaz Desktop Files Tools, v. $VERSION
    2.15 +Tools for edit and pretty print .desktop files for SliTaz GNU/Linux
    2.16 +
    2.17 +Usage:
    2.18 +sdft /path/to/file.desktop [COMMAND ...]
    2.19 +
    2.20 +Commands:
    2.21 +-a "LINE"  Add a LINE to .desktop file
    2.22 +-r "LINE"  Remove all lines with LINE
    2.23 +-s "LINE"  Substitute existing LINE (like '-r' then '-a')
    2.24 +-g         Remove GenericName lines (who uses it?)
    2.25 +-x         Remove X- lines
    2.26 +-t         Remove Terminal line
    2.27 +-tf        Remove Terminal=false line
    2.28 +-te        Remove TryExec line
    2.29 +-o         Remove sections other than '[Desktop Entry]'
    2.30 +-i         In-place edit (replace original)
    2.31 +
    2.32 +Examples:
    2.33 +sdft $src/my.desktop -a "Name[en_GB]=Desktop"
    2.34 +sdft $src/my.desktop -r "Name[en_GB]"
    2.35 +sdft $src/my.desktop -s "Categories=Utility;Calculator;"
    2.36 +sdft $src/my.desktop -r "X-GNOME-.*"
    2.37 +sdft $src/my.desktop -a "Name[en_GB]=Desktop" -g -o
    2.38 +
    2.39 +EOT
    2.40 +}
    2.41 +extract() {
    2.42 +	local EX=${1//[/\[}; EX=${EX//]/\]}
    2.43 +	grep -e "^$EX=" $WORKING/section
    2.44 +	sed -i "/^$EX=/d" $WORKING/section
    2.45 +}
    2.46 +extract_no_repeat() {
    2.47 +	local IT_NAME="$1" IT_CONTENT
    2.48 +	IT_CONTENT=$(extract "$IT_NAME" | sed "s|$IT_NAME=\(.*\)|\1|")
    2.49 +	[ "x$IT_CONTENT" != x ] && echo "$IT_NAME=$IT_CONTENT"
    2.50 +	extract "$IT_NAME[.*]" | sort | sed -n "/$IT_NAME\[.*\]=$IT_CONTENT$/!p"
    2.51 +}
    2.52 +semicolon() {
    2.53 +	sed -e 's|.*|&;|' -e 's|;;|;|g'
    2.54 +}
    2.55 +### /functions ###
    2.56 +
    2.57 +
    2.58 +
    2.59 +case "$1" in
    2.60 +	-h|--help) usage; exit 0 ;;
    2.61 +	-v|-V|--version) echo "sdft v. $VERSION"; exit 0 ;;
    2.62 +esac
    2.63 +
    2.64 +# working dir
    2.65 +WORKING=$(mktemp -d)
    2.66 +# original .desktop file to process it
    2.67 +ORIGINAL="$WORKING/original.desktop"
    2.68 +DESKTOP="$1"; cp "$DESKTOP" $ORIGINAL
    2.69 +
    2.70 +SECTION="Desktop Entry"
    2.71 +if ! grep -qF "[$SECTION]" "$ORIGINAL"; then
    2.72 +	echo "Seems $1 is not a Desktop file. Abort" >&2
    2.73 +	exit 1
    2.74 +fi
    2.75 +
    2.76 +# extract section content
    2.77 +sed -n "/^\[$SECTION\]$/,/^\[.*\]$/{/^\[/!p}" $ORIGINAL > $WORKING/section
    2.78 +
    2.79 +# rest of the file
    2.80 +sed "/^\[$SECTION\]$/,/^\[.*\]$/{/^[^\[]/d}" $ORIGINAL | sed "/^\[$SECTION\]$/d" > $WORKING/rest
    2.81 +
    2.82 +shift
    2.83 +while [ "x$1" != "x" ]; do
    2.84 +	case "$1" in
    2.85 +		-a) shift; echo "$1" >> $WORKING/section; shift ;;
    2.86 +		-r) shift; extract "$1" > /dev/null; shift ;;
    2.87 +		-s) shift; extract "${1%%=*}" > /dev/null; echo "$1" >> $WORKING/section; shift ;;
    2.88 +		-g) shift; extract_no_repeat 'GenericName' > /dev/null ;;
    2.89 +		-x) shift; extract 'X-.*' > /dev/null ;;
    2.90 +		-t) shift; extract 'Terminal' > /dev/null ;;
    2.91 +		-tf) shift; sed -i '/^Terminal=false$/d' $WORKING/section ;;
    2.92 +		-te) shift; extract 'TryExec' > /dev/null ;;
    2.93 +		-o) shift; REMOVE_OTHER="yes" ;;
    2.94 +		-i) shift; IN_PLACE="yes" ;;
    2.95 +		*) echo "Unknown command '$1'" >&2; shift ;;
    2.96 +	esac
    2.97 +done
    2.98 +
    2.99 +{
   2.100 +	echo "[$SECTION]"
   2.101 +	extract 'Encoding' > /dev/null
   2.102 +	extract 'Version' > /dev/null
   2.103 +	extract 'Type'
   2.104 +	extract_no_repeat 'Name'
   2.105 +	extract_no_repeat 'GenericName'
   2.106 +	extract_no_repeat 'Comment'
   2.107 +	extract 'Terminal'
   2.108 +	extract 'StartupNotify'
   2.109 +	extract 'TryExec'
   2.110 +	extract 'Exec'
   2.111 +	extract 'Icon'; extract 'Icon[.*]' > /dev/null
   2.112 +	extract 'Categories' | sed 's|Application;||' | semicolon
   2.113 +	extract 'NoDisplay'
   2.114 +	extract 'MimeType' | semicolon
   2.115 +
   2.116 +	cat $WORKING/section | sort | sed -n '/^$/!p'
   2.117 +	[ "x$REMOVE_OTHER" != "xyes" ] && cat $WORKING/rest | sed -n '/^$/!p'
   2.118 +} > $WORKING/new
   2.119 +
   2.120 +if [ "x$IN_PLACE" == "xyes" ]; then
   2.121 +	cp -f $WORKING/new "$DESKTOP"
   2.122 +else
   2.123 +	cat $WORKING/new
   2.124 +fi
   2.125 +
   2.126 +# clean
   2.127 +rm -rf $WORKING