| 
									
										
										
										
											2016-07-04 19:51:37 +03:00
										 |  |  | /********************************************************************** | 
					
						
							|  |  |  | *  | 
					
						
							|  |  |  | * | 
					
						
							|  |  |  | * | 
					
						
							|  |  |  | **********************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //var DEBUG = DEBUG != null ? DEBUG : true
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*********************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-09 21:40:48 +03:00
										 |  |  | // XXX not sure about these...
 | 
					
						
							|  |  |  | var BaseData = { | 
					
						
							| 
									
										
										
										
											2016-07-11 04:32:56 +03:00
										 |  |  | 	'System/title': function(){  | 
					
						
							| 
									
										
										
										
											2016-07-12 03:22:06 +03:00
										 |  |  | 		return this.get('..').title }, | 
					
						
							| 
									
										
										
										
											2016-07-11 04:32:56 +03:00
										 |  |  | 	'System/path': function(){  | 
					
						
							| 
									
										
										
										
											2016-07-10 04:30:52 +03:00
										 |  |  | 		return this.dir }, | 
					
						
							| 
									
										
										
										
											2016-07-11 04:32:56 +03:00
										 |  |  | 	'System/dir': function(){  | 
					
						
							| 
									
										
										
										
											2016-07-12 03:22:06 +03:00
										 |  |  | 		return this.get('..').dir }, | 
					
						
							| 
									
										
										
										
											2016-07-11 04:32:56 +03:00
										 |  |  | 	'System/location': function(){  | 
					
						
							| 
									
										
										
										
											2016-07-10 04:30:52 +03:00
										 |  |  | 		return this.dir }, | 
					
						
							| 
									
										
										
										
											2016-07-11 04:32:56 +03:00
										 |  |  | 	'System/resolved': function(){  | 
					
						
							| 
									
										
										
										
											2016-07-12 03:22:06 +03:00
										 |  |  | 		return this.get('..').acquire() }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	'System/raw': function(){  | 
					
						
							|  |  |  | 		return this.get('..').raw }, | 
					
						
							|  |  |  | 	'System/text': function(){  | 
					
						
							|  |  |  | 		return this.get('..').text }, | 
					
						
							| 
									
										
										
										
											2016-07-10 04:30:52 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-11 04:32:56 +03:00
										 |  |  | 	'System/list': function(){ | 
					
						
							| 
									
										
										
										
											2016-07-09 21:40:48 +03:00
										 |  |  | 		var p = this.dir | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return Object.keys(this.__wiki_data) | 
					
						
							|  |  |  | 			.map(function(k){ | 
					
						
							|  |  |  | 				if(k.indexOf(p) == 0){ | 
					
						
							|  |  |  | 					return path2lst(k.slice(p.length)).shift() | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				return null | 
					
						
							|  |  |  | 			}) | 
					
						
							| 
									
										
										
										
											2016-07-10 02:41:31 +03:00
										 |  |  | 			.filter(e => e != null) | 
					
						
							| 
									
										
										
										
											2016-07-10 03:29:53 +03:00
										 |  |  | 			.sort() | 
					
						
							| 
									
										
										
										
											2016-07-10 02:41:31 +03:00
										 |  |  | 			.map(e => '['+ e +']') | 
					
						
							| 
									
										
										
										
											2016-07-09 21:40:48 +03:00
										 |  |  | 			.join('<br>') | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-07-11 04:32:56 +03:00
										 |  |  | 	'System/tree': function(){ | 
					
						
							| 
									
										
										
										
											2016-07-09 21:40:48 +03:00
										 |  |  | 		var p = this.dir | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return Object.keys(this.__wiki_data) | 
					
						
							|  |  |  | 			.map(function(k){ | 
					
						
							|  |  |  | 				if(k.indexOf(p) == 0){ | 
					
						
							|  |  |  | 					return k | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				return null | 
					
						
							|  |  |  | 			}) | 
					
						
							| 
									
										
										
										
											2016-07-10 02:41:31 +03:00
										 |  |  | 			.filter(e => e != null) | 
					
						
							| 
									
										
										
										
											2016-07-10 03:29:53 +03:00
										 |  |  | 			.sort() | 
					
						
							| 
									
										
										
										
											2016-07-10 02:41:31 +03:00
										 |  |  | 			.map(e => '['+ e +']') | 
					
						
							| 
									
										
										
										
											2016-07-09 21:40:48 +03:00
										 |  |  | 			.join('<br>') | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-07-11 04:32:56 +03:00
										 |  |  | 	'System/links': function(){ | 
					
						
							| 
									
										
										
										
											2016-07-09 21:40:48 +03:00
										 |  |  | 		var that = this | 
					
						
							|  |  |  | 		var p = this.dir | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		var res = [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		var wiki = this.__wiki_data | 
					
						
							|  |  |  | 		Object.keys(wiki).forEach(function(k){ | 
					
						
							|  |  |  | 			(wiki[k].links || []).forEach(function(l){ | 
					
						
							| 
									
										
										
										
											2016-07-11 18:41:23 +03:00
										 |  |  | 				(l == p || that.get(path2lst(l).slice(0, -1)).acquire('./'+path2lst(l).pop()) == p) | 
					
						
							| 
									
										
										
										
											2016-07-09 21:40:48 +03:00
										 |  |  | 					&& res.push([l, k]) | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return res | 
					
						
							| 
									
										
										
										
											2016-07-10 02:41:31 +03:00
										 |  |  | 			//.map(e => '['+ e[0] +'] <i>from page: ['+ e[1] +']</i>')
 | 
					
						
							|  |  |  | 			.map(e => '['+ e[1] +'] <i>-> ['+ e[0] +']</i>') | 
					
						
							| 
									
										
										
										
											2016-07-10 03:29:53 +03:00
										 |  |  | 			.sort() | 
					
						
							| 
									
										
										
										
											2016-07-09 21:40:48 +03:00
										 |  |  | 			.join('<br>') | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// XXX this needs a redirect...
 | 
					
						
							| 
									
										
										
										
											2016-07-11 04:32:56 +03:00
										 |  |  | 	'System/delete': function(){ | 
					
						
							| 
									
										
										
										
											2016-07-09 21:40:48 +03:00
										 |  |  | 		var p = this.dir | 
					
						
							|  |  |  | 		delete this.__wiki_data[p] | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-04 19:51:37 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | // data store...
 | 
					
						
							|  |  |  | // Format:
 | 
					
						
							|  |  |  | // 	{
 | 
					
						
							|  |  |  | // 		<path>: {
 | 
					
						
							|  |  |  | // 			text: <text>,
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // 			links: [
 | 
					
						
							|  |  |  | // 				<offset>: <link>,
 | 
					
						
							|  |  |  | // 			],
 | 
					
						
							|  |  |  | // 		}
 | 
					
						
							|  |  |  | // 	}
 | 
					
						
							|  |  |  | var data = { | 
					
						
							| 
									
										
										
										
											2016-07-08 01:40:59 +03:00
										 |  |  | 	'Templates/EmptyPage': { | 
					
						
							| 
									
										
										
										
											2016-07-11 19:22:00 +03:00
										 |  |  | 		text: 'Page [@include(./path)] is empty.' +'<br><br>' | 
					
						
							|  |  |  | 			+'Links to this page:' +'<br>' | 
					
						
							|  |  |  | 			+'@include(./links)' +'<br><br>' | 
					
						
							|  |  |  | 			+'---' +'<br>' | 
					
						
							|  |  |  | 			+'WikiHome', | 
					
						
							| 
									
										
										
										
											2016-07-04 20:42:46 +03:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-07-12 03:22:06 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	'Templates/_view': { | 
					
						
							|  |  |  | 		text: '\n' | 
					
						
							|  |  |  | 			+'<div>/@include(../path) ([../_edit])</div>\n' | 
					
						
							|  |  |  | 			+'<hr>\n' | 
					
						
							|  |  |  | 			+'<h1>@include(../title)</h1>\n' | 
					
						
							|  |  |  | 			+'<br>\n' | 
					
						
							|  |  |  | 			+'<div>@include(../text)</div>\n' | 
					
						
							|  |  |  | 			+'\n', | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	'Templates/_edit': { | 
					
						
							|  |  |  | 		text: '\n' | 
					
						
							|  |  |  | 			+'<div>/@include(../path) ([../_view])</div>\n' | 
					
						
							|  |  |  | 			+'<hr>\n' | 
					
						
							|  |  |  | 			+'<h1 contenteditable>@include(../title)</h1>\n' | 
					
						
							|  |  |  | 			+'<br>\n' | 
					
						
							|  |  |  | 			+'<div class="raw" contenteditable>@include(../text)</div>\n' | 
					
						
							|  |  |  | 			+'<script>\n' | 
					
						
							|  |  |  | 			+'\t$(".raw").text($(".raw").html())\n' | 
					
						
							|  |  |  | 			+'</script>\n' | 
					
						
							|  |  |  | 			+'', | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-07-04 19:51:37 +03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2016-07-09 21:40:48 +03:00
										 |  |  | data.__proto__ = BaseData | 
					
						
							| 
									
										
										
										
											2016-07-04 19:51:37 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-09 19:16:25 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*********************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-04 20:42:46 +03:00
										 |  |  | var path2lst = path =>  | 
					
						
							| 
									
										
										
										
											2016-07-09 19:16:25 +03:00
										 |  |  | 	(path instanceof Array ?  path : path.split(/[\\\/]+/g)) | 
					
						
							|  |  |  | 		// handle '..' (lookahead) and trim path elements...
 | 
					
						
							|  |  |  | 		// NOTE: this will not touch the leading '.' or '..'
 | 
					
						
							|  |  |  | 		.map((p, i, l) =>  | 
					
						
							|  |  |  | 			(i > 0 && (p.trim() == '..' || p.trim() == '.') | 
					
						
							|  |  |  | 					|| (l[i+1] || '').trim() == '..') ?  | 
					
						
							|  |  |  | 				null  | 
					
						
							|  |  |  | 				: p.trim()) | 
					
						
							|  |  |  | 		// cleanup and clear '.'...
 | 
					
						
							| 
									
										
										
										
											2016-07-04 20:42:46 +03:00
										 |  |  | 		.filter(p =>  | 
					
						
							| 
									
										
										
										
											2016-07-09 19:16:25 +03:00
										 |  |  | 			p != null && p != '') | 
					
						
							| 
									
										
										
										
											2016-07-04 20:42:46 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | var normalizePath = path =>  | 
					
						
							|  |  |  | 	path2lst(path).join('/') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-09 19:16:25 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*********************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-04 19:51:37 +03:00
										 |  |  | var Wiki = { | 
					
						
							| 
									
										
										
										
											2016-07-04 20:42:46 +03:00
										 |  |  | 	__wiki_data: data, | 
					
						
							| 
									
										
										
										
											2016-07-04 19:51:37 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-05 16:58:04 +03:00
										 |  |  | 	__home_page__: 'WikiHome', | 
					
						
							| 
									
										
										
										
											2016-07-08 01:40:59 +03:00
										 |  |  | 	__default_page__: 'EmptyPage', | 
					
						
							| 
									
										
										
										
											2016-07-11 17:57:28 +03:00
										 |  |  | 	// Special sub-paths to look in on each level...
 | 
					
						
							| 
									
										
										
										
											2016-07-11 04:32:56 +03:00
										 |  |  | 	__acquesition_order__: [ | 
					
						
							|  |  |  | 		'Templates', | 
					
						
							|  |  |  | 	], | 
					
						
							| 
									
										
										
										
											2016-07-11 17:57:28 +03:00
										 |  |  | 	__post_acquesition_order__: [ | 
					
						
							|  |  |  | 	], | 
					
						
							| 
									
										
										
										
											2016-07-11 04:32:56 +03:00
										 |  |  | 	// XXX should this be read only???
 | 
					
						
							|  |  |  | 	__system__: 'System', | 
					
						
							| 
									
										
										
										
											2016-07-09 19:16:25 +03:00
										 |  |  | 	//__redirect_template__: 'RedirectTemplate',
 | 
					
						
							| 
									
										
										
										
											2016-07-05 16:58:04 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-07 22:21:04 +03:00
										 |  |  | 	__wiki_link__: RegExp('('+[ | 
					
						
							| 
									
										
										
										
											2016-07-09 19:16:25 +03:00
										 |  |  | 		'(\\./|\\.\\./|[A-Z][a-z0-9]+[A-Z/])[a-zA-Z0-9/]*', | 
					
						
							| 
									
										
										
										
											2016-07-07 22:21:04 +03:00
										 |  |  | 		'\\[[^\\]]+\\]', | 
					
						
							|  |  |  | 	].join('|') +')', 'g'), | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-05 16:58:04 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-09 19:16:25 +03:00
										 |  |  | 	// Resolve '.' and '..' relative to current page...
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							| 
									
										
										
										
											2016-07-10 04:30:52 +03:00
										 |  |  | 	// NOTE: '.' is relative to .path and not to .dir
 | 
					
						
							| 
									
										
										
										
											2016-07-12 03:22:06 +03:00
										 |  |  | 	// NOTE: this is a method as it needs the context to resolve...
 | 
					
						
							| 
									
										
										
										
											2016-07-09 19:16:25 +03:00
										 |  |  | 	resolveDotPath: function(path){ | 
					
						
							|  |  |  | 		path = normalizePath(path) | 
					
						
							|  |  |  | 		// '.' or './*'
 | 
					
						
							|  |  |  | 		return path == '.' || /^\.\//.test(path) ?  | 
					
						
							| 
									
										
										
										
											2016-07-10 04:30:52 +03:00
										 |  |  | 				//path.replace(/^\./, this.dir)
 | 
					
						
							|  |  |  | 				path.replace(/^\./, this.path) | 
					
						
							| 
									
										
										
										
											2016-07-09 19:16:25 +03:00
										 |  |  | 			// '..' or '../*'
 | 
					
						
							|  |  |  | 			: path == '..' || /^\.\.\//.test(path) ?  | 
					
						
							| 
									
										
										
										
											2016-07-10 04:30:52 +03:00
										 |  |  | 				//path.replace(/^\.\./, 
 | 
					
						
							|  |  |  | 				//	normalizePath(path2lst(this.dir).slice(0, -1)))
 | 
					
						
							|  |  |  | 				path.replace(/^\.\./, this.dir) | 
					
						
							| 
									
										
										
										
											2016-07-09 19:16:25 +03:00
										 |  |  | 			: path | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-04 20:42:46 +03:00
										 |  |  | 	// current location...
 | 
					
						
							| 
									
										
										
										
											2016-07-04 19:51:37 +03:00
										 |  |  | 	get location(){ | 
					
						
							| 
									
										
										
										
											2016-07-05 16:58:04 +03:00
										 |  |  | 		return this.__location || this.__home_page__ }, | 
					
						
							| 
									
										
										
										
											2016-07-04 19:51:37 +03:00
										 |  |  | 	set location(value){ | 
					
						
							| 
									
										
										
										
											2016-07-09 19:16:25 +03:00
										 |  |  | 		this.__location = this.resolveDotPath(value) }, | 
					
						
							| 
									
										
										
										
											2016-07-04 19:51:37 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-11 18:41:23 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	get data(){ | 
					
						
							|  |  |  | 		return this.__wiki_data[this.acquire()] }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-04 20:42:46 +03:00
										 |  |  | 	// page path...
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	// Format:
 | 
					
						
							|  |  |  | 	// 	<dir>/<title>
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	// NOTE: changing this will move the page to the new path and change
 | 
					
						
							|  |  |  | 	// 		.location acordingly...
 | 
					
						
							|  |  |  | 	// NOTE: same applies to path parts below...
 | 
					
						
							| 
									
										
										
										
											2016-07-11 19:22:00 +03:00
										 |  |  | 	// NOTE: changing path will update all the links to the moving page.
 | 
					
						
							|  |  |  | 	// NOTE: if a link can't be updated without a conflit then it is left
 | 
					
						
							|  |  |  | 	// 		unchanged, and a redirect page will be created.
 | 
					
						
							| 
									
										
										
										
											2016-07-04 20:42:46 +03:00
										 |  |  | 	get path(){  | 
					
						
							|  |  |  | 		return this.location }, | 
					
						
							| 
									
										
										
										
											2016-07-11 19:22:00 +03:00
										 |  |  | 	// XXX should lik updating be part of this???
 | 
					
						
							|  |  |  | 	// XXX use a template for the redirect page...
 | 
					
						
							| 
									
										
										
										
											2016-07-04 19:51:37 +03:00
										 |  |  | 	set path(value){ | 
					
						
							| 
									
										
										
										
											2016-07-09 19:16:25 +03:00
										 |  |  | 		value = this.resolveDotPath(value) | 
					
						
							| 
									
										
										
										
											2016-07-04 20:42:46 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-09 06:26:16 +03:00
										 |  |  | 		var l = this.location | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if(value == l){ | 
					
						
							|  |  |  | 			return | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// old...
 | 
					
						
							|  |  |  | 		var otitle = this.title | 
					
						
							|  |  |  | 		var odir = this.dir | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-08 01:40:59 +03:00
										 |  |  | 		if(this.exists(l)){ | 
					
						
							|  |  |  | 			this.__wiki_data[value] = this.__wiki_data[l] | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-07-04 20:42:46 +03:00
										 |  |  | 		this.location = value | 
					
						
							| 
									
										
										
										
											2016-07-08 01:40:59 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-09 06:26:16 +03:00
										 |  |  | 		// new...
 | 
					
						
							|  |  |  | 		var ntitle = this.title | 
					
						
							|  |  |  | 		var ndir = this.dir | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		var redirect = false | 
					
						
							| 
									
										
										
										
											2016-07-08 01:40:59 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-09 06:26:16 +03:00
										 |  |  | 		// update links to this page...
 | 
					
						
							| 
									
										
										
										
											2016-07-08 01:40:59 +03:00
										 |  |  | 		this.pages(function(page){ | 
					
						
							| 
									
										
										
										
											2016-07-09 06:26:16 +03:00
										 |  |  | 			// skip the old page...
 | 
					
						
							|  |  |  | 			if(page.location == l){ | 
					
						
							|  |  |  | 				return | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2016-07-12 03:22:06 +03:00
										 |  |  | 			page.raw = page.raw.replace(page.__wiki_link__, function(lnk){ | 
					
						
							| 
									
										
										
										
											2016-07-09 06:26:16 +03:00
										 |  |  | 				var from = lnk[0] == '[' ? lnk.slice(1, -1) : lnk | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				// get path/title...
 | 
					
						
							|  |  |  | 				var p = path2lst(from) | 
					
						
							| 
									
										
										
										
											2016-07-08 01:40:59 +03:00
										 |  |  | 				var t = p.pop() | 
					
						
							| 
									
										
										
										
											2016-07-09 06:26:16 +03:00
										 |  |  | 				p = normalizePath(p) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-11 18:41:23 +03:00
										 |  |  | 				var target = page.get(p).acquire('./'+t) | 
					
						
							| 
									
										
										
										
											2016-07-09 06:26:16 +03:00
										 |  |  | 				// page target changed...
 | 
					
						
							|  |  |  | 				// NOTE: this can happen either when a link was an orphan
 | 
					
						
							|  |  |  | 				// 		or if the new page path shadowed the original 
 | 
					
						
							|  |  |  | 				// 		target...
 | 
					
						
							|  |  |  | 				// XXX should we report the exact condition here???
 | 
					
						
							|  |  |  | 				if(target == value){ | 
					
						
							|  |  |  | 					console.log('Link target changed:', lnk, '->', value) | 
					
						
							|  |  |  | 					return lnk | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				// skip links that do not resolve to target...
 | 
					
						
							| 
									
										
										
										
											2016-07-11 18:41:23 +03:00
										 |  |  | 				} else if(page.get(p).acquire('./'+t) != l){ | 
					
						
							| 
									
										
										
										
											2016-07-09 06:26:16 +03:00
										 |  |  | 					return lnk | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				// format the new link...
 | 
					
						
							|  |  |  | 				var to = p == '' ? ntitle : p +'/'+ ntitle | 
					
						
							|  |  |  | 				to = lnk[0] == '[' ? '['+to+'}' : to | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				// explicit link change -- replace...
 | 
					
						
							|  |  |  | 				if(from == l){ | 
					
						
							|  |  |  | 					//console.log(lnk, '->', to)
 | 
					
						
							|  |  |  | 					return to | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				// path did not change -- change the title...
 | 
					
						
							|  |  |  | 				} else if(ndir == odir){ | 
					
						
							|  |  |  | 					// conflict: the new link will not resolve to the 
 | 
					
						
							|  |  |  | 					// 		target page...
 | 
					
						
							| 
									
										
										
										
											2016-07-11 18:41:23 +03:00
										 |  |  | 					if(page.get(p).acquire('./'+ntitle) != value){ | 
					
						
							| 
									
										
										
										
											2016-07-09 06:26:16 +03:00
										 |  |  | 						console.log('ERR:', lnk, '->', to, | 
					
						
							| 
									
										
										
										
											2016-07-11 18:41:23 +03:00
										 |  |  | 							'is shadowed by:', page.get(p).acquire('./'+ntitle)) | 
					
						
							| 
									
										
										
										
											2016-07-09 06:26:16 +03:00
										 |  |  | 						// XXX should we add a note to the link???
 | 
					
						
							|  |  |  | 						redirect = true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					// replace title...
 | 
					
						
							|  |  |  | 					} else { | 
					
						
							|  |  |  | 						//console.log(lnk, '->', to)
 | 
					
						
							|  |  |  | 						return to | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				// path changed -- keep link + add redirect page...
 | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					redirect = true | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				// no change...
 | 
					
						
							|  |  |  | 				return lnk | 
					
						
							| 
									
										
										
										
											2016-07-08 01:40:59 +03:00
										 |  |  | 			}) | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-09 06:26:16 +03:00
										 |  |  | 		// redirect...
 | 
					
						
							|  |  |  | 		//
 | 
					
						
							|  |  |  | 		// XXX should we use a template here???
 | 
					
						
							|  |  |  | 		// 		...might be a good idea to set a .redirect attr and either
 | 
					
						
							|  |  |  | 		// 		do an internal/transparent redirect or show a redirect 
 | 
					
						
							|  |  |  | 		// 		template
 | 
					
						
							|  |  |  | 		// 		...might also be good to add an option to fix the link from
 | 
					
						
							|  |  |  | 		// 		the redirect page...
 | 
					
						
							|  |  |  | 		if(redirect){ | 
					
						
							|  |  |  | 			console.log('CREATING REDIRECT PAGE:', l, '->', value, '') | 
					
						
							| 
									
										
										
										
											2016-07-12 03:22:06 +03:00
										 |  |  | 			this.__wiki_data[l].raw = 'REDIRECT TO: ' + value | 
					
						
							| 
									
										
										
										
											2016-07-09 06:26:16 +03:00
										 |  |  | 				+'<br>' | 
					
						
							|  |  |  | 				+'<br><i>NOTE: This page was created when renaming the target ' | 
					
						
							|  |  |  | 					+'page that resulted new link being broken (i.e. resolved ' | 
					
						
							|  |  |  | 					+'to a different page from the target)</i>' | 
					
						
							|  |  |  | 			this.__wiki_data[l].redirect = value | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-08 01:40:59 +03:00
										 |  |  | 		// cleaup...
 | 
					
						
							| 
									
										
										
										
											2016-07-09 06:26:16 +03:00
										 |  |  | 		} else { | 
					
						
							|  |  |  | 			delete this.__wiki_data[l] | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-07-04 19:51:37 +03:00
										 |  |  | 	}, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-04 20:42:46 +03:00
										 |  |  | 	// path parts: directory...
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	// NOTE: see .path for details...
 | 
					
						
							|  |  |  | 	get dir(){ | 
					
						
							|  |  |  | 		return path2lst(this.location).slice(0, -1).join('/') }, | 
					
						
							|  |  |  | 	set dir(value){ | 
					
						
							|  |  |  | 		this.path = value +'/'+ this.title }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// path parts: title...
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	// NOTE: see .path for details...
 | 
					
						
							|  |  |  | 	get title(){  | 
					
						
							|  |  |  | 		return path2lst(this.location).pop() }, | 
					
						
							|  |  |  | 	set title(value){ | 
					
						
							|  |  |  | 		this.path = this.dir +'/'+ value }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// page content...
 | 
					
						
							| 
									
										
										
										
											2016-07-12 03:22:06 +03:00
										 |  |  | 	get raw(){ | 
					
						
							| 
									
										
										
										
											2016-07-11 17:57:28 +03:00
										 |  |  | 		var data = this.data | 
					
						
							| 
									
										
										
										
											2016-07-09 21:40:48 +03:00
										 |  |  | 		return data instanceof Function ? data.call(this, this) | 
					
						
							|  |  |  | 			: typeof(data) == typeof('str') ? data | 
					
						
							|  |  |  | 			: data != null ? data.text | 
					
						
							|  |  |  | 			: '' | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-07-12 03:22:06 +03:00
										 |  |  | 	set raw(value){ | 
					
						
							| 
									
										
										
										
											2016-07-04 20:42:46 +03:00
										 |  |  | 		var l = this.location | 
					
						
							| 
									
										
										
										
											2016-07-09 21:40:48 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// prevent overwriting actions...
 | 
					
						
							| 
									
										
										
										
											2016-07-11 17:57:28 +03:00
										 |  |  | 		if(this.data instanceof Function){ | 
					
						
							| 
									
										
										
										
											2016-07-09 21:40:48 +03:00
										 |  |  | 			return | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-04 20:42:46 +03:00
										 |  |  | 		this.__wiki_data[l] = this.__wiki_data[l] || {} | 
					
						
							|  |  |  | 		this.__wiki_data[l].text = value | 
					
						
							| 
									
										
										
										
											2016-07-07 22:21:04 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// cache links...
 | 
					
						
							| 
									
										
										
										
											2016-07-08 01:40:59 +03:00
										 |  |  | 		delete this.__wiki_data[l].links | 
					
						
							| 
									
										
										
										
											2016-07-07 22:21:04 +03:00
										 |  |  | 		this.__wiki_data[l].links = this.links | 
					
						
							| 
									
										
										
										
											2016-07-04 19:51:37 +03:00
										 |  |  | 	}, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-13 05:06:54 +03:00
										 |  |  | 	// XXX take .raw, parse macros and apply filters...
 | 
					
						
							|  |  |  | 	get text(){ return this.raw }, | 
					
						
							| 
									
										
										
										
											2016-07-12 03:22:06 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-08 01:40:59 +03:00
										 |  |  | 	// NOTE: this is set by setting .text
 | 
					
						
							| 
									
										
										
										
											2016-07-04 20:42:46 +03:00
										 |  |  | 	get links(){ | 
					
						
							| 
									
										
										
										
											2016-07-11 17:57:28 +03:00
										 |  |  | 		var data = this.data || {} | 
					
						
							| 
									
										
										
										
											2016-07-08 01:40:59 +03:00
										 |  |  | 		var links = data.links = data.links | 
					
						
							| 
									
										
										
										
											2016-07-12 03:22:06 +03:00
										 |  |  | 			|| (this.raw.match(this.__wiki_link__) || []) | 
					
						
							| 
									
										
										
										
											2016-07-07 22:21:04 +03:00
										 |  |  | 				// unwrap explicit links...
 | 
					
						
							|  |  |  | 				.map(e => e[0] == '[' ? e.slice(1, -1) : e) | 
					
						
							|  |  |  | 				// unique...
 | 
					
						
							|  |  |  | 				.filter((e, i, l) => l.slice(0, i).indexOf(e) == -1) | 
					
						
							| 
									
										
										
										
											2016-07-08 01:40:59 +03:00
										 |  |  | 		return links | 
					
						
							| 
									
										
										
										
											2016-07-04 20:42:46 +03:00
										 |  |  | 	}, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-09 19:16:25 +03:00
										 |  |  | 	// XXX list children/sub-pages...
 | 
					
						
							| 
									
										
										
										
											2016-07-04 20:42:46 +03:00
										 |  |  | 	get list(){ | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-11 04:32:56 +03:00
										 |  |  | 	// navigation...
 | 
					
						
							|  |  |  | 	get parent(){ | 
					
						
							| 
									
										
										
										
											2016-07-12 03:22:06 +03:00
										 |  |  | 		return this.get('..') }, | 
					
						
							| 
									
										
										
										
											2016-07-11 04:32:56 +03:00
										 |  |  | 	get: function(path){ | 
					
						
							|  |  |  | 		var o = Object.create(this) | 
					
						
							| 
									
										
										
										
											2016-07-11 17:57:28 +03:00
										 |  |  | 		o.location = path || this.path | 
					
						
							| 
									
										
										
										
											2016-07-11 04:32:56 +03:00
										 |  |  | 		return o | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-05 16:58:04 +03:00
										 |  |  | 	exists: function(path){ | 
					
						
							| 
									
										
										
										
											2016-07-12 03:22:06 +03:00
										 |  |  | 		return normalizePath(path || this.path) in this.__wiki_data }, | 
					
						
							| 
									
										
										
										
											2016-07-05 16:58:04 +03:00
										 |  |  | 	// get title from dir and then go up the tree...
 | 
					
						
							| 
									
										
										
										
											2016-07-11 18:41:23 +03:00
										 |  |  | 	acquire: function(path, no_default){ | 
					
						
							| 
									
										
										
										
											2016-07-05 16:58:04 +03:00
										 |  |  | 		var that = this | 
					
						
							| 
									
										
										
										
											2016-07-11 18:41:23 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// handle paths and relative paths...
 | 
					
						
							|  |  |  | 		var p = this.get(path) | 
					
						
							|  |  |  | 		var title = p.title | 
					
						
							|  |  |  | 		path = path2lst(p.dir) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-11 17:57:28 +03:00
										 |  |  | 		var acquire_from = this.__acquesition_order__ || [] | 
					
						
							|  |  |  | 		var post_acquire_from = this.__post_acquesition_order__ || [] | 
					
						
							|  |  |  | 		var data = this.__wiki_data | 
					
						
							| 
									
										
										
										
											2016-07-04 20:42:46 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-11 17:57:28 +03:00
										 |  |  | 		var _get = function(path, title, lst){ | 
					
						
							|  |  |  | 			lst = (lst == null || lst.length == 0) ? [''] : lst | 
					
						
							|  |  |  | 			for(var i=0; i < lst.length; i++){ | 
					
						
							|  |  |  | 				var p = path.concat([lst[i], title]) | 
					
						
							|  |  |  | 				if(that.exists(p)){ | 
					
						
							|  |  |  | 					p = normalizePath(p) | 
					
						
							|  |  |  | 					return that.__wiki_data[p] && p | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2016-07-04 20:42:46 +03:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-07-05 16:58:04 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		while(true){ | 
					
						
							|  |  |  | 			// get title from path...
 | 
					
						
							| 
									
										
										
										
											2016-07-11 17:57:28 +03:00
										 |  |  | 			var p = _get(path, title) | 
					
						
							|  |  |  | 				// get title from special paths in path...
 | 
					
						
							|  |  |  | 				|| _get(path, title, acquire_from) | 
					
						
							| 
									
										
										
										
											2016-07-05 16:58:04 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-11 17:57:28 +03:00
										 |  |  | 			if(p != null){ | 
					
						
							|  |  |  | 				return p | 
					
						
							| 
									
										
										
										
											2016-07-05 16:58:04 +03:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if(path.length == 0){ | 
					
						
							| 
									
										
										
										
											2016-07-11 04:32:56 +03:00
										 |  |  | 				break | 
					
						
							| 
									
										
										
										
											2016-07-05 16:58:04 +03:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			path.pop() | 
					
						
							| 
									
										
										
										
											2016-07-04 20:42:46 +03:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-07-11 04:32:56 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-11 17:57:28 +03:00
										 |  |  | 		// default paths...
 | 
					
						
							|  |  |  | 		var p = _get(path, title, post_acquire_from) | 
					
						
							|  |  |  | 			// system path...
 | 
					
						
							|  |  |  | 			|| this.__system__  | 
					
						
							|  |  |  | 				&& _get([this.__system__], title) | 
					
						
							| 
									
										
										
										
											2016-07-07 22:21:04 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-11 17:57:28 +03:00
										 |  |  | 		// NOTE: this may be null...
 | 
					
						
							|  |  |  | 		return p  | 
					
						
							| 
									
										
										
										
											2016-07-11 19:22:00 +03:00
										 |  |  | 			|| ((!no_default && title != this.__default_page__) ?  | 
					
						
							|  |  |  | 				this.acquire('./'+this.__default_page__)  | 
					
						
							|  |  |  | 				: null) | 
					
						
							| 
									
										
										
										
											2016-07-08 01:40:59 +03:00
										 |  |  | 	}, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-05 16:58:04 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// serialization...
 | 
					
						
							| 
									
										
										
										
											2016-07-12 03:22:06 +03:00
										 |  |  | 	// XXX
 | 
					
						
							| 
									
										
										
										
											2016-07-05 16:58:04 +03:00
										 |  |  | 	json: function(path){ | 
					
						
							|  |  |  | 		return path == null ? JSON.parse(JSON.stringify(this.__wiki_data)) | 
					
						
							|  |  |  | 			: path == '.' ? { | 
					
						
							|  |  |  | 					path: this.location, | 
					
						
							| 
									
										
										
										
											2016-07-12 03:22:06 +03:00
										 |  |  | 					text: this.raw, | 
					
						
							| 
									
										
										
										
											2016-07-05 16:58:04 +03:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			: { | 
					
						
							|  |  |  | 				path: path, | 
					
						
							| 
									
										
										
										
											2016-07-12 03:22:06 +03:00
										 |  |  | 				text: (this.__wiki_data[path] || {}).raw, | 
					
						
							| 
									
										
										
										
											2016-07-05 16:58:04 +03:00
										 |  |  | 			} | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	// XXX should we inherit from the default???
 | 
					
						
							|  |  |  | 	load: function(json){ | 
					
						
							|  |  |  | 		this.__wiki_data = json | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-07-08 01:40:59 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// iteration...
 | 
					
						
							|  |  |  | 	// XXX this is not page specific, might need refactoring...
 | 
					
						
							|  |  |  | 	pages: function(callback){ | 
					
						
							|  |  |  | 		var that = this | 
					
						
							|  |  |  | 		Object.keys(this.__wiki_data).forEach(function(location){ | 
					
						
							|  |  |  | 			// XXX not sure if this is the right way to go...
 | 
					
						
							|  |  |  | 			var o = Object.create(that) | 
					
						
							|  |  |  | 			o.location = location | 
					
						
							|  |  |  | 			callback.call(o, o) | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		return this | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-07-04 19:51:37 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-13 05:06:54 +03:00
										 |  |  | /*********************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var macro = { | 
					
						
							|  |  |  | 	__macro__pattern__: null, | 
					
						
							|  |  |  | 	__filters__: [ | 
					
						
							|  |  |  | 	], | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	context: null, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	filter: { | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-07-13 05:25:51 +03:00
										 |  |  | 	// macro stage 1...
 | 
					
						
							| 
									
										
										
										
											2016-07-13 05:06:54 +03:00
										 |  |  | 	macro: { | 
					
						
							|  |  |  | 		// select filter to post-process text...
 | 
					
						
							|  |  |  | 		filter_args: ['name'], | 
					
						
							|  |  |  | 		filter: function(args, text, _, filters){ | 
					
						
							|  |  |  | 			var filter = args[0] || args.name | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			filters.push(filter) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			return '' | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// include page/slot...
 | 
					
						
							|  |  |  | 		include_args: ['src', 'slot'], | 
					
						
							|  |  |  | 		include: function(args){ | 
					
						
							|  |  |  | 			var path = args.src | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			var text = this.context.get(path).text | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			return this.parse(text) | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// fill/define slot (stage 1)...
 | 
					
						
							|  |  |  | 		// XXX
 | 
					
						
							|  |  |  | 		slot_args: ['name'], | 
					
						
							|  |  |  | 		slot: function(args, text, slots){ | 
					
						
							|  |  |  | 			var name = args.name | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if(slots[name] == null){ | 
					
						
							|  |  |  | 				slots[name] = text | 
					
						
							|  |  |  | 				// XXX return a slot macro parsable by stage 2...
 | 
					
						
							|  |  |  | 				return text | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			} else if(name in slots){ | 
					
						
							|  |  |  | 				slots[name] = text | 
					
						
							|  |  |  | 				return '' | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-07-13 05:25:51 +03:00
										 |  |  | 	// macro stage 2...
 | 
					
						
							|  |  |  | 	macro2: { | 
					
						
							|  |  |  | 		slot_args: ['name'], | 
					
						
							|  |  |  | 		slot: function(args, text, slots){ | 
					
						
							|  |  |  | 			var name = args.name | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if(slots[name] == null){ | 
					
						
							|  |  |  | 				// XXX ???
 | 
					
						
							|  |  |  | 				return text | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			} else if(name in slots){ | 
					
						
							|  |  |  | 				return slots[name] | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-07-13 05:06:54 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	parseArgs: function(macro, args){ | 
					
						
							|  |  |  | 		// XXX parse args and populate the dict via .*_args attr...
 | 
					
						
							|  |  |  | 		// XXX
 | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	parse: function(text){ | 
					
						
							|  |  |  | 		var that = this | 
					
						
							|  |  |  | 		var filters = [] | 
					
						
							|  |  |  | 		var slots = {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// macro stage 1...
 | 
					
						
							|  |  |  | 		text = text.replace(this.__macro__pattern__, function(match, macro, args, text){ | 
					
						
							|  |  |  | 			args = that.parseArgs(macro, args) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			return macro in that.macro ?  | 
					
						
							|  |  |  | 					that.macro[macro].call(that, args, text, slots, filters) | 
					
						
							|  |  |  | 				: match | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// macro stage 2...
 | 
					
						
							|  |  |  | 		text = text.replace(this.__macro__pattern__, function(match, macro, args, text){ | 
					
						
							|  |  |  | 			args = that.parseArgs(macro, args) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-13 05:25:51 +03:00
										 |  |  | 			return macro in that.macro2 ?  | 
					
						
							|  |  |  | 					that.macro2[macro].call(that, args, text, slots, filters) | 
					
						
							| 
									
										
										
										
											2016-07-13 05:06:54 +03:00
										 |  |  | 				: match | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// filter stage....
 | 
					
						
							|  |  |  | 		filters.forEach(function(k){ | 
					
						
							|  |  |  | 			text = that.filter[k].call(that, text)  | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return text | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-04 19:51:37 +03:00
										 |  |  | /********************************************************************** | 
					
						
							|  |  |  | * vim:set ts=4 sw=4 :                                                */ |