Paste: HEREDOC: draft
        
	
	
	
		| Author: | mncharity | 
|---|
		| Mode: | factor | 
|---|
		| Date: | Thu, 16 Jul 2009 17:59:50 | 
|---|
	
	Plain Text |
	
	
extra/heredoc/heredoc-docs.factor
USING: help.markup help.syntax multiline ;
IN: heredoc
HELP: HEREDOC:
{ $syntax "HEREDOC: marker\n...text...marker" }
{ $values { "marker" "a word (token)" } { "text" "arbitrary text" } { "" "a string" } }
{ $description "A multiline string syntax with a user-specified terminating delimiter.  HEREDOC: reads the next word, and uses it as the 'close quote'.  All input from the beginning of the HEREDOC:'s next line, until the first appearance of the word's name, becomes a string.  The terminating word does _not_ need to be at the beginning of a line.\n\nThe HEREDOC: line should not have anything after the delimiting word.  The delimiting word should be an alphanumeric token.  It should not be, for example, a \"quoted string\"." }
{ $examples
    { $example "USING: heredoc ;" "HEREDOC: END\nx\nEND" "! \"x\\n\"" }
    { $example "HEREDOC: END\nxEND" "! \"x\"" }
    { $example "2 5 HEREDOC: zap\nfoo\nbarzap subseq" "! \"o\\nb\"" }
}
{ $notes "HEREDOC: is built on multiline.  A private word in " { $link "multiline" } " is currently used, as the public " { $link parse-multiline-string } " skips forward over one character." }
;
ARTICLE: "heredoc" "Here-document syntax"
"Code can contain \"here documents\" - multiline strings with arbitrary termination."
{ $code "USE: heredoc" "2 5 HEREDOC: zap\nfoo\nbarzap subseq ! \"o\\nb\"" }
"See " { $vocab-link "heredoc" } "."
;
ABOUT: "heredoc"
extra/heredoc/heredoc.factor
USING: accessors kernel lexer locals make math multiline.private namespaces parser ;
IN: heredoc
<PRIVATE
:: (make-multiline-string) ( end-text skip-n-chars -- str )
    
    
    [
        lexer get
        [ skip-n-chars + end-text (parse-multiline-string) ]
        change-column drop
    ] "" make ;
PRIVATE>
SYNTAX: HEREDOC:
    scan
    lexer get next-line 
    0 (make-multiline-string)
    parsed ;
extra/heredoc/heredoc-tests.factor
USING: heredoc tools.test ;
IN: heredoc.tests
[ "foo\nbar\n" ] [ HEREDOC: END
foo
bar
END ] unit-test
[ "foo\nbar" ] [ HEREDOC: END
foo
barEND ] unit-test
[ "" ] [ HEREDOC: END
END ] unit-test
[ " " ] [ HEREDOC: END
 END ] unit-test
[ "\n" ] [ HEREDOC: END
END ] unit-test
[ "x" ] [ HEREDOC: END
xEND ] unit-test
[ "xyz " ] [ HEREDOC: END
xyz END ] unit-test
[ "} ! * # \" «\n" ] [ HEREDOC: END
} 
END ] unit-test
[ 21 "foo\nbar" " HEREDOC: FOO\n FOO\n" 22 ] [ 21 HEREDOC: X
foo
barX HEREDOC: END 
 HEREDOC: FOO
 FOO
END 22 ] unit-test
	
	
		New Annotation