Documention for: view-html.r
Created by: btiffin
on: 17-May-2007
Last updated by: btiffin on: 17-May-2007
Format: html
Downloaded on: 28-Mar-2024

Usage document for %view-html.r

1. Introduction to %view-html.r
2. view-html At a Glance
3. Using %view-html.r
3.1. Running %view-html.r
4. See also
5. What you can learn
5.1. URLs
5.2. Web Server defaults
5.3. Changing what page is displayed
5.4. Getting REBOL
5.5. Super simple and powerful gui creation
5.6. Powerful builtin Internet Access
5.7. Compare the complexity to the simplicity
5.7.1. D Language sample for printing HTML as text
6. What can break
7. Credits

1. Introduction to %view-html.r

view-html.r is an introduction to the ease of gui creation with REBOL/View, plus the ease and simplicity of accessing internet URLs.

gui Graphic User Interface, usually pronounced as gooey
HTML Hyper Text Markup Language, usually pronounced
H T M L
URL Uniform Resource Locator, usually pronounced
U R L
widget Window Gadget, REBOL/View uses the term face for buttons, text areas and other windowing gadgets.

2. view-html At a Glance

Not setup is required, just do it.

>> do %view-html.r
 

view-html.png

The above image was created running REBOL/View 2.7.5.4.2 GNU/Linux 4.0, KDE Desktop. and has been cropped for space.

3. Using %view-html.r

Requires REBOL/View

3.1. Running %view-html.r

From the library with:

 >> do http://www.rebol.org/cgi-bin/cgiwrap/rebol/download-a-script.r?script-name=view-html.r
 
or locally with:
 >> do %view-html.r
 

4. See also

There is another rebol.org script, very similar to this one,
%webprint.r  that is more like the sample D program listed below, in that there is no gui involved.

5. What you can learn

This script is an introduction to the view and layout functions.
Please see the REBOL/View Developer's Guide 

5.1. URLs

http://www.rebol.com is actually a value with a special datatype. In REBOL this is a url!. Very powerful. No quotes needed. REBOL just knows.

5.2. Web Server defaults

Web Servers have default files that are returned. http://www.rebol.com is actually returned as http://www.rebol.com/index.html. This is not always the case. Some sites return default.htm, or index.php, or index.cgi. No need to worry, the REBOL read function and the web server will work that all out for you. If REBOL Technologies ever changes its web server setup, a different file may be returned and this script will still work.

5.3. Changing what page is displayed

Changing the website or page that is printed is as easy as changing the text after the http:// part following the read command.

5.4. Getting REBOL

Both REBOL/Core and REBOL/View are available
free of charge from www.rebol.com 

5.5. Super simple and powerful gui creation

REBOL/View gui building is easy.

view layout [...gui specification...] How cool is REBOL/View?

5.6. Powerful builtin Internet Access

REBOL has fantastically simple builtin procedures for accessing the internet.
read http://www.rebol.com accesses and returns the HTML as text. How cool is that?

5.7. Compare the complexity to the simplicity

Please compare the read http://www.rebol.com 25 character sequence to this D language  program (which doesn't have a window by the way, just text output to a console).

5.7.1. D Language sample for printing HTML as text

 /*
     HTMLget written by Christopher E. Miller
     This code is public domain.
     You may use it for any purpose.
     This code has no warranties and is provided 'as-is'.
 */

 //debug = HTMLGET;

 import std.string, std.conv, std.stream;
 import std.socket, std.socketstream;

 int main(char[][] args)
 {
     if(args.length < 2)
     {
         printf("Usage:\n   htmlget <web-page>\n");
         return 0;
     }
     char[] url = args[1];
     int i;

     i = std.string.find(url, "://");
     if(i != -1)
     {
         if(icmp(url[0 .. i], "http"))
             throw new Exception("http:// expected");
     }

     i = std.string.find(url, '#');
     if(i != -1) // Remove anchor ref.
         url = url[0 .. i];

     i = std.string.find(url, '/');
     char[] domain;
     if(i == -1)
     {
         domain = url;
         url = "/";
     }
     else
     {
         domain = url[0 .. i];
         url = url[i .. url.length];
     }

     uint port;
     i = std.string.find(domain, ':');
     if(i == -1)
     {
         port = 80; // Default HTTP port.
     }
     else
     {
         port = std.conv.toUshort(domain[i + 1 .. domain.length]);
         domain = domain[0 .. i];
     }

     debug(HTMLGET)
         printf("Connecting to " ~ domain ~ " on port " ~ std.string.toString(port) ~ "...\n");

     auto Socket sock = new TcpSocket(new InternetAddress(domain, port));
     Stream ss = new SocketStream(sock);

     debug(HTMLGET)
         printf("Connected!\nRequesting URL \" ~ url ~ "\"...\n");

     if(port != 80)
         domain = domain ~ ":" ~ std.string.toString(port);
     ss.writeString("GET " ~ url ~ " HTTP/1.1\r\n"
         "Host: " ~ domain ~ "\r\n"
         "\r\n");

     // Skip HTTP header.
     char[] line;
     for(;;)
     {
         line = ss.readLine();
         if(!line.length)
             break;

         const char[] CONTENT_TYPE_NAME = "Content-Type: ";
         if(line.length > CONTENT_TYPE_NAME.length &&
             !icmp(CONTENT_TYPE_NAME, line[0 .. CONTENT_TYPE_NAME.length]))
         {
             char[] type;
             type = line[CONTENT_TYPE_NAME.length .. line.length];
             if(type.length <= 5 || icmp("text/", type[0 .. 5]))
                 throw new Exception("URL is not text");
         }
     }

     print_lines:
     while(!ss.eof())
     {
         line = ss.readLine();
         printf("%.*s\n", line);

         //if(std.string.ifind(line, "</html>") != -1)
         //  break;
         size_t iw;
         for(iw = 0; iw != line.length; iw++)
         {
             if(!icmp("</html>", line[iw .. line.length]))
                 break print_lines;
         }
     }

     return 0;
 }
 
What would you rather type? The above or something like
print read join http:// ask "Web site? " What will be easier to remember 6 months from now?

6. What can break

This particular example does not have scroll bars. Not hard to add, but in this case, there is more text on the rebol.com home page than will fit in the window.

You will need access to the internet and rebol.com will have to be up and running for this script to work. Don't worry, rebol.com is always up and running.

REBOL/Core will not have the view or layout functions defined. You will need to start up REBOL/View.

7. Credits

%view-html.r Author: Unknown
%webprint.r Author: Unknown
htmlget.d Author Christopher E. Miller
D Programming Language Walter Bright, Digital Mars
REBOL/View Carl Sassenrath, REBOL Technologies