xref: /dokuwiki/bin/wantedpages.php (revision 1caeb00a5a0b9894a582514ef385b71cab195092)
1*1caeb00aSHarry Fuecks#!/usr/bin/php -d short_open_tag=on
2*1caeb00aSHarry Fuecks<?php
3*1caeb00aSHarry Fuecks#------------------------------------------------------------------------------
4*1caeb00aSHarry Fuecksif(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../').'/');
5*1caeb00aSHarry Fuecksrequire_once DOKU_INC.'inc/init.php';
6*1caeb00aSHarry Fuecksrequire_once DOKU_INC.'inc/common.php';
7*1caeb00aSHarry Fuecksrequire_once DOKU_INC.'inc/search.php';
8*1caeb00aSHarry Fuecksrequire_once DOKU_INC.'inc/cliopts.php';
9*1caeb00aSHarry Fuecks
10*1caeb00aSHarry Fuecks#------------------------------------------------------------------------------
11*1caeb00aSHarry Fuecksfunction usage() {
12*1caeb00aSHarry Fuecks    print "Usage: wantedpages.php [wiki:namespace]
13*1caeb00aSHarry Fuecks
14*1caeb00aSHarry Fuecks    Outputs a list of wanted pages (pages which have
15*1caeb00aSHarry Fuecks    internal links but do not yet exist).
16*1caeb00aSHarry Fuecks
17*1caeb00aSHarry Fuecks    If the optional [wiki:namespace] is not provided,
18*1caeb00aSHarry Fuecks    defaults to the root wiki namespace
19*1caeb00aSHarry Fuecks
20*1caeb00aSHarry Fuecks    OPTIONS
21*1caeb00aSHarry Fuecks        -h, --help=<action>: get help
22*1caeb00aSHarry Fuecks";
23*1caeb00aSHarry Fuecks}
24*1caeb00aSHarry Fuecks
25*1caeb00aSHarry Fuecks#------------------------------------------------------------------------------
26*1caeb00aSHarry Fuecksdefine ('DW_DIR_CONTINUE',1);
27*1caeb00aSHarry Fuecksdefine ('DW_DIR_NS',2);
28*1caeb00aSHarry Fuecksdefine ('DW_DIR_PAGE',3);
29*1caeb00aSHarry Fuecks
30*1caeb00aSHarry Fuecks#------------------------------------------------------------------------------
31*1caeb00aSHarry Fuecksfunction dw_dir_filter($entry, $basepath) {
32*1caeb00aSHarry Fuecks    if ($entry == '.' || $entry == '..' ) {
33*1caeb00aSHarry Fuecks        return DW_DIR_CONTINUE;
34*1caeb00aSHarry Fuecks    }
35*1caeb00aSHarry Fuecks    if ( is_dir($basepath . '/' . $entry) ) {
36*1caeb00aSHarry Fuecks        if ( strpos($entry, '_') === 0 ) {
37*1caeb00aSHarry Fuecks            return DW_DIR_CONTINUE;
38*1caeb00aSHarry Fuecks        }
39*1caeb00aSHarry Fuecks        return DW_DIR_NS;
40*1caeb00aSHarry Fuecks    }
41*1caeb00aSHarry Fuecks    if ( preg_match('/\.txt$/',$entry) ) {
42*1caeb00aSHarry Fuecks        return DW_DIR_PAGE;
43*1caeb00aSHarry Fuecks    }
44*1caeb00aSHarry Fuecks    return DW_DIR_CONTINUE;
45*1caeb00aSHarry Fuecks}
46*1caeb00aSHarry Fuecks
47*1caeb00aSHarry Fuecks#------------------------------------------------------------------------------
48*1caeb00aSHarry Fuecksfunction dw_get_pages($dir) {
49*1caeb00aSHarry Fuecks    static $trunclen = NULL;
50*1caeb00aSHarry Fuecks    if ( !$trunclen ) {
51*1caeb00aSHarry Fuecks        global $conf;
52*1caeb00aSHarry Fuecks        $trunclen = strlen($conf['datadir'].':');
53*1caeb00aSHarry Fuecks    }
54*1caeb00aSHarry Fuecks
55*1caeb00aSHarry Fuecks    if ( !is_dir($dir) ) {
56*1caeb00aSHarry Fuecks        fwrite( STDERR, "Unable to read directory $dir\n");
57*1caeb00aSHarry Fuecks        exit(1);
58*1caeb00aSHarry Fuecks    }
59*1caeb00aSHarry Fuecks
60*1caeb00aSHarry Fuecks    $pages = array();
61*1caeb00aSHarry Fuecks    $dh = opendir($dir);
62*1caeb00aSHarry Fuecks    while ( FALSE !== ( $entry = readdir($dh) ) ) {
63*1caeb00aSHarry Fuecks        $status = dw_dir_filter($entry, $dir);
64*1caeb00aSHarry Fuecks        if ( $status == DW_DIR_CONTINUE ) {
65*1caeb00aSHarry Fuecks            continue;
66*1caeb00aSHarry Fuecks        } else if ( $status == DW_DIR_NS ) {
67*1caeb00aSHarry Fuecks            $pages = array_merge($pages, dw_get_pages($dir . '/' . $entry));
68*1caeb00aSHarry Fuecks        } else {
69*1caeb00aSHarry Fuecks            $page = array(
70*1caeb00aSHarry Fuecks                'id'=>substr(pathID($dir . '/' . $entry),$trunclen),
71*1caeb00aSHarry Fuecks                'file'=>$dir . '/' . $entry,
72*1caeb00aSHarry Fuecks                );
73*1caeb00aSHarry Fuecks            $pages[] = $page;
74*1caeb00aSHarry Fuecks        }
75*1caeb00aSHarry Fuecks    }
76*1caeb00aSHarry Fuecks    closedir($dh);
77*1caeb00aSHarry Fuecks    return $pages;
78*1caeb00aSHarry Fuecks}
79*1caeb00aSHarry Fuecks
80*1caeb00aSHarry Fuecks#------------------------------------------------------------------------------
81*1caeb00aSHarry Fuecksfunction dw_internal_links($page) {
82*1caeb00aSHarry Fuecks    global $conf;
83*1caeb00aSHarry Fuecks    $instructions = p_get_instructions(file_get_contents($page['file']));
84*1caeb00aSHarry Fuecks    $links = array();
85*1caeb00aSHarry Fuecks    $cns = getNS($page['id']);
86*1caeb00aSHarry Fuecks    $exists = FALSE;
87*1caeb00aSHarry Fuecks    foreach($instructions as $ins){
88*1caeb00aSHarry Fuecks        if($ins[0] == 'internallink' || ($conf['camelcase'] && $ins[0] == 'camelcaselink') ){
89*1caeb00aSHarry Fuecks            $mid = $ins[1][0];
90*1caeb00aSHarry Fuecks            resolve_pageid($cns,$mid,$exists);
91*1caeb00aSHarry Fuecks            if ( !$exists ) {
92*1caeb00aSHarry Fuecks                $links[] = $mid;
93*1caeb00aSHarry Fuecks            }
94*1caeb00aSHarry Fuecks        }
95*1caeb00aSHarry Fuecks    }
96*1caeb00aSHarry Fuecks    return $links;
97*1caeb00aSHarry Fuecks}
98*1caeb00aSHarry Fuecks
99*1caeb00aSHarry Fuecks#------------------------------------------------------------------------------
100*1caeb00aSHarry Fuecks$OPTS = Doku_Cli_Opts::getOptions(__FILE__,'h',array('help'));
101*1caeb00aSHarry Fuecks
102*1caeb00aSHarry Fuecksif ( $OPTS->isError() ) {
103*1caeb00aSHarry Fuecks    fwrite( STDERR, $OPTS->getMessage() . "\n");
104*1caeb00aSHarry Fuecks    exit(1);
105*1caeb00aSHarry Fuecks}
106*1caeb00aSHarry Fuecks
107*1caeb00aSHarry Fuecksif ( $OPTS->has('h') or $OPTS->has('help') ) {
108*1caeb00aSHarry Fuecks    usage();
109*1caeb00aSHarry Fuecks    exit(0);
110*1caeb00aSHarry Fuecks}
111*1caeb00aSHarry Fuecks
112*1caeb00aSHarry Fuecks$START_DIR = $conf['datadir'];
113*1caeb00aSHarry Fuecks
114*1caeb00aSHarry Fuecksif ( $OPTS->numArgs() == 1 ) {
115*1caeb00aSHarry Fuecks    $START_DIR .= '/' . $OPTS->arg(0);
116*1caeb00aSHarry Fuecks}
117*1caeb00aSHarry Fuecks
118*1caeb00aSHarry Fuecks#------------------------------------------------------------------------------
119*1caeb00aSHarry Fuecks$WANTED_PAGES = array();
120*1caeb00aSHarry Fuecksforeach ( dw_get_pages($START_DIR) as $WIKI_PAGE ) {
121*1caeb00aSHarry Fuecks    $WANTED_PAGES = array_merge($WANTED_PAGES,dw_internal_links($WIKI_PAGE));
122*1caeb00aSHarry Fuecks}
123*1caeb00aSHarry Fuecks$WANTED_PAGES = array_unique($WANTED_PAGES);
124*1caeb00aSHarry Fueckssort($WANTED_PAGES);
125*1caeb00aSHarry Fuecks
126*1caeb00aSHarry Fuecksforeach ( $WANTED_PAGES as $WANTED_PAGE ) {
127*1caeb00aSHarry Fuecks    print $WANTED_PAGE."\n";
128*1caeb00aSHarry Fuecks}
129*1caeb00aSHarry Fuecksexit(0);
130