# JOE syntax highlight file for Ruby

# Oh No!  It's another perl!

# <<EOF1, <<EOF2 is not working.  Only EOF1 is seen.  It should wait for the
# EOF2.

=Idle
=Preproc blue
=Comment green
=POD green
=Constant cyan
=Escape bold cyan
=Type bold
=Keyword bold
=Bad bold red
=Var yellow

# Detect pod

:idle Idle
	*		rest		noeat
	"="		pod_start

# Rest of line

:rest Idle
	*		rest
	"#"		line_comment_i	recolor=-1
	"\n"		idle
	"0"		first_digit	recolor=-1
	"1-9"		decimal	recolor=-1
	"."		maybe_float
	"\""		string		recolor=-1
	"'"		char		recolor=-1
	"`"		backtick	recolor=-1
	"/"		regex		recolor=-1
	"<"		maybe_inc
	"$"		not_string	buffer
	"%"		pstring
	"a-zA-Z_"	ident		buffer

# / / regex not allowed after terms

:after_term Idle
	*		rest	noeat
	" 	)]"	after_term
	"/%"		rest

:pod_start Idle
	*		pod_start
	"\n"		pod_block

:pod_block POD
	*		pod_block
	"="		pod_ident	buffer

:pod_ident POD
	*		pod_block	noeat strings
	"=end"		rest
done
	"a-zA-Z0-9_"	pod_ident

:maybe_inc Idle
	*		after_term		noeat
	"<"		maybe_inc1

:maybe_inc1 Idle
	*		after_term		noeat
	"-"		allow_space
	"'\""		quoted_inc_start	save_c recolor=-1
	"A-Za-z_"	inc		buffer noeat

:allow_space Idle
	*		after_term		noeat
	"'\""		quoted_inc_start_allow	save_c recolor=-1
	"A-Za-z_"	inc_allow		buffer noeat

:quoted_inc_start Var
	*		quoted_inc	buffer

:quoted_inc_start_allow Var
	*		quoted_inc_allow	buffer

:quoted_inc Var
	*		quoted_inc
	&		skipline	save_s

:quoted_inc_allow Var
	*		quoted_inc_allow
	&		skipline_allow	save_s

:inc Var
	*		skipline	save_s noeat
	"A-Za-z0-9_"	inc

:inc_allow Var
	*		skipline_allow	save_s noeat
	"A-Za-z0-9_"	inc_allow

# Should be treated as a normal line here...

:skipline Idle
	*		skipline
	"\n"		next_line

:skipline_allow Idle
	*		skipline_allow
	"\n"		next_line_allow

:todelim Constant
	*		todelim
	"\n"		next_line	strings
	"&"		founddelim
done

:todelim_allow Constant
	*		todelim_allow
	"\n"		next_line_allow	strings
	"&"		founddelim
done

# eat \n so it's not in string.
:next_line Constant
	*		todelim		buffer
	"\n"		next_line

:next_line_allow Constant
	*		todelim_allow	buffer
	" 	\n"	next_line_allow

:founddelim Var
	*		idle		noeat

:regex Constant
	*		regex
	"\\"		regex_quote	recolor=-1
	"/"		after_term

:regex_quote Escape
	*		regex

:not_string Idle
	*		rest noeat
	"A-Za-z_"	ident
	"\"'`#/"	rest

:line_comment Comment
	*		line_comment
	"\n"		rest

:line_comment_i Comment
	*		line_comment_i
	"\n"		idle

:end_of_file_comment Comment
	*		end_of_file_comment

:first_digit Constant
	*		after_term	noeat
	"x"		hex
	"b"		binary
	"."		float
	"eE"		epart
	"0-7"		octal
	"89"		bad_number	recolor=-1

:bad_number Bad
	*		after_term	noeat
	"0-9"		bad_number

:octal Constant
	*		after_term	noeat
	"0-7_"		octal
	"89"		bad_number	recolor=-1

:binary Constant
	*		after_term	noeat
	"01_"		binary
	"2-9"		bad_number	recolor=-1

:hex Constant
	*		after_term	noeat
	"0-9A-Fa-f_"	hex

:decimal Constant
	*		after_term	noeat
	"0-9_"		decimal
	"eE"		epart
	"."		float

:maybe_float Constant
	*		after_term	recolor=-2	noeat
	"0-9"		float		recolor=-2

:float Constant
	*		after_term	noeat
	"eE"		epart
	"0-9_"		float

:epart Constant
	*		after_term	noeat
	"0-9+\-"	enum

:enum Constant
	*		after_term	noeat
	"0-9_"		enum

