92 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Factor
		
	
	
		
		
			
		
	
	
			92 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Factor
		
	
	
| 
								 | 
							
								! Copyright (C) 2006 Doug Coleman.
							 | 
						||
| 
								 | 
							
								! See http://factorcode.org/license.txt for BSD license.
							 | 
						||
| 
								 | 
							
								USING: generic assocs help html httpd
							 | 
						||
| 
								 | 
							
								io kernel math namespaces prettyprint sequences store strings ;
							 | 
						||
| 
								 | 
							
								IN: wee-url-responder
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								SYMBOL: wee-shortcuts
							 | 
						||
| 
								 | 
							
								SYMBOL: wee-store
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								"wee-url.store" load-store wee-store set-global
							 | 
						||
| 
								 | 
							
								H{ } clone wee-shortcuts wee-store get store-variable
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: responder-url "responder-url" get ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: wee-url ( string -- url )
							 | 
						||
| 
								 | 
							
								    [
							 | 
						||
| 
								 | 
							
								        "http://" %
							 | 
						||
| 
								 | 
							
								        host %
							 | 
						||
| 
								 | 
							
								        responder-url %
							 | 
						||
| 
								 | 
							
								        %
							 | 
						||
| 
								 | 
							
								    ] "" make ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: letter-bank
							 | 
						||
| 
								 | 
							
								    "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890" ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: random-letter letter-bank length random letter-bank nth ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: random-url ( -- string )
							 | 
						||
| 
								 | 
							
								    6 random 1+ [ drop random-letter ] map >string
							 | 
						||
| 
								 | 
							
								    dup wee-shortcuts get key? [ drop random-url ] when ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: prepare-wee-url ( url -- url )
							 | 
						||
| 
								 | 
							
								    CHAR: : over member? [ "http://" swap append ] unless ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: set-symmetric-hash ( obj1 obj2 hash -- )
							 | 
						||
| 
								 | 
							
								    3dup set-at swapd set-at ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: add-shortcut ( url-long -- url-short )
							 | 
						||
| 
								 | 
							
								    dup wee-shortcuts get at* [
							 | 
						||
| 
								 | 
							
								        nip
							 | 
						||
| 
								 | 
							
								    ] [
							 | 
						||
| 
								 | 
							
								        drop
							 | 
						||
| 
								 | 
							
								        random-url [ wee-shortcuts get set-symmetric-hash ] keep
							 | 
						||
| 
								 | 
							
								        wee-store get save-store
							 | 
						||
| 
								 | 
							
								    ] if ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: url-prompt ( -- )
							 | 
						||
| 
								 | 
							
								    serving-html
							 | 
						||
| 
								 | 
							
								    "wee-url.com - wee URLs since 2007" [
							 | 
						||
| 
								 | 
							
								        <form "get" =method responder-url =action form>
							 | 
						||
| 
								 | 
							
								            "URL: " write
							 | 
						||
| 
								 | 
							
								            <input "text" =type "url" =name input/>
							 | 
						||
| 
								 | 
							
								            <input "submit" =type "Submit" =value input/>
							 | 
						||
| 
								 | 
							
								        </form>
							 | 
						||
| 
								 | 
							
								    ] simple-html-document ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: url-submitted ( url-long url-short -- )
							 | 
						||
| 
								 | 
							
								    "URL Submitted" [
							 | 
						||
| 
								 | 
							
								        "URL: " write write nl
							 | 
						||
| 
								 | 
							
								        "wee-url: " write
							 | 
						||
| 
								 | 
							
								        <a dup wee-url =href a> wee-url write </a> nl
							 | 
						||
| 
								 | 
							
								        "Back to " write
							 | 
						||
| 
								 | 
							
								        <a responder-url =href a> "wee-url" write </a> nl
							 | 
						||
| 
								 | 
							
								    ] simple-html-document ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: url-submit ( url -- )
							 | 
						||
| 
								 | 
							
								    serving-html
							 | 
						||
| 
								 | 
							
								    prepare-wee-url [ add-shortcut ] keep url-submitted ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: url-error ( -- )
							 | 
						||
| 
								 | 
							
								    serving-html
							 | 
						||
| 
								 | 
							
								    "wee-url error" [
							 | 
						||
| 
								 | 
							
								        "No such link." write
							 | 
						||
| 
								 | 
							
								    ] simple-html-document ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: wee-url-responder ( url -- )
							 | 
						||
| 
								 | 
							
								    "url" query-param [
							 | 
						||
| 
								 | 
							
								        url-submit drop
							 | 
						||
| 
								 | 
							
								    ] [
							 | 
						||
| 
								 | 
							
								        dup empty? [
							 | 
						||
| 
								 | 
							
								            drop url-prompt
							 | 
						||
| 
								 | 
							
								        ] [
							 | 
						||
| 
								 | 
							
								            wee-shortcuts get at*
							 | 
						||
| 
								 | 
							
								            [ permanent-redirect ] [ drop url-error ] if
							 | 
						||
| 
								 | 
							
								        ] if
							 | 
						||
| 
								 | 
							
								    ] if* ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[
							 | 
						||
| 
								 | 
							
								    "wee-url" "responder" set
							 | 
						||
| 
								 | 
							
								    [ wee-url-responder ] "get" set
							 | 
						||
| 
								 | 
							
								] make-responder
							 |