11caeb00aSHarry Fuecks#!/usr/bin/php -d short_open_tag=on 21caeb00aSHarry Fuecks<?php 31caeb00aSHarry Fuecks#------------------------------------------------------------------------------ 4*840583dcSAndreas Gohrini_set('memory_limit','128M'); 51caeb00aSHarry Fuecksif(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../').'/'); 61caeb00aSHarry Fuecksrequire_once DOKU_INC.'inc/init.php'; 71caeb00aSHarry Fuecksrequire_once DOKU_INC.'inc/common.php'; 81caeb00aSHarry Fuecksrequire_once DOKU_INC.'inc/search.php'; 91caeb00aSHarry Fuecksrequire_once DOKU_INC.'inc/cliopts.php'; 101caeb00aSHarry Fuecks 111caeb00aSHarry Fuecks#------------------------------------------------------------------------------ 121caeb00aSHarry Fuecksfunction usage() { 131caeb00aSHarry Fuecks print "Usage: wantedpages.php [wiki:namespace] 141caeb00aSHarry Fuecks 151caeb00aSHarry Fuecks Outputs a list of wanted pages (pages which have 161caeb00aSHarry Fuecks internal links but do not yet exist). 171caeb00aSHarry Fuecks 181caeb00aSHarry Fuecks If the optional [wiki:namespace] is not provided, 191caeb00aSHarry Fuecks defaults to the root wiki namespace 201caeb00aSHarry Fuecks 211caeb00aSHarry Fuecks OPTIONS 22*840583dcSAndreas Gohr -h, --help get help 231caeb00aSHarry Fuecks"; 241caeb00aSHarry Fuecks} 251caeb00aSHarry Fuecks 261caeb00aSHarry Fuecks#------------------------------------------------------------------------------ 271caeb00aSHarry Fuecksdefine ('DW_DIR_CONTINUE',1); 281caeb00aSHarry Fuecksdefine ('DW_DIR_NS',2); 291caeb00aSHarry Fuecksdefine ('DW_DIR_PAGE',3); 301caeb00aSHarry Fuecks 311caeb00aSHarry Fuecks#------------------------------------------------------------------------------ 321caeb00aSHarry Fuecksfunction dw_dir_filter($entry, $basepath) { 331caeb00aSHarry Fuecks if ($entry == '.' || $entry == '..' ) { 341caeb00aSHarry Fuecks return DW_DIR_CONTINUE; 351caeb00aSHarry Fuecks } 361caeb00aSHarry Fuecks if ( is_dir($basepath . '/' . $entry) ) { 371caeb00aSHarry Fuecks if ( strpos($entry, '_') === 0 ) { 381caeb00aSHarry Fuecks return DW_DIR_CONTINUE; 391caeb00aSHarry Fuecks } 401caeb00aSHarry Fuecks return DW_DIR_NS; 411caeb00aSHarry Fuecks } 421caeb00aSHarry Fuecks if ( preg_match('/\.txt$/',$entry) ) { 431caeb00aSHarry Fuecks return DW_DIR_PAGE; 441caeb00aSHarry Fuecks } 451caeb00aSHarry Fuecks return DW_DIR_CONTINUE; 461caeb00aSHarry Fuecks} 471caeb00aSHarry Fuecks 481caeb00aSHarry Fuecks#------------------------------------------------------------------------------ 491caeb00aSHarry Fuecksfunction dw_get_pages($dir) { 501caeb00aSHarry Fuecks static $trunclen = NULL; 511caeb00aSHarry Fuecks if ( !$trunclen ) { 521caeb00aSHarry Fuecks global $conf; 531caeb00aSHarry Fuecks $trunclen = strlen($conf['datadir'].':'); 541caeb00aSHarry Fuecks } 551caeb00aSHarry Fuecks 561caeb00aSHarry Fuecks if ( !is_dir($dir) ) { 571caeb00aSHarry Fuecks fwrite( STDERR, "Unable to read directory $dir\n"); 581caeb00aSHarry Fuecks exit(1); 591caeb00aSHarry Fuecks } 601caeb00aSHarry Fuecks 611caeb00aSHarry Fuecks $pages = array(); 621caeb00aSHarry Fuecks $dh = opendir($dir); 631caeb00aSHarry Fuecks while ( FALSE !== ( $entry = readdir($dh) ) ) { 641caeb00aSHarry Fuecks $status = dw_dir_filter($entry, $dir); 651caeb00aSHarry Fuecks if ( $status == DW_DIR_CONTINUE ) { 661caeb00aSHarry Fuecks continue; 671caeb00aSHarry Fuecks } else if ( $status == DW_DIR_NS ) { 681caeb00aSHarry Fuecks $pages = array_merge($pages, dw_get_pages($dir . '/' . $entry)); 691caeb00aSHarry Fuecks } else { 701caeb00aSHarry Fuecks $page = array( 71*840583dcSAndreas Gohr 'id' => pathID(substr($dir.'/'.$entry,$trunclen)), 721caeb00aSHarry Fuecks 'file'=> $dir.'/'.$entry, 731caeb00aSHarry Fuecks ); 741caeb00aSHarry Fuecks $pages[] = $page; 751caeb00aSHarry Fuecks } 761caeb00aSHarry Fuecks } 771caeb00aSHarry Fuecks closedir($dh); 781caeb00aSHarry Fuecks return $pages; 791caeb00aSHarry Fuecks} 801caeb00aSHarry Fuecks 811caeb00aSHarry Fuecks#------------------------------------------------------------------------------ 821caeb00aSHarry Fuecksfunction dw_internal_links($page) { 831caeb00aSHarry Fuecks global $conf; 841caeb00aSHarry Fuecks $instructions = p_get_instructions(file_get_contents($page['file'])); 851caeb00aSHarry Fuecks $links = array(); 861caeb00aSHarry Fuecks $cns = getNS($page['id']); 871caeb00aSHarry Fuecks $exists = FALSE; 881caeb00aSHarry Fuecks foreach($instructions as $ins){ 891caeb00aSHarry Fuecks if($ins[0] == 'internallink' || ($conf['camelcase'] && $ins[0] == 'camelcaselink') ){ 901caeb00aSHarry Fuecks $mid = $ins[1][0]; 911caeb00aSHarry Fuecks resolve_pageid($cns,$mid,$exists); 921caeb00aSHarry Fuecks if ( !$exists ) { 93*840583dcSAndreas Gohr list($mid) = explode('#',$mid); //record pages without hashs 941caeb00aSHarry Fuecks $links[] = $mid; 951caeb00aSHarry Fuecks } 961caeb00aSHarry Fuecks } 971caeb00aSHarry Fuecks } 981caeb00aSHarry Fuecks return $links; 991caeb00aSHarry Fuecks} 1001caeb00aSHarry Fuecks 1011caeb00aSHarry Fuecks#------------------------------------------------------------------------------ 1021caeb00aSHarry Fuecks$OPTS = Doku_Cli_Opts::getOptions(__FILE__,'h',array('help')); 1031caeb00aSHarry Fuecks 1041caeb00aSHarry Fuecksif ( $OPTS->isError() ) { 1051caeb00aSHarry Fuecks fwrite( STDERR, $OPTS->getMessage() . "\n"); 1061caeb00aSHarry Fuecks exit(1); 1071caeb00aSHarry Fuecks} 1081caeb00aSHarry Fuecks 1091caeb00aSHarry Fuecksif ( $OPTS->has('h') or $OPTS->has('help') ) { 1101caeb00aSHarry Fuecks usage(); 1111caeb00aSHarry Fuecks exit(0); 1121caeb00aSHarry Fuecks} 1131caeb00aSHarry Fuecks 1141caeb00aSHarry Fuecks$START_DIR = $conf['datadir']; 1151caeb00aSHarry Fuecks 1161caeb00aSHarry Fuecksif ( $OPTS->numArgs() == 1 ) { 1171caeb00aSHarry Fuecks $START_DIR .= '/' . $OPTS->arg(0); 1181caeb00aSHarry Fuecks} 1191caeb00aSHarry Fuecks 1201caeb00aSHarry Fuecks#------------------------------------------------------------------------------ 1211caeb00aSHarry Fuecks$WANTED_PAGES = array(); 122*840583dcSAndreas Gohr 1231caeb00aSHarry Fuecksforeach ( dw_get_pages($START_DIR) as $WIKI_PAGE ) { 1241caeb00aSHarry Fuecks $WANTED_PAGES = array_merge($WANTED_PAGES,dw_internal_links($WIKI_PAGE)); 1251caeb00aSHarry Fuecks} 1261caeb00aSHarry Fuecks$WANTED_PAGES = array_unique($WANTED_PAGES); 1271caeb00aSHarry Fueckssort($WANTED_PAGES); 1281caeb00aSHarry Fuecks 1291caeb00aSHarry Fuecksforeach ( $WANTED_PAGES as $WANTED_PAGE ) { 1301caeb00aSHarry Fuecks print $WANTED_PAGE."\n"; 1311caeb00aSHarry Fuecks} 1321caeb00aSHarry Fuecksexit(0); 133