# JOE syntax highlight file for Ant's build scripts
# by Christian Nicolai (http://mycrobase.de)

# http://ant.apache.org/

# heavily based on the XML highlighter but with better colors since
# ant scripts heavily rely on the tags (blue is a bad color here)
# instead of their contents

# Improved XML highlighter by: Brian Candler <B.Candler@pobox.com>

=Idle
=Bad		red bold
=Tag		bold
=Attr		
=Constant	cyan
=Escape		bold cyan
=EntityRef	magenta
=Decl		cyan
=CommentStart	green
=CommentBody	green
=CommentEnd	green
=PIStart	yellow bold
=PIBody		yellow
=PIEnd		yellow bold
=CdataStart	blue bold
=CdataBody	bold
=CdataEnd	blue bold

=Keytag		bold magenta #fg_310 # brown


# http://www.w3.org/TR/2004/REC-xml-20040204/
#
# NOTE: For UNICODE compatibility, the ranges
#	"A-Za-z_:"		-- first character of Name
#	"A-Za-z0-9._:-"		-- subsequent characters of Name
# ought to be replaced with some appropriate Unicode character classes
#
# Actually the standard tells you which characters to use, see:
#  http://www.w3.org/TR/xml11/#NT-NameStartChar

:content Idle
	*		content
	"<"		tag		recolor=-1
	"&"		entityref	recolor=-1

# > is allowed
#	">"		error		noeat recolor=-1


# In several contexts a space is an error, and since a coloured space is
# not visible, we colour the next non-space character as well.

:error Bad
	*		error_visible	noeat recolor=-1
	" \t\r\n"	error

:error_visible Bad
	*		content

# Matched: &

:entityref EntityRef
	*		error		noeat recolor=-1
	"-.:\c"		entityref
	"#"		entityref
	";"		content

# Matched: <

:tag Tag
	*		error		noeat recolor=-1
	"/"		end_tag
	":\i"		start_or_empty_tag	buffer
	"?"		pi_start	recolor=-2
	"!"		decl		recolor=-2 buffer

# Matched: </

:end_tag Tag
	*		error		noeat recolor=-1
	":\i"		end_tag2

:end_tag2 Tag
	*		error		noeat recolor=-1
	"-.:\c"		end_tag2
	" \t\r\n"	end_tag2_sp	recolor=-1
	">"		content

:end_tag2_sp Idle
	*		end_tag3	noeat

:end_tag3 Tag
	*		error		noeat recolor=-1
	" \t\r\n"	end_tag3_sp	recolor=-1
	">"		content

:end_tag3_sp Idle
	*		end_tag_3	noeat

# Matched: <tag

# compare tag name of start/empty tags with a list
# of Ant specific keywords
:start_or_empty_tag Tag
	*		decide_tag_type	noeat strings
	"target"	kw
done
	"-.:\c"		start_or_empty_tag

:kw Keytag
	*		decide_tag_type	noeat

:decide_tag_type Tag
	*		error		noeat recolor=-1
	"/"		empty_tag
	" \t\r\n"	start_or_empty_tag_sp
	">"		content

:start_or_empty_tag_sp Idle
	*		tag_space	noeat

# Matched: <tag/

:empty_tag Tag
	*		error		noeat recolor=-1
	">"		content

# Matched: <tag SPACE

:tag_space Attr
	*		error		noeat recolor=-1
	" \t\r\n"	tag_space_sp	recolor=-1
	":\i"		attr
	"/"		empty_tag	recolor=-1
	">"		close_tag	recolor=-1

:tag_space_sp Idle
	*		tag_space	noeat

# Matched: <tag attr

:attr Attr
	*		error		noeat recolor=-1
	"-.:\c"		attr
	" \t\r\n"	attr_sp		recolor=-1
	"="		string

:attr_sp Idle
	*		attr_before	noeat

:attr_before Attr
	*		error		noeat recolor=-1
	" \t\r\n"	attr_sp		recolor=-1
	"="		string

# Matched: <tag attr=

:string Attr
	*		error		noeat recolor=-1
	" \t\r\n"	string_sp	recolor=-1
	"\""		string_dq	recolor=-1
	"'"		string_sq	recolor=-1

:string_sp Idle
	*		string		noeat

# Matched: <tag attr="

:string_dq Constant
	*		string_dq
	"<"		error		noeat recolor=-1
	"&"		char_dq		recolor=-1
	"\""		endstring
	"$"		string_dq	call=.antvar()

#	">"		error		noeat recolor=-1


:string_sq Constant
	*		string_sq
	"<"		error		noeat recolor=-1
	"&"		char_sq		recolor=-1
	"'"		endstring
	"$"		string_sq	call=.maybe_antvar()

#	">"		error		noeat recolor=-1


:char_dq EntityRef
	*		error		noeat recolor=-1
	"A-Za-z0-9._:-"	char_dq
	"#"		char_dq
	";"		string_dq

:char_sq EntityRef
	*		error		noeat recolor=-1
	"A-Za-z0-9._:-"	char_sq
	"#"		char_sq
	";"		string_sq

.subr maybe_antvar
# initial state
:maybe_antvar Constant
	*		NULL		return
	"{"		antvar		recolor=-2

:antvar Escape
	*		antvar
	"}"		NULL		return
.end

# Matched: <tag attr="foo"

:endstring Attr
	*		error		noeat recolor=-1
	" \t\r\n"	tag_space_sp
	"/"		empty_tag	recolor=-1
	">"		close_tag	recolor=-1

# This state is just to recolor the final ">" at the end of <tag attr="val">

:close_tag Tag
	*		content		noeat

# Matched: <?

:pi_start PIStart
	*		pi		noeat recolor=-1

:pi PIBody
	*		pi
	"?"		pi2

:pi2 PIBody
	*		pi
	">"		pi_end		recolor=-2

:pi_end PIEnd
	*		content		noeat recolor=-1

# Matched: <!

:decl Decl
	*		decl		strings
	"!--"		comment_start	recolor=-5
	"![CDATA["	cdata_start	recolor=-10
done
	"<"		decl_nest
	">"		content

# We allow one level of <...> nesting within declarations

:decl_nest Decl
	*		decl_nest
	">"		decl

# Matched: <!--

:comment_start CommentStart
	*		comment		noeat

:comment CommentBody
	*		comment
	"-"		comment2

:comment2 CommentBody
	*		comment
	"-"		comment3

:comment3 CommentBody
	*		comment_error	noeat recolor=-3
	">"		comment_end	recolor=-3

:comment_end CommentEnd
	*		content		noeat recolor=-1

# For compatibility, the string "--" (double-hyphen) MUST NOT occur within
# comments. [http://www.w3.org/TR/REC-xml/ section 2.5]

:comment_error Bad
	*		comment
	"-"		comment_error
	">"		comment_end	recolor=-3

# Matched: <![CDATA[

:cdata_start CdataStart
	*		cdata		noeat

:cdata CdataBody
	*		cdata
	"]"		cdata2

:cdata2 CdataBody
	*		cdata
	"]"		cdata3

:cdata3 CdataBody
	*		cdata
	">"		cdata_end	recolor=-3

:cdata_end CdataEnd
	*		content		noeat recolor=-1
