REBOL [
    Title: "Web Site Builder"
    Date: 3-Jun-1999
    File: %build-site.r
    Author: "Carl Sassenrath"
    Purpose: {The actual script that builds the REBOL web site (using a master template and a navigation structure).}
    library: [
        level: 'advanced 
        platform: 'all 
        type: 'Tool 
        domain: [file-handling html markup web] 
        tested-under: none 
        support: none 
        license: none 
        see-also: none
    ]
    Version: 1.0.0
]

Verbose: on          ; print more info
Auto-expand: off     ; auto expanding menus

Source-Dir: %source  ; where to find raw page content files
Output-Dir: %www     ; where to put the finished HTLM files

site-path: "www.rebol.com/www"


;****** REBOL Site Structure **************************************************
;   Specifies the structure of the web site, and is used to build the
;   navigation menu on the left side of the screen.

Menu: [

    HOME %home.html none

    INTRODUCTION %introduction.html [
        "In a Nutshell"       %nutshell.html
        "REBOL Features"      %features.html
        "REBOL with a Cause"  %rebolcause.html
        "Messaging Language?" %msglang.html
        "REBOL in Ten Steps"  %rebolsteps.html
    ]
                                           
    DOWNLOAD %downloads.html none

    LIBRARY %library.html [
       "Script Library"     %examples.html
       "User's Library"     %userlib.html
   ]

    SUPPORT %support.html [
        "How-To"            %howto.html
        "Guides"            %docs.html
        "Feedback"          %feedback.html
    ]

    COMPANY %company.html [
        "Mission & Vision"  %mission.html
        "Fact Sheet"        %factsheet.html
        ;"In the News"       %inthenews.html
        "Backgrounder"      %background.html
        "Executive Bios"    %bios.html
        "To Contact Us"          %contacts.html
    ]

    JOBS %jobs.html none
]

Other-files: [
    %application.html
    %jobthanks.html
    %missing.html
    %news9511.html
    %platforms.html
    %releases.html

    ;-- How-tos:
    %database.html %ftp.html %email-read.html
    %email-send.html %net-setup.html %series-format.html
    %tcp.html %web-read.html
]


;****** Utility Functions *****************************************************

error: func [msg] [print msg halt]


;****** HTML Template *********************************************************
;   Specifies the HTML template markers.  These are words which will hold
;   the location of the insertion points for various items in the template.
;   The loop searchs for each word, then sets the word to the location.

Markers: [menu-area content-area]  ; must be unique words in the template

Template: read source-dir/master.html

item: template
foreach word markers [
    item: find item form word
    if none? item [error ["No template marker for:" word]]
    set word index? item
    remove/part item length? form word
]

Updated-files: []

time-stamp: either exists? %timestamp.r [load %timestamp.r][1-1-1900]


;****** Builder Functions *****************************************************

make-page: func [
    "Make the new web page with menus."
    file section title
    /local contents page
][
    if not exists? source-dir/:file [error ["Missing source file:" file]]
    if all [time-stamp > modified? %build-site.r
        time-stamp > modified? source-dir/:file] [exit]
    if verbose [print ["Building:" file]]
    contents: read source-dir/:file
    if not parse contents [to "" copy page to  to end][
        error ["Invalid source file:" file]
    ]

    ; Insert the body html into the template at the desired position:
    page: head insert at copy template content-area page
    make-menu page section title
    insert find page  join " " title
    write output-dir/:file page
    append updated-files file
]

make-menu: func [
    "Make the approriate menu for a page."
    page section title
    /local menu-part
][
    menu-part: at page menu-area
    foreach [menu-item file sub-menu] menu [
        menu-part: link-menu menu-part file menu-item false 
            all [menu-item = section title = section]
        if any [not auto-expand menu-item = section] [  ; we are in this section
            if sub-menu <> 'none [
                foreach [titl file] sub-menu [
                    menu-part: link-menu menu-part file titl true titl = title
                ]
            ]
        ]
        menu-part: insert menu-part 

] ] link-menu: func [ "Create a linked menu item." menu-tail file text sub current ][ insert menu-tail reduce either current [[ either sub [{  }][ {}] text
either sub [
]["
"] ]][[ either sub [{  }][] {} text
either sub [
][] ]] ] ;****** Main Loop ************************************************************* foreach [section file sub-menu] menu [ make-page file section section if block? sub-menu [ foreach [title file] sub-menu [make-page file section title] ] ] foreach file other-files [ make-page file none none ] ;****** Upload Files ********************************************************** if find/match ask "Upload now? " "y" [ print "Uploading..." either exists? %userpass.r [do %userpass.r][ user: ask "Username? " pass: ask "Password? " ] foreach file updated-files [ print ["Uploading:" file] ;write join ftp:// [user ":" pass "@" site-path "/" file] read output-dir/:file ] ;save %timestamp.r now ] quit