REBOL [
Title: "Text to HTML Converter"
Date: 29-Feb-2000
File: %texthtml.r
Author: "Carl Sassenrath"
Usage: {
The first line of the text file is the title of the
document. All lines that are flush left will be
treated as paragraphs. A blank line will separate
paragraphs. Indented lines are examples. They are
indented and printed in monospaced bold font.
Sections and sub-sections of a document are separated
with a line that begins with === or --- and the text
that follows them is shown in a special font.
}
Purpose: {A useful doc formatting language. Converts text to HTML with titles, sections, sub-sections, and code. Is used to create all REBOL How-to documents.}
History: [orig 12-Oct-1999]
library: [
level: 'intermediate
platform: 'all
type: 'Tool
domain: [markup text-processing file-handling]
tested-under: none
support: none
license: none
see-also: none
]
Version: 1.0.0
]
text-to-html: make object! [
html: make string! 10000
emit: func [data] [append html reduce data]
space: charset " ^-"
chars: complement charset " ^-^/"
font:
escape-html: func [
"Format a code example" code
][
replace/all code "&" "&"
replace/all code "<" "<"
replace/all code ">" ">"
insert code []
append code reduce [
newline]
]
;--- Text Format Language:
rules: [title some parts done]
title: [text-line
(emit [textfonttext
])]
parts: [newline | "===" section | "---" subsect | "###" to end |
example | paragraph]
section: [text-line
(emit [
font
trim text
]) newline]
subsect: [text-line
(emit [
fonttrim text
]) newline]
example: [copy code some [indented | some newline indented]
(emit escape-html code)]
paragraph: [copy para some [chars thru newline] (emit [para
])]
done: [(emit [])]
text-line: [copy text thru newline]
indented: [some space thru newline]
convert: func [data] [parse/all detab data rules html]
]
file: to-file ask "Filename? "
if not find file "." [append file ".txt"]
data: text-to-html/convert read file
write head change find file "." ".html" data
;quit