Page 1 of 1

same format all *.desktop files (organize info)

Posted: 24 Mar 2012, 06:01
by bigbass
there is no official standard for desktops so it's time to start one that's clean and easy to read
I know its a pain to fix all the packages that's why this is a workaround without effecting the installed files

if you want to "grep out info " having it organized in arrarys first allows you find the info with
less code filters most of the problem with writing scripts is because "we start with un formatted files "

make a template of all the desktops and lets you view them in /tmp/desktops
so none of your original desktops get overwritten

builds an array for speeding up any scripts that search info from the desktop

now all your desktops will have a format and an organized template
the first line is [Desktop Entry],Name,Icon,Type,Categories,Exec,Comment,MimeType

and thats what you will expect to see when you search the desktops for info they will all follow this format
[Desktop Entry]
Name=Image Viewer
Icon=gpicview
Type=Application
Categories=Graphics;Utility;Core;GTK;Viewer;RasterGraphics;2DGraphics;Photography;
Exec=gpicview %f
Comment=View your images easily
MimeType=image/bmp;image/gif;image/jpeg;image/jpg;image/png;image/tiff;image/x-bmp;image/x-pcx;image/x-tga;image/x-portable-pixmap;image/x-portable-bitmap;image/x-targa;image/x-portable-greymap;application/pcx;image/svg xml;image/svg-xml;





Code: Select all

#!/bin/bash


    # make a template  of the desktops regenerate all desktops  to the new simple template
    # removes poorly formatted desktops and creates a standard  which allows later  for easy reading of strings
    # into an array to speed up scripts since the newly generated desktops maintain a standard format
    # less commands are needed to filter data for output this is where all the time is wasted
    # having to parse poorly formatted files from the start if you have organized files
    # everything is fast and easy to  parse the code

    :>/tmp/arraytest.txt
    mkdir -p /tmp/desktops

    for DESKTOP_FILE in /usr/share/applications/* ; do
        while read LINE ; do
          case $LINE in
             Name=*) NAME="${LINE[@]}"'|'   ;;
             Icon=*) ICON="${LINE[@]}"'|'   ;;
             #Terminal=*)
             Type=*) TYPE="${LINE[@]}"'|'   ;;
             Categories=*) CATS="${LINE[@]}"'|'   ;;
             Exec=*) EXEC="${LINE[@]}"'|'   ;;
             Comment=*) COMM="${LINE[@]}"'|'   ;;
             MimeType=*) MIMETYPE="${LINE[@]}"'|'   ;;
          esac     
       done < $DESKTOP_FILE
       echo "."
     
       # fixes spaces in the string names by replacing them with a "+" making a correctly formatted array
          echo '[Desktop+Entry]|'$NAME$ICON$TYPE$CATS$EXEC$COMM$MIMETYPE | tr ' ' '+'  >>/tmp/arraytest.txt
        #uncomment if you want to generate all new desktops in /temp/desktops
        echo '[Desktop+Entry]|'$NAME$ICON$TYPE$CATS$EXEC$COMM$MIMETYPE | tr ' ' '+' | tr '| ' ' ' | tr ' ' '\n' | tr '+' ' '>/tmp/desktops/`basename $DESKTOP_FILE`
    done

if you want to fix KDE desktops too here it is

Code: Select all

#!/bin/bash

    # kde version
    # make a template  of the desktops regenerate all desktops  to the new simple template
    # removes poorly formatted desktops and creates a standard  which allows later  for easy reading of strings
    # into an array to speed up scripts since the newly generated desktops maintain a standard format
    # less commands are needed to filter data for output this is where all the time is wasted
    # having to parse poorly formatted files from the start if you have organized files
    # everything is fast and easy to  parse the code

    :>/tmp/arraytest.txt
    mkdir -p /tmp/desktops/kde-folder

    for DESKTOP_FILE in /usr/share/applications/kde/* ; do
        while read LINE ; do
          case $LINE in
             Name=*) NAME="${LINE[@]}"'|'   ;;
             Icon=*) ICON="${LINE[@]}"'|'   ;;
             #Terminal=*)
             Type=*) TYPE="${LINE[@]}"'|'   ;;
             Categories=*) CATS="${LINE[@]}"'|'   ;;
             Exec=*) EXEC="${LINE[@]}"'|'   ;;
             Comment=*) COMM="${LINE[@]}"'|'   ;;
            MimeType=*) MIMETYPE="${LINE[@]}"'|'   ;;
          esac     
       done < $DESKTOP_FILE
       echo "."
     
       # fixes spaces in the string names by replacing them with a "+" making a correctly formatted array
          echo '[Desktop+Entry]|'$NAME$ICON$TYPE$CATS$EXEC$COMM$MIMETYPE | tr ' ' '+'  >>/tmp/arraytest.txt
        #uncomment if you want to generate all new desktops in /temp/desktops
        echo '[Desktop+Entry]|'$NAME$ICON$TYPE$CATS$EXEC$COMM$MIMETYPE | tr ' ' '+' | tr '| ' ' ' | tr ' ' '\n' | tr '+' ' '>/tmp/desktops/kde-folder/`basename $DESKTOP_FILE`
    done





Re: same format all *.desktop files (organize info)

Posted: 25 Mar 2012, 13:10
by brokenman
I'm not sure i understand how this makes parsing .desktop files more efficient. I thought the standard for desktop files was set by these guys:
http://standards.freedesktop.org/deskt ... atest.html

Would be good if we had a way to measure efficiency. For now i will run your script against desktop files and check it out. Thanks for another great contribution.

Re: same format all *.desktop files (organize info)

Posted: 25 Mar 2012, 14:36
by bigbass
Hey brokenman
I'm not sure i understand how this makes parsing .desktop files more efficient. I thought the standard for desktop files was set by these guys:

http://standards.freedesktop.org/deskto ... atest.html
yeah I wasnt trying to say that I will make a new "desktop standard" in that sense
with all the options that we could use that has already been set by those guys at freedesktop.org :)

sorry I just didnt explain things well ( I am glad you posted with a question )
if you look at the new desktops that get made by the script
they are all neat and organized which would allow faster parsing of the info
now that they have a "standard meaning they are all the same now"
the fine guys at t freedesktop.org set a template
well they did but it isnt followed by all package makers
http://standards.freedesktop.org/deskto ... ml#example


Joe

you can test the idea with this if you ran the script above that produced the /tmp/desktops/

Code: Select all

# set this to what you want
fileplace=/tmp/desktops/
filename=audacious2.desktop


desktop_array=( `cat "$fileplace$filename" | tr ' ' '|'`)


echo ${desktop_array[1]//|/ }

echo ${desktop_array[2]//|/ }

echo ${desktop_array[3]//|/ }

echo ${desktop_array[4]//|/ }

echo ${desktop_array[5]//|/ }

echo ${desktop_array[6]//|/ }

echo ${desktop_array[7]//|/ }
#this is here to print the last line

Re: same format all *.desktop files (organize info)

Posted: 25 Mar 2012, 18:02
by brokenman
Ok i understand now. I knew you weren't attempting to create a new standard :) , i just wondered how this increases efficiency of the current system.

After running the script i found it stripped the desktop files of all non-english Comment and GenericName lines. The file i checked was smplayer.desktop. It only keeps the first Comment line.

I guess this does make parsing the file faster ... but it negates support for non-english speakers.