mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Compare commits
	
		
			29 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 44ed47cea1 | ||
|  | de51cb08d2 | ||
|  | 3dd2d08190 | ||
|  | 3b625e1954 | ||
|  | 5c6f690b97 | ||
|  | 3bbfc907f3 | ||
|  | 053b8bca97 | ||
|  | 7fb3db6203 | ||
|  | ba09394f85 | ||
|  | c59c88f16e | ||
|  | 8a6e74799a | ||
|  | 4268769d2e | ||
|  | 6601864084 | ||
|  | d57aa37fb7 | ||
|  | e72347fd98 | ||
|  | 1b429ea46b | ||
|  | 9468ad4947 | ||
|  | 733ef63193 | ||
|  | 9ca6a5841e | ||
|  | 41ace5fba0 | ||
|  | cc4295b3b3 | ||
|  | 1e4ce80fd9 | ||
|  | 74a71fd90d | ||
|  | 9b08318456 | ||
|  | fa5b6b03dc | ||
|  | cb59296fe0 | ||
|  | f1be771611 | ||
|  | b66fcb2529 | ||
|  | d58cbc68a6 | 
							
								
								
									
										28
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										28
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							| @@ -67,9 +67,6 @@ | ||||
| [submodule "vendor/grammars/language-javascript"] | ||||
| 	path = vendor/grammars/language-javascript | ||||
| 	url = https://github.com/atom/language-javascript | ||||
| [submodule "vendor/grammars/language-python"] | ||||
| 	path = vendor/grammars/language-python | ||||
| 	url = https://github.com/atom/language-python | ||||
| [submodule "vendor/grammars/language-shellscript"] | ||||
| 	path = vendor/grammars/language-shellscript | ||||
| 	url = https://github.com/atom/language-shellscript | ||||
| @@ -177,7 +174,7 @@ | ||||
| 	url = https://github.com/mokus0/Agda.tmbundle | ||||
| [submodule "vendor/grammars/Julia.tmbundle"] | ||||
| 	path = vendor/grammars/Julia.tmbundle | ||||
| 	url = https://github.com/nanoant/Julia.tmbundle | ||||
| 	url = https://github.com/JuliaEditorSupport/Julia.tmbundle | ||||
| [submodule "vendor/grammars/ooc.tmbundle"] | ||||
| 	path = vendor/grammars/ooc.tmbundle | ||||
| 	url = https://github.com/nilium/ooc.tmbundle | ||||
| @@ -333,7 +330,7 @@ | ||||
| 	url = https://github.com/textmate/php-smarty.tmbundle | ||||
| [submodule "vendor/grammars/php.tmbundle"] | ||||
| 	path = vendor/grammars/php.tmbundle | ||||
| 	url = https://github.com/textmate/php.tmbundle | ||||
| 	url = https://github.com/brandonblack/php.tmbundle | ||||
| [submodule "vendor/grammars/postscript.tmbundle"] | ||||
| 	path = vendor/grammars/postscript.tmbundle | ||||
| 	url = https://github.com/textmate/postscript.tmbundle | ||||
| @@ -818,3 +815,24 @@ | ||||
| [submodule "vendor/grammars/language-regexp"] | ||||
| 	path = vendor/grammars/language-regexp | ||||
| 	url = https://github.com/Alhadis/language-regexp | ||||
| [submodule "vendor/grammars/Terraform.tmLanguage"] | ||||
| 	path = vendor/grammars/Terraform.tmLanguage | ||||
| 	url = https://github.com/alexlouden/Terraform.tmLanguage | ||||
| [submodule "vendor/grammars/shaders-tmLanguage"] | ||||
| 	path = vendor/grammars/shaders-tmLanguage | ||||
| 	url = https://github.com/tgjones/shaders-tmLanguage | ||||
| [submodule "vendor/grammars/language-meson"] | ||||
| 	path = vendor/grammars/language-meson | ||||
| 	url = https://github.com/TingPing/language-meson | ||||
| [submodule "vendor/grammars/atom-language-p4"] | ||||
| 	path = vendor/grammars/atom-language-p4 | ||||
| 	url = https://github.com/TakeshiTseng/atom-language-p4 | ||||
| [submodule "vendor/grammars/language-jison"] | ||||
| 	path = vendor/grammars/language-jison | ||||
| 	url = https://github.com/cdibbs/language-jison | ||||
| [submodule "vendor/grammars/openscad.tmbundle"] | ||||
| 	path = vendor/grammars/openscad.tmbundle | ||||
| 	url = https://github.com/tbuser/openscad.tmbundle | ||||
| [submodule "vendor/grammars/marko-tmbundle"] | ||||
| 	path = vendor/grammars/marko-tmbundle | ||||
| 	url = https://github.com/marko-js/marko-tmbundle | ||||
|   | ||||
							
								
								
									
										15
									
								
								.travis.yml
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								.travis.yml
									
									
									
									
									
								
							| @@ -1,20 +1,33 @@ | ||||
