Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F1821750
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Size
38 KB
Subscribers
None
View Options
diff --git a/action.php b/action.php
--- a/action.php
+++ b/action.php
@@ -1,76 +1,94 @@
<?php
/**
* DokuWiki linksenhanced PlugIn - Ajax component
* @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
* @author Andreas Böhler <dev@aboehler.at>
*/
if(!defined('DOKU_INC')) die();
class action_plugin_linksenhanced extends DokuWiki_Action_Plugin {
function register(Doku_Event_Handler $controller) {
$controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'handle_ajax_call_unknown');
$controller->register_hook('DOKUWIKI_STARTED', 'AFTER', $this, 'add_jsinfo_information');
+ $controller->register_hook('PARSER_CACHE_USE', 'BEFORE', $this, 'handle_parser_cache_use');
}
/**
* Add the language variable to the JSINFO variable
*/
function add_jsinfo_information(Doku_Event $event, $param) {
global $JSINFO;
$JSINFO['plugin']['linksenhanced']['sectok'] = getSecurityToken();
}
function handle_ajax_call_unknown(&$event, $param) {
if($event->data != 'plugin_linksenhanced') return;
$event->preventDefault();
$event->stopPropagation();
global $INPUT;
$action = trim($INPUT->post->str('action'));
$url = trim($INPUT->post->str('url'));
if(!checkSecurityToken())
{
echo "CSRF Attack.";
return;
}
$data = array();
$data['result'] = false;
if($action === 'check')
{
$client = new DokuHTTPClient();
$client->sendRequest($url);
$httpcode = $client->status;
$data['error'] = $client->error;
$data['httpcode'] = $httpcode;
if($httpcode>=200 && $httpcode<300)
$data['result'] = true;
}
else
{
echo "Unknown operation.";
return;
}
// If we are still here, JSON output is requested
//json library of DokuWiki
require_once DOKU_INC . 'inc/JSON.php';
$json = new JSON();
//set content type
header('Content-Type: application/json');
echo $json->encode($data);
}
+
+ function handle_parser_cache_use(&$event, $param) {
+ global $ID;
+ $cache = &$event->data;
+ if(!isset($cache->page)) return;
+
+ $leMeta = p_get_metadata($ID, 'plugin_linksenhanced');
+ if(!$leMeta)
+ return;
+
+ if(isset($leMeta['nocache']) && $leMeta['nocache'] === true)
+ {
+ $event->preventDefault();
+ $event->stopPropagation();
+ $event->result = false;
+ }
+ }
}
diff --git a/plugin.info.txt b/plugin.info.txt
--- a/plugin.info.txt
+++ b/plugin.info.txt
@@ -1,7 +1,7 @@
base linksenhanced
author Andreas Boehler
email dev@aboehler.at
-date 2019-01-25
+date 2019-05-28
name linksenhanced plugin
desc Enhanced Link Syntax
url http://www.aboehler.at
diff --git a/syntax.php b/syntax.php
deleted file mode 100644
--- a/syntax.php
+++ /dev/null
@@ -1,434 +0,0 @@
-<?php
-/**
- * linksenhanced Plugin - Render Link Title using Wiki Markup
- * Heavily based on the standard linking code.
- *
- * Usage:
- *
- * [[check^http://www.dokuwiki.org|www.dokuwiki.org]]
- * [[render noparagraph^http://www.dokuwiki.org|<faicon fa fe-euro> FontAwesome Code]]
- * [[render^http://www.dokuwiki.org|//Formatted Output, probably within a paragraph//]]
- *
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * @author Andreas Böhler <dev@aboehler.at>
- */
-
-if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/');
-if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
-require_once(DOKU_PLUGIN.'syntax.php');
-
-/**
- * All DokuWiki plugins to extend the parser/rendering mechanism
- * need to inherit from this class
- */
-class syntax_plugin_linksenhanced extends DokuWiki_Syntax_Plugin {
-
- function getType() {
- return 'substition';
- }
-
- function getPType() {
- return 'normal';
- }
-
- function getAllowedTypes() {
- return array('container','substition','protected','disabled','paragraphs','formatting');
- }
-
- function getSort() {
- return 202;
- }
-
- function connectTo($mode) {
- $this->Lexer->addSpecialPattern('\[\[(?:(?:[^[\]]*?\[.*?\])|.*?)\]\]',$mode,'plugin_linksenhanced');
- }
-
- /**
- * Handle the match. Use either the standard linking mechanism or, when enabled,
- * pass the title through the parser
- */
- function handle($match, $state, $pos, Doku_Handler $handler) {
- global $ID;
-
- $match = substr($match, 2, -2);
- $link = explode('|',$match,2);
- $nopara = false;
- $optionsSet = explode('^', $link[0], 2);
- $options = array('render' => false,
- 'noparagraph' => false,
- 'check' => false,
- 'class' => false,
- 'target' => false);
- if(isset($optionsSet[1]))
- {
- $link[0] = $optionsSet[1];
- $opts = explode(' ', $optionsSet[0]);
- foreach($opts as $opt)
- {
- if(strpos($opt, 'class') === 0)
- $options['class'] = explode('=', $opt)[1];
- elseif(strpos($opt, 'target') === 0)
- $options['target'] = explode('=', $opt)[1];
- else
- $options[$opt] = true;
- }
- }
-
- if($this->getConf('check_all_external') == 1)
- {
- if($this->getConf('check_only_namespace') != '')
- {
- if(getNS($ID) == $this->getConf('check_only_namespace'))
- $options['check'] = true;
- }
- else
- {
- $options['check'] = true;
- }
- }
-
- if($options['render'] && isset($link[1]))
- {
- $link[1] = $this->render_text($link[1]);
- if($options['noparagraph'])
- {
- $link[1] = str_replace('</p>', '', str_replace('<p>', '', $link[1]));
- }
- if($link[1] === '')
- $link[1] = null;
- }
- else if ( isset($link[1]) && preg_match('/^\{\{[^\}]+\}\}$/',$link[1]) ) {
- // If the title is an image, convert it to an array containing the image details
- $link[1] = Doku_Handler_Parse_Media($link[1]);
- }
- else if(!isset($link[1]))
- {
- $link[1] = null;
- }
-
- $link[0] = trim($link[0]);
-
- //decide which kind of link it is
-
- if ( preg_match('/^[a-zA-Z0-9\.]+>{1}.*$/u',$link[0]) ) {
- $type = 'interwiki';
- }elseif ( preg_match('/^\\\\\\\\[^\\\\]+?\\\\/u',$link[0]) ) {
- $type = 'windowsshare';
- }elseif ( preg_match('#^([a-z0-9\-\.+]+?)://#i',$link[0]) ) {
- $type = 'external';
- }elseif ( preg_match('<'.PREG_PATTERN_VALID_EMAIL.'>',$link[0]) ) {
- $type = 'email';
- }elseif ( preg_match('!^#.+!',$link[0]) ){
- $type = 'local';
- $link[0] = substr($link[0],1);
- }else{
- $type = 'internal';
- }
-
- return array($type, $link, $options);
- }
-
- /**
- * Create output. This is largely based on the internal linking mechanism.
- */
- function render($mode, Doku_Renderer $renderer, $data) {
- if (empty($data)) return false;
- global $conf;
- global $ID;
- global $INFO;
- global $lang;
-
- list($type, $link, $options) = $data;
-
- $url = $link[0];
- $name = $link[1];
-
- if($mode == 'metadata')
- {
- if($type == 'external')
- {
- $schemes = getSchemes();
- list($scheme) = explode('://',$url);
- $scheme = strtolower($scheme);
- if(!in_array($scheme,$schemes)) $url = '';
-
- // is there still an URL?
- if(!$url){
- return true;
- }
-
- $renderer->meta['plugin_linksenhanced']['links'][] = $url;
- }
- return true;
- }
-
- if($mode == 'xhtml') {
- switch($type)
- {
- case 'interwiki':
- $interwiki = explode('>',$link[0],2);
- $wikiName = strtolower($interwiki[0]);
- $wikiUri = $interwiki[1];
- $link = array();
- $link['target'] = $conf['target']['interwiki'];
- $link['pre'] = '';
- $link['suf'] = '';
- $link['more'] = '';
- if($name === null || !$options['render'])
- $link['name'] = $renderer->_getLinkTitle($name, $wikiUri, $isImage);
- else
- $link['name'] = $name;
-
- //get interwiki URL
- $exists = null;
- $url = $renderer->_resolveInterWiki($wikiName, $wikiUri, $exists);
-
- if(!$isImage) {
- $class = preg_replace('/[^_\-a-z0-9]+/i', '_', $wikiName);
- $link['class'] = "interwiki iw_$class";
- } else {
- $link['class'] = 'media';
- }
-
- //do we stay at the same server? Use local target
- if(strpos($url, DOKU_URL) === 0 OR strpos($url, DOKU_BASE) === 0) {
- $link['target'] = $conf['target']['wiki'];
- }
-
- if($options['target'] !== false)
- $link['target'] = $options['target'];
-
- if($exists !== null && !$isImage) {
- if($exists) {
- $link['class'] .= ' wikilink1';
- } else {
- $link['class'] .= ' wikilink2';
- $link['rel'] = 'nofollow';
- }
- }
- if($options['class'] !== false)
- $link['class'] = $options['class'];
-
- $link['url'] = $url;
- $link['title'] = htmlspecialchars($link['url']);
-
- //output formatted
- $renderer->doc .= $renderer->_formatLink($link);
- break;
- case 'windowsshare':
- //simple setup
- $link['target'] = $conf['target']['windows'];
- $link['pre'] = '';
- $link['suf'] = '';
- $link['style'] = '';
-
- if($options['target'] !== false)
- $link['target'] = $options['target'];
-
- if($name === null || !$options['render'])
- $link['name'] = $renderer->_getLinkTitle($name, $url, $isImage);
- else
- $link['name'] = $name;
- if ( !$isImage ) {
- $link['class'] = 'windows';
- } else {
- $link['class'] = 'media';
- }
-
- if($options['class'] !== false)
- $link['class'] = $options['class'];
-
- $link['title'] = $renderer->_xmlEntities($url);
- $url = str_replace('\\','/',$url);
- $url = 'file:///'.$url;
- $link['url'] = $url;
-
- //output formatted
- $renderer->doc .= $renderer->_formatLink($link);
- break;
- case 'external':
- if($name === null || !$options['render'])
- $name = $renderer->_getLinkTitle($name, $url, $isImage);
-
- // url might be an attack vector, only allow registered protocols
- $schemes = getSchemes();
- list($scheme) = explode('://',$url);
- $scheme = strtolower($scheme);
- if(!in_array($scheme,$schemes)) $url = '';
-
- // is there still an URL?
- if(!$url){
- $renderer->doc .= $name;
- return;
- }
-
- // set class
- if ( !$isImage ) {
- $class='urlextern';
- } else {
- $class='media';
- }
-
- if($options['class'] !== false)
- $class = $options['class'];
-
- //prepare for formating
- $link['target'] = $conf['target']['extern'];
- $link['style'] = '';
- $link['pre'] = '';
- $link['suf'] = '';
- $link['more'] = '';
- $link['class'] = $class;
- $link['url'] = $url;
-
- if($options['target'] !== false)
- $link['target'] = $options['target'];
-
- if($options['check'] !== false)
- {
- $link['class'] = 'plugin_linksenhanced_pending';
- }
- $link['name'] = $name;
- $link['title'] = $renderer->_xmlEntities($url);
- if($conf['relnofollow']) $link['more'] .= ' rel="nofollow"';
-
- //output formatted
- $renderer->doc .= $renderer->_formatLink($link);
- break;
- case 'email':
- $link = array();
- $link['target'] = '';
- $link['pre'] = '';
- $link['suf'] = '';
- $link['style'] = '';
- $link['more'] = '';
-
- if($name === null || !$options['render'])
- $name = $renderer->_getLinkTitle($name, '', $isImage);
- if ( !$isImage ) {
- $link['class']='mail';
- } else {
- $link['class']='media';
- }
-
- if($options['class'] !== false)
- $link['class'] = $options['class'];
-
- $url = $renderer->_xmlEntities($url);
- $url = obfuscate($url);
- $title = $url;
-
- if(empty($name)){
- $name = $url;
- }
-
- if($conf['mailguard'] == 'visible') $url = rawurlencode($url);
-
- $link['url'] = 'mailto:'.$url;
- $link['name'] = $name;
- $link['title'] = $title;
-
- //output formatted
- $renderer->doc .= $renderer->_formatLink($link);
- break;
- case 'local':
- if($name === null || !$options['render'])
- $name = $renderer->_getLinkTitle($name, $url, $isImage);
- $url = $renderer->_headerToLink($url);
- $title = $ID.' ↵';
- if($options['class'] !== false)
- $class = $options['class'];
- else
- $class = "wikilink1";
- $renderer->doc .= '<a href="#'.$url.'" title="'.$title.'" class="'.$class.'">';
- $renderer->doc .= $name;
- $renderer->doc .= '</a>';
- break;
- case 'internal':
- $id = $url;
- $params = '';
- $linktype = 'content';
- $parts = explode('?', $id, 2);
- if (count($parts) === 2) {
- $id = $parts[0];
- $params = $parts[1];
- }
-
- // For empty $id we need to know the current $ID
- // We need this check because _simpleTitle needs
- // correct $id and resolve_pageid() use cleanID($id)
- // (some things could be lost)
- if ($id === '') {
- $id = $ID;
- }
-
- // default name is based on $id as given
- $default = $renderer->_simpleTitle($id);
-
- // now first resolve and clean up the $id
- resolve_pageid(getNS($ID),$id,$exists);
-
- if($name === null || !$options['render'])
- $name = $renderer->_getLinkTitle($name, $default, $isImage, $id, $linktype);
- if ( !$isImage ) {
- if ( $exists ) {
- $class='wikilink1';
- } else {
- $class='wikilink2';
- $link['rel']='nofollow';
- }
- } else {
- $class='media';
- }
-
- if($options['class'] !== false)
- $class = $options['class'];
-
- //keep hash anchor
- @list($id,$hash) = explode('#',$id,2);
- if(!empty($hash)) $hash = $renderer->_headerToLink($hash);
-
- //prepare for formating
- $link['target'] = $conf['target']['wiki'];
- $link['style'] = '';
- $link['pre'] = '';
- $link['suf'] = '';
- // highlight link to current page
- if ($id == $INFO['id']) {
- $link['pre'] = '<span class="curid">';
- $link['suf'] = '</span>';
- }
- $link['more'] = '';
- $link['class'] = $class;
- $link['url'] = wl($id, $params);
- $link['name'] = $name;
- $link['title'] = $id;
-
- if($options['target'] !== false)
- $link['target'] = $options['target'];
- //add search string
- if($search){
- ($conf['userewrite']) ? $link['url'].='?' : $link['url'].='&';
- if(is_array($search)){
- $search = array_map('rawurlencode',$search);
- $link['url'] .= 's[]='.join('&s[]=',$search);
- }else{
- $link['url'] .= 's='.rawurlencode($search);
- }
- }
-
- //keep hash
- if($hash) $link['url'].='#'.$hash;
-
- //output formatted
- if($returnonly){
- return $renderer->_formatLink($link);
- }else{
- $renderer->doc .= $renderer->_formatLink($link);
- }
- break;
- }
- }
- return false;
- }
-}
diff --git a/syntax/link.php b/syntax/link.php
new file mode 100644
--- /dev/null
+++ b/syntax/link.php
@@ -0,0 +1,438 @@
+<?php
+/**
+ * linksenhanced Plugin - Render Link Title using Wiki Markup
+ * Heavily based on the standard linking code.
+ *
+ * Usage:
+ *
+ * [[check^http://www.dokuwiki.org|www.dokuwiki.org]]
+ * [[render noparagraph^http://www.dokuwiki.org|<faicon fa fe-euro> FontAwesome Code]]
+ * [[render^http://www.dokuwiki.org|//Formatted Output, probably within a paragraph//]]
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Andreas Böhler <dev@aboehler.at>
+ */
+
+if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/');
+if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
+require_once(DOKU_PLUGIN.'syntax.php');
+
+/**
+ * All DokuWiki plugins to extend the parser/rendering mechanism
+ * need to inherit from this class
+ */
+class syntax_plugin_linksenhanced_link extends DokuWiki_Syntax_Plugin {
+
+ function getType() {
+ return 'substition';
+ }
+
+ function getPType() {
+ return 'normal';
+ }
+
+ function getAllowedTypes() {
+ return array('container','substition','protected','disabled','paragraphs','formatting');
+ }
+
+ function getSort() {
+ return 202;
+ }
+
+ function connectTo($mode) {
+ $this->Lexer->addSpecialPattern('\[\[(?:(?:[^[\]]*?\[.*?\])|.*?)\]\]',$mode,'plugin_linksenhanced_link');
+ }
+
+ /**
+ * Handle the match. Use either the standard linking mechanism or, when enabled,
+ * pass the title through the parser
+ */
+ function handle($match, $state, $pos, Doku_Handler $handler) {
+ global $ID;
+
+ $match = substr($match, 2, -2);
+ $link = explode('|',$match,2);
+ $nopara = false;
+ $optionsSet = explode('^', $link[0], 2);
+ $options = array('render' => false,
+ 'noparagraph' => false,
+ 'check' => false,
+ 'class' => false,
+ 'target' => false);
+ if(isset($optionsSet[1]))
+ {
+ $link[0] = $optionsSet[1];
+ $opts = explode(' ', $optionsSet[0]);
+ foreach($opts as $opt)
+ {
+ if(strpos($opt, 'class') === 0)
+ $options['class'] = explode('=', $opt)[1];
+ elseif(strpos($opt, 'target') === 0)
+ $options['target'] = explode('=', $opt)[1];
+ else
+ $options[$opt] = true;
+ }
+ }
+
+ if($this->getConf('check_all_external') == 1)
+ {
+ if($this->getConf('check_only_namespace') != '')
+ {
+ $namespaces = explode(',', $this->getConf('check_only_namespace'));
+ foreach($namespaces as $namespace)
+ {
+ if(getNS($ID) == $namespace)
+ $options['check'] = true;
+ }
+ }
+ else
+ {
+ $options['check'] = true;
+ }
+ }
+
+ if($options['render'] && isset($link[1]))
+ {
+ $link[1] = $this->render_text($link[1]);
+ if($options['noparagraph'])
+ {
+ $link[1] = str_replace('</p>', '', str_replace('<p>', '', $link[1]));
+ }
+ if($link[1] === '')
+ $link[1] = null;
+ }
+ else if ( isset($link[1]) && preg_match('/^\{\{[^\}]+\}\}$/',$link[1]) ) {
+ // If the title is an image, convert it to an array containing the image details
+ $link[1] = Doku_Handler_Parse_Media($link[1]);
+ }
+ else if(!isset($link[1]))
+ {
+ $link[1] = null;
+ }
+
+ $link[0] = trim($link[0]);
+
+ //decide which kind of link it is
+
+ if ( preg_match('/^[a-zA-Z0-9\.]+>{1}.*$/u',$link[0]) ) {
+ $type = 'interwiki';
+ }elseif ( preg_match('/^\\\\\\\\[^\\\\]+?\\\\/u',$link[0]) ) {
+ $type = 'windowsshare';
+ }elseif ( preg_match('#^([a-z0-9\-\.+]+?)://#i',$link[0]) ) {
+ $type = 'external';
+ }elseif ( preg_match('<'.PREG_PATTERN_VALID_EMAIL.'>',$link[0]) ) {
+ $type = 'email';
+ }elseif ( preg_match('!^#.+!',$link[0]) ){
+ $type = 'local';
+ $link[0] = substr($link[0],1);
+ }else{
+ $type = 'internal';
+ }
+
+ return array($type, $link, $options);
+ }
+
+ /**
+ * Create output. This is largely based on the internal linking mechanism.
+ */
+ function render($mode, Doku_Renderer $renderer, $data) {
+ if (empty($data)) return false;
+ global $conf;
+ global $ID;
+ global $INFO;
+ global $lang;
+
+ list($type, $link, $options) = $data;
+
+ $url = $link[0];
+ $name = $link[1];
+
+ if($mode == 'metadata')
+ {
+ if($type == 'external')
+ {
+ $schemes = getSchemes();
+ list($scheme) = explode('://',$url);
+ $scheme = strtolower($scheme);
+ if(!in_array($scheme,$schemes)) $url = '';
+
+ // is there still an URL?
+ if(!$url){
+ return true;
+ }
+
+ $renderer->meta['plugin_linksenhanced']['links'][] = $url;
+ }
+ return true;
+ }
+
+ if($mode == 'xhtml') {
+ switch($type)
+ {
+ case 'interwiki':
+ $interwiki = explode('>',$link[0],2);
+ $wikiName = strtolower($interwiki[0]);
+ $wikiUri = $interwiki[1];
+ $link = array();
+ $link['target'] = $conf['target']['interwiki'];
+ $link['pre'] = '';
+ $link['suf'] = '';
+ $link['more'] = '';
+ if($name === null || !$options['render'])
+ $link['name'] = $renderer->_getLinkTitle($name, $wikiUri, $isImage);
+ else
+ $link['name'] = $name;
+
+ //get interwiki URL
+ $exists = null;
+ $url = $renderer->_resolveInterWiki($wikiName, $wikiUri, $exists);
+
+ if(!$isImage) {
+ $class = preg_replace('/[^_\-a-z0-9]+/i', '_', $wikiName);
+ $link['class'] = "interwiki iw_$class";
+ } else {
+ $link['class'] = 'media';
+ }
+
+ //do we stay at the same server? Use local target
+ if(strpos($url, DOKU_URL) === 0 OR strpos($url, DOKU_BASE) === 0) {
+ $link['target'] = $conf['target']['wiki'];
+ }
+
+ if($options['target'] !== false)
+ $link['target'] = $options['target'];
+
+ if($exists !== null && !$isImage) {
+ if($exists) {
+ $link['class'] .= ' wikilink1';
+ } else {
+ $link['class'] .= ' wikilink2';
+ $link['rel'] = 'nofollow';
+ }
+ }
+ if($options['class'] !== false)
+ $link['class'] = $options['class'];
+
+ $link['url'] = $url;
+ $link['title'] = htmlspecialchars($link['url']);
+
+ //output formatted
+ $renderer->doc .= $renderer->_formatLink($link);
+ break;
+ case 'windowsshare':
+ //simple setup
+ $link['target'] = $conf['target']['windows'];
+ $link['pre'] = '';
+ $link['suf'] = '';
+ $link['style'] = '';
+
+ if($options['target'] !== false)
+ $link['target'] = $options['target'];
+
+ if($name === null || !$options['render'])
+ $link['name'] = $renderer->_getLinkTitle($name, $url, $isImage);
+ else
+ $link['name'] = $name;
+ if ( !$isImage ) {
+ $link['class'] = 'windows';
+ } else {
+ $link['class'] = 'media';
+ }
+
+ if($options['class'] !== false)
+ $link['class'] = $options['class'];
+
+ $link['title'] = $renderer->_xmlEntities($url);
+ $url = str_replace('\\','/',$url);
+ $url = 'file:///'.$url;
+ $link['url'] = $url;
+
+ //output formatted
+ $renderer->doc .= $renderer->_formatLink($link);
+ break;
+ case 'external':
+ if($name === null || !$options['render'])
+ $name = $renderer->_getLinkTitle($name, $url, $isImage);
+
+ // url might be an attack vector, only allow registered protocols
+ $schemes = getSchemes();
+ list($scheme) = explode('://',$url);
+ $scheme = strtolower($scheme);
+ if(!in_array($scheme,$schemes)) $url = '';
+
+ // is there still an URL?
+ if(!$url){
+ $renderer->doc .= $name;
+ return;
+ }
+
+ // set class
+ if ( !$isImage ) {
+ $class='urlextern';
+ } else {
+ $class='media';
+ }
+
+ if($options['class'] !== false)
+ $class = $options['class'];
+
+ //prepare for formating
+ $link['target'] = $conf['target']['extern'];
+ $link['style'] = '';
+ $link['pre'] = '';
+ $link['suf'] = '';
+ $link['more'] = '';
+ $link['class'] = $class;
+ $link['url'] = $url;
+
+ if($options['target'] !== false)
+ $link['target'] = $options['target'];
+
+ if($options['check'] !== false)
+ {
+ $link['class'] = 'plugin_linksenhanced_pending';
+ }
+ $link['name'] = $name;
+ $link['title'] = $renderer->_xmlEntities($url);
+ if($conf['relnofollow']) $link['more'] .= ' rel="nofollow"';
+
+ //output formatted
+ $renderer->doc .= $renderer->_formatLink($link);
+ break;
+ case 'email':
+ $link = array();
+ $link['target'] = '';
+ $link['pre'] = '';
+ $link['suf'] = '';
+ $link['style'] = '';
+ $link['more'] = '';
+
+ if($name === null || !$options['render'])
+ $name = $renderer->_getLinkTitle($name, '', $isImage);
+ if ( !$isImage ) {
+ $link['class']='mail';
+ } else {
+ $link['class']='media';
+ }
+
+ if($options['class'] !== false)
+ $link['class'] = $options['class'];
+
+ $url = $renderer->_xmlEntities($url);
+ $url = obfuscate($url);
+ $title = $url;
+
+ if(empty($name)){
+ $name = $url;
+ }
+
+ if($conf['mailguard'] == 'visible') $url = rawurlencode($url);
+
+ $link['url'] = 'mailto:'.$url;
+ $link['name'] = $name;
+ $link['title'] = $title;
+
+ //output formatted
+ $renderer->doc .= $renderer->_formatLink($link);
+ break;
+ case 'local':
+ if($name === null || !$options['render'])
+ $name = $renderer->_getLinkTitle($name, $url, $isImage);
+ $url = $renderer->_headerToLink($url);
+ $title = $ID.' ↵';
+ if($options['class'] !== false)
+ $class = $options['class'];
+ else
+ $class = "wikilink1";
+ $renderer->doc .= '<a href="#'.$url.'" title="'.$title.'" class="'.$class.'">';
+ $renderer->doc .= $name;
+ $renderer->doc .= '</a>';
+ break;
+ case 'internal':
+ $id = $url;
+ $params = '';
+ $linktype = 'content';
+ $parts = explode('?', $id, 2);
+ if (count($parts) === 2) {
+ $id = $parts[0];
+ $params = $parts[1];
+ }
+
+ // For empty $id we need to know the current $ID
+ // We need this check because _simpleTitle needs
+ // correct $id and resolve_pageid() use cleanID($id)
+ // (some things could be lost)
+ if ($id === '') {
+ $id = $ID;
+ }
+
+ // default name is based on $id as given
+ $default = $renderer->_simpleTitle($id);
+
+ // now first resolve and clean up the $id
+ resolve_pageid(getNS($ID),$id,$exists);
+
+ if($name === null || !$options['render'])
+ $name = $renderer->_getLinkTitle($name, $default, $isImage, $id, $linktype);
+ if ( !$isImage ) {
+ if ( $exists ) {
+ $class='wikilink1';
+ } else {
+ $class='wikilink2';
+ $link['rel']='nofollow';
+ }
+ } else {
+ $class='media';
+ }
+
+ if($options['class'] !== false)
+ $class = $options['class'];
+
+ //keep hash anchor
+ @list($id,$hash) = explode('#',$id,2);
+ if(!empty($hash)) $hash = $renderer->_headerToLink($hash);
+
+ //prepare for formating
+ $link['target'] = $conf['target']['wiki'];
+ $link['style'] = '';
+ $link['pre'] = '';
+ $link['suf'] = '';
+ // highlight link to current page
+ if ($id == $INFO['id']) {
+ $link['pre'] = '<span class="curid">';
+ $link['suf'] = '</span>';
+ }
+ $link['more'] = '';
+ $link['class'] = $class;
+ $link['url'] = wl($id, $params);
+ $link['name'] = $name;
+ $link['title'] = $id;
+
+ if($options['target'] !== false)
+ $link['target'] = $options['target'];
+ //add search string
+ if($search){
+ ($conf['userewrite']) ? $link['url'].='?' : $link['url'].='&';
+ if(is_array($search)){
+ $search = array_map('rawurlencode',$search);
+ $link['url'] .= 's[]='.join('&s[]=',$search);
+ }else{
+ $link['url'] .= 's='.rawurlencode($search);
+ }
+ }
+
+ //keep hash
+ if($hash) $link['url'].='#'.$hash;
+
+ //output formatted
+ if($returnonly){
+ return $renderer->_formatLink($link);
+ }else{
+ $renderer->doc .= $renderer->_formatLink($link);
+ }
+ break;
+ }
+ }
+ return false;
+ }
+}
diff --git a/syntax/table.php b/syntax/table.php
new file mode 100644
--- /dev/null
+++ b/syntax/table.php
@@ -0,0 +1,132 @@
+<?php
+/**
+ * linksenhanced Plugin - Render Link Title using Wiki Markup
+ * Heavily based on the standard linking code.
+ *
+ * Usage:
+ *
+ * [[check^http://www.dokuwiki.org|www.dokuwiki.org]]
+ * [[render noparagraph^http://www.dokuwiki.org|<faicon fa fe-euro> FontAwesome Code]]
+ * [[render^http://www.dokuwiki.org|//Formatted Output, probably within a paragraph//]]
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Andreas Böhler <dev@aboehler.at>
+ */
+
+if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/');
+if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
+require_once(DOKU_PLUGIN.'syntax.php');
+
+/**
+ * All DokuWiki plugins to extend the parser/rendering mechanism
+ * need to inherit from this class
+ */
+class syntax_plugin_linksenhanced_table extends DokuWiki_Syntax_Plugin {
+
+ function getType() {
+ return 'substition';
+ }
+
+ function getPType() {
+ return 'normal';
+ }
+
+ function getAllowedTypes() {
+ return array('container','substition','protected','disabled','paragraphs','formatting');
+ }
+
+ function getSort() {
+ return 202;
+ }
+
+ function connectTo($mode) {
+ $this->Lexer->addSpecialPattern('\{\{linksenhanced>[^}]*\}\}',$mode,'plugin_linksenhanced_table');
+ }
+
+ /**
+ * Handle the match. Use either the standard linking mechanism or, when enabled,
+ * pass the title through the parser
+ */
+ function handle($match, $state, $pos, Doku_Handler $handler) {
+ $options = trim(substr($match,16,-2));
+ $options = explode(',', $options);
+
+ $data = array('links' => array(),
+ 'namespace' => ''
+ );
+
+ foreach($options as $option)
+ {
+ list($key, $val) = explode('=', $option);
+ $key = strtolower(trim($key));
+ $val = trim($val);
+ $data[$key] = $val;
+ }
+
+ msg($data['namespace']);
+ $data['links'] = $this->getPagesAndLinks($data['namespace']);
+ return $data;
+ }
+ /**
+ * Create output
+ */
+
+ function getPagesAndLinks($namespace)
+ {
+ global $conf;
+ $opts = array(
+ 'depth' => 0,
+ 'listfiles' => true,
+ 'listdirs' => false,
+ 'pagesonly' => true,
+ 'firsthead' => true,
+ 'sneakyacl' => $conf['sneaky_index'],
+ );
+
+ $data = array();
+ $retData = array();
+ search($data, $conf['datadir'],'search_universal',$opts);
+ foreach($data as $k => $pdata)
+ {
+ if($namespace != '' && getNS($pdata['id']) !== $namespace)
+ continue;
+
+ $meta = p_get_metadata($pdata['id']);
+ if(is_array($meta['plugin_linksenhanced']['links']))
+ {
+ $retData[$pdata['id']] = $meta['plugin_linksenhanced']['links'];
+ }
+ }
+ return $retData;
+ }
+
+ function render($format, Doku_Renderer $R, $data) {
+ if($format == 'metadata')
+ {
+ $R->meta['plugin_linksenhanced']['nocache'] = true;
+ return true;
+ }
+ if($format != 'xhtml') return false;
+
+ echo '<h1>Link Overview</h1>';
+ echo '<table>';
+ echo '<tr><th width="30\%">Page</th><th width="90\%">Link Status</th></tr>';
+
+ foreach($data['links'] as $page => $links)
+ {
+ echo '<td rowspan="'.count($links).'">'.$page.'</td>';
+ $first = true;
+ foreach($links as $link)
+ {
+ if(!$first)
+ echo '<tr>';
+ else
+ $first = false;
+ echo '<td><a href="'.$link.'" class="plugin_linksenhanced_pending">'.$link.'</td>';
+ echo '</tr>';
+ }
+ }
+ echo '</tr>';
+ echo '</table>';
+ }
+}
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Tue, Dec 24, 9:16 AM (1 d, 10 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
541443
Default Alt Text
(38 KB)
Attached To
rLE linksenhanced PlugIn
Event Timeline
Log In to Comment