#!/usr/bin/perl use strict; use warnings; use Data::Dump qw/dump/; use Path::Class; our $VERSION = '0.00002'; # Grab file names from command line my @files = (); for my $fname(@ARGV) { push @files, file($fname); } if ( !@files) { print "Error: no files specified.\n"; exit 1; } for my $file(@files) { my $content = $file->slurp(); # Find all dojo.requires my @requirements = (); while ($content =~ m/ dojo\.require \s*\(\s*\" ([\w\.]+?) \"\s*\)\s* /gxms) { push @requirements, $1; } # Find all provisions my @provisions = (); while ($content =~ m/ dojo\.provide \s*\(\s*\" ([\w\.]+?) \"\s*\)\s* /gxms) { push @provisions, $1; } # Gather all dependencies in one structure my @depends = (); push @depends, map { '["provide", "'.$_.'"]' } @provisions; push @depends, map { '["require", "'.$_.'"]' } @requirements; # Create the cross-domain header my $newhead = 'dojo._xdResourceLoaded(function(){ return { depends: ['. (join ',', @depends) .'], defineResource: function(dojo) { '; # Remove old non cross-domain header $content =~ s/\s*\(\s*function\(\s*\)\s*\{//; # and put the new one $content = $newhead . $content; # Change closing chars (also grouping them if sparse on more than one line) $content =~ s/ \} [\n\r\s]* \) [\n\r\s]* \( [\n\r\s]* \) [\n\r\s]* \; [\n\r\s]* $ /\}\}\}\)\;\n/xms; # Name of the destination file should have ".xd" before ".ext" (which is # usually ".js") my $dest_fname = $file->stringify; $dest_fname =~ s/\.(\w+)$/.xd.$1/; # Write to destination file my $dest_file = file($dest_fname); if (-e $dest_file) { $dest_file->remove } my $fh = $dest_file->open('w'); print $fh $content; }