mirror of
				https://github.com/flynx/Course-JavaScript.git
				synced 2025-10-31 20:10:08 +00:00 
			
		
		
		
	moved Slang to a separate repo...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
		
							parent
							
								
									91beb4d0d4
								
							
						
					
					
						commit
						fbc68b9393
					
				| @ -1,4 +0,0 @@ | |||||||
| # Slang |  | ||||||
| 
 |  | ||||||
| For and interactive version of Slang interpreter go here:  |  | ||||||
| http://flynx.github.io/Course-JavaScript/Slang/slang.html |  | ||||||
| @ -1,7 +0,0 @@ | |||||||
| 
 |  | ||||||
| { |  | ||||||
| 	"short_name": "Slang", |  | ||||||
| 	"name": "Slang", |  | ||||||
| 	"display": "standalone", |  | ||||||
| 	"Theme_color": "white" |  | ||||||
| } |  | ||||||
| @ -1,11 +0,0 @@ | |||||||
| CACHE MANIFEST |  | ||||||
| # Timestamp: 20170929020625 |  | ||||||
| 
 |  | ||||||
| CACHE: |  | ||||||
| slang.html |  | ||||||
| slang.js |  | ||||||
| manifest.json |  | ||||||
| 
 |  | ||||||
| NETWORK: |  | ||||||
| * |  | ||||||
| 
 |  | ||||||
							
								
								
									
										279
									
								
								Slang/slang.html
									
									
									
									
									
								
							
							
						
						
									
										279
									
								
								Slang/slang.html
									
									
									
									
									
								
							| @ -1,279 +0,0 @@ | |||||||
| <!DOCTYPE html> |  | ||||||
| <html manifest="slang.appcache"> |  | ||||||
| <head> |  | ||||||
| <title>Slang</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"> |  | ||||||
| 
 |  | ||||||
| </head> |  | ||||||
| <style> |  | ||||||
| 
 |  | ||||||
