New helper methods and new AJAX service

This commit is contained in:
Giuseppe Di Terlizzi 2015-11-21 16:28:21 +01:00
parent 4b31cb0eea
commit 6bc097ce97
4 changed files with 108 additions and 50 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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

View file

@ -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;
}
}