Commit e62c88ed0113d9108cc2887e135c1f137852e75c

Golmote 2015-09-23T08:41:41

Add nginx to components, fixed basic highlighting, add a few tests

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
diff --git a/components.js b/components.js
index 26ba89f..3a1b705 100644
--- a/components.js
+++ b/components.js
@@ -287,6 +287,11 @@ var components = {
 			"title": "NASM",
 			"owner": "rbmj"
 		},
+		"nginx": {
+			"title": "nginx",
+			"owner": "westonganger",
+			"require": "clike"
+		},
 		"nim": {
 			"title": "Nim",
 			"owner": "Golmote"
diff --git a/components/prism-nginx.js b/components/prism-nginx.js
index db3da23..f094267 100644
--- a/components/prism-nginx.js
+++ b/components/prism-nginx.js
@@ -1,18 +1,11 @@
 Prism.languages.nginx = Prism.languages.extend('clike', {
-        comment: {
-                lookbehind: true,
+        'comment': {
                 pattern: /(^|[^"{\\])#.*/,
+                lookbehind: true
         },
-        keyword: /\b(CONTENT_|DOCUMENT_|GATEWAY_|HTTP_|HTTPS|if_not_empty|PATH_|QUERY_|REDIRECT_|REMOTE_|REQUEST_|SCGI|SCRIPT_|SERVER_|http|server|events|location|include|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|auth_basic|auth_basic_user_file|auth_http|auth_http_header|auth_http_timeout|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|devpoll_changes|devpoll_events|directio|directio_alignment|disable_symlinks|empty_gif|env|epoll_events|error_log|error_page|expires|fastcgi_buffer_size|fastcgi_buffers|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_use_stale|fastcgi_cache_valid|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_no_cache|fastcgi_param|fastcgi_pass|fastcgi_pass_header|fastcgi_read_timeout|fastcgi_redirect_errors|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|google_perftools_profiles|gzip|gzip_buffers|gzip_comp_level|gzip_disable|gzip_http_version|gzip_min_length|gzip_proxied|gzip_static|gzip_types|gzip_vary|if|if_modified_since|ignore_invalid_headers|image_filter|image_filter_buffer|image_filter_jpeg_quality|image_filter_sharpen|image_filter_transparency|imap_capabilities|imap_client_buffer|include|index|internal|ip_hash|keepalive|keepalive_disable|keepalive_requests|keepalive_timeout|kqueue_changes|kqueue_events|large_client_header_buffers|limit_conn|limit_conn_log_level|limit_conn_zone|limit_except|limit_rate|limit_rate_after|limit_req|limit_req_log_level|limit_req_zone|limit_zone|lingering_close|lingering_time|lingering_timeout|listen|location|lock_file|log_format|log_format_combined|log_not_found|log_subrequest|map|map_hash_bucket_size|map_hash_max_size|master_process|max_ranges|memcached_buffer_size|memcached_connect_timeout|memcached_next_upstream|memcached_pass|memcached_read_timeout|memcached_send_timeout|merge_slashes|min_delete_depth|modern_browser|modern_browser_value|mp4|mp4_buffer_size|mp4_max_buffer_size|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|optimize_server_names|override_charset|pcre_jit|perl|perl_modules|perl_require|perl_set|pid|pop3_auth|pop3_capabilities|port_in_redirect|post_action|postpone_output|protocol|proxy|proxy_buffer|proxy_buffer_size|proxy_buffering|proxy_buffers|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_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_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_redirect_errors|proxy_send_lowat|proxy_send_timeout|proxy_set_body|proxy_set_header|proxy_ssl_session_reuse|proxy_store|proxy_store_access|proxy_temp_file_write_size|proxy_temp_path|proxy_timeout|proxy_upstream_fail_timeout|proxy_upstream_max_fails|random_index|read_ahead|real_ip_header|recursive_error_pages|request_pool_size|reset_timedout_connection|resolver|resolver_timeout|return|rewrite|root|rtsig_overflow_events|rtsig_overflow_test|rtsig_overflow_threshold|rtsig_signo|satisfy|satisfy_any|secure_link_secret|send_lowat|send_timeout|sendfile|sendfile_max_chunk|server|server_name|server_name_in_redirect|server_names_hash_bucket_size|server_names_hash_max_size|server_tokens|set|set_real_ip_from|smtp_auth|smtp_capabilities|so_keepalive|source_charset|split_clients|ssi|ssi_silent_errors|ssi_types|ssi_value_length|ssl|ssl_certificate|ssl_certificate_key|ssl_ciphers|ssl_client_certificate|ssl_crl|ssl_dhparam|ssl_engine|ssl_prefer_server_ciphers|ssl_protocols|ssl_session_cache|ssl_session_timeout|ssl_verify_client|ssl_verify_depth|starttls|stub_status|sub_filter|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|use|user|userid|userid_domain|userid_expires|userid_name|userid_p3p|userid_path|userid_service|valid_referers|variables_hash_bucket_size|variables_hash_max_size|worker_connections|worker_cpu_affinity|worker_priority|worker_processes|worker_rlimit_core|worker_rlimit_nofile|worker_rlimit_sigpending|working_directory|xclient|xml_entities|xslt_entities|xslt_stylesheet|xslt_types)\b/i,
+        'keyword': /\b(?:CONTENT_|DOCUMENT_|GATEWAY_|HTTP_|HTTPS|if_not_empty|PATH_|QUERY_|REDIRECT_|REMOTE_|REQUEST_|SCGI|SCRIPT_|SERVER_|http|server|events|location|include|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|auth_basic|auth_basic_user_file|auth_http|auth_http_header|auth_http_timeout|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|devpoll_changes|devpoll_events|directio|directio_alignment|disable_symlinks|empty_gif|env|epoll_events|error_log|error_page|expires|fastcgi_buffer_size|fastcgi_buffers|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_use_stale|fastcgi_cache_valid|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_no_cache|fastcgi_param|fastcgi_pass|fastcgi_pass_header|fastcgi_read_timeout|fastcgi_redirect_errors|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|google_perftools_profiles|gzip|gzip_buffers|gzip_comp_level|gzip_disable|gzip_http_version|gzip_min_length|gzip_proxied|gzip_static|gzip_types|gzip_vary|if|if_modified_since|ignore_invalid_headers|image_filter|image_filter_buffer|image_filter_jpeg_quality|image_filter_sharpen|image_filter_transparency|imap_capabilities|imap_client_buffer|include|index|internal|ip_hash|keepalive|keepalive_disable|keepalive_requests|keepalive_timeout|kqueue_changes|kqueue_events|large_client_header_buffers|limit_conn|limit_conn_log_level|limit_conn_zone|limit_except|limit_rate|limit_rate_after|limit_req|limit_req_log_level|limit_req_zone|limit_zone|lingering_close|lingering_time|lingering_timeout|listen|location|lock_file|log_format|log_format_combined|log_not_found|log_subrequest|map|map_hash_bucket_size|map_hash_max_size|master_process|max_ranges|memcached_buffer_size|memcached_connect_timeout|memcached_next_upstream|memcached_pass|memcached_read_timeout|memcached_send_timeout|merge_slashes|min_delete_depth|modern_browser|modern_browser_value|mp4|mp4_buffer_size|mp4_max_buffer_size|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|optimize_server_names|override_charset|pcre_jit|perl|perl_modules|perl_require|perl_set|pid|pop3_auth|pop3_capabilities|port_in_redirect|post_action|postpone_output|protocol|proxy|proxy_buffer|proxy_buffer_size|proxy_buffering|proxy_buffers|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_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_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_redirect_errors|proxy_send_lowat|proxy_send_timeout|proxy_set_body|proxy_set_header|proxy_ssl_session_reuse|proxy_store|proxy_store_access|proxy_temp_file_write_size|proxy_temp_path|proxy_timeout|proxy_upstream_fail_timeout|proxy_upstream_max_fails|random_index|read_ahead|real_ip_header|recursive_error_pages|request_pool_size|reset_timedout_connection|resolver|resolver_timeout|return|rewrite|root|rtsig_overflow_events|rtsig_overflow_test|rtsig_overflow_threshold|rtsig_signo|satisfy|satisfy_any|secure_link_secret|send_lowat|send_timeout|sendfile|sendfile_max_chunk|server|server_name|server_name_in_redirect|server_names_hash_bucket_size|server_names_hash_max_size|server_tokens|set|set_real_ip_from|smtp_auth|smtp_capabilities|so_keepalive|source_charset|split_clients|ssi|ssi_silent_errors|ssi_types|ssi_value_length|ssl|ssl_certificate|ssl_certificate_key|ssl_ciphers|ssl_client_certificate|ssl_crl|ssl_dhparam|ssl_engine|ssl_prefer_server_ciphers|ssl_protocols|ssl_session_cache|ssl_session_timeout|ssl_verify_client|ssl_verify_depth|starttls|stub_status|sub_filter|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|use|user|userid|userid_domain|userid_expires|userid_name|userid_p3p|userid_path|userid_service|valid_referers|variables_hash_bucket_size|variables_hash_max_size|worker_connections|worker_cpu_affinity|worker_priority|worker_processes|worker_rlimit_core|worker_rlimit_nofile|worker_rlimit_sigpending|working_directory|xclient|xml_entities|xslt_entities|xslt_stylesheet|xslt_types)\b/i,
 });
 
 Prism.languages.insertBefore('nginx', 'keyword', {
-        variable:/\$[a-zA-Z_]+/i,
-        'package': {
-                pattern: /(\\|namespace\s+|use\s+)[\w\\]+/,
-                lookbehind: true,
-                inside: {
-                        punctuation: /\\/
-                }
-        }        
-});
+        'variable': /\$[a-z_]+/i
+});
\ No newline at end of file
diff --git a/components/prism-nginx.min.js b/components/prism-nginx.min.js
new file mode 100644
index 0000000..b0965ed
--- /dev/null
+++ b/components/prism-nginx.min.js
@@ -0,0 +1 @@
+Prism.languages.nginx=Prism.languages.extend("clike",{comment:{pattern:/(^|[^"{\\])#.*/,lookbehind:!0},keyword:/\b(?:CONTENT_|DOCUMENT_|GATEWAY_|HTTP_|HTTPS|if_not_empty|PATH_|QUERY_|REDIRECT_|REMOTE_|REQUEST_|SCGI|SCRIPT_|SERVER_|http|server|events|location|include|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|auth_basic|auth_basic_user_file|auth_http|auth_http_header|auth_http_timeout|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|devpoll_changes|devpoll_events|directio|directio_alignment|disable_symlinks|empty_gif|env|epoll_events|error_log|error_page|expires|fastcgi_buffer_size|fastcgi_buffers|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_use_stale|fastcgi_cache_valid|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_no_cache|fastcgi_param|fastcgi_pass|fastcgi_pass_header|fastcgi_read_timeout|fastcgi_redirect_errors|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|google_perftools_profiles|gzip|gzip_buffers|gzip_comp_level|gzip_disable|gzip_http_version|gzip_min_length|gzip_proxied|gzip_static|gzip_types|gzip_vary|if|if_modified_since|ignore_invalid_headers|image_filter|image_filter_buffer|image_filter_jpeg_quality|image_filter_sharpen|image_filter_transparency|imap_capabilities|imap_client_buffer|include|index|internal|ip_hash|keepalive|keepalive_disable|keepalive_requests|keepalive_timeout|kqueue_changes|kqueue_events|large_client_header_buffers|limit_conn|limit_conn_log_level|limit_conn_zone|limit_except|limit_rate|limit_rate_after|limit_req|limit_req_log_level|limit_req_zone|limit_zone|lingering_close|lingering_time|lingering_timeout|listen|location|lock_file|log_format|log_format_combined|log_not_found|log_subrequest|map|map_hash_bucket_size|map_hash_max_size|master_process|max_ranges|memcached_buffer_size|memcached_connect_timeout|memcached_next_upstream|memcached_pass|memcached_read_timeout|memcached_send_timeout|merge_slashes|min_delete_depth|modern_browser|modern_browser_value|mp4|mp4_buffer_size|mp4_max_buffer_size|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|optimize_server_names|override_charset|pcre_jit|perl|perl_modules|perl_require|perl_set|pid|pop3_auth|pop3_capabilities|port_in_redirect|post_action|postpone_output|protocol|proxy|proxy_buffer|proxy_buffer_size|proxy_buffering|proxy_buffers|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_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_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_redirect_errors|proxy_send_lowat|proxy_send_timeout|proxy_set_body|proxy_set_header|proxy_ssl_session_reuse|proxy_store|proxy_store_access|proxy_temp_file_write_size|proxy_temp_path|proxy_timeout|proxy_upstream_fail_timeout|proxy_upstream_max_fails|random_index|read_ahead|real_ip_header|recursive_error_pages|request_pool_size|reset_timedout_connection|resolver|resolver_timeout|return|rewrite|root|rtsig_overflow_events|rtsig_overflow_test|rtsig_overflow_threshold|rtsig_signo|satisfy|satisfy_any|secure_link_secret|send_lowat|send_timeout|sendfile|sendfile_max_chunk|server|server_name|server_name_in_redirect|server_names_hash_bucket_size|server_names_hash_max_size|server_tokens|set|set_real_ip_from|smtp_auth|smtp_capabilities|so_keepalive|source_charset|split_clients|ssi|ssi_silent_errors|ssi_types|ssi_value_length|ssl|ssl_certificate|ssl_certificate_key|ssl_ciphers|ssl_client_certificate|ssl_crl|ssl_dhparam|ssl_engine|ssl_prefer_server_ciphers|ssl_protocols|ssl_session_cache|ssl_session_timeout|ssl_verify_client|ssl_verify_depth|starttls|stub_status|sub_filter|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|use|user|userid|userid_domain|userid_expires|userid_name|userid_p3p|userid_path|userid_service|valid_referers|variables_hash_bucket_size|variables_hash_max_size|worker_connections|worker_cpu_affinity|worker_priority|worker_processes|worker_rlimit_core|worker_rlimit_nofile|worker_rlimit_sigpending|working_directory|xclient|xml_entities|xslt_entities|xslt_stylesheet|xslt_types)\b/i}),Prism.languages.insertBefore("nginx","keyword",{variable:/\$[a-z_]+/i});
\ No newline at end of file
diff --git a/examples/prism-nginx.html b/examples/prism-nginx.html
index 231432c..6ea8b05 100644
--- a/examples/prism-nginx.html
+++ b/examples/prism-nginx.html
@@ -1,19 +1,11 @@
 <h1>Nginx</h1>
 <p>To use this language, use the class "language-nginx".</p>
 
-<h2>Single-line comments</h2>
+<h2>Comments</h2>
 <pre><code># This is a comment</code></pre>
 
-<h2>Strings</h2>
-<pre><code>"foo \"bar\" baz"
-'foo \'bar\' baz'</code></pre>
-
-<h2>Regular expressions</h2>
-<pre><code>/foo?[ ]*bar/</code></pre>
-
 <h2>Variables</h2>
-<pre><code>
-fastcgi_param  SERVER_NAME  $server_name;</code></pre>
+<pre><code>fastcgi_param SERVER_NAME $server_name;</code></pre>
 
 <h2>Server Block</h2>
 <pre><code>
@@ -33,7 +25,4 @@ server { # simple reverse-proxy
   location / {
     proxy_pass      http://127.0.0.1:8080;
   }
-}</code></pre>
-
-<h2>Known failures</h2>
-<p>N/A</p>
+}</code></pre>
\ No newline at end of file
diff --git a/plugins/autoloader/prism-autoloader.js b/plugins/autoloader/prism-autoloader.js
index f7e1e66..6bcbec7 100644
--- a/plugins/autoloader/prism-autoloader.js
+++ b/plugins/autoloader/prism-autoloader.js
@@ -4,7 +4,7 @@
 	}
 
 	// The dependencies map is built automatically with gulp
-	var lang_dependencies = /*languages_placeholder[*/{"javascript":"clike","actionscript":"javascript","aspnet":"markup","bash":"clike","bison":"c","c":"clike","csharp":"clike","cpp":"c","coffeescript":"javascript","css-extras":"css","d":"clike","dart":"clike","fsharp":"clike","glsl":"clike","go":"clike","groovy":"clike","haml":"ruby","handlebars":"markup","jade":"javascript","java":"clike","less":"css","markdown":"markup","objectivec":"c","php":"clike","php-extras":"php","processing":"clike","qore":"clike","jsx":["markup","javascript"],"ruby":"clike","sass":"css","scss":"css","scala":"java","smarty":"markup","swift":"clike","textile":"markup","twig":"markup","typescript":"javascript","wiki":"markup"}/*]*/;
+	var lang_dependencies = /*languages_placeholder[*/{"javascript":"clike","actionscript":"javascript","aspnet":"markup","bash":"clike","bison":"c","c":"clike","csharp":"clike","cpp":"c","coffeescript":"javascript","css-extras":"css","d":"clike","dart":"clike","fsharp":"clike","glsl":"clike","go":"clike","groovy":"clike","haml":"ruby","handlebars":"markup","jade":"javascript","java":"clike","less":"css","markdown":"markup","nginx":"clike","objectivec":"c","php":"clike","php-extras":"php","processing":"clike","qore":"clike","jsx":["markup","javascript"],"ruby":"clike","sass":"css","scss":"css","scala":"java","smarty":"markup","swift":"clike","textile":"markup","twig":"markup","typescript":"javascript","wiki":"markup"}/*]*/;
 
 	var lang_data = {};
 
diff --git a/plugins/autoloader/prism-autoloader.min.js b/plugins/autoloader/prism-autoloader.min.js
index 8fd9ed8..6ab53c7 100644
--- a/plugins/autoloader/prism-autoloader.min.js
+++ b/plugins/autoloader/prism-autoloader.min.js
@@ -1 +1 @@
-!function(){if("undefined"!=typeof self&&self.Prism&&self.document&&document.createElement){var e={javascript:"clike",actionscript:"javascript",aspnet:"markup",bash:"clike",bison:"c",c:"clike",csharp:"clike",cpp:"c",coffeescript:"javascript","css-extras":"css",d:"clike",dart:"clike",fsharp:"clike",glsl:"clike",go:"clike",groovy:"clike",haml:"ruby",handlebars:"markup",jade:"javascript",java:"clike",less:"css",markdown:"markup",objectivec:"c",php:"clike","php-extras":"php",processing:"clike",qore:"clike",jsx:["markup","javascript"],ruby:"clike",sass:"css",scss:"css",scala:"java",smarty:"markup",swift:"clike",textile:"markup",twig:"markup",typescript:"javascript",wiki:"markup"},c={},a=Prism.plugins.autoloader={languages_path:"components/",use_minified:!0},s=function(e,c,a){var s=document.createElement("script");s.src=e,s.async=!0,s.onload=function(){document.body.removeChild(s),c&&c()},s.onerror=function(){document.body.removeChild(s),a&&a()},document.body.appendChild(s)},n=function(e){return a.languages_path+"prism-"+e+(a.use_minified?".min":"")+".js"},r=function(e,a){var s=c[e];s||(s=c[e]={});var n=a.getAttribute("data-dependencies");!n&&a.parentNode&&"pre"===a.parentNode.tagName.toLowerCase()&&(n=a.parentNode.getAttribute("data-dependencies")),n=n?n.split(/\s*,\s*/g):[],i(n,function(){t(e,function(){Prism.highlightElement(a)})})},i=function(e,c,a){"string"==typeof e&&(e=[e]);var s=0,n=e.length,r=function(){n>s?t(e[s],function(){s++,r()},function(){a&&a(e[s])}):s===n&&c&&c(e)};r()},t=function(a,r,t){var u=function(){var e=!1;a.indexOf("!")>=0&&(e=!0,a=a.replace("!",""));var i=c[a];if(i||(i=c[a]={}),r&&(i.success_callbacks||(i.success_callbacks=[]),i.success_callbacks.push(r)),t&&(i.error_callbacks||(i.error_callbacks=[]),i.error_callbacks.push(t)),!e&&Prism.languages[a])l(a);else if(!e&&i.error)o(a);else if(e||!i.loading){i.loading=!0;var u=n(a);s(u,function(){i.loading=!1,l(a)},function(){i.loading=!1,i.error=!0,o(a)})}},p=e[a];p&&p.length?i(p,u):u()},l=function(e){c[e]&&c[e].success_callbacks&&c[e].success_callbacks.length&&c[e].success_callbacks.forEach(function(c){c(e)})},o=function(e){c[e]&&c[e].error_callbacks&&c[e].error_callbacks.length&&c[e].error_callbacks.forEach(function(c){c(e)})};Prism.hooks.add("complete",function(e){e.element&&e.language&&!e.grammar&&r(e.language,e.element)})}}();
\ No newline at end of file
+!function(){if("undefined"!=typeof self&&self.Prism&&self.document&&document.createElement){var e={javascript:"clike",actionscript:"javascript",aspnet:"markup",bash:"clike",bison:"c",c:"clike",csharp:"clike",cpp:"c",coffeescript:"javascript","css-extras":"css",d:"clike",dart:"clike",fsharp:"clike",glsl:"clike",go:"clike",groovy:"clike",haml:"ruby",handlebars:"markup",jade:"javascript",java:"clike",less:"css",markdown:"markup",nginx:"clike",objectivec:"c",php:"clike","php-extras":"php",processing:"clike",qore:"clike",jsx:["markup","javascript"],ruby:"clike",sass:"css",scss:"css",scala:"java",smarty:"markup",swift:"clike",textile:"markup",twig:"markup",typescript:"javascript",wiki:"markup"},c={},a=Prism.plugins.autoloader={languages_path:"components/",use_minified:!0},s=function(e,c,a){var s=document.createElement("script");s.src=e,s.async=!0,s.onload=function(){document.body.removeChild(s),c&&c()},s.onerror=function(){document.body.removeChild(s),a&&a()},document.body.appendChild(s)},n=function(e){return a.languages_path+"prism-"+e+(a.use_minified?".min":"")+".js"},r=function(e,a){var s=c[e];s||(s=c[e]={});var n=a.getAttribute("data-dependencies");!n&&a.parentNode&&"pre"===a.parentNode.tagName.toLowerCase()&&(n=a.parentNode.getAttribute("data-dependencies")),n=n?n.split(/\s*,\s*/g):[],i(n,function(){t(e,function(){Prism.highlightElement(a)})})},i=function(e,c,a){"string"==typeof e&&(e=[e]);var s=0,n=e.length,r=function(){n>s?t(e[s],function(){s++,r()},function(){a&&a(e[s])}):s===n&&c&&c(e)};r()},t=function(a,r,t){var u=function(){var e=!1;a.indexOf("!")>=0&&(e=!0,a=a.replace("!",""));var i=c[a];if(i||(i=c[a]={}),r&&(i.success_callbacks||(i.success_callbacks=[]),i.success_callbacks.push(r)),t&&(i.error_callbacks||(i.error_callbacks=[]),i.error_callbacks.push(t)),!e&&Prism.languages[a])l(a);else if(!e&&i.error)o(a);else if(e||!i.loading){i.loading=!0;var u=n(a);s(u,function(){i.loading=!1,l(a)},function(){i.loading=!1,i.error=!0,o(a)})}},p=e[a];p&&p.length?i(p,u):u()},l=function(e){c[e]&&c[e].success_callbacks&&c[e].success_callbacks.length&&c[e].success_callbacks.forEach(function(c){c(e)})},o=function(e){c[e]&&c[e].error_callbacks&&c[e].error_callbacks.length&&c[e].error_callbacks.forEach(function(c){c(e)})};Prism.hooks.add("complete",function(e){e.element&&e.language&&!e.grammar&&r(e.language,e.element)})}}();
\ No newline at end of file
diff --git a/plugins/show-language/prism-show-language.js b/plugins/show-language/prism-show-language.js
index 09f6298..073c4f5 100644
--- a/plugins/show-language/prism-show-language.js
+++ b/plugins/show-language/prism-show-language.js
@@ -5,7 +5,7 @@ if (typeof self === 'undefined' || !self.Prism || !self.document) {
 }
 
 // The languages map is built automatically with gulp
-var Languages = /*languages_placeholder[*/{"css":"CSS","clike":"C-like","javascript":"JavaScript","abap":"ABAP","actionscript":"ActionScript","apacheconf":"Apache Configuration","apl":"APL","applescript":"AppleScript","aspnet":"ASP.NET (C#)","autoit":"AutoIt","autohotkey":"AutoHotkey","basic":"BASIC","csharp":"C#","cpp":"C++","coffeescript":"CoffeeScript","css-extras":"CSS Extras","fsharp":"F#","glsl":"GLSL","http":"HTTP","inform7":"Inform 7","latex":"LaTeX","lolcode":"LOLCODE","matlab":"MATLAB","mel":"MEL","nasm":"NASM","nsis":"NSIS","objectivec":"Objective-C","ocaml":"OCaml","php":"PHP","php-extras":"PHP Extras","powershell":"PowerShell","jsx":"React JSX","rest":"reST (reStructuredText)","sas":"SAS","sass":"Sass (Sass)","scss":"Sass (Scss)","sql":"SQL","typescript":"TypeScript","vhdl":"VHDL","wiki":"Wiki markup","yaml":"YAML"}/*]*/;
+var Languages = /*languages_placeholder[*/{"css":"CSS","clike":"C-like","javascript":"JavaScript","abap":"ABAP","actionscript":"ActionScript","apacheconf":"Apache Configuration","apl":"APL","applescript":"AppleScript","aspnet":"ASP.NET (C#)","autoit":"AutoIt","autohotkey":"AutoHotkey","basic":"BASIC","csharp":"C#","cpp":"C++","coffeescript":"CoffeeScript","css-extras":"CSS Extras","fsharp":"F#","glsl":"GLSL","http":"HTTP","inform7":"Inform 7","latex":"LaTeX","lolcode":"LOLCODE","matlab":"MATLAB","mel":"MEL","nasm":"NASM","nginx":"nginx","nsis":"NSIS","objectivec":"Objective-C","ocaml":"OCaml","php":"PHP","php-extras":"PHP Extras","powershell":"PowerShell","jsx":"React JSX","rest":"reST (reStructuredText)","sas":"SAS","sass":"Sass (Sass)","scss":"Sass (Scss)","sql":"SQL","typescript":"TypeScript","vhdl":"VHDL","wiki":"Wiki markup","yaml":"YAML"}/*]*/;
 Prism.hooks.add('before-highlight', function(env) {
 	var pre = env.element.parentNode;
 	if (!pre || !/pre/i.test(pre.nodeName)) {
diff --git a/plugins/show-language/prism-show-language.min.js b/plugins/show-language/prism-show-language.min.js
index 90ef27e..905f5f6 100644
--- a/plugins/show-language/prism-show-language.min.js
+++ b/plugins/show-language/prism-show-language.min.js
@@ -1 +1 @@
-!function(){if("undefined"!=typeof self&&self.Prism&&self.document){var e={css:"CSS",clike:"C-like",javascript:"JavaScript",abap:"ABAP",actionscript:"ActionScript",apacheconf:"Apache Configuration",apl:"APL",applescript:"AppleScript",aspnet:"ASP.NET (C#)",autoit:"AutoIt",autohotkey:"AutoHotkey",basic:"BASIC",csharp:"C#",cpp:"C++",coffeescript:"CoffeeScript","css-extras":"CSS Extras",fsharp:"F#",glsl:"GLSL",http:"HTTP",inform7:"Inform 7",latex:"LaTeX",lolcode:"LOLCODE",matlab:"MATLAB",mel:"MEL",nasm:"NASM",nsis:"NSIS",objectivec:"Objective-C",ocaml:"OCaml",php:"PHP","php-extras":"PHP Extras",powershell:"PowerShell",jsx:"React JSX",rest:"reST (reStructuredText)",sas:"SAS",sass:"Sass (Sass)",scss:"Sass (Scss)",sql:"SQL",typescript:"TypeScript",vhdl:"VHDL",wiki:"Wiki markup",yaml:"YAML"};Prism.hooks.add("before-highlight",function(a){var t=a.element.parentNode;if(t&&/pre/i.test(t.nodeName)){var s=e[a.language]||a.language.substring(0,1).toUpperCase()+a.language.substring(1);t.setAttribute("data-language",s)}})}}();
\ No newline at end of file
+!function(){if("undefined"!=typeof self&&self.Prism&&self.document){var e={css:"CSS",clike:"C-like",javascript:"JavaScript",abap:"ABAP",actionscript:"ActionScript",apacheconf:"Apache Configuration",apl:"APL",applescript:"AppleScript",aspnet:"ASP.NET (C#)",autoit:"AutoIt",autohotkey:"AutoHotkey",basic:"BASIC",csharp:"C#",cpp:"C++",coffeescript:"CoffeeScript","css-extras":"CSS Extras",fsharp:"F#",glsl:"GLSL",http:"HTTP",inform7:"Inform 7",latex:"LaTeX",lolcode:"LOLCODE",matlab:"MATLAB",mel:"MEL",nasm:"NASM",nginx:"nginx",nsis:"NSIS",objectivec:"Objective-C",ocaml:"OCaml",php:"PHP","php-extras":"PHP Extras",powershell:"PowerShell",jsx:"React JSX",rest:"reST (reStructuredText)",sas:"SAS",sass:"Sass (Sass)",scss:"Sass (Scss)",sql:"SQL",typescript:"TypeScript",vhdl:"VHDL",wiki:"Wiki markup",yaml:"YAML"};Prism.hooks.add("before-highlight",function(a){var t=a.element.parentNode;if(t&&/pre/i.test(t.nodeName)){var s=e[a.language]||a.language.substring(0,1).toUpperCase()+a.language.substring(1);t.setAttribute("data-language",s)}})}}();
\ No newline at end of file
diff --git a/tests/languages/nginx/comment_feature.test b/tests/languages/nginx/comment_feature.test
new file mode 100644
index 0000000..09493ab
--- /dev/null
+++ b/tests/languages/nginx/comment_feature.test
@@ -0,0 +1,13 @@
+#
+# Foobar
+
+----------------------------------------------------
+
+[
+	["comment", "#"],
+	["comment", "# Foobar"]
+]
+
+----------------------------------------------------
+
+Checks for comments.
\ No newline at end of file
diff --git a/tests/languages/nginx/keyword_feature.test b/tests/languages/nginx/keyword_feature.test
new file mode 100644
index 0000000..2d55fd4
--- /dev/null
+++ b/tests/languages/nginx/keyword_feature.test
@@ -0,0 +1,705 @@
+CONTENT_
+DOCUMENT_
+GATEWAY_
+HTTP_
+HTTPS
+if_not_empty
+PATH_
+QUERY_
+REDIRECT_
+REMOTE_
+REQUEST_
+SCGI
+SCRIPT_
+SERVER_
+http
+server
+events
+location
+include
+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
+auth_basic
+auth_basic_user_file
+auth_http
+auth_http_header
+auth_http_timeout
+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
+devpoll_changes
+devpoll_events
+directio
+directio_alignment
+disable_symlinks
+empty_gif
+env
+epoll_events
+error_log
+error_page
+expires
+fastcgi_buffer_size
+fastcgi_buffers
+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_use_stale
+fastcgi_cache_valid
+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_no_cache
+fastcgi_param
+fastcgi_pass
+fastcgi_pass_header
+fastcgi_read_timeout
+fastcgi_redirect_errors
+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
+google_perftools_profiles
+gzip
+gzip_buffers
+gzip_comp_level
+gzip_disable
+gzip_http_version
+gzip_min_length
+gzip_proxied
+gzip_static
+gzip_types
+gzip_vary
+if
+if_modified_since
+ignore_invalid_headers
+image_filter
+image_filter_buffer
+image_filter_jpeg_quality
+image_filter_sharpen
+image_filter_transparency
+imap_capabilities
+imap_client_buffer
+include
+index
+internal
+ip_hash
+keepalive
+keepalive_disable
+keepalive_requests
+keepalive_timeout
+kqueue_changes
+kqueue_events
+large_client_header_buffers
+limit_conn
+limit_conn_log_level
+limit_conn_zone
+limit_except
+limit_rate
+limit_rate_after
+limit_req
+limit_req_log_level
+limit_req_zone
+limit_zone
+lingering_close
+lingering_time
+lingering_timeout
+listen
+location
+lock_file
+log_format
+log_format_combined
+log_not_found
+log_subrequest
+map
+map_hash_bucket_size
+map_hash_max_size
+master_process
+max_ranges
+memcached_buffer_size
+memcached_connect_timeout
+memcached_next_upstream
+memcached_pass
+memcached_read_timeout
+memcached_send_timeout
+merge_slashes
+min_delete_depth
+modern_browser
+modern_browser_value
+mp4
+mp4_buffer_size
+mp4_max_buffer_size
+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
+optimize_server_names
+override_charset
+pcre_jit
+perl
+perl_modules
+perl_require
+perl_set
+pid
+pop3_auth
+pop3_capabilities
+port_in_redirect
+post_action
+postpone_output
+protocol
+proxy
+proxy_buffer
+proxy_buffer_size
+proxy_buffering
+proxy_buffers
+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_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_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_redirect_errors
+proxy_send_lowat
+proxy_send_timeout
+proxy_set_body
+proxy_set_header
+proxy_ssl_session_reuse
+proxy_store
+proxy_store_access
+proxy_temp_file_write_size
+proxy_temp_path
+proxy_timeout
+proxy_upstream_fail_timeout
+proxy_upstream_max_fails
+random_index
+read_ahead
+real_ip_header
+recursive_error_pages
+request_pool_size
+reset_timedout_connection
+resolver
+resolver_timeout
+return
+rewrite
+root
+rtsig_overflow_events
+rtsig_overflow_test
+rtsig_overflow_threshold
+rtsig_signo
+satisfy
+satisfy_any
+secure_link_secret
+send_lowat
+send_timeout
+sendfile
+sendfile_max_chunk
+server
+server_name
+server_name_in_redirect
+server_names_hash_bucket_size
+server_names_hash_max_size
+server_tokens
+set
+set_real_ip_from
+smtp_auth
+smtp_capabilities
+so_keepalive
+source_charset
+split_clients
+ssi
+ssi_silent_errors
+ssi_types
+ssi_value_length
+ssl
+ssl_certificate
+ssl_certificate_key
+ssl_ciphers
+ssl_client_certificate
+ssl_crl
+ssl_dhparam
+ssl_engine
+ssl_prefer_server_ciphers
+ssl_protocols
+ssl_session_cache
+ssl_session_timeout
+ssl_verify_client
+ssl_verify_depth
+starttls
+stub_status
+sub_filter
+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
+use
+user
+userid
+userid_domain
+userid_expires
+userid_name
+userid_p3p
+userid_path
+userid_service
+valid_referers
+variables_hash_bucket_size
+variables_hash_max_size
+worker_connections
+worker_cpu_affinity
+worker_priority
+worker_processes
+worker_rlimit_core
+worker_rlimit_nofile
+worker_rlimit_sigpending
+working_directory
+xclient
+xml_entities
+xslt_entities
+xslt_stylesheet
+xslt_types
+
+----------------------------------------------------
+
+[
+	["keyword", "CONTENT_"],
+	["keyword", "DOCUMENT_"],
+	["keyword", "GATEWAY_"],
+	["keyword", "HTTP_"],
+	["keyword", "HTTPS"],
+	["keyword", "if_not_empty"],
+	["keyword", "PATH_"],
+	["keyword", "QUERY_"],
+	["keyword", "REDIRECT_"],
+	["keyword", "REMOTE_"],
+	["keyword", "REQUEST_"],
+	["keyword", "SCGI"],
+	["keyword", "SCRIPT_"],
+	["keyword", "SERVER_"],
+	["keyword", "http"],
+	["keyword", "server"],
+	["keyword", "events"],
+	["keyword", "location"],
+	["keyword", "include"],
+	["keyword", "accept_mutex"],
+	["keyword", "accept_mutex_delay"],
+	["keyword", "access_log"],
+	["keyword", "add_after_body"],
+	["keyword", "add_before_body"],
+	["keyword", "add_header"],
+	["keyword", "addition_types"],
+	["keyword", "aio"],
+	["keyword", "alias"],
+	["keyword", "allow"],
+	["keyword", "ancient_browser"],
+	["keyword", "ancient_browser_value"],
+	["keyword", "auth"],
+	["keyword", "auth_basic"],
+	["keyword", "auth_basic_user_file"],
+	["keyword", "auth_http"],
+	["keyword", "auth_http_header"],
+	["keyword", "auth_http_timeout"],
+	["keyword", "autoindex"],
+	["keyword", "autoindex_exact_size"],
+	["keyword", "autoindex_localtime"],
+	["keyword", "break"],
+	["keyword", "charset"],
+	["keyword", "charset_map"],
+	["keyword", "charset_types"],
+	["keyword", "chunked_transfer_encoding"],
+	["keyword", "client_body_buffer_size"],
+	["keyword", "client_body_in_file_only"],
+	["keyword", "client_body_in_single_buffer"],
+	["keyword", "client_body_temp_path"],
+	["keyword", "client_body_timeout"],
+	["keyword", "client_header_buffer_size"],
+	["keyword", "client_header_timeout"],
+	["keyword", "client_max_body_size"],
+	["keyword", "connection_pool_size"],
+	["keyword", "create_full_put_path"],
+	["keyword", "daemon"],
+	["keyword", "dav_access"],
+	["keyword", "dav_methods"],
+	["keyword", "debug_connection"],
+	["keyword", "debug_points"],
+	["keyword", "default_type"],
+	["keyword", "deny"],
+	["keyword", "devpoll_changes"],
+	["keyword", "devpoll_events"],
+	["keyword", "directio"],
+	["keyword", "directio_alignment"],
+	["keyword", "disable_symlinks"],
+	["keyword", "empty_gif"],
+	["keyword", "env"],
+	["keyword", "epoll_events"],
+	["keyword", "error_log"],
+	["keyword", "error_page"],
+	["keyword", "expires"],
+	["keyword", "fastcgi_buffer_size"],
+	["keyword", "fastcgi_buffers"],
+	["keyword", "fastcgi_busy_buffers_size"],
+	["keyword", "fastcgi_cache"],
+	["keyword", "fastcgi_cache_bypass"],
+	["keyword", "fastcgi_cache_key"],
+	["keyword", "fastcgi_cache_lock"],
+	["keyword", "fastcgi_cache_lock_timeout"],
+	["keyword", "fastcgi_cache_methods"],
+	["keyword", "fastcgi_cache_min_uses"],
+	["keyword", "fastcgi_cache_path"],
+	["keyword", "fastcgi_cache_purge"],
+	["keyword", "fastcgi_cache_use_stale"],
+	["keyword", "fastcgi_cache_valid"],
+	["keyword", "fastcgi_connect_timeout"],
+	["keyword", "fastcgi_hide_header"],
+	["keyword", "fastcgi_ignore_client_abort"],
+	["keyword", "fastcgi_ignore_headers"],
+	["keyword", "fastcgi_index"],
+	["keyword", "fastcgi_intercept_errors"],
+	["keyword", "fastcgi_keep_conn"],
+	["keyword", "fastcgi_max_temp_file_size"],
+	["keyword", "fastcgi_next_upstream"],
+	["keyword", "fastcgi_no_cache"],
+	["keyword", "fastcgi_param"],
+	["keyword", "fastcgi_pass"],
+	["keyword", "fastcgi_pass_header"],
+	["keyword", "fastcgi_read_timeout"],
+	["keyword", "fastcgi_redirect_errors"],
+	["keyword", "fastcgi_send_timeout"],
+	["keyword", "fastcgi_split_path_info"],
+	["keyword", "fastcgi_store"],
+	["keyword", "fastcgi_store_access"],
+	["keyword", "fastcgi_temp_file_write_size"],
+	["keyword", "fastcgi_temp_path"],
+	["keyword", "flv"],
+	["keyword", "geo"],
+	["keyword", "geoip_city"],
+	["keyword", "geoip_country"],
+	["keyword", "google_perftools_profiles"],
+	["keyword", "gzip"],
+	["keyword", "gzip_buffers"],
+	["keyword", "gzip_comp_level"],
+	["keyword", "gzip_disable"],
+	["keyword", "gzip_http_version"],
+	["keyword", "gzip_min_length"],
+	["keyword", "gzip_proxied"],
+	["keyword", "gzip_static"],
+	["keyword", "gzip_types"],
+	["keyword", "gzip_vary"],
+	["keyword", "if"],
+	["keyword", "if_modified_since"],
+	["keyword", "ignore_invalid_headers"],
+	["keyword", "image_filter"],
+	["keyword", "image_filter_buffer"],
+	["keyword", "image_filter_jpeg_quality"],
+	["keyword", "image_filter_sharpen"],
+	["keyword", "image_filter_transparency"],
+	["keyword", "imap_capabilities"],
+	["keyword", "imap_client_buffer"],
+	["keyword", "include"],
+	["keyword", "index"],
+	["keyword", "internal"],
+	["keyword", "ip_hash"],
+	["keyword", "keepalive"],
+	["keyword", "keepalive_disable"],
+	["keyword", "keepalive_requests"],
+	["keyword", "keepalive_timeout"],
+	["keyword", "kqueue_changes"],
+	["keyword", "kqueue_events"],
+	["keyword", "large_client_header_buffers"],
+	["keyword", "limit_conn"],
+	["keyword", "limit_conn_log_level"],
+	["keyword", "limit_conn_zone"],
+	["keyword", "limit_except"],
+	["keyword", "limit_rate"],
+	["keyword", "limit_rate_after"],
+	["keyword", "limit_req"],
+	["keyword", "limit_req_log_level"],
+	["keyword", "limit_req_zone"],
+	["keyword", "limit_zone"],
+	["keyword", "lingering_close"],
+	["keyword", "lingering_time"],
+	["keyword", "lingering_timeout"],
+	["keyword", "listen"],
+	["keyword", "location"],
+	["keyword", "lock_file"],
+	["keyword", "log_format"],
+	["keyword", "log_format_combined"],
+	["keyword", "log_not_found"],
+	["keyword", "log_subrequest"],
+	["keyword", "map"],
+	["keyword", "map_hash_bucket_size"],
+	["keyword", "map_hash_max_size"],
+	["keyword", "master_process"],
+	["keyword", "max_ranges"],
+	["keyword", "memcached_buffer_size"],
+	["keyword", "memcached_connect_timeout"],
+	["keyword", "memcached_next_upstream"],
+	["keyword", "memcached_pass"],
+	["keyword", "memcached_read_timeout"],
+	["keyword", "memcached_send_timeout"],
+	["keyword", "merge_slashes"],
+	["keyword", "min_delete_depth"],
+	["keyword", "modern_browser"],
+	["keyword", "modern_browser_value"],
+	["keyword", "mp4"],
+	["keyword", "mp4_buffer_size"],
+	["keyword", "mp4_max_buffer_size"],
+	["keyword", "msie_padding"],
+	["keyword", "msie_refresh"],
+	["keyword", "multi_accept"],
+	["keyword", "open_file_cache"],
+	["keyword", "open_file_cache_errors"],
+	["keyword", "open_file_cache_min_uses"],
+	["keyword", "open_file_cache_valid"],
+	["keyword", "open_log_file_cache"],
+	["keyword", "optimize_server_names"],
+	["keyword", "override_charset"],
+	["keyword", "pcre_jit"],
+	["keyword", "perl"],
+	["keyword", "perl_modules"],
+	["keyword", "perl_require"],
+	["keyword", "perl_set"],
+	["keyword", "pid"],
+	["keyword", "pop3_auth"],
+	["keyword", "pop3_capabilities"],
+	["keyword", "port_in_redirect"],
+	["keyword", "post_action"],
+	["keyword", "postpone_output"],
+	["keyword", "protocol"],
+	["keyword", "proxy"],
+	["keyword", "proxy_buffer"],
+	["keyword", "proxy_buffer_size"],
+	["keyword", "proxy_buffering"],
+	["keyword", "proxy_buffers"],
+	["keyword", "proxy_busy_buffers_size"],
+	["keyword", "proxy_cache"],
+	["keyword", "proxy_cache_bypass"],
+	["keyword", "proxy_cache_key"],
+	["keyword", "proxy_cache_lock"],
+	["keyword", "proxy_cache_lock_timeout"],
+	["keyword", "proxy_cache_methods"],
+	["keyword", "proxy_cache_min_uses"],
+	["keyword", "proxy_cache_path"],
+	["keyword", "proxy_cache_use_stale"],
+	["keyword", "proxy_cache_valid"],
+	["keyword", "proxy_connect_timeout"],
+	["keyword", "proxy_cookie_domain"],
+	["keyword", "proxy_cookie_path"],
+	["keyword", "proxy_headers_hash_bucket_size"],
+	["keyword", "proxy_headers_hash_max_size"],
+	["keyword", "proxy_hide_header"],
+	["keyword", "proxy_http_version"],
+	["keyword", "proxy_ignore_client_abort"],
+	["keyword", "proxy_ignore_headers"],
+	["keyword", "proxy_intercept_errors"],
+	["keyword", "proxy_max_temp_file_size"],
+	["keyword", "proxy_method"],
+	["keyword", "proxy_next_upstream"],
+	["keyword", "proxy_no_cache"],
+	["keyword", "proxy_pass"],
+	["keyword", "proxy_pass_error_message"],
+	["keyword", "proxy_pass_header"],
+	["keyword", "proxy_pass_request_body"],
+	["keyword", "proxy_pass_request_headers"],
+	["keyword", "proxy_read_timeout"],
+	["keyword", "proxy_redirect"],
+	["keyword", "proxy_redirect_errors"],
+	["keyword", "proxy_send_lowat"],
+	["keyword", "proxy_send_timeout"],
+	["keyword", "proxy_set_body"],
+	["keyword", "proxy_set_header"],
+	["keyword", "proxy_ssl_session_reuse"],
+	["keyword", "proxy_store"],
+	["keyword", "proxy_store_access"],
+	["keyword", "proxy_temp_file_write_size"],
+	["keyword", "proxy_temp_path"],
+	["keyword", "proxy_timeout"],
+	["keyword", "proxy_upstream_fail_timeout"],
+	["keyword", "proxy_upstream_max_fails"],
+	["keyword", "random_index"],
+	["keyword", "read_ahead"],
+	["keyword", "real_ip_header"],
+	["keyword", "recursive_error_pages"],
+	["keyword", "request_pool_size"],
+	["keyword", "reset_timedout_connection"],
+	["keyword", "resolver"],
+	["keyword", "resolver_timeout"],
+	["keyword", "return"],
+	["keyword", "rewrite"],
+	["keyword", "root"],
+	["keyword", "rtsig_overflow_events"],
+	["keyword", "rtsig_overflow_test"],
+	["keyword", "rtsig_overflow_threshold"],
+	["keyword", "rtsig_signo"],
+	["keyword", "satisfy"],
+	["keyword", "satisfy_any"],
+	["keyword", "secure_link_secret"],
+	["keyword", "send_lowat"],
+	["keyword", "send_timeout"],
+	["keyword", "sendfile"],
+	["keyword", "sendfile_max_chunk"],
+	["keyword", "server"],
+	["keyword", "server_name"],
+	["keyword", "server_name_in_redirect"],
+	["keyword", "server_names_hash_bucket_size"],
+	["keyword", "server_names_hash_max_size"],
+	["keyword", "server_tokens"],
+	["keyword", "set"],
+	["keyword", "set_real_ip_from"],
+	["keyword", "smtp_auth"],
+	["keyword", "smtp_capabilities"],
+	["keyword", "so_keepalive"],
+	["keyword", "source_charset"],
+	["keyword", "split_clients"],
+	["keyword", "ssi"],
+	["keyword", "ssi_silent_errors"],
+	["keyword", "ssi_types"],
+	["keyword", "ssi_value_length"],
+	["keyword", "ssl"],
+	["keyword", "ssl_certificate"],
+	["keyword", "ssl_certificate_key"],
+	["keyword", "ssl_ciphers"],
+	["keyword", "ssl_client_certificate"],
+	["keyword", "ssl_crl"],
+	["keyword", "ssl_dhparam"],
+	["keyword", "ssl_engine"],
+	["keyword", "ssl_prefer_server_ciphers"],
+	["keyword", "ssl_protocols"],
+	["keyword", "ssl_session_cache"],
+	["keyword", "ssl_session_timeout"],
+	["keyword", "ssl_verify_client"],
+	["keyword", "ssl_verify_depth"],
+	["keyword", "starttls"],
+	["keyword", "stub_status"],
+	["keyword", "sub_filter"],
+	["keyword", "sub_filter_once"],
+	["keyword", "sub_filter_types"],
+	["keyword", "tcp_nodelay"],
+	["keyword", "tcp_nopush"],
+	["keyword", "timeout"],
+	["keyword", "timer_resolution"],
+	["keyword", "try_files"],
+	["keyword", "types"],
+	["keyword", "types_hash_bucket_size"],
+	["keyword", "types_hash_max_size"],
+	["keyword", "underscores_in_headers"],
+	["keyword", "uninitialized_variable_warn"],
+	["keyword", "upstream"],
+	["keyword", "use"],
+	["keyword", "user"],
+	["keyword", "userid"],
+	["keyword", "userid_domain"],
+	["keyword", "userid_expires"],
+	["keyword", "userid_name"],
+	["keyword", "userid_p3p"],
+	["keyword", "userid_path"],
+	["keyword", "userid_service"],
+	["keyword", "valid_referers"],
+	["keyword", "variables_hash_bucket_size"],
+	["keyword", "variables_hash_max_size"],
+	["keyword", "worker_connections"],
+	["keyword", "worker_cpu_affinity"],
+	["keyword", "worker_priority"],
+	["keyword", "worker_processes"],
+	["keyword", "worker_rlimit_core"],
+	["keyword", "worker_rlimit_nofile"],
+	["keyword", "worker_rlimit_sigpending"],
+	["keyword", "working_directory"],
+	["keyword", "xclient"],
+	["keyword", "xml_entities"],
+	["keyword", "xslt_entities"],
+	["keyword", "xslt_stylesheet"],
+	["keyword", "xslt_types"]
+]
+
+----------------------------------------------------
+
+Checks for keywords.
\ No newline at end of file
diff --git a/tests/languages/nginx/variable_feature.test b/tests/languages/nginx/variable_feature.test
new file mode 100644
index 0000000..29959b9
--- /dev/null
+++ b/tests/languages/nginx/variable_feature.test
@@ -0,0 +1,13 @@
+$foobar
+$foo_bar
+
+----------------------------------------------------
+
+[
+	["variable", "$foobar"],
+	["variable", "$foo_bar"]
+]
+
+----------------------------------------------------
+
+Checks for variables.
\ No newline at end of file