:string	Constant
	*		string
	"\""		after_term
	"\\"		string_escape	recolor=-1
	"$@"		string_subst	recolor=-1

:string_subst Escape
	*		string	noeat recolor=-1
	"a-zA-Z_0-9"	string_subst

:string_escape Escape
	*		string
	"x"		string_hex1
	"c"		string_ctrl
	"N"		string_named
	"0-7"		string_octal2
	"\n"		string		recolor=-2

:string_named Escape
	*		string
	"{"		string_named_rest

:string_named_rest Escape
	*		string_named_rest
	"}"		string

:string_ctrl Escape
	*		string

:string_hex1 Escape
	*		string		noeat
	"{"		string_unicode
	"0-9a-fA-F"	string_hex2

:string_unicode Escape
	*		string_unicode
	"}"		string

:string_hex2 Escape
	*		string		noeat
	"0-9a-fA-F"	string

:string_octal2 Escape
	*		string		noeat
	"0-7"		string_octal3

:string_octal3 Escape
	*		string		noeat
	"0-7"		string

# Only \\ and \' allowed in single quoted strings

:char Constant
	*		char
	"\n"		reset
	"'"		after_term
	"\\"		char_escape	recolor=-1

:char_escape	Escape
	*		char		recolor=-2
	"\\'"	char

:backtick	Constant
	*		backtick
	"`"		after_term
	"\\"		backtick_escape	recolor=-1
	"$@"		backtick_subst recolor=-1

:backtick_subst Escape
	*		backtick	noeat recolor=-1
	"a-zA-Z_0-9"	backtick_subst

:backtick_escape Escape
	*		backtick
	"x"		backtick_hex1
	"c"		backtick_ctrl
	"N"		backtick_named
	"0-7"		backtick_octal2
	"\n"		backtick		recolor=-2

:backtick_named Escape
	*		backtick
	"{"		backtick_named_rest

:backtick_named_rest Escape
	*		backtick_named_rest
	"}"		backtick

:backtick_ctrl Escape
	*		backtick

:backtick_hex1 Escape
	*		backtick		noeat
	"{"		backtick_unicode
	"0-9a-fA-F"	backtick_hex2

:backtick_unicode Escape
	*		backtick_unicode
	"}"		backtick

:backtick_hex2 Escape
	*		backtick		noeat
	"0-9a-fA-F"	backtick

:backtick_octal2 Escape
	*		backtick		noeat
	"0-7"		backtick_octal3

:backtick_octal3 Escape
	*		backtick		noeat
	"0-7"		backtick

:ident	Idle
	*		after_term	noeat strings
	"BEGIN"		kw
	"END"		kw
	"alias"		kw
	"and"		kw
	"begin"		kw
	"break"		kw
	"case"		kw
	"class"		kw
	"def"		kw
	"defined"	kw
	"do"		kw
	"else"		kw
	"elsif"		kw
	"end"		kw
	"ensure"	kw
	"false"		kw
	"for"		kw
	"if"		kw
	"in"		kw
	"loop"		kw
	"module"	kw
	"next"		kw
	"nil"		kw
	"not"		kw
	"or"		kw
	"redo"		kw
	"rescue"	kw
	"retry"		kw
	"return"	kw
	"self"		kw
	"super"		kw
	"then"		kw
	"true"		kw
	"undef"		kw
	"unless"	kw
	"until"		kw
	"when"		kw
	"while"		kw
	"yield"		kw
done
	"a-zA-Z0-9_"	ident

:kw Keyword
	*	rest	noeat

:pstring Idle
	*	match noeat
	"	 " after_term noeat
	"xrqQw"	match

:match Idle
	*		inmatch		save_c recolor=-1
	" 	"	match

:inmatch Constant
	*		inmatch
	&		after_term
	"\\"		inmatch_quote	recolor=-1

:inmatch_quote Escape
	*		inmatch

:subst Idle
	*		insubst		save_c recolor=-1
	"<([{`"		delim_insubst	save_c recolor=-1
	" 	"	subst

:insubst Constant
	*		insubst
	&		inrepl
	"\\"		insubst_quote	recolor=-1

:insubst_quote Escape
	*		insubst

:inrepl Constant
	*		inrepl
	&		after_term
	"\\"		inrepl_quote

:inrepl_quote Escape
	*		inrepl

:delim_insubst Constant
	*		delim_insubst
	&		delim_repl
	"\\"		delim_quote

:delim_quote Escape
	*		delim_insubst

:delim_repl Constant
	*		repl		save_c recolor=-1
	" 	"	delim_repl

:repl Constant
	*		repl
	&		after_term
	"\\"		repl_quote

:repl_quote Escape
	*		repl
