147 lines
5.0 KiB
PHP
147 lines
5.0 KiB
PHP
<?php
|
|
|
|
if (!defined('DOKU_INC')) {
|
|
define('DOKU_INC', __DIR__ . '/../../');
|
|
}
|
|
require_once(DOKU_INC . 'inc/init.php');
|
|
|
|
class Manifest {
|
|
public function run() {
|
|
$manifest = retrieveConfig('manifest', [$this, 'jsonToArray']);
|
|
|
|
global $conf;
|
|
|
|
if (empty($manifest['name'])) {
|
|
$manifest['name'] = $conf['title'];
|
|
}
|
|
|
|
if (empty($manifest['short_name'])) {
|
|
$manifest['short_name'] = $conf['title'];
|
|
}
|
|
|
|
if (empty($manifest['description'])) {
|
|
$manifest['description'] = $conf['tagline'];
|
|
}
|
|
|
|
if (empty($manifest['start_url'])) {
|
|
$manifest['start_url'] = DOKU_REL;
|
|
}
|
|
|
|
$styleUtil = new \dokuwiki\StyleUtils();
|
|
$styleIni = $styleUtil->cssStyleini($conf['template']);
|
|
$replacements = $styleIni['replacements'];
|
|
|
|
if (empty($manifest['background_color'])) {
|
|
$manifest['background_color'] = $replacements['__background__'];
|
|
}
|
|
|
|
if (empty($manifest['theme_color'])) {
|
|
$manifest['theme_color'] = !empty($replacements['__theme_color__']) ? $replacements['__theme_color__'] : $replacements['__background_alt__'];
|
|
}
|
|
|
|
if (empty($manifest['icons'])) {
|
|
$manifest['icons'] = [];
|
|
$look = [
|
|
':wiki:logo.png',
|
|
':logo.png',
|
|
'images/logo.png',
|
|
':wiki:apple-touch-icon.png',
|
|
':apple-touch-icon.png',
|
|
'images/apple-touch-icon.png',
|
|
':wiki:favicon.svg',
|
|
':favicon.svg',
|
|
'images/favicon.svg',
|
|
':wiki:favicon.ico',
|
|
':favicon.ico',
|
|
'images/favicon.ico',
|
|
':wiki:logo',
|
|
];
|
|
|
|
$abs = true;
|
|
foreach($look as $img) {
|
|
if($img[0] === ':') {
|
|
$file = mediaFN($img);
|
|
$ismedia = true;
|
|
} else {
|
|
$file = tpl_incdir().$img;
|
|
$ismedia = false;
|
|
}
|
|
|
|
if (file_exists($file)) {
|
|
$imginfo = getimagesize($file);
|
|
if($ismedia) {
|
|
$url = ml($img, '', true, '', $abs);
|
|
} else {
|
|
$url = tpl_basedir().$img;
|
|
if($abs) $url = DOKU_URL.substr($url, strlen(DOKU_REL));
|
|
}
|
|
$manifest['icons'][] = [
|
|
'src' => $url,
|
|
'sizes' => $imginfo[0] . 'x' . $imginfo[1],
|
|
'type' => $imginfo['mime'],
|
|
];
|
|
};
|
|
}
|
|
}
|
|
|
|
trigger_event('MANIFEST_SEND', $manifest);
|
|
|
|
header('Content-Type: application/manifest+json');
|
|
echo json_encode($manifest);
|
|
}
|
|
|
|
public function jsonToArray($file)
|
|
{
|
|
$json = file_get_contents($file);
|
|
|
|
$conf = json_decode($json, true);
|
|
|
|
$jsonError = json_last_error();
|
|
if (!is_array($conf) && $jsonError !== JSON_ERROR_NONE) {
|
|
|
|
switch ($jsonError) {
|
|
case JSON_ERROR_DEPTH:
|
|
$jsonErrorText = 'The maximum stack depth has been exceeded';
|
|
break;
|
|
case JSON_ERROR_STATE_MISMATCH:
|
|
$jsonErrorText = 'Invalid or malformed JSON';
|
|
break;
|
|
case JSON_ERROR_CTRL_CHAR:
|
|
$jsonErrorText = 'Control character error, possibly incorrectly encoded';
|
|
break;
|
|
case JSON_ERROR_SYNTAX:
|
|
$jsonErrorText = 'Syntax error';
|
|
break;
|
|
case JSON_ERROR_UTF8:
|
|
$jsonErrorText = 'Malformed UTF-8 characters, possibly incorrectly encoded';
|
|
break;
|
|
case JSON_ERROR_RECURSION:
|
|
$jsonErrorText = 'One or more recursive references in the value to be encoded';
|
|
break;
|
|
case JSON_ERROR_INF_OR_NAN:
|
|
$jsonErrorText = 'One or more NAN or INF values in the value to be encoded';
|
|
break;
|
|
case JSON_ERROR_UNSUPPORTED_TYPE:
|
|
$jsonErrorText = 'A value of a type that cannot be encoded was given';
|
|
break;
|
|
case JSON_ERROR_INVALID_PROPERTY_NAME:
|
|
$jsonErrorText = 'A property name that cannot be encoded was given';
|
|
break;
|
|
case JSON_ERROR_UTF16:
|
|
$jsonErrorText = 'Malformed UTF-16 characters, possibly incorrectly encoded';
|
|
break;
|
|
default:
|
|
$jsonErrorText = 'Unknown Error Code';
|
|
}
|
|
|
|
trigger_error('JSON decoding error "' . $jsonErrorText . '" for file ' . $file, E_USER_WARNING);
|
|
return [];
|
|
}
|
|
|
|
return $conf;
|
|
}
|
|
}
|
|
|
|
$manifest = new Manifest();
|
|
$manifest->run();
|