| #bootstrap { |  | ||||||
| 	display: none; |  | ||||||
| } |  | ||||||
| #bootstrap[shown] { |  | ||||||
| 	display: block; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .command { |  | ||||||
| 	padding-left: 5px; |  | ||||||
| 	padding-right: 5px; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .command:hover { |  | ||||||
| 	background: #eee; |  | ||||||
| 	cursor: hand; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .command:empty:after { |  | ||||||
| 	content: "input code here..."; |  | ||||||
| 	opacity: 0.5; |  | ||||||
| } |  | ||||||
| .command:focus:before { |  | ||||||
| 	position: absolute; |  | ||||||
| 	content: "ctrl+enter to run"; |  | ||||||
| 	opacity: 0.3; |  | ||||||
| 	right: 15px; |  | ||||||
| } |  | ||||||
| .command:focus:after { |  | ||||||
| 	opacity: 0.2; |  | ||||||
| } |  | ||||||
| .command:last-child { |  | ||||||
| 	border: red 2px solid; |  | ||||||
| 	border-radius: 5px; |  | ||||||
| 	box-shadow: 2px 2px 5px 0px silver; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .error { |  | ||||||
| 	color: red; |  | ||||||
| 	font-style: italic; |  | ||||||
| } |  | ||||||
| .output { |  | ||||||
| 	font-weight: bold; |  | ||||||
| } |  | ||||||
| .error:before, |  | ||||||
| .output:before { |  | ||||||
| 	content: ">"; |  | ||||||
| 	color: red; |  | ||||||
| 	font-weight: bold; |  | ||||||
| 	margin: 5px; |  | ||||||
| } |  | ||||||
| .output:before { |  | ||||||
| 	color: blue; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #words { |  | ||||||
| 	font-family: monospace; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .word[word-type=constant] { |  | ||||||
| 	font-weight: bold; |  | ||||||
| 	color: red; |  | ||||||
| } |  | ||||||
| .word[word-type=builtin] { |  | ||||||
| 	font-style: italic; |  | ||||||
| 	color: blue; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #stack { |  | ||||||
| 	opacity: 0.8; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| /* syntax... */ |  | ||||||
| 
 |  | ||||||
| pre .comment { |  | ||||||
| 	font-style: italic; |  | ||||||
| 	color: gray; |  | ||||||
| } |  | ||||||
| pre :not(.comment) { |  | ||||||
| 	font-weight: bold; |  | ||||||
| } |  | ||||||
| pre :not(.comment) .string { |  | ||||||
| 	font-style: italic; |  | ||||||
| 	color: blue; |  | ||||||
| } |  | ||||||
| pre :not(.comment) .word { |  | ||||||
| 	font-weight: bold; |  | ||||||
| 	color: blue; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| </style> |  | ||||||
| <script src="slang.js"></script> |  | ||||||
| 
 |  | ||||||
| <script> |  | ||||||
| 
 |  | ||||||
| function stringifySlangCode(code){ |  | ||||||
| 	if(code == null){ |  | ||||||
| 		return code |  | ||||||
| 	} |  | ||||||
| 	if(typeof(code) == typeof('str') && /\s/.test(code)){ |  | ||||||
| 		return '\''+code+'\'' |  | ||||||
| 	} else if(code && code.constructor.name == 'Array'){ |  | ||||||
| 		return '[ '+code.map(stringifySlangCode).join(' ')+' ]' |  | ||||||
| 	} |  | ||||||
| 	return code |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function runCommand(){ |  | ||||||
| 	var stack = document.getElementById('stack') |  | ||||||
| 	var console = document.getElementById('console') |  | ||||||
| 	var commands = document.getElementsByClassName('command') |  | ||||||
| 	var command = commands[commands.length-1] |  | ||||||
| 	command.removeAttribute('contenteditable') |  | ||||||
| 
 |  | ||||||
| 	command.addEventListener('click', function(e){ |  | ||||||
| 		var commands = document.getElementsByClassName('command') |  | ||||||
| 		var c = commands[commands.length-1] |  | ||||||
| 		c.innerText = command.innerText |  | ||||||
| 		c.focus() |  | ||||||
| 		window.scrollTo(0,document.body.scrollHeight) |  | ||||||
| 	}, false) |  | ||||||
| 	 |  | ||||||
| 	try{ |  | ||||||
| 		stack.innerText = 'stack: ' + stringifySlangCode(slang(command.innerText)) |  | ||||||
| 
 |  | ||||||
| 	} catch(e) { |  | ||||||
| 		stack.innerText = 'stack: ' + stringifySlangCode(CONTEXT.stack) |  | ||||||
| 		var err = document.createElement('div') |  | ||||||
| 		err.classList.add('error') |  | ||||||
| 		if(e.message != null){ |  | ||||||
| 			err.innerText = e.message |  | ||||||
| 		} else { |  | ||||||
| 			err.innerText = e |  | ||||||
| 		} |  | ||||||
| 		console.appendChild(err) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// create the next element... |  | ||||||
| 	var next = document.createElement('div') |  | ||||||
| 	next.classList.add('command') |  | ||||||
| 	next.setAttribute('contenteditable', true) |  | ||||||
| 	console.appendChild(next) |  | ||||||
| 	next.focus() |  | ||||||
| 
 |  | ||||||
| 	window.scrollTo(0,document.body.scrollHeight) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| NAMESPACE.print = function(context){ |  | ||||||
| 	var c = document.getElementById('console') |  | ||||||
| 	var o = context.stack[context.stack.length-1] |  | ||||||
| 	console.log('>>>', o) |  | ||||||
| 
 |  | ||||||
| 	var data = document.createElement('div') |  | ||||||
| 	data.classList.add('output') |  | ||||||
| 	data.innerHTML = stringifySlangCode(o) |  | ||||||
| 	c.appendChild(data) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // XXX should this break exec? |  | ||||||
| NAMESPACE.err = function(context){ |  | ||||||
| 	var c = document.getElementById('console') |  | ||||||
| 	var e = context.stack[context.stack.length-1] |  | ||||||
| 	console.error('>>>', e) |  | ||||||
| 
 |  | ||||||
| 	var err = document.createElement('div') |  | ||||||
| 	err.classList.add('error') |  | ||||||
| 	if(e.message != null){ |  | ||||||
| 		err.innerText = e.message |  | ||||||
| 	} else { |  | ||||||
| 		err.innerText = e |  | ||||||
| 	} |  | ||||||
| 	c.appendChild(err) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| function toggleBootstrapCode(){ |  | ||||||
| 	var bootstrap = document.getElementById('bootstrap') |  | ||||||
| 	if(bootstrap.hasAttribute('shown')){ |  | ||||||
| 		bootstrap.removeAttribute('shown') |  | ||||||
| 	} else { |  | ||||||
| 		bootstrap.setAttribute('shown', true) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function showAvailableWords(){ |  | ||||||
| 	document.getElementById('words').innerHTML = Object.keys(NAMESPACE) |  | ||||||
| 		.sort() |  | ||||||
| 		.filter(function(e){ |  | ||||||
| 			// skip words starting with '_'... |  | ||||||
| 			if(e[0] == '_'){ |  | ||||||
| 				return false |  | ||||||
| 			} |  | ||||||
| 			return true |  | ||||||
| 		}) |  | ||||||
| 		.map(function(e){ |  | ||||||
| 			var code = NAMESPACE[e] |  | ||||||
| 			var type |  | ||||||
| 			if(code && code.constructor.name == 'Array'){ |  | ||||||
| 				type = 'word' |  | ||||||
| 				code = stringifySlangCode(code) |  | ||||||
| 			} else if(typeof(code) == typeof(function(){})){ |  | ||||||
| 				type = 'builtin' |  | ||||||
| 			} else { |  | ||||||
| 				type = 'constant' |  | ||||||
| 			} |  | ||||||
| 			return '<span class="word" word-type="'+type+'" title="'+code+'">'+e+'</span>' |  | ||||||
| 		}) |  | ||||||
| 		.join(' ') |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| </script> |  | ||||||
| 
 |  | ||||||
| <body> |  | ||||||
| 	<h1>Slang</h1> |  | ||||||
| 	<a href="#" onclick="toggleBootstrapCode()">Toggle bootstrap code view...</a> |  | ||||||
| 	<div id="bootstrap"></div> |  | ||||||
| 	<h2>Available words</h2> |  | ||||||
| 	<p> |  | ||||||
| 		This section includes constants (red) and constant-like |  | ||||||
| 		words (words that allways yield the same value),  |  | ||||||
| 		built-in words (blue), and 2'nd gen words (black): |  | ||||||
| 	</p> |  | ||||||
| 	<p id="words"></p> |  | ||||||
| 	<h2>Slang Console</h2> |  | ||||||
| 	<div id="console"> |  | ||||||
| 		<div class="command" contenteditable="true"></div> |  | ||||||
| 	</div> |  | ||||||
| 	<div id="stack"></div> |  | ||||||
| </body> |  | ||||||
| <script> |  | ||||||
| var bootstrap = BOOTSTRAP |  | ||||||
| 	// basic HTML compatibility stuff... |  | ||||||
| 	.replace(/&/g, '&') |  | ||||||
| 	.replace(/>/g, '>') |  | ||||||
| 	.replace(/</g, '<') |  | ||||||
| 	// very basic syntax highlighting... |  | ||||||
| 	// comments... |  | ||||||
| 	.replace(/(\(.*)-(.*\))/g, '<span class="comment">$1−$2</span>') |  | ||||||
| 	.replace(/(\([^\)]*\))/g, '<span class="comment">$1</span>') |  | ||||||
| 	.replace(/(\s*--.*\n)/g, '<span class="comment">$1</span>') |  | ||||||
| /* |  | ||||||
| Object.keys(NAMESPACE).forEach(function(k){ |  | ||||||
| 	bootstrap = bootstrap.replace( |  | ||||||
| 		RegExp('('+k |  | ||||||
| 			.replace('&', '&') |  | ||||||
| 			.replace('<', '<') |  | ||||||
| 			.replace('>', '>') |  | ||||||
| 			.replace(/([\|\[\]\.\*\/\\\?\+\-])/g, '\\$1')+')', 'g'),  |  | ||||||
| 		'<span class="word">$1</span>') |  | ||||||
| }) |  | ||||||
| */ |  | ||||||
| document.getElementById('bootstrap').innerHTML='<pre>'+bootstrap+'</pre>' |  | ||||||
| 
 |  | ||||||
| document.getElementById('console') |  | ||||||
| 	.addEventListener("keyup", function(e) { |  | ||||||
| 		if(e.keyCode == 13 && e.ctrlKey){ |  | ||||||
| 			runCommand() |  | ||||||
| 			showAvailableWords() |  | ||||||
| 		} |  | ||||||
| 	}, false); |  | ||||||
| 
 |  | ||||||
| showAvailableWords() |  | ||||||
| 
 |  | ||||||
| </script> |  | ||||||
| </html> |  | ||||||
							
								
								
									
										1134
									
								
								Slang/slang.js
									
									
									
									
									
								
							
							
						
						
									
										1134
									
								
								Slang/slang.js
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user