1<?php 2 3if (!defined('DOKU_INC')) { 4 define('DOKU_INC', __DIR__ . '/../../'); 5} 6require_once(DOKU_INC . 'inc/init.php'); 7 8class Manifest { 9 public function run() { 10 $manifest = retrieveConfig('manifest', [$this, 'jsonToArray']); 11 12 global $conf; 13 14 $manifest['scope'] = DOKU_REL; 15 16 if (empty($manifest['name'])) { 17 $manifest['name'] = $conf['title']; 18 } 19 20 if (empty($manifest['short_name'])) { 21 $manifest['short_name'] = $conf['title']; 22 } 23 24 if (empty($manifest['description'])) { 25 $manifest['description'] = $conf['tagline']; 26 } 27 28 if (empty($manifest['start_url'])) { 29 $manifest['start_url'] = DOKU_REL; 30 } 31 32 $styleUtil = new \dokuwiki\StyleUtils(); 33 $styleIni = $styleUtil->cssStyleini($conf['template']); 34 $replacements = $styleIni['replacements']; 35 36 if (empty($manifest['background_color'])) { 37 $manifest['background_color'] = $replacements['__background__']; 38 } 39 40 if (empty($manifest['theme_color'])) { 41 $manifest['theme_color'] = !empty($replacements['__theme_color__']) ? $replacements['__theme_color__'] : $replacements['__background_alt__']; 42 } 43 44 if (empty($manifest['icons'])) { 45 $manifest['icons'] = []; 46 $look = [ 47 ':wiki:logo.png', 48 ':logo.png', 49 'images/logo.png', 50 ':wiki:apple-touch-icon.png', 51 ':apple-touch-icon.png', 52 'images/apple-touch-icon.png', 53 ':wiki:favicon.svg', 54 ':favicon.svg', 55 'images/favicon.svg', 56 ':wiki:favicon.ico', 57 ':favicon.ico', 58 'images/favicon.ico', 59 ':wiki:logo', 60 ]; 61 62 $abs = true; 63 foreach($look as $img) { 64 if($img[0] === ':') { 65 $file = mediaFN($img); 66 $ismedia = true; 67 } else { 68 $file = tpl_incdir().$img; 69 $ismedia = false; 70 } 71 72 if (file_exists($file)) { 73 $imginfo = getimagesize($file); 74 if($ismedia) { 75 $url = ml($img, '', true, '', $abs); 76 } else { 77 $url = tpl_basedir().$img; 78 if($abs) $url = DOKU_URL.substr($url, strlen(DOKU_REL)); 79 } 80 $manifest['icons'][] = [ 81 'src' => $url, 82 'sizes' => $imginfo[0] . 'x' . $imginfo[1], 83 'type' => $imginfo['mime'], 84 ]; 85 }; 86 } 87 } 88 89 trigger_event('MANIFEST_SEND', $manifest); 90 91 header('Content-Type: application/manifest+json'); 92 echo json_encode($manifest); 93 } 94 95 public function jsonToArray($file) 96 { 97 $json = file_get_contents($file); 98 99 $conf = json_decode($json, true); 100 101 $jsonError = json_last_error(); 102 if (!is_array($conf) && $jsonError !== JSON_ERROR_NONE) { 103 104 switch ($jsonError) { 105 case JSON_ERROR_DEPTH: 106 $jsonErrorText = 'The maximum stack depth has been exceeded'; 107 break; 108 case JSON_ERROR_STATE_MISMATCH: 109 $jsonErrorText = 'Invalid or malformed JSON'; 110 break; 111 case JSON_ERROR_CTRL_CHAR: 112 $jsonErrorText = 'Control character error, possibly incorrectly encoded'; 113 break; 114 case JSON_ERROR_SYNTAX: 115 $jsonErrorText = 'Syntax error'; 116 break; 117 case JSON_ERROR_UTF8: 118 $jsonErrorText = 'Malformed UTF-8 characters, possibly incorrectly encoded'; 119 break; 120 case JSON_ERROR_RECURSION: 121 $jsonErrorText = 'One or more recursive references in the value to be encoded'; 122 break; 123 case JSON_ERROR_INF_OR_NAN: 124 $jsonErrorText = 'One or more NAN or INF values in the value to be encoded'; 125 break; 126 case JSON_ERROR_UNSUPPORTED_TYPE: 127 $jsonErrorText = 'A value of a type that cannot be encoded was given'; 128 break; 129 case JSON_ERROR_INVALID_PROPERTY_NAME: 130 $jsonErrorText = 'A property name that cannot be encoded was given'; 131 break; 132 case JSON_ERROR_UTF16: 133 $jsonErrorText = 'Malformed UTF-16 characters, possibly incorrectly encoded'; 134 break; 135 default: 136 $jsonErrorText = 'Unknown Error Code'; 137 } 138 139 trigger_error('JSON decoding error "' . $jsonErrorText . '" for file ' . $file, E_USER_WARNING); 140 return []; 141 } 142 143 return $conf; 144 } 145} 146 147$manifest = new Manifest(); 148$manifest->run(); 149