Merge pull request #16857 from owncloud/printStylesheets

Support for print stylesheets
This commit is contained in:
C. Montero Luque 2016-03-31 22:13:44 +02:00
commit 0393e80c7c
4 changed files with 51 additions and 12 deletions

View File

@ -15,7 +15,10 @@
<link rel="apple-touch-icon-precomposed" href="<?php print_unescaped(image_path('', 'favicon-touch.png')); ?>"> <link rel="apple-touch-icon-precomposed" href="<?php print_unescaped(image_path('', 'favicon-touch.png')); ?>">
<link rel="mask-icon" sizes="any" href="<?php print_unescaped(image_path('', 'favicon-mask.svg')); ?>" color="#1d2d44"> <link rel="mask-icon" sizes="any" href="<?php print_unescaped(image_path('', 'favicon-mask.svg')); ?>" color="#1d2d44">
<?php foreach ($_['cssfiles'] as $cssfile): ?> <?php foreach ($_['cssfiles'] as $cssfile): ?>
<link rel="stylesheet" href="<?php print_unescaped($cssfile); ?>" media="screen"> <link rel="stylesheet" href="<?php print_unescaped($cssfile); ?>">
<?php endforeach; ?>
<?php foreach($_['printcssfiles'] as $cssfile): ?>
<link rel="stylesheet" href="<?php print_unescaped($cssfile); ?>" media="print">
<?php endforeach; ?> <?php endforeach; ?>
<?php foreach ($_['jsfiles'] as $jsfile): ?> <?php foreach ($_['jsfiles'] as $jsfile): ?>
<script src="<?php print_unescaped($jsfile); ?>"></script> <script src="<?php print_unescaped($jsfile); ?>"></script>

View File

@ -16,7 +16,10 @@
<link rel="apple-touch-icon-precomposed" href="<?php print_unescaped(image_path('', 'favicon-touch.png')); ?>"> <link rel="apple-touch-icon-precomposed" href="<?php print_unescaped(image_path('', 'favicon-touch.png')); ?>">
<link rel="mask-icon" sizes="any" href="<?php print_unescaped(image_path('', 'favicon-mask.svg')); ?>" color="#1d2d44"> <link rel="mask-icon" sizes="any" href="<?php print_unescaped(image_path('', 'favicon-mask.svg')); ?>" color="#1d2d44">
<?php foreach($_['cssfiles'] as $cssfile): ?> <?php foreach($_['cssfiles'] as $cssfile): ?>
<link rel="stylesheet" href="<?php print_unescaped($cssfile); ?>" media="screen"> <link rel="stylesheet" href="<?php print_unescaped($cssfile); ?>">
<?php endforeach; ?>
<?php foreach($_['printcssfiles'] as $cssfile): ?>
<link rel="stylesheet" href="<?php print_unescaped($cssfile); ?>" media="print">
<?php endforeach; ?> <?php endforeach; ?>
<?php foreach($_['jsfiles'] as $jsfile): ?> <?php foreach($_['jsfiles'] as $jsfile): ?>
<script src="<?php print_unescaped($jsfile); ?>"></script> <script src="<?php print_unescaped($jsfile); ?>"></script>

View File

@ -23,7 +23,10 @@
<link rel="apple-touch-icon-precomposed" href="<?php print_unescaped(image_path($_['appid'], 'favicon-touch.png')); ?>"> <link rel="apple-touch-icon-precomposed" href="<?php print_unescaped(image_path($_['appid'], 'favicon-touch.png')); ?>">
<link rel="mask-icon" sizes="any" href="<?php print_unescaped(image_path($_['appid'], 'favicon-mask.svg')); ?>" color="#1d2d44"> <link rel="mask-icon" sizes="any" href="<?php print_unescaped(image_path($_['appid'], 'favicon-mask.svg')); ?>" color="#1d2d44">
<?php foreach($_['cssfiles'] as $cssfile): ?> <?php foreach($_['cssfiles'] as $cssfile): ?>
<link rel="stylesheet" href="<?php print_unescaped($cssfile); ?>" media="screen"> <link rel="stylesheet" href="<?php print_unescaped($cssfile); ?>">
<?php endforeach; ?>
<?php foreach($_['printcssfiles'] as $cssfile): ?>
<link rel="stylesheet" href="<?php print_unescaped($cssfile); ?>" media="print">
<?php endforeach; ?> <?php endforeach; ?>
<?php foreach($_['jsfiles'] as $jsfile): ?> <?php foreach($_['jsfiles'] as $jsfile): ?>
<script src="<?php print_unescaped($jsfile); ?>"></script> <script src="<?php print_unescaped($jsfile); ?>"></script>

