Skip to content

Commit

Permalink
feat: provide web app manifest (dynamically geneated)
Browse files Browse the repository at this point in the history
  • Loading branch information
micgro42 committed Jan 24, 2018
1 parent 606ef46 commit 5e0255e
Show file tree
Hide file tree
Showing 3 changed files with 142 additions and 0 deletions.
4 changes: 4 additions & 0 deletions inc/config_cascade.php
Expand Up @@ -28,6 +28,10 @@
'default' => array(DOKU_CONF . 'license.php'),
'local' => array(DOKU_CONF . 'license.local.php'),
),
'manifest' => array(
'default' => array(DOKU_CONF . 'manifest.json'),
'local' => array(DOKU_CONF . 'manifest.local.json'),
),
'mediameta' => array(
'default' => array(DOKU_CONF . 'mediameta.php'),
'local' => array(DOKU_CONF . 'mediameta.local.php'),
Expand Down
4 changes: 4 additions & 0 deletions inc/template.php
Expand Up @@ -242,6 +242,10 @@ function tpl_metaheaders($alt = true) {
);
}

if (actionOK('manifest')) {
$head['link'][] = array('rel'=> 'manifest', 'href'=> DOKU_BASE.'lib/exe/manifest.php');
}

if($alt) {
if(actionOK('rss')) {
$head['link'][] = array(
Expand Down
134 changes: 134 additions & 0 deletions lib/exe/manifest.php
@@ -0,0 +1,134 @@
<?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;
}

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();

0 comments on commit 5e0255e

Please sign in to comment.