# JOE syntax highlight file for CSS
# by Eric Lin

# Define colors

=Idle
=Comment 	green
=Constant	cyan
=Escape		bold cyan
=Keyword	bold
=Bad		bold red

=Class		yellow
=Id		red
=Tag		magenta
=HTML

# from html.jsf to support <?php?>
=TagEdge        green

:begin Idle
	*		begin		noeat call=.css()

#
# For <style> in html
#

.subr css

:reset HTML
	*		reset
	"<"		maybe_done	recolor=-1
	"/"		slash
	# prevent duplicate code
	"#.a-zA-Z"	selector	noeat
	"@"		command		recolor=-1

:maybe_done TagEdge
	*		reset_html	noeat
	"/"		reset		noeat return recolor=-2
.ifdef php
	"?%"		rtn_php		call=php.php()
.endif

# fix needed to produce similar output without php
:reset_html HTML
	*		reset		noeat recolor=-2

# this state allows php and perl to recolor the ?> %> or &> properly.
:rtn_php TagEdge
	*		reset		noeat

:slash Idle
	*		reset		noeat
	"*"		comment		recolor=-2

:comment Comment
	*		comment
	"*"		maybe_end_comment

:maybe_end_comment Comment
	*		comment
	"/"		reset
	"*"		maybe_end_comment

:command Idle
	*		command
	";"		reset
	"{"		command_block

:command_block Idle
	*		command_block
	"}"		reset

# CSS selectors
:selector Idle
	*		selector
	"#"		id_sel		recolor=-1
	"."		class_sel	recolor=-1
	"a-zA-Z"	tag_sel		recolor=-1
	":"		pseudo_class_sel	recolor=-1
	"{"		style_block	recolor=-1

:id_sel Id
	*		selector	noeat
	"a-zA-Z0-9_-"	id_sel

:class_sel Class
	*		selector	noeat
	"a-zA-Z0-9_-"	class_sel

:tag_sel Tag
	*		selector	noeat
	"a-zA-Z0-9_-"	tag_sel
	"["		tag_sel_attr	recolor=-1

:tag_sel_attr Idle
	*		tag_sel_attr
	"]"		selector

:pseudo_class_sel Idle
	*		selector	noeat
	"a-zA-Z0-9_-"	pseudo_class_sel

# everything inside "{ ... }", containing many "key: value;" pairs
:style_block Idle
	*		style_block
	"}"		reset
	"/"		maybe_style_comment
	"a-zA-Z-"	style_word	recolor=-1

:maybe_style_comment Idle
	*		style_block	recolor=-1
	"*"		style_comment	recolor=-2

:style_comment Comment
	*		style_comment
	"*"		maybe_end_style_comment
  
:maybe_end_style_comment Comment
	*		comment
	"/"		style_block
	"*"		maybe_end_style_comment

# property-key
:style_word Keyword
	*		style_word
	":"		style_value	recolor=-1

# property-value
:style_value Idle
	*		style_value
	";"		style_block
	# treat } without previous ; like ;}
	"}"		style_block	noeat
	"#"		color		recolor=-1
	"0-9"		decimal		recolor=-1
	"."		maybe_float
	"a-zA-Z_"	ident

:color Constant
	*		style_value	noeat
	"0-9a-fA-F"	color

:decimal Constant
	*		style_value	noeat
	"0-9"		decimal
	"."		float
	"a-zA-Z%"	decimal_unit

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

:float Constant
	*		style_value	noeat
	"0-9"		float
	"a-zA-Z%"	decimal_unit

:decimal_unit Constant
	*		style_value	noeat
	"a-zA-Z"	decimal_unit

:ident Idle
	*		style_value	noeat
	"a-ZA-Z0-9_-"	ident

.end
