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