forked from cory/tildefriends
		
	Adding multiplayer markdeep.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3291 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
		| @@ -98,6 +98,12 @@ class IrcService { | |||||||
| 				let person = prefix.split('!')[0]; | 				let person = prefix.split('!')[0]; | ||||||
| 				let conversation = parts[1]; | 				let conversation = parts[1]; | ||||||
| 				this._service.notifyPresenceChanged(conversation, person, "unavailable"); | 				this._service.notifyPresenceChanged(conversation, person, "unavailable"); | ||||||
|  | 			} else if (parts[0] == "QUIT") { | ||||||
|  | 				let person = prefix.split('!')[0]; | ||||||
|  | 				let conversations = this._service.getConversations(); | ||||||
|  | 				for (let i in conversations) { | ||||||
|  | 					this._service.notifyPresenceChanged(conversations[i], person, "unavailable"); | ||||||
|  | 				} | ||||||
| 			} else if (parts[0] == "353") { // RPL_NAMREPLY | 			} else if (parts[0] == "353") { // RPL_NAMREPLY | ||||||
| 				if (!this._nameReplies[parts[3]]) { | 				if (!this._nameReplies[parts[3]]) { | ||||||
| 					this._nameReplies[parts[3]] = []; | 					this._nameReplies[parts[3]] = []; | ||||||
|   | |||||||
							
								
								
									
										186
									
								
								packages/cory/sharedwiki/sharedwiki.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										186
									
								
								packages/cory/sharedwiki/sharedwiki.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,186 @@ | |||||||
|  | "use strict"; | ||||||
|  |  | ||||||
|  | //! {"require": ["ui"]} | ||||||
|  |  | ||||||
|  | terminal.setEcho(false); | ||||||
|  | terminal.setTitle("Live Markdeep Editor"); | ||||||
|  |  | ||||||
|  | let gEditEvent = null; | ||||||
|  |  | ||||||
|  | function back() { | ||||||
|  | 	terminal.split([{name: "terminal"}]); | ||||||
|  | 	if (gEditEvent) { | ||||||
|  | 		gEditEvent.back(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | core.register("onWindowMessage", function(event) { | ||||||
|  | 	if (event.message.ready) { | ||||||
|  | 		core.broadcast({title: gEditEvent.name, sync: true}); | ||||||
|  | 		terminal.postMessageToIframe("iframe", {title: gEditEvent.name, contents: gEditEvent.value}); | ||||||
|  | 	} else if (event.message.index) { | ||||||
|  | 		back(); | ||||||
|  | 	} else if (event.message.cursor) { | ||||||
|  | 		core.broadcast({title: gEditEvent.name, user: core.user.index, cursor: event.message.cursor}); | ||||||
|  | 	} else if (event.message.change) { | ||||||
|  | 		core.broadcast({title: gEditEvent.name, user: core.user.index, change: event.message.change}); | ||||||
|  | 	} else if (event.message.sync) { | ||||||
|  | 		core.broadcast({title: event.message.title, user: core.user.index, contents: event.message.contents}); | ||||||
|  | 	} else { | ||||||
|  | 		gEditEvent.save(event.message.title, event.message.contents).then(function() { | ||||||
|  | 			return core.broadcast({title: gEditEvent.name, contents: event.message.contents, sync: true}); | ||||||
|  | 		}).then(back); | ||||||
|  | 	} | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | core.register("onMessage", function(sender, message) { | ||||||
|  | 	if (!gEditEvent || message.title == gEditEvent.name) { | ||||||
|  | 		terminal.postMessageToIframe("iframe", message); | ||||||
|  | 	} | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | core.register("onSessionEnd", function(process) { | ||||||
|  | 	terminal.postMessageToIframe("iframe", {user: process.index, cursor: {}}); | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | function editPage(event) { | ||||||
|  | 	gEditEvent = event; | ||||||
|  | 	terminal.split([{name: "terminal", type: "vertical"}]); | ||||||
|  | 	terminal.clear(); | ||||||
|  | 	terminal.print({iframe: `<html> | ||||||
|  | 		<head> | ||||||
|  | 			<script src="//cdnjs.cloudflare.com/ajax/libs/codemirror/5.13.2/codemirror.min.js"></script> | ||||||
|  | 			<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/codemirror/5.13.2/codemirror.min.css"></link> | ||||||
|  | 			<style> | ||||||
|  | 				html { | ||||||
|  | 					height: 100%; | ||||||
|  | 					margin: 0; | ||||||
|  | 					padding: 0; | ||||||
|  | 				} | ||||||
|  | 				body { | ||||||
|  | 					display: flex; | ||||||
|  | 					flex-direction: column; | ||||||
|  | 					height: 100%; | ||||||
|  | 					margin: 0; | ||||||
|  | 					padding: 0; | ||||||
|  | 				} | ||||||
|  | 				#menu { | ||||||
|  | 					flex: 0 0 auto; | ||||||
|  | 				} | ||||||
|  | 				#container { | ||||||
|  | 					flex: 1 1 auto; | ||||||
|  | 					display: flex; | ||||||
|  | 					flex-direction: row; | ||||||
|  | 					width: 100%; | ||||||
|  | 					background-color: white; | ||||||
|  | 				} | ||||||
|  | 				.CodeMirror { | ||||||
|  | 					width: 100%; | ||||||
|  | 					height: 100%; | ||||||
|  | 				} | ||||||
|  | 				.CodeMirror-scroll { | ||||||
|  | 				} | ||||||
|  | 				#edit { background-color: white } | ||||||
|  | 				#preview { background-color: white } | ||||||
|  | 				#edit, #preview { | ||||||
|  | 					display: flex; | ||||||
|  | 					overflow: auto; | ||||||
|  | 					flex: 0 0 50%; | ||||||
|  | 				} | ||||||
|  | 			</style> | ||||||
|  | 			<script> | ||||||
|  | 				var gEditor; | ||||||
|  | 				var gSelections = {}; | ||||||
|  | 				function index() { | ||||||
|  | 					parent.postMessage({index: true}, "*"); | ||||||
|  | 				} | ||||||
|  | 				function submit() { | ||||||
|  | 					parent.postMessage({ | ||||||
|  | 						title: document.getElementById("title").value, | ||||||
|  | 						contents: gEditor.getValue(), | ||||||
|  | 					}, "*"); | ||||||
|  | 				} | ||||||
|  | 				function cursorActivity() { | ||||||
|  | 					var selection = gEditor.listSelections(); | ||||||
|  | 					var key = "test"; | ||||||
|  | 					var a = selection[0].anchor; | ||||||
|  | 					var b = selection[0].head; | ||||||
|  | 					if (b.line < a.line || a.line == b.line && b.ch < a.ch) { | ||||||
|  | 						[a, b] = [b, a]; | ||||||
|  | 					} | ||||||
|  | 					parent.postMessage({cursor: {start: a, end: b}}, "*"); | ||||||
|  | 				} | ||||||
|  | 				function textChanged(instance, change) { | ||||||
|  | 					var preview = document.getElementById("preview"); | ||||||
|  | 					preview.innerHTML = markdeep.format(gEditor.getValue() + "\\n", false); | ||||||
|  | 					if (change && change.origin != "+remote" && change.origin != "setValue") { | ||||||
|  | 						console.debug(change); | ||||||
|  | 						parent.postMessage({change: change}, "*"); | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 				window.markdeepOptions = {mode: 'script'}; | ||||||
|  | 			</script> | ||||||
|  | 			<script src="https://casual-effects.com/markdeep/latest/markdeep.min.js"></script> | ||||||
|  | 			<script> | ||||||
|  | 				document.head.innerHTML += markdeep.stylesheet(); | ||||||
|  |  | ||||||
|  | 				window.addEventListener("message", function(message) { | ||||||
|  | 					if (message.data.contents) { | ||||||
|  | 						document.getElementById("title").value = message.data.title; | ||||||
|  | 						gEditor.setValue(message.data.contents); | ||||||
|  | 						textChanged(); | ||||||
|  | 					} else if (message.data.cursor) { | ||||||
|  | 						if (gSelections[message.data.user]) { | ||||||
|  | 							gSelections[message.data.user].clear(); | ||||||
|  | 						} | ||||||
|  | 						if (message.data.cursor.start) { | ||||||
|  | 							gSelections[message.data.user] = gEditor.markText( | ||||||
|  | 								message.data.cursor.start, | ||||||
|  | 								message.data.cursor.end, | ||||||
|  | 								{css: "text-decoration: underline"}); | ||||||
|  | 						} else { | ||||||
|  | 							delete gSelections[message.data.user]; | ||||||
|  | 						} | ||||||
|  | 					} else if (message.data.change) { | ||||||
|  | 						gEditor.replaceRange(message.data.change.text, message.data.change.from, message.data.change.to, "+remote"); | ||||||
|  | 					} else if (message.data.sync) { | ||||||
|  | 						parent.postMessage({ | ||||||
|  | 							sync: true, | ||||||
|  | 							title: document.getElementById("title").value, | ||||||
|  | 							contents: gEditor.getValue(), | ||||||
|  | 						}, "*"); | ||||||
|  | 					} | ||||||
|  | 				}, false); | ||||||
|  |  | ||||||
|  | 				window.addEventListener("load", function() { | ||||||
|  | 					gEditor = CodeMirror.fromTextArea(document.getElementById("contents"), { | ||||||
|  | 						lineNumbers: true | ||||||
|  | 					}); | ||||||
|  | 					gEditor.on("change", textChanged); | ||||||
|  | 					gEditor.on("cursorActivity", cursorActivity); | ||||||
|  |  | ||||||
|  | 					parent.postMessage({ready: true}, "*"); | ||||||
|  | 				}); | ||||||
|  | 			</script> | ||||||
|  | 		</head> | ||||||
|  | 		<body> | ||||||
|  | 			<div id="menu"> | ||||||
|  | 				<input type="button" value="Back" onclick="index()"> | ||||||
|  | ` + (core.user.credentials.permissions && core.user.credentials.permissions.authenticated ? ` | ||||||
|  | 				<input type="button" value="Save" onclick="submit()"> | ||||||
|  | ` : "") + | ||||||
|  | 	`			<a target="_top" href="https://casual-effects.com/markdeep/">Markdeep</a> | ||||||
|  | 				<input type="text" id="title" oninput="textChanged()"> | ||||||
|  | 			</div> | ||||||
|  | 			<div id="container"> | ||||||
|  | 				<div id="edit"><textarea id="contents" oninput="textChanged()"></textarea></div> | ||||||
|  | 				<div id="preview"></div> | ||||||
|  | 			</div> | ||||||
|  | 		</body> | ||||||
|  | 	</html>`, name: "iframe", style: "flex: 1 1 auto; border: 0; width: 100%"}); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | require("ui").fileList({ | ||||||
|  | 	title: "Live Markdeep Editor", | ||||||
|  | 	edit: editPage, | ||||||
|  | }); | ||||||
| @@ -83,17 +83,14 @@ function notifyChanged() { | |||||||
| 	return core.broadcast({changed: true}); | 	return core.broadcast({changed: true}); | ||||||
| } | } | ||||||
|  |  | ||||||
| function readList(key) { | async function readList(key) { | ||||||
| 	return database.get(key).catch(function(error) { | 	let todo = null; | ||||||
| 		return null; |  | ||||||
| 	}).then(function(todo) { |  | ||||||
| 	try { | 	try { | ||||||
| 			todo = JSON.parse(todo); | 		todo = JSON.parse(await database.get(key)); | ||||||
| 	} catch (error) { | 	} catch (error) { | ||||||
| 		todo = {name: "TODO", items: []}; | 		todo = {name: "TODO", items: []}; | ||||||
| 	} | 	} | ||||||
| 	return todo; | 	return todo; | ||||||
| 	}); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| function writeList(key, todo) { | function writeList(key, todo) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user