diff options
-rw-r--r-- | feed.php | 451 | ||||
-rw-r--r-- | inc/io.php | 2 |
2 files changed, 1 insertions, 452 deletions
@@ -72,454 +72,3 @@ try { echo '<error>' . hsc($e->getMessage()) . '</error>'; exit; } - - -// ---------------------------------------------------------------- // - -/** - * Get URL parameters and config options and return an initialized option array - * - * @author Andreas Gohr <andi@splitbrain.org> - */ -function rss_parseOptions() -{ - global $conf; - global $INPUT; - - $opt = []; - - foreach ( - [ - // Basic feed properties - // Plugins may probably want to add new values to these - // properties for implementing own feeds - - // One of: list, search, recent - 'feed_mode' => ['str', 'mode', 'recent'], - // One of: diff, page, rev, current - 'link_to' => ['str', 'linkto', $conf['rss_linkto']], - // One of: abstract, diff, htmldiff, html - 'item_content' => ['str', 'content', $conf['rss_content']], - - // Special feed properties - // These are only used by certain feed_modes - - // String, used for feed title, in list and rc mode - 'namespace' => ['str', 'ns', null], - // Positive integer, only used in rc mode - 'items' => ['int', 'num', $conf['recent']], - // Boolean, only used in rc mode - 'show_minor' => ['bool', 'minor', false], - // Boolean, only used in rc mode - 'only_new' => ['bool', 'onlynewpages', false], - // String, only used in list mode - 'sort' => ['str', 'sort', 'natural'], - // String, only used in search mode - 'search_query' => ['str', 'q', null], - // One of: pages, media, both - 'content_type' => ['str', 'view', $conf['rss_media']] - - ] as $name => $val - ) { - $opt[$name] = $INPUT->{$val[0]}($val[1], $val[2], true); - } - - $opt['items'] = max(0, (int)$opt['items']); - $opt['show_minor'] = (bool)$opt['show_minor']; - $opt['only_new'] = (bool)$opt['only_new']; - $opt['sort'] = valid_input_set('sort', ['default' => 'natural', 'date'], $opt); - - $opt['guardmail'] = ($conf['mailguard'] != '' && $conf['mailguard'] != 'none'); - - $type = $INPUT->valid( - 'type', - ['rss', 'rss2', 'atom', 'atom1', 'rss1'], - $conf['rss_type'] - ); - switch ($type) { - case 'rss': - $opt['feed_type'] = 'RSS0.91'; - $opt['mime_type'] = 'text/xml'; - break; - case 'rss2': - $opt['feed_type'] = 'RSS2.0'; - $opt['mime_type'] = 'text/xml'; - break; - case 'atom': - $opt['feed_type'] = 'ATOM0.3'; - $opt['mime_type'] = 'application/xml'; - break; - case 'atom1': - $opt['feed_type'] = 'ATOM1.0'; - $opt['mime_type'] = 'application/atom+xml'; - break; - default: - $opt['feed_type'] = 'RSS1.0'; - $opt['mime_type'] = 'application/xml'; - } - - $eventData = [ - 'opt' => &$opt, - ]; - Event::createAndTrigger('FEED_OPTS_POSTPROCESS', $eventData); - return $opt; -} - -/** - * Add recent changed pages to a feed object - * - * @param FeedCreator $rss the FeedCreator Object - * @param array $data the items to add - * @param array $opt the feed options - * @author Andreas Gohr <andi@splitbrain.org> - */ -function rss_buildItems(&$rss, &$data, $opt) -{ - global $conf; - global $lang; - /* @var AuthPlugin $auth */ - global $auth; - - $eventData = [ - 'rss' => &$rss, - 'data' => &$data, - 'opt' => &$opt, - ]; - $event = new Event('FEED_DATA_PROCESS', $eventData); - if ($event->advise_before(false)) { - foreach ($data as $ditem) { - if (!is_array($ditem)) { - // not an array? then only a list of IDs was given - $ditem = ['id' => $ditem]; - } - - $item = new FeedItem(); - $id = $ditem['id']; - if (empty($ditem['media'])) { - $meta = p_get_metadata($id); - } else { - $meta = []; - } - - // add date - if (isset($ditem['date'])) { - $date = $ditem['date']; - } elseif ($ditem['media']) { - $date = @filemtime(mediaFN($id)); - } elseif (file_exists(wikiFN($id))) { - $date = @filemtime(wikiFN($id)); - } elseif ($meta['date']['modified']) { - $date = $meta['date']['modified']; - } else { - $date = 0; - } - if ($date) $item->date = date('r', $date); - - // add title - if ($conf['useheading'] && $meta['title'] ?? '') { - $item->title = $meta['title']; - } else { - $item->title = $ditem['id']; - } - if ($conf['rss_show_summary'] && !empty($ditem['sum'])) { - $item->title .= ' - ' . strip_tags($ditem['sum']); - } - - // add item link - switch ($opt['link_to']) { - case 'page': - if (isset($ditem['media'])) { - $item->link = media_managerURL( - [ - 'image' => $id, - 'ns' => getNS($id), - 'rev' => $date - ], - '&', - true - ); - } else { - $item->link = wl($id, 'rev=' . $date, true, '&'); - } - break; - case 'rev': - if ($ditem['media']) { - $item->link = media_managerURL( - [ - 'image' => $id, - 'ns' => getNS($id), - 'rev' => $date, - 'tab_details' => 'history' - ], - '&', - true - ); - } else { - $item->link = wl($id, 'do=revisions&rev=' . $date, true, '&'); - } - break; - case 'current': - if ($ditem['media']) { - $item->link = media_managerURL( - [ - 'image' => $id, - 'ns' => getNS($id) - ], - '&', - true - ); - } else { - $item->link = wl($id, '', true, '&'); - } - break; - case 'diff': - default: - if ($ditem['media']) { - $item->link = media_managerURL( - [ - 'image' => $id, - 'ns' => getNS($id), - 'rev' => $date, - 'tab_details' => 'history', - 'mediado' => 'diff' - ], - '&', - true - ); - } else { - $item->link = wl($id, 'rev=' . $date . '&do=diff', true, '&'); - } - } - - // add item content - switch ($opt['item_content']) { - case 'diff': - case 'htmldiff': - if ($ditem['media']) { - $medialog = new MediaChangeLog($id); - $revs = $medialog->getRevisions(0, 1); - $rev = $revs[0]; - $src_r = ''; - $src_l = ''; - - if ($size = media_image_preview_size($id, '', new JpegMeta(mediaFN($id)), 300)) { - $more = 'w=' . $size[0] . '&h=' . $size[1] . '&t=' . @filemtime(mediaFN($id)); - $src_r = ml($id, $more, true, '&', true); - } - if ( - $rev && $size = media_image_preview_size( - $id, - $rev, - new JpegMeta(mediaFN($id, $rev)), - 300 - ) - ) { - $more = 'rev=' . $rev . '&w=' . $size[0] . '&h=' . $size[1]; - $src_l = ml($id, $more, true, '&', true); - } - $content = ''; - if ($src_r) { - $content = '<table>'; - $content .= '<tr><th width="50%">' . $rev . '</th>'; - $content .= '<th width="50%">' . $lang['current'] . '</th></tr>'; - $content .= '<tr align="center"><td><img src="' . $src_l . '" alt="" /></td><td>'; - $content .= '<img src="' . $src_r . '" alt="' . $id . '" /></td></tr>'; - $content .= '</table>'; - } - } else { - require_once(DOKU_INC . 'inc/DifferenceEngine.php'); - $pagelog = new PageChangeLog($id); - $revs = $pagelog->getRevisions(0, 1); - $rev = $revs[0]; - - if ($rev) { - $df = new Diff( - explode("\n", rawWiki($id, $rev)), - explode("\n", rawWiki($id, '')) - ); - } else { - $df = new Diff( - [''], - explode("\n", rawWiki($id, '')) - ); - } - - if ($opt['item_content'] == 'htmldiff') { - // note: no need to escape diff output, TableDiffFormatter provides 'safe' html - $tdf = new TableDiffFormatter(); - $content = '<table>'; - $content .= '<tr><th colspan="2" width="50%">' . $rev . '</th>'; - $content .= '<th colspan="2" width="50%">' . $lang['current'] . '</th></tr>'; - $content .= $tdf->format($df); - $content .= '</table>'; - } else { - // note: diff output must be escaped, UnifiedDiffFormatter provides plain text - $udf = new UnifiedDiffFormatter(); - $content = "<pre>\n" . hsc($udf->format($df)) . "\n</pre>"; - } - } - break; - case 'html': - if ($ditem['media']) { - if ($size = media_image_preview_size($id, '', new JpegMeta(mediaFN($id)))) { - $more = 'w=' . $size[0] . '&h=' . $size[1] . '&t=' . @filemtime(mediaFN($id)); - $src = ml($id, $more, true, '&', true); - $content = '<img src="' . $src . '" alt="' . $id . '" />'; - } else { - $content = ''; - } - } else { - if (@filemtime(wikiFN($id)) === $date) { - $content = p_wiki_xhtml($id, '', false); - } else { - $content = p_wiki_xhtml($id, $date, false); - } - // no TOC in feeds - $content = preg_replace('/(<!-- TOC START -->).*(<!-- TOC END -->)/s', '', $content); - - // add alignment for images - $content = preg_replace('/(<img .*?class="medialeft")/s', '\\1 align="left"', $content); - $content = preg_replace('/(<img .*?class="mediaright")/s', '\\1 align="right"', $content); - - // make URLs work when canonical is not set, regexp instead of rerendering! - if (!$conf['canonical']) { - $base = preg_quote(DOKU_REL, '/'); - $content = preg_replace( - '/(<a href|<img src)="(' . $base . ')/s', - '$1="' . DOKU_URL, - $content - ); - } - } - - break; - case 'abstract': - default: - if (isset($ditem['media'])) { - if ($size = media_image_preview_size($id, '', new JpegMeta(mediaFN($id)))) { - $more = 'w=' . $size[0] . '&h=' . $size[1] . '&t=' . @filemtime(mediaFN($id)); - $src = ml($id, $more, true, '&', true); - $content = '<img src="' . $src . '" alt="' . $id . '" />'; - } else { - $content = ''; - } - } else { - $content = $meta['description']['abstract']; - } - } - $item->description = $content; //FIXME a plugin hook here could be senseful - - // add user - # FIXME should the user be pulled from metadata as well? - $user = @$ditem['user']; // the @ spares time repeating lookup - if (blank($user)) { - $item->author = 'Anonymous'; - $item->authorEmail = 'anonymous@undisclosed.example.com'; - } else { - $item->author = $user; - $item->authorEmail = $user . '@undisclosed.example.com'; - - // get real user name if configured - if ($conf['useacl'] && $auth instanceof AuthPlugin) { - $userInfo = $auth->getUserData($user); - if ($userInfo) { - switch ($conf['showuseras']) { - case 'username': - case 'username_link': - $item->author = $userInfo['name']; - break; - default: - $item->author = $user; - break; - } - } else { - $item->author = $user; - } - } - } - - // add category - if (isset($meta['subject'])) { - $item->category = $meta['subject']; - } else { - $cat = getNS($id); - if ($cat) $item->category = $cat; - } - - // finally add the item to the feed object, after handing it to registered plugins - $evdata = [ - 'item' => &$item, - 'opt' => &$opt, - 'ditem' => &$ditem, - 'rss' => &$rss - ]; - $evt = new Event('FEED_ITEM_ADD', $evdata); - if ($evt->advise_before()) { - $rss->addItem($item); - } - $evt->advise_after(); // for completeness - } - } - $event->advise_after(); -} - -/** - * Add recent changed pages to the feed object - * - * @author Andreas Gohr <andi@splitbrain.org> - */ -function rssRecentChanges($opt) -{ - global $conf; - $flags = 0; - if (!$conf['rss_show_deleted']) $flags += RECENTS_SKIP_DELETED; - if (!$opt['show_minor']) $flags += RECENTS_SKIP_MINORS; - if ($opt['only_new']) $flags += RECENTS_ONLY_CREATION; - if ($opt['content_type'] == 'media' && $conf['mediarevisions']) $flags += RECENTS_MEDIA_CHANGES; - if ($opt['content_type'] == 'both' && $conf['mediarevisions']) $flags += RECENTS_MEDIA_PAGES_MIXED; - - $recents = getRecents(0, $opt['items'], $opt['namespace'], $flags); - return $recents; -} - -/** - * Add all pages of a namespace to the feed object - * - * @author Andreas Gohr <andi@splitbrain.org> - */ -function rssListNamespace($opt) -{ - require_once(DOKU_INC . 'inc/search.php'); - global $conf; - - $ns = ':' . cleanID($opt['namespace']); - $ns = utf8_encodeFN(str_replace(':', '/', $ns)); - - $data = []; - $search_opts = [ - 'depth' => 1, - 'pagesonly' => true, - 'listfiles' => true - ]; - search($data, $conf['datadir'], 'search_universal', $search_opts, $ns, $lvl = 1, $opt['sort']); - - return $data; -} - -/** - * Add the result of a full text search to the feed object - * - * @author Andreas Gohr <andi@splitbrain.org> - */ -function rssSearch($opt) -{ - if (!$opt['search_query'] || !actionOK('search')) return []; - - require_once(DOKU_INC . 'inc/fulltext.php'); - $data = ft_pageSearch($opt['search_query'], $poswords); - $data = array_keys($data); - - return $data; -} - -//Setup VIM: ex: et ts=4 : diff --git a/inc/io.php b/inc/io.php index dafa2fa4f..da42d4185 100644 --- a/inc/io.php +++ b/inc/io.php @@ -415,7 +415,7 @@ function io_replaceInFile($file, $oldline, $newline, $regex = false, $maxlines = */ function io_deleteFromFile($file, $badline, $regex = false) { - return io_replaceInFile($file, $badline, null, $regex, 0); + return io_replaceInFile($file, $badline, '', $regex, 0); } /** |