mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
Compare commits
80 Commits
v5.0.1
...
puppet-fix
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
110b42fe16 | ||
|
|
e93f41f097 | ||
|
|
994bc1f135 | ||
|
|
44f03e64c1 | ||
|
|
4166f2e89d | ||
|
|
1a8f19c6f2 | ||
|
|
c0e242358a | ||
|
|
eb38c8dcf8 | ||
|
|
f146b4afbd | ||
|
|
db15d0f5d2 | ||
|
|
e6d57c771d | ||
|
|
eef0335c5f | ||
|
|
461c27c066 | ||
|
|
59d67d6743 | ||
|
|
7aeeb82d3d | ||
|
|
c98ca20076 | ||
|
|
4e0b5f02aa | ||
|
|
8da7cb805e | ||
|
|
e5e81a8560 | ||
|
|
dd53fa1585 | ||
|
|
354a8f079a | ||
|
|
f38d6bd124 | ||
|
|
e80b92e407 | ||
|
|
fa6ae1116f | ||
|
|
b7e27a9f58 | ||
|
|
69ba4c5586 | ||
|
|
c39d7fd6e8 | ||
|
|
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 | ||
|
|
f7fe1fee66 | ||
|
|
94367cc460 | ||
|
|
72bec1fddc | ||
|
|
4e2eba4ef8 | ||
|
|
10457b6639 | ||
|
|
d58cbc68a6 | ||
|
|
01de40faaa | ||
|
|
62d285fce6 | ||
|
|
0056095e8c | ||
|
|
d6dc3a3991 | ||
|
|
b524461b7c | ||
|
|
76d41697aa | ||
|
|
32147b629e | ||
|
|
e7b5e25bf8 | ||
|
|
d761658f8b | ||
|
|
3719214aba | ||
|
|
47b109be36 | ||
|
|
1ec4db97c2 | ||
|
|
9fe5fe0de2 | ||
|
|
b36ea7ac9d | ||
|
|
625b06c30d | ||
|
|
28bce533b2 | ||
|
|
93ec1922cb | ||
|
|
5d09fb67dd | ||
|
|
93dcb61742 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,3 +1,4 @@
|
||||
*.gem
|
||||
/Gemfile.lock
|
||||
.bundle/
|
||||
.idea
|
||||
|
||||
42
.gitmodules
vendored
42
.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
|
||||
@@ -244,15 +241,12 @@
|
||||
[submodule "vendor/grammars/cpp-qt.tmbundle"]
|
||||
path = vendor/grammars/cpp-qt.tmbundle
|
||||
url = https://github.com/textmate/cpp-qt.tmbundle
|
||||
[submodule "vendor/grammars/css.tmbundle"]
|
||||
path = vendor/grammars/css.tmbundle
|
||||
url = https://github.com/textmate/css.tmbundle
|
||||
[submodule "vendor/grammars/d.tmbundle"]
|
||||
path = vendor/grammars/d.tmbundle
|
||||
url = https://github.com/textmate/d.tmbundle
|
||||
[submodule "vendor/grammars/diff.tmbundle"]
|
||||
path = vendor/grammars/diff.tmbundle
|
||||
url = https://github.com/kivikakk/diff.tmbundle
|
||||
url = https://github.com/textmate/diff.tmbundle
|
||||
[submodule "vendor/grammars/dylan.tmbundle"]
|
||||
path = vendor/grammars/dylan.tmbundle
|
||||
url = https://github.com/textmate/dylan.tmbundle
|
||||
@@ -336,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
|
||||
@@ -815,3 +809,33 @@
|
||||
[submodule "vendor/grammars/atom-language-rust"]
|
||||
path = vendor/grammars/atom-language-rust
|
||||
url = https://github.com/zargony/atom-language-rust
|
||||
[submodule "vendor/grammars/language-css"]
|
||||
path = vendor/grammars/language-css
|
||||
url = https://github.com/atom/language-css
|
||||
[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
|
||||
[submodule "vendor/grammars/language-jolie"]
|
||||
path = vendor/grammars/language-jolie
|
||||
url = https://github.com/fmontesi/language-jolie
|
||||
|
||||
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
|
||||
|
||||
@@ -10,15 +10,15 @@ We try only to add new extensions once they have some usage on GitHub. In most c
|
||||
|
||||
To add support for a new extension:
|
||||
|
||||
0. Add your extension to the language entry in [`languages.yml`][languages], keeping the extensions in alphabetical order.
|
||||
0. Add at least one sample for your extension to the [samples directory][samples] in the correct subdirectory.
|
||||
0. Open a pull request, linking to a [GitHub search result](https://github.com/search?utf8=%E2%9C%93&q=extension%3Aboot+NOT+nothack&type=Code&ref=searchresults) showing in-the-wild usage.
|
||||
1. Add your extension to the language entry in [`languages.yml`][languages], keeping the extensions in alphabetical order.
|
||||
1. Add at least one sample for your extension to the [samples directory][samples] in the correct subdirectory.
|
||||
1. Open a pull request, linking to a [GitHub search result](https://github.com/search?utf8=%E2%9C%93&q=extension%3Aboot+NOT+nothack&type=Code&ref=searchresults) showing in-the-wild usage.
|
||||
|
||||
In addition, if this extension is already listed in [`languages.yml`][languages] then sometimes a few more steps will need to be taken:
|
||||
|
||||
0. Make sure that example `.yourextension` files are present in the [samples directory][samples] for each language that uses `.yourextension`.
|
||||
0. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.yourextension` files. (ping **@arfon** or **@bkeepers** to help with this) to ensure we're not misclassifying files.
|
||||
0. If the Bayesian classifier does a bad job with the sample `.yourextension` files then a [heuristic](https://github.com/github/linguist/blob/master/lib/linguist/heuristics.rb) may need to be written to help.
|
||||
1. Make sure that example `.yourextension` files are present in the [samples directory][samples] for each language that uses `.yourextension`.
|
||||
1. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.yourextension` files. (ping **@bkeepers** to help with this) to ensure we're not misclassifying files.
|
||||
1. If the Bayesian classifier does a bad job with the sample `.yourextension` files then a [heuristic](https://github.com/github/linguist/blob/master/lib/linguist/heuristics.rb) may need to be written to help.
|
||||
|
||||
|
||||
## Adding a language
|
||||
@@ -27,17 +27,17 @@ We try only to add languages once they have some usage on GitHub. In most cases
|
||||
|
||||
To add support for a new language:
|
||||
|
||||
0. Add an entry for your language to [`languages.yml`][languages]. Omit the `language_id` field for now.
|
||||
0. Add a grammar for your language: `script/add-grammar https://github.com/JaneSmith/MyGrammar`. Please only add grammars that have [one of these licenses][licenses].
|
||||
0. Add samples for your language to the [samples directory][samples] in the correct subdirectory.
|
||||
0. Add a `language_id` for your language using `script/set-language-ids`. **You should only ever need to run `script/set-language-ids --update`. Anything other than this risks breaking GitHub search :cry:**
|
||||
0. Open a pull request, linking to a [GitHub search result](https://github.com/search?utf8=%E2%9C%93&q=extension%3Aboot+NOT+nothack&type=Code&ref=searchresults) showing in-the-wild usage.
|
||||
1. Add an entry for your language to [`languages.yml`][languages]. Omit the `language_id` field for now.
|
||||
1. Add a grammar for your language: `script/add-grammar https://github.com/JaneSmith/MyGrammar`. Please only add grammars that have [one of these licenses][licenses].
|
||||
1. Add samples for your language to the [samples directory][samples] in the correct subdirectory.
|
||||
1. Add a `language_id` for your language using `script/set-language-ids`. **You should only ever need to run `script/set-language-ids --update`. Anything other than this risks breaking GitHub search :cry:**
|
||||
1. Open a pull request, linking to a [GitHub search result](https://github.com/search?utf8=%E2%9C%93&q=extension%3Aboot+NOT+nothack&type=Code&ref=searchresults) showing in-the-wild usage.
|
||||
|
||||
In addition, if your new language defines an extension that's already listed in [`languages.yml`][languages] (such as `.foo`) then sometimes a few more steps will need to be taken:
|
||||
|
||||
0. Make sure that example `.foo` files are present in the [samples directory][samples] for each language that uses `.foo`.
|
||||
0. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.foo` files. (ping **@arfon** or **@bkeepers** to help with this) to ensure we're not misclassifying files.
|
||||
0. If the Bayesian classifier does a bad job with the sample `.foo` files then a [heuristic](https://github.com/github/linguist/blob/master/lib/linguist/heuristics.rb) may need to be written to help.
|
||||
1. Make sure that example `.foo` files are present in the [samples directory][samples] for each language that uses `.foo`.
|
||||
1. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.foo` files. (ping **@bkeepers** to help with this) to ensure we're not misclassifying files.
|
||||
1. If the Bayesian classifier does a bad job with the sample `.foo` files then a [heuristic](https://github.com/github/linguist/blob/master/lib/linguist/heuristics.rb) may need to be written to help.
|
||||
|
||||
Remember, the goal here is to try and avoid false positives!
|
||||
|
||||
@@ -80,13 +80,14 @@ Here's our current build status: [
|
||||
- **@BenEddy** (GitHub staff)
|
||||
- **@Caged** (GitHub staff)
|
||||
- **@grantr** (GitHub staff)
|
||||
- **@larsbrinkhoff**
|
||||
- **@lildude** (GitHub staff)
|
||||
- **@lizzhale** (GitHub staff)
|
||||
- **@mikemcquaid** (GitHub staff)
|
||||
- **@pchaigno**
|
||||
- **@rafer** (GitHub staff)
|
||||
- **@shreyasjoshis** (GitHub staff)
|
||||
|
||||
As Linguist is a production dependency for GitHub we have a couple of workflow restrictions:
|
||||
|
||||
@@ -97,21 +98,21 @@ As Linguist is a production dependency for GitHub we have a couple of workflow r
|
||||
|
||||
If you are the current maintainer of this gem:
|
||||
|
||||
0. Create a branch for the release: `git checkout -b cut-release-vxx.xx.xx`
|
||||
0. Make sure your local dependencies are up to date: `script/bootstrap`
|
||||
0. If grammar submodules have not been updated recently, update them: `git submodule update --remote && git commit -a`
|
||||
0. Ensure that samples are updated: `bundle exec rake samples`
|
||||
0. Ensure that tests are green: `bundle exec rake test`
|
||||
0. Bump gem version in `lib/linguist/version.rb`, [like this](https://github.com/github/linguist/commit/8d2ea90a5ba3b2fe6e1508b7155aa4632eea2985).
|
||||
0. Make a PR to github/linguist, [like this](https://github.com/github/linguist/pull/1238).
|
||||
0. Build a local gem: `bundle exec rake build_gem`
|
||||
0. Test the gem:
|
||||
0. Bump the Gemfile and Gemfile.lock versions for an app which relies on this gem
|
||||
0. Install the new gem locally
|
||||
0. Test behavior locally, branch deploy, whatever needs to happen
|
||||
0. Merge github/linguist PR
|
||||
0. Tag and push: `git tag vx.xx.xx; git push --tags`
|
||||
0. Push to rubygems.org -- `gem push github-linguist-3.0.0.gem`
|
||||
1. Create a branch for the release: `git checkout -b cut-release-vxx.xx.xx`
|
||||
1. Make sure your local dependencies are up to date: `script/bootstrap`
|
||||
1. If grammar submodules have not been updated recently, update them: `git submodule update --remote && git commit -a`
|
||||
1. Ensure that samples are updated: `bundle exec rake samples`
|
||||
1. Ensure that tests are green: `bundle exec rake test`
|
||||
1. Bump gem version in `lib/linguist/version.rb`, [like this](https://github.com/github/linguist/commit/8d2ea90a5ba3b2fe6e1508b7155aa4632eea2985).
|
||||
1. Make a PR to github/linguist, [like this](https://github.com/github/linguist/pull/1238).
|
||||
1. Build a local gem: `bundle exec rake build_gem`
|
||||
1. Test the gem:
|
||||
1. Bump the Gemfile and Gemfile.lock versions for an app which relies on this gem
|
||||
1. Install the new gem locally
|
||||
1. Test behavior locally, branch deploy, whatever needs to happen
|
||||
1. Merge github/linguist PR
|
||||
1. Tag and push: `git tag vx.xx.xx; git push --tags`
|
||||
1. Push to rubygems.org -- `gem push github-linguist-3.0.0.gem`
|
||||
|
||||
[grammars]: /grammars.yml
|
||||
[languages]: /lib/linguist/languages.yml
|
||||
|
||||
2
LICENSE
2
LICENSE
@@ -1,4 +1,4 @@
|
||||
Copyright (c) 2011-2016 GitHub, Inc.
|
||||
Copyright (c) 2017 GitHub, Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation
|
||||
|
||||
25
README.md
25
README.md
@@ -15,10 +15,10 @@ See [Troubleshooting](#troubleshooting) and [`CONTRIBUTING.md`](/CONTRIBUTING.md
|
||||
|
||||
The Language stats bar displays languages percentages for the files in the repository. The percentages are calculated based on the bytes of code for each language as reported by the [List Languages](https://developer.github.com/v3/repos/#list-languages) API. If the bar is reporting a language that you don't expect:
|
||||
|
||||
0. Click on the name of the language in the stats bar to see a list of the files that are identified as that language.
|
||||
0. If you see files that you didn't write, consider moving the files into one of the [paths for vendored code](/lib/linguist/vendor.yml), or use the [manual overrides](#overrides) feature to ignore them.
|
||||
0. If the files are being misclassified, search for [open issues][issues] to see if anyone else has already reported the issue. Any information you can add, especially links to public repositories, is helpful.
|
||||
0. If there are no reported issues of this misclassification, [open an issue][new-issue] and include a link to the repository or a sample of the code that is being misclassified.
|
||||
1. Click on the name of the language in the stats bar to see a list of the files that are identified as that language.
|
||||
1. If you see files that you didn't write, consider moving the files into one of the [paths for vendored code](/lib/linguist/vendor.yml), or use the [manual overrides](#overrides) feature to ignore them.
|
||||
1. If the files are being misclassified, search for [open issues][issues] to see if anyone else has already reported the issue. Any information you can add, especially links to public repositories, is helpful.
|
||||
1. If there are no reported issues of this misclassification, [open an issue][new-issue] and include a link to the repository or a sample of the code that is being misclassified.
|
||||
|
||||
### There's a problem with the syntax highlighting of a file
|
||||
|
||||
@@ -32,13 +32,15 @@ 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`, `linguist-vendored`, and `linguist-generated`. `.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
|
||||
*.rb linguist-language=Java
|
||||
```
|
||||
|
||||
#### Vendored code
|
||||
|
||||
Checking code you didn't write, such as JavaScript libraries, into your git repo is a common practice, but this often inflates your project's language stats and may even cause your project to be labeled as another language. By default, Linguist treats all of the paths defined in [lib/linguist/vendor.yml](https://github.com/github/linguist/blob/master/lib/linguist/vendor.yml) as vendored and therefore doesn't include them in the language statistics for a repository.
|
||||
|
||||
Use the `linguist-vendored` attribute to vendor or un-vendor paths.
|
||||
@@ -49,6 +51,8 @@ special-vendored-path/* linguist-vendored
|
||||
jquery.js linguist-vendored=false
|
||||
```
|
||||
|
||||
#### Documentation
|
||||
|
||||
Just like vendored files, Linguist excludes documentation files from your project's language stats. [lib/linguist/documentation.yml](lib/linguist/documentation.yml) lists common documentation paths and excludes them from the language statistics for your repository.
|
||||
|
||||
Use the `linguist-documentation` attribute to mark or unmark paths as documentation.
|
||||
@@ -59,19 +63,18 @@ project-docs/* linguist-documentation
|
||||
docs/formatter.rb linguist-documentation=false
|
||||
```
|
||||
|
||||
#### Generated file detection
|
||||
#### Generated code
|
||||
|
||||
Not all plain text files are true source files. Generated files like minified js and compiled CoffeeScript can be detected and excluded from language stats. As an added bonus, unlike vendored and documentation files, these files are suppressed in diffs.
|
||||
|
||||
```ruby
|
||||
Linguist::FileBlob.new("underscore.min.js").generated? # => true
|
||||
```
|
||||
|
||||
See [Linguist::Generated#generated?](https://github.com/github/linguist/blob/master/lib/linguist/generated.rb).
|
||||
$ cat .gitattributes
|
||||
Api.elm linguist-generated=true
|
||||
```
|
||||
|
||||
### 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
|
||||
```
|
||||
|
||||
1
Rakefile
1
Rakefile
@@ -4,6 +4,7 @@ require 'rake/testtask'
|
||||
require 'yaml'
|
||||
require 'yajl'
|
||||
require 'open-uri'
|
||||
require 'json'
|
||||
|
||||
task :default => :test
|
||||
|
||||
|
||||
@@ -75,7 +75,7 @@ elsif File.file?(path)
|
||||
else
|
||||
abort <<-HELP
|
||||
Linguist v#{Linguist::VERSION}
|
||||
Detect language type for a file, or, given a directory, determine language breakdown.
|
||||
Detect language type for a file, or, given a repository, determine language breakdown.
|
||||
|
||||
Usage: linguist <path>
|
||||
linguist <path> [--breakdown] [--json]
|
||||
|
||||
@@ -16,7 +16,7 @@ Gem::Specification.new do |s|
|
||||
s.add_dependency 'charlock_holmes', '~> 0.7.3'
|
||||
s.add_dependency 'escape_utils', '~> 1.1.0'
|
||||
s.add_dependency 'mime-types', '>= 1.19'
|
||||
s.add_dependency 'rugged', '0.25.0b10'
|
||||
s.add_dependency 'rugged', '>= 0.25.1'
|
||||
|
||||
s.add_development_dependency 'minitest', '>= 5.0'
|
||||
s.add_development_dependency 'mocha'
|
||||
@@ -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
|
||||
|
||||
36
grammars.yml
36
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
|
||||
- text.restructuredtext.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
|
||||
@@ -234,8 +240,6 @@ vendor/grammars/cpp-qt.tmbundle:
|
||||
- source.qmake
|
||||
vendor/grammars/creole:
|
||||
- text.html.creole
|
||||
vendor/grammars/css.tmbundle:
|
||||
- source.css
|
||||
vendor/grammars/cucumber-tmbundle:
|
||||
- source.ruby.rspec.cucumber.steps
|
||||
- text.gherkin.feature
|
||||
@@ -369,6 +373,8 @@ vendor/grammars/language-csound:
|
||||
- source.csound
|
||||
- source.csound-document
|
||||
- source.csound-score
|
||||
vendor/grammars/language-css:
|
||||
- source.css
|
||||
vendor/grammars/language-emacs-lisp:
|
||||
- source.emacs.lisp
|
||||
vendor/grammars/language-fontforge:
|
||||
@@ -399,6 +405,13 @@ 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-jolie:
|
||||
- source.jolie
|
||||
vendor/grammars/language-jsoniq:
|
||||
- source.jq
|
||||
- source.xq
|
||||
@@ -406,20 +419,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.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
|
||||
@@ -474,6 +491,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:
|
||||
@@ -511,6 +530,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:
|
||||
@@ -567,6 +588,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.
|
||||
@@ -74,7 +74,7 @@ class << Linguist
|
||||
# end
|
||||
# end
|
||||
#
|
||||
# Linguist.instrumenter = CustomInstrumenter
|
||||
# Linguist.instrumenter = CustomInstrumenter.new
|
||||
#
|
||||
# The instrumenter must conform to the `ActiveSupport::Notifications`
|
||||
# interface, which defines `#instrument` and accepts:
|
||||
|
||||
@@ -95,7 +95,7 @@ module Linguist
|
||||
# Returns sorted Array of result pairs. Each pair contains the
|
||||
# String language name and a Float score.
|
||||
def classify(tokens, languages)
|
||||
return [] if tokens.nil?
|
||||
return [] if tokens.nil? || languages.empty?
|
||||
tokens = Tokenizer.tokenize(tokens) if tokens.is_a?(String)
|
||||
scores = {}
|
||||
|
||||
|
||||
@@ -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?/
|
||||
|
||||
@@ -80,7 +80,8 @@ module Linguist
|
||||
generated_jflex? ||
|
||||
generated_grammarkit? ||
|
||||
generated_roxygen2? ||
|
||||
generated_jison?
|
||||
generated_jison? ||
|
||||
generated_yarn_lock?
|
||||
end
|
||||
|
||||
# Internal: Is the blob an Xcode file?
|
||||
@@ -479,5 +480,14 @@ module Linguist
|
||||
return lines[0].start_with?("/* parser generated by jison ") ||
|
||||
lines[0].start_with?("/* generated by jison-lex ")
|
||||
end
|
||||
|
||||
# Internal: Is the blob a generated yarn lockfile?
|
||||
#
|
||||
# Returns true or false.
|
||||
def generated_yarn_lock?
|
||||
return false unless name.match(/yarn\.lock/)
|
||||
return false unless lines.count > 0
|
||||
return lines[0].include?("# THIS IS AN AUTOGENERATED FILE")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -125,11 +125,18 @@ module Linguist
|
||||
end
|
||||
|
||||
disambiguate ".d" do |data|
|
||||
if /^module /.match(data)
|
||||
# see http://dlang.org/spec/grammar
|
||||
# ModuleDeclaration | ImportDeclaration | FuncDeclaration | unittest
|
||||
if /^module\s+[\w.]*\s*;|import\s+[\w\s,.:]*;|\w+\s+\w+\s*\(.*\)(?:\(.*\))?\s*{[^}]*}|unittest\s*(?:\(.*\))?\s*{[^}]*}/.match(data)
|
||||
Language["D"]
|
||||
elsif /^((dtrace:::)?BEGIN|provider |#pragma (D (option|attributes)|ident)\s)/.match(data)
|
||||
# see http://dtrace.org/guide/chp-prog.html, http://dtrace.org/guide/chp-profile.html, http://dtrace.org/guide/chp-opt.html
|
||||
elsif /^(\w+:\w*:\w*:\w*|BEGIN|END|provider\s+|(tick|profile)-\w+\s+{[^}]*}|#pragma\s+D\s+(option|attributes|depends_on)\s|#pragma\s+ident\s)/.match(data)
|
||||
Language["DTrace"]
|
||||
elsif /(\/.*:( .* \\)$| : \\$|^ : |: \\$)/.match(data)
|
||||
# path/target : dependency \
|
||||
# target : \
|
||||
# : dependency
|
||||
# path/file.ext1 : some/path/../file.ext2
|
||||
elsif /([\/\\].*:\s+.*\s\\$|: \\$|^ : |^[\w\s\/\\.]+\w+\.\w+\s*:\s+[\w\s\/\\.]+\w+\.\w+)/.match(data)
|
||||
Language["Makefile"]
|
||||
end
|
||||
end
|
||||
@@ -158,7 +165,7 @@ module Linguist
|
||||
elsif data.include?("flowop")
|
||||
Language["Filebench WML"]
|
||||
elsif fortran_rx.match(data)
|
||||
Language["FORTRAN"]
|
||||
Language["Fortran"]
|
||||
end
|
||||
end
|
||||
|
||||
@@ -166,7 +173,7 @@ module Linguist
|
||||
if /^: /.match(data)
|
||||
Language["Forth"]
|
||||
elsif fortran_rx.match(data)
|
||||
Language["FORTRAN"]
|
||||
Language["Fortran"]
|
||||
end
|
||||
end
|
||||
|
||||
@@ -219,7 +226,7 @@ module Linguist
|
||||
elsif /^(%[%{}]xs|<.*>)/.match(data)
|
||||
Language["Lex"]
|
||||
elsif /^\.[a-z][a-z](\s|$)/i.match(data)
|
||||
Language["Groff"]
|
||||
Language["Roff"]
|
||||
elsif /^\((de|class|rel|code|data|must)\s/.match(data)
|
||||
Language["PicoLisp"]
|
||||
end
|
||||
@@ -260,10 +267,12 @@ module Linguist
|
||||
end
|
||||
|
||||
disambiguate ".md" do |data|
|
||||
if /(^[-a-z0-9=#!\*\[|])|<\//i.match(data) || data.empty?
|
||||
if /(^[-a-z0-9=#!\*\[|>])|<\//i.match(data) || data.empty?
|
||||
Language["Markdown"]
|
||||
elsif /^(;;|\(define_)/.match(data)
|
||||
Language["GCC machine description"]
|
||||
Language["GCC Machine Description"]
|
||||
else
|
||||
Language["Markdown"]
|
||||
end
|
||||
end
|
||||
|
||||
@@ -278,7 +287,7 @@ module Linguist
|
||||
disambiguate ".mod" do |data|
|
||||
if data.include?('<!ENTITY ')
|
||||
Language["XML"]
|
||||
elsif /MODULE\s\w+\s*;/i.match(data) || /^\s*END \w+;$/i.match(data)
|
||||
elsif /^\s*MODULE [\w\.]+;/i.match(data) || /^\s*END [\w\.]+;/i.match(data)
|
||||
Language["Modula-2"]
|
||||
else
|
||||
[Language["Linux Kernel Module"], Language["AMPL"]]
|
||||
@@ -287,9 +296,9 @@ module Linguist
|
||||
|
||||
disambiguate ".ms" do |data|
|
||||
if /^[.'][a-z][a-z](\s|$)/i.match(data)
|
||||
Language["Groff"]
|
||||
Language["Roff"]
|
||||
elsif /(?<!\S)\.(include|globa?l)\s/.match(data) || /(?<!\/\*)(\A|\n)\s*\.[A-Za-z]/.match(data.gsub(/"([^\\"]|\\.)*"|'([^\\']|\\.)*'|\\\s*(?:--.*)?\n/, ""))
|
||||
Language["GAS"]
|
||||
Language["Unix Assembly"]
|
||||
else
|
||||
Language["MAXScript"]
|
||||
end
|
||||
@@ -297,7 +306,7 @@ module Linguist
|
||||
|
||||
disambiguate ".n" do |data|
|
||||
if /^[.']/.match(data)
|
||||
Language["Groff"]
|
||||
Language["Roff"]
|
||||
elsif /^(module|namespace|using)\s/.match(data)
|
||||
Language["Nemerle"]
|
||||
end
|
||||
@@ -335,16 +344,16 @@ module Linguist
|
||||
end
|
||||
end
|
||||
|
||||
disambiguate ".pm", ".t" do |data|
|
||||
if /use strict|use\s+v?5\./.match(data)
|
||||
Language["Perl"]
|
||||
elsif /^(use v6|(my )?class|module)/.match(data)
|
||||
disambiguate ".pm" do |data|
|
||||
if /^\s*(?:use\s+v6\s*;|(?:\bmy\s+)?class|module)\b/.match(data)
|
||||
Language["Perl6"]
|
||||
elsif /\buse\s+(?:strict\b|v?5\.)/.match(data)
|
||||
Language["Perl"]
|
||||
end
|
||||
end
|
||||
|
||||
disambiguate ".pod" do |data|
|
||||
if /^=\w+$/.match(data)
|
||||
if /^=\w+\b/.match(data)
|
||||
Language["Pod"]
|
||||
else
|
||||
Language["Perl"]
|
||||
@@ -383,7 +392,7 @@ module Linguist
|
||||
if /^\.!|^\.end lit(?:eral)?\b/i.match(data)
|
||||
Language["RUNOFF"]
|
||||
elsif /^\.\\" /.match(data)
|
||||
Language["Groff"]
|
||||
Language["Roff"]
|
||||
end
|
||||
end
|
||||
|
||||
@@ -434,10 +443,12 @@ module Linguist
|
||||
end
|
||||
|
||||
disambiguate ".t" do |data|
|
||||
if /^\s*%|^\s*var\s+\w+\s*:\s*\w+/.match(data)
|
||||
if /^\s*%[ \t]+|^\s*var\s+\w+\s*:=\s*\w+/.match(data)
|
||||
Language["Turing"]
|
||||
elsif /^\s*use\s+v6\s*;/.match(data)
|
||||
elsif /^\s*(?:use\s+v6\s*;|\bmodule\b|\b(?:my\s+)?class\b)/.match(data)
|
||||
Language["Perl6"]
|
||||
elsif /\buse\s+(?:strict\b|v?5\.)/.match(data)
|
||||
Language["Perl"]
|
||||
end
|
||||
end
|
||||
|
||||
@@ -465,5 +476,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
|
||||
|
||||
@@ -215,7 +215,14 @@ module Linguist
|
||||
# Returns the Language or nil if none was found.
|
||||
def self.[](name)
|
||||
return nil if name.to_s.empty?
|
||||
name && (@index[name.downcase] || @index[name.split(',').first.downcase])
|
||||
|
||||
lang = @index[name.downcase]
|
||||
return lang if lang
|
||||
|
||||
name = name.split(',').first
|
||||
return nil if name.to_s.empty?
|
||||
|
||||
@index[name.downcase]
|
||||
end
|
||||
|
||||
# Public: A List of popular languages
|
||||
|
||||
@@ -2,7 +2,8 @@
|
||||
#
|
||||
# type - Either data, programming, markup, prose, or nil
|
||||
# aliases - An Array of additional aliases (implicitly
|
||||
# includes name.downcase)
|
||||
# includes the lowercase name with spaces replaced
|
||||
# by dashes)
|
||||
# ace_mode - A String name of the Ace Mode used for highlighting whenever
|
||||
# a file is edited. This must match one of the filenames in http://git.io/3XO_Cg.
|
||||
# Use "text" if a mode does not exist.
|
||||
@@ -1156,6 +1157,7 @@ Erlang:
|
||||
- ".xrl"
|
||||
- ".yrl"
|
||||
filenames:
|
||||
- Emakefile
|
||||
- rebar.config
|
||||
- rebar.config.lock
|
||||
- rebar.lock
|
||||
@@ -1587,17 +1589,18 @@ 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
|
||||
extensions:
|
||||
- ".hlsl"
|
||||
- ".cginc"
|
||||
- ".fx"
|
||||
- ".fxh"
|
||||
- ".hlsli"
|
||||
ace_mode: text
|
||||
tm_scope: none
|
||||
tm_scope: source.hlsl
|
||||
language_id: 145
|
||||
HTML:
|
||||
type: markup
|
||||
@@ -1605,7 +1608,7 @@ HTML:
|
||||
ace_mode: html
|
||||
codemirror_mode: htmlmixed
|
||||
codemirror_mime_type: text/html
|
||||
color: "#e44b23"
|
||||
color: "#e34c26"
|
||||
aliases:
|
||||
- xhtml
|
||||
extensions:
|
||||
@@ -2022,6 +2025,33 @@ 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
|
||||
Jolie:
|
||||
type: programming
|
||||
extensions:
|
||||
- ".ol"
|
||||
- ".iol"
|
||||
interpreters:
|
||||
- jolie
|
||||
color: "#843179"
|
||||
ace_mode: text
|
||||
tm_scope: source.jolie
|
||||
language_id: 998078858
|
||||
Julia:
|
||||
type: programming
|
||||
extensions:
|
||||
@@ -2291,6 +2321,8 @@ LookML:
|
||||
color: "#652B81"
|
||||
extensions:
|
||||
- ".lookml"
|
||||
- ".model.lkml"
|
||||
- ".view.lkml"
|
||||
tm_scope: source.yaml
|
||||
language_id: 211
|
||||
LoomScript:
|
||||
@@ -2437,6 +2469,8 @@ Mako:
|
||||
language_id: 221
|
||||
Markdown:
|
||||
type: prose
|
||||
aliases:
|
||||
- pandoc
|
||||
ace_mode: markdown
|
||||
codemirror_mode: gfm
|
||||
codemirror_mime_type: text/x-gfm
|
||||
@@ -2444,12 +2478,27 @@ Markdown:
|
||||
extensions:
|
||||
- ".md"
|
||||
- ".markdown"
|
||||
- ".mdown"
|
||||
- ".mdwn"
|
||||
- ".mkd"
|
||||
- ".mkdn"
|
||||
- ".mkdown"
|
||||
- ".ron"
|
||||
- ".workbook"
|
||||
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"
|
||||
@@ -2534,6 +2583,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"
|
||||
@@ -2902,7 +2960,7 @@ OpenSCAD:
|
||||
type: programming
|
||||
extensions:
|
||||
- ".scad"
|
||||
tm_scope: none
|
||||
tm_scope: source.scad
|
||||
ace_mode: scad
|
||||
language_id: 266
|
||||
OpenType Feature File:
|
||||
@@ -2949,6 +3007,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"
|
||||
@@ -2994,12 +3060,21 @@ PLSQL:
|
||||
color: "#dad8d8"
|
||||
extensions:
|
||||
- ".pls"
|
||||
- ".bdy"
|
||||
- ".ddl"
|
||||
- ".fnc"
|
||||
- ".pck"
|
||||
- ".pkb"
|
||||
- ".pks"
|
||||
- ".plb"
|
||||
- ".plsql"
|
||||
- ".prc"
|
||||
- ".spc"
|
||||
- ".sql"
|
||||
- ".tpb"
|
||||
- ".tps"
|
||||
- ".trg"
|
||||
- ".vw"
|
||||
language_id: 273
|
||||
PLpgSQL:
|
||||
type: programming
|
||||
@@ -3226,6 +3301,7 @@ PowerBuilder:
|
||||
language_id: 292
|
||||
PowerShell:
|
||||
type: programming
|
||||
color: "#012456"
|
||||
ace_mode: powershell
|
||||
codemirror_mode: powershell
|
||||
codemirror_mime_type: application/x-powershell
|
||||
@@ -3353,6 +3429,7 @@ Python:
|
||||
- ".lmi"
|
||||
- ".py3"
|
||||
- ".pyde"
|
||||
- ".pyi"
|
||||
- ".pyp"
|
||||
- ".pyt"
|
||||
- ".pyw"
|
||||
@@ -3368,6 +3445,7 @@ Python:
|
||||
- SConscript
|
||||
- SConstruct
|
||||
- Snakefile
|
||||
- WORKSPACE
|
||||
- wscript
|
||||
interpreters:
|
||||
- python
|
||||
@@ -3601,6 +3679,17 @@ Redcode:
|
||||
tm_scope: none
|
||||
ace_mode: text
|
||||
language_id: 321
|
||||
Regular Expression:
|
||||
type: data
|
||||
extensions:
|
||||
- ".regexp"
|
||||
- ".regex"
|
||||
aliases:
|
||||
- regexp
|
||||
- regex
|
||||
ace_mode: text
|
||||
tm_scope: source.regexp
|
||||
language_id: 363378884
|
||||
Ren'Py:
|
||||
type: programming
|
||||
aliases:
|
||||
@@ -3689,10 +3778,10 @@ Ruby:
|
||||
extensions:
|
||||
- ".rb"
|
||||
- ".builder"
|
||||
- ".eye"
|
||||
- ".fcgi"
|
||||
- ".gemspec"
|
||||
- ".god"
|
||||
- ".irbrc"
|
||||
- ".jbuilder"
|
||||
- ".mspec"
|
||||
- ".pluginspec"
|
||||
@@ -3714,6 +3803,7 @@ Ruby:
|
||||
- jruby
|
||||
- rbx
|
||||
filenames:
|
||||
- ".irbrc"
|
||||
- ".pryrc"
|
||||
- Appraisals
|
||||
- Berksfile
|
||||
@@ -3729,6 +3819,7 @@ Ruby:
|
||||
- Mavenfile
|
||||
- Podfile
|
||||
- Puppetfile
|
||||
- Rakefile
|
||||
- Snapfile
|
||||
- Thorfile
|
||||
- Vagrantfile
|
||||
@@ -3947,6 +4038,13 @@ Self:
|
||||
tm_scope: none
|
||||
ace_mode: text
|
||||
language_id: 345
|
||||
ShaderLab:
|
||||
type: programming
|
||||
extensions:
|
||||
- ".shader"
|
||||
ace_mode: text
|
||||
tm_scope: source.shaderlab
|
||||
language_id: 664257356
|
||||
Shell:
|
||||
type: programming
|
||||
color: "#89e051"
|
||||
@@ -4298,6 +4396,7 @@ Text:
|
||||
- ".no"
|
||||
filenames:
|
||||
- COPYING
|
||||
- COPYRIGHT.regex
|
||||
- FONTLOG
|
||||
- INSTALL
|
||||
- INSTALL.mysql
|
||||
@@ -4597,9 +4696,9 @@ XCompose:
|
||||
type: data
|
||||
filenames:
|
||||
- ".XCompose"
|
||||
- "XCompose"
|
||||
- "xcompose"
|
||||
tm_scope: 'config.xcompose'
|
||||
- XCompose
|
||||
- xcompose
|
||||
tm_scope: config.xcompose
|
||||
ace_mode: text
|
||||
language_id: 225167241
|
||||
XML:
|
||||
@@ -4613,6 +4712,8 @@ XML:
|
||||
- wsdl
|
||||
extensions:
|
||||
- ".xml"
|
||||
- ".adml"
|
||||
- ".admx"
|
||||
- ".ant"
|
||||
- ".axml"
|
||||
- ".builds"
|
||||
@@ -4640,6 +4741,7 @@ XML:
|
||||
- ".kml"
|
||||
- ".launch"
|
||||
- ".mdpolicy"
|
||||
- ".mjml"
|
||||
- ".mm"
|
||||
- ".mod"
|
||||
- ".mxml"
|
||||
@@ -4678,8 +4780,11 @@ XML:
|
||||
- ".ux"
|
||||
- ".vbproj"
|
||||
- ".vcxproj"
|
||||
- ".vsixmanifest"
|
||||
- ".vssettings"
|
||||
- ".vstemplate"
|
||||
- ".vxml"
|
||||
- ".wixproj"
|
||||
- ".wsdl"
|
||||
- ".wsf"
|
||||
- ".wxi"
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
module Linguist
|
||||
VERSION = "5.0.1"
|
||||
VERSION = "5.0.9"
|
||||
end
|
||||
|
||||
440
samples/D/aa.d
Normal file
440
samples/D/aa.d
Normal file
@@ -0,0 +1,440 @@
|
||||
/**
|
||||
* Implementation of associative arrays.
|
||||
*
|
||||
* Copyright: Martin Nowak 2015 -.
|
||||
* License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
|
||||
* Authors: Martin Nowak
|
||||
*/
|
||||
module core.aa;
|
||||
|
||||
import core.memory : GC;
|
||||
|
||||
private
|
||||
{
|
||||
// grow threshold
|
||||
enum GROW_NUM = 4;
|
||||
enum GROW_DEN = 5;
|
||||
// shrink threshold
|
||||
enum SHRINK_NUM = 1;
|
||||
enum SHRINK_DEN = 8;
|
||||
// grow factor
|
||||
enum GROW_FAC = 4;
|
||||
// growing the AA doubles it's size, so the shrink threshold must be
|
||||
// smaller than half the grow threshold to have a hysteresis
|
||||
static assert(GROW_FAC * SHRINK_NUM * GROW_DEN < GROW_NUM * SHRINK_DEN);
|
||||
// initial load factor (for literals), mean of both thresholds
|
||||
enum INIT_NUM = (GROW_DEN * SHRINK_NUM + GROW_NUM * SHRINK_DEN) / 2;
|
||||
enum INIT_DEN = SHRINK_DEN * GROW_DEN;
|
||||
|
||||
// magic hash constants to distinguish empty, deleted, and filled buckets
|
||||
enum HASH_EMPTY = 0;
|
||||
enum HASH_DELETED = 0x1;
|
||||
enum HASH_FILLED_MARK = size_t(1) << 8 * size_t.sizeof - 1;
|
||||
}
|
||||
|
||||
enum INIT_NUM_BUCKETS = 8;
|
||||
|
||||
struct AA(Key, Val)
|
||||
{
|
||||
this(size_t sz)
|
||||
{
|
||||
impl = new Impl(nextpow2(sz));
|
||||
}
|
||||
|
||||
@property bool empty() const pure nothrow @safe @nogc
|
||||
{
|
||||
return !length;
|
||||
}
|
||||
|
||||
@property size_t length() const pure nothrow @safe @nogc
|
||||
{
|
||||
return impl is null ? 0 : impl.length;
|
||||
}
|
||||
|
||||
void opIndexAssign(Val val, in Key key)
|
||||
{
|
||||
// lazily alloc implementation
|
||||
if (impl is null)
|
||||
impl = new Impl(INIT_NUM_BUCKETS);
|
||||
|
||||
// get hash and bucket for key
|
||||
immutable hash = calcHash(key);
|
||||
|
||||
// found a value => assignment
|
||||
if (auto p = impl.findSlotLookup(hash, key))
|
||||
{
|
||||
p.entry.val = val;
|
||||
return;
|
||||
}
|
||||
|
||||
auto p = findSlotInsert(hash);
|
||||
if (p.deleted)
|
||||
--deleted;
|
||||
// check load factor and possibly grow
|
||||
else if (++used * GROW_DEN > dim * GROW_NUM)
|
||||
{
|
||||
grow();
|
||||
p = findSlotInsert(hash);
|
||||
assert(p.empty);
|
||||
}
|
||||
|
||||
// update search cache and allocate entry
|
||||
firstUsed = min(firstUsed, cast(uint)(p - buckets.ptr));
|
||||
p.hash = hash;
|
||||
p.entry = new Impl.Entry(key, val); // TODO: move
|
||||
return;
|
||||
}
|
||||
|
||||
ref inout(Val) opIndex(in Key key) inout @trusted
|
||||
{
|
||||
auto p = opIn_r(key);
|
||||
assert(p !is null);
|
||||
return *p;
|
||||
}
|
||||
|
||||
inout(Val)* opIn_r(in Key key) inout @trusted
|
||||
{
|
||||
if (empty)
|
||||
return null;
|
||||
|
||||
immutable hash = calcHash(key);
|
||||
if (auto p = findSlotLookup(hash, key))
|
||||
return &p.entry.val;
|
||||
return null;
|
||||
}
|
||||
|
||||
bool remove(in Key key)
|
||||
{
|
||||
if (empty)
|
||||
return false;
|
||||
|
||||
immutable hash = calcHash(key);
|
||||
if (auto p = findSlotLookup(hash, key))
|
||||
{
|
||||
// clear entry
|
||||
p.hash = HASH_DELETED;
|
||||
p.entry = null;
|
||||
|
||||
++deleted;
|
||||
if (length * SHRINK_DEN < dim * SHRINK_NUM)
|
||||
shrink();
|
||||
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
Val get(in Key key, lazy Val val)
|
||||
{
|
||||
auto p = opIn_r(key);
|
||||
return p is null ? val : *p;
|
||||
}
|
||||
|
||||
ref Val getOrSet(in Key key, lazy Val val)
|
||||
{
|
||||
// lazily alloc implementation
|
||||
if (impl is null)
|
||||
impl = new Impl(INIT_NUM_BUCKETS);
|
||||
|
||||
// get hash and bucket for key
|
||||
immutable hash = calcHash(key);
|
||||
|
||||
// found a value => assignment
|
||||
if (auto p = impl.findSlotLookup(hash, key))
|
||||
return p.entry.val;
|
||||
|
||||
auto p = findSlotInsert(hash);
|
||||
if (p.deleted)
|
||||
--deleted;
|
||||
// check load factor and possibly grow
|
||||
else if (++used * GROW_DEN > dim * GROW_NUM)
|
||||
{
|
||||
grow();
|
||||
p = findSlotInsert(hash);
|
||||
assert(p.empty);
|
||||
}
|
||||
|
||||
// update search cache and allocate entry
|
||||
firstUsed = min(firstUsed, cast(uint)(p - buckets.ptr));
|
||||
p.hash = hash;
|
||||
p.entry = new Impl.Entry(key, val);
|
||||
return p.entry.val;
|
||||
}
|
||||
|
||||
/**
|
||||
Convert the AA to the type of the builtin language AA.
|
||||
*/
|
||||
Val[Key] toBuiltinAA() pure nothrow
|
||||
{
|
||||
return cast(Val[Key]) _aaFromCoreAA(impl, rtInterface);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
private this(inout(Impl)* impl) inout
|
||||
{
|
||||
this.impl = impl;
|
||||
}
|
||||
|
||||
ref Val getLValue(in Key key)
|
||||
{
|
||||
// lazily alloc implementation
|
||||
if (impl is null)
|
||||
impl = new Impl(INIT_NUM_BUCKETS);
|
||||
|
||||
// get hash and bucket for key
|
||||
immutable hash = calcHash(key);
|
||||
|
||||
// found a value => assignment
|
||||
if (auto p = impl.findSlotLookup(hash, key))
|
||||
return p.entry.val;
|
||||
|
||||
auto p = findSlotInsert(hash);
|
||||
if (p.deleted)
|
||||
--deleted;
|
||||
// check load factor and possibly grow
|
||||
else if (++used * GROW_DEN > dim * GROW_NUM)
|
||||
{
|
||||
grow();
|
||||
p = findSlotInsert(hash);
|
||||
assert(p.empty);
|
||||
}
|
||||
|
||||
// update search cache and allocate entry
|
||||
firstUsed = min(firstUsed, cast(uint)(p - buckets.ptr));
|
||||
p.hash = hash;
|
||||
p.entry = new Impl.Entry(key); // TODO: move
|
||||
return p.entry.val;
|
||||
}
|
||||
|
||||
static struct Impl
|
||||
{
|
||||
this(size_t sz)
|
||||
{
|
||||
buckets = allocBuckets(sz);
|
||||
}
|
||||
|
||||
@property size_t length() const pure nothrow @nogc
|
||||
{
|
||||
assert(used >= deleted);
|
||||
return used - deleted;
|
||||
}
|
||||
|
||||
@property size_t dim() const pure nothrow @nogc
|
||||
{
|
||||
return buckets.length;
|
||||
}
|
||||
|
||||
@property size_t mask() const pure nothrow @nogc
|
||||
{
|
||||
return dim - 1;
|
||||
}
|
||||
|
||||
// find the first slot to insert a value with hash
|
||||
inout(Bucket)* findSlotInsert(size_t hash) inout pure nothrow @nogc
|
||||
{
|
||||
for (size_t i = hash & mask, j = 1;; ++j)
|
||||
{
|
||||
if (!buckets[i].filled)
|
||||
return &buckets[i];
|
||||
i = (i + j) & mask;
|
||||
}
|
||||
}
|
||||
|
||||
// lookup a key
|
||||
inout(Bucket)* findSlotLookup(size_t hash, in Key key) inout
|
||||
{
|
||||
for (size_t i = hash & mask, j = 1;; ++j)
|
||||
{
|
||||
if (buckets[i].hash == hash && key == buckets[i].entry.key)
|
||||
return &buckets[i];
|
||||
else if (buckets[i].empty)
|
||||
return null;
|
||||
i = (i + j) & mask;
|
||||
}
|
||||
}
|
||||
|
||||
void grow()
|
||||
{
|
||||
// If there are so many deleted entries, that growing would push us
|
||||
// below the shrink threshold, we just purge deleted entries instead.
|
||||
if (length * SHRINK_DEN < GROW_FAC * dim * SHRINK_NUM)
|
||||
resize(dim);
|
||||
else
|
||||
resize(GROW_FAC * dim);
|
||||
}
|
||||
|
||||
void shrink()
|
||||
{
|
||||
if (dim > INIT_NUM_BUCKETS)
|
||||
resize(dim / GROW_FAC);
|
||||
}
|
||||
|
||||
void resize(size_t ndim) pure nothrow
|
||||
{
|
||||
auto obuckets = buckets;
|
||||
buckets = allocBuckets(ndim);
|
||||
|
||||
foreach (ref b; obuckets)
|
||||
if (b.filled)
|
||||
*findSlotInsert(b.hash) = b;
|
||||
|
||||
firstUsed = 0;
|
||||
used -= deleted;
|
||||
deleted = 0;
|
||||
GC.free(obuckets.ptr); // safe to free b/c impossible to reference
|
||||
}
|
||||
|
||||
static struct Entry
|
||||
{
|
||||
Key key;
|
||||
Val val;
|
||||
}
|
||||
|
||||
static struct Bucket
|
||||
{
|
||||
size_t hash;
|
||||
Entry* entry;
|
||||
|
||||
@property bool empty() const
|
||||
{
|
||||
return hash == HASH_EMPTY;
|
||||
}
|
||||
|
||||
@property bool deleted() const
|
||||
{
|
||||
return hash == HASH_DELETED;
|
||||
}
|
||||
|
||||
@property bool filled() const
|
||||
{
|
||||
return cast(ptrdiff_t) hash < 0;
|
||||
}
|
||||
}
|
||||
|
||||
Bucket[] allocBuckets(size_t dim) @trusted pure nothrow
|
||||
{
|
||||
enum attr = GC.BlkAttr.NO_INTERIOR;
|
||||
immutable sz = dim * Bucket.sizeof;
|
||||
return (cast(Bucket*) GC.calloc(sz, attr))[0 .. dim];
|
||||
}
|
||||
|
||||
Bucket[] buckets;
|
||||
uint used;
|
||||
uint deleted;
|
||||
uint firstUsed;
|
||||
}
|
||||
|
||||
RTInterface* rtInterface()() pure nothrow @nogc
|
||||
{
|
||||
static size_t aaLen(in void* pimpl) pure nothrow @nogc
|
||||
{
|
||||
auto aa = const(AA)(cast(const(Impl)*) pimpl);
|
||||
return aa.length;
|
||||
}
|
||||
|
||||
static void* aaGetY(void** pimpl, in void* pkey)
|
||||
{
|
||||
auto aa = AA(cast(Impl*)*pimpl);
|
||||
auto res = &aa.getLValue(*cast(const(Key*)) pkey);
|
||||
*pimpl = aa.impl; // might have changed
|
||||
return res;
|
||||
}
|
||||
|
||||
static inout(void)* aaInX(inout void* pimpl, in void* pkey)
|
||||
{
|
||||
auto aa = inout(AA)(cast(inout(Impl)*) pimpl);
|
||||
return aa.opIn_r(*cast(const(Key*)) pkey);
|
||||
}
|
||||
|
||||
static bool aaDelX(void* pimpl, in void* pkey)
|
||||
{
|
||||
auto aa = AA(cast(Impl*) pimpl);
|
||||
return aa.remove(*cast(const(Key*)) pkey);
|
||||
}
|
||||
|
||||
static immutable vtbl = RTInterface(&aaLen, &aaGetY, &aaInX, &aaDelX);
|
||||
return cast(RTInterface*)&vtbl;
|
||||
}
|
||||
|
||||
static size_t calcHash(in ref Key key)
|
||||
{
|
||||
return hashOf(key) | HASH_FILLED_MARK;
|
||||
}
|
||||
|
||||
Impl* impl;
|
||||
alias impl this;
|
||||
}
|
||||
|
||||
package extern (C) void* _aaFromCoreAA(void* impl, RTInterface* rtIntf) pure nothrow;
|
||||
|
||||
private:
|
||||
|
||||
struct RTInterface
|
||||
{
|
||||
alias AA = void*;
|
||||
|
||||
size_t function(in AA aa) pure nothrow @nogc len;
|
||||
void* function(AA* aa, in void* pkey) getY;
|
||||
inout(void)* function(inout AA aa, in void* pkey) inX;
|
||||
bool function(AA aa, in void* pkey) delX;
|
||||
}
|
||||
|
||||
unittest
|
||||
{
|
||||
AA!(int, int) aa;
|
||||
assert(aa.length == 0);
|
||||
aa[0] = 1;
|
||||
assert(aa.length == 1 && aa[0] == 1);
|
||||
aa[1] = 2;
|
||||
assert(aa.length == 2 && aa[1] == 2);
|
||||
import core.stdc.stdio;
|
||||
|
||||
int[int] rtaa = aa.toBuiltinAA();
|
||||
assert(rtaa.length == 2);
|
||||
puts("length");
|
||||
assert(rtaa[0] == 1);
|
||||
assert(rtaa[1] == 2);
|
||||
rtaa[2] = 3;
|
||||
|
||||
assert(aa[2] == 3);
|
||||
}
|
||||
|
||||
unittest
|
||||
{
|
||||
auto aa = AA!(int, int)(3);
|
||||
aa[0] = 0;
|
||||
aa[1] = 1;
|
||||
aa[2] = 2;
|
||||
assert(aa.length == 3);
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
// Helper functions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
size_t nextpow2(in size_t n) pure nothrow @nogc
|
||||
{
|
||||
import core.bitop : bsr;
|
||||
|
||||
if (n < 2)
|
||||
return 1;
|
||||
return size_t(1) << bsr(n - 1) + 1;
|
||||
}
|
||||
|
||||
pure nothrow @nogc unittest
|
||||
{
|
||||
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
|
||||
foreach (const n, const pow2; [1, 1, 2, 4, 4, 8, 8, 8, 8, 16])
|
||||
assert(nextpow2(n) == pow2);
|
||||
}
|
||||
|
||||
T min(T)(T a, T b) pure nothrow @nogc
|
||||
{
|
||||
return a < b ? a : b;
|
||||
}
|
||||
|
||||
T max(T)(T a, T b) pure nothrow @nogc
|
||||
{
|
||||
return b < a ? a : b;
|
||||
}
|
||||
187
samples/D/arrayops.d
Normal file
187
samples/D/arrayops.d
Normal file
@@ -0,0 +1,187 @@
|
||||
/**
|
||||
* Benchmark for array ops.
|
||||
*
|
||||
* Copyright: Copyright Martin Nowak 2016 -.
|
||||
* License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
|
||||
* Authors: Martin Nowak
|
||||
*/
|
||||
import core.cpuid, std.algorithm, std.datetime, std.meta, std.stdio, std.string,
|
||||
std.range;
|
||||
|
||||
float[6] getLatencies(T, string op)()
|
||||
{
|
||||
enum N = (64 * (1 << 6) + 64) * T.sizeof;
|
||||
auto a = Array!T(N), b = Array!T(N), c = Array!T(N);
|
||||
float[6] latencies = float.max;
|
||||
foreach (i, ref latency; latencies)
|
||||
{
|
||||
auto len = 1 << i;
|
||||
foreach (_; 1 .. 32)
|
||||
{
|
||||
a[] = 24;
|
||||
b[] = 4;
|
||||
c[] = 2;
|
||||
auto sw = StopWatch(AutoStart.yes);
|
||||
foreach (off; size_t(0) .. size_t(64))
|
||||
{
|
||||
off = off * len + off;
|
||||
enum op = op.replace("const", "2").replace("a",
|
||||
"a[off .. off + len]").replace("b",
|
||||
"b[off .. off + len]").replace("c", "c[off .. off + len]");
|
||||
mixin(op ~ ";");
|
||||
}
|
||||
latency = min(latency, sw.peek.nsecs);
|
||||
}
|
||||
}
|
||||
float[6] res = latencies[] / 1024;
|
||||
return res;
|
||||
}
|
||||
|
||||
float[4] getThroughput(T, string op)()
|
||||
{
|
||||
enum N = (40 * 1024 * 1024 + 64 * T.sizeof) / T.sizeof;
|
||||
auto a = Array!T(N), b = Array!T(N), c = Array!T(N);
|
||||
float[4] latencies = float.max;
|
||||
size_t[4] lengths = [
|
||||
8 * 1024 / T.sizeof, 32 * 1024 / T.sizeof, 512 * 1024 / T.sizeof, 32 * 1024 * 1024 / T
|
||||
.sizeof
|
||||
];
|
||||
foreach (i, ref latency; latencies)
|
||||
{
|
||||
auto len = lengths[i] / 64;
|
||||
foreach (_; 1 .. 4)
|
||||
{
|
||||
a[] = 24;
|
||||
b[] = 4;
|
||||
c[] = 2;
|
||||
auto sw = StopWatch(AutoStart.yes);
|
||||
foreach (off; size_t(0) .. size_t(64))
|
||||
{
|
||||
off = off * len + off;
|
||||
enum op = op.replace("const", "2").replace("a",
|
||||
"a[off .. off + len]").replace("b",
|
||||
"b[off .. off + len]").replace("c", "c[off .. off + len]");
|
||||
mixin(op ~ ";");
|
||||
}
|
||||
immutable nsecs = sw.peek.nsecs;
|
||||
runMasked({latency = min(latency, nsecs);});
|
||||
}
|
||||
}
|
||||
float[4] throughputs = void;
|
||||
runMasked({throughputs = T.sizeof * lengths[] / latencies[];});
|
||||
return throughputs;
|
||||
}
|
||||
|
||||
string[] genOps()
|
||||
{
|
||||
string[] ops;
|
||||
foreach (op1; ["+", "-", "*", "/"])
|
||||
{
|
||||
ops ~= "a " ~ op1 ~ "= b";
|
||||
ops ~= "a " ~ op1 ~ "= const";
|
||||
foreach (op2; ["+", "-", "*", "/"])
|
||||
{
|
||||
ops ~= "a " ~ op1 ~ "= b " ~ op2 ~ " c";
|
||||
ops ~= "a " ~ op1 ~ "= b " ~ op2 ~ " const";
|
||||
}
|
||||
}
|
||||
return ops;
|
||||
}
|
||||
|
||||
void runOp(string op)()
|
||||
{
|
||||
foreach (T; AliasSeq!(ubyte, ushort, uint, ulong, byte, short, int, long, float,
|
||||
double))
|
||||
writefln("%s, %s, %(%.2f, %), %(%s, %)", T.stringof, op,
|
||||
getLatencies!(T, op), getThroughput!(T, op));
|
||||
}
|
||||
|
||||
struct Array(T)
|
||||
{
|
||||
import core.stdc.stdlib : free, malloc;
|
||||
|
||||
this(size_t n)
|
||||
{
|
||||
ary = (cast(T*) malloc(T.sizeof * n))[0 .. n];
|
||||
}
|
||||
|
||||
~this()
|
||||
{
|
||||
free(ary.ptr);
|
||||
}
|
||||
|
||||
T[] ary;
|
||||
alias ary this;
|
||||
}
|
||||
|
||||
version (X86)
|
||||
version = SSE;
|
||||
else version (X86_64)
|
||||
version = SSE;
|
||||
else
|
||||
static assert(0, "unimplemented");
|
||||
|
||||
version (SSE)
|
||||
{
|
||||
uint mxcsr()
|
||||
{
|
||||
uint ret = void;
|
||||
asm
|
||||
{
|
||||
stmxcsr ret;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
void mxcsr(uint val)
|
||||
{
|
||||
asm
|
||||
{
|
||||
ldmxcsr val;
|
||||
}
|
||||
}
|
||||
|
||||
// http://softpixel.com/~cwright/programming/simd/sse.php
|
||||
enum FPU_EXCEPTION_MASKS = 1 << 12 | 1 << 11 | 1 << 10 | 1 << 9 | 1 << 8 | 1 << 7;
|
||||
enum FPU_EXCEPTION_FLAGS = 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0;
|
||||
|
||||
void maskFPUExceptions()
|
||||
{
|
||||
mxcsr = mxcsr | FPU_EXCEPTION_MASKS;
|
||||
}
|
||||
|
||||
void unmaskFPUExceptions()
|
||||
{
|
||||
mxcsr = mxcsr & ~FPU_EXCEPTION_MASKS;
|
||||
}
|
||||
|
||||
uint FPUExceptionFlags()
|
||||
{
|
||||
return mxcsr & FPU_EXCEPTION_FLAGS;
|
||||
}
|
||||
|
||||
void clearFPUExceptionFlags()
|
||||
{
|
||||
mxcsr = mxcsr & ~FPU_EXCEPTION_FLAGS;
|
||||
}
|
||||
}
|
||||
|
||||
void runMasked(scope void delegate() dg)
|
||||
{
|
||||
assert(FPUExceptionFlags == 0);
|
||||
maskFPUExceptions;
|
||||
dg();
|
||||
clearFPUExceptionFlags;
|
||||
unmaskFPUExceptions;
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
unmaskFPUExceptions;
|
||||
|
||||
writefln("type, op, %(latency%s, %), %-(throughput%s, %)", iota(6)
|
||||
.map!(i => 1 << i), ["8KB", "32KB", "512KB", "32MB"]);
|
||||
foreach (op; mixin("AliasSeq!(%(%s, %))".format(genOps)))
|
||||
runOp!op;
|
||||
maskFPUExceptions;
|
||||
}
|
||||
3
samples/D/function.d
Normal file
3
samples/D/function.d
Normal file
@@ -0,0 +1,3 @@
|
||||
void foo()
|
||||
{
|
||||
}
|
||||
6
samples/D/hello_world.d
Normal file
6
samples/D/hello_world.d
Normal file
@@ -0,0 +1,6 @@
|
||||
import std.stdio;
|
||||
|
||||
void main()
|
||||
{
|
||||
writeln("Hello World");
|
||||
}
|
||||
7
samples/D/template.d
Normal file
7
samples/D/template.d
Normal file
@@ -0,0 +1,7 @@
|
||||
template Fib(size_t N)
|
||||
{
|
||||
static if (N < 2)
|
||||
enum Fib = size_t(1);
|
||||
else
|
||||
enum Fib = Fib!(N - 2) + Fib!(N - 1);
|
||||
}
|
||||
3
samples/D/template_function.d
Normal file
3
samples/D/template_function.d
Normal file
@@ -0,0 +1,3 @@
|
||||
void bar(T)(T t)
|
||||
{
|
||||
}
|
||||
3
samples/D/unittest1.d
Normal file
3
samples/D/unittest1.d
Normal file
@@ -0,0 +1,3 @@
|
||||
unittest
|
||||
{
|
||||
}
|
||||
3
samples/D/unittest2.d
Normal file
3
samples/D/unittest2.d
Normal file
@@ -0,0 +1,3 @@
|
||||
unittest("optional name")
|
||||
{
|
||||
}
|
||||
7
samples/Erlang/filenames/Emakefile
Normal file
7
samples/Erlang/filenames/Emakefile
Normal file
@@ -0,0 +1,7 @@
|
||||
{"src/*", [
|
||||
report,
|
||||
verbose,
|
||||
{i, "include"},
|
||||
{outdir, "ebin"},
|
||||
debug_info
|
||||
]}.
|
||||
161
samples/GLSL/SyLens.shader
Normal file
161
samples/GLSL/SyLens.shader
Normal file
@@ -0,0 +1,161 @@
|
||||
#version 120
|
||||
|
||||
/*
|
||||
Original Lens Distortion Algorithm from SSontech (Syntheyes)
|
||||
http://www.ssontech.com/content/lensalg.htm
|
||||
|
||||
r2 is radius squared.
|
||||
|
||||
r2 = image_aspect*image_aspect*u*u + v*v
|
||||
f = 1 + r2*(k + kcube*sqrt(r2))
|
||||
u' = f*u
|
||||
v' = f*v
|
||||
|
||||
*/
|
||||
|
||||
// Controls
|
||||
uniform float kCoeff, kCube, uShift, vShift;
|
||||
uniform float chroma_red, chroma_green, chroma_blue;
|
||||
uniform bool apply_disto;
|
||||
|
||||
// Uniform inputs
|
||||
uniform sampler2D input1;
|
||||
uniform float adsk_input1_w, adsk_input1_h, adsk_input1_aspect, adsk_input1_frameratio;
|
||||
uniform float adsk_result_w, adsk_result_h;
|
||||
|
||||
float distortion_f(float r) {
|
||||
float f = 1 + (r*r)*(kCoeff + kCube * r);
|
||||
return f;
|
||||
}
|
||||
|
||||
|
||||
float inverse_f(float r)
|
||||
{
|
||||
|
||||
// Build a lookup table on the radius, as a fixed-size table.
|
||||
// We will use a vec3 since we will store the multipled number in the Z coordinate.
|
||||
// So to recap: x will be the radius, y will be the f(x) distortion, and Z will be x * y;
|
||||
vec3[48] lut;
|
||||
|
||||
// Since out LUT is shader-global check if it's been computed alrite
|
||||
// Flame has no overflow bbox so we can safely max out at the image edge, plus some cushion
|
||||
float max_r = sqrt((adsk_input1_frameratio * adsk_input1_frameratio) + 1) + 0.1;
|
||||
float incr = max_r / 48;
|
||||
float lut_r = 0;
|
||||
float f;
|
||||
for(int i=0; i < 48; i++) {
|
||||
f = distortion_f(lut_r);
|
||||
lut[i] = vec3(lut_r, f, lut_r * f);
|
||||
lut_r += incr;
|
||||
}
|
||||
|
||||
float t;
|
||||
// Now find the nehgbouring elements
|
||||
// only iterate to 46 since we will need
|
||||
// 47 as i+1
|
||||
for(int i=0; i < 47; i++) {
|
||||
if(lut[i].z < r && lut[i+1].z > r) {
|
||||
// BAM! our value is between these two segments
|
||||
// get the T interpolant and mix
|
||||
t = (r - lut[i].z) / (lut[i+1].z - lut[i]).z;
|
||||
return mix(lut[i].y, lut[i+1].y, t );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
float aberrate(float f, float chroma)
|
||||
{
|
||||
return f + (f * chroma);
|
||||
}
|
||||
|
||||
vec3 chromaticize_and_invert(float f)
|
||||
{
|
||||
vec3 rgb_f = vec3(aberrate(f, chroma_red), aberrate(f, chroma_green), aberrate(f, chroma_blue));
|
||||
// We need to DIVIDE by F when we redistort, and x / y == x * (1 / y)
|
||||
if(apply_disto) {
|
||||
rgb_f = 1 / rgb_f;
|
||||
}
|
||||
return rgb_f;
|
||||
}
|
||||
|
||||
void main(void)
|
||||
{
|
||||
vec2 px, uv;
|
||||
float f = 1;
|
||||
float r = 1;
|
||||
|
||||
px = gl_FragCoord.xy;
|
||||
|
||||
// Make sure we are still centered
|
||||
px.x -= (adsk_result_w - adsk_input1_w) / 2;
|
||||
px.y -= (adsk_result_h - adsk_input1_h) / 2;
|
||||
|
||||
// Push the destination coordinates into the [0..1] range
|
||||
uv.x = px.x / adsk_input1_w;
|
||||
uv.y = px.y / adsk_input1_h;
|
||||
|
||||
|
||||
// And to Syntheyes UV which are [1..-1] on both X and Y
|
||||
uv.x = (uv.x *2 ) - 1;
|
||||
uv.y = (uv.y *2 ) - 1;
|
||||
|
||||
// Add UV shifts
|
||||
uv.x += uShift;
|
||||
uv.y += vShift;
|
||||
|
||||
// Make the X value the aspect value, so that the X coordinates go to [-aspect..aspect]
|
||||
uv.x = uv.x * adsk_input1_frameratio;
|
||||
|
||||
// Compute the radius
|
||||
r = sqrt(uv.x*uv.x + uv.y*uv.y);
|
||||
|
||||
// If we are redistorting, account for the oversize plate in the input, assume that
|
||||
// the input aspect is the same
|
||||
if(apply_disto) {
|
||||
r = r / (float(adsk_input1_w) / float(adsk_result_w));
|
||||
}
|
||||
|
||||
// Apply or remove disto, per channel honoring chromatic aberration
|
||||
if(apply_disto) {
|
||||
f = inverse_f(r);
|
||||
} else {
|
||||
f = distortion_f(r);
|
||||
}
|
||||
|
||||
vec2[3] rgb_uvs = vec2[](uv, uv, uv);
|
||||
|
||||
// Compute distortions per component
|
||||
vec3 rgb_f = chromaticize_and_invert(f);
|
||||
|
||||
// Apply the disto coefficients, per component
|
||||
rgb_uvs[0] = rgb_uvs[0] * rgb_f.rr;
|
||||
rgb_uvs[1] = rgb_uvs[1] * rgb_f.gg;
|
||||
rgb_uvs[2] = rgb_uvs[2] * rgb_f.bb;
|
||||
|
||||
// Convert all the UVs back to the texture space, per color component
|
||||
for(int i=0; i < 3; i++) {
|
||||
uv = rgb_uvs[i];
|
||||
|
||||
// Back from [-aspect..aspect] to [-1..1]
|
||||
uv.x = uv.x / adsk_input1_frameratio;
|
||||
|
||||
// Remove UV shifts
|
||||
uv.x -= uShift;
|
||||
uv.y -= vShift;
|
||||
|
||||
// Back to OGL UV
|
||||
uv.x = (uv.x + 1) / 2;
|
||||
uv.y = (uv.y + 1) / 2;
|
||||
|
||||
rgb_uvs[i] = uv;
|
||||
}
|
||||
|
||||
// Sample the input plate, per component
|
||||
vec4 sampled;
|
||||
sampled.r = texture2D(input1, rgb_uvs[0]).r;
|
||||
sampled.g = texture2D(input1, rgb_uvs[1]).g;
|
||||
sampled.b = texture2D(input1, rgb_uvs[2]).b;
|
||||
|
||||
// and assign to the output
|
||||
gl_FragColor.rgba = vec4(sampled.rgb, 1.0 );
|
||||
}
|
||||
630
samples/GLSL/islandScene.shader
Normal file
630
samples/GLSL/islandScene.shader
Normal file
@@ -0,0 +1,630 @@
|
||||
//// High quality (Some browsers may freeze or crash)
|
||||
//#define HIGHQUALITY
|
||||
|
||||
//// Medium quality (Should be fine on all systems, works on Intel HD2000 on Win7 but quite slow)
|
||||
//#define MEDIUMQUALITY
|
||||
|
||||
//// Defaults
|
||||
//#define REFLECTIONS
|
||||
#define SHADOWS
|
||||
//#define GRASS
|
||||
//#define SMALL_WAVES
|
||||
#define RAGGED_LEAVES
|
||||
//#define DETAILED_NOISE
|
||||
//#define LIGHT_AA // 2 sample SSAA
|
||||
//#define HEAVY_AA // 2x2 RG SSAA
|
||||
//#define TONEMAP
|
||||
|
||||
//// Configurations
|
||||
#ifdef MEDIUMQUALITY
|
||||
#define SHADOWS
|
||||
#define SMALL_WAVES
|
||||
#define RAGGED_LEAVES
|
||||
#define TONEMAP
|
||||
#endif
|
||||
|
||||
#ifdef HIGHQUALITY
|
||||
#define REFLECTIONS
|
||||
#define SHADOWS
|
||||
//#define GRASS
|
||||
#define SMALL_WAVES
|
||||
#define RAGGED_LEAVES
|
||||
#define DETAILED_NOISE
|
||||
#define LIGHT_AA
|
||||
#define TONEMAP
|
||||
#endif
|
||||
|
||||
// Constants
|
||||
const float eps = 1e-5;
|
||||
const float PI = 3.14159265359;
|
||||
|
||||
const vec3 sunDir = vec3(0.79057,-0.47434, 0.0);
|
||||
const vec3 skyCol = vec3(0.3, 0.5, 0.8);
|
||||
const vec3 sandCol = vec3(0.9, 0.8, 0.5);
|
||||
const vec3 treeCol = vec3(0.8, 0.65, 0.3);
|
||||
const vec3 grassCol = vec3(0.4, 0.5, 0.18);
|
||||
const vec3 leavesCol = vec3(0.3, 0.6, 0.2);
|
||||
const vec3 leavesPos = vec3(-5.1,13.4, 0.0);
|
||||
|
||||
#ifdef TONEMAP
|
||||
const vec3 sunCol = vec3(1.8, 1.7, 1.6);
|
||||
#else
|
||||
const vec3 sunCol = vec3(0.9, 0.85, 0.8);
|
||||
#endif
|
||||
|
||||
const float exposure = 1.1; // Only used when tonemapping
|
||||
|
||||
// Description : Array and textureless GLSL 2D/3D/4D simplex
|
||||
// noise functions.
|
||||
// Author : Ian McEwan, Ashima Arts.
|
||||
// License : Copyright (C) 2011 Ashima Arts. All rights reserved.
|
||||
// Distributed under the MIT License. See LICENSE file.
|
||||
// https://github.com/ashima/webgl-noise
|
||||
vec3 mod289(vec3 x) {
|
||||
return x - floor(x * (1.0 / 289.0)) * 289.0;
|
||||
}
|
||||
|
||||
vec4 mod289(vec4 x) {
|
||||
return x - floor(x * (1.0 / 289.0)) * 289.0;
|
||||
}
|
||||
|
||||
vec4 permute(vec4 x) {
|
||||
return mod289(((x*34.0)+1.0)*x);
|
||||
}
|
||||
|
||||
vec4 taylorInvSqrt(vec4 r) {
|
||||
return 1.79284291400159 - 0.85373472095314 * r;
|
||||
}
|
||||
|
||||
float snoise(vec3 v) {
|
||||
const vec2 C = vec2(1.0/6.0, 1.0/3.0) ;
|
||||
const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);
|
||||
|
||||
// First corner
|
||||
vec3 i = floor(v + dot(v, C.yyy) );
|
||||
vec3 x0 = v - i + dot(i, C.xxx) ;
|
||||
|
||||
// Other corners
|
||||
vec3 g = step(x0.yzx, x0.xyz);
|
||||
vec3 l = 1.0 - g;
|
||||
vec3 i1 = min( g.xyz, l.zxy );
|
||||
vec3 i2 = max( g.xyz, l.zxy );
|
||||
|
||||
// x0 = x0 - 0.0 + 0.0 * C.xxx;
|
||||
// x1 = x0 - i1 + 1.0 * C.xxx;
|
||||
// x2 = x0 - i2 + 2.0 * C.xxx;
|
||||
// x3 = x0 - 1.0 + 3.0 * C.xxx;
|
||||
vec3 x1 = x0 - i1 + C.xxx;
|
||||
vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y
|
||||
vec3 x3 = x0 - D.yyy; // -1.0+3.0*C.x = -0.5 = -D.y
|
||||
|
||||
// Permutations
|
||||
i = mod289(i);
|
||||
vec4 p = permute( permute( permute(
|
||||
i.z + vec4(0.0, i1.z, i2.z, 1.0 ))
|
||||
+ i.y + vec4(0.0, i1.y, i2.y, 1.0 ))
|
||||
+ i.x + vec4(0.0, i1.x, i2.x, 1.0 ));
|
||||
|
||||
// Gradients: 7x7 points over a square, mapped onto an octahedron.
|
||||
// The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)
|
||||
float n_ = 0.142857142857; // 1.0/7.0
|
||||
vec3 ns = n_ * D.wyz - D.xzx;
|
||||
|
||||
vec4 j = p - 49.0 * floor(p * ns.z * ns.z); // mod(p,7*7)
|
||||
|
||||
vec4 x_ = floor(j * ns.z);
|
||||
vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N)
|
||||
|
||||
vec4 x = x_ *ns.x + ns.yyyy;
|
||||
vec4 y = y_ *ns.x + ns.yyyy;
|
||||
vec4 h = 1.0 - abs(x) - abs(y);
|
||||
|
||||
vec4 b0 = vec4( x.xy, y.xy );
|
||||
vec4 b1 = vec4( x.zw, y.zw );
|
||||
|
||||
//vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0;
|
||||
//vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0;
|
||||
vec4 s0 = floor(b0)*2.0 + 1.0;
|
||||
vec4 s1 = floor(b1)*2.0 + 1.0;
|
||||
vec4 sh = -step(h, vec4(0.0));
|
||||
|
||||
vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ;
|
||||
vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ;
|
||||
|
||||
vec3 p0 = vec3(a0.xy,h.x);
|
||||
vec3 p1 = vec3(a0.zw,h.y);
|
||||
vec3 p2 = vec3(a1.xy,h.z);
|
||||
vec3 p3 = vec3(a1.zw,h.w);
|
||||
|
||||
//Normalise gradients
|
||||
vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));
|
||||
p0 *= norm.x;
|
||||
p1 *= norm.y;
|
||||
p2 *= norm.z;
|
||||
p3 *= norm.w;
|
||||
|
||||
// Mix final noise value
|
||||
vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);
|
||||
m = m * m;
|
||||
return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1),
|
||||
dot(p2,x2), dot(p3,x3) ) );
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Main
|
||||
float fbm(vec3 p)
|
||||
{
|
||||
float final = snoise(p);
|
||||
p *= 1.94; final += snoise(p) * 0.5;
|
||||
#ifdef DETAILED_NOISE
|
||||
p *= 3.75; final += snoise(p) * 0.25;
|
||||
return final / 1.75;
|
||||
#else
|
||||
return final / 1.5;
|
||||
#endif
|
||||
}
|
||||
|
||||
float waterHeight(vec3 p)
|
||||
{
|
||||
float d = length(p.xz);
|
||||
float h = sin(d * 1.5 + iGlobalTime * 3.0) * 12.0 / d; // Island waves
|
||||
#ifdef SMALL_WAVES
|
||||
h += fbm(p*0.5); // Other waves
|
||||
#endif
|
||||
return h;
|
||||
}
|
||||
|
||||
vec3 bump(vec3 pos, vec3 rayDir)
|
||||
{
|
||||
float s = 2.0;
|
||||
|
||||
// Fade out waves to reduce aliasing
|
||||
float dist = dot(pos, rayDir);
|
||||
s *= dist < 2.0 ? 1.0 : 1.4142 / sqrt(dist);
|
||||
|
||||
// Calculate normal from heightmap
|
||||
vec2 e = vec2(1e-2, 0.0);
|
||||
vec3 p = vec3(pos.x, iGlobalTime*0.5, pos.z)*0.7;
|
||||
float m = waterHeight(p)*s;
|
||||
return normalize(vec3(
|
||||
waterHeight(p+e.xyy)*s-m,
|
||||
1.0,
|
||||
waterHeight(p+e.yxy)*s-m
|
||||
));
|
||||
}
|
||||
|
||||
// Ray intersections
|
||||
vec4 intersectSphere(vec3 rpos, vec3 rdir, vec3 pos, float rad)
|
||||
{
|
||||
vec3 op = pos - rpos;
|
||||
float b = dot(op, rdir);
|
||||
float det = b*b - dot(op, op) + rad*rad;
|
||||
|
||||
if (det > 0.0)
|
||||
{
|
||||
det = sqrt(det);
|
||||
float t = b - det;
|
||||
if (t > eps)
|
||||
return vec4(-normalize(rpos+rdir*t-pos), t);
|
||||
}
|
||||
|
||||
return vec4(0.0);
|
||||
}
|
||||
|
||||
vec4 intersectCylinder(vec3 rpos, vec3 rdir, vec3 pos, float rad)
|
||||
{
|
||||
vec3 op = pos - rpos;
|
||||
vec2 rdir2 = normalize(rdir.yz);
|
||||
float b = dot(op.yz, rdir2);
|
||||
float det = b*b - dot(op.yz, op.yz) + rad*rad;
|
||||
|
||||
if (det > 0.0)
|
||||
{
|
||||
det = sqrt(det);
|
||||
float t = b - det;
|
||||
if (t > eps)
|
||||
return vec4(-normalize(rpos.yz+rdir2*t-pos.yz), 0.0, t);
|
||||
t = b + det;
|
||||
if (t > eps)
|
||||
return vec4(-normalize(rpos.yz+rdir2*t-pos.yz), 0.0, t);
|
||||
}
|
||||
|
||||
return vec4(0.0);
|
||||
}
|
||||
|
||||
vec4 intersectPlane(vec3 rayPos, vec3 rayDir, vec3 n, float d)
|
||||
{
|
||||
float t = -(dot(rayPos, n) + d) / dot(rayDir, n);
|
||||
return vec4(n * sign(dot(rayDir, n)), t);
|
||||
}
|
||||
|
||||
// Helper functions
|
||||
vec3 rotate(vec3 p, float theta)
|
||||
{
|
||||
float c = cos(theta), s = sin(theta);
|
||||
return vec3(p.x * c + p.z * s, p.y,
|
||||
p.z * c - p.x * s);
|
||||
}
|
||||
|
||||
float impulse(float k, float x) // by iq
|
||||
{
|
||||
float h = k*x;
|
||||
return h * exp(1.0 - h);
|
||||
}
|
||||
|
||||
// Raymarched parts of scene
|
||||
float grass(vec3 pos)
|
||||
{
|
||||
float h = length(pos - vec3(0.0, -7.0, 0.0)) - 8.0;
|
||||
|
||||
if (h > 2.0) return h; // Optimization (Avoid noise if too far away)
|
||||
|
||||
return h + snoise(pos * 3.0) * 0.1 + pos.y * 0.9;
|
||||
}
|
||||
|
||||
float tree(vec3 pos)
|
||||
{
|
||||
pos.y -= 0.5;
|
||||
float s = sin(pos.y*0.03);
|
||||
float c = cos(pos.y*0.03);
|
||||
mat2 m = mat2(c, -s, s, c);
|
||||
vec3 p = vec3(m*pos.xy, pos.z);
|
||||
|
||||
float width = 1.0 - pos.y * 0.02 - clamp(sin(pos.y * 8.0) * 0.1, 0.05, 0.1);
|
||||
|
||||
return max(length(p.xz) - width, pos.y - 12.5);
|
||||
}
|
||||
|
||||
vec2 scene(vec3 pos)
|
||||
{
|
||||
float vtree = tree(pos);
|
||||
#ifdef GRASS
|
||||
float vgrass = grass(pos);
|
||||
float v = min(vtree, vgrass);
|
||||
#else
|
||||
float v = vtree;
|
||||
#endif
|
||||
return vec2(v, v == vtree ? 2.0 : 1.0);
|
||||
}
|
||||
|
||||
vec3 normal(vec3 pos)
|
||||
{
|
||||
vec2 eps = vec2(1e-3, 0.0);
|
||||
float h = scene(pos).x;
|
||||
return normalize(vec3(
|
||||
scene(pos-eps.xyy).x-h,
|
||||
scene(pos-eps.yxy).x-h,
|
||||
scene(pos-eps.yyx).x-h
|
||||
));
|
||||
}
|
||||
|
||||
float plantsShadow(vec3 rayPos, vec3 rayDir)
|
||||
{
|
||||
// Soft shadow taken from iq
|
||||
float k = 6.0;
|
||||
float t = 0.0;
|
||||
float s = 1.0;
|
||||
for (int i = 0; i < 30; i++)
|
||||
{
|
||||
vec3 pos = rayPos+rayDir*t;
|
||||
vec2 res = scene(pos);
|
||||
if (res.x < 0.001) return 0.0;
|
||||
s = min(s, k*res.x/t);
|
||||
t += max(res.x, 0.01);
|
||||
}
|
||||
|
||||
return s*s*(3.0 - 2.0*s);
|
||||
}
|
||||
|
||||
// Ray-traced parts of scene
|
||||
vec4 intersectWater(vec3 rayPos, vec3 rayDir)
|
||||
{
|
||||
float h = sin(20.5 + iGlobalTime * 2.0) * 0.03;
|
||||
float t = -(rayPos.y + 2.5 + h) / rayDir.y;
|
||||
return vec4(0.0, 1.0, 0.0, t);
|
||||
}
|
||||
|
||||
vec4 intersectSand(vec3 rayPos, vec3 rayDir)
|
||||
{
|
||||
return intersectSphere(rayPos, rayDir, vec3(0.0,-24.1,0.0), 24.1);
|
||||
}
|
||||
|
||||
vec4 intersectTreasure(vec3 rayPos, vec3 rayDir)
|
||||
{
|
||||
return vec4(0.0);
|
||||
}
|
||||
|
||||
vec4 intersectLeaf(vec3 rayPos, vec3 rayDir, float openAmount)
|
||||
{
|
||||
vec3 dir = normalize(vec3(0.0, 1.0, openAmount));
|
||||
float offset = 0.0;
|
||||
|
||||
vec4 res = intersectPlane(rayPos, rayDir, dir, 0.0);
|
||||
vec3 pos = rayPos+rayDir*res.w;
|
||||
#ifdef RAGGED_LEAVES
|
||||
offset = snoise(pos*0.8) * 0.3;
|
||||
#endif
|
||||
if (pos.y > 0.0 || length(pos * vec3(0.9, 2.0, 1.0)) > 4.0 - offset) res.w = 0.0;
|
||||
|
||||
vec4 res2 = intersectPlane(rayPos, rayDir, vec3(dir.xy, -dir.z), 0.0);
|
||||
pos = rayPos+rayDir*res2.w;
|
||||
#ifdef RAGGED_LEAVES
|
||||
offset = snoise(pos*0.8) * 0.3;
|
||||
#endif
|
||||
if (pos.y > 0.0 || length(pos * vec3(0.9, 2.0, 1.0)) > 4.0 - offset) res2.w = 0.0;
|
||||
|
||||
if (res2.w > 0.0 && res2.w < res.w || res.w <= 0.0)
|
||||
res = res2;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
vec4 leaves(vec3 rayPos, vec3 rayDir)
|
||||
{
|
||||
float t = 1e20;
|
||||
vec3 n = vec3(0.0);
|
||||
|
||||
rayPos -= leavesPos;
|
||||
|
||||
float sway = impulse(15.0, fract(iGlobalTime / PI * 0.125));
|
||||
float upDownSway = sway * -sin(iGlobalTime) * 0.06;
|
||||
float openAmount = sway * max(-cos(iGlobalTime) * 0.4, 0.0);
|
||||
|
||||
float angleOffset = -0.1;
|
||||
for (float k = 0.0; k < 6.2; k += 0.75)
|
||||
{
|
||||
// Left-right
|
||||
float alpha = k + (k - PI) * sway * 0.015;
|
||||
vec3 p = rotate(rayPos, alpha);
|
||||
vec3 d = rotate(rayDir, alpha);
|
||||
|
||||
// Up-down
|
||||
angleOffset *= -1.0;
|
||||
float theta = -0.4 +
|
||||
angleOffset +
|
||||
cos(k) * 0.35 +
|
||||
upDownSway +
|
||||
sin(iGlobalTime+k*10.0) * 0.03 * (sway + 0.2);
|
||||
|
||||
p = rotate(p.xzy, theta).xzy;
|
||||
d = rotate(d.xzy, theta).xzy;
|
||||
|
||||
// Shift
|
||||
p -= vec3(5.4, 0.0, 0.0);
|
||||
|
||||
// Intersect individual leaf
|
||||
vec4 res = intersectLeaf(p, d, 1.0+openAmount);
|
||||
if (res.w > 0.0 && res.w < t)
|
||||
{
|
||||
t = res.w;
|
||||
n = res.xyz;
|
||||
}
|
||||
}
|
||||
|
||||
return vec4(n, t);
|
||||
}
|
||||
|
||||
// Lighting
|
||||
float shadow(vec3 rayPos, vec3 rayDir)
|
||||
{
|
||||
float s = 1.0;
|
||||
|
||||
// Intersect sand
|
||||
//vec4 resSand = intersectSand(rayPos, rayDir);
|
||||
//if (resSand.w > 0.0) return 0.0;
|
||||
|
||||
// Intersect plants
|
||||
s = min(s, plantsShadow(rayPos, rayDir));
|
||||
if (s < 0.0001) return 0.0;
|
||||
|
||||
// Intersect leaves
|
||||
vec4 resLeaves = leaves(rayPos, rayDir);
|
||||
if (resLeaves.w > 0.0 && resLeaves.w < 1e7) return 0.0;
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
vec3 light(vec3 p, vec3 n)
|
||||
{
|
||||
float s = 1.0;
|
||||
|
||||
#ifdef SHADOWS
|
||||
s = shadow(p-sunDir*0.01, -sunDir);
|
||||
#endif
|
||||
|
||||
vec3 col = sunCol * min(max(dot(n, sunDir), 0.0), s);
|
||||
col += skyCol * (-n.y * 0.5 + 0.5) * 0.3;
|
||||
return col;
|
||||
}
|
||||
|
||||
vec3 lightLeaves(vec3 p, vec3 n)
|
||||
{
|
||||
float s = 1.0;
|
||||
|
||||
#ifdef SHADOWS
|
||||
s = shadow(p-sunDir*0.01, -sunDir);
|
||||
#endif
|
||||
|
||||
float ao = min(length(p - leavesPos) * 0.1, 1.0);
|
||||
|
||||
float ns = dot(n, sunDir);
|
||||
float d = sqrt(max(ns, 0.0));
|
||||
vec3 col = sunCol * min(d, s);
|
||||
col += sunCol * max(-ns, 0.0) * vec3(0.3, 0.3, 0.1) * ao;
|
||||
col += skyCol * (-n.y * 0.5 + 0.5) * 0.3 * ao;
|
||||
return col;
|
||||
}
|
||||
|
||||
vec3 sky(vec3 n)
|
||||
{
|
||||
return skyCol * (1.0 - n.y * 0.8);
|
||||
}
|
||||
|
||||
// Ray-marching
|
||||
vec4 plants(vec3 rayPos, vec3 rayDir)
|
||||
{
|
||||
float t = 0.0;
|
||||
|
||||
for (int i = 0; i < 40; i++)
|
||||
{
|
||||
vec3 pos = rayPos+rayDir*t;
|
||||
vec2 res = scene(pos);
|
||||
float h = res.x;
|
||||
|
||||
if (h < 0.001)
|
||||
{
|
||||
vec3 col = res.y == 2.0 ? treeCol : grassCol;
|
||||
float uvFact = res.y == 2.0 ? 1.0 : 10.0;
|
||||
|
||||
vec3 n = normal(pos);
|
||||
vec2 uv = vec2(n.x, pos.y * 0.5) * 0.2 * uvFact;
|
||||
vec3 tex = texture2D(iChannel0, uv).rgb * 0.6 + 0.4;
|
||||
float ao = min(length(pos - leavesPos) * 0.1, 1.0);
|
||||
return vec4(col * light(pos, n) * ao * tex, t);
|
||||
}
|
||||
|
||||
t += h;
|
||||
}
|
||||
|
||||
return vec4(sky(rayDir), 1e8);
|
||||
}
|
||||
|
||||
// Final combination
|
||||
vec3 traceReflection(vec3 rayPos, vec3 rayDir)
|
||||
{
|
||||
vec3 col = vec3(0.0);
|
||||
float t = 1e20;
|
||||
|
||||
// Intersect plants
|
||||
vec4 resPlants = plants(rayPos, rayDir);
|
||||
if (resPlants.w > 0.0 && resPlants.w < t)
|
||||
{
|
||||
t = resPlants.w;
|
||||
col = resPlants.xyz;
|
||||
}
|
||||
|
||||
// Intersect leaves
|
||||
vec4 resLeaves = leaves(rayPos, rayDir);
|
||||
if (resLeaves.w > 0.0 && resLeaves.w < t)
|
||||
{
|
||||
vec3 pos = rayPos + rayDir * resLeaves.w;
|
||||
vec2 uv = (pos.xz - leavesPos.xz) * 0.3;
|
||||
float tex = texture2D(iChannel0, uv).r * 0.6 + 0.5;
|
||||
|
||||
t = resLeaves.w;
|
||||
col = leavesCol * lightLeaves(pos, resLeaves.xyz) * tex;
|
||||
}
|
||||
|
||||
if (t > 1e7) return sky(rayDir);
|
||||
|
||||
return col;
|
||||
}
|
||||
|
||||
vec3 trace(vec3 rayPos, vec3 rayDir)
|
||||
{
|
||||
vec3 col = vec3(0.0);
|
||||
float t = 1e20;
|
||||
|
||||
// Intersect sand
|
||||
vec4 resSand = intersectSand(rayPos, rayDir);
|
||||
if (resSand.w > 0.0)
|
||||
{
|
||||
vec3 pos = rayPos + rayDir * resSand.w;
|
||||
t = resSand.w;
|
||||
|
||||
col = sandCol * light(pos, resSand.xyz);
|
||||
}
|
||||
|
||||
// Intersect treasure chest
|
||||
vec4 resTreasure = intersectTreasure(rayPos, rayDir);
|
||||
if (resTreasure.w > 0.0 && resTreasure.w < t)
|
||||
{
|
||||
vec3 pos = rayPos + rayDir * resTreasure.w;
|
||||
t = resTreasure.w;
|
||||
col = leavesCol * light(pos, resTreasure.xyz);
|
||||
}
|
||||
|
||||
// Intersect leaves
|
||||
vec4 resLeaves = leaves(rayPos, rayDir);
|
||||
if (resLeaves.w > 0.0 && resLeaves.w < t)
|
||||
{
|
||||
vec3 pos = rayPos + rayDir * resLeaves.w;
|
||||
vec2 uv = (pos.xz - leavesPos.xz) * 0.3;
|
||||
float tex = texture2D(iChannel0, uv).r * 0.6 + 0.5;
|
||||
|
||||
t = resLeaves.w;
|
||||
col = leavesCol * lightLeaves(pos, resLeaves.xyz) * tex;
|
||||
}
|
||||
|
||||
// Intersect plants
|
||||
vec4 resPlants = plants(rayPos, rayDir);
|
||||
if (resPlants.w > 0.0 && resPlants.w < t)
|
||||
{
|
||||
t = resPlants.w;
|
||||
col = resPlants.xyz;
|
||||
}
|
||||
|
||||
// Intersect water
|
||||
vec4 resWater = intersectWater(rayPos, rayDir);
|
||||
if (resWater.w > 0.0 && resWater.w < t)
|
||||
{
|
||||
vec3 pos = rayPos + rayDir * resWater.w;
|
||||
float dist = t - resWater.w;
|
||||
vec3 n = bump(pos, rayDir);
|
||||
|
||||
float ct = -min(dot(n,rayDir), 0.0);
|
||||
float fresnel = 0.9 - 0.9 * pow(1.0 - ct, 5.0);
|
||||
|
||||
vec3 trans = col * exp(-dist * vec3(1.0, 0.7, 0.4) * 3.0);
|
||||
vec3 reflDir = normalize(reflect(rayDir, n));
|
||||
vec3 refl = sky(reflDir);
|
||||
|
||||
#ifdef REFLECTIONS
|
||||
if (dot(pos, rayDir) < -2.0)
|
||||
refl = traceReflection(pos, reflDir).rgb;
|
||||
#endif
|
||||
|
||||
t = resWater.t;
|
||||
col = mix(refl, trans, fresnel);
|
||||
}
|
||||
|
||||
if (t > 1e7) return sky(rayDir);
|
||||
|
||||
return col;
|
||||
}
|
||||
|
||||
// Ray-generation
|
||||
vec3 camera(vec2 px)
|
||||
{
|
||||
vec2 rd = (px / iResolution.yy - vec2(iResolution.x/iResolution.y*0.5-0.5, 0.0)) * 2.0 - 1.0;
|
||||
float t = sin(iGlobalTime * 0.1) * 0.2;
|
||||
vec3 rayDir = normalize(vec3(rd.x, rd.y, 1.0));
|
||||
vec3 rayPos = vec3(0.0, 3.0, -18.0);
|
||||
return trace(rayPos, rayDir);
|
||||
}
|
||||
|
||||
void main(void)
|
||||
{
|
||||
#ifdef HEAVY_AA
|
||||
vec3 col = camera(gl_FragCoord.xy+vec2(0.0,0.5))*0.25;
|
||||
col += camera(gl_FragCoord.xy+vec2(0.25,0.0))*0.25;
|
||||
col += camera(gl_FragCoord.xy+vec2(0.5,0.75))*0.25;
|
||||
col += camera(gl_FragCoord.xy+vec2(0.75,0.25))*0.25;
|
||||
#else
|
||||
vec3 col = camera(gl_FragCoord.xy);
|
||||
#ifdef LIGHT_AA
|
||||
col = col * 0.5 + camera(gl_FragCoord.xy+vec2(0.5,0.5))*0.5;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef TONEMAP
|
||||
// Optimized Haarm-Peter Duiker’s curve
|
||||
vec3 x = max(vec3(0.0),col*exposure-0.004);
|
||||
col = (x*(6.2*x+.5))/(x*(6.2*x+1.7)+0.06);
|
||||
#else
|
||||
col = pow(col, vec3(0.4545));
|
||||
#endif
|
||||
|
||||
gl_FragColor = vec4(col, 1.0);
|
||||
}
|
||||
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}"]
|
||||
}
|
||||
89
samples/HLSL/bloom.cginc
Normal file
89
samples/HLSL/bloom.cginc
Normal file
@@ -0,0 +1,89 @@
|
||||
// From https://github.com/Unity-Technologies/PostProcessing/blob/master/PostProcessing/Resources/Shaders/Bloom.cginc
|
||||
// Licensed under the MIT license
|
||||
|
||||
#ifndef __BLOOM__
|
||||
#define __BLOOM__
|
||||
|
||||
#include "Common.cginc"
|
||||
|
||||
// Brightness function
|
||||
half Brightness(half3 c)
|
||||
{
|
||||
return Max3(c);
|
||||
}
|
||||
|
||||
// 3-tap median filter
|
||||
half3 Median(half3 a, half3 b, half3 c)
|
||||
{
|
||||
return a + b + c - min(min(a, b), c) - max(max(a, b), c);
|
||||
}
|
||||
|
||||
// Downsample with a 4x4 box filter
|
||||
half3 DownsampleFilter(sampler2D tex, float2 uv, float2 texelSize)
|
||||
{
|
||||
float4 d = texelSize.xyxy * float4(-1.0, -1.0, 1.0, 1.0);
|
||||
|
||||
half3 s;
|
||||
s = DecodeHDR(tex2D(tex, uv + d.xy));
|
||||
s += DecodeHDR(tex2D(tex, uv + d.zy));
|
||||
s += DecodeHDR(tex2D(tex, uv + d.xw));
|
||||
s += DecodeHDR(tex2D(tex, uv + d.zw));
|
||||
|
||||
return s * (1.0 / 4.0);
|
||||
}
|
||||
|
||||
// Downsample with a 4x4 box filter + anti-flicker filter
|
||||
half3 DownsampleAntiFlickerFilter(sampler2D tex, float2 uv, float2 texelSize)
|
||||
{
|
||||
float4 d = texelSize.xyxy * float4(-1.0, -1.0, 1.0, 1.0);
|
||||
|
||||
half3 s1 = DecodeHDR(tex2D(tex, uv + d.xy));
|
||||
half3 s2 = DecodeHDR(tex2D(tex, uv + d.zy));
|
||||
half3 s3 = DecodeHDR(tex2D(tex, uv + d.xw));
|
||||
half3 s4 = DecodeHDR(tex2D(tex, uv + d.zw));
|
||||
|
||||
// Karis's luma weighted average (using brightness instead of luma)
|
||||
half s1w = 1.0 / (Brightness(s1) + 1.0);
|
||||
half s2w = 1.0 / (Brightness(s2) + 1.0);
|
||||
half s3w = 1.0 / (Brightness(s3) + 1.0);
|
||||
half s4w = 1.0 / (Brightness(s4) + 1.0);
|
||||
half one_div_wsum = 1.0 / (s1w + s2w + s3w + s4w);
|
||||
|
||||
return (s1 * s1w + s2 * s2w + s3 * s3w + s4 * s4w) * one_div_wsum;
|
||||
}
|
||||
|
||||
half3 UpsampleFilter(sampler2D tex, float2 uv, float2 texelSize, float sampleScale)
|
||||
{
|
||||
#if MOBILE_OR_CONSOLE
|
||||
// 4-tap bilinear upsampler
|
||||
float4 d = texelSize.xyxy * float4(-1.0, -1.0, 1.0, 1.0) * (sampleScale * 0.5);
|
||||
|
||||
half3 s;
|
||||
s = DecodeHDR(tex2D(tex, uv + d.xy));
|
||||
s += DecodeHDR(tex2D(tex, uv + d.zy));
|
||||
s += DecodeHDR(tex2D(tex, uv + d.xw));
|
||||
s += DecodeHDR(tex2D(tex, uv + d.zw));
|
||||
|
||||
return s * (1.0 / 4.0);
|
||||
#else
|
||||
// 9-tap bilinear upsampler (tent filter)
|
||||
float4 d = texelSize.xyxy * float4(1.0, 1.0, -1.0, 0.0) * sampleScale;
|
||||
|
||||
half3 s;
|
||||
s = DecodeHDR(tex2D(tex, uv - d.xy));
|
||||
s += DecodeHDR(tex2D(tex, uv - d.wy)) * 2.0;
|
||||
s += DecodeHDR(tex2D(tex, uv - d.zy));
|
||||
|
||||
s += DecodeHDR(tex2D(tex, uv + d.zw)) * 2.0;
|
||||
s += DecodeHDR(tex2D(tex, uv)) * 4.0;
|
||||
s += DecodeHDR(tex2D(tex, uv + d.xw)) * 2.0;
|
||||
|
||||
s += DecodeHDR(tex2D(tex, uv + d.zy));
|
||||
s += DecodeHDR(tex2D(tex, uv + d.wy)) * 2.0;
|
||||
s += DecodeHDR(tex2D(tex, uv + d.xy));
|
||||
|
||||
return s * (1.0 / 16.0);
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif // __BLOOM__
|
||||
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)); }
|
||||
;
|
||||
37
samples/Jolie/common.iol
Normal file
37
samples/Jolie/common.iol
Normal file
@@ -0,0 +1,37 @@
|
||||
include "types/Binding.iol"
|
||||
|
||||
constants {
|
||||
Location_Exam = "socket://localhost:8000"
|
||||
}
|
||||
|
||||
type StartExamRequest:void {
|
||||
.examName:string
|
||||
.studentName:string
|
||||
.student:Binding
|
||||
}
|
||||
|
||||
type MakeQuestionRequest:void {
|
||||
.question:string
|
||||
.examName:string
|
||||
.studentName:string
|
||||
}
|
||||
|
||||
type DecisionMessage:void {
|
||||
.studentName:string
|
||||
.examName:string
|
||||
}
|
||||
|
||||
interface ExamInterface {
|
||||
OneWay:
|
||||
startExam(StartExamRequest),
|
||||
pass(DecisionMessage), fail(DecisionMessage)
|
||||
RequestResponse:
|
||||
makeQuestion(MakeQuestionRequest)(int)
|
||||
}
|
||||
|
||||
interface StudentInterface {
|
||||
OneWay:
|
||||
sendMessage(string)
|
||||
RequestResponse:
|
||||
makeQuestion(MakeQuestionRequest)(int)
|
||||
}
|
||||
39
samples/Jolie/exam.ol
Normal file
39
samples/Jolie/exam.ol
Normal file
@@ -0,0 +1,39 @@
|
||||
include "common.iol"
|
||||
|
||||
cset {
|
||||
studentName:
|
||||
StartExamRequest.studentName
|
||||
DecisionMessage.studentName
|
||||
MakeQuestionRequest.studentName,
|
||||
examName:
|
||||
StartExamRequest.examName
|
||||
DecisionMessage.examName
|
||||
MakeQuestionRequest.examName
|
||||
}
|
||||
|
||||
execution { concurrent }
|
||||
|
||||
outputPort Student {
|
||||
Interfaces: StudentInterface
|
||||
}
|
||||
|
||||
inputPort ExamInput {
|
||||
Location: Location_Exam
|
||||
Protocol: sodep
|
||||
Interfaces: ExamInterface
|
||||
}
|
||||
|
||||
main
|
||||
{
|
||||
startExam( examRequest );
|
||||
Student << examRequest.student;
|
||||
makeQuestion( question )( answer ) {
|
||||
makeQuestion@Student( question )( answer )
|
||||
};
|
||||
[ pass( message ) ] {
|
||||
sendMessage@Student( "You passed!" )
|
||||
}
|
||||
[ fail( message ) ] {
|
||||
sendMessage@Student( "You failed!" )
|
||||
}
|
||||
}
|
||||
26
samples/Jolie/examiner.ol
Normal file
26
samples/Jolie/examiner.ol
Normal file
@@ -0,0 +1,26 @@
|
||||
include "common.iol"
|
||||
include "ui/swing_ui.iol"
|
||||
include "console.iol"
|
||||
|
||||
outputPort Exam {
|
||||
Location: Location_Exam
|
||||
Protocol: sodep
|
||||
Interfaces: ExamInterface
|
||||
}
|
||||
|
||||
main
|
||||
{
|
||||
question.studentName = "John";
|
||||
question.examName = "SPLG";
|
||||
question.question = "Random question";
|
||||
makeQuestion@Exam( question )( answer );
|
||||
showYesNoQuestionDialog@SwingUI( "Do you want to accept answer " + answer + " ?" )( decision );
|
||||
|
||||
message.studentName = "John";
|
||||
message.examName = "SPLG";
|
||||
if ( decision == 0 ) {
|
||||
pass@Exam( message )
|
||||
} else {
|
||||
fail@Exam( message )
|
||||
}
|
||||
}
|
||||
84
samples/Jolie/hanoi.ol
Normal file
84
samples/Jolie/hanoi.ol
Normal file
@@ -0,0 +1,84 @@
|
||||
// https://github.com/jolie/website/blob/master/docs/documentation/locations/code/local.ol
|
||||
|
||||
include "runtime.iol"
|
||||
include "string_utils.iol"
|
||||
|
||||
type HanoiRequest: void{
|
||||
.src: string
|
||||
.aux: string
|
||||
.dst: string
|
||||
.n: int
|
||||
.sid?: string
|
||||
}
|
||||
|
||||
type HanoiReponse: void {
|
||||
.move?: string
|
||||
}
|
||||
|
||||
interface LocalOperations{
|
||||
RequestResponse:
|
||||
hanoiSolver( HanoiRequest )( HanoiReponse )
|
||||
}
|
||||
|
||||
interface ExternalOperations{
|
||||
RequestResponse:
|
||||
hanoi( HanoiRequest )( string )
|
||||
}
|
||||
|
||||
outputPort Self{
|
||||
Interfaces: LocalOperations
|
||||
}
|
||||
|
||||
inputPort Self {
|
||||
Location: "local"
|
||||
Interfaces: LocalOperations
|
||||
}
|
||||
|
||||
inputPort PowerService {
|
||||
Location: "socket://localhost:8000"
|
||||
Protocol: http{
|
||||
.format = "html"
|
||||
}
|
||||
Interfaces: ExternalOperations
|
||||
}
|
||||
|
||||
execution { concurrent }
|
||||
|
||||
init
|
||||
{
|
||||
getLocalLocation@Runtime()( Self.location )
|
||||
}
|
||||
|
||||
main
|
||||
{
|
||||
[ hanoi( request )( response ){
|
||||
getRandomUUID@StringUtils()(request.sid);
|
||||
hanoiSolver@Self( request )( subRes );
|
||||
response = subRes.move
|
||||
}]{ nullProcess }
|
||||
|
||||
[ hanoiSolver( request )( response ){
|
||||
if ( request.n > 0 ){
|
||||
subReq.n = request.n;
|
||||
subReq.n--;
|
||||
with( request ){
|
||||
subReq.aux = .dst;
|
||||
subReq.dst = .aux;
|
||||
subReq.src = .src;
|
||||
subReq.sid = .sid
|
||||
};
|
||||
hanoiSolver@Self( subReq )( response );
|
||||
response.move += "<br>" +
|
||||
++global.counters.(request.sid) +
|
||||
") Move from " + request.src +
|
||||
" to " + request.dst + ";";
|
||||
with ( request ){
|
||||
subReq.src = .aux;
|
||||
subReq.aux = .src;
|
||||
subReq.dst = .dst
|
||||
};
|
||||
hanoiSolver@Self( subReq )( subRes );
|
||||
response.move += subRes.move
|
||||
}
|
||||
}]{ nullProcess }
|
||||
}
|
||||
29
samples/Jolie/student.ol
Normal file
29
samples/Jolie/student.ol
Normal file
@@ -0,0 +1,29 @@
|
||||
include "common.iol"
|
||||
include "ui/swing_ui.iol"
|
||||
include "console.iol"
|
||||
|
||||
outputPort Exam {
|
||||
Location: Location_Exam
|
||||
Protocol: sodep
|
||||
Interfaces: ExamInterface
|
||||
}
|
||||
|
||||
inputPort StudentInput {
|
||||
Location: "socket://localhost:8001/"
|
||||
Protocol: sodep
|
||||
Interfaces: StudentInterface
|
||||
}
|
||||
|
||||
main
|
||||
{
|
||||
request.studentName = "John";
|
||||
request.examName = "SPLG";
|
||||
request.student.location = "socket://localhost:8001/";
|
||||
request.student.protocol = "sodep";
|
||||
startExam@Exam( request );
|
||||
makeQuestion( question )( answer ) {
|
||||
showYesNoQuestionDialog@SwingUI( question.question )( answer )
|
||||
};
|
||||
sendMessage( message );
|
||||
println@Console( message )()
|
||||
}
|
||||
49
samples/LookML/example.model.lkml
Normal file
49
samples/LookML/example.model.lkml
Normal file
@@ -0,0 +1,49 @@
|
||||
- label: 'desired label name'
|
||||
- connection: connection_name
|
||||
- include: filename_or_pattern
|
||||
# Possibly more include declarations
|
||||
- persist_for: N (seconds | minutes | hours)
|
||||
- case_sensitive: true | false
|
||||
- week_start_day: monday | tuesday | wednesday | thursday | friday | saturday | sunday
|
||||
- value_formats:
|
||||
- name: desired_format_name
|
||||
value_format: 'excel-style formatting string'
|
||||
# Possibly more value formats
|
||||
|
||||
- explore: view_name
|
||||
label: 'desired label name'
|
||||
description: 'description string'
|
||||
symmetric_aggregates: true | false
|
||||
hidden: true | false
|
||||
fields: [field_or_set, field_or_set, …]
|
||||
|
||||
sql_always_where: SQL WHERE condition
|
||||
always_filter:
|
||||
field_name: 'looker filter expression'
|
||||
conditionally_filter:
|
||||
field_name: 'looker filter expression'
|
||||
unless: [field_or_set, field_or_set, …]
|
||||
access_filter_fields: [fully_scoped_field, fully_scoped_field, …]
|
||||
|
||||
always_join: [view_name, view_name, …]
|
||||
joins:
|
||||
- join: view_name
|
||||
type: left_outer | full_outer | inner | cross
|
||||
relationship: one_to_one | many_to_one | one_to_many | many_to_many
|
||||
from: view_name
|
||||
sql_table_name: table_name
|
||||
view_label: 'desired label name'
|
||||
fields: [field_or_set, field_or_set, …]
|
||||
required_joins: [view_name, view_name, …]
|
||||
foreign_key: dimension_name
|
||||
sql_on: SQL ON clause
|
||||
# Possibly more join declarations
|
||||
|
||||
persist_for: N (seconds | minutes | hours)
|
||||
from: view_name
|
||||
view: view_name
|
||||
case_sensitive: true | false
|
||||
sql_table_name: table_name
|
||||
cancel_grouping_fields: [fully_scoped_field, fully_scoped_field, …]
|
||||
|
||||
# Possibly more explore declarations
|
||||
90
samples/LookML/example.view.lkml
Normal file
90
samples/LookML/example.view.lkml
Normal file
@@ -0,0 +1,90 @@
|
||||
- view: view_name
|
||||
sql_table_name: table_name
|
||||
suggestions: true | false
|
||||
|
||||
derived_table:
|
||||
sql: SQL query
|
||||
persist_for: N (seconds | minutes | hours)
|
||||
sql_trigger_value: SQL query
|
||||
distribution: column_name
|
||||
distribution_style: ALL | EVEN
|
||||
sortkeys: [column_name, column_name, …]
|
||||
indexes: [column_name, column_name, …]
|
||||
|
||||
sets:
|
||||
set_name:
|
||||
- field_or_set
|
||||
- field_or_set
|
||||
- …
|
||||
# Possibly more set declarations
|
||||
|
||||
fields:
|
||||
- (dimension | dimension_group | measure | filter): field_name
|
||||
label: 'desired label name'
|
||||
view_label: 'desired label name'
|
||||
group_label: 'desired label name'
|
||||
description: 'description string'
|
||||
hidden: true | false
|
||||
alias: [old_field_name, old_field_name, …]
|
||||
value_format: 'excel-style formatting string'
|
||||
value_format_name: format_name
|
||||
html: HTML expression using Liquid template elements
|
||||
sql: SQL expression to generate the field value
|
||||
required_fields: [field_name, field_name, …]
|
||||
drill_fields: [field_or_set, field_or_set, …]
|
||||
can_filter: true | false
|
||||
fanout_on: repeated_record_name
|
||||
|
||||
# DIMENSION SPECIFIC PARAMETERS
|
||||
|
||||
type: dimension_field_type
|
||||
primary_key: true | false
|
||||
sql_case:
|
||||
value: SQL condition
|
||||
value: SQL condition
|
||||
# Possibly more sql_case statements
|
||||
alpha_sort: true | false
|
||||
tiers: [N, N, …]
|
||||
style: classic | interval | integer | relational
|
||||
sql_latitude: SQL expression to generate a latitude
|
||||
sql_longitude: SQL expression to generate a longitude
|
||||
suggestable: true | false
|
||||
suggest_persist_for: N (seconds | minutes | hours)
|
||||
suggest_dimension: dimension_name
|
||||
suggest_explore: explore_name
|
||||
suggestions: ['suggestion string', 'suggestion string', …]
|
||||
bypass_suggest_restrictions: true | false
|
||||
full_suggestions: true | false
|
||||
skip_drill_filter: true | false
|
||||
case_sensitive: true | false
|
||||
order_by_field: dimension_name
|
||||
map_layer: name_of_map_layer
|
||||
links:
|
||||
- label: 'desired label name'
|
||||
url: desired_url
|
||||
icon_url: url_of_an_ico_file
|
||||
# Possibly more links
|
||||
|
||||
# DIMENSION GROUP SPECIFIC PARAMETERS
|
||||
|
||||
timeframes: [timeframe, timeframe, …]
|
||||
convert_tz: true | false
|
||||
datatype: epoch | timestamp | datetime | date | yyyymmdd
|
||||
|
||||
# MEASURE SPECIFIC PARAMETERS
|
||||
|
||||
type: measure_field_type
|
||||
direction: row | column
|
||||
approximate: true | false
|
||||
approximate_threshold: N
|
||||
sql_distinct_key: SQL expression to define repeated entities
|
||||
list_field: dimension_name
|
||||
filters:
|
||||
dimension_name: 'looker filter expression'
|
||||
# Possibly more filters statements
|
||||
|
||||
# FILTER SPECIFIC PARAMETERS
|
||||
|
||||
default_value: 'desired default value'
|
||||
|
||||
# Possibly more dimension or measure declarations
|
||||
@@ -1,9 +1,14 @@
|
||||
---
|
||||
type: grammar
|
||||
name: css.tmbundle
|
||||
license: permissive
|
||||
curated: true
|
||||
---
|
||||
# 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:
|
||||
|
||||
@@ -12,4 +17,4 @@ If not otherwise specified (see below), files in this repository fall under the
|
||||
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”.
|
||||
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”.
|
||||
192
samples/Markdown/csharp6.workbook
Normal file
192
samples/Markdown/csharp6.workbook
Normal file
@@ -0,0 +1,192 @@
|
||||
---
|
||||
uti: com.xamarin.workbook
|
||||
platforms:
|
||||
- Console
|
||||
---
|
||||
|
||||
# Using C# 6
|
||||
|
||||
Some examples from Xamarin's [intro to C# 6](https://developer.xamarin.com/guides/cross-platform/advanced/csharp_six/).
|
||||
|
||||
* Null-conditional operator
|
||||
|
||||
* String Interpolation
|
||||
|
||||
* Expression-bodied Function Members
|
||||
|
||||
* Auto-property Initialization
|
||||
|
||||
* Index Initializers
|
||||
|
||||
* using static
|
||||
|
||||
## Null-conditional operator
|
||||
|
||||
The `?.` operator automatically does a null-check before referencing the
|
||||
specified member. The example string array below has a `null` entry:
|
||||
|
||||
```csharp
|
||||
var names = new string[] { "Foo", null };
|
||||
```
|
||||
|
||||
In C# 5, a null-check is required before accessing the `.Length` property:
|
||||
|
||||
```csharp
|
||||
// C# 5
|
||||
int secondLength = 0;
|
||||
if (names[1] != null)
|
||||
secondLength = names[1].Length;
|
||||
```
|
||||
|
||||
C# 6 allows the length to be queried in a single line; the entire
|
||||
statement returns `null` if any object is null.
|
||||
|
||||
```csharp
|
||||
var length0 = names[0]?.Length; // 3
|
||||
var length1 = names[1]?.Length; // null
|
||||
```
|
||||
|
||||
This can be used in conjunction with the `??` null coalescing operator
|
||||
to set a default value (such as `0`) in the example below:
|
||||
|
||||
```csharp
|
||||
var lengths = names.Select (names => names?.Length ?? 0); //[3, 0]
|
||||
```
|
||||
|
||||
## String Interpolation
|
||||
|
||||
Previously strings were built in a number of different ways:
|
||||
|
||||
```csharp
|
||||
var animal = "Monkeys";
|
||||
var food = "bananas";
|
||||
|
||||
var out1 = String.Format ("{0} love to eat {1}", animal, food);
|
||||
var out2 = animal + " love to eat " + food;
|
||||
// or even StringBuilder
|
||||
```
|
||||
|
||||
C# 6 provides a simple syntax where the fieldname can be
|
||||
embedded directly in the string:
|
||||
|
||||
```csharp
|
||||
$"{animal} love to eat {food}"
|
||||
```
|
||||
|
||||
String-formatting can also be done with this syntax:
|
||||
|
||||
```csharp
|
||||
var values = new int[] { 1, 2, 3, 4, 12, 123456 };
|
||||
foreach (var s in values.Select (i => $"The value is {i,10:N2}.")) {
|
||||
Console.WriteLine (s);
|
||||
}
|
||||
```
|
||||
|
||||
## Expression-bodied Function Members
|
||||
|
||||
The `ToString` override in the following class is an expression-bodied
|
||||
function - a more succinct declaration syntax.
|
||||
|
||||
```csharp
|
||||
class Person
|
||||
{
|
||||
public string FirstName { get; }
|
||||
public string LastName { get; }
|
||||
public Person (string firstname, string lastname)
|
||||
{
|
||||
FirstName = firstname;
|
||||
LastName = lastname;
|
||||
}
|
||||
// note there is no explicit `return` keyword
|
||||
public override string ToString () => $"{LastName}, {FirstName} {LastName}";
|
||||
}
|
||||
```
|
||||
|
||||
`void` expression bodied functions are also allowed so long as
|
||||
the expression is a statement:
|
||||
|
||||
```csharp
|
||||
public void Log(string message) => System.Console.WriteLine($"{DateTime.Now.ToString ("s", System.Globalization.CultureInfo.InvariantCulture )}: {message}");
|
||||
```
|
||||
|
||||
This simple example calls these two methods:
|
||||
|
||||
```csharp
|
||||
Log(new Person("James", "Bond").ToString())
|
||||
```
|
||||
|
||||
## Auto-property Initialization
|
||||
|
||||
Properties (ie. specified with `{get;set;}`) can be initialized inline
|
||||
with C# 6:
|
||||
|
||||
```csharp
|
||||
class Todo
|
||||
{
|
||||
public bool Done { get; set; } = false;
|
||||
public DateTime Created { get; } = DateTime.Now;
|
||||
public string Description { get; }
|
||||
|
||||
public Todo (string description)
|
||||
{
|
||||
this.Description = description; // can assign (only in constructor!)
|
||||
}
|
||||
public override string ToString () => $"'{Description}' was created on {Created}";
|
||||
}
|
||||
```
|
||||
|
||||
```csharp
|
||||
new Todo("buy apples")
|
||||
```
|
||||
|
||||
## Index Initializers
|
||||
|
||||
Dictionary-style data structures let you specify key/value
|
||||
types with a simple object-initializer-like syntax:
|
||||
|
||||
```csharp
|
||||
var userInfo = new Dictionary<string,object> {
|
||||
["Created"] = DateTime.Now,
|
||||
["Due"] = DateTime.Now.AddSeconds(60 * 60 * 24),
|
||||
["Task"] = "buy lettuce"
|
||||
};
|
||||
```
|
||||
|
||||
## using static
|
||||
|
||||
Enumerations, and certain classes such as System.Math, are primarily
|
||||
holders of static values and functions. In C# 6, you can import all
|
||||
static members of a type with a single using static statement:
|
||||
|
||||
```csharp
|
||||
using static System.Math;
|
||||
```
|
||||
|
||||
C# 6 code can then reference the static members directly, avoiding
|
||||
repetition of the class name (eg. `Math.PI` becomes `PI`):
|
||||
|
||||
```csharp
|
||||
public class Location
|
||||
{
|
||||
public Location (double lat, double @long) {Latitude = lat; Longitude = @long;}
|
||||
public double Latitude = 0; public double Longitude = 0;
|
||||
}
|
||||
static public double MilesBetween(Location loc1, Location loc2)
|
||||
{
|
||||
double rlat1 = PI * loc1.Latitude / 180;
|
||||
double rlat2 = PI * loc2.Latitude / 180;
|
||||
double theta = loc1.Longitude - loc2.Longitude;
|
||||
double rtheta = PI * theta / 180;
|
||||
double dist =
|
||||
Sin(rlat1) * Sin(rlat2) + Cos(rlat1) *
|
||||
Cos(rlat2) * Cos(rtheta);
|
||||
dist = Acos(dist);
|
||||
dist = dist*180/PI;
|
||||
dist = dist*60*1.1515;
|
||||
return dist; //miles
|
||||
}
|
||||
```
|
||||
|
||||
```csharp
|
||||
MilesBetween (new Location(-12,22), new Location(-13,33))
|
||||
```
|
||||
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/PLSQL/print_bool.prc
Normal file
12
samples/PLSQL/print_bool.prc
Normal file
@@ -0,0 +1,12 @@
|
||||
create or replace procedure print_bool(
|
||||
p_bool in BOOLEAN,
|
||||
p_true_value in varchar2 default 'TRUE',
|
||||
p_false_value in varchar2 := 'FALSE'
|
||||
)
|
||||
as
|
||||
begin
|
||||
|
||||
dbms_output.put_line(case when p_bool then p_true_value else p_false_value end);
|
||||
|
||||
end print_bool;
|
||||
/
|
||||
48
samples/PLSQL/videodb.ddl
Normal file
48
samples/PLSQL/videodb.ddl
Normal file
@@ -0,0 +1,48 @@
|
||||
CREATE TABLE users (
|
||||
user_name varchar2(40),
|
||||
first_name varchar2(40),
|
||||
last_name varchar2(40),
|
||||
email varchar2(40),
|
||||
password varchar2(40),
|
||||
created_date DATE,
|
||||
total_credits NUMBER,
|
||||
credit_change_date DATE,
|
||||
PRIMARY KEY (user_name)
|
||||
);
|
||||
/
|
||||
|
||||
CREATE TABLE users_videos (
|
||||
video_id NUMBER,
|
||||
video_name varchar2(40),
|
||||
user_name varchar2(40),
|
||||
description varchar2(512),
|
||||
upload_date DATE,
|
||||
PRIMARY KEY (video_id),
|
||||
CONSTRAINT "USERS_VIDEOS_FK1" FOREIGN KEY ("USER_NAME") REFERENCES "USERS"("USER_NAME")
|
||||
);
|
||||
/
|
||||
|
||||
create or replace procedure print_user_videos(
|
||||
p_user_name in users.user_name%type
|
||||
)
|
||||
AUTHID DEFINER
|
||||
as
|
||||
type t_user_videos is table of users_videos%rowtype
|
||||
index by pls_integer;
|
||||
l_videos t_user_videos;
|
||||
begin
|
||||
|
||||
select *
|
||||
bulk collect into l_videos
|
||||
from users_videos
|
||||
where user_name = p_user_name;
|
||||
|
||||
for i in 1..l_videos.COUNT
|
||||
loop
|
||||
|
||||
dbms_output.put_line(l_videos(i).video_name);
|
||||
|
||||
end loop;
|
||||
|
||||
end print_user_videos;
|
||||
/
|
||||
4
samples/Puppet/init.pp
Normal file
4
samples/Puppet/init.pp
Normal file
@@ -0,0 +1,4 @@
|
||||
include docker
|
||||
include apt
|
||||
include ::something
|
||||
include foo::bar
|
||||
159
samples/Python/argparse.pyi
Normal file
159
samples/Python/argparse.pyi
Normal file
@@ -0,0 +1,159 @@
|
||||
# Stubs for argparse (Python 3.4)
|
||||
|
||||
from typing import (
|
||||
Any, Callable, Iterable, List, IO, Optional, Sequence, Tuple, Type, Union,
|
||||
TypeVar, overload
|
||||
)
|
||||
import sys
|
||||
|
||||
_T = TypeVar('_T')
|
||||
|
||||
if sys.version_info >= (3,):
|
||||
_Text = str
|
||||
else:
|
||||
_Text = Union[str, unicode]
|
||||
|
||||
ONE_OR_MORE = ... # type: str
|
||||
OPTIONAL = ... # type: str
|
||||
PARSER = ... # type: str
|
||||
REMAINDER = ... # type: str
|
||||
SUPPRESS = ... # type: str
|
||||
ZERO_OR_MORE = ... # type: str
|
||||
|
||||
class ArgumentError(Exception): ...
|
||||
|
||||
class ArgumentParser:
|
||||
if sys.version_info >= (3, 5):
|
||||
def __init__(self,
|
||||
prog: Optional[str] = ...,
|
||||
usage: Optional[str] = ...,
|
||||
description: Optional[str] = ...,
|
||||
epilog: Optional[str] = ...,
|
||||
parents: Sequence[ArgumentParser] = ...,
|
||||
formatter_class: Type[HelpFormatter] = ...,
|
||||
prefix_chars: _Text = ...,
|
||||
fromfile_prefix_chars: Optional[str] = ...,
|
||||
argument_default: Optional[str] = ...,
|
||||
conflict_handler: _Text = ...,
|
||||
add_help: bool = ...,
|
||||
allow_abbrev: bool = ...) -> None: ...
|
||||
else:
|
||||
def __init__(self,
|
||||
prog: Optional[_Text] = ...,
|
||||
usage: Optional[_Text] = ...,
|
||||
description: Optional[_Text] = ...,
|
||||
epilog: Optional[_Text] = ...,
|
||||
parents: Sequence[ArgumentParser] = ...,
|
||||
formatter_class: Type[HelpFormatter] = ...,
|
||||
prefix_chars: _Text = ...,
|
||||
fromfile_prefix_chars: Optional[_Text] = ...,
|
||||
argument_default: Optional[_Text] = ...,
|
||||
conflict_handler: _Text = ...,
|
||||
add_help: bool = ...) -> None: ...
|
||||
def add_argument(self,
|
||||
*name_or_flags: Union[_Text, Sequence[_Text]],
|
||||
action: Union[_Text, Type[Action]] = ...,
|
||||
nargs: Union[int, _Text] = ...,
|
||||
const: Any = ...,
|
||||
default: Any = ...,
|
||||
type: Union[Callable[[str], _T], FileType] = ...,
|
||||
choices: Iterable[_T] = ...,
|
||||
required: bool = ...,
|
||||
help: _Text = ...,
|
||||
metavar: Union[_Text, Tuple[_Text, ...]] = ...,
|
||||
dest: _Text = ...,
|
||||
version: _Text = ...) -> None: ... # weirdly documented
|
||||
def parse_args(self, args: Optional[Sequence[_Text]] = ...,
|
||||
namespace: Optional[Namespace] = ...) -> Namespace: ...
|
||||
def add_subparsers(self, title: _Text = ...,
|
||||
description: Optional[_Text] = ...,
|
||||
prog: _Text = ...,
|
||||
parser_class: Type[ArgumentParser] = ...,
|
||||
action: Type[Action] = ...,
|
||||
option_string: _Text = ...,
|
||||
dest: Optional[_Text] = ...,
|
||||
help: Optional[_Text] = ...,
|
||||
metavar: Optional[_Text] = ...) -> _SubParsersAction: ...
|
||||
def add_argument_group(self, title: Optional[_Text] = ...,
|
||||
description: Optional[_Text] = ...) -> _ArgumentGroup: ...
|
||||
def add_mutually_exclusive_group(self, required: bool = ...) -> _MutuallyExclusiveGroup: ...
|
||||
def set_defaults(self, **kwargs: Any) -> None: ...
|
||||
def get_default(self, dest: _Text) -> Any: ...
|
||||
def print_usage(self, file: Optional[IO[str]] = ...) -> None: ...
|
||||
def print_help(self, file: Optional[IO[str]] = ...) -> None: ...
|
||||
def format_usage(self) -> str: ...
|
||||
def format_help(self) -> str: ...
|
||||
def parse_known_args(self, args: Optional[Sequence[_Text]] = ...,
|
||||
namespace: Optional[Namespace] = ...) -> Tuple[Namespace, List[str]]: ...
|
||||
def convert_arg_line_to_args(self, arg_line: _Text) -> List[str]: ...
|
||||
def exit(self, status: int = ..., message: Optional[_Text] = ...) -> None: ...
|
||||
def error(self, message: _Text) -> None: ...
|
||||
|
||||
class HelpFormatter:
|
||||
# not documented
|
||||
def __init__(self, prog: _Text, indent_increment: int = ...,
|
||||
max_help_position: int = ...,
|
||||
width: Optional[int] = ...) -> None: ...
|
||||
class RawDescriptionHelpFormatter(HelpFormatter): ...
|
||||
class RawTextHelpFormatter(HelpFormatter): ...
|
||||
class ArgumentDefaultsHelpFormatter(HelpFormatter): ...
|
||||
if sys.version_info >= (3,):
|
||||
class MetavarTypeHelpFormatter(HelpFormatter): ...
|
||||
|
||||
class Action:
|
||||
def __init__(self,
|
||||
option_strings: Sequence[_Text],
|
||||
dest: _Text = ...,
|
||||
nargs: Optional[Union[int, _Text]] = ...,
|
||||
const: Any = ...,
|
||||
default: Any = ...,
|
||||
type: Union[Callable[[str], _T], FileType, None] = ...,
|
||||
choices: Optional[Iterable[_T]] = ...,
|
||||
required: bool = ...,
|
||||
help: Optional[_Text] = ...,
|
||||
metavar: Union[_Text, Tuple[_Text, ...]] = ...) -> None: ...
|
||||
def __call__(self, parser: ArgumentParser, namespace: Namespace,
|
||||
values: Union[_Text, Sequence[Any], None],
|
||||
option_string: _Text = ...) -> None: ...
|
||||
|
||||
class Namespace:
|
||||
def __getattr__(self, name: _Text) -> Any: ...
|
||||
def __setattr__(self, name: _Text, value: Any) -> None: ...
|
||||
|
||||
class FileType:
|
||||
if sys.version_info >= (3, 4):
|
||||
def __init__(self, mode: _Text = ..., bufsize: int = ...,
|
||||
encoding: Optional[_Text] = ...,
|
||||
errors: Optional[_Text] = ...) -> None: ...
|
||||
elif sys.version_info >= (3,):
|
||||
def __init__(self,
|
||||
mode: _Text = ..., bufsize: int = ...) -> None: ...
|
||||
else:
|
||||
def __init__(self,
|
||||
mode: _Text = ..., bufsize: Optional[int] = ...) -> None: ...
|
||||
def __call__(self, string: _Text) -> IO[Any]: ...
|
||||
|
||||
class _ArgumentGroup:
|
||||
def add_argument(self,
|
||||
*name_or_flags: Union[_Text, Sequence[_Text]],
|
||||
action: Union[_Text, Type[Action]] = ...,
|
||||
nargs: Union[int, _Text] = ...,
|
||||
const: Any = ...,
|
||||
default: Any = ...,
|
||||
type: Union[Callable[[str], _T], FileType] = ...,
|
||||
choices: Iterable[_T] = ...,
|
||||
required: bool = ...,
|
||||
help: _Text = ...,
|
||||
metavar: Union[_Text, Tuple[_Text, ...]] = ...,
|
||||
dest: _Text = ...,
|
||||
version: _Text = ...) -> None: ...
|
||||
def add_mutually_exclusive_group(self, required: bool = ...) -> _MutuallyExclusiveGroup: ...
|
||||
|
||||
class _MutuallyExclusiveGroup(_ArgumentGroup): ...
|
||||
|
||||
class _SubParsersAction:
|
||||
# TODO: Type keyword args properly.
|
||||
def add_parser(self, name: _Text, **kwargs: Any) -> ArgumentParser: ...
|
||||
|
||||
# not documented
|
||||
class ArgumentTypeError(Exception): ...
|
||||
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()
|
||||
19
samples/Regular Expression/modeline-emacs.regexp
Normal file
19
samples/Regular Expression/modeline-emacs.regexp
Normal file
@@ -0,0 +1,19 @@
|
||||
-\*-
|
||||
(?:
|
||||
\s*
|
||||
(?= [^:;\s]+ \s* -\*-)
|
||||
|
|
||||
(?:
|
||||
.*?[;\s]
|
||||
|
|
||||
(?<=-\*-)
|
||||
)
|
||||
mode\s*:\s*
|
||||
)
|
||||
([^:;\s]+)
|
||||
|
||||
(?=
|
||||
[\s;] | (?<![-*]) -\*-
|
||||
)
|
||||
.*?
|
||||
-\*-
|
||||
27
samples/Regular Expression/modeline-vim.regexp
Normal file
27
samples/Regular Expression/modeline-vim.regexp
Normal file
@@ -0,0 +1,27 @@
|
||||
(?:
|
||||
(?:\s|^)
|
||||
vi
|
||||
(?:m[<=>]?\d+|m)?
|
||||
|
|
||||
[\t\x20]
|
||||
ex
|
||||
)
|
||||
(?=
|
||||
: (?=\s* set? \s [^\n:]+ :) |
|
||||
: (?!\s* set? \s)
|
||||
)
|
||||
|
||||
(?:
|
||||
(?:\s|\s*:\s*)
|
||||
\w*
|
||||
(?:
|
||||
\s*=
|
||||
(?:[^\n\\\s]|\\.)*
|
||||
)?
|
||||
)*
|
||||
|
||||
[\s:]
|
||||
(?:filetype|ft|syntax)
|
||||
\s*=
|
||||
(MODE_NAME_HERE)
|
||||
(?=\s|:|$)
|
||||
1
samples/Regular Expression/ordinal.regex
Normal file
1
samples/Regular Expression/ordinal.regex
Normal file
@@ -0,0 +1 @@
|
||||
\b(\d*1[1-3]th|\d*0th|(?:(?!11st)\d)*1st|\d*2nd|(?:(?!13rd)\d*)3rd|\d*[4-9]th)\b
|
||||
1
samples/Regular Expression/url.regex
Normal file
1
samples/Regular Expression/url.regex
Normal file
@@ -0,0 +1 @@
|
||||
/^([^\/#\?]*:?\/\/)?(\/?(?:[^\/#\?]+\/)*)?([^\/#\?]+)?(?:\/(?=$))?(\?[^#]*)?(#.*)?$/
|
||||
2
samples/Ruby/filenames/.irbrc
Normal file
2
samples/Ruby/filenames/.irbrc
Normal file
@@ -0,0 +1,2 @@
|
||||
require "pp"
|
||||
IRB.conf[:AUTO_INDENT] = true
|
||||
95
samples/ShaderLab/DepthOfField.shader
Normal file
95
samples/ShaderLab/DepthOfField.shader
Normal file
@@ -0,0 +1,95 @@
|
||||
// From https://github.com/Unity-Technologies/PostProcessing,
|
||||
// licensed under MIT licence.
|
||||
|
||||
Shader "Hidden/Post FX/Depth Of Field"
|
||||
{
|
||||
Properties
|
||||
{
|
||||
_MainTex ("", 2D) = "black"
|
||||
}
|
||||
|
||||
CGINCLUDE
|
||||
#pragma exclude_renderers d3d11_9x
|
||||
#pragma target 3.0
|
||||
ENDCG
|
||||
|
||||
SubShader
|
||||
{
|
||||
Cull Off ZWrite Off ZTest Always
|
||||
|
||||
// (0) Downsampling, prefiltering & CoC
|
||||
Pass
|
||||
{
|
||||
CGPROGRAM
|
||||
#pragma multi_compile __ UNITY_COLORSPACE_GAMMA
|
||||
#pragma vertex VertDOF
|
||||
#pragma fragment FragPrefilter
|
||||
#include "DepthOfField.cginc"
|
||||
ENDCG
|
||||
}
|
||||
|
||||
// (1) Pass 0 + temporal antialiasing
|
||||
Pass
|
||||
{
|
||||
CGPROGRAM
|
||||
#pragma vertex VertDOF
|
||||
#pragma fragment FragPrefilter
|
||||
#define PREFILTER_TAA
|
||||
#include "DepthOfField.cginc"
|
||||
ENDCG
|
||||
}
|
||||
|
||||
// (2-5) Bokeh filter with disk-shaped kernels
|
||||
Pass
|
||||
{
|
||||
CGPROGRAM
|
||||
#pragma vertex VertDOF
|
||||
#pragma fragment FragBlur
|
||||
#define KERNEL_SMALL
|
||||
#include "DepthOfField.cginc"
|
||||
ENDCG
|
||||
}
|
||||
|
||||
Pass
|
||||
{
|
||||
CGPROGRAM
|
||||
#pragma vertex VertDOF
|
||||
#pragma fragment FragBlur
|
||||
#define KERNEL_MEDIUM
|
||||
#include "DepthOfField.cginc"
|
||||
ENDCG
|
||||
}
|
||||
|
||||
Pass
|
||||
{
|
||||
CGPROGRAM
|
||||
#pragma vertex VertDOF
|
||||
#pragma fragment FragBlur
|
||||
#define KERNEL_LARGE
|
||||
#include "DepthOfField.cginc"
|
||||
ENDCG
|
||||
}
|
||||
|
||||
Pass
|
||||
{
|
||||
CGPROGRAM
|
||||
#pragma vertex VertDOF
|
||||
#pragma fragment FragBlur
|
||||
#define KERNEL_VERYLARGE
|
||||
#include "DepthOfField.cginc"
|
||||
ENDCG
|
||||
}
|
||||
|
||||
// (6) Postfilter blur
|
||||
Pass
|
||||
{
|
||||
CGPROGRAM
|
||||
#pragma vertex VertDOF
|
||||
#pragma fragment FragPostBlur
|
||||
#include "DepthOfField.cginc"
|
||||
ENDCG
|
||||
}
|
||||
}
|
||||
|
||||
FallBack Off
|
||||
}
|
||||
112
samples/ShaderLab/Fog.shader
Normal file
112
samples/ShaderLab/Fog.shader
Normal file
@@ -0,0 +1,112 @@
|
||||
// From https://github.com/Unity-Technologies/PostProcessing,
|
||||
// licensed under MIT licence.
|
||||
|
||||
Shader "Hidden/Post FX/Fog"
|
||||
{
|
||||
Properties
|
||||
{
|
||||
_MainTex("Main Texture", 2D) = "white" {}
|
||||
}
|
||||
|
||||
CGINCLUDE
|
||||
|
||||
#pragma multi_compile __ FOG_LINEAR FOG_EXP FOG_EXP2
|
||||
#include "UnityCG.cginc"
|
||||
#include "Common.cginc"
|
||||
|
||||
#define SKYBOX_THREASHOLD_VALUE 0.9999
|
||||
|
||||
struct Varyings
|
||||
{
|
||||
float2 uv : TEXCOORD0;
|
||||
float4 vertex : SV_POSITION;
|
||||
};
|
||||
|
||||
Varyings VertFog(AttributesDefault v)
|
||||
{
|
||||
Varyings o;
|
||||
o.vertex = UnityObjectToClipPos(v.vertex);
|
||||
o.uv = UnityStereoScreenSpaceUVAdjust(v.texcoord, _MainTex_ST);
|
||||
return o;
|
||||
}
|
||||
|
||||
sampler2D _CameraDepthTexture;
|
||||
|
||||
half4 _FogColor;
|
||||
float _Density;
|
||||
float _Start;
|
||||
float _End;
|
||||
|
||||
half ComputeFog(float z)
|
||||
{
|
||||
half fog = 0.0;
|
||||
#if FOG_LINEAR
|
||||
fog = (_End - z) / (_End - _Start);
|
||||
#elif FOG_EXP
|
||||
fog = exp2(-_Density * z);
|
||||
#else // FOG_EXP2
|
||||
fog = _Density * z;
|
||||
fog = exp2(-fog * fog);
|
||||
#endif
|
||||
return saturate(fog);
|
||||
}
|
||||
|
||||
float ComputeDistance(float depth)
|
||||
{
|
||||
float dist = depth * _ProjectionParams.z;
|
||||
dist -= _ProjectionParams.y;
|
||||
return dist;
|
||||
}
|
||||
|
||||
half4 FragFog(Varyings i) : SV_Target
|
||||
{
|
||||
half4 color = tex2D(_MainTex, i.uv);
|
||||
|
||||
float depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv);
|
||||
depth = Linear01Depth(depth);
|
||||
float dist = ComputeDistance(depth) - _Start;
|
||||
half fog = 1.0 - ComputeFog(dist);
|
||||
|
||||
return lerp(color, _FogColor, fog);
|
||||
}
|
||||
|
||||
half4 FragFogExcludeSkybox(Varyings i) : SV_Target
|
||||
{
|
||||
half4 color = tex2D(_MainTex, i.uv);
|
||||
|
||||
float depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv);
|
||||
depth = Linear01Depth(depth);
|
||||
float skybox = depth < SKYBOX_THREASHOLD_VALUE;
|
||||
float dist = ComputeDistance(depth) - _Start;
|
||||
half fog = 1.0 - ComputeFog(dist);
|
||||
|
||||
return lerp(color, _FogColor, fog * skybox);
|
||||
}
|
||||
|
||||
ENDCG
|
||||
|
||||
SubShader
|
||||
{
|
||||
Cull Off ZWrite Off ZTest Always
|
||||
|
||||
Pass
|
||||
{
|
||||
CGPROGRAM
|
||||
|
||||
#pragma vertex VertFog
|
||||
#pragma fragment FragFog
|
||||
|
||||
ENDCG
|
||||
}
|
||||
|
||||
Pass
|
||||
{
|
||||
CGPROGRAM
|
||||
|
||||
#pragma vertex VertFog
|
||||
#pragma fragment FragFogExcludeSkybox
|
||||
|
||||
ENDCG
|
||||
}
|
||||
}
|
||||
}
|
||||
337
samples/ShaderLab/Uber.shader
Normal file
337
samples/ShaderLab/Uber.shader
Normal file
@@ -0,0 +1,337 @@
|
||||
// From https://github.com/Unity-Technologies/PostProcessing,
|
||||
// licensed under MIT licence.
|
||||
|
||||
Shader "Hidden/Post FX/Uber Shader"
|
||||
{
|
||||
Properties
|
||||
{
|
||||
_MainTex ("Texture", 2D) = "white" {}
|
||||
_AutoExposure ("", 2D) = "" {}
|
||||
_BloomTex ("", 2D) = "" {}
|
||||
_Bloom_DirtTex ("", 2D) = "" {}
|
||||
_GrainTex ("", 2D) = "" {}
|
||||
_LogLut ("", 2D) = "" {}
|
||||
_UserLut ("", 2D) = "" {}
|
||||
_Vignette_Mask ("", 2D) = "" {}
|
||||
_ChromaticAberration_Spectrum ("", 2D) = "" {}
|
||||
_DitheringTex ("", 2D) = "" {}
|
||||
}
|
||||
|
||||
CGINCLUDE
|
||||
|
||||
#pragma target 3.0
|
||||
|
||||
#pragma multi_compile __ UNITY_COLORSPACE_GAMMA
|
||||
#pragma multi_compile __ EYE_ADAPTATION
|
||||
#pragma multi_compile __ CHROMATIC_ABERRATION
|
||||
#pragma multi_compile __ DEPTH_OF_FIELD DEPTH_OF_FIELD_COC_VIEW
|
||||
#pragma multi_compile __ BLOOM
|
||||
#pragma multi_compile __ BLOOM_LENS_DIRT
|
||||
#pragma multi_compile __ COLOR_GRADING COLOR_GRADING_LOG_VIEW
|
||||
#pragma multi_compile __ USER_LUT
|
||||
#pragma multi_compile __ GRAIN
|
||||
#pragma multi_compile __ VIGNETTE_CLASSIC VIGNETTE_ROUND VIGNETTE_MASKED
|
||||
#pragma multi_compile __ DITHERING
|
||||
|
||||
#include "UnityCG.cginc"
|
||||
#include "Bloom.cginc"
|
||||
#include "ColorGrading.cginc"
|
||||
#include "UberSecondPass.cginc"
|
||||
|
||||
// Auto exposure / eye adaptation
|
||||
sampler2D _AutoExposure;
|
||||
|
||||
// Chromatic aberration
|
||||
half _ChromaticAberration_Amount;
|
||||
sampler2D _ChromaticAberration_Spectrum;
|
||||
|
||||
// Depth of field
|
||||
sampler2D_float _CameraDepthTexture;
|
||||
sampler2D _DepthOfFieldTex;
|
||||
float4 _DepthOfFieldTex_TexelSize;
|
||||
float2 _DepthOfFieldParams; // x: distance, y: f^2 / (N * (S1 - f) * film_width * 2)
|
||||
|
||||
// Bloom
|
||||
sampler2D _BloomTex;
|
||||
float4 _BloomTex_TexelSize;
|
||||
half2 _Bloom_Settings; // x: sampleScale, y: bloom.intensity
|
||||
|
||||
sampler2D _Bloom_DirtTex;
|
||||
half _Bloom_DirtIntensity;
|
||||
|
||||
// Color grading & tonemapping
|
||||
sampler2D _LogLut;
|
||||
half3 _LogLut_Params; // x: 1 / lut_width, y: 1 / lut_height, z: lut_height - 1
|
||||
half _ExposureEV; // EV (exp2)
|
||||
|
||||
// User lut
|
||||
sampler2D _UserLut;
|
||||
half4 _UserLut_Params; // @see _LogLut_Params
|
||||
|
||||
// Vignette
|
||||
half3 _Vignette_Color;
|
||||
half2 _Vignette_Center; // UV space
|
||||
half3 _Vignette_Settings; // x: intensity, y: smoothness, z: roundness
|
||||
sampler2D _Vignette_Mask;
|
||||
half _Vignette_Opacity; // [0;1]
|
||||
|
||||
struct VaryingsFlipped
|
||||
{
|
||||
float4 pos : SV_POSITION;
|
||||
float2 uv : TEXCOORD0;
|
||||
float2 uvSPR : TEXCOORD1; // Single Pass Stereo UVs
|
||||
float2 uvFlipped : TEXCOORD2; // Flipped UVs (DX/MSAA/Forward)
|
||||
float2 uvFlippedSPR : TEXCOORD3; // Single Pass Stereo flipped UVs
|
||||
};
|
||||
|
||||
VaryingsFlipped VertUber(AttributesDefault v)
|
||||
{
|
||||
VaryingsFlipped o;
|
||||
o.pos = UnityObjectToClipPos(v.vertex);
|
||||
o.uv = v.texcoord.xy;
|
||||
o.uvSPR = UnityStereoScreenSpaceUVAdjust(v.texcoord.xy, _MainTex_ST);
|
||||
o.uvFlipped = v.texcoord.xy;
|
||||
|
||||
#if UNITY_UV_STARTS_AT_TOP
|
||||
if (_MainTex_TexelSize.y < 0.0)
|
||||
o.uvFlipped.y = 1.0 - o.uvFlipped.y;
|
||||
#endif
|
||||
|
||||
o.uvFlippedSPR = UnityStereoScreenSpaceUVAdjust(o.uvFlipped, _MainTex_ST);
|
||||
|
||||
return o;
|
||||
}
|
||||
|
||||
half4 FragUber(VaryingsFlipped i) : SV_Target
|
||||
{
|
||||
float2 uv = i.uv;
|
||||
half autoExposure = 1.0;
|
||||
|
||||
// Store the auto exposure value for later
|
||||
#if EYE_ADAPTATION
|
||||
{
|
||||
autoExposure = tex2D(_AutoExposure, uv).r;
|
||||
}
|
||||
#endif
|
||||
|
||||
half3 color = (0.0).xxx;
|
||||
#if DEPTH_OF_FIELD && CHROMATIC_ABERRATION
|
||||
half4 dof = (0.0).xxxx;
|
||||
#endif
|
||||
|
||||
//
|
||||
// HDR effects
|
||||
// ---------------------------------------------------------
|
||||
|
||||
// Chromatic Aberration
|
||||
// Inspired by the method described in "Rendering Inside" [Playdead 2016]
|
||||
// https://twitter.com/pixelmager/status/717019757766123520
|
||||
#if CHROMATIC_ABERRATION
|
||||
{
|
||||
float2 coords = 2.0 * uv - 1.0;
|
||||
float2 end = uv - coords * dot(coords, coords) * _ChromaticAberration_Amount;
|
||||
|
||||
float2 diff = end - uv;
|
||||
int samples = clamp(int(length(_MainTex_TexelSize.zw * diff / 2.0)), 3, 16);
|
||||
float2 delta = diff / samples;
|
||||
float2 pos = uv;
|
||||
half3 sum = (0.0).xxx, filterSum = (0.0).xxx;
|
||||
|
||||
#if DEPTH_OF_FIELD
|
||||
float2 dofDelta = delta;
|
||||
float2 dofPos = pos;
|
||||
if (_MainTex_TexelSize.y < 0.0)
|
||||
{
|
||||
dofDelta.y = -dofDelta.y;
|
||||
dofPos.y = 1.0 - dofPos.y;
|
||||
}
|
||||
half4 dofSum = (0.0).xxxx;
|
||||
#endif
|
||||
|
||||
for (int i = 0; i < samples; i++)
|
||||
{
|
||||
half t = (i + 0.5) / samples;
|
||||
half3 s = tex2Dlod(_MainTex, float4(UnityStereoScreenSpaceUVAdjust(pos, _MainTex_ST), 0, 0)).rgb;
|
||||
half3 filter = tex2Dlod(_ChromaticAberration_Spectrum, float4(t, 0, 0, 0)).rgb;
|
||||
|
||||
sum += s * filter;
|
||||
filterSum += filter;
|
||||
pos += delta;
|
||||
|
||||
#if DEPTH_OF_FIELD
|
||||
half4 sdof = tex2Dlod(_DepthOfFieldTex, float4(UnityStereoScreenSpaceUVAdjust(dofPos, _MainTex_ST), 0, 0)).rgba;
|
||||
dofSum += sdof * half4(filter, 1);
|
||||
dofPos += dofDelta;
|
||||
#endif
|
||||
}
|
||||
|
||||
color = sum / filterSum;
|
||||
#if DEPTH_OF_FIELD
|
||||
dof = dofSum / half4(filterSum, samples);
|
||||
#endif
|
||||
}
|
||||
#else
|
||||
{
|
||||
color = tex2D(_MainTex, i.uvSPR).rgb;
|
||||
}
|
||||
#endif
|
||||
|
||||
// Apply auto exposure if any
|
||||
color *= autoExposure;
|
||||
|
||||
// Gamma space... Gah.
|
||||
#if UNITY_COLORSPACE_GAMMA
|
||||
{
|
||||
color = GammaToLinearSpace(color);
|
||||
}
|
||||
#endif
|
||||
|
||||
// Depth of field
|
||||
#if DEPTH_OF_FIELD
|
||||
{
|
||||
#if !CHROMATIC_ABERRATION
|
||||
half4 dof = tex2D(_DepthOfFieldTex, i.uvFlippedSPR);
|
||||
#endif
|
||||
color = color * dof.a + dof.rgb * autoExposure;
|
||||
}
|
||||
#elif DEPTH_OF_FIELD_COC_VIEW
|
||||
{
|
||||
// Calculate the radiuses of CoC.
|
||||
half4 src = tex2D(_DepthOfFieldTex, uv);
|
||||
float depth = LinearEyeDepth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uvFlippedSPR));
|
||||
float coc = (depth - _DepthOfFieldParams.x) * _DepthOfFieldParams.y / depth;
|
||||
coc *= 80;
|
||||
|
||||
// Visualize CoC (white -> red -> gray)
|
||||
half3 rgb = lerp(half3(1, 0, 0), half3(1.0, 1.0, 1.0), saturate(-coc));
|
||||
rgb = lerp(rgb, half3(0.4, 0.4, 0.4), saturate(coc));
|
||||
|
||||
// Black and white image overlay
|
||||
rgb *= AcesLuminance(color) + 0.5;
|
||||
|
||||
// Gamma correction
|
||||
#if !UNITY_COLORSPACE_GAMMA
|
||||
{
|
||||
rgb = GammaToLinearSpace(rgb);
|
||||
}
|
||||
#endif
|
||||
|
||||
color = rgb;
|
||||
}
|
||||
#endif
|
||||
|
||||
// HDR Bloom
|
||||
#if BLOOM
|
||||
{
|
||||
half3 bloom = UpsampleFilter(_BloomTex, i.uvFlippedSPR, _BloomTex_TexelSize.xy, _Bloom_Settings.x) * _Bloom_Settings.y;
|
||||
color += bloom;
|
||||
|
||||
#if BLOOM_LENS_DIRT
|
||||
{
|
||||
half3 dirt = tex2D(_Bloom_DirtTex, i.uvFlipped).rgb * _Bloom_DirtIntensity;
|
||||
color += bloom * dirt;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
// Procedural vignette
|
||||
#if VIGNETTE_CLASSIC
|
||||
{
|
||||
half2 d = abs(uv - _Vignette_Center) * _Vignette_Settings.x;
|
||||
d = pow(d, _Vignette_Settings.z); // Roundness
|
||||
half vfactor = pow(saturate(1.0 - dot(d, d)), _Vignette_Settings.y);
|
||||
color *= lerp(_Vignette_Color, (1.0).xxx, vfactor);
|
||||
}
|
||||
|
||||
// Perfectly round vignette
|
||||
#elif VIGNETTE_ROUND
|
||||
{
|
||||
half2 d = abs(uv - _Vignette_Center) * _Vignette_Settings.x;
|
||||
d.x *= _ScreenParams.x / _ScreenParams.y;
|
||||
half vfactor = pow(saturate(1.0 - dot(d, d)), _Vignette_Settings.y);
|
||||
color *= lerp(_Vignette_Color, (1.0).xxx, vfactor);
|
||||
}
|
||||
|
||||
// Masked vignette
|
||||
#elif VIGNETTE_MASKED
|
||||
{
|
||||
half vfactor = tex2D(_Vignette_Mask, uv).a;
|
||||
half3 new_color = color * lerp(_Vignette_Color, (1.0).xxx, vfactor);
|
||||
color = lerp(color, new_color, _Vignette_Opacity);
|
||||
}
|
||||
#endif
|
||||
|
||||
// HDR color grading & tonemapping
|
||||
#if COLOR_GRADING
|
||||
{
|
||||
color *= _ExposureEV; // Exposure is in ev units (or 'stops')
|
||||
|
||||
half3 colorLogC = saturate(LinearToLogC(color));
|
||||
color = ApplyLut2d(_LogLut, colorLogC, _LogLut_Params);
|
||||
}
|
||||
#elif COLOR_GRADING_LOG_VIEW
|
||||
{
|
||||
color *= _ExposureEV;
|
||||
color = saturate(LinearToLogC(color));
|
||||
}
|
||||
#endif
|
||||
|
||||
//
|
||||
// All the following effects happen in LDR
|
||||
// ---------------------------------------------------------
|
||||
|
||||
color = saturate(color);
|
||||
|
||||
// Back to gamma space if needed
|
||||
#if UNITY_COLORSPACE_GAMMA
|
||||
{
|
||||
color = LinearToGammaSpace(color);
|
||||
}
|
||||
#endif
|
||||
|
||||
// LDR user lut
|
||||
#if USER_LUT
|
||||
{
|
||||
color = saturate(color);
|
||||
half3 colorGraded;
|
||||
|
||||
#if !UNITY_COLORSPACE_GAMMA
|
||||
{
|
||||
colorGraded = ApplyLut2d(_UserLut, LinearToGammaSpace(color), _UserLut_Params.xyz);
|
||||
colorGraded = GammaToLinearSpace(colorGraded);
|
||||
}
|
||||
#else
|
||||
{
|
||||
colorGraded = ApplyLut2d(_UserLut, color, _UserLut_Params.xyz);
|
||||
}
|
||||
#endif
|
||||
|
||||
color = lerp(color, colorGraded, _UserLut_Params.w);
|
||||
}
|
||||
#endif
|
||||
|
||||
color = UberSecondPass(color, uv);
|
||||
|
||||
// Done !
|
||||
return half4(color, 1.0);
|
||||
}
|
||||
|
||||
ENDCG
|
||||
|
||||
SubShader
|
||||
{
|
||||
Cull Off ZWrite Off ZTest Always
|
||||
|
||||
// (0)
|
||||
Pass
|
||||
{
|
||||
CGPROGRAM
|
||||
|
||||
#pragma vertex VertUber
|
||||
#pragma fragment FragUber
|
||||
|
||||
ENDCG
|
||||
}
|
||||
}
|
||||
}
|
||||
54
samples/Text/filenames/COPYING.regex
Normal file
54
samples/Text/filenames/COPYING.regex
Normal file
@@ -0,0 +1,54 @@
|
||||
$OpenBSD: COPYRIGHT,v 1.3 2003/06/02 20:18:36 millert Exp $
|
||||
|
||||
Copyright 1992, 1993, 1994 Henry Spencer. All rights reserved.
|
||||
This software is not subject to any license of the American Telephone
|
||||
and Telegraph Company or of the Regents of the University of California.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose on
|
||||
any computer system, and to alter it and redistribute it, subject
|
||||
to the following restrictions:
|
||||
|
||||
1. The author is not responsible for the consequences of use of this
|
||||
software, no matter how awful, even if they arise from flaws in it.
|
||||
|
||||
2. The origin of this software must not be misrepresented, either by
|
||||
explicit claim or by omission. Since few users ever read sources,
|
||||
credits must appear in the documentation.
|
||||
|
||||
3. Altered versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software. Since few users
|
||||
ever read sources, credits must appear in the documentation.
|
||||
|
||||
4. This notice may not be removed or altered.
|
||||
|
||||
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
/*-
|
||||
* Copyright (c) 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)COPYRIGHT 8.1 (Berkeley) 3/16/94
|
||||
*/
|
||||
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
|
||||
88
samples/XML/CSharpVSPackage.vstemplate
Normal file
88
samples/XML/CSharpVSPackage.vstemplate
Normal file
@@ -0,0 +1,88 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<VSTemplate Version="3.0.0" Type="Item" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" xmlns:sdk="http://schemas.microsoft.com/developer/vstemplate-sdkextension/2010">
|
||||
<TemplateData>
|
||||
<Name>Visual Studio Package</Name>
|
||||
<Description>Visual Studio package loadable in Visual Studio</Description>
|
||||
<Icon>VSPackage.ico</Icon>
|
||||
<TemplateID>VsixVSPackageCSharp</TemplateID>
|
||||
<AppliesTo>VSIX + CSharp</AppliesTo>
|
||||
<ShowByDefault>false</ShowByDefault>
|
||||
<ProjectType>CSharp</ProjectType>
|
||||
<RequiredFrameworkVersion>4.5</RequiredFrameworkVersion>
|
||||
<NumberOfParentCategoriesToRollUp>1</NumberOfParentCategoriesToRollUp>
|
||||
<DefaultName>VSPackage.cs</DefaultName>
|
||||
</TemplateData>
|
||||
<TemplateContent>
|
||||
<References>
|
||||
<Reference>
|
||||
<Assembly>Microsoft.CSharp</Assembly>
|
||||
</Reference>
|
||||
<Reference>
|
||||
<Assembly>System</Assembly>
|
||||
</Reference>
|
||||
<Reference>
|
||||
<Assembly>System.Core</Assembly>
|
||||
</Reference>
|
||||
<Reference>
|
||||
<Assembly>System.Data</Assembly>
|
||||
</Reference>
|
||||
<Reference>
|
||||
<Assembly>System.Design</Assembly>
|
||||
</Reference>
|
||||
<Reference>
|
||||
<Assembly>System.Drawing</Assembly>
|
||||
</Reference>
|
||||
<Reference>
|
||||
<Assembly>System.Windows.Forms</Assembly>
|
||||
</Reference>
|
||||
<Reference>
|
||||
<Assembly>System.Xml</Assembly>
|
||||
</Reference>
|
||||
</References>
|
||||
|
||||
<ProjectItem ReplaceParameters="true" TargetFileName="$packageName$.cs" OpenInEditor="true">VsPkg.cs</ProjectItem>
|
||||
<ProjectItem ReplaceParameters="false" TargetFileName="Resources\$packageName$.ico">Resources\Package.ico</ProjectItem>
|
||||
<ProjectItem ReplaceParameters="true" TargetFileName="VSPackage.resx">VSPackage.resx</ProjectItem>
|
||||
<ProjectItem ReplaceParameters="true" TargetFileName="source.extension.vsixmanifest" ItemType="None" SubType="Designer">source.extension.vsixmanifest</ProjectItem>
|
||||
|
||||
<CustomParameters>
|
||||
<CustomParameter Name="$AddVsixManifestAsset$" Value="VsPackageFromSameProject" />
|
||||
<CustomParameter Name="$productNameResourceId$" Value="110" />
|
||||
<CustomParameter Name="$productDetailsResourceId$" Value="112" />
|
||||
<CustomParameter Name="$iconResourceId$" Value="400" />
|
||||
<CustomParameter Name="$packageName$" Value="$rootSafeItemName$" />
|
||||
<CustomParameter Name="$packageGuid$" Value="$guid1$"/>
|
||||
</CustomParameters>
|
||||
</TemplateContent>
|
||||
<WizardExtension>
|
||||
<Assembly>Microsoft.Vsix.TemplatesPackage, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</Assembly>
|
||||
<FullClassName>Microsoft.Vsix.TemplatesPackage.VsixWizard</FullClassName>
|
||||
</WizardExtension>
|
||||
<WizardExtension>
|
||||
<Assembly>NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</Assembly>
|
||||
<FullClassName>NuGet.VisualStudio.TemplateWizard</FullClassName>
|
||||
</WizardExtension>
|
||||
<WizardData>
|
||||
<packages repository="extension" repositoryId="Microsoft.Dev14.VsixTemplatesPackage.V2.443cca91-ec20-41e5-a165-f28e56b89650">
|
||||
<package id="Microsoft.VisualStudio.OLE.Interop" version="7.10.6070" />
|
||||
<package id="Microsoft.VisualStudio.Shell.Interop" version="7.10.6071" />
|
||||
<package id="Microsoft.VisualStudio.TextManager.Interop" version="7.10.6070" />
|
||||
<package id="Microsoft.VisualStudio.Shell.Interop.8.0" version="8.0.50727" />
|
||||
<package id="Microsoft.VisualStudio.TextManager.Interop.8.0" version="8.0.50727" />
|
||||
<package id="Microsoft.VisualStudio.Shell.Interop.9.0" version="9.0.30729" />
|
||||
<package id="Microsoft.VisualStudio.Shell.Interop.10.0" version="10.0.30319" />
|
||||
<package id="Microsoft.VisualStudio.Shell.Interop.11.0" version="11.0.61030" />
|
||||
<package id="Microsoft.VisualStudio.Shell.Interop.12.0" version="12.0.30110" />
|
||||
<package id="Microsoft.VisualStudio.Shell.14.0" version="14.3.25407" />
|
||||
<package id="Microsoft.VisualStudio.Shell.Immutable.11.0" version="11.0.50727" />
|
||||
<package id="Microsoft.VisualStudio.Utilities" version="14.3.25407" />
|
||||
<package id="Microsoft.VisualStudio.Shell.Immutable.10.0" version="10.0.30319" />
|
||||
<package id="Microsoft.VisualStudio.Shell.Immutable.14.0" version="14.3.25407" />
|
||||
<package id="Microsoft.VisualStudio.Threading" version="14.1.111" />
|
||||
<package id="Microsoft.VisualStudio.Shell.Immutable.12.0" version="12.0.21003" />
|
||||
<package id="Microsoft.VisualStudio.Imaging" version="14.3.25407" />
|
||||
<package id="Microsoft.VisualStudio.Validation" version="14.1.111" />
|
||||
<package id="Microsoft.VSSDK.BuildTools" version="14.3.25407" />
|
||||
</packages>
|
||||
</WizardData>
|
||||
</VSTemplate>
|
||||
20
samples/XML/MDM.adml
Normal file
20
samples/XML/MDM.adml
Normal file
@@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- (c) 2016 Microsoft Corporation -->
|
||||
<policyDefinitionResources xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" revision="1.0" schemaVersion="1.0" xmlns="http://schemas.microsoft.com/GroupPolicy/2006/07/PolicyDefinitions">
|
||||
<displayName>enter display name here</displayName>
|
||||
<description>enter description here</description>
|
||||
<resources>
|
||||
<stringTable>
|
||||
<string id="MDM">MDM</string>
|
||||
<string id="MDM_MDM_DisplayName">Disable MDM Enrollment</string>
|
||||
<string id="MDM_MDM_Help">This policy setting specifies whether Mobile Device Management (MDM) Enrollment is allowed. When MDM is enabled, it allows the user to have the computer remotely managed by a MDM Server.
|
||||
|
||||
If you do not configure this policy setting, MDM Enrollment will be enabled.
|
||||
|
||||
If you enable this policy setting, MDM Enrollment will be disabled for all users. It will not unenroll existing MDM enrollments.
|
||||
|
||||
If you disable this policy setting, MDM Enrollment will be enabled for all users.
|
||||
</string>
|
||||
</stringTable>
|
||||
</resources>
|
||||
</policyDefinitionResources>
|
||||
26
samples/XML/MDM.admx
Normal file
26
samples/XML/MDM.admx
Normal file
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- (c) 2016 Microsoft Corporation -->
|
||||
<policyDefinitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" revision="1.0" schemaVersion="1.0" xmlns="http://schemas.microsoft.com/GroupPolicy/2006/07/PolicyDefinitions">
|
||||
<policyNamespaces>
|
||||
<target prefix="mdm" namespace="Microsoft.Policies.MDM" />
|
||||
<using prefix="windows" namespace="Microsoft.Policies.Windows" />
|
||||
</policyNamespaces>
|
||||
<resources minRequiredRevision="1.0" />
|
||||
<categories>
|
||||
<category name="MDM" displayName="$(string.MDM)">
|
||||
<parentCategory ref="windows:WindowsComponents" />
|
||||
</category>
|
||||
</categories>
|
||||
<policies>
|
||||
<policy name="MDM_MDM_DisplayName" class="Machine" displayName="$(string.MDM_MDM_DisplayName)" explainText="$(string.MDM_MDM_Help)" key="Software\Policies\Microsoft\Windows\CurrentVersion\MDM" valueName="DisableRegistration">
|
||||
<parentCategory ref="MDM" />
|
||||
<supportedOn ref="windows:SUPPORTED_Windows_10_0_NOSERVER" />
|
||||
<enabledValue>
|
||||
<decimal value="1" />
|
||||
</enabledValue>
|
||||
<disabledValue>
|
||||
<decimal value="0" />
|
||||
</disabledValue>
|
||||
</policy>
|
||||
</policies>
|
||||
</policyDefinitions>
|
||||
240
samples/XML/racoon.mjml
Normal file
240
samples/XML/racoon.mjml
Normal file
@@ -0,0 +1,240 @@
|
||||
<mjml>
|
||||
<mj-body>
|
||||
<mj-container background-color="#d6dde5">
|
||||
<mj-section full-width="full-width" padding-bottom="20">
|
||||
</mj-section>
|
||||
<mj-navbar background-color="#ffffff">
|
||||
<mj-column width="50%">
|
||||
<mj-image href="https://mjml.io" src="http://191n.mj.am/img/191n/3s/x4u.png" alt="Racoon logo" align="center" padding="10">
|
||||
</mj-image>
|
||||
</mj-column>
|
||||
<mj-column width="50%">
|
||||
<mj-inline-links base-url="https://mjml.io" hamburger="hamburger" ico-color="#fa8739" padding-top="5px">
|
||||
<mj-link href="https://mjml.io" color="#000000">home</mj-link>
|
||||
<mj-link href="https://mjml.io" color="#000000">blog</mj-link>
|
||||
<mj-link href="https://mjml.io" color="#000000">store</mj-link>
|
||||
</mj-inline-links>
|
||||
</mj-column>
|
||||
</mj-navbar>
|
||||
<mj-section background-color="#fa8739" padding-bottom="0" padding-top="0">
|
||||
<mj-column width="200">
|
||||
<mj-text align="left" color="#fff" font-size="40" padding-left="25" padding-right="25" padding-bottom="10" padding-top="10">
|
||||
<p style="font-size: 17px;">SPRING PROMO</p>
|
||||
<p>50%</p>
|
||||
<p>OFFER</p>
|
||||
<p style="font-size: 13px">Lorem ipsum dolor sit amet, consectetur adipiscing elit<br /></p>
|
||||
</mj-text>
|
||||
<mj-button background-color="#fff" color="#fa8739" font-size="16px" align="center" padding="15px 30px" border-radius="3px" href="https://mjml.io" padding-left="25" padding-right="25" padding-bottom="10" padding-top="10">
|
||||
SHOP NOW
|
||||
</mj-button>
|
||||
</mj-column>
|
||||
<mj-column width="400">
|
||||
<mj-image src="http://191n.mj.am/img/191n/3s/xjg.jpg" alt="Clothes set" align="center" border="none" width="400" padding-left="0" padding-right="0" padding-bottom="0" padding-top="0">
|
||||
|
||||
</mj-image>
|
||||
</mj-column>
|
||||
</mj-section>
|
||||
<mj-section background-color="#2f323b" padding-bottom="0" padding-top="0">
|
||||
<mj-column width="25%">
|
||||
<mj-image src="http://191n.mj.am/img/191n/3s/x4t.png" alt="Box free shipping" align="center" border="none" width="42" padding-left="0" padding-right="0" padding-bottom="10" padding-top="10">
|
||||
|
||||
</mj-image>
|
||||
</mj-column>
|
||||
<mj-column width="75%">
|
||||
<mj-text align="left" color="#fff" font-size="18" padding-left="25" padding-right="25" padding-bottom="10" padding-top="10">
|
||||
<p>FREE SHIPPING ON ORDER <span style="font-weight: bold;color: rgb(250, 135, 57);">OVER 55€</span></p>
|
||||
</mj-text>
|
||||
</mj-column>
|
||||
</mj-section>
|
||||
<mj-section background-color="#fff" padding-bottom="20" padding-top="10">
|
||||
<mj-column vertical-align="bottom">
|
||||
<mj-image src="http://191n.mj.am/img/191n/3s/x4v.jpg" alt="Chesterk tank" align="center" border="none" width="209" padding-left="0" padding-right="0" padding-bottom="20" padding-top="30">
|
||||
|
||||
</mj-image>
|
||||
<mj-text font-weight="bold" align="center" color="#000" font-size="15" padding-left="25" padding-right="25" padding-bottom="0" padding-top="0">
|
||||
<p>CHESTERK TANK</p>
|
||||
<p style="color: rgb(250, 135, 57);">15€</p>
|
||||
</mj-text>
|
||||
<mj-button background-color="#fa8739" color="#fff" font-size="13" align="center" padding="15px 30px" border-radius="3px" href="https://mjml.io" padding-bottom="10" padding-top="0">
|
||||
BUY NOW
|
||||
</mj-button>
|
||||
</mj-column>
|
||||
<mj-column vertical-align="bottom">
|
||||
<mj-image src="http://191n.mj.am/img/191n/3s/x4g.jpg" alt="Beyond backpack" align="center" border="none" width="178" padding-left="0" padding-right="0" padding-bottom="20" padding-top="30">
|
||||
|
||||
</mj-image>
|
||||
<mj-text font-weight="bold" align="center" color="#000" font-size="15" padding-left="25" padding-right="25" padding-bottom="0" padding-top="0">
|
||||
<p>BEYOND BACKPACK</p>
|
||||
<p style="color: rgb(250, 135, 57);">20€</p>
|
||||
</mj-text>
|
||||
|
||||
<mj-button background-color="#fa8739" color="#fff" font-size="13" align="center" padding="15px 30px" border-radius="3px" href="https://mjml.io" padding-bottom="10" padding-top="0">
|
||||
BUY NOW
|
||||
</mj-button>
|
||||
</mj-column>
|
||||
<mj-column vertical-align="bottom">
|
||||
<mj-image src="http://191n.mj.am/img/191n/3s/x46.jpg" alt="Jensen shorts" align="center" border="none" width="182" padding-left="0" padding-right="0" padding-bottom="20" padding-top="30">
|
||||
|
||||
</mj-image>
|
||||
<mj-text font-weight="bold" align="center" color="#000" font-size="15" padding-left="25" padding-right="25" padding-bottom="0" padding-top="0">
|
||||
<p>JENSEN SHORTS</p>
|
||||
<p style="color: rgb(250, 135, 57);">28€</p>
|
||||
</mj-text>
|
||||
<mj-button background-color="#fa8739" color="#fff" font-size="13" align="center" padding="15px 30px" border-radius="3px" href="https://mjml.io" padding-bottom="10" padding-top="0">
|
||||
BUY NOW
|
||||
</mj-button>
|
||||
</mj-column>
|
||||
</mj-section>
|
||||
<mj-section background-color="#fff" padding-bottom="20" padding-top="10">
|
||||
<mj-column vertical-align="bottom">
|
||||
<mj-image src="http://191n.mj.am/img/191n/3s/x4h.jpg" alt="Verdant cap" align="center" border="none" width="129" padding-left="0" padding-right="0" padding-bottom="20" padding-top="20">
|
||||
|
||||
</mj-image>
|
||||
<mj-text font-weight="bold" align="center" color="#000" font-size="15" padding-left="25" padding-right="25" padding-bottom="0" padding-top="0">
|
||||
<p>VERDANT CAP</p>
|
||||
<p style="color: rgb(250, 135, 57);">20€</p>
|
||||
</mj-text>
|
||||
<mj-button background-color="#fa8739" color="#fff" font-size="13" align="center" border="none" padding="15px 30px" border-radius="3px" href="https://mjml.io" padding-left="25" padding-right="25" padding-bottom="10" padding-top="0">
|
||||
BUY NOW
|
||||
</mj-button>
|
||||
</mj-column>
|
||||
<mj-column vertical-align="bottom">
|
||||
<mj-image src="http://191n.mj.am/img/191n/3s/x4i.jpg" alt="Blake polo shirt" align="center" border="none" width="208" padding-left="0" padding-right="0" padding-bottom="20" padding-top="20">
|
||||
|
||||
</mj-image>
|
||||
<mj-text font-weight="bold" align="center" color="#000" font-size="15" padding-left="25" padding-right="25" padding-bottom="0" padding-top="0">
|
||||
<p>BLAKE POLO SHIRT</p>
|
||||
<p style="color: rgb(250, 135, 57);">25€</p>
|
||||
</mj-text>
|
||||
<mj-button background-color="#fa8739" color="#fff" font-size="13" align="center" padding="15px 30px" border-radius="3px" href="https://mjml.io" padding-bottom="10" padding-top="0">
|
||||
BUY NOW
|
||||
</mj-button>
|
||||
</mj-column>
|
||||
<mj-column vertical-align="bottom">
|
||||
<mj-image src="http://191n.mj.am/img/191n/3s/x4j.jpg" alt="Sketch floral" align="center" border="none" width="72" padding-left="0" padding-right="0" padding-bottom="20" padding-top="20">
|
||||
|
||||
</mj-image>
|
||||
<mj-text font-weight="bold" align="center" color="#000" font-size="15" padding-left="25" padding-right="25" padding-bottom="0" padding-top="0">
|
||||
<p>SKETCH FLORAL</p>
|
||||
<p style="color: rgb(250, 135, 57);">23€</p>
|
||||
</mj-text>
|
||||
<mj-button background-color="#fa8739" color="#fff" font-size="13" align="center" padding="15px 30px" border-radius="3px" href="https://mjml.io" padding-bottom="10" padding-top="0">
|
||||
BUY NOW
|
||||
</mj-button>
|
||||
</mj-column>
|
||||
</mj-section>
|
||||
<mj-section background-color="#fa8739" padding-bottom="0" padding-top="0">
|
||||
<mj-column>
|
||||
<mj-image src="http://191n.mj.am/img/191n/3s/x4k.jpg" alt="Man 1" width="301" padding-left="0" padding-right="0" padding-bottom="0" padding-top="0">
|
||||
</mj-image>
|
||||
</mj-column>
|
||||
<mj-column width="50%">
|
||||
<mj-text align="left" color="#fff" font-size="13" padding-left="25" padding-right="25" padding-bottom="0" padding-top="0">
|
||||
<p style="font-size: 19px;">ANDERSON SWEATER</p>
|
||||
<p style="font-size: 36px;">75€</p>
|
||||
<p>The Anderson Sweater features a floral all-over print with contrast colour.</p>
|
||||
</mj-text>
|
||||
<mj-button background-color="#fff" color="#fa8739" padding="15px 30px" border-radius="3px" href="https://mjml.io" padding-bottom="10" padding-top="0">
|
||||
BUY NOW
|
||||
</mj-button>
|
||||
</mj-column>
|
||||
</mj-section>
|
||||
<mj-section background-color="#2f323b" padding-bottom="0" padding-top="0">
|
||||
<mj-column>
|
||||
<mj-text align="left" color="#fff" font-size="13" padding-left="25" padding-right="25" padding-bottom="0" padding-top="0">
|
||||
<p style="font-size: 19px;">ALDER TWO JONES JACKET</p>
|
||||
<p style="font-size: 36px;">100€</p>
|
||||
<p>Colour-block design, zip entry, oxford hood lining, side pockets & TC lining.</p>
|
||||
</mj-text>
|
||||
<mj-button background-color="#fa8739" color="#fff" padding="15px 30px" border-radius="3px" href="https://mjml.io" padding-bottom="10" padding-top="0">
|
||||
BUY NOW
|
||||
</mj-button>
|
||||
</mj-column>
|
||||
<mj-column>
|
||||
<mj-image src="http://191n.mj.am/img/191n/3s/xj6.jpg" alt="Man 2" align="center" border="none" width="302" padding-left="0" padding-right="0" padding-bottom="0" padding-top="0">
|
||||
|
||||
</mj-image>
|
||||
</mj-column>
|
||||
</mj-section>
|
||||
<mj-section background-color="#fa8739" padding-bottom="0" padding-top="0">
|
||||
<mj-column>
|
||||
<mj-text align="center" color="#fff" font-size="13" padding-left="25" padding-right="25" padding-bottom="10" padding-top="10">
|
||||
<p style="font-size: 14px;">DISCOVER OUR</p>
|
||||
<p style="font-size: 27px;">SUMMER COLLECTION</p>
|
||||
</mj-text>
|
||||
</mj-column>
|
||||
</mj-section>
|
||||
<mj-section background-color="#fff" padding-bottom="20" padding-top="20">
|
||||
<mj-column>
|
||||
<mj-image src="http://191n.mj.am/img/191n/3s/x4q.jpg" alt="Topaz C3 shoes" padding-left="25" padding-right="25" padding-bottom="0" padding-top="0">
|
||||
</mj-image>
|
||||
<mj-text align="center" color="#000" font-size="15" font-weight="bold" padding-left="25" padding-right="25" padding-bottom="0" padding-top="0">
|
||||
<p>TOPAZ C3 SHOES</p>
|
||||
<p style="color: rgb(250, 135, 57);">70€</p>
|
||||
</mj-text>
|
||||
<mj-button background-color="#fa8739" color="#fff" font-size="13" align="center" padding="15px 30px" border-radius="3px" href="https://mjml.io" padding-bottom="10" padding-top="0">
|
||||
BUY NOW
|
||||
</mj-button>
|
||||
</mj-column>
|
||||
<mj-column>
|
||||
<mj-image src="http://191n.mj.am/img/191n/3s/x4r.jpg" alt="Camden backpack" align="center" border="none" width="199" padding-left="25" padding-right="25" padding-bottom="0" padding-top="0">
|
||||
|
||||
</mj-image>
|
||||
<mj-text align="center" color="#000" font-size="15" font-weight="bold" padding-left="25" padding-right="25" padding-bottom="0" padding-top="0">
|
||||
<p>CAMDEN BACKPACK</p>
|
||||
<p style="color: rgb(250, 135, 57);">50€</p>
|
||||
</mj-text>
|
||||
<mj-button background-color="#fa8739" color="#fff" padding="15px 30px" border-radius="3px" href="https://mjml.io" padding-bottom="10" padding-top="0">
|
||||
BUY NOW
|
||||
</mj-button>
|
||||
</mj-column>
|
||||
</mj-section>
|
||||
<mj-section background-color="#2f323b" padding-bottom="20" padding-top="20">
|
||||
<mj-column>
|
||||
<mj-image src="http://191n.mj.am/img/191n/3s/x47.png" alt="Cards" width="72">
|
||||
</mj-image>
|
||||
<mj-text align="center" color="#fff" font-size="13" padding-left="25" padding-right="25" padding-bottom="0" padding-top="0">
|
||||
<p style="font-size: 15px;font-weight: bold;">PAYMENT METHODS</p>
|
||||
<p>We accept all majors payments options</p>
|
||||
</mj-text>
|
||||
</mj-column>
|
||||
<mj-column>
|
||||
<mj-image src="http://191n.mj.am/img/191n/3s/x48.png" alt="Currencies" align="center" border="none" width="70" padding-left="25" padding-right="25" padding-bottom="0" padding-top="10">
|
||||
|
||||
</mj-image>
|
||||
<mj-text align="center" color="#fff" font-size="13" padding-left="25" padding-right="25" padding-bottom="0" padding-top="0">
|
||||
<p style="font-size: 15px;font-weight: bold;">CURRENCIES CHOICE</p>
|
||||
<p>You have the choice to pay with your own currencies</p>
|
||||
</mj-text>
|
||||
</mj-column>
|
||||
<mj-column>
|
||||
<mj-image src="http://191n.mj.am/img/191n/3s/x4y.png" alt="Express" align="center" border="none" width="82" padding-left="25" padding-right="25" padding-bottom="8" padding-top="10">
|
||||
|
||||
</mj-image>
|
||||
<mj-text align="center" color="#fff" font-size="13" padding-left="25" padding-right="25" padding-bottom="0" padding-top="0">
|
||||
<p style="font-size: 15px;font-weight: bold;">EXPRESS SHIPPING</p>
|
||||
<p>Delivered tomorrow before noon</p>
|
||||
</mj-text>
|
||||
</mj-column>
|
||||
</mj-section>
|
||||
<mj-section background-color="#fa8739" padding-bottom="0" padding-top="0">
|
||||
<mj-column>
|
||||
<mj-image src="http://191n.mj.am/img/191n/3s/x49.png" alt="Racoon logo" align="center" border="none" width="180" padding-left="0" padding-right="0" padding-bottom="0" padding-top="10">
|
||||
</mj-image>
|
||||
</mj-column>
|
||||
<mj-column>
|
||||
<mj-text align="center" color="#fff" font-size="13" padding-left="25" padding-right="25" padding-bottom="0" padding-top="0">
|
||||
<p><a href="https://mjml.io" style="text-decoration: none; color: inherit;">Privacy policy</a></p>
|
||||
</mj-text>
|
||||
</mj-column>
|
||||
<mj-column>
|
||||
<mj-social font-size="13" text-mode="false" facebook-href="[[SHORT_PERMALINK]]" twitter-href="[[SHORT_PERMALINK]]" google-href="[[SHORT_PERMALINK]]" mode="horizontal" display="facebook twitter google" padding-left="25" padding-right="25" padding-bottom="10"
|
||||
padding-top="10">
|
||||
</mj-social>
|
||||
</mj-column>
|
||||
</mj-section>
|
||||
<mj-section padding-bottom="20" padding-top="20">
|
||||
</mj-section>
|
||||
</mj-container>
|
||||
</mj-body>
|
||||
</mjml>
|
||||
182
samples/XML/real-estate.mjml
Normal file
182
samples/XML/real-estate.mjml
Normal file
@@ -0,0 +1,182 @@
|
||||
<mjml>
|
||||
<mj-head>
|
||||
<mj-title>Say hello to RealEstate</mj-title>
|
||||
<mj-font name="Roboto" href="https://fonts.googleapis.com/css?family=Alice" />
|
||||
<mj-font name="Roboto" href="https://fonts.googleapis.com/css?family=Roboto:400,700" />
|
||||
<mj-attributes>
|
||||
<mj-all font-family="Roboto, Helvetica, Arial, sans-serif" padding="0" />
|
||||
<mj-text font-weight="400" font-size="14" color="#000000" line-height="21px" />
|
||||
</mj-attributes>
|
||||
</mj-head>
|
||||
|
||||
<mj-body>
|
||||
<mj-container background-color="#EAE8E5">
|
||||
|
||||
<mj-section padding="20px 0 0 0">
|
||||
<mj-column>
|
||||
<mj-image src="http://nimus.de/share/tpl-realestate/box-head.png" alt="" align="center" border="none" padding="0"></mj-image>
|
||||
</mj-column>
|
||||
</mj-section>
|
||||
|
||||
<mj-section padding-top="40px" background-color="#FFFFFF">
|
||||
<mj-column width="570px">
|
||||
<mj-text align="left" padding="0 20px" color="#1D83A8" font-size="36" line-height="40px" font-family="Alice, Helvetica, Arial, sans-serif">
|
||||
Real Estate
|
||||
</mj-text>
|
||||
<mj-text align="left" padding="0 20px">
|
||||
<strong><span style="font-size: 40px;">⚊</span></strong><br /><br /></mj-text>
|
||||
</mj-column>
|
||||
</mj-section>
|
||||
|
||||
<mj-section background-color="#FFFFFF">
|
||||
<mj-column width="300px">
|
||||
<mj-text align="left" padding="0 20px 30px 20px">
|
||||
<strong>Aliquam lorem ante, dapibus in hasellus viverra nulla</strong> ut metus varius laoreet. Quisque rutrum lorem dellorus. Aenean imperdiet.
|
||||
</mj-text>
|
||||
</mj-column>
|
||||
<mj-column width="260px">
|
||||
<mj-image src="http://nimus.de/share/tpl-realestate/icon-1.png" alt="" padding-bottom="30px" width="260" align="center" border="none"></mj-image>
|
||||
</mj-column>
|
||||
</mj-section>
|
||||
|
||||
<mj-section background-url="http://nimus.de/share/tpl-realestate/img-1.png" vertical-align="middle" background-size="cover" padding="30px" background-repeat="no-repeat">
|
||||
<mj-column vertical-align="middle" width="60%">
|
||||
<mj-text align="center" padding="40px 30px" color="#FFFFFF" font-size="42px" line-height="48px" font-family="Alice, Helvetica, Arial, sans-serif">
|
||||
Villa Semperin
|
||||
</mj-text>
|
||||
</mj-column>
|
||||
<mj-column vertical-align="middle" width="40%" background-color="#FFFFFF">
|
||||
<mj-image src="http://nimus.de/share/tpl-realestate/box-top.png" width="220px" alt="" align="center" border="none"></mj-image>
|
||||
<mj-text align="center" padding="20px 20px 0 20px" color="#1D83A8" font-size="26" line-height="30px" font-family="Alice, Helvetica, Arial, sans-serif">
|
||||
– first offer –
|
||||
</mj-text>
|
||||
<mj-text align="center" padding="10px 20px" font-size="22" line-height="30px">340,000 $</mj-text>
|
||||
<mj-text align="center" padding="0 20px">Nascetur ridiculus mus. Donec quam felis, ultricies nec</mj-text>
|
||||
<mj-button background-color="#F44E3C" color="white" padding="20px 20px 30px 20px" border-radius="20px">
|
||||
view details
|
||||
</mj-button>
|
||||
</mj-column>
|
||||
</mj-section>
|
||||
|
||||
|
||||
<mj-section padding="30px" background-color="#FFFFFF">
|
||||
<mj-column width="60%">
|
||||
<mj-text align="center" padding-bottom="20px" font-size="26" line-height="30px" font-family="Alice, Helvetica, Arial, sans-serif">
|
||||
Lorem Ipsum
|
||||
</mj-text>
|
||||
<mj-text align="center" padding="0 40px">
|
||||
Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Lorem Ipsum
|
||||
</mj-text>
|
||||
<mj-image src="http://nimus.de/share/tpl-realestate/icon-2.png" alt="" padding="30px 0 10px 0" width="50" align="center" border="none"></mj-image>
|
||||
</mj-column>
|
||||
<mj-column width="40%" background-color="#FFFFFF">
|
||||
<mj-image src="http://nimus.de/share/tpl-realestate/img-2.png" width="216px" alt="" align="center" border="none"></mj-image>
|
||||
</mj-column>
|
||||
</mj-section>
|
||||
|
||||
<mj-section padding="20px" background-color="#FFFFFF">
|
||||
<mj-column width="100%">
|
||||
<mj-image src="http://nimus.de/share/tpl-realestate/symbol-1.png" alt="" width="292px" align="left" border="none"></mj-image>
|
||||
</mj-column>
|
||||
</mj-section>
|
||||
|
||||
<mj-section padding="0 20px" background-color="#FFFFFF">
|
||||
<mj-column>
|
||||
<mj-text align="center" font-size="26" line-height="30px" font-family="Alice, Helvetica, Arial, sans-serif">
|
||||
Lorem Ipsum
|
||||
</mj-text>
|
||||
<mj-divider width="20px" padding="20px 0" border-width="2px" border-color="#000000" />
|
||||
<mj-text align="center" padding="0 40px">
|
||||
Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Lorem Ipsum
|
||||
</mj-text>
|
||||
<mj-button background-color="#F44E3C" color="white" padding="20px 20px 10px 20px" border-radius="20px">
|
||||
Call to action
|
||||
</mj-button>
|
||||
</mj-column>
|
||||
</mj-section>
|
||||
|
||||
<mj-section padding="20px" background-color="#FFFFFF">
|
||||
<mj-column width="100%">
|
||||
<mj-image src="http://nimus.de/share/tpl-realestate/symbol-2.png" alt="" width="213px" align="right" border="none"></mj-image>
|
||||
</mj-column>
|
||||
</mj-section>
|
||||
|
||||
|
||||
<mj-section padding="0 30px 30px" background-color="#FFFFFF">
|
||||
<mj-column width="55%">
|
||||
<mj-image src="http://nimus.de/share/tpl-realestate/img-3.png" width="280px" padding-bottom="20px" alt="" align="center" border="none"></mj-image>
|
||||
</mj-column>
|
||||
<mj-column width="45%" background-color="#FFFFFF">
|
||||
<mj-text align="center" padding-bottom="20px" font-size="26" line-height="30px" font-family="Alice, Helvetica, Arial, sans-serif">
|
||||
Lorem Ipsum
|
||||
</mj-text>
|
||||
<mj-text align="center" padding="0 40px">
|
||||
Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum.
|
||||
</mj-text>
|
||||
<mj-image src="http://nimus.de/share/tpl-realestate/icon-3.png" alt="" padding="30px 0 10px 0" width="50" align="center" border="none"></mj-image>
|
||||
</mj-column>
|
||||
</mj-section>
|
||||
|
||||
<mj-section padding="0 20px" background-color="#FFFFFF">
|
||||
<mj-column>
|
||||
<mj-text align="center" font-size="26" line-height="30px" font-family="Alice, Helvetica, Arial, sans-serif">
|
||||
Nullam dictum felis eu pede
|
||||
</mj-text>
|
||||
<mj-divider width="20px" padding="20px 0" border-width="2px" border-color="#000000" />
|
||||
</mj-column>
|
||||
</mj-section>
|
||||
|
||||
<mj-section padding="0 20px 30px" background-color="#FFFFFF">
|
||||
<mj-column width="33%">
|
||||
<mj-text align="left" padding="0 15px 15px">
|
||||
<strong>Aliquam lorem ante,</strong> dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Lorem Ipsum
|
||||
</mj-text>
|
||||
</mj-column>
|
||||
<mj-column width="34%">
|
||||
<mj-text align="left" padding="0 15px 15px">
|
||||
<strong>Phasellus viverra null aliquam lorem ante</strong>, dapibus in, viverra quis, feugiat a, tellus ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Lorem Ipsum
|
||||
</mj-text>
|
||||
</mj-column>
|
||||
<mj-column width="33%">
|
||||
<mj-text align="left" padding="0 15px 15px">
|
||||
<strong>Quisque rutrum.</strong> Aenean imperdiet viverra nulla ut metus varius laoreet. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Lorem Ipsum
|
||||
</mj-text>
|
||||
</mj-column>
|
||||
</mj-section>
|
||||
|
||||
<mj-section background-url="http://nimus.de/share/tpl-realestate/img-4.png" vertical-align="middle" background-size="cover" padding="30px" background-repeat="no-repeat">
|
||||
<mj-column vertical-align="middle" width="40%" background-color="#FFFFFF">
|
||||
<mj-image src="http://nimus.de/share/tpl-realestate/box-top.png" width="220px" alt="" align="center" border="none"></mj-image>
|
||||
<mj-text align="center" padding="20px 20px 0 20px" color="#1D83A8" font-size="26" line-height="30px" font-family="Alice, Helvetica, Arial, sans-serif">
|
||||
– 2. offer –
|
||||
</mj-text>
|
||||
<mj-text align="center" padding="10px 20px" font-size="22" line-height="30px">198,700 $</mj-text>
|
||||
<mj-text align="center" padding="0 20px">Donec quam felis, ultricies Nascetur ridiculus mus.</mj-text>
|
||||
<mj-button background-color="#F44E3C" color="white" padding="20px 20px 30px 20px" border-radius="20px">
|
||||
view details
|
||||
</mj-button>
|
||||
</mj-column>
|
||||
<mj-column vertical-align="middle" width="60%">
|
||||
<mj-text align="center" padding="40px 30px" color="#FFFFFF" font-size="42px" line-height="48px" font-family="Alice, Helvetica, Arial, sans-serif">
|
||||
Window House 23
|
||||
</mj-text>
|
||||
</mj-column>
|
||||
</mj-section>
|
||||
|
||||
<mj-section padding="40px 20px" background-color="#FFFFFF">
|
||||
<mj-column width="100%">
|
||||
<mj-image src="http://nimus.de/share/tpl-realestate/icon-1.png" alt="" width="130px" align="center" border="none"></mj-image>
|
||||
</mj-column>
|
||||
</mj-section>
|
||||
|
||||
<mj-section padding="10px 0 20px 0">
|
||||
<mj-column>
|
||||
<mj-text align="center" color="#9B9B9B" font-size="11px"><a href="#" style="color: #9B9B9B;">Unsubscribe</a> from this newsletter<br>Icon made by Freepik from <a href="http://www.flaticon.com" target="_blank" style="color: #9B9B9B; text-decoration: none;">www.flaticon.com</a><br>
|
||||
<a href="http://svenhaustein.de" style="color: #9B9B9B; text-decoration:none;">Made by svenhaustein.de</a>
|
||||
</mj-text>
|
||||
</mj-column>
|
||||
</mj-section>
|
||||
|
||||
</mj-container>
|
||||
</mj-body>
|
||||
</mjml>
|
||||
18
samples/XML/source.extension.vsixmanifest
Normal file
18
samples/XML/source.extension.vsixmanifest
Normal file
@@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PackageManifest Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2011" xmlns:d="http://schemas.microsoft.com/developer/vsx-schema-design/2011">
|
||||
<Metadata>
|
||||
<Identity Id="$guid1$" Version="1.0" Language="en-US" Publisher="$registeredorganization$" />
|
||||
<DisplayName>$packageName$</DisplayName>
|
||||
<Description>$packageName$ Visual Studio Package</Description>
|
||||
</Metadata>
|
||||
<Installation>
|
||||
<InstallationTarget Version="[14.0,15.0)" Id="Microsoft.VisualStudio.Community" />
|
||||
</Installation>
|
||||
<Dependencies>
|
||||
<Dependency Id="Microsoft.Framework.NDP" DisplayName="Microsoft .NET Framework" d:Source="Manual" Version="[4.5,)" />
|
||||
<Dependency Id="Microsoft.VisualStudio.MPF.14.0" DisplayName="Visual Studio MPF 14.0" d:Source="Installed" Version="[14.0]" />
|
||||
</Dependencies>
|
||||
<Assets>
|
||||
<Asset Type="Microsoft.VisualStudio.VsPackage" d:Source="Project" d:ProjectName="%CurrentProject%" Path="|%CurrentProject%;PkgdefProjectOutputGroup|" />
|
||||
</Assets>
|
||||
</PackageManifest>
|
||||
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>
|
||||
@@ -51,7 +51,7 @@ SUBMODULES.partition { |submodule| SLOW_SUBMODULES.include?(submodule) }.flatten
|
||||
submodules.push(submodule)
|
||||
end
|
||||
|
||||
8.times do
|
||||
(ARGV.first || 8).to_i.times do
|
||||
Thread.new { run_thread(submodules, results) }
|
||||
end
|
||||
|
||||
|
||||
9
test/fixtures/Data/yarn.lock
vendored
Normal file
9
test/fixtures/Data/yarn.lock
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||
# yarn lockfile v1
|
||||
abab@^1.0.0:
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.3.tgz#b81de5f7274ec4e756d797cd834f303642724e5d"
|
||||
|
||||
abbrev@1, abbrev@1.0.x:
|
||||
version "1.0.9"
|
||||
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135"
|
||||
@@ -53,4 +53,8 @@ class TestClassifier < Minitest::Test
|
||||
assert_equal language.name, results.first[0], "#{sample[:path]}\n#{results.inspect}"
|
||||
end
|
||||
end
|
||||
|
||||
def test_classify_empty_languages
|
||||
assert_equal [], Classifier.classify(Samples.cache, fixture("Ruby/foo.rb"), [])
|
||||
end
|
||||
end
|
||||
|
||||
@@ -79,6 +79,9 @@ class TestGenerated < Minitest::Test
|
||||
generated_fixture_loading_data("Data/sourcemap.v3.map")
|
||||
generated_fixture_loading_data("Data/sourcemap.v1.map")
|
||||
|
||||
# Yarn locfile
|
||||
generated_fixture_loading_data("Data/yarn.lock")
|
||||
|
||||
# Specflow
|
||||
generated_fixture_without_loading_data("Features/BindingCulture.feature.cs")
|
||||
|
||||
|
||||
@@ -13,35 +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
|
||||
|
||||
@@ -106,7 +106,7 @@ class TestHeuristcs < Minitest::Test
|
||||
|
||||
def test_f_by_heuristics
|
||||
assert_heuristics({
|
||||
"FORTRAN" => all_fixtures("FORTRAN", "*.f") + all_fixtures("FORTRAN", "*.for"),
|
||||
"Fortran" => all_fixtures("Fortran", "*.f") + all_fixtures("Fortran", "*.for"),
|
||||
"Forth" => all_fixtures("Forth", "*.f") + all_fixtures("Forth", "*.for")
|
||||
})
|
||||
end
|
||||
@@ -144,6 +144,15 @@ class TestHeuristcs < Minitest::Test
|
||||
})
|
||||
end
|
||||
|
||||
def test_l_by_heuristics
|
||||
assert_heuristics({
|
||||
"Common Lisp" => all_fixtures("Common Lisp", "*.l"),
|
||||
"Lex" => all_fixtures("Lex", "*.l"),
|
||||
"Roff" => all_fixtures("Roff", "*.l"),
|
||||
"PicoLisp" => all_fixtures("PicoLisp", "*.l")
|
||||
})
|
||||
end
|
||||
|
||||
def test_ls_by_heuristics
|
||||
assert_heuristics({
|
||||
"LiveScript" => all_fixtures("LiveScript", "*.ls"),
|
||||
@@ -174,7 +183,22 @@ class TestHeuristcs < Minitest::Test
|
||||
def test_md_by_heuristics
|
||||
assert_heuristics({
|
||||
"Markdown" => all_fixtures("Markdown", "*.md"),
|
||||
"GCC machine description" => all_fixtures("GCC machine description", "*.md")
|
||||
"GCC Machine Description" => all_fixtures("GCC Machine Description", "*.md")
|
||||
})
|
||||
end
|
||||
|
||||
def test_ms_by_heuristics
|
||||
assert_heuristics({
|
||||
"Roff" => all_fixtures("Roff", "*.ms"),
|
||||
"Unix Assembly" => all_fixtures("Unix Assembly", "*.ms"),
|
||||
"MAXScript" => all_fixtures("MAXScript", "*.ms")
|
||||
})
|
||||
end
|
||||
|
||||
def test_n_by_heuristics
|
||||
assert_heuristics({
|
||||
"Roff" => all_fixtures("Roff", "*.n"),
|
||||
"Nemerle" => all_fixtures("Nemerle", "*.n")
|
||||
})
|
||||
end
|
||||
|
||||
@@ -230,6 +254,13 @@ class TestHeuristcs < Minitest::Test
|
||||
})
|
||||
end
|
||||
|
||||
def test_rno_by_heuristics
|
||||
assert_heuristics({
|
||||
"RUNOFF" => all_fixtures("RUNOFF", "*.rno"),
|
||||
"Roff" => all_fixtures("Roff", "*.rno")
|
||||
})
|
||||
end
|
||||
|
||||
# Candidate languages = ["Scala", "SuperCollider"]
|
||||
def test_sc_supercollider_scala_by_heuristics
|
||||
assert_heuristics({
|
||||
@@ -264,4 +295,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
|
||||
|
||||
@@ -460,4 +460,8 @@ class TestLanguage < Minitest::Test
|
||||
assert !language.color, "Unused colour assigned to #{language.name}"
|
||||
end
|
||||
end
|
||||
|
||||
def test_non_crash_on_comma
|
||||
assert_nil Language[',']
|
||||
end
|
||||
end
|
||||
|
||||
2
vendor/CodeMirror
vendored
2
vendor/CodeMirror
vendored
Submodule vendor/CodeMirror updated: 0fb17df669...41da8714dd
24
vendor/README.md
vendored
24
vendor/README.md
vendored
@@ -76,7 +76,7 @@ This is a list of grammars that Linguist selects to provide syntax highlighting
|
||||
- **Csound:** [nwhetsell/language-csound](https://github.com/nwhetsell/language-csound)
|
||||
- **Csound Document:** [nwhetsell/language-csound](https://github.com/nwhetsell/language-csound)
|
||||
- **Csound Score:** [nwhetsell/language-csound](https://github.com/nwhetsell/language-csound)
|
||||
- **CSS:** [textmate/css.tmbundle](https://github.com/textmate/css.tmbundle)
|
||||
- **CSS:** [atom/language-css](https://github.com/atom/language-css)
|
||||
- **Cuda:** [harrism/sublimetext-cuda-cpp](https://github.com/harrism/sublimetext-cuda-cpp)
|
||||
- **Cycript:** [atom/language-javascript](https://github.com/atom/language-javascript)
|
||||
- **Cython:** [textmate/cython.tmbundle](https://github.com/textmate/cython.tmbundle)
|
||||
@@ -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)
|
||||
@@ -164,12 +165,14 @@ This is a list of grammars that Linguist selects to provide syntax highlighting
|
||||
- **Java Server Pages:** [textmate/java.tmbundle](https://github.com/textmate/java.tmbundle)
|
||||
- **JavaScript:** [atom/language-javascript](https://github.com/atom/language-javascript)
|
||||
- **JFlex:** [jflex-de/jflex.tmbundle](https://github.com/jflex-de/jflex.tmbundle)
|
||||
- **Jison:** [cdibbs/language-jison](https://github.com/cdibbs/language-jison)
|
||||
- **Jison Lex:** [cdibbs/language-jison](https://github.com/cdibbs/language-jison)
|
||||
- **JSON:** [textmate/json.tmbundle](https://github.com/textmate/json.tmbundle)
|
||||
- **JSON5:** [atom/language-javascript](https://github.com/atom/language-javascript)
|
||||
- **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 +197,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 +206,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 +242,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)
|
||||
@@ -265,8 +272,8 @@ This is a list of grammars that Linguist selects to provide syntax highlighting
|
||||
- **Puppet:** [russCloak/SublimePuppet](https://github.com/russCloak/SublimePuppet)
|
||||
- **PureScript:** [purescript-contrib/atom-language-purescript](https://github.com/purescript-contrib/atom-language-purescript)
|
||||
- **Python:** [MagicStack/MagicPython](https://github.com/MagicStack/MagicPython)
|
||||
- **Python console:** [atom/language-python](https://github.com/atom/language-python)
|
||||
- **Python traceback:** [atom/language-python](https://github.com/atom/language-python)
|
||||
- **Python console:** [MagicStack/MagicPython](https://github.com/MagicStack/MagicPython)
|
||||
- **Python traceback:** [MagicStack/MagicPython](https://github.com/MagicStack/MagicPython)
|
||||
- **QMake:** [textmate/cpp-qt.tmbundle](https://github.com/textmate/cpp-qt.tmbundle)
|
||||
- **QML:** [skozlovf/Sublime-QML](https://github.com/skozlovf/Sublime-QML)
|
||||
- **R:** [textmate/r.tmbundle](https://github.com/textmate/r.tmbundle)
|
||||
@@ -278,6 +285,7 @@ This is a list of grammars that Linguist selects to provide syntax highlighting
|
||||
- **Reason:** [facebook/reason](https://github.com/facebook/reason)
|
||||
- **Rebol:** [Oldes/Sublime-REBOL](https://github.com/Oldes/Sublime-REBOL)
|
||||
- **Red:** [Oldes/Sublime-Red](https://github.com/Oldes/Sublime-Red)
|
||||
- **Regular Expression:** [Alhadis/language-regexp](https://github.com/Alhadis/language-regexp)
|
||||
- **Ren'Py:** [williamd1k0/language-renpy](https://github.com/williamd1k0/language-renpy)
|
||||
- **reStructuredText:** [Lukasa/language-restructuredtext](https://github.com/Lukasa/language-restructuredtext)
|
||||
- **REXX:** [mblocker/rexx-sublime](https://github.com/mblocker/rexx-sublime)
|
||||
|
||||
2
vendor/grammars/Elm
vendored
2
vendor/grammars/Elm
vendored
Submodule vendor/grammars/Elm updated: 8e8af4a712...195e71c6a7
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...ed68ac42c5
2
vendor/grammars/NimLime
vendored
2
vendor/grammars/NimLime
vendored
Submodule vendor/grammars/NimLime updated: 2f5ec25fe6...80787e7eee
2
vendor/grammars/Sublime-SQF-Language
vendored
2
vendor/grammars/Sublime-SQF-Language
vendored
Submodule vendor/grammars/Sublime-SQF-Language updated: 0e72aacb4a...0dffdffaaa
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...396ba0fbef
2
vendor/grammars/SublimePapyrus
vendored
2
vendor/grammars/SublimePapyrus
vendored
Submodule vendor/grammars/SublimePapyrus updated: 374ebd6444...6dc86d921a
2
vendor/grammars/SublimePuppet
vendored
2
vendor/grammars/SublimePuppet
vendored
Submodule vendor/grammars/SublimePuppet updated: a90d5a4e08...e804328fc9
2
vendor/grammars/TXL
vendored
2
vendor/grammars/TXL
vendored
Submodule vendor/grammars/TXL updated: c1c98dfa86...614cf83649
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user