Skip to content
Snippets Groups Projects
search.php 5.8 KiB
Newer Older
<?php
/**
 * @var WikiPage[] $pages
 * @var string $edit_perms
 * @var Course_WikiController $controller
 */
?>

<? if (count($pages)) : ?>

    <table class="default">
        <caption>
Rasmus Fuhse's avatar
Rasmus Fuhse committed
            <?= sprintf(_('Treffer für Suche nach <em>%s</em>'), htmlReady(Request::get('search'))) ?>
        </caption>
        <thead>
        <tr>
            <th><?= _('Seite') ?></th>
            <th><?= _('Treffer') ?></th>
            <th><?= _('Datum') ?></th>
        </tr>
        </thead>
        <tbody>
        <? foreach ($pages as $page_id => $pagedata) : ?>
            <tr>
                <td>
                    <?
                    sort($pagedata['versions'], SORT_NUMERIC);
                    $pagedata['versions'] = array_reverse($pagedata['versions']);
                    if ($pagedata['is_in_content']) {
                        $content = $pagedata['page']->content;
                    } else if ($pagedata['is_in_history']) {
                        $version = WikiVersion::find($pagedata['versions'][0]);
                        $content = $version->content;
                    }
                    ?>
                    <a href="<?= $pagedata['is_in_content'] || $pagedata['is_in_name']
                        ? $controller->page($page_id)
                        : $controller->version($version) ?>">
                        <?= htmlReady($pagedata['page']->name) ?>
                        <? if (!$pagedata['is_in_content'] && !$pagedata['is_in_name']) : ?>
                            <span><?= _('Nur in alter Version der Seite enthalten.') ?></span>
                        <? endif ?>
                    </a>
                </td>
                <td>
                    <?
                    $content = Studip\Markup::removeHtml($content);
Jan-Hendrik Willms's avatar
Jan-Hendrik Willms committed
                    $ignore_next_hits = 0;
                    $offset  = 0;
                    $output  = [];

                    // find all occurences
                    while ($offset < mb_strlen($content)) {
                        $pos = mb_stripos($content, Request::get('search'), $offset);
                        if ($pos === false) {
                            break;
                        }
                        $offset = $pos + 1;
Jan-Hendrik Willms's avatar
Jan-Hendrik Willms committed
                        if ($ignore_next_hits-- > 0) {
                            // if more than one occurence is found
                            // in a fragment to be displayed,
                            // the fragment is only shown once
                            continue;
                        }
                        // show max 80 chars
                        $fragment       = '';
                        $split_fragment = preg_split('/(' . preg_quote(Request::get('search'), '/') . ')/i', mb_substr($content, max(0, $pos - 40), 80), -1, PREG_SPLIT_DELIM_CAPTURE);
                        for ($i = 0; $i < count($split_fragment); ++$i) {
                            if ($i % 2) {
                                $fragment .= '<span class="wiki_highlight">';
                                $fragment .= htmlready($split_fragment[$i], false);
                                $fragment .= '</span>';
                            } else {
                                $fragment .= htmlready($split_fragment[$i], false);
                            }
                        }
                        $found_in_fragment = (count($split_fragment) - 1) / 2; // number of hits in fragment
                        $ignore_next_hits  = ($found_in_fragment > 1) ? $found_in_fragment - 1 : 0;
                        $output[]          = "..." . $fragment . "...";
                    }
                    if ($pagedata['is_in_name']) {
                        $name = str_ireplace(Request::get('search'), '<span class="wiki_highlight">' . htmlReady(Request::get('search')) . '</span>', htmlReady($pagedata['page']->name));
                        array_unshift($output, sprintf(_('Treffer im Namen: %s'), $name));
                    } else if ($pagedata['is_in_old_name']) {
                        $name = str_ireplace(Request::get('search'), '<span class="wiki_highlight">' . htmlReady(Request::get('search')) . '</span>', htmlReady($version->name));
                        array_unshift($output, sprintf(_('Treffer in alten Namen: %s'), $name));
                    }
                    echo implode('<br>', $output);
                    ?>
                </td>
                <td>
                    <? if ($pagedata['is_in_content'] || $pagedata['is_in_name']) : ?>
                        <?= _('Aktuelle Version') . ': ' . ($pagedata['page']->chdate ? date('d.m.Y H:i:s', $pagedata['page']->chdate) : _('unbekannt')) ?>
                    <? else : ?>
David Siegfried's avatar
David Siegfried committed
                        <?= $version->mkdate > 0 ? date('d.m.Y H:i:s', $version->mkdate) : _('unbekannt') ?>
                    <? endif ?>
                </td>
            </tr>
Rasmus Fuhse's avatar
Rasmus Fuhse committed
            <? if ($pagedata['is_in_history'] && count($pagedata['versions']) > 1 || ($pagedata['is_in_content'] && count($pagedata['versions']) > 0)) : ?>
            <tr>
                <td colspan="3">
                    <a href="<?= $controller->searchpage($page_id, ['search' => Request::get('search')]) ?>">
                        <?= Icon::create('add')->asImg(['class' => 'text-bottom']) ?>
                        <? if (count($pagedata['versions']) === 1) : ?>
                            <?= _('Weiterer Treffer in einer älteren Version.') ?>
                        <? else : ?>
                            <?= sprintf(_('Weitere Treffer in %d älteren Versionen.'), count($pagedata['versions'])) ?>
                        <? endif ?>
                    </a>
                </td>
            </tr>
            <? endif ?>
        <? endforeach ?>
        </tbody>
    </table>
<? else : ?>
    <?= MessageBox::info(sprintf(_('Ihre Suche nach <em>%s</em> ergab keine Treffer.'), htmlReady(Request::get('search')))) ?>
<? endif ?>