Compare commits

...

108 Commits

Author SHA1 Message Date
Caged
110b42fe16 add a puppet sample with includes-only since they are often misclassified as pascal 2017-05-05 10:10:35 -07:00
Colin Seymour
e93f41f097 Revert "Switch the PHP grammar to the upstream repo (#3575)" (#3603)
* Revert "Switch the PHP grammar to the upstream repo (#3575)"

Manually reverting this as it breaks PHP syntax highlighting on
github.com.

* Update submodule ref
2017-05-05 17:11:29 +01:00
Colin Seymour
994bc1f135 Release v5.0.9 (#3597)
* Update all grammars

* Update atom-language-clean grammar to match

* Don't update reason grammer

There seems to be a problem with the 1.3.5 release in that the conversion isn't producing a reason entry so doesn't match whats in grammar.yml

* Bump version to 5.0.9

* Update grammars

* Don't update javascript grammar

The current grammar has a known issue and is pending the fix in https://github.com/atom/language-javascript/pull/497
2017-05-03 14:49:26 +01:00
John Gardner
44f03e64c1 Merge heuristics for disambiguating ".t" files (#3587)
References: github/linguist#3546
2017-04-29 11:15:39 +02:00
Jacob Elder
4166f2e89d Clarify support for generated code (#3588)
* Clarify support for generated code

* Incorporate feedback

* TIL about how .gitattributes matching works
2017-04-28 16:20:22 -07:00
John Gardner
1a8f19c6f2 Fix numbering of ordered lists (#3586) 2017-04-28 14:02:38 -07:00
Santiago M. Mola
c0e242358a Fix heuristics after rename (#3556)
* fix Roff detection in heuristics

This affects extensions .l, .ms, .n and .rno.

Groff was renamed to Roff in 673aeb32b9851cc58429c4b598c876292aaf70c7,
but heuristic was not updated.

* replace FORTRAN with Fortran

It was already renamed in most places since 4fd8fce08574809aa58e9771e2a9da5d135127be
heuristics.rb was missing though.

* fix caseness of GCC Machine Description
2017-04-26 15:31:36 -07:00
thesave
eb38c8dcf8 [Add Language] Jolie (#3574)
* added support for Jolie language

* added support for Jolie language

* added samples for Jolie
2017-04-26 11:04:25 -07:00
Trent Schafer
f146b4afbd New extension support for PL/SQL language (#2735)
* Add additional PL/SQL file extensions

* Add PL/SQL samples for .ddl and .prc

* Fix sort order of PL/SQL extensions

* Restore vendor/grammars/assembly.

* Restore `pls` as primary PL/SQL extension

* Add tpb to go with tps
2017-04-26 11:03:01 -07:00
Nicolas Garnier
db15d0f5d2 Added MJML as an XML extension (#3582) 2017-04-26 19:24:57 +10:00
Michael Grafnetter
e6d57c771d Add .admx and .adml as extensions for XML (#3580)
* Add .admx and .adml as extensions for XML

* Fixed the order of extensions
2017-04-24 09:55:22 -07:00
Nathan Phillip Brink
eef0335c5f Clarify description of implicit alias. (#3578)
* Clarify description of implicit alias.

I was trying to look up the alias to use for DNS Zone. From the docs
the alias I should use would be dns zone, but in reality it is dns-zone.
This change updates the comments to describe how to derive the
implicit name of a given alias.

* Further clarify description of implicit alias.

@pchaigno requested replacing the Ruby with English.
2017-04-24 09:54:37 -07:00
Christoph Pojer
461c27c066 Revert "Added Jest snapshot test files as generated src (#3572)" (#3579)
This reverts commit f38d6bd124.
2017-04-22 14:20:54 +02:00
Matvei Stefarov
59d67d6743 Treat vstemplate and vsixmanifest as XML (#3517) 2017-04-22 09:25:50 +01:00
Sandy Armstrong
7aeeb82d3d Treat Xamarin .workbook files as markdown (#3500)
* Treat Xamarin .workbook files as markdown

Xamarin Workbook files are interactive coding documents for C#, serialized as
markdown files. They include a YAML front matter header block with some
metadata. Interactive code cells are included as `csharp` fenced code blocks.

An example can be found here:
https://github.com/xamarin/Workbooks/blob/master/csharp/csharp6/csharp6.workbook

Treated as markdown, it would appear like so:
https://gist.github.com/sandyarmstrong/e331dfeaf89cbce89043a1c31faa1297

* Add .workbook sample

Source: https://github.com/xamarin/Workbooks/blob/master/csharp/csharp6/csharp6.workbook
2017-04-20 15:29:17 +01:00
Christophe Coevoet
c98ca20076 Switch the PHP grammar to the upstream repo (#3575)
* Switch the PHP grammar to the upstream repo

* Update all URLs pointing to the PHP grammar bundle
2017-04-20 14:40:44 +01:00
Paul Chaignon
4e0b5f02aa Fix usage line in binary (#3564)
Linguist cannot work on any directory; it needs to be a Git
repository.
2017-04-20 10:18:03 +01:00
Tim Jones
8da7cb805e Add .cginc extension to HLSL language (#3491)
* Add .cginc extension to HLSL language

* Move extension to correct position

* Add representative sample .cginc file
2017-04-20 09:48:48 +01:00
Dorian
e5e81a8560 Add .irbc and Rakefile to matching ruby filenames (#3457) 2017-04-20 09:41:31 +01:00
Tim Jones
dd53fa1585 Add ShaderLab language (#3490)
* Add ShaderLab language

* Update HLSL and ShaderLab grammars to latest version

* Add .shader extension back to GLSL language

* Add sample GLSL .shader files

Note that these are copies of existing GLSL samples, renamed to have
the .shader extension.
2017-04-20 09:04:08 +01:00
Daniel F Moisset
354a8f079a Add suport for python typeshed (.pyi) extension (#3548) 2017-04-20 09:01:41 +01:00
Hank Brekke
f38d6bd124 Added Jest snapshot test files as generated src (#3572) 2017-04-20 08:58:39 +01:00
Santiago M. Mola
e80b92e407 Fix heuristic for Unix Assembly with .ms extension (#3550) 2017-04-06 22:01:42 +10:00
Martin Nowak
fa6ae1116f better heuristic distinction of .d files (#3145)
* fix benchmark

- require json for Hash.to_json

* better heuristic distinction of .d files

- properly recongnize dtrace probes
- recongnize \ in Makefile paths
- recongnize single line `file.ext : dep.ext` make targets
- recognize D module, import, function, and unittest declarations
- add more representative D samples

D changed from 31.2% to 28.1%
DTrace changed from 33.5% to 32.5%
Makefile changed from 35.3% to 39.4%

See
https://gist.github.com/MartinNowak/fda24fdef64f2dbb05c5a5ceabf22bd3
for the scraper used to get a test corpus.
2017-03-30 18:25:53 +01:00
Yuki Izumi
b7e27a9f58 .pod disambiguation heuristic fix (#3541)
Look for any line starting with "=\w+", not full lines, otherwise we
miss e.g. "=head1 HEADING".
2017-03-27 14:10:17 +11:00
Javier Honduvilla Coto
69ba4c5586 Update the Instrumenter doc ... (#3530)
... with an instance of the given`Instrumenter` instead of the class itself.
2017-03-23 06:11:45 +01:00
Rafer Hazen
c39d7fd6e8 Add data-engineering staff to maintainers list (#3533) 2017-03-22 07:06:58 -06:00
Yuki Izumi
44ed47cea1 Release v5.0.8 (#3535) 2017-03-22 16:41:36 +11:00
Yuki Izumi
de51cb08d2 Add .mdwn for Markdown (#3534) 2017-03-22 16:28:59 +11:00
Ronald Wampler
3dd2d08190 Add .mdown as an extension for Markdown (#3525)
* Add `.mdown` as an extension for Markdown

* Add `.mdown` sample
2017-03-22 16:14:54 +11:00
Yuki Izumi
3b625e1954 Release v5.0.7 (#3524)
* grammar update
* Release v5.0.7
2017-03-20 14:13:04 +11:00
Yuki Izumi
5c6f690b97 Prefer Markdown over GCC Machine Description (#3523)
* Add minimal Markdown sample
* Heuristic defaults to Markdown on no match
* Allow Linguist to detect empty blobs
2017-03-20 13:07:54 +11:00
Michael Rawlings
3bbfc907f3 [Add Language] Marko (#3519)
* add marko

* update marko
2017-03-17 09:46:20 +00:00
Colin Seymour
053b8bca97 GitHub.com now uses gitattributes overrides for syntax highlighting (#3518)
See https://github.com/github/linguist/issues/1792#issuecomment-286379822 for more details.
2017-03-15 22:42:08 -07:00
Yves Siegrist
7fb3db6203 Add .eye files to be used as ruby (#3509)
Usually files that are used for [eye](https://github.com/kostya/eye) have the file extension `.eye`.
A eye definition file always contains ruby code.
2017-03-13 17:22:56 -07:00
Liav Turkia
ba09394f85 Added a demos folder and updated regexes (#3512)
I added a check for case-sensitivity to the regex's. In my repositories, I have both a Docs and Demos folder and those wouldn't have been matched before. Now, they would.
2017-03-13 17:20:36 -07:00
Paul Chaignon
c59c88f16e Update grammar whitelist (#3510)
* Remove a few hashes for grammars with BSD licenses

There was an error in Licensee v8.8.2, which caused it to not
recognize some BSD licenses. v8.8.3 fixes it.

* Update submodules

Remove 2 grammars from the whitelist because their licenses were
added to a LICENSE file which a proper format (one that Licensee
detects).

MagicPython now supports all scopes that were previously supported
by language-python.
2017-03-13 17:19:06 -07:00
Brandon Black
8a6e74799a Merge branch 'master' of https://github.com/github/linguist 2017-03-13 17:13:48 -07:00
Brandon Black
4268769d2e adjusting travis config 2017-03-13 17:13:24 -07:00
NN
6601864084 Add wixproj as XML (#3511)
* Add wixproj as XML

WiX uses wixproj for projects.

* Add wixproj sample
2017-03-13 17:01:58 -07:00
Paul Chaignon
d57aa37fb7 Grammar for OpenSCAD from Textmate bundle (#3502) 2017-03-13 17:00:27 -07:00
Karl Pettersson
e72347fd98 Add alias for pandoc (#3493) 2017-03-13 16:59:35 -07:00
Brandon Black
1b429ea46b updating rubies 2017-03-10 00:00:19 -08:00
Paul Chaignon
9468ad4947 Fix grammar hashes (#3504)
* Update Licensee hashes for grammar licenses

Licensee v8.8 changed the way licenses are normalized, thus changing hashes for
some grammars

* Update Licensee

Prevent automatic updates to major releases
2017-03-09 23:57:35 -08:00
Nate Whetsell
733ef63193 Add Jison (#3488) 2017-02-22 00:24:50 -08:00
Brandon Black
9ca6a5841e Release v5.0.6 (#3489)
* grammar update

* bumping linguist version

* fixes for grammar updates
2017-02-21 23:13:15 -08:00
Brandon Black
41ace5fba0 using fork for php.tmbundle since updates are broken 2017-02-21 17:13:55 -08:00
Alex Arslan
cc4295b3b3 Update URL for Julia TextMate repo (#3487) 2017-02-21 17:05:59 -08:00
doug tangren
1e4ce80fd9 add support for detecting bazel WORKSPACE files (#3459)
* add support for detecting bazel WORKSPACE files

* Update languages.yml
2017-02-21 16:48:44 -08:00
Brandon Black
74a71fd90d fixing merge conflict 2017-02-21 16:28:34 -08:00
TingPing
9b08318456 Add Meson language (#3463) 2017-02-21 16:24:58 -08:00
Tim Jones
fa5b6b03dc Add grammar for HLSL (High Level Shading Language) (#3469) 2017-02-21 16:05:25 -08:00
Garen Torikian
cb59296fe0 Like ^docs?, sometimes one sample is enough (#3485) 2017-02-20 10:29:30 -08:00
Eloy Durán
f1be771611 Disambiguate TypeScript with tsx extension. (#3464)
Using the technique as discussed in #2761.
2017-02-20 10:17:18 +00:00
Alex Louden
b66fcb2529 Improve Terraform (.tf) / HCL (.hcl) syntax highlighting (#3392)
* Add Terraform grammar, and change .tf and .hcl files from using Ruby to Terraform sublime syntax

* Expand Terraform sample to demonstrate more language features

* Revert terraform sample change

* Add terraform sample - Dokku AWS deploy

* Updated to latest Terraform

* Update terraform string interpolation

* Update terraform to latest
2017-02-20 10:09:59 +00:00
Brandon Black
f7fe1fee66 Release v5.0.5 -- part Deux (#3479)
* bumping to v5.0.5

* relaxing rugged version requirement
2017-02-15 21:29:04 -08:00
Brandon Black
94367cc460 Update LICENSE 2017-02-15 14:11:37 -08:00
Phineas
72bec1fddc Update LICENSE Copyright Date to 2017 (#3476) 2017-02-15 14:11:13 -08:00
Brandon Black
4e2eba4ef8 Revert "Release v5.0.5" (#3477) 2017-02-15 12:48:45 -08:00
Colin Seymour
10457b6639 Release v5.0.5 (#3473)
Release v5.0.5

* Update submodules

* Update grammars

* Bump version to 5.0.5

* Relax dependency on rugged

It's probably not wise to depend on a beta version just yet.

* revert php.tmbundle grammar update

One of the changes in 3ed4837b43...010cc1c22c leads to breakage in snippet highlighting on github.com
2017-02-15 11:12:53 +00:00
Paul Chaignon
d58cbc68a6 Support for the P4 language
P4 is a language to describe the processing pipeline of network devices
2017-02-15 06:53:46 +01:00
Colin Seymour
01de40faaa Return early in Classifier.classify if no languages supplied (#3471)
* Return early if no languages supplied

There's no need to tokenise the data when attempting to classify without a limited language scope as no action will be performed when it comes to scoring anyway.

* Add test for empty languages array
2017-02-13 18:22:54 +00:00
Paul Chaignon
62d285fce6 Fix head commit for TXL grammar (#3470) 2017-02-13 14:35:38 +01:00
Stefan Stölzle
0056095e8c Add .lkml to LookML (#3454)
* Add .lkml to LookML

* Limit .lkml to .view.lkml and .model.lkml

* Add lkml samples

* Fix extension order
2017-02-03 11:50:30 +01:00
Lars Brinkhoff
d6dc3a3991 Accomodate Markdown lines which begin with '>'. (#3452) 2017-02-02 11:58:52 -08:00
Greg Zimmerman
b524461b7c Add PowerShell color. Matches default console color for PowerShell. (#3448) 2017-02-02 11:13:01 -08:00
fix-fix
76d41697aa Use official HTML primary color (#3447)
Use primary color of HTML5 logo as defined on Logo FAQ page
2017-02-02 11:09:55 -08:00
John Gardner
32147b629e Register "Emakefile" as an Erlang filename (#3443) 2017-02-02 11:09:07 -08:00
John Gardner
e7b5e25bf8 Add support for regular expression data (#3441) 2017-02-02 11:08:20 -08:00
Brandon Black
d761658f8b Release v5.0.4 (#3445)
* bumping to v5.0.3

* updating rugged
2017-01-31 15:08:52 -08:00
Brandon Black
3719214aba fixing null reference in yarn.lock check (#3444) 2017-01-31 14:45:22 -08:00
Paul Chaignon
47b109be36 Improve heuristic for Modula-2 (#3434)
Module names can contain dots
2017-01-24 15:10:46 -08:00
Javier Honduvilla Coto
1ec4db97c2 Be able to configure the number of threads for git submodules update (#3438)
* make the number of submodule update threads configurable

* change thread number to be a script argument
2017-01-24 09:55:31 -08:00
Brandon Black
9fe5fe0de2 v5.0.3 Release (#3436)
* bumping to v5.0.3

* updating grammars
2017-01-23 20:09:26 -08:00
sunderls
b36ea7ac9d Add yarn (#3432)
* add yarn.lock

* fix comment

* remove yarn test

* add test

* fix test

* try fix again

* try 3rd time

* check filename and firstline for yarn lockfile
2017-01-23 10:58:53 -08:00
Yuki Izumi
625b06c30d Use textmate/diff.tmbundle again (#3429)
Upstream textmate/diff.tmbundle#6 was merged.
2017-01-17 17:02:10 +11:00
Brandon Black
28bce533b2 Release v5.0.2 (#3427)
* updated grammars

* bumping version

* adding .gem files to gitignore
2017-01-11 16:08:31 -08:00
John Gardner
93ec1922cb Swap grammar used for CSS highlighting (#3426)
* Swap grammar used for CSS highlighting

* Whitelist license of Atom's CSS grammar

* Explicitly declare grammar as MIT-licensed

Source: https://github.com/atom/language-css/blob/5d4af/package.json#L14
2017-01-11 16:16:25 +11:00
Yuki Izumi
5d09fb67dd Allow for split(",") returning nil (#3424) 2017-01-10 11:44:24 +11:00
Arfon Smith
93dcb61742 Removing references to @arfon (#3423) 2017-01-09 11:54:55 -08:00
Brandon Black
3a03594685 bumping to v5.0.1 (#3421) 2017-01-08 23:30:56 -08:00
Brandon Black
5ce2c254f9 purging vestigial search term references 2017-01-08 23:08:16 -08:00
Brandon Black
d7814c4899 fixing incompatibility with latest rugged 2017-01-08 22:59:00 -08:00
Brandon Black
50c08bf29e updating grammars 2017-01-08 22:29:01 -08:00
Yuki Izumi
34928baee6 Use https://github.com/textmate/diff.tmbundle/pull/6 (#3420) 2017-01-08 21:53:14 -08:00
USAMI Kenta
27bb41aa4d Add Cask file as Emacs Lisp (#3416)
* Add Cask file as Emacs Lisp

* Replace Cask file (original is zonuexe/composer.el)
2017-01-04 11:26:20 -08:00
Brandon Black
1415f4b52d fixing grammar file pedantry 2017-01-03 17:23:56 -08:00
Arie Kurniawan
ae8ffcad22 change http to https
fix the little flaws found on http protocol that is used,
one of the web using the http protocol which is already supporting more secure protocol,
which is https
2017-01-03 17:19:58 -08:00
Brandon Black
f43633bf10 fixing license for atom-language-rust 2017-01-03 17:02:25 -08:00
Brandon Black
a604de9846 replacing atom grammar due to ST2 compatibility change 2017-01-03 16:46:02 -08:00
Brandon Black
3e224e0039 updating grammars 2017-01-03 16:33:46 -08:00
Christopher Gilbert
15b04f86c3 Amended license file for SublimeEthereum language grammar 2017-01-03 16:13:27 -08:00
Christopher Gilbert
42af436c20 Added grammar for Solidity programming language 2017-01-03 16:13:27 -08:00
Christopher Gilbert
2b08c66f0b Added grammar for Solidity programming language 2017-01-03 16:13:27 -08:00
Zach Brock
f98ab593fb Detect Javascript files generated by Protocol Buffers. 2017-01-03 16:07:26 -08:00
Brandon Black
f951ec07de bin help cleanup 2017-01-03 15:52:22 -08:00
Vadim Markovtsev
e9ac71590f Add --json option to bin/linguist 2017-01-03 14:56:12 -08:00
Al Thomas
210cd19876 Add Genie programming language (#3396)
* Add Genie programming language

Genie was introduced in 2008 as part of the GNOME project:
https://wiki.gnome.org/Projects/Genie

It is a programming language that uses the Vala compiler to
produce native binaries. It has good bindings to C libraries
especially those that are part of the GObject world such as
Gtk+3 and GStreamer

* Change color for Genie so tests pass
2017-01-03 14:15:17 -08:00
Mate Lorincz
f473c555ac Update vendor.yml (#3382)
Exclude Realm and RealmSwift frameworks from language statistics.
2017-01-03 14:10:49 -08:00
Nate Whetsell
48e4394d87 Add Jison-generated JavaScript to generated files (#3393)
* Fix typos

* Add Jison-generated JavaScript to generated files
2017-01-03 14:08:29 -08:00
meganemura
e1ce88920d Fix add-grammar and convert-grammars (#3354)
* Skip removed grammar submodule

* Clean up old grammar from grammars and grammars.yml

* Clean up unused grammar license

Run `script/licensed`.
This was missing change in 12f9295 of #3350.

* Clean up license files when we replace grammar

Update license files by running `script/licensed`.
Since we replace grammar, the old grammar license must be removed
and new grammar license must be added.
2017-01-03 13:57:46 -08:00
Paul Chaignon
675cee1d72 Improve the .pl Prolog heuristic rule (#3409)
:- can be directly at the start of a line
2017-01-03 13:54:47 -08:00
yutannihilation
1c4baf6dc2 ignore roxygen2-generated files (#3373) 2017-01-03 13:31:04 -08:00
Samantha McVey
8f2820e9cc Add XCompose language and highlighter (#3402)
* Add XCompose language and highlighter

* XCompose fix some errors in the Travis build

* Remove xmodmap files for XCompose

Most xmodmap files aren't XCompose, and there's not enough xmodmap files
which are XCompose to be worth adding to heuristics

* Remove some extensions/filenames from XCompose

* Rename and move sample to correct folder and filename

That we have added in languages.yml

* Use generated language id
2017-01-03 13:29:00 -08:00
Danila Malyutin
04c268e535 Add mysql extension for sql scripts (#3413) 2017-01-03 11:47:19 -08:00
Paul Chaignon
ec749b3f8d Remove the Hy grammar (#3411)
The grammar repository was recently deleted
2017-01-03 11:38:44 -08:00
Samantha McVey
08b63e7033 Change repository for Perl 6 grammar 2016-12-24 00:58:21 +01:00
Darin Morrison
7867b946b9 Add support for Reason (#3336) 2016-12-22 17:03:18 -08:00
212 changed files with 19582 additions and 292 deletions

1
.gitignore vendored
View File

@@ -1,3 +1,4 @@
*.gem
/Gemfile.lock
.bundle/
.idea

65
.gitmodules vendored
View File

@@ -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
@@ -130,9 +127,6 @@
[submodule "vendor/grammars/Sublime-Text-2-OpenEdge-ABL"]
path = vendor/grammars/Sublime-Text-2-OpenEdge-ABL
url = https://github.com/jfairbank/Sublime-Text-2-OpenEdge-ABL
[submodule "vendor/grammars/sublime-rust"]
path = vendor/grammars/sublime-rust
url = https://github.com/jhasse/sublime-rust
[submodule "vendor/grammars/sublime-befunge"]
path = vendor/grammars/sublime-befunge
url = https://github.com/johanasplund/sublime-befunge
@@ -180,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
@@ -247,9 +241,6 @@
[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
@@ -339,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
@@ -443,9 +434,6 @@
[submodule "vendor/grammars/Sublime-Nit"]
path = vendor/grammars/Sublime-Nit
url = https://github.com/R4PaSs/Sublime-Nit
[submodule "vendor/grammars/language-hy"]
path = vendor/grammars/language-hy
url = https://github.com/rwtolbert/language-hy
[submodule "vendor/grammars/Racket"]
path = vendor/grammars/Racket
url = https://github.com/soegaard/racket-highlight-for-github
@@ -623,9 +611,6 @@
[submodule "vendor/grammars/language-yang"]
path = vendor/grammars/language-yang
url = https://github.com/DzonyKalafut/language-yang.git
[submodule "vendor/grammars/perl6fe"]
path = vendor/grammars/perl6fe
url = https://github.com/MadcapJake/language-perl6fe.git
[submodule "vendor/grammars/language-less"]
path = vendor/grammars/language-less
url = https://github.com/atom/language-less.git
@@ -809,4 +794,48 @@
[submodule "vendor/grammars/rascal-syntax-highlighting"]
path = vendor/grammars/rascal-syntax-highlighting
url = https://github.com/usethesource/rascal-syntax-highlighting
[submodule "vendor/grammars/atom-language-perl6"]
path = vendor/grammars/atom-language-perl6
url = https://github.com/perl6/atom-language-perl6
[submodule "vendor/grammars/reason"]
path = vendor/grammars/reason
url = https://github.com/facebook/reason
[submodule "vendor/grammars/language-xcompose"]
path = vendor/grammars/language-xcompose
url = https://github.com/samcv/language-xcompose
[submodule "vendor/grammars/SublimeEthereum"]
path = vendor/grammars/SublimeEthereum
url = https://github.com/davidhq/SublimeEthereum.git
[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

View File

@@ -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

View File

@@ -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: [![Build Status](https://api.travis-ci.org/gith
Linguist is maintained with :heart: by:
- **@Alhadis**
- **@arfon**
- **@brandonblack** (GitHub staff)
- **@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

View File

@@ -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

View File

@@ -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
```

View File

@@ -4,6 +4,7 @@ require 'rake/testtask'
require 'yaml'
require 'yajl'
require 'open-uri'
require 'json'
task :default => :test

View File

@@ -1,5 +1,7 @@
#!/usr/bin/env ruby
$LOAD_PATH[0, 0] = File.join(File.dirname(__FILE__), '..', 'lib')
require 'linguist'
require 'rugged'
require 'optparse'
@@ -102,10 +104,16 @@ def git_linguist(args)
commit = nil
parser = OptionParser.new do |opts|
opts.banner = "Usage: git-linguist [OPTIONS] stats|breakdown|dump-cache|clear|disable"
opts.banner = <<-HELP
Linguist v#{Linguist::VERSION}
Detect language type and determine language breakdown for a given Git repository.
Usage:
git-linguist [OPTIONS] stats|breakdown|dump-cache|clear|disable"
HELP
opts.on("-f", "--force", "Force a full rescan") { incremental = false }
opts.on("--commit=COMMIT", "Commit to index") { |v| commit = v}
opts.on("-c", "--commit=COMMIT", "Commit to index") { |v| commit = v}
end
parser.parse!(args)

View File

@@ -1,29 +1,37 @@
#!/usr/bin/env ruby
# linguist — detect language type for a file, or, given a directory, determine language breakdown
# usage: linguist <path> [<--breakdown>]
#
$LOAD_PATH[0, 0] = File.join(File.dirname(__FILE__), '..', 'lib')
require 'linguist'
require 'rugged'
require 'json'
require 'optparse'
path = ARGV[0] || Dir.pwd
# special case if not given a directory but still given the --breakdown option
# special case if not given a directory
# but still given the --breakdown or --json options/
if path == "--breakdown"
path = Dir.pwd
breakdown = true
elsif path == "--json"
path = Dir.pwd
json_breakdown = true
end
ARGV.shift
breakdown = true if ARGV[0] == "--breakdown"
json_breakdown = true if ARGV[0] == "--json"
if File.directory?(path)
rugged = Rugged::Repository.new(path)
repo = Linguist::Repository.new(rugged, rugged.head.target_id)
repo.languages.sort_by { |_, size| size }.reverse.each do |language, size|
percentage = ((size / repo.size.to_f) * 100)
percentage = sprintf '%.2f' % percentage
puts "%-7s %s" % ["#{percentage}%", language]
if !json_breakdown
repo.languages.sort_by { |_, size| size }.reverse.each do |language, size|
percentage = ((size / repo.size.to_f) * 100)
percentage = sprintf '%.2f' % percentage
puts "%-7s %s" % ["#{percentage}%", language]
end
end
if breakdown
puts
@@ -35,6 +43,8 @@ if File.directory?(path)
end
puts
end
elsif json_breakdown
puts JSON.dump(repo.breakdown_by_file)
end
elsif File.file?(path)
blob = Linguist::FileBlob.new(path, Dir.pwd)
@@ -63,5 +73,12 @@ elsif File.file?(path)
puts " appears to be a vendored file"
end
else
abort "usage: linguist <path>"
abort <<-HELP
Linguist v#{Linguist::VERSION}
Detect language type for a file, or, given a repository, determine language breakdown.
Usage: linguist <path>
linguist <path> [--breakdown] [--json]
linguist [--breakdown] [--json]
HELP
end

View File

@@ -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.23.0b'
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

View File

@@ -1,9 +1,9 @@
---
http://svn.edgewall.org/repos/genshi/contrib/textmate/Genshi.tmbundle/Syntaxes/Markup%20Template%20%28XML%29.tmLanguage:
- text.xml.genshi
https://bitbucket.org/Clams/sublimesystemverilog/get/default.tar.gz:
- source.systemverilog
- source.ucfconstraints
https://svn.edgewall.org/repos/genshi/contrib/textmate/Genshi.tmbundle/Syntaxes/Markup%20Template%20%28XML%29.tmLanguage:
- text.xml.genshi
vendor/grammars/ABNF.tmbundle:
- source.abnf
vendor/grammars/Agda.tmbundle:
@@ -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:
@@ -113,7 +115,9 @@ vendor/grammars/SublimeBrainfuck:
- source.bf
vendor/grammars/SublimeClarion:
- source.clarion
vendor/grammars/SublimeGDB:
vendor/grammars/SublimeEthereum:
- source.solidity
vendor/grammars/SublimeGDB/:
- source.disasm
- source.gdb
- source.gdb.session
@@ -128,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:
@@ -178,8 +184,18 @@ 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
- source.quoting.perl6fe
- source.regexp.perl6fe
vendor/grammars/atom-language-purescript:
- source.purescript
vendor/grammars/atom-language-rust:
- source.rust
vendor/grammars/atom-language-srt:
- text.srt
vendor/grammars/atom-language-stan:
@@ -211,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
@@ -225,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
@@ -360,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:
@@ -384,14 +399,19 @@ vendor/grammars/language-haskell:
- source.haskell
- source.hsc2hs
- text.tex.latex.haskell
vendor/grammars/language-hy:
- source.hy
vendor/grammars/language-inform7:
- source.inform7
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
@@ -399,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
@@ -436,6 +460,8 @@ vendor/grammars/language-wavefront:
- source.wavefront.obj
vendor/grammars/language-xbase:
- source.harbour
vendor/grammars/language-xcompose:
- config.xcompose
vendor/grammars/language-yaml:
- source.yaml
vendor/grammars/language-yang:
@@ -465,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:
@@ -502,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:
@@ -513,10 +543,6 @@ vendor/grammars/pawn-sublime-language:
vendor/grammars/perl.tmbundle:
- source.perl
- source.perl.6
vendor/grammars/perl6fe:
- source.meta-info
- source.perl6fe
- source.regexp.perl6fe
vendor/grammars/php-smarty.tmbundle:
- text.html.smarty
vendor/grammars/php.tmbundle:
@@ -541,6 +567,8 @@ vendor/grammars/r.tmbundle:
- text.tex.latex.rd
vendor/grammars/rascal-syntax-highlighting:
- source.rascal
vendor/grammars/reason:
- source.reason
vendor/grammars/ruby-slim.tmbundle:
- text.slim
vendor/grammars/ruby.tmbundle:
@@ -560,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:
@@ -608,8 +639,6 @@ vendor/grammars/sublime-rexx:
- source.rexx
vendor/grammars/sublime-robot-plugin:
- text.robot
vendor/grammars/sublime-rust:
- source.rust
vendor/grammars/sublime-spintools:
- source.regexp.spin
- source.spin

View File

@@ -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:

View File

@@ -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 = {}

View File

@@ -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?/

View File

@@ -3,7 +3,7 @@ module Linguist
# Public: Is the blob a generated file?
#
# name - String filename
# data - String blob data. A block also maybe passed in for lazy
# data - String blob data. A block also may be passed in for lazy
# loading. This behavior is deprecated and you should always
# pass in a String.
#
@@ -70,6 +70,7 @@ module Linguist
compiled_cython_file? ||
generated_go? ||
generated_protocol_buffer? ||
generated_javascript_protocol_buffer? ||
generated_apache_thrift? ||
generated_jni_header? ||
vcr_cassette? ||
@@ -77,7 +78,10 @@ module Linguist
generated_unity3d_meta? ||
generated_racc? ||
generated_jflex? ||
generated_grammarkit?
generated_grammarkit? ||
generated_roxygen2? ||
generated_jison? ||
generated_yarn_lock?
end
# Internal: Is the blob an Xcode file?
@@ -275,6 +279,17 @@ module Linguist
return lines[0].include?("Generated by the protocol buffer compiler. DO NOT EDIT!")
end
# Internal: Is the blob a Javascript source file generated by the
# Protocol Buffer compiler?
#
# Returns true of false.
def generated_javascript_protocol_buffer?
return false unless extname == ".js"
return false unless lines.count > 6
return lines[5].include?("GENERATED CODE -- DO NOT EDIT!")
end
APACHE_THRIFT_EXTENSIONS = ['.rb', '.py', '.go', '.js', '.m', '.java', '.h', '.cc', '.cpp', '.php']
# Internal: Is the blob generated by Apache Thrift compiler?
@@ -311,7 +326,7 @@ module Linguist
!!name.match(/vendor\/((?!-)[-0-9A-Za-z]+(?<!-)\.)+(com|edu|gov|in|me|net|org|fm|io)/)
end
# Internal: Is the blob a generated npm shrinkwrap file.
# Internal: Is the blob a generated npm shrinkwrap file?
#
# Returns true or false.
def npm_shrinkwrap?
@@ -333,7 +348,7 @@ module Linguist
!!name.match(/composer\.lock/)
end
# Internal: Is the blob a generated by Zephir
# Internal: Is the blob generated by Zephir?
#
# Returns true or false.
def generated_by_zephir?
@@ -433,5 +448,46 @@ module Linguist
return false unless lines.count > 1
return lines[0].start_with?("// This is a generated file. Not intended for manual editing.")
end
# Internal: Is this a roxygen2-generated file?
#
# A roxygen2-generated file typically contain:
# % Generated by roxygen2: do not edit by hand
# on the first line.
#
# Return true or false
def generated_roxygen2?
return false unless extname == '.Rd'
return false unless lines.count > 1
return lines[0].include?("% Generated by roxygen2: do not edit by hand")
end
# Internal: Is this a Jison-generated file?
#
# Jison-generated parsers typically contain:
# /* parser generated by jison
# on the first line.
#
# Jison-generated lexers typically contain:
# /* generated by jison-lex
# on the first line.
#
# Return true or false
def generated_jison?
return false unless extname == '.js'
return false unless lines.count > 1
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

View File

@@ -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
@@ -326,7 +335,7 @@ module Linguist
end
disambiguate ".pl" do |data|
if /^[^#]+:-/.match(data)
if /^[^#]*:-/.match(data)
Language["Prolog"]
elsif /use strict|use\s+v?5\./.match(data)
Language["Perl"]
@@ -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

View File

@@ -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
@@ -265,7 +272,7 @@ module Linguist
@color = attributes[:color]
# Set aliases
@aliases = [default_alias_name] + (attributes[:aliases] || [])
@aliases = [default_alias] + (attributes[:aliases] || [])
# Load the TextMate scope name or try to guess one
@tm_scope = attributes[:tm_scope] || begin
@@ -283,9 +290,6 @@ module Linguist
@codemirror_mime_type = attributes[:codemirror_mime_type]
@wrap = attributes[:wrap] || false
# Set legacy search term
@search_term = attributes[:search_term] || default_alias_name
# Set the language_id
@language_id = attributes[:language_id]
@@ -437,12 +441,13 @@ module Linguist
EscapeUtils.escape_url(name).gsub('+', '%20')
end
# Internal: Get default alias name
# Public: Get default alias name
#
# Returns the alias name String
def default_alias_name
def default_alias
name.downcase.gsub(/\s/, '-')
end
alias_method :default_alias_name, :default_alias
# Public: Get Language group
#
@@ -557,7 +562,6 @@ module Linguist
:wrap => options['wrap'],
:group_name => options['group'],
:searchable => options.fetch('searchable', true),
:search_term => options['search_term'],
:language_id => options['language_id'],
:extensions => Array(options['extensions']),
:interpreters => options['interpreters'].sort,

View File

@@ -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.
@@ -499,6 +500,7 @@ C++:
- ".inc"
- ".inl"
- ".ipp"
- ".re"
- ".tcc"
- ".tpp"
language_id: 43
@@ -1120,6 +1122,7 @@ Emacs Lisp:
- ".gnus"
- ".spacemacs"
- ".viper"
- Cask
- Project.ede
- _emacs
- abbrev_defs
@@ -1154,6 +1157,7 @@ Erlang:
- ".xrl"
- ".yrl"
filenames:
- Emakefile
- rebar.config
- rebar.config.lock
- rebar.lock
@@ -1384,6 +1388,14 @@ Game Maker Language:
codemirror_mode: clike
codemirror_mime_type: text/x-c++src
language_id: 125
Genie:
type: programming
ace_mode: text
extensions:
- ".gs"
color: "#fb855d"
tm_scope: none
language_id: 792408528
Genshi:
type: programming
extensions:
@@ -1577,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
@@ -1595,7 +1608,7 @@ HTML:
ace_mode: html
codemirror_mode: htmlmixed
codemirror_mime_type: text/html
color: "#e44b23"
color: "#e34c26"
aliases:
- xhtml
extensions:
@@ -1754,7 +1767,7 @@ Hy:
- ".hy"
aliases:
- hylang
tm_scope: source.hy
tm_scope: none
language_id: 159
HyPhy:
type: programming
@@ -2012,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:
@@ -2281,6 +2321,8 @@ LookML:
color: "#652B81"
extensions:
- ".lookml"
- ".model.lkml"
- ".view.lkml"
tm_scope: source.yaml
language_id: 211
LoomScript:
@@ -2427,6 +2469,8 @@ Mako:
language_id: 221
Markdown:
type: prose
aliases:
- pandoc
ace_mode: markdown
codemirror_mode: gfm
codemirror_mime_type: text/x-gfm
@@ -2434,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"
@@ -2524,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"
@@ -2892,7 +2960,7 @@ OpenSCAD:
type: programming
extensions:
- ".scad"
tm_scope: none
tm_scope: source.scad
ace_mode: scad
language_id: 266
OpenType Feature File:
@@ -2939,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"
@@ -2984,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
@@ -3216,6 +3301,7 @@ PowerBuilder:
language_id: 292
PowerShell:
type: programming
color: "#012456"
ace_mode: powershell
codemirror_mode: powershell
codemirror_mime_type: application/x-powershell
@@ -3343,6 +3429,7 @@ Python:
- ".lmi"
- ".py3"
- ".pyde"
- ".pyi"
- ".pyp"
- ".pyt"
- ".pyw"
@@ -3358,6 +3445,7 @@ Python:
- SConscript
- SConstruct
- Snakefile
- WORKSPACE
- wscript
interpreters:
- python
@@ -3548,6 +3636,19 @@ Raw token data:
tm_scope: none
ace_mode: text
language_id: 318
Reason:
type: programming
group: OCaml
ace_mode: rust
codemirror_mode: rust
codemirror_mime_type: text/x-rustsrc
extensions:
- ".re"
- ".rei"
interpreters:
- ocaml
tm_scope: source.reason
language_id: 869538413
Rebol:
type: programming
color: "#358a5b"
@@ -3578,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:
@@ -3666,10 +3778,10 @@ Ruby:
extensions:
- ".rb"
- ".builder"
- ".eye"
- ".fcgi"
- ".gemspec"
- ".god"
- ".irbrc"
- ".jbuilder"
- ".mspec"
- ".pluginspec"
@@ -3691,6 +3803,7 @@ Ruby:
- jruby
- rbx
filenames:
- ".irbrc"
- ".pryrc"
- Appraisals
- Berksfile
@@ -3706,6 +3819,7 @@ Ruby:
- Mavenfile
- Podfile
- Puppetfile
- Rakefile
- Snapfile
- Thorfile
- Vagrantfile
@@ -3790,6 +3904,7 @@ SQL:
- ".cql"
- ".ddl"
- ".inc"
- ".mysql"
- ".prc"
- ".tab"
- ".udf"
@@ -3923,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"
@@ -4274,12 +4396,16 @@ Text:
- ".no"
filenames:
- COPYING
- COPYRIGHT.regex
- FONTLOG
- INSTALL
- INSTALL.mysql
- LICENSE
- LICENSE.mysql
- NEWS
- README.1ST
- README.me
- README.mysql
- click.me
- delete.me
- keep.me
@@ -4566,6 +4692,15 @@ XC:
codemirror_mode: clike
codemirror_mime_type: text/x-csrc
language_id: 398
XCompose:
type: data
filenames:
- ".XCompose"
- XCompose
- xcompose
tm_scope: config.xcompose
ace_mode: text
language_id: 225167241
XML:
type: data
ace_mode: xml
@@ -4577,6 +4712,8 @@ XML:
- wsdl
extensions:
- ".xml"
- ".adml"
- ".admx"
- ".ant"
- ".axml"
- ".builds"
@@ -4604,6 +4741,7 @@ XML:
- ".kml"
- ".launch"
- ".mdpolicy"
- ".mjml"
- ".mm"
- ".mod"
- ".mxml"
@@ -4642,8 +4780,11 @@ XML:
- ".ux"
- ".vbproj"
- ".vcxproj"
- ".vsixmanifest"
- ".vssettings"
- ".vstemplate"
- ".vxml"
- ".wixproj"
- ".wsdl"
- ".wsf"
- ".wxi"
@@ -4759,6 +4900,7 @@ YAML:
- ".syntax"
- ".yaml"
- ".yaml-tmlanguage"
- ".yml.mysql"
filenames:
- ".clang-format"
ace_mode: yaml

View File

@@ -238,6 +238,12 @@
# BuddyBuild
- BuddyBuildSDK.framework/
# Realm
- Realm.framework
# RealmSwift
- RealmSwift.framework
# git config files
- gitattributes$
- gitignore$

View File

@@ -1,3 +1,3 @@
module Linguist
VERSION = "5.0.0"
VERSION = "5.0.9"
end

View File

@@ -0,0 +1,46 @@
#include <iostream>
#define YYCTYPE unsigned char
#define YYCURSOR cursor
#define YYLIMIT cursor
#define YYMARKER marker
#define YYFILL(n)
bool scan(const char *text)
{
YYCTYPE *start = (YYCTYPE *)text;
YYCTYPE *cursor = (YYCTYPE *)text;
YYCTYPE *marker = (YYCTYPE *)text;
next:
YYCTYPE *token = cursor;
/*!re2c
'(This file must be converted with BinHex 4.0)'
{
if (token == start || *(token - 1) == '\n')
return true; else goto next;
}
[\001-\377]
{ goto next; }
[\000]
{ return false; }
*/
return false;
}
#define do_scan(str, expect) \
res = scan(str) == expect ? 0 : 1; \
std::cerr << str << "\t-\t" << (res ? "fail" : "ok") << std::endl; \
result += res
/*!max:re2c */
int main(int,void**)
{
int res, result = 0;
do_scan("(This file must be converted with BinHex 4.0)", 1);
do_scan("x(This file must be converted with BinHex 4.0)", 0);
do_scan("(This file must be converted with BinHex 4.0)x", 1);
do_scan("x(This file must be converted with BinHex 4.0)x", 0);
return result;
}

239
samples/C++/cnokw.re Normal file
View File

@@ -0,0 +1,239 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define ADDEQ 257
#define ANDAND 258
#define ANDEQ 259
#define ARRAY 260
#define ASM 261
#define AUTO 262
#define BREAK 263
#define CASE 264
#define CHAR 265
#define CONST 266
#define CONTINUE 267
#define DECR 268
#define DEFAULT 269
#define DEREF 270
#define DIVEQ 271
#define DO 272
#define DOUBLE 273
#define ELLIPSIS 274
#define ELSE 275
#define ENUM 276
#define EQL 277
#define EXTERN 278
#define FCON 279
#define FLOAT 280
#define FOR 281
#define FUNCTION 282
#define GEQ 283
#define GOTO 284
#define ICON 285
#define ID 286
#define IF 287
#define INCR 288
#define INT 289
#define LEQ 290
#define LONG 291
#define LSHIFT 292
#define LSHIFTEQ 293
#define MODEQ 294
#define MULEQ 295
#define NEQ 296
#define OREQ 297
#define OROR 298
#define POINTER 299
#define REGISTER 300
#define RETURN 301
#define RSHIFT 302
#define RSHIFTEQ 303
#define SCON 304
#define SHORT 305
#define SIGNED 306
#define SIZEOF 307
#define STATIC 308
#define STRUCT 309
#define SUBEQ 310
#define SWITCH 311
#define TYPEDEF 312
#define UNION 313
#define UNSIGNED 314
#define VOID 315
#define VOLATILE 316
#define WHILE 317
#define XOREQ 318
#define EOI 319
typedef unsigned int uint;
typedef unsigned char uchar;
#define BSIZE 8192
#define YYCTYPE uchar
#define YYCURSOR cursor
#define YYLIMIT s->lim
#define YYMARKER s->ptr
#define YYFILL(n) {cursor = fill(s, cursor);}
#define RET(i) {s->cur = cursor; return i;}
typedef struct Scanner {
int fd;
uchar *bot, *tok, *ptr, *cur, *pos, *lim, *top, *eof;
uint line;
} Scanner;
uchar *fill(Scanner *s, uchar *cursor){
if(!s->eof){
uint cnt = s->tok - s->bot;
if(cnt){
memcpy(s->bot, s->tok, s->lim - s->tok);
s->tok = s->bot;
s->ptr -= cnt;
cursor -= cnt;
s->pos -= cnt;
s->lim -= cnt;
}
if((s->top - s->lim) < BSIZE){
uchar *buf = (uchar*) malloc(((s->lim - s->bot) + BSIZE)*sizeof(uchar));
memcpy(buf, s->tok, s->lim - s->tok);
s->tok = buf;
s->ptr = &buf[s->ptr - s->bot];
cursor = &buf[cursor - s->bot];
s->pos = &buf[s->pos - s->bot];
s->lim = &buf[s->lim - s->bot];
s->top = &s->lim[BSIZE];
free(s->bot);
s->bot = buf;
}
if((cnt = read(s->fd, (char*) s->lim, BSIZE)) != BSIZE){
s->eof = &s->lim[cnt]; *(s->eof)++ = '\n';
}
s->lim += cnt;
}
return cursor;
}
int scan(Scanner *s){
uchar *cursor = s->cur;
std:
s->tok = cursor;
/*!re2c
any = [\000-\377];
O = [0-7];
D = [0-9];
L = [a-zA-Z_];
H = [a-fA-F0-9];
E = [Ee] [+-]? D+;
FS = [fFlL];
IS = [uUlL]*;
ESC = [\\] ([abfnrtv?'"\\] | "x" H+ | O+);
*/
/*!re2c
"/*" { goto comment; }
L (L|D)* { RET(ID); }
("0" [xX] H+ IS?) | ("0" D+ IS?) | (D+ IS?) |
(['] (ESC|any\[\n\\'])* ['])
{ RET(ICON); }
(D+ E FS?) | (D* "." D+ E? FS?) | (D+ "." D* E? FS?)
{ RET(FCON); }
(["] (ESC|any\[\n\\"])* ["])
{ RET(SCON); }
"..." { RET(ELLIPSIS); }
">>=" { RET(RSHIFTEQ); }
"<<=" { RET(LSHIFTEQ); }
"+=" { RET(ADDEQ); }
"-=" { RET(SUBEQ); }
"*=" { RET(MULEQ); }
"/=" { RET(DIVEQ); }
"%=" { RET(MODEQ); }
"&=" { RET(ANDEQ); }
"^=" { RET(XOREQ); }
"|=" { RET(OREQ); }
">>" { RET(RSHIFT); }
"<<" { RET(LSHIFT); }
"++" { RET(INCR); }
"--" { RET(DECR); }
"->" { RET(DEREF); }
"&&" { RET(ANDAND); }
"||" { RET(OROR); }
"<=" { RET(LEQ); }
">=" { RET(GEQ); }
"==" { RET(EQL); }
"!=" { RET(NEQ); }
";" { RET(';'); }
"{" { RET('{'); }
"}" { RET('}'); }
"," { RET(','); }
":" { RET(':'); }
"=" { RET('='); }
"(" { RET('('); }
")" { RET(')'); }
"[" { RET('['); }
"]" { RET(']'); }
"." { RET('.'); }
"&" { RET('&'); }
"!" { RET('!'); }
"~" { RET('~'); }
"-" { RET('-'); }
"+" { RET('+'); }
"*" { RET('*'); }
"/" { RET('/'); }
"%" { RET('%'); }
"<" { RET('<'); }
">" { RET('>'); }
"^" { RET('^'); }
"|" { RET('|'); }
"?" { RET('?'); }
[ \t\v\f]+ { goto std; }
"\n"
{
if(cursor == s->eof) RET(EOI);
s->pos = cursor; s->line++;
goto std;
}
any
{
printf("unexpected character: %c\n", *s->tok);
goto std;
}
*/
comment:
/*!re2c
"*/" { goto std; }
"\n"
{
if(cursor == s->eof) RET(EOI);
s->tok = s->pos = cursor; s->line++;
goto comment;
}
any { goto comment; }
*/
}
main(){
Scanner in;
int t;
memset((char*) &in, 0, sizeof(in));
in.fd = 0;
while((t = scan(&in)) != EOI){
/*
printf("%d\t%.*s\n", t, in.cur - in.tok, in.tok);
printf("%d\n", t);
*/
}
close(in.fd);
}

63
samples/C++/cvsignore.re Normal file
View File

@@ -0,0 +1,63 @@
#define YYFILL(n) if (cursor >= limit) break;
#define YYCTYPE char
#define YYCURSOR cursor
#define YYLIMIT limit
#define YYMARKER marker
/*!re2c
any = (.|"\n");
value = (":" (.\"$")+)?;
cvsdat = "Date";
cvsid = "Id";
cvslog = "Log";
cvsrev = "Revision";
cvssrc = "Source";
*/
#define APPEND(text) \
append(output, outsize, text, sizeof(text) - sizeof(YYCTYPE))
inline void append(YYCTYPE *output, size_t & outsize, const YYCTYPE * text, size_t len)
{
memcpy(output + outsize, text, len);
outsize += (len / sizeof(YYCTYPE));
}
void scan(YYCTYPE *pText, size_t *pSize, int *pbChanged)
{
// rule
// scan lines
// find $ in lines
// compact $<keyword>: .. $ to $<keyword>$
YYCTYPE *output;
const YYCTYPE *cursor, *limit, *marker;
cursor = marker = output = *pText;
size_t insize = *pSize;
size_t outsize = 0;
limit = cursor + insize;
while(1) {
loop:
/*!re2c
"$" cvsdat value "$" { APPEND(L"$" L"Date$"); goto loop; }
"$" cvsid value "$" { APPEND(L"$" L"Id$"); goto loop; }
"$" cvslog value "$" { APPEND(L"$" L"Log$"); goto loop; }
"$" cvsrev value "$" { APPEND(L"$" L"Revision$"); goto loop; }
"$" cvssrc value "$" { APPEND(L"$" L"Source$"); goto loop; }
any { output[outsize++] = cursor[-1]; if (cursor >= limit) break; goto loop; }
*/
}
output[outsize] = '\0';
// set the new size
*pSize = outsize;
*pbChanged = (insize == outsize) ? 0 : 1;
}

13
samples/C++/simple.re Normal file
View File

@@ -0,0 +1,13 @@
#define NULL ((char*) 0)
char *scan(char *p){
char *q;
#define YYCTYPE char
#define YYCURSOR p
#define YYLIMIT p
#define YYMARKER q
#define YYFILL(n)
/*!re2c
[0-9]+ {return YYCURSOR;}
[\000-\377] {return NULL;}
*/
}

440
samples/D/aa.d Normal file
View 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
View 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
View File

@@ -0,0 +1,3 @@
void foo()
{
}

6
samples/D/hello_world.d Normal file
View File

@@ -0,0 +1,6 @@
import std.stdio;
void main()
{
writeln("Hello World");
}

7
samples/D/template.d Normal file
View 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);
}

View File

@@ -0,0 +1,3 @@
void bar(T)(T t)
{
}

3
samples/D/unittest1.d Normal file
View File

@@ -0,0 +1,3 @@
unittest
{
}

3
samples/D/unittest2.d Normal file
View File

@@ -0,0 +1,3 @@
unittest("optional name")
{
}

View File

@@ -0,0 +1,9 @@
(package "composer" "0.0.7" "Interface to PHP Composer")
(source "melpa" "https://melpa.org/packages/")
(package-file "composer.el")
(depends-on "f")
(depends-on "s")
(depends-on "request")
(depends-on "seq")

View File

@@ -0,0 +1,7 @@
{"src/*", [
report,
verbose,
{i, "include"},
{outdir, "ebin"},
debug_info
]}.

161
samples/GLSL/SyLens.shader Normal file
View 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 );
}

View 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 Duikers 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);
}

12
samples/Genie/Class.gs Normal file
View File

@@ -0,0 +1,12 @@
init
new Demo( "Demonstration class" ).run()
class Demo
_message:string = ""
construct ( message:string = "Optional argument - no message passed in constructor" )
_message = message
def run()
print( _message )

2
samples/Genie/Hello.gs Normal file
View File

@@ -0,0 +1,2 @@
init
print( "Hello, World!" )

135
samples/HCL/main.tf Normal file
View 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
View 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__

View File

@@ -0,0 +1,923 @@
/* generated by jison-lex 0.3.4-159 */
var ccalcLex = (function () {
// See also:
// http://stackoverflow.com/questions/1382107/whats-a-good-way-to-extend-error-in-javascript/#35881508
// but we keep the prototype.constructor and prototype.name assignment lines too for compatibility
// with userland code which might access the derived class in a 'classic' way.
function JisonLexerError(msg, hash) {
Object.defineProperty(this, 'name', {
enumerable: false,
writable: false,
value: 'JisonLexerError'
});
if (msg == null) msg = '???';
Object.defineProperty(this, 'message', {
enumerable: false,
writable: true,
value: msg
});
this.hash = hash;
var stacktrace;
if (hash && hash.exception instanceof Error) {
var ex2 = hash.exception;
this.message = ex2.message || msg;
stacktrace = ex2.stack;
}
if (!stacktrace) {
if (Error.hasOwnProperty('captureStackTrace')) { // V8
Error.captureStackTrace(this, this.constructor);
} else {
stacktrace = (new Error(msg)).stack;
}
}
if (stacktrace) {
Object.defineProperty(this, 'stack', {
enumerable: false,
writable: false,
value: stacktrace
});
}
}
if (typeof Object.setPrototypeOf === 'function') {
Object.setPrototypeOf(JisonLexerError.prototype, Error.prototype);
} else {
JisonLexerError.prototype = Object.create(Error.prototype);
}
JisonLexerError.prototype.constructor = JisonLexerError;
JisonLexerError.prototype.name = 'JisonLexerError';
var lexer = {
EOF: 1,
ERROR: 2,
// JisonLexerError: JisonLexerError, // <-- injected by the code generator
// options: {}, // <-- injected by the code generator
// yy: ..., // <-- injected by setInput()
__currentRuleSet__: null, // <-- internal rule set cache for the current lexer state
__error_infos: [], // INTERNAL USE ONLY: the set of lexErrorInfo objects created since the last cleanup
__decompressed: false, // INTERNAL USE ONLY: mark whether the lexer instance has been 'unfolded' completely and is now ready for use
done: false, // INTERNAL USE ONLY
_backtrack: false, // INTERNAL USE ONLY
_input: '', // INTERNAL USE ONLY
_more: false, // INTERNAL USE ONLY
_signaled_error_token: false, // INTERNAL USE ONLY
conditionStack: [], // INTERNAL USE ONLY; managed via `pushState()`, `popState()`, `topState()` and `stateStackSize()`
match: '', // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: tracks input which has been matched so far for the lexer token under construction. `match` is identical to `yytext` except that this one still contains the matched input string after `lexer.performAction()` has been invoked, where userland code MAY have changed/replaced the `yytext` value entirely!
matched: '', // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: tracks entire input which has been matched so far
matches: false, // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: tracks RE match result for last (successful) match attempt
yytext: '', // ADVANCED USE ONLY: tracks input which has been matched so far for the lexer token under construction; this value is transferred to the parser as the 'token value' when the parser consumes the lexer token produced through a call to the `lex()` API.
offset: 0, // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: tracks the 'cursor position' in the input string, i.e. the number of characters matched so far
yyleng: 0, // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: length of matched input for the token under construction (`yytext`)
yylineno: 0, // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: 'line number' at which the token under construction is located
yylloc: null, // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: tracks location info (lines + columns) for the token under construction
// INTERNAL USE: construct a suitable error info hash object instance for `parseError`.
constructLexErrorInfo: function lexer_constructLexErrorInfo(msg, recoverable) {
var pei = {
errStr: msg,
recoverable: !!recoverable,
text: this.match, // This one MAY be empty; userland code should use the `upcomingInput` API to obtain more text which follows the 'lexer cursor position'...
token: null,
line: this.yylineno,
loc: this.yylloc,
yy: this.yy,
lexer: this,
// and make sure the error info doesn't stay due to potential
// ref cycle via userland code manipulations.
// These would otherwise all be memory leak opportunities!
//
// Note that only array and object references are nuked as those
// constitute the set of elements which can produce a cyclic ref.
// The rest of the members is kept intact as they are harmless.
destroy: function destructLexErrorInfo() {
// remove cyclic references added to error info:
// info.yy = null;
// info.lexer = null;
// ...
var rec = !!this.recoverable;
for (var key in this) {
if (this.hasOwnProperty(key) && typeof key === 'object') {
this[key] = undefined;
}
}
this.recoverable = rec;
}
};
// track this instance so we can `destroy()` it once we deem it superfluous and ready for garbage collection!
this.__error_infos.push(pei);
return pei;
},
parseError: function lexer_parseError(str, hash) {
if (this.yy.parser && typeof this.yy.parser.parseError === 'function') {
return this.yy.parser.parseError(str, hash) || this.ERROR;
} else if (typeof this.yy.parseError === 'function') {
return this.yy.parseError.call(this, str, hash) || this.ERROR;
} else {
throw new this.JisonLexerError(str);
}
},
// final cleanup function for when we have completed lexing the input;
// make it an API so that external code can use this one once userland
// code has decided it's time to destroy any lingering lexer error
// hash object instances and the like: this function helps to clean
// up these constructs, which *may* carry cyclic references which would
// otherwise prevent the instances from being properly and timely
// garbage-collected, i.e. this function helps prevent memory leaks!
cleanupAfterLex: function lexer_cleanupAfterLex(do_not_nuke_errorinfos) {
var rv;
// prevent lingering circular references from causing memory leaks:
this.setInput('', {});
// nuke the error hash info instances created during this run.
// Userland code must COPY any data/references
// in the error hash instance(s) it is more permanently interested in.
if (!do_not_nuke_errorinfos) {
for (var i = this.__error_infos.length - 1; i >= 0; i--) {
var el = this.__error_infos[i];
if (el && typeof el.destroy === 'function') {
el.destroy();
}
}
this.__error_infos.length = 0;
}
return this;
},
// clear the lexer token context; intended for internal use only
clear: function lexer_clear() {
this.yytext = '';
this.yyleng = 0;
this.match = '';
this.matches = false;
this._more = false;
this._backtrack = false;
},
// resets the lexer, sets new input
setInput: function lexer_setInput(input, yy) {
this.yy = yy || this.yy || {};
// also check if we've fully initialized the lexer instance,
// including expansion work to be done to go from a loaded
// lexer to a usable lexer:
if (!this.__decompressed) {
// step 1: decompress the regex list:
var rules = this.rules;
for (var i = 0, len = rules.length; i < len; i++) {
var rule_re = rules[i];
// compression: is the RE an xref to another RE slot in the rules[] table?
if (typeof rule_re === 'number') {
rules[i] = rules[rule_re];
}
}
// step 2: unfold the conditions[] set to make these ready for use:
var conditions = this.conditions;
for (var k in conditions) {
var spec = conditions[k];
var rule_ids = spec.rules;
var len = rule_ids.length;
var rule_regexes = new Array(len + 1); // slot 0 is unused; we use a 1-based index approach here to keep the hottest code in `lexer_next()` fast and simple!
var rule_new_ids = new Array(len + 1);
if (this.rules_prefix1) {
var rule_prefixes = new Array(65536);
var first_catch_all_index = 0;
for (var i = 0; i < len; i++) {
var idx = rule_ids[i];
var rule_re = rules[idx];
rule_regexes[i + 1] = rule_re;
rule_new_ids[i + 1] = idx;
var prefix = this.rules_prefix1[idx];
// compression: is the PREFIX-STRING an xref to another PREFIX-STRING slot in the rules_prefix1[] table?
if (typeof prefix === 'number') {
prefix = this.rules_prefix1[prefix];
}
// init the prefix lookup table: first come, first serve...
if (!prefix) {
if (!first_catch_all_index) {
first_catch_all_index = i + 1;
}
} else {
for (var j = 0, pfxlen = prefix.length; j < pfxlen; j++) {
var pfxch = prefix.charCodeAt(j);
// first come, first serve:
if (!rule_prefixes[pfxch]) {
rule_prefixes[pfxch] = i + 1;
}
}
}
}
// if no catch-all prefix has been encountered yet, it means all
// rules have limited prefix sets and it MAY be that particular
// input characters won't be recognized by any rule in this
// condition state.
//
// To speed up their discovery at run-time while keeping the
// remainder of the lexer kernel code very simple (and fast),
// we point these to an 'illegal' rule set index *beyond*
// the end of the rule set.
if (!first_catch_all_index) {
first_catch_all_index = len + 1;
}
for (var i = 0; i < 65536; i++) {
if (!rule_prefixes[i]) {
rule_prefixes[i] = first_catch_all_index;
}
}
spec.__dispatch_lut = rule_prefixes;
} else {
for (var i = 0; i < len; i++) {
var idx = rule_ids[i];
var rule_re = rules[idx];
rule_regexes[i + 1] = rule_re;
rule_new_ids[i + 1] = idx;
}
}
spec.rules = rule_new_ids;
spec.__rule_regexes = rule_regexes;
spec.__rule_count = len;
}
this.__decompressed = true;
}
this._input = input || '';
this.clear();
this._signaled_error_token = false;
this.done = false;
this.yylineno = 0;
this.matched = '';
this.conditionStack = ['INITIAL'];
this.__currentRuleSet__ = null;
this.yylloc = {
first_line: 1,
first_column: 0,
last_line: 1,
last_column: 0
};
if (this.options.ranges) {
this.yylloc.range = [0, 0];
}
this.offset = 0;
return this;
},
// consumes and returns one char from the input
input: function lexer_input() {
if (!this._input) {
this.done = true;
return null;
}
var ch = this._input[0];
this.yytext += ch;
this.yyleng++;
this.offset++;
this.match += ch;
this.matched += ch;
// Count the linenumber up when we hit the LF (or a stand-alone CR).
// On CRLF, the linenumber is incremented when you fetch the CR or the CRLF combo
// and we advance immediately past the LF as well, returning both together as if
// it was all a single 'character' only.
var slice_len = 1;
var lines = false;
if (ch === '\n') {
lines = true;
} else if (ch === '\r') {
lines = true;
var ch2 = this._input[1];
if (ch2 === '\n') {
slice_len++;
ch += ch2;
this.yytext += ch2;
this.yyleng++;
this.offset++;
this.match += ch2;
this.matched += ch2;
if (this.options.ranges) {
this.yylloc.range[1]++;
}
}
}
if (lines) {
this.yylineno++;
this.yylloc.last_line++;
} else {
this.yylloc.last_column++;
}
if (this.options.ranges) {
this.yylloc.range[1]++;
}
this._input = this._input.slice(slice_len);
return ch;
},
// unshifts one char (or a string) into the input
unput: function lexer_unput(ch) {
var len = ch.length;
var lines = ch.split(/(?:\r\n?|\n)/g);
this._input = ch + this._input;
this.yytext = this.yytext.substr(0, this.yytext.length - len);
//this.yyleng -= len;
this.offset -= len;
var oldLines = this.match.split(/(?:\r\n?|\n)/g);
this.match = this.match.substr(0, this.match.length - len);
this.matched = this.matched.substr(0, this.matched.length - len);
if (lines.length - 1) {
this.yylineno -= lines.length - 1;
}
this.yylloc.last_line = this.yylineno + 1;
this.yylloc.last_column = (lines ?
(lines.length === oldLines.length ? this.yylloc.first_column : 0)
+ oldLines[oldLines.length - lines.length].length - lines[0].length :
this.yylloc.first_column - len);
if (this.options.ranges) {
this.yylloc.range[1] = this.yylloc.range[0] + this.yyleng - len;
}
this.yyleng = this.yytext.length;
this.done = false;
return this;
},
// When called from action, caches matched text and appends it on next action
more: function lexer_more() {
this._more = true;
return this;
},
// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
reject: function lexer_reject() {
if (this.options.backtrack_lexer) {
this._backtrack = true;
} else {
// when the parseError() call returns, we MUST ensure that the error is registered.
// We accomplish this by signaling an 'error' token to be produced for the current
// .lex() run.
var p = this.constructLexErrorInfo('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), false);
this._signaled_error_token = (this.parseError(p.errStr, p) || this.ERROR);
}
return this;
},
// retain first n characters of the match
less: function lexer_less(n) {
return this.unput(this.match.slice(n));
},
// return (part of the) already matched input, i.e. for error messages.
// Limit the returned string length to `maxSize` (default: 20).
// Limit the returned string to the `maxLines` number of lines of input (default: 1).
// Negative limit values equal *unlimited*.
pastInput: function lexer_pastInput(maxSize, maxLines) {
var past = this.matched.substring(0, this.matched.length - this.match.length);
if (maxSize < 0)
maxSize = past.length;
else if (!maxSize)
maxSize = 20;
if (maxLines < 0)
maxLines = past.length; // can't ever have more input lines than this!
else if (!maxLines)
maxLines = 1;
// `substr` anticipation: treat \r\n as a single character and take a little
// more than necessary so that we can still properly check against maxSize
// after we've transformed and limited the newLines in here:
past = past.substr(-maxSize * 2 - 2);
// now that we have a significantly reduced string to process, transform the newlines
// and chop them, then limit them:
var a = past.replace(/\r\n|\r/g, '\n').split('\n');
a = a.slice(-maxLines);
past = a.join('\n');
// When, after limiting to maxLines, we still have too much to return,
// do add an ellipsis prefix...
if (past.length > maxSize) {
past = '...' + past.substr(-maxSize);
}
return past;
},
// return (part of the) upcoming input, i.e. for error messages.
// Limit the returned string length to `maxSize` (default: 20).
// Limit the returned string to the `maxLines` number of lines of input (default: 1).
// Negative limit values equal *unlimited*.
upcomingInput: function lexer_upcomingInput(maxSize, maxLines) {
var next = this.match;
if (maxSize < 0)
maxSize = next.length + this._input.length;
else if (!maxSize)
maxSize = 20;
if (maxLines < 0)
maxLines = maxSize; // can't ever have more input lines than this!
else if (!maxLines)
maxLines = 1;
// `substring` anticipation: treat \r\n as a single character and take a little
// more than necessary so that we can still properly check against maxSize
// after we've transformed and limited the newLines in here:
if (next.length < maxSize * 2 + 2) {
next += this._input.substring(0, maxSize * 2 + 2); // substring is faster on Chrome/V8
}
// now that we have a significantly reduced string to process, transform the newlines
// and chop them, then limit them:
var a = next.replace(/\r\n|\r/g, '\n').split('\n');
a = a.slice(0, maxLines);
next = a.join('\n');
// When, after limiting to maxLines, we still have too much to return,
// do add an ellipsis postfix...
if (next.length > maxSize) {
next = next.substring(0, maxSize) + '...';
}
return next;
},
// return a string which displays the character position where the lexing error occurred, i.e. for error messages
showPosition: function lexer_showPosition(maxPrefix, maxPostfix) {
var pre = this.pastInput(maxPrefix).replace(/\s/g, ' ');
var c = new Array(pre.length + 1).join('-');
return pre + this.upcomingInput(maxPostfix).replace(/\s/g, ' ') + '\n' + c + '^';
},
// helper function, used to produce a human readable description as a string, given
// the input `yylloc` location object.
// Set `display_range_too` to TRUE to include the string character index position(s)
// in the description if the `yylloc.range` is available.
describeYYLLOC: function lexer_describe_yylloc(yylloc, display_range_too) {
var l1 = yylloc.first_line;
var l2 = yylloc.last_line;
var o1 = yylloc.first_column;
var o2 = yylloc.last_column - 1;
var dl = l2 - l1;
var d_o = (dl === 0 ? o2 - o1 : 1000);
var rv;
if (dl === 0) {
rv = 'line ' + l1 + ', ';
if (d_o === 0) {
rv += 'column ' + o1;
} else {
rv += 'columns ' + o1 + ' .. ' + o2;
}
} else {
rv = 'lines ' + l1 + '(column ' + o1 + ') .. ' + l2 + '(column ' + o2 + ')';
}
if (yylloc.range && display_range_too) {
var r1 = yylloc.range[0];
var r2 = yylloc.range[1] - 1;
if (r2 === r1) {
rv += ' {String Offset: ' + r1 + '}';
} else {
rv += ' {String Offset range: ' + r1 + ' .. ' + r2 + '}';
}
}
return rv;
// return JSON.stringify(yylloc);
},
// test the lexed token: return FALSE when not a match, otherwise return token.
//
// `match` is supposed to be an array coming out of a regex match, i.e. `match[0]`
// contains the actually matched text string.
//
// Also move the input cursor forward and update the match collectors:
// - yytext
// - yyleng
// - match
// - matches
// - yylloc
// - offset
test_match: function lexer_test_match(match, indexed_rule) {
var token,
lines,
backup,
match_str;
if (this.options.backtrack_lexer) {
// save context
backup = {
yylineno: this.yylineno,
yylloc: {
first_line: this.yylloc.first_line,
last_line: this.last_line,
first_column: this.yylloc.first_column,
last_column: this.yylloc.last_column
},
yytext: this.yytext,
match: this.match,
matches: this.matches,
matched: this.matched,
yyleng: this.yyleng,
offset: this.offset,
_more: this._more,
_input: this._input,
yy: this.yy,
conditionStack: this.conditionStack.slice(0),
done: this.done
};
if (this.options.ranges) {
backup.yylloc.range = this.yylloc.range.slice(0);
}
}
match_str = match[0];
lines = match_str.match(/(?:\r\n?|\n).*/g);
if (lines) {
this.yylineno += lines.length;
}
this.yylloc = {
first_line: this.yylloc.last_line,
last_line: this.yylineno + 1,
first_column: this.yylloc.last_column,
last_column: lines ?
lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length :
this.yylloc.last_column + match_str.length
};
this.yytext += match_str;
this.match += match_str;
this.matches = match;
this.yyleng = this.yytext.length;
if (this.options.ranges) {
this.yylloc.range = [this.offset, this.offset + this.yyleng];
}
// previous lex rules MAY have invoked the `more()` API rather than producing a token:
// those rules will already have moved this `offset` forward matching their match lengths,
// hence we must only add our own match length now:
this.offset += match_str.length;
this._more = false;
this._backtrack = false;
this._input = this._input.slice(match_str.length);
this.matched += match_str;
// calling this method:
//
// function lexer__performAction(yy, yy_, $avoiding_name_collisions, YY_START) {...}
token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1] /* = YY_START */);
// otherwise, when the action codes are all simple return token statements:
//token = this.simpleCaseActionClusters[indexed_rule];
if (this.done && this._input) {
this.done = false;
}
if (token) {
return token;
} else if (this._backtrack) {
// recover context
for (var k in backup) {
this[k] = backup[k];
}
this.__currentRuleSet__ = null;
return false; // rule action called reject() implying the next rule should be tested instead.
} else if (this._signaled_error_token) {
// produce one 'error' token as .parseError() in reject() did not guarantee a failure signal by throwing an exception!
token = this._signaled_error_token;
this._signaled_error_token = false;
return token;
}
return false;
},
// return next match in input
next: function lexer_next() {
if (this.done) {
this.clear();
return this.EOF;
}
if (!this._input) {
this.done = true;
}
var token,
match,
tempMatch,
index;
if (!this._more) {
this.clear();
}
var spec = this.__currentRuleSet__;
if (!spec) {
// Update the ruleset cache as we apparently encountered a state change or just started lexing.
// The cache is set up for fast lookup -- we assume a lexer will switch states much less often than it will
// invoke the `lex()` token-producing API and related APIs, hence caching the set for direct access helps
// speed up those activities a tiny bit.
spec = this.__currentRuleSet__ = this._currentRules();
}
var rule_ids = spec.rules;
// var dispatch = spec.__dispatch_lut;
var regexes = spec.__rule_regexes;
var len = spec.__rule_count;
// var c0 = this._input[0];
// Note: the arrays are 1-based, while `len` itself is a valid index,
// hence the non-standard less-or-equal check in the next loop condition!
//
// `dispatch` is a lookup table which lists the *first* rule which matches the 1-char *prefix* of the rule-to-match.
// By using that array as a jumpstart, we can cut down on the otherwise O(n*m) behaviour of this lexer, down to
// O(n) ideally, where:
//
// - N is the number of input particles -- which is not precisely characters
// as we progress on a per-regex-match basis rather than on a per-character basis
//
// - M is the number of rules (regexes) to test in the active condition state.
//
for (var i = 1 /* (dispatch[c0] || 1) */ ; i <= len; i++) {
tempMatch = this._input.match(regexes[i]);
if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
match = tempMatch;
index = i;
if (this.options.backtrack_lexer) {
token = this.test_match(tempMatch, rule_ids[i]);
if (token !== false) {
return token;
} else if (this._backtrack) {
match = undefined;
continue; // rule action called reject() implying a rule MISmatch.
} else {
// else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
return false;
}
} else if (!this.options.flex) {
break;
}
}
}
if (match) {
token = this.test_match(match, rule_ids[index]);
if (token !== false) {
return token;
}
// else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
return false;
}
if (this._input === '') {
this.done = true;
return this.EOF;
} else {
var p = this.constructLexErrorInfo('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), this.options.lexer_errors_are_recoverable);
token = (this.parseError(p.errStr, p) || this.ERROR);
if (token === this.ERROR) {
// we can try to recover from a lexer error that parseError() did not 'recover' for us, by moving forward at least one character at a time:
if (!this.match.length) {
this.input();
}
}
return token;
}
},
// return next match that has a token
lex: function lexer_lex() {
var r;
// allow the PRE/POST handlers set/modify the return token for maximum flexibility of the generated lexer:
if (typeof this.options.pre_lex === 'function') {
r = this.options.pre_lex.call(this);
}
while (!r) {
r = this.next();
}
if (typeof this.options.post_lex === 'function') {
// (also account for a userdef function which does not return any value: keep the token as is)
r = this.options.post_lex.call(this, r) || r;
}
return r;
},
// backwards compatible alias for `pushState()`;
// the latter is symmetrical with `popState()` and we advise to use
// those APIs in any modern lexer code, rather than `begin()`.
begin: function lexer_begin(condition) {
return this.pushState(condition);
},
// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
pushState: function lexer_pushState(condition) {
this.conditionStack.push(condition);
this.__currentRuleSet__ = null;
return this;
},
// pop the previously active lexer condition state off the condition stack
popState: function lexer_popState() {
var n = this.conditionStack.length - 1;
if (n > 0) {
this.__currentRuleSet__ = null;
return this.conditionStack.pop();
} else {
return this.conditionStack[0];
}
},
// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
topState: function lexer_topState(n) {
n = this.conditionStack.length - 1 - Math.abs(n || 0);
if (n >= 0) {
return this.conditionStack[n];
} else {
return 'INITIAL';
}
},
// (internal) determine the lexer rule set which is active for the currently active lexer condition state
_currentRules: function lexer__currentRules() {
if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
return this.conditions[this.conditionStack[this.conditionStack.length - 1]];
} else {
return this.conditions['INITIAL'];
}
},
// return the number of states currently on the stack
stateStackSize: function lexer_stateStackSize() {
return this.conditionStack.length;
},
options: {},
JisonLexerError: JisonLexerError,
performAction: function lexer__performAction(yy, yy_, $avoiding_name_collisions, YY_START) {
var YYSTATE = YY_START;
switch($avoiding_name_collisions) {
case 0 :
/*! Conditions:: INITIAL */
/*! Rule:: [ \t\r\n]+ */
/* eat up whitespace */
BeginToken(yy_.yytext);
break;
case 1 :
/*! Conditions:: INITIAL */
/*! Rule:: {DIGIT}+ */
BeginToken(yy_.yytext);
yylval.value = atof(yy_.yytext);
return VALUE;
break;
case 2 :
/*! Conditions:: INITIAL */
/*! Rule:: {DIGIT}+\.{DIGIT}* */
BeginToken(yy_.yytext);
yylval.value = atof(yy_.yytext);
return VALUE;
break;
case 3 :
/*! Conditions:: INITIAL */
/*! Rule:: {DIGIT}+[eE]["+""-"]?{DIGIT}* */
BeginToken(yy_.yytext);
yylval.value = atof(yy_.yytext);
return VALUE;
break;
case 4 :
/*! Conditions:: INITIAL */
/*! Rule:: {DIGIT}+\.{DIGIT}*[eE]["+""-"]?{DIGIT}* */
BeginToken(yy_.yytext);
yylval.value = atof(yy_.yytext);
return VALUE;
break;
case 5 :
/*! Conditions:: INITIAL */
/*! Rule:: {ID} */
BeginToken(yy_.yytext);
yylval.string = malloc(strlen(yy_.yytext)+1);
strcpy(yylval.string, yy_.yytext);
return IDENTIFIER;
break;
case 6 :
/*! Conditions:: INITIAL */
/*! Rule:: \+ */
BeginToken(yy_.yytext); return ADD;
break;
case 7 :
/*! Conditions:: INITIAL */
/*! Rule:: - */
BeginToken(yy_.yytext); return SUB;
break;
case 8 :
/*! Conditions:: INITIAL */
/*! Rule:: \* */
BeginToken(yy_.yytext); return MULT;
break;
case 9 :
/*! Conditions:: INITIAL */
/*! Rule:: \/ */
BeginToken(yy_.yytext); return DIV;
break;
case 10 :
/*! Conditions:: INITIAL */
/*! Rule:: \( */
BeginToken(yy_.yytext); return LBRACE;
break;
case 11 :
/*! Conditions:: INITIAL */
/*! Rule:: \) */
BeginToken(yy_.yytext); return RBRACE;
break;
case 12 :
/*! Conditions:: INITIAL */
/*! Rule:: ; */
BeginToken(yy_.yytext); return SEMICOLON;
break;
case 13 :
/*! Conditions:: INITIAL */
/*! Rule:: = */
BeginToken(yy_.yytext); return ASSIGN;
break;
case 14 :
/*! Conditions:: INITIAL */
/*! Rule:: . */
BeginToken(yy_.yytext);
return yy_.yytext[0];
break;
default:
return this.simpleCaseActionClusters[$avoiding_name_collisions];
}
},
simpleCaseActionClusters: {
},
rules: [
/^(?:[ \t\r\n]+)/,
/^(?:(\d)+)/,
/^(?:(\d)+\.(\d)*)/,
/^(?:(\d)+[Ee]["+]?(\d)*)/,
/^(?:(\d)+\.(\d)*[Ee]["+]?(\d)*)/,
/^(?:([^\W\d]\w*))/,
/^(?:\+)/,
/^(?:-)/,
/^(?:\*)/,
/^(?:\/)/,
/^(?:\()/,
/^(?:\))/,
/^(?:;)/,
/^(?:=)/,
/^(?:.)/
],
conditions: {
"INITIAL": {
rules: [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14
],
inclusive: true
}
}
};
/*--------------------------------------------------------------------
* lex.l
*------------------------------------------------------------------*/;
return lexer;
})();

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,31 @@
/**
* @fileoverview
* @enhanceable
* @public
*/
// GENERATED CODE -- DO NOT EDIT!
goog.provide('proto.google.protobuf.Timestamp');
goog.require('jspb.Message');
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
* server response, or constructed directly in Javascript. The array is used
* in place and becomes part of the constructed object. It is not cloned.
* If no data is provided, the constructed object will be empty, but still
* valid.
* @extends {jspb.Message}
* @constructor
*/
proto.google.protobuf.Timestamp = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.google.protobuf.Timestamp, jspb.Message);
if (goog.DEBUG && !COMPILED) {
proto.google.protobuf.Timestamp.displayName = 'proto.google.protobuf.Timestamp';
}
// Remainder elided

View 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';

View 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
View 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
;

View 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
View 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
View 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
View 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
View 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
View 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
View 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 )()
}

View 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

View 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

View File

@@ -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”.

View 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))
```

View File

@@ -0,0 +1 @@
_This_ is a **Markdown** readme.

View 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
View 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>

View 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>

View 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

View File

@@ -0,0 +1,3 @@
option('with-something', type: 'boolean',
value: true,
)

329
samples/P4/l2.p4 Normal file
View 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
View 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;
}

View 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
View 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
View File

@@ -0,0 +1,4 @@
include docker
include apt
include ::something
include foo::bar

159
samples/Python/argparse.pyi Normal file
View 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): ...

View 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()

72
samples/R/import.Rd Normal file
View File

@@ -0,0 +1,72 @@
% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/hello.R
\name{import}
\alias{import}
\title{Import a module into the current scope}
\usage{
import(module, attach, attach_operators = TRUE)
}
\arguments{
\item{module}{an identifier specifying the full module path}
\item{attach}{if \code{TRUE}, attach the newly loaded module to the object
search path (see \code{Details})}
\item{attach_operators}{if \code{TRUE}, attach operators of module to the
object search path, even if \code{attach} is \code{FALSE}}
}
\value{
the loaded module environment (invisible)
}
\description{
\code{module = import('module')} imports a specified module and makes its
code available via the environment-like object it returns.
}
\details{
Modules are loaded in an isolated environment which is returned, and
optionally attached to the object search path of the current scope (if
argument \code{attach} is \code{TRUE}).
\code{attach} defaults to \code{FALSE}. However, in interactive code it is
often helpful to attach packages by default. Therefore, in interactive code
invoked directly from the terminal only (i.e. not within modules),
\code{attach} defaults to the value of \code{options('import.attach')}, which
can be set to \code{TRUE} or \code{FALSE} depending on the users preference.
\code{attach_operators} causes \emph{operators} to be attached by default,
because operators can only be invoked in R if they re found in the search
path. Not attaching them therefore drastically limits a modules usefulness.
Modules are searched in the module search path \code{options('import.path')}.
This is a vector of paths to consider, from the highest to the lowest
priority. The current directory is \emph{always} considered first. That is,
if a file \code{a.r} exists both in the current directory and in a module
search path, the local file \code{./a.r} will be loaded.
Module names can be fully qualified to refer to nested paths. See
\code{Examples}.
}
\note{
Unlike for packages, attaching happens \emph{locally}: if
\code{import} is executed in the global environment, the effect is the same.
Otherwise, the imported module is inserted as the parent of the current
\code{environment()}. When used (globally) \emph{inside} a module, the newly
imported module is only available inside the modules search path, not
outside it (nor in other modules which might be loaded).
}
\examples{
# `a.r` is a file in the local directory containing a function `f`.
a = import('a')
a$f()
# b/c.r is a file in path `b`, containing a function `g`.
import('b/c', attach = TRUE)
g() # No module name qualification necessary
}
\seealso{
\code{unload}
\code{reload}
\code{module_name}
}

483
samples/Reason/JSX.re Normal file
View File

@@ -0,0 +1,483 @@
type component = {displayName: string};
let module Bar = {
let createElement c::c=? children => {
displayName: "test"
};
};
let module Nesting = {
let createElement children => {
displayName: "test"
};
};
let module Much = {
let createElement children => {
displayName: "test"
};
};
let module Foo = {
let createElement a::a=? b::b=? children => {
displayName: "test"
};
};
let module One = {
let createElement
test::test=?
foo::foo=?
children => {
displayName: "test"
};
let createElementobvioustypo
test::test
children => {
displayName: "test"
};
};
let module Two = {
let createElement foo::foo=? children => {
displayName: "test"
};
};
let module Sibling = {
let createElement
foo::foo=?
(children: list component) => {
displayName: "test"
};
};
let module Test = {
let createElement yo::yo=? children => {
displayName: "test"
};
};
let module So = {
let createElement children => {
displayName: "test"
};
};
let module Foo2 = {
let createElement children => {
displayName: "test"
};
};
let module Text = {
let createElement children => {
displayName: "test"
};
};
let module Exp = {
let createElement children => {
displayName: "test"
};
};
let module Pun = {
let createElement intended::intended=? children => {
displayName: "test"
};
};
let module Namespace = {
let module Foo = {
let createElement
intended::intended=?
anotherOptional::x=100
children => {
displayName: "test"
};
};
};
let module LotsOfArguments = {
let createElement
argument1::argument1=?
argument2::argument2=?
argument3::argument3=?
argument4::argument4=?
argument5::argument5=?
argument6::argument6=?
children => {
displayName: "test"
};
};
let div argument1::argument1=? children => {
displayName: "test"
};
let module List1 = {
let createElement children => {
displayName: "test"
};
};
let module List2 = {
let createElement children => {
displayName: "test"
};
};
let module List3 = {
let createElement children => {
displayName: "test"
};
};
let (/><) a b => a + b;
let (><) a b => a + b;
let (/>) a b => a + b;
let (><\/) a b => a + b;
let tag1 = 5 />< 6;
let tag2 = 5 >< 7;
let tag3 = 5 /> 7;
let tag4 = 5 ><\/ 7;
let b = 2;
let selfClosing = <Foo />;
let selfClosing2 = <Foo a=1 b=true />;
let selfClosing3 =
<Foo
a="really long values that should"
b="cause the entire thing to wrap"
/>;
let a = <Foo> <Bar c=(fun a => a + 2) /> </Foo>;
let a3 = <So> <Much> <Nesting /> </Much> </So>;
let a4 =
<Sibling>
<One test=true foo=b />
<Two foo=b />
</Sibling>;
let a5 = <Foo> "testing a string here" </Foo>;
let a6 =
<Foo2>
<Text> "testing a string here" </Text>
<Test yo=1 />
<Text> "another string" </Text>
<Bar />
<Exp> (2 + 4) </Exp>
</Foo2>;
let intended = true;
let punning = <Pun intended />;
let namespace = <Namespace.Foo />;
let c = <Foo />;
let d = <Foo />;
let spaceBefore =
<So> <Much> <Nesting /> </Much> </So>;
let spaceBefore2 = <So> <Much /> </So>;
let siblingNotSpaced =
<So> <Much /> <Much /> </So>;
let jsxInList = [<Foo />];
let jsxInList2 = [<Foo />];
let jsxInListA = [<Foo />];
let jsxInListB = [<Foo />];
let jsxInListC = [<Foo />];
let jsxInListD = [<Foo />];
let jsxInList3 = [<Foo />, <Foo />, <Foo />];
let jsxInList4 = [<Foo />, <Foo />, <Foo />];
let jsxInList5 = [<Foo />, <Foo />];
let jsxInList6 = [<Foo />, <Foo />];
let jsxInList7 = [<Foo />, <Foo />];
let jsxInList8 = [<Foo />, <Foo />];
let testFunc b => b;
let jsxInFnCall = testFunc <Foo />;
let lotsOfArguments =
<LotsOfArguments
argument1=1
argument2=2
argument3=3
argument4=4
argument5=5
argument6="test">
<Namespace.Foo />
</LotsOfArguments>;
let lowerCase = <div argument1=1 />;
let b = 0;
let d = 0;
/*
* Should pun the first example:
*/
let a = <Foo a> 5 </Foo>;
let a = <Foo a=b> 5 </Foo>;
let a = <Foo a=b b=d> 5 </Foo>;
let a = <Foo a> 0.55 </Foo>;
let a = Foo.createElement "" [@JSX];
let ident = <Foo> a </Foo>;
let fragment1 = <> <Foo /> <Foo /> </>;
let fragment2 = <> <Foo /> <Foo /> </>;
let fragment3 = <> <Foo /> <Foo /> </>;
let fragment4 = <> <Foo /> <Foo /> </>;
let fragment5 = <> <Foo /> <Foo /> </>;
let fragment6 = <> <Foo /> <Foo /> </>;
let fragment7 = <> <Foo /> <Foo /> </>;
let fragment8 = <> <Foo /> <Foo /> </>;
let fragment9 = <> 2 2 2 2 </>;
let fragment10 = <> 2.2 3.2 4.6 1.2 </>;
let fragment11 = <> "str" </>;
let fragment12 = <> (6 + 2) (6 + 2) (6 + 2) </>;
let fragment13 = <> fragment11 fragment11 </>;
let listOfItems1 = <List1> 1 2 3 4 5 </List1>;
let listOfItems2 =
<List2> 1.0 2.8 3.8 4.0 5.1 </List2>;
let listOfItems3 =
<List3> fragment11 fragment11 </List3>;
/*
* Several sequential simple jsx expressions must be separated with a space.
*/
let thisIsRight a b => ();
let tagOne children => ();
let tagTwo children => ();
/* thisIsWrong <tagOne /><tagTwo />; */
thisIsRight <tagOne /> <tagTwo />;
/* thisIsWrong <tagOne> </tagOne><tagTwo> </tagTwo>; */
thisIsRight <tagOne /> <tagTwo />;
let a children => ();
let b children => ();
let thisIsOkay =
<List1> <a /> <b /> <a /> <b /> </List1>;
let thisIsAlsoOkay =
<List1> <a /> <b /> </List1>;
/* Doesn't make any sense, but suppose you defined an
infix operator to compare jsx */
<a /> < <b />;
<a /> > <b />;
<a /> < <b />;
<a /> > <b />;
let listOfListOfJsx = [<> </>];
let listOfListOfJsx = [<> <Foo /> </>];
let listOfListOfJsx = [
<> <Foo /> </>,
<> <Bar /> </>
];
let listOfListOfJsx = [
<> <Foo /> </>,
<> <Bar /> </>,
...listOfListOfJsx
];
let sameButWithSpaces = [<> </>];
let sameButWithSpaces = [<> <Foo /> </>];
let sameButWithSpaces = [
<> <Foo /> </>,
<> <Bar /> </>
];
let sameButWithSpaces = [
<> <Foo /> </>,
<> <Bar /> </>,
...sameButWithSpaces
];
/*
* Test named tag right next to an open bracket.
*/
let listOfJsx = [];
let listOfJsx = [<Foo />];
let listOfJsx = [<Foo />, <Bar />];
let listOfJsx = [<Foo />, <Bar />, ...listOfJsx];
let sameButWithSpaces = [];
let sameButWithSpaces = [<Foo />];
let sameButWithSpaces = [<Foo />, <Bar />];
let sameButWithSpaces = [
<Foo />,
<Bar />,
...sameButWithSpaces
];
/**
* Test no conflict with polymorphic variant types.
*/
type thisType = [ | `Foo | `Bar];
type t 'a = [< thisType] as 'a;
let asd =
<One test=true foo=2> "a" "b" </One> [@foo];
let asd2 =
One.createElementobvioustypo
test::false
["a", "b"]
[@JSX]
[@foo];
let span
test::(test: bool)
foo::(foo: int)
children => 1;
let asd =
<span test=true foo=2> "a" "b" </span> [@foo];
/* "video" call doesn't end with a list, so the expression isn't converted to JSX */
let video test::(test: bool) children => children;
let asd2 = video test::false 10 [@JSX] [@foo];
let div children => 1;
((fun () => div) ()) [] [@JSX];
let myFun () =>
<>
<Namespace.Foo
intended=true
anotherOptional=200
/>
<Namespace.Foo
intended=true
anotherOptional=200
/>
<Namespace.Foo
intended=true anotherOptional=200>
<Foo />
<Foo />
<Foo />
<Foo />
<Foo />
<Foo />
<Foo />
</Namespace.Foo>
</>;
let myFun () => <> </>;
let myFun () =>
<>
<Namespace.Foo
intended=true
anotherOptional=200
/>
<Namespace.Foo
intended=true
anotherOptional=200
/>
<Namespace.Foo
intended=true anotherOptional=200>
<Foo />
<Foo />
<Foo />
<Foo />
<Foo />
<Foo />
<Foo />
</Namespace.Foo>
</>;
/**
* Children should wrap without forcing attributes to.
*/
<Foo a=10 b=0>
<Bar />
<Bar />
<Bar />
<Bar />
</Foo>;
/**
* Failing test cases:
*/
/* let res = <Foo a=10 b=(<Foo a=200 />) > */
/* <Bar /> */
/* </Foo>; */
/* let res = <Foo a=10 b=(<Foo a=200 />) />; */

1326
samples/Reason/Layout.re Normal file

File diff suppressed because it is too large Load Diff

344
samples/Reason/Machine.re Normal file
View File

@@ -0,0 +1,344 @@
open Format;
let module Endo = {
type t 'a = 'a => 'a;
};
let module Syntax = {
let module Var = {
type t = int;
};
let module Term = {
type t =
| App t t
| Lam t
| Var Var.t
;
};
let module Sub = {
type t 'a =
| Cmp (t 'a) (t 'a)
| Dot 'a (t 'a)
| Id
| Shift
;
let map f sgm => {
let rec go = fun
| Cmp sgm0 sgm1 => Cmp (go sgm0) (go sgm1)
| Dot a sgm => Dot (f a) (go sgm)
| Id => Id
| Shift => Shift
;
go sgm;
};
let rec apply sgm e =>
switch (sgm, e) {
| (sgm, Term.App e0 e1) => Term.App (apply sgm e0) (apply sgm e1)
| (sgm, Term.Lam e) => Term.Lam (apply (Dot (Term.Var 0) (Cmp sgm Shift)) e)
| (Dot e _, Term.Var 0) => e
| (Dot _ sgm, Term.Var i) => apply sgm (Term.Var (i - 1))
| (Id, Term.Var i) => Term.Var i
| (Shift, Term.Var i) => Term.Var (i + 1)
| (Cmp rho sgm, e) => apply sgm (apply rho e)
};
};
};
let module Zip = {
open Syntax;
type t 'a =
| App0 (t 'a) 'a
| App1 'a (t 'a)
| Halt
| Lam (t 'a)
;
let map f sgm => {
let rec go = fun
| App0 zip e1 => App0 (go zip) (f e1)
| App1 e0 zip => App1 (f e0) (go zip)
| Halt => Halt
| Lam zip => Lam (go zip)
;
go sgm;
};
let rec apply zip acc => switch zip {
| App0 zip e1 => apply zip (Term.App acc e1)
| App1 e0 zip => apply zip (Term.App e0 acc)
| Halt => acc
| Lam zip => apply zip (Term.Lam acc)
};
};
let module Clo = {
open Syntax;
type t =
| Clo Term.t (Sub.t t);
let rec from (Clo term sgm) => Sub.apply (Sub.map from sgm) term;
};
let module Pretty = {
let module Delim = {
type t = string;
let pp prev next fmt token => if (prev < next) { fprintf fmt "%s" token };
};
let module Prec = {
type t = int;
open Syntax.Term;
let calc = fun
| App _ _ => 1
| Lam _ => 2
| Var _ => 0
;
};
let module Name = {
type t = string;
let suffix = {
let script = fun
| 0 => ""
| 1 => ""
| 2 => ""
| 3 => ""
| 4 => ""
| 5 => ""
| 6 => ""
| 7 => ""
| 8 => ""
| 9 => ""
| _ => failwith "bad subscript";
let rec go acc => fun
| 0 => acc
| n => go (script (n mod 10) ^ acc) (n / 10);
go ""
};
let gen = {
let offset = 97;
let width = 26;
fun () i => {
let code = i mod width + offset;
let char = Char.chr code;
let prime = i / width;
let suffix = suffix prime;
let name = Char.escaped char ^ suffix;
Some name;
}
};
};
let module Env = {
type t = {
used: list Name.t,
rest: Stream.t Name.t,
};
let mk () => {
let used = [];
let rest = Stream.from @@ Name.gen ();
{ used, rest };
};
};
type printer 'a = Env.t => Prec.t => formatter => 'a => unit;
let module Term = {
open Syntax.Term;
let rec pp ({ Env.used: used, rest } as env) prev fmt e => {
let next = Prec.calc e;
switch e {
| App e0 e1 =>
fprintf fmt "@[%a%a@ %a%a@]"
(Delim.pp prev next) "("
(pp env 1) e0
(pp env 0) e1
(Delim.pp prev next) ")"
| Lam e =>
let name = Stream.next rest;
let env = { ...env, Env.used: [name, ...used] };
fprintf fmt "%aλ%a.%a%a"
(Delim.pp prev next) "("
(pp_print_string) name
(pp env next) e
(Delim.pp prev next) ")"
| Var index =>
fprintf fmt "%s" @@ try (List.nth used index) {
| _ => "#" ^ string_of_int index
}
}
};
};
let module Sub = {
open Syntax.Sub;
let rec pp pp_elem env prev fmt => fun
| Cmp sgm1 sgm0 =>
fprintf fmt "@[%a;@ %a@]"
(pp pp_elem env prev) sgm1
(pp pp_elem env prev) sgm0
| Dot e sgm =>
fprintf fmt "@[%a@ ·@ %a@]"
(pp_elem env prev) e
(pp pp_elem env prev) sgm
| Id =>
fprintf fmt "ι"
| Shift =>
fprintf fmt ""
;
};
let module Clo = {
let rec pp env prev fmt (Clo.Clo e sgm) => {
let next = Prec.calc e;
fprintf fmt "@[%a%a%a[%a]@]"
(Delim.pp prev next) "("
(Term.pp env next) e
(Delim.pp prev next) ")"
(Sub.pp pp env next) sgm
};
};
let module Zip = {
open Zip;
let rec pp pp_elem env prev fmt => fun
| App0 zip elem =>
fprintf fmt "inl@[<v -1>⟨@,%a@,%a⟩@]"
(pp pp_elem env prev) zip
(pp_elem env prev) elem
| App1 elem zip =>
fprintf fmt "inr@[<v -1>⟨@,%a@,%a⟩@]"
(pp_elem env prev) elem
(pp pp_elem env prev) zip
| Halt =>
fprintf fmt "halt"
| Lam zip =>
fprintf fmt "lam@[<v -1>⟨@,%a⟩@]"
(pp pp_elem env prev) zip
;
};
};
let module Machine = {
type t = {
clo: Clo.t,
ctx: Zip.t Clo.t,
};
let into e => {
open Clo;
open Syntax.Sub;
let clo = Clo e Id;
let ctx = Zip.Halt;
{ clo, ctx }
};
let from { clo, ctx } => Zip.apply (Zip.map Clo.from ctx) (Clo.from clo);
let pp fmt rule state => {
fprintf fmt "@[<v>ctx ::@[<v -5>@,%a@]@,clo ::@[<v -5>@,%a@]@,rule ::@[<v -5>@,%a@]@,term ::@[<v -5>@,%a@]@]@."
(Pretty.Zip.pp Pretty.Clo.pp (Pretty.Env.mk ()) 2) state.ctx
(Pretty.Clo.pp (Pretty.Env.mk ()) 2) state.clo
(pp_print_string) rule
(Pretty.Term.pp (Pretty.Env.mk ()) 2) (from state)
};
let halted state => {
open Clo;
open Syntax.Sub;
open Syntax.Term;
switch state {
| { clo: Clo (Var _) Id, _ } => true
| _ => false
} [@warning "-4"];
};
let step state => {
open Clo;
open Syntax.Sub;
open Syntax.Term;
let rule = ref "";
let state = switch state {
/* left */
| { clo: Clo (App e0 e1) sgm, ctx } =>
let clo = Clo e0 sgm;
let ctx = Zip.App0 ctx (Clo e1 sgm);
rule := "LEFT";
{ clo, ctx };
/* beta */
| { clo: Clo (Lam e) sgm, ctx: Zip.App0 ctx c0 } =>
let clo = Clo e (Cmp (Dot c0 sgm) Id);
rule := "BETA";
{ clo, ctx };
/* lambda */
| { clo: Clo (Lam e) sgm, ctx } =>
let clo = Clo e (Cmp (Dot (Clo (Var 0) Id) (Cmp sgm Shift)) Id);
let ctx = Zip.Lam ctx;
rule := "LAMBDA";
{ clo, ctx };
/* associate */
| { clo: Clo (Var n) (Cmp (Cmp pi rho) sgm), ctx } =>
let clo = Clo (Var n) (Cmp pi (Cmp rho sgm));
rule := "ASSOCIATE";
{ clo, ctx };
/* head */
| { clo: Clo (Var 0) (Cmp (Dot (Clo e pi) _) sgm), ctx } =>
let clo = Clo e (Cmp pi sgm);
rule := "HEAD";
{ clo, ctx };
/* tail */
| { clo: Clo (Var n) (Cmp (Dot (Clo _ _) rho) sgm), ctx } =>
let clo = Clo (Var (n - 1)) (Cmp rho sgm);
rule := "TAIL";
{ clo, ctx };
/* shift */
| { clo: Clo (Var n) (Cmp Shift sgm), ctx } =>
let clo = Clo (Var (n + 1)) sgm;
rule := "SHIFT";
{ clo, ctx };
/* id */
| { clo: Clo (Var n) (Cmp Id sgm), ctx } =>
let clo = Clo (Var n) sgm;
rule := "ID";
{ clo, ctx };
| _ =>
pp std_formatter !rule state;
failwith "bad state";
} [@warning "-4"];
pp std_formatter !rule state;
state;
};
let norm e => {
let count = ref 0;
let state = ref (into e);
while (not (halted !state)) {
fprintf std_formatter "@\n--- step[%d] ---@\n" !count;
incr count;
state := step !state;
};
from !state;
};
};
let module Test = {
open Syntax.Term;
let l e => Lam e;
let ( *@ ) e0 e1 => App e0 e1;
let ff = l (l (Var 1));
let tt = l (l (Var 0));
let zero = l (l (Var 1));
let succ = l (l (l (Var 0 *@ Var 2)));
let one = succ *@ zero;
let two = succ *@ one;
let three = succ *@ two;
let const = l (l (Var 1));
let fix = l (l (Var 1 *@ (Var 0 *@ Var 0)) *@ l (Var 1 *@ (Var 0 *@ Var 0)));
let add = fix *@ l (l (l (Var 1 *@ Var 0 *@ l (succ *@ Var 3 *@ Var 0 *@ Var 1))));
let init = l (l (Var 0) *@ l (l (Var 1)));
};
let module Run = {
let go () => Machine.norm Test.init;
};

View File

@@ -0,0 +1,308 @@
/*
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
*/
let startedMerlin: ref (option Js.Unsafe.any) = {contents: None};
let fixedEnv = Js.Unsafe.js_expr "require('../lib/fixedEnv')";
/* This and the subsequent big js blocks are copied over from Nuclide. More convenient for now. */
let findNearestMerlinFile' = Js.Unsafe.js_expr {|
function findNearestMerlinFile(beginAtFilePath) {
var path = require('path');
var fs = require('fs');
var fileDir = path.dirname(beginAtFilePath);
var currentPath = path.resolve(fileDir);
do {
var fileToFind = path.join(currentPath, '.merlin');
var hasFile = fs.existsSync(fileToFind);
if (hasFile) {
return path.dirname(currentPath);
}
if (path.dirname(currentPath) === currentPath) {
// Bail
return '.';
}
currentPath = path.dirname(currentPath);
} while (true);
}
|};
let findNearestMerlinFile beginAtFilePath::path => {
let result = Js.Unsafe.fun_call findNearestMerlinFile' [|Js.Unsafe.inject (Js.string path)|];
Js.to_string result
};
let createMerlinReaderFnOnce' = Js.Unsafe.js_expr {|
function(ocamlMerlinPath, ocamlMerlinFlags, dotMerlinDir, fixedEnv) {
var spawn = require('child_process').spawn;
// To split while stripping out any leading/trailing space, we match on all
// *non*-whitespace.
var items = ocamlMerlinFlags === '' ? [] : ocamlMerlinFlags.split(/\s+/);
var merlinProcess = spawn(ocamlMerlinPath, items, {cwd: dotMerlinDir});
merlinProcess.stderr.on('data', function(d) {
console.error('Ocamlmerlin: something wrong happened:');
console.error(d.toString());
});
merlinProcess.stdout.on('close', function(d) {
console.error('Ocamlmerlin: closed.');
});
var cmdQueue = [];
var hasStartedReading = false;
var readline = require('readline');
var reader = readline.createInterface({
input: merlinProcess.stdout,
terminal: false,
});
return function(cmd, resolve, reject) {
cmdQueue.push([resolve, reject]);
if (!hasStartedReading) {
hasStartedReading = true;
reader.on('line', function(line) {
var response;
try {
response = JSON.parse(line);
} catch (err) {
response = null;
}
var resolveReject = cmdQueue.shift();
var resolve = resolveReject[0];
var reject = resolveReject[1];
if (!response || !Array.isArray(response) || response.length !== 2) {
reject(new Error('Unexpected ocamlmerlin output format: ' + line));
return;
}
var status = response[0];
var content = response[1];
var errorResponses = {
'failure': true,
'error': true,
'exception': true,
};
if (errorResponses[status]) {
reject(new Error('Ocamlmerlin returned an error: ' + line));
return;
}
resolve(content);
});
}
merlinProcess.stdin.write(JSON.stringify(cmd));
};
}
|};
let createMerlinReaderFnOnce
pathToMerlin::pathToMerlin
merlinFlags::merlinFlags
dotMerlinPath::dotMerlinPath =>
Js.Unsafe.fun_call
createMerlinReaderFnOnce'
[|
Js.Unsafe.inject (Js.string pathToMerlin),
Js.Unsafe.inject (Js.string merlinFlags),
Js.Unsafe.inject (Js.string dotMerlinPath),
Js.Unsafe.inject fixedEnv
|];
let startMerlinProcess path::path =>
switch startedMerlin.contents {
| Some readerFn => ()
| None =>
let atomReasonPathToMerlin = Atom.Config.get "atom-reason.pathToMerlin";
let atomReasonMerlinFlags = Atom.Config.get "atom-reason.merlinFlags";
let atomReasonMerlinLogFile = Atom.Config.get "atom-reason.merlinLogFile";
switch atomReasonMerlinLogFile {
| JsonString "" => ()
| JsonString s => Atom.Env.setEnvVar "MERLIN_LOG" s
| _ => ()
};
let readerFn =
createMerlinReaderFnOnce
pathToMerlin::(Atom.JsonValue.unsafeExtractString atomReasonPathToMerlin)
merlinFlags::(Atom.JsonValue.unsafeExtractString atomReasonMerlinFlags)
dotMerlinPath::(findNearestMerlinFile beginAtFilePath::path);
startedMerlin.contents = Some readerFn
};
let readOneLine cmd::cmd resolve reject =>
switch startedMerlin.contents {
| None => raise Not_found
| Some readerFn =>
Js.Unsafe.fun_call
readerFn
[|
Js.Unsafe.inject cmd,
Js.Unsafe.inject (Js.wrap_callback resolve),
Js.Unsafe.inject (Js.wrap_callback reject)
|]
};
/* contextify is important for avoiding different buffers calling the backing merlin at the same time. */
/* https://github.com/the-lambda-church/merlin/blob/d98a08d318ca14d9c702bbd6eeadbb762d325ce7/doc/dev/PROTOCOL.md#contextual-commands */
let contextify query::query path::path => Js.Unsafe.obj [|
("query", Js.Unsafe.inject query),
("context", Js.Unsafe.inject (Js.array [|Js.string "auto", Js.string path|]))
|];
let prepareCommand text::text path::path query::query resolve reject => {
startMerlinProcess path;
/* These two commands should be run before every main command. */
readOneLine
cmd::(
contextify
/* The protocol command tells Merlin which API version we want to use. (2 for us) */
query::(
Js.array [|
Js.Unsafe.inject (Js.string "protocol"),
Js.Unsafe.inject (Js.string "version"),
Js.Unsafe.inject (Js.number_of_float 2.)
|]
)
path::path
)
(
fun _ =>
readOneLine
cmd::(
contextify
/* The tell command allows us to synchronize our text with Merlin's internal buffer. */
query::(
Js.array [|Js.string "tell", Js.string "start", Js.string "end", Js.string text|]
)
path::path
)
(fun _ => readOneLine cmd::(contextify query::query path::path) resolve reject)
reject
)
reject
};
let positionToJsMerlinPosition (line, col) => Js.Unsafe.obj [|
/* lines (rows) are 1-based for merlin, not 0-based, like for Atom */
("line", Js.Unsafe.inject (Js.number_of_float (float_of_int (line + 1)))),
("col", Js.Unsafe.inject (Js.number_of_float (float_of_int col)))
|];
/* Actual merlin commands we'll use. */
let getTypeHint path::path text::text position::position resolve reject =>
prepareCommand
text::text
path::path
query::(
Js.array [|
Js.Unsafe.inject (Js.string "type"),
Js.Unsafe.inject (Js.string "enclosing"),
Js.Unsafe.inject (Js.string "at"),
Js.Unsafe.inject (positionToJsMerlinPosition position)
|]
)
resolve
reject;
let getAutoCompleteSuggestions
path::path
text::text
position::position
prefix::prefix
resolve
reject =>
prepareCommand
text::text
path::path
query::(
Js.array [|
Js.Unsafe.inject (Js.string "complete"),
Js.Unsafe.inject (Js.string "prefix"),
Js.Unsafe.inject (Js.string prefix),
Js.Unsafe.inject (Js.string "at"),
Js.Unsafe.inject (positionToJsMerlinPosition position),
Js.Unsafe.inject (Js.string "with"),
Js.Unsafe.inject (Js.string "doc")
|]
)
resolve
reject;
let getDiagnostics path::path text::text resolve reject =>
prepareCommand
text::text
path::path
query::(Js.array [|Js.Unsafe.inject (Js.string "errors")|])
resolve
reject;
let locate path::path text::text extension::extension position::position resolve reject =>
prepareCommand
text::text
path::path
query::(
Js.array [|
Js.Unsafe.inject (Js.string "locate"),
Js.Unsafe.inject (Js.string ""),
Js.Unsafe.inject (Js.string extension),
Js.Unsafe.inject (Js.string "at"),
Js.Unsafe.inject (positionToJsMerlinPosition position)
|]
)
resolve
reject;
/* reject */
let getOccurrences path::path text::text position::position resolve reject =>
prepareCommand
text::text
path::path
query::(
Js.array [|
Js.Unsafe.inject (Js.string "occurrences"),
Js.Unsafe.inject (Js.string "ident"),
Js.Unsafe.inject (Js.string "at"),
Js.Unsafe.inject (positionToJsMerlinPosition position)
|]
)
resolve
reject;
let destruct
path::path
text::text
startPosition::startPosition
endPosition::endPosition
resolve
reject =>
prepareCommand
text::text
path::path
query::(
Js.array [|
Js.Unsafe.inject (Js.string "case"),
Js.Unsafe.inject (Js.string "analysis"),
Js.Unsafe.inject (Js.string "from"),
Js.Unsafe.inject (positionToJsMerlinPosition startPosition),
Js.Unsafe.inject (Js.string "to"),
Js.Unsafe.inject (positionToJsMerlinPosition endPosition)
|]
)
resolve
reject;
let getOutline path::path text::text resolve reject =>
prepareCommand
text::text
path::path
query::(Js.array [|Js.Unsafe.inject (Js.string "outline")|])
resolve
reject;

989
samples/Reason/Syntax.re Normal file
View File

@@ -0,0 +1,989 @@
/* Copyright (c) 2015-present, Facebook, Inc. All rights reserved. */
[@@@autoFormat let wrap = 80; let shift = 2];
Modules.run ();
Polymorphism.run ();
Variants.run ();
BasicStructures.run ();
TestUtils.printSection "General Syntax";
/* Won't work! */
/* let matchingFunc a = match a with */
/* `Thingy x => (print_string "matched thingy x"); x */
/* | `Other x => (print_string "matched other x"); x;; */
/* */
let matchingFunc a =>
switch a {
| `Thingy x =>
print_string "matched thingy x";
let zz = 10;
zz
| `Other x =>
print_string "matched other x";
x
};
type firstTwoShouldBeGroupedInParens =
(int => int) => int => int;
type allParensCanBeRemoved =
int => int => int => int;
type firstTwoShouldBeGroupedAndFirstThree =
((int => int) => int) => int;
/* Same thing now but with type constructors instead of each int */
type firstTwoShouldBeGroupedInParens =
(list int => list int) => list int => list int;
type allParensCanBeRemoved =
list int => list int => list int => list int;
type firstTwoShouldBeGroupedAndFirstThree =
((list int => list int) => list int) =>
list int;
type myRecordType = {
firstTwoShouldBeGroupedInParens:
(int => int) => int => int,
allParensCanBeRemoved:
int => int => int => int,
firstTwoShouldBeGroupedAndFirstThree:
((int => int) => int) => int
};
type firstNamedArgShouldBeGroupedInParens =
first::(int => int) => second::int => int;
type allParensCanBeRemoved =
first::int => second::int => third::int => int;
type firstTwoShouldBeGroupedAndFirstThree =
first::((int => int) => int) => int;
/* Same thing now, but with type constructors instead of int */
type firstNamedArgShouldBeGroupedInParens =
first::(list int => list int) =>
second::list int =>
list int;
type allParensCanBeRemoved =
first::list int =>
second::list int =>
third::list int =>
list int;
type firstTwoShouldBeGroupedAndFirstThree =
first::((list int => list int) => list int) =>
list int;
type firstNamedArgShouldBeGroupedInParens =
first::(int => int)? =>
second::int list? =>
int;
/* The arrow necessitates parens around the next two args. The ? isn't what
* makes the parens necessary. */
type firstNamedArgShouldBeGroupedInParensAndSecondNamedArg =
first::(int => int)? =>
second::(int => int)? =>
int;
type allParensCanBeRemoved =
first::int? =>
second::int? =>
third::int? =>
int;
type firstTwoShouldBeGroupedAndFirstThree =
first::((int => int) => int) => int;
type noParens =
one::int => int => int => two::int => int;
type noParensNeeded =
one::int => int => int => two::int => int;
type firstNamedArgNeedsParens =
one::(int => int => int) => two::int => int;
/* Now, let's try type aliasing */
/* Unless wrapped in parens, types between arrows may not be aliased, may not
* themselves be arrows. */
type parensRequiredAroundFirstArg =
(list int as 'a) => int as 'a;
type parensRequiredAroundReturnType =
(list int as 'a) => (int as 'a);
type parensRequiredAroundReturnType =
(list int as 'a) => (int as 'a) as 'b;
type noParensNeededWhenInTuple =
(list int as 'a, list int as 'b) as 'entireThing;
type myTypeDef 'a = list 'a;
type instatiatedTypeDef = myTypeDef int => int;
/* Test a type attribute for good measure */
/* We should clean up all of the attribute tagging eventually, but for now,
* let's make it super ugly to get out of the way of all the formatting/parsing
* implementations (fewer conflicts during parsing, fewer edge cases during
* printing).
*/
type something = (
int,
int [@lookAtThisAttribute]
);
type longWrappingTypeDefinitionExample =
M_RK__G.Types.instance
(TGRecognizer.tGFields unit unit)
(TGRecognizer.tGMethods unit unit);
type semiLongWrappingTypeDefinitionExample =
M_RK__Gesture.Types.instance
TGRecognizerFinal.tGFields
TGRecognizerFinal.tGMethods;
type semiLongWrappingTypeWithConstraint =
M_RK__Gesture.Types.instance
'a
TGRecognizerFinal.tGFields
TGRecognizerFinal.tGMethods
constraint 'a = (unit, unit);
type onelineConstrain = 'a constraint 'a = int;
/* This must be in trunk but not in this branch of OCaml */
/* type withNestedRecords = MyConstructor {myField: int} */
type colors =
| Red int
| Black int
| Green int;
/* Another approach is to require declared variants to wrap any record */
/* type myRecord = MyRecord {name: int}; */
/* let myValue = MyRecord {name: int}; */
/* This would force importing of the module */
/* This would also lend itself naturally to pattern matching - and avoid having
to use `.` operator at all since you normally destructure. */
type nameBlahType = {nameBlah: int};
let myRecord = {nameBlah: 20};
let myRecordName = myRecord.nameBlah;
let {nameBlah}: nameBlahType = {nameBlah: 20};
print_int nameBlah;
let {nameBlah: aliasedToThisVar}: nameBlahType = {
nameBlah: 20
};
print_int aliasedToThisVar;
let desiredFormattingForWrappedLambda:
int => int => int => nameBlahType =
/*
fun is
pre- /firstarg\
fix /-coupled--\
|-\ /-to-prefix--\ */
fun curriedArg anotherArg lastArg => {
nameBlah: 10
};
type longerInt = int;
let desiredFormattingForWrappedLambdaWrappedArrow:
longerInt =>
longerInt =>
longerInt =>
nameBlahType =
/*
fun is
pre- /firstarg\
fix /-coupled--\
|-\ /-to-prefix--\ */
fun curriedArg anotherArg lastArg => {
nameBlah: 10
};
let desiredFormattingForWrappedLambdaReturnOnNewLine
/*
fun is
pre- /firstarg\
fix /-coupled--\
|-\ /-to-prefix--\ */
curriedArg
anotherArg
lastArg => {
nameBlah: 10
};
/*
let is
pre-
fix /-function binding name---\
|-\ / is coupled to prefix \ */
let desiredFormattingForWrappedSugar
curriedArg
anotherArg
lastArg => {
nameBlah: 10
};
/*
let is
pre-
fix /-function binding name---\
|-\ / is coupled to prefix \ */
let desiredFormattingForWrappedSugarReturnOnNewLine
curriedArg
anotherArg
lastArg => {
nameBlah: 10
};
/*
let : type t1 t2. t1 * t2 list -> t1 = ...
let rec f : 't1 't2. 't1 * 't2 list -> 't1 =
fun (type t1) (type t2) -> (... : t1 * t2 list -> t1)
*/
type point = {x: int, y: int};
type point3D = {x: int, y: int, z: int};
let point2D = {x: 20, y: 30};
let point3D: point3D = {
x: 10,
y: 11,
z: 80 /* Optional Comma */
};
let printPoint (p: point) => {
print_int p.x;
print_int p.y
};
let addPoints (p1: point, p2: point) => {
x: p1.x + p2.x,
y: p1.y + p2.y
};
let res1 = printPoint point2D;
let res2 =
printPoint {x: point3D.x, y: point3D.y};
/*
When () were used to indicate sequences, the parser used seq_expr not only
for grouping sequences, but also to form standard precedences.
/------- sequence_expr ------\
let res3 = printPoint (addPoints (point2D, point3D));
Interestingly, it knew that tuples aren't sequences.
To move towards semi delimited, semi-terminated, braces-grouped sequences:
while allowing any non-sequence expression to be grouped on parens, we make
an explicit rule that allows one single non-semi ended expression to be
grouped in parens.
Actually: We will allow an arbitrary number of semi-delimited expressions to
be wrapped in parens, but the braces grouped semi delimited (sequence)
expressions must *also* be terminated with a semicolon.
This allows the parser to distinguish between
let x = {a}; /* Record {a:a} */
let x = {a;}; /* Single item sequence returning identifier {a} */
*/
let res3 =
printPoint (
addPoints (
point2D,
{x: point3D.x, y: point3D.y}
)
);
type person = {age: int, name: string};
type hiredPerson = {
age: string,
name: string,
dateHired: int
};
let o: person = {name: "bob", age: 10};
/* Parens needed? Nope! */
let o: person = {name: "bob", age: 10};
let printPerson (p: person) => {
let q: person = p;
p.name ^ p.name
};
/* let dontParseMeBro x y:int = x = y;*/
/* With this unification, anywhere eyou see `= fun` you can just ommit it */
let blah a => a; /* Done */
let blah a => a; /* Done (almost) */
let blah a b => a; /* Done */
let blah a b => a; /* Done (almost) */
/* More than one consecutive pattern must have a single case */
type blah = {blahBlah: int};
let blah a {blahBlah} => a;
let blah a {blahBlah} => a;
let module TryToExportTwice = {
let myVal = "hello";
};
/*
Unifying top level module syntax with local module syntax is probably a bad
idea at the moment because it makes it more difficult to continue to support
`let .. in` bindings. We can distinguish local modules for `let..in` that
just happen to be defined at the top level (but not exported).
let MyModule = {let myVal = 20;} in
MyModule.x
Wait, where would this ever be valid, even if we continued to support
`let..in`?
*/
let onlyDoingThisTopLevelLetToBypassTopLevelSequence = {
let x = {
print_int 1;
print_int 20 /* Missing trailing SEMI */
};
let x = {
print_int 1;
print_int 20; /* Ensure missing middle SEMI reported well */
print_int 20
};
let x = {
print_int 1;
print_int 20;
10
/* Comment in final position */
}; /* Missing final SEMI */
x + x
};
type hasA = {a: int};
let a = 10;
let returnsASequenceExpressionWithASingleIdentifier
() => a;
let thisReturnsA () => a;
let thisReturnsAAsWell () => a;
let recordVal: int = (thisReturnsARecord ()).a;
Printf.printf
"\nproof that thisReturnsARecord: %n\n"
recordVal;
Printf.printf
"\nproof that thisReturnsA: %n\n"
(thisReturnsA ());
/* Pattern matching */
let blah arg =>
switch arg {
/* Comment before Bar */
| /* Comment between bar/pattern */ Red _ => 1
/* Comment Before non-first bar */
| /* Comment betwen bar/pattern */ Black _ => 0
| Green _ => 0
};
/* Any function that pattern matches a multicase match is interpretted as a
* single arg that is then matched on. Instead of the above `blah` example:*/
let blah =
fun
| Red _ => 1
| Black _ => 0
| Green _ => 1;
/* `fun a => a` is read as "a function that maps a to a". Then the */
/* above example is read: "a function that 'either maps' Red to.. or maps .." */
/* Thc00f564e first bar is read as "either maps" */
/* Curried form is not supported:
let blah x | Red _ => 1 | Black _ => 0;
Theres no sugar rule for dropping => fun, only = fun
*/
/* let blahCurriedX x => fun /* See, nothing says we can drop the => fun */ */
/* |(Red x | Black x | Green x) => 1 /* With some effort, we can ammend the sugar rule that would */ */
/* | Black x => 0 /* Allow us to drop any => fun.. Just need to make pattern matching */ */
/* | Green x => 0; /* Support that */ */
/* */
let blahCurriedX x =>
fun
| Red x
| Black x
| Green x =>
1 /* With some effort, we can ammend the sugar rule that would */
| Black x => 0 /* Allow us to drop any => fun.. Just need to make pattern matching */
| Green x => 0; /* Support that */
let sameThingInLocal = {
let blahCurriedX x =>
fun
| Red x
| Black x
| Green x =>
1 /* With some effort, we can ammend the sugar rule that would */
| Black x => 0 /* Allow us to drop any => fun.. Just need to make pattern matching */
| Green x => 0; /* Support that */
blahCurriedX
};
/* This should be parsed/printed exactly as the previous */
let blahCurriedX x =>
fun
| Red x
| Black x
| Green x => 1
| Black x => 0
| Green x => 0;
/* Any time there are multiple match cases we require a leading BAR */
let v = Red 10;
let Black x | Red x | Green x = v; /* So this NON-function still parses */
/* This doesn't parse, however (and it doesn't in OCaml either):
let | Black x | Red x | Green x = v;
*/
print_int x;
/* Scoping: Let sequences. Familiar syntax for lexical ML style scope and
sequences. */
let res = {
let a = "a starts out as";
{
print_string a;
let a = 20;
print_int a
};
print_string a
};
let res = {
let a = "first its a string";
let a = 20;
print_int a;
print_int a;
print_int a
};
let res = {
let a = "a is always a string";
print_string a;
let b = 30;
print_int b
};
/* let result = LyList.map (fun | [] => true | _ => false) []; */
/* OTHERWISE: You cannot tell if a is the first match case falling through or
* a curried first arg */
/* let blah = fun a | patt => 0 | anotherPatt => 1; */
/* let blah a patt => 0 | anotherPatt => 1; */
/*simple pattern EQUALGREATER expr */
let blah a {blahBlah} => a;
/* match_case */
/* pattern EQUALGREATER expr */
let blah =
fun
| Red _ => 1
| Black _ => 0
| Green _ => 0;
/* Won't work! */
/* let arrowFunc = fun a b => print_string "returning aplusb from arrow"; a + b;; */
let arrowFunc a b => {
print_string "returning aplusb from arrow";
a + b
};
let add a b => {
let extra = {
print_string "adding";
0
};
let anotherExtra = 0;
extra + a + b + anotherExtra
};
print_string (string_of_int (add 4 34));
let dummy _ => 10;
dummy res1;
dummy res2;
dummy res3;
/* Some edge cases */
let myFun firstArg (Red x | Black x | Green x) =>
firstArg + x;
let matchesWithWhen a =>
switch a {
| Red x when 1 > 0 => 10
| Red _ => 10
| Black x => 10
| Green x => 10
};
let matchesWithWhen =
fun
| Red x when 1 > 0 => 10
| Red _ => 10
| Black x => 10
| Green x => 10;
let matchesOne (`Red x) => 10;
/*
Typical OCaml would make you *wrap the functions in parens*! This is because it
can't tell if a semicolon is a sequence operator. Even if we had records use
commas to separate fields,
*/
type adders = {
addTwoNumbers: int => int => int,
addThreeNumbers: int => int => int => int,
addThreeNumbersTupled: (int, int, int) => int
};
let myRecordWithFunctions = {
addTwoNumbers: fun a b => a + b,
addThreeNumbers: fun a b c => a + b + c,
addThreeNumbersTupled: fun (a, b, c) =>
a + b + c
};
let result =
myRecordWithFunctions.addThreeNumbers 10 20 30;
let result =
myRecordWithFunctions.addThreeNumbersTupled (
10,
20,
30
);
let lookTuplesRequireParens = (1, 2);
/* let thisDoesntParse = 1, 2; */
let tupleInsideAParenSequence = {
print_string "look, a tuple inside a sequence";
let x = 10;
(x, x)
};
let tupleInsideALetSequence = {
print_string "look, a tuple inside a sequence";
let x = 10;
(x, x)
};
/* We *require* that function return types be wrapped in
parenthesis. In this example, there's no ambiguity */
let makeIncrementer (delta: int) :(int => int) =>
fun a => a + delta;
/* We could even force that consistency with let bindings - it's allowed
currently but not forced.
*/
let myAnnotatedValBinding: int = 10;
/* Class functions (constructors) and methods are unified in the same way */
class classWithNoArg = {
method x = 0;
method y = 0;
};
/* This parses but doesn't type check
class myClass init => object
method x => init
method y => init
end;
*/
let myFunc (a: int) (b: int) :(int, int) => (
a,
b
);
let myFunc (a: int) (b: int) :list int => [1];
let myFunc (a: int) (b: int) :point => {
x: a,
y: b
};
let myFunc (a: int, b: int) :point => {
x: a,
y: b
};
type myThing = (int, int);
type stillARecord = {name: string, age: int};
/* Rebase latest OCaml to get the following: And fixup
`generalized_constructor_arguments` according to master. */
/* type ('a, 'b) myOtherThing = Leaf {first:'a, second: 'b} | Null; */
type branch 'a 'b = {first: 'a, second: 'b};
type myOtherThing 'a 'b =
| Leaf (branch 'a 'b)
| Null;
type yourThing = myOtherThing int int;
/* Conveniently - this parses exactly how you would intend! No *need* to wrap
in an extra [], but it doesn't hurt */
/* FIXME type lookAtThesePolyVariants = list [`Red] ; */
/* FIXME type bracketsGroupMultipleParamsAndPrecedence = list (list (list [`Red])); */
/* FIXME type youCanWrapExtraIfYouWant = (list [`Red]); */
/* FIXME type hereAreMultiplePolyVariants = list [`Red | `Black]; */
/* FIXME type hereAreMultiplePolyVariantsWithOptionalWrapping = list ([`Red | `Black]); */
/*
/* Proposal: ES6 style lambdas: */
/* Currying */
let lookES6Style = (`Red x) (`Black y) => { };
let lookES6Style (`Red x) (`Black y) => { };
/* Matching the single argument */
let lookES6Style = oneArg => match oneArg with
| `Red x => x
| `Black x => x;
/* The "trick" to currying that we already have is basically the same - we just
* have to reword it a bit:
* From:
* "Any time you see [let x = fun ...] just replace it with [let x ...]"
* To:
* "Any time you see [let x = ... => ] just replace it with [let x ... => ]"
*/
let lookES6Style oneArg => match oneArg with
| `Red x => x
| `Black x => x;
*/
/** Current OCaml Named Arguments. Any aliasing is more than just aliasing!
OCaml allows full on pattern matching of named args. */
/*
A: let named ~a ~b = aa + bb in
B: let namedAlias ~a:aa ~b:bb = aa + bb in
C: let namedAnnot ~(a:int) ~(b:int) = a + b in
D: let namedAliasAnnot ~a:(aa:int) ~b:(bb:int) = aa + bb in
E: let optional ?a ?b = 10 in
F: let optionalAlias ?a:aa ?b:bb = 10 in
G: let optionalAnnot ?(a:int option) ?(b:int option) = 10 in
H: let optionalAliasAnnot ?a:(aa:int option) ?b:(bb:int option) = 10 in
/*
Look! When a default is provided, annotation causes inferred type of argument
to not be "option" since it's automatically destructured (because we know it
will always be available one way or another.)
*/
I: let defOptional ?(a=10) ?(b=10) = 10 in
J: let defOptionalAlias ?a:(aa=10) ?b:(bb=10) = 10 in
K: let defOptionalAnnot ?(a:int=10) ?(b:int=10) = 10 in
\ \
\label_let_pattern opt_default: no longer needed in SugarML
L: let defOptionalAliasAnnot ?a:(aa:int=10) ?b:(bb:int=10) = 10 in
\ \
\let_pattern: still a useful syntactic building block in SugarML
*/
/**
* In Reason, the syntax for named args uses double semicolon, since
* the syntax for lists uses ES6 style [], freeing up the ::.
*/
let a = 10;
let b = 20;
/*A*/
let named a::a b::b => a + b;
type named = a::int => b::int => int;
/*B*/
let namedAlias a::aa b::bb => aa + bb;
let namedAlias a::aa b::bb => aa + bb;
type namedAlias = a::int => b::int => int;
/*C*/
let namedAnnot a::(a: int) b::(b: int) => 20;
/*D*/
let namedAliasAnnot a::(aa: int) b::(bb: int) => 20;
/*E*/
let myOptional a::a=? b::b=? () => 10;
type named = a::int? => b::int? => unit => int;
/*F*/
let optionalAlias a::aa=? b::bb=? () => 10;
/*G*/
let optionalAnnot a::(a: int)=? b::(b: int)=? () => 10;
/*H*/
let optionalAliasAnnot
a::(aa: int)=?
b::(bb: int)=?
() => 10;
/*I: */
let defOptional a::a=10 b::b=10 () => 10;
type named = a::int? => b::int? => unit => int;
/*J*/
let defOptionalAlias a::aa=10 b::bb=10 () => 10;
/*K*/
let defOptionalAnnot
a::(a: int)=10
b::(b: int)=10
() => 10;
/*L*/
let defOptionalAliasAnnot
a::(aa: int)=10
b::(bb: int)=10
() => 10;
/*M: Invoking them - Punned */
let resNotAnnotated = named a::a b::b;
/*N:*/
let resAnnotated: int = named a::a b::b;
/*O: Invoking them */
let resNotAnnotated = named a::a b::b;
/*P: Invoking them */
let resAnnotated: int = named a::a b::b;
/*Q: Here's why "punning" doesn't work! */
/* Is b:: punned with a final non-named arg, or is b:: supplied b as one named arg? */
let b = 20;
let resAnnotated = named a::a b::b;
/*R: Proof that there are no ambiguities with return values being annotated */
let resAnnotated: ty = named a::a b;
/*S: Explicitly passed optionals are a nice way to say "use the default value"*/
let explictlyPassed =
myOptional a::?None b::?None;
/*T: Annotating the return value of the entire function call */
let explictlyPassedAnnotated: int =
myOptional a::?None b::?None;
/*U: Explicitly passing optional with identifier expression */
let a = None;
let explictlyPassed = myOptional a::?a b::?None;
let explictlyPassedAnnotated: int =
myOptional a::?a b::?None;
let nestedLet = {
let _ = 1;
()
};
let nestedLet = {
let _ = 1;
()
};
let nestedLet = {
let _ = 1;
()
};
let nestedLet = {
let _ = 1;
2
};
/*
* Showing many combinations of type annotations and named arguments.
*/
type typeWithNestedNamedArgs =
outerOne::(
innerOne::int => innerTwo::int => int
) =>
outerTwo::int =>
int;
type typeWithNestedOptionalNamedArgs =
outerOne::
(innerOne::int => innerTwo::int => int)? =>
outerTwo::int? =>
int;
type typeWithNestedOptionalNamedArgs =
outerOne::list string? => outerTwo::int? => int;
let x =
callSomeFunction
withArg::10 andOtherArg::wrappedArg;
let res = {
(constraintedSequenceItem: string);
(dontKnowWheYoudWantToActuallyDoThis: string)
};
let res = {
(
butTheyWillBePrintedWithAppropriateSpacing: string
);
(soAsToInstillBestDevelopmentPractices: string)
};
let x = [
(eachItemInListCanBeAnnotated: int),
(typeConstraints: float),
(
tupleConstraints: int,
andNotFunctionInvocations: int
)
];
let x = [
(butWeWillPrint: int),
(themAsSpaceSeparated: float),
(toInfluenceYour: int, developmentHabbits: int)
];
let newRecord = {
...(annotatedSpreadRecord: someRec),
x: y
};
let newRecord = {
...(annotatedSpreadRecord: someRec),
blah: 0,
foo: 1
};
let newRecord = {
...(
youCanEvenCallMethodsHereAndAnnotate them: someRec
),
blah: 0,
foo: 1
};
let newRecord = {
...(
youCanEvenCallMethodsHereAndAnnotate
them named::10: someRec
),
blah: 0,
foo: 1
};
let something: thing blah = aTypeAnnotation;
let something: thing blah = thisIsANamedArg;
let something: thing blah = aTypeAnnotation;
let something: blah = thisIsANamedArg thing;
let something: blah = typeAnnotation thing;
let newRecord = {
...(
heresAFunctionWithNamedArgs argOne::i: annotatedResult
),
soAsToInstill: 0,
developmentHabbits: 1
};
[@@@thisIsAThing];
let x = 10;
/* Ensure that the parenthesis are preserved here because they are
* important:
*/
let something =
fun
| None => (
fun
| [] => "emptyList"
| [_, ..._] => "nonEmptyList"
)
| Some _ => (
fun
| [] => "emptyList"
| [_, ..._] => "nonEmptyList"
);
/* A | B = X; */
let A | B = X;
/* A | (B | C) = X; */
let A | (B | C) = X;
/* (A | B) | (C | D) = X; */
let A | B | (C | D) = X;
/* A | B | (C | D) = X; */
let A | B | (C | D) = X;
/* (A | B) | C = X; */
let A | B | C = X;
/* A | B | C = X; */
let A | B | C = X;
/** External function declaration
*
*/
external f : int => int = "foo";
let x = {contents: 0};
let unitVal = x.contents = 210;

View File

@@ -0,0 +1,19 @@
-\*-
(?:
\s*
(?= [^:;\s]+ \s* -\*-)
|
(?:
.*?[;\s]
|
(?<=-\*-)
)
mode\s*:\s*
)
([^:;\s]+)
(?=
[\s;] | (?<![-*]) -\*-
)
.*?
-\*-

View 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|:|$)

View 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

View File

@@ -0,0 +1 @@
/^([^\/#\?]*:?\/\/)?(\/?(?:[^\/#\?]+\/)*)?([^\/#\?]+)?(?:\/(?=$))?(\?[^#]*)?(#.*)?$/

View File

@@ -0,0 +1,2 @@
require "pp"
IRB.conf[:AUTO_INDENT] = true

File diff suppressed because it is too large Load Diff

View 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
}

View 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
}
}
}

View 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
}
}
}

View 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
*/

View File

@@ -0,0 +1,339 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.

View File

@@ -0,0 +1,24 @@
README for users interested in using MySQL as a triplestore backend
===================================================================
The KiWi Triple Store used by Apache Marmotta supports different database
backends, including H2, PostgreSQL and MySQL. However, for legal reasons,
we are not allowed to distribute the MySQL connector library together with
the Apache Marmotta source code or binaries, as it is licensed under GPL
license.
Nonetheless, it is possible to use MySQL by downloading and installing the
connector manually:
1. download and unpack the MySQL Connector/J from
http://dev.mysql.com/downloads/connector/j/
2. copy the mysql-connector-java-5.x.x.jar file to
a. the library directory of the application server
(e.g. $TOMCAT_HOME/lib)
-- OR --
b. the library directory of the Apache Marmotta Web application
(e.g. $TOMCAT_HOME/webapps/marmotta/WEB-INF/lib)
3. restart the application server
Apache Marmotta will then automatically be able to use the MySQL connector
to connect to a MySQL database. Please note that Marmotta requires at least
MySQL 5.x, because it makes use of nested queries and foreign keys.

View 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 &amp; 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))

View 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 &nbsp&nbsp&nbsp 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

View 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);

View 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];
}

View File

@@ -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

File diff suppressed because it is too large Load Diff

View 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
View 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
View 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
View 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&#x20AC;</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&#x20AC;</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&#x20AC;</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&#x20AC;</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&#x20AC;</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&#x20AC;</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&#x20AC;</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&#x20AC;</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&#x20AC;</p>
<p>Colour-block design, zip entry, oxford hood lining, side pockets &amp; 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&#x20AC;</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&#x20AC;</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>

View 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>

View 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>

Some files were not shown because too many files have changed in this diff Show More