View File

@ -160,10 +160,14 @@ class TemplateLayout extends \OC_Template {
$web = $info[1]; $web = $info[1];
$file = $info[2]; $file = $info[2];
if (substr($file, -strlen('print.css')) === 'print.css') {
$this->append( 'printcssfiles', $web.'/'.$file . '?v=' . self::$versionHash);
} else {
$this->append( 'cssfiles', $web.'/'.$file . '?v=' . self::$versionHash); $this->append( 'cssfiles', $web.'/'.$file . '?v=' . self::$versionHash);
} }
} }
} }
}
/** /**
* @param array $styles * @param array $styles
@ -227,10 +231,35 @@ class TemplateLayout extends \OC_Template {
} }
$cssFiles = self::findStylesheetFiles(\OC_Util::$styles); $cssFiles = self::findStylesheetFiles(\OC_Util::$styles);
$cssHash = self::hashFileNames($cssFiles);
if (!file_exists("$assetDir/assets/$cssHash.css")) { // differentiate between screen stylesheets and printer stylesheets
$cssFiles = array_map(function ($item) { $screenCssFiles = array_filter($cssFiles, function($cssFile) {
return substr_compare($cssFile[2], 'print.css', -strlen('print.css')) !== 0;
});
$screenCssAsset = $this->generateCssAsset($screenCssFiles);
$printCssFiles = array_filter($cssFiles, function($cssFile) {
return substr_compare($cssFile[2], 'print.css', -strlen('print.css')) === 0;
});
$printCssAsset = $this->generateCssAsset($printCssFiles);
$this->append('jsfiles', \OC::$server->getURLGenerator()->linkTo('assets', "$jsHash.js"));
$this->append('cssfiles', $screenCssAsset);
$this->append('printcssfiles', $printCssAsset);
}
/**
* generates a single css asset file from an array of css files if at least one of them has changed
* otherwise it just returns the path to the old asset file
* @param $files
* @return string
*/
private function generateCssAsset($files) {
$assetDir = \OC::$server->getConfig()->getSystemValue('assetdirectory', \OC::$SERVERROOT);
$hash = self::hashFileNames($files);
if (!file_exists("$assetDir/assets/$hash.css")) {
$files = array_map(function ($item) {
$root = $item[0]; $root = $item[0];
$file = $item[2]; $file = $item[2];
$assetPath = $root . '/' . $file; $assetPath = $root . '/' . $file;
@ -246,16 +275,17 @@ class TemplateLayout extends \OC_Template {
$sourceRoot, $sourceRoot,
$sourcePath $sourcePath
); );
}, $cssFiles); }, $files);
$cssCollection = new AssetCollection($cssFiles);
$cssCollection->setTargetPath("assets/$cssHash.css"); $cssCollection = new AssetCollection($files);
$cssCollection->setTargetPath("assets/$hash.css");
$writer = new AssetWriter($assetDir); $writer = new AssetWriter($assetDir);
$writer->writeAsset($cssCollection); $writer->writeAsset($cssCollection);
} }
$this->append('jsfiles', \OC::$server->getURLGenerator()->linkTo('assets', "$jsHash.js")); return \OC::$server->getURLGenerator()->linkTo('assets', "$hash.css");
$this->append('cssfiles', \OC::$server->getURLGenerator()->linkTo('assets', "$cssHash.css"));
} }
/** /**