xref: /dokuwiki/bin/wantedpages.php (revision 1c36b3d86f90185519cadaad85251922dc771fe1)
150b78159SElan Ruusamäe#!/usr/bin/php
21caeb00aSHarry Fuecks<?php
31caeb00aSHarry Fuecksif(!defined('DOKU_INC')) define('DOKU_INC', realpath(dirname(__FILE__).'/../').'/');
4e8bb93a5SAndreas Gohrdefine('NOSESSION', 1);
5e8bb93a5SAndreas Gohrrequire_once(DOKU_INC.'inc/init.php');
61caeb00aSHarry Fuecks
7*1c36b3d8SAndreas Gohr/**
8*1c36b3d8SAndreas Gohr * Find wanted pages
9*1c36b3d8SAndreas Gohr */
10e8bb93a5SAndreas Gohrclass WantedPagesCLI extends DokuCLI {
111caeb00aSHarry Fuecks
12e8bb93a5SAndreas Gohr    const DIR_CONTINUE = 1;
13e8bb93a5SAndreas Gohr    const DIR_NS       = 2;
14e8bb93a5SAndreas Gohr    const DIR_PAGE     = 3;
151caeb00aSHarry Fuecks
16e8bb93a5SAndreas Gohr    /**
17e8bb93a5SAndreas Gohr     * Register options and arguments on the given $options object
18e8bb93a5SAndreas Gohr     *
19e8bb93a5SAndreas Gohr     * @param DokuCLI_Options $options
20e8bb93a5SAndreas Gohr     * @return void
21e8bb93a5SAndreas Gohr     */
22e8bb93a5SAndreas Gohr    protected function setup(DokuCLI_Options $options) {
23e8bb93a5SAndreas Gohr        $options->setHelp(
24e8bb93a5SAndreas Gohr            'Outputs a list of wanted pages (pages which have internal links but do not yet exist).'
25e8bb93a5SAndreas Gohr        );
26e8bb93a5SAndreas Gohr        $options->registerArgument(
27e8bb93a5SAndreas Gohr            'namespace',
28e8bb93a5SAndreas Gohr            'The namespace to lookup. Defaults to root namespace',
29e8bb93a5SAndreas Gohr            false
30e8bb93a5SAndreas Gohr        );
311caeb00aSHarry Fuecks    }
321caeb00aSHarry Fuecks
33e8bb93a5SAndreas Gohr    /**
34e8bb93a5SAndreas Gohr     * Your main program
35e8bb93a5SAndreas Gohr     *
36e8bb93a5SAndreas Gohr     * Arguments and options have been parsed when this is run
37e8bb93a5SAndreas Gohr     *
38e8bb93a5SAndreas Gohr     * @param DokuCLI_Options $options
39e8bb93a5SAndreas Gohr     * @return void
40e8bb93a5SAndreas Gohr     */
41e8bb93a5SAndreas Gohr    protected function main(DokuCLI_Options $options) {
421caeb00aSHarry Fuecks
43e8bb93a5SAndreas Gohr        if($options->args) {
44e8bb93a5SAndreas Gohr            $startdir = dirname(wikiFN($options->args[0].':xxx'));
45e8bb93a5SAndreas Gohr        } else {
46e8bb93a5SAndreas Gohr            $startdir = dirname(wikiFN('xxx'));
47e8bb93a5SAndreas Gohr        }
48e8bb93a5SAndreas Gohr
49e8bb93a5SAndreas Gohr        $this->info("searching $startdir");
50e8bb93a5SAndreas Gohr
51e8bb93a5SAndreas Gohr        $wanted_pages = array();
52e8bb93a5SAndreas Gohr
53e8bb93a5SAndreas Gohr        foreach($this->get_pages($startdir) as $page) {
54e8bb93a5SAndreas Gohr            $wanted_pages = array_merge($wanted_pages, $this->internal_links($page));
55e8bb93a5SAndreas Gohr        }
56e8bb93a5SAndreas Gohr        $wanted_pages = array_unique($wanted_pages);
57e8bb93a5SAndreas Gohr        sort($wanted_pages);
58e8bb93a5SAndreas Gohr
59e8bb93a5SAndreas Gohr        foreach($wanted_pages as $page) {
60e8bb93a5SAndreas Gohr            print $page."\n";
61e8bb93a5SAndreas Gohr        }
62e8bb93a5SAndreas Gohr    }
63e8bb93a5SAndreas Gohr
64e8bb93a5SAndreas Gohr    protected function dir_filter($entry, $basepath) {
651caeb00aSHarry Fuecks        if($entry == '.' || $entry == '..') {
66e8bb93a5SAndreas Gohr            return WantedPagesCLI::DIR_CONTINUE;
671caeb00aSHarry Fuecks        }
681caeb00aSHarry Fuecks        if(is_dir($basepath.'/'.$entry)) {
691caeb00aSHarry Fuecks            if(strpos($entry, '_') === 0) {
70e8bb93a5SAndreas Gohr                return WantedPagesCLI::DIR_CONTINUE;
711caeb00aSHarry Fuecks            }
72e8bb93a5SAndreas Gohr            return WantedPagesCLI::DIR_NS;
731caeb00aSHarry Fuecks        }
741caeb00aSHarry Fuecks        if(preg_match('/\.txt$/', $entry)) {
75e8bb93a5SAndreas Gohr            return WantedPagesCLI::DIR_PAGE;
761caeb00aSHarry Fuecks        }
77e8bb93a5SAndreas Gohr        return WantedPagesCLI::DIR_CONTINUE;
781caeb00aSHarry Fuecks    }
791caeb00aSHarry Fuecks
80e8bb93a5SAndreas Gohr    protected function get_pages($dir) {
810ea51e63SMatt Perry        static $trunclen = null;
821caeb00aSHarry Fuecks        if(!$trunclen) {
831caeb00aSHarry Fuecks            global $conf;
841caeb00aSHarry Fuecks            $trunclen = strlen($conf['datadir'].':');
851caeb00aSHarry Fuecks        }
861caeb00aSHarry Fuecks
871caeb00aSHarry Fuecks        if(!is_dir($dir)) {
88e8bb93a5SAndreas Gohr            throw new DokuCLI_Exception("Unable to read directory $dir");
891caeb00aSHarry Fuecks        }
901caeb00aSHarry Fuecks
911caeb00aSHarry Fuecks        $pages = array();
921caeb00aSHarry Fuecks        $dh    = opendir($dir);
9344881bd0Shenning.noren        while(false !== ($entry = readdir($dh))) {
94e8bb93a5SAndreas Gohr            $status = $this->dir_filter($entry, $dir);
95e8bb93a5SAndreas Gohr            if($status == WantedPagesCLI::DIR_CONTINUE) {
961caeb00aSHarry Fuecks                continue;
97e8bb93a5SAndreas Gohr            } else if($status == WantedPagesCLI::DIR_NS) {
98e8bb93a5SAndreas Gohr                $pages = array_merge($pages, $this->get_pages($dir.'/'.$entry));
991caeb00aSHarry Fuecks            } else {
1001caeb00aSHarry Fuecks                $page    = array(
101840583dcSAndreas Gohr                    'id'   => pathID(substr($dir.'/'.$entry, $trunclen)),
1021caeb00aSHarry Fuecks                    'file' => $dir.'/'.$entry,
1031caeb00aSHarry Fuecks                );
1041caeb00aSHarry Fuecks                $pages[] = $page;
1051caeb00aSHarry Fuecks            }
1061caeb00aSHarry Fuecks        }
1071caeb00aSHarry Fuecks        closedir($dh);
1081caeb00aSHarry Fuecks        return $pages;
1091caeb00aSHarry Fuecks    }
1101caeb00aSHarry Fuecks
111e8bb93a5SAndreas Gohr    function internal_links($page) {
1121caeb00aSHarry Fuecks        global $conf;
1131caeb00aSHarry Fuecks        $instructions = p_get_instructions(file_get_contents($page['file']));
1141caeb00aSHarry Fuecks        $links        = array();
1151caeb00aSHarry Fuecks        $cns          = getNS($page['id']);
11644881bd0Shenning.noren        $exists       = false;
1171caeb00aSHarry Fuecks        foreach($instructions as $ins) {
1181caeb00aSHarry Fuecks            if($ins[0] == 'internallink' || ($conf['camelcase'] && $ins[0] == 'camelcaselink')) {
1191caeb00aSHarry Fuecks                $mid = $ins[1][0];
1201caeb00aSHarry Fuecks                resolve_pageid($cns, $mid, $exists);
1211caeb00aSHarry Fuecks                if(!$exists) {
122840583dcSAndreas Gohr                    list($mid) = explode('#', $mid); //record pages without hashs
1231caeb00aSHarry Fuecks                    $links[] = $mid;
1241caeb00aSHarry Fuecks                }
1251caeb00aSHarry Fuecks            }
1261caeb00aSHarry Fuecks        }
1271caeb00aSHarry Fuecks        return $links;
1281caeb00aSHarry Fuecks    }
1291caeb00aSHarry Fuecks}
1301caeb00aSHarry Fuecks
131e8bb93a5SAndreas Gohr// Main
132e8bb93a5SAndreas Gohr$cli = new WantedPagesCLI();
133e8bb93a5SAndreas Gohr$cli->run();