From 2c44bc1768886d9b9693e484db37b971fc9917dd Mon Sep 17 00:00:00 2001 From: Robin McCorkell Date: Mon, 5 Jan 2015 15:48:04 +0000 Subject: Fix JS asset generation At some point SeparatorFilter should be included upstream (kriswallsmith/assetic), then lib/private/assetic/separatorfilter.php can be removed and the `use` in lib/private/templatelayout.php rewritten. SeparatorFilter inserts a separator between assets, preventing issues when files are incorrectly terminated. For JS this is a semicolon. --- lib/private/assetic/separatorfilter.php | 57 +++++++++++++++++++++++++++++++++ lib/private/templatelayout.php | 8 +++-- 2 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 lib/private/assetic/separatorfilter.php (limited to 'lib') diff --git a/lib/private/assetic/separatorfilter.php b/lib/private/assetic/separatorfilter.php new file mode 100644 index 00000000000..fb1a4e7f00c --- /dev/null +++ b/lib/private/assetic/separatorfilter.php @@ -0,0 +1,57 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see . + * + */ + +namespace OC\Assetic; + +use Assetic\Filter\FilterInterface; +use Assetic\Asset\AssetInterface; + +/** + * Inserts a separator between assets to prevent merge failures + * e.g. missing semicolon at the end of a JS file + */ +class SeparatorFilter implements FilterInterface +{ + /** + * @var string + */ + private $separator; + + /** + * Constructor. + * + * @param string $separator Separator to use between assets + */ + public function __construct($separator = ';') + { + $this->separator = $separator; + } + + public function filterLoad(AssetInterface $asset) + { + } + + public function filterDump(AssetInterface $asset) + { + $asset->setContent($asset->getContent() . $this->separator); + } +} diff --git a/lib/private/templatelayout.php b/lib/private/templatelayout.php index fa025721e53..44c997c321e 100644 --- a/lib/private/templatelayout.php +++ b/lib/private/templatelayout.php @@ -6,6 +6,7 @@ use Assetic\Filter\CssImportFilter; use Assetic\Filter\CssMinFilter; use Assetic\Filter\CssRewriteFilter; use Assetic\Filter\JSMinFilter; +use OC\Assetic\SeparatorFilter; // waiting on upstream /** * Copyright (c) 2012 Bart Visscher @@ -163,10 +164,13 @@ class OC_TemplateLayout extends OC_Template { $file = $item[2]; // no need to minifiy minified files if (substr($file, -strlen('.min.js')) === '.min.js') { - return new FileAsset($root . '/' . $file, array(), $root, $file); + return new FileAsset($root . '/' . $file, array( + new SeparatorFilter(';') + ), $root, $file); } return new FileAsset($root . '/' . $file, array( - new JSMinFilter() + new JSMinFilter(), + new SeparatorFilter(';') ), $root, $file); }, $jsFiles); $jsCollection = new AssetCollection($jsFiles); -- cgit v1.2.3