addClassName("d-print-none");
$html = $tagAttributes->toHtmlEnterTag("div");
$relatedPages = self::getRelatedPagesOrderedByBacklinkCount($page, $max);
if (empty($relatedPages)) {
$html .= "Plugin " . PluginUtility::PLUGIN_BASE_NAME . " - Component " . self::getTag() . ": " . $lang['nothingfound'] . "" . DOKU_LF;
} else {
// Dokuwiki debug
$html .= '
' . DOKU_LF;
foreach ($relatedPages as $backlink) {
$backlinkId = $backlink[self::RELATED_PAGE_ID_PROP];
$html .= '- ';
if ($backlinkId != self::MORE_PAGE_ID) {
$linkUtility = LinkUtility::createFromPageId($backlinkId);
$html .= $linkUtility->renderOpenTag($renderer);
$html .= ucfirst($linkUtility->getName());
$html .= $linkUtility->renderClosingTag();
} else {
$html .=
tpl_link(
wl($page->getDokuwikiId()) . '?do=backlink',
"More ...",
'class="" rel="nofollow" title="More..."',
true
);
}
$html .= '
' . DOKU_LF;
}
$html .= '
' . DOKU_LF;
}
return $html . '' . DOKU_LF;
}
/**
* Syntax Type.
*
* Needs to return one of the mode types defined in $PARSER_MODES in parser.php
* @see DokuWiki_Syntax_Plugin::getType()
*/
function getType()
{
return 'substition';
}
/**
* @see DokuWiki_Syntax_Plugin::getPType()
*/
function getPType()
{
return 'block';
}
/**
* @see Doku_Parser_Mode::getSort()
*/
function getSort()
{
return 100;
}
/**
* Create a pattern that will called this plugin
*
* @param string $mode
* @see Doku_Parser_Mode::connectTo()
*/
function connectTo($mode)
{
// The basic
$this->Lexer->addSpecialPattern(PluginUtility::getVoidElementTagPattern(self::getTag()), $mode, 'plugin_' . PluginUtility::PLUGIN_BASE_NAME . '_' . $this->getPluginComponent());
// To replace backlinks, you may add it in the configuration
$extraPattern = $this->getConf(self::EXTRA_PATTERN_CONF);
if ($extraPattern != "") {
$this->Lexer->addSpecialPattern($extraPattern, $mode, 'plugin_' . PluginUtility::PLUGIN_BASE_NAME . '_' . $this->getPluginComponent());
}
}
/**
*
* The handle function goal is to parse the matched syntax through the pattern function
* and to return the result for use in the renderer
* This result is always cached until the page is modified.
* @param string $match
* @param int $state
* @param int $pos
* @param Doku_Handler $handler
* @return array|bool
* @see DokuWiki_Syntax_Plugin::handle()
*
*/
function handle($match, $state, $pos, Doku_Handler $handler)
{
switch ($state) {
// As there is only one call to connect to in order to a add a pattern,
// there is only one state entering the function
// but I leave it for better understanding of the process flow
case DOKU_LEXER_SPECIAL :
$qualifiedMach = trim($match);
$attributes = [];
if ($qualifiedMach[0] === "<") {
// not an extra pattern
$tagAttributes = TagAttributes::createFromTagMatch($match);
$attributes = $tagAttributes->toCallStackArray();
}
return array(
PluginUtility::STATE => $state,
PluginUtility::ATTRIBUTES => $attributes
);
}
// Cache the values
return array($state);
}
/**
* Render the output
* @param string $format
* @param Doku_Renderer $renderer
* @param array $data - what the function handle() return'ed
* @return boolean - rendered correctly? (however, returned value is not used at the moment)
* @see DokuWiki_Syntax_Plugin::render()
*
*
*/
function render($format, Doku_Renderer $renderer, $data)
{
if ($format == 'xhtml') {
$page = Page::createPageFromRequestedPage();
$tagAttributes = TagAttributes::createFromCallStackArray($data[PluginUtility::ATTRIBUTES]);
$max = $tagAttributes->getValue(self::MAX_LINKS_CONF);
if ($max === NULL) {
$max = PluginUtility::getConfValue(self::MAX_LINKS_CONF, self::MAX_LINKS_CONF_DEFAULT);
}
$renderer->doc .= self::getHtmlRelated($page, $max, $renderer);
return true;
}
return false;
}
/**
* @param Page $page
* @param int|null $max
* @return array
*/
public static function getRelatedPagesOrderedByBacklinkCount(Page $page, ?int $max = null): array
{
// Call the dokuwiki backlinks function
// @require_once(DOKU_INC . 'inc/fulltext.php');
// Backlinks called the indexer, for more info
// See: https://www.dokuwiki.org/devel:metadata#metadata_index
$backlinks = ft_backlinks($page->getDokuwikiId(), $ignore_perms = false);
$related = array();
foreach ($backlinks as $backlink) {
$page = array();
$page[self::RELATED_PAGE_ID_PROP] = $backlink;
$page[self::RELATED_BACKLINKS_COUNT_PROP] = sizeof(ft_backlinks($backlink, $ignore_perms = false));
$related[] = $page;
}
usort($related, function ($a, $b) {
return $b[self::RELATED_BACKLINKS_COUNT_PROP] - $a[self::RELATED_BACKLINKS_COUNT_PROP];
});
if ($max !== null) {
if (sizeof($related) > $max) {
$related = array_slice($related, 0, $max);
$page = array();
$page[self::RELATED_PAGE_ID_PROP] = self::MORE_PAGE_ID;
$related[] = $page;
}
}
return $related;
}
public static function getTag(): string
{
return "related";
}
}