syntax .nginx-var

state variable
    char '{' brace
    char A-Za-z0-9_ this
    noeat END

state brace variable
    char A-Za-z0-9_ this
    char '}' END variable
    eat END error

syntax .nginx-sq-string

state string
    char "\\" escape
    char \$ .nginx-var:this
    char "'" END string
    eat this

state escape special
    char "'$" string special
    eat string error

syntax .nginx-dq-string

state string
    char "\\" escape
    char \$ .nginx-var:this
    char "\"" END string
    eat this

state escape special
    char "\"$" string special
    eat string error

syntax nginx

state line-start
    char -b a-z_ first-word
    char ";\n\t " this
    noeat nginx

state nginx
    char \$ .nginx-var:this
    char "\"" .nginx-dq-string:this
    char "'" .nginx-sq-string:this
    char \\ escape
    char # comment
    char ";\n{" line-start
    eat this

state first-word
    char -b a-z_ this
    inlist directive nginx keyword
    inlist deprecated_directive nginx error
    noeat nginx

# TODO: check the list of escape chars is complete/correct
state escape special
    char "\"\\'trn.$" nginx special
    recolor error 1
    noeat nginx

state comment
    char "\n" line-start
    eat this

list directive \
    accept_mutex accept_mutex_delay access_log add_after_body \
    add_before_body add_header addition_types aio alias allow \
    ancient_browser ancient_browser_value auth_basic \
    auth_basic_user_file auth_http auth_http_header auth_http_timeout \
    auth_request auth_request_set autoindex autoindex_exact_size \
    autoindex_localtime break charset charset_map charset_types \
    chunked_transfer_encoding client_body_buffer_size \
    client_body_in_file_only client_body_in_single_buffer \
    client_body_temp_path client_body_timeout client_header_buffer_size \
    client_header_timeout client_max_body_size connection_pool_size \
    create_full_put_path daemon dav_access dav_methods debug_connection \
    debug_points default_type deny directio directio_alignment \
    disable_symlinks empty_gif env error_log error_page etag events \
    expires f fastcgi_bind fastcgi_buffering fastcgi_buffers \
    fastcgi_buffer_size fastcgi_busy_buffers_size fastcgi_cache \
    fastcgi_cache_bypass fastcgi_cache_key fastcgi_cache_lock \
    fastcgi_cache_lock_timeout fastcgi_cache_methods \
    fastcgi_cache_min_uses fastcgi_cache_path fastcgi_cache_purge \
    fastcgi_cache_revalidate fastcgi_cache_use_stale fastcgi_cache_valid \
    fastcgi_catch_stderr fastcgi_connect_timeout fastcgi_hide_header \
    fastcgi_ignore_client_abort fastcgi_ignore_headers fastcgi_index \
    fastcgi_intercept_errors fastcgi_keep_conn \
    fastcgi_max_temp_file_size fastcgi_next_upstream \
    fastcgi_next_upstream_timeout fastcgi_next_upstream_tries \
    fastcgi_no_cache fastcgi_param fastcgi_pass fastcgi_pass_header \
    fastcgi_pass_request_body fastcgi_pass_request_headers \
    fastcgi_read_timeout fastcgi_send_lowat fastcgi_send_timeout \
    fastcgi_split_path_info fastcgi_store fastcgi_store_access \
    fastcgi_temp_file_write_size fastcgi_temp_path flv geo geoip_city \
    geoip_country geoip_org geoip_proxy geoip_proxy_recursive gunzip \
    gunzip_buffers gzip gzip_buffers gzip_comp_level gzip_disable \
    gzip_http_version gzip_min_length gzip_proxied gzip_static \
    gzip_types gzip_vary hash health_check hls hls_buffers \
    hls_forward_args hls_fragment hls_mp http if if_modified_since \
    ignore_invalid_headers image_filter image_filter_buffer \
    image_filter_interlace image_filter_jpeg_quality \
    image_filter_sharpen image_filter_transparency imap_auth \
    imap_capabilities imap_client_buffer include index internal ip_hash \
    keepalive keepalive_disable keepalive_requests keepalive_timeout \
    large_client_header_buffers least_conn limit_conn \
    limit_conn_log_level limit_conn_status limit_conn_zone limit_except \
    limit_rate limit_rate_after limit_req limit_req_log_level \
    limit_req_status limit_req_zone limit_zone lingering_close \
    lingering_time lingering_timeout listen location lock_file \
    log_format log_not_found log_subrequest mail map \
    map_hash_bucket_size map_hash_max_size master_process match \
    max_ranges memcached_bind memcached_buffer_size \
    memcached_connect_timeout memcached_gzip_flag \
    memcached_next_upstream memcached_next_upstream_timeout \
    memcached_next_upstream_tries memcached_pass memcached_read_timeout \
    memcached_send_timeout merge_slashes min_delete_depth modern_browser \
    modern_browser_value mp msie_padding msie_refresh multi_accept \
    open_file_cache open_file_cache_errors open_file_cache_min_uses \
    open_file_cache_valid open_log_file_cache \
    output_buffers override_charset pcre_jit perl perl_modules \
    perl_require perl_set pid pop port_in_redirect postpone_output \
    protocol proxy_bind proxy_buffer proxy_buffering proxy_buffers \
    proxy_buffer_size proxy_busy_buffers_size proxy_cache \
    proxy_cache_bypass proxy_cache_key proxy_cache_lock \
    proxy_cache_lock_timeout proxy_cache_methods proxy_cache_min_uses \
    proxy_cache_path proxy_cache_purge proxy_cache_revalidate \
    proxy_cache_use_stale proxy_cache_valid proxy_connect_timeout \
    proxy_cookie_domain proxy_cookie_path proxy_headers_hash_bucket_size \
    proxy_headers_hash_max_size proxy_hide_header proxy_http_version \
    proxy_ignore_client_abort proxy_ignore_headers \
    proxy_intercept_errors proxy_max_temp_file_size proxy_method \
    proxy_next_upstream proxy_next_upstream_timeout \
    proxy_next_upstream_tries proxy_no_cache proxy_pass \
    proxy_pass_error_message proxy_pass_header proxy_pass_request_body \
    proxy_pass_request_headers proxy_read_timeout proxy_redirect \
    proxy_send_lowat proxy_send_timeout proxy_set_body proxy_set_header \
    proxy_ssl_ciphers proxy_ssl_crl proxy_ssl_name proxy_ssl_protocols \
    proxy_ssl_server_name proxy_ssl_session_reuse \
    proxy_ssl_trusted_certificate proxy_ssl_verify \
    proxy_ssl_verify_depth proxy_store proxy_store_access \
    proxy_temp_file_write_size proxy_temp_path proxy_timeout queue \
    random_index read_ahead real_ip_header real_ip_recursive \
    recursive_error_pages referer_hash_bucket_size referer_hash_max_size \
    request_pool_size reset_timedout_connection resolver \
    resolver_timeout return rewrite rewrite_log root satisfy \
    scgi_bind scgi_buffering scgi_buffers scgi_buffer_size \
    scgi_busy_buffers_size scgi_cache scgi_cache_bypass scgi_cache_key \
    scgi_cache_lock scgi_cache_lock_timeout scgi_cache_methods \
    scgi_cache_min_uses scgi_cache_path scgi_cache_purge \
    scgi_cache_revalidate scgi_cache_use_stale scgi_cache_valid \
    scgi_connect_timeout scgi_hide_header scgi_ignore_client_abort \
    scgi_ignore_headers scgi_intercept_errors scgi_max_temp_file_size \
    scgi_next_upstream scgi_next_upstream_timeout \
    scgi_next_upstream_tries scgi_no_cache scgi_param scgi_pass \
    scgi_pass_header scgi_pass_request_body scgi_pass_request_headers \
    scgi_read_timeout scgi_send_timeout scgi_store scgi_store_access \
    scgi_temp_file_write_size scgi_temp_path secure_link secure_link_md5 \
    secure_link_secret sendfile sendfile_max_chunk send_lowat \
    send_timeout server server_name server_name_in_redirect \
    server_names_hash_bucket_size server_names_hash_max_size \
    server_tokens session_log session_log_format session_log_zone set \
    set_real_ip_from smtp_auth smtp_capabilities so_keepalive \
    source_charset spdy_chunk_size spdy_headers_comp split_clients ssi \
    ssi_last_modified ssi_min_file_chunk ssi_silent_errors ssi_types \
    ssi_value_length ssl ssl_buffer_size ssl_certificate \
    ssl_certificate_key ssl_ciphers ssl_client_certificate ssl_crl \
    ssl_dhparam ssl_ecdh_curve ssl_engine ssl_password_file \
    ssl_prefer_server_ciphers ssl_protocols ssl_session_cache \
    ssl_session_ticket_key ssl_session_tickets ssl_session_timeout \
    ssl_stapling ssl_stapling_file ssl_stapling_responder \
    ssl_stapling_verify ssl_trusted_certificate ssl_verify_client \
    ssl_verify_depth starttls status status_format status_zone sticky \
    sticky_cookie_insert stub_status sub_filter sub_filter_last_modified \
    sub_filter_once sub_filter_types tcp_nodelay tcp_nopush timeout \
    timer_resolution try_files types types_hash_bucket_size \
    types_hash_max_size underscores_in_headers \
    uninitialized_variable_warn upstream upstream_conf use user userid \
    userid_domain userid_expires userid_mark userid_name userid_p3p \
    userid_path userid_service uwsgi_bind uwsgi_buffering uwsgi_buffers \
    uwsgi_buffer_size uwsgi_busy_buffers_size uwsgi_cache \
    uwsgi_cache_bypass uwsgi_cache_key uwsgi_cache_lock \
    uwsgi_cache_lock_timeout uwsgi_cache_methods uwsgi_cache_min_uses \
    uwsgi_cache_path uwsgi_cache_purge uwsgi_cache_revalidate \
    uwsgi_cache_use_stale uwsgi_cache_valid uwsgi_connect_timeout \
    uwsgi_hide_header uwsgi_ignore_client_abort uwsgi_ignore_headers \
    uwsgi_intercept_errors uwsgi_max_temp_file_size uwsgi_modifier1 \
    uwsgi_modifier2 uwsgi_next_upstream uwsgi_next_upstream_timeout \
    uwsgi_next_upstream_tries uwsgi_no_cache uwsgi_param uwsgi_pass \
    uwsgi_pass_header uwsgi_pass_request_body uwsgi_pass_request_headers \
    uwsgi_read_timeout uwsgi_send_timeout uwsgi_ssl_ciphers \
    uwsgi_ssl_crl uwsgi_ssl_name uwsgi_ssl_protocols \
    uwsgi_ssl_server_name uwsgi_ssl_session_reuse \
    uwsgi_ssl_trusted_certificate uwsgi_ssl_verify \
    uwsgi_ssl_verify_depth uwsgi_store uwsgi_store_access \
    uwsgi_temp_file_write_size uwsgi_temp_path valid_referers \
    variables_hash_bucket_size variables_hash_max_size \
    worker_aio_requests worker_connections worker_cpu_affinity \
    worker_priority worker_processes worker_rlimit_core \
    worker_rlimit_nofile worker_rlimit_sigpending working_directory \
    xclient xml_entities xslt_last_modified xslt_param xslt_string_param \
    xslt_stylesheet xslt_types zone

list deprecated_directive \
    imap open_file_cache_retest optimize_server_names satisfy_any
