JAL-3521 Updating file opening marker to %u
[jalview.git] / utils / debian / mime_types_for_debian.pl
1 #!/usr/bin/env perl
2
3 use strict;
4
5 my $fileformats = $ARGV[0];
6 $fileformats = "../../src/jalview/io/FileFormat.java" unless $fileformats;
7
8 # default mimetype will be text/x-$shortname
9 # TODO: find an actual extension for mat, see JAL-Xxxxx for outstanding issues too
10 # TODO: look up standard mime type used for BLASTfmt matrices, etc
11 my $mimetypes = {
12   rnaml => "application/rnaml+xml",
13   biojson => "application/x-jalview-biojson+json",
14   jnet => "application/x-jalview-jnet+text",
15   features => "application/x-jalview-features+text",
16   scorematrix => "application/x-jalview-scorematrix+text",
17   pdb => "chemical/x-pdb",
18   mmcif => "chemical/x-cif",
19   mmcif2 => "chemical/x-mmcif",
20   jalview => "application/x-jalview+xml+zip",
21   #jvl => "application/x-jalview-jvl+text",
22   annotations => "application/x-jalview-annotations+text",
23 };
24
25 my @dontaddshortname = qw(features json);
26 my @dontaddextension = qw(html xml json jar mfa fastq);
27 my $add_associations = {
28   biojson => {shortname=>"biojson",name=>"BioJSON",extensions=>["biojson"]},
29   gff2 => {shortname=>"gff2",name=>"Generic Features Format v2",extensions=>["gff2"]},
30   gff3 => {shortname=>"gff3",name=>"Generic Features Format v3",extensions=>["gff3"]},
31   features => {shortname=>"features",name=>"Jalview Features",extensions=>["features","jvfeatures"]},
32   annotations => {shortname=>"annotations",name=>"Jalview Annotations",extensions=>["annotations","jvannotations"]},
33   mmcif => {shortname=>"mmcif",name=>"CIF",extensions=>["cif"]},
34   mmcif2 => {shortname=>"mmcif2",name=>"mmCIF",extensions=>["mcif","mmcif"]},
35   #jvl => {shortname=>"jvl",name=>"Jalview Launch",extensions=>["jvl"],iconfile=>"jalview-launch"},
36   jnet => {shortname=>"jnet",name=>"JnetFile",extensions=>["concise","jnet"]},
37   scorematrix => {shortname=>"scorematrix",name=>"Substitution Matrix",extensions=>["mat"]},
38 };
39 my $add_extensions = {
40   blc => ["blc"],
41 };
42 my @put_first = qw(jalview jvl);
43
44 my @non_primary = qw(mmcif mmcif2 pdb);
45
46 my $mailcaptemplatefile = "file_associations_template-mailcap.txt";
47 my $mailcaptemplate;
48 my $sharedmimeinfotemplatefile = "file_associations_template-shared-mime-info.xml";
49 my $sharedmimeinfotemplate;
50
51 open(SMT,"<$sharedmimeinfotemplatefile") or die("Could not open '$sharedmimeinfotemplatefile' for reading");
52 while(<SMT>){
53   $sharedmimeinfotemplate .= $_;
54 }
55 close(SMT);
56 open(MCT,"<$mailcaptemplatefile") or die("Could not open '$mailcaptemplatefile' for reading");
57 while(<MCT>){
58   $mailcaptemplate .= $_;
59 }
60 close(MCT);
61 my $sharedmimeinfoauto;
62 my $mailcapauto;
63
64 # this file should go in /usr/share/mime/packages
65 my $sharedmimeinfoautofile = "debian/jalview-mime.xml";
66
67 # this file should go in /usr/lib/mime/packages
68 my $mailcapautofile = "debian/jalview-mailcap";
69
70 # this should be part of the jalview.desktop file that goes in /usr/shares/applications
71 my $desktopfile = "debian/jalview.desktop";
72
73 my $MimeType = "";
74
75 for my $key (sort keys %$add_associations) {
76   my $a = $add_associations->{$key};
77   warn("Known file association for $a->{shortname} (".join(",",@{$a->{extensions}}).")\n");
78 }
79
80 open(SMI,">$sharedmimeinfoautofile") or die ("Could not open '$sharedmimeinfoautofile' for writing");
81
82 open(MCA,">$mailcapautofile") or die ("Could not open '$mailcapautofile' for writing");
83
84 open(IN, "<$fileformats") or die ("Could not open '$fileformats' for reading");
85 my $id = 10000;
86 my $file_associations = {};
87 while(my $line = <IN>) {
88   $line =~ s/\s+/ /g;
89   $line =~ s/(^ | $)//g;
90   if ($line =~ m/^(\w+) ?\( ?"([^"]*)" ?, ?"([^"]*)" ?, ?(true|false) ?, ?(true|false) ?\)$/i) {
91     my $shortname = lc($1);
92     next if (grep($_ eq $shortname, @dontaddshortname));
93     my $name = $2;
94     my $extensions = $3;
95     $extensions =~ s/\s+//g;
96     my @possextensions = map(lc($_),split(m/,/,$extensions));
97     my @extensions;
98     my $addext = $add_extensions->{$shortname};
99     if (ref($addext) eq "ARRAY") {
100       push(@possextensions, @$addext);
101     }
102     for my $possext (@possextensions) {
103       next if grep($_ eq $possext, @extensions);
104       next if grep($_ eq $possext, @dontaddextension);
105       push(@extensions,$possext);
106     }
107     next unless scalar(@extensions);
108     $file_associations->{$shortname} = {
109       shortname => $shortname,
110       name => $name,
111       extensions => \@extensions
112     };
113     warn("Reading file association for $shortname (".join(",",@extensions).")\n");
114   }
115 }
116 close(IN);
117
118 my %all_associations = (%$file_associations, %$add_associations);
119
120 my @ordered = (@put_first, @non_primary);
121 for my $key (sort keys %all_associations) {
122   next if grep($_ eq $key, @ordered);
123   push(@ordered, $key);
124 }
125 my $num = $#ordered + 1;
126
127 warn("--\n");
128 print SMI qq(<?xml version="1.0" encoding="UTF-8"?>\n<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">\n\n);
129
130 my $mailcapcount = 0;
131 for my $shortname (@ordered) {
132   my $a = $all_associations{$shortname};
133   next if (ref($a) ne "HASH");
134
135   my $name = $a->{name};
136   my $extensions = $a->{extensions};
137   my $mimetype = $mimetypes->{$shortname};
138   $mimetype = "application/x-$shortname+txt" unless $mimetype;
139
140   $MimeType .= $MimeType?";":"";
141   $MimeType .= $mimetype;
142
143   my $iconfile = $a->{iconfile};
144   $iconfile = "jalview-file" unless $iconfile;
145
146   my $primary = (! grep($_ eq $shortname, @non_primary));
147   my $primarystring = $primary?"true":"false";
148   my $role = $primary?"Editor":"Viewer";
149   my $priority = $primary?9:4;
150   $priority = 10 if $mimetype =~ m/\bjalview\b/;
151
152   my @extensions = @$extensions;
153   my $extension0 = $extensions[0];
154
155   my $xname = xml_escape($name);
156   my $xmimetype = xml_escape($mimetype);
157   my $xshortname = xml_escape($shortname);
158   my $xiconfile = xml_escape($iconfile);
159   my $xrole = xml_escape($role);
160   my $xROLE = xml_escape(uc($role));
161   my $xprimarystring = xml_escape($primarystring);
162
163   my $sharedmimeinfoentry = $sharedmimeinfotemplate;
164   $sharedmimeinfoentry =~ s/\$\$NAME\$\$/$xname/g;
165   $sharedmimeinfoentry =~ s/\$\$SHORTNAME\$\$/$xshortname/g;
166   $sharedmimeinfoentry =~ s/\$\$MIMETYPE\$\$/$xmimetype/g;
167   $sharedmimeinfoentry =~ s/\$\$ICONFILE\$\$/$xiconfile/g;
168   $sharedmimeinfoentry =~ s/\$\$ROLE\$\$/$xrole/g;
169   $sharedmimeinfoentry =~ s/\$\$PRIMARY\$\$/$xprimarystring/g;
170   $sharedmimeinfoentry =~ s/\$\$PRIORITY\$\$/$priority/g;
171   while ($sharedmimeinfoentry =~ m/\$\$([^\$]*)EXTENSIONS([^\$]*)\$\$/) {
172     my $pre = $1;
173     my $post = $2;
174     my $sharedmimeinfoextensions;
175     for my $ext (@extensions) {
176       my $xext = xml_escape($ext);
177       $sharedmimeinfoextensions .= $pre.$xext.$post;
178     }
179     my $prere = $pre;
180     $prere =~ s/([\*\.])/\\\1/g;
181     my $postre = $post;
182     $postre =~ s/([\*\.])/\\\1/g;
183     $sharedmimeinfoentry =~ s/\$\$${prere}EXTENSIONS${postre}\$\$/$sharedmimeinfoextensions/gs;
184   }
185   print SMI $sharedmimeinfoentry;
186
187   my $mailcapentry = $mailcaptemplate;
188   $mailcapentry =~ s/\$\$NAME\$\$/$xname/g;
189   $mailcapentry =~ s/\$\$SHORTNAME\$\$/$xshortname/g;
190   $mailcapentry =~ s/\$\$MIMETYPE\$\$/$xmimetype/g;
191   $mailcapentry =~ s/\$\$ICONFILE\$\$/$xiconfile/g;
192   $mailcapentry =~ s/\$\$PRIMARY\$\$/$xprimarystring/g;
193   $mailcapentry =~ s/\$\$MACASSOCIATIONROLE\$\$/$xROLE/g;
194   $mailcapentry =~ s/\$\$EXTENSION\$\$/$extension0/g;
195   $mailcapentry =~ s/\$\$PRIORITY\$\$/$priority/g;
196
197   my $ext = join(",",sort(@extensions));
198   my $xdisplayext = xml_escape(join(", ", map(".$_",sort(@extensions))));
199   my $progresspercent = int(($mailcapcount/$num)*100);
200   $progresspercent = 100 if $progresspercent > 100;
201   $mailcapcount++;
202   my $xext = xml_escape($ext);
203   my $addunixextension = "true";
204
205   $mailcapentry =~ s/\$\$ADDUNIXEXTENSION\$\$/$addunixextension/g;
206   $mailcapentry =~ s/\$\$EXTENSION\$\$/$xext/g;
207   $mailcapentry =~ s/\$\$DISPLAYEXTENSION\$\$/$xdisplayext/g;
208   $mailcapentry =~ s/\$\$PROGRESSPERCENT\$\$/$progresspercent/g;
209   $mailcapentry =~ s/\$\$ID\$\$/$id/g;
210   $id++;
211   $mailcapentry =~ s/\$\$ID1\$\$/$id/g;
212   $id++;
213   $mailcapentry =~ s/\$\$ID2\$\$/$id/g;
214   $id++;
215
216   print MCA $mailcapentry;
217
218   delete $all_associations{$shortname};
219   warn("Writing entry for $name (".join(",",@$extensions).": $mimetype)\n");
220 }
221
222 print SMI "</mime-info>\n";
223
224 close(MCA);
225 close(SMI);
226
227 open(D,">$desktopfile") or die ("Could not open '$desktopfile' for writing");
228 print D qq([Desktop Entry]
229 Version=1.1
230 Type=Application
231 Name=Jalview
232 Comment=Multiple Sequence Alignment Editor
233 Icon=jalview-icon
234 Type=Application
235 TryExec=jalview
236 Exec=jalview -open %u
237 Terminal=false
238 Categories=Science;Biology;
239 Keywords=alignment;sequence;
240 MimeType=${MimeType}
241 );
242 close(D);
243
244 sub xml_escape {
245   my $x = shift;
246   # stolen from Pod::Simple::XMLOutStream in base distro
247   $x =~ s/([^-\n\t !\#\$\%\(\)\*\+,\.\~\/\:\;=\?\@\[\\\]\^_\`\{\|\}a-zA-Z0-9])/'&#'.(ord($1)).';'/eg;
248   return $x;
249 }