2014-12-17 16:07:15 -05:00
|
|
|
! Copyright (C) 2014 John Benediktsson
|
|
|
|
! See http://factorcode.org/license.txt for BSD license
|
|
|
|
|
2014-12-26 22:20:22 -05:00
|
|
|
USING: accessors byte-arrays calendar colors.constants
|
|
|
|
combinators formatting fry images images.loader
|
|
|
|
images.loader.private images.viewer io io.encodings.binary
|
|
|
|
io.encodings.string io.encodings.utf8 io.sockets io.styles
|
|
|
|
io.timeouts kernel make math math.parser namespaces present
|
|
|
|
prettyprint sequences splitting summary urls urls.encoding
|
|
|
|
vocabs ;
|
2014-12-17 16:07:15 -05:00
|
|
|
|
|
|
|
IN: gopher
|
|
|
|
|
|
|
|
<PRIVATE
|
|
|
|
|
|
|
|
CONSTANT: A_TEXT CHAR: 0
|
|
|
|
CONSTANT: A_MENU CHAR: 1
|
|
|
|
CONSTANT: A_CSO CHAR: 2
|
|
|
|
CONSTANT: A_ERROR CHAR: 3
|
|
|
|
CONSTANT: A_MACBINHEX CHAR: 4
|
|
|
|
CONSTANT: A_PCBINHEX CHAR: 5
|
|
|
|
CONSTANT: A_UUENCODED CHAR: 6
|
|
|
|
CONSTANT: A_INDEX CHAR: 7
|
|
|
|
CONSTANT: A_TELNET CHAR: 8
|
|
|
|
CONSTANT: A_BINARY CHAR: 9
|
|
|
|
CONSTANT: A_DUPLICATE CHAR: +
|
|
|
|
CONSTANT: A_SOUND CHAR: s
|
|
|
|
CONSTANT: A_EVENT CHAR: e
|
|
|
|
CONSTANT: A_CALENDAR CHAR: c
|
|
|
|
CONSTANT: A_HTML CHAR: h
|
|
|
|
CONSTANT: A_TN3270 CHAR: T
|
|
|
|
CONSTANT: A_MIME CHAR: M
|
|
|
|
CONSTANT: A_IMAGE CHAR: I
|
|
|
|
CONSTANT: A_WHOIS CHAR: w
|
|
|
|
CONSTANT: A_QUERY CHAR: q
|
|
|
|
CONSTANT: A_GIF CHAR: g
|
|
|
|
CONSTANT: A_WWW CHAR: w
|
|
|
|
CONSTANT: A_PLUS_IMAGE CHAR: :
|
|
|
|
CONSTANT: A_PLUS_MOVIE CHAR: ;
|
|
|
|
CONSTANT: A_PLUS_SOUND CHAR: <
|
|
|
|
|
2014-12-20 14:28:23 -05:00
|
|
|
: gopher-get ( selector -- item-type byte-array )
|
|
|
|
"/" split1 "" or
|
|
|
|
[ dup length 1 > [ string>number ] [ first ] if ]
|
|
|
|
[
|
|
|
|
"?" split1 [ "\t" glue ] when*
|
2014-12-23 22:22:35 -05:00
|
|
|
"\r\n" append utf8 encode write flush contents
|
2014-12-20 14:28:23 -05:00
|
|
|
] bi* ;
|
2014-12-17 16:07:15 -05:00
|
|
|
|
2014-12-20 14:28:23 -05:00
|
|
|
PRIVATE>
|
2014-12-17 16:07:15 -05:00
|
|
|
|
2014-12-20 14:28:23 -05:00
|
|
|
ERROR: not-a-gopher-url url ;
|
|
|
|
|
2014-12-20 15:27:51 -05:00
|
|
|
: gopher ( url -- item-type byte-array )
|
2014-12-20 14:28:23 -05:00
|
|
|
dup url? [ >url ] unless
|
|
|
|
dup protocol>> "gopher" = [ not-a-gopher-url ] unless {
|
|
|
|
[ host>> ]
|
|
|
|
[ port>> 70 or <inet> binary ]
|
|
|
|
[ path>> rest [ "1/" ] when-empty ]
|
|
|
|
[ query>> [ assoc>query url-decode "?" glue ] when* ]
|
2014-12-26 22:20:22 -05:00
|
|
|
} cleave '[
|
|
|
|
1 minutes input-stream get set-timeout
|
|
|
|
_ gopher-get
|
|
|
|
] with-client ;
|
2014-12-20 14:28:23 -05:00
|
|
|
|
|
|
|
<PRIVATE
|
2014-12-17 16:07:15 -05:00
|
|
|
|
|
|
|
TUPLE: gopher-link type name selector host port ;
|
|
|
|
|
2014-12-17 16:38:29 -05:00
|
|
|
M: gopher-link summary >url present ;
|
|
|
|
|
2014-12-17 16:07:15 -05:00
|
|
|
: <gopher-link> ( item -- gopher-link )
|
2014-12-21 12:42:54 -05:00
|
|
|
unclip swap "\t" split first4 gopher-link boa ;
|
2014-12-17 16:07:15 -05:00
|
|
|
|
|
|
|
M: gopher-link >url
|
|
|
|
dup type>> CHAR: h = [
|
|
|
|
selector>> "URL:" ?head drop
|
|
|
|
] [
|
|
|
|
{
|
|
|
|
[ host>> ] [ port>> ] [ type>> ] [ selector>> ]
|
|
|
|
} cleave "gopher://%s:%s/%s%s" sprintf
|
|
|
|
] if >url ;
|
|
|
|
|
2014-12-20 15:27:51 -05:00
|
|
|
: gopher-link. ( gopher-link -- )
|
|
|
|
dup type>> CHAR: i = [
|
|
|
|
name>> print
|
|
|
|
] [
|
|
|
|
[ name>> ] keep [
|
|
|
|
presented ,,
|
|
|
|
COLOR: blue foreground ,,
|
|
|
|
] H{ } make format nl
|
|
|
|
] if ;
|
|
|
|
|
2014-12-20 14:28:23 -05:00
|
|
|
: gopher-text ( object -- lines )
|
2014-12-20 15:11:23 -05:00
|
|
|
utf8 decode string-lines { "." } split1 drop ;
|
2014-12-17 16:07:15 -05:00
|
|
|
|
2014-12-21 12:42:54 -05:00
|
|
|
: gopher-text. ( object -- )
|
|
|
|
gopher-text [ print ] each ;
|
2014-12-17 16:07:15 -05:00
|
|
|
|
2014-12-21 12:42:54 -05:00
|
|
|
: gopher-gif. ( object -- )
|
|
|
|
"gif" (image-class) load-image* image. ;
|
|
|
|
|
|
|
|
: gopher-menu. ( object -- )
|
|
|
|
gopher-text [
|
|
|
|
[ nl ] [ <gopher-link> gopher-link. ] if-empty
|
|
|
|
] each ;
|
2014-12-20 14:28:23 -05:00
|
|
|
|
|
|
|
PRIVATE>
|
2014-12-17 16:07:15 -05:00
|
|
|
|
|
|
|
: gopher. ( url -- )
|
2014-12-20 15:27:51 -05:00
|
|
|
gopher swap {
|
2014-12-21 12:42:54 -05:00
|
|
|
{ A_TEXT [ gopher-text. ] }
|
|
|
|
{ A_MENU [ gopher-menu. ] }
|
|
|
|
{ A_INDEX [ gopher-menu. ] }
|
|
|
|
{ A_GIF [ gopher-gif. ] }
|
2014-12-20 15:27:51 -05:00
|
|
|
[ drop . ]
|
|
|
|
} case ;
|