Pagestats

Ein DokuWiki Plugin um dir die gesamt Anzahl an Seiten und Mediainhalten anzuzeigen und den Speicherverbrauch dieser.

Ich wollte in meinem Privaten Wiki eine Übersicht über die aktuell vorhanden Seiten und den Speicherverbrauch. Einfach als kleine Spielerei. DokuWiki bietet zwar die Möglichkeit das irgendwo in den Einstellungen anzuzeigen ich wollte es aber in eine Seite direkt einbinden können. So ist dieses Plugin entstanden.

Schaue es dir auch auf GitHub an: weiter zu Git.

action.php:

<?php
/**
 * DokuWiki Plugin pagestats (Action Component)
 * Counts the number of pages and media files and calculates their total size.
 */

if (!defined('DOKU_INC')) die();

class action_plugin_pagestats extends DokuWiki_Action_Plugin {

    public function register(Doku_Event_Handler $controller) {
        $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'add_stats_to_page');
    }

    public function add_stats_to_page(Doku_Event $event, $param) {
        $dataPathPages = DOKU_INC . 'data/pages';
        $dataPathMedia = DOKU_INC . 'data/media';

        $stats = [
            'pagestatspage' => $this->countFiles($dataPathPages, 'txt'),
            'pagestatsmb' => $this->calculateSize($dataPathPages, 'txt'),
            'mediastatspage' => $this->countFiles($dataPathMedia, ''),
            'mediastatsmb' => $this->calculateSize($dataPathMedia, '')
        ];

        foreach ($stats as $name => $value) {
            $event->data['meta'][] = ['name' => $name, 'content' => $value];
        }
    }

    private function countFiles($path, $extension) {
        if (!is_dir($path)) return 0;

        $count = 0;
        $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));
        foreach ($iterator as $file) {
            if ($file->isFile() && ($extension === '' || $file->getExtension() === $extension)) {
                $count++;
            }
        }

        return $count;
    }

    private function calculateSize($path, $extension) {
        if (!is_dir($path)) return 0;

        $totalSize = 0;
        $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));
        foreach ($iterator as $file) {
            if ($file->isFile() && ($extension === '' || $file->getExtension() === $extension)) {
                $totalSize += $file->getSize();
            }
        }

        return round($totalSize / (1024 * 1024), 2); // In MB
    }
}

syntax.php:

<?php
/**
 * DokuWiki Plugin pagestats (Syntax Component)
 * Allows using ~~PAGESTATSPAGE~~, ~~PAGESTATSMB~~, ~~MEDIASTATSPAGE~~, and ~~MEDIASTATSMB~~ to display stats.
 */

if (!defined('DOKU_INC')) die();

class syntax_plugin_pagestats extends DokuWiki_Syntax_Plugin {

    public function getType() {
        return 'substition';
    }

    public function getSort() {
        return 999;
    }

    public function connectTo($mode) {
        $this->Lexer->addSpecialPattern('~~PAGESTATSPAGE~~', $mode, 'plugin_pagestats');
        $this->Lexer->addSpecialPattern('~~PAGESTATSMB~~', $mode, 'plugin_pagestats');
        $this->Lexer->addSpecialPattern('~~MEDIASTATSPAGE~~', $mode, 'plugin_pagestats');
        $this->Lexer->addSpecialPattern('~~MEDIASTATSMB~~', $mode, 'plugin_pagestats');
    }

    public function handle($match, $state, $pos, Doku_Handler $handler) {
        return trim($match, '~'); // Gibt die genaue Syntax zurück
    }

public function render($mode, Doku_Renderer $renderer, $data) {
    if ($mode !== 'xhtml') return false;

    $dataPathPages = DOKU_INC . 'data/pages';
    $dataPathMedia = DOKU_INC . 'data/media';

    $stats = [
        'PAGESTATSPAGE' => $this->countFiles($dataPathPages, 'txt'),
        'PAGESTATSMB' => $this->calculateSize($dataPathPages, 'txt'),
        'MEDIASTATSPAGE' => $this->countFiles($dataPathMedia, ''),
        'MEDIASTATSMB' => $this->calculateSize($dataPathMedia, '')
    ];

    if (isset($stats[$data])) {
        // Zahl direkt ausgeben
        $value = $stats[$data];

        // "MB" bei Speicherangaben anhängen
        if (in_array($data, ['PAGESTATSMB', 'MEDIASTATSMB'])) {
            $value .= " MB";
        }

        // Ausgabe in den Renderer einfügen
        $renderer->doc .= hsc($value);
    }

    return true;
}

    private function countFiles($path, $extension) {
        if (!is_dir($path)) return 0;

        $count = 0;
        $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));
        foreach ($iterator as $file) {
            if ($file->isFile() && ($extension === '' || $file->getExtension() === $extension)) {
                $count++;
            }
        }

        return $count;
    }

    private function calculateSize($path, $extension) {
        if (!is_dir($path)) return 0;

        $totalSize = 0;
        $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));
        foreach ($iterator as $file) {
            if ($file->isFile() && ($extension === '' || $file->getExtension() === $extension)) {
                $totalSize += $file->getSize();
            }
        }

        return round($totalSize / (1024 * 1024), 2); // In MB
    }
}

plugin.info.txt

base pagestats
author Hei3enberg
email contact@hei3enberg.com
date 2024-11-24
name Page Stats Plugin
desc Displays the number of pages, media files, and their storage usage in the wiki.
url https://github.com/Hei3enberg/pagestats
version 1.2.0