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