#!/usr/bin/env perl # # Name: Mozilla Extension RDF Generator for New Toolkit # Author: Hung-Te Lin <piaip@csie.ntu.edu.tw> # Create: Sat Jun 19 15:33:44 2004 # All rights reserved. # use Archive::Zip; # Define contstants here! # WARNING: PLEASE USE PLAIN ENGLISH/ASCII. # I've written sample in TCLP after # comments. # --------------------------------------- # You must first have a unique GUID, not using Firefox. # google for 'guidgen' if you need a real one. $EXT_GUID = ""; #"{CHANGEME-THIS-IDIS-FAKE-GUIDTOCHANGE}"; $EXT_VER = "0.9"; # extension version. Does NOT need to be same as Target. # Target Application $TA_GUID = "Firefox"; # predefined are Firefox and Thunderbird. $TA_MINVER = "0.9"; $TA_MAXVER = $TA_MINVER; #"0.9"; # language packs # Extension Data $EXT_NAME = ""; #"TCLP for $TA_GUID $TA_MINVER"; $EXT_DESC = ""; #"Traditional Chinese Language Pack for $TA_GUID $TA_MINVER"; $EXT_CREATOR= ""; #"Hung-Te Lin, piaip@csie.ntu.edu.tw"; # For URLs, leave it blank if you don't need/have one. # You may use both chrome:// or http://. $EXT_URL = ""; #"http://ntu.csie.org/~piaip/mozilla/"; $EXT_UPDATE_URL = ""; # $EXT_ICON_URL = ""; # $EXT_ABOUT_URL = ""; #"http://ntu.csie.org/~piaip/mozilla/"; $EXT_OPTIONS_URL= ""; #"chrome://selectlocale/content/locale.xul"; # the selectlocale is a tiny locale switch inspired by lpswitcher # and can be fetched from # http://ntu.csie.org/~piaip/mozilla/tools/selectlocale.jar # Required Component $REQ_GUID = $TA_GUID; #"Firefox"; $REQ_MINVER = $TA_MINVER; #"0.9"; $REQ_MAXVER = $TA_MAXVER; #"0.9"; # --------------------------------------- # copyright print STDERR "\n-- Mozilla Extension RDF Generator (install.rdf maintainer)\n"; print STDERR ' * Hung-Te Lin, <piaip@csie.ntu.edu.tw>, 2004'; print STDERR "\n\n"; # start to find chrome files print STDERR "Checking files in chrome/ directory...\n"; opendir CHROME, "chrome"; @jars = grep { /\.jar$/ } readdir(CHROME); closedir CHROME; # const GUIDs $guids{Firefox} = "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}"; $guids{Thunderbird} = "{3550f703-e582-4d05-9a08-453d09bdfdc6}"; sub getGUID() { my ($g) = (@_); $g = $guids{$g} if (exists $guids{$g}); return $g; } sub checkGUID() { my ($g) = (@_); if ($g !~ /^{........-....-....-....-............}$/) { die "Error GUID: $g.\nYou must have an unique GUID.\n"; } } # keep this for late check, maybe for optionsURL usage. @entries = (); $EXT_CHROME_LIST = ""; for my $jar (@jars) { print STDERR "$jar, "; my $zip = Archive::Zip->new('chrome/' . $jar); my @crdfs = $zip->membersMatching('/contents\.rdf$'); for my $node (@crdfs) { $node = $node->fileName(); $node =~ s/contents\.rdf$//; push @entries, ($node); } $EXT_CHROME_LIST .= &RDF_ChromeList($jar, @crdfs); } print STDERR "complete.\n\n"; sub RDF_ChromeList() { my ($fn, @chromes) = @_; my $r = ""; $r .= "<em:file><Description about=\"urn:mozilla:extension:file:$fn\">\n"; for my $rec (@chromes) { my $rectype = ''; if ($rec =~ /^locale/) { $rectype = 'locale'; } elsif ($rec =~ /^content/) { $rectype = 'package'; } elsif ($rec =~ /^skin/) { $rectype = 'skin'; } else { print STDERR "UNKOWN CHROME: $rec\n"; } $r .= "\t<em:$rectype>$rec</em:$rectype>\n"; } $r .= "</Description></em:file>\n"; return $r; } sub XmlEntry() { my ($key, $val) = @_; return "<em:$key>$val</em:$key>" if ($val and $val ne ''); return "<!-- em:$key -->"; } sub checkURL() { my ($u) = (@_); if ($u =~ /^chrome/) { my $ue = $u; $ue =~ s/^chrome:\/\///; $ue =~ s/^([^\/]*)\/([^\/]*)\/.*/$2\/$1\//; # chromes! should be local. for my $e (@entries) { if ($ue =~ $e) { # found entry. safe. return; } } die "Error chrome: $u not found. This usually causes error...\n"; } } # update optional entries &checkURL($EXT_URL); &checkURL($EXT_UPDATE_URL); &checkURL($EXT_ABOUT_URL); &checkURL($EXT_OPTIONS_URL); &checkURL($EXT_ICON_URL); $EXT_DESC = &XmlEntry('description', $EXT_DESC); $EXT_CREATOR = &XmlEntry('creator', $EXT_CREATOR); $EXT_URL = &XmlEntry('homepageURL', $EXT_URL); $EXT_UPDATE_URL = &XmlEntry('updateURL', $EXT_UPDATE_URL); $EXT_ABOUT_URL = &XmlEntry('aboutURL', $EXT_ABOUT_URL); $EXT_OPTIONS_URL = &XmlEntry('optionsURL', $EXT_OPTIONS_URL); $EXT_ICON_URL = &XmlEntry('iconURL', $EXT_ICON_URL); # update and guids $TA_GUID = &getGUID($TA_GUID); $REQ_GUID = &getGUID($REQ_GUID); &checkGUID($TA_GUID); &checkGUID($REQ_GUID); &checkGUID($EXT_GUID); $rdf_template = <<HERE; <?xml version="1.0"?> <RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#"> <Description about="urn:mozilla:install-manifest"> <em:id>$EXT_GUID</em:id> <em:version>$EXT_VER</em:version> <em:targetApplication> <Description><em:id>$TA_GUID</em:id> <em:minVersion>$TA_MINVER</em:minVersion> <em:maxVersion>$TA_MAXVER</em:maxVersion> </Description> </em:targetApplication> <!-- Front End MetaData --> <em:name>$EXT_NAME</em:name> $EXT_DESC $EXT_CREATOR $EXT_URL $EXT_UPDATE_URL $EXT_ABOUT_URL $EXT_OPTIONS_URL $EXT_ICON_URL $EXT_CHROME_LIST <em:requires> <Description><em:id>$REQ_GUID</em:id> <em:minVersion>$REQ_MINVER</em:minVersion> <em:maxVersion>$REQ_MAXVER</em:maxVersion> </Description> </em:requires> </Description> </RDF> HERE open INSTALLRDF, ">install.rdf" or die "! Cannot create install.rdf"; print INSTALLRDF $rdf_template; #print $rdf_template; close INSTALLRDF; print "install.rdf is updated. Now you can package the files."; # list known entries #print join ("\n", @entries);