| 
									
										
										
										
											2022-08-04 11:00:21 +03:00
										 |  |  | <!DOCTYPE html> | 
					
						
							|  |  |  | <html> | 
					
						
							|  |  |  | <!--html manifest="pwiki.appcache"--> | 
					
						
							|  |  |  | <head> | 
					
						
							|  |  |  | <title>pWiki</title> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <meta charset="utf-8"> | 
					
						
							|  |  |  | <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no"> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <link rel="manifest" href="manifest.json"> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <link rel="prefetch" href="css/fonts/Open_Sans/OpenSans-Bold.ttf"> | 
					
						
							|  |  |  | <link rel="prefetch" href="css/fonts/Open_Sans/OpenSans-BoldItalic.ttf"> | 
					
						
							|  |  |  | <link rel="prefetch" href="css/fonts/Open_Sans/OpenSans-ExtraBold.ttf"> | 
					
						
							|  |  |  | <link rel="prefetch" href="css/fonts/Open_Sans/OpenSans-ExtraBoldItalic.ttf"> | 
					
						
							|  |  |  | <link rel="prefetch" href="css/fonts/Open_Sans/OpenSans-Italic.ttf"> | 
					
						
							|  |  |  | <link rel="prefetch" href="css/fonts/Open_Sans/OpenSans-Light.ttf"> | 
					
						
							|  |  |  | <link rel="prefetch" href="css/fonts/Open_Sans/OpenSans-LightItalic.ttf"> | 
					
						
							|  |  |  | <link rel="prefetch" href="css/fonts/Open_Sans/OpenSans-Regular.ttf"> | 
					
						
							|  |  |  | <link rel="prefetch" href="css/fonts/Open_Sans/OpenSans-Semibold.ttf"> | 
					
						
							|  |  |  | <link rel="prefetch" href="css/fonts/Open_Sans/OpenSans-SemiboldItalic.ttf"> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <link rel="stylesheet" href="css/fonts.css"> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | </head> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <style> | 
					
						
							| 
									
										
										
										
											2022-08-21 23:07:47 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-03 10:57:54 +03:00
										 |  |  | body { | 
					
						
							|  |  |  | 	font-size: 1.1em; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | a { | 
					
						
							|  |  |  | 	text-decoration: none; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | a:hover { | 
					
						
							|  |  |  | 	text-decoration: underline; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-21 23:07:47 +03:00
										 |  |  | .show-on-hover { | 
					
						
							|  |  |  | 	opacity: 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | :hover>.show-on-hover { | 
					
						
							|  |  |  | 	opacity: 0.4; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | .show-on-hover:hover { | 
					
						
							|  |  |  | 	opacity: 0.8; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-02 21:15:22 +03:00
										 |  |  | /* Spinner... */ | 
					
						
							|  |  |  | .spinner { | 
					
						
							|  |  |  | 	position: absolute; | 
					
						
							|  |  |  | 	display: flex; | 
					
						
							|  |  |  | 	text-align: center; | 
					
						
							|  |  |  | 	left: 50%; | 
					
						
							|  |  |  | 	top: 50%; | 
					
						
							|  |  |  | 	width: 100px; | 
					
						
							|  |  |  | 	height: 100px; | 
					
						
							|  |  |  | 	margin-top: -50px; | 
					
						
							|  |  |  | 	margin-left: -50px; | 
					
						
							|  |  |  | 	white-space: nowrap; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	animation: fadein 2s 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | .spinner span { | 
					
						
							|  |  |  | 	position: relative; | 
					
						
							|  |  |  | 	display: inline-block; | 
					
						
							|  |  |  | 	font-size: 2em; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	animation: loading 2s infinite ; | 
					
						
							|  |  |  | 	animation-delay: calc(0.2s * var(--i)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | @keyframes fadein { | 
					
						
							|  |  |  | 	from { | 
					
						
							|  |  |  | 		opacity: 0; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	50% { | 
					
						
							|  |  |  | 		opacity: 0.8; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	to { | 
					
						
							|  |  |  | 		opacity: 1; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | @keyframes loading { | 
					
						
							|  |  |  | 	0%, 60% { | 
					
						
							|  |  |  | 		transform: rotateY(360deg); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-04 11:00:21 +03:00
										 |  |  | </style> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-04 19:47:08 +03:00
										 |  |  | <!-- XXX do we need this??? --> | 
					
						
							|  |  |  | <script src="bootstrap.js"></script> | 
					
						
							| 
									
										
										
										
											2022-08-04 14:29:25 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-04 11:00:21 +03:00
										 |  |  | <!--script data-main="pwiki2" src="ext-lib/require.js"></script--> | 
					
						
							|  |  |  | <script src="ext-lib/require.js"></script> | 
					
						
							|  |  |  | <script> | 
					
						
							| 
									
										
										
										
											2022-08-04 19:47:08 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-02 21:15:22 +03:00
										 |  |  | var DEBUG = true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-04 19:47:08 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | var makeFallbacks =  | 
					
						
							|  |  |  | function(paths, search=['lib']){ | 
					
						
							|  |  |  | 	return Object.entries(paths) | 
					
						
							|  |  |  | 		.map(function([key, path]){ | 
					
						
							|  |  |  | 			// package... | 
					
						
							|  |  |  | 			if(path.endsWith('/')){ | 
					
						
							|  |  |  | 				return [key, path] } | 
					
						
							|  |  |  | 			return [ | 
					
						
							|  |  |  | 				key, | 
					
						
							|  |  |  | 				[ | 
					
						
							|  |  |  | 					path, | 
					
						
							|  |  |  | 					...search | 
					
						
							|  |  |  | 						.map(function(base){ | 
					
						
							|  |  |  | 							return base +'/'+ path.split(/[\\\/]+/g).pop() }), | 
					
						
							|  |  |  | 				] | 
					
						
							|  |  |  | 			] }) | 
					
						
							|  |  |  | 		.reduce(function(res, [key, value]){ | 
					
						
							|  |  |  | 			res[key] = value | 
					
						
							|  |  |  | 			return res }, {}) } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-04 11:00:21 +03:00
										 |  |  | require.config({ | 
					
						
							|  |  |  | 	paths: { | 
					
						
							| 
									
										
										
										
											2022-08-04 19:47:08 +03:00
										 |  |  | 		...makeFallbacks({ | 
					
						
							|  |  |  | 			'ig-doc': 'node_modules/ig-doc/doc', | 
					
						
							|  |  |  | 			'ig-stoppable': 'node_modules/ig-stoppable/stoppable', | 
					
						
							|  |  |  | 			'object-run': 'node_modules/object-run/run', | 
					
						
							|  |  |  | 			'ig-object': 'node_modules/ig-object/object', | 
					
						
							|  |  |  | 		}), | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// packages... | 
					
						
							|  |  |  | 		'ig-types': [ | 
					
						
							|  |  |  | 			'node_modules/ig-types', | 
					
						
							|  |  |  | 			'lib/types', | 
					
						
							|  |  |  | 		], | 
					
						
							| 
									
										
										
										
											2022-08-04 11:00:21 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-04 19:47:08 +03:00
										 |  |  | 		// external stuff... | 
					
						
							|  |  |  | 		...makeFallbacks({ | 
					
						
							|  |  |  | 			'jszip': 'node_modules/jszip/dist/jszip', | 
					
						
							|  |  |  | 			'pouchdb': 'node_modules/pouchdb/dist/pouchdb', | 
					
						
							|  |  |  | 			'showdown': 'node_modules/showdown/dist/showdown', | 
					
						
							|  |  |  | 		}, ['ext-lib']), | 
					
						
							| 
									
										
										
										
											2022-08-04 11:00:21 +03:00
										 |  |  | 	}, | 
					
						
							|  |  |  | 	packages: [ | 
					
						
							|  |  |  | 		'ig-types', | 
					
						
							|  |  |  | 	] | 
					
						
							|  |  |  | }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-06 11:09:25 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | document.pwikiloaded = new Event('pwikiloaded') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-04 19:47:08 +03:00
										 |  |  | // start loading pWiki... | 
					
						
							| 
									
										
										
										
											2022-08-16 11:00:23 +03:00
										 |  |  | require(['./browser'], function(browser){  | 
					
						
							|  |  |  | 	pwiki = window.pwiki = browser.pwiki  | 
					
						
							| 
									
										
										
										
											2022-08-06 11:09:25 +03:00
										 |  |  | 	pwiki.dom = document.querySelector('#pWiki') | 
					
						
							| 
									
										
										
										
											2022-08-16 11:00:23 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-10 11:42:31 +03:00
										 |  |  | 	// handle location.hash/history (both directions) | 
					
						
							| 
									
										
										
										
											2022-08-04 19:47:08 +03:00
										 |  |  | 	window.addEventListener('hashchange', function(evt){ | 
					
						
							|  |  |  | 		evt.preventDefault() | 
					
						
							| 
									
										
										
										
											2022-08-31 18:49:59 +03:00
										 |  |  | 		var [path, hash] = decodeURI(location.hash).slice(1).split('#') | 
					
						
							| 
									
										
										
										
											2022-08-04 19:47:08 +03:00
										 |  |  | 		path = path.trim() == '' ?  | 
					
						
							| 
									
										
										
										
											2022-08-31 15:46:51 +03:00
										 |  |  | 			pwiki.location | 
					
						
							| 
									
										
										
										
											2022-08-10 15:29:45 +03:00
										 |  |  | 			//'/' | 
					
						
							| 
									
										
										
										
											2022-08-04 19:47:08 +03:00
										 |  |  | 			: path | 
					
						
							| 
									
										
										
										
											2022-08-11 10:39:55 +03:00
										 |  |  | 		// treat links as absolute unless explicitly relative... | 
					
						
							| 
									
										
										
										
											2022-08-10 15:29:45 +03:00
										 |  |  | 		path = /^\.\.?([\\\/].*)?$/.test(path) ? | 
					
						
							|  |  |  | 			path | 
					
						
							|  |  |  | 			: '/'+path | 
					
						
							| 
									
										
										
										
											2022-08-31 15:46:51 +03:00
										 |  |  | 		pwiki.location = [path, hash] }) | 
					
						
							| 
									
										
										
										
											2022-08-10 11:42:31 +03:00
										 |  |  | 	pwiki | 
					
						
							| 
									
										
										
										
											2022-09-03 10:57:54 +03:00
										 |  |  | 		.onBeforeNavigate(function(){ | 
					
						
							|  |  |  | 			saveNow() }) | 
					
						
							| 
									
										
										
										
											2022-09-03 13:37:49 +03:00
										 |  |  | 		.onNavigate(async function(){ | 
					
						
							| 
									
										
										
										
											2022-08-10 11:42:31 +03:00
										 |  |  | 			// NOTE: we do not need to directly update location.hash here as | 
					
						
							|  |  |  | 			//		that will push an extra history item... | 
					
						
							| 
									
										
										
										
											2022-08-10 15:29:45 +03:00
										 |  |  | 			history.replaceState( | 
					
						
							| 
									
										
										
										
											2022-08-31 15:46:51 +03:00
										 |  |  | 				{path: this.location},  | 
					
						
							| 
									
										
										
										
											2022-09-04 01:53:01 +03:00
										 |  |  | 				'', | 
					
						
							| 
									
										
										
										
											2022-08-31 15:46:51 +03:00
										 |  |  | 				'#'+this.location  | 
					
						
							| 
									
										
										
										
											2022-08-10 15:29:45 +03:00
										 |  |  | 					+(this.hash ?  | 
					
						
							|  |  |  | 						'#'+this.hash  | 
					
						
							|  |  |  | 						: '')) | 
					
						
							| 
									
										
										
										
											2022-08-10 11:42:31 +03:00
										 |  |  | 			// NOTE: we are intentionally not awaiting for this -- this  | 
					
						
							|  |  |  | 			//		separates the navigate and load events... | 
					
						
							| 
									
										
										
										
											2022-09-02 21:15:22 +03:00
										 |  |  | 			var t = Date.now() | 
					
						
							|  |  |  | 			this.refresh()  | 
					
						
							|  |  |  | 				.then(function(){ | 
					
						
							|  |  |  | 					DEBUG  | 
					
						
							|  |  |  | 						&& console.log(`## ${pwiki.path} (${Date.now() - t}ms)`) }) }) | 
					
						
							| 
									
										
										
										
											2022-08-10 11:42:31 +03:00
										 |  |  | 		.onLoad(function(evt){ | 
					
						
							| 
									
										
										
										
											2022-08-26 18:41:05 +03:00
										 |  |  | 			var that = this | 
					
						
							| 
									
										
										
										
											2022-08-10 11:42:31 +03:00
										 |  |  | 			// handle title... | 
					
						
							| 
									
										
										
										
											2022-09-04 01:53:01 +03:00
										 |  |  | 			document.querySelector('title').innerHTML = this.path | 
					
						
							| 
									
										
										
										
											2022-08-10 15:29:45 +03:00
										 |  |  | 			// scroll to anchor element... | 
					
						
							|  |  |  | 			this.hash | 
					
						
							|  |  |  | 				&& this.dom | 
					
						
							|  |  |  | 					.querySelector('#'+ this.hash) | 
					
						
							| 
									
										
										
										
											2022-08-26 18:41:05 +03:00
										 |  |  | 					.scrollIntoView()  | 
					
						
							|  |  |  | 			// handle refresh... | 
					
						
							|  |  |  | 			// NOTE: we need to do this as hashchange is only triggered  | 
					
						
							|  |  |  | 			//		when the hash is actually changed... | 
					
						
							| 
									
										
										
										
											2022-08-31 18:49:59 +03:00
										 |  |  | 			for(var lnk of this.dom.querySelectorAll(`a[href="${location.hash}"]`)){ | 
					
						
							| 
									
										
										
										
											2022-08-26 18:41:05 +03:00
										 |  |  | 				lnk.addEventListener('click', function(evt){ | 
					
						
							|  |  |  | 					that.refresh() }) } }) | 
					
						
							| 
									
										
										
										
											2022-08-16 11:00:23 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// wait for stuff to finish... | 
					
						
							|  |  |  | 	browser.setup.then(function(){ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// show current page... | 
					
						
							| 
									
										
										
										
											2022-08-31 18:49:59 +03:00
										 |  |  | 		pwiki.location = decodeURI(location.hash).slice(1) | 
					
						
							| 
									
										
										
										
											2022-08-16 11:00:23 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	}) })  | 
					
						
							| 
									
										
										
										
											2022-08-04 19:47:08 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-13 14:57:53 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-14 03:00:06 +03:00
										 |  |  | // XXX make this a 2 stage save -- first cache and then save to store... | 
					
						
							|  |  |  | // XXX versioning??? | 
					
						
							|  |  |  | var SAVE_TIMEOUT = 5000 | 
					
						
							|  |  |  | var SAVE_QUEUE = {} | 
					
						
							| 
									
										
										
										
											2022-09-05 00:57:42 +03:00
										 |  |  | var saveContent =  | 
					
						
							|  |  |  | 	function(path, text){ | 
					
						
							|  |  |  | 		SAVE_QUEUE[path] = text  | 
					
						
							|  |  |  | 		// clear editor page cache... | 
					
						
							|  |  |  | 		pwiki.cache = null } | 
					
						
							|  |  |  | var saveNow =  | 
					
						
							|  |  |  | 	function(){ | 
					
						
							|  |  |  | 		var queue = Object.entries(SAVE_QUEUE) | 
					
						
							|  |  |  | 		SAVE_QUEUE = {} | 
					
						
							|  |  |  | 		queue | 
					
						
							|  |  |  | 			.forEach(function([path, text]){ | 
					
						
							|  |  |  | 				console.log('saving changes to:', path) | 
					
						
							|  |  |  | 				pwiki.get(path).raw = text }) } | 
					
						
							| 
									
										
										
										
											2022-08-14 03:00:06 +03:00
										 |  |  | setInterval(saveNow, 5000) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-13 14:57:53 +03:00
										 |  |  | // XXX | 
					
						
							| 
									
										
										
										
											2022-08-14 03:00:06 +03:00
										 |  |  | var exportData = async function(){ | 
					
						
							| 
									
										
										
										
											2022-08-13 14:57:53 +03:00
										 |  |  | 	var blob = new Blob([await pwiki.store.json(true)], {type: "text/plain;charset=utf-8"}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var a = document.createElement('a') | 
					
						
							|  |  |  |     var blobURL = a.href = URL.createObjectURL(blob) | 
					
						
							|  |  |  |     a.download = 'pWiki-dump.json' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     //document.body.appendChild(a) | 
					
						
							|  |  |  |     a.dispatchEvent(new MouseEvent("click")) | 
					
						
							|  |  |  |     //document.body.removeChild(a) | 
					
						
							|  |  |  |     //URL.revokeObjectURL(blobURL) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-04 19:47:08 +03:00
										 |  |  | </script> | 
					
						
							| 
									
										
										
										
											2022-08-04 11:00:21 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-04 19:47:08 +03:00
										 |  |  | <body> | 
					
						
							| 
									
										
										
										
											2022-08-04 11:00:21 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-11 10:39:55 +03:00
										 |  |  | <!-- XXX need to add something passive but animated here... --> | 
					
						
							| 
									
										
										
										
											2022-09-02 21:15:22 +03:00
										 |  |  | <div id="pWiki"> | 
					
						
							|  |  |  | 	<div class="spinner"> | 
					
						
							|  |  |  | 		<span style="--i:0">p</span> | 
					
						
							|  |  |  | 		<span style="--i:1">W</span> | 
					
						
							|  |  |  | 		<span style="--i:2">i</span> | 
					
						
							|  |  |  | 		<span style="--i:3">k</span> | 
					
						
							|  |  |  | 		<span style="--i:4">i</span> | 
					
						
							|  |  |  | 	</div> | 
					
						
							|  |  |  | </div> | 
					
						
							| 
									
										
										
										
											2022-08-04 11:00:21 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | </body> | 
					
						
							|  |  |  | </html> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <!-- vim:set sw=4 ts=4 : --> |