links', '/\\A/e', # should be simply one match wherever - but is not :/ "FastBacklinksStore()" ); Markup( '(:backlinks:)', 'directives', '/\(:backlinks:\)/e', "FastBacklinksList()" ); SDV( $HandleActions['fastbacklinks'], 'FastBacklinksHandleA' ); SDV( $HandleAuth['fastbacklinks'], 'read' ); ## .............TODO: describe................. function FastBacklinksStore() { global $LinkTargets; global $pagename; static $invoked = 0; # invoke only once; TODO: should work as: invoke only once per wiki-page # ($FastBacklinksDontOversmart turns the 'invoke only once' behaviour off) if( !$pagename || ( $invoked && !$FastBacklinksDontOversmart ) ) return; else $invoked = 1; # TODO: how to check that the page's being saved at the moment? if( !$_POST['post'] && !$_POST['postedit'] ) return; $targets = array_keys( (array)$LinkTargets ); foreach( $targets as $t ) { # TODO: invoke Lock(something) here, and unlock again below! $backlinks = FastBacklinksRead( $t ); if( $backlinks ) $backlinks = @array_flip( $backlinks ); $backlinks[ $pagename . "\n" ] = '0'; # foobar value FastBacklinksWrite( $t, array_keys( $backlinks ) ); } } function FastBacklinksList() { global $pagename; # TODO: Lock() and unlock! $backlinks = FastBacklinksRead( $pagename ); sort( $backlinks ); $new_backlinks = array(); # Veryfying each backlink if it's page still points to us foreach( $backlinks as $link ) { $link = rtrim( $link ); # Check if the page still links to us $page = ReadPage( $link, READPAGE_CURRENT ); $page = $page['targets']; ## (TODO: the search below could be done faster.) // if( strpos( ','.$page.',' , ','.$pagename.',' ) !== false ) { //# Surprise: the commented version above is slower than the one below, not faster... $page = explode( ',', $page ); if( in_array( $pagename, $page ) ) { $new_backlinks[] = $link; $list .= '[[' . $link . "]]
\n"; } FastBacklinksWrite( $pagename, $new_backlinks ); } return $list; } ## FastBacklinksHandleA performs ?action=fastbacklinks. It's basically the same ## as ?action=browse, except it takes its contents from Site.FastBacklinks. ## Based on HandleSearchA() from scripts/pagelist.php, by Patrick Michaud. function FastBacklinksHandleA($pagename, $level = 'read') { global $FastBacklinksPageForm, $FmtV, $HandleFastBacklinksFmt, $PageStartFmt, $PageEndFmt; SDV($HandleFastBacklinksFmt,array(&$PageStartFmt, '$PageText', &$PageEndFmt)); $form = ReadPage(FmtPageName($FastBacklinksPageForm, $pagename), READPAGE_CURRENT); $text = @$form['text']; if (!$text) $text = '(:backlinks:)'; $FmtV['$PageText'] = MarkupToHTML($pagename,$text); PrintFmt($pagename, $HandleFastBacklinksFmt); } ## ## Helper functions. ## function FastBacklinksRead( $pagename ) { global $FastBacklinksDir; $fn = $FastBacklinksDir . '/' . $pagename; return (array)@file( $fn ); } function FastBacklinksWrite( $pagename, $backlinks ) { global $FastBacklinksDir; $fn = $FastBacklinksDir . '/' . $pagename; # Checking if "\n"s are in the array, or we should add them if( substr( $backlinks[0], -1 ) === "\n" ) $glue = ''; else $glue = "\n"; $h = fopen( $fn, 'w' ); if( !$h ) Abort( "Couldn't open $FastBacklinksDir/$pagename for writing in FastBacklinks.php!" ); fwrite( $h, implode( $glue, $backlinks ) . $glue ); fclose( $h ); fixperms( $fn ); }