From 77f2311ffe608dd2b1c3b6f90511ae883cc54abc Mon Sep 17 00:00:00 2001 From: Giuseppe Di Terlizzi Date: Fri, 30 Oct 2015 16:25:39 +0100 Subject: [PATCH] Added ~~Recipe~~ macro (thanks to @coastgnu on #1 issue) and several improvements --- action.php | 334 +++++++++++++++++++++++----------------------- conf/metadata.php | 3 +- plugin.info.txt | 4 +- syntax.php | 64 +++++---- 4 files changed, 206 insertions(+), 199 deletions(-) diff --git a/action.php b/action.php index f071053..acbd57b 100644 --- a/action.php +++ b/action.php @@ -1,9 +1,9 @@ + * @author Giuseppe Di Terlizzi * @copyright (C) 2015, Giuseppe Di Terlizzi */ @@ -16,202 +16,202 @@ if(!defined('DOKU_INC')) die(); * Add semantic data to DokuWiki */ class action_plugin_semantic extends DokuWiki_Action_Plugin { - - /** - * Register events - * - * @param Doku_Event_Handler $controller - */ - public function register(Doku_Event_Handler $controller) { - if ($this->getConf('useJSONLD')) { - $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'json_ld'); - } - - if ($this->getConf('useMetaDescription')) { - $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'meta_description'); - } - - if ($this->getConf('useMetaAuthor')) { - $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'meta_author'); - } + /** + * Register events + * + * @param Doku_Event_Handler $controller + */ + public function register(Doku_Event_Handler $controller) { + if ($this->getConf('useJSONLD')) { + $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'json_ld'); } - - /** - * JSON-LD Event handler - * - * @param Doku_Event &$event - */ - public function json_ld(Doku_Event &$event, $param) { - global $INFO; - global $ID; + if ($this->getConf('useMetaDescription')) { + $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'meta_description'); + } - if ((bool) preg_match_all('/'.$this->getConf('excludedPages').'/', $ID)) { - return false; + if ($this->getConf('useMetaAuthor')) { + $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'meta_author'); + } + + } + + /** + * JSON-LD Event handler + * + * @param Doku_Event &$event + */ + public function json_ld(Doku_Event &$event, $param) { + + global $INFO; + global $ID; + + if ((bool) preg_match('/'.$this->getConf('excludedPages').'/', $ID)) { + return false; + } + + if (! $INFO['perm']) { + return false; + } + + global $license; + global $auth; + global $conf; + + $meta = $INFO['meta']; + + if (isset($meta['semantic']['enabled']) && ! $meta['semantic']['enabled']) { + return false; + } + + if (isset($meta['date']) && $meta['date'] !== '') { + + $type = ((isset($meta['semantic']['schema.org']['type'])) + ? $meta['semantic']['schema.org']['type'] + : $this->getConf('defaultSchemaOrgType')); + $user_data = $auth->getUserData($meta['user']); + $license_url = @$license[$conf['license']]['url']; + $page_url = wl($ID, '', true); + $image_url = (($meta['relation']['firstimage']) ? ml($meta['relation']['firstimage'], '', true, '&', true) : null); + $description = trim(ltrim($meta['description']['abstract'], @$meta['title'])); + $created = date(DATE_W3C, $meta['date']['created']); + $modified = date(DATE_W3C, $meta['date']['modified']); + + $json_ld = array( + '@context' => 'http://schema.org', + '@type' => $type, + 'headline' => @$meta['title'], + 'name' => @$meta['title'], + 'image' => array($image_url), + 'datePublished' => $created, + 'dateCreated' => $created, + 'dateModified' => $modified, + 'description' => $description, + 'license' => $license_url, + 'url' => $page_url, + ); + + if (isset($meta['creator']) && $meta['creator'] !== '') { + + $json_ld['creator'] = array( + '@context' => 'http://schema.org', + '@type' => 'Person', + 'name' => $meta['creator'], + 'email' => $user_data['mail'] + ); + + if (isset($meta['contributor'])) { + foreach ($meta['contributor'] as $uid => $fullname) { + $contributor_data = $auth->getUserData($uid); + $json_ld['contributor'][] = array( + '@context' => 'http://schema.org', + '@type' => 'Person', + 'name' => $fullname, + 'email' => $contributor_data['mail'] + ); + } } - if ($INFO['perm'] > 0) { + } - global $license; - global $auth; - global $conf; + if (isset($meta['relation']['references'])) { - $meta = $INFO['meta']; + $json_ld_webpage = array( + '@context' => 'http://schema.org', + '@type' => 'WebPage' + ); - if (isset($meta['semantic']['enabled']) && ! $meta['semantic']['enabled']) { - return false; - } - - if (isset($meta['date']) && $meta['date'] !== '') { - - $type = ((isset($meta['semantic']['schema.org']['type'])) - ? $meta['semantic']['schema.org']['type'] - : $this->getConf('defaultSchemaOrgType')); - $user_data = $auth->getUserData($meta['user']); - $license_url = $license[$conf['license']]['url']; - $page_url = wl($ID, '', true); - $image_url = (($meta['relation']['firstimage']) ? ml($meta['relation']['firstimage'], '', true, '&', true) : null); - $description = trim(ltrim($meta['description']['abstract'], $meta['title'])); - $created = date(DATE_W3C, $meta['date']['created']); - $modified = date(DATE_W3C, $meta['date']['modified']); - - $json_ld = array( - '@context' => 'http://schema.org', - '@type' => $type, - 'headline' => $meta['title'], - 'name' => $meta['title'], - 'image' => array($image_url), - 'datePublished' => $created, - 'dateCreated' => $created, - 'dateModified' => $modified, - 'description' => $description, - 'license' => $license_url, - 'url' => $page_url, - ); - - if (isset($meta['creator']) && $meta['creator'] !== '') { - $json_ld['creator'] = array( - '@context' => 'http://schema.org', - '@type' => 'Person', - 'name' => $meta['creator'], - 'email' => $user_data['mail'] - ); - - if (isset($meta['contributor'])) { - foreach ($meta['contributor'] as $uid => $fullname) { - $contributor_data = $auth->getUserData($uid); - $json_ld['contributor'][] = array( - '@context' => 'http://schema.org', - '@type' => 'Person', - 'name' => $fullname, - 'email' => $contributor_data['mail'] - ); - } - } - - } - - if (isset($meta['relation']['references'])) { - - $json_ld_webpage = array( - '@context' => 'http://schema.org', - '@type' => 'WebPage' - ); - - foreach ($meta['relation']['references'] as $page => $status) { - if ($status) { - $json_ld_webpage['relatedLink'][] = wl($page, '', true); - } - } - - if (isset($json_ld_webpage['relatedLink'])) { - - $event->data["script"][] = array ( - "type" => "application/ld+json", - "_data" => json_encode($json_ld_webpage), - ); - - } - - } - - $event->data["script"][] = array ( - "type" => "application/ld+json", - "_data" => json_encode($json_ld), - ); - - } + foreach ($meta['relation']['references'] as $page => $status) { + if ($status) { + $json_ld_webpage['relatedLink'][] = wl($page, '', true); + } } + if (isset($json_ld_webpage['relatedLink'])) { + + $event->data["script"][] = array ( + "type" => "application/ld+json", + "_data" => json_encode($json_ld_webpage), + ); + + } + + } + + $event->data["script"][] = array ( + "type" => "application/ld+json", + "_data" => json_encode($json_ld), + ); + } + } - public function meta_description(Doku_Event &$event, $params) { - global $INFO; - global $ID; + public function meta_description(Doku_Event &$event, $params) { - if ((bool) preg_match_all('/'.$this->getConf('excludedPages').'/', $ID)) { - return false; - } + global $INFO; + global $ID; - if ($INFO['perm'] > 0) { + if ((bool) preg_match_all('/'.$this->getConf('excludedPages').'/', $ID)) { + return false; + } - $meta = $INFO['meta']; + if (! $INFO['perm']) { + return false; + } - if (isset($meta['semantic']['enabled']) && ! $meta['semantic']['enabled']) { - return false; - } + $meta = $INFO['meta']; - if (isset($meta['date']) && $meta['date'] !== '') { - - $description = str_replace("\n", ' ', trim(ltrim($meta['description']['abstract'], $meta['title']))); + if (isset($meta['semantic']['enabled']) && ! $meta['semantic']['enabled']) { + return false; + } - $event->data['meta'][] = array( - 'name' => 'description', - 'content' => $description, - ); + if (isset($meta['date']) && $meta['date'] !== '') { - } + $description = str_replace("\n", ' ', trim(ltrim($meta['description']['abstract'], @$meta['title']))); - } + $event->data['meta'][] = array( + 'name' => 'description', + 'content' => $description, + ); } + } - public function meta_author(Doku_Event &$event, $params) { - global $INFO; - global $ID; + public function meta_author(Doku_Event &$event, $params) { - if ((bool) preg_match_all('/'.$this->getConf('excludedPages').'/', $ID)) { - return false; - } - - if ($INFO['perm'] > 0) { - - $meta = $INFO['meta']; - - if (isset($meta['semantic']['enabled']) && ! $meta['semantic']['enabled']) { - return false; - } - - if ((isset($meta['date']) && $meta['date'] !== '')) { - - $meta = $INFO['meta']; - - $event->data['meta'][] = array( - 'name' => 'author', - 'content' => $meta['creator'], - ); - - } - - } + global $INFO; + global $ID; + if ((bool) preg_match_all('/'.$this->getConf('excludedPages').'/', $ID)) { + return false; } + if (! $INFO['perm']) { + return false; + } + + $meta = $INFO['meta']; + + if (isset($meta['semantic']['enabled']) && ! $meta['semantic']['enabled']) { + return false; + } + + if ((isset($meta['date']) && $meta['date'] !== '')) { + + $meta = $INFO['meta']; + + $event->data['meta'][] = array( + 'name' => 'author', + 'content' => $meta['creator'], + ); + } + + } + } - diff --git a/conf/metadata.php b/conf/metadata.php index b97ff92..b0a7ff3 100644 --- a/conf/metadata.php +++ b/conf/metadata.php @@ -8,6 +8,5 @@ $meta['useMetaDescription'] = array('onoff'); $meta['useMetaAuthor'] = array('onoff'); $meta['useJSONLD'] = array('onoff'); -$meta['defaultSchemaOrgType'] = array('multichoice','_choices' => array('Article', 'NewsArticle', 'TechArticle', 'BlogPosting')); +$meta['defaultSchemaOrgType'] = array('multichoice','_choices' => array('Article', 'NewsArticle', 'TechArticle', 'BlogPosting', 'Recipe')); $meta['excludedPages'] = array('regex'); - diff --git a/plugin.info.txt b/plugin.info.txt index a51e2d0..b0b2461 100644 --- a/plugin.info.txt +++ b/plugin.info.txt @@ -1,7 +1,7 @@ base semantic author Giuseppe Di Terlizzi email giuseppe.diterlizzi@gmail.com -date 2015-03-30 +date 2015-10-30 name Semantic Plugin -desc Add Semantic Data in Dokuwiki +desc Add Semantic Data in DokuWiki url http://www.dokuwiki.org/plugin:semantic diff --git a/syntax.php b/syntax.php index a61fd49..13c8200 100644 --- a/syntax.php +++ b/syntax.php @@ -1,7 +1,7 @@ */ @@ -12,37 +12,45 @@ if (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); class syntax_plugin_semantic extends DokuWiki_Syntax_Plugin { - function getType() { return 'substition'; } - function getSort() { return 99; } + private $macros = array( + '~~NewsArticle~~', '~~Article~~', '~~TechArticle~~', + '~~BlogPosting~~', '~~Recipe~~', '~~NOSEMANTIC~~' + ); - function connectTo($mode) { - $this->Lexer->addSpecialPattern('~~NewsArticle~~', $mode, 'plugin_semantic'); - $this->Lexer->addSpecialPattern('~~Article~~', $mode, 'plugin_semantic'); - $this->Lexer->addSpecialPattern('~~TechArticle~~', $mode, 'plugin_semantic'); - $this->Lexer->addSpecialPattern('~~BlogPosting~~', $mode, 'plugin_semantic'); - $this->Lexer->addSpecialPattern('~~NOSEMANTIC~~', $mode, 'plugin_semantic'); + function getType() { return 'substition'; } + function getSort() { return 99; } + + function connectTo($mode) { + + foreach ($this->macros as $macro) { + $this->Lexer->addSpecialPattern($macro, $mode, 'plugin_semantic'); } - function handle($match, $state, $pos, Doku_Handler $handler) { - return array($match, $state, $pos); + } + + function handle($match, $state, $pos, Doku_Handler $handler) { + return array($match, $state, $pos); + } + + function render($mode, Doku_Renderer $renderer, $data) { + + if ($mode == 'xthml') { + return true; // don't output anything + } elseif ($mode == 'metadata') { + + list($match, $state, $pos) = $data; + + + + if ($match == '~~NOSEMANTIC~~') { + $renderer->meta['semantic']['enabled'] = false; + } else { + $renderer->meta['semantic']['schema.org']['type'] = trim(str_replace('Schema.org/', '', $match), '~~'); + $renderer->meta['semantic']['enabled'] = true; + } + } - function render($mode, Doku_Renderer $renderer, $data) { - - if ($mode == 'xthml') { - return true; // don't output anything - } elseif ($mode == 'metadata') { - - list($match, $state, $pos) = $data; - - if ($match == '~~NOSEMANTIC~~') { - $renderer->meta['semantic']['enabled'] = false; - } else { - $renderer->meta['semantic']['schema.org']['type'] = trim(str_replace('Schema.org/', '', $match), '~~'); - $renderer->meta['semantic']['enabled'] = true; - } - - } - } + } }