| language: ruby | ||||
| sudo: false | ||||
|  | ||||
| addons: | ||||
|   apt: | ||||
|     packages: | ||||
|     - libicu-dev | ||||
|     - libicu48 | ||||
|  | ||||
| before_install: script/travis/before_install | ||||
|  | ||||
| script: | ||||
|   - bundle exec rake | ||||
|   - script/licensed verify | ||||
|  | ||||
| rvm: | ||||
|   - 2.0.0 | ||||
|   - 2.1 | ||||
|   - 2.2 | ||||
|   - 2.3.3 | ||||
|   - 2.4.0 | ||||
|  | ||||
| matrix: | ||||
|   allow_failures: | ||||
|   - rvm: 2.4.0 | ||||
|  | ||||
| notifications: | ||||
|   disabled: true | ||||
|  | ||||
| git: | ||||
|   submodules: false | ||||
|   depth: 3 | ||||
|  | ||||
| cache: bundler | ||||
|   | ||||
| @@ -32,7 +32,7 @@ Linguist supports a number of different custom overrides strategies for language | ||||
|  | ||||
| ### Using gitattributes | ||||
|  | ||||
| Add a `.gitattributes` file to your project and use standard git-style path matchers for the files you want to override to set `linguist-documentation`, `linguist-language`, and `linguist-vendored`. `.gitattributes` will be used to determine language statistics, but will not be used to syntax highlight files. To manually set syntax highlighting, use [Vim or Emacs modelines](#using-emacs-or-vim-modelines). | ||||
| Add a `.gitattributes` file to your project and use standard git-style path matchers for the files you want to override to set `linguist-documentation`, `linguist-language`, and `linguist-vendored`. `.gitattributes` will be used to determine language statistics and will be used to syntax highlight files. You can also manually set syntax highlighting using [Vim or Emacs modelines](#using-emacs-or-vim-modelines). | ||||
|  | ||||
| ``` | ||||
| $ cat .gitattributes | ||||
| @@ -71,7 +71,7 @@ See [Linguist::Generated#generated?](https://github.com/github/linguist/blob/mas | ||||
|  | ||||
| ### Using Emacs or Vim modelines | ||||
|  | ||||
| Alternatively, you can use Vim or Emacs style modelines to set the language for a single file. Modelines can be placed anywhere within a file and are respected when determining how to syntax-highlight a file on GitHub.com | ||||
| If you do not want to use `.gitattributes` to override the syntax highlighting used on GitHub.com, you can use Vim or Emacs style modelines to set the language for a single file. Modelines can be placed anywhere within a file and are respected when determining how to syntax-highlight a file on GitHub.com | ||||
|  | ||||
| ##### Vim | ||||
| ``` | ||||
|   | ||||
| @@ -26,5 +26,5 @@ Gem::Specification.new do |s| | ||||
|   s.add_development_dependency 'yajl-ruby' | ||||
|   s.add_development_dependency 'color-proximity', '~> 0.2.1' | ||||
|   s.add_development_dependency 'licensed' | ||||
|   s.add_development_dependency 'licensee', '>= 8.6.0' | ||||
|   s.add_development_dependency 'licensee', '~> 8.8.0' | ||||
| end | ||||
|   | ||||
							
								
								
									
										28
									
								
								grammars.yml
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								grammars.yml
									
									
									
									
									
								
							| @@ -56,6 +56,8 @@ vendor/grammars/MQL5-sublime: | ||||
| vendor/grammars/MagicPython: | ||||
| - source.python | ||||
| - source.regexp.python | ||||
| - text.python.console | ||||
| - text.python.traceback | ||||
| vendor/grammars/Modelica: | ||||
| - source.modelica | ||||
| vendor/grammars/NSIS: | ||||
| @@ -130,6 +132,8 @@ vendor/grammars/TLA: | ||||
| - source.tla | ||||
| vendor/grammars/TXL: | ||||
| - source.txl | ||||
| vendor/grammars/Terraform.tmLanguage: | ||||
| - source.terraform | ||||
| vendor/grammars/Textmate-Gosu-Bundle: | ||||
| - source.gosu.2 | ||||
| vendor/grammars/UrWeb-Language-Definition: | ||||
| @@ -180,6 +184,9 @@ vendor/grammars/atom-language-1c-bsl: | ||||
| - source.sdbl | ||||
| vendor/grammars/atom-language-clean: | ||||
| - source.clean | ||||
| - source.gfm.clean | ||||
| vendor/grammars/atom-language-p4: | ||||
| - source.p4 | ||||
| vendor/grammars/atom-language-perl6: | ||||
| - source.meta-info | ||||
| - source.perl6fe | ||||
| @@ -220,7 +227,6 @@ vendor/grammars/capnproto.tmbundle: | ||||
| vendor/grammars/carto-atom: | ||||
| - source.css.mss | ||||
| vendor/grammars/ceylon-sublimetext: | ||||
| - module.ceylon | ||||
| - source.ceylon | ||||
| vendor/grammars/chapel-tmbundle: | ||||
| - source.chapel | ||||
| @@ -399,6 +405,11 @@ vendor/grammars/language-javascript: | ||||
| - source.js | ||||
| - source.js.regexp | ||||
| - source.js.regexp.replacement | ||||
| - source.jsdoc | ||||
| vendor/grammars/language-jison: | ||||
| - source.jison | ||||
| - source.jisonlex | ||||
| - source.jisonlex-injection | ||||
| vendor/grammars/language-jsoniq: | ||||
| - source.jq | ||||
| - source.xq | ||||
| @@ -406,24 +417,24 @@ vendor/grammars/language-less: | ||||
| - source.css.less | ||||
| vendor/grammars/language-maxscript: | ||||
| - source.maxscript | ||||
| vendor/grammars/language-meson: | ||||
| - source.meson | ||||
| vendor/grammars/language-ncl: | ||||
| - source.ncl | ||||
| vendor/grammars/language-ninja: | ||||
| - source.ninja | ||||
| vendor/grammars/language-povray: | ||||
| - source.pov-ray sdl | ||||
| vendor/grammars/language-python: | ||||
| - text.python.console | ||||
| - text.python.traceback | ||||
| vendor/grammars/language-regexp: | ||||
| - source.regexp | ||||
| - source.regexp.comment | ||||
| - source.regexp.extended | ||||
| vendor/grammars/language-renpy: | ||||
| - source.renpy | ||||
| vendor/grammars/language-restructuredtext: | ||||
| - text.restructuredtext | ||||
| vendor/grammars/language-roff: | ||||
| - source.ditroff | ||||
| - source.ditroff.desc | ||||
| - source.ideal | ||||
| - source.pic | ||||
| - text.roff | ||||
| @@ -478,6 +489,8 @@ vendor/grammars/make.tmbundle: | ||||
| - source.makefile | ||||
| vendor/grammars/mako-tmbundle: | ||||
| - text.html.mako | ||||
| vendor/grammars/marko-tmbundle: | ||||
| - text.marko | ||||
| vendor/grammars/mathematica-tmbundle: | ||||
| - source.mathematica | ||||
| vendor/grammars/matlab.tmbundle: | ||||
| @@ -515,6 +528,8 @@ vendor/grammars/ooc.tmbundle: | ||||
| - source.ooc | ||||
| vendor/grammars/opa.tmbundle: | ||||
| - source.opa | ||||
| vendor/grammars/openscad.tmbundle: | ||||
| - source.scad | ||||
| vendor/grammars/oz-tmbundle/Syntaxes/Oz.tmLanguage: | ||||
| - source.oz | ||||
| vendor/grammars/parrot: | ||||
| @@ -571,6 +586,9 @@ vendor/grammars/scilab.tmbundle: | ||||
| - source.scilab | ||||
| vendor/grammars/secondlife-lsl: | ||||
| - source.lsl | ||||
| vendor/grammars/shaders-tmLanguage: | ||||
| - source.hlsl | ||||
| - source.shaderlab | ||||
| vendor/grammars/smali-sublime: | ||||
| - source.smali | ||||
| vendor/grammars/smalltalk-tmbundle: | ||||
|   | ||||
| @@ -15,9 +15,9 @@ class << Linguist | ||||
|   #       see Linguist::LazyBlob and Linguist::FileBlob for examples | ||||
|   # | ||||
|   # Returns Language or nil. | ||||
|   def detect(blob) | ||||
|   def detect(blob, allow_empty: false) | ||||
|     # Bail early if the blob is binary or empty. | ||||
|     return nil if blob.likely_binary? || blob.binary? || blob.empty? | ||||
|     return nil if blob.likely_binary? || blob.binary? || (!allow_empty && blob.empty?) | ||||
|  | ||||
|     Linguist.instrument("linguist.detection", :blob => blob) do | ||||
|       # Call each strategy until one candidate is returned. | ||||
|   | ||||
| @@ -9,11 +9,12 @@ | ||||
|  | ||||
| ## Documentation directories ## | ||||
|  | ||||
| - ^docs?/ | ||||
| - ^[Dd]ocs?/ | ||||
| - (^|/)[Dd]ocumentation/ | ||||
| - (^|/)javadoc/ | ||||
| - ^man/ | ||||
| - (^|/)[Jj]avadoc/ | ||||
| - ^[Mm]an/ | ||||
| - ^[Ee]xamples/ | ||||
| - ^[Dd]emos?/ | ||||
|  | ||||
| ## Documentation files ## | ||||
|  | ||||
| @@ -27,4 +28,4 @@ | ||||
| - (^|/)[Rr]eadme(\.|$) | ||||
|  | ||||
| # Samples folders | ||||
| - ^[Ss]amples/ | ||||
| - ^[Ss]amples?/ | ||||
|   | ||||
| @@ -264,6 +264,8 @@ module Linguist | ||||
|         Language["Markdown"] | ||||
|       elsif /^(;;|\(define_)/.match(data) | ||||
|         Language["GCC machine description"] | ||||
|       else | ||||
|         Language["Markdown"] | ||||
|       end | ||||
|     end | ||||
|  | ||||
| @@ -465,5 +467,13 @@ module Linguist | ||||
|         Language["Scilab"] | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     disambiguate ".tsx" do |data| | ||||
|       if /^\s*(import.+(from\s+|require\()['"]react|\/\/\/\s*<reference\s)/.match(data) | ||||
|         Language["TypeScript"] | ||||
|       elsif /^\s*<\?xml\s+version/i.match(data) | ||||
|         Language["XML"] | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -1588,7 +1588,7 @@ HCL: | ||||
|   ace_mode: ruby | ||||
|   codemirror_mode: ruby | ||||
|   codemirror_mime_type: text/x-ruby | ||||
|   tm_scope: source.ruby | ||||
|   tm_scope: source.terraform | ||||
|   language_id: 144 | ||||
| HLSL: | ||||
|   type: programming | ||||
| @@ -1598,7 +1598,7 @@ HLSL: | ||||
|   - ".fxh" | ||||
|   - ".hlsli" | ||||
|   ace_mode: text | ||||
|   tm_scope: none | ||||
|   tm_scope: source.hlsl | ||||
|   language_id: 145 | ||||
| HTML: | ||||
|   type: markup | ||||
| @@ -2023,6 +2023,22 @@ JavaScript: | ||||
|   interpreters: | ||||
|   - node | ||||
|   language_id: 183 | ||||
| Jison: | ||||
|   type: programming | ||||
|   group: Yacc | ||||
|   extensions: | ||||
|   - ".jison" | ||||
|   tm_scope: source.jison | ||||
|   ace_mode: text | ||||
|   language_id: 284531423 | ||||
| Jison Lex: | ||||
|   type: programming | ||||
|   group: Lex | ||||
|   extensions: | ||||
|   - ".jisonlex" | ||||
|   tm_scope: source.jisonlex | ||||
|   ace_mode: text | ||||
|   language_id: 406395330 | ||||
| Julia: | ||||
|   type: programming | ||||
|   extensions: | ||||
| @@ -2440,6 +2456,8 @@ Mako: | ||||
|   language_id: 221 | ||||
| Markdown: | ||||
|   type: prose | ||||
|   aliases: | ||||
|   - pandoc | ||||
|   ace_mode: markdown | ||||
|   codemirror_mode: gfm | ||||
|   codemirror_mime_type: text/x-gfm | ||||
| @@ -2447,12 +2465,26 @@ Markdown: | ||||
|   extensions: | ||||
|   - ".md" | ||||
|   - ".markdown" | ||||
|   - ".mdown" | ||||
|   - ".mdwn" | ||||
|   - ".mkd" | ||||
|   - ".mkdn" | ||||
|   - ".mkdown" | ||||
|   - ".ron" | ||||
|   tm_scope: source.gfm | ||||
|   language_id: 222 | ||||
| Marko: | ||||
|   group: HTML | ||||
|   type: markup | ||||
|   tm_scope: text.marko | ||||
|   extensions: | ||||
|   - ".marko" | ||||
|   aliases: | ||||
|   - markojs | ||||
|   ace_mode: text | ||||
|   codemirror_mode: htmlmixed | ||||
|   codemirror_mime_type: text/html | ||||
|   language_id: 932782397 | ||||
| Mask: | ||||
|   type: markup | ||||
|   color: "#f97732" | ||||
| @@ -2537,6 +2569,15 @@ Mercury: | ||||
|   - ".moo" | ||||
|   tm_scope: source.mercury | ||||
|   language_id: 229 | ||||
| Meson: | ||||
|   type: programming | ||||
|   color: "#007800" | ||||
|   filenames: | ||||
|   - meson.build | ||||
|   - meson_options.txt | ||||
|   tm_scope: source.meson | ||||
|   ace_mode: text | ||||
|   language_id: 799141244 | ||||
| Metal: | ||||
|   type: programming | ||||
|   color: "#8f14e9" | ||||
| @@ -2905,7 +2946,7 @@ OpenSCAD: | ||||
|   type: programming | ||||
|   extensions: | ||||
|   - ".scad" | ||||
|   tm_scope: none | ||||
|   tm_scope: source.scad | ||||
|   ace_mode: scad | ||||
|   language_id: 266 | ||||
| OpenType Feature File: | ||||
| @@ -2952,6 +2993,14 @@ Oz: | ||||
|   codemirror_mode: oz | ||||
|   codemirror_mime_type: text/x-oz | ||||
|   language_id: 270 | ||||
| P4: | ||||
|   type: programming | ||||
|   color: "#7055b5" | ||||
|   extensions: | ||||
|   - ".p4" | ||||
|   tm_scope: source.p4 | ||||
|   ace_mode: text | ||||
|   language_id: 348895984 | ||||
| PAWN: | ||||
|   type: programming | ||||
|   color: "#dbb284" | ||||
| @@ -3372,6 +3421,7 @@ Python: | ||||
|   - SConscript | ||||
|   - SConstruct | ||||
|   - Snakefile | ||||
|   - WORKSPACE | ||||
|   - wscript | ||||
|   interpreters: | ||||
|   - python | ||||
| @@ -3704,6 +3754,7 @@ Ruby: | ||||
|   extensions: | ||||
|   - ".rb" | ||||
|   - ".builder" | ||||
|   - ".eye" | ||||
|   - ".fcgi" | ||||
|   - ".gemspec" | ||||
|   - ".god" | ||||
| @@ -4696,6 +4747,7 @@ XML: | ||||
|   - ".vcxproj" | ||||
|   - ".vssettings" | ||||
|   - ".vxml" | ||||
|   - ".wixproj" | ||||
|   - ".wsdl" | ||||
|   - ".wsf" | ||||
|   - ".wxi" | ||||
|   | ||||
| @@ -1,3 +1,3 @@ | ||||
| module Linguist | ||||
|   VERSION = "5.0.5" | ||||
|   VERSION = "5.0.8" | ||||
| end | ||||
|   | ||||
							
								
								
									
										135
									
								
								samples/HCL/main.tf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								samples/HCL/main.tf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,135 @@ | ||||
| resource "aws_security_group" "elb_sec_group" { | ||||
|   description = "Allow traffic from the internet to ELB port 80" | ||||
|   vpc_id = "${var.vpc_id}" | ||||
|  | ||||
|   ingress { | ||||
|       from_port = 80 | ||||
|       to_port = 80 | ||||
|       protocol = "tcp" | ||||
|       cidr_blocks = ["${split(",", var.allowed_cidr_blocks)}"] | ||||
|   } | ||||
|  | ||||
|   egress { | ||||
|       from_port = 0 | ||||
|       to_port = 0 | ||||
|       protocol = "-1" | ||||
|       cidr_blocks = ["0.0.0.0/0"] | ||||
|   } | ||||
| } | ||||
|  | ||||
| resource "aws_security_group" "dokku_allow_ssh_from_internal" { | ||||
|   description = "Allow git access over ssh from the private subnet" | ||||
|   vpc_id = "${var.vpc_id}" | ||||
|  | ||||
|   ingress { | ||||
|       from_port = 22 | ||||
|       to_port = 22 | ||||
|       protocol = "tcp" | ||||
|       cidr_blocks = ["${var.private_subnet_cidr}"] | ||||
|   } | ||||
|  | ||||
|   egress { | ||||
|       from_port = 0 | ||||
|       to_port = 0 | ||||
|       protocol = "-1" | ||||
|       cidr_blocks = ["0.0.0.0/0"] | ||||
|   } | ||||
| } | ||||
|  | ||||
| resource "aws_security_group" "allow_from_elb_to_instance" { | ||||
|   description = "Allow traffic from the ELB to the private instance" | ||||
|   vpc_id = "${var.vpc_id}" | ||||
|  | ||||
|   ingress { | ||||
|       security_groups = ["${aws_security_group.elb_sec_group.id}"] | ||||
|       from_port = 80 | ||||
|       to_port = 80 | ||||
|       protocol = "tcp" | ||||
|   } | ||||
|  | ||||
|   egress { | ||||
|       from_port = 0 | ||||
|       to_port = 0 | ||||
|       protocol = "-1" | ||||
|       cidr_blocks = ["0.0.0.0/0"] | ||||
|   } | ||||
| } | ||||
|  | ||||
| resource "aws_instance" "dokku" { | ||||
|   ami = "ami-47a23a30" | ||||
|   instance_type = "${var.instance_type}" | ||||
|   associate_public_ip_address = false | ||||
|   key_name = "${var.key_name}" | ||||
|   subnet_id = "${var.private_subnet_id}" | ||||
|   vpc_security_group_ids = [ | ||||
|     "${var.bastion_sec_group_id}", | ||||
|     "${aws_security_group.allow_from_elb_to_instance.id}", | ||||
|     "${aws_security_group.dokku_allow_ssh_from_internal.id}" | ||||
|   ] | ||||
|   tags { | ||||
|     Name = "${var.name}" | ||||
|   } | ||||
|   connection { | ||||
|     user = "ubuntu" | ||||
|     private_key = "${var.private_key}" | ||||
|     bastion_host = "${var.bastion_host}" | ||||
|     bastion_port = "${var.bastion_port}" | ||||
|     bastion_user = "${var.bastion_user}" | ||||
|     bastion_private_key = "${var.bastion_private_key}" | ||||
|   } | ||||
|   provisioner "file" { | ||||
|     source = "${path.module}/../scripts/install-dokku.sh" | ||||
|     destination = "/home/ubuntu/install-dokku.sh" | ||||
|   } | ||||
|   provisioner "remote-exec" { | ||||
|     inline = [ | ||||
|       "chmod +x /home/ubuntu/install-dokku.sh", | ||||
|       "HOSTNAME=${var.hostname} /home/ubuntu/install-dokku.sh" | ||||
|     ] | ||||
|   } | ||||
| } | ||||
|  | ||||
| resource "aws_elb" "elb_dokku" { | ||||
|   name = "elb-dokku-${var.name}" | ||||
|   subnets = ["${var.public_subnet_id}"] | ||||
|   security_groups = ["${aws_security_group.elb_sec_group.id}"] | ||||
|  | ||||
|   listener { | ||||
|     instance_port = 80 | ||||
|     instance_protocol = "http" | ||||
|     lb_port = 80 | ||||
|     lb_protocol = "http" | ||||
|   } | ||||
|  | ||||
|   health_check { | ||||
|     healthy_threshold = 2 | ||||
|     unhealthy_threshold = 2 | ||||
|     timeout = 3 | ||||
|     target = "HTTP:80/" | ||||
|     interval = 30 | ||||
|   } | ||||
|  | ||||
|   instances = ["${aws_instance.dokku.id}"] | ||||
|   cross_zone_load_balancing = false | ||||
|   idle_timeout = 400 | ||||
|  | ||||
|   tags { | ||||
|     Name = "elb-dokku-${var.name}" | ||||
|   } | ||||
| } | ||||
|  | ||||
| resource "aws_route53_record" "dokku-deploy" { | ||||
|    zone_id = "${var.zone_id}" | ||||
|    name = "deploy.${var.hostname}" | ||||
|    type = "A" | ||||
|    ttl = "300" | ||||
|    records = ["${aws_instance.dokku.private_ip}"] | ||||
| } | ||||
|  | ||||
| resource "aws_route53_record" "dokku-wildcard" { | ||||
|    zone_id = "${var.zone_id}" | ||||
|    name = "*.${var.hostname}" | ||||
|    type = "CNAME" | ||||
|    ttl = "300" | ||||
|    records = ["${aws_elb.elb_dokku.dns_name}"] | ||||
| } | ||||
							
								
								
									
										39
									
								
								samples/Jison Lex/classy.jisonlex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								samples/Jison Lex/classy.jisonlex
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| digit                       [0-9] | ||||
| id                          [a-zA-Z][a-zA-Z0-9]* | ||||
|  | ||||
| %% | ||||
| "//".*                      /* ignore comment */ | ||||
| "main"                      return 'MAIN'; | ||||
| "class"                     return 'CLASS'; | ||||
| "extends"                   return 'EXTENDS'; | ||||
| "nat"                       return 'NATTYPE'; | ||||
| "if"                        return 'IF'; | ||||
| "else"                      return 'ELSE'; | ||||
| "for"                       return 'FOR'; | ||||
| "printNat"                  return 'PRINTNAT'; | ||||
| "readNat"                   return 'READNAT'; | ||||
| "this"                      return 'THIS'; | ||||
| "new"                       return 'NEW'; | ||||
| "var"                       return 'VAR'; | ||||
| "null"                      return 'NUL'; | ||||
| {digit}+                    return 'NATLITERAL'; | ||||
| {id}                        return 'ID'; | ||||
| "=="                        return 'EQUALITY'; | ||||
| "="                         return 'ASSIGN'; | ||||
| "+"                         return 'PLUS'; | ||||
| "-"                         return 'MINUS'; | ||||
| "*"                         return 'TIMES'; | ||||
| ">"                         return 'GREATER'; | ||||
| "||"                        return 'OR'; | ||||
| "!"                         return 'NOT'; | ||||
| "."                         return 'DOT'; | ||||
| "{"                         return 'LBRACE'; | ||||
| "}"                         return 'RBRACE'; | ||||
| "("                         return 'LPAREN'; | ||||
| ")"                         return 'RPAREN'; | ||||
| ";"                         return 'SEMICOLON'; | ||||
| \s+                         /* skip whitespace */ | ||||
| "."                         throw 'Illegal character'; | ||||
| <<EOF>>                     return 'ENDOFFILE'; | ||||
|  | ||||
|  | ||||
							
								
								
									
										29
									
								
								samples/Jison Lex/lex_grammar.jisonlex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								samples/Jison Lex/lex_grammar.jisonlex
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
|  | ||||
| %% | ||||
| \n+                         {yy.freshLine = true;} | ||||
| \s+                         {yy.freshLine = false;} | ||||
| "y{"[^}]*"}"                {yytext = yytext.substr(2, yyleng - 3); return 'ACTION';} | ||||
| [a-zA-Z_][a-zA-Z0-9_-]*     {return 'NAME';} | ||||
| '"'([^"]|'\"')*'"'          {return 'STRING_LIT';} | ||||
| "'"([^']|"\'")*"'"          {return 'STRING_LIT';} | ||||
| "|"                         {return '|';} | ||||
| "["("\]"|[^\]])*"]"         {return 'ANY_GROUP_REGEX';} | ||||
| "("                         {return '(';} | ||||
| ")"                         {return ')';} | ||||
| "+"                         {return '+';} | ||||
| "*"                         {return '*';} | ||||
| "?"                         {return '?';} | ||||
| "^"                         {return '^';} | ||||
| "/"                         {return '/';} | ||||
| "\\"[a-zA-Z0]               {return 'ESCAPE_CHAR';} | ||||
| "$"                         {return '$';} | ||||
| "<<EOF>>"                   {return '$';} | ||||
| "."                         {return '.';} | ||||
| "%%"                        {return '%%';} | ||||
| "{"\d+(","\s?\d+|",")?"}"   {return 'RANGE_REGEX';} | ||||
| /"{"                        %{if (yy.freshLine) { this.input('{'); return '{'; } else { this.unput('y'); }%} | ||||
| "}"                         %{return '}';%} | ||||
| "%{"(.|\n)*?"}%"            {yytext = yytext.substr(2, yyleng - 4); return 'ACTION';} | ||||
| .                           {/* ignore bad characters */} | ||||
| <<EOF>>                     {return 'EOF';} | ||||
|  | ||||
							
								
								
									
										418
									
								
								samples/Jison/ansic.jison
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										418
									
								
								samples/Jison/ansic.jison
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,418 @@ | ||||
| %token IDENTIFIER CONSTANT STRING_LITERAL SIZEOF | ||||
| %token PTR_OP INC_OP DEC_OP LEFT_OP RIGHT_OP LE_OP GE_OP EQ_OP NE_OP | ||||
| %token AND_OP OR_OP MUL_ASSIGN DIV_ASSIGN MOD_ASSIGN ADD_ASSIGN | ||||
| %token SUB_ASSIGN LEFT_ASSIGN RIGHT_ASSIGN AND_ASSIGN | ||||
| %token XOR_ASSIGN OR_ASSIGN TYPE_NAME | ||||
|  | ||||
| %token TYPEDEF EXTERN STATIC AUTO REGISTER | ||||
| %token CHAR SHORT INT LONG SIGNED UNSIGNED FLOAT DOUBLE CONST VOLATILE VOID | ||||
| %token STRUCT UNION ENUM ELLIPSIS | ||||
|  | ||||
| %token CASE DEFAULT IF ELSE SWITCH WHILE DO FOR GOTO CONTINUE BREAK RETURN | ||||
|  | ||||
| %nonassoc IF_WITHOUT_ELSE | ||||
| %nonassoc ELSE | ||||
|  | ||||
| %start translation_unit | ||||
| %% | ||||
|  | ||||
| primary_expression | ||||
|     : IDENTIFIER | ||||
|     | CONSTANT | ||||
|     | STRING_LITERAL | ||||
|     | '(' expression ')' | ||||
|     ; | ||||
|  | ||||
| postfix_expression | ||||
|     : primary_expression | ||||
|     | postfix_expression '[' expression ']' | ||||
|     | postfix_expression '(' ')' | ||||
|     | postfix_expression '(' argument_expression_list ')' | ||||
|     | postfix_expression '.' IDENTIFIER | ||||
|     | postfix_expression PTR_OP IDENTIFIER | ||||
|     | postfix_expression INC_OP | ||||
|     | postfix_expression DEC_OP | ||||
|     ; | ||||
|  | ||||
| argument_expression_list | ||||
|     : assignment_expression | ||||
|     | argument_expression_list ',' assignment_expression | ||||
|     ; | ||||
|  | ||||
| unary_expression | ||||
|     : postfix_expression | ||||
|     | INC_OP unary_expression | ||||
|     | DEC_OP unary_expression | ||||
|     | unary_operator cast_expression | ||||
|     | SIZEOF unary_expression | ||||
|     | SIZEOF '(' type_name ')' | ||||
|     ; | ||||
|  | ||||
| unary_operator | ||||
|     : '&' | ||||
|     | '*' | ||||
|     | '+' | ||||
|     | '-' | ||||
|     | '~' | ||||
|     | '!' | ||||
|     ; | ||||
|  | ||||
| cast_expression | ||||
|     : unary_expression | ||||
|     | '(' type_name ')' cast_expression | ||||
|     ; | ||||
|  | ||||
| multiplicative_expression | ||||
|     : cast_expression | ||||
|     | multiplicative_expression '*' cast_expression | ||||
|     | multiplicative_expression '/' cast_expression | ||||
|     | multiplicative_expression '%' cast_expression | ||||
|     ; | ||||
|  | ||||
| additive_expression | ||||
|     : multiplicative_expression | ||||
|     | additive_expression '+' multiplicative_expression | ||||
|     | additive_expression '-' multiplicative_expression | ||||
|     ; | ||||
|  | ||||
| shift_expression | ||||
|     : additive_expression | ||||
|     | shift_expression LEFT_OP additive_expression | ||||
|     | shift_expression RIGHT_OP additive_expression | ||||
|     ; | ||||
|  | ||||
| relational_expression | ||||
|     : shift_expression | ||||
|     | relational_expression '<' shift_expression | ||||
|     | relational_expression '>' shift_expression | ||||
|     | relational_expression LE_OP shift_expression | ||||
|     | relational_expression GE_OP shift_expression | ||||
|     ; | ||||
|  | ||||
| equality_expression | ||||
|     : relational_expression | ||||
|     | equality_expression EQ_OP relational_expression | ||||
|     | equality_expression NE_OP relational_expression | ||||
|     ; | ||||
|  | ||||
| and_expression | ||||
|     : equality_expression | ||||
|     | and_expression '&' equality_expression | ||||
|     ; | ||||
|  | ||||
| exclusive_or_expression | ||||
|     : and_expression | ||||
|     | exclusive_or_expression '^' and_expression | ||||
|     ; | ||||
|  | ||||
| inclusive_or_expression | ||||
|     : exclusive_or_expression | ||||
|     | inclusive_or_expression '|' exclusive_or_expression | ||||
|     ; | ||||
|  | ||||
| logical_and_expression | ||||
|     : inclusive_or_expression | ||||
|     | logical_and_expression AND_OP inclusive_or_expression | ||||
|     ; | ||||
|  | ||||
| logical_or_expression | ||||
|     : logical_and_expression | ||||
|     | logical_or_expression OR_OP logical_and_expression | ||||
|     ; | ||||
|  | ||||
| conditional_expression | ||||
|     : logical_or_expression | ||||
|     | logical_or_expression '?' expression ':' conditional_expression | ||||
|     ; | ||||
|  | ||||
| assignment_expression | ||||
|     : conditional_expression | ||||
|     | unary_expression assignment_operator assignment_expression | ||||
|     ; | ||||
|  | ||||
| assignment_operator | ||||
|     : '=' | ||||
|     | MUL_ASSIGN | ||||
|     | DIV_ASSIGN | ||||
|     | MOD_ASSIGN | ||||
|     | ADD_ASSIGN | ||||
|     | SUB_ASSIGN | ||||
|     | LEFT_ASSIGN | ||||
|     | RIGHT_ASSIGN | ||||
|     | AND_ASSIGN | ||||
|     | XOR_ASSIGN | ||||
|     | OR_ASSIGN | ||||
|     ; | ||||
|  | ||||
| expression | ||||
|     : assignment_expression | ||||
|     | expression ',' assignment_expression | ||||
|     ; | ||||
|  | ||||
| constant_expression | ||||
|     : conditional_expression | ||||
|     ; | ||||
|  | ||||
| declaration | ||||
|     : declaration_specifiers ';' | ||||
|     | declaration_specifiers init_declarator_list ';' | ||||
|     ; | ||||
|  | ||||
| declaration_specifiers | ||||
|     : storage_class_specifier | ||||
|     | storage_class_specifier declaration_specifiers | ||||
|     | type_specifier | ||||
|     | type_specifier declaration_specifiers | ||||
|     | type_qualifier | ||||
|     | type_qualifier declaration_specifiers | ||||
|     ; | ||||
|  | ||||
| init_declarator_list | ||||
|     : init_declarator | ||||
|     | init_declarator_list ',' init_declarator | ||||
|     ; | ||||
|  | ||||
| init_declarator | ||||
|     : declarator | ||||
|     | declarator '=' initializer | ||||
|     ; | ||||
|  | ||||
| storage_class_specifier | ||||
|     : TYPEDEF | ||||
|     | EXTERN | ||||
|     | STATIC | ||||
|     | AUTO | ||||
|     | REGISTER | ||||
|     ; | ||||
|  | ||||
| type_specifier | ||||
|     : VOID | ||||
|     | CHAR | ||||
|     | SHORT | ||||
|     | INT | ||||
|     | LONG | ||||
|     | FLOAT | ||||
|     | DOUBLE | ||||
|     | SIGNED | ||||
|     | UNSIGNED | ||||
|     | struct_or_union_specifier | ||||
|     | enum_specifier | ||||
|     | TYPE_NAME | ||||
|     ; | ||||
|  | ||||
| struct_or_union_specifier | ||||
|     : struct_or_union IDENTIFIER '{' struct_declaration_list '}' | ||||
|     | struct_or_union '{' struct_declaration_list '}' | ||||
|     | struct_or_union IDENTIFIER | ||||
|     ; | ||||
|  | ||||
| struct_or_union | ||||
|     : STRUCT | ||||
|     | UNION | ||||
|     ; | ||||
|  | ||||
| struct_declaration_list | ||||
|     : struct_declaration | ||||
|     | struct_declaration_list struct_declaration | ||||
|     ; | ||||
|  | ||||
| struct_declaration | ||||
|     : specifier_qualifier_list struct_declarator_list ';' | ||||
|     ; | ||||
|  | ||||
| specifier_qualifier_list | ||||
|     : type_specifier specifier_qualifier_list | ||||
|     | type_specifier | ||||
|     | type_qualifier specifier_qualifier_list | ||||
|     | type_qualifier | ||||
|     ; | ||||
|  | ||||
| struct_declarator_list | ||||
|     : struct_declarator | ||||
|     | struct_declarator_list ',' struct_declarator | ||||
|     ; | ||||
|  | ||||
| struct_declarator | ||||
|     : declarator | ||||
|     | ':' constant_expression | ||||
|     | declarator ':' constant_expression | ||||
|     ; | ||||
|  | ||||
| enum_specifier | ||||
|     : ENUM '{' enumerator_list '}' | ||||
|     | ENUM IDENTIFIER '{' enumerator_list '}' | ||||
|     | ENUM IDENTIFIER | ||||
|     ; | ||||
|  | ||||
| enumerator_list | ||||
|     : enumerator | ||||
|     | enumerator_list ',' enumerator | ||||
|     ; | ||||
|  | ||||
| enumerator | ||||
|     : IDENTIFIER | ||||
|     | IDENTIFIER '=' constant_expression | ||||
|     ; | ||||
|  | ||||
| type_qualifier | ||||
|     : CONST | ||||
|     | VOLATILE | ||||
|     ; | ||||
|  | ||||
| declarator | ||||
|     : pointer direct_declarator | ||||
|     | direct_declarator | ||||
|     ; | ||||
|  | ||||
| direct_declarator | ||||
|     : IDENTIFIER | ||||
|     | '(' declarator ')' | ||||
|     | direct_declarator '[' constant_expression ']' | ||||
|     | direct_declarator '[' ']' | ||||
|     | direct_declarator '(' parameter_type_list ')' | ||||
|     | direct_declarator '(' identifier_list ')' | ||||
|     | direct_declarator '(' ')' | ||||
|     ; | ||||
|  | ||||
| pointer | ||||
|     : '*' | ||||
|     | '*' type_qualifier_list | ||||
|     | '*' pointer | ||||
|     | '*' type_qualifier_list pointer | ||||
|     ; | ||||
|  | ||||
| type_qualifier_list | ||||
|     : type_qualifier | ||||
|     | type_qualifier_list type_qualifier | ||||
|     ; | ||||
|  | ||||
|  | ||||
| parameter_type_list | ||||
|     : parameter_list | ||||
|     | parameter_list ',' ELLIPSIS | ||||
|     ; | ||||
|  | ||||
| parameter_list | ||||
|     : parameter_declaration | ||||
|     | parameter_list ',' parameter_declaration | ||||
|     ; | ||||
|  | ||||
| parameter_declaration | ||||
|     : declaration_specifiers declarator | ||||
|     | declaration_specifiers abstract_declarator | ||||
|     | declaration_specifiers | ||||
|     ; | ||||
|  | ||||
| identifier_list | ||||
|     : IDENTIFIER | ||||
|     | identifier_list ',' IDENTIFIER | ||||
|     ; | ||||
|  | ||||
| type_name | ||||
|     : specifier_qualifier_list | ||||
|     | specifier_qualifier_list abstract_declarator | ||||
|     ; | ||||
|  | ||||
| abstract_declarator | ||||
|     : pointer | ||||
|     | direct_abstract_declarator | ||||
|     | pointer direct_abstract_declarator | ||||
|     ; | ||||
|  | ||||
| direct_abstract_declarator | ||||
|     : '(' abstract_declarator ')' | ||||
|     | '[' ']' | ||||
|     | '[' constant_expression ']' | ||||
|     | direct_abstract_declarator '[' ']' | ||||
|     | direct_abstract_declarator '[' constant_expression ']' | ||||
|     | '(' ')' | ||||
|     | '(' parameter_type_list ')' | ||||
|     | direct_abstract_declarator '(' ')' | ||||
|     | direct_abstract_declarator '(' parameter_type_list ')' | ||||
|     ; | ||||
|  | ||||
| initializer | ||||
|     : assignment_expression | ||||
|     | '{' initializer_list '}' | ||||
|     | '{' initializer_list ',' '}' | ||||
|     ; | ||||
|  | ||||
| initializer_list | ||||
|     : initializer | ||||
|     | initializer_list ',' initializer | ||||
|     ; | ||||
|  | ||||
| statement | ||||
|     : labeled_statement | ||||
|     | compound_statement | ||||
|     | expression_statement | ||||
|     | selection_statement | ||||
|     | iteration_statement | ||||
|     | jump_statement | ||||
|     ; | ||||
|  | ||||
| labeled_statement | ||||
|     : IDENTIFIER ':' statement | ||||
|     | CASE constant_expression ':' statement | ||||
|     | DEFAULT ':' statement | ||||
|     ; | ||||
|  | ||||
| compound_statement | ||||
|     : '{' '}' | ||||
|     | '{' statement_list '}' | ||||
|     | '{' declaration_list '}' | ||||
|     | '{' declaration_list statement_list '}' | ||||
|     ; | ||||
|  | ||||
| declaration_list | ||||
|     : declaration | ||||
|     | declaration_list declaration | ||||
|     ; | ||||
|  | ||||
| statement_list | ||||
|     : statement | ||||
|     | statement_list statement | ||||
|     ; | ||||
|  | ||||
| expression_statement | ||||
|     : ';' | ||||
|     | expression ';' | ||||
|     ; | ||||
|  | ||||
| selection_statement | ||||
|     : IF '(' expression ')' statement %prec IF_WITHOUT_ELSE | ||||
|     | IF '(' expression ')' statement ELSE statement | ||||
|     | SWITCH '(' expression ')' statement | ||||
|     ; | ||||
|  | ||||
| iteration_statement | ||||
|     : WHILE '(' expression ')' statement | ||||
|     | DO statement WHILE '(' expression ')' ';' | ||||
|     | FOR '(' expression_statement expression_statement ')' statement | ||||
|     | FOR '(' expression_statement expression_statement expression ')' statement | ||||
|     ; | ||||
|  | ||||
| jump_statement | ||||
|     : GOTO IDENTIFIER ';' | ||||
|     | CONTINUE ';' | ||||
|     | BREAK ';' | ||||
|     | RETURN ';' | ||||
|     | RETURN expression ';' | ||||
|     ; | ||||
|  | ||||
| translation_unit | ||||
|     : external_declaration | ||||
|     | translation_unit external_declaration | ||||
|     ; | ||||
|  | ||||
| external_declaration | ||||
|     : function_definition | ||||
|     | declaration | ||||
|     ; | ||||
|  | ||||
| function_definition | ||||
|     : declaration_specifiers declarator declaration_list compound_statement | ||||
|     | declaration_specifiers declarator compound_statement | ||||
|     | declarator declaration_list compound_statement | ||||
|     | declarator compound_statement | ||||
|     ; | ||||
							
								
								
									
										84
									
								
								samples/Jison/classy.jison
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								samples/Jison/classy.jison
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | ||||
|  | ||||
| /* description: ClassyLang grammar. Very classy. */ | ||||
| /* | ||||
|   To build parser: | ||||
|  | ||||
|     $ ./bin/jison examples/classy.jison examples/classy.jisonlex | ||||
|  | ||||
| */ | ||||
|  | ||||
|  | ||||
| /* author: Zach Carter */ | ||||
|  | ||||
| %right ASSIGN | ||||
| %left OR | ||||
| %nonassoc EQUALITY GREATER | ||||
| %left PLUS MINUS | ||||
| %left TIMES | ||||
| %right NOT | ||||
| %left DOT | ||||
|  | ||||
| %% | ||||
|  | ||||
| pgm | ||||
|     : cdl MAIN LBRACE vdl el RBRACE ENDOFFILE | ||||
|     ; | ||||
|  | ||||
| cdl | ||||
|     : c cdl | ||||
|     | | ||||
|     ; | ||||
|  | ||||
| c | ||||
|     : CLASS id EXTENDS id LBRACE vdl mdl RBRACE | ||||
|     ; | ||||
|  | ||||
| vdl | ||||
|     : VAR t id SEMICOLON vdl | ||||
|     | | ||||
|     ; | ||||
|  | ||||
| mdl | ||||
|     : t id LPAREN t id RPAREN LBRACE vdl el RBRACE mdl | ||||
|     | | ||||
|     ; | ||||
|  | ||||
| t | ||||
|     : NATTYPE | ||||
|     | id | ||||
|     ; | ||||
|  | ||||
| id | ||||
|     : ID | ||||
|     ; | ||||
|  | ||||
| el | ||||
|     : e SEMICOLON el | ||||
|     | e SEMICOLON | ||||
|     ; | ||||
|  | ||||
| e | ||||
|     : NATLITERAL | ||||
|     | NUL | ||||
|     | id | ||||
|     | NEW id | ||||
|     | THIS | ||||
|     | IF LPAREN e RPAREN LBRACE el RBRACE ELSE LBRACE el RBRACE | ||||
|     | FOR LPAREN e SEMICOLON e SEMICOLON e RPAREN LBRACE el RBRACE | ||||
|     | READNAT LPAREN RPAREN | ||||
|     | PRINTNAT LPAREN e RPAREN | ||||
|     | e PLUS e | ||||
|     | e MINUS e | ||||
|     | e TIMES e | ||||
|     | e EQUALITY e | ||||
|     | e GREATER e | ||||
|     | NOT e | ||||
|     | e OR e | ||||
|     | e DOT id | ||||
|     | id ASSIGN e | ||||
|     | e DOT id ASSIGN e | ||||
|     | id LPAREN e RPAREN | ||||
|     | e DOT id LPAREN e RPAREN | ||||
|     | LPAREN e RPAREN | ||||
|     ; | ||||
|  | ||||
							
								
								
									
										145
									
								
								samples/Jison/lex.jison
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										145
									
								
								samples/Jison/lex.jison
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,145 @@ | ||||
|  | ||||
| // `%nonassoc` tells the parser compiler (JISON) that these tokens cannot occur more than once, | ||||
| // i.e. input like '//a' (tokens '/', '/' and 'a') is not a legal input while '/a' (tokens '/' and 'a') | ||||
| // *is* legal input for this grammar. | ||||
|   | ||||
| %nonassoc '/' '/!' | ||||
|  | ||||
| // Likewise for `%left`: this informs the LALR(1) grammar compiler (JISON) that these tokens | ||||
| // *can* occur repeatedly, e.g. 'a?*' and even 'a**' are considered legal inputs given this | ||||
| // grammar! | ||||
| // | ||||
| // Token `RANGE_REGEX` may seem the odd one out here but really isn't: given the `regex_base` | ||||
| // choice/rule `regex_base range_regex`, which is recursive, this grammar tells JISON that  | ||||
| // any input matching a sequence like `regex_base range_regex range_regex` *is* legal. | ||||
| // If you do not want that to be legal, you MUST adjust the grammar rule set you match your | ||||
| // actual intent. | ||||
|  | ||||
| %left '*' '+' '?' RANGE_REGEX | ||||
|  | ||||
|  | ||||
| %%  | ||||
|  | ||||
| lex  | ||||
|     : definitions include '%%' rules '%%' EOF | ||||
|         {{ $$ = {macros: $1, rules: $4}; | ||||
|           if ($2) $$.actionInclude = $2; | ||||
|           return $$; }} | ||||
|     | definitions include '%%' rules EOF | ||||
|         {{ $$ = {macros: $1, rules: $4}; | ||||
|           if ($2) $$.actionInclude = $2; | ||||
|           return $$; }} | ||||
|     ; | ||||
|  | ||||
| include | ||||
|     : action | ||||
|     | | ||||
|     ; | ||||
|  | ||||
| definitions | ||||
|     : definitions definition | ||||
|         { $$ = $1; $$.concat($2); } | ||||
|     | definition | ||||
|         { $$ = [$1]; } | ||||
|     ; | ||||
|  | ||||
| definition | ||||
|     : name regex | ||||
|         { $$ = [$1, $2]; } | ||||
|     ; | ||||
|  | ||||
| name | ||||
|     : NAME | ||||
|         { $$ = yytext; } | ||||
|     ; | ||||
|  | ||||
| rules | ||||
|     : rules rule | ||||
|         { $$ = $1; $$.push($2); } | ||||
|     | rule | ||||
|         { $$ = [$1]; } | ||||
|     ; | ||||
|  | ||||
| rule | ||||
|     : regex action | ||||
|         { $$ = [$1, $2]; } | ||||
|     ; | ||||
|  | ||||
| action | ||||
|     : ACTION  | ||||
|         { $$ = yytext; } | ||||
|     ; | ||||
|  | ||||
| regex | ||||
|     : start_caret regex_list end_dollar | ||||
|         { $$ = $1+$2+$3; } | ||||
|     ; | ||||
|  | ||||
| start_caret | ||||
|     : '^' | ||||
|         { $$ = '^'; } | ||||
|     | | ||||
|         { $$ = ''; } | ||||
|     ; | ||||
|  | ||||
| end_dollar | ||||
|     : '$' | ||||
|         { $$ = '$'; } | ||||
|     | | ||||
|         { $$ = ''; } | ||||
|     ; | ||||
|  | ||||
| regex_list | ||||
|     : regex_list '|' regex_chain | ||||
|         { $$ = $1+'|'+$3; } | ||||
|     | regex_chain | ||||
|     ; | ||||
|  | ||||
| regex_chain | ||||
|     : regex_chain regex_base | ||||
|         { $$ = $1+$2;} | ||||
|     | regex_base | ||||
|         { $$ = $1;} | ||||
|     ; | ||||
|  | ||||
| regex_base | ||||
|     : '(' regex_list ')' | ||||
|         { $$ = '('+$2+')'; } | ||||
|     | regex_base '+' | ||||
|         { $$ = $1+'+'; } | ||||
|     | regex_base '*' | ||||
|         { $$ = $1+'*'; } | ||||
|     | regex_base '?' | ||||
|         { $$ = $1+'?'; } | ||||
|     | '/' regex_base | ||||
|         { $$ = '(?=' + $regex_base + ')'; } | ||||
|     | '/!' regex_base | ||||
|         { $$ = '(?!' + $regex_base + ')'; } | ||||
|     | name_expansion | ||||
|     | regex_base range_regex | ||||
|         { $$ = $1+$2; } | ||||
|     | any_group_regex | ||||
|     | '.' | ||||
|         { $$ = '.'; } | ||||
|     | string | ||||
|     ; | ||||
|  | ||||
| name_expansion | ||||
|     : '{' name '}' | ||||
|         {{ $$ = '{'+$2+'}'; }} | ||||
|     ; | ||||
|  | ||||
| any_group_regex | ||||
|     : ANY_GROUP_REGEX | ||||
|         { $$ = yytext; } | ||||
|     ; | ||||
|  | ||||
| range_regex | ||||
|     : RANGE_REGEX | ||||
|         { $$ = yytext; } | ||||
|     ; | ||||
|  | ||||
| string | ||||
|     : STRING_LIT | ||||
|         { $$ = yy.prepareString(yytext.substr(1, yyleng-2)); } | ||||
|     ; | ||||
							
								
								
									
										20
									
								
								samples/Markdown/README.mdown
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								samples/Markdown/README.mdown
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| # Installation | ||||
|  | ||||
| You can install this bundle in TextMate by opening the preferences and going to the bundles tab. After installation it will be automatically updated for you. | ||||
|  | ||||
| # General | ||||
|  | ||||
| * [Bundle Styleguide](http://kb.textmate.org/bundle_styleguide) — _before you make changes_ | ||||
| * [Commit Styleguide](http://kb.textmate.org/commit_styleguide) — _before you send a pull request_ | ||||
| * [Writing Bug Reports](http://kb.textmate.org/writing_bug_reports) — _before you report an issue_ | ||||
|  | ||||
| # License | ||||
|  | ||||
| If not otherwise specified (see below), files in this repository fall under the following license: | ||||
|  | ||||
| 	Permission to copy, use, modify, sell and distribute this | ||||
| 	software is granted. This software is provided "as is" without | ||||
| 	express or implied warranty, and with no claim as to its | ||||
| 	suitability for any purpose. | ||||
|  | ||||
| An exception is made for files in readable text which contain their own license information, or files where an accompanying file exists (in the same directory) with a “-license” suffix added to the base-name name of the original file, and an extension of txt, html, or similar. For example “tidy” is accompanied by “tidy-license.txt”. | ||||
							
								
								
									
										1
									
								
								samples/Markdown/minimal.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								samples/Markdown/minimal.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| _This_ is a **Markdown** readme. | ||||
							
								
								
									
										26
									
								
								samples/Marko/counter.marko
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								samples/Marko/counter.marko
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| class { | ||||
|     constructor() { | ||||
|         this.state = { count:0 }; | ||||
|     } | ||||
|     increment() { | ||||
|         this.state.count++; | ||||
|     } | ||||
| } | ||||
|  | ||||
| style { | ||||
|     .count { | ||||
|         color:#09c; | ||||
|         font-size:3em; | ||||
|     } | ||||
|     .example-button { | ||||
|         font-size:1em; | ||||
|         padding:0.5em; | ||||
|     } | ||||
| } | ||||
|  | ||||
| <div.count> | ||||
|     ${state.count} | ||||
| </div> | ||||
| <button.example-button on-click('increment')> | ||||
|     Click me! | ||||
| </button> | ||||
							
								
								
									
										15
									
								
								samples/Marko/hello.marko
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								samples/Marko/hello.marko
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| $ var name = 'Frank'; | ||||
| $ var colors = ['red', 'green', 'blue']; | ||||
|  | ||||
| <h1> | ||||
|     Hello ${name}! | ||||
| </h1> | ||||
|  | ||||
| <ul if(colors.length)> | ||||
|     <li style={color: color} for(color in colors)> | ||||
|         ${color} | ||||
|     </li> | ||||
| </ul> | ||||
| <div else> | ||||
|     No colors! | ||||
| </div> | ||||
							
								
								
									
										36
									
								
								samples/Marko/rgb-sliders.marko
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								samples/Marko/rgb-sliders.marko
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,36 @@ | ||||
| static const colors = ['red', 'green', 'blue']; | ||||
| static const defaultColor = [255, 0, 0]; | ||||
|  | ||||
| class { | ||||
| 	onInput(input) { | ||||
| 		this.state = { color: input.color || defaultColor }; | ||||
| 	} | ||||
|  | ||||
| 	updateColor() { | ||||
|     	this.state.color = colors.map((color) => { | ||||
|         	return parseInt(this.getEl(color + 'Input').value, 10); | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     getStyleColor() { | ||||
|     	return 'rgb(' + this.state.color.join(',') + ')'; | ||||
|     } | ||||
| } | ||||
|  | ||||
| <div.rgb-sliders> | ||||
|     <div.inputs> | ||||
|     	<for(i, color in colors)> | ||||
|         	<div> | ||||
|                 <label for-key=color+"Input"> | ||||
|                     ${color}: | ||||
|                 </label> | ||||
|                 <input type="range" max="255" | ||||
|                     key=color+"Input" | ||||
|                     on-input('updateColor') | ||||
|                     value=state.color[i] > | ||||
|             </div> | ||||
|         </for> | ||||
|     </div> | ||||
|     <div.color style={backgroundColor: component.getStyleColor()}> | ||||
|     </div> | ||||
| </div> | ||||
							
								
								
									
										51
									
								
								samples/Meson/filenames/meson.build
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								samples/Meson/filenames/meson.build
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | ||||
| project('test', ['c'], | ||||
|   version: '0.1.0' | ||||
| ) | ||||
|  | ||||
| # This is a comment test('foo') | ||||
|  | ||||
| add_global_arguments(['-foo']) | ||||
| add_global_link_arguments(['-foo']) | ||||
|  | ||||
| gnome = import('gnome') # As is this | ||||
|  | ||||
| gnome.do_something('test') | ||||
|  | ||||
| meson.source_root() | ||||
|  | ||||
| foreach foo: bar | ||||
|   foreach baz : foo | ||||
|     message(baz) | ||||
|   endforeach | ||||
| endforeach | ||||
|  | ||||
| blah = ''' | ||||
| afjoakjflajf  # Test | ||||
| lflkasjf | ||||
| test\'test | ||||
| test\\\\test | ||||
| test\ntest | ||||
| ''' | ||||
|  | ||||
| foo = '' | ||||
| foo = '''''' | ||||
| foo = 'string' | ||||
| foo = '''string2''' | ||||
| foo = 12314 | ||||
| foo = 1231.1231 | ||||
| foo = true | ||||
| foo = false | ||||
| foo = ['te\'st', 1, 3.3, '''test'''] | ||||
| foo += 1231 | ||||
| foo = '@0@'.format('test') | ||||
| foo = include_directories('foo', kwarg: 'bar', include_directories: 'foo') | ||||
| foo = true ? 'true' : 'false' | ||||
| foo = 2 - 1 + 3 % 8 / 4 * 3 | ||||
|  | ||||
| if true and false | ||||
| elif false or true | ||||
| elif true not false | ||||
| elif foo == 12 | ||||
| elif (foo != 124) and (foo <= 200) | ||||
| else | ||||
| endif | ||||
							
								
								
									
										3
									
								
								samples/Meson/filenames/meson_options.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								samples/Meson/filenames/meson_options.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| option('with-something', type: 'boolean', | ||||
|   value: true, | ||||
| ) | ||||
							
								
								
									
										329
									
								
								samples/P4/l2.p4
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										329
									
								
								samples/P4/l2.p4
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,329 @@ | ||||
| /* | ||||
| Copyright 2013-present Barefoot Networks, Inc.  | ||||
|  | ||||
| Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| you may not use this file except in compliance with the License. | ||||
| You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
| Unless required by applicable law or agreed to in writing, software | ||||
| distributed under the License is distributed on an "AS IS" BASIS, | ||||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| See the License for the specific language governing permissions and | ||||
| limitations under the License. | ||||
| */ | ||||
|  | ||||
| /* | ||||
|  * Layer-2 processing | ||||
|  */ | ||||
|  | ||||
| header_type l2_metadata_t { | ||||
|     fields { | ||||
|         lkp_pkt_type : 3; | ||||
|         lkp_mac_sa : 48; | ||||
|         lkp_mac_da : 48; | ||||
|         lkp_mac_type : 16; | ||||
|  | ||||
|         l2_nexthop : 16;                       /* next hop from l2 */ | ||||
|         l2_nexthop_type : 1;                   /* ecmp or nexthop */ | ||||
|         l2_redirect : 1;                       /* l2 redirect action */ | ||||
|         l2_src_miss : 1;                       /* l2 source miss */ | ||||
|         l2_src_move : IFINDEX_BIT_WIDTH;       /* l2 source interface mis-match */ | ||||
|         stp_group: 10;                         /* spanning tree group id */ | ||||
|         stp_state : 3;                         /* spanning tree port state */ | ||||
|         bd_stats_idx : 16;                     /* ingress BD stats index */ | ||||
|         learning_enabled : 1;                  /* is learning enabled */ | ||||
|         port_vlan_mapping_miss : 1;            /* port vlan mapping miss */ | ||||
|         same_if_check : IFINDEX_BIT_WIDTH;     /* same interface check */ | ||||
|     } | ||||
| } | ||||
|  | ||||
| metadata l2_metadata_t l2_metadata; | ||||
|  | ||||
| #ifndef L2_DISABLE | ||||
| /*****************************************************************************/ | ||||
| /* Spanning tree lookup                                                      */ | ||||
| /*****************************************************************************/ | ||||
| action set_stp_state(stp_state) { | ||||
|     modify_field(l2_metadata.stp_state, stp_state); | ||||
| } | ||||
|  | ||||
| table spanning_tree { | ||||
|     reads { | ||||
|         ingress_metadata.ifindex : exact; | ||||
|         l2_metadata.stp_group: exact; | ||||
|     } | ||||
|     actions { | ||||
|         set_stp_state; | ||||
|     } | ||||
|     size : SPANNING_TREE_TABLE_SIZE; | ||||
| } | ||||
| #endif /* L2_DISABLE */ | ||||
|  | ||||
| control process_spanning_tree { | ||||
| #ifndef L2_DISABLE | ||||
|     if (l2_metadata.stp_group != STP_GROUP_NONE) { | ||||
|         apply(spanning_tree); | ||||
|     } | ||||
| #endif /* L2_DISABLE */ | ||||
| } | ||||
|  | ||||
| #ifndef L2_DISABLE | ||||
| /*****************************************************************************/ | ||||
| /* Source MAC lookup                                                         */ | ||||
| /*****************************************************************************/ | ||||
| action smac_miss() { | ||||
|     modify_field(l2_metadata.l2_src_miss, TRUE); | ||||
| } | ||||
|  | ||||
| action smac_hit(ifindex) { | ||||
|     bit_xor(l2_metadata.l2_src_move, ingress_metadata.ifindex, ifindex); | ||||
| } | ||||
|  | ||||
| table smac { | ||||
|     reads { | ||||
|         ingress_metadata.bd : exact; | ||||
|         l2_metadata.lkp_mac_sa : exact; | ||||
|     } | ||||
|     actions { | ||||
|         nop; | ||||
|         smac_miss; | ||||
|         smac_hit; | ||||
|     } | ||||
|     size : MAC_TABLE_SIZE; | ||||
| } | ||||
|  | ||||
| /*****************************************************************************/ | ||||
| /* Destination MAC lookup                                                    */ | ||||
| /*****************************************************************************/ | ||||
| action dmac_hit(ifindex) { | ||||
|     modify_field(ingress_metadata.egress_ifindex, ifindex); | ||||
|     bit_xor(l2_metadata.same_if_check, l2_metadata.same_if_check, ifindex); | ||||
| } | ||||
|  | ||||
| action dmac_multicast_hit(mc_index) { | ||||
|     modify_field(intrinsic_metadata.mcast_grp, mc_index); | ||||
| #ifdef FABRIC_ENABLE | ||||
|     modify_field(fabric_metadata.dst_device, FABRIC_DEVICE_MULTICAST); | ||||
| #endif /* FABRIC_ENABLE */ | ||||
| } | ||||
|  | ||||
| action dmac_miss() { | ||||
|     modify_field(ingress_metadata.egress_ifindex, IFINDEX_FLOOD); | ||||
| #ifdef FABRIC_ENABLE | ||||
|     modify_field(fabric_metadata.dst_device, FABRIC_DEVICE_MULTICAST); | ||||
| #endif /* FABRIC_ENABLE */ | ||||
| } | ||||
|  | ||||
| action dmac_redirect_nexthop(nexthop_index) { | ||||
|     modify_field(l2_metadata.l2_redirect, TRUE); | ||||
|     modify_field(l2_metadata.l2_nexthop, nexthop_index); | ||||
|     modify_field(l2_metadata.l2_nexthop_type, NEXTHOP_TYPE_SIMPLE); | ||||
| } | ||||
|  | ||||
| action dmac_redirect_ecmp(ecmp_index) { | ||||
|     modify_field(l2_metadata.l2_redirect, TRUE); | ||||
|     modify_field(l2_metadata.l2_nexthop, ecmp_index); | ||||
|     modify_field(l2_metadata.l2_nexthop_type, NEXTHOP_TYPE_ECMP); | ||||
| } | ||||
|  | ||||
| action dmac_drop() { | ||||
|     drop(); | ||||
| } | ||||
|  | ||||
| table dmac { | ||||
|     reads { | ||||
|         ingress_metadata.bd : exact; | ||||
|         l2_metadata.lkp_mac_da : exact; | ||||
|     } | ||||
|     actions { | ||||
| #ifdef OPENFLOW_ENABLE | ||||
|         openflow_apply; | ||||
|         openflow_miss; | ||||
| #endif /* OPENFLOW_ENABLE */ | ||||
|         nop; | ||||
|         dmac_hit; | ||||
|         dmac_multicast_hit; | ||||
|         dmac_miss; | ||||
|         dmac_redirect_nexthop; | ||||
|         dmac_redirect_ecmp; | ||||
|         dmac_drop; | ||||
|     } | ||||
|     size : MAC_TABLE_SIZE; | ||||
|     support_timeout: true; | ||||
| } | ||||
| #endif /* L2_DISABLE */ | ||||
|  | ||||
| control process_mac { | ||||
| #ifndef L2_DISABLE | ||||
|     apply(smac); | ||||
|     apply(dmac); | ||||
| #endif /* L2_DISABLE */ | ||||
| } | ||||
|  | ||||
| #ifndef L2_DISABLE | ||||
| /*****************************************************************************/ | ||||
| /* MAC learn notification                                                    */ | ||||
| /*****************************************************************************/ | ||||
| field_list mac_learn_digest { | ||||
|     ingress_metadata.bd; | ||||
|     l2_metadata.lkp_mac_sa; | ||||
|     ingress_metadata.ifindex; | ||||
| } | ||||
|  | ||||
| action generate_learn_notify() { | ||||
|     generate_digest(MAC_LEARN_RECEIVER, mac_learn_digest); | ||||
| } | ||||
|  | ||||
| table learn_notify { | ||||
|     reads { | ||||
|         l2_metadata.l2_src_miss : ternary; | ||||
|         l2_metadata.l2_src_move : ternary; | ||||
|         l2_metadata.stp_state : ternary; | ||||
|     } | ||||
|     actions { | ||||
|         nop; | ||||
|         generate_learn_notify; | ||||
|     } | ||||
|     size : LEARN_NOTIFY_TABLE_SIZE; | ||||
| } | ||||
| #endif /* L2_DISABLE */ | ||||
|  | ||||
| control process_mac_learning { | ||||
| #ifndef L2_DISABLE | ||||
|     if (l2_metadata.learning_enabled == TRUE) { | ||||
|         apply(learn_notify); | ||||
|     } | ||||
| #endif /* L2_DISABLE */ | ||||
| } | ||||
|  | ||||
|  | ||||
| /*****************************************************************************/ | ||||
| /* Validate packet                                                           */ | ||||
| /*****************************************************************************/ | ||||
| action set_unicast() { | ||||
|     modify_field(l2_metadata.lkp_pkt_type, L2_UNICAST); | ||||
| } | ||||
|  | ||||
| action set_unicast_and_ipv6_src_is_link_local() { | ||||
|     modify_field(l2_metadata.lkp_pkt_type, L2_UNICAST); | ||||
|     modify_field(ipv6_metadata.ipv6_src_is_link_local, TRUE); | ||||
| } | ||||
|  | ||||
| action set_multicast() { | ||||
|     modify_field(l2_metadata.lkp_pkt_type, L2_MULTICAST); | ||||
|     add_to_field(l2_metadata.bd_stats_idx, 1); | ||||
| } | ||||
|  | ||||
| action set_multicast_and_ipv6_src_is_link_local() { | ||||
|     modify_field(l2_metadata.lkp_pkt_type, L2_MULTICAST); | ||||
|     modify_field(ipv6_metadata.ipv6_src_is_link_local, TRUE); | ||||
|     add_to_field(l2_metadata.bd_stats_idx, 1); | ||||
| } | ||||
|  | ||||
| action set_broadcast() { | ||||
|     modify_field(l2_metadata.lkp_pkt_type, L2_BROADCAST); | ||||
|     add_to_field(l2_metadata.bd_stats_idx, 2); | ||||
| } | ||||
|  | ||||
| action set_malformed_packet(drop_reason) { | ||||
|     modify_field(ingress_metadata.drop_flag, TRUE); | ||||
|     modify_field(ingress_metadata.drop_reason, drop_reason); | ||||
| } | ||||
|  | ||||
| table validate_packet { | ||||
|     reads { | ||||
| #ifndef __TARGET_BMV2__ | ||||
|         l2_metadata.lkp_mac_sa mask 0x010000000000 : ternary; | ||||
| #else | ||||
|         l2_metadata.lkp_mac_sa : ternary; | ||||
| #endif | ||||
|         l2_metadata.lkp_mac_da : ternary; | ||||
|         l3_metadata.lkp_ip_type : ternary; | ||||
|         l3_metadata.lkp_ip_ttl : ternary; | ||||
|         l3_metadata.lkp_ip_version : ternary; | ||||
| #ifndef __TARGET_BMV2__ | ||||
|         ipv4_metadata.lkp_ipv4_sa mask 0xFF000000 : ternary; | ||||
| #else | ||||
|         ipv4_metadata.lkp_ipv4_sa : ternary; | ||||
| #endif | ||||
| #ifndef IPV6_DISABLE | ||||
| #ifndef __TARGET_BMV2__ | ||||
|         ipv6_metadata.lkp_ipv6_sa mask 0xFFFF0000000000000000000000000000 : ternary; | ||||
| #else | ||||
|         ipv6_metadata.lkp_ipv6_sa : ternary; | ||||
| #endif | ||||
| #endif /* IPV6_DISABLE */ | ||||
|     } | ||||
|     actions { | ||||
|         nop; | ||||
|         set_unicast; | ||||
|         set_unicast_and_ipv6_src_is_link_local; | ||||
|         set_multicast; | ||||
|         set_multicast_and_ipv6_src_is_link_local; | ||||
|         set_broadcast; | ||||
|         set_malformed_packet; | ||||
|     } | ||||
|     size : VALIDATE_PACKET_TABLE_SIZE; | ||||
| } | ||||
|  | ||||
| control process_validate_packet { | ||||
|     if (ingress_metadata.drop_flag == FALSE) { | ||||
|         apply(validate_packet); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| /*****************************************************************************/ | ||||
| /* Egress BD lookup                                                          */ | ||||
| /*****************************************************************************/ | ||||
| action set_egress_bd_properties() { | ||||
| } | ||||
|  | ||||
| table egress_bd_map { | ||||
|     reads { | ||||
|         egress_metadata.bd : exact; | ||||
|     } | ||||
|     actions { | ||||
|         nop; | ||||
|         set_egress_bd_properties; | ||||
|     } | ||||
|     size : EGRESS_BD_MAPPING_TABLE_SIZE; | ||||
| } | ||||
|  | ||||
| control process_egress_bd { | ||||
|     apply(egress_bd_map); | ||||
| } | ||||
|  | ||||
|  | ||||
| /*****************************************************************************/ | ||||
| /* Egress VLAN decap                                                         */ | ||||
| /*****************************************************************************/ | ||||
| action remove_vlan_single_tagged() { | ||||
|     modify_field(ethernet.etherType, vlan_tag_[0].etherType); | ||||
|     remove_header(vlan_tag_[0]); | ||||
| } | ||||
|  | ||||
| action remove_vlan_double_tagged() { | ||||
|     modify_field(ethernet.etherType, vlan_tag_[1].etherType); | ||||
|     remove_header(vlan_tag_[0]); | ||||
|     remove_header(vlan_tag_[1]); | ||||
| } | ||||
|  | ||||
| table vlan_decap { | ||||
|     reads { | ||||
|         vlan_tag_[0] : valid; | ||||
|         vlan_tag_[1] : valid; | ||||
|     } | ||||
|     actions { | ||||
|         nop; | ||||
|         remove_vlan_single_tagged; | ||||
|         remove_vlan_double_tagged; | ||||
|     } | ||||
|     size: VLAN_DECAP_TABLE_SIZE; | ||||
| } | ||||
|  | ||||
| control process_vlan_decap { | ||||
|     apply(vlan_decap); | ||||
| } | ||||
							
								
								
									
										39
									
								
								samples/P4/mirror_acl.p4
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								samples/P4/mirror_acl.p4
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| // Copyright 2015, Barefoot Networks, Inc. | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| // you may not use this file except in compliance with the License. | ||||
| // You may obtain a copy of the License at | ||||
| // | ||||
| //     http://www.apache.org/licenses/LICENSE-2.0 | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software | ||||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| action set_mirror_id(session_id) { | ||||
|     clone_ingress_pkt_to_egress(session_id); | ||||
| } | ||||
|  | ||||
| table mirror_acl { | ||||
|     reads { | ||||
|         ingress_metadata.if_label : ternary; | ||||
|         ingress_metadata.bd_label : ternary; | ||||
|  | ||||
|         /* ip acl */ | ||||
|         ingress_metadata.lkp_ipv4_sa : ternary; | ||||
|         ingress_metadata.lkp_ipv4_da : ternary; | ||||
|         ingress_metadata.lkp_ip_proto : ternary; | ||||
|  | ||||
|         /* mac acl */ | ||||
|         ingress_metadata.lkp_mac_sa : ternary; | ||||
|         ingress_metadata.lkp_mac_da : ternary; | ||||
|         ingress_metadata.lkp_mac_type : ternary; | ||||
|     } | ||||
|     actions { | ||||
|         nop; | ||||
|         set_mirror_id; | ||||
|     } | ||||
|     size : INGRESS_MIRROR_ACL_TABLE_SIZE; | ||||
| } | ||||
							
								
								
									
										12
									
								
								samples/Python/filenames/WORKSPACE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								samples/Python/filenames/WORKSPACE
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| # rules for scala | ||||
| # https://github.com/bazelbuild/rules_scala#getting-started | ||||
| # pull rule definitions from git | ||||
| git_repository( | ||||
|     name = "io_bazel_rules_scala", | ||||
|     remote = "https://github.com/bazelbuild/rules_scala.git", | ||||
|     commit = "73743b830ae98d13a946b25ad60cad5fee58e6d3", # update this as needed | ||||
| ) | ||||
|  | ||||
| # load the desired scala rules for this workspace | ||||
| load("@io_bazel_rules_scala//scala:scala.bzl", "scala_repositories") | ||||
| scala_repositories() | ||||
							
								
								
									
										384
									
								
								samples/TypeScript/import.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										384
									
								
								samples/TypeScript/import.tsx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,384 @@ | ||||
| // Fixture taken from https://github.com/graphcool/console/blob/dev/src/components/onboarding/PlaygroundCPopup/PlaygroundCPopup.tsx | ||||
|  | ||||
| import * as React from 'react' | ||||
| import {withRouter} from 'react-router' | ||||
| import {connect} from 'react-redux' | ||||
| import {bindActionCreators} from 'redux' | ||||
| import {nextStep, selectExample} from '../../../actions/gettingStarted' | ||||
| import {classnames} from '../../../utils/classnames' | ||||
| import Loading from '../../Loading/Loading' | ||||
| import {GettingStartedState} from '../../../types/gettingStarted' | ||||
| import {Example} from '../../../types/types' | ||||
| const classes: any = require('./PlaygroundCPopup.scss') | ||||
| import {$p} from 'graphcool-styles' | ||||
| import * as cx from 'classnames' | ||||
|  | ||||
| interface Tutorial { | ||||
|   title: string | ||||
|   description: string | ||||
|   image: string | ||||
|   link: string | ||||
| } | ||||
|  | ||||
| const guides: Tutorial[] = [ | ||||
|   { | ||||
|     title: 'Learnrelay.org', | ||||
|     description: 'A comprehensive, interactive introduction to Relay', | ||||
|     link: 'https://learnrelay.org/', | ||||
|     image: require('../../../assets/graphics/relay.png'), | ||||
|   }, | ||||
|   { | ||||
|     title: 'GraphQL and the amazing Apollo Client', | ||||
|     description: 'Explore an Application built using React and Angular 2', | ||||
|     link: 'https://medium.com/google-developer-experts/graphql-and-the-amazing-apollo-client-fe57e162a70c', | ||||
|     image: require('../../../assets/graphics/apollo.png'), | ||||
|   }, | ||||
|   { | ||||
|     title: 'Introducing Lokka', | ||||
|     description: 'A Simple JavaScript Client for GraphQL', | ||||
|     link: 'https://voice.kadira.io/introducing-lokka-a-simple-javascript-client-for-graphql-e0802695648c', | ||||
|     image: require('../../../assets/graphics/lokka.png'), | ||||
|   }, | ||||
| ] | ||||
|  | ||||
| const examples = { | ||||
|   ReactRelay: { | ||||
|     path: 'react-relay-instagram-example', | ||||
|     description: 'React + Relay', | ||||
|   }, | ||||
|   ReactApollo: { | ||||
|     path: 'react-apollo-instagram-example', | ||||
|     description: 'React + Apollo', | ||||
|   }, | ||||
|   ReactNativeApollo: { | ||||
|     path: 'react-native-apollo-instagram-example', | ||||
|     description: 'React Native + Apollo', | ||||
|   }, | ||||
|   AngularApollo: { | ||||
|     path: 'angular-apollo-instagram-example', | ||||
|     description: 'Angular + Apollo', | ||||
|   }, | ||||
| } | ||||
|  | ||||
| interface Props { | ||||
|   id: string | ||||
|   projectId: string | ||||
|   nextStep: () => Promise<void> | ||||
|   selectExample: (selectedExample: Example) => any | ||||
|   gettingStartedState: GettingStartedState | ||||
| } | ||||
|  | ||||
| interface State { | ||||
|   mouseOver: boolean | ||||
| } | ||||
|  | ||||
| class PlaygroundCPopup extends React.Component<Props, State> { | ||||
|  | ||||
|   state = { | ||||
|     mouseOver: false, | ||||
|   } | ||||
|  | ||||
|   refs: { | ||||
|     [key: string]: any | ||||
|     exampleAnchor: HTMLDivElement | ||||
|     congratsAnchor: HTMLDivElement | ||||
|     scroller: HTMLDivElement, | ||||
|   } | ||||
|  | ||||
|   componentDidUpdate(prevProps: Props, prevState: State) { | ||||
|     if (prevProps.gettingStartedState.selectedExample !== this.props.gettingStartedState.selectedExample) { | ||||
|       this.refs.scroller.scrollTop += this.refs.exampleAnchor.getBoundingClientRect().top | ||||
|     } | ||||
|  | ||||
|     if (prevProps.gettingStartedState.isCurrentStep('STEP5_WAITING') | ||||
|         && this.props.gettingStartedState.isCurrentStep('STEP5_DONE')) { | ||||
|       this.refs.scroller.scrollTop += this.refs.congratsAnchor.getBoundingClientRect().top | ||||
|  | ||||
|       const snd = new Audio(require('../../../assets/success.mp3') as string) | ||||
|       snd.volume = 0.5 | ||||
|       snd.play() | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   render() { | ||||
|     const {mouseOver} = this.state | ||||
|     const {selectedExample} = this.props.gettingStartedState | ||||
|     const hovering = !this.props.gettingStartedState.isCurrentStep('STEP4_CLICK_TEASER_STEP5') | ||||
|     const downloadUrl = (example) => `${__BACKEND_ADDR__}/resources/getting-started-example?repository=${examples[example].path}&project_id=${this.props.projectId}&user=graphcool-examples` // tslint:disable-line | ||||
|     return ( | ||||
|       <div | ||||
|         className='flex justify-center items-start w-100 h-100' | ||||
|         style={{ | ||||
|           transition: 'background-color 0.3s ease', | ||||
|           backgroundColor: hovering ? 'rgba(255,255,255,0.7)' : 'transparent', | ||||
|           width: 'calc(100% - 266px)', | ||||
|           pointerEvents: 'none', | ||||
|           overflow: 'hidden', | ||||
|         }} | ||||
|       > | ||||
|         <div | ||||
|           ref='scroller' | ||||
|           className='flex justify-center w-100' | ||||
|           style={{ | ||||
|             transition: 'height 0.5s ease', | ||||
|             height: hovering ? '100%' : mouseOver ? '190%' : '210%', | ||||
|             pointerEvents: hovering ? 'all' : 'none', | ||||
|             cursor: hovering ? 'auto' : 'pointer', | ||||
|             overflow: hovering ? 'auto' : 'hidden', | ||||
|             alignItems: selectedExample ? 'flex-start' : 'center', | ||||
|           }} | ||||
|         > | ||||
|           <div | ||||
|             className='bg-white br-2 shadow-2 mv-96' | ||||
|             style={{ | ||||
|               minWidth: 600, | ||||
|               maxWidth: 800, | ||||
|               pointerEvents: 'all', | ||||
|             }} | ||||
|             onMouseLeave={() => this.setState({ mouseOver: false })} | ||||
|             onMouseEnter={() => { | ||||
|               this.setState({ mouseOver: true }) | ||||
|             }} | ||||
|             onMouseOver={(e: any) => { | ||||
|               if (this.props.gettingStartedState.isCurrentStep('STEP4_CLICK_TEASER_STEP5')) { | ||||
|                 this.props.nextStep() | ||||
|               } | ||||
|             }} | ||||
|           > | ||||
|             <div className='ma-16 tc pb-25'> | ||||
|               <div className='fw3 ma-38 f-38'> | ||||
|                 You did it! Time to run an example. | ||||
|               </div> | ||||
|               <div className='fw2 f-16 mh-96 lh-1-4'> | ||||
|                 You have successfully set up your own Instagram backend.{' '} | ||||
|                 When building an app with Graphcool you can easily explore queries in the{' '} | ||||
|                 playground and "copy & paste" selected queries into your code.{' '} | ||||
|                 Of course, to do so, you need to implement the frontend first. | ||||
|               </div> | ||||
|               <div className='fw2 f-16 mh-96 lh-1-4 mt-16'> | ||||
|                 <div>We put together a simple app to show and add posts</div> | ||||
|                 <div>using the backend you just built, to test and run it locally.</div> | ||||
|               </div> | ||||
|             </div> | ||||
|             <div className='ma-16 tc pb-25'> | ||||
|               <div className='fw3 ma-38 f-25'> | ||||
|                 Select your preferred technology to download the example. | ||||
|               </div> | ||||
|               <div className='flex justify-between items-center w-100' ref='exampleAnchor'> | ||||
|                 <div | ||||
|                   className={classnames( | ||||
|                     classes.exampleButton, | ||||
|                     selectedExample === 'ReactRelay' ? classes.active : '', | ||||
|                   )} | ||||
|                   onClick={() => this.props.selectExample('ReactRelay')} | ||||
|                 > | ||||
|                   React + Relay | ||||
|                 </div> | ||||
|                 <div | ||||
|                   className={classnames( | ||||
|                     classes.exampleButton, | ||||
|                     selectedExample === 'ReactApollo' ? classes.active : '', | ||||
|                   )} | ||||
|                   onClick={() => this.props.selectExample('ReactApollo')} | ||||
|                 > | ||||
|                   React + Apollo | ||||
|                 </div> | ||||
|                 <div | ||||
|                   className={classnames( | ||||
|                     classes.exampleButton, | ||||
|                     selectedExample === 'ReactNativeApollo' ? classes.active : '', | ||||
|                   )} | ||||
|                   onClick={() => this.props.selectExample('ReactNativeApollo')} | ||||
|                 > | ||||
|                   React Native + Apollo | ||||
|                 </div> | ||||
|                 <div | ||||
|                   className={classnames( | ||||
|                     classes.exampleButton, | ||||
|                     selectedExample === 'AngularApollo' ? classes.active : '', | ||||
|                   )} | ||||
|                   onClick={() => this.props.selectExample('AngularApollo')} | ||||
|                 > | ||||
|                   Angular + Apollo | ||||
|                 </div> | ||||
|               </div> | ||||
|             </div> | ||||
|           {selectedExample && | ||||
|           <div> | ||||
|             <div className='w-100'> | ||||
|               <iframe | ||||
|                 className='w-100' | ||||
|                 height='480' | ||||
|                 allowFullScreen | ||||
|                 frameBorder='0' | ||||
|                 src={`https://www.youtube.com/embed/${this.getExampleVideoUrl(selectedExample)}`} | ||||
|               /> | ||||
|             </div> | ||||
|             <div | ||||
|               className='w-100 pa-25' | ||||
|               style={{ | ||||
|                 backgroundColor: '#FEF5D2', | ||||
|               }} | ||||
|             > | ||||
|               <div className='mt-25 mb-38 w-100 flex justify-center'> | ||||
|                 <a | ||||
|                   href={downloadUrl(selectedExample)} | ||||
|                   className='pa-16 white' | ||||
|                   style={{ | ||||
|                     backgroundColor: '#4A90E2', | ||||
|                   }} | ||||
|                 > | ||||
|                   Download example | ||||
|                 </a> | ||||
|               </div> | ||||
|               <div className='code dark-gray'> | ||||
|                 <div className='black-50'> | ||||
|                   # To see the example in action, run the following commands: | ||||
|                 </div> | ||||
|                 <div className='mv-16'> | ||||
|                   <div className='black'> | ||||
|                     npm install | ||||
|                   </div> | ||||
|                   <div className='black'> | ||||
|                     npm start | ||||
|                   </div> | ||||
|                 </div> | ||||
|                 <div className='black-50'> | ||||
|                   # You can now open the app on localhost:3000 | ||||
|                 </div> | ||||
|                 <div className='black-50'> | ||||
|                   # Please come back to this page once you're done. We're waiting here. 💤 | ||||
|                 </div> | ||||
|                 <div className={cx($p.w100, $p.flex, $p.flexRow, $p.justifyCenter, $p.mt25)}> | ||||
|                   <a href='#' onClick={ | ||||
|                     (e: any) => { | ||||
|                       e.preventDefault() | ||||
|                       // we need to skip the 'STEP5_WAITING' step | ||||
|                       this.props.nextStep() | ||||
|                       this.props.nextStep() | ||||
|                       this.props.nextStep() | ||||
|                     } | ||||
|                   }> | ||||
|                     Skip | ||||
|                   </a> | ||||
|                 </div> | ||||
|               </div> | ||||
|               {this.props.gettingStartedState.isCurrentStep('STEP5_WAITING') && | ||||
|               <div className='w-100 mv-96 flex justify-center'> | ||||
|                 <Loading /> | ||||
|               </div> | ||||
|               } | ||||
|             </div> | ||||
|           </div> | ||||
|           } | ||||
|         {this.props.gettingStartedState.isCurrentStep('STEP5_DONE') && | ||||
|           <div className='w-100 mb-96' ref='congratsAnchor'> | ||||
|             <div className='flex items-center flex-column pv-60 fw1'> | ||||
|               <div className='f-96'> | ||||
|                 🎉 | ||||
|               </div> | ||||
|               <div className='f-38 mt-38'> | ||||
|                 Congratulations! | ||||
|               </div> | ||||
|               <div className='f-38 mt-16'> | ||||
|                 We knew you had it in you. | ||||
|               </div> | ||||
|               <div className='f-16 mv-38'> | ||||
|                 Now go out there and build amazing things! | ||||
|               </div> | ||||
|             </div> | ||||
|             <div className='flex justify-between ph-25 pv-16'> | ||||
|               <div className='w-50 pr-16'> | ||||
|                 <div className='ttu ls-2 f-16 fw1 lh-1-4'> | ||||
|                   Get started on your own<br />with those excellent tutorials | ||||
|                 </div> | ||||
|                 <div className='mv-38'> | ||||
|                   {guides.map(guide => this.renderBox(guide))} | ||||
|                 </div> | ||||
|               </div> | ||||
|               <div className='w-50 pl-16'> | ||||
|                 <div className='ttu ls-2 f-16 fw1 lh-1-4'> | ||||
|                   Get more out of Graphcool<br />with our guides | ||||
|                 </div> | ||||
|                 <div className={`h-100 justify-start flex flex-column mv-38 ${classes.guides}`}> | ||||
|                   <a | ||||
|                     href='https://graph.cool/docs/tutorials/quickstart-2-daisheeb9x' | ||||
|                     className={`${classes.one} fw4 black db flex items-center mb-25`} | ||||
|                     target='_blank' | ||||
|                   > | ||||
|                     Declaring Relations | ||||
|                   </a> | ||||
|                   <a | ||||
|                     href='https://graph.cool/docs/tutorials/quickstart-3-saigai7cha' | ||||
|                     className={`${classes.two} fw4 black db flex items-center mb-25`} | ||||
|                     target='_blank' | ||||
|                   > | ||||
|                     Implementing Business Logic | ||||
|                   </a> | ||||
|                   <a | ||||
|                     href='https://graph.cool/docs/tutorials/thinking-in-terms-of-graphs-ahsoow1ool' | ||||
|                     target='_blank' | ||||
|                     className={`${classes.three} fw4 black db flex items-center mb-25`} | ||||
|                   > | ||||
|                     Thinking in terms of graphs | ||||
|                   </a> | ||||
|                 </div> | ||||
|               </div> | ||||
|             </div> | ||||
|             <div className='flex w-100 justify-center'> | ||||
|               <div | ||||
|                 className='f-25 mv-16 pv-16 ph-60 ls-1 ttu pointer bg-accent white dim' | ||||
|                 onClick={this.props.nextStep} | ||||
|               > | ||||
|                 Finish Onboarding | ||||
|               </div> | ||||
|             </div> | ||||
|           </div> | ||||
|           } | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     ) | ||||
|   } | ||||
|  | ||||
|   private renderBox = (tutorial: Tutorial) => { | ||||
|     return ( | ||||
|       <div key={tutorial.title} className='pa-16 mb-16 lh-1-4' style={{background: 'rgba(0,0,0,0.03)'}}> | ||||
|         <a className='flex items-center' href={tutorial.link} target='_blank'> | ||||
|           <div className='flex items-center justify-center' style={{ flex: '0 0 60px', height: 60 }}> | ||||
|             <img src={tutorial.image}/> | ||||
|           </div> | ||||
|           <div className='flex flex-column space-between ml-38'> | ||||
|             <div className='mb-6 dark-gray f-16'> | ||||
|               {tutorial.title} | ||||
|             </div> | ||||
|             <div className='fw1 mid-gray'> | ||||
|               {tutorial.description} | ||||
|             </div> | ||||
|           </div> | ||||
|         </a> | ||||
|       </div> | ||||
|     ) | ||||
|   } | ||||
|  | ||||
|   private getExampleVideoUrl = (example: Example): string => { | ||||
|     switch (example) { | ||||
|       case 'ReactRelay': return '_dj9Os2ev4M' | ||||
|       case 'ReactApollo': return '9nlwyPUPXjQ' | ||||
|       case 'ReactNativeApollo': return '9nlwyPUPXjQ' | ||||
|       case 'AngularApollo': return 'EzD5fJ-uniI' | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| const mapStateToProps = (state) => { | ||||
|   return { | ||||
|     gettingStartedState: state.gettingStarted.gettingStartedState, | ||||
|   } | ||||
| } | ||||
|  | ||||
| const mapDispatchToProps = (dispatch) => { | ||||
|   return bindActionCreators({nextStep, selectExample}, dispatch) | ||||
| } | ||||
|  | ||||
| export default connect(mapStateToProps, mapDispatchToProps)(withRouter(PlaygroundCPopup)) | ||||
							
								
								
									
										366
									
								
								samples/TypeScript/react-native.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										366
									
								
								samples/TypeScript/react-native.tsx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,366 @@ | ||||
| // Fixture taken from https://github.com/bgrieder/RNTSExplorer/blob/master/typescript/components/TextExample.ios.tsx | ||||
|  | ||||
| /** | ||||
|  * The examples provided by Facebook are for non-commercial testing and | ||||
|  * evaluation purposes only. | ||||
|  * | ||||
|  * Facebook reserves all rights not expressly granted. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | ||||
|  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL | ||||
|  * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN | ||||
|  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||
|  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
|  * | ||||
|  * Typescript rewrite by Bruno Grieder | ||||
|  */ | ||||
|  | ||||
| 'use strict' | ||||
|  | ||||
| import * as React from 'react-native'; | ||||
| import RNTSExample from '../RNTSExample' | ||||
| import RNTSExampleModule from '../RNTSExampleModule' | ||||
|  | ||||
| const { | ||||
|           StyleSheet, | ||||
|           Text, | ||||
|           View, | ||||
|           } = React | ||||
|  | ||||
|  | ||||
| const styles = StyleSheet.create( | ||||
|     { | ||||
|         backgroundColorText: { | ||||
|             left:            5, | ||||
|             backgroundColor: 'rgba(100, 100, 100, 0.3)' | ||||
|         }, | ||||
|         entity:              { | ||||
|             fontWeight: '500', | ||||
|             color:      '#527fe4', | ||||
|         }, | ||||
|     } | ||||
| ) | ||||
|  | ||||
| class Entity extends React.Component<any,any> { | ||||
|     render() { | ||||
|         return ( | ||||
|             <Text style={styles.entity}> | ||||
|                 {this.props.children} | ||||
|             </Text> | ||||
|         ) | ||||
|     } | ||||
| } | ||||
|  | ||||
| interface AttrTogglerState { | ||||
|     fontWeight?: string | ||||
|     fontSize?: number | ||||
| } | ||||
|  | ||||
| class AttributeToggler extends React.Component<any, AttrTogglerState> { | ||||
|     componentWillMount() { | ||||
|         this.setState( | ||||
|             { | ||||
|                 fontWeight: '500', | ||||
|                 fontSize:   15 | ||||
|             } | ||||
|         ) | ||||
|     } | ||||
|  | ||||
|     private increaseSize = (): void => { | ||||
|         this.setState( { | ||||
|                            fontSize: this.state.fontSize + 1 | ||||
|                        } ) | ||||
|     } | ||||
|  | ||||
|     render() { | ||||
|         const curStyle: React.TextStyle = { fontSize: this.state.fontSize } | ||||
|         return ( | ||||
|             <Text> | ||||
|                 <Text style={curStyle}> | ||||
|                     Tap the controls below to change attributes. | ||||
|                 </Text> | ||||
|                 <Text> | ||||
|                     See how it will even work on{' '} | ||||
|                     <Text style={curStyle}> | ||||
|                         this nested text | ||||
|                     </Text> | ||||
|                     <Text onPress={this.increaseSize}> | ||||
|                         {'>> Increase Size <<'} | ||||
|                     </Text> | ||||
|                 </Text> | ||||
|             </Text> | ||||
|         ) | ||||
|     } | ||||
| } | ||||
|  | ||||
| export default { | ||||
|     title:       '<Text>', | ||||
|     description: 'Base component for rendering styled text.', | ||||
|     displayName: 'TextExample', | ||||
|     examples:    [ | ||||
|                      { | ||||
|                          title:  'Wrap', | ||||
|                          render: function () { | ||||
|                              return ( | ||||
|                                  <Text> | ||||
|                                      The text should wrap if it goes on multiple lines. See, this is going to | ||||
|                                      the next line. | ||||
|                                  </Text> | ||||
|                              ) | ||||
|                          }, | ||||
|                      }, | ||||
|                      { | ||||
|                          title:  'Padding', | ||||
|                          render: function () { | ||||
|                              return ( | ||||
|                                  <Text style={{padding: 10}}> | ||||
|                                      This text is indented by 10px padding on all sides. | ||||
|                                  </Text> | ||||
|                              ) | ||||
|                          }, | ||||
|                      }, | ||||
|                      { | ||||
|                          title:  'Font Family', | ||||
|                          render: function () { | ||||
|                              return ( | ||||
|                                  <View> | ||||
|                                      <Text style={{fontFamily: 'Cochin'}}> | ||||
|                                          Cochin | ||||
|                                      </Text> | ||||
|                                      <Text style={{fontFamily: 'Cochin', fontWeight: 'bold'}}> | ||||
|                                          Cochin bold | ||||
|                                      </Text> | ||||
|                                      <Text style={{fontFamily: 'Helvetica'}}> | ||||
|                                          Helvetica | ||||
|                                      </Text> | ||||
|                                      <Text style={{fontFamily: 'Helvetica', fontWeight: 'bold'}}> | ||||
|                                          Helvetica bold | ||||
|                                      </Text> | ||||
|                                      <Text style={{fontFamily: 'Verdana'}}> | ||||
|                                          Verdana | ||||
|                                      </Text> | ||||
|                                      <Text style={{fontFamily: 'Verdana', fontWeight: 'bold'}}> | ||||
|                                          Verdana bold | ||||
|                                      </Text> | ||||
|                                  </View> | ||||
|                              ) | ||||
|                          }, | ||||
|                      }, | ||||
|                      { | ||||
|                          title:  'Font Size', | ||||
|                          render: function () { | ||||
|                              return ( | ||||
|                                  <View> | ||||
|                                      <Text style={{fontSize: 23}}> | ||||
|                                          Size 23 | ||||
|                                      </Text> | ||||
|                                      <Text style={{fontSize: 8}}> | ||||
|                                          Size 8 | ||||
|                                      </Text> | ||||
|                                  </View> | ||||
|                              ) | ||||
|                          }, | ||||
|                      }, | ||||
|                      { | ||||
|                          title:  'Color', | ||||
|                          render: function () { | ||||
|                              return ( | ||||
|                                  <View> | ||||
|                                      <Text style={{color: 'red'}}> | ||||
|                                          Red color | ||||
|                                      </Text> | ||||
|                                      <Text style={{color: 'blue'}}> | ||||
|                                          Blue color | ||||
|                                      </Text> | ||||
|                                  </View> | ||||
|                              ) | ||||
|                          }, | ||||
|                      }, | ||||
|                      { | ||||
|                          title:  'Font Weight', | ||||
|                          render: function () { | ||||
|                              return ( | ||||
|                                  <View> | ||||
|                                      <Text style={{fontWeight: '100'}}> | ||||
|                                          Move fast and be ultralight | ||||
|                                      </Text> | ||||
|                                      <Text style={{fontWeight: '200'}}> | ||||
|                                          Move fast and be light | ||||
|                                      </Text> | ||||
|                                      <Text style={{fontWeight: 'normal'}}> | ||||
|                                          Move fast and be normal | ||||
|                                      </Text> | ||||
|                                      <Text style={{fontWeight: 'bold'}}> | ||||
|                                          Move fast and be bold | ||||
|                                      </Text> | ||||
|                                      <Text style={{fontWeight: '900'}}> | ||||
|                                          Move fast and be ultrabold | ||||
|                                      </Text> | ||||
|                                  </View> | ||||
|                              ) | ||||
|                          }, | ||||
|                      }, | ||||
|                      { | ||||
|                          title:  'Font Style', | ||||
|                          render: function () { | ||||
|                              return ( | ||||
|                                  <View> | ||||
|                                      <Text style={{fontStyle: 'normal'}}> | ||||
|                                          Normal text | ||||
|                                      </Text> | ||||
|                                      <Text style={{fontStyle: 'italic'}}> | ||||
|                                          Italic text | ||||
|                                      </Text> | ||||
|                                  </View> | ||||
|                              ) | ||||
|                          }, | ||||
|                      }, | ||||
|                      { | ||||
|                          title:       'Nested', | ||||
|                          description: 'Nested text components will inherit the styles of their ' + | ||||
|                                       'parents (only backgroundColor is inherited from non-Text parents).  ' + | ||||
|                                       '<Text> only supports other <Text> and raw text (strings) as children.', | ||||
|                          render:      function () { | ||||
|                              return ( | ||||
|                                  <View> | ||||
|                                      <Text> | ||||
|                                          (Normal text, | ||||
|                                          <Text style={{fontWeight: 'bold'}}> | ||||
|                                              (and bold | ||||
|                                              <Text style={{fontSize: 11, color: '#527fe4'}}> | ||||
|                                                  (and tiny inherited bold blue) | ||||
|                                              </Text> | ||||
|                                              ) | ||||
|                                          </Text> | ||||
|                                          ) | ||||
|                                      </Text> | ||||
|                                      <Text style={{fontSize: 12}}> | ||||
|                                          <Entity>Entity Name</Entity> | ||||
|                                      </Text> | ||||
|                                  </View> | ||||
|                              ) | ||||
|                          }, | ||||
|                      }, | ||||
|                      { | ||||
|                          title:  'Text Align', | ||||
|                          render: function () { | ||||
|                              return ( | ||||
|                                  <View> | ||||
|                                      <Text style={{textAlign: 'left'}}> | ||||
|                                          left left left left left left left left left left left left left left left | ||||
|                                      </Text> | ||||
|                                      <Text style={{textAlign: 'center'}}> | ||||
|                                          center center center center center center center center center center center | ||||
|                                      </Text> | ||||
|                                      <Text style={{textAlign: 'right'}}> | ||||
|                                          right right right right right right right right right right right right right | ||||
|                                      </Text> | ||||
|                                  </View> | ||||
|                              ) | ||||
|                          }, | ||||
|                      }, | ||||
|                      { | ||||
|                          title:  'Spaces', | ||||
|                          render: function () { | ||||
|                              return ( | ||||
|                                  <Text> | ||||
|                                      A {'generated'} {' '} {'string'} and    some     spaces | ||||
|                                  </Text> | ||||
|                              ) | ||||
|                          }, | ||||
|                      }, | ||||
|                      { | ||||
|                          title:  'Line Height', | ||||
|                          render: function () { | ||||
|                              return ( | ||||
|                                  <Text> | ||||
|                                      <Text style={{lineHeight: 35}}> | ||||
|                                          A lot of space between the lines of this long passage that should | ||||
|                                          wrap once. | ||||
|                                      </Text> | ||||
|                                  </Text> | ||||
|                              ) | ||||
|                          }, | ||||
|                      }, | ||||
|                      { | ||||
|                          title:       'Empty Text', | ||||
|                          description: 'It\'s ok to have Text with zero or null children.', | ||||
|                          render:      function () { | ||||
|                              return ( | ||||
|                                  <Text /> | ||||
|                              ) | ||||
|                          }, | ||||
|                      }, | ||||
|                      { | ||||
|                          title:  'Toggling Attributes', | ||||
|                          render: (): React.ReactElement<any> => { | ||||
|                              return <AttributeToggler /> | ||||
|                          }, | ||||
|                      }, | ||||
|                      { | ||||
|                          title:       'backgroundColor attribute', | ||||
|                          description: 'backgroundColor is inherited from all types of views.', | ||||
|                          render:      function () { | ||||
|                              return ( | ||||
|                                  <View style={{backgroundColor: 'yellow'}}> | ||||
|                                      <Text> | ||||
|                                          Yellow background inherited from View parent, | ||||
|                                          <Text style={{backgroundColor: '#ffaaaa'}}> | ||||
|                                              {' '}red background, | ||||
|                                              <Text style={{backgroundColor: '#aaaaff'}}> | ||||
|                                                  {' '}blue background, | ||||
|                                                  <Text> | ||||
|                                                      {' '}inherited blue background, | ||||
|                                                      <Text style={{backgroundColor: '#aaffaa'}}> | ||||
|                                                          {' '}nested green background. | ||||
|                                                      </Text> | ||||
|                                                  </Text> | ||||
|                                              </Text> | ||||
|                                          </Text> | ||||
|                                      </Text> | ||||
|                                  </View> | ||||
|                              ) | ||||
|                          }, | ||||
|                      }, | ||||
|                      { | ||||
|                          title:  'containerBackgroundColor attribute', | ||||
|                          render: function () { | ||||
|                              return ( | ||||
|                                  <View> | ||||
|                                      <View style={{flexDirection: 'row', height: 85}}> | ||||
|                                          <View style={{backgroundColor: '#ffaaaa', width: 150}}/> | ||||
|                                          <View style={{backgroundColor: '#aaaaff', width: 150}}/> | ||||
|                                      </View> | ||||
|                                      <Text style={[styles.backgroundColorText, {top: -80}]}> | ||||
|                                          Default containerBackgroundColor (inherited) + backgroundColor wash | ||||
|                                      </Text> | ||||
|                                      <Text style={[ | ||||
|                                             styles.backgroundColorText, | ||||
|                                             {top: -70, containerBackgroundColor: 'transparent'} | ||||
|                                         ]}> | ||||
|                                          {"containerBackgroundColor: 'transparent' + backgroundColor wash"} | ||||
|                                      </Text> | ||||
|                                  </View> | ||||
|                              ) | ||||
|                          }, | ||||
|                      }, | ||||
|                      { | ||||
|                          title:  'numberOfLines attribute', | ||||
|                          render: function () { | ||||
|                              return ( | ||||
|                                  <View> | ||||
|                                      <Text numberOfLines={1}> | ||||
|                                          Maximum of one line no matter now much I write here. If I keep writing it{"'"}ll just truncate after one line | ||||
|                                      </Text> | ||||
|                                      <Text numberOfLines={2} style={{marginTop: 20}}> | ||||
|                                          Maximum of two lines no matter now much I write here. If I keep writing it{"'"}ll just truncate after two lines | ||||
|                                      </Text> | ||||
|                                      <Text style={{marginTop: 20}}> | ||||
|                                          No maximum lines specified no matter now much I write here. If I keep writing it{"'"}ll just keep going and going | ||||
|                                      </Text> | ||||
|                                  </View> | ||||
|                              ) | ||||
|                          } | ||||
|                      } ] as RNTSExample[] | ||||
| } as RNTSExampleModule | ||||
							
								
								
									
										240
									
								
								samples/TypeScript/require.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										240
									
								
								samples/TypeScript/require.tsx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,240 @@ | ||||
| // Fixture taken from https://github.com/jcingroup/C551608_Roki/blob/master/Work.WebProj/Scripts/src/tsx/m-parm.tsx | ||||
|  | ||||
| import $ = require('jquery'); | ||||
| import React = require('react'); | ||||
| import ReactDOM = require('react-dom'); | ||||
| import Moment = require('moment'); | ||||
| import ReactBootstrap = require("react-bootstrap"); | ||||
| import CommCmpt = require('comm-cmpt'); | ||||
| import CommFunc = require('comm-func'); | ||||
|  | ||||
| namespace Parm { | ||||
|     interface ParamData { | ||||
|         Email?: string; | ||||
|         PurchaseTotal?: number; | ||||
|         HomoiothermyFee?: number; | ||||
|         RefrigerFee?: number; | ||||
|         AccountName?: string; | ||||
|         BankName?: string; | ||||
|         BankCode?: string; | ||||
|         AccountNumber?: string; | ||||
|         Fee?: number; | ||||
|     } | ||||
|     export class GridForm extends React.Component<any, { param?: ParamData }>{ | ||||
|  | ||||
|  | ||||
|         constructor() { | ||||
|  | ||||
|             super(); | ||||
|             this.queryInitData = this.queryInitData.bind(this); | ||||
|             this.handleSubmit = this.handleSubmit.bind(this); | ||||
|             this.componentDidMount = this.componentDidMount.bind(this); | ||||
|             this.setInputValue = this.setInputValue.bind(this); | ||||
|             this.render = this.render.bind(this); | ||||
|             this.state = { | ||||
|                 param: { | ||||
|                     Email: null, | ||||
|                     PurchaseTotal: 0, | ||||
|                     HomoiothermyFee: 0, | ||||
|                     RefrigerFee:0, | ||||
|                     AccountName: null, | ||||
|                     BankName: null, | ||||
|                     BankCode: null, | ||||
|                     AccountNumber: null, | ||||
|                     Fee: 0 | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         static defaultProps = { | ||||
|             apiInitPath: gb_approot + 'Active/ParmData/aj_ParamInit', | ||||
|             apiPath: gb_approot + 'api/GetAction/PostParamData' | ||||
|         } | ||||
|         componentDidMount() { | ||||
|             this.queryInitData(); | ||||
|         } | ||||
|         queryInitData() { | ||||
|             CommFunc.jqGet(this.props.apiInitPath, {}) | ||||
|                 .done((data, textStatus, jqXHRdata) => { | ||||
|                     this.setState({ param: data }); | ||||
|                 }) | ||||
|                 .fail((jqXHR, textStatus, errorThrown) => { | ||||
|                     CommFunc.showAjaxError(errorThrown); | ||||
|                 }); | ||||
|         } | ||||
|         handleSubmit(e: React.FormEvent) { | ||||
|  | ||||
|             e.preventDefault(); | ||||
|             CommFunc.jqPost(this.props.apiPath, this.state.param) | ||||
|                 .done((data, textStatus, jqXHRdata) => { | ||||
|                     if (data.result) { | ||||
|                         CommFunc.tosMessage(null, '修改完成', 1); | ||||
|                     } else { | ||||
|                         alert(data.message); | ||||
|                     } | ||||
|                 }) | ||||
|                 .fail((jqXHR, textStatus, errorThrown) => { | ||||
|                     CommFunc.showAjaxError(errorThrown); | ||||
|                 }); | ||||
|             return; | ||||
|         } | ||||
|         handleOnBlur(date) { | ||||
|  | ||||
|         } | ||||
|         setInputValue(name: string, e: React.SyntheticEvent) { | ||||
|             let input: HTMLInputElement = e.target as HTMLInputElement; | ||||
|             let obj = this.state.param; | ||||
|             obj[name] = input.value; | ||||
|             this.setState({ param: obj }); | ||||
|         } | ||||
|         render() { | ||||
|  | ||||
|             var outHtml: JSX.Element = null; | ||||
|  | ||||
|             let param = this.state.param; | ||||
|             let InputDate = CommCmpt.InputDate; | ||||
|  | ||||
|             outHtml = ( | ||||
|                 <div> | ||||
|     <ul className="breadcrumb"> | ||||
|         <li><i className="fa-list-alt"></i> | ||||
|             {this.props.menuName} | ||||
|             </li> | ||||
|         </ul> | ||||
|     <h4 className="title"> {this.props.caption} 基本資料維護</h4> | ||||
|     <form className="form-horizontal" onSubmit={this.handleSubmit}> | ||||
|         <div className="col-xs-12"> | ||||
|             <div className="item-box"> | ||||
|                 {/*--email--*/} | ||||
|                 <div className="item-title text-center"> | ||||
|                 <h5>Email信箱設定</h5> | ||||
|                     </div> | ||||
|                     <div className="alert alert-warning" role="alert"> | ||||
|                         <ol> | ||||
|                             <li>多筆信箱請用「<strong className="text-danger">, </strong>」逗號分開。<br />ex.<strong>user1 @demo.com.tw, user2 @demo.com.tw</strong></li> | ||||
|                             <li>Email 前面可填收件人姓名,用「<strong className="text-danger">: </strong>」冒號分隔姓名和信箱,此項非必要,可省略。<br />ex.<strong>收件人A: user1 @demo.com.tw, 收件人B: user2 @demo.com.tw</strong></li> | ||||
|                             </ol> | ||||
|                         </div> | ||||
|                     <div className="form-group"> | ||||
|                        <label className="col-xs-1 control-label">收件信箱</label> | ||||
|                        <div className="col-xs-9"> | ||||
|                                 <input className="form-control" type="text" | ||||
|                                     value={param.Email} | ||||
|                                     onChange={this.setInputValue.bind(this, 'Email') } | ||||
|                                     maxLength={500} | ||||
|                                     required/> | ||||
|                            </div> | ||||
|                         </div> | ||||
|                 {/*--email end--*/} | ||||
|                 {/*--shoppingCost--*/} | ||||
|                 <div className="item-title text-center"> | ||||
|                 <h5>訂單運費設定</h5> | ||||
|                     </div> | ||||
|                     <div className="form-group"> | ||||
|                        <label className="col-xs-3 control-label">會員下訂單,當訂單金額少於NT$</label> | ||||
|                        <div className="col-xs-1"> | ||||
|                                 <input className="form-control" type="number" | ||||
|                                     value={param.PurchaseTotal} | ||||
|                                     onChange={this.setInputValue.bind(this, 'PurchaseTotal') } | ||||
|                                     min={0} | ||||
|                                     required/> | ||||
|                            </div> | ||||
|                         <label className="col-xs-2 control-label">元時須付常溫運費NT$</label> | ||||
|                        <div className="col-xs-1"> | ||||
|                                 <input className="form-control" type="number" | ||||
|                                     value={param.HomoiothermyFee} | ||||
|                                     onChange={this.setInputValue.bind(this, 'HomoiothermyFee') } | ||||
|                                     min={0} | ||||
|                                     required/> | ||||
|                            </div> | ||||
|                         <label className="col-xs-2 control-label">元或冷凍(冷藏)運費NT$</label> | ||||
|                        <div className="col-xs-1"> | ||||
|                                 <input className="form-control" type="number" | ||||
|                                     value={param.RefrigerFee} | ||||
|                                     onChange={this.setInputValue.bind(this, 'RefrigerFee') } | ||||
|                                     min={0} | ||||
|                                     required/> | ||||
|                            </div> | ||||
|                         <label className="col-xs-1 control-label">元</label> | ||||
|                         </div> | ||||
|  | ||||
|                 {/*--shoppingCost end--*/} | ||||
|                 {/*--Payment--*/} | ||||
|                 <div className="item-title text-center"> | ||||
|                 <h5>付款方式</h5> | ||||
|                     </div> | ||||
|                     <div className="form-group"> | ||||
|                      <label className="col-xs-4 control-label">當付款方式選擇『ATM轉帳』時,銀行帳號資料為: </label> | ||||
|                         </div> | ||||
|                     <div className="form-group"> | ||||
|                        <label className="col-xs-2 control-label">戶名: </label> | ||||
|                        <div className="col-xs-3"> | ||||
|                                 <input className="form-control" type="text" | ||||
|                                     value={param.AccountName} | ||||
|                                     onChange={this.setInputValue.bind(this, 'AccountName') } | ||||
|                                     maxLength={16} | ||||
|                                     required/> | ||||
|                            </div> | ||||
|                         </div> | ||||
|                     <div className="form-group"> | ||||
|                        <label className="col-xs-2 control-label">銀行: </label> | ||||
|                        <div className="col-xs-3"> | ||||
|                                 <input className="form-control" type="text" | ||||
|                                     value={param.BankName} | ||||
|                                     onChange={this.setInputValue.bind(this, 'BankName') } | ||||
|                                     maxLength={16} | ||||
|                                     required/> | ||||
|                            </div> | ||||
|                         </div> | ||||
|                     <div className="form-group"> | ||||
|                        <label className="col-xs-2 control-label">代碼: </label> | ||||
|                        <div className="col-xs-3"> | ||||
|                                 <input className="form-control" type="text" | ||||
|                                     value={param.BankCode} | ||||
|                                     onChange={this.setInputValue.bind(this, 'BankCode') } | ||||
|                                     maxLength={5} | ||||
|                                     required/> | ||||
|                            </div> | ||||
|                         </div> | ||||
|                     <div className="form-group"> | ||||
|                        <label className="col-xs-2 control-label">帳號: </label> | ||||
|                        <div className="col-xs-3"> | ||||
|                                 <input className="form-control" type="text" | ||||
|                                     value={param.AccountNumber} | ||||
|                                     onChange={this.setInputValue.bind(this, 'AccountNumber') } | ||||
|                                     maxLength={16} | ||||
|                                     required/> | ||||
|                            </div> | ||||
|                         </div> | ||||
|                     {/*<div className="form-group"> | ||||
|                      <label className="col-xs-4 control-label">當付款方式選擇『貨到付款』時,須加NT$ </label> | ||||
|                        <div className="col-xs-1"> | ||||
|                                 <input className="form-control" type="number" | ||||
|                                     value={param.Fee} | ||||
|                                     onChange={this.setInputValue.bind(this, 'Fee') } | ||||
|                                     min={0} | ||||
|                                     required/> | ||||
|                            </div> | ||||
|                      <label className="control-label">元手續費</label> | ||||
|                         </div>*/} | ||||
|                 {/*--Payment end--*/} | ||||
|                 </div> | ||||
|  | ||||
|  | ||||
|  | ||||
|             <div className="form-action"> | ||||
|                 <div className="col-xs-4 col-xs-offset-5"> | ||||
|                     <button type="submit" className="btn-primary"><i className="fa-check"></i> 儲存</button> | ||||
|                     </div> | ||||
|                 </div> | ||||
|             </div> | ||||
|         </form> | ||||
|                     </div> | ||||
|             ); | ||||
|  | ||||
|             return outHtml; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| var dom = document.getElementById('page_content'); | ||||
| ReactDOM.render(<Parm.GridForm caption={gb_caption} menuName={gb_menuname} iconClass="fa-list-alt" />, dom); | ||||
							
								
								
									
										863
									
								
								samples/TypeScript/triple-slash-reference.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										863
									
								
								samples/TypeScript/triple-slash-reference.tsx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,863 @@ | ||||
| /// <reference path="../DefinitelyTyped/react/react-global.d.ts" /> | ||||
|  | ||||
| // Fixture taken from https://github.com/RyanCavanaugh/koany/blob/master/koany.tsx | ||||
|  | ||||
| interface Garden { | ||||
| 	colors: Gardens.RockColor[]; | ||||
| 	shapes: Gardens.RockShape[]; | ||||
| } | ||||
|  | ||||
| namespace Gardens { | ||||
| 	export enum RockShape { | ||||
| 		Empty, | ||||
| 		Circle, | ||||
| 		Triangle, | ||||
| 		Square, | ||||
| 		Max | ||||
| 	} | ||||
| 	export const RockShapes = [RockShape.Circle, RockShape.Triangle, RockShape.Square]; | ||||
| 	export const RockShapesAndEmpty = RockShapes.concat(RockShape.Empty); | ||||
|  | ||||
| 	export enum RockColor { | ||||
| 		Empty, | ||||
| 		White, | ||||
| 		Red, | ||||
| 		Black, | ||||
| 		Max | ||||
| 	} | ||||
| 	export const RockColors = [RockColor.White, RockColor.Red, RockColor.Black]; | ||||
| 	export const RockColorsAndEmpty = RockColors.concat(RockColor.Empty); | ||||
|  | ||||
| 	export const Size = 9; | ||||
|  | ||||
| 	// 012 | ||||
| 	// 345 | ||||
| 	// 678 | ||||
| 	export const adjacencies = [ | ||||
| 		[1, 3], [0, 4, 2], [1, 5], | ||||
| 		[0, 4, 6], [3, 1, 7, 5], [2, 4, 8], | ||||
| 		[3, 7], [6, 4, 8], [7, 5] | ||||
| 	]; | ||||
| } | ||||
|  | ||||
| module Koan { | ||||
| 	export enum DescribeContext { | ||||
| 		// every "white stone" is ... | ||||
| 		Singular, | ||||
| 		// all "white stones" are | ||||
| 		Plural, | ||||
| 		// every stone in the top row is "white" | ||||
| 		Adjectival | ||||
| 	} | ||||
|  | ||||
| 	export enum PartType { | ||||
| 		Selector, | ||||
| 		Aspect | ||||
| 	} | ||||
|  | ||||
| 	export enum StateTestResult { | ||||
| 		Fail = 0, | ||||
| 		WeakPass = 1, | ||||
| 		Pass = 2 | ||||
| 	} | ||||
|  | ||||
| 	/// A general format for producing a Statement | ||||
| 	export interface StatementTemplate<T> { | ||||
| 		holes: PartType[]; | ||||
| 		describe(args: T): string; | ||||
| 		test(g: Garden, args: T): StateTestResult; | ||||
| 	} | ||||
|  | ||||
| 	/// A completed rule that can be used to test a Garden | ||||
| 	export interface ProducedStatement<T> { | ||||
| 		test(g: Garden): StateTestResult; | ||||
| 		description: string; | ||||
| 		children: T; | ||||
|  | ||||
| 		hasPassedAndFailed(): boolean; | ||||
| 	} | ||||
|  | ||||
| 	function rnd(max: number) { | ||||
| 		return Math.floor(Math.random() * max); | ||||
| 	} | ||||
|  | ||||
| 	function randomColor(): Gardens.RockColor { | ||||
| 		return Math.floor(Math.random() * (Gardens.RockColor.Max - 1)) + 1 | ||||
| 	} | ||||
|  | ||||
| 	function randomShape(): Gardens.RockShape { | ||||
| 		return Math.floor(Math.random() * (Gardens.RockShape.Max - 1)) + 1 | ||||
| 	} | ||||
|  | ||||
| 	/* New Impl Here */ | ||||
| 	interface SelectorSpec<T> { | ||||
| 		childTypes?: PartType[]; | ||||
| 		precedence: number; | ||||
| 		weight: number; | ||||
| 		test(args: T, g: Garden, index: number): string|number|boolean; | ||||
| 		describe(args: T, context: DescribeContext): string; | ||||
| 		isAllValues(values: Array<string>|Array<number>): boolean; | ||||
| 	} | ||||
|  | ||||
| 	interface ProducedSelector { | ||||
| 		test(g: Garden, index: number): string|number|boolean; | ||||
| 		getDescription(plural: DescribeContext): string; | ||||
| 		seenAllValues(): boolean; | ||||
| 	} | ||||
|  | ||||
| 	export function buildSelector<T>(spec: SelectorSpec<T>, args: T): ProducedSelector { | ||||
| 		let seenResults: { [s: string]: boolean;} = {}; | ||||
| 		return { | ||||
| 			test: (g: Garden, index: number) => { | ||||
| 				var result = spec.test(args, g, index); | ||||
| 				seenResults[result + ''] = true; | ||||
| 				return result; | ||||
| 			}, | ||||
| 			getDescription: (context) => { | ||||
| 				return spec.describe(args, context); | ||||
| 			}, | ||||
| 			seenAllValues: () => { | ||||
| 				return spec.isAllValues(Object.keys(seenResults)); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	export var SelectorTemplates: Array<SelectorSpec<{}>> = []; | ||||
| 	module LetsMakeSomeSelectors { | ||||
| 		// Is rock | ||||
| 		SelectorTemplates.push({ | ||||
| 			test: (args, g, i) => g.colors[i] !== Gardens.RockColor.Empty, | ||||
| 			describe: (args, context) => { | ||||
| 				switch(context) { | ||||
| 					case DescribeContext.Plural: | ||||
| 						return 'Stones'; | ||||
| 					case DescribeContext.Adjectival: | ||||
| 						return 'not empty'; | ||||
| 					case DescribeContext.Singular: | ||||
| 						return 'Stone'; | ||||
| 				} | ||||
| 			}, | ||||
| 			isAllValues: items => items.length === 2, | ||||
| 			precedence: 0, | ||||
| 			weight: 1 | ||||
| 		}); | ||||
|  | ||||
| 		// Is of a certain color and/or shape | ||||
| 		Gardens.RockColorsAndEmpty.forEach(color => { | ||||
| 			let colorName = Gardens.RockColor[color]; | ||||
| 			let colorWeight = color === Gardens.RockColor.Empty ? 1 : 0.33; | ||||
| 			Gardens.RockShapesAndEmpty.forEach(shape => { | ||||
| 				let shapeName = Gardens.RockShape[shape]; | ||||
| 				let shapeWeight = shape === Gardens.RockShape.Empty ? 1 : 0.33; | ||||
| 				SelectorTemplates.push({ | ||||
| 					test: (args, g, i) => { | ||||
| 						if(color === Gardens.RockColor.Empty) { | ||||
| 							if (shape === Gardens.RockShape.Empty) { | ||||
| 								return g.colors[i] === Gardens.RockColor.Empty; | ||||
| 							} else { | ||||
| 								return g.shapes[i] === shape; | ||||
| 							} | ||||
| 						} else { | ||||
| 							if (shape === Gardens.RockShape.Empty) { | ||||
| 								return g.colors[i] === color; | ||||
| 							} else { | ||||
| 								return g.shapes[i] === shape && g.colors[i] === color; | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					describe: (args, context) => { | ||||
| 						if(color === Gardens.RockColor.Empty) { | ||||
| 							if (shape === Gardens.RockShape.Empty) { | ||||
| 								switch(context) { | ||||
| 									case DescribeContext.Plural: | ||||
| 										return 'Empty Cells'; | ||||
| 									case DescribeContext.Adjectival: | ||||
| 										return 'Empty'; | ||||
| 									case DescribeContext.Singular: | ||||
| 										return 'Empty Cell'; | ||||
| 								} | ||||
| 							} else { | ||||
| 								switch(context) { | ||||
| 									case DescribeContext.Plural: | ||||
| 										return shapeName + 's'; | ||||
| 									case DescribeContext.Adjectival: | ||||
| 										return 'a ' + shapeName; | ||||
| 									case DescribeContext.Singular: | ||||
| 										return shapeName; | ||||
| 								} | ||||
| 							} | ||||
| 						} else { | ||||
| 							if (shape === Gardens.RockShape.Empty) { | ||||
| 								switch(context) { | ||||
| 									case DescribeContext.Plural: | ||||
| 										return colorName + ' Stones'; | ||||
| 									case DescribeContext.Adjectival: | ||||
| 										return colorName; | ||||
| 									case DescribeContext.Singular: | ||||
| 										return colorName + ' Stone'; | ||||
| 								} | ||||
| 							} else { | ||||
| 								switch(context) { | ||||
| 									case DescribeContext.Plural: | ||||
| 										return colorName + ' ' + shapeName + 's'; | ||||
| 									case DescribeContext.Adjectival: | ||||
| 										return 'a ' + colorName + ' ' + shapeName; | ||||
| 									case DescribeContext.Singular: | ||||
| 										return colorName + ' ' + shapeName; | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					isAllValues: items => items.length === 2, | ||||
| 					precedence: 3, | ||||
| 					weight: (shapeWeight + colorWeight === 2) ? 0.3 : shapeWeight * colorWeight | ||||
| 				}); | ||||
| 			}); | ||||
| 		}); | ||||
|  | ||||
| 		// [?] in the [top|middle|bottom] [row|column] | ||||
| 		[0, 1, 2].forEach(rowCol => { | ||||
| 			[true, false].forEach(isRow => { | ||||
| 				var name = (isRow ? ['top', 'middle', 'bottom'] : ['left', 'middle', 'right'])[rowCol] + ' ' + (isRow ? 'row' : 'column'); | ||||
| 				var spec: SelectorSpec<[ProducedSelector]> = { | ||||
| 					childTypes: [PartType.Selector], | ||||
| 					test: (args, g, i) => { | ||||
| 						var c = isRow ? Math.floor(i / 3) : i % 3; | ||||
| 						if (c === rowCol) { | ||||
| 							return args[0].test(g, i); | ||||
| 						} else { | ||||
| 							return false; | ||||
| 						} | ||||
| 					}, | ||||
| 					describe: (args, plural) => args[0].getDescription(plural) + ' in the ' + name, | ||||
| 					isAllValues: items => items.length === 2, | ||||
| 					precedence: 4, | ||||
| 					weight: 1 / 6 | ||||
| 				}; | ||||
| 				SelectorTemplates.push(spec); | ||||
| 			}); | ||||
| 		}); | ||||
|  | ||||
| 		// [?] next to a [?] | ||||
| 		SelectorTemplates.push({ | ||||
| 			childTypes: [PartType.Selector, PartType.Selector], | ||||
| 			test: (args, g, i) => { | ||||
| 				if (args[0].test(g, i)) { | ||||
| 					return Gardens.adjacencies[i].some(x => !!args[1].test(g, x)); | ||||
| 				} else { | ||||
| 					return false; | ||||
| 				} | ||||
| 			}, | ||||
| 			describe: (args, plural) => { | ||||
| 				return args[0].getDescription(plural) + ' next to a ' + args[1].getDescription(DescribeContext.Singular); | ||||
| 			}, | ||||
| 			isAllValues: items => items.length === 2, | ||||
| 			precedence: 4, | ||||
| 			weight: 1 | ||||
| 		} as SelectorSpec<[ProducedSelector, ProducedSelector]>); | ||||
| 	} | ||||
|  | ||||
| 	export function buildStatement<T>(s: StatementTemplate<T>, args: T): ProducedStatement<T> { | ||||
| 		let hasPassed = false; | ||||
| 		let hasFailed = false; | ||||
|  | ||||
| 		let result: ProducedStatement<T> = { | ||||
| 			children: args, | ||||
| 			description: s.describe(args), | ||||
| 			test: (g) => { | ||||
| 				let r = s.test(g, args); | ||||
| 				if (r === StateTestResult.Pass) { | ||||
| 					hasPassed = true; | ||||
| 				} else if(r === StateTestResult.Fail) { | ||||
| 					hasFailed = true; | ||||
| 				} | ||||
| 				return r; | ||||
| 			}, | ||||
| 			hasPassedAndFailed: () => { | ||||
| 				return hasPassed && hasFailed && (args as any as ProducedSelector[]).every(c => c.seenAllValues()); | ||||
| 			} | ||||
| 		}; | ||||
| 		return result; | ||||
| 	} | ||||
|  | ||||
| 	export let StatementList: StatementTemplate<any>[] = []; | ||||
| 	module LetsMakeSomeStatements { | ||||
| 		// Every [?] is a [?] | ||||
| 		StatementList.push({ | ||||
| 			holes: [PartType.Selector, PartType.Selector], | ||||
| 			test: (g: Garden, args: [ProducedSelector, ProducedSelector]) => { | ||||
| 				let didAnyTests = false; | ||||
| 				for (var i = 0; i < Gardens.Size; i++) { | ||||
| 					if (args[0].test(g, i)) { | ||||
| 						if(!args[1].test(g, i)) return StateTestResult.Fail; | ||||
| 						didAnyTests = true; | ||||
| 					} | ||||
| 				} | ||||
| 				return didAnyTests ? StateTestResult.Pass : StateTestResult.WeakPass; | ||||
| 			}, | ||||
| 			describe: args => { | ||||
| 				return 'Every ' + args[0].getDescription(DescribeContext.Singular) + ' is ' + args[1].getDescription(DescribeContext.Adjectival); | ||||
| 			} | ||||
| 		}); | ||||
|  | ||||
| 		// There is exactly 1 [?] | ||||
| 		StatementList.push({ | ||||
| 			holes: [PartType.Selector], | ||||
| 			test: (g: Garden, args: [ProducedSelector, ProducedSelector]) => { | ||||
| 				var count = 0; | ||||
| 				for (var i = 0; i < Gardens.Size; i++) { | ||||
| 					if (args[0].test(g, i)) count++; | ||||
| 				} | ||||
|  | ||||
| 				return count === 1 ? StateTestResult.Pass : StateTestResult.Fail; | ||||
| 			}, | ||||
| 			describe: args => { | ||||
| 				return 'There is exactly one ' + args[0].description; | ||||
| 			} | ||||
| 		}); | ||||
|  | ||||
| 		// There are more [?] than [?] | ||||
| 		StatementList.push({ | ||||
| 			holes: [PartType.Selector, PartType.Selector], | ||||
| 			test: (g: Garden, args: [ProducedSelector, ProducedSelector]) => { | ||||
| 				var p1c = 0, p2c = 0; | ||||
| 				for (var i = 0; i < Gardens.Size; i++) { | ||||
| 					if (args[0].test(g, i)) p1c++; | ||||
| 					if (args[1].test(g, i)) p2c++; | ||||
| 				} | ||||
| 				if(p1c > p2c && p2c > 0) { | ||||
| 					return StateTestResult.Pass; | ||||
| 				} else if(p1c > p2c) { | ||||
| 					return StateTestResult.WeakPass; | ||||
| 				} else { | ||||
| 					return StateTestResult.Fail; | ||||
| 				} | ||||
| 			}, | ||||
| 			describe: args => { | ||||
| 				return 'There are more ' + args[0].descriptionPlural + ' than ' + args[1].descriptionPlural; | ||||
| 			} | ||||
| 		}); | ||||
| 	} | ||||
|  | ||||
| 	function randomElementOf<T>(arr: T[]): T { | ||||
| 		if (arr.length === 0) { | ||||
| 			return undefined; | ||||
| 		} else { | ||||
| 			return arr[Math.floor(Math.random() * arr.length)]; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	function randomWeightedElementOf<T extends { weight: number }>(arr: T[]): T { | ||||
| 		var totalWeight = arr.reduce((acc, v) => acc + v.weight, 0); | ||||
| 		var rnd = Math.random() * totalWeight; | ||||
| 		for (var i = 0; i < arr.length; i++) { | ||||
| 			rnd -= arr[i].weight; | ||||
| 			if (rnd <= 0) return arr[i]; | ||||
| 		} | ||||
| 		// Got destroyed by floating error, just try again | ||||
| 		return randomWeightedElementOf(arr); | ||||
| 	} | ||||
|  | ||||
| 	export function buildRandomNewSelector(maxPrecedence = 1000000): ProducedSelector { | ||||
| 		var choices = SelectorTemplates; | ||||
|  | ||||
| 		let initial = randomWeightedElementOf(choices.filter(p => p.precedence <= maxPrecedence)); | ||||
| 		// Fill in the holes | ||||
| 		if (initial.childTypes) { | ||||
| 			var fills = initial.childTypes.map(h => { | ||||
| 				if (h === PartType.Selector) { | ||||
| 					return buildRandomNewSelector(initial.precedence - 1); | ||||
| 				} else { | ||||
| 					throw new Error('Only know how to fill Selector holes') | ||||
| 				} | ||||
| 			}); | ||||
| 			return buildSelector(initial, fills); | ||||
| 		} else { | ||||
| 			return buildSelector(initial, []); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	export function makeEmptyGarden(): Garden { | ||||
| 		var g = {} as Garden; | ||||
| 		g.colors = []; | ||||
| 		g.shapes = []; | ||||
| 		for (var i = 0; i < Gardens.Size; i++) { | ||||
| 			g.colors.push(Gardens.RockColor.Empty); | ||||
| 			g.shapes.push(Gardens.RockShape.Empty); | ||||
| 		} | ||||
|  | ||||
| 		return g; | ||||
| 	} | ||||
|  | ||||
| 	export function gardenToString(g: Garden): string { | ||||
| 		return g.colors.join('') + g.shapes.join(''); | ||||
| 	} | ||||
|  | ||||
| 	export function makeRandomGarden(): Garden { | ||||
| 		var g = makeEmptyGarden(); | ||||
| 		blitRandomGardenPair(g, g); | ||||
| 		return g; | ||||
| 	} | ||||
|  | ||||
| 	export function cloneGarden(g: Garden): Garden { | ||||
| 		var result: Garden = { | ||||
| 			colors: g.colors.slice(0), | ||||
| 			shapes: g.shapes.slice(0) | ||||
| 		}; | ||||
| 		return result; | ||||
| 	} | ||||
|  | ||||
| 	export function clearGarden(g: Garden) { | ||||
| 		for (var i = 0; i < Gardens.Size; i++) { | ||||
| 			g.colors[i] = Gardens.RockColor.Empty; | ||||
| 			g.shapes[i] = Gardens.RockShape.Empty; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	export function blitRandomGardenPair(g1: Garden, g2: Garden): void { | ||||
| 		let placeCount = 0; | ||||
| 		for (var i = 0; i < Gardens.Size; i++) { | ||||
| 			if (rnd(7) === 0) { | ||||
| 				g1.colors[i] = g2.colors[i] = randomColor(); | ||||
| 				g1.shapes[i] = g2.shapes[i] = randomShape(); | ||||
| 			} else { | ||||
| 				placeCount++; | ||||
| 				g1.colors[i] = g2.colors[i] = Gardens.RockColor.Empty; | ||||
| 				g1.shapes[i] = g2.shapes[i] = Gardens.RockShape.Empty; | ||||
| 			} | ||||
| 		} | ||||
| 		if (placeCount === 0) blitRandomGardenPair(g1, g2); | ||||
| 	} | ||||
|  | ||||
| 	export function blitNumberedGarden(g: Garden, stoneCount: number, n: number): void { | ||||
| 		clearGarden(g); | ||||
|  | ||||
| 		let cellNumbers = [0, 1, 2, 3, 4, 5, 6, 7, 8]; | ||||
| 		for (let i = 0; i < stoneCount; i++) { | ||||
| 			let cellNum = getValue(cellNumbers.length); | ||||
| 			let cell = cellNumbers.splice(cellNum, 1)[0]; | ||||
| 			g.colors[cell] = getValue(3) + 1; | ||||
| 			g.shapes[cell] = getValue(3) + 1; | ||||
| 		} | ||||
|  | ||||
| 		function getValue(max: number) { | ||||
| 			let result = n % max; | ||||
| 			n = (n - result) / max; | ||||
| 			return result; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	export function mutateGarden(g: Garden): void { | ||||
| 		while (true) { | ||||
| 			var op = rnd(5); | ||||
| 			let x = rnd(Gardens.Size); | ||||
| 			let y = rnd(Gardens.Size); | ||||
| 			switch (op) { | ||||
| 				case 0: // Swap two non-identical cells | ||||
| 					if (g.colors[x] !== g.colors[y] || g.shapes[x] !== g.shapes[y]) { | ||||
| 						var tmp: any = g.colors[x]; | ||||
| 						g.colors[x] = g.colors[y]; | ||||
| 						g.colors[y] = tmp; | ||||
| 						tmp = g.shapes[x]; | ||||
| 						g.shapes[x] = g.shapes[y]; | ||||
| 						g.shapes[y] = tmp; | ||||
| 						return; | ||||
| 					} | ||||
| 					break; | ||||
| 				case 1: // Add a stone | ||||
| 					if (g.colors[x] === Gardens.RockColor.Empty) { | ||||
| 						g.colors[x] = randomColor(); | ||||
| 						g.shapes[x] = randomShape(); | ||||
| 						return; | ||||
| 					} | ||||
| 					break; | ||||
| 				case 2: // Remove a stone | ||||
| 					if (g.colors.filter(x => x !== Gardens.RockColor.Empty).length === 1) continue; | ||||
|  | ||||
| 					if (g.colors[x] !== Gardens.RockColor.Empty) { | ||||
| 						g.colors[x] = Gardens.RockColor.Empty; | ||||
| 						g.shapes[x] = Gardens.RockShape.Empty; | ||||
| 						return; | ||||
| 					} | ||||
| 					break; | ||||
| 				case 3: // Change a color | ||||
| 					let c = randomColor(); | ||||
| 					if (g.colors[x] !== Gardens.RockColor.Empty && g.colors[x] !== c) { | ||||
| 						g.colors[x] = c; | ||||
| 						return; | ||||
| 					} | ||||
| 					break; | ||||
| 				case 4: // Change a shape | ||||
| 					let s = randomShape(); | ||||
| 					if (g.shapes[x] !== Gardens.RockShape.Empty && g.shapes[x] !== s) { | ||||
| 						g.shapes[x] = s; | ||||
| 						return; | ||||
| 					} | ||||
| 					break; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| class Indexion { | ||||
| 	sizes: number[]; | ||||
| 	constructor(...sizes: number[]) { | ||||
| 		this.sizes = sizes; | ||||
| 	} | ||||
|  | ||||
| 	public getValues(index: number): number[] { | ||||
| 		let result = new Array<number>(this.sizes.length); | ||||
| 		this.fillValues(index, result); | ||||
| 		return result; | ||||
| 	} | ||||
|  | ||||
| 	public fillValues(index: number, result: number[]): void { | ||||
| 		for (var i = 0; i < this.sizes.length; i++) { | ||||
| 			result[i] = index % this.sizes[i]; | ||||
| 			index -= result[i]; | ||||
| 			index /= this.sizes[i]; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	public valuesToIndex(values: number[]): number { | ||||
| 		var result = 0; | ||||
| 		var factor = 1; | ||||
| 		for (var i = 0; i < this.sizes.length; i++) { | ||||
| 			result += values[i] * this.sizes[i] * factor; | ||||
| 			factor *= this.sizes[i]; | ||||
| 		} | ||||
| 		return result; | ||||
| 	} | ||||
|  | ||||
| 	public getAdjacentIndices(index: number): number[][] { | ||||
| 		var baseline = this.getValues(index); | ||||
| 		var results: number[][] = []; | ||||
| 		for (var i = 0; i < this.sizes.length; i++) { | ||||
| 			if(baseline[i] > 0) { | ||||
| 				baseline[i]--; | ||||
| 				results.push(baseline.slice()); | ||||
| 				baseline[i]++; | ||||
| 			} | ||||
| 			if(baseline[i] < this.sizes[i] - 1) { | ||||
| 				baseline[i]++; | ||||
| 				results.push(baseline.slice()); | ||||
| 				baseline[i]--; | ||||
| 			} | ||||
| 		} | ||||
| 		return results; | ||||
| 	} | ||||
|  | ||||
| 	public distance(index1: number, index2: number): number { | ||||
| 		let delta = 0; | ||||
| 		for (var i = 0; i < this.sizes.length; i++) { | ||||
| 			var a = index1 % this.sizes[i]; | ||||
| 			var b = index2 % this.sizes[i]; | ||||
| 			delta += Math.abs(b - a); | ||||
| 			index1 -= a; | ||||
| 			index2 -= b; | ||||
| 			index1 /= this.sizes[i]; | ||||
| 			index2 /= this.sizes[i]; | ||||
| 		} | ||||
| 		return delta; | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| function makeNewExample() { | ||||
| 	while (true) { | ||||
| 		var p1 = Koan.buildSelector(Koan.SelectorTemplates[12], []); | ||||
| 		var p2 = Koan.buildSelector(Koan.SelectorTemplates[14], []); | ||||
| 		var test = Koan.buildStatement(Koan.StatementList[0], [p1, p2]); | ||||
|  | ||||
| 		var examples: Garden[] = []; | ||||
|  | ||||
| 		console.log('Attempt to generate examples for "' + test.description + '"'); | ||||
|  | ||||
| 		var maxGarden = /*(9 * 9) + (9 * 9 * 9 * 8) + */(9 * 9 * 9 * 8 * 9 * 7); | ||||
| 		let g = Koan.makeEmptyGarden(); | ||||
| 		let passCount = 0, failCount = 0; | ||||
| 		let resultLookup: boolean[] = []; | ||||
| 		let lastResult: boolean = undefined; | ||||
| 		for (var i = 0; i < maxGarden; i++) { | ||||
| 			Koan.blitNumberedGarden(g, 3, i); | ||||
| 			let result = test.test(g); | ||||
| 			if(result === Koan.StateTestResult.Pass) { | ||||
| 				resultLookup[i] = true; | ||||
| 				passCount++; | ||||
|  | ||||
| 				if (lastResult !== true && examples.length < 10) examples.push(Koan.cloneGarden(g)); | ||||
| 				lastResult = true; | ||||
| 			} else if (result === Koan.StateTestResult.Fail) { | ||||
| 				resultLookup[i] = false; | ||||
| 				failCount++; | ||||
|  | ||||
| 				if (lastResult !== false && examples.length < 10) examples.push(Koan.cloneGarden(g)); | ||||
| 				lastResult = false; | ||||
| 			} | ||||
|  | ||||
| 			if (examples.length === 10) break; | ||||
| 		} | ||||
|  | ||||
| 		console.log('Rule passes ' + passCount + ' and fails ' + failCount); | ||||
|  | ||||
| 		/* | ||||
| 		if (!test.hasPassedAndFailed()) { | ||||
| 			console.log('Rule has unreachable, contradictory, or tautological clauses'); | ||||
| 			continue; | ||||
| 		} | ||||
|  | ||||
| 		if (passCount === 0 || failCount === 0) { | ||||
| 			console.log('Rule is always true or always false'); | ||||
| 			continue; | ||||
| 		} | ||||
| 		*/ | ||||
|  | ||||
| 		var h = document.createElement('h2'); | ||||
| 		h.innerText = test.description; | ||||
| 		document.body.appendChild(h); | ||||
|  | ||||
| 		return { test: test, examples: examples }; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| let list: Garden[] = []; | ||||
| let test: Koan.ProducedStatement<any>; | ||||
| window.onload = function() { | ||||
| 	let rule = makeNewExample(); | ||||
| 	let garden = Koan.makeRandomGarden(); | ||||
| 	list = rule.examples; | ||||
| 	test = rule.test; | ||||
|  | ||||
| 	function renderList() { | ||||
| 		function makeGarden(g: Garden, i: number) { | ||||
| 			return <GardenDisplay | ||||
| 				garden={g} | ||||
| 				key={i + Koan.gardenToString(g)} | ||||
| 				test={test} | ||||
| 				leftButton='✗' | ||||
| 				rightButton='✎' | ||||
| 				onLeftButtonClicked={() => { | ||||
| 					console.log(list.indexOf(g)); | ||||
| 					list.splice(list.indexOf(g), 1); | ||||
| 					renderList(); | ||||
| 				}} | ||||
| 				onRightButtonClicked={() => { | ||||
| 					garden = g; | ||||
| 					renderEditor(); | ||||
| 				}} | ||||
| 			/>; | ||||
| 		} | ||||
| 		let gardenList = <div>{list.map(makeGarden)}</div>; | ||||
| 		React.render(gardenList, document.getElementById('results')); | ||||
| 	} | ||||
|  | ||||
| 	let i = 0; | ||||
| 	function renderEditor() { | ||||
| 		i++; | ||||
| 		let editor = <GardenEditor key={i} test={rule.test} garden={garden} onSaveClicked={(garden) => { | ||||
| 			list.push(garden); | ||||
| 			renderList(); | ||||
| 		}} />; | ||||
| 		React.render(editor, document.getElementById('editor')); | ||||
| 	} | ||||
|  | ||||
| 	renderList(); | ||||
| 	renderEditor(); | ||||
| } | ||||
|  | ||||
| function classNames(nameMap: any): string { | ||||
| 	return Object.keys(nameMap).filter(k => nameMap[k]).join(' '); | ||||
| } | ||||
|  | ||||
| interface GardenCellProps extends React.Props<{}> { | ||||
| 	color: Gardens.RockColor; | ||||
| 	shape: Gardens.RockShape; | ||||
| 	index: number; | ||||
|  | ||||
| 	movable?: boolean; | ||||
| 	onEdit?(newColor: Gardens.RockColor, newShape: Gardens.RockShape): void; | ||||
| } | ||||
| interface GardenCellState { | ||||
| 	isDragging?: boolean; | ||||
| } | ||||
| class GardenCell extends React.Component<GardenCellProps, GardenCellState> { | ||||
| 	state: GardenCellState = {}; | ||||
| 	ignoreNextEdit = false; | ||||
|  | ||||
| 	render() { | ||||
| 		var classes = ['cell', 'index_' + this.props.index]; | ||||
|  | ||||
| 		if (this.state.isDragging) { | ||||
| 			// Render as blank | ||||
| 		} else { | ||||
| 			classes.push(Gardens.RockColor[this.props.color], Gardens.RockShape[this.props.shape]); | ||||
| 		} | ||||
|  | ||||
| 		if (this.props.movable) classes.push('movable'); | ||||
| 		let events: React.HTMLAttributes = { | ||||
| 			onDragStart: (e) => { | ||||
| 				this.ignoreNextEdit = false; | ||||
| 				e.dataTransfer.dropEffect = 'copyMove'; | ||||
| 				e.dataTransfer.effectAllowed = 'move'; | ||||
| 				e.dataTransfer.setData('shape', this.props.shape.toString()); | ||||
| 				e.dataTransfer.setData('color', this.props.color.toString()); | ||||
|  | ||||
| 				let drag = document.getElementById(getGardenName(this.props.color, this.props.shape)); | ||||
| 				let xfer: any = (e.nativeEvent as DragEvent).dataTransfer; | ||||
| 				xfer.setDragImage(drag, drag.clientWidth * 0.5, drag.clientHeight * 0.5); | ||||
|  | ||||
| 				this.setState({ isDragging: true }); | ||||
| 			}, | ||||
| 			onDragEnter: (e) => { | ||||
| 				e.dataTransfer.dropEffect = 'move'; | ||||
| 				e.preventDefault(); | ||||
| 			}, | ||||
| 			onDragOver: (e) => { | ||||
| 				e.dataTransfer.dropEffect = 'move'; | ||||
| 				e.preventDefault(); | ||||
| 			}, | ||||
| 			onDragEnd: (e) => { | ||||
| 				this.setState({ isDragging: false }); | ||||
| 				if (!this.ignoreNextEdit) { | ||||
| 					this.props.onEdit && this.props.onEdit(undefined, undefined); | ||||
| 				} | ||||
| 			}, | ||||
| 			draggable: true | ||||
| 		} | ||||
|  | ||||
| 		let handleDrop = (event: React.DragEvent) => { | ||||
| 			if(this.props.onEdit) { | ||||
| 				if (this.state.isDragging) { | ||||
| 					// Dragged to self, don't do anything | ||||
| 					this.ignoreNextEdit = true; | ||||
| 				} else { | ||||
| 					let shape: Gardens.RockShape = +event.dataTransfer.getData('shape'); | ||||
| 					let color: Gardens.RockColor = +event.dataTransfer.getData('color'); | ||||
| 					this.props.onEdit(color, shape); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return <span className={classes.join(' ')} onDrop={handleDrop} {...this.props.movable ? events : {}} />; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| interface GardenDisplayProps extends React.Props<GardenDisplay> { | ||||
| 	garden?: Garden; | ||||
| 	test?: Koan.ProducedStatement<any>; | ||||
|  | ||||
| 	leftButton?: string; | ||||
| 	rightButton?: string; | ||||
| 	onLeftButtonClicked?(): void; | ||||
| 	onRightButtonClicked?(): void; | ||||
|  | ||||
| 	editable?: boolean; | ||||
| 	onChanged?(newGarden: Garden): void; | ||||
| } | ||||
| interface GardenDisplayState { | ||||
| 	garden?: Garden; | ||||
| } | ||||
| class GardenDisplay extends React.Component<GardenDisplayProps, GardenDisplayState> { | ||||
| 	state = { | ||||
| 		garden: Koan.cloneGarden(this.props.garden) | ||||
| 	}; | ||||
|  | ||||
| 	leftClicked = () => { | ||||
| 		this.props.onLeftButtonClicked && this.props.onLeftButtonClicked(); | ||||
| 	}; | ||||
|  | ||||
| 	rightClicked = () => { | ||||
| 		this.props.onRightButtonClicked && this.props.onRightButtonClicked(); | ||||
| 	}; | ||||
|  | ||||
| 	render() { | ||||
| 		let g = this.state.garden; | ||||
| 		let pass = (this.props.test && this.props.test.test(this.state.garden)); | ||||
|  | ||||
| 		let classes = { | ||||
| 			garden: true, | ||||
| 			unknown: pass === undefined, | ||||
| 			pass: pass === Koan.StateTestResult.Pass || pass === Koan.StateTestResult.WeakPass, | ||||
| 			fail: pass === Koan.StateTestResult.Fail, | ||||
| 			editable: this.props.editable | ||||
| 		}; | ||||
|  | ||||
| 		var children = g.colors.map((_, i) => ( | ||||
| 			<GardenCell | ||||
| 				key={i} | ||||
| 				color={g.colors[i]} | ||||
| 				shape={g.shapes[i]} | ||||
| 				index={i} | ||||
| 				movable={this.props.editable} | ||||
| 				onEdit={(newColor, newShape) => { | ||||
| 					if(this.props.editable) { | ||||
| 						let newGarden = Koan.cloneGarden(this.state.garden); | ||||
| 						newGarden.colors[i] = newColor; | ||||
| 						newGarden.shapes[i] = newShape; | ||||
| 						this.setState({ garden: newGarden }); | ||||
| 						this.props.onChanged && this.props.onChanged(newGarden); | ||||
| 					} | ||||
| 				}} | ||||
| 			/>)); | ||||
|  | ||||
| 		return <div className="gardenDisplay"> | ||||
| 			<div className={classNames(classes)}>{children}</div> | ||||
| 			<span className="infoRow"> | ||||
| 				{this.props.leftButton && <div className="button left" onClick={this.leftClicked}>{this.props.leftButton}</div>} | ||||
| 				<div className={"passfail " + (pass ? 'pass' : 'fail')}>{pass ? '✓' : '🚫'}</div> | ||||
| 				{this.props.rightButton && <div className="button right" onClick={this.rightClicked}>{this.props.rightButton}</div>} | ||||
| 			</span> | ||||
| 		</div>; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| interface GardenEditorProps extends React.Props<GardenEditor> { | ||||
| 	onSaveClicked?(garden: Garden): void; | ||||
| 	test?: Koan.ProducedStatement<any>; | ||||
| 	garden?: Garden; | ||||
| } | ||||
| interface GardenEditorState { | ||||
| 	garden?: Garden; | ||||
| 	pass?: boolean; | ||||
| } | ||||
| class GardenEditor extends React.Component<GardenEditorProps, {}> { | ||||
| 	state = { garden: this.props.garden }; | ||||
|  | ||||
| 	save = () => { | ||||
| 		this.props.onSaveClicked && this.props.onSaveClicked(this.state.garden); | ||||
| 	}; | ||||
|  | ||||
| 	render() { | ||||
| 		return <div className="editor"> | ||||
| 			<GardenDisplay garden={this.state.garden} test={this.props.test} editable onChanged={g => this.setState({ garden: g }) } /> | ||||
| 			<StonePalette /> | ||||
| 			<div className="button save" onClick={this.save}>{'💾'}</div> | ||||
| 		</div>; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| class StonePalette extends React.Component<{}, {}> { | ||||
| 	render() { | ||||
| 		let items: JSX.Element[] = []; | ||||
| 		Gardens.RockColors.forEach(color => { | ||||
| 			Gardens.RockShapes.forEach(shape => { | ||||
| 				let name = getGardenName(color, shape); | ||||
| 				let extraProps = { id: name, key: name }; | ||||
| 				let index = items.length; | ||||
| 				items.push(<GardenCell | ||||
| 					color={color} | ||||
| 					shape={shape} | ||||
| 					index={index} | ||||
| 					movable | ||||
| 					{...extraProps} />) | ||||
| 			}); | ||||
| 		}); | ||||
| 		return <div className="palette">{items}</div>; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| function getGardenName(color: Gardens.RockColor, shape: Gardens.RockShape) { | ||||
| 	return 'draggable.' + Gardens.RockShape[shape] + '.' + Gardens.RockColor[color]; | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -1,27 +0,0 @@ | ||||
| //@jsx: preserve | ||||
| //@module: amd | ||||
|  | ||||
| //@filename: react.d.ts | ||||
| declare module JSX { | ||||
| 	interface Element { } | ||||
| 	interface IntrinsicElements { | ||||
| 	} | ||||
| 	interface ElementAttributesProperty { | ||||
| 		props; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| interface Props {   | ||||
|   foo: string; | ||||
| } | ||||
|  | ||||
| //@filename: file.tsx | ||||
| export class MyComponent {   | ||||
|   render() { | ||||
|   } | ||||
|  | ||||
|   props: { foo: string; } | ||||
| } | ||||
|  | ||||
| <MyComponent foo="bar" />; // ok   | ||||
| <MyComponent foo={0} />; // should be an error | ||||
							
								
								
									
										25
									
								
								samples/XML/wixdemo.wixproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								samples/XML/wixdemo.wixproj
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||||
| 	<PropertyGroup> | ||||
| 			<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> | ||||
| 			<Platform Condition=" '$(Platform)' == '' ">x86</Platform> | ||||
| 			<ProductVersion>3.0</ProductVersion> | ||||
| 			<ProjectGuid>{c523055d-a9d0-4318-ae85-ec934d33204b}</ProjectGuid> | ||||
| 			<SchemaVersion>2.0</SchemaVersion> | ||||
| 			<OutputName>WixProject1</OutputName> | ||||
| 			<OutputType>Package</OutputType> | ||||
| 			<WixTargetsPath Condition=" '$(WixTargetsPath)' == '' ">$(MSBuildExtensionsPath)\Microsoft\WiX\v[[Version.Major]].x\Wix.targets</WixTargetsPath> | ||||
| 	</PropertyGroup> | ||||
| 	<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' "> | ||||
| 			<OutputPath>bin\$(Configuration)\</OutputPath> | ||||
| 			<IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath> | ||||
| 			<DefineConstants>Debug</DefineConstants> | ||||
| 	</PropertyGroup> | ||||
| 	<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' "> | ||||
| 			<OutputPath>bin\$(Configuration)\</OutputPath> | ||||
| 			<IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath> | ||||
| 	</PropertyGroup> | ||||
| 	<ItemGroup> | ||||
| 			<Compile Include="Product.wxs" /> | ||||
| 	</ItemGroup> | ||||
| 	<Import Project="$(WixTargetsPath)" /> | ||||
| </Project> | ||||
| @@ -13,36 +13,37 @@ class TestGrammars < Minitest::Test | ||||
|   HASH_WHITELIST = [ | ||||
|     "bc12b3b4917eab9aedb87ec1305c2a4376e34fd1", # TextMate bundles | ||||
|     "16c4748566b3dd996594af0410a1875b22d3a2b3", # language-yaml and atom-salt | ||||
|     "ebae2d87e06d3acef075d049fcfc8958c0364863", # go-tmbundle | ||||
|     "ff21db2554d69d78b2220db5615b16bbba0788d3", # factor | ||||
|     "b9a7428fd036eed8503995e06e989180c276b17d", # jflex.tmbundle | ||||
|     "b4381ebae3235e91aaf5ccab1e8e94e9ad4faef4", # jflex.tmbundle | ||||
|     "da39a3ee5e6b4b0d3255bfef95601890afd80709", # SCSS.tmbundle | ||||
|     "5f772ff20ddf3dbac1ec9b6a98c5aa50ace555b2", # gradle.tmbundle | ||||
|     "b5432a1e1055de7eeede2dddf91e009480651fd6", # jasmin-sublime | ||||
|     "74143c4d2a5649eb179105afcb37f466558c22ce", # language-clojure | ||||
|     "760471435f5ab0b9dc99a628203cd8f9156d28ce", # language-coffee-script | ||||
|     "170b35df61879139b88379a8f1bfd86289c13599", # language-clojure | ||||
|     "60e1fe192238a032341d5dd3cd80535459fc84e4", # language-coffee-script | ||||
|     "94fbd554ec1837fb7c508fd7425326639c3f4103", # language-csharp | ||||
|     "70fb557a431891c2d634c33fa7367feab5066fd6", # language-javascript | ||||
|     "e0528c23cd967f999e058f1408ccb5b7237daaba", # language-python | ||||
|     "8653305b358375d0fced85dc24793b99919b11ef", # language-shellscript | ||||
|     "9f0c0b0926a18f5038e455e8df60221125fc3111", # elixir-tmbundle | ||||
|     "90af581219debd4e90ef041b46c294e8b4ae6d14", # mako-tmbundle | ||||
|     "a4dadb2374282098c5b8b14df308906f5347d79a", # mako-tmbundle | ||||
|     "b9b24778619dce325b651f0d77cbc72e7ae0b0a3", # Julia.tmbundle | ||||
|     "e06722add999e7428048abcc067cd85f1f7ca71c", # r.tmbundle | ||||
|     "50b14a0e3f03d7ca754dac42ffb33302b5882b78", # smalltalk-tmbundle | ||||
|     "eafbc4a2f283752858e6908907f3c0c90188785b", # gap-tmbundle | ||||
|     "1faa3a44cac6070f22384332434af37dfaaf2f70", # Stylus | ||||
|     "22b3bf41b9e3e8c22357ee12265f149d68aae60a", # Stylus | ||||
|     "c87e7e574fca543941650e5b0a144b44c02c55d8", # language-crystal | ||||
|     "c78ec142ac3126cf639cfd67bd646ed8226d8b74", # atom-language-purescript | ||||
|     "341d7f66806fc41d081133d6e51ade856352e056", # FreeMarker.tmbundle | ||||
|     "ace112feb693358db2970d0805f6894b745e14b5", # atom-language-purescript | ||||
|     "a626362e3efd030c1d97c0faf422cf8c2dfaea54", # FreeMarker.tmbundle | ||||
|     "15a394f6bc43400946570b299aee8ae264a1e3ff", # language-renpy | ||||
|     "8ccf886749c32fb7e65d4d1316a7ed0479c93dc9", # language-less | ||||
|     "74bb588102e8f332970a0fcabe36299e0806f130", # language-less | ||||
|     "2f03492b52d7dd83b4e7472f01b87c6121e5b1a4", # monkey | ||||
|     "241e5ddbb4423d792216783e9f668bd670b026e4", # ant.tmbundle | ||||
|     "784da5ce445892bc3e26beeb6a4402bbc5ca997e", # ant.tmbundle | ||||
|     "bdab9fdc21e6790b479ccb5945b78bc0f6ce2493", # language-blade | ||||
|     "81711c69aa40135de7266c88b2f6ab28dbc1d81e", # atom-language-perl6 | ||||
|     "808e27f5e44167113198d277f47926c5d482eac8", # atom-language-rust | ||||
|     "c9118c370411f2f049c746c0fd096554e877aea2", # atom-language-perl6 | ||||
|     "15a502335012f27f8a5991139298edb87a6e467d", # atom-language-rust | ||||
|     "304be6184f7f344d44a1d13bddf511019624fd22", # language-css | ||||
|     "8c538244ba88ef9902a4faf11a2b9acec46f2a4e", # sublime-nginx | ||||
|     "82c356d6ecb143a8a20e1658b0d6a2d77ea8126f", # idl.tmbundle | ||||
|     "9dafd4e2a79cb13a6793b93877a254bc4d351e74", # sublime-text-ox | ||||
|     "8e111741d97ba2e27b3d18a309d426b4a37e604f", # sublime-varnish | ||||
|   ].freeze | ||||
|  | ||||
|   # List of allowed SPDX license names | ||||
|   | ||||
| @@ -264,4 +264,11 @@ class TestHeuristcs < Minitest::Test | ||||
|       "XML" => all_fixtures("XML", "*.ts") | ||||
|     }) | ||||
|   end | ||||
|  | ||||
|   def test_tsx_by_heuristics | ||||
|     assert_heuristics({ | ||||
|       "TypeScript" => all_fixtures("TypeScript", "*.tsx"), | ||||
|       "XML" => all_fixtures("XML", "*.tsx") | ||||
|     }) | ||||
|   end | ||||
| end | ||||
|   | ||||
							
								
								
									
										2
									
								
								vendor/CodeMirror
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/CodeMirror
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/CodeMirror updated: 268cf99055...c96aae3d94
									
								
							
							
								
								
									
										15
									
								
								vendor/README.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								vendor/README.md
									
									
									
									
										vendored
									
									
								
							| @@ -136,19 +136,20 @@ This is a list of grammars that Linguist selects to provide syntax highlighting | ||||
| - **Graphviz (DOT):** [textmate/graphviz.tmbundle](https://github.com/textmate/graphviz.tmbundle) | ||||
| - **Groovy:** [textmate/groovy.tmbundle](https://github.com/textmate/groovy.tmbundle) | ||||
| - **Groovy Server Pages:** [textmate/java.tmbundle](https://github.com/textmate/java.tmbundle) | ||||
| - **Hack:** [textmate/php.tmbundle](https://github.com/textmate/php.tmbundle) | ||||
| - **Hack:** [brandonblack/php.tmbundle](https://github.com/brandonblack/php.tmbundle) | ||||
| - **Haml:** [ezekg/language-haml](https://github.com/ezekg/language-haml) | ||||
| - **Handlebars:** [daaain/Handlebars](https://github.com/daaain/Handlebars) | ||||
| - **Harbour:** [hernad/atom-language-harbour](https://github.com/hernad/atom-language-harbour) | ||||
| - **Haskell:** [atom-haskell/language-haskell](https://github.com/atom-haskell/language-haskell) | ||||
| - **Haxe:** [clemos/haxe-sublime-bundle](https://github.com/clemos/haxe-sublime-bundle) | ||||
| - **HCL:** [aroben/ruby.tmbundle](https://github.com/aroben/ruby.tmbundle) | ||||
| - **HCL:** [alexlouden/Terraform.tmLanguage](https://github.com/alexlouden/Terraform.tmLanguage) | ||||
| - **HLSL:** [tgjones/shaders-tmLanguage](https://github.com/tgjones/shaders-tmLanguage) | ||||
| - **HTML:** [textmate/html.tmbundle](https://github.com/textmate/html.tmbundle) | ||||
| - **HTML+Django:** [textmate/python-django.tmbundle](https://github.com/textmate/python-django.tmbundle) | ||||
| - **HTML+ECR:** [atom-crystal/language-crystal](https://github.com/atom-crystal/language-crystal) | ||||
| - **HTML+EEX:** [elixir-lang/elixir-tmbundle](https://github.com/elixir-lang/elixir-tmbundle) | ||||
| - **HTML+ERB:** [aroben/ruby.tmbundle](https://github.com/aroben/ruby.tmbundle) | ||||
| - **HTML+PHP:** [textmate/php.tmbundle](https://github.com/textmate/php.tmbundle) | ||||
| - **HTML+PHP:** [brandonblack/php.tmbundle](https://github.com/brandonblack/php.tmbundle) | ||||
| - **HTTP:** [httpspec/sublime-highlighting](https://github.com/httpspec/sublime-highlighting) | ||||
| - **IDL:** [mgalloy/idl.tmbundle](https://github.com/mgalloy/idl.tmbundle) | ||||
| - **Idris:** [idris-hackers/idris-sublime](https://github.com/idris-hackers/idris-sublime) | ||||
| @@ -169,7 +170,7 @@ This is a list of grammars that Linguist selects to provide syntax highlighting | ||||
| - **JSONiq:** [wcandillon/language-jsoniq](https://github.com/wcandillon/language-jsoniq) | ||||
| - **JSONLD:** [atom/language-javascript](https://github.com/atom/language-javascript) | ||||
| - **JSX:** [github-linguist/language-babel](https://github.com/github-linguist/language-babel) | ||||
| - **Julia:** [nanoant/Julia.tmbundle](https://github.com/nanoant/Julia.tmbundle) | ||||
| - **Julia:** [JuliaEditorSupport/Julia.tmbundle](https://github.com/JuliaEditorSupport/Julia.tmbundle) | ||||
| - **Jupyter Notebook:** [textmate/json.tmbundle](https://github.com/textmate/json.tmbundle) | ||||
| - **Kit:** [textmate/html.tmbundle](https://github.com/textmate/html.tmbundle) | ||||
| - **Kotlin:** [vkostyukov/kotlin-sublime-package](https://github.com/vkostyukov/kotlin-sublime-package) | ||||
| @@ -194,6 +195,7 @@ This is a list of grammars that Linguist selects to provide syntax highlighting | ||||
| - **Makefile:** [textmate/make.tmbundle](https://github.com/textmate/make.tmbundle) | ||||
| - **Mako:** [marconi/mako-tmbundle](https://github.com/marconi/mako-tmbundle) | ||||
| - **Markdown:** [atom/language-gfm](https://github.com/atom/language-gfm) | ||||
| - **Marko:** [marko-js/marko-tmbundle](https://github.com/marko-js/marko-tmbundle) | ||||
| - **Mask:** [tenbits/sublime-mask](https://github.com/tenbits/sublime-mask) | ||||
| - **Mathematica:** [shadanan/mathematica-tmbundle](https://github.com/shadanan/mathematica-tmbundle) | ||||
| - **Matlab:** [textmate/matlab.tmbundle](https://github.com/textmate/matlab.tmbundle) | ||||
| @@ -202,6 +204,7 @@ This is a list of grammars that Linguist selects to provide syntax highlighting | ||||
| - **MAXScript:** [Alhadis/language-maxscript](https://github.com/Alhadis/language-maxscript) | ||||
| - **MediaWiki:** [textmate/mediawiki.tmbundle](https://github.com/textmate/mediawiki.tmbundle) | ||||
| - **Mercury:** [sebgod/mercury-tmlanguage](https://github.com/sebgod/mercury-tmlanguage) | ||||
| - **Meson:** [TingPing/language-meson](https://github.com/TingPing/language-meson) | ||||
| - **Metal:** [textmate/c.tmbundle](https://github.com/textmate/c.tmbundle) | ||||
| - **Mirah:** [aroben/ruby.tmbundle](https://github.com/aroben/ruby.tmbundle) | ||||
| - **Modelica:** [BorisChumichev/modelicaSublimeTextPackage](https://github.com/BorisChumichev/modelicaSublimeTextPackage) | ||||
| @@ -237,16 +240,18 @@ This is a list of grammars that Linguist selects to provide syntax highlighting | ||||
| - **OpenCL:** [textmate/c.tmbundle](https://github.com/textmate/c.tmbundle) | ||||
| - **OpenEdge ABL:** [jfairbank/Sublime-Text-2-OpenEdge-ABL](https://github.com/jfairbank/Sublime-Text-2-OpenEdge-ABL) | ||||
| - **OpenRC runscript:** [atom/language-shellscript](https://github.com/atom/language-shellscript) | ||||
| - **OpenSCAD:** [tbuser/openscad.tmbundle](https://github.com/tbuser/openscad.tmbundle) | ||||
| - **OpenType Feature File:** [Alhadis/language-fontforge](https://github.com/Alhadis/language-fontforge) | ||||
| - **Ox:** [andreashetland/sublime-text-ox](https://github.com/andreashetland/sublime-text-ox) | ||||
| - **Oz:** [eregon/oz-tmbundle](https://github.com/eregon/oz-tmbundle) | ||||
| - **P4:** [TakeshiTseng/atom-language-p4](https://github.com/TakeshiTseng/atom-language-p4) | ||||
| - **Papyrus:** [Kapiainen/SublimePapyrus](https://github.com/Kapiainen/SublimePapyrus) | ||||
| - **Parrot Internal Representation:** [textmate/parrot.tmbundle](https://github.com/textmate/parrot.tmbundle) | ||||
| - **Pascal:** [textmate/pascal.tmbundle](https://github.com/textmate/pascal.tmbundle) | ||||
| - **PAWN:** [Southclaw/pawn-sublime-language](https://github.com/Southclaw/pawn-sublime-language) | ||||
| - **Perl:** [textmate/perl.tmbundle](https://github.com/textmate/perl.tmbundle) | ||||
| - **Perl6:** [perl6/atom-language-perl6](https://github.com/perl6/atom-language-perl6) | ||||
| - **PHP:** [textmate/php.tmbundle](https://github.com/textmate/php.tmbundle) | ||||
| - **PHP:** [brandonblack/php.tmbundle](https://github.com/brandonblack/php.tmbundle) | ||||
| - **Pic:** [Alhadis/language-roff](https://github.com/Alhadis/language-roff) | ||||
| - **PicoLisp:** [textmate/lisp.tmbundle](https://github.com/textmate/lisp.tmbundle) | ||||
| - **PigLatin:** [goblindegook/sublime-text-pig-latin](https://github.com/goblindegook/sublime-text-pig-latin) | ||||
|   | ||||
							
								
								
									
										2
									
								
								vendor/grammars/Handlebars
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/Handlebars
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/Handlebars updated: ed851e0c67...63c28f7aa9
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/Julia.tmbundle
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/Julia.tmbundle
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/Julia.tmbundle updated: e2918776e1...443f9e8689
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/MagicPython
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/MagicPython
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/MagicPython updated: b7d7f9d007...b75b17bf8e
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/SublimeBrainfuck
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/SublimeBrainfuck
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/SublimeBrainfuck updated: 571332e465...4fda534b0e
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/SublimeClarion
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/SublimeClarion
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/SublimeClarion updated: 5823e7f447...750afa2b2a
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/SublimeEthereum
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/SublimeEthereum
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/SublimeEthereum updated: 51dec7b1e4...b506140321
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/SublimePapyrus
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/SublimePapyrus
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/SublimePapyrus updated: b87e7c5238...6dc86d921a
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/SublimePuppet
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/SublimePuppet
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/SublimePuppet updated: a90d5a4e08...c18abfbf2b
									
								
							
							
								
								
									
										1
									
								
								vendor/grammars/Terraform.tmLanguage
									
									
									
									
										vendored
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								vendor/grammars/Terraform.tmLanguage
									
									
									
									
										vendored
									
									
										Submodule
									
								
							 Submodule vendor/grammars/Terraform.tmLanguage added at 85c3f54f85
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/atom-fsharp
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/atom-fsharp
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/atom-fsharp updated: 4f9d5510f3...c875802334
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/atom-language-1c-bsl
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/atom-language-1c-bsl
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/atom-language-1c-bsl updated: 0203c765f9...a7bfee99b4
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/atom-language-clean
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/atom-language-clean
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/atom-language-clean updated: 7dafe70ddd...67ce940eb2
									
								
							
							
								
								
									
										1
									
								
								vendor/grammars/atom-language-p4
									
									
									
									
										vendored
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								vendor/grammars/atom-language-p4
									
									
									
									
										vendored
									
									
										Submodule
									
								
							 Submodule vendor/grammars/atom-language-p4 added at 999e3af389
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/atom-language-perl6
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/atom-language-perl6
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/atom-language-perl6 updated: 519adffd86...c2d6bf0725
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/atom-language-rust
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/atom-language-rust
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/atom-language-rust updated: 092cc6a8a0...2f736b3ce3
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/ceylon-sublimetext
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/ceylon-sublimetext
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/ceylon-sublimetext updated: 67ae76cfb1...0ee3154f37
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/elixir-tmbundle
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/elixir-tmbundle
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/elixir-tmbundle updated: 50846fe555...90a41b6a23
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/haxe-sublime-bundle
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/haxe-sublime-bundle
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/haxe-sublime-bundle updated: e9559a2c53...b6bbf48404
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/idris
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/idris
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/idris updated: 1089032af6...4268aefba3
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/kotlin-sublime-package
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/kotlin-sublime-package
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/kotlin-sublime-package updated: 535967fd2c...02d76dd8eb
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-blade
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-blade
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-blade updated: 0282a2c5aa...34a2ab498c
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-click
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-click
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-click updated: 1ee1fe012b...104f915f62
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-clojure
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-clojure
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-clojure updated: 5747bb28c2...e29ea56ba0
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-coffee-script
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-coffee-script
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-coffee-script updated: dade09261c...6559f918f6
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-csharp
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-csharp
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-csharp updated: f1462897f9...2d5f04229a
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-csound
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-csound
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-csound updated: c1c5b4db72...f61a17a88c
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-css
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-css
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-css updated: 5d4af2db39...22b06249de
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-gfm
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-gfm
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-gfm updated: 727bcc84ac...04b60f51e2
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-haskell
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-haskell
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-haskell updated: f9a937ad28...d81dbcb6c4
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-javascript
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-javascript
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-javascript updated: 245162fea4...2ba9a9891f
									
								
							
							
								
								
									
										1
									
								
								vendor/grammars/language-jison
									
									
									
									
										vendored
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								vendor/grammars/language-jison
									
									
									
									
										vendored
									
									
										Submodule
									
								
							 Submodule vendor/grammars/language-jison added at cb78f8056c
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-less
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-less
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-less updated: c9abeea663...81e2ef24bf
									
								
							
							
								
								
									
										1
									
								
								vendor/grammars/language-meson
									
									
									
									
										vendored
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								vendor/grammars/language-meson
									
									
									
									
										vendored
									
									
										Submodule
									
								
							 Submodule vendor/grammars/language-meson added at cf2644ddf4
									
								
							
							
								
								
									
										1
									
								
								vendor/grammars/language-python
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								vendor/grammars/language-python
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-python deleted from ceb204c654
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-regexp
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-regexp
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-regexp updated: 9dc99a60ae...3b5782b2fd
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-restructuredtext
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-restructuredtext
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-restructuredtext updated: 659de4b4cd...890840ff68
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-roff
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-roff
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-roff updated: e796cb463f...abc92330c6
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-rpm-spec
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-rpm-spec
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-rpm-spec updated: b639f16683...5252d48153
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-turing
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-turing
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-turing updated: 5f1d5f2f1a...b96a299fca
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-viml
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-viml
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-viml updated: d4a408cdb1...f204f0176e
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-yaml
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-yaml
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-yaml updated: 252a0c19c6...9288a431ca
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/latex.tmbundle
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/latex.tmbundle
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/latex.tmbundle updated: 4f20bf6e8c...9d3301824f
									
								
							
							
								
								
									
										1
									
								
								vendor/grammars/marko-tmbundle
									
									
									
									
										vendored
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								vendor/grammars/marko-tmbundle
									
									
									
									
										vendored
									
									
										Submodule
									
								
							 Submodule vendor/grammars/marko-tmbundle added at bbfc8db307
									
								
							
							
								
								
									
										1
									
								
								vendor/grammars/openscad.tmbundle
									
									
									
									
										vendored
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								vendor/grammars/openscad.tmbundle
									
									
									
									
										vendored
									
									
										Submodule
									
								
							 Submodule vendor/grammars/openscad.tmbundle added at 87fae5d440
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/reason
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/reason
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/reason updated: f18549ccd3...39bb6cb78c
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/ruby-slim.tmbundle
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/ruby-slim.tmbundle
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/ruby-slim.tmbundle updated: 2016357d9c...3a58baeade
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/sas.tmbundle
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/sas.tmbundle
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/sas.tmbundle updated: 776b54772b...6a4d632977
									
								
							
							
								
								
									
										1
									
								
								vendor/grammars/shaders-tmLanguage
									
									
									
									
										vendored
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								vendor/grammars/shaders-tmLanguage
									
									
									
									
										vendored
									
									
										Submodule
									
								
							 Submodule vendor/grammars/shaders-tmLanguage added at a6ee9f41e4
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/st2-zonefile
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/st2-zonefile
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/st2-zonefile updated: 0d943fefb8...e394e03014
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/sublime-nginx
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/sublime-nginx
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/sublime-nginx updated: e72eb75814...9113c4a614
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/sublime-typescript
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/sublime-typescript
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/sublime-typescript updated: 918289c9a3...429bd12943
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/sublime_cobol
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/sublime_cobol
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/sublime_cobol updated: 7c60c10849...bbdfa56033
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/swift.tmbundle
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/swift.tmbundle
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/swift.tmbundle updated: c7aca87ccb...d6a8cf2992
									
								
							
							
								
								
									
										2
									
								
								vendor/licenses/grammar/Julia.tmbundle.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/licenses/grammar/Julia.tmbundle.txt
									
									
									
									
										vendored
									
									
								
							| @@ -6,7 +6,7 @@ license: mit | ||||
| Copyright (c) 2012-2014 Stefan Karpinski, Elliot Saba, Dirk Gadsden, | ||||
| Adam Strzelecki, Jonathan Malmaud and other contributors: | ||||
|  | ||||
| https://github.com/nanoant/Julia.tmbundle/contributors | ||||
| https://github.com/JuliaEditorSupport/Julia.tmbundle/contributors | ||||
|  | ||||
| Permission is hereby granted, free of charge, to any person obtaining a copy of | ||||
| this software and associated documentation files (the "Software"), to deal in | ||||
|   | ||||
							
								
								
									
										26
									
								
								vendor/licenses/grammar/Terraform.tmLanguage.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								vendor/licenses/grammar/Terraform.tmLanguage.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| --- | ||||
| type: grammar | ||||
| name: Terraform.tmLanguage | ||||
| license: mit | ||||
| --- | ||||
| MIT License | ||||
|  | ||||
| Copyright (c) 2016 Alex Louden | ||||
|  | ||||
| Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
| of this software and associated documentation files (the "Software"), to deal | ||||
| in the Software without restriction, including without limitation the rights | ||||
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
| copies of the Software, and to permit persons to whom the Software is | ||||
| furnished to do so, subject to the following conditions: | ||||
|  | ||||
| The above copyright notice and this permission notice shall be included in all | ||||
| copies or substantial portions of the Software. | ||||
|  | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| SOFTWARE. | ||||
							
								
								
									
										12
									
								
								vendor/licenses/grammar/atom-language-p4.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								vendor/licenses/grammar/atom-language-p4.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| --- | ||||
| type: grammar | ||||
| name: atom-language-p4 | ||||
| license: mit | ||||
| --- | ||||
| Copyright (c) 2016 Yi Tseng | ||||
|  | ||||
| Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: | ||||
|  | ||||
| The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. | ||||
|  | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
							
								
								
									
										12
									
								
								vendor/licenses/grammar/language-jison.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								vendor/licenses/grammar/language-jison.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| --- | ||||
| type: grammar | ||||
| name: language-jison | ||||
| license: mit | ||||
| --- | ||||
| Copyright © 2014–2017 Chris Dibbern | ||||
|  | ||||
| Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: | ||||
|  | ||||
| The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. | ||||
|  | ||||
| THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
							
								
								
									
										206
									
								
								vendor/licenses/grammar/language-meson.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										206
									
								
								vendor/licenses/grammar/language-meson.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,206 @@ | ||||
| --- | ||||
| type: grammar | ||||
| name: language-meson | ||||
| license: apache-2.0 | ||||
| --- | ||||
| Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         http://www.apache.org/licenses/ | ||||
|  | ||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
|  | ||||
|    1. Definitions. | ||||
|  | ||||
|       "License" shall mean the terms and conditions for use, reproduction, | ||||
|       and distribution as defined by Sections 1 through 9 of this document. | ||||
|  | ||||
|       "Licensor" shall mean the copyright owner or entity authorized by | ||||
|       the copyright owner that is granting the License. | ||||
|  | ||||
|       "Legal Entity" shall mean the union of the acting entity and all | ||||
|       other entities that control, are controlled by, or are under common | ||||
|       control with that entity. For the purposes of this definition, | ||||
|       "control" means (i) the power, direct or indirect, to cause the | ||||
|       direction or management of such entity, whether by contract or | ||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||
|       outstanding shares, or (iii) beneficial ownership of such entity. | ||||
|  | ||||
|       "You" (or "Your") shall mean an individual or Legal Entity | ||||
|       exercising permissions granted by this License. | ||||
|  | ||||
|       "Source" form shall mean the preferred form for making modifications, | ||||
|       including but not limited to software source code, documentation | ||||
|       source, and configuration files. | ||||
|  | ||||
|       "Object" form shall mean any form resulting from mechanical | ||||
|       transformation or translation of a Source form, including but | ||||
|       not limited to compiled object code, generated documentation, | ||||
|       and conversions to other media types. | ||||
|  | ||||
|       "Work" shall mean the work of authorship, whether in Source or | ||||
|       Object form, made available under the License, as indicated by a | ||||
|       copyright notice that is included in or attached to the work | ||||
|       (an example is provided in the Appendix below). | ||||
|  | ||||
|       "Derivative Works" shall mean any work, whether in Source or Object | ||||
|       form, that is based on (or derived from) the Work and for which the | ||||
|       editorial revisions, annotations, elaborations, or other modifications | ||||
|       represent, as a whole, an original work of authorship. For the purposes | ||||
|       of this License, Derivative Works shall not include works that remain | ||||
|       separable from, or merely link (or bind by name) to the interfaces of, | ||||
|       the Work and Derivative Works thereof. | ||||
|  | ||||
|       "Contribution" shall mean any work of authorship, including | ||||
|       the original version of the Work and any modifications or additions | ||||
|       to that Work or Derivative Works thereof, that is intentionally | ||||
|       submitted to Licensor for inclusion in the Work by the copyright owner | ||||
|       or by an individual or Legal Entity authorized to submit on behalf of | ||||
|       the copyright owner. For the purposes of this definition, "submitted" | ||||
|       means any form of electronic, verbal, or written communication sent | ||||
|       to the Licensor or its representatives, including but not limited to | ||||
|       communication on electronic mailing lists, source code control systems, | ||||
|       and issue tracking systems that are managed by, or on behalf of, the | ||||
|       Licensor for the purpose of discussing and improving the Work, but | ||||
|       excluding communication that is conspicuously marked or otherwise | ||||
|       designated in writing by the copyright owner as "Not a Contribution." | ||||
|  | ||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||
|       on behalf of whom a Contribution has been received by Licensor and | ||||
|       subsequently incorporated within the Work. | ||||
|  | ||||
|    2. Grant of Copyright License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       copyright license to reproduce, prepare Derivative Works of, | ||||
|       publicly display, publicly perform, sublicense, and distribute the | ||||
|       Work and such Derivative Works in Source or Object form. | ||||
|  | ||||
|    3. Grant of Patent License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       (except as stated in this section) patent license to make, have made, | ||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||
|       where such license applies only to those patent claims licensable | ||||
|       by such Contributor that are necessarily infringed by their | ||||
|       Contribution(s) alone or by combination of their Contribution(s) | ||||
|       with the Work to which such Contribution(s) was submitted. If You | ||||
|       institute patent litigation against any entity (including a | ||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||
|       or a Contribution incorporated within the Work constitutes direct | ||||
|       or contributory patent infringement, then any patent licenses | ||||
|       granted to You under this License for that Work shall terminate | ||||
|       as of the date such litigation is filed. | ||||
|  | ||||
|    4. Redistribution. You may reproduce and distribute copies of the | ||||
|       Work or Derivative Works thereof in any medium, with or without | ||||
|       modifications, and in Source or Object form, provided that You | ||||
|       meet the following conditions: | ||||
|  | ||||
|       (a) You must give any other recipients of the Work or | ||||
|           Derivative Works a copy of this License; and | ||||
|  | ||||
|       (b) You must cause any modified files to carry prominent notices | ||||
|           stating that You changed the files; and | ||||
|  | ||||
|       (c) You must retain, in the Source form of any Derivative Works | ||||
|           that You distribute, all copyright, patent, trademark, and | ||||
|           attribution notices from the Source form of the Work, | ||||
|           excluding those notices that do not pertain to any part of | ||||
|           the Derivative Works; and | ||||
|  | ||||
|       (d) If the Work includes a "NOTICE" text file as part of its | ||||
|           distribution, then any Derivative Works that You distribute must | ||||
|           include a readable copy of the attribution notices contained | ||||
|           within such NOTICE file, excluding those notices that do not | ||||
|           pertain to any part of the Derivative Works, in at least one | ||||
|           of the following places: within a NOTICE text file distributed | ||||
|           as part of the Derivative Works; within the Source form or | ||||
|           documentation, if provided along with the Derivative Works; or, | ||||
|           within a display generated by the Derivative Works, if and | ||||
|           wherever such third-party notices normally appear. The contents | ||||
|           of the NOTICE file are for informational purposes only and | ||||
|           do not modify the License. You may add Your own attribution | ||||
|           notices within Derivative Works that You distribute, alongside | ||||
|           or as an addendum to the NOTICE text from the Work, provided | ||||
|           that such additional attribution notices cannot be construed | ||||
|           as modifying the License. | ||||
|  | ||||
|       You may add Your own copyright statement to Your modifications and | ||||
|       may provide additional or different license terms and conditions | ||||
|       for use, reproduction, or distribution of Your modifications, or | ||||
|       for any such Derivative Works as a whole, provided Your use, | ||||
|       reproduction, and distribution of the Work otherwise complies with | ||||
|       the conditions stated in this License. | ||||
|  | ||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||
|       any Contribution intentionally submitted for inclusion in the Work | ||||
|       by You to the Licensor shall be under the terms and conditions of | ||||
|       this License, without any additional terms or conditions. | ||||
|       Notwithstanding the above, nothing herein shall supersede or modify | ||||
|       the terms of any separate license agreement you may have executed | ||||
|       with Licensor regarding such Contributions. | ||||
|  | ||||
|    6. Trademarks. This License does not grant permission to use the trade | ||||
|       names, trademarks, service marks, or product names of the Licensor, | ||||
|       except as required for reasonable and customary use in describing the | ||||
|       origin of the Work and reproducing the content of the NOTICE file. | ||||
|  | ||||
|    7. Disclaimer of Warranty. Unless required by applicable law or | ||||
|       agreed to in writing, Licensor provides the Work (and each | ||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|       implied, including, without limitation, any warranties or conditions | ||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||
|       appropriateness of using or redistributing the Work and assume any | ||||
|       risks associated with Your exercise of permissions under this License. | ||||
|  | ||||
|    8. Limitation of Liability. In no event and under no legal theory, | ||||
|       whether in tort (including negligence), contract, or otherwise, | ||||
|       unless required by applicable law (such as deliberate and grossly | ||||
|       negligent acts) or agreed to in writing, shall any Contributor be | ||||
|       liable to You for damages, including any direct, indirect, special, | ||||
|       incidental, or consequential damages of any character arising as a | ||||
|       result of this License or out of the use or inability to use the | ||||
|       Work (including but not limited to damages for loss of goodwill, | ||||
|       work stoppage, computer failure or malfunction, or any and all | ||||
|       other commercial damages or losses), even if such Contributor | ||||
|       has been advised of the possibility of such damages. | ||||
|  | ||||
|    9. Accepting Warranty or Additional Liability. While redistributing | ||||
|       the Work or Derivative Works thereof, You may choose to offer, | ||||
|       and charge a fee for, acceptance of support, warranty, indemnity, | ||||
|       or other liability obligations and/or rights consistent with this | ||||
|       License. However, in accepting such obligations, You may act only | ||||
|       on Your own behalf and on Your sole responsibility, not on behalf | ||||
|       of any other Contributor, and only if You agree to indemnify, | ||||
|       defend, and hold each Contributor harmless for any liability | ||||
|       incurred by, or claims asserted against, such Contributor by reason | ||||
|       of your accepting any such warranty or additional liability. | ||||
|  | ||||
|    END OF TERMS AND CONDITIONS | ||||
|  | ||||
|    APPENDIX: How to apply the Apache License to your work. | ||||
|  | ||||
|       To apply the Apache License to your work, attach the following | ||||
|       boilerplate notice, with the fields enclosed by brackets "{}" | ||||
|       replaced with your own identifying information. (Don't include | ||||
|       the brackets!)  The text should be enclosed in the appropriate | ||||
|       comment syntax for the file format. We also recommend that a | ||||
|       file or class name and description of purpose be included on the | ||||
|       same "printed page" as the copyright notice for easier | ||||
|       identification within third-party archives. | ||||
|  | ||||
|    Copyright 2014 Sublime HQ Pty Ltd | ||||
|  | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
|  | ||||
|        http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
							
								
								
									
										25
									
								
								vendor/licenses/grammar/marko-tmbundle.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								vendor/licenses/grammar/marko-tmbundle.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| --- | ||||
| type: grammar | ||||
| name: marko-tmbundle | ||||
| license: mit | ||||
| --- | ||||
| The MIT License (MIT) | ||||
|  | ||||
| Copyright (c) 2014 David Rios | ||||
|  | ||||
| Permission is hereby granted, free of charge, to any person obtaining a copy of | ||||
| this software and associated documentation files (the "Software"), to deal in | ||||
| the Software without restriction, including without limitation the rights to | ||||
| use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of | ||||
| the Software, and to permit persons to whom the Software is furnished to do so, | ||||
| subject to the following conditions: | ||||
|  | ||||
| The above copyright notice and this permission notice shall be included in all | ||||
| copies or substantial portions of the Software. | ||||
|  | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS | ||||
| FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR | ||||
| COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER | ||||
| IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||
| CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
							
								
								
									
										25
									
								
								vendor/licenses/grammar/openscad.tmbundle.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								vendor/licenses/grammar/openscad.tmbundle.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| --- | ||||
| type: grammar | ||||
| name: openscad.tmbundle | ||||
| license: mit | ||||
| --- | ||||
| Copyright (c) 2017 Tony Buser | ||||
|  | ||||
| Permission is hereby granted, free of charge, to any person obtaining | ||||
| a copy of this software and associated documentation files (the | ||||
| "Software"), to deal in the Software without restriction, including | ||||
| without limitation the rights to use, copy, modify, merge, publish, | ||||
| distribute, sublicense, and/or sell copies of the Software, and to | ||||
| permit persons to whom the Software is furnished to do so, subject to | ||||
| the following conditions: | ||||
|  | ||||
| The above copyright notice and this permission notice shall be | ||||
| included in all copies or substantial portions of the Software. | ||||
|  | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||
| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||
| MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||||
| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE | ||||
| LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION | ||||
| OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | ||||
| WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
							
								
								
									
										26
									
								
								vendor/licenses/grammar/shaders-tmLanguage.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								vendor/licenses/grammar/shaders-tmLanguage.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| --- | ||||
| type: grammar | ||||
| name: shaders-tmLanguage | ||||
| license: mit | ||||
| --- | ||||
| MIT License | ||||
|  | ||||
| Copyright (c) 2017 Tim Jones | ||||
|  | ||||
| Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
| of this software and associated documentation files (the "Software"), to deal | ||||
| in the Software without restriction, including without limitation the rights | ||||
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
| copies of the Software, and to permit persons to whom the Software is | ||||
| furnished to do so, subject to the following conditions: | ||||
|  | ||||
| The above copyright notice and this permission notice shall be included in all | ||||
| copies or substantial portions of the Software. | ||||
|  | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| SOFTWARE. | ||||
		Reference in New Issue
	
	Block a user