# Another set of states moving to a markup=>ssl transition

# Goals:
# <?php\b => php (ssl)
# ?> => markup

family markup

# Let the standard markup routine handle '<?' 
# Here we check to see if there's a 'php' immediately following '<?'

pattern ENTERPHP = '<(?:\?(?:php\b|=)?|%)'

state IN_M_DEFAULT:
'<%' : paint(upto, M_STRING), paint(include, SSL_OPERATOR) => IN_SSL_DEFAULT

state IN_M_PI_1:
/php\b/i : paint(include, SSL_OPERATOR), spush_check(IN_M_DEFAULT), => IN_SSL_DEFAULT
/\W/ : paint(upto, SSL_OPERATOR), spush_check(IN_M_DEFAULT), redo, => IN_SSL_DEFAULT
/./: redo, paint(upto, SSL_OPERATOR), spush_check(IN_M_DEFAULT), => IN_SSL_DEFAULT
/$/ : paint(upto, SSL_OPERATOR), spush_check(IN_M_DEFAULT), => IN_SSL_DEFAULT

# Allow for escaped processing/xml declarations in PHP files
state IN_M_STAG_EXP_TNAME:
/<\?\?>\?[\w._\x80-\xff-]?[\w\d._\x80-\xff:-]*/: paint(include, M_PI), => IN_M_PI_2

# Bug 94167: <script language="php"... => php script mode
state IN_H2CSL_STAG_POST_TAGNAME:
/\blanguage(?=\s*=\s*(?:php\b|"php"|'php'))/i : \
    paint(upto, M_TAGSPACE), paint(include, M_ATTRNAME), => IN_H2PHP_STAG_POST_ATTRNAME_1

# comment for udl

state IN_H2PHP_STAG_IN_ATTRNAME:
/[^$CS]/ :  paint(upto, M_ATTRNAME), redo, => IN_H2PHP_STAG_POST_ATTRNAME_1
'<'    : paint(upto, M_TAGSPACE), redo => IN_M_DEFAULT

state IN_H2PHP_STAG_POST_ATTRNAME_1:
'=' : paint(upto, M_TAGSPACE), paint(include, M_OPERATOR) => IN_H2PHP_STAG_POST_ATTRNAME_2
/[^$WS]/ : paint(upto, M_TAGSPACE), redo => IN_H2PHP_STAG_POST_TAGNAME

state IN_H2PHP_STAG_POST_ATTRNAME_2:
'\"' : paint(upto, M_TAGSPACE), => IN_H2PHP_STAG_ATTR_DSTRING
'\'' : paint(upto, M_TAGSPACE), => IN_H2PHP_STAG_ATTR_SSTRING
# Bail out
'/>' : paint(upto, M_TAGSPACE), paint(include, M_EMP_TAGC), => IN_M_DEFAULT
'<'    : paint(upto, M_TAGSPACE), redo => IN_M_DEFAULT
/[^$WS]+/ : paint(upto, M_TAGSPACE), paint(include, M_STRING), => IN_H2PHP_STAG_POST_TAGNAME

# Don't bother handling <%= ... %> in <script language="php" ... >
state IN_H2PHP_STAG_ATTR_DSTRING:
'"' : paint(include, M_STRING), => IN_H2PHP_STAG_POST_TAGNAME

state IN_H2PHP_STAG_ATTR_SSTRING:
"'" : paint(include, M_STRING), => IN_H2PHP_STAG_POST_TAGNAME

state IN_H2PHP_STAG_POST_TAGNAME:
'>' : paint(upto, M_TAGSPACE), paint(include, M_STAGC), => IN_H2PHP_STAG_POST_TAGNAME_IN_WS
# empty tag : nothing to lex inside it.
'/>' : paint(upto, M_TAGSPACE), paint(include, M_EMP_TAGC) => IN_M_DEFAULT
/[$CS]/ : paint(upto, M_TAGSPACE) => IN_H2PHP_STAG_IN_ATTRNAME
# Assume a < means we're out of sync, bail
'<'    : paint(upto, M_TAGSPACE), redo => IN_M_DEFAULT

state IN_H2PHP_STAG_POST_TAGNAME_IN_WS:
/^/: paint(include, M_DEFAULT), => IN_SSL_DEFAULT
/\S/: paint(upto, M_DEFAULT), redo, => IN_SSL_DEFAULT

state IN_M_STAG_ATTR_DSTRING:
/$ENTERPHP/i : paint(upto, M_STRING), \
    paint(include, SSL_OPERATOR), \
    spush_check(IN_M_STAG_ATTR_DSTRING), => IN_SSL_DEFAULT

state IN_M_STAG_ATTR_SSTRING:
/$ENTERPHP/i : paint(upto, M_STRING), \
    paint(include, SSL_OPERATOR), \
    spush_check(IN_M_STAG_ATTR_SSTRING), => IN_SSL_DEFAULT

# Support these other less likely combinations:

# From html2js.udl:
state IN_H2CSL_STAG_ATTR_DSTRING:
/$ENTERPHP/i : paint(upto, M_STRING), \
    paint(include, SSL_OPERATOR), \
    spush_check(IN_H2CSL_STAG_ATTR_DSTRING), => IN_SSL_DEFAULT

state IN_H2CSL_STAG_ATTR_SSTRING:
/$ENTERPHP/i : paint(upto, M_STRING), \
    paint(include, SSL_OPERATOR), \
    spush_check(IN_H2CSL_STAG_ATTR_SSTRING), => IN_SSL_DEFAULT

state IN_H2CSL_STAG_ATTR_USTRING:
/$ENTERPHP/i : paint(upto, M_STRING), \
    paint(include, SSL_OPERATOR), \
    spush_check(IN_H2CSL_STAG_ATTR_USTRING), => IN_SSL_DEFAULT


state IN_M_STAG_POST_TAGNAME:
/$ENTERPHP/i : paint(upto, M_TAGSPACE), \
    paint(include, SSL_OPERATOR), \
    spush_check(IN_M_STAG_POST_TAGNAME), => IN_SSL_DEFAULT

state IN_M_COMMENT:
/$ENTERPHP/i : paint(upto, M_COMMENT), \
    paint(include, SSL_OPERATOR), \
    spush_check(IN_M_COMMENT), => IN_SSL_DEFAULT

state IN_M_CDATA:
/$ENTERPHP/i : paint(upto, M_CDATA), \
    paint(include, SSL_OPERATOR), \
    spush_check(IN_M_CDATA), => IN_SSL_DEFAULT

