*/ class helper_plugin_linkback extends DokuWiki_Plugin { function getMethods() { $result = array (); $result[] = array ( 'name' => 'th', 'desc' => 'returns the header of the linkback column for pagelist', 'return' => array ( 'header' => 'string' ), ); $result[] = array ( 'name' => 'td', 'desc' => 'returns the link to the linkback section with number of comments', 'params' => array ( 'id' => 'string', 'number of linkbacks (optional)' => 'integer' ), 'return' => array ( 'link' => 'string' ), ); $result[] = array ( 'name' => 'getLinkbacks', 'desc' => 'returns recently added linkbacks individually', 'params' => array ( 'namespace' => 'string', 'number (optional)' => 'integer' ), 'return' => array ( 'pages' => 'array' ), ); return $result; } /** * Returns the header of the linkback column for the pagelist */ function th() { return $this->getLang('linkbacks'); } /** * Returns the link to the linkback section with number of comments */ function td($ID, $number = NULL) { $section = '#linkback__section'; if (!isset ($number)) { $lfile = metaFN($ID, '.linkbacks'); $linkbacks = unserialize(io_readFile($lfile, false)); if ($linkbacks){ $number = $linkbacks['number']; if (!$linkbacks['display']) { return ''; } } else { return ''; } } if ($number == 0) { $linkback = '0 ' . $this->getLang('linkback_plural'); } elseif ($number == 1) { $linkback = '1 ' . $this->getLang('linkback_singular'); } else { $linkback = $number . ' ' . $this->getLang('linkback_plural'); } return '' . $linkback . ''; } /** * Returns recently added linkbacks individually */ function getLinkbacks($ns, $num = NULL) { global $conf; $first = $_REQUEST['first']; if (!is_numeric($first)) { $first = 0; } if ((!$num) || (!is_numeric($num))) { $num = $conf['recent']; } $result = array (); $count = 0; if (!@ file_exists($conf['metadir'] . '/_linkbacks.changes')) { return $result; } // read all recent changes. (kept short) $lines = file($conf['metadir'] . '/_linkbacks.changes'); // handle lines for ($i = count($lines) - 1; $i >= 0; $i--) { $rec = $this->_handleRecentLinkback($lines[$i], $ns); if ($rec !== false) { if (-- $first >= 0) { continue; } // skip first entries $result[$rec['date']] = $rec; $count++; // break when we have enough entries if ($count >= $num) { break; } } } // finally sort by time of last comment krsort($result); return $result; } /** * Internal function used by $this->getLinkbacks() * * don't call directly * * @see getRecentComments() * @author Andreas Gohr * @author Ben Coburn * @author Esther Brunner * @author Gina Haeussge */ function _handleRecentLinkback($line, $ns) { static $seen = array (); //caches seen pages and skip them if (empty ($line)) { return false; //skip empty lines } // split the line into parts $recent = parseChangelogLine($line); if ($recent === false) { return false; } $lid = $recent['extra']; $fulllid = $recent['id'] . '#' . $recent['extra']; // skip seen ones if (isset ($seen[$fulllid])) { return false; } // skip 'show comment' log entries if ($recent['type'] === 'sc') { return false; } // remember in seen to skip additional sights $seen[$fulllid] = 1; // check if it's a hidden page or comment if (isHiddenPage($recent['id'])) { return false; } if ($recent['type'] === 'hl') { return false; } // filter namespace or id if (($ns) && (strpos($recent['id'] . ':', $ns . ':') !== 0)) { return false; } // check ACL $recent['perm'] = auth_quickaclcheck($recent['id']); if ($recent['perm'] < AUTH_READ) { return false; } // check existance $recent['file'] = wikiFN($recent['id']); $recent['exists'] = @ file_exists($recent['file']); if (!$recent['exists']) { return false; } if ($recent['type'] === 'dc') { return false; } // get linkback meta file name $data = unserialize(io_readFile(metaFN($recent['id'], '.linkbacks'), false)); // check if discussion is turned off if (!$data['display']) { return false; } // okay, then add some additional info $recent['name'] = $data['receivedpings'][$lid]['url']; $recent['desc'] = $data['receivedpings'][$lid]['excerpt']; return $recent; } }