From 6bc097ce97b8e229bd532fdbb150351c594c3380 Mon Sep 17 00:00:00 2001 From: Giuseppe Di Terlizzi Date: Sat, 21 Nov 2015 16:28:21 +0100 Subject: [PATCH] New helper methods and new AJAX service --- action.php | 84 +++++++++++++++++++++++++++++++++++++------------ helper.php | 58 +++++++++++++++++++++------------- plugin.info.txt | 2 +- syntax.php | 14 ++++----- 4 files changed, 108 insertions(+), 50 deletions(-) diff --git a/action.php b/action.php index 99cfc99..22db33c 100644 --- a/action.php +++ b/action.php @@ -17,6 +17,12 @@ if(!defined('DOKU_INC')) die(); */ class action_plugin_semantic extends DokuWiki_Action_Plugin { + private $helper = null; + + public function __construct() { + $this->helper =& $this->loadHelper('semantic'); + } + /** * Register events * @@ -40,9 +46,47 @@ class action_plugin_semantic extends DokuWiki_Action_Plugin { $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'meta_dublin_core'); } + $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'ajax'); + } + /** + * Export in JSON-LD format + * + * @param Doku_Event &$event + * @return string + */ + public function ajax(Doku_Event &$event, $param) { + + if ($event->data !== 'plugin_semantic') { + return false; + } + + //no other ajax call handlers needed + $event->stopPropagation(); + $event->preventDefault(); + + global $INPUT; + + $export = $INPUT->str('export'); + $id = $INPUT->str('id'); + + if (! $id) return false; + + $this->helper->getMetadata($id); + $json_ld = $this->helper->getJsonLD(); + + //if ($INPUT->str('export') == 'json-ld' && $page = $INPUT->str('page') && $json_ld = $this->helper->getJsonLD()) { + header('Content-Type: application/ld+json'); + print json_encode($json_ld); + return true; + //} + + return false; + + } + /** * JSON-LD Event handler * @@ -50,32 +94,28 @@ class action_plugin_semantic extends DokuWiki_Action_Plugin { */ public function json_ld(Doku_Event &$event, $param) { - $helper = $this->loadHelper('semantic'); + global $ID; - if ($json_ld = $helper->getStructuredData()) { + $this->helper->getMetadata($ID); + $json_ld = $this->helper->getJsonLD(); - $event->data["script"][] = array ( - "type" => "application/ld+json", - "_data" => json_encode($json_ld), - ); + if (! count($json_ld)) return false; - } - - if ($json_ld_relations = $helper->getBacklinks()) { - $event->data["script"][] = array ( - "type" => "application/ld+json", - "_data" => json_encode($json_ld_relations), - ); - } + $event->data["script"][] = array ( + "type" => "application/ld+json", + "_data" => json_encode($json_ld), + ); } public function meta_description(Doku_Event &$event, $params) { - $helper = $this->loadHelper('semantic'); + global $ID; - if ($description = $helper->getDescription()) { + $this->helper->getMetadata($ID); + + if ($description = $this->helper->getDescription()) { $description = str_replace("\n", ' ', $description); @@ -91,9 +131,11 @@ class action_plugin_semantic extends DokuWiki_Action_Plugin { public function meta_author(Doku_Event &$event, $params) { - $helper = $this->loadHelper('semantic'); + global $ID; - if ($author = $helper->getAuthor()) { + $this->helper->getMetadata($ID); + + if ($author = $this->helper->getAuthor()) { $event->data['meta'][] = array( 'name' => 'author', @@ -107,9 +149,11 @@ class action_plugin_semantic extends DokuWiki_Action_Plugin { public function meta_dublin_core(Doku_Event &$event, $params) { - $helper = $this->loadHelper('semantic'); + global $ID; - foreach ($helper->getDublinCore() as $name => $content) { + $this->helper->getMetadata($ID); + + foreach ($this->helper->getDublinCore() as $name => $content) { if (! $content) continue; diff --git a/helper.php b/helper.php index 3d85223..eb91975 100644 --- a/helper.php +++ b/helper.php @@ -12,12 +12,9 @@ if(!defined('DOKU_INC')) die(); class helper_plugin_semantic extends DokuWiki_Plugin { private $meta = array(); + private $page = null; - public function __construct() { - $this->meta = $this->getMetadata(); - } - - private function getMetadata() { + public function getMetadata($page) { global $INFO; global $ID; @@ -25,13 +22,17 @@ class helper_plugin_semantic extends DokuWiki_Plugin { global $auth; global $conf; - if ((bool) preg_match('/'. trim($this->getConf('excludedPages')) .'/', $ID)) return false; + $this->page = cleanID($page); - if (! $INFO['perm']) return false; + $auth_check = auth_quickaclcheck($this->page); - $this->meta = $INFO['meta']; + if ((bool) preg_match('/'. trim($this->getConf('excludedPages')) .'/', $this->page)) return false; - if (isset($this->meta['semantic']['enabled']) && ! $this->meta['semantic']['enabled']) { + if (! $auth_check) return false; + + $this->meta = p_get_metadata($page); + + if (isset($this->meta['plugin']['semantic']['enabled']) && ! $this->meta['plugin']['semantic']['enabled']) { return false; } @@ -42,8 +43,9 @@ class helper_plugin_semantic extends DokuWiki_Plugin { } public function getSchemaOrgType() { - return ((isset($this->meta['semantic']['schema.org']['type'])) - ? $this->meta['semantic']['schema.org']['type'] + + return ((isset($this->meta['plugin']['semantic']['schema.org']['type'])) + ? $this->meta['plugin']['semantic']['schema.org']['type'] : $this->getConf('defaultSchemaOrgType')); } @@ -88,8 +90,6 @@ class helper_plugin_semantic extends DokuWiki_Plugin { */ public function getStructuredData() { - global $INFO; - global $ID; global $auth; global $conf; @@ -99,17 +99,18 @@ class helper_plugin_semantic extends DokuWiki_Plugin { $type = $this->getSchemaOrgType(); $user_data = $auth->getUserData($this->getAuthorID()); $license_url = $license['url']; - $page_url = wl($ID, '', true); + $page_url = wl($this->page, '', true); $image_url = $this->getFirstImageURL(); $description = $this->getDescription(); $created = date(DATE_W3C, $this->getCreatedDate()); $modified = date(DATE_W3C, $this->getModifiedDate()); + $title = (isset($this->meta['title']) ? $this->meta['title'] : $this->page); $json_ld = array( '@context' => 'http://schema.org', '@type' => $type, - 'headline' => @$this->meta['title'], - 'name' => @$this->meta['title'], + 'headline' => $title, + 'name' => $title, 'image' => array($image_url), 'datePublished' => $created, 'dateCreated' => $created, @@ -146,11 +147,27 @@ class helper_plugin_semantic extends DokuWiki_Plugin { } + + public function getJsonLD() { + + $json_ld = array(); + + if ($structured_data = $this->getStructuredData()) { + $json_ld[] = $structured_data; + } + + if ($backlinks = $this->getBacklinks()) { + $json_ld[] = $backlinks; + } + + return $json_ld; + + } + + public function getBacklinks() { - global $ID; - - if (! $backlinks = ft_backlinks($ID)) return false; + if (! $backlinks = ft_backlinks($this->page)) return false; $json_ld_webpage = array( '@context' => 'http://schema.org', @@ -169,7 +186,6 @@ class helper_plugin_semantic extends DokuWiki_Plugin { public function getDublinCore() { global $conf; - global $ID; if (! $this->meta) return array(); @@ -192,7 +208,7 @@ class helper_plugin_semantic extends DokuWiki_Plugin { 'DC.Created' => date(DATE_W3C, $this->getCreatedDate()), 'DC.Modified' => date(DATE_W3C, $this->getModifiedDate()), 'DC.Date' => date(DATE_W3C, $this->getCreatedDate()), - 'DC.Identifier' => "urn:$ID", + 'DC.Identifier' => "urn:" . $this->page, ); return $dublin_core; diff --git a/plugin.info.txt b/plugin.info.txt index 3745345..f6e8b84 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-11-12 +date 2015-11-21 name Semantic Plugin desc Add Semantic Data in DokuWiki url http://www.dokuwiki.org/plugin:semantic diff --git a/syntax.php b/syntax.php index 13c8200..21269af 100644 --- a/syntax.php +++ b/syntax.php @@ -34,23 +34,21 @@ class syntax_plugin_semantic extends DokuWiki_Syntax_Plugin { function render($mode, Doku_Renderer $renderer, $data) { - if ($mode == 'xthml') { - return true; // don't output anything - } elseif ($mode == 'metadata') { + if ($mode == 'metadata') { list($match, $state, $pos) = $data; - - if ($match == '~~NOSEMANTIC~~') { - $renderer->meta['semantic']['enabled'] = false; + $renderer->meta['plugin']['semantic']['enabled'] = false; } else { - $renderer->meta['semantic']['schema.org']['type'] = trim(str_replace('Schema.org/', '', $match), '~~'); - $renderer->meta['semantic']['enabled'] = true; + $renderer->meta['plugin']['semantic']['schema.org']['type'] = trim(str_replace('Schema.org/', '', $match), '~~'); + $renderer->meta['plugin']['semantic']['enabled'] = true; } } + return false; + } }