Open andjar opened 4 years ago
Some first comments:
{{backlinks>.+?}}
is already taken by the backlinks plugin, I definitely won't add this conflicting syntax to the include plugin, this needs to be renamed e.g. to include_backlinks
.Thanks for your comments, @michitux! They are a nice starting point for further development
To the most complicated point; I chose to use "inclusion" tags to try to avoid some of the problems you are mentioning. As long as you only include backlinks across tagspace I think you should be fine; i.e. if pages a, b, c, d are tagged "small" and A, B, C, D are tagged "capital", one should only include backlinks to A tagged with "small" and so on. It is far from perfect, but I too had roam in my thoughts; demo https://www.youtube.com/watch?v=7JOgkxssXks
Thank you for that demo, that made things a bit clearer and looks super cool. Two thoughts:
Another note: Having a closer look at Roam I noticed that my tagextract plugin prototype might be another missing piece for implementing Roam in DokuWiki. Basically it allows you to tag individual list items and then on a separate page include all items with a certain tag. During inclusion, these tags are transformed into links back to the original list item. Probably this not a perfect fit but it should be a good demo how this could be implemented. I think it should be possible to implement something similar with regular links, i.e., that list items (or paragraphs) with links to a certain page are collected together. If you are interested in this feel free to contact me. I won't have much time till next weekend, but afterwards I might have some time occasionally.
Hi, sorry for the late answer, I'll answer you in depth later. I have made a prototype of a plugin autocreating missing pages:
<?php
/**
* DokuWiki Plugin autostartpage (Action Component)
*
* @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
* @author Charles Knight <charles@rabidaudio.com>
*/
// must be run within Dokuwiki
if(!defined('DOKU_INC')) die();
class action_plugin_autostartpage extends DokuWiki_Action_Plugin {
/**
* Registers a callback function for a given event
*
* @param Doku_Event_Handler $controller DokuWiki's event controller object
* @return void
*/
public function register(Doku_Event_Handler &$controller) {
$controller->register_hook('IO_WIKIPAGE_WRITE', 'AFTER', $this, 'autostartpage_handle');
}
/**
* [Custom event handler which performs action]
*
* @author Charles Knight, charles@rabidaudio.com
* @param Doku_Event $event event object by reference
* @param mixed $param [the parameters passed as fifth argument to register_hook() when this
* handler was registered]
* @return void
*/
public function autostartpage_handle(Doku_Event &$event, $param) {
global $conf;
global $INFO;
$data = $event->data;
$id=$data[1].":".$data[2];
$file=wikiFN($id);
global $conf;
if (!defined('LINK_PATTERN')) define('LINK_PATTERN', '%\[\[([^\]|#]*)(#[^\]|]*)?\|?([^\]]*)]]%');
if(!preg_match("/.*\.txt$/", $file)) {
return;
}
$currentID = pathID($file);
$currentNS = getNS($currentID);
if($conf['allowdebug']) echo sprintf("<p><b>%s</b>: %s</p>\n", $file, $currentID);
// echo " <!-- checking file: $file -->\n";
$body = io_readFile($file);
// ignores entries in blocks that ignore links
foreach( array(
'@<nowiki>.*?<\/nowiki>@su',
'@%%.*?%%@su',
'@<php>.*?</php>@su',
'@<PHP>.*?</PHP>@su',
'@<html>.*?</html>@su',
'@<HTML>.*?</HTML>@su',
'@^( {2,}|\t)[^\*\- ].*?$@mu',
'@<code[^>]*?>.*?<\/code>@su',
'@<file[^>]*?>.*?<\/file>@su'
)
as $ignored )
{
$body = preg_replace($ignored, '', $body);
}
$links = array();
$missinglinks = array();
preg_match_all( LINK_PATTERN, $body, $links );
$cc = 1;
foreach($links[1] as $link) {
if($conf['allowdebug']) echo sprintf("--- Checking %s<br />\n", $link);
if( (0 < strlen(ltrim($link)))
and ! preg_match('/^[a-zA-Z0-9\.]+>{1}.*$/u',$link) // Interwiki
and ! preg_match('/^\\\\\\\\[\w.:?\-;,]+?\\\\/u',$link) // Windows Share
and ! preg_match('#^([a-z0-9\-\.+]+?)://#i',$link) // external link (accepts all protocols)
and ! preg_match('<'.PREG_PATTERN_VALID_EMAIL.'>',$link) // E-Mail (pattern above is defined in inc/mail.php)
and ! preg_match('!^#.+!',$link) // inside page link (html anchor)
) {
# remove parameters
$link = preg_replace('/\?.*/', '', $link);
$pageExists = false;
resolve_pageid($data[1], $link, $pageExists );
resolve_pageid($currentNS, $link, $pageExists );
if ($conf['allowdebug']) echo sprintf("---- link='%s' %s ", $link, $pageExists?'EXISTS':'MISS');
if(((strlen(ltrim($link)) > 0) // there IS an id?
and !auth_quickaclcheck($link) < AUTH_READ)) {
// should be visible to user
//echo " <!-- adding $link -->\n";
if($conf['allowdebug']) echo ' A_LINK' ;
$link= utf8_strtolower( $link );
}
else
{
if($conf['allowdebug']) echo ' EMPTY_OR_FORBIDDEN' ;
}
} // link is not empty and is a local link?
else {
if($conf['allowdebug']) echo ' NOT_INTERNAL';
}
if($conf['allowdebug']) echo "<br />\n";
if($pageExists == FALSE){
$missinglinks[$cc] = $link;
$cc++;
}
}
$cc = 1;
foreach($missinglinks as $missinglink){
$templatefile = wikiFN($this->getConf('templatefile'), '', false);
if(@file_exists($templatefile)){
$wikitext=io_readFile($templatefile);
}
$id = $missinglink;
$ns = getNS($id);
$page = noNS($id);
$silent=$this->getConf('silent');
$ns_sepchar = ":";
$parent=implode($ns_sepchar, array_splice(preg_split("/".preg_quote($ns_sepchar, "/")."/", $ns), 0, -1));
$goodns=preg_replace("/".$conf['sepchar']."/"," ",noNS($ns));
$page=preg_replace("/".$conf['sepchar']."/"," ",noNS($id));
$f=$conf['start'];
/**THESE ARE THE CODES FOR TEMPLATES**/
// @ID@ full ID of the page
// @NS@ namespace of the page
// @PAGE@ page name (ID without namespace and underscores replaced by spaces)
// @!PAGE@ same as above but with the first character uppercased
// @!!PAGE@ same as above but with the first character of all words uppercased
// @!PAGE!@ same as above but with all characters uppercased
// @FILE@ page name (ID without namespace, underscores kept as is)
// @!FILE@ same as above but with the first character uppercased
// @!FILE!@ same as above but with all characters uppercased
// @USER@ ID of user who is creating the page
// @NAME@ name of user who is creating the page
// @MAIL@ mail address of user who is creating the page
// @DATE@ date and time when edit session started
/**PLUS WE ADDED THESE**/
// @!NS@ namespace of the page (with spaces) but with the first character uppercased
// @!!NS@ namespace of the page (with spaces) but with the first character of all words uppercased
// @!!NS!@ namespace of the page (with spaces) but with all characters uppercased
// @PARENT@ the name of the parent namespace. Blank if parent is top
// @DATE=STRFTIME@ Where `STRFTIME` is a strftime configure string of page creation time,
// e.g. %a %d-%m-%y => Thu 06-12-12
$wikitext=preg_replace("/@NS@/", $ns, $wikitext);
$wikitext=preg_replace("/@!NS@/", ucfirst($goodns), $wikitext);
$wikitext=preg_replace("/@!!NS@/", ucwords($goodns), $wikitext);
$wikitext=preg_replace("/@!!NS!@/", strtoupper($goodns), $wikitext);
$wikitext=preg_replace("/@ID@/", $id, $wikitext);
$wikitext=preg_replace("/@PAGE@/",$page, $wikitext);
$wikitext=preg_replace("/@!PAGE@/",ucfirst($page), $wikitext);
$wikitext=preg_replace("/@!!PAGE@/",$uupage=ucwords($page), $wikitext);
$wikitext=preg_replace("/@!PAGE!@/",strtoupper($page), $wikitext);
$wikitext=preg_replace("/@FILE@/",$f, $wikitext);
$wikitext=preg_replace("/@!FILE@/",ucfirst($f), $wikitext);
$wikitext=preg_replace("/@!FILE!@/",strtoupper($f), $wikitext);
$wikitext=preg_replace("/@USER@/",$_SERVER['REMOTE_USER'], $wikitext);
$wikitext=preg_replace("/@NAME@/",$INFO['userinfo']['name'], $wikitext);
$wikitext=preg_replace("/@MAIL@/",$INFO['userinfo']['mail'], $wikitext);
$wikitext=preg_replace("/@DATE@/",strftime("%D"), $wikitext);
$wikitext=preg_replace("/@PARENT@/",$parent, $wikitext);
if(preg_match("/@DATE=(.*)@/", $wikitext, $matches)){
$wikitext=str_replace($matches[0], strftime($matches[1]), $wikitext);
}
saveWikiText($missinglink, $wikitext, "autostartpage", $minor = false);
$cc++;
}
}
}
Best, Anders
Hi,
I have tried to add an option so that you can use
in addition to tagtopic etc. It will include the pages linking to [pagename]. Only pages tagged with the provided [includetag] will be included. It only looks in the namespace of [pagename].