[Koha-patches] [PATCH] Bug 1918 - Minify JavaScript and CSS

Dobrica Pavlinusic dpavlin at rot13.org
Wed Apr 11 14:25:52 CEST 2012


This provides new Koha::Template::Plugin::Combine which is intended
to replace direct include of JavaScript and CSS files.

This plugin preserves order of included files when combining them.

Code need cleanup and documentation, but attaching it to bug will
provide easier way to try it out.
---
 Koha/Template/Plugin/Combine.pm                    |  141 +++++++++++++++++++
 .../intranet-tmpl/prog/en/css/staff-global.css     |    3 +-
 .../prog/en/includes/doc-head-close.inc            |   46 ++++---
 koha-tmpl/opac-tmpl/prog/en/css/opac.css           |    3 -
 .../opac-tmpl/prog/en/includes/doc-head-close.inc  |  143 +++++++++++++-------
 koha-tmpl/opac-tmpl/prog/en/js/script.js           |    1 -
 6 files changed, 259 insertions(+), 78 deletions(-)
 create mode 100644 Koha/Template/Plugin/Combine.pm

diff --git a/Koha/Template/Plugin/Combine.pm b/Koha/Template/Plugin/Combine.pm
new file mode 100644
index 0000000..c84bc7f
--- /dev/null
+++ b/Koha/Template/Plugin/Combine.pm
@@ -0,0 +1,141 @@
+package Koha::Template::Plugin::Combine;
+use Template::Plugin;
+use base qw( Template::Plugin );
+use warnings;
+use strict;
+
+# PLACK_DEBUG=1 always re-create files but report correct hit/miss ration
+
+use File::Slurp;
+use Digest::MD5;
+use Data::Dump qw(dump);
+
+use CSS::Minifier::XS;
+use JavaScript::Minifier::XS;
+
+sub new {
+	my ($class, $context, @params) = @_;
+#warn "## context ",dump( $context );
+	bless {
+		_CONTEXT => $context,
+		js  => [], # same as extension!
+		css => [],
+		inline => 1,
+		minify => 1,
+	}, $class;
+}
+
+sub _html_params {
+	my $params = shift;
+	return join(' ', map { $_ . '="' . $params->{$_} . '"' } keys %$params );
+}
+
+sub javascript {
+	my ( $self, $params ) = @_;
+	warn "## combine.javascript ", dump( $params );
+	$params->{type} ||= 'text/javascript';
+	push @{ $self->{js} }, $params;
+	my $html = _html_params( $params );
+	if ( $self->{inline} ) {
+		return "<!-- script $html -->\n";
+	} elsif ( my $cdata = $params->{cdata} ) {
+		return qq|<script type="text/javascript" language="javascript">\n//<![CDATA[\n$cdata\n//]]>\n</script>\n|;
+	} else {
+		return "<script $html></script>\n";
+	}
+}
+
+sub css {
+	my ( $self, $params ) = @_;
+	warn "## combine.css ",dump( $params );
+	$params->{rel}  ||= 'stylesheet';
+	$params->{type} ||= 'text/css';
+	die "no href in ",dump($params) unless exists $params->{href};
+	my $html = _html_params( $params );
+
+	if ( exists $params->{media} ) { # FIXME not combined!
+		push @{ $self->{css_media} }, "<link $html />";
+		return "<!-- media $html -->";
+	}
+
+	push @{ $self->{css} }, $params;
+	if ( $self->{inline}) {
+		return "<!-- link $html -->\n";
+	} else {
+		return "<link $html />\n";
+	}
+}
+
+sub combined_files {
+	my ( $self, $what, $attr, $params ) = @_;
+warn "## combined_files $what $attr ",dump($params);
+	my $key = join(' ', map { $_->{$attr} || $_->{cdata} } @{ $self->{$what} } );
+	$key = Digest::MD5::md5_hex( $key ); # shorten filenames
+	warn "# $what $attr key = $key\n";
+	my $htdocs = C4::Context->config('intrahtdocs');
+	$htdocs =~ s{/intranet-tmpl/?$}{}; # FIXME DocumentRoot even for OPAC
+
+	my ( $path, $url );
+	if ( my $prefix = $params->{prefix} ) {
+		$path = "$htdocs/$prefix/combined/$key.$what";
+		$url  = "$prefix/combined/$key.$what";
+	} else {
+		$path = "$htdocs/intranet-tmpl/combined/$key.$what";
+		$url  = "/intranet-tmpl/combined/$key.$what";
+	}
+	$path =~ s{//+}{/}; # plack is picky about paths
+	if ( -e $path ) {
+		$Koha::Persistant::stats->{combine_files}->[0]++; # hit
+		return $url if ! $ENV{PLACK_DEBUG}; # FIXME no caching with debug
+	}
+	$Koha::Persistant::stats->{combine_files}->[1]++ if ! $ENV{PLACK_DEBUG}; # miss
+
+	my $mix;
+	foreach my $include ( @{ $self->{$what} } ) {
+		if ( my $path = $include->{$attr} ) {
+			warn "combine_files $what $attr - $path";
+			my $chunk = read_file("$htdocs/$path");
+			die "$htdocs/$path found \@import" if $what eq 'css' && $chunk =~ m'@import';
+			$mix .= "\n/* BEGIN $path */\n$chunk\n/* END $path */\n";
+		} elsif ( my $cdata = $include->{cdata} ) {
+			warn "combine_files CDATA $cdata";
+			$mix .= "\n/* BEGIN CDATA */\n$cdata\n/* END CDATA */\n";
+		}
+	}
+	my $combined_size = length($mix);
+	if ( $self->{minify} ) {
+		if ( $what eq 'js' ) {
+			$mix = JavaScript::Minifier::XS::minify( $mix );
+		} elsif ( $what eq 'css' ) {
+			$mix = CSS::Minifier::XS::minify( $mix );
+		} else {
+			die "can't minify $what";
+		}
+		my $size = length($mix);
+		warn sprintf "minify %s %d -> %d %.2f%%\n", $what, $combined_size, $size, $size * 100 / $combined_size;
+	}
+	write_file $path, $mix;
+	warn "## $path ", -s $path, "/$combined_size bytes\n";
+	return $url;
+}
+
+sub html {
+	my ( $self, $params ) = @_;
+
+	if ( $self->{inline} ) {
+		warn "## css ",dump( $self->{css} );
+		warn "## javascript ",dump( $self->{js} );
+		my $mix;
+		my $js  = $self->combined_files( 'js'  => 'src', $params );
+		my $css = $self->combined_files( 'css' => 'href', $params );
+		return qq{
+		<!-- combined.html -->
+		<link type="text/css" href="$css" rel="stylesheet" />
+		<script type="text/javascript" src="$js"></script>
+		};
+	} else {
+		return "<!-- javascript and css combine disabled -->";
+	}
+}
+
+1;
diff --git a/koha-tmpl/intranet-tmpl/prog/en/css/staff-global.css b/koha-tmpl/intranet-tmpl/prog/en/css/staff-global.css
index ef01648..3519d20 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/css/staff-global.css
+++ b/koha-tmpl/intranet-tmpl/prog/en/css/staff-global.css
@@ -1,5 +1,4 @@
- at import url("../lib/yui/reset-fonts-grids.css");
- at import url("../lib/yui/skin.css");
+/* import moved to koha-tmpl/intranet-tmpl/prog/en/includes/doc-head-close.inc */
 
 a, a:link, a:visited, a:active {
 	color : #0000CC;
diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/doc-head-close.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/doc-head-close.inc
index bc551ac..b15aea4 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/includes/doc-head-close.inc
+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/doc-head-close.inc
@@ -1,42 +1,45 @@
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+[% USE combine = Combine %]
 <link rel="shortcut icon" href="[% IF ( IntranetFavicon ) %][% IntranetFavicon %][% ELSE %][% themelang %]/includes/favicon.ico[% END %]" type="image/x-icon" />
-<link rel="stylesheet" type="text/css" href="[% themelang %]/lib/jquery/plugins/ui.tabs.css" />
-<link rel="stylesheet" type="text/css" media="print" href="[% themelang %]/css/print.css" />
+[% combine.css( href => themelang _ "/lib/jquery/plugins/ui.tabs.css" ) %]
+[% combine.css( media => "print" href => themelang _ "/css/print.css" ) %]
 [% IF ( intranetstylesheet ) %]
-    <link rel="stylesheet" type="text/css" href="[% intranetstylesheet %]" />
+    [% combine.css( href => intranetstylesheet ) %]
 [% ELSE %]
-    <link rel="stylesheet" type="text/css" href="[% themelang %]/css/staff-global.css" />
+    [% combine.css( href => yuipath _ "/reset-fonts-grids.css" ) %]
+    [% combine.css( href => yuipath _ "/skin.css" ) %]
+    [% combine.css( href => themelang _ "/css/staff-global.css" ) %]
 [% END %]
 [% IF ( IntranetUserCSS ) %]<style type="text/css">[% IntranetUserCSS %]</style>[% END %]
-<script type="text/javascript" src="[% themelang %]/lib/jquery/jquery.js"></script>
-<script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/ui.tabs.js"></script>
-<script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/jquery.hotkeys.min.js"></script>
-<script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/jquery.cookie.min.js"></script>
-<script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/jquery.highlight-3.js"></script>
+[% combine.javascript( src => themelang _ "/lib/jquery/jquery.js" ) %]
+[% combine.javascript( src => themelang _ "/lib/jquery/plugins/ui.tabs.js" ) %]
+[% combine.javascript( src => themelang _ "/lib/jquery/plugins/jquery.hotkeys.min.js" ) %]
+[% combine.javascript( src => themelang _ "/lib/jquery/plugins/jquery.cookie.min.js" ) %]
+[% combine.javascript( src => themelang _ "/lib/jquery/plugins/jquery.highlight-3.js" ) %]
 [% IF ( login ) %]
-    <link rel="stylesheet" type="text/css" href="[% themelang %]/css/login.css" />
+    [% combine.css( href => themelang _ "/css/login.css" ) %]
 [% END %]
 [% IF ( wizard ) %]
-    <link rel="stylesheet" type="text/css" href="[% themelang %]/css/wizard.css" />
+    [% combine.css( href => themelang _ "/css/wizard.css" ) %]
 [% END %]
 
 <!-- local colors -->
 [% IF ( intranetcolorstylesheet ) %]
-    <link rel="stylesheet" type="text/css" href="[% themelang %]/css/[% intranetcolorstylesheet %]" />
+    [% combine.css( href => themelang _ "/css/" _ intranetcolorstylesheet ) %]
 [% END %]
 
 <!-- yui js --> 
-<script type="text/javascript" src="[% yuipath %]/utilities/utilities.js"></script> 
-<script type="text/javascript" src="[% yuipath %]/datasource/datasource-min.js"></script>
+[% combine.javascript( src => yuipath _ "/utilities/utilities.js" ) %] 
+[% combine.javascript( src => yuipath _ "/datasource/datasource-min.js" ) %]
 [% IF ( CircAutocompl ) %]
-    <script type="text/javascript" src="[% yuipath %]/autocomplete/autocomplete-min.js"></script>
+    [% combine.javascript( src => yuipath _ "/autocomplete/autocomplete-min.js" ) %]
 [% END %]
-<script type="text/javascript" src="[% yuipath %]/button/button-min.js"></script> 
-<script type="text/javascript" src="[% yuipath %]/container/container_core-min.js"></script> 
-<script type="text/javascript" src="[% yuipath %]/menu/menu-min.js"></script> 
+[% combine.javascript( src => yuipath _ "/button/button-min.js" ) %] 
+[% combine.javascript( src => yuipath _ "/container/container_core-min.js" ) %] 
+[% combine.javascript( src => yuipath _ "/menu/menu-min.js" ) %] 
 
 <!-- koha core js -->
-<script type="text/javascript" src="[% themelang %]/js/staff-global.js"></script>
+[% combine.javascript( src => themelang _ "/js/staff-global.js" ) %]
 [% IF ( intranetuserjs ) %]
     <script type="text/javascript">
     //<![CDATA[
@@ -60,13 +63,14 @@
     //]]>
     </script>
     [% IF ( virtualshelves || intranetbookbag ) %]
-        <script type="text/javascript" language="javascript" src="[% themelang %]/js/basket.js"></script>
+        [% combine.javascript( src => themelang _ "/js/basket.js" ) %]
     [% END %]
 [% IF LocalCoverImages %]
-<script type="text/javascript" language="javascript" src="[% themelang %]/js/localcovers.js"></script>
+[% combine.javascript( src => themelang _ "/js/localcovers.js" ) %]
 <script type="text/javascript" language="javascript">
 //<![CDATA[
 var NO_LOCAL_JACKET = _("No cover image available");
 //]]>
 </script>
 [% END %]
+[% combine.html( prefix => themelang ) %]
diff --git a/koha-tmpl/opac-tmpl/prog/en/css/opac.css b/koha-tmpl/opac-tmpl/prog/en/css/opac.css
index c10e08d..c48a59c 100644
--- a/koha-tmpl/opac-tmpl/prog/en/css/opac.css
+++ b/koha-tmpl/opac-tmpl/prog/en/css/opac.css
@@ -1,6 +1,3 @@
- at import url("../lib/yui/reset-fonts-grids.css");
- at import url("../lib/yui/skin.css");
-
 a {
 	font-weight : bold;
 }
diff --git a/koha-tmpl/opac-tmpl/prog/en/includes/doc-head-close.inc b/koha-tmpl/opac-tmpl/prog/en/includes/doc-head-close.inc
index 3907f34..d5ea90e 100644
--- a/koha-tmpl/opac-tmpl/prog/en/includes/doc-head-close.inc
+++ b/koha-tmpl/opac-tmpl/prog/en/includes/doc-head-close.inc
@@ -2,50 +2,62 @@
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <meta name="generator" content="Koha [% Version %]" /> <!-- leave this for stats -->
 <link rel="shortcut icon" href="[% IF ( OpacFavicon ) %][% OpacFavicon %][% ELSE %][% themelang %]/includes/favicon.ico[% END %]" type="image/x-icon" />
-[% IF ( opacstylesheet ) %]<link rel="stylesheet" type="text/css" href="[% opacstylesheet %]" />[% ELSE %]
-[% IF ( opaclayoutstylesheet ) %]<link rel="stylesheet" type="text/css" href="[% themelang %]/css/[% opaclayoutstylesheet %]" />[% ELSE %]<link rel="stylesheet" type="text/css" href="[% themelang %]/css/opac.css" />[% END %][% END %]
+[% USE combine = Combine %]
+[% IF ( opacstylesheet ) %]
+    [% combine.css( href => opacstylesheet ) %]
+[% ELSE %]
+    [% IF ( opaclayoutstylesheet ) %]
+        [% combine.css( href => themelang _ "/css/" _ opaclayoutstylesheet ) %]
+    [% ELSE %]
+        [% combine.css( href => themelang _ "/css/opac.css" ) %]
+    [% END %]
+[% END %]
 [% IF ( opaccolorstylesheet ) %]
-    <link rel="stylesheet" type="text/css" href="[% themelang %]/css/[% opaccolorstylesheet %]" />
+    [% combine.css( href => themelang _ "/css/" _ opaccolorstylesheet ) %]
 [% END %]
 [% IF ( opacexternalsheet ) %]
-    <link rel="stylesheet" type="text/css" href="[% opacexternalsheet %]" />
+    [% combine.css( href => opacexternalsheet ) %]
 [% END %]
 [% IF ( opac_css_override ) %]
-    <link rel="stylesheet" type="text/css" href="[% themelang %]/css/[% opac_css_override %]" />
+    [% combine.css( href => therelang _ "/css/" _ opac_css_override ) %]
 [% END %]
 <link rel="stylesheet" type="text/css" media="print" href="[% themelang %]/css/print.css" />
-<link rel="stylesheet" type="text/css" href="[% themelang %]/lib/jquery/plugins/ui.tabs.css" />
+[% combine.css( href => themelang _ "/lib/jquery/plugins/ui.tabs.css" ) %]
 [% IF ( OPACUserCSS ) %]<style type="text/css">[% OPACUserCSS %]</style>[% END %]
 <!-- yui js --> 
-<script type="text/javascript" src="[% yuipath %]/utilities/utilities.js"></script> 
-<script type="text/javascript" src="[% yuipath %]/container/container-min.js"></script> 
-<script type="text/javascript" src="[% yuipath %]/menu/menu-min.js"></script> 
-<script type="text/javascript" src="[% themelang %]/lib/jquery/jquery.js"></script>
-<script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/ui.tabs.js"></script>
-<script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/jquery.hoverIntent.minified.js"></script>
-<script type="text/javascript" language="javascript" src="[% themelang %]/js/script.js"></script>
+[% combine.css( href => yuipath _ "/reset-fonts-grids.css" ) %]
+[% combine.css( href => yuipath _ "/skin.css" ) %]
+[% combine.javascript( src => yuipath  _ "/utilities/utilities.js" ) %] 
+[% combine.javascript( src => yuipath  _ "/container/container-min.js" ) %] 
+[% combine.javascript( src => yuipath  _ "/menu/menu-min.js" ) %] 
+[% combine.javascript( src => themelang  _ "/lib/jquery/jquery.js" ) %]
+[% combine.javascript( src => themelang  _ "/lib/jquery/plugins/ui.tabs.js" ) %]
+[% combine.javascript( src => themelang  _ "/lib/jquery/plugins/jquery.hoverIntent.minified.js" ) %]
+[% combine.javascript( src => themelang _ "/js/script.js" ) %]
+
 [% IF ( OPACAmazonCoverImages ) %]
-<script type="text/javascript" language="javascript">//<![CDATA[
-		var NO_AMAZON_IMAGE = _("No cover image available");
-	//]]>
-</script>
-<script type="text/javascript" language="javascript" src="[% themelang %]/js/amazonimages.js"></script>
+[% combine.javascript( cdata => "var NO_AMAZON_IMAGE = _(\"No cover image available\");" ) %]
+[% combine.javascript( src => themelang _ "/js/amazonimages.js" ) %]
 [% END %]
 [% IF ( SyndeticsCoverImages ) %]
-<script type="text/javascript" language="javascript">//<![CDATA[
-        var NO_AMAZON_IMAGE = _("No cover image available");
-    //]]>
-</script>
-<script type="text/javascript" language="javascript" src="[% themelang %]/js/amazonimages.js"></script>          [% END %]
+[% combine.javascript( cdata => "var NO_AMAZON_IMAGE = _(\"No cover image available\");" ) %]
+[% combine.javascript( src => themelang _ "/js/amazonimages.js" ) %]
+[% END %]
 
-[% IF ( opacbookbag ) %]<script type="text/javascript" language="javascript" src="[% themelang %]/js/basket.js">
-[% ELSIF ( virtualshelves ) %]<script type="text/javascript" language="javascript" src="[% themelang %]/js/basket.js">
-[% ELSE %]<script type="text/javascript" language="javascript"> var readCookie;[% END %]
-</script>
+[% IF ( opacbookbag ) %]
+  [% combine.javascript( src => themelang _ "/js/basket.js" ) %]
+[% ELSIF ( virtualshelves ) %]
+  [% combine.javascript( src => themelang _ "/js/basket.js" ) %]
+[% ELSE %]
+  [% combine.javascript( cdata => "var readCookie;" ) %]
+[% END %]
 
+[% combine.javascript( cdata => "var cdata_test;" ) %]
 <script type="text/javascript" language="javascript">
 	//<![CDATA[
-    [% IF ( opacbookbag ) %]var MSG_BASKET_EMPTY = _("Your cart is currently empty");
+function _(s) { return s } // dummy function for gettext
+[% IF ( opacbookbag ) %]
+    var MSG_BASKET_EMPTY = _("Your cart is currently empty");
     var MSG_RECORD_IN_BASKET = _("This item is already in your cart");
     var MSG_RECORD_ADDED = _("This item has been added to your cart");
     var MSG_RECORD_REMOVED = _("This item has been removed from your cart");
@@ -57,9 +69,16 @@
     var MSG_CONFIRM_DEL_RECORDS = _("Are you sure you want to remove the selected items?");
     var MSG_ITEM_IN_CART = _("In your cart");
     var MSG_ITEM_NOT_IN_CART = _("Add to your cart");
-	$("#cartDetails").ready(function(){ $("#cmspan").html("<a href=\"#\" id=\"cartmenulink\" class=\"\"><i><\/i><span><i><\/i><span><\/span><span id=\"carticon\"></span> "+_("Cart")+"<span id=\"basketcount\"><\/span><\/span><\/a>"); }); [% ELSE %][% IF ( virtualshelves ) %]
-    var MSG_NO_RECORD_SELECTED = _("No item was selected");[% END %][% END %]
-    [% IF ( opacuserlogin ) %][% IF ( TagsEnabled ) %]var MSG_TAGS_DISABLED = _("Sorry, tags are not enabled on this system.");
+//	$("#cartDetails").ready(function(){ $("#cmspan").html("<a href=\"#\" id=\"cartmenulink\" class=\"\"><i><\/i><span><i><\/i><span><\/span><span id=\"carticon\"></span> "+_("Cart")+"<span id=\"basketcount\"><\/span><\/span><\/a>"); });
+[% ELSE %]
+  [% IF ( virtualshelves ) %]
+    var MSG_NO_RECORD_SELECTED = _("No item was selected");
+  [% END %]
+[% END %]
+
+[% IF ( opacuserlogin ) %]
+  [% IF ( TagsEnabled ) %]
+    var MSG_TAGS_DISABLED = _("Sorry, tags are not enabled on this system.");
     var MSG_TAG_ALL_BAD = _("Error! Your tag was entirely markup code.  It was NOT added.  Please try again with plain text.");
     var MSG_ILLEGAL_PARAMETER = _("Error! Illegal parameter");
     var MSG_TAG_SCRUBBED = _("Note: your tag contained markup code that was removed. The tag was added as ");
@@ -71,21 +90,40 @@
     var MSG_TAGS_ADDED = _("Tags added: ");
     var MSG_TAGS_DELETED = _("Tags added: ");
     var MSG_TAGS_ERRORS = _("Errors: ");
-    var MSG_MULTI_ADD_TAG_FAILED = _("Unable to add one or more tags.");[% END %][% END %]
-	[% IF ( OPACAmazonCoverImages ) %]$(window).load(function() {
-		 	verify_images();
-		 });[% END %]
-	[% IF ( SyndeticsCoverImages ) %]$(window).load(function() {
-            verify_images();
-         });[% END %]
-	[% IF ( opacuserjs ) %][% opacuserjs %][% END %]
+    var MSG_MULTI_ADD_TAG_FAILED = _("Unable to add one or more tags.");
+  [% END %]
+[% END %]
+[% IF ( OPACAmazonCoverImages ) %]
+    $(window).load(function() {
+        verify_images();
+    });
+[% END %]
+[% IF ( SyndeticsCoverImages ) %]
+    $(window).load(function() {
+        verify_images();
+    });
+[% END %]
+[% IF ( opacuserjs ) %]
+    [% opacuserjs %]
+[% END %]
 	//]]>
-[% IF ( opacbookbag ) %]</script><script type="text/javascript" language="javascript" src="[% themelang %]/js/basket.js">
-[% ELSIF ( virtualshelves ) %]</script><script type="text/javascript" language="javascript" src="[% themelang %]/js/basket.js">
-[% ELSE %]</script><script type="text/javascript" language="javascript">var readCookie;[% END %]</script>
-[% IF ( opacuserlogin ) %][% IF ( TagsEnabled ) %]<script type="text/javascript" language="javascript" src="[% themelang %]/js/tags.js"></script>[% END %][% ELSE %][% END %]
+</script>
+[% IF ( opacbookbag ) %]
+[% compose.javascript( src => themelang _ "/js/basket.js" ) %]
+[% ELSIF ( virtualshelves ) %]
+[% compose.javascript( src => themelang _ "/js/basket.js" ) %]
+[% ELSE %]
+<script type="text/javascript" language="javascript">var readCookie;</script>
+[% END %]
+
+[% IF ( opacuserlogin ) %]
+  [% IF ( TagsEnabled ) %]
+    [% combine.javascript( src => themelang _ "/js/tags.js" ) %]
+  [% END %]
+[% END %]
+
 [% IF ( GoogleJackets ) %]
-<script type="text/javascript" language="javascript" src="[% themelang %]/js/google-jackets.js"></script>
+[% combine.javascript( src => themelang _ "/js/google-jackets.js" ) %]
 <script type="text/javascript" language="javascript">
 	//<![CDATA[
 	var NO_GOOGLE_JACKET = _("No cover image available");
@@ -93,7 +131,7 @@
 </script>
 [% END %]
 [% IF OpenLibraryCovers %]
-<script type="text/javascript" language="javascript" src="[% themelang %]/js/openlibrary.js"></script>
+[% combine.javascript( src => themelang _ "/js/openlibrary.js" ) %]
 <script type="text/javascript" language="javascript">
 //<![CDATA[
 var NO_OL_JACKET = _("No cover image available");
@@ -102,7 +140,7 @@ var NO_OL_JACKET = _("No cover image available");
 [% END %]
 
 [% IF OPACLocalCoverImages %]
-<script type="text/javascript" language="javascript" src="[% themelang %]/js/localcovers.js"></script>
+[% combine.javascript( src => themelang _ "/js/localcovers.js" ) %]
 <script type="text/javascript" language="javascript">
 //<![CDATA[
 var NO_LOCAL_JACKET = _("No cover image available");
@@ -110,7 +148,8 @@ var NO_LOCAL_JACKET = _("No cover image available");
 </script>
 [% END %]
 
-[% IF ( BakerTaylorEnabled ) %]<script type="text/javascript" language="javascript" src="[% themelang %]/js/bakertaylorimages.js"></script>
+[% IF ( BakerTaylorEnabled ) %]
+[% combine.javascript( src => themelang _ "/js/bakertaylorimages.js" ) %]
 <script type="text/javascript" language="javascript">
 	//<![CDATA[
 	var NO_BAKERTAYLOR_IMAGE = _("No cover image available");
@@ -118,10 +157,12 @@ var NO_LOCAL_JACKET = _("No cover image available");
 		bt_verify_images();
 	});
 	//]]>
-</script>[% END %]
+</script>
+[% END %]
+
 <link rel="unapi-server" type="application/xml" title="unAPI" href="[% OPACBaseURL %]/cgi-bin/koha/unapi" />
 [% IF ( GoogleIndicTransliteration ) %]
-        <script type="text/javascript" src="http://www.google.com/jsapi"></script>
-        <script type="text/javascript" language="javascript" src="[% themelang %]/js/googleindictransliteration.js"></script>
+	<script type="text/javascript" src="http://www.google.com/jsapi"></script>
+        [% combine.javascript( src => themelang _ "/js/googleindictransliteration.js" ) %]
 [% END %]
-
+[% combine.html( prefix => themelang ) %]
diff --git a/koha-tmpl/opac-tmpl/prog/en/js/script.js b/koha-tmpl/opac-tmpl/prog/en/js/script.js
index a3cfab8..67ea771 100644
--- a/koha-tmpl/opac-tmpl/prog/en/js/script.js
+++ b/koha-tmpl/opac-tmpl/prog/en/js/script.js
@@ -1,4 +1,3 @@
-function _(s) { return s } // dummy function for gettext
 function confirmDelete(message) {
 	return (confirm(message) ? true : false);
 }
-- 
1.7.2.5



More information about the Koha-patches mailing list