mirror of
				https://github.com/flynx/pWiki.git
				synced 2025-10-31 02:50:08 +00:00 
			
		
		
		
	now parser almost working...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
		
							parent
							
								
									089b2ce4b1
								
							
						
					
					
						commit
						44a4dfb10b
					
				
							
								
								
									
										82
									
								
								wiki.js
									
									
									
									
									
								
							
							
						
						
									
										82
									
								
								wiki.js
									
									
									
									
									
								
							| @ -498,14 +498,26 @@ var Wiki = { | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| var macro = { | var macro = { | ||||||
| 	__macro__pattern__: null, | 	//__macro__pattern__: /<([a-zA-Z-_:]+)(.|[\n\r])*?(>(.|[\n\r])*?<\/\1>|\/>)/mg,
 | ||||||
|  | 	__macro__pattern__:  | ||||||
|  | 		/<([a-zA-Z-_:]+)(.|[\n\r])*?(>(.|[\n\r])*?<\/\1>|\/>)|@([a-zA-Z-_]+)\(([^)]*)\)/mg, | ||||||
| 	__filters__: [ | 	__filters__: [ | ||||||
| 	], | 	], | ||||||
| 
 | 
 | ||||||
| 	context: null, | 	context: null, | ||||||
| 
 | 
 | ||||||
|  | 	// XXX this is preliminary...
 | ||||||
|  | 	// XXX add wikiword...
 | ||||||
|  | 	// filter(text) -> html
 | ||||||
| 	filter: { | 	filter: { | ||||||
|  | 		default: 'html', | ||||||
|  | 
 | ||||||
|  | 		html: function(text){ return $('<div>').html(text) }, | ||||||
|  | 
 | ||||||
|  | 		json: 'text', | ||||||
|  | 		text: function(text){ return $('<div>').text(text) }, | ||||||
| 	}, | 	}, | ||||||
|  | 
 | ||||||
| 	// macro stage 1...
 | 	// macro stage 1...
 | ||||||
| 	macro: { | 	macro: { | ||||||
| 		// select filter to post-process text...
 | 		// select filter to post-process text...
 | ||||||
| @ -529,15 +541,14 @@ var macro = { | |||||||
| 		}, | 		}, | ||||||
| 
 | 
 | ||||||
| 		// fill/define slot (stage 1)...
 | 		// fill/define slot (stage 1)...
 | ||||||
| 		// XXX
 |  | ||||||
| 		slot_args: ['name'], | 		slot_args: ['name'], | ||||||
| 		slot: function(args, text, slots){ | 		slot: function(args, text, slots){ | ||||||
| 			var name = args.name | 			var name = args.name | ||||||
| 
 | 
 | ||||||
| 			if(slots[name] == null){ | 			if(slots[name] == null){ | ||||||
| 				slots[name] = text | 				slots[name] = text | ||||||
| 				// XXX return a slot macro parsable by stage 2...
 | 				// return a slot macro parsable by stage 2...
 | ||||||
| 				return text | 				return '<slot name="'+name+'">'+ text +'</slot>' | ||||||
| 
 | 
 | ||||||
| 			} else if(name in slots){ | 			} else if(name in slots){ | ||||||
| 				slots[name] = text | 				slots[name] = text | ||||||
| @ -545,6 +556,7 @@ var macro = { | |||||||
| 			} | 			} | ||||||
| 		}, | 		}, | ||||||
| 	}, | 	}, | ||||||
|  | 
 | ||||||
| 	// macro stage 2...
 | 	// macro stage 2...
 | ||||||
| 	// XXX rename...
 | 	// XXX rename...
 | ||||||
| 	macro2: { | 	macro2: { | ||||||
| @ -553,7 +565,6 @@ var macro = { | |||||||
| 			var name = args.name | 			var name = args.name | ||||||
| 
 | 
 | ||||||
| 			if(slots[name] == null){ | 			if(slots[name] == null){ | ||||||
| 				// XXX ???
 |  | ||||||
| 				return text | 				return text | ||||||
| 
 | 
 | ||||||
| 			} else if(name in slots){ | 			} else if(name in slots){ | ||||||
| @ -562,36 +573,73 @@ var macro = { | |||||||
| 		}, | 		}, | ||||||
| 	}, | 	}, | ||||||
| 
 | 
 | ||||||
| 	parseArgs: function(macro, args){ | 
 | ||||||
| 		// XXX parse args and populate the dict via .*_args attr...
 | 	parseElem: function(text, stage){ | ||||||
| 		// XXX
 | 		var res = {} | ||||||
|  | 
 | ||||||
|  | 		// @<name>(<args>)
 | ||||||
|  | 		if(text[0] == '@'){ | ||||||
|  | 			var d = text.match(/@([a-zA-Z-_:]*)\(([^)]*)\)/) | ||||||
|  | 
 | ||||||
|  | 			res.text = '' | ||||||
|  | 			res.name = d[1] | ||||||
|  | 			var args = res.args = {} | ||||||
|  | 
 | ||||||
|  | 			var a = d[2].split(/\s+/g) | ||||||
|  | 			a.forEach(function(e, i){ | ||||||
|  | 				args[(stage[res.name + '_args'] || [])[i]] = e | ||||||
|  | 			}) | ||||||
|  | 
 | ||||||
|  | 		// html-like...
 | ||||||
|  | 		} else { | ||||||
|  | 			var elem = $('<div>').html(text).children().eq(0) | ||||||
|  | 			res.name = elem.prop('tagName').toLowerCase() | ||||||
|  | 
 | ||||||
|  | 			var args = res.args = {} | ||||||
|  | 			var a = elem.prop('attributes') | ||||||
|  | 
 | ||||||
|  | 			for(var i=0; i<a.length; i++){ | ||||||
|  | 				args[a[i].name] = a[i].value | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			res.text = elem.html() | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		return res | ||||||
| 	}, | 	}, | ||||||
|  | 	// XXX add support for disabled filters -- -filter
 | ||||||
| 	parse: function(text){ | 	parse: function(text){ | ||||||
| 		var that = this | 		var that = this | ||||||
| 		var filters = [] | 		var filters = [] | ||||||
| 		var slots = {} | 		var slots = {} | ||||||
| 
 | 
 | ||||||
| 		// macro stage 1...
 | 		// macro stage 1...
 | ||||||
| 		text = text.replace(this.__macro__pattern__, function(match, macro, args, text){ | 		text = text.replace(this.__macro__pattern__, function(match){ | ||||||
| 			args = that.parseArgs(macro, args) | 			var m = that.parseElem(match, that.macro) | ||||||
| 
 | 
 | ||||||
| 			return macro in that.macro ?  | 			return m.name in that.macro ?  | ||||||
| 					that.macro[macro].call(that, args, text, slots, filters) | 					that.macro[m.name].call(that, m.args, m.text, slots, filters) | ||||||
| 				: match | 				: match | ||||||
| 		}) | 		}) | ||||||
| 
 | 
 | ||||||
| 		// macro stage 2...
 | 		// macro stage 2...
 | ||||||
| 		text = text.replace(this.__macro__pattern__, function(match, macro, args, text){ | 		text = text.replace(this.__macro__pattern__, function(match){ | ||||||
| 			args = that.parseArgs(macro, args) | 			var m = that.parseElem(match, that.macro2) | ||||||
| 
 | 
 | ||||||
| 			return macro in that.macro2 ?  | 			return m.name in that.macro2 ?  | ||||||
| 					that.macro2[macro].call(that, args, text, slots, filters) | 					that.macro2[m.name].call(that, m.args, m.text, slots, filters) | ||||||
| 				: match | 				: match | ||||||
| 		}) | 		}) | ||||||
| 
 | 
 | ||||||
| 		// filter stage....
 | 		// filter stage....
 | ||||||
| 		filters.forEach(function(k){ | 		filters.forEach(function(k){ | ||||||
| 			text = that.filter[k].call(that, text)  | 			var seen = [] | ||||||
|  | 			// get filter aliases...
 | ||||||
|  | 			while(typeof(k) == typeof('str') && seen.indexOf(k) == -1){ | ||||||
|  | 				seen.push(k) | ||||||
|  | 				k = that.filter[k] | ||||||
|  | 			} | ||||||
|  | 			text = k.call(that, text)  | ||||||
| 		}) | 		}) | ||||||
| 
 | 
 | ||||||
| 		return text | 		return text | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user