mirror of
				https://github.com/flynx/pWiki.git
				synced 2025-11-03 20:40:10 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			190 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			HTML
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			190 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			HTML
		
	
	
		
			Executable File
		
	
	
	
	
<!DOCTYPE html>
 | 
						|
<html>
 | 
						|
<head>
 | 
						|
<title>pWiki</title>
 | 
						|
</head>
 | 
						|
<style>
 | 
						|
</style>
 | 
						|
 | 
						|
<script src="ext-lib/jquery.js"></script>
 | 
						|
<script src="ext-lib/pouchdb.min.js"></script>
 | 
						|
<script src="wiki.js"></script>
 | 
						|
 | 
						|
<script>
 | 
						|
 | 
						|
var clear = () => {
 | 
						|
	delete localStorage['wiki-data']
 | 
						|
	delete localStorage['wiki-location']
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
var reload = () => {
 | 
						|
	$('.path').text('/' + Wiki.path)
 | 
						|
 | 
						|
	$('.title').text(Wiki.title)
 | 
						|
 | 
						|
	// process text...
 | 
						|
	var text = Wiki.text
 | 
						|
	var editing = $('.text').prop('contenteditable') != 'true'
 | 
						|
	var filters = []
 | 
						|
	var slots = {}
 | 
						|
 | 
						|
	// expand macros...
 | 
						|
	if(editing){
 | 
						|
		text = text
 | 
						|
			// Syntax:
 | 
						|
			//		@<macro>( <args> )
 | 
						|
			.replace(/@([a-zA-Z-_]+)\(([^)]*)\)/g, function(_, macro, args){
 | 
						|
				args = $('<div>')
 | 
						|
					.html(args)
 | 
						|
					.text()
 | 
						|
						.trim()
 | 
						|
						.split(/\s+/g)
 | 
						|
 | 
						|
				//console.log('>>>>>', macro, args)
 | 
						|
 | 
						|
				if(macro == 'filter' && args.length == 1){
 | 
						|
					filters.push(args[0])
 | 
						|
					return ''
 | 
						|
				}
 | 
						|
 | 
						|
				if(macro == 'include' && args.length == 1){
 | 
						|
					w = Object.create(Wiki)
 | 
						|
					w.location = args[0]
 | 
						|
					return w.text
 | 
						|
				}
 | 
						|
 | 
						|
				if(macro == 'attr' 
 | 
						|
						&& args.length == 1
 | 
						|
						&& ['title', 'path', 'location', 'dir'].indexOf(args[0]) >= 0){
 | 
						|
					return Wiki[args[0]]
 | 
						|
				}
 | 
						|
 | 
						|
				return _
 | 
						|
			})
 | 
						|
			// html-like macro syntax...
 | 
						|
			.replace(/\<[a-zA-Z-_:]+.*?\/?\>/g, function(t){
 | 
						|
				var elem = $($('<div>').html(t).text())
 | 
						|
				var macro = elem.prop('tagName').toLowerCase()
 | 
						|
 | 
						|
				var args = {}
 | 
						|
				var a = elem.prop('attributes')
 | 
						|
 | 
						|
				for(var i=0; i<a.length; i++){
 | 
						|
					args[a[i].name] = a[i].value
 | 
						|
				}
 | 
						|
 | 
						|
				//console.log('>>>>>', macro, args) 
 | 
						|
 | 
						|
				if(macro == 'filter' && args.name != null){
 | 
						|
					console.log('FILTER:', args.name)
 | 
						|
					// XXX
 | 
						|
					return ''
 | 
						|
				}
 | 
						|
 | 
						|
				if(macro == 'include' && args.src != null){
 | 
						|
					w = Object.create(Wiki)
 | 
						|
					w.location = args.src
 | 
						|
					return w.text
 | 
						|
				}
 | 
						|
 | 
						|
				// XXX need content...
 | 
						|
				// 		Procedure:
 | 
						|
				//			- if new slot
 | 
						|
				//				- add to list
 | 
						|
				//				- fill
 | 
						|
				//			- if slot exists
 | 
						|
				//				- fill original
 | 
						|
				if(macro == 'slot' && args.name != null){
 | 
						|
					slots[args.name] = ''
 | 
						|
					return t
 | 
						|
				}
 | 
						|
 | 
						|
				if(macro == 'attr' 
 | 
						|
						&& args.name != null
 | 
						|
						&& ['title', 'path', 'location', 'dir'].indexOf(args.name) >= 0){
 | 
						|
					return Wiki[args.name]
 | 
						|
				}
 | 
						|
 | 
						|
				return t
 | 
						|
			})
 | 
						|
	}
 | 
						|
 | 
						|
	$('.text').html(setWikiWords(text, filters.indexOf('show_link_brackets') < 0 && editing))
 | 
						|
 | 
						|
	// XXX save...
 | 
						|
	localStorage['wiki-data'] = JSON.stringify(Wiki.__wiki_data)
 | 
						|
	localStorage['wiki-location'] = Wiki.location
 | 
						|
 | 
						|
	$('title').text(Wiki.location)
 | 
						|
}
 | 
						|
 | 
						|
var go = (path) => {
 | 
						|
	history.pushState({
 | 
						|
			wikipath: path
 | 
						|
		}, 
 | 
						|
		Wiki.title, 
 | 
						|
		window.location)
 | 
						|
 | 
						|
	Wiki.location = path
 | 
						|
	reload()
 | 
						|
}
 | 
						|
 | 
						|
$(() => {
 | 
						|
	$(window).on('popstate', function(evt){
 | 
						|
		event.state 
 | 
						|
			&& event.state.wikipath 
 | 
						|
			&& go(event.state.wikipath)
 | 
						|
	})
 | 
						|
 | 
						|
	// load stored data...
 | 
						|
	Wiki.__wiki_data = localStorage['wiki-data'] ?
 | 
						|
		JSON.parse(localStorage['wiki-data']) 
 | 
						|
		: data
 | 
						|
	Wiki.__wiki_data.__proto__ = data
 | 
						|
 | 
						|
	Wiki.location = localStorage['wiki-location'] || Wiki.location
 | 
						|
 | 
						|
 | 
						|
	reload()
 | 
						|
 | 
						|
	// XXX make this update on enter...
 | 
						|
	$('.title')
 | 
						|
		.on('blur', () => { 
 | 
						|
			Wiki.title = $('.title').text() 
 | 
						|
			reload()
 | 
						|
		})
 | 
						|
 | 
						|
	// live update text...
 | 
						|
	// XXX is this the right way to go for large documents???
 | 
						|
	$('.text')
 | 
						|
		.focus(() => {
 | 
						|
			$('.text').prop('contenteditable', $('.text').prop('contenteditable') != 'true')
 | 
						|
			reload()
 | 
						|
		})
 | 
						|
		.on('keyup', () => { 
 | 
						|
			if($('.text').prop('contenteditable') == 'true'){
 | 
						|
				Wiki.raw = clearWikiWords($('.text').clone()).html() 
 | 
						|
			}
 | 
						|
		})
 | 
						|
		// XXX do this live, but on a timeout after user input...
 | 
						|
		// XXX need to place the cursor in the same position...
 | 
						|
		.blur(() => { 
 | 
						|
			$('.text').prop('contenteditable', false)
 | 
						|
			reload() 
 | 
						|
		})
 | 
						|
})
 | 
						|
</script>
 | 
						|
 | 
						|
<body>
 | 
						|
 | 
						|
<div class="path"></div>
 | 
						|
<hr>
 | 
						|
<h1 class="title" contenteditable tabindex=0></h1>
 | 
						|
<div class="text" tabindex=0></div>
 | 
						|
 | 
						|
</body>
 | 
						|
</html>
 | 
						|
<!-- vim:set sw=4 ts=4 : -->
 |