Suggested change to the way the indexing function handles links

12 views
Skip to first unread message

DrunkenMonk

unread,
Oct 28, 2012, 11:38:06 AM10/28/12
to bolt...@googlegroups.com
Hej Dan, everyone

I was trying to get some functionality on an old site to work, and I realised I was having a problem with backlinks that's pretty easilly solved.

There is a discrepancy in the way the search function handles links (they are passed to BOLTpageshortcuts) and the way the indexing function handles them (they are not).

I got much better, more intuitive, results with some minor changes. I've included my code below, in case you are interested. I would class this as a bug fix, but I don't know if you would class the issue as a bug in the first place.

I tried to use your coding style as much as possible :/

The following is a change to BOLTindex:
---------------------------------------------------
// index links
    preg_match_all('/\[\[([^{}:&#|@\/\]]+)(\&|\#|\||\])/', $content, $links); 
    // filter and tidy links
    $linksArray = array_unique($links[1]);
    BOLTsetPageLink($p, $store);
    $linksArray = array_map('BOLTpageshortcuts', $linksArray);
    BOLTrevertPageLink($store);
    $linksArray = array_unique($linksArray); // refilter after pageshortcuts
    // done
    $mylinks = implode("<>", $linksArray);
    $mylinks = BOLTutf2url(str_replace('~', "$loginPages.", $mylinks));
----------------------------

Where I use the following helper functions to set the "current page":
--------------------------------
function BOLTsetPageLink($page, &$store) {
  global $pageLink, $pageArray;
  $store = array($pageLink, $pageArray);
  $pageLink = $page;
  $pageArray = explode('.', $page);
  }
function BOLTrevertPageLink($store) {
  global $pageLink, $pageArray;
  $pageLink = $store[0];
  $pageArray = $store[1];
  }
--------------------------------

It was nice to play around with some BW again. Good luck with 4.x!

The Editor

unread,
Nov 2, 2012, 4:00:35 PM11/2/12
to BoltWire
Yes, I suppose this is a bug. I'm wondering if it would be more efficient to simply add an optional basepage parameter to the pageshortcuts function, and use that within the pageshortcuts function when needed?  Seems it might be handy to have this functionality within the pageshortcuts function down the road. Could you test this out for me:

function BOLTpageshortcuts($link, $basepage='') {
## VARIOUS SHORTCUTS THAT CAN BE USED IN MISC WAYS TO MODIFY LINKS (OR PAGES IN COMMANDS).  USE LEADING .'S LIKE ..PAGE TO PRODUCE P1.P2.PAGE. USE + TIMESTAMP, ^ ID, ~ LOGIN, @ GROUP, ! ACTION, .. -> . (FOR OOPS), SPACE -> _ , & ENDING # IS THREAD
if (function_exists(myBOLTpageshortcuts)) return myBOLTpageshortcuts($link);
global $pageLink, $pageArray, $BOLTvar, $BOLTid, $BOLTtime;
if ($basepage != '') {
$myPage = $basepage;
$myArray = explode('.', $basepage);
}
else {
$myPage = $pageLink;
$myArray = $pageArray;
}
$BOLTloginPages = BOLTconfig('BOLTloginPages', 'login');
$BOLTgroupPages = BOLTconfig('BOLTgroupPages', 'group');
if ($link == '') return $myPage;
$link = str_replace('&amp;', '&', $link);
if (strpos($link, "/")) $link = str_replace("/", ".", $link);
$get = '';
if (strpos($link, '&') !== false) {
$get = substr($link, strpos($link, "&"));
$link = substr($link, 0, strpos($link, "&"));
}
if (substr($link, -1) == '#') {
$thread = true;
$link = substr($link, 0, -1);
}
if (strpos($link, '#') !== false) {
$anchor = '#' . BOLTutf2url(substr($link, strpos($link, "#") + 1));
$link = substr($link, 0, strpos($link, "#"));
}
$link = str_replace(' ', '_', $link);
if (BOLTconfig('BOLTutfpages', 'true') == 'true') $link = BOLTutf2url($link);
else $link = BOLTutf8_strip($link);
if (substr($link, 0, 1) == '=') $link = $myPage . '.' . substr($link, 1);
$link = strtolower(trim($link));
if (substr($link, 0, 1) == '.') {
$tempArray = $myArray;
$dots = strlen($link) - strlen(ltrim($link, '.'));
for ($i=0; $i<$dots; $i++) {
if (isset($tempArray[$i])) $temp .= $tempArray[$i] . '.';
}
$link = $temp . substr($link, $dots);
}
$rr1 = array('+','@','!','..',' ','^','~');
$rr2 = array($BOLTtime,"$BOLTgroupPages.",'action','.','_',$BOLTid,"$BOLTloginPages.");
$link = trim(str_replace($rr1, $rr2, $link), '.');
if ($thread) $link = $link . '.' . BOLTthread("$link.0");
return $link . $anchor . $get;
}

Then of course the index function would be:

// index links
preg_match_all('/\[\[(.*?)(\&|\#|\||\])/', $content, $links); 
foreach($links[1] as $pp) $outlinks[] = BOLTpageshortcuts($pp, $p);
$linksArray = array_unique($outlinks);
$mylinks = implode("<>", $linksArray);

A couple problems I see would be the + and # shortcuts but probably no way around that...

Also looks like there was a glitch in the $rr1 and $rr2 arrays. Supposed to be ~~ goes to viewers login page--but it conflicts with some things so I just deleted that. And I added dots to the action, login and group shortcuts (!,~,@) so now you can just do [[!edit]], [[~id]], [[@admin]] rather than [[!.edit]] [[~.id]] [[@.admin]]. This would be a change from existing systems but seems a better way to go...

Incidentally, I also changed markups.php around 524 to this:

if ($label == '') {
if (BOLTconfig('BOLTlinkTitles') == 'true') $label = '+';
else $label = BOLTpageshortcuts($link);  // slight change here to show proper links in display
}

Cheers,
Dan

P.S. Let me know if this works. I've just put into the core and this code on page test.index seems to works:

[[@admin]]
[[~caveman]]
[[.]]

{(index test.index)}

<(search link=group.admin)>
<(search link=login.caveman)>
<(search link=test)>





--
You received this message because you are subscribed to the Google Groups "BoltWire" group.
To view this discussion on the web visit https://groups.google.com/d/msg/boltwire/-/_blHH11U_KoJ.
To post to this group, send email to bolt...@googlegroups.com.
To unsubscribe from this group, send email to boltwire+u...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/boltwire?hl=en.

DrunkenMonk

unread,
Nov 2, 2012, 11:24:49 PM11/2/12
to bolt...@googlegroups.com
A basepage parameter should work, and incur negligible overhead, but I replace the current active page in a number of customization plugins (similar to the include function, I believe) and find the functionality to be worth a function.

I'll try to test your code during the week, need to configure a better test environment for changes to core functions.
Reply all
Reply to author
Forward
0 new messages