| 
									
										
										
										
											2016-07-04 19:51:37 +03:00
										 |  |  | /********************************************************************** | 
					
						
							|  |  |  | *  | 
					
						
							|  |  |  | * | 
					
						
							|  |  |  | * | 
					
						
							|  |  |  | **********************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-19 03:10:16 +03:00
										 |  |  | /*********************************************************************/ | 
					
						
							|  |  |  | // Hepers...
 | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | //
 | 
					
						
							|  |  |  | var quoteRegExp = | 
					
						
							|  |  |  | RegExp.quoteRegExp = | 
					
						
							| 
									
										
										
										
											2022-04-01 01:14:39 +03:00
										 |  |  | 	RegExp.quoteRegExp  | 
					
						
							|  |  |  | 		|| function(str){ | 
					
						
							|  |  |  | 			return str | 
					
						
							|  |  |  | 				.replace(/([\.\\\/\(\)\[\]\$\*\+\-\{\}\@\^\&\?\<\>])/g, '\\$1') } | 
					
						
							| 
									
										
										
										
											2016-07-19 03:10:16 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | var path2lst = function(path){  | 
					
						
							| 
									
										
										
										
											2022-04-07 17:23:36 +03:00
										 |  |  | 	return (path instanceof Array ?  | 
					
						
							|  |  |  | 			path  | 
					
						
							|  |  |  | 			: path.split(/[\\\/]+/g)) | 
					
						
							| 
									
										
										
										
											2016-07-19 03:10:16 +03:00
										 |  |  | 		// handle '..' (lookahead) and trim path elements...
 | 
					
						
							|  |  |  | 		// NOTE: this will not touch the leading '.' or '..'
 | 
					
						
							|  |  |  | 		.map(function(p, i, l){ | 
					
						
							| 
									
										
										
										
											2022-04-07 17:23:36 +03:00
										 |  |  | 			return (i > 0  | 
					
						
							|  |  |  | 					&& (p.trim() == '..' || p.trim() == '.') | 
					
						
							| 
									
										
										
										
											2016-07-19 03:10:16 +03:00
										 |  |  | 					|| (l[i+1] || '').trim() == '..') ?  | 
					
						
							|  |  |  | 				null  | 
					
						
							|  |  |  | 				: p.trim() }) | 
					
						
							|  |  |  | 		// cleanup and clear '.'...
 | 
					
						
							|  |  |  | 		.filter(function(p){  | 
					
						
							| 
									
										
										
										
											2022-04-07 17:23:36 +03:00
										 |  |  | 			return p != null  | 
					
						
							|  |  |  | 				&& p != '' })} | 
					
						
							| 
									
										
										
										
											2016-07-19 03:10:16 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | var normalizePath = function(path){ | 
					
						
							|  |  |  | 	return path2lst(path).join('/') } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var clearWikiWords = function(elem){ | 
					
						
							| 
									
										
										
										
											2016-07-17 15:58:50 +03:00
										 |  |  | 	// clear existing...
 | 
					
						
							| 
									
										
										
										
											2016-07-19 23:13:51 +03:00
										 |  |  | 	elem.find('.wikiword').each(function(){ | 
					
						
							| 
									
										
										
										
											2016-07-20 02:32:17 +03:00
										 |  |  | 		$(this).attr('bracketed') == 'yes' ?  | 
					
						
							| 
									
										
										
										
											2016-07-17 15:58:50 +03:00
										 |  |  | 			$(this).replaceWith(['['].concat(this.childNodes, [']'])) | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			: $(this).replaceWith(this.childNodes) }) | 
					
						
							| 
									
										
										
										
											2016-07-19 03:10:16 +03:00
										 |  |  | 	return elem }  | 
					
						
							| 
									
										
										
										
											2016-07-17 15:58:50 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-20 02:32:17 +03:00
										 |  |  | var setWikiWords = function(text, show_brackets, skip){ | 
					
						
							|  |  |  | 	skip = skip || [] | 
					
						
							| 
									
										
										
										
											2022-03-30 17:06:17 +03:00
										 |  |  | 	skip = skip instanceof Array ?  | 
					
						
							|  |  |  | 		skip  | 
					
						
							|  |  |  | 		: [skip] | 
					
						
							| 
									
										
										
										
											2016-07-20 02:32:17 +03:00
										 |  |  | 	return text  | 
					
						
							| 
									
										
										
										
											2016-07-17 15:58:50 +03:00
										 |  |  | 		// set new...
 | 
					
						
							|  |  |  | 		.replace( | 
					
						
							|  |  |  | 			Wiki.__wiki_link__, | 
					
						
							|  |  |  | 			function(l){ | 
					
						
							| 
									
										
										
										
											2016-08-20 00:56:37 +03:00
										 |  |  | 				// check if wikiword is escaped...
 | 
					
						
							|  |  |  | 				if(l[0] == '\\'){ | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 					return l.slice(1) } | 
					
						
							| 
									
										
										
										
											2016-08-20 00:56:37 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-22 21:46:23 +03:00
										 |  |  | 				var path = l[0] == '[' ? l.slice(1, -1) : l | 
					
						
							|  |  |  | 				var i = [].slice.call(arguments).slice(-2)[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				// XXX HACK check if we are inside a tag...
 | 
					
						
							|  |  |  | 				var rest = text.slice(i+1) | 
					
						
							|  |  |  | 				if(rest.indexOf('>') < rest.indexOf('<')){ | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 					return l } | 
					
						
							| 
									
										
										
										
											2016-07-22 21:46:23 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-20 02:32:17 +03:00
										 |  |  | 				return skip.indexOf(l) < 0 ?  | 
					
						
							|  |  |  | 					('<a ' | 
					
						
							|  |  |  | 						+'class="wikiword" ' | 
					
						
							| 
									
										
										
										
											2016-07-22 21:46:23 +03:00
										 |  |  | 						+'href="#'+ path +'" ' | 
					
						
							| 
									
										
										
										
											2016-07-20 02:32:17 +03:00
										 |  |  | 						+'bracketed="'+ (show_brackets && l[0] == '[' ? 'yes' : 'no') +'" ' | 
					
						
							| 
									
										
										
										
											2016-07-22 23:42:34 +03:00
										 |  |  | 						//+'onclick="event.preventDefault(); go($(this).attr(\'href\').slice(1))" '
 | 
					
						
							| 
									
										
										
										
											2016-07-20 02:32:17 +03:00
										 |  |  | 						+'>' | 
					
						
							| 
									
										
										
										
											2016-07-22 21:46:23 +03:00
										 |  |  | 							+ (!!show_brackets ? path : l)  | 
					
						
							| 
									
										
										
										
											2016-07-20 02:32:17 +03:00
										 |  |  | 						+'</a>') | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 					: l })} | 
					
						
							| 
									
										
										
										
											2016-07-19 03:10:16 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*********************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-21 17:03:43 +03:00
										 |  |  | function Macro(doc, args, func){ | 
					
						
							|  |  |  | 	func.doc = doc | 
					
						
							|  |  |  | 	func.macro_args = args | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 	return func } | 
					
						
							| 
									
										
										
										
											2016-07-21 17:03:43 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-27 00:08:11 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | // XXX should inline macros support named args???
 | 
					
						
							| 
									
										
										
										
											2016-07-27 00:10:14 +03:00
										 |  |  | var macro = { | 
					
						
							| 
									
										
										
										
											2016-07-27 00:08:11 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-07 18:25:46 +03:00
										 |  |  | 	__include_marker__: '{{{INCLUDE-MARKER}}}', | 
					
						
							| 
									
										
										
										
											2016-07-27 00:08:11 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Abstract macro syntax:
 | 
					
						
							|  |  |  | 	// 	Inline macro:
 | 
					
						
							|  |  |  | 	// 		@macro(arg ..)
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	// 	HTML-like:
 | 
					
						
							|  |  |  | 	// 		<macro arg=value ../>
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	// 	HTML-like with body:
 | 
					
						
							|  |  |  | 	// 		<macro arg=value ..>
 | 
					
						
							|  |  |  | 	// 			..text..
 | 
					
						
							|  |  |  | 	// 		</macro>
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	// XXX should inline macros support named args???
 | 
					
						
							|  |  |  | 	__macro__pattern__:  | 
					
						
							|  |  |  | 		[[ | 
					
						
							|  |  |  | 			// @macro(arg ..)
 | 
					
						
							| 
									
										
										
										
											2016-08-15 17:36:33 +03:00
										 |  |  | 			'\\\\?@([a-zA-Z-_]+)\\(([^)]*)\\)' | 
					
						
							| 
									
										
										
										
											2016-07-27 00:08:11 +03:00
										 |  |  | 		].join('|'), 'mg'], | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// default filters...
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	// NOTE: these are added AFTER the user defined filters...
 | 
					
						
							|  |  |  | 	__filters__: [ | 
					
						
							|  |  |  | 		'wikiword', | 
					
						
							| 
									
										
										
										
											2016-08-01 19:49:46 +03:00
										 |  |  | 		'noscript', | 
					
						
							| 
									
										
										
										
											2016-07-27 00:08:11 +03:00
										 |  |  | 	], | 
					
						
							| 
									
										
										
										
											2016-08-16 02:47:01 +03:00
										 |  |  | 	__post_filters__: [ | 
					
						
							|  |  |  | 		//'noscript',
 | 
					
						
							|  |  |  | 		'title', | 
					
						
							|  |  |  | 		'editor', | 
					
						
							|  |  |  | 	], | 
					
						
							| 
									
										
										
										
											2016-07-27 00:08:11 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Macros...
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							| 
									
										
										
										
											2016-08-19 04:19:38 +03:00
										 |  |  | 	// XXX add support for sort and reverse attrs in all relavant macros
 | 
					
						
							|  |  |  | 	// 		(see: macro for details)
 | 
					
						
							| 
									
										
										
										
											2016-07-27 00:08:11 +03:00
										 |  |  | 	macro: { | 
					
						
							| 
									
										
										
										
											2016-08-19 18:59:55 +03:00
										 |  |  | 		"pwiki-comment": Macro('hide in pWiki', | 
					
						
							|  |  |  | 			[], | 
					
						
							| 
									
										
										
										
											2016-08-20 00:56:37 +03:00
										 |  |  | 			function(context, elem, state){  | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 				return '' }), | 
					
						
							| 
									
										
										
										
											2016-08-07 18:25:46 +03:00
										 |  |  | 		now: Macro('Create a now id', | 
					
						
							|  |  |  | 			[], | 
					
						
							| 
									
										
										
										
											2022-03-29 19:20:39 +03:00
										 |  |  | 			function(context, elem, state){  | 
					
						
							|  |  |  | 				return ''+Date.now() }), | 
					
						
							| 
									
										
										
										
											2016-07-27 00:08:11 +03:00
										 |  |  | 		// select filter to post-process text...
 | 
					
						
							|  |  |  | 		filter: Macro('Filter to post-process text', | 
					
						
							|  |  |  | 			['name'], | 
					
						
							|  |  |  | 			function(context, elem, state){ | 
					
						
							|  |  |  | 				var filter = $(elem).attr('name') | 
					
						
							|  |  |  | 				filter[0] == '-' ? | 
					
						
							|  |  |  | 					// disabled -- keep at head of list...
 | 
					
						
							|  |  |  | 					state.filters.unshift(filter) | 
					
						
							|  |  |  | 					// normal -- tail...
 | 
					
						
							|  |  |  | 					: state.filters.push(filter) | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 				return '' }), | 
					
						
							| 
									
										
										
										
											2016-07-27 00:08:11 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// include page/slot...
 | 
					
						
							|  |  |  | 		//
 | 
					
						
							|  |  |  | 		// NOTE: this will render the page in the caller's context.
 | 
					
						
							|  |  |  | 		// NOTE: included pages are rendered completely independently 
 | 
					
						
							|  |  |  | 		// 		from the including page.
 | 
					
						
							|  |  |  | 		include: Macro('Include page', | 
					
						
							| 
									
										
										
										
											2016-08-15 21:55:20 +03:00
										 |  |  | 			['src', 'isolated', 'text'], | 
					
						
							| 
									
										
										
										
											2016-07-27 00:08:11 +03:00
										 |  |  | 			function(context, elem, state){ | 
					
						
							|  |  |  | 				var path = $(elem).attr('src') | 
					
						
							|  |  |  | 				// get and prepare the included page...
 | 
					
						
							|  |  |  | 				state.include | 
					
						
							| 
									
										
										
										
											2016-07-28 09:07:46 +03:00
										 |  |  | 					.push([elem, context.get(path)]) | 
					
						
							| 
									
										
										
										
											2016-07-27 00:08:11 +03:00
										 |  |  | 				// return the marker...
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 				return this.__include_marker__ }), | 
					
						
							| 
									
										
										
										
											2016-07-27 00:08:11 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// NOTE: this is similar to include, the difference is that this
 | 
					
						
							|  |  |  | 		// 		includes the page source to the current context while 
 | 
					
						
							|  |  |  | 		// 		include works in an isolated context
 | 
					
						
							|  |  |  | 		source: Macro('Include page source (without parsing)', | 
					
						
							|  |  |  | 			['src'],  | 
					
						
							|  |  |  | 			function(context, elem, state){ | 
					
						
							|  |  |  | 				var path = $(elem).attr('src') | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 				return context.get(path) | 
					
						
							| 
									
										
										
										
											2022-03-29 19:37:05 +03:00
										 |  |  | 					.map(function(page){  | 
					
						
							|  |  |  | 						return page.raw }) | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 					.join('\n') }), | 
					
						
							| 
									
										
										
										
											2016-07-27 00:08:11 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-28 09:07:46 +03:00
										 |  |  | 		quote: Macro('Include quoted page source (without parsing)', | 
					
						
							|  |  |  | 			['src'],  | 
					
						
							|  |  |  | 			function(context, elem, state){ | 
					
						
							|  |  |  | 				elem = $(elem) | 
					
						
							|  |  |  | 				var path = elem.attr('src') | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 				return $(context.get(path) | 
					
						
							|  |  |  | 					.map(function(page){ | 
					
						
							|  |  |  | 						return elem | 
					
						
							|  |  |  | 							.clone() | 
					
						
							|  |  |  | 							.attr('src', page.path) | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 							.text(page.raw)[0] })) }), | 
					
						
							| 
									
										
										
										
											2016-07-28 09:07:46 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		/* | 
					
						
							| 
									
										
										
										
											2016-07-27 00:08:11 +03:00
										 |  |  | 		// fill/define slot (stage 1)...
 | 
					
						
							|  |  |  | 		//
 | 
					
						
							|  |  |  | 		// XXX which should have priority the arg text or the content???
 | 
					
						
							| 
									
										
										
										
											2016-07-28 09:07:46 +03:00
										 |  |  | 		_slot: Macro('Define/fill slot', | 
					
						
							| 
									
										
										
										
											2016-07-27 00:08:11 +03:00
										 |  |  | 			['name', 'text'], | 
					
						
							| 
									
										
										
										
											2016-07-28 09:07:46 +03:00
										 |  |  | 			function(context, elem, state, parse){ | 
					
						
							| 
									
										
										
										
											2016-07-27 00:08:11 +03:00
										 |  |  | 				var name = $(elem).attr('name') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				// XXX
 | 
					
						
							|  |  |  | 				text = $(elem).html() | 
					
						
							| 
									
										
										
										
											2022-03-29 19:37:05 +03:00
										 |  |  | 				text = text == '' ?  | 
					
						
							|  |  |  | 					$(elem).attr('text')  | 
					
						
							|  |  |  | 					: text | 
					
						
							| 
									
										
										
										
											2016-07-27 00:08:11 +03:00
										 |  |  | 				text = this.parse(context, text, state, true) | 
					
						
							| 
									
										
										
										
											2016-07-28 09:07:46 +03:00
										 |  |  | 				//text = parse(elem)
 | 
					
						
							| 
									
										
										
										
											2016-07-27 00:08:11 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				if(state.slots[name] == null){ | 
					
						
							|  |  |  | 					state.slots[name] = text | 
					
						
							|  |  |  | 					// return a slot macro parsable by stage 2...
 | 
					
						
							| 
									
										
										
										
											2016-07-28 09:07:46 +03:00
										 |  |  | 					//return '<_slot name="'+name+'">'+ text +'</slot>'
 | 
					
						
							|  |  |  | 					return elem | 
					
						
							| 
									
										
										
										
											2016-07-27 00:08:11 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				} else if(name in state.slots){ | 
					
						
							|  |  |  | 					state.slots[name] = text | 
					
						
							| 
									
										
										
										
											2022-03-29 19:37:05 +03:00
										 |  |  | 					return '' } }), | 
					
						
							| 
									
										
										
										
											2016-07-28 09:07:46 +03:00
										 |  |  | 		//*/
 | 
					
						
							|  |  |  | 		// convert @ macro to html-like + parse content...
 | 
					
						
							|  |  |  | 		slot: Macro('Define/fill slot', | 
					
						
							|  |  |  | 			['name', 'text'], | 
					
						
							|  |  |  | 			function(context, elem, state, parse){ | 
					
						
							|  |  |  | 				elem = $(elem) | 
					
						
							|  |  |  | 				var name = elem.attr('name') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				// XXX
 | 
					
						
							|  |  |  | 				text = elem.html() | 
					
						
							|  |  |  | 				text = text.trim() == '' ?  | 
					
						
							|  |  |  | 					elem.html(elem.attr('text') || '').html()  | 
					
						
							|  |  |  | 					: text | 
					
						
							|  |  |  | 				text = parse(elem) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				elem.attr('text', null) | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 				//elem.html(text)
 | 
					
						
							| 
									
										
										
										
											2016-07-28 09:07:46 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 				return elem }), | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-13 01:37:30 +03:00
										 |  |  | 		// XXX revise macro definition rules -- see inside...
 | 
					
						
							|  |  |  | 		// XXX do we need macro namespaces or context isolation (for inculdes)???
 | 
					
						
							|  |  |  | 		macro: Macro('Define/fill macro', | 
					
						
							| 
									
										
										
										
											2016-08-19 17:51:12 +03:00
										 |  |  | 			['name', 'src', 'sort'], | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 			function(context, elem, state, parse){ | 
					
						
							|  |  |  | 				elem = $(elem) | 
					
						
							|  |  |  | 				var name = elem.attr('name') | 
					
						
							|  |  |  | 				var path = elem.attr('src') | 
					
						
							| 
									
										
										
										
											2016-08-19 04:19:38 +03:00
										 |  |  | 				var sort = elem.attr('sort') | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				state.templates = state.templates || {} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-19 04:19:38 +03:00
										 |  |  | 				// get named macro...
 | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 				if(name){ | 
					
						
							| 
									
										
										
										
											2016-08-13 01:37:30 +03:00
										 |  |  | 					// XXX not sure which definition rules to use for macros...
 | 
					
						
							|  |  |  | 					// 		- first define -- implemented now
 | 
					
						
							|  |  |  | 					// 		- last define -- as in slots
 | 
					
						
							|  |  |  | 					// 		- first contenr -- original
 | 
					
						
							|  |  |  | 					//if(elem.html().trim() != ''){
 | 
					
						
							|  |  |  | 					if(elem.html().trim() != ''  | 
					
						
							|  |  |  | 							// do not redefine...
 | 
					
						
							|  |  |  | 							&& state.templates[name] == null){ | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 						state.templates[name] = elem.clone() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					} else if(name in state.templates) { | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 						elem = state.templates[name] } } | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-11 14:42:51 +03:00
										 |  |  | 				// fill macro...
 | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 				if(path){ | 
					
						
							| 
									
										
										
										
											2016-08-11 14:42:51 +03:00
										 |  |  | 					var pages = context.get(path) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-19 04:19:38 +03:00
										 |  |  | 					// no matching pages -- show the else block or nothing...
 | 
					
						
							| 
									
										
										
										
											2016-08-11 14:42:51 +03:00
										 |  |  | 					if(pages.length == 0){ | 
					
						
							|  |  |  | 						var e = elem | 
					
						
							|  |  |  | 							.find('else').first().clone() | 
					
						
							|  |  |  | 								.attr('src', path) | 
					
						
							|  |  |  | 						parse(e, context) | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 						return e }  | 
					
						
							| 
									
										
										
										
											2016-08-11 14:42:51 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-19 04:19:38 +03:00
										 |  |  | 					// see if we need to overload attrs...
 | 
					
						
							|  |  |  | 					sort = sort == null ? (elem.attr('sort') || '') : sort | 
					
						
							|  |  |  | 					sort = sort | 
					
						
							|  |  |  | 							.split(/\s+/g) | 
					
						
							|  |  |  | 							.filter(function(e){ return e && e != '' }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					// do the sorting...
 | 
					
						
							|  |  |  | 					pages = sort.length > 0 ? pages.sort(sort) : pages | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-11 14:42:51 +03:00
										 |  |  | 					// fill with pages...
 | 
					
						
							|  |  |  | 					elem = elem.clone() | 
					
						
							|  |  |  | 						.find('else') | 
					
						
							|  |  |  | 							.remove() | 
					
						
							|  |  |  | 						.end() | 
					
						
							|  |  |  | 					return $(pages | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 						.map(function(page){ | 
					
						
							|  |  |  | 							var e = elem.clone() | 
					
						
							|  |  |  | 								.attr('src', page.path) | 
					
						
							|  |  |  | 							parse(e, page) | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 							return e[0] })) } | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-29 19:37:05 +03:00
										 |  |  | 				return '' }), | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-07-27 00:08:11 +03:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	// Post macros... 
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							| 
									
										
										
										
											2016-08-15 17:36:33 +03:00
										 |  |  | 	// XXX this is disabled for now, see end of .parse(..)
 | 
					
						
							| 
									
										
										
										
											2016-07-27 00:08:11 +03:00
										 |  |  | 	post_macro: { | 
					
						
							| 
									
										
										
										
											2016-08-15 17:36:33 +03:00
										 |  |  | 		'*': Macro('cleanup...', | 
					
						
							|  |  |  | 			[], | 
					
						
							|  |  |  | 			function(context, elem, state, parse, match){ | 
					
						
							|  |  |  | 				if(match != null){ | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 					return match[0] == '\\' ?  | 
					
						
							|  |  |  | 						match.slice(1)  | 
					
						
							|  |  |  | 						: match } | 
					
						
							|  |  |  | 				return elem }), | 
					
						
							| 
									
										
										
										
											2016-07-28 09:07:46 +03:00
										 |  |  | 		/* | 
					
						
							|  |  |  | 		_slot: Macro('', | 
					
						
							| 
									
										
										
										
											2016-07-27 00:08:11 +03:00
										 |  |  | 			['name'], | 
					
						
							|  |  |  | 			function(context, elem, state){ | 
					
						
							|  |  |  | 				var name = $(elem).attr('name') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				if(state.slots[name] == null){ | 
					
						
							|  |  |  | 					return $(elem).html() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				} else if(name in state.slots){ | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 					return state.slots[name] } }), | 
					
						
							| 
									
										
										
										
											2016-07-28 09:07:46 +03:00
										 |  |  | 		//*/
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		/* | 
					
						
							|  |  |  | 		// XXX rename to post-include and post-quote
 | 
					
						
							|  |  |  | 		'page-text': Macro('', | 
					
						
							|  |  |  | 			['src'], | 
					
						
							|  |  |  | 			function(context, elem, state){ | 
					
						
							| 
									
										
										
										
											2022-03-31 01:18:09 +03:00
										 |  |  | 				return $(elem) | 
					
						
							|  |  |  | 					.html(context.get(elem.attr('src')).text) }), | 
					
						
							| 
									
										
										
										
											2016-07-28 09:07:46 +03:00
										 |  |  | 		'page-raw': Macro('', | 
					
						
							|  |  |  | 			['src'], | 
					
						
							|  |  |  | 			function(context, elem, state){ | 
					
						
							| 
									
										
										
										
											2022-03-31 01:18:09 +03:00
										 |  |  | 				return $(elem) | 
					
						
							|  |  |  | 					.text(context.get(elem.attr('src')).text) }), | 
					
						
							| 
									
										
										
										
											2016-07-28 09:07:46 +03:00
										 |  |  | 		//*/
 | 
					
						
							| 
									
										
										
										
											2016-07-27 00:08:11 +03:00
										 |  |  | 	}, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Filters...
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	// Signature:
 | 
					
						
							|  |  |  | 	// 	filter(text) -> html
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	filter: { | 
					
						
							|  |  |  | 		default: 'html', | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 		html: function(context, elem){  | 
					
						
							|  |  |  | 			return $(elem) }, | 
					
						
							|  |  |  | 		text: function(context, elem){  | 
					
						
							|  |  |  | 			return $('<span>') | 
					
						
							|  |  |  | 				.append($('<pre>') | 
					
						
							|  |  |  | 					.html($(elem).html())) }, | 
					
						
							| 
									
										
										
										
											2016-07-27 02:13:15 +03:00
										 |  |  | 		// XXX expperimental...
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 		json: function(context, elem){  | 
					
						
							|  |  |  | 			return $('<span>') | 
					
						
							|  |  |  | 				.html($(elem).text() | 
					
						
							|  |  |  | 					// remove JS comments...
 | 
					
						
							|  |  |  | 					.replace(/\s*\/\/.*$|\s*\/\*(.|[\n\r])*?\*\/\s*/mg, '')) }, | 
					
						
							| 
									
										
										
										
											2016-07-27 00:08:11 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// XXX
 | 
					
						
							| 
									
										
										
										
											2016-07-27 02:38:17 +03:00
										 |  |  | 		nl2br: function(context, elem){  | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			return $('<div>') | 
					
						
							|  |  |  | 				.html($(elem) | 
					
						
							|  |  |  | 					.html() | 
					
						
							|  |  |  | 					.replace(/\n/g, '<br>\n')) }, | 
					
						
							| 
									
										
										
										
											2016-07-27 00:08:11 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		wikiword: function(context, elem){  | 
					
						
							|  |  |  | 			return $('<span>') | 
					
						
							| 
									
										
										
										
											2022-03-31 01:18:09 +03:00
										 |  |  | 				.html(setWikiWords( | 
					
						
							|  |  |  | 					$(elem).html(),  | 
					
						
							|  |  |  | 					true,  | 
					
						
							|  |  |  | 					this.__include_marker__)) }, | 
					
						
							| 
									
										
										
										
											2016-08-02 02:05:49 +03:00
										 |  |  | 		// XXX need to remove all on* event handlers...
 | 
					
						
							| 
									
										
										
										
											2016-08-01 19:49:46 +03:00
										 |  |  | 		noscript: function(context, elem){  | 
					
						
							|  |  |  | 			return $(elem) | 
					
						
							|  |  |  | 				// remove script tags...
 | 
					
						
							|  |  |  | 				.find('script') | 
					
						
							|  |  |  | 					.remove() | 
					
						
							|  |  |  | 					.end() | 
					
						
							|  |  |  | 				// remove js links...
 | 
					
						
							|  |  |  | 				.find('[href]') | 
					
						
							| 
									
										
										
										
											2022-03-29 19:37:05 +03:00
										 |  |  | 					.filter(function(i, e){  | 
					
						
							|  |  |  | 							return /javascript:/i.test($(e).attr('href')) }) | 
					
						
							| 
									
										
										
										
											2016-08-01 19:49:46 +03:00
										 |  |  | 						.attr('href', '#') | 
					
						
							|  |  |  | 						.end() | 
					
						
							|  |  |  | 					.end() | 
					
						
							|  |  |  | 				// remove event handlers...
 | 
					
						
							|  |  |  | 				// XXX .off() will not work here as we need to remove on* handlers...
 | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2016-07-27 16:59:17 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// XXX move this to a plugin...
 | 
					
						
							|  |  |  | 		markdown: function(context, elem){ | 
					
						
							| 
									
										
										
										
											2016-07-31 06:22:35 +03:00
										 |  |  | 			var converter = new showdown.Converter({ | 
					
						
							|  |  |  | 				strikethrough: true, | 
					
						
							|  |  |  | 				tables: true, | 
					
						
							|  |  |  | 				tasklists: true, | 
					
						
							|  |  |  | 			}) | 
					
						
							| 
									
										
										
										
											2016-07-27 16:59:17 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-27 17:04:38 +03:00
										 |  |  | 			return $('<span>') | 
					
						
							|  |  |  | 				.html(converter.makeHtml($(elem).html())) | 
					
						
							| 
									
										
										
										
											2016-07-31 06:22:35 +03:00
										 |  |  | 				// XXX add click handling to checkboxes...
 | 
					
						
							|  |  |  | 				.find('[checked]') | 
					
						
							|  |  |  | 					.parent() | 
					
						
							|  |  |  | 						.addClass('checked') | 
					
						
							|  |  |  | 						.end() | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 					.end() }, | 
					
						
							| 
									
										
										
										
											2016-07-27 00:08:11 +03:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-07-25 22:08:44 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-16 02:47:01 +03:00
										 |  |  | 	// Post-filters...
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	// These are run on the final page.
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	// The main goal is to setup editors and other active stuff that the
 | 
					
						
							|  |  |  | 	// user should not have direct access to, but that should be 
 | 
					
						
							|  |  |  | 	// configurable per instance...
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	// for tech and other details see .filter
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	post_filter: { | 
					
						
							|  |  |  | 		noscript: function(context, elem){ | 
					
						
							|  |  |  | 			// XXX
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			return elem }, | 
					
						
							| 
									
										
										
										
											2016-08-16 02:47:01 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-16 03:10:33 +03:00
										 |  |  | 		// Setup the page title and .title element...
 | 
					
						
							|  |  |  | 		//
 | 
					
						
							|  |  |  | 		// Use the text from:
 | 
					
						
							|  |  |  | 		// 	1) set it H1 if it is the first tag in .text
 | 
					
						
							|  |  |  | 		// 	2) set it to .location
 | 
					
						
							|  |  |  | 		//
 | 
					
						
							| 
									
										
										
										
											2016-08-16 02:47:01 +03:00
										 |  |  | 		title: function(context, elem){ | 
					
						
							|  |  |  | 			elem = $(elem) | 
					
						
							|  |  |  | 			var title = elem.find('.text h1').first() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			// show first H1 as title...
 | 
					
						
							|  |  |  | 			if(elem.find('.text').text().trim().indexOf(title.text().trim()) == 0){ | 
					
						
							|  |  |  | 				title.detach() | 
					
						
							| 
									
										
										
										
											2016-08-16 03:10:33 +03:00
										 |  |  | 				elem.find('.title').html(title.html()) | 
					
						
							| 
									
										
										
										
											2016-08-16 02:47:01 +03:00
										 |  |  | 				$('title').html(title.text()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			// show location...
 | 
					
						
							|  |  |  | 			} else { | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 				$('title').text(context.location) } | 
					
						
							| 
									
										
										
										
											2016-08-16 02:47:01 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			return elem }, | 
					
						
							| 
									
										
										
										
											2016-08-16 02:47:01 +03:00
										 |  |  | 		// XXX this needs save/reload...
 | 
					
						
							|  |  |  | 		editor: function(context, elem){ | 
					
						
							|  |  |  | 			// XXX title
 | 
					
						
							| 
									
										
										
										
											2016-08-16 03:10:33 +03:00
										 |  |  | 			// 		- on focus set it to .title
 | 
					
						
							| 
									
										
										
										
											2016-08-16 02:47:01 +03:00
										 |  |  | 			// XXX text
 | 
					
						
							|  |  |  | 			// XXX raw
 | 
					
						
							|  |  |  | 			// XXX checkbox
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			return elem }, | 
					
						
							| 
									
										
										
										
											2016-08-16 02:47:01 +03:00
										 |  |  | 	}, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-07 16:46:29 +03:00
										 |  |  | 	//
 | 
					
						
							| 
									
										
										
										
											2016-07-27 00:10:14 +03:00
										 |  |  | 	// Parsing:
 | 
					
						
							|  |  |  | 	//  1) expand macros
 | 
					
						
							|  |  |  | 	//  2) apply filters
 | 
					
						
							|  |  |  | 	//  3) merge and parse included pages:
 | 
					
						
							|  |  |  | 	//  	1) expand macros
 | 
					
						
							|  |  |  | 	//  	2) apply filters
 | 
					
						
							| 
									
										
										
										
											2016-07-28 09:07:46 +03:00
										 |  |  | 	//  4) fill slots
 | 
					
						
							|  |  |  | 	//  5) expand post-macros
 | 
					
						
							| 
									
										
										
										
											2016-07-27 00:10:14 +03:00
										 |  |  | 	//
 | 
					
						
							|  |  |  | 	// NOTE: stage 4 parsing is executed on the final merged page only 
 | 
					
						
							|  |  |  | 	// 		once. i.e. it is not performed on the included pages.
 | 
					
						
							|  |  |  | 	// NOTE: included pages are parsed in their own context.
 | 
					
						
							|  |  |  | 	// NOTE: slots are parsed in the context of their containing page 
 | 
					
						
							|  |  |  | 	// 		and not in the location they are being placed.
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	// XXX support quoted text...
 | 
					
						
							| 
									
										
										
										
											2016-07-27 02:13:15 +03:00
										 |  |  | 	// XXX need to quote regexp chars of .__include_marker__...
 | 
					
						
							| 
									
										
										
										
											2016-08-13 01:37:30 +03:00
										 |  |  | 	// XXX include recursion is detected but path recursion is not at 
 | 
					
						
							|  |  |  | 	// 		this point...
 | 
					
						
							|  |  |  | 	// 		e.g. the folowing paths resolve to the same page:
 | 
					
						
							|  |  |  | 	// 			/SomePage
 | 
					
						
							|  |  |  | 	// 			/SomePage/SomePage
 | 
					
						
							|  |  |  | 	// 			or any path matching:
 | 
					
						
							|  |  |  | 	// 				/\/(SomePage\/)+/
 | 
					
						
							| 
									
										
										
										
											2016-07-27 00:08:11 +03:00
										 |  |  | 	parse: function(context, text, state, skip_post, pattern){ | 
					
						
							| 
									
										
										
										
											2016-07-25 22:08:44 +03:00
										 |  |  | 		var that = this | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		state = state || {} | 
					
						
							|  |  |  | 		state.filters = state.filters || [] | 
					
						
							| 
									
										
										
										
											2016-08-15 21:55:20 +03:00
										 |  |  | 		//state.slots = state.slots || {}
 | 
					
						
							| 
									
										
										
										
											2016-07-25 22:08:44 +03:00
										 |  |  | 		state.include = state.include || [] | 
					
						
							| 
									
										
										
										
											2016-08-13 01:37:30 +03:00
										 |  |  | 		state.seen = state.seen || [] | 
					
						
							| 
									
										
										
										
											2016-07-25 22:08:44 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-27 00:08:11 +03:00
										 |  |  | 		//pattern = pattern || RegExp('@([a-zA-Z-_]+)\\(([^)]*)\\)', 'mg')
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 		pattern = pattern  | 
					
						
							|  |  |  | 			|| RegExp.apply(null, this.__macro__pattern__) | 
					
						
							| 
									
										
										
										
											2016-07-27 00:08:11 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// XXX need to quote regexp chars...
 | 
					
						
							|  |  |  | 		var include_marker = RegExp(this.__include_marker__, 'g') | 
					
						
							| 
									
										
										
										
											2016-07-26 07:53:44 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 		var parsed =  | 
					
						
							|  |  |  | 			typeof(text) == typeof('str') ?  | 
					
						
							|  |  |  | 				$('<span>').html(text)  | 
					
						
							|  |  |  | 				: text | 
					
						
							| 
									
										
										
										
											2016-07-26 07:53:44 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-25 22:08:44 +03:00
										 |  |  | 		var _parseText = function(context, text, macro){ | 
					
						
							|  |  |  | 			return text.replace(pattern, function(match){ | 
					
						
							| 
									
										
										
										
											2016-08-15 17:36:33 +03:00
										 |  |  | 				// quoted macro...
 | 
					
						
							|  |  |  | 				if(match[0] == '\\' && macro['*'] == null){ | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 					return match.slice(1) } | 
					
						
							|  |  |  | 					//return match }
 | 
					
						
							| 
									
										
										
										
											2016-08-15 17:36:33 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-25 22:08:44 +03:00
										 |  |  | 				// XXX parse match...
 | 
					
						
							| 
									
										
										
										
											2016-07-27 02:13:15 +03:00
										 |  |  | 				var d = match.match(/@([a-zA-Z-_:]*)\(([^)]*)\)/) | 
					
						
							| 
									
										
										
										
											2016-07-26 07:07:51 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				var name = d[1] | 
					
						
							| 
									
										
										
										
											2016-07-25 22:08:44 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-15 17:36:33 +03:00
										 |  |  | 				if(name in macro || '*' in macro){ | 
					
						
							| 
									
										
										
										
											2016-07-26 07:07:51 +03:00
										 |  |  | 					var elem = $('<'+name+'/>') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-15 17:36:33 +03:00
										 |  |  | 					name = name in macro ? name : '*' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-26 07:07:51 +03:00
										 |  |  | 					// format positional args....
 | 
					
						
							|  |  |  | 					var a = d[2] | 
					
						
							|  |  |  | 						.split(/((['"]).*?\2)|\s+/g) | 
					
						
							|  |  |  | 						// cleanup...
 | 
					
						
							| 
									
										
										
										
											2022-03-31 01:18:09 +03:00
										 |  |  | 						.filter(function(e){  | 
					
						
							|  |  |  | 							return e  | 
					
						
							|  |  |  | 								&& e != ''  | 
					
						
							|  |  |  | 								&& !/^['"]$/.test(e)}) | 
					
						
							| 
									
										
										
										
											2016-07-26 07:07:51 +03:00
										 |  |  | 						// remove quotes...
 | 
					
						
							| 
									
										
										
										
											2022-03-31 01:18:09 +03:00
										 |  |  | 						.map(function(e){  | 
					
						
							|  |  |  | 							return /^(['"]).*\1$/.test(e) ?  | 
					
						
							|  |  |  | 								e.slice(1, -1)  | 
					
						
							|  |  |  | 								: e }) | 
					
						
							| 
									
										
										
										
											2016-07-26 07:07:51 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 					// add the attrs to the element...
 | 
					
						
							| 
									
										
										
										
											2016-08-15 17:36:33 +03:00
										 |  |  | 					name != '*'  | 
					
						
							|  |  |  | 						&& a.forEach(function(e, i){ | 
					
						
							|  |  |  | 							var k = ((macro[name] || {}).macro_args || [])[i] | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 							k && elem.attr(k, e) }) | 
					
						
							| 
									
										
										
										
											2016-07-26 07:07:51 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 					// call macro...
 | 
					
						
							| 
									
										
										
										
											2016-07-28 09:07:46 +03:00
										 |  |  | 					var res = macro[name] | 
					
						
							|  |  |  | 						.call(that, context, elem, state, | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 							function(elem, c){  | 
					
						
							| 
									
										
										
										
											2016-08-15 17:36:33 +03:00
										 |  |  | 								return _parse(c || context, elem, macro) }, | 
					
						
							|  |  |  | 							match) | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 					return res instanceof jQuery ?  | 
					
						
							|  |  |  | 							// merge html of the returned set of elements...
 | 
					
						
							| 
									
										
										
										
											2022-03-31 01:18:09 +03:00
										 |  |  | 							res | 
					
						
							|  |  |  | 								.map(function(i, e){  | 
					
						
							|  |  |  | 									return e.outerHTML }) | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 								.toArray() | 
					
						
							|  |  |  | 								.join('\n') | 
					
						
							| 
									
										
										
										
											2022-03-31 01:18:09 +03:00
										 |  |  | 						: typeof(res) != typeof('str') ?  | 
					
						
							|  |  |  | 							res.outerHTML | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 						: res } | 
					
						
							| 
									
										
										
										
											2016-07-25 22:08:44 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 				return match }) } | 
					
						
							| 
									
										
										
										
											2016-07-26 07:53:44 +03:00
										 |  |  | 		// NOTE: this modifies parsed in-place...
 | 
					
						
							| 
									
										
										
										
											2016-07-25 22:08:44 +03:00
										 |  |  | 		var _parse = function(context, parsed, macro){ | 
					
						
							| 
									
										
										
										
											2016-07-26 07:53:44 +03:00
										 |  |  | 			$(parsed).contents().each(function(_, e){ | 
					
						
							| 
									
										
										
										
											2016-07-27 01:07:41 +03:00
										 |  |  | 				// #text / comment node -> parse the @... macros...
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 				if(e.nodeType == e.TEXT_NODE  | 
					
						
							|  |  |  | 						|| e.nodeType == e.COMMENT_NODE){ | 
					
						
							| 
									
										
										
										
											2016-07-27 01:07:41 +03:00
										 |  |  | 					// get actual element content...
 | 
					
						
							|  |  |  | 					var text = $('<div>').append($(e).clone()).html() | 
					
						
							| 
									
										
										
										
											2016-07-26 07:07:51 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-20 00:56:37 +03:00
										 |  |  | 					// conditional comment...
 | 
					
						
							|  |  |  | 					if(e.nodeType == e.COMMENT_NODE  | 
					
						
							| 
									
										
										
										
											2016-08-20 01:14:11 +03:00
										 |  |  | 							&& /^<!--\s*\[pWiki\[(.|\n)*\]\]\s*-->$/.test(text)){ | 
					
						
							|  |  |  | 						text = text | 
					
						
							|  |  |  | 							.replace(/^<!--\s*\[pWiki\[/, '') | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 							.replace(/\]\]\s*-->$/, '') } | 
					
						
							| 
									
										
										
										
											2016-08-20 00:56:37 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-27 01:07:41 +03:00
										 |  |  | 					$(e).replaceWith(_parseText(context, text, macro)) | 
					
						
							| 
									
										
										
										
											2016-07-25 22:08:44 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				// node -> html-style + attrs...
 | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					var name = e.nodeName.toLowerCase() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-09 02:09:55 +03:00
										 |  |  | 					// parse attr values...
 | 
					
						
							|  |  |  | 					for(var i=0; i < e.attributes.length; i++){ | 
					
						
							|  |  |  | 						var attr = e.attributes[i] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 						attr.value = _parseText(context, attr.value, macro) } | 
					
						
							| 
									
										
										
										
											2016-08-09 02:09:55 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-26 07:07:51 +03:00
										 |  |  | 					// macro match -> call macro...
 | 
					
						
							| 
									
										
										
										
											2016-07-25 22:08:44 +03:00
										 |  |  | 					if(name in  macro){ | 
					
						
							| 
									
										
										
										
											2016-07-28 09:07:46 +03:00
										 |  |  | 						$(e).replaceWith(macro[name] | 
					
						
							|  |  |  | 							.call(that, context, e, state,  | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 								function(elem, c){  | 
					
						
							|  |  |  | 									return _parse(c || context, elem, macro) })) | 
					
						
							| 
									
										
										
										
											2016-07-25 22:08:44 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-09 02:09:55 +03:00
										 |  |  | 					// normal tag -> sub-tree...
 | 
					
						
							| 
									
										
										
										
											2016-07-25 22:08:44 +03:00
										 |  |  | 					} else { | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 						_parse(context, e, macro) } } }) | 
					
						
							| 
									
										
										
										
											2016-07-25 22:08:44 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			return parsed } | 
					
						
							| 
									
										
										
										
											2016-08-16 02:47:01 +03:00
										 |  |  | 		var _filter = function(lst, filters){ | 
					
						
							|  |  |  | 			lst | 
					
						
							|  |  |  | 				// unique -- leave last occurance..
 | 
					
						
							|  |  |  | 				.filter(function(k, i, lst){  | 
					
						
							|  |  |  | 					return k[0] != '-' | 
					
						
							|  |  |  | 						// filter dupplicates... 
 | 
					
						
							|  |  |  | 						&& lst.slice(i+1).indexOf(k) == -1  | 
					
						
							|  |  |  | 							// filter disabled...
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 						&& lst.slice(0, i).indexOf('-' + k) == -1 }) | 
					
						
							| 
									
										
										
										
											2016-08-16 02:47:01 +03:00
										 |  |  | 				// unique -- leave first occurance..
 | 
					
						
							|  |  |  | 				//.filter(function(k, i, lst){ return lst.slice(0, i).indexOf(k) == -1 })
 | 
					
						
							|  |  |  | 				// apply the filters...
 | 
					
						
							|  |  |  | 				.forEach(function(f){ | 
					
						
							|  |  |  | 					var k = f | 
					
						
							|  |  |  | 					// get filter aliases...
 | 
					
						
							|  |  |  | 					var seen = [] | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 					while(typeof(k) == typeof('str')  | 
					
						
							|  |  |  | 							&& seen.indexOf(k) == -1){ | 
					
						
							| 
									
										
										
										
											2016-08-16 02:47:01 +03:00
										 |  |  | 						seen.push(k) | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 						k = filters[k] } | 
					
						
							| 
									
										
										
										
											2016-08-16 02:47:01 +03:00
										 |  |  | 					// could not find the filter...
 | 
					
						
							|  |  |  | 					if(!k){ | 
					
						
							|  |  |  | 						//console.warn('Unknown filter:', f)
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 						return } | 
					
						
							| 
									
										
										
										
											2016-08-16 02:47:01 +03:00
										 |  |  | 					// use the filter...
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 					parsed = k.call(that, context, parsed) }) } | 
					
						
							| 
									
										
										
										
											2016-07-25 22:08:44 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-26 07:07:51 +03:00
										 |  |  | 		// macro stage...
 | 
					
						
							|  |  |  | 		_parse(context, parsed, this.macro) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// filter stage...
 | 
					
						
							| 
									
										
										
										
											2016-08-16 02:47:01 +03:00
										 |  |  | 		_filter(state.filters.concat(this.__filters__), this.filter) | 
					
						
							| 
									
										
										
										
											2016-07-26 07:07:51 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// merge includes...
 | 
					
						
							| 
									
										
										
										
											2016-07-26 07:53:44 +03:00
										 |  |  | 		parsed | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			.html(parsed.html() | 
					
						
							|  |  |  | 				.replace(include_marker,  | 
					
						
							|  |  |  | 					function(){ | 
					
						
							|  |  |  | 						var page = state.include.shift() | 
					
						
							|  |  |  | 						var elem = $(page.shift()) | 
					
						
							|  |  |  | 						page = page.pop() | 
					
						
							|  |  |  | 						var isolated = elem.attr('isolated') == 'true' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						var seen = state.seen.slice() | 
					
						
							|  |  |  | 						if(seen.indexOf(page.path) >= 0){ | 
					
						
							|  |  |  | 							return elem.html() } | 
					
						
							|  |  |  | 						seen.push(page.path) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						return page.map(function(page){ | 
					
						
							|  |  |  | 							return $('<div>') | 
					
						
							|  |  |  | 								.append(elem | 
					
						
							|  |  |  | 									.clone() | 
					
						
							|  |  |  | 									.attr('src', page.path) | 
					
						
							|  |  |  | 									.append(that | 
					
						
							|  |  |  | 										.parse(page, | 
					
						
							|  |  |  | 											page.raw,  | 
					
						
							|  |  |  | 											{  | 
					
						
							|  |  |  | 												//slots: !isolated ? state.slots : {},
 | 
					
						
							|  |  |  | 												templates: state.templates, | 
					
						
							|  |  |  | 												seen: seen, | 
					
						
							|  |  |  | 											},  | 
					
						
							|  |  |  | 											!isolated))) | 
					
						
							|  |  |  | 											//true)))
 | 
					
						
							| 
									
										
										
										
											2022-03-29 19:37:05 +03:00
										 |  |  | 								.html() }) | 
					
						
							|  |  |  | 								.join('\n') })) | 
					
						
							| 
									
										
										
										
											2016-07-26 07:07:51 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-28 09:07:46 +03:00
										 |  |  | 		// post processing...
 | 
					
						
							| 
									
										
										
										
											2016-07-26 07:07:51 +03:00
										 |  |  | 		if(!skip_post){ | 
					
						
							| 
									
										
										
										
											2016-07-28 09:07:46 +03:00
										 |  |  | 			// fill slots...
 | 
					
						
							|  |  |  | 			// XXX need to prevent this from processing slots in editable
 | 
					
						
							|  |  |  | 			// 		elements...
 | 
					
						
							|  |  |  | 			slots = {} | 
					
						
							|  |  |  | 			// get slots...
 | 
					
						
							|  |  |  | 			parsed.find('slot') | 
					
						
							|  |  |  | 				.each(function(i, e){ | 
					
						
							|  |  |  | 					e = $(e) | 
					
						
							| 
									
										
										
										
											2016-08-15 21:55:20 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 					// XXX not sure about this...
 | 
					
						
							|  |  |  | 					// 		...check if it prevents correct slot parsing
 | 
					
						
							|  |  |  | 					// 		within an isolated include...
 | 
					
						
							|  |  |  | 					if(e.parents('[isolated="true"]').length > 0){ | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 						return } | 
					
						
							| 
									
										
										
										
											2016-08-15 21:55:20 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-28 09:07:46 +03:00
										 |  |  | 					var n = e.attr('name') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-31 01:18:09 +03:00
										 |  |  | 					n in slots  | 
					
						
							|  |  |  | 						&& e.detach() | 
					
						
							| 
									
										
										
										
											2016-07-28 09:07:46 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 					slots[n] = e }) | 
					
						
							| 
									
										
										
										
											2016-07-28 09:07:46 +03:00
										 |  |  | 			// place slots...
 | 
					
						
							|  |  |  | 			parsed.find('slot') | 
					
						
							|  |  |  | 				.each(function(i, e){ | 
					
						
							|  |  |  | 					e = $(e) | 
					
						
							| 
									
										
										
										
											2016-08-15 21:55:20 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 					// XXX not sure about this...
 | 
					
						
							|  |  |  | 					// 		...check if it prevents correct slot parsing
 | 
					
						
							|  |  |  | 					// 		within an isolated include...
 | 
					
						
							|  |  |  | 					if(e.parents('[isolated="true"]').length > 0){ | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 						return } | 
					
						
							| 
									
										
										
										
											2016-08-15 21:55:20 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-28 09:07:46 +03:00
										 |  |  | 					var n = e.attr('name') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 					e.replaceWith(slots[n]) }) | 
					
						
							| 
									
										
										
										
											2016-07-28 09:07:46 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			// post-macro...
 | 
					
						
							| 
									
										
										
										
											2016-08-15 17:36:33 +03:00
										 |  |  | 			// XXX for some odd reason this clears the backslash from 
 | 
					
						
							|  |  |  | 			// 		quoted macros in raw fields...
 | 
					
						
							|  |  |  | 			//this.post_macro 
 | 
					
						
							|  |  |  | 			//	&& _parse(context, parsed, this.post_macro)
 | 
					
						
							| 
									
										
										
										
											2016-07-26 07:07:51 +03:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-16 02:47:01 +03:00
										 |  |  | 		// post-filter stage...
 | 
					
						
							|  |  |  | 		// XXX get list from context.config...
 | 
					
						
							|  |  |  | 		_filter(this.__post_filters__, this.post_filter) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-15 17:36:33 +03:00
										 |  |  | 		// XXX shuld we get rid of the root span???
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 		return parsed.contents() }, | 
					
						
							| 
									
										
										
										
											2016-07-19 03:10:16 +03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2016-07-17 15:58:50 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-04 19:51:37 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*********************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-09 21:40:48 +03:00
										 |  |  | // XXX not sure about these...
 | 
					
						
							| 
									
										
										
										
											2016-07-19 02:23:28 +03:00
										 |  |  | // XXX add docs...
 | 
					
						
							| 
									
										
										
										
											2016-08-09 17:29:23 +03:00
										 |  |  | // XXX need to handle case: 
 | 
					
						
							|  |  |  | // 		.data is function + function returns a page
 | 
					
						
							|  |  |  | // 			-> "redirect" to that page
 | 
					
						
							|  |  |  | // 		...is changing .path a good idea for redirecting???
 | 
					
						
							| 
									
										
										
										
											2016-07-09 21:40:48 +03:00
										 |  |  | var BaseData = { | 
					
						
							| 
									
										
										
										
											2016-07-22 21:46:23 +03:00
										 |  |  | 	// Macro acces to standard page attributes (paths)...
 | 
					
						
							| 
									
										
										
										
											2022-03-31 01:18:09 +03:00
										 |  |  | 	'System/title': function(){  | 
					
						
							|  |  |  | 		return this.get('..').title }, | 
					
						
							|  |  |  | 	'System/path': function(){  | 
					
						
							|  |  |  | 		return this.dir }, | 
					
						
							|  |  |  | 	'System/dir': function(){  | 
					
						
							|  |  |  | 		return this.get('..').dir }, | 
					
						
							|  |  |  | 	'System/location': function(){  | 
					
						
							|  |  |  | 		return this.dir }, | 
					
						
							|  |  |  | 	'System/resolved': function(){  | 
					
						
							|  |  |  | 		return this.get('..').acquire() }, | 
					
						
							| 
									
										
										
										
											2016-07-10 04:30:52 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-19 03:10:16 +03:00
										 |  |  | 	// page data...
 | 
					
						
							| 
									
										
										
										
											2016-07-20 17:16:49 +03:00
										 |  |  | 	//
 | 
					
						
							|  |  |  | 	// NOTE: special case: ./raw is treated a differently when getting .text
 | 
					
						
							|  |  |  | 	// 		i.e:
 | 
					
						
							|  |  |  | 	// 			.get('./raw').text
 | 
					
						
							|  |  |  | 	// 		is the same as:
 | 
					
						
							|  |  |  | 	// 			.get('.').raw
 | 
					
						
							| 
									
										
										
										
											2022-03-31 01:18:09 +03:00
										 |  |  | 	'System/raw': function(){  | 
					
						
							|  |  |  | 		return this.get('..').raw }, | 
					
						
							|  |  |  | 	'System/text': function(){  | 
					
						
							|  |  |  | 		return this.get('..').text }, | 
					
						
							| 
									
										
										
										
											2016-07-19 03:10:16 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-19 20:42:33 +03:00
										 |  |  | 	// XXX move this to Wiki.children + rename...
 | 
					
						
							| 
									
										
										
										
											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){ | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 				return k.indexOf(p) == 0 ? | 
					
						
							|  |  |  | 					path2lst(k.slice(p.length)).shift()  | 
					
						
							|  |  |  | 					: null }) | 
					
						
							|  |  |  | 			.filter(function(e){  | 
					
						
							|  |  |  | 				return e != null }) | 
					
						
							| 
									
										
										
										
											2016-07-10 03:29:53 +03:00
										 |  |  | 			.sort() | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			.map(function(e){  | 
					
						
							|  |  |  | 				return '['+ e +']' }) | 
					
						
							|  |  |  | 			.join('<br>') }, | 
					
						
							| 
									
										
										
										
											2016-07-19 03:10:16 +03:00
										 |  |  | 	// list links to this page...
 | 
					
						
							| 
									
										
										
										
											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){ | 
					
						
							| 
									
										
										
										
											2022-03-31 01:18:09 +03:00
										 |  |  | 			;(wiki[k].links || []) | 
					
						
							|  |  |  | 				.forEach(function(l){ | 
					
						
							|  |  |  | 					;(l == p  | 
					
						
							|  |  |  | 							|| that | 
					
						
							|  |  |  | 								.get(path2lst(l).slice(0, -1)) | 
					
						
							|  |  |  | 								.acquire('./'+path2lst(l).pop()) == p) | 
					
						
							|  |  |  | 						&& res.push([l, k]) }) }) | 
					
						
							| 
									
										
										
										
											2016-07-09 21:40:48 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		return res | 
					
						
							| 
									
										
										
										
											2016-07-19 03:10:16 +03:00
										 |  |  | 			//.map(function(e){ return '['+ e[0] +'] <i>from page: ['+ e[1] +']</i>' })
 | 
					
						
							| 
									
										
										
										
											2022-03-31 01:18:09 +03:00
										 |  |  | 			.map(function(e){  | 
					
						
							|  |  |  | 				return '['+ e[1] +'] <i>-> ['+ e[0] +']</i>' }) | 
					
						
							| 
									
										
										
										
											2016-07-10 03:29:53 +03:00
										 |  |  | 			.sort() | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			.join('<br>') }, | 
					
						
							| 
									
										
										
										
											2016-07-09 21:40:48 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-07 18:25:46 +03:00
										 |  |  | 	// Page modifiers/actions...
 | 
					
						
							|  |  |  | 	// XXX these needs redirecting...
 | 
					
						
							|  |  |  | 	//'System/sort': function(){ return this.get('..').sort() },
 | 
					
						
							|  |  |  | 	//'System/reverse': function(){ return this.get('..').reverse() },
 | 
					
						
							| 
									
										
										
										
											2016-08-09 17:29:23 +03:00
										 |  |  | 	/* | 
					
						
							| 
									
										
										
										
											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] | 
					
						
							| 
									
										
										
										
											2022-03-29 19:37:05 +03:00
										 |  |  | 		return this.get('..') }, | 
					
						
							| 
									
										
										
										
											2016-08-09 17:29:23 +03:00
										 |  |  | 	//*/
 | 
					
						
							| 
									
										
										
										
											2016-07-09 21:40:48 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-04 19:51:37 +03:00
										 |  |  | // data store...
 | 
					
						
							|  |  |  | // Format:
 | 
					
						
							|  |  |  | // 	{
 | 
					
						
							|  |  |  | // 		<path>: {
 | 
					
						
							|  |  |  | // 			text: <text>,
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // 			links: [
 | 
					
						
							|  |  |  | // 				<offset>: <link>,
 | 
					
						
							|  |  |  | // 			],
 | 
					
						
							|  |  |  | // 		}
 | 
					
						
							|  |  |  | // 	}
 | 
					
						
							| 
									
										
										
										
											2016-07-19 02:23:28 +03:00
										 |  |  | //
 | 
					
						
							|  |  |  | // XXX add .json support...
 | 
					
						
							| 
									
										
										
										
											2016-08-13 03:06:35 +03:00
										 |  |  | /* | 
					
						
							| 
									
										
										
										
											2016-07-04 19:51:37 +03:00
										 |  |  | var data = { | 
					
						
							| 
									
										
										
										
											2016-08-13 01:37:30 +03:00
										 |  |  | 	// XXX might be a good idea to use this for outline...
 | 
					
						
							|  |  |  | 	'Templates/tree': { | 
					
						
							|  |  |  | 		//text: '<macro src="../**"> [@source(./path)]<br> </macro>\n'
 | 
					
						
							|  |  |  | 		text: '' | 
					
						
							|  |  |  | 			+'<div class="sortable">\n' | 
					
						
							|  |  |  | 				+'<macro src="../*">\n' | 
					
						
							|  |  |  | 					+'<div class="item">\n' | 
					
						
							|  |  |  | 						+'<span class="sort-handle">☰</span> \n' | 
					
						
							|  |  |  | 						+'<a href="#@source(./path)">@source(./title)</a>\n' | 
					
						
							|  |  |  | 						+'<span class="separator"/>\n' | 
					
						
							|  |  |  | 						+'<a class="button" href="#@source(./path)/delete">×</a>\n' | 
					
						
							|  |  |  | 					+'</div>\n' | 
					
						
							|  |  |  | 					+'<div style="padding-left: 30px">\n' | 
					
						
							|  |  |  | 						+'<include ' | 
					
						
							|  |  |  | 								+'style="display:block" ' | 
					
						
							|  |  |  | 								+'src="@source(./path)/tree" ' | 
					
						
							|  |  |  | 							+'/>\n' | 
					
						
							|  |  |  | 					+'</div>\n' | 
					
						
							|  |  |  | 				+'</macro>\n' | 
					
						
							|  |  |  | 			+'</div>\n' | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	// XXX this is essentially identical to pages, except for the path...
 | 
					
						
							| 
									
										
										
										
											2016-08-11 14:42:51 +03:00
										 |  |  | 	'Templates/all_pages': { | 
					
						
							| 
									
										
										
										
											2016-08-11 02:23:38 +03:00
										 |  |  | 		//text: '<macro src="../**"> [@source(./path)]<br> </macro>\n'
 | 
					
						
							|  |  |  | 		text: '' | 
					
						
							| 
									
										
										
										
											2016-08-13 01:37:30 +03:00
										 |  |  | 			+'<macro src="../**">\n' | 
					
						
							|  |  |  | 				+'<div class="item">\n' | 
					
						
							|  |  |  | 					+'[@source(./path)]\n' | 
					
						
							| 
									
										
										
										
											2016-08-11 02:23:38 +03:00
										 |  |  | 					+'<span class="separator"/>\n' | 
					
						
							| 
									
										
										
										
											2016-08-13 01:37:30 +03:00
										 |  |  | 					+'<a class="button" href="#@source(./path)/delete">×</a>\n' | 
					
						
							|  |  |  | 				+'</div>\n' | 
					
						
							| 
									
										
										
										
											2016-08-11 02:23:38 +03:00
										 |  |  | 			+'</macro>\n' | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-08-13 01:37:30 +03:00
										 |  |  | 	// XXX experimental...
 | 
					
						
							|  |  |  | 	// XXX need sorting...
 | 
					
						
							|  |  |  | 	'Templates/outline': { | 
					
						
							| 
									
										
										
										
											2016-08-11 14:42:51 +03:00
										 |  |  | 		text: '' | 
					
						
							| 
									
										
										
										
											2016-08-13 01:37:30 +03:00
										 |  |  | 			+'<macro name="item-pre-controls"/>\n' | 
					
						
							|  |  |  | 			+'\n' | 
					
						
							|  |  |  | 			+'<macro name="item-content">\n' | 
					
						
							|  |  |  | 				+'<include ' | 
					
						
							|  |  |  | 						+'class="raw" ' | 
					
						
							|  |  |  | 						+'contenteditable tabindex="0" ' | 
					
						
							|  |  |  | 						+'style="display:inline-block" ' | 
					
						
							|  |  |  | 						+'saveto="@source(./path)" ' | 
					
						
							|  |  |  | 						+'src="."' | 
					
						
							|  |  |  | 					+'/>\n' | 
					
						
							|  |  |  | 			+'</macro>\n' | 
					
						
							|  |  |  | 			+'\n' | 
					
						
							|  |  |  | 			+'<macro name="item-post-controls">\n' | 
					
						
							|  |  |  | 				+'<a class="button" href="#@source(./path)/delete">×</a>\n' | 
					
						
							|  |  |  | 			+'</macro>\n' | 
					
						
							|  |  |  | 			+'\n' | 
					
						
							|  |  |  | 			+'\n' | 
					
						
							|  |  |  | 			+'<div>\n' | 
					
						
							|  |  |  | 				// XXX select all on focus...
 | 
					
						
							|  |  |  | 				+'<span class="raw" contenteditable tabindex="0" ' | 
					
						
							|  |  |  | 						+'saveto="@source(../path)/@now()" style="display:inline-block">\n' | 
					
						
							|  |  |  | 					+'+\n' | 
					
						
							|  |  |  | 				+'</span>\n' | 
					
						
							|  |  |  | 			+'</div>\n' | 
					
						
							|  |  |  | 			//+'<br>\n'
 | 
					
						
							|  |  |  | 			+'<div class="sortable">\n' | 
					
						
							|  |  |  | 				+'<macro src="../*">\n' | 
					
						
							|  |  |  | 					+'<div class="item">\n' | 
					
						
							|  |  |  | 						+'<div>\n' | 
					
						
							|  |  |  | 							+'<span class="sort-handle">☰</span>\n' | 
					
						
							|  |  |  | 							+'<macro name="item-pre-controls" src="."/>\n' | 
					
						
							|  |  |  | 							+'<macro name="item-content" src="."/>\n' | 
					
						
							|  |  |  | 							+'<span class="separator"/>\n' | 
					
						
							|  |  |  | 							+'<macro name="item-post-controls" src="."/>\n' | 
					
						
							|  |  |  | 						+'</div>\n' | 
					
						
							|  |  |  | 						+'<div style="padding-left: 30px">\n' | 
					
						
							|  |  |  | 							+'<include ' | 
					
						
							|  |  |  | 									+'style="display:block" ' | 
					
						
							|  |  |  | 									+'src="@source(./path)/outline" ' | 
					
						
							|  |  |  | 								+'/>\n' | 
					
						
							|  |  |  | 						+'</div>\n' | 
					
						
							|  |  |  | 					+'</div>\n' | 
					
						
							| 
									
										
										
										
											2016-08-13 03:06:35 +03:00
										 |  |  | 					// XXX do we need this or should we just use CSS???
 | 
					
						
							|  |  |  | 					//+'<else>\n'
 | 
					
						
							|  |  |  | 					//	+'<i>No items yet...</i>\n'
 | 
					
						
							|  |  |  | 					//+'</else>\n'
 | 
					
						
							| 
									
										
										
										
											2016-08-11 16:48:14 +03:00
										 |  |  | 				+'</macro>\n' | 
					
						
							| 
									
										
										
										
											2016-08-13 01:37:30 +03:00
										 |  |  | 			+'</div>\n' | 
					
						
							|  |  |  | 			+'\n', | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	// XXX see inside...
 | 
					
						
							|  |  |  | 	'Templates/todo': { | 
					
						
							|  |  |  | 		text: '' | 
					
						
							|  |  |  | 			// XXX this feels wrong...
 | 
					
						
							|  |  |  | 			//		...and this will not wirk well with macro override rules...
 | 
					
						
							|  |  |  | 			+'<macro name="item-pre-controls">\n' | 
					
						
							|  |  |  | 			+'  <input type="checkbox"/>\n' | 
					
						
							|  |  |  | 			+'</macro>\n' | 
					
						
							|  |  |  | 			+'\n' | 
					
						
							|  |  |  | 			+'<include src="../outline">\n' | 
					
						
							| 
									
										
										
										
											2016-08-11 14:42:51 +03:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-08-13 01:37:30 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Views...
 | 
					
						
							| 
									
										
										
										
											2016-08-11 14:42:51 +03:00
										 |  |  | 	// XXX experimental...
 | 
					
						
							| 
									
										
										
										
											2016-08-13 01:37:30 +03:00
										 |  |  | 	'Templates/_outline': { | 
					
						
							| 
									
										
										
										
											2016-08-11 14:42:51 +03:00
										 |  |  | 		text: '' | 
					
						
							|  |  |  | 			+'<include src="../_view"/>\n' | 
					
						
							|  |  |  | 			+'\n' | 
					
						
							|  |  |  | 			// XXX temporary until I figure out how to deal with the saveto=".."
 | 
					
						
							|  |  |  | 			// 		in implicit vs. explicit _view
 | 
					
						
							|  |  |  | 			+'<slot name="title" class="title" contenteditable saveto="..">' | 
					
						
							|  |  |  | 				+'@source(../title)' | 
					
						
							|  |  |  | 			+'</slot>\n' | 
					
						
							|  |  |  | 			+'\n' | 
					
						
							|  |  |  | 			+'<slot name="page-content">\n' | 
					
						
							| 
									
										
										
										
											2016-08-13 01:37:30 +03:00
										 |  |  | 				+'@include(../outline)' | 
					
						
							| 
									
										
										
										
											2016-08-11 14:42:51 +03:00
										 |  |  | 			+'</slot>' | 
					
						
							|  |  |  | 			+'\n', | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-08-13 01:37:30 +03:00
										 |  |  | 	'Templates/_todo': { | 
					
						
							| 
									
										
										
										
											2016-08-11 14:42:51 +03:00
										 |  |  | 		text: '' | 
					
						
							|  |  |  | 			+'<include src="../_view"/>\n' | 
					
						
							|  |  |  | 			+'\n' | 
					
						
							|  |  |  | 			// XXX temporary until I figure out how to deal with the saveto=".."
 | 
					
						
							|  |  |  | 			// 		in implicit vs. explicit _view
 | 
					
						
							|  |  |  | 			+'<slot name="title" class="title" contenteditable saveto="..">' | 
					
						
							|  |  |  | 				+'@source(../title)' | 
					
						
							|  |  |  | 			+'</slot>\n' | 
					
						
							|  |  |  | 			+'\n' | 
					
						
							|  |  |  | 			+'<slot name="page-content">\n' | 
					
						
							| 
									
										
										
										
											2016-08-13 01:37:30 +03:00
										 |  |  | 				+'@include(../todo)' | 
					
						
							| 
									
										
										
										
											2016-08-11 14:42:51 +03:00
										 |  |  | 			+'</slot>' | 
					
						
							| 
									
										
										
										
											2016-08-13 01:37:30 +03:00
										 |  |  | 			+'\n' | 
					
						
							| 
									
										
										
										
											2016-08-11 14:42:51 +03:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-07-04 19:51:37 +03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2016-08-13 03:06:35 +03:00
										 |  |  | //*/
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | data = {} | 
					
						
							| 
									
										
										
										
											2016-07-09 21:40:48 +03:00
										 |  |  | data.__proto__ = BaseData | 
					
						
							| 
									
										
										
										
											2016-07-04 19:51:37 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-09 17:29:23 +03:00
										 |  |  | // XXX experimental...
 | 
					
						
							|  |  |  | // 		...for some reason these are called twice...
 | 
					
						
							|  |  |  | var PathActions = { | 
					
						
							| 
									
										
										
										
											2022-04-07 16:46:29 +03:00
										 |  |  | 	// XXX
 | 
					
						
							| 
									
										
										
										
											2016-08-09 17:29:23 +03:00
										 |  |  | 	test: function(){ | 
					
						
							|  |  |  | 		var p = path2lst(this.location) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		console.log('!!! TEST !!!') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-07 16:46:29 +03:00
										 |  |  | 		this.location = p.slice(0, -1) }, | 
					
						
							| 
									
										
										
										
											2016-08-09 17:29:23 +03:00
										 |  |  | 	delete: function(){ | 
					
						
							|  |  |  | 		var p = normalizePath(path2lst(this.location).slice(0, -1)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		console.log('!!! DELETE: %s !!!', p) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		delete this.__wiki_data[p] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 		this.location = p }, | 
					
						
							| 
									
										
										
										
											2016-08-09 17:29:23 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-07 18:25:46 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-09 19:16:25 +03:00
										 |  |  | /*********************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-19 02:23:28 +03:00
										 |  |  | // XXX add .json support...
 | 
					
						
							| 
									
										
										
										
											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-08-16 02:47:01 +03:00
										 |  |  | 	__config_page__: 'System/settings', | 
					
						
							| 
									
										
										
										
											2016-07-27 02:13:15 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-05 16:58:04 +03:00
										 |  |  | 	__home_page__: 'WikiHome', | 
					
						
							| 
									
										
										
										
											2016-07-27 02:13:15 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-08 01:40:59 +03:00
										 |  |  | 	__default_page__: 'EmptyPage', | 
					
						
							| 
									
										
										
										
											2016-07-27 02:13:15 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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-27 02:13:15 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-11 17:57:28 +03:00
										 |  |  | 	__post_acquesition_order__: [ | 
					
						
							|  |  |  | 	], | 
					
						
							| 
									
										
										
										
											2016-07-27 02:13:15 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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-08-20 00:56:37 +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-27 00:10:14 +03:00
										 |  |  | 	__macro_parser__: macro, | 
					
						
							| 
									
										
										
										
											2016-07-27 00:08:11 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-05 16:58:04 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-07 18:25:46 +03:00
										 |  |  | 	// Resolve path variables...
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	// Supported vars:
 | 
					
						
							|  |  |  | 	// 	$NOW		- resolves to 'P'+Date.now()
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	resolvePathVars: function(path){ | 
					
						
							|  |  |  | 		return path | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			.replace(/\$NOW|\$\{NOW\}/g, ''+Date.now()) }, | 
					
						
							| 
									
										
										
										
											2016-08-09 17:29:23 +03:00
										 |  |  | 	resolvePathActions: function(){ | 
					
						
							| 
									
										
										
										
											2016-08-10 16:36:18 +03:00
										 |  |  | 		// XXX this can happen when we are getting '.../*' of an empty item...
 | 
					
						
							|  |  |  | 		if(this.path == null){ | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			return this } | 
					
						
							| 
									
										
										
										
											2016-08-10 16:36:18 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-09 17:29:23 +03:00
										 |  |  | 		var p = path2lst(this.path).pop() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if(p in PathActions){ | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			return PathActions[p].call(this) } | 
					
						
							| 
									
										
										
										
											2016-08-09 17:29:23 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 		return this }, | 
					
						
							| 
									
										
										
										
											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) | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			: path }, | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 	// Get list of paths resolving '*' and '**'
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	// XXX should we list parent pages???
 | 
					
						
							|  |  |  | 	// XXX should this acquire stuff???
 | 
					
						
							| 
									
										
										
										
											2016-08-07 18:25:46 +03:00
										 |  |  | 	// XXX should this support sorting and reversing???
 | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 	resolveStarPath: function(path){ | 
					
						
							|  |  |  | 		// no pattern in path -> return as-is...
 | 
					
						
							|  |  |  | 		if(path.indexOf('*') < 0){ | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			return [ path ] } | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// get the tail...
 | 
					
						
							|  |  |  | 		var tail = path.split(/\*/g).pop() | 
					
						
							|  |  |  | 		tail = tail == path ? '' : tail | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		var pattern = RegExp('^' | 
					
						
							|  |  |  | 			+normalizePath(path) | 
					
						
							|  |  |  | 				// quote regexp chars...
 | 
					
						
							|  |  |  | 				.replace(/([\.\\\/\(\)\[\]\$\+\-\{\}\@\^\&\?\<\>])/g, '\\$1') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				// convert '*' and '**' to regexp...
 | 
					
						
							|  |  |  | 				.replace(/\*\*/g, '.*') | 
					
						
							|  |  |  | 				.replace(/^\*|([^.])\*/g, '$1[^\\/]*') | 
					
						
							|  |  |  | 			+'$') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-01 19:49:46 +03:00
										 |  |  | 		var data = this.__wiki_data | 
					
						
							|  |  |  | 		return Object.keys(data) | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			// XXX is this correct???
 | 
					
						
							|  |  |  | 			.concat(Object.keys(data.__proto__) | 
					
						
							|  |  |  | 				// do not repeat overloaded stuff...
 | 
					
						
							|  |  |  | 				.filter(function(e){  | 
					
						
							|  |  |  | 					return !data.hasOwnProperty(e) })) | 
					
						
							|  |  |  | 			.map(function(p){  | 
					
						
							|  |  |  | 				return tail != '' ?  | 
					
						
							|  |  |  | 					normalizePath(p +'/'+ tail)  | 
					
						
							|  |  |  | 					: p }) | 
					
						
							|  |  |  | 			.filter(function(p){  | 
					
						
							|  |  |  | 				return pattern.test(p) }) }, | 
					
						
							| 
									
										
										
										
											2016-07-09 19:16:25 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-04 20:42:46 +03:00
										 |  |  | 	// current location...
 | 
					
						
							| 
									
										
										
										
											2016-07-04 19:51:37 +03:00
										 |  |  | 	get location(){ | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 		return this.__location  | 
					
						
							|  |  |  | 			|| this.__home_page__ }, | 
					
						
							| 
									
										
										
										
											2016-07-04 19:51:37 +03:00
										 |  |  | 	set location(value){ | 
					
						
							| 
									
										
										
										
											2016-08-04 23:35:54 +03:00
										 |  |  | 		delete this.__order | 
					
						
							| 
									
										
										
										
											2016-08-07 18:25:46 +03:00
										 |  |  | 		delete this.__order_by | 
					
						
							|  |  |  | 		this.__location = this.resolvePathVars(this.resolveDotPath(value)) | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 		this.resolvePathActions() }, | 
					
						
							| 
									
										
										
										
											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-08-13 20:02:16 +03:00
										 |  |  | 	attr: function(name, value){ | 
					
						
							|  |  |  | 		// no args...
 | 
					
						
							|  |  |  | 		if(arguments.length == 0){ | 
					
						
							|  |  |  | 			return this | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// name...
 | 
					
						
							|  |  |  | 		} else if(arguments.length == 1  | 
					
						
							|  |  |  | 				&& typeof(name) == typeof('str')){ | 
					
						
							|  |  |  | 			return this.data[name] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// object...
 | 
					
						
							|  |  |  | 		} else if(arguments.length == 1){ | 
					
						
							|  |  |  | 			var that = this | 
					
						
							|  |  |  | 			Object.keys(name).forEach(function(k){ | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 				that.data[k] = name[k] }) | 
					
						
							| 
									
										
										
										
											2016-08-13 20:02:16 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// name value pair...
 | 
					
						
							|  |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			this.data[name] = value } | 
					
						
							| 
									
										
										
										
											2016-08-13 20:02:16 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 		return this }, | 
					
						
							| 
									
										
										
										
											2016-07-11 18:41:23 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-27 02:13:15 +03:00
										 |  |  | 	// XXX experimental...
 | 
					
						
							| 
									
										
										
										
											2016-07-22 21:46:23 +03:00
										 |  |  | 	get config(){ | 
					
						
							| 
									
										
										
										
											2016-07-27 03:19:01 +03:00
										 |  |  | 		try{ | 
					
						
							|  |  |  | 			return JSON.parse(this.get(this.__config_page__).code) || {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		} catch(err){ | 
					
						
							|  |  |  | 			console.error('CONFIG:', err) | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			return {} } }, | 
					
						
							| 
									
										
										
										
											2016-07-22 21:46:23 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-11 18:41:23 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-19 02:40:51 +03:00
										 |  |  | 	clone: function(){ | 
					
						
							|  |  |  | 		var o = Object.create(Wiki) | 
					
						
							|  |  |  | 		o.location = this.location | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 		//o.__location_at = this.__location_at
 | 
					
						
							| 
									
										
										
										
											2016-08-04 23:35:54 +03:00
										 |  |  | 		// XXX
 | 
					
						
							|  |  |  | 		o.__parent = this | 
					
						
							| 
									
										
										
										
											2016-09-03 02:17:22 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if(this.__order){ | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			o.__order = this.__order.slice() } | 
					
						
							| 
									
										
										
										
											2016-09-03 02:17:22 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 		return o }, | 
					
						
							| 
									
										
										
										
											2016-08-04 23:35:54 +03:00
										 |  |  | 	end: function(){ | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 		return this.__parent  | 
					
						
							|  |  |  | 			|| this }, | 
					
						
							| 
									
										
										
										
											2016-07-19 02:40:51 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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-08-10 16:36:18 +03:00
										 |  |  | 	//
 | 
					
						
							|  |  |  | 	// XXX this can be null if we are getting '.../*' of an empty item...
 | 
					
						
							| 
									
										
										
										
											2016-07-04 20:42:46 +03:00
										 |  |  | 	get path(){  | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 		return (this.__order  | 
					
						
							|  |  |  | 				|| this.resolveStarPath(this.location))[this.at()] }, | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 	// XXX should link updating be part of this???
 | 
					
						
							| 
									
										
										
										
											2016-07-11 19:22:00 +03:00
										 |  |  | 	// XXX use a template for the redirect page...
 | 
					
						
							| 
									
										
										
										
											2016-08-04 23:35:54 +03:00
										 |  |  | 	// XXX need to skip explicit '.' and '..' paths...
 | 
					
						
							| 
									
										
										
										
											2016-07-04 19:51:37 +03:00
										 |  |  | 	set path(value){ | 
					
						
							| 
									
										
										
										
											2016-08-07 18:25:46 +03:00
										 |  |  | 		value = this.resolvePathVars(this.resolveDotPath(value)) | 
					
						
							| 
									
										
										
										
											2016-07-04 20:42:46 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-09 06:26:16 +03:00
										 |  |  | 		var l = this.location | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-04 16:51:20 +03:00
										 |  |  | 		if(value == l || value == ''){ | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			return } | 
					
						
							| 
									
										
										
										
											2016-07-09 06:26:16 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// old...
 | 
					
						
							|  |  |  | 		var otitle = this.title | 
					
						
							|  |  |  | 		var odir = this.dir | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-08 01:40:59 +03:00
										 |  |  | 		if(this.exists(l)){ | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			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-08-04 23:58:13 +03:00
										 |  |  | 		//this.get('**').map(function(page){
 | 
					
						
							| 
									
										
										
										
											2016-07-09 06:26:16 +03:00
										 |  |  | 			// skip the old page...
 | 
					
						
							|  |  |  | 			if(page.location == l){ | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 				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){ | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 					return lnk } | 
					
						
							| 
									
										
										
										
											2016-07-09 06:26:16 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				// format the new link...
 | 
					
						
							|  |  |  | 				var to = p == '' ? ntitle : p +'/'+ ntitle | 
					
						
							| 
									
										
										
										
											2016-08-01 04:19:29 +03:00
										 |  |  | 				to = lnk[0] == '[' ? '['+to+']' : to | 
					
						
							| 
									
										
										
										
											2016-07-09 06:26:16 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				// 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)
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 						return to } | 
					
						
							| 
									
										
										
										
											2016-07-09 06:26:16 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				// path changed -- keep link + add redirect page...
 | 
					
						
							|  |  |  | 				} else { | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 					redirect = true } | 
					
						
							| 
									
										
										
										
											2016-07-09 06:26:16 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				// no change...
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 				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 { | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			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(){ | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 		return path2lst(this.path).slice(0, -1).join('/') }, | 
					
						
							| 
									
										
										
										
											2016-07-04 20:42:46 +03:00
										 |  |  | 	set dir(value){ | 
					
						
							|  |  |  | 		this.path = value +'/'+ this.title }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// path parts: title...
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	// NOTE: see .path for details...
 | 
					
						
							|  |  |  | 	get title(){  | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 		return path2lst(this.path).pop() }, | 
					
						
							| 
									
										
										
										
											2016-07-04 20:42:46 +03:00
										 |  |  | 	set title(value){ | 
					
						
							| 
									
										
										
										
											2016-08-04 16:51:20 +03:00
										 |  |  | 		if(value == '' || value == null){ | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			return } | 
					
						
							| 
									
										
										
										
											2016-08-04 16:51:20 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 		this.path = this.dir +'/'+ value }, | 
					
						
							| 
									
										
										
										
											2016-07-04 20:42:46 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// page content...
 | 
					
						
							| 
									
										
										
										
											2016-08-09 17:29:23 +03:00
										 |  |  | 	//
 | 
					
						
							| 
									
										
										
										
											2016-07-12 03:22:06 +03:00
										 |  |  | 	get raw(){ | 
					
						
							| 
									
										
										
										
											2016-07-11 17:57:28 +03:00
										 |  |  | 		var data = this.data | 
					
						
							| 
									
										
										
										
											2022-03-31 01:18:09 +03:00
										 |  |  | 		data = data instanceof Function ?  | 
					
						
							|  |  |  | 			data.call(this, this)  | 
					
						
							|  |  |  | 			: data | 
					
						
							| 
									
										
										
										
											2016-08-04 23:35:54 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-31 01:18:09 +03:00
										 |  |  | 		return typeof(data) == typeof('str') ?  | 
					
						
							|  |  |  | 				data | 
					
						
							| 
									
										
										
										
											2016-08-09 17:29:23 +03:00
										 |  |  | 			: data != null ? | 
					
						
							| 
									
										
										
										
											2022-03-31 01:18:09 +03:00
										 |  |  | 				('raw' in data ?  | 
					
						
							|  |  |  | 					data.raw  | 
					
						
							|  |  |  | 					: data.text) | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			: '' }, | 
					
						
							| 
									
										
										
										
											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){ | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			return } | 
					
						
							| 
									
										
										
										
											2016-07-09 21:40:48 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 		this.__wiki_data[l].links = this.links }, | 
					
						
							| 
									
										
										
										
											2016-07-04 19:51:37 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-27 02:13:15 +03:00
										 |  |  | 	get text(){ | 
					
						
							|  |  |  | 		//return this.parse() 
 | 
					
						
							| 
									
										
										
										
											2016-07-21 16:24:45 +03:00
										 |  |  | 		// special case: if we are getting ./raw then do not parse text...
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 		return this.title == 'raw' ?  | 
					
						
							|  |  |  | 			this.raw  | 
					
						
							| 
									
										
										
										
											2016-07-27 02:13:15 +03:00
										 |  |  | 			: this.__macro_parser__.parse(this, this.raw) }, | 
					
						
							|  |  |  | 	get code(){ | 
					
						
							| 
									
										
										
										
											2016-08-16 02:47:01 +03:00
										 |  |  | 		return this.text.text() }, | 
					
						
							| 
									
										
										
										
											2016-07-19 23:13:51 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-12 03:22:06 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 	get checked(){  | 
					
						
							|  |  |  | 		return this.data.checked }, | 
					
						
							|  |  |  | 	set checked(value){  | 
					
						
							|  |  |  | 		this.data.checked = value }, | 
					
						
							| 
									
										
										
										
											2016-08-19 04:19:38 +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...
 | 
					
						
							| 
									
										
										
										
											2022-03-31 01:18:09 +03:00
										 |  |  | 				.map(function(e){  | 
					
						
							|  |  |  | 					return e[0] == '[' ?  | 
					
						
							|  |  |  | 						e.slice(1, -1)  | 
					
						
							|  |  |  | 						: e }) | 
					
						
							| 
									
										
										
										
											2016-07-07 22:21:04 +03:00
										 |  |  | 				// unique...
 | 
					
						
							| 
									
										
										
										
											2022-03-31 01:18:09 +03:00
										 |  |  | 				.filter(function(e, i, l){  | 
					
						
							|  |  |  | 					return l.slice(0, i).indexOf(e) == -1 }) | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 		return links }, | 
					
						
							| 
									
										
										
										
											2016-07-04 20:42:46 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-11 04:32:56 +03:00
										 |  |  | 	// navigation...
 | 
					
						
							|  |  |  | 	get parent(){ | 
					
						
							| 
									
										
										
										
											2016-07-12 03:22:06 +03:00
										 |  |  | 		return this.get('..') }, | 
					
						
							| 
									
										
										
										
											2016-07-19 03:10:16 +03:00
										 |  |  | 	get children(){ | 
					
						
							| 
									
										
										
										
											2016-08-04 23:35:54 +03:00
										 |  |  | 		return this | 
					
						
							|  |  |  | 			.get('./*') }, | 
					
						
							|  |  |  | 	get siblings(){ | 
					
						
							|  |  |  | 		return this | 
					
						
							|  |  |  | 			.get('../*') }, | 
					
						
							| 
									
										
										
										
											2016-07-19 03:10:16 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 	// NOTE: .get() is not the same as .clone() in that .get() will resolve
 | 
					
						
							|  |  |  | 	// 		the path to a specific location while .clone() will keep 
 | 
					
						
							|  |  |  | 	// 		everything as-is...
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							| 
									
										
										
										
											2016-07-19 02:40:51 +03:00
										 |  |  | 	// XXX add prpper insyantiation ( .clone() )...
 | 
					
						
							| 
									
										
										
										
											2016-07-11 04:32:56 +03:00
										 |  |  | 	get: function(path){ | 
					
						
							| 
									
										
										
										
											2016-07-19 02:40:51 +03:00
										 |  |  | 		//var o = Object.create(this)
 | 
					
						
							|  |  |  | 		var o = this.clone()  | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 		// NOTE: this is here to resolve path patterns...
 | 
					
						
							|  |  |  | 		o.location = this.path | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-11 17:57:28 +03:00
										 |  |  | 		o.location = path || this.path | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 		return o }, | 
					
						
							| 
									
										
										
										
											2016-07-11 04:32:56 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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-19 02:23:28 +03:00
										 |  |  | 	//
 | 
					
						
							|  |  |  | 	// XXX should we also acquire each path part???
 | 
					
						
							| 
									
										
										
										
											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){ | 
					
						
							| 
									
										
										
										
											2022-03-31 01:18:09 +03:00
										 |  |  | 			lst = (lst == null || lst.length == 0) ?  | 
					
						
							|  |  |  | 				['']  | 
					
						
							|  |  |  | 				: lst | 
					
						
							| 
									
										
										
										
											2016-07-11 17:57:28 +03:00
										 |  |  | 			for(var i=0; i < lst.length; i++){ | 
					
						
							|  |  |  | 				var p = path.concat([lst[i], title]) | 
					
						
							|  |  |  | 				if(that.exists(p)){ | 
					
						
							|  |  |  | 					p = normalizePath(p) | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 					return that.__wiki_data[p]  | 
					
						
							|  |  |  | 						&& p } } } | 
					
						
							| 
									
										
										
										
											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){ | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 				return p } | 
					
						
							| 
									
										
										
										
											2016-07-05 16:58:04 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			if(path.length == 0){ | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 				break } | 
					
						
							| 
									
										
										
										
											2016-07-05 16:58:04 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			path.pop() } | 
					
						
							| 
									
										
										
										
											2016-07-11 04:32:56 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-11 17:57:28 +03:00
										 |  |  | 		// default paths...
 | 
					
						
							| 
									
										
										
										
											2022-03-31 01:18:09 +03:00
										 |  |  | 		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__)  | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 				: null) }, | 
					
						
							| 
									
										
										
										
											2016-07-08 01:40:59 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-05 16:58:04 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 	// iteration...
 | 
					
						
							|  |  |  | 	get length(){ | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 		return (this.__order  | 
					
						
							|  |  |  | 				|| this.resolveStarPath(this.location)) | 
					
						
							|  |  |  | 			.length }, | 
					
						
							| 
									
										
										
										
											2016-09-03 02:17:22 +03:00
										 |  |  | 	// get/set postion in list of pages...
 | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 	// XXX do we need to min/max normalize n??
 | 
					
						
							|  |  |  | 	at: function(n){ | 
					
						
							|  |  |  | 		// get position...
 | 
					
						
							|  |  |  | 		if(n == null){ | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			return this.__location_at || 0 } | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		var l = this.length | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// end of list...
 | 
					
						
							|  |  |  | 		if(n >= l || n < -l){ | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			return null } | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		var res = this.clone() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		n = n < 0 ? l - n : n | 
					
						
							|  |  |  | 		// XXX do we min/max n???
 | 
					
						
							|  |  |  | 		n = Math.max(n, 0) | 
					
						
							|  |  |  | 		n = Math.min(l-1, n) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		res.__location_at = n | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 		return res }, | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 	prev: function(){  | 
					
						
							|  |  |  | 		var i = this.at() - 1 | 
					
						
							|  |  |  | 		// NOTE: need to guard against overflows...
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 		return i >= 0 ?  | 
					
						
							|  |  |  | 			this.at(i)  | 
					
						
							|  |  |  | 			: null }, | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 	next: function(){  | 
					
						
							|  |  |  | 		return this.at(this.at() + 1) }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	map: function(func){ | 
					
						
							|  |  |  | 		var res = [] | 
					
						
							|  |  |  | 		for(var i=0; i < this.length; i++){ | 
					
						
							|  |  |  | 			var page = this.at(i) | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			res.push(func.call(page, page, i)) } | 
					
						
							|  |  |  | 		return res }, | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 	filter: function(func){ | 
					
						
							|  |  |  | 		var res = [] | 
					
						
							|  |  |  | 		for(var i=0; i < this.length; i++){ | 
					
						
							|  |  |  | 			var page = this.at(i) | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			func.call(page, page, i)  | 
					
						
							|  |  |  | 				&& res.push(page) } | 
					
						
							|  |  |  | 		return res }, | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 	forEach: function(func){ | 
					
						
							|  |  |  | 		this.map(func) | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 		return this }, | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-04 23:35:54 +03:00
										 |  |  | 	// sorting...
 | 
					
						
							| 
									
										
										
										
											2016-08-19 04:19:38 +03:00
										 |  |  | 	// XXX make these not affect the general order unless they have to...
 | 
					
						
							|  |  |  | 	// XXX add a reverse method...
 | 
					
						
							| 
									
										
										
										
											2016-08-04 23:35:54 +03:00
										 |  |  | 	__default_sort_methods__: ['path'], | 
					
						
							|  |  |  | 	__sort_methods__: { | 
					
						
							|  |  |  | 		title: function(a, b){ | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			return a.page.title < b.page.title ?  | 
					
						
							|  |  |  | 					-1 | 
					
						
							|  |  |  | 				: a.page.title > b.page.title ?  | 
					
						
							|  |  |  | 					1 | 
					
						
							|  |  |  | 				: 0 }, | 
					
						
							| 
									
										
										
										
											2016-08-04 23:35:54 +03:00
										 |  |  | 		path: function(a, b){ | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			return a.page.path < b.page.path ?  | 
					
						
							|  |  |  | 					-1 | 
					
						
							|  |  |  | 				: a.page.path > b.page.path ?  | 
					
						
							|  |  |  | 					1 | 
					
						
							|  |  |  | 				: 0 }, | 
					
						
							| 
									
										
										
										
											2016-08-19 04:19:38 +03:00
										 |  |  | 		// XXX
 | 
					
						
							|  |  |  | 		checked: function(a, b){ | 
					
						
							|  |  |  | 			// XXX chech if with similar states the order is kept....
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			return a.page.checked == b.page.checked ?  | 
					
						
							|  |  |  | 					0 | 
					
						
							|  |  |  | 				: a.page.checked ?  | 
					
						
							|  |  |  | 					1 | 
					
						
							|  |  |  | 				: -1 }, | 
					
						
							| 
									
										
										
										
											2016-08-04 23:35:54 +03:00
										 |  |  | 		// XXX date, ...
 | 
					
						
							| 
									
										
										
										
											2016-08-19 18:59:55 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// XXX use manual order and palce new items (not in order) at 
 | 
					
						
							|  |  |  | 		// 		top/bottom (option)...
 | 
					
						
							|  |  |  | 		// XXX store the order in .__wiki_data
 | 
					
						
							|  |  |  | 		manual: function(a, b){ | 
					
						
							|  |  |  | 			// XXX
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			return 0 }, | 
					
						
							| 
									
										
										
										
											2016-08-04 23:35:54 +03:00
										 |  |  | 	}, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Sort siblings...
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	//	Sort pages via default method
 | 
					
						
							|  |  |  | 	//	.sort()
 | 
					
						
							|  |  |  | 	//		-> page
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	//	Sort pages via method
 | 
					
						
							|  |  |  | 	//	.sort(method)
 | 
					
						
							|  |  |  | 	//		-> page
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	//	Sort pages via method1, then method2, ...
 | 
					
						
							|  |  |  | 	//	.sort(method1, method2, ...)
 | 
					
						
							|  |  |  | 	//		-> page
 | 
					
						
							|  |  |  | 	//		NOTE: the next method is used iff the previous returns 0, 
 | 
					
						
							|  |  |  | 	//			i.e. the items are equal.
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							| 
									
										
										
										
											2016-08-19 18:59:55 +03:00
										 |  |  | 	// To reverse a specific method, prepend it's name with "-", e.g. 
 | 
					
						
							|  |  |  | 	// "title" will do the default ascending sort while "-title" will do
 | 
					
						
							|  |  |  | 	// a descending sort.
 | 
					
						
							|  |  |  | 	// This is different from the "reverse" method which will simply 
 | 
					
						
							|  |  |  | 	// reverse the result.
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							| 
									
										
										
										
											2016-08-04 23:58:13 +03:00
										 |  |  | 	// NOTE: the sort is local to the returned object.
 | 
					
						
							|  |  |  | 	// NOTE: the sorted object may loose sync form the actual wiki as the
 | 
					
						
							|  |  |  | 	// 		list of siblings is cached.
 | 
					
						
							|  |  |  | 	// 		...the resulting object is not to be stored for long.
 | 
					
						
							| 
									
										
										
										
											2016-08-04 23:35:54 +03:00
										 |  |  | 	sort: function(){ | 
					
						
							|  |  |  | 		var that = this | 
					
						
							|  |  |  | 		var res = this.clone() | 
					
						
							|  |  |  | 		var path = res.path | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-19 04:19:38 +03:00
										 |  |  | 		var methods = arguments[0] instanceof Array ?  | 
					
						
							|  |  |  | 			arguments[0]  | 
					
						
							|  |  |  | 			: [].slice.call(arguments) | 
					
						
							| 
									
										
										
										
											2016-08-04 23:35:54 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-07 18:25:46 +03:00
										 |  |  | 		res.__order_by = methods = methods.length == 0 ? | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			this.__default_sort_methods__  | 
					
						
							| 
									
										
										
										
											2016-08-07 18:25:46 +03:00
										 |  |  | 			: methods | 
					
						
							| 
									
										
										
										
											2016-08-04 23:35:54 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-07 18:25:46 +03:00
										 |  |  | 		res.update() | 
					
						
							| 
									
										
										
										
											2016-08-04 23:35:54 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 		return res }, | 
					
						
							| 
									
										
										
										
											2016-08-04 23:35:54 +03:00
										 |  |  | 	reverse: function(){ | 
					
						
							|  |  |  | 		var res = this.clone() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-07 18:25:46 +03:00
										 |  |  | 		res.__order_by = (this.__order_by || []).slice() | 
					
						
							| 
									
										
										
										
											2016-08-04 23:35:54 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-07 18:25:46 +03:00
										 |  |  | 		var i = res.__order_by.indexOf('reverse') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		i >= 0 ?  | 
					
						
							|  |  |  | 			res.__order_by.splice(i, 1)  | 
					
						
							|  |  |  | 			: res.__order_by.push('reverse') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		res.update() | 
					
						
							| 
									
										
										
										
											2016-08-04 23:35:54 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 		return res }, | 
					
						
							| 
									
										
										
										
											2016-08-04 23:35:54 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-07 18:25:46 +03:00
										 |  |  | 	// XXX not sure if this is the way to go...
 | 
					
						
							|  |  |  | 	update: function(){ | 
					
						
							|  |  |  | 		var that = this | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if(this.__order || this.__order_by){ | 
					
						
							|  |  |  | 			var path = this.path | 
					
						
							|  |  |  | 			var reverse = false | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			var methods = (this.__order_by || this.__default_sort_methods__) | 
					
						
							|  |  |  | 				.map(function(m){ | 
					
						
							| 
									
										
										
										
											2016-08-19 18:59:55 +03:00
										 |  |  | 					var reversed = m[0] == '-' | 
					
						
							|  |  |  | 					m = reversed ? m.slice(1) : m | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-07 18:25:46 +03:00
										 |  |  | 					if(m == 'reverse'){ | 
					
						
							|  |  |  | 						reverse = !reverse | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 						return null } | 
					
						
							|  |  |  | 					m = typeof(m) == typeof('str') ?  | 
					
						
							|  |  |  | 							that.__sort_methods__[m] | 
					
						
							|  |  |  | 						: m instanceof Function ?  | 
					
						
							|  |  |  | 							m | 
					
						
							| 
									
										
										
										
											2016-08-07 18:25:46 +03:00
										 |  |  | 						: null | 
					
						
							| 
									
										
										
										
											2016-08-19 18:59:55 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 					return m != null ? | 
					
						
							|  |  |  | 						(reversed ?  | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 							function(){  | 
					
						
							|  |  |  | 								return -m.apply(this, arguments) }  | 
					
						
							| 
									
										
										
										
											2016-08-19 18:59:55 +03:00
										 |  |  | 							: m)  | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 						: m }) | 
					
						
							|  |  |  | 				.filter(function(m){  | 
					
						
							|  |  |  | 					return !!m }) | 
					
						
							| 
									
										
										
										
											2016-08-07 18:25:46 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			this.__order = this.resolveStarPath(this.location) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if(methods.length > 0){ | 
					
						
							|  |  |  | 				var method = function(a, b){ | 
					
						
							|  |  |  | 						for(var i=0; i < methods.length; i++){ | 
					
						
							|  |  |  | 							var res = methods[i].call(that, a, b) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 							if(res != 0){ | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 								return res } } | 
					
						
							| 
									
										
										
										
											2016-08-19 18:59:55 +03:00
										 |  |  | 						// keep order if nothing else works...
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 						return a.i - b.i } | 
					
						
							| 
									
										
										
										
											2016-08-07 18:25:46 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				this.__order = this.__order | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 					.map(function(t, i){  | 
					
						
							|  |  |  | 						return { | 
					
						
							|  |  |  | 							i: i,  | 
					
						
							|  |  |  | 							page: that.get(t), | 
					
						
							|  |  |  | 						} }) | 
					
						
							| 
									
										
										
										
											2016-08-07 18:25:46 +03:00
										 |  |  | 					.sort(method) | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 					.map(function(t){  | 
					
						
							|  |  |  | 						return t.page.path }) } | 
					
						
							| 
									
										
										
										
											2016-08-07 18:25:46 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			reverse  | 
					
						
							|  |  |  | 				&& this.__order.reverse() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			this.__location_at = this.__order.indexOf(path) } | 
					
						
							| 
									
										
										
										
											2016-08-07 18:25:46 +03:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 		return this }, | 
					
						
							| 
									
										
										
										
											2016-08-07 18:25:46 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-04 23:35:54 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-05 16:58:04 +03:00
										 |  |  | 	// serialization...
 | 
					
						
							| 
									
										
										
										
											2016-07-31 05:28:04 +03:00
										 |  |  | 	// XXX need to account for '*' and '**' in path...
 | 
					
						
							| 
									
										
										
										
											2016-07-12 03:22:06 +03:00
										 |  |  | 	// XXX
 | 
					
						
							| 
									
										
										
										
											2016-07-05 16:58:04 +03:00
										 |  |  | 	json: function(path){ | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 		return path == null ?  | 
					
						
							|  |  |  | 				JSON.parse(JSON.stringify(this.__wiki_data)) | 
					
						
							|  |  |  | 			: path == '.' ?  | 
					
						
							|  |  |  | 				{ | 
					
						
							| 
									
										
										
										
											2016-07-05 16:58:04 +03:00
										 |  |  | 					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, | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 			} }, | 
					
						
							| 
									
										
										
										
											2016-07-05 16:58:04 +03:00
										 |  |  | 	// XXX should we inherit from the default???
 | 
					
						
							|  |  |  | 	load: function(json){ | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 		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 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:43:50 +03:00
										 |  |  | 		Object.keys(this.__wiki_data) | 
					
						
							|  |  |  | 			.forEach(function(location){ | 
					
						
							|  |  |  | 				// XXX not sure if this is the right way to go...
 | 
					
						
							|  |  |  | 				//var o = Object.create(that)
 | 
					
						
							|  |  |  | 				var o = that.clone()  | 
					
						
							|  |  |  | 				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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-04 19:51:37 +03:00
										 |  |  | /********************************************************************** | 
					
						
							|  |  |  | * vim:set ts=4 sw=4 :                                                */ |