REBOL [
Title: "Minify"
Date: 21-Aug-2012
File: %minify.r
Author: "Christopher Ross-Gill"
Purpose: "Strips Whitespace and Comments from a Script"
Library: [
Level: 'beginner
Platform: 'all
Type: [function idiom module tool]
Domain: [ldc parse text-processing]
License: 'cc-by-sa
]
]
minify: func [
"Strips Whitespace and Comments from a Script." [catch]
script [file! url! string!] "Script to be minified."
/feed "Use newlines instead of spaces to separate values."
/local out val rule ws mk ex
][
throw-on-error [
case/all [
any [file? script url? script][script: read script]
string? script [
if error? val: try [load script][
; to correctly report a minify failure
val: disarm val
make error! reduce ['syntax val/id val/arg1 val/arg2]
]
]
not string? script [make error! "Unable to read script"]
]
]
out: copy ""
ws: charset "^/^-^M "
script: trim/head/tail copy script
either parse/all script rule: [
some [
mk:
#";" [thru newline | to end] ex:
; (append out copy/part mk ex])
| [#"[" | #"("] any ws (append out mk/1) rule
| any ws mk: [#"]" | #")"] (append out mk/1) break
| some ws (append out either feed ["^/"][" "])
| #"^@" to end
| skip (
set [val ex] load/next mk
append out copy/part mk ex
) :ex
]
][
:out
][
throw make error! "Unable to Parse Script"
]
]