REBOL [
    Title: "HTML Rainbow generator for Rebol/View"
    Date: 31-May-2001/1:18-7:00
    Version: 1.0.1
    File: %view-rainbow.r
    Author: "Cal Dixon"
    Purpose: {Create HTML color fade effects.  Places output on the  clipboard}
    Email: rebol@programmer.net
    Web: http://flyingparty.com/deadzaphod/
    library: [
        level: 'intermediate 
        platform: none 
        type: 'tool 
        domain: [GUI web markup] 
        tested-under: none 
        support: none 
        license: none 
        see-also: none
    ]
]

window: layout [
   sourcetext: area "Type text to rainbowize here."
   across
   startcolor: button black "Start Color" [
      face/color: request-color/color any [face/color gray]
      show face
      ]
   endcolor: button black "End Color" [
      face/color: request-color/color any [face/color gray]
      show face
      ]
   return
   button "Make HTML" [
      if not empty? sourcetext/text [
         html: rainbow-html sourcetext/text startcolor/color endcolor/color
         write clipboard:// html
         if confirm "Result has been sent to clipboard. View it now?" [
            write %temp-rainbow.html reduce [ html ]
            browse %temp-rainbow.html
         ]
         ]
      ]
   label "The resulting HTML will be placed on the clipboard"
   ]

rainbow-html: func [ text color1 color2 /local
   out steps difblock stepblock color rs gs bs r g b i letter
   ] [
   steps: -1 + length? replace/all copy text " " ""
   difblock: reduce [
      ((pick color2 1) - (pick color1 1))
      ((pick color2 2) - (pick color1 2))
      ((pick color2 3) - (pick color1 3))
      ]
   stepblock: reduce [
      to-integer ((pick difblock 1) / steps)
      to-integer ((pick difblock 2) / steps)
      to-integer((pick difblock 3) / steps)
      ]
   color: reduce [ pick color1 1 pick color1 2 pick color1 3 ]
   set [ rs gs bs ] stepblock
   out: copy ""
   for i 1 steps 1 [
      until [
         letter: pick text 1
         text: next text
         either letter = #" " [ append out " " false ] [ true ]
         ]
      append out rejoin [ {}
         letter {} ]
      set [ r g b ] color
      color: reduce [ (r + rs) (g + gs) (b + bs) ]
      ]
   color: reduce [ pick color2 1 pick color2 2 pick color2 3 ]
   letter: last head text
   append out rejoin [ {}
      letter {} ]
   return out
   ]

view window
quit