Compare commits

..

306 Commits

Author SHA1 Message Date
Arfon Smith
e6ab516fb7 Merge pull request #2911 from github/cut-release-v4.8.1
Cut release v4.8.1
2016-03-25 11:56:13 -06:00
Arfon Smith
7501b82df1 Updating licenses 2016-03-25 11:21:36 -06:00
Arfon Smith
aa6b881971 Bumping to v4.8.1 2016-03-25 11:20:24 -06:00
Arfon Smith
3928734d0f Updating grammars 2016-03-25 11:19:00 -06:00
James Ko
c7868a95bc Merge pull request #2902 from jamesqo/patch-2
Add App.config + NuGet.config to the XML file list
2016-03-23 20:11:36 -06:00
Kepler Sticka-Jones
2012647f78 Merge pull request #2907 from keplersj/clang-format
Add .clang-format as a YAML file
2016-03-23 20:09:34 -06:00
Arfon Smith
84471a5463 Merge pull request #2908 from github/grace
Adding grace grammar back in.
2016-03-23 15:00:46 -06:00
James Ko
57a3c14f2b Merge pull request #2906 from jamesqo/patch-3
Add .vssettings to the list of XML files
2016-03-22 11:57:48 -06:00
Arfon Smith
d9914307eb Merge pull request #2905 from github/ats
Adding ATS grammar
2016-03-21 13:13:52 -06:00
Arfon Smith
71cdf46197 Merge pull request #2903 from github/nesC
Adding nest grammar back
2016-03-21 09:25:02 -06:00
James Ko
8a27884c70 Merge pull request #2899 from jamesqo/patch-1
Add ReSharper's .dotsettings to the list of XML files
2016-03-20 20:16:39 -06:00
Arfon Smith
b881e3e6cb Merge pull request #2900 from github/gdscript
Adding back GDScript grammar
2016-03-20 20:16:01 -06:00
Arfon Smith
ca718d8f2a Fixing up script/licensed verify 2016-03-20 08:47:08 -06:00
Arfon Smith
c6625b1b8a Merge pull request #2898 from github/sourcepawn
Adding back sourcepawn
2016-03-20 08:34:05 -06:00
Arfon Smith
16a6d680c4 Adding Rubygems licenses. 2016-03-19 20:49:41 -06:00
Paul Chaignon
270fa8f5d3 Merge pull request #2894 from pchaigno/fix-warnings
Fix warnings
2016-03-19 20:42:32 -06:00
Arfon Smith
b1f5e93b4a Merge pull request #2897 from github/pig-latin
Adding back Pig Latin grammar
2016-03-19 20:41:13 -06:00
Arfon Smith
79a61c72e1 Restoring curated grammars 2016-03-19 20:33:55 -06:00
Arfon Smith
3f04c11537 Merge pull request #2895 from github/bring-back-boo
Adding back boo
2016-03-19 20:29:11 -06:00
Arfon Smith
b2270613d7 Merge pull request #2896 from github/bring-back-logos
Adding Logos grammar.
2016-03-19 20:26:36 -06:00
Arfon Smith
0fe854421b Merge pull request #2893 from github/extra-assembly
Adding back assembly grammar for object dumps
2016-03-19 08:00:53 -06:00
Arfon Smith
de074f421e Merge pull request #2891 from pchaigno/package-license
MIT license in package.json
2016-03-19 07:47:18 -06:00
Arfon Smith
27590c39bd Merge pull request #2892 from github/bringing-monkey-back
Bringing Monkey grammar back under MIT license
2016-03-19 07:45:05 -06:00
Arfon Smith
67191d4d5e Bringing Monkey grammar back under MIT license 2016-03-19 07:38:59 -06:00
Paul Chaignon
00764f3d59 MIT license in package.json 2016-03-19 13:16:32 +01:00
Arfon Smith
4a2cb32149 Merge pull request #2887 from github/assembly-highlight
Bringing back Assembly highlighting
2016-03-18 20:28:59 -06:00
Arfon Smith
1a11664239 Adding sublimeassembly to license whitelist. 2016-03-18 20:24:06 -06:00
Arfon Smith
9520cbb44c Bringing back Assembly highlighting 2016-03-18 20:15:38 -06:00
Arfon Smith
1aea6b2cdb Merge pull request #2886 from github/puppet-highlight
Adding replacement grammar for Puppet
2016-03-18 17:52:07 -06:00
Arfon Smith
6ff950341a Adding replacement grammar for Puppet 2016-03-18 17:44:05 -06:00
Arfon Smith
b9501e42b2 Merge pull request #2884 from github/licensor-mk2
[WIP] extracting license information
2016-03-18 17:29:05 -06:00
Arfon Smith
065c809dd5 Updating grammars based on script/licensed 2016-03-18 16:52:49 -06:00
Arfon Smith
5b9ea4a78f Updating grammar checks to ensure license compliance 2016-03-18 16:47:34 -06:00
Arfon Smith
b72c4d4400 Fix Ruby deprecation warning 2016-03-18 16:47:09 -06:00
Arfon Smith
d46e214985 Removing InnoSetup grammar 2016-03-18 16:45:56 -06:00
Arfon Smith
799c47ce7a Grammar update 2016-03-18 16:38:21 -06:00
Arfon Smith
b5121e59dd Updating papyrus scopes 2016-03-18 16:38:12 -06:00
Arfon Smith
f6a7b4929f Updating Papyrus grammar 2016-03-18 16:27:56 -06:00
Arfon Smith
162b77ab5a Removing unused grammar 2016-03-18 16:19:44 -06:00
Arfon Smith
92904efd45 Fixing Ruby warning 2016-03-18 16:19:35 -06:00
Arfon Smith
93fabe487f Removing openscad grammar 2016-03-18 16:14:54 -06:00
Arfon Smith
74d704bea2 Removing pig latin grammar 2016-03-18 16:13:46 -06:00
Arfon Smith
ee1bd50dd1 Removing oracle grammar 2016-03-18 16:12:17 -06:00
Arfon Smith
07096f84f5 Removing nix grammar 2016-03-18 16:10:33 -06:00
Arfon Smith
a9b3bd632b Removing puppet grammar 2016-03-18 16:08:55 -06:00
Arfon Smith
eec324890e Removing Idris grammar 2016-03-18 16:05:23 -06:00
Arfon Smith
ca6ac8f0db Removing nesC grammar 2016-03-18 16:03:54 -06:00
Arfon Smith
60ab4a5fe7 Removing SourcePawn grammar 2016-03-18 15:57:00 -06:00
Arfon Smith
10eb5830f0 Removing Monkey grammar 2016-03-18 15:19:32 -06:00
Arfon Smith
835ceae6f6 Removing x86 grammar 2016-03-18 15:18:17 -06:00
Arfon Smith
abe3aa47f6 Removing GDScript grammar 2016-03-18 15:16:18 -06:00
Arfon Smith
53e34072ed Removing Grace grammar 2016-03-18 15:15:08 -06:00
Arfon Smith
f83f761d0a Removing Boo grammar 2016-03-18 15:13:53 -06:00
Arfon Smith
9c18bf3a89 Removing AutoIt grammar 2016-03-18 15:11:03 -06:00
Arfon Smith
f6e1ab444e Removing ATS grammar 2016-03-18 14:55:11 -06:00
Arfon Smith
0ae8b2959d Removing Logos grammar 2016-03-18 14:51:22 -06:00
Arfon Smith
46b0b1e5e2 Removing Creole grammar 2016-03-18 14:48:31 -06:00
Arfon Smith
b44dfb4ab8 Removing Clips grammar 2016-03-18 14:43:18 -06:00
Arfon Smith
868e528810 Downcase 2016-03-18 14:30:07 -06:00
Arfon Smith
0a4c850ef1 Merge branch 'licensor-mk2' of github.com:github/linguist into licensor-mk2 2016-03-18 14:27:19 -06:00
Arfon Smith
b3c4232251 Removing old license 2016-03-18 14:27:06 -06:00
Brandon Keepers
0c38df47b9 Save config 2016-03-18 16:09:54 -04:00
Brandon Keepers
bfd4005760 Disable license caching for rubygems and npm 2016-03-18 16:06:02 -04:00
Arfon Smith
fc9fad15a3 Updating license information for dependencies 2016-03-18 14:02:18 -06:00
Arfon Smith
b5091e88ad Updating licensor -> licensed 2016-03-18 12:32:52 -06:00
Arfon Smith
2610808b6d Updating licenses 2016-03-17 20:30:44 -06:00
Arfon Smith
3cfee4f214 Bumping to licensee v6.0.0 2016-03-17 20:30:22 -06:00
Arfon Smith
70fd116eaf Merge branch 'master' into licensor-mk2 2016-03-17 20:24:23 -06:00
Arfon Smith
62aac9c2f7 Merge branch 'licensor' of github.com:github/linguist into licensor 2016-03-17 20:00:52 -06:00
Arfon Smith
afcf1c6c22 Merge branch 'master' into licensor 2016-03-17 19:57:29 -06:00
Arfon Smith
f3f0365b13 Merge pull request #2883 from williamd1k0/master
Fix regex in .rpy disambiguate
2016-03-17 17:32:32 -06:00
William Tumeo
9bc12843fe Fix regex in .rpy disambiguate 2016-03-17 18:01:32 -03:00
Arfon Smith
5e3ceddf69 Merge pull request #2882 from github/2512-local
Pawn TextMate-compatible grammar (take 2)
2016-03-17 14:05:24 -06:00
Arfon Smith
d377e23193 Merge branch 'master' into 2512-local 2016-03-17 14:00:34 -06:00
Arfon Smith
e6dabd59ad Merge pull request #2875 from github/2821-slim
Add Terra support
2016-03-17 10:40:19 -06:00
Arfon Smith
f0c7380132 Updating sublime-terra grammar 2016-03-17 10:27:39 -06:00
Arfon Smith
697ad4c568 Merge branch 'master' into 2821-slim 2016-03-17 10:23:59 -06:00
Arfon Smith
1efd9b384d Merge pull request #2880 from github/cut-release-v4.8.0
v4.8.0 release
2016-03-16 22:46:29 -06:00
Arfon Smith
c1e71dc215 Bumping to v4.8.0 2016-03-16 21:44:20 -06:00
Arfon Smith
d2c7d27d13 Grammar update 2016-03-16 21:30:18 -06:00
Arfon Smith
1efd4c83f9 Merge pull request #2341 from github/api-changes
Move Linguist::Language.detect to Linguist.detect
2016-03-16 21:15:50 -06:00
Arfon Smith
0f7677423f Merge pull request #2877 from pchaigno/fix-plpgsql-heuristic
Fix PLpgSQL heuristic rule
2016-03-12 06:01:59 -07:00
Paul Chaignon
2a0b0e9f93 Fix heuristic rule for PLpgSQL 2016-03-12 11:17:29 +01:00
Paul Chaignon
faec60188f Tests for .sql heuristic rules 2016-03-12 11:04:53 +01:00
Vicent Marti
709a688858 Merge pull request #2876 from github/vmg/git-debug
git-linguist: Print PWD
2016-03-11 10:33:09 +01:00
Vicent Marti
2448ff8314 git-linguist: Print PWD 2016-03-11 10:27:10 +01:00
Arfon Smith
311202102d Merge branch 'master' into 2821-slim 2016-03-10 06:51:35 -06:00
Arfon Smith
6812a22706 Slimming down Terra samples 2016-03-10 06:50:48 -06:00
Arfon Smith
fb727ce731 Merge pull request #2866 from jasonwilliams200OK/master
Classification of props file
2016-03-09 20:53:07 -06:00
Peter Jas
6af499e352 Classification of props file
* Initially treat as XML
* Disambiguate from ini (key-value pair style with `=`)
* If the file is neither XML-style nor INI, classify as SQL
2016-03-10 02:46:57 +00:00
Arfon Smith
66ec33cf8e Merge pull request #2873 from github/2427-local
2427 local
2016-03-09 19:55:29 -06:00
Arfon Smith
f2694f3a74 Merge branch 'master' into 2427-local 2016-03-09 19:49:32 -06:00
Arfon Smith
d069d0e444 Merge pull request #2870 from kusma/hlsl
make .hlsl the primary extension for HLSL
2016-03-09 07:02:11 -06:00
Erik Faye-Lund
56ee61b17c make .hlsl the primary extension for HLSL
When I submitted the HLSL-language, I accidentally missed that the
first extension was the primary one (as is documented in the source
code, which I unfortunately missed), and instead alphabetized the
whole list.

The primary extension should be .hlsl, so let's remedy this.
2016-03-09 12:49:29 +00:00
Arfon Smith
b945726017 Merge pull request #1965 from github/combine-gems
Merge github-linguist-grammars into github-linguist
2016-03-09 06:35:31 -06:00
Lars Brinkhoff
6f8a7d1070 Exclude 'filenames' from all_fixtures. 2016-03-09 13:28:00 +01:00
Lars Brinkhoff
b032886c21 Add .me and other text filenames.
click.me by Bram Moolenaar; VIM license.
2016-03-09 13:27:59 +01:00
Arfon Smith
988739d566 Merge branch 'master' into combine-gems 2016-03-09 06:25:35 -06:00
Arfon Smith
8cd80801e8 Fixing indentation 2016-03-09 06:15:41 -06:00
Arfon Smith
c3b7a1a6fb Merge pull request #2146 from pchaigno/norwegian
Support for two Norwegian text extensions
2016-03-09 06:02:58 -06:00
Arfon Smith
9d0eff75ad Merge pull request #2869 from pchaigno/sublime-syntax
Support for YAML .sublime-syntax extension
2016-03-09 06:02:00 -06:00
Paul Chaignon
3ccb548b6d Support for YAML .sublime-syntax extension 2016-03-09 11:29:25 +01:00
Paul Chaignon
eeedd53f32 Support for Text extension .no (Norwegian text) 2016-03-09 10:38:47 +01:00
Paul Chaignon
11a3b5b73c Support for Text extension .nb (Norwegian text) 2016-03-09 10:37:41 +01:00
Lars Brinkhoff
eacc48e8c7 Add .me to Groff file extensions. 2016-03-09 07:52:29 +01:00
Mike Linksvayer
5b72b4d353 move note about grammar repos from LICENSE to README.md 2016-03-08 21:05:55 -08:00
Arfon Smith
3f940ce8b8 Merge pull request #2868 from github/2603-local
2603 local
2016-03-08 22:03:30 -06:00
Arfon Smith
b2e3ea2334 Adding ace_mode back for M4Sugar 2016-03-08 21:56:01 -06:00
Arfon Smith
4637da8c32 Merge branch 'master' into 2603-local 2016-03-08 21:53:23 -06:00
Arfon Smith
6b88c5ba86 Merge pull request #2842 from kusma/hlsl
Add support for HLSL
2016-03-07 20:36:25 -06:00
Arfon Smith
5fdb596214 Merge pull request #2858 from williamd1k0/master
Fix "Ren'Py being detected as Python" #2849
2016-03-07 20:34:44 -06:00
Arfon Smith
c989b02285 Merge pull request #2857 from Dominator008/buck
Add BUCK filename to Python in languages.yml
2016-03-04 12:46:00 -06:00
Arfon Smith
c8301dc20b Merge pull request #2861 from jglick/Jenkinsfile
Recognizing Jenkinsfile as Groovy source
2016-03-04 11:12:00 -06:00
Jesse Glick
ca4ea03828 Recognizing Jenkinsfile as Groovy source. 2016-03-03 19:15:09 -05:00
Michael Zhou
ae27c71d5a Add BUCK filename to Python in languages.yml
BUCK is the filename for the build files of the Facebook Buck build
system. BUCK files are valid Python files.

Eg.:
  https://github.com/GerritCodeReview/gerrit/blob/master/BUCK

Also add a missing sample for Pants / Bazel BUILD files. They are also
valid Python files.
2016-02-29 20:43:55 -05:00
Arfon Smith
3d1555e278 Merge pull request #2856 from github/cut-release-v4.7.6
Cut release v4.7.6
2016-02-29 08:24:58 -07:00
Arfon Smith
54fab9eb4e Bumping to v4.7.6 2016-02-29 07:55:43 -07:00
Arfon Smith
8fea8a0b47 Grammar update 2016-02-29 07:54:29 -07:00
Arfon Smith
f14ae8e51b Merge pull request #2803 from c-lipka/master
Added support for the POV-Ray Scene Description Language.
2016-02-28 07:33:05 -07:00
William Tumeo
6b60e5e786 Remove wrong line in the sample 2016-02-27 23:57:46 -03:00
William Tumeo
40413dfcc7 Add class and def to regex 2016-02-27 23:55:53 -03:00
William Tumeo
07f5ad1daa Merge remote-tracking branch 'upstream/master'
Update fork 3
2016-02-27 23:22:04 -03:00
Arfon Smith
57f5a3e780 Merge pull request #2831 from FarbodSalamat-Zadeh/patch-1
Add CSV as data type to languages.yml
2016-02-27 15:54:44 -07:00
Farbod Salamat-Zadeh
3be007526c Fix fixture_blob("Data/cars.csv")
Changes `fixture_blob("Data/cars.csv")` to `sample_blob("CSV/cars.csv")`
2016-02-27 15:30:22 +00:00
Farbod Salamat-Zadeh
9bfbd0550c Move cars.csv from test/fixtures/Data to samples/CSV 2016-02-27 14:32:50 +00:00
Christoph Lipka
0301a5dcdf Merge remote-tracking branch 'upstream/master' 2016-02-27 06:24:30 +01:00
Farbod Salamat-Zadeh
db994a1197 Remove .txt extension for CSV format 2016-02-27 00:42:03 +00:00
Arfon Smith
855c13ea2a Merge pull request #2851 from edechter/master
Add .yap ext and yap interpreter for Prolog lang
2016-02-26 17:21:11 -07:00
William Claude Tumeo
bfa7eced44 Try fix "Ren'Py being detected as Python"
- Remove Ren'Py from Python group
- Add .rpy to Python + sample
2016-02-26 00:31:58 -03:00
William Claude Tumeo
b1d103b1f3 Merge remote-tracking branch 'upstream/master'
Update fork 2
2016-02-25 21:56:49 -03:00
Arfon Smith
fc816d3429 Merge pull request #2845 from kusma/uno
add support for Uno
2016-02-23 17:56:51 -07:00
William Tumeo
04a4e8c8e6 Merge pull request #1 from github/master
Update fork
2016-02-23 16:09:26 -03:00
Eyal Dechter
ab69fd01ac Add .yap ext and yap interpreter for Prolog lang 2016-02-22 15:59:40 -05:00
Erik Faye-Lund
cc6106f31b add sample ux-files 2016-02-22 18:45:59 +01:00
Erik Faye-Lund
ead85379ed add sample uno-files 2016-02-22 18:44:02 +01:00
Erik Faye-Lund
f8d6be55ee add .ux as an XML extension
This is used by Fusetools' UX markup:
https://www.fusetools.com/learn/fuse#hello-ux-markup
2016-02-20 14:45:31 +01:00
Arfon Smith
a241d75043 Merge pull request #2846 from Dominator008/bzl
Add .bzl extension to Python in languages.yml
2016-02-19 20:14:15 -07:00
Michael Zhou
864a6c0a20 Add .bzl extension to Python in languages.yml
.bzl is the extension for Skylark, a subset of Python that is used
to define build extensions for the Bazel build system.

Eg:
  https://github.com/bazelbuild/bazel/blob/master/tools/build_rules/closure/closure_js_binary.bzl
2016-02-19 19:11:36 -05:00
Arfon Smith
1c20c54191 Fixing ordering of makefile filenames 2016-02-19 16:55:38 -07:00
Arfon Smith
4d722d1fd1 Merge pull request #2838 from scop/makefile
Makefile: Add Makefile.am and Makefile.in filenames
2016-02-19 12:39:59 -07:00
Erik Faye-Lund
b67254e986 add support for Uno
Uno is a fast, native dialect of C#, that includes a lot of
specialized functionality for graphics programming.

https://www.fusetools.com/learn/uno
2016-02-19 18:52:12 +01:00
Arfon Smith
041cf9c94e Merge pull request #2837 from scop/shell-script
Shell: Add shell-script alias for recognizing Emacs modelines
2016-02-19 09:05:37 -07:00
Ville Skyttä
b08c5a8421 Shell: Add .sh.in extension 2016-02-19 17:56:50 +02:00
Arfon Smith
125eaa4cc3 Merge pull request #2844 from pchaigno/hacking.rst.txt
Move HACKING.rst.txt to sample directory
2016-02-19 08:44:01 -07:00
Erik Faye-Lund
6b001cf861 add support for HLSL/FX
Add support for DirectX HLSL / FX files. The FX files are
just HLSL files with some additional syntax to set
render-states and define multiple shader stages in one file.

Samples are either written by me, or taken from Chromium.
2016-02-19 11:32:46 +01:00
Paul Chaignon
5c4129f85b Move HACKING.rst.txt to sample directory
The file was incorrectly placed at the root of the repo
2016-02-19 08:50:01 +01:00
Brandon Keepers
fa56879790 WIP 2016-02-18 19:26:45 -05:00
Erik Faye-Lund
41713d7719 add a sample of FLUX code
These samples were taken from the paper "Flux: A Language for
Programming High-Performance Servers", by Burns et al and Flux V0.02
which can be found here:

https://plasma.cs.umass.edu/emery/flux.1.html
2016-02-18 23:38:56 +01:00
Ville Skyttä
17a9463588 Makefile: Add Makefile.am and Makefile.in filenames 2016-02-14 22:08:21 +02:00
Ville Skyttä
fb9f271720 Shell: Add shell-script alias for recognizing Emacs modelines 2016-02-14 22:00:16 +02:00
Arfon Smith
8de50edb41 ruby for example 2016-02-12 17:05:44 -07:00
Arfon Smith
ab33fccddd Merge pull request #2836 from github/cut-release-v4.7.5
Cut release v4.7.5
2016-02-12 16:58:11 -07:00
Arfon Smith
bd95ac0beb Bumping version 2016-02-12 16:27:29 -07:00
Arfon Smith
7b3efb185f Updating grammars 2016-02-12 16:25:05 -07:00
Farbod Salamat-Zadeh
a0065febe2 Add ace_mode and tm_scope for CSV 2016-02-06 16:34:33 +00:00
Arfon Smith
9374784651 Merge pull request #2805 from jamesqo/patch-1
Add .xproj to list of XML file extensions
2016-02-04 20:28:47 -07:00
Arfon Smith
aa6af3deed Merge pull request #2822 from AbigailBuccaneer/master
Add detection of GrammarKit-generated files
2016-02-04 20:28:12 -07:00
Arfon Smith
a19e501b44 Merge pull request #2833 from pchaigno/less-new-grammar
New grammar for Less
2016-02-03 08:45:08 -07:00
Paul Chaignon
889a395340 Grammar for Less from Atom package 2016-02-03 14:22:23 +01:00
Paul Chaignon
eb8eb28ca7 Remove Less grammar 2016-02-03 14:19:58 +01:00
Arfon Smith
697b3351e6 Merge pull request #2832 from github/better-perl6
Adding Perl6-specific grammar.
2016-02-02 22:43:12 -07:00
Arfon Smith
9fd80bfd67 Updating to latest perl6 grammar 2016-02-02 22:38:50 -07:00
Arfon Smith
7b58b1ea59 Adding Perl6-specific grammar. 2016-02-02 19:37:35 -07:00
Farbod Salamat-Zadeh
c454396c26 Add CSV as data type to languages.xml
Adds the .csv extension (and also .txt extension) so that this file type is shown when searching on GitHub.
2016-02-02 19:41:05 +00:00
Bayu Aldi Yansyah
2e9d8f5520 samples: remove empty file 2016-02-01 16:02:19 +07:00
Bayu Aldi Yansyah
c8ea3fba5a terra use #00004c 3 shades from Lua #000080
http://www.color-hex.com/color/000080
2016-02-01 15:11:46 +07:00
Bayu Aldi Yansyah
56af13047c grammar: add Terra 2016-02-01 15:11:24 +07:00
Arfon Smith
c46900396a Merge pull request #2827 from pchaigno/yang
Support for the YANG modeling language
2016-01-31 18:33:07 -06:00
Paul Chaignon
b235ed1223 Grammar for YANG from Atom package 2016-01-31 10:31:06 +01:00
Paul Chaignon
16d9612603 Support for YANG language 2016-01-31 10:29:06 +01:00
Abigail
721e5b4656 Add detection of GrammarKit-generated files
GrammarKit is a plugin by JetBrains for creating custom language plugins
for JetBrains IDEs (such as IntelliJ, RubyMine, CLion and more). It
defines a BNF parser language which can be used to generate a parser in
Java, and it also integrates JFLex for generating a lexer in Java.

Both of these generated Java files can be recognised by a comment on the
first line of the file, and so classifying them as generated is trivial.
2016-01-28 11:47:33 +00:00
Bayu Aldi Yansyah
9b8b39f444 samples: add Terra samples
source: https://github.com/zdevito/terra/tree/master/tests
2016-01-28 11:22:27 +07:00
Bayu Aldi Yansyah
e32a837fb2 languages.yml: add Terra 2016-01-28 10:52:03 +07:00
Arfon Smith
9961f8bc1c Merge pull request #2797 from lpil/erlang-leex-yecc
support for leex (.xrl) / yecc (.yrl) files
2016-01-23 11:36:43 -05:00
Arfon Smith
c066867d59 Merge pull request #2812 from chrisarcand/improved-vim-modeline-detection
Improved vim modeline detection
2016-01-21 20:12:26 -05:00
Arfon Smith
21093165e1 Merge pull request #2613 from ismailarilik/patch-2
Add colors for some languages.
2016-01-21 20:10:36 -05:00
James Ko
df88de14e3 Add .xproj to list of XML extensions 2016-01-20 19:01:19 -05:00
Arfon Smith
94de431aa5 Merge pull request #2811 from pchaigno/pod-heuristic
Heuristic for Pod vs. Perl
2016-01-18 07:59:47 -05:00
Arfon Smith
502557a97f Merge pull request #2808 from pchaigno/submodules-ssh
HTTPS links for submodules
2016-01-17 16:14:55 -05:00
Paul Chaignon
52938f6dbf Test submodules are using HTTPS links 2016-01-17 18:14:51 +01:00
chrisarcand
d87fad649c Improved vim modeline detection
TLDR: This greatly increases the flexibility of vim modeline detection
to manually set the language of a file.

In vim there are two forms of modelines:

[text]{white}{vi:|vim:|ex:}[white]{options}
examples: 'vim: syntax=perl', 'ex: filetype=ruby'

-and-

[text]{white}{vi:|vim:|Vim:|ex:}[white]se[t] {options}:[text]
examples: 'vim set syntax=perl:', 'Vim: se ft=ruby:'

As you can see, there are many combinations. These changes should allow
most combinations to be used. The two most important additions are the
use of the keyword 'syntax', as well as the addition of the first form
(you now no longer need to use the keyword 'set' with a colon at the end).
The use of first form with 'syntax' is very, very common across GitHub:

https://github.com/search?l=ruby&q=vim%3A+syntax%3D&ref=searchresults&type=Code&utf8=%E2%9C%93
2016-01-16 08:57:20 -05:00
Paul Chaignon
d8666e5309 Heuristic for Pod vs. Perl
.pod files classified as Pod if they contain any Pod syntax
2016-01-16 11:21:26 +01:00
Arfon Smith
0c071990cb Merge pull request #2809 from github/cut-release-v4.7.4
v4.7.4 release
2016-01-15 10:34:50 -05:00
Arfon Smith
77dfb19a50 Bumping to v4.7.4 2016-01-15 09:21:43 -05:00
Arfon Smith
49254f1f74 Grammar update 2016-01-15 09:19:24 -05:00
Arfon Smith
9dd952c175 Merge pull request #2807 from mrmonday/patch-1
Support .rs.in as a file extension for Rust files.
2016-01-15 09:11:36 -05:00
Robert Clipsham
0b9897db1f Support .rs.in as a file extension for Rust files.
When using syntax extensions in stable or beta Rust channels using the syntex package, it is common to use the file extension .rs.in for the source file, and .rs for the generated file.
2016-01-11 19:15:01 +00:00
Christoph Lipka
9d11128362 Updated POV-Ray SDL grammar sub-project 2016-01-10 21:24:02 +01:00
Christoph Lipka
ee17ab3e26 Empty commit to trigger re-run of build checks. 2016-01-10 21:14:17 +01:00
Christoph Lipka
06af36dac2 Fixed POV-Ray SDL entry in grammars.yml and Ace mode in languages.yml 2016-01-10 20:23:09 +01:00
Christoph Lipka
51d6d741e5 Fixed ordering of POV-Ray SDL in languages.yml 2016-01-10 20:11:26 +01:00
Christoph Lipka
b593a8ae67 Added more samples for the POV-Ray Scene Description Language 2016-01-10 18:40:29 +01:00
Christoph Lipka
7b30240a7f Added POV-Ray Scene Description Language 2016-01-10 13:05:41 +01:00
Paul Chaignon
71f124faa5 HTTPS links for submodules
When cloning the repository with all its submodules,
users without an SSH key registered will fail to clone
submodules with an SSH link
2016-01-10 10:10:41 +01:00
Arfon Smith
470bd34349 Merge pull request #2800 from github/2794-local
[UPDATED] Switch to a different (and better) grammar for Inform 7 source code
2016-01-07 16:37:28 -05:00
Arfon Smith
65087dd7b8 Merge branch 'master' into 2794-local 2016-01-07 16:28:54 -05:00
Arfon Smith
89c5361f25 Merge pull request #2772 from ibnfirnas/fix-copypasta-artifact
Remove copypasta artifact.
2016-01-07 16:26:10 -05:00
Arfon Smith
f82cc26e4f Merge pull request #2778 from pchaigno/wiki
New extensions for consistency with Markup
2016-01-07 16:25:47 -05:00
Louis Pilfold
15232fc072 Add the LFE lexer as an example of erlang .xrl 2016-01-04 12:17:31 +00:00
Louis Pilfold
0a7aab947c Add the Elixir parser as an example of erlang .yrl 2016-01-04 12:16:32 +00:00
Louis Pilfold
5906fa81bb support for Erlang leex (.xrl) / yecc (.yrl) files 2016-01-04 11:12:39 +00:00
Arfon Smith
1b2f574af2 Merge pull request #2782 from pchaigno/perl-heuristic-order
Reorder Perl heuristic rules
2016-01-03 07:44:54 -05:00
Paul Chaignon
ca4bc6110f Remove 'use strict' from Perl6 sample 2016-01-03 11:47:09 +01:00
Arfon Smith
a944769d61 Grammars update 2016-01-02 22:18:27 -05:00
Arfon Smith
98a31515ef Merge pull request #2796 from github/2703-local
MagicPython
2016-01-02 22:09:52 -05:00
Arfon Smith
3e665099ac Updating Python grammars 2016-01-02 22:04:16 -05:00
Arfon Smith
5400b534e4 Merge branch 'master' into 2703-local 2016-01-02 21:38:37 -05:00
Arfon Smith
6f2d4dc195 Merge pull request #2788 from nwolverson/update-purescript-submodule
Update PureScript submodule (moved repo, grammar tweak)
2016-01-02 21:33:21 -05:00
Arfon Smith
4f7fac3ba1 Merge pull request #2783 from jrnold/add-stan-extension
Add stan extension
2016-01-02 21:32:14 -05:00
Arfon Smith
fd6569830a Merge pull request #2792 from aqnouch/patch-1
Updated copyright to 2016
2016-01-02 21:23:52 -05:00
Andrew Plotkin
5d4cad6394 Remove the old submodule entry. 2016-01-01 22:40:23 -05:00
Andrew Plotkin
b790a49282 Remove the old Sublime-Inform grammar from the submodules list. 2016-01-01 22:25:11 -05:00
Andrew Plotkin
537b83c759 Switch from Sublime-Inform grammar to language-inform7 grammar
for Inform 7 source code.
2016-01-01 22:23:01 -05:00
Andrew Plotkin
c0b9e2c3f4 Update comment. 2016-01-01 21:52:51 -05:00
Andrew Plotkin
f488b9b9f7 Test strings and substs in a doc comment. 2016-01-01 17:22:06 -05:00
Andrew Plotkin
7060b116f4 Reword a little. 2016-01-01 16:54:55 -05:00
Andrew Plotkin
0f4cf11294 Wrong semicolon. 2016-01-01 16:34:23 -05:00
Andrew Plotkin
048496723b Include lots more forms of Inform7 syntax. Including embedded Inform6
syntax.
2016-01-01 16:15:03 -05:00
AQNOUCH Mohammed
70068f74f1 Updated copyright to 2016 2016-01-01 01:53:09 +00:00
Nicholas Wolverson
6f197bacc7 Update PureScript submodule (moved repo, grammar tweak)
Updated grammar to support triple-quoted strings properly:
0c53f8162e

atom-language-purescript repo has been moved to purescript-contrib org,
update the URL.
2015-12-29 23:22:53 +00:00
jrnold
24a89d2d75 add tm_grammar for Stan 2015-12-28 22:32:53 -08:00
jrnold
1ac16cbec7 add vendor for Stan 2015-12-28 22:31:49 -08:00
jrnold
8144438f39 Add color for Stan
Use the brick-red color of the [Stan logo](https://raw.githubusercontent.com/stan-dev/logos/master/logo.png).
2015-12-27 18:50:43 -08:00
jrnold
f141abbc73 add tm_scope for Stan 2015-12-24 16:05:06 -08:00
jrnold
5329b96793 add Stan samples 2015-12-24 15:55:14 -08:00
jrnold
7a70931066 add Stan to languages 2015-12-24 15:55:00 -08:00
Paul Chaignon
9a070d7bb3 Reorder Perl heuristic rules
Order heuristic rules by accuracy
Heuristic rules which are expected to generated
less false positives should be tested first
2015-12-23 21:43:55 +01:00
Paul Chaignon
189b2d684b .rst.txt and .rest.txt as reStructuredText extensions 2015-12-20 16:21:11 +01:00
Paul Chaignon
71dfac26fe .wiki extension as Mediawiki 2015-12-20 13:09:00 +01:00
Arfon Smith
efdc790374 Merge pull request #2776 from humzashah/minor-code-improvements
minor code improvements
2015-12-18 11:50:25 -05:00
Syed Humza Shah
a3613dc438 fixed a typo 2015-12-18 01:43:01 +00:00
Syed Humza Shah
97afedd861 removed usage of keyword as variable
this was done mainly to fix annoying syntax highlighting
2015-12-18 01:27:58 +00:00
Syed Humza Shah
00a436f175 used proper 'if/elsif/end' syntax 2015-12-18 01:24:05 +00:00
Siraaj Khandkar
aa2e3000cd Remove copypasta artifact. 2015-12-16 14:00:48 -05:00
Arfon Smith
10e0fa4360 Merge pull request #2771 from ibnfirnas/add-mathematica-test-file-extension
Add mathematica unit test file extension
2015-12-15 19:48:05 -05:00
Siraaj Khandkar
0473af368f Add sample Mathematica test files. 2015-12-15 13:37:55 -05:00
Siraaj Khandkar
b82f563c38 Add Mathematica test file extension: .mt 2015-12-15 13:33:03 -05:00
Arfon Smith
344297895b Merge pull request #2768 from williamd1k0/master
Add Ren'Py language and grammars
2015-12-14 09:41:45 -05:00
William Claude Tumeo
d3c525645b Fix sample folder name and language order 2015-12-13 15:58:14 -02:00
William Claude Tumeo
59d02e5138 Add language-renpy submodule 2015-12-13 00:20:25 -02:00
William Claude Tumeo
8522dc1d33 Add Ren'Py language and grammars 2015-12-13 00:16:09 -02:00
Vicent Marti
53d238f310 Merge pull request #2766 from github/piki/clear-cache
Catch `ENOENT` in `clear_cache`
2015-12-10 09:08:40 +01:00
Patrick Reynolds
92ed2d189e Catch ENOENT in clear_cache
There's no need for `clear_cache` to fail if the cache doesn't exist,
either because we call `clear_cache` twice or because no cache was
previously written on this particular repo.
2015-12-09 23:24:32 -06:00
Arfon Smith
7133c3b11a Merge pull request #2765 from github/cut-release-v4.7.3
Bumping version to v4.7.3
2015-12-08 23:17:35 -05:00
Arfon Smith
d72114083b Bumping version to v4.7.3 2015-12-08 22:30:17 -05:00
Arfon Smith
683925fcd5 Updating grammars 2015-12-08 22:28:46 -05:00
Arfon Smith
1c8bf32d35 Merge pull request #2759 from pchaigno/click
Support for the Click modular router language
2015-12-08 16:08:55 -05:00
Paul Chaignon
28913833f4 Merge branch 'master' into click 2015-12-08 22:00:49 +01:00
Arfon Smith
c6752be546 Merge pull request #2749 from Alhadis/maxscript
Add language support for MAXScript
2015-12-08 08:04:13 -05:00
Arfon Smith
395e474cad Merge pull request #2763 from github/2746-local
Jupyter notebook, version 2
2015-12-08 07:45:57 -05:00
Arfon Smith
16ea189aa6 Colour switch 2015-12-08 07:39:43 -05:00
marcelo-ramires
ac81fc5da9 Changing Jupyter Notebook color to a further darker shade to make it even more different from Mask's one 2015-12-07 14:12:18 -02:00
marcelo-ramires
58191c10b3 Changing Jupyter Notebook color to make it more different from Mask's one 2015-12-07 14:00:18 -02:00
marcelo-ramires
c2ca23d580 Removing extra leading space 2015-12-05 19:38:02 -02:00
marcelo-ramires
b5dfb40c7d Setting Jupyter Notebook's language property tm_scope to source.json 2015-12-05 18:57:40 -02:00
marcelo-ramires
7e647fd915 Renaming the sample folder to match Jupyter Notebook's, making the language type markup, and adding a real sample file instead of a dummy one 2015-12-05 18:48:17 -02:00
Paul Chaignon
5b9f9bc0e6 Grammar for Click from Atom package 2015-12-05 14:03:02 +01:00
Paul Chaignon
b1c057fa30 Support for the Click router config language 2015-12-05 13:58:14 +01:00
marcelo-ramires
ca348dd373 Moving .ipynb extension from python language to a new language called Jupyter Notebook 2015-12-05 03:25:38 -02:00
Arfon Smith
b802045c5c Grammar updates 2015-12-03 17:27:17 -06:00
Arfon Smith
3c244a9501 Merge pull request #2758 from github/2667-local
Add Ur/Web support
2015-12-03 16:03:12 -06:00
Arfon Smith
832a7b9b06 Merge branch 'master' into 2667-local 2015-12-03 15:41:25 -06:00
Arfon Smith
e7d856345f Merge pull request #2757 from scottclowe/octave-alias
Add octave as an alias for Matlab syntax
2015-12-03 15:35:55 -06:00
Scott Lowe
ac559effaa Add octave as an alias for Matlab syntax
Since Octave is a clone of Matlab, the syntax is exactly the same
and hence it is desirable for highlighting to be exactly the same
as well.
Adding octave as an alias for Matlab will trivially provide support
for highlighting Octave code, and will ensure the two languages
always use the same syntax highlighting rules.
2015-12-03 21:00:21 +00:00
Arfon Smith
95d0daba80 Merge pull request #2755 from github/add-elixir-interpreter
Adding elixir as an interpreter
2015-12-02 16:23:14 -06:00
Arfon Smith
a0ad1523a1 Adding elixir as an interpreter 2015-12-02 14:52:29 -06:00
Alhadis
06c049b8c0 Change ".ms" heuristic to accommodate MAXScript
Linguist currently uses the presence of "move" commands to differentiate
a GAS file from Groff. This is problematic with MAXScript, with includes
a built-in function of that name. Furthermore, because of the language's
exhaustive vocabulary, case insensitive nature and flexible syntax, it's
difficult to impose rigid criteria on classifying it.

This commit modifies the heuristic to assume the following flow:

    1. If a line contains ".include" or ".global"/".globl" which doesn't
       follow a non-whitespace character, assume GAS.

    2. Otherwise, if the line starts with a command like ".LG7E0" with a
       possible string of whitespace before it, assume it's also GAS.

       UNLESS either of the following conditions are true:
       2a. The token is enclosed by a string or /* multiline comment */
       2b. The previous line ends with a backslash to denote a statement
           broken between lines, with possible whitespace and/or comment
           sequences between the backslash and the actual newline.

    3. If neither of the above are met, assume the file is MAXScript.

This approach may appear overly-inclusive, but given real-world usage of
MAXScript includes writing brief files with few distinguishing keywords,
it's reasonable to permit this leniency.
2015-11-28 04:40:29 +11:00
marcelo-ramires
24c7380765 Adding .ipynb (Jupyter Notebook) extension to python, and a sample file 2015-11-26 02:55:39 -02:00
Alhadis
73ef1bf156 Update MAXScript submodule to version v1.0
This is the first "real" version of the language package, which I pushed
to Atom's packages repository earlier before.
2015-11-26 05:58:10 +11:00
Alhadis
f46e053633 Darken MAXScript's language colour
Rake's tests are failing because #0AA is too similar to the colour being
used by another language (Dart: #00B4AB). This commit increases contrast
enough to satisfy the build (with 00A6A6 being the closest shade allowed
by the current colour threshold).

See also: github/linguist@3c96f9e
2015-11-23 19:04:09 +11:00
Alhadis
d2e739ba8c Update MAXScript submodule to include license file
See also: Alhadis/language-maxscript@96dbacf5b
2015-11-23 19:02:50 +11:00
Alhadis
37174e1d2c Include MAXScript submodule in grammars directory 2015-11-23 17:34:43 +11:00
Alhadis
cdb5206def Define MAXScript's language traits
The colour chosen to represent the language is taken from Autodesk's own
colouring scheme, which should easily be recognised by their userbase.
2015-11-23 17:14:35 +11:00
Alhadis
d636eaf1e3 Add example MAXScript files from Autodesk reference 2015-11-23 17:12:18 +11:00
Dario Bertini
7b185cc2f3 Switch to MagicPython for Python sources 2015-10-23 20:49:05 +01:00
Brandon Keepers
33dc865c30 run script/licensor 2015-10-20 17:45:45 -04:00
Brandon Keepers
0d469e2966 Add licensor 2015-10-20 17:44:31 -04:00
Julian Squires
538f479b60 Add sample Ur/Web files
Taken from tokenrove/parsur so I don't have to worry about license
hassles.  (You may relicense these samples as necessary.)

It would be nice to have an example of the embedded SQL syntax in a
sample.
2015-10-03 08:28:44 -04:00
Julian Squires
88cc73fa49 Add language definition for Ur/Web
I have omitted the related .urp extension because these are small
files (projects) in a different syntax.
2015-10-03 08:28:44 -04:00
ismail-arilik
4d2b38497d Remove color attributes of 'type: data's. 2015-09-02 18:53:29 +03:00
ismail-arilik
fc5ae1cfbc Revert colors of some languages.
Revert colors of some languages which have 'type: data' attribute.
2015-09-02 17:53:58 +03:00
ismail-arilik
7e76d1cc6b Update Pascal color to fix the closeness issue. 2015-09-02 17:01:38 +03:00
ismail-arilik
cf834e8a21 Update some colors to fix closeness. 2015-09-02 16:23:33 +03:00
ismail-arilik
ee61466042 Update some colors to fix closeness. 2015-09-02 15:58:46 +03:00
ismail-arilik
35884d482c Update some colors to fix closeness. 2015-09-02 15:38:41 +03:00
ismail-arilik
802de8112c Update some colors to fix closeness. 2015-09-02 14:39:19 +03:00
ismail-arilik
9a76cfc85f Update some colors to fix closeness.
I have used syntactic color values with respect to the table below:

A | B C | D | E | F G | H | I | J K | L M | N O | P Q | R S | T U | V W | X | Y Z
0     1     2   3     4     5   6   7      8        9      A      B     C       D    E     F

For example for Gradle the color should be 4B0283, for Cuda the color should be 1C201C(for six-letter CudaCu) and for reStructuredText the color should be B3BCBC(for six-letter reStru).
2015-09-02 14:16:12 +03:00
ismail-arilik
dc41dd888d Update Cuda color to fix closeness. 2015-09-02 13:31:51 +03:00
ismail-arilik
827ad80311 Update colors to fix collision.
Colors basically incremented.
2015-09-02 10:16:37 +03:00
ismail-arilik
9e3d8ac4e9 Update Batchfile color. 2015-09-02 09:58:14 +03:00
ismail-arilik
1b327e29ba Add colors for some languages.
These are effected languages and the reason behind the proposed colors:

- Ant Build System: The color of logo (http://ant.apache.org/images/project-logo.gif).
- AppleScript: AppleScript editor logo (https://en.wikipedia.org/wiki/AppleScript#/media/File:AppleScript_Editor_Logo.png).
- Batchfile: Batch file icon in Windows (https://en.wikipedia.org/wiki/Batch_file#/media/File:Batch_file_icon_in_Windows_Vista.png).
- Bison: A color taken from a bison (https://en.wikipedia.org/wiki/Bison#/media/File:Americanbison.jpg).
- Cucumber: Official logo color (https://cucumber.io/images/cucumber-logo.svg).
- Cuda: Nvidia(creator of CUDA) logo color (http://www.nvidia.com/content/includes/redesign2010/images/redesign10/nvidia_logo.png).
- Gradle: Official Gradle logo color (https://gradle.org/wp-content/uploads/2015/03/GradleLogoReg.png).
- Hack: Hack logo color (http://hacklang.org/wp-content/themes/hack/hack.png).
- Haml: Haml logo color (http://haml.info/images/haml.png).
- LLVM: Eye color of the dragon logo of LLVM (http://llvm.org/img/DragonMedium.png).
- Less: Less logo color (http://lesscss.org/public/img/logo.png).
- Markdown: The Daring Fireball logo color (http://daringfireball.net/graphics/logos/).
- Maven POM: The maven logo color (https://en.wikipedia.org/wiki/Apache_Maven#/media/File:Maven_logo.svg).
- Nginx: The nginx logo color (http://nginx.org/nginx.png).
- NumPy: The NumPy logo color (http://www.numpy.org/_static/numpy_logo.png).
- RDoc: I couldn'd find any logo, so have used the color of the name of RDoc in the official site (http://docs.seattlerb.org/rdoc/).
- SCSS: The Sass logo color (http://sass-lang.com/assets/img/logos/logo-b6e1ef6e.svg).
- Sass: The Sass logo color (http://sass-lang.com/assets/img/logos/logo-b6e1ef6e.svg).
- XML: A random color.
- XSLT: A random color.
- YAML: The color of the name of YAML in the official site (http://yaml.org/).
- Yacc: A random color.
- reStructuredText: The official logo color (http://docutils.sourceforge.net/rst.png).
2015-09-01 21:51:48 +03:00
Matěj Týč
26a35ea43d added aclocal to the generated files list 2015-09-01 17:51:18 +02:00
Matěj Týč
81ebef2e29 Added autoconf output, removed configure.ac 2015-09-01 17:49:01 +02:00
Matěj Týč
1068cfb4b5 Removed stray M4 attribute 2015-08-30 15:25:42 +02:00
Matěj Týč
73b1737dc7 Removed a typo 2015-08-30 15:09:45 +02:00
Matěj Týč
1d86f40fcd Added m4sugar language, moved samples to right locations. 2015-08-30 15:03:55 +02:00
Matěj Týč
59fb481138 Added pure m4 example 2015-08-27 15:40:10 +02:00
Matěj Týč
16e22b3b77 Added M4 samples 2015-08-27 15:37:32 +02:00
Matěj Týč
aa701c6766 Update languages.yml 2015-08-25 01:09:42 +02:00
ziggi
ed4bbe97d1 Back to uppercase name 2015-07-20 12:07:27 +03:00
ziggi
f05c437221 Update submodule 2015-07-20 10:05:11 +03:00
ziggi
483488a2fa Add .inc extension for Pawn 2015-07-18 03:55:51 +03:00
ziggi
b36c4f2428 TextMate for Pawn 2015-07-18 03:27:07 +03:00
Brandon Keepers
924fddf698 Move Linguist::Language.detect to Linguist.detect 2015-04-17 14:56:08 +12:00
Adam Roben
23e55e92ca Mention grammar licenses in LICENSE 2015-01-08 09:19:18 -05:00
Adam Roben
0cfdbfb91c Merge github-linguist-grammars into github-linguist
Now that all our grammars are licensed (or grandfathered in), we can
distribute them as part of the standard github-linguist gem. This makes
it easier for projects to get up and running with Linguist.
2015-01-07 14:47:26 -05:00
496 changed files with 43920 additions and 855 deletions

145
.gitmodules vendored
View File

@@ -7,9 +7,6 @@
[submodule "vendor/grammars/sublime-cirru"]
path = vendor/grammars/sublime-cirru
url = https://github.com/Cirru/sublime-cirru
[submodule "vendor/grammars/Sublime-Logos"]
path = vendor/grammars/Sublime-Logos
url = https://github.com/Cykey/Sublime-Logos
[submodule "vendor/grammars/SublimeBrainfuck"]
path = vendor/grammars/SublimeBrainfuck
url = https://github.com/Drako/SublimeBrainfuck
@@ -25,18 +22,9 @@
[submodule "vendor/grammars/Sublime-REBOL"]
path = vendor/grammars/Sublime-REBOL
url = https://github.com/Oldes/Sublime-REBOL
[submodule "vendor/grammars/Sublime-Inform"]
path = vendor/grammars/Sublime-Inform
url = https://github.com/PogiNate/Sublime-Inform
[submodule "vendor/grammars/autoitv3-tmbundle"]
path = vendor/grammars/autoitv3-tmbundle
url = https://github.com/Red-Nova-Technologies/autoitv3-tmbundle
[submodule "vendor/grammars/Sublime-VimL"]
path = vendor/grammars/Sublime-VimL
url = https://github.com/SalGnt/Sublime-VimL
[submodule "vendor/grammars/boo-sublime"]
path = vendor/grammars/boo-sublime
url = https://github.com/Shammah/boo-sublime
[submodule "vendor/grammars/ColdFusion"]
path = vendor/grammars/ColdFusion
url = https://github.com/SublimeText/ColdFusion
@@ -91,9 +79,6 @@
[submodule "vendor/grammars/language-yaml"]
path = vendor/grammars/language-yaml
url = https://github.com/atom/language-yaml
[submodule "vendor/grammars/sublime-sourcepawn"]
path = vendor/grammars/sublime-sourcepawn
url = https://github.com/austinwagner/sublime-sourcepawn
[submodule "vendor/grammars/Sublime-Lasso"]
path = vendor/grammars/Sublime-Lasso
url = https://github.com/bfad/Sublime-Lasso
@@ -112,9 +97,6 @@
[submodule "vendor/grammars/sublime-MuPAD"]
path = vendor/grammars/sublime-MuPAD
url = https://github.com/ccreutzig/sublime-MuPAD
[submodule "vendor/grammars/nesC.tmbundle"]
path = vendor/grammars/nesC.tmbundle
url = https://github.com/cdwilson/nesC.tmbundle
[submodule "vendor/grammars/haxe-sublime-bundle"]
path = vendor/grammars/haxe-sublime-bundle
url = https://github.com/clemos/haxe-sublime-bundle
@@ -136,9 +118,6 @@
[submodule "vendor/grammars/fancy-tmbundle"]
path = vendor/grammars/fancy-tmbundle
url = https://github.com/fancy-lang/fancy-tmbundle
[submodule "vendor/grammars/monkey.tmbundle"]
path = vendor/grammars/monkey.tmbundle
url = https://github.com/gingerbeardman/monkey.tmbundle
[submodule "vendor/grammars/dart-sublime-bundle"]
path = vendor/grammars/dart-sublime-bundle
url = https://github.com/guillermooo/dart-sublime-bundle
@@ -169,18 +148,12 @@
[submodule "vendor/grammars/fish-tmbundle"]
path = vendor/grammars/fish-tmbundle
url = https://github.com/l15n/fish-tmbundle
[submodule "vendor/grammars/sublime-idris"]
path = vendor/grammars/sublime-idris
url = https://github.com/laughedelic/sublime-idris
[submodule "vendor/grammars/moonscript-tmbundle"]
path = vendor/grammars/moonscript-tmbundle
url = https://github.com/leafo/moonscript-tmbundle
[submodule "vendor/grammars/Isabelle.tmbundle"]
path = vendor/grammars/Isabelle.tmbundle
url = https://github.com/lsf37/Isabelle.tmbundle
[submodule "vendor/grammars/x86-assembly-textmate-bundle"]
path = vendor/grammars/x86-assembly-textmate-bundle
url = https://github.com/lunixbochs/x86-assembly-textmate-bundle
[submodule "vendor/grammars/Alloy.tmbundle"]
path = vendor/grammars/Alloy.tmbundle
url = https://github.com/macekond/Alloy.tmbundle
@@ -211,9 +184,6 @@
[submodule "vendor/grammars/Julia.tmbundle"]
path = vendor/grammars/Julia.tmbundle
url = https://github.com/nanoant/Julia.tmbundle
[submodule "vendor/grammars/assembly.tmbundle"]
path = vendor/grammars/assembly.tmbundle
url = https://github.com/nanoant/assembly.tmbundle
[submodule "vendor/grammars/ooc.tmbundle"]
path = vendor/grammars/ooc.tmbundle
url = https://github.com/nilium/ooc.tmbundle
@@ -223,9 +193,6 @@
[submodule "vendor/grammars/sublime-tea"]
path = vendor/grammars/sublime-tea
url = https://github.com/pferruggiaro/sublime-tea
[submodule "vendor/grammars/puppet-textmate-bundle"]
path = vendor/grammars/puppet-textmate-bundle
url = https://github.com/puppet-textmate-bundle/puppet-textmate-bundle
[submodule "vendor/grammars/abap.tmbundle"]
path = vendor/grammars/abap.tmbundle
url = https://github.com/pvl/abap.tmbundle
@@ -343,9 +310,6 @@
[submodule "vendor/grammars/latex.tmbundle"]
path = vendor/grammars/latex.tmbundle
url = https://github.com/textmate/latex.tmbundle
[submodule "vendor/grammars/less.tmbundle"]
path = vendor/grammars/less.tmbundle
url = https://github.com/textmate/less.tmbundle
[submodule "vendor/grammars/lilypond.tmbundle"]
path = vendor/grammars/lilypond.tmbundle
url = https://github.com/textmate/lilypond.tmbundle
@@ -454,9 +418,6 @@
[submodule "vendor/grammars/llvm.tmbundle"]
path = vendor/grammars/llvm.tmbundle
url = https://github.com/whitequark/llvm.tmbundle
[submodule "vendor/grammars/sublime-nix"]
path = vendor/grammars/sublime-nix
url = https://github.com/wmertens/sublime-nix
[submodule "vendor/grammars/oz-tmbundle"]
path = vendor/grammars/oz-tmbundle
url = https://github.com/eregon/oz-tmbundle
@@ -515,24 +476,12 @@
[submodule "vendor/grammars/liquid.tmbundle"]
path = vendor/grammars/liquid.tmbundle
url = https://github.com/bastilian/validcode-textmate-bundles
[submodule "vendor/grammars/ats.sublime"]
path = vendor/grammars/ats.sublime
url = https://github.com/steinwaywhw/ats-mode-sublimetext
[submodule "vendor/grammars/Modelica"]
path = vendor/grammars/Modelica
url = https://github.com/BorisChumichev/modelicaSublimeTextPackage
[submodule "vendor/grammars/sublime-apl"]
path = vendor/grammars/sublime-apl
url = https://github.com/StoneCypher/sublime-apl
[submodule "vendor/grammars/CLIPS-sublime"]
path = vendor/grammars/CLIPS-sublime
url = https://github.com/psicomante/CLIPS-sublime
[submodule "vendor/grammars/Creole"]
path = vendor/grammars/Creole
url = https://github.com/Siddley/Creole
[submodule "vendor/grammars/GDScript-sublime"]
path = vendor/grammars/GDScript-sublime
url = https://github.com/beefsack/GDScript-sublime
[submodule "vendor/grammars/sublime-golo"]
path = vendor/grammars/sublime-golo
url = https://github.com/TypeUnsafe/sublime-golo
@@ -545,9 +494,6 @@
[submodule "vendor/grammars/G-Code"]
path = vendor/grammars/G-Code
url = https://github.com/robotmaster/sublime-text-syntax-highlighting
[submodule "vendor/grammars/grace-tmbundle"]
path = vendor/grammars/grace-tmbundle
url = https://github.com/zmthy/grace-tmbundle
[submodule "vendor/grammars/sublime-text-ox"]
path = vendor/grammars/sublime-text-ox
url = https://github.com/andreashetland/sublime-text-ox
@@ -557,9 +503,6 @@
[submodule "vendor/grammars/ec.tmbundle"]
path = vendor/grammars/ec.tmbundle
url = https://github.com/ecere/ec.tmbundle
[submodule "vendor/grammars/InnoSetup"]
path = vendor/grammars/InnoSetup
url = https://github.com/idleberg/InnoSetup-Sublime-Text
[submodule "vendor/grammars/gap-tmbundle"]
path = vendor/grammars/gap-tmbundle
url = https://github.com/dhowden/gap-tmbundle
@@ -581,9 +524,6 @@
[submodule "vendor/grammars/SublimeClarion"]
path = vendor/grammars/SublimeClarion
url = https://github.com/fushnisoft/SublimeClarion
[submodule "vendor/grammars/oracle.tmbundle"]
path = vendor/grammars/oracle.tmbundle
url = https://github.com/mulander/oracle.tmbundle.git
[submodule "vendor/grammars/BrightScript.tmbundle"]
path = vendor/grammars/BrightScript.tmbundle
url = https://github.com/cmink/BrightScript.tmbundle
@@ -593,18 +533,12 @@
[submodule "vendor/grammars/asciidoc.tmbundle"]
path = vendor/grammars/asciidoc.tmbundle
url = https://github.com/zuckschwerdt/asciidoc.tmbundle
[submodule "vendor/grammars/sublime-text-pig-latin"]
path = vendor/grammars/sublime-text-pig-latin
url = https://github.com/goblindegook/sublime-text-pig-latin
[submodule "vendor/grammars/Lean.tmbundle"]
path = vendor/grammars/Lean.tmbundle
url = https://github.com/leanprover/Lean.tmbundle
[submodule "vendor/grammars/ampl"]
path = vendor/grammars/ampl
url = https://github.com/ampl/sublime-ampl
[submodule "vendor/grammars/openscad.tmbundle"]
path = vendor/grammars/openscad.tmbundle
url = https://github.com/tbuser/openscad.tmbundle
[submodule "vendor/grammars/sublime-varnish"]
path = vendor/grammars/sublime-varnish
url = https://github.com/brandonwamboldt/sublime-varnish
@@ -656,9 +590,12 @@
[submodule "vendor/grammars/language-ncl"]
path = vendor/grammars/language-ncl
url = https://github.com/rpavlick/language-ncl.git
[submodule "vendor/grammars/pawn-sublime-language"]
path = vendor/grammars/pawn-sublime-language
url = https://github.com/Southclaw/pawn-sublime-language.git
[submodule "vendor/grammars/atom-language-purescript"]
path = vendor/grammars/atom-language-purescript
url = https://github.com/freebroccolo/atom-language-purescript
url = https://github.com/purescript-contrib/atom-language-purescript
[submodule "vendor/grammars/vue-syntax-highlight"]
path = vendor/grammars/vue-syntax-highlight
url = https://github.com/vuejs/vue-syntax-highlight
@@ -679,13 +616,85 @@
url = https://github.com/CausalityLtd/sublime-pony
[submodule "vendor/grammars/X10"]
path = vendor/grammars/X10
url = git@github.com:x10-lang/x10-highlighting.git
url = https://github.com/x10-lang/x10-highlighting
[submodule "vendor/grammars/language-babel"]
path = vendor/grammars/language-babel
url = https://github.com/gandm/language-babel
[submodule "vendor/grammars/UrWeb-Language-Definition"]
path = vendor/grammars/UrWeb-Language-Definition
url = https://github.com/gwalborn/UrWeb-Language-Definition.git
[submodule "vendor/grammars/Stata.tmbundle"]
path = vendor/grammars/Stata.tmbundle
url = https://github.com/pschumm/Stata.tmbundle
[submodule "vendor/grammars/FreeMarker.tmbundle"]
path = vendor/grammars/FreeMarker.tmbundle
url = https://github.com/freemarker/FreeMarker.tmbundle
[submodule "vendor/grammars/MagicPython"]
path = vendor/grammars/MagicPython
url = https://github.com/MagicStack/MagicPython
[submodule "vendor/grammars/language-click"]
path = vendor/grammars/language-click
url = https://github.com/stenverbois/language-click.git
[submodule "vendor/grammars/language-maxscript"]
path = vendor/grammars/language-maxscript
url = https://github.com/Alhadis/language-maxscript
[submodule "vendor/grammars/language-renpy"]
path = vendor/grammars/language-renpy
url = https://github.com/williamd1k0/language-renpy.git
[submodule "vendor/grammars/language-inform7"]
path = vendor/grammars/language-inform7
url = https://github.com/erkyrath/language-inform7
[submodule "vendor/grammars/atom-language-stan"]
path = vendor/grammars/atom-language-stan
url = https://github.com/jrnold/atom-language-stan
[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
[submodule "vendor/grammars/language-povray"]
path = vendor/grammars/language-povray
url = https://github.com/c-lipka/language-povray
[submodule "vendor/grammars/sublime-terra"]
path = vendor/grammars/sublime-terra
url = https://github.com/pyk/sublime-terra
[submodule "vendor/grammars/SublimePuppet"]
path = vendor/grammars/SublimePuppet
url = https://github.com/russCloak/SublimePuppet
[submodule "vendor/grammars/sublimeassembly"]
path = vendor/grammars/sublimeassembly
url = https://github.com/Nessphoro/sublimeassembly
[submodule "vendor/grammars/monkey"]
path = vendor/grammars/monkey
url = https://github.com/gingerbeardman/monkey.tmbundle
[submodule "vendor/grammars/assembly"]
path = vendor/grammars/assembly
url = https://github.com/nanoant/assembly.tmbundle
[submodule "vendor/grammars/boo"]
path = vendor/grammars/boo
url = https://github.com/Shammah/boo-sublime
[submodule "vendor/grammars/logos"]
path = vendor/grammars/logos
url = https://github.com/Cykey/Sublime-Logos
[submodule "vendor/grammars/pig-latin"]
path = vendor/grammars/pig-latin
url = https://github.com/goblindegook/sublime-text-pig-latin
[submodule "vendor/grammars/sourcepawn"]
path = vendor/grammars/sourcepawn
url = https://github.com/austinwagner/sublime-sourcepawn
[submodule "vendor/grammars/gdscript"]
path = vendor/grammars/gdscript
url = https://github.com/beefsack/GDScript-sublime
[submodule "vendor/grammars/nesC"]
path = vendor/grammars/nesC
url = https://github.com/cdwilson/nesC.tmbundle
[submodule "vendor/grammars/ats"]
path = vendor/grammars/ats
url = https://github.com/steinwaywhw/ats-mode-sublimetext
[submodule "vendor/grammars/grace"]
path = vendor/grammars/grace
url = https://github.com/zmthy/grace-tmbundle

View File

@@ -1,4 +1,3 @@
source 'https://rubygems.org'
gemspec :name => "github-linguist"
gemspec :name => "github-linguist-grammars"
gem 'byebug' if RUBY_VERSION >= '2.0'

View File

@@ -1,4 +1,4 @@
Copyright (c) 2011-2015 GitHub, Inc.
Copyright (c) 2011-2016 GitHub, Inc.
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation

View File

@@ -59,6 +59,9 @@ Alternatively, you can use Vim or Emacs style modelines to set the language for
##### Vim
```
# Some examples of various styles:
vim: syntax=java
vim: set syntax=ruby:
vim: set filetype=prolog:
vim: set ft=cpp:
```
@@ -111,4 +114,9 @@ lib/linguist.rb
Please check out our [contributing guidelines](CONTRIBUTING.md).
##
## License
The language grammars included in this gem are covered by their repositories'
respective licenses. `grammars.yml` specifies the repository for each grammar.
All other files are covered by the MIT license, see `LICENSE`.

View File

@@ -40,18 +40,14 @@ task :samples do
end
task :build_gem => :samples do
rm_rf "grammars"
sh "script/convert-grammars"
languages = YAML.load_file("lib/linguist/languages.yml")
File.write("lib/linguist/languages.json", Yajl.dump(languages))
`gem build github-linguist.gemspec`
File.delete("lib/linguist/languages.json")
end
task :build_grammars_gem do
rm_rf "grammars"
sh "script/convert-grammars"
sh "gem", "build", "github-linguist-grammars.gemspec"
end
namespace :benchmark do
benchmark_path = "benchmark/results"

View File

@@ -50,6 +50,7 @@ class GitLinguist
def clear_language_stats
File.unlink(cache_file)
rescue Errno::ENOENT
end
def disable_language_stats
@@ -110,7 +111,7 @@ def git_linguist(args)
parser.parse!(args)
git_dir = `git rev-parse --git-dir`.strip
raise "git-linguist must be ran in a Git repository" unless $?.success?
raise "git-linguist must be ran in a Git repository (#{Dir.pwd})" unless $?.success?
wrapper = GitLinguist.new(git_dir, commit, incremental)
case args.pop

View File

@@ -1,14 +0,0 @@
require File.expand_path('../lib/linguist/version', __FILE__)
Gem::Specification.new do |s|
s.name = 'github-linguist-grammars'
s.version = Linguist::VERSION
s.summary = "Language grammars for use with github-linguist"
s.authors = "GitHub"
s.homepage = "https://github.com/github/linguist"
s.files = ['lib/linguist/grammars.rb'] + Dir['grammars/*']
s.add_development_dependency 'plist', '~>3.1'
end

View File

@@ -10,7 +10,7 @@ Gem::Specification.new do |s|
s.homepage = "https://github.com/github/linguist"
s.license = "MIT"
s.files = Dir['lib/**/*'] - ['lib/linguist/grammars.rb'] + ['LICENSE']
s.files = Dir['lib/**/*'] + Dir['grammars/*'] + ['LICENSE']
s.executables = ['linguist', 'git-linguist']
s.add_dependency 'charlock_holmes', '~> 0.7.3'
@@ -20,10 +20,11 @@ Gem::Specification.new do |s|
s.add_development_dependency 'minitest', '>= 5.0'
s.add_development_dependency 'mocha'
s.add_development_dependency 'plist', '~>3.1'
s.add_development_dependency 'pry'
s.add_development_dependency 'rake'
s.add_development_dependency 'yajl-ruby'
s.add_development_dependency 'color-proximity', '~> 0.2.1'
s.add_development_dependency 'licensee', '6.0.0b1'
s.add_development_dependency 'licensed'
end

91
grammars.yml Normal file → Executable file
View File

@@ -29,15 +29,11 @@ vendor/grammars/AutoHotkey/:
vendor/grammars/BrightScript.tmbundle/:
- source.brightauthorproject
- source.brightscript
vendor/grammars/CLIPS-sublime:
- source.clips
vendor/grammars/ColdFusion:
- source.cfscript
- source.cfscript.cfc
- text.cfml.basic
- text.html.cfm
vendor/grammars/Creole:
- text.html.creole
vendor/grammars/Docker.tmbundle:
- source.dockerfile
vendor/grammars/Elm.tmLanguage:
@@ -50,14 +46,10 @@ vendor/grammars/G-Code/:
- source.MOD
- source.apt
- source.gcode
vendor/grammars/GDScript-sublime/:
- source.gdscript
vendor/grammars/Handlebars:
- text.html.handlebars
vendor/grammars/IDL-Syntax:
- source.webidl
vendor/grammars/InnoSetup/:
- source.inno
vendor/grammars/Isabelle.tmbundle:
- source.isabelle.root
- source.isabelle.theory
@@ -69,6 +61,9 @@ vendor/grammars/Lean.tmbundle:
- source.lean
vendor/grammars/LiveScript.tmbundle:
- source.livescript
vendor/grammars/MagicPython:
- source.python
- source.regexp.python
vendor/grammars/Modelica/:
- source.modelica
vendor/grammars/NSIS:
@@ -103,12 +98,8 @@ vendor/grammars/Sublime-Coq:
- source.coq
vendor/grammars/Sublime-HTTP:
- source.httpspec
vendor/grammars/Sublime-Inform:
- source.Inform7
vendor/grammars/Sublime-Lasso:
- file.lasso
vendor/grammars/Sublime-Logos:
- source.logos
vendor/grammars/Sublime-Loom:
- source.loomscript
vendor/grammars/Sublime-Modula-2/:
@@ -133,15 +124,17 @@ vendor/grammars/SublimeBrainfuck:
vendor/grammars/SublimeClarion/:
- source.clarion
vendor/grammars/SublimePapyrus/:
- source.compiled-papyrus
- source.papyrus
- source.papyrus-assembly
- source.papyrus.skyrim
vendor/grammars/SublimePuppet/:
- source.puppet
vendor/grammars/SublimeXtend:
- source.xtend
vendor/grammars/TXL/:
- source.txl
vendor/grammars/Textmate-Gosu-Bundle:
- source.gosu.2
vendor/grammars/UrWeb-Language-Definition:
- source.ur
vendor/grammars/VBDotNetSyntax:
- source.vbnet
vendor/grammars/Vala-TMBundle:
@@ -175,7 +168,7 @@ vendor/grammars/asciidoc.tmbundle/:
vendor/grammars/asp.tmbundle:
- source.asp
- text.html.asp
vendor/grammars/assembly.tmbundle:
vendor/grammars/assembly/:
- objdump.x86asm
- source.x86asm
vendor/grammars/atom-fsharp/:
@@ -185,18 +178,18 @@ vendor/grammars/atom-fsharp/:
- source.fsharp.fsx
vendor/grammars/atom-language-purescript/:
- source.purescript
vendor/grammars/atom-language-stan/:
- source.stan
vendor/grammars/atom-salt:
- source.python.salt
- source.yaml.salt
vendor/grammars/ats.sublime:
vendor/grammars/ats:
- source.ats
vendor/grammars/autoitv3-tmbundle:
- source.autoit.3
vendor/grammars/awk-sublime:
- source.awk
vendor/grammars/bison.tmbundle:
- source.bison
vendor/grammars/boo-sublime:
vendor/grammars/boo/:
- source.boo
vendor/grammars/bro-sublime:
- source.bro
@@ -266,13 +259,15 @@ vendor/grammars/fortran.tmbundle:
- source.fortran.modern
vendor/grammars/gap-tmbundle/:
- source.gap
vendor/grammars/gdscript/:
- source.gdscript
vendor/grammars/gettext.tmbundle:
- source.po
vendor/grammars/gnuplot-tmbundle:
- source.gnuplot
vendor/grammars/go-tmbundle:
- source.go
vendor/grammars/grace-tmbundle/:
vendor/grammars/grace:
- source.grace
vendor/grammars/gradle.tmbundle:
- source.groovy.gradle
@@ -322,6 +317,8 @@ vendor/grammars/kotlin-sublime-package:
vendor/grammars/language-babel/:
- source.js.jsx
- source.regexp.babel
vendor/grammars/language-click/:
- source.click
vendor/grammars/language-clojure:
- source.clojure
vendor/grammars/language-coffee-script:
@@ -338,6 +335,8 @@ vendor/grammars/language-gfm:
- source.gfm
vendor/grammars/language-hy:
- source.hy
vendor/grammars/language-inform7:
- source.inform7
vendor/grammars/language-javascript:
- source.js
- source.js.regexp
@@ -345,13 +344,19 @@ vendor/grammars/language-javascript:
vendor/grammars/language-jsoniq/:
- source.jq
- source.xq
vendor/grammars/language-less/:
- source.css.less
vendor/grammars/language-maxscript:
- source.maxscript
vendor/grammars/language-ncl:
- source.ncl
vendor/grammars/language-povray:
- source.pov-ray sdl
vendor/grammars/language-python:
- source.python
- source.regexp.python
- text.python.console
- text.python.traceback
vendor/grammars/language-renpy:
- source.renpy
vendor/grammars/language-shellscript:
- source.shell
- text.shell-session
@@ -361,6 +366,8 @@ vendor/grammars/language-xbase:
- source.harbour
vendor/grammars/language-yaml:
- source.yaml
vendor/grammars/language-yang/:
- source.yang
vendor/grammars/latex.tmbundle:
- text.bibtex
- text.log.latex
@@ -368,8 +375,6 @@ vendor/grammars/latex.tmbundle:
- text.tex.latex
- text.tex.latex.beamer
- text.tex.latex.memoir
vendor/grammars/less.tmbundle:
- source.css.less
vendor/grammars/lilypond.tmbundle:
- source.lilypond
vendor/grammars/liquid.tmbundle:
@@ -378,6 +383,8 @@ vendor/grammars/lisp.tmbundle:
- source.lisp
vendor/grammars/llvm.tmbundle:
- source.llvm
vendor/grammars/logos:
- source.logos
vendor/grammars/logtalk.tmbundle:
- source.logtalk
vendor/grammars/lua.tmbundle:
@@ -397,13 +404,13 @@ vendor/grammars/mediawiki.tmbundle/:
- text.html.mediawiki
vendor/grammars/mercury-tmlanguage:
- source.mercury
vendor/grammars/monkey.tmbundle:
vendor/grammars/monkey/:
- source.monkey
vendor/grammars/moonscript-tmbundle:
- source.moonscript
vendor/grammars/nemerle.tmbundle:
- source.nemerle
vendor/grammars/nesC.tmbundle:
vendor/grammars/nesC:
- source.nesc
vendor/grammars/ninja.tmbundle:
- source.ninja
@@ -421,21 +428,25 @@ vendor/grammars/ooc.tmbundle:
- source.ooc
vendor/grammars/opa.tmbundle:
- source.opa
vendor/grammars/openscad.tmbundle/:
- source.scad
vendor/grammars/oracle.tmbundle:
- source.plsql.oracle
vendor/grammars/oz-tmbundle/Syntaxes/Oz.tmLanguage:
- source.oz
vendor/grammars/pascal.tmbundle:
- source.pascal
vendor/grammars/pawn-sublime-language/:
- source.pawn
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:
- text.html.php
vendor/grammars/pig-latin/:
- source.pig_latin
vendor/grammars/pike-textmate:
- source.pike
vendor/grammars/postscript.tmbundle:
@@ -446,8 +457,6 @@ vendor/grammars/processing.tmbundle:
- source.processing
vendor/grammars/protobuf-tmbundle:
- source.protobuf
vendor/grammars/puppet-textmate-bundle:
- source.puppet
vendor/grammars/python-django.tmbundle:
- source.python.django
- text.html.django
@@ -479,6 +488,8 @@ vendor/grammars/smali-sublime/smali.tmLanguage:
- source.smali
vendor/grammars/smalltalk-tmbundle:
- source.smalltalk
vendor/grammars/sourcepawn/:
- source.sp
vendor/grammars/sql.tmbundle:
- source.sql
vendor/grammars/st2-zonefile:
@@ -503,8 +514,6 @@ vendor/grammars/sublime-glsl:
- source.glsl
vendor/grammars/sublime-golo/:
- source.golo
vendor/grammars/sublime-idris:
- source.idris
vendor/grammars/sublime-mask:
- source.mask
vendor/grammars/sublime-netlinx:
@@ -512,8 +521,6 @@ vendor/grammars/sublime-netlinx:
- source.netlinx.erb
vendor/grammars/sublime-nginx:
- source.nginx
vendor/grammars/sublime-nix:
- source.nix
vendor/grammars/sublime-opal/:
- source.opal
- source.opalsysdefs
@@ -523,17 +530,15 @@ vendor/grammars/sublime-robot-plugin:
- text.robot
vendor/grammars/sublime-rust:
- source.rust
vendor/grammars/sublime-sourcepawn:
- source.sp
vendor/grammars/sublime-spintools/:
- source.regexp.spin
- source.spin
vendor/grammars/sublime-tea:
- source.tea
vendor/grammars/sublime-terra:
- source.terra
vendor/grammars/sublime-text-ox/:
- source.ox
vendor/grammars/sublime-text-pig-latin/:
- source.pig_latin
vendor/grammars/sublime-typescript/:
- source.ts
- source.tsx
@@ -547,6 +552,8 @@ vendor/grammars/sublime_cobol:
vendor/grammars/sublime_man_page_support:
- source.man
- text.groff
vendor/grammars/sublimeassembly/:
- source.assembly
vendor/grammars/sublimeprolog/:
- source.prolog
- source.prolog.eclipse
@@ -568,8 +575,6 @@ vendor/grammars/verilog.tmbundle:
- source.verilog
vendor/grammars/vue-syntax-highlight:
- text.html.vue
vendor/grammars/x86-assembly-textmate-bundle:
- source.asm.x86
vendor/grammars/xc.tmbundle/:
- source.xc
vendor/grammars/xml.tmbundle:

View File

@@ -1,5 +1,6 @@
require 'linguist/blob_helper'
require 'linguist/generated'
require 'linguist/grammars'
require 'linguist/heuristics'
require 'linguist/language'
require 'linguist/repository'
@@ -8,13 +9,91 @@ require 'linguist/shebang'
require 'linguist/version'
class << Linguist
# Public: Detects the Language of the blob.
#
# blob - an object that includes the Linguist `BlobHelper` interface;
# see Linguist::LazyBlob and Linguist::FileBlob for examples
#
# Returns Language or nil.
def detect(blob)
# Bail early if the blob is binary or empty.
return nil if blob.likely_binary? || blob.binary? || blob.empty?
Linguist.instrument("linguist.detection", :blob => blob) do
# Call each strategy until one candidate is returned.
languages = []
returning_strategy = nil
STRATEGIES.each do |strategy|
returning_strategy = strategy
candidates = Linguist.instrument("linguist.strategy", :blob => blob, :strategy => strategy, :candidates => languages) do
strategy.call(blob, languages)
end
if candidates.size == 1
languages = candidates
break
elsif candidates.size > 1
# More than one candidate was found, pass them to the next strategy.
languages = candidates
else
# No candidates, try the next strategy
end
end
Linguist.instrument("linguist.detected", :blob => blob, :strategy => returning_strategy, :language => languages.first)
languages.first
end
end
# Internal: The strategies used to detect the language of a file.
#
# A strategy is an object that has a `.call` method that takes two arguments:
#
# blob - An object that quacks like a blob.
# languages - An Array of candidate Language objects that were returned by the
#     previous strategy.
#
# A strategy should return an Array of Language candidates.
#
# Strategies are called in turn until a single Language is returned.
STRATEGIES = [
Linguist::Strategy::Modeline,
Linguist::Shebang,
Linguist::Strategy::Filename,
Linguist::Heuristics,
Linguist::Classifier
]
# Public: Set an instrumenter.
#
# class CustomInstrumenter
# def instrument(name, payload = {})
# warn "Instrumenting #{name}: #{payload[:blob]}"
# end
# end
#
# Linguist.instrumenter = CustomInstrumenter
#
# The instrumenter must conform to the `ActiveSupport::Notifications`
# interface, which defines `#instrument` and accepts:
#
# name - the String name of the event (e.g. "linguist.detected")
# payload - a Hash of the exception context.
attr_accessor :instrumenter
# Internal: Perform instrumentation on a block
#
# Linguist.instrument("linguist.dosomething", :blob => blob) do
# # logic to instrument here.
# end
#
def instrument(*args, &bk)
if instrumenter
instrumenter.instrument(*args, &bk)
else
yield if block_given?
elsif block_given?
yield
end
end
end

View File

@@ -63,7 +63,7 @@ module Linguist
#
# Returns an Array
def extensions
basename, *segments = name.downcase.split(".")
_, *segments = name.downcase.split(".")
segments.map.with_index do |segment, index|
"." + segments[index..-1].join(".")

View File

@@ -6,7 +6,7 @@ require 'yaml'
module Linguist
# DEPRECATED Avoid mixing into Blob classes. Prefer functional interfaces
# like `Language.detect` over `Blob#language`. Functions are much easier to
# like `Linguist.detect` over `Blob#language`. Functions are much easier to
# cache and compose.
#
# Avoid adding additional bloat to this module.
@@ -325,7 +325,7 @@ module Linguist
#
# Returns a Language or nil if none is detected
def language
@language ||= Language.detect(self)
@language ||= Linguist.detect(self)
end
# Internal: Get the TextMate compatible scope for the blob

View File

@@ -72,7 +72,9 @@ module Linguist
vcr_cassette? ||
generated_module? ||
generated_unity3d_meta? ||
generated_racc?
generated_racc? ||
generated_jflex? ||
generated_grammarkit?
end
# Internal: Is the blob an Xcode file?
@@ -373,5 +375,32 @@ module Linguist
return false unless lines.count > 2
return lines[2].start_with?("# This file is automatically generated by Racc")
end
# Internal: Is this a JFlex-generated file?
#
# A JFlex-generated file contains:
# /* The following code was generated by JFlex x.y.z on d/at/e ti:me */
# on the first line.
#
# Return true or false
def generated_jflex?
return false unless extname == '.java'
return false unless lines.count > 1
return lines[0].start_with?("/* The following code was generated by JFlex ")
end
# Internal: Is this a GrammarKit-generated file?
#
# A GrammarKit-generated file typically contain:
# // This is a generated file. Not intended for manual editing.
# on the first line. This is not always the case, as it's possible to
# customize the class header.
#
# Return true or false
def generated_grammarkit?
return false unless extname == '.java'
return false unless lines.count > 1
return lines[0].start_with?("// This is a generated file. Not intended for manual editing.")
end
end
end

View File

@@ -1,6 +1,3 @@
# Note: This file is included in the github-linguist-grammars gem, not the
# github-linguist gem.
module Linguist
module Grammars
# Get the path to the directory containing the language grammar JSON files.

View File

@@ -238,8 +238,10 @@ module Linguist
disambiguate ".ms" do |data|
if /^[.'][a-z][a-z](\s|$)/i.match(data)
Language["Groff"]
elsif /((^|\s)move?[. ])|\.(include|globa?l)\s/.match(data)
elsif /(?<!\S)\.(include|globa?l)\s/.match(data) || /(?<!\/\*)(\A|\n)\s*\.[A-Za-z]/.match(data.gsub(/"([^\\"]|\\.)*"|'([^\\']|\\.)*'|\\\s*(?:--.*)?\n/, ""))
Language["GAS"]
else
Language["MAXScript"]
end
end
@@ -274,19 +276,27 @@ module Linguist
end
disambiguate ".pl" do |data|
if /^(use v6|(my )?class|module)/.match(data)
Language["Perl6"]
if /^[^#]+:-/.match(data)
Language["Prolog"]
elsif /use strict|use\s+v?5\./.match(data)
Language["Perl"]
elsif /^[^#]+:-/.match(data)
Language["Prolog"]
elsif /^(use v6|(my )?class|module)/.match(data)
Language["Perl6"]
end
end
disambiguate ".pm", ".t" do |data|
if /^(use v6|(my )?class|module)/.match(data)
if /use strict|use\s+v?5\./.match(data)
Language["Perl"]
elsif /^(use v6|(my )?class|module)/.match(data)
Language["Perl6"]
elsif /use strict|use\s+v?5\./.match(data)
end
end
disambiguate ".pod" do |data|
if /^=\w+$/.match(data)
Language["Pod"]
else
Language["Perl"]
end
end
@@ -303,6 +313,14 @@ module Linguist
end
end
disambiguate ".props" do |data|
if /^(\s*)(<Project|<Import|<Property|<?xml|xmlns)/i.match(data)
Language["XML"]
elsif /\w+\s*=\s*/i.match(data)
Language["INI"]
end
end
disambiguate ".r" do |data|
if /\bRebol\b/i.match(data)
Language["Rebol"]
@@ -311,6 +329,14 @@ module Linguist
end
end
disambiguate ".rpy" do |data|
if /(^(import|from|class|def)\s)/m.match(data)
Language["Python"]
else
Language["Ren'Py"]
end
end
disambiguate ".rs" do |data|
if /^(use |fn |mod |pub |macro_rules|impl|#!?\[)/.match(data)
Language["Rust"]
@@ -328,7 +354,7 @@ module Linguist
end
disambiguate ".sql" do |data|
if /^\\i\b|AS \$\$|LANGUAGE '+plpgsql'+/i.match(data) || /SECURITY (DEFINER|INVOKER)/i.match(data) || /BEGIN( WORK| TRANSACTION)?;/i.match(data)
if /^\\i\b|AS \$\$|LANGUAGE '?plpgsql'?/i.match(data) || /SECURITY (DEFINER|INVOKER)/i.match(data) || /BEGIN( WORK| TRANSACTION)?;/i.match(data)
#Postgres
Language["PLpgSQL"]
elsif /(alter module)|(language sql)|(begin( NOT)+ atomic)/i.match(data) || /signal SQLSTATE '[0-9]+'/i.match(data)

View File

@@ -87,14 +87,6 @@ module Linguist
language
end
STRATEGIES = [
Linguist::Strategy::Modeline,
Linguist::Shebang,
Linguist::Strategy::Filename,
Linguist::Heuristics,
Linguist::Classifier
]
# Public: Detects the Language of the blob.
#
# blob - an object that includes the Linguist `BlobHelper` interface;
@@ -102,34 +94,8 @@ module Linguist
#
# Returns Language or nil.
def self.detect(blob)
# Bail early if the blob is binary or empty.
return nil if blob.likely_binary? || blob.binary? || blob.empty?
Linguist.instrument("linguist.detection", :blob => blob) do
# Call each strategy until one candidate is returned.
languages = []
returning_strategy = nil
STRATEGIES.each do |strategy|
returning_strategy = strategy
candidates = Linguist.instrument("linguist.strategy", :blob => blob, :strategy => strategy, :candidates => languages) do
strategy.call(blob, languages)
end
if candidates.size == 1
languages = candidates
break
elsif candidates.size > 1
# More than one candidate was found, pass them to the next strategy.
languages = candidates
else
# No candidates, try the next strategy
end
end
Linguist.instrument("linguist.detected", :blob => blob, :strategy => returning_strategy, :language => languages.first)
languages.first
end
warn "[DEPRECATED] `Linguist::Language.detect` is deprecated. Use `Linguist.detect`. #{caller[0]}"
Linguist.detect(blob)
end
# Public: Get all Languages

238
lib/linguist/languages.yml Normal file → Executable file
View File

@@ -142,7 +142,7 @@ Agda:
Alloy:
type: programming # 'modeling' would be more appropiate
color: "#cc5c24"
color: "#64C800"
extensions:
- .als
ace_mode: text
@@ -183,6 +183,7 @@ AppleScript:
interpreters:
- osascript
ace_mode: applescript
color: "#101F1F"
Arc:
type: programming
@@ -229,7 +230,7 @@ Assembly:
- .a51
- .inc
- .nasm
tm_scope: source.asm.x86
tm_scope: source.assembly
ace_mode: assembly_x86
Augeas:
@@ -259,7 +260,7 @@ AutoIt:
- AutoItScript
extensions:
- .au3
tm_scope: source.autoit.3
tm_scope: none
ace_mode: autohotkey
Awk:
@@ -290,6 +291,7 @@ Batchfile:
- .cmd
tm_scope: source.dosbatch
ace_mode: batchfile
color: "#C1F12E"
Befunge:
type: programming
@@ -304,6 +306,7 @@ Bison:
extensions:
- .bison
ace_mode: text
color: "#6A463F"
BitBake:
type: programming
@@ -347,6 +350,7 @@ Boo:
extensions:
- .boo
ace_mode: text
tm_scope: source.boo
Brainfuck:
type: programming
@@ -442,7 +446,7 @@ CLIPS:
type: programming
extensions:
- .clp
tm_scope: source.clips
tm_scope: none
ace_mode: text
CMake:
@@ -472,6 +476,13 @@ CSS:
extensions:
- .css
CSV:
type: data
ace_mode: text
tm_scope: none
extensions:
- .csv
Cap'n Proto:
type: programming
tm_scope: source.capnp
@@ -541,6 +552,14 @@ Clean:
tm_scope: none
ace_mode: text
Click:
type: programming
color: "#E4E6F3"
extensions:
- .click
tm_scope: source.click
ace_mode: text
Clojure:
type: programming
ace_mode: clojure
@@ -630,7 +649,7 @@ Common Lisp:
Component Pascal:
type: programming
color: "#b0ce4e"
color: "#B0CE4E"
extensions:
- .cp
- .cps
@@ -672,7 +691,7 @@ Creole:
wrap: true
extensions:
- .creole
tm_scope: text.html.creole
tm_scope: none
ace_mode: text
Crystal:
@@ -693,6 +712,7 @@ Cucumber:
aliases:
- gherkin
ace_mode: text
color: "#5B2063"
Cuda:
type: programming
@@ -701,6 +721,7 @@ Cuda:
- .cuh
tm_scope: source.cuda-c++
ace_mode: c_cpp
color: "#3A4E3A"
Cycript:
type: programming
@@ -793,7 +814,6 @@ Dart:
Diff:
type: data
color: "#88dddd"
extensions:
- .diff
- .patch
@@ -887,6 +907,8 @@ Elixir:
ace_mode: elixir
filenames:
- mix.lock
interpreters:
- elixir
Elm:
type: programming
@@ -929,6 +951,8 @@ Erlang:
- .es
- .escript
- .hrl
- .xrl
- .yrl
filenames:
- rebar.config
- rebar.config.lock
@@ -1083,7 +1107,7 @@ GAS:
extensions:
- .s
- .ms
tm_scope: source.asm.x86
tm_scope: none
ace_mode: assembly_x86
GDScript:
@@ -1267,6 +1291,7 @@ Groff:
- '.8'
- '.9'
- .l
- .me
- .ms
- .n
- .rno
@@ -1287,6 +1312,8 @@ Groovy:
- .gvy
interpreters:
- groovy
filenames:
- Jenkinsfile
Groovy Server Pages:
type: programming
@@ -1307,6 +1334,16 @@ HCL:
ace_mode: ruby
tm_scope: source.ruby
HLSL:
type: programming
extensions:
- .hlsl
- .fx
- .fxh
- .hlsli
ace_mode: text
tm_scope: none
HTML:
type: markup
tm_scope: text.html.basic
@@ -1380,6 +1417,7 @@ Hack:
- .hh
- .php
tm_scope: text.html.php
color: "#878787"
Haml:
group: HTML
@@ -1388,6 +1426,7 @@ Haml:
- .haml
- .haml.deface
ace_mode: haml
color: "#ECE2A9"
Handlebars:
type: markup
@@ -1493,6 +1532,7 @@ Idris:
- .idr
- .lidr
ace_mode: text
tm_scope: none
Inform 7:
type: programming
@@ -1500,7 +1540,7 @@ Inform 7:
extensions:
- .ni
- .i7x
tm_scope: source.Inform7
tm_scope: source.inform7
aliases:
- i7
- inform7
@@ -1510,7 +1550,7 @@ Inno Setup:
type: programming
extensions:
- .iss
tm_scope: source.inno
tm_scope: none
ace_mode: text
Io:
@@ -1694,6 +1734,18 @@ Julia:
color: "#a270ba"
ace_mode: julia
Jupyter Notebook:
type: markup
ace_mode: json
tm_scope: source.json
color: "#DA5B0B"
extensions:
- .ipynb
filenames:
- Notebook
aliases:
- IPython Notebook
KRL:
type: programming
color: "#28431f"
@@ -1742,6 +1794,7 @@ LLVM:
extensions:
- .ll
ace_mode: text
color: "#185619"
LOLCODE:
type: programming
@@ -1805,6 +1858,7 @@ Less:
- .less
tm_scope: source.css.less
ace_mode: less
color: "#A1D9A1"
Lex:
type: programming
@@ -1909,6 +1963,7 @@ Logos:
- .x
- .xi
ace_mode: text
tm_scope: source.logos
Logtalk:
type: programming
@@ -1956,6 +2011,34 @@ M:
tm_scope: source.lisp
ace_mode: lisp
M4:
type: programming
extensions:
- .m4
tm_scope: none
ace_mode: text
M4Sugar:
type: programming
group: M4
aliases:
- autoconf
extensions:
- .m4
filenames:
- configure.ac
tm_scope: none
ace_mode: text
MAXScript:
type: programming
color: "#00a6a6"
extensions:
- .ms
- .mcr
tm_scope: source.maxscript
ace_mode: text
MTML:
type: markup
color: "#b7e1f4"
@@ -1988,6 +2071,8 @@ Makefile:
- GNUmakefile
- Kbuild
- Makefile
- Makefile.am
- Makefile.in
- Makefile.inc
- makefile
interpreters:
@@ -2014,6 +2099,7 @@ Markdown:
- .mkdown
- .ron
tm_scope: source.gfm
color: "#083FA1"
Mask:
type: markup
@@ -2030,6 +2116,7 @@ Mathematica:
- .cdf
- .m
- .ma
- .mt
- .nb
- .nbp
- .wl
@@ -2041,6 +2128,8 @@ Mathematica:
Matlab:
type: programming
color: "#bb92ac"
aliases:
- octave
extensions:
- .matlab
- .m
@@ -2074,6 +2163,7 @@ MediaWiki:
wrap: true
extensions:
- .mediawiki
- .wiki
tm_scope: text.html.mediawiki
ace_mode: text
@@ -2147,6 +2237,7 @@ Monkey:
extensions:
- .monkey
ace_mode: text
tm_scope: source.monkey
Moocode:
type: programming
@@ -2249,6 +2340,7 @@ Nginx:
aliases:
- nginx configuration file
ace_mode: text
color: "#9469E9"
Nimrod:
type: programming
@@ -2281,7 +2373,7 @@ Nix:
- .nix
aliases:
- nixos
tm_scope: source.nix
tm_scope: none
ace_mode: nix
Nu:
@@ -2307,6 +2399,7 @@ NumPy:
- .numsc
tm_scope: none
ace_mode: text
color: "#9C8AF9"
OCaml:
type: programming
@@ -2417,7 +2510,7 @@ OpenSCAD:
type: programming
extensions:
- .scad
tm_scope: source.scad
tm_scope: none
ace_mode: scad
Org:
@@ -2458,8 +2551,9 @@ PAWN:
color: "#dbb284"
extensions:
- .pwn
tm_scope: source.c++
ace_mode: c_cpp
- .inc
tm_scope: source.pawn
ace_mode: text
PHP:
type: programming
@@ -2488,7 +2582,7 @@ PHP:
PLSQL:
type: programming
ace_mode: sql
tm_scope: source.plsql.oracle
tm_scope: none
color: "#dad8d8"
extensions:
- .pls
@@ -2507,6 +2601,16 @@ PLpgSQL:
extensions:
- .sql
POV-Ray SDL:
type: programming
aliases:
- pov-ray
- povray
extensions:
- .pov
- .inc
ace_mode: text
Pan:
type: programming
color: '#cc0000'
@@ -2520,7 +2624,7 @@ Papyrus:
color: "#6600cc"
extensions:
- .psc
tm_scope: source.papyrus
tm_scope: source.papyrus.skyrim
ace_mode: text
Parrot:
@@ -2557,7 +2661,7 @@ Parrot Internal Representation:
Pascal:
type: programming
color: "#b0ce4e"
color: "#E3F171"
extensions:
- .pas
- .dfm
@@ -2606,7 +2710,7 @@ Perl6:
- Rexfile
interpreters:
- perl6
tm_scope: source.perl.6
tm_scope: source.perl6fe
ace_mode: perl
Pickle:
@@ -2701,8 +2805,10 @@ Prolog:
- .pl
- .pro
- .prolog
- .yap
interpreters:
- swipl
- yap
tm_scope: source.prolog
ace_mode: prolog
@@ -2740,6 +2846,7 @@ Puppet:
filenames:
- Modulefile
ace_mode: text
tm_scope: source.puppet
Pure Data:
type: programming
@@ -2772,6 +2879,7 @@ Python:
color: "#3572A5"
extensions:
- .py
- .bzl
- .cgi
- .fcgi
- .gyp
@@ -2780,10 +2888,12 @@ Python:
- .pyp
- .pyt
- .pyw
- .rpy
- .tac
- .wsgi
- .xpy
filenames:
- BUCK
- BUILD
- SConscript
- SConstruct
@@ -2825,7 +2935,7 @@ QMake:
R:
type: programming
color: "#198ce7"
color: "#198CE7"
aliases:
- R
- Rscript
@@ -2855,6 +2965,7 @@ RDoc:
extensions:
- .rdoc
tm_scope: text.rdoc
color: "#8E84BF"
REALbasic:
type: programming
@@ -2950,6 +3061,16 @@ Redcode:
tm_scope: none
ace_mode: text
Ren'Py:
type: programming
aliases:
- renpy
color: "#ff7f7f"
extensions:
- .rpy
tm_scope: source.renpy
ace_mode: python
RenderScript:
type: programming
extensions:
@@ -3035,6 +3156,7 @@ Rust:
color: "#dea584"
extensions:
- .rs
- .rs.in
ace_mode: rust
SAS:
@@ -3052,6 +3174,7 @@ SCSS:
ace_mode: scss
extensions:
- .scss
color: "#CF649A"
SMT:
type: programming
@@ -3154,6 +3277,7 @@ Sass:
extensions:
- .sass
ace_mode: sass
color: "#CF649A"
Scala:
type: programming
@@ -3211,6 +3335,7 @@ Shell:
color: "#89e051"
aliases:
- sh
- shell-script
- bash
- zsh
extensions:
@@ -3221,6 +3346,7 @@ Shell:
- .command
- .fcgi
- .ksh
- .sh.in
- .tmux
- .tool
- .zsh
@@ -3310,6 +3436,14 @@ Squirrel:
tm_scope: source.c++
ace_mode: c_cpp
Stan:
type: programming
color: "#b2011d"
extensions:
- .stan
ace_mode: text
tm_scope: source.stan
Standard ML:
type: programming
color: "#dc566d"
@@ -3437,6 +3571,16 @@ Tea:
tm_scope: source.tea
ace_mode: text
Terra:
type: programming
extensions:
- .t
color: "#00004c"
ace_mode: lua
group: Lua
interpreters:
- lua
Text:
type: prose
wrap: true
@@ -3445,7 +3589,20 @@ Text:
extensions:
- .txt
- .fr
- .nb
- .ncl
- .no
filenames:
- COPYING
- INSTALL
- LICENSE
- NEWS
- README.me
- click.me
- delete.me
- keep.me
- read.me
- test.me
tm_scope: none
ace_mode: text
@@ -3511,7 +3668,6 @@ Unified Parallel C:
Unity3D Asset:
type: data
ace_mode: yaml
color: "#ab69a1"
extensions:
- .anim
- .asset
@@ -3521,6 +3677,13 @@ Unity3D Asset:
- .unity
tm_scope: source.yaml
Uno:
type: programming
extensions:
- .uno
ace_mode: csharp
tm_scope: source.cs
UnrealScript:
type: programming
color: "#a54c4d"
@@ -3529,6 +3692,17 @@ UnrealScript:
tm_scope: source.java
ace_mode: java
UrWeb:
type: programming
aliases:
- Ur/Web
- Ur
extensions:
- .ur
- .urs
tm_scope: source.ur
ace_mode: text
VCL:
group: Perl
type: programming
@@ -3673,6 +3847,7 @@ XML:
- .ditamap
- .ditaval
- .dll.config
- .dotsettings
- .filters
- .fsproj
- .fxml
@@ -3695,6 +3870,7 @@ XML:
- .osm
- .plist
- .pluginspec
- .props
- .ps1xml
- .psc1
- .pt
@@ -3716,8 +3892,10 @@ XML:
- .tsx
- .ui
- .urdf
- .ux
- .vbproj
- .vcxproj
- .vssettings
- .vxml
- .wsdl
- .wsf
@@ -3732,12 +3910,15 @@ XML:
- .xliff
- .xmi
- .xml.dist
- .xproj
- .xsd
- .xul
- .zcml
filenames:
- .classpath
- .project
- App.config
- NuGet.config
- Settings.StyleCop
- Web.Debug.config
- Web.Release.config
@@ -3788,6 +3969,7 @@ XSLT:
- .xsl
tm_scope: text.xml.xsl
ace_mode: xml
color: "#EB8CEB"
Xojo:
type: programming
@@ -3816,11 +3998,21 @@ YAML:
- .yml
- .reek
- .rviz
- .sublime-syntax
- .syntax
- .yaml
- .yaml-tmlanguage
filenames:
- .clang-format
ace_mode: yaml
YANG:
type: data
extensions:
- .yang
tm_scope: source.yang
ace_mode: text
Yacc:
type: programming
extensions:
@@ -3829,6 +4021,7 @@ Yacc:
- .yy
tm_scope: source.bison
ace_mode: text
color: "#4B6C4B"
Zephir:
type: programming
@@ -3868,7 +4061,6 @@ eC:
edn:
type: data
ace_mode: clojure
color: "#db5855"
extensions:
- .edn
tm_scope: source.clojure
@@ -3893,6 +4085,7 @@ nesC:
extensions:
- .nc
ace_mode: text
tm_scope: source.nesc
ooc:
type: programming
@@ -3910,7 +4103,10 @@ reStructuredText:
extensions:
- .rst
- .rest
- .rest.txt
- .rst.txt
ace_mode: text
color: "#B3BCBC"
wisp:
type: programming

View File

@@ -28,6 +28,7 @@ module Linguist
@oid = oid
@path = path
@mode = mode
@data = nil
end
def git_attributes
@@ -86,8 +87,8 @@ module Linguist
protected
# Returns true if the attribute is present and not the string "false".
def boolean_attribute(attr)
attr != "false"
def boolean_attribute(attribute)
attribute != "false"
end
def load_blob!

View File

@@ -30,6 +30,9 @@ module Linguist
@repository = repo
@commit_oid = commit_oid
@old_commit_oid = nil
@old_stats = nil
raise TypeError, 'commit_oid must be a commit SHA1' unless commit_oid.is_a?(String)
end

View File

@@ -42,10 +42,10 @@ module Linguist
return unless script
# "python2.6" -> "python2"
script.sub! /(\.\d+)$/, ''
script.sub!(/(\.\d+)$/, '')
# #! perl -> perl
script.sub! /^#!\s*/, ''
script.sub!(/^#!\s*/, '')
# Check for multiline shebang hacks that call `exec`
if script == 'sh' &&

View File

@@ -1,8 +1,19 @@
module Linguist
module Strategy
class Modeline
EmacsModeline = /-\*-\s*(?:(?!mode)[\w-]+\s*:\s*(?:[\w+-]+)\s*;?\s*)*(?:mode\s*:)?\s*([\w+-]+)\s*(?:;\s*(?!mode)[\w-]+\s*:\s*[\w+-]+\s*)*;?\s*-\*-/i
VimModeline = /vim:\s*set.*\s(?:ft|filetype)=(\w+)\s?.*:/i
EMACS_MODELINE = /-\*-\s*(?:(?!mode)[\w-]+\s*:\s*(?:[\w+-]+)\s*;?\s*)*(?:mode\s*:)?\s*([\w+-]+)\s*(?:;\s*(?!mode)[\w-]+\s*:\s*[\w+-]+\s*)*;?\s*-\*-/i
# First form vim modeline
# [text]{white}{vi:|vim:|ex:}[white]{options}
# ex: 'vim: syntax=ruby'
VIM_MODELINE_1 = /(?:vim|vi|ex):\s*(?:ft|filetype|syntax)=(\w+)\s?/i
# Second form vim modeline (compatible with some versions of Vi)
# [text]{white}{vi:|vim:|Vim:|ex:}[white]se[t] {options}:[text]
# ex: 'vim set syntax=ruby:'
VIM_MODELINE_2 = /(?:vim|vi|Vim|ex):\s*se(?:t)?.*\s(?:ft|filetype|syntax)=(\w+)\s?.*:/i
MODELINES = [EMACS_MODELINE, VIM_MODELINE_1, VIM_MODELINE_2]
# Public: Detects language based on Vim and Emacs modelines
#
@@ -22,7 +33,7 @@ module Linguist
#
# Returns a String or nil
def self.modeline(data)
match = data.match(EmacsModeline) || data.match(VimModeline)
match = MODELINES.map { |regex| data.match(regex) }.reject(&:nil?).first
match[1] if match
end
end

View File

@@ -20,10 +20,17 @@
- ^deps/
- ^tools/
- (^|/)configure$
- (^|/)configure.ac$
- (^|/)config.guess$
- (^|/)config.sub$
# stuff autogenerated by autoconf - still C deps
- (^|/)aclocal.m4
- (^|/)libtool.m4
- (^|/)ltoptions.m4
- (^|/)ltsugar.m4
- (^|/)ltversion.m4
- (^|/)lt~obsolete.m4
# Linters
- cpplint.py
@@ -302,3 +309,6 @@
# Android Google APIs
- (^|/)\.google_apis/
# Jenkins Pipeline
- ^Jenkinsfile$

View File

@@ -1,3 +1,3 @@
module Linguist
VERSION = "4.7.2"
VERSION = "4.8.1"
end

View File

@@ -2,5 +2,6 @@
"repository": "https://github.com/github/linguist",
"dependencies": {
"season": "~>5.0"
}
},
"license": "MIT"
}

View File

@@ -1,3 +1,3 @@
Year,Make,Model,Length
1997,Ford,E350,2.34
2000,Mercury,Cougar,2.38
2000,Mercury,Cougar,2.38
1 Year Make Model Length
2 1997 Ford E350 2.34
3 2000 Mercury Cougar 2.38

133
samples/Click/sr2.click Normal file
View File

@@ -0,0 +1,133 @@
rates :: AvailableRates
elementclass sr2 {
$sr2_ip, $sr2_nm, $wireless_mac, $gateway, $probes|
arp :: ARPTable();
lt :: LinkTable(IP $sr2_ip);
gw :: SR2GatewaySelector(ETHTYPE 0x062c,
IP $sr2_ip,
ETH $wireless_mac,
LT lt,
ARP arp,
PERIOD 15,
GW $gateway);
gw -> SR2SetChecksum -> [0] output;
set_gw :: SR2SetGateway(SEL gw);
es :: SR2ETTStat(ETHTYPE 0x0641,
ETH $wireless_mac,
IP $sr2_ip,
PERIOD 30000,
TAU 300000,
ARP arp,
PROBES $probes,
ETT metric,
RT rates);
metric :: SR2ETTMetric(LT lt);
forwarder :: SR2Forwarder(ETHTYPE 0x0643,
IP $sr2_ip,
ETH $wireless_mac,
ARP arp,
LT lt);
querier :: SR2Querier(ETH $wireless_mac,
SR forwarder,
LT lt,
ROUTE_DAMPENING true,
TIME_BEFORE_SWITCH 5,
DEBUG true);
query_forwarder :: SR2MetricFlood(ETHTYPE 0x0644,
IP $sr2_ip,
ETH $wireless_mac,
LT lt,
ARP arp,
DEBUG false);
query_responder :: SR2QueryResponder(ETHTYPE 0x0645,
IP $sr2_ip,
ETH $wireless_mac,
LT lt,
ARP arp,
DEBUG true);
query_responder -> SR2SetChecksum -> [0] output;
query_forwarder -> SR2SetChecksum -> SR2Print(forwarding) -> [0] output;
query_forwarder [1] -> query_responder;
data_ck :: SR2SetChecksum()
input [1]
-> host_cl :: IPClassifier(dst net $sr2_ip mask $sr2_nm,
-)
-> querier
-> data_ck;
host_cl [1] -> [0] set_gw [0] -> querier;
forwarder[0]
-> dt ::DecIPTTL
-> data_ck
-> [2] output;
dt[1]
-> Print(ttl-error)
-> ICMPError($sr2_ip, timeexceeded, 0)
-> querier;
// queries
querier [1] -> [1] query_forwarder;
es -> SetTimestamp() -> [1] output;
forwarder[1] //ip packets to me
-> SR2StripHeader()
-> CheckIPHeader()
-> from_gw_cl :: IPClassifier(src net $sr2_ip mask $sr2_nm,
-)
-> [3] output;
from_gw_cl [1] -> [1] set_gw [1] -> [3] output;
input [0]
-> ncl :: Classifier(
12/0643 , //sr2_forwarder
12/0644 , //sr2
12/0645 , //replies
12/0641 , //sr2_es
12/062c , //sr2_gw
);
ncl[0] -> SR2CheckHeader() -> [0] forwarder;
ncl[1] -> SR2CheckHeader() -> PrintSR(query) -> query_forwarder
ncl[2] -> SR2CheckHeader() -> query_responder;
ncl[3] -> es;
ncl[4] -> SR2CheckHeader() -> gw;
}
Idle -> s :: sr2(2.0.0.1, 255.0.0.0, 00:00:00:00:00:01, false, "12 60 12 1500") -> Discard;
Idle -> [1] s;
s[1] -> Discard;
s[2] -> Discard;
s[3] -> Discard;

View File

@@ -0,0 +1,142 @@
// This Click configuration implements a firewall and NAT, roughly based on the
// mazu-nat.click example.
//
// This example assumes there is one interface that is IP-aliased. In this
// example, eth0 and eth0:0 have IP addresses 66.68.65.90 and 192.168.1.1,
// respectively. There is a local network, 192.168.1.0/24, and an upstream
// gateway, 66.58.65.89. Traffic from the local network is NATed.
//
// Connections can be initiated from the NAT box itself, also.
//
// For bugs, suggestions, and, corrections, please email me.
//
// Author: Thomer M. Gil (click@thomer.com)
AddressInfo(
eth0-in 192.168.1.1 192.168.1.0/24 00:0d:87:9d:1c:e9,
eth0-ex 66.58.65.90 00:0d:87:9d:1c:e9,
gw-addr 66.58.65.89 00:20:6f:14:54:c2
);
elementclass SniffGatewayDevice {
$device |
from :: FromDevice($device)
-> t1 :: Tee
-> output;
input -> q :: Queue(1024)
-> t2 :: PullTee
-> to :: ToDevice($device);
t1[1] -> ToHostSniffers;
t2[1] -> ToHostSniffers($device);
ScheduleInfo(from .1, to 1);
}
device :: SniffGatewayDevice(eth0);
arpq_in :: ARPQuerier(eth0-in) -> device;
ip_to_extern :: GetIPAddress(16)
-> CheckIPHeader
-> EtherEncap(0x800, eth0-ex, gw-addr)
-> device;
ip_to_host :: EtherEncap(0x800, gw-addr, eth0-ex)
-> ToHost;
ip_to_intern :: GetIPAddress(16)
-> CheckIPHeader
-> arpq_in;
arp_class :: Classifier(
12/0806 20/0001, // [0] ARP requests
12/0806 20/0002, // [1] ARP replies to host
12/0800); // [2] IP packets
device -> arp_class;
// ARP crap
arp_class[0] -> ARPResponder(eth0-in, eth0-ex) -> device;
arp_class[1] -> arp_t :: Tee;
arp_t[0] -> ToHost;
arp_t[1] -> [1]arpq_in;
// IP packets
arp_class[2] -> Strip(14)
-> CheckIPHeader
-> ipclass :: IPClassifier(dst host eth0-ex,
dst host eth0-in,
src net eth0-in);
// Define pattern NAT
iprw :: IPRewriterPatterns(NAT eth0-ex 50000-65535 - -);
// Rewriting rules for UDP/TCP packets
// output[0] rewritten to go into the wild
// output[1] rewritten to come back from the wild or no match
rw :: IPRewriter(pattern NAT 0 1,
pass 1);
// Rewriting rules for ICMP packets
irw :: ICMPPingRewriter(eth0-ex, -);
irw[0] -> ip_to_extern;
irw[1] -> icmp_me_or_intern :: IPClassifier(dst host eth0-ex, -);
icmp_me_or_intern[0] -> ip_to_host;
icmp_me_or_intern[1] -> ip_to_intern;
// Rewriting rules for ICMP error packets
ierw :: ICMPRewriter(rw irw);
ierw[0] -> icmp_me_or_intern;
ierw[1] -> icmp_me_or_intern;
// Packets directed at eth0-ex.
// Send it through IPRewriter(pass). If there was a mapping, it will be
// rewritten such that dst is eth0-in:net, otherwise dst will still be for
// eth0-ex.
ipclass[0] -> [1]rw;
// packets that were rewritten, heading into the wild world.
rw[0] -> ip_to_extern;
// packets that come back from the wild or are not part of an established
// connection.
rw[1] -> established_class :: IPClassifier(dst host eth0-ex,
dst net eth0-in);
// not established yet or returning packets for a connection that was
// established from this host itself.
established_class[0] ->
firewall :: IPClassifier(dst tcp port ssh,
dst tcp port smtp,
dst tcp port domain,
dst udp port domain,
icmp type echo-reply,
proto icmp,
port > 4095,
-);
firewall[0] -> ip_to_host; // ssh
firewall[1] -> ip_to_host; // smtp
firewall[2] -> ip_to_host; // domain (t)
firewall[3] -> ip_to_host; // domain (u)
firewall[4] -> [0]irw; // icmp reply
firewall[5] -> [0]ierw; // other icmp
firewall[6] -> ip_to_host; // port > 4095, probably for connection
// originating from host itself
firewall[7] -> Discard; // don't allow incoming for port <= 4095
// established connection
established_class[1] -> ip_to_intern;
// To eth0-in. Only accept from inside network.
ipclass[1] -> IPClassifier(src net eth0-in) -> ip_to_host;
// Packets from eth0-in:net either stay on local network or go to the wild.
// Those that go into the wild need to go through the appropriate rewriting
// element. (Either UDP/TCP rewriter or ICMP rewriter.)
ipclass[2] -> inter_class :: IPClassifier(dst net eth0-in, -);
inter_class[0] -> ip_to_intern;
inter_class[1] -> ip_udp_class :: IPClassifier(tcp or udp,
icmp type echo);
ip_udp_class[0] -> [0]rw;
ip_udp_class[1] -> [0]irw;

View File

@@ -0,0 +1,856 @@
Nonterminals
grammar expr_list
expr container_expr block_expr access_expr
no_parens_expr no_parens_zero_expr no_parens_one_expr no_parens_one_ambig_expr
bracket_expr bracket_at_expr bracket_arg matched_expr unmatched_expr max_expr
unmatched_op_expr matched_op_expr no_parens_op_expr no_parens_many_expr
comp_op_eol at_op_eol unary_op_eol and_op_eol or_op_eol capture_op_eol
add_op_eol mult_op_eol two_op_eol three_op_eol pipe_op_eol stab_op_eol
arrow_op_eol match_op_eol when_op_eol in_op_eol in_match_op_eol
type_op_eol rel_op_eol
open_paren close_paren empty_paren eoe
list list_args open_bracket close_bracket
tuple open_curly close_curly
bit_string open_bit close_bit
map map_op map_close map_args map_expr struct_op
assoc_op_eol assoc_expr assoc_base assoc_update assoc_update_kw assoc
container_args_base container_args
call_args_parens_expr call_args_parens_base call_args_parens parens_call
call_args_no_parens_one call_args_no_parens_ambig call_args_no_parens_expr
call_args_no_parens_comma_expr call_args_no_parens_all call_args_no_parens_many
call_args_no_parens_many_strict
stab stab_eoe stab_expr stab_op_eol_and_expr stab_parens_many
kw_eol kw_base kw call_args_no_parens_kw_expr call_args_no_parens_kw
dot_op dot_alias dot_alias_container
dot_identifier dot_op_identifier dot_do_identifier
dot_paren_identifier dot_bracket_identifier
do_block fn_eoe do_eoe end_eoe block_eoe block_item block_list
.
Terminals
identifier kw_identifier kw_identifier_safe kw_identifier_unsafe bracket_identifier
paren_identifier do_identifier block_identifier
fn 'end' aliases
number atom atom_safe atom_unsafe bin_string list_string sigil
dot_call_op op_identifier
comp_op at_op unary_op and_op or_op arrow_op match_op in_op in_match_op
type_op dual_op add_op mult_op two_op three_op pipe_op stab_op when_op assoc_op
capture_op rel_op
'true' 'false' 'nil' 'do' eol ';' ',' '.'
'(' ')' '[' ']' '{' '}' '<<' '>>' '%{}' '%'
.
Rootsymbol grammar.
%% Two shift/reduce conflicts coming from call_args_parens.
Expect 2.
%% Changes in ops and precedence should be reflected on lib/elixir/lib/macro.ex
%% Note though the operator => in practice has lower precedence than all others,
%% its entry in the table is only to support the %{user | foo => bar} syntax.
Left 5 do.
Right 10 stab_op_eol. %% ->
Left 20 ','.
Nonassoc 30 capture_op_eol. %% &
Left 40 in_match_op_eol. %% <-, \\ (allowed in matches along =)
Right 50 when_op_eol. %% when
Right 60 type_op_eol. %% ::
Right 70 pipe_op_eol. %% |
Right 80 assoc_op_eol. %% =>
Right 90 match_op_eol. %% =
Left 130 or_op_eol. %% ||, |||, or
Left 140 and_op_eol. %% &&, &&&, and
Left 150 comp_op_eol. %% ==, !=, =~, ===, !==
Left 160 rel_op_eol. %% <, >, <=, >=
Left 170 arrow_op_eol. %% |>, <<<, >>>, ~>>, <<~, ~>, <~, <~>, <|>
Left 180 in_op_eol. %% in
Left 190 three_op_eol. %% ^^^
Right 200 two_op_eol. %% ++, --, .., <>
Left 210 add_op_eol. %% +, -
Left 220 mult_op_eol. %% *, /
Nonassoc 300 unary_op_eol. %% +, -, !, ^, not, ~~~
Left 310 dot_call_op.
Left 310 dot_op. %% .
Nonassoc 320 at_op_eol. %% @
Nonassoc 330 dot_identifier.
%%% MAIN FLOW OF EXPRESSIONS
grammar -> eoe : nil.
grammar -> expr_list : to_block('$1').
grammar -> eoe expr_list : to_block('$2').
grammar -> expr_list eoe : to_block('$1').
grammar -> eoe expr_list eoe : to_block('$2').
grammar -> '$empty' : nil.
% Note expressions are on reverse order
expr_list -> expr : ['$1'].
expr_list -> expr_list eoe expr : ['$3'|'$1'].
expr -> matched_expr : '$1'.
expr -> no_parens_expr : '$1'.
expr -> unmatched_expr : '$1'.
%% In Elixir we have three main call syntaxes: with parentheses,
%% without parentheses and with do blocks. They are represented
%% in the AST as matched, no_parens and unmatched.
%%
%% Calls without parentheses are further divided according to how
%% problematic they are:
%%
%% (a) no_parens_one: a call with one unproblematic argument
%% (e.g. `f a` or `f g a` and similar) (includes unary operators)
%%
%% (b) no_parens_many: a call with several arguments (e.g. `f a, b`)
%%
%% (c) no_parens_one_ambig: a call with one argument which is
%% itself a no_parens_many or no_parens_one_ambig (e.g. `f g a, b`
%% or `f g h a, b` and similar)
%%
%% Note, in particular, that no_parens_one_ambig expressions are
%% ambiguous and are interpreted such that the outer function has
%% arity 1 (e.g. `f g a, b` is interpreted as `f(g(a, b))` rather
%% than `f(g(a), b)`). Hence the name, no_parens_one_ambig.
%%
%% The distinction is required because we can't, for example, have
%% a function call with a do block as argument inside another do
%% block call, unless there are parentheses:
%%
%% if if true do true else false end do #=> invalid
%% if(if true do true else false end) do #=> valid
%%
%% Similarly, it is not possible to nest calls without parentheses
%% if their arity is more than 1:
%%
%% foo a, bar b, c #=> invalid
%% foo(a, bar b, c) #=> invalid
%% foo bar a, b #=> valid
%% foo a, bar(b, c) #=> valid
%%
%% So the different grammar rules need to take into account
%% if calls without parentheses are do blocks in particular
%% segments and act accordingly.
matched_expr -> matched_expr matched_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')).
matched_expr -> unary_op_eol matched_expr : build_unary_op('$1', '$2').
matched_expr -> at_op_eol matched_expr : build_unary_op('$1', '$2').
matched_expr -> capture_op_eol matched_expr : build_unary_op('$1', '$2').
matched_expr -> no_parens_one_expr : '$1'.
matched_expr -> no_parens_zero_expr : '$1'.
matched_expr -> access_expr : '$1'.
matched_expr -> access_expr kw_identifier : throw_invalid_kw_identifier('$2').
unmatched_expr -> matched_expr unmatched_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')).
unmatched_expr -> unmatched_expr matched_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')).
unmatched_expr -> unmatched_expr unmatched_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')).
unmatched_expr -> unmatched_expr no_parens_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')).
unmatched_expr -> unary_op_eol expr : build_unary_op('$1', '$2').
unmatched_expr -> at_op_eol expr : build_unary_op('$1', '$2').
unmatched_expr -> capture_op_eol expr : build_unary_op('$1', '$2').
unmatched_expr -> block_expr : '$1'.
no_parens_expr -> matched_expr no_parens_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')).
no_parens_expr -> unary_op_eol no_parens_expr : build_unary_op('$1', '$2').
no_parens_expr -> at_op_eol no_parens_expr : build_unary_op('$1', '$2').
no_parens_expr -> capture_op_eol no_parens_expr : build_unary_op('$1', '$2').
no_parens_expr -> no_parens_one_ambig_expr : '$1'.
no_parens_expr -> no_parens_many_expr : '$1'.
block_expr -> parens_call call_args_parens do_block : build_identifier('$1', '$2' ++ '$3').
block_expr -> parens_call call_args_parens call_args_parens do_block : build_nested_parens('$1', '$2', '$3' ++ '$4').
block_expr -> dot_do_identifier do_block : build_identifier('$1', '$2').
block_expr -> dot_identifier call_args_no_parens_all do_block : build_identifier('$1', '$2' ++ '$3').
matched_op_expr -> match_op_eol matched_expr : {'$1', '$2'}.
matched_op_expr -> add_op_eol matched_expr : {'$1', '$2'}.
matched_op_expr -> mult_op_eol matched_expr : {'$1', '$2'}.
matched_op_expr -> two_op_eol matched_expr : {'$1', '$2'}.
matched_op_expr -> three_op_eol matched_expr : {'$1', '$2'}.
matched_op_expr -> and_op_eol matched_expr : {'$1', '$2'}.
matched_op_expr -> or_op_eol matched_expr : {'$1', '$2'}.
matched_op_expr -> in_op_eol matched_expr : {'$1', '$2'}.
matched_op_expr -> in_match_op_eol matched_expr : {'$1', '$2'}.
matched_op_expr -> type_op_eol matched_expr : {'$1', '$2'}.
matched_op_expr -> when_op_eol matched_expr : {'$1', '$2'}.
matched_op_expr -> pipe_op_eol matched_expr : {'$1', '$2'}.
matched_op_expr -> comp_op_eol matched_expr : {'$1', '$2'}.
matched_op_expr -> rel_op_eol matched_expr : {'$1', '$2'}.
matched_op_expr -> arrow_op_eol matched_expr : {'$1', '$2'}.
%% Warn for no parens subset
matched_op_expr -> arrow_op_eol no_parens_one_expr : warn_pipe('$1', '$2'), {'$1', '$2'}.
unmatched_op_expr -> match_op_eol unmatched_expr : {'$1', '$2'}.
unmatched_op_expr -> add_op_eol unmatched_expr : {'$1', '$2'}.
unmatched_op_expr -> mult_op_eol unmatched_expr : {'$1', '$2'}.
unmatched_op_expr -> two_op_eol unmatched_expr : {'$1', '$2'}.
unmatched_op_expr -> three_op_eol unmatched_expr : {'$1', '$2'}.
unmatched_op_expr -> and_op_eol unmatched_expr : {'$1', '$2'}.
unmatched_op_expr -> or_op_eol unmatched_expr : {'$1', '$2'}.
unmatched_op_expr -> in_op_eol unmatched_expr : {'$1', '$2'}.
unmatched_op_expr -> in_match_op_eol unmatched_expr : {'$1', '$2'}.
unmatched_op_expr -> type_op_eol unmatched_expr : {'$1', '$2'}.
unmatched_op_expr -> when_op_eol unmatched_expr : {'$1', '$2'}.
unmatched_op_expr -> pipe_op_eol unmatched_expr : {'$1', '$2'}.
unmatched_op_expr -> comp_op_eol unmatched_expr : {'$1', '$2'}.
unmatched_op_expr -> rel_op_eol unmatched_expr : {'$1', '$2'}.
unmatched_op_expr -> arrow_op_eol unmatched_expr : {'$1', '$2'}.
no_parens_op_expr -> match_op_eol no_parens_expr : {'$1', '$2'}.
no_parens_op_expr -> add_op_eol no_parens_expr : {'$1', '$2'}.
no_parens_op_expr -> mult_op_eol no_parens_expr : {'$1', '$2'}.
no_parens_op_expr -> two_op_eol no_parens_expr : {'$1', '$2'}.
no_parens_op_expr -> three_op_eol no_parens_expr : {'$1', '$2'}.
no_parens_op_expr -> and_op_eol no_parens_expr : {'$1', '$2'}.
no_parens_op_expr -> or_op_eol no_parens_expr : {'$1', '$2'}.
no_parens_op_expr -> in_op_eol no_parens_expr : {'$1', '$2'}.
no_parens_op_expr -> in_match_op_eol no_parens_expr : {'$1', '$2'}.
no_parens_op_expr -> type_op_eol no_parens_expr : {'$1', '$2'}.
no_parens_op_expr -> when_op_eol no_parens_expr : {'$1', '$2'}.
no_parens_op_expr -> pipe_op_eol no_parens_expr : {'$1', '$2'}.
no_parens_op_expr -> comp_op_eol no_parens_expr : {'$1', '$2'}.
no_parens_op_expr -> rel_op_eol no_parens_expr : {'$1', '$2'}.
no_parens_op_expr -> arrow_op_eol no_parens_expr : {'$1', '$2'}.
%% Warn for no parens subset
no_parens_op_expr -> arrow_op_eol no_parens_one_ambig_expr : warn_pipe('$1', '$2'), {'$1', '$2'}.
no_parens_op_expr -> arrow_op_eol no_parens_many_expr : warn_pipe('$1', '$2'), {'$1', '$2'}.
%% Allow when (and only when) with keywords
no_parens_op_expr -> when_op_eol call_args_no_parens_kw : {'$1', '$2'}.
no_parens_one_ambig_expr -> dot_op_identifier call_args_no_parens_ambig : build_identifier('$1', '$2').
no_parens_one_ambig_expr -> dot_identifier call_args_no_parens_ambig : build_identifier('$1', '$2').
no_parens_many_expr -> dot_op_identifier call_args_no_parens_many_strict : build_identifier('$1', '$2').
no_parens_many_expr -> dot_identifier call_args_no_parens_many_strict : build_identifier('$1', '$2').
no_parens_one_expr -> dot_op_identifier call_args_no_parens_one : build_identifier('$1', '$2').
no_parens_one_expr -> dot_identifier call_args_no_parens_one : build_identifier('$1', '$2').
no_parens_zero_expr -> dot_do_identifier : build_identifier('$1', nil).
no_parens_zero_expr -> dot_identifier : build_identifier('$1', nil).
%% From this point on, we just have constructs that can be
%% used with the access syntax. Notice that (dot_)identifier
%% is not included in this list simply because the tokenizer
%% marks identifiers followed by brackets as bracket_identifier.
access_expr -> bracket_at_expr : '$1'.
access_expr -> bracket_expr : '$1'.
access_expr -> at_op_eol number : build_unary_op('$1', ?exprs('$2')).
access_expr -> unary_op_eol number : build_unary_op('$1', ?exprs('$2')).
access_expr -> capture_op_eol number : build_unary_op('$1', ?exprs('$2')).
access_expr -> fn_eoe stab end_eoe : build_fn('$1', reverse('$2')).
access_expr -> open_paren stab close_paren : build_stab(reverse('$2')).
access_expr -> open_paren stab ';' close_paren : build_stab(reverse('$2')).
access_expr -> open_paren ';' stab ';' close_paren : build_stab(reverse('$3')).
access_expr -> open_paren ';' stab close_paren : build_stab(reverse('$3')).
access_expr -> open_paren ';' close_paren : build_stab([]).
access_expr -> empty_paren : nil.
access_expr -> number : ?exprs('$1').
access_expr -> list : element(1, '$1').
access_expr -> map : '$1'.
access_expr -> tuple : '$1'.
access_expr -> 'true' : ?id('$1').
access_expr -> 'false' : ?id('$1').
access_expr -> 'nil' : ?id('$1').
access_expr -> bin_string : build_bin_string('$1').
access_expr -> list_string : build_list_string('$1').
access_expr -> bit_string : '$1'.
access_expr -> sigil : build_sigil('$1').
access_expr -> max_expr : '$1'.
%% Aliases and properly formed calls. Used by map_expr.
max_expr -> atom : ?exprs('$1').
max_expr -> atom_safe : build_quoted_atom('$1', true).
max_expr -> atom_unsafe : build_quoted_atom('$1', false).
max_expr -> parens_call call_args_parens : build_identifier('$1', '$2').
max_expr -> parens_call call_args_parens call_args_parens : build_nested_parens('$1', '$2', '$3').
max_expr -> dot_alias : '$1'.
bracket_arg -> open_bracket kw close_bracket : build_list('$1', '$2').
bracket_arg -> open_bracket container_expr close_bracket : build_list('$1', '$2').
bracket_arg -> open_bracket container_expr ',' close_bracket : build_list('$1', '$2').
bracket_expr -> dot_bracket_identifier bracket_arg : build_access(build_identifier('$1', nil), '$2').
bracket_expr -> access_expr bracket_arg : build_access('$1', '$2').
bracket_at_expr -> at_op_eol dot_bracket_identifier bracket_arg :
build_access(build_unary_op('$1', build_identifier('$2', nil)), '$3').
bracket_at_expr -> at_op_eol access_expr bracket_arg :
build_access(build_unary_op('$1', '$2'), '$3').
%% Blocks
do_block -> do_eoe 'end' : [[{do, nil}]].
do_block -> do_eoe stab end_eoe : [[{do, build_stab(reverse('$2'))}]].
do_block -> do_eoe block_list 'end' : [[{do, nil}|'$2']].
do_block -> do_eoe stab_eoe block_list 'end' : [[{do, build_stab(reverse('$2'))}|'$3']].
eoe -> eol : '$1'.
eoe -> ';' : '$1'.
eoe -> eol ';' : '$1'.
fn_eoe -> 'fn' : '$1'.
fn_eoe -> 'fn' eoe : '$1'.
do_eoe -> 'do' : '$1'.
do_eoe -> 'do' eoe : '$1'.
end_eoe -> 'end' : '$1'.
end_eoe -> eoe 'end' : '$2'.
block_eoe -> block_identifier : '$1'.
block_eoe -> block_identifier eoe : '$1'.
stab -> stab_expr : ['$1'].
stab -> stab eoe stab_expr : ['$3'|'$1'].
stab_eoe -> stab : '$1'.
stab_eoe -> stab eoe : '$1'.
%% Here, `element(1, Token)` is the stab operator,
%% while `element(2, Token)` is the expression.
stab_expr -> expr :
'$1'.
stab_expr -> stab_op_eol_and_expr :
build_op(element(1, '$1'), [], element(2, '$1')).
stab_expr -> empty_paren stab_op_eol_and_expr :
build_op(element(1, '$2'), [], element(2, '$2')).
stab_expr -> call_args_no_parens_all stab_op_eol_and_expr :
build_op(element(1, '$2'), unwrap_when(unwrap_splice('$1')), element(2, '$2')).
stab_expr -> stab_parens_many stab_op_eol_and_expr :
build_op(element(1, '$2'), unwrap_splice('$1'), element(2, '$2')).
stab_expr -> stab_parens_many when_op expr stab_op_eol_and_expr :
build_op(element(1, '$4'), [{'when', meta_from_token('$2'), unwrap_splice('$1') ++ ['$3']}], element(2, '$4')).
stab_op_eol_and_expr -> stab_op_eol expr : {'$1', '$2'}.
stab_op_eol_and_expr -> stab_op_eol : warn_empty_stab_clause('$1'), {'$1', nil}.
block_item -> block_eoe stab_eoe : {?exprs('$1'), build_stab(reverse('$2'))}.
block_item -> block_eoe : {?exprs('$1'), nil}.
block_list -> block_item : ['$1'].
block_list -> block_item block_list : ['$1'|'$2'].
%% Helpers
open_paren -> '(' : '$1'.
open_paren -> '(' eol : '$1'.
close_paren -> ')' : '$1'.
close_paren -> eol ')' : '$2'.
empty_paren -> open_paren ')' : '$1'.
open_bracket -> '[' : '$1'.
open_bracket -> '[' eol : '$1'.
close_bracket -> ']' : '$1'.
close_bracket -> eol ']' : '$2'.
open_bit -> '<<' : '$1'.
open_bit -> '<<' eol : '$1'.
close_bit -> '>>' : '$1'.
close_bit -> eol '>>' : '$2'.
open_curly -> '{' : '$1'.
open_curly -> '{' eol : '$1'.
close_curly -> '}' : '$1'.
close_curly -> eol '}' : '$2'.
% Operators
add_op_eol -> add_op : '$1'.
add_op_eol -> add_op eol : '$1'.
add_op_eol -> dual_op : '$1'.
add_op_eol -> dual_op eol : '$1'.
mult_op_eol -> mult_op : '$1'.
mult_op_eol -> mult_op eol : '$1'.
two_op_eol -> two_op : '$1'.
two_op_eol -> two_op eol : '$1'.
three_op_eol -> three_op : '$1'.
three_op_eol -> three_op eol : '$1'.
pipe_op_eol -> pipe_op : '$1'.
pipe_op_eol -> pipe_op eol : '$1'.
capture_op_eol -> capture_op : '$1'.
capture_op_eol -> capture_op eol : '$1'.
unary_op_eol -> unary_op : '$1'.
unary_op_eol -> unary_op eol : '$1'.
unary_op_eol -> dual_op : '$1'.
unary_op_eol -> dual_op eol : '$1'.
match_op_eol -> match_op : '$1'.
match_op_eol -> match_op eol : '$1'.
and_op_eol -> and_op : '$1'.
and_op_eol -> and_op eol : '$1'.
or_op_eol -> or_op : '$1'.
or_op_eol -> or_op eol : '$1'.
in_op_eol -> in_op : '$1'.
in_op_eol -> in_op eol : '$1'.
in_match_op_eol -> in_match_op : '$1'.
in_match_op_eol -> in_match_op eol : '$1'.
type_op_eol -> type_op : '$1'.
type_op_eol -> type_op eol : '$1'.
when_op_eol -> when_op : '$1'.
when_op_eol -> when_op eol : '$1'.
stab_op_eol -> stab_op : '$1'.
stab_op_eol -> stab_op eol : '$1'.
at_op_eol -> at_op : '$1'.
at_op_eol -> at_op eol : '$1'.
comp_op_eol -> comp_op : '$1'.
comp_op_eol -> comp_op eol : '$1'.
rel_op_eol -> rel_op : '$1'.
rel_op_eol -> rel_op eol : '$1'.
arrow_op_eol -> arrow_op : '$1'.
arrow_op_eol -> arrow_op eol : '$1'.
% Dot operator
dot_op -> '.' : '$1'.
dot_op -> '.' eol : '$1'.
dot_identifier -> identifier : '$1'.
dot_identifier -> matched_expr dot_op identifier : build_dot('$2', '$1', '$3').
dot_alias -> aliases : {'__aliases__', meta_from_token('$1', 0), ?exprs('$1')}.
dot_alias -> matched_expr dot_op aliases : build_dot_alias('$2', '$1', '$3').
dot_alias -> matched_expr dot_op dot_alias_container : build_dot_container('$2', '$1', '$3').
dot_alias_container -> open_curly '}' : [].
dot_alias_container -> open_curly container_args close_curly : '$2'.
dot_op_identifier -> op_identifier : '$1'.
dot_op_identifier -> matched_expr dot_op op_identifier : build_dot('$2', '$1', '$3').
dot_do_identifier -> do_identifier : '$1'.
dot_do_identifier -> matched_expr dot_op do_identifier : build_dot('$2', '$1', '$3').
dot_bracket_identifier -> bracket_identifier : '$1'.
dot_bracket_identifier -> matched_expr dot_op bracket_identifier : build_dot('$2', '$1', '$3').
dot_paren_identifier -> paren_identifier : '$1'.
dot_paren_identifier -> matched_expr dot_op paren_identifier : build_dot('$2', '$1', '$3').
parens_call -> dot_paren_identifier : '$1'.
parens_call -> matched_expr dot_call_op : {'.', meta_from_token('$2'), ['$1']}. % Fun/local calls
% Function calls with no parentheses
call_args_no_parens_expr -> matched_expr : '$1'.
call_args_no_parens_expr -> no_parens_expr : throw_no_parens_many_strict('$1').
call_args_no_parens_comma_expr -> matched_expr ',' call_args_no_parens_expr : ['$3', '$1'].
call_args_no_parens_comma_expr -> call_args_no_parens_comma_expr ',' call_args_no_parens_expr : ['$3'|'$1'].
call_args_no_parens_all -> call_args_no_parens_one : '$1'.
call_args_no_parens_all -> call_args_no_parens_ambig : '$1'.
call_args_no_parens_all -> call_args_no_parens_many : '$1'.
call_args_no_parens_one -> call_args_no_parens_kw : ['$1'].
call_args_no_parens_one -> matched_expr : ['$1'].
call_args_no_parens_ambig -> no_parens_expr : ['$1'].
call_args_no_parens_many -> matched_expr ',' call_args_no_parens_kw : ['$1', '$3'].
call_args_no_parens_many -> call_args_no_parens_comma_expr : reverse('$1').
call_args_no_parens_many -> call_args_no_parens_comma_expr ',' call_args_no_parens_kw : reverse(['$3'|'$1']).
call_args_no_parens_many_strict -> call_args_no_parens_many : '$1'.
call_args_no_parens_many_strict -> open_paren call_args_no_parens_kw close_paren : throw_no_parens_strict('$1').
call_args_no_parens_many_strict -> open_paren call_args_no_parens_many close_paren : throw_no_parens_strict('$1').
stab_parens_many -> open_paren call_args_no_parens_kw close_paren : ['$2'].
stab_parens_many -> open_paren call_args_no_parens_many close_paren : '$2'.
% Containers
container_expr -> matched_expr : '$1'.
container_expr -> unmatched_expr : '$1'.
container_expr -> no_parens_expr : throw_no_parens_container_strict('$1').
container_args_base -> container_expr : ['$1'].
container_args_base -> container_args_base ',' container_expr : ['$3'|'$1'].
container_args -> container_args_base : lists:reverse('$1').
container_args -> container_args_base ',' : lists:reverse('$1').
container_args -> container_args_base ',' kw : lists:reverse(['$3'|'$1']).
% Function calls with parentheses
call_args_parens_expr -> matched_expr : '$1'.
call_args_parens_expr -> unmatched_expr : '$1'.
call_args_parens_expr -> no_parens_expr : throw_no_parens_many_strict('$1').
call_args_parens_base -> call_args_parens_expr : ['$1'].
call_args_parens_base -> call_args_parens_base ',' call_args_parens_expr : ['$3'|'$1'].
call_args_parens -> empty_paren : [].
call_args_parens -> open_paren no_parens_expr close_paren : ['$2'].
call_args_parens -> open_paren kw close_paren : ['$2'].
call_args_parens -> open_paren call_args_parens_base close_paren : reverse('$2').
call_args_parens -> open_paren call_args_parens_base ',' kw close_paren : reverse(['$4'|'$2']).
% KV
kw_eol -> kw_identifier : ?exprs('$1').
kw_eol -> kw_identifier eol : ?exprs('$1').
kw_eol -> kw_identifier_safe : build_quoted_atom('$1', true).
kw_eol -> kw_identifier_safe eol : build_quoted_atom('$1', true).
kw_eol -> kw_identifier_unsafe : build_quoted_atom('$1', false).
kw_eol -> kw_identifier_unsafe eol : build_quoted_atom('$1', false).
kw_base -> kw_eol container_expr : [{'$1', '$2'}].
kw_base -> kw_base ',' kw_eol container_expr : [{'$3', '$4'}|'$1'].
kw -> kw_base : reverse('$1').
kw -> kw_base ',' : reverse('$1').
call_args_no_parens_kw_expr -> kw_eol matched_expr : {'$1', '$2'}.
call_args_no_parens_kw_expr -> kw_eol no_parens_expr : {'$1', '$2'}.
call_args_no_parens_kw -> call_args_no_parens_kw_expr : ['$1'].
call_args_no_parens_kw -> call_args_no_parens_kw_expr ',' call_args_no_parens_kw : ['$1'|'$3'].
% Lists
list_args -> kw : '$1'.
list_args -> container_args_base : reverse('$1').
list_args -> container_args_base ',' : reverse('$1').
list_args -> container_args_base ',' kw : reverse('$1', '$3').
list -> open_bracket ']' : build_list('$1', []).
list -> open_bracket list_args close_bracket : build_list('$1', '$2').
% Tuple
tuple -> open_curly '}' : build_tuple('$1', []).
tuple -> open_curly container_args close_curly : build_tuple('$1', '$2').
% Bitstrings
bit_string -> open_bit '>>' : build_bit('$1', []).
bit_string -> open_bit container_args close_bit : build_bit('$1', '$2').
% Map and structs
%% Allow unquote/@something/aliases inside maps and structs.
map_expr -> max_expr : '$1'.
map_expr -> dot_identifier : build_identifier('$1', nil).
map_expr -> at_op_eol map_expr : build_unary_op('$1', '$2').
assoc_op_eol -> assoc_op : '$1'.
assoc_op_eol -> assoc_op eol : '$1'.
assoc_expr -> matched_expr assoc_op_eol matched_expr : {'$1', '$3'}.
assoc_expr -> unmatched_expr assoc_op_eol unmatched_expr : {'$1', '$3'}.
assoc_expr -> matched_expr assoc_op_eol unmatched_expr : {'$1', '$3'}.
assoc_expr -> unmatched_expr assoc_op_eol matched_expr : {'$1', '$3'}.
assoc_expr -> map_expr : '$1'.
assoc_update -> matched_expr pipe_op_eol assoc_expr : {'$2', '$1', ['$3']}.
assoc_update -> unmatched_expr pipe_op_eol assoc_expr : {'$2', '$1', ['$3']}.
assoc_update_kw -> matched_expr pipe_op_eol kw : {'$2', '$1', '$3'}.
assoc_update_kw -> unmatched_expr pipe_op_eol kw : {'$2', '$1', '$3'}.
assoc_base -> assoc_expr : ['$1'].
assoc_base -> assoc_base ',' assoc_expr : ['$3'|'$1'].
assoc -> assoc_base : reverse('$1').
assoc -> assoc_base ',' : reverse('$1').
map_op -> '%{}' : '$1'.
map_op -> '%{}' eol : '$1'.
map_close -> kw close_curly : '$1'.
map_close -> assoc close_curly : '$1'.
map_close -> assoc_base ',' kw close_curly : reverse('$1', '$3').
map_args -> open_curly '}' : build_map('$1', []).
map_args -> open_curly map_close : build_map('$1', '$2').
map_args -> open_curly assoc_update close_curly : build_map_update('$1', '$2', []).
map_args -> open_curly assoc_update ',' close_curly : build_map_update('$1', '$2', []).
map_args -> open_curly assoc_update ',' map_close : build_map_update('$1', '$2', '$4').
map_args -> open_curly assoc_update_kw close_curly : build_map_update('$1', '$2', []).
struct_op -> '%' : '$1'.
map -> map_op map_args : '$2'.
map -> struct_op map_expr map_args : {'%', meta_from_token('$1'), ['$2', '$3']}.
map -> struct_op map_expr eol map_args : {'%', meta_from_token('$1'), ['$2', '$4']}.
Erlang code.
-define(file(), get(elixir_parser_file)).
-define(id(Token), element(1, Token)).
-define(location(Token), element(2, Token)).
-define(exprs(Token), element(3, Token)).
-define(meta(Node), element(2, Node)).
-define(rearrange_uop(Op), (Op == 'not' orelse Op == '!')).
%% The following directive is needed for (significantly) faster
%% compilation of the generated .erl file by the HiPE compiler
-compile([{hipe, [{regalloc, linear_scan}]}]).
-import(lists, [reverse/1, reverse/2]).
meta_from_token(Token, Counter) -> [{counter, Counter}|meta_from_token(Token)].
meta_from_token(Token) -> meta_from_location(?location(Token)).
meta_from_location({Line, Column, EndColumn})
when is_integer(Line), is_integer(Column), is_integer(EndColumn) -> [{line, Line}].
%% Operators
build_op({_Kind, Location, 'in'}, {UOp, _, [Left]}, Right) when ?rearrange_uop(UOp) ->
{UOp, meta_from_location(Location), [{'in', meta_from_location(Location), [Left, Right]}]};
build_op({_Kind, Location, Op}, Left, Right) ->
{Op, meta_from_location(Location), [Left, Right]}.
build_unary_op({_Kind, Location, Op}, Expr) ->
{Op, meta_from_location(Location), [Expr]}.
build_list(Marker, Args) ->
{Args, ?location(Marker)}.
build_tuple(_Marker, [Left, Right]) ->
{Left, Right};
build_tuple(Marker, Args) ->
{'{}', meta_from_token(Marker), Args}.
build_bit(Marker, Args) ->
{'<<>>', meta_from_token(Marker), Args}.
build_map(Marker, Args) ->
{'%{}', meta_from_token(Marker), Args}.
build_map_update(Marker, {Pipe, Left, Right}, Extra) ->
{'%{}', meta_from_token(Marker), [build_op(Pipe, Left, Right ++ Extra)]}.
%% Blocks
build_block([{Op, _, [_]}]=Exprs) when ?rearrange_uop(Op) -> {'__block__', [], Exprs};
build_block([{unquote_splicing, _, Args}]=Exprs) when
length(Args) =< 2 -> {'__block__', [], Exprs};
build_block([Expr]) -> Expr;
build_block(Exprs) -> {'__block__', [], Exprs}.
%% Dots
build_dot_alias(Dot, {'__aliases__', _, Left}, {'aliases', _, Right}) ->
{'__aliases__', meta_from_token(Dot), Left ++ Right};
build_dot_alias(_Dot, Atom, {'aliases', _, _} = Token) when is_atom(Atom) ->
throw_bad_atom(Token);
build_dot_alias(Dot, Other, {'aliases', _, Right}) ->
{'__aliases__', meta_from_token(Dot), [Other|Right]}.
build_dot_container(Dot, Left, Right) ->
Meta = meta_from_token(Dot),
{{'.', Meta, [Left, '{}']}, Meta, Right}.
build_dot(Dot, Left, Right) ->
{'.', meta_from_token(Dot), [Left, extract_identifier(Right)]}.
extract_identifier({Kind, _, Identifier}) when
Kind == identifier; Kind == bracket_identifier; Kind == paren_identifier;
Kind == do_identifier; Kind == op_identifier ->
Identifier.
%% Identifiers
build_nested_parens(Dot, Args1, Args2) ->
Identifier = build_identifier(Dot, Args1),
Meta = ?meta(Identifier),
{Identifier, Meta, Args2}.
build_identifier({'.', Meta, _} = Dot, Args) ->
FArgs = case Args of
nil -> [];
_ -> Args
end,
{Dot, Meta, FArgs};
build_identifier({op_identifier, Location, Identifier}, [Arg]) ->
{Identifier, [{ambiguous_op, nil}|meta_from_location(Location)], [Arg]};
build_identifier({_, Location, Identifier}, Args) ->
{Identifier, meta_from_location(Location), Args}.
%% Fn
build_fn(Op, [{'->', _, [_, _]}|_] = Stab) ->
{fn, meta_from_token(Op), build_stab(Stab)};
build_fn(Op, _Stab) ->
throw(meta_from_token(Op), "expected clauses to be defined with -> inside: ", "'fn'").
%% Access
build_access(Expr, {List, Location}) ->
Meta = meta_from_location(Location),
{{'.', Meta, ['Elixir.Access', get]}, Meta, [Expr, List]}.
%% Interpolation aware
build_sigil({sigil, Location, Sigil, Parts, Modifiers}) ->
Meta = meta_from_location(Location),
{list_to_atom("sigil_" ++ [Sigil]), Meta, [{'<<>>', Meta, string_parts(Parts)}, Modifiers]}.
build_bin_string({bin_string, _Location, [H]}) when is_binary(H) ->
H;
build_bin_string({bin_string, Location, Args}) ->
{'<<>>', meta_from_location(Location), string_parts(Args)}.
build_list_string({list_string, _Location, [H]}) when is_binary(H) ->
elixir_utils:characters_to_list(H);
build_list_string({list_string, Location, Args}) ->
Meta = meta_from_location(Location),
{{'.', Meta, ['Elixir.String', to_char_list]}, Meta, [{'<<>>', Meta, string_parts(Args)}]}.
build_quoted_atom({_, _Location, [H]}, Safe) when is_binary(H) ->
Op = binary_to_atom_op(Safe), erlang:Op(H, utf8);
build_quoted_atom({_, Location, Args}, Safe) ->
Meta = meta_from_location(Location),
{{'.', Meta, [erlang, binary_to_atom_op(Safe)]}, Meta, [{'<<>>', Meta, string_parts(Args)}, utf8]}.
binary_to_atom_op(true) -> binary_to_existing_atom;
binary_to_atom_op(false) -> binary_to_atom.
string_parts(Parts) ->
[string_part(Part) || Part <- Parts].
string_part(Binary) when is_binary(Binary) ->
Binary;
string_part({Location, Tokens}) ->
Form = string_tokens_parse(Tokens),
Meta = meta_from_location(Location),
{'::', Meta, [{{'.', Meta, ['Elixir.Kernel', to_string]}, Meta, [Form]}, {binary, Meta, nil}]}.
string_tokens_parse(Tokens) ->
case parse(Tokens) of
{ok, Forms} -> Forms;
{error, _} = Error -> throw(Error)
end.
%% Keywords
build_stab([{'->', Meta, [Left, Right]}|T]) ->
build_stab(Meta, T, Left, [Right], []);
build_stab(Else) ->
build_block(Else).
build_stab(Old, [{'->', New, [Left, Right]}|T], Marker, Temp, Acc) ->
H = {'->', Old, [Marker, build_block(reverse(Temp))]},
build_stab(New, T, Left, [Right], [H|Acc]);
build_stab(Meta, [H|T], Marker, Temp, Acc) ->
build_stab(Meta, T, Marker, [H|Temp], Acc);
build_stab(Meta, [], Marker, Temp, Acc) ->
H = {'->', Meta, [Marker, build_block(reverse(Temp))]},
reverse([H|Acc]).
%% Every time the parser sees a (unquote_splicing())
%% it assumes that a block is being spliced, wrapping
%% the splicing in a __block__. But in the stab clause,
%% we can have (unquote_splicing(1, 2, 3)) -> :ok, in such
%% case, we don't actually want the block, since it is
%% an arg style call. unwrap_splice unwraps the splice
%% from such blocks.
unwrap_splice([{'__block__', [], [{unquote_splicing, _, _}] = Splice}]) ->
Splice;
unwrap_splice(Other) -> Other.
unwrap_when(Args) ->
case elixir_utils:split_last(Args) of
{Start, {'when', Meta, [_, _] = End}} ->
[{'when', Meta, Start ++ End}];
{_, _} ->
Args
end.
to_block([One]) -> One;
to_block(Other) -> {'__block__', [], reverse(Other)}.
%% Warnings and errors
throw(Meta, Error, Token) ->
Line =
case lists:keyfind(line, 1, Meta) of
{line, L} -> L;
false -> 0
end,
throw({error, {Line, ?MODULE, [Error, Token]}}).
throw_bad_atom(Token) ->
throw(meta_from_token(Token), "atom cannot be followed by an alias. If the '.' was meant to be "
"part of the atom's name, the atom name must be quoted. Syntax error before: ", "'.'").
throw_no_parens_strict(Token) ->
throw(meta_from_token(Token), "unexpected parentheses. If you are making a "
"function call, do not insert spaces between the function name and the "
"opening parentheses. Syntax error before: ", "'('").
throw_no_parens_many_strict(Node) ->
throw(?meta(Node),
"unexpected comma. Parentheses are required to solve ambiguity in nested calls.\n\n"
"This error happens when you have nested function calls without parentheses. "
"For example:\n\n"
" one a, two b, c, d\n\n"
"In the example above, we don't know if the parameters \"c\" and \"d\" apply "
"to the function \"one\" or \"two\". You can solve this by explicitly adding "
"parentheses:\n\n"
" one a, two(b, c, d)\n\n"
"Elixir cannot compile otherwise. Syntax error before: ", "','").
throw_no_parens_container_strict(Node) ->
throw(?meta(Node),
"unexpected comma. Parentheses are required to solve ambiguity inside containers.\n\n"
"This error may happen when you forget a comma in a list or other container:\n\n"
" [a, b c, d]\n\n"
"Or when you have ambiguous calls:\n\n"
" [one, two three, four, five]\n\n"
"In the example above, we don't know if the parameters \"four\" and \"five\" "
"belongs to the list or the function \"two\". You can solve this by explicitly "
"adding parentheses:\n\n"
" [one, two(three, four), five]\n\n"
"Elixir cannot compile otherwise. Syntax error before: ", "','").
throw_invalid_kw_identifier({_, _, do} = Token) ->
throw(meta_from_token(Token), elixir_tokenizer:invalid_do_error("unexpected keyword \"do:\""), "'do:'");
throw_invalid_kw_identifier({_, _, KW} = Token) ->
throw(meta_from_token(Token), "syntax error before: ", "'" ++ atom_to_list(KW) ++ "':").
%% TODO: Make those warnings errors.
warn_empty_stab_clause({stab_op, {Line, _Begin, _End}, '->'}) ->
elixir_errors:warn(Line, ?file(),
"an expression is always required on the right side of ->. "
"Please provide a value after ->").
warn_pipe({arrow_op, {Line, _Begin, _End}, Op}, {_, [_|_], [_|_]}) ->
elixir_errors:warn(Line, ?file(),
io_lib:format(
"you are piping into a function call without parentheses, which may be ambiguous. "
"Please wrap the function you are piping into in parentheses. For example:\n\n"
" foo 1 ~ts bar 2 ~ts baz 3\n\n"
"Should be written as:\n\n"
" foo(1) ~ts bar(2) ~ts baz(3)\n",
[Op, Op, Op, Op]
)
);
warn_pipe(_Token, _) ->
ok.

256
samples/Erlang/lfe_scan.xrl Normal file
View File

@@ -0,0 +1,256 @@
%% Copyright (c) 2008-2013 Robert Virding
%%
%% 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.
%% File : lfe_scan.xrl
%% Author : Robert Virding
%% Purpose : Token definitions for Lisp Flavoured Erlang.
Definitions.
B = [01]
O = [0-7]
D = [0-9]
H = [0-9a-fA-F]
B36 = [0-9a-zA-Z]
U = [A-Z]
L = [a-z]
A = ({U}|{L})
DEL = [][()}{";\000-\s]
SYM = [^][()}{";\000-\s\177-\237]
SSYM = [^][()}{"|;#`',\000-\s\177-\237]
WS = ([\000-\s]|;[^\n]*)
Rules.
%% Bracketed Comments using #| foo |#
#{D}*\|[^\|]*\|+([^#\|][^\|]*\|+)*# :
block_comment(string:substr(TokenChars, 3)).
%% Separators
' : {token,{'\'',TokenLine}}.
` : {token,{'`',TokenLine}}.
, : {token,{',',TokenLine}}.
,@ : {token,{',@',TokenLine}}.
\. : {token,{'.',TokenLine}}.
[][()}{] : {token,{list_to_atom(TokenChars),TokenLine}}.
#{D}*[bB]\( : {token,{'#B(',TokenLine}}.
#{D}*[mM]\( : {token,{'#M(',TokenLine}}.
#{D}*\( : {token,{'#(',TokenLine}}.
#{D}*\. : {token,{'#.',TokenLine}}.
#{D}*` : {token,{'#`',TokenLine}}.
#{D}*; : {token,{'#;',TokenLine}}.
#{D}*, : {token,{'#,',TokenLine}}.
#{D}*,@ : {token,{'#,@',TokenLine}}.
%% Characters
#{D}*\\(x{H}+|.) : char_token(skip_past(TokenChars, $\\, $\\), TokenLine).
%% Based numbers
#{D}*\*{SYM}+ : base_token(skip_past(TokenChars, $*, $*), 2, TokenLine).
#{D}*[bB]{SYM}+ : base_token(skip_past(TokenChars, $b, $B), 2, TokenLine).
#{D}*[oO]{SYM}+ : base_token(skip_past(TokenChars, $o, $O), 8, TokenLine).
#{D}*[dD]{SYM}+ : base_token(skip_past(TokenChars, $d, $D), 10, TokenLine).
#{D}*[xX]{SYM}+ : base_token(skip_past(TokenChars, $x, $X), 16, TokenLine).
#{D}*[rR]{SYM}+ :
%% Scan over digit chars to get base.
{Base,[_|Ds]} = base1(tl(TokenChars), 10, 0),
base_token(Ds, Base, TokenLine).
%% String
"(\\x{H}+;|\\.|[^"\\])*" :
%% Strip quotes.
S = string:substr(TokenChars, 2, TokenLen - 2),
{token,{string,TokenLine,chars(S)}}.
%% Binary string
#"(\\x{H}+;|\\.|[^"\\])*" :
%% Strip quotes.
S = string:substr(TokenChars, 3, TokenLen - 3),
Bin = unicode:characters_to_binary(chars(S), utf8, utf8),
{token,{binary,TokenLine,Bin}}.
%% Symbols
\|(\\x{H}+;|\\.|[^|\\])*\| :
%% Strip quotes.
S = string:substr(TokenChars, 2, TokenLen - 2),
symbol_token(chars(S), TokenLine).
%% Funs
#'{SSYM}{SYM}*/{D}+ :
%% Strip sharpsign single-quote.
FunStr = string:substr(TokenChars,3),
{token,{'#\'',TokenLine,FunStr}}.
%% Atoms
[+-]?{D}+ :
case catch {ok,list_to_integer(TokenChars)} of
{ok,I} -> {token,{number,TokenLine,I}};
_ -> {error,"illegal integer"}
end.
[+-]?{D}+\.{D}+([eE][+-]?{D}+)? :
case catch {ok,list_to_float(TokenChars)} of
{ok,F} -> {token,{number,TokenLine,F}};
_ -> {error,"illegal float"}
end.
{SSYM}{SYM}* :
symbol_token(TokenChars, TokenLine).
{WS}+ : skip_token.
Erlang code.
%% Copyright (c) 2008-2013 Robert Virding
%%
%% 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.
%% File : lfe_scan.erl
%% Author : Robert Virding
%% Purpose : Token definitions for Lisp Flavoured Erlang.
-export([start_symbol_char/1,symbol_char/1]).
-import(string, [substr/2,substr/3]).
%% start_symbol_char(Char) -> true | false.
%% symbol_char(Char) -> true | false.
%% Define start symbol chars and symbol chars.
start_symbol_char($#) -> false;
start_symbol_char($`) -> false;
start_symbol_char($') -> false; %'
start_symbol_char($,) -> false;
start_symbol_char($|) -> false; %Symbol quote character
start_symbol_char(C) -> symbol_char(C).
symbol_char($() -> false;
symbol_char($)) -> false;
symbol_char($[) -> false;
symbol_char($]) -> false;
symbol_char(${) -> false;
symbol_char($}) -> false;
symbol_char($") -> false;
symbol_char($;) -> false;
symbol_char(C) -> ((C > $\s) and (C =< $~)) orelse (C > $\240).
%% symbol_token(Chars, Line) -> {token,{symbol,Line,Symbol}} | {error,E}.
%% Build a symbol from list of legal characters, else error.
symbol_token(Cs, L) ->
case catch {ok,list_to_atom(Cs)} of
{ok,S} -> {token,{symbol,L,S}};
_ -> {error,"illegal symbol"}
end.
%% base_token(Chars, Base, Line) -> Integer.
%% Convert a string of Base characters into a number. We only allow
%% base betqeen 2 and 36, and an optional sign character first.
base_token(_, B, _) when B < 2; B > 36 ->
{error,"illegal number base"};
base_token([$+|Cs], B, L) -> base_token(Cs, B, +1, L);
base_token([$-|Cs], B, L) -> base_token(Cs, B, -1, L);
base_token(Cs, B, L) -> base_token(Cs, B, +1, L).
base_token(Cs, B, S, L) ->
case base1(Cs, B, 0) of
{N,[]} -> {token,{number,L,S*N}};
{_,_} -> {error,"illegal based number"}
end.
base1([C|Cs], Base, SoFar) when C >= $0, C =< $9, C < Base + $0 ->
Next = SoFar * Base + (C - $0),
base1(Cs, Base, Next);
base1([C|Cs], Base, SoFar) when C >= $a, C =< $z, C < Base + $a - 10 ->
Next = SoFar * Base + (C - $a + 10),
base1(Cs, Base, Next);
base1([C|Cs], Base, SoFar) when C >= $A, C =< $Z, C < Base + $A - 10 ->
Next = SoFar * Base + (C - $A + 10),
base1(Cs, Base, Next);
base1([C|Cs], _Base, SoFar) -> {SoFar,[C|Cs]};
base1([], _Base, N) -> {N,[]}.
-define(IS_UNICODE(C), ((C >= 0) and (C =< 16#10FFFF))).
%% char_token(InputChars, Line) -> {token,{number,L,N}} | {error,E}.
%% Convert an input string into the corresponding character. For a
%% sequence of hex characters we check resultant is code is in the
%% unicode range.
char_token([$x,C|Cs], L) ->
case base1([C|Cs], 16, 0) of
{N,[]} when ?IS_UNICODE(N) -> {token,{number,L,N}};
_ -> {error,"illegal character"}
end;
char_token([C], L) -> {token,{number,L,C}}.
%% chars(InputChars) -> Chars.
%% Convert an input string into the corresponding string characters.
%% We know that the input string is correct.
chars([$\\,$x,C|Cs0]) ->
case hex_char(C) of
true ->
case base1([C|Cs0], 16, 0) of
{N,[$;|Cs1]} -> [N|chars(Cs1)];
_Other -> [escape_char($x)|chars([C|Cs0])]
end;
false -> [escape_char($x)|chars([C|Cs0])]
end;
chars([$\\,C|Cs]) -> [escape_char(C)|chars(Cs)];
chars([C|Cs]) -> [C|chars(Cs)];
chars([]) -> [].
hex_char(C) when C >= $0, C =< $9 -> true;
hex_char(C) when C >= $a, C =< $f -> true;
hex_char(C) when C >= $A, C =< $F -> true;
hex_char(_) -> false.
escape_char($b) -> $\b; %\b = BS
escape_char($t) -> $\t; %\t = TAB
escape_char($n) -> $\n; %\n = LF
escape_char($v) -> $\v; %\v = VT
escape_char($f) -> $\f; %\f = FF
escape_char($r) -> $\r; %\r = CR
escape_char($e) -> $\e; %\e = ESC
escape_char($s) -> $\s; %\s = SPC
escape_char($d) -> $\d; %\d = DEL
escape_char(C) -> C.
%% Block Comment:
%% Provide a sensible error when people attempt to include nested
%% comments because currently the parser cannot process them without
%% a rebuild. But simply exploding on a '#|' is not going to be that
%% helpful.
block_comment(TokenChars) ->
%% Check we're not opening another comment block.
case string:str(TokenChars, "#|") of
0 -> skip_token; %% No nesting found
_ -> {error, "illegal nested block comment"}
end.
%% skip_until(String, Char1, Char2) -> String.
%% skip_past(String, Char1, Char2) -> String.
%% skip_until([C|_]=Cs, C1, C2) when C =:= C1 ; C =:= C2 -> Cs;
%% skip_until([_|Cs], C1, C2) -> skip_until(Cs, C1, C2);
%% skip_until([], _, _) -> [].
skip_past([C|Cs], C1, C2) when C =:= C1 ; C =:= C2 -> Cs;
skip_past([_|Cs], C1, C2) -> skip_past(Cs, C1, C2);
skip_past([], _, _) -> [].

View File

@@ -0,0 +1,54 @@
typedef engine isEngineMessage;
typedef turn isTurnMessage;
typedef connect isConnectMessage;
typedef disconnect isDisconnectMessage;
ClientMessage(char* data) => ();
ParseMessage(char* data) => (int type, int client, char* data);
ReadMessage(int type, int client, char* data) => ();
ParseEngine(int type, int client, char* data) => (int client, int direction);
DoEngine(int client, int direction) => ();
ParseTurn(int type, int client, char* data) => (int client, int direction);
DoTurn(int client, int direction) => ();
ParseConnect(int type, int client, char* data)
=> (int client, char* host, int port);
DoConnect(int client, char* host, int port) => ();
ParseDisconnect(int type, int client, char* data) => (int client);
DoDisconnect(int client) => ();
UpdateBoard(ClientList clients) => (ClientList clients);
SendData(ClientList clients) => ();
DoUpdate(ClientList clients) => ();
DataTimer() => (ClientList clients);
GetClients() => (ClientList clients);
Wait(ClientList clients) => (ClientList clients);
Listen () => (char* data);
source Listen => ClientMessage;
source DataTimer => DoUpdate;
DataTimer = GetClients -> Wait;
DoUpdate = UpdateBoard -> SendData;
ClientMessage=ParseMessage -> ReadMessage;
ReadMessage:[engine, _, _] = ParseEngine -> DoEngine;
ReadMessage:[turn, _, _] = ParseTurn -> DoTurn;
ReadMessage:[connect, _, _] = ParseConnect -> DoConnect;
ReadMessage:[disconnect, _, _] = ParseDisconnect -> DoDisconnect;
atomic GetClients:{client_lock};
atomic DoConnect:{client_lock};
atomic DoDisconnect:{client_lock};

View File

@@ -0,0 +1,44 @@
typedef xml TestXML;
typedef html TestHTML;
typedef inCache TestInCache;
Page (int socket) => ();
ReadRequest (int socket) => (int socket, bool close, image_tag *request);
CheckCache (int socket, bool close, image_tag *request)
=> (int socket, bool close, image_tag *request);
Handler (int socket, bool close, image_tag *request)
=> (int socket, bool close, image_tag *request);
Complete (int socket, bool close, image_tag *request) => ();
ReadInFromDisk (int socket, bool close, image_tag *request)
=> (int socket, bool close, image_tag *request, __u8 *rgb_data);
Write (int socket, bool close, image_tag *request)
=> (int socket, bool close, image_tag *request);
Compress(int socket, bool close, image_tag *request, __u8 *rgb_data)
=> (int socket, bool close, image_tag *request);
StoreInCache(int socket, bool close, image_tag *request)
=> (int socket, bool close, image_tag *request);
Listen ()
=> (int socket);
source Listen => Page;
Handler:[_, _, inCache]=;
Handler:[_, _, _]=ReadInFromDisk -> Compress -> StoreInCache;
Page = ReadRequest -> CheckCache-> Handler -> Write -> Complete;
atomic CheckCache:{cache};
atomic StoreInCache:{cache};
atomic Complete:{cache};
handle error ReadInFromDisk => FourOhFor;

151
samples/FLUX/mbittorrent.fx Normal file
View File

@@ -0,0 +1,151 @@
typedef choke TestChoke;
typedef unchoke TestUnchoke;
typedef interested TestInterested;
typedef uninterested TestUninterested;
typedef request TestRequest;
typedef cancel TestCancel;
typedef piece TestPiece;
typedef bitfield TestBitfield;
typedef have TestHave;
typedef piececomplete TestPieceComplete;
CheckinWithTracker (torrent_data_t *tdata)
=> ();
SendRequestToTracker (torrent_data_t *tdata)
=> (torrent_data_t *tdata, int socket);
GetTrackerResponse (torrent_data_t *tdata, int socket)
=> ();
UpdateChokeList (torrent_data_t *tdata)
=> ();
PickChoked (torrent_data_t *tdata)
=> (torrent_data_t *tdata, chokelist_t clist);
SendChokeUnchoke (torrent_data_t *tdata, chokelist_t clist)
=> ();
SetupConnection (torrent_data_t *tdata, int socket)
=> ();
Handshake (torrent_data_t *tdata, int socket)
=> (torrent_data_t *tdata, client_data_t *client);
SendBitfield (torrent_data_t *tdata, client_data_t *client)
=> ();
Message (torrent_data_t *tdata, client_data_t *client)
=> ();
ReadMessage (torrent_data_t *tdata, client_data_t *client)
=> (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload);
HandleMessage (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)
=> (client_data_t *client);
MessageDone (client_data_t *client)
=> ();
CompletePiece (torrent_data_t *tdata, client_data_t *client, int piece)
=> (torrent_data_t *tdata, client_data_t *client);
VerifyPiece (torrent_data_t *tdata, client_data_t *client, int piece)
=> (torrent_data_t *tdata, client_data_t *client, int piece);
SendHave (torrent_data_t *tdata, client_data_t *client, int piece)
=> (torrent_data_t *tdata, client_data_t *client);
SendUninterested (torrent_data_t *tdata, client_data_t *client)
=> (torrent_data_t *tdata, client_data_t *client);
Choke (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)
=> (client_data_t *client);
Cancel (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)
=> (client_data_t *client);
Interested (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)
=> (client_data_t *client);
Uninterested (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)
=> (client_data_t *client);
Bitfield (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)
=> (client_data_t *client);
Unchoke (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)
=> (torrent_data_t *tdata, client_data_t *client);
SendRequest (torrent_data_t *tdata, client_data_t *client)
=> (client_data_t *client);
Have (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)
=> (torrent_data_t *tdata, client_data_t *client);
Piece (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)
=> (torrent_data_t *tdata, client_data_t *client, int piece);
Request (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)
=> (client_data_t *client);
SendKeepAlives (torrent_data_t *tdata)
=> ();
GetClients ()
=> (int maxfd, fd_set *fds);
SelectSockets (int maxfd, fd_set *fds)
=> (fd_set *fds);
CheckSockets (fd_set *fds)
=> (torrent_data_t *tdata, client_data_t *client);
TrackerTimer ()
=> (torrent_data_t *tdata);
ChokeTimer ()
=> (torrent_data_t *tdata);
Connect ()
=> (torrent_data_t *tdata, int socket);
KeepAliveTimer ()
=> (torrent_data_t *tdata);
Listen ()
=> (torrent_data_t *tdata, client_data_t *client);
source TrackerTimer => CheckinWithTracker;
source ChokeTimer => UpdateChokeList;
source Connect => SetupConnection;
source Listen => Message;
source KeepAliveTimer => SendKeepAlives;
Listen = GetClients -> SelectSockets -> CheckSockets;
CheckinWithTracker = SendRequestToTracker -> GetTrackerResponse;
UpdateChokeList = PickChoked -> SendChokeUnchoke;
SetupConnection = Handshake -> SendBitfield;
Message = ReadMessage -> HandleMessage -> MessageDone;
CompletePiece:[_, _, piececomplete] = VerifyPiece -> SendHave -> SendUninterested;
HandleMessage:[_, _, choke, _, _] = Choke;
HandleMessage:[_, _, unchoke, _, _] = Unchoke -> SendRequest;
HandleMessage:[_, _, interested, _, _] = Interested;
HandleMessage:[_, _, uninterested, _, _] = Uninterested;
HandleMessage:[_, _, request, _, _] = Request;
HandleMessage:[_, _, cancel, _, _] = Cancel;
HandleMessage:[_, _, piece, _, _] = Piece -> CompletePiece -> SendRequest;
HandleMessage:[_, _, bitfield, _, _] = Bitfield;
HandleMessage:[_, _, have, _, _] = Have -> SendRequest;
atomic GetClients:{BigLock};
atomic CheckSockets:{BigLock};
atomic Message:{BigLock};
atomic CheckinWithTracker:{BigLock};
atomic UpdateChokeList:{BigLock};
atomic SetupConnection:{BigLock};
atomic SendKeepAlives:{BigLock};

38
samples/FLUX/test.fx Normal file
View File

@@ -0,0 +1,38 @@
// concrete node signatures
Listen ()
=> (int socket);
ReadRequest (int socket)
=> (int socket, bool close, image_tag *request);
CheckCache (int socket, bool close, image_tag *request)
=> (int socket, bool close, image_tag *request);
// omitted for space:
// ReadInFromDisk, StoreInCache
Compress (int socket, bool close, image_tag *request, __u8 *rgb_data)
=> (int socket, bool close, image_tag *request);
Write (int socket, bool close, image_tag *request)
=> (int socket, bool close, image_tag *request);
Complete (int socket, bool close, image_tag *request) => ();
// source node
source Listen => Image;
// abstract node
Image = ReadRequest -> CheckCache -> Handler -> Write -> Complete;
// predicate type & dispatch
typedef hit TestInCache;
Handler:[_, _, hit] = ;
Handler:[_, _, _] =
ReadInFromDisk -> Compress -> StoreInCache;
// error handler
handle error ReadInFromDisk => FourOhFor;
// atomicity constraints
atomic CheckCache:{cache};
atomic StoreInCache:{cache};
atomic Complete:{cache};

46
samples/Groovy/filenames/Jenkinsfile vendored Normal file
View File

@@ -0,0 +1,46 @@
jettyUrl = 'http://localhost:8081/'
def servers
stage 'Dev'
node {
checkout scm
servers = load 'servers.groovy'
mvn '-o clean package'
dir('target') {stash name: 'war', includes: 'x.war'}
}
stage 'QA'
parallel(longerTests: {
runTests(servers, 30)
}, quickerTests: {
runTests(servers, 20)
})
stage name: 'Staging', concurrency: 1
node {
servers.deploy 'staging'
}
input message: "Does ${jettyUrl}staging/ look good?"
stage name: 'Production', concurrency: 1
node {
sh "wget -O - -S ${jettyUrl}staging/"
echo 'Production server looks to be alive'
servers.deploy 'production'
echo "Deployed to ${jettyUrl}production/"
}
def mvn(args) {
sh "${tool 'Maven 3.x'}/bin/mvn ${args}"
}
def runTests(servers, duration) {
node {
checkout scm
servers.runWithServer {id ->
mvn "-o -f sometests test -Durl=${jettyUrl}${id}/ -Dduration=${duration}"
}
}
}

View File

@@ -0,0 +1,27 @@
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// To compile these two shaders:
// fxc /E pixelMain /T ps_2_0 accelerated_surface_win.hlsl
// fxc /E vertexMain /T vs_2_0 accelerated_surface_win.hlsl
//
// fxc is in the DirectX SDK.
struct Vertex {
float4 position : POSITION;
float2 texCoord : TEXCOORD0;
};
texture t;
sampler s;
// Passes a position and texture coordinate to the pixel shader.
Vertex vertexMain(Vertex input) {
return input;
};
// Samples a texture at the given texture coordinate and returns the result.
float4 pixelMain(float2 texCoord : TEXCOORD0) : COLOR0 {
return tex2D(s, texCoord);
};

105
samples/HLSL/corridor.fx Normal file
View File

@@ -0,0 +1,105 @@
float4x4 matWorldView : WORLDVIEW;
float4x4 matWorldViewProjection : WORLDVIEWPROJECTION;
struct VS_INPUT {
float4 Position : POSITION0;
float3 Normal : NORMAL;
float3 Tangent : TANGENT;
float3 Binormal : BINORMAL;
float2 TexCoord0 : TEXCOORD0;
float2 TexCoord1 : TEXCOORD1;
};
struct VS_OUTPUT {
float4 Position : POSITION0;
float2 TexCoord0 : TEXCOORD0;
float2 TexCoord1 : TEXCOORD1;
float3x3 TangentToView : TEXCOORD2;
};
VS_OUTPUT vs_main(VS_INPUT input)
{
VS_OUTPUT output;
output.Position = mul(input.Position, matWorldViewProjection);
output.TexCoord0 = input.TexCoord0 * 5;
output.TexCoord1 = input.TexCoord1;
output.TangentToView[0] = mul(float4(input.Tangent, 0), matWorldView).xyz;
output.TangentToView[1] = mul(float4(input.Binormal, 0), matWorldView).xyz;
output.TangentToView[2] = mul(float4(input.Normal, 0), matWorldView).xyz;
return output;
}
struct PS_OUTPUT {
float4 gbuffer0 : COLOR0;
float4 gbuffer1 : COLOR1;
};
texture albedo_tex;
sampler albedo_samp = sampler_state {
Texture = (albedo_tex);
MipFilter = Linear;
MinFilter = Linear;
MagFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
sRGBTexture = True;
};
texture normal_tex;
sampler normal_samp = sampler_state {
Texture = (normal_tex);
MipFilter = Linear;
MinFilter = Linear;
MagFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
sRGBTexture = False;
};
texture specular_tex;
sampler specular_samp = sampler_state {
Texture = (specular_tex);
MipFilter = Linear;
MinFilter = Linear;
MagFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
sRGBTexture = True;
};
texture ao_tex;
sampler ao_samp = sampler_state {
Texture = (ao_tex);
MipFilter = Linear;
MinFilter = Linear;
MagFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
sRGBTexture = True;
};
PS_OUTPUT ps_main(VS_OUTPUT Input)
{
PS_OUTPUT o;
float3 tangentNormal = normalize(tex2D(normal_samp, Input.TexCoord0).xyz * 2 - 1);
float3 eyeNormal = normalize(mul(tangentNormal, Input.TangentToView));
float3 albedo = tex2D(albedo_samp, Input.TexCoord0).rgb;
float ao = tex2D(ao_samp, Input.TexCoord1).r * 0.75;
float spec = tex2D(specular_samp, Input.TexCoord0).r;
o.gbuffer0 = float4(eyeNormal, spec * ao);
o.gbuffer1 = float4(albedo, 1 - ao);
return o;
}
technique mesh {
pass Geometry {
VertexShader = compile vs_3_0 vs_main();
PixelShader = compile ps_3_0 ps_main();
AlphaBlendEnable = False;
ZWriteEnable = True;
}
}

119
samples/HLSL/jellyfish.fx Normal file
View File

@@ -0,0 +1,119 @@
float4x4 matWorldViewProjection : WORLDVIEWPROJECTION;
float4x4 matWorldView : WORLDVIEW;
float4x4 matWorld : WORLD;
float4x4 matView : VIEW;
uniform float4 vViewPosition;
struct VS_INPUT
{
float3 Pos: POSITION;
float3 Normal: NORMAL;
float3 Tangent: TANGENT;
float3 Binormal: BINORMAL;
};
struct VS_OUTPUT
{
float4 Pos : POSITION;
float3 reflection : TEXCOORD1;
float3 refraction : TEXCOORD2;
float fresnel : TEXCOORD3;
};
uniform float3 amt;
uniform float3 scale;
uniform float3 phase;
float3 deform(float3 p)
{
float s = 3;
float3 p2 = p * scale + phase;
s += sin(p2.x) * amt.x;
s += sin(p2.y) * amt.y;
s += sin(p2.z) * amt.z;
return p * s / 3;
}
VS_OUTPUT vs_main( VS_INPUT In )
{
VS_OUTPUT Out;
float3 pos = In.Pos;
float3 norm = In.Normal;
float3 p1 = pos + In.Tangent * 0.05;
float3 p2 = pos + In.Binormal * 0.05;
pos = deform(pos);
p1 = deform(p1);
p2 = deform(p2);
p1 -= pos;
p2 -= pos;
norm = normalize(cross(p1, p2));
float3 view = normalize(pos - vViewPosition.xyz);
Out.Pos = mul(float4(pos, 1.0), matWorldViewProjection);
Out.reflection = reflect(view, norm);
Out.refraction = reflect(view, norm * 0.4f); /* fake, but who cares? */
Out.fresnel = dot(view, norm);
norm = mul(float4(norm, 0.0), matWorldViewProjection);
return Out;
}
#define PS_INPUT VS_OUTPUT
#if 0
textureCUBE reflectionMap;
samplerCUBE reflectionMapSampler = sampler_state
{
Texture = (reflectionMap);
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
};
#else
// textures
texture reflectionMap
<
string type = "CUBE";
string name = "test_cube.dds";
>;
samplerCUBE reflectionMapSampler = sampler_state
{
Texture = (reflectionMap);
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
};
#endif
struct PS_OUTPUT
{
float4 color : COLOR0;
};
PS_OUTPUT ps_main( PS_INPUT In )
{
PS_OUTPUT Out;
float4 reflection = texCUBE(reflectionMapSampler, normalize(In.reflection)) * 1.5;
float4 refraction = texCUBE(reflectionMapSampler, normalize(In.refraction));
float fresnel = In.fresnel;
// float fresnel = abs(normalize(In.normal).z);
Out.color = lerp(reflection, refraction, fresnel) * pow(1.0 - fresnel * 0.75, 1.0);
return Out;
}
technique blur_ps_vs_2_0
{
pass P0
{
VertexShader = compile vs_2_0 vs_main();
PixelShader = compile ps_2_0 ps_main();
}
}

41
samples/HLSL/noise.fx Normal file
View File

@@ -0,0 +1,41 @@
float alpha = 1.f;
texture tex;
sampler tex_sampler = sampler_state
{
Texture = (tex);
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
AddressU = WRAP;
AddressV = WRAP;
};
struct VS_OUTPUT
{
float4 pos : POSITION;
float2 tex : TEXCOORD1;
};
VS_OUTPUT vertex(float4 ipos : POSITION, float2 tex : TEXCOORD0)
{
VS_OUTPUT Out;
Out.pos = ipos;
Out.tex = tex * 2;
return Out;
}
float4 pixel(VS_OUTPUT In) : COLOR
{
return tex2D(tex_sampler, In.tex) * alpha;
}
technique blur_ps_vs_2_0
{
pass P0
{
VertexShader = compile vs_2_0 vertex();
PixelShader = compile ps_2_0 pixel();
}
}

View File

@@ -1,6 +1,74 @@
Version 1 of Trivial Extension by Andrew Plotkin begins here.
Version 2 of Trivial Extension by Andrew Plotkin begins here.
"This is the rubric of the extension."
"provided for the Linguist package by Andrew Plotkin"
[Note the two special quoted lines above.]
A cow is a kind of animal. A cow can be purple.
Understand "cow" as a cow.
Understand "purple" as a purple cow.
Check pushing a cow:
instead say "Cow-tipping, at your age?[paragraph break]Inconceivable."
[Here are the possible levels of heading:]
Volume One
Text-line is always "A line of text."
Book 2
Part the third - indented headings still count
Chapter IV - not for release
[Heading labels are case-insensitive.]
section foobar
[A line beginning "Volume" that does not have blank lines before and after it is *not* a header line. So the following should all be part of section foobar. Sadly, the "Volume is..." line gets colored as a header, because Atom's regexp model can't recognize "thing with blank lines before and after"!]
Measure is a kind of value.
Volume is a measure. Length is a measure.
Area is a measure.
[And now some Inform 6 inclusions.]
To say em -- running on:
(- style underline; -).
To say /em -- running on:
(- style roman; -).
Include (-
! Inform 6 comments start with a ! mark and run to the end of the line.
Global cowcount;
[ inform6func arg;
print "Here is some text; ", (address) 'dictword', ".^";
cowcount++; ! increment this variable
];
Object i6cow
with name 'cow' 'animal',
with description "It looks like a cow.",
has animate scenery;
-) after "Global Variables" in "Output.i6t".
Trivial Extension ends here.
---- DOCUMENTATION ----
Everything after the "---- DOCUMENTATION ----" line is documentation, so it should have the comment style.
However, tab-indented lines are sample Inform code within the documentation:
Horns are a kind of thing. Every cow has horns.
say "Moo[if the noun is purple] indigo[end if]."
So we need to allow for that.

View File

@@ -2,11 +2,61 @@
Include Trivial Extension by Andrew Plotkin.
Volume 1 - overview
Chapter - setting the scene
The Kitchen is a room.
[This kitchen is modelled after the one in Zork, although it lacks the detail to establish this to the player.]
[Comment: this kitchen is modelled after the one in Zork, although it lacks the detail to establish this to the player.]
Section - the kitchen table
The spicerack is a container in the Kitchen.
Table of Spices
Name Flavor
"cinnamon" 5
"nutmeg" 4
"szechuan pepper" 8
The description of the spicerack is "It's mostly empty."
Chapter - a character
A purple cow called Gelett is in the Kitchen.
[This comment spans multiple lines..
...and this line contains [nested square[] brackets]...
...which is legal in Inform 7.]
Instead of examining Gelett:
say "You'd rather see than be one."
Instead of examining Gelett:
say "You'd rather see than be one."
Check smelling Gelett:
say "This text contains several lines.
A blank line is displayed as a paragraph break,
but a simple line break is not.";
stop the action.
Section - cow catching
Gelett has a number called the mooness.
Instead of taking Gelett:
increment the mooness of Gelett;
if the mooness of Gelett is one:
say "Gelett moos once.";
else:
say "Gelett moos [mooness of Gelett in words] times.";
Volume 2 - the turn cycle
Every turn:
say "A turn passes[one of][or] placidly[or] idly[or] tediously[at random]."

View File

@@ -0,0 +1,625 @@
// This is a generated file. Not intended for manual editing.
package org.intellij.grammar.parser;
import com.intellij.lang.PsiBuilder;
import com.intellij.lang.PsiBuilder.Marker;
import static org.intellij.grammar.psi.BnfTypes.*;
import static org.intellij.grammar.parser.GeneratedParserUtilBase.*;
import com.intellij.psi.tree.IElementType;
import com.intellij.lang.ASTNode;
import com.intellij.psi.tree.TokenSet;
import com.intellij.lang.PsiParser;
import com.intellij.lang.LightPsiParser;
@SuppressWarnings({"SimplifiableIfStatement", "UnusedAssignment"})
public class GrammarParser implements PsiParser, LightPsiParser {
public ASTNode parse(IElementType t, PsiBuilder b) {
parseLight(t, b);
return b.getTreeBuilt();
}
public void parseLight(IElementType t, PsiBuilder b) {
boolean r;
b = adapt_builder_(t, b, this, EXTENDS_SETS_);
Marker m = enter_section_(b, 0, _COLLAPSE_, null);
if (t == BNF_ATTR) {
r = attr(b, 0);
}
else if (t == BNF_ATTR_PATTERN) {
r = attr_pattern(b, 0);
}
else if (t == BNF_ATTR_VALUE) {
r = attr_value(b, 0);
}
else if (t == BNF_ATTRS) {
r = attrs(b, 0);
}
else if (t == BNF_CHOICE) {
r = choice(b, 0);
}
else if (t == BNF_EXPRESSION) {
r = expression(b, 0);
}
else if (t == BNF_LITERAL_EXPRESSION) {
r = literal_expression(b, 0);
}
else if (t == BNF_MODIFIER) {
r = modifier(b, 0);
}
else if (t == BNF_PAREN_EXPRESSION) {
r = paren_expression(b, 0);
}
else if (t == BNF_PREDICATE) {
r = predicate(b, 0);
}
else if (t == BNF_PREDICATE_SIGN) {
r = predicate_sign(b, 0);
}
else if (t == BNF_QUANTIFIED) {
r = quantified(b, 0);
}
else if (t == BNF_QUANTIFIER) {
r = quantifier(b, 0);
}
else if (t == BNF_REFERENCE_OR_TOKEN) {
r = reference_or_token(b, 0);
}
else if (t == BNF_RULE) {
r = rule(b, 0);
}
else if (t == BNF_SEQUENCE) {
r = sequence(b, 0);
}
else if (t == BNF_STRING_LITERAL_EXPRESSION) {
r = string_literal_expression(b, 0);
}
else {
r = parse_root_(t, b, 0);
}
exit_section_(b, 0, m, t, r, true, TRUE_CONDITION);
}
protected boolean parse_root_(IElementType t, PsiBuilder b, int l) {
return grammar(b, l + 1);
}
public static final TokenSet[] EXTENDS_SETS_ = new TokenSet[] {
create_token_set_(BNF_LITERAL_EXPRESSION, BNF_STRING_LITERAL_EXPRESSION),
create_token_set_(BNF_CHOICE, BNF_EXPRESSION, BNF_LITERAL_EXPRESSION, BNF_PAREN_EXPRESSION,
BNF_PREDICATE, BNF_QUANTIFIED, BNF_REFERENCE_OR_TOKEN, BNF_SEQUENCE,
BNF_STRING_LITERAL_EXPRESSION),
};
/* ********************************************************** */
// id attr_pattern? '=' attr_value ';'?
public static boolean attr(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "attr")) return false;
boolean r, p;
Marker m = enter_section_(b, l, _NONE_, "<attr>");
r = consumeToken(b, BNF_ID);
p = r; // pin = 1
r = r && report_error_(b, attr_1(b, l + 1));
r = p && report_error_(b, consumeToken(b, BNF_OP_EQ)) && r;
r = p && report_error_(b, attr_value(b, l + 1)) && r;
r = p && attr_4(b, l + 1) && r;
exit_section_(b, l, m, BNF_ATTR, r, p, attr_recover_until_parser_);
return r || p;
}
// attr_pattern?
private static boolean attr_1(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "attr_1")) return false;
attr_pattern(b, l + 1);
return true;
}
// ';'?
private static boolean attr_4(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "attr_4")) return false;
consumeToken(b, BNF_SEMICOLON);
return true;
}
/* ********************************************************** */
// '(' string ')'
public static boolean attr_pattern(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "attr_pattern")) return false;
if (!nextTokenIs(b, BNF_LEFT_PAREN)) return false;
boolean r;
Marker m = enter_section_(b);
r = consumeToken(b, BNF_LEFT_PAREN);
r = r && consumeToken(b, BNF_STRING);
r = r && consumeToken(b, BNF_RIGHT_PAREN);
exit_section_(b, m, BNF_ATTR_PATTERN, r);
return r;
}
/* ********************************************************** */
// !'}'
static boolean attr_recover_until(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "attr_recover_until")) return false;
boolean r;
Marker m = enter_section_(b, l, _NOT_, null);
r = !consumeToken(b, BNF_RIGHT_BRACE);
exit_section_(b, l, m, null, r, false, null);
return r;
}
/* ********************************************************** */
// (reference_or_token | literal_expression) !'='
public static boolean attr_value(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "attr_value")) return false;
boolean r;
Marker m = enter_section_(b, l, _NONE_, "<attr value>");
r = attr_value_0(b, l + 1);
r = r && attr_value_1(b, l + 1);
exit_section_(b, l, m, BNF_ATTR_VALUE, r, false, null);
return r;
}
// reference_or_token | literal_expression
private static boolean attr_value_0(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "attr_value_0")) return false;
boolean r;
Marker m = enter_section_(b);
r = reference_or_token(b, l + 1);
if (!r) r = literal_expression(b, l + 1);
exit_section_(b, m, null, r);
return r;
}
// !'='
private static boolean attr_value_1(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "attr_value_1")) return false;
boolean r;
Marker m = enter_section_(b, l, _NOT_, null);
r = !consumeToken(b, BNF_OP_EQ);
exit_section_(b, l, m, null, r, false, null);
return r;
}
/* ********************************************************** */
// '{' attr* '}'
public static boolean attrs(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "attrs")) return false;
if (!nextTokenIs(b, BNF_LEFT_BRACE)) return false;
boolean r, p;
Marker m = enter_section_(b, l, _NONE_, null);
r = consumeToken(b, BNF_LEFT_BRACE);
p = r; // pin = 1
r = r && report_error_(b, attrs_1(b, l + 1));
r = p && consumeToken(b, BNF_RIGHT_BRACE) && r;
exit_section_(b, l, m, BNF_ATTRS, r, p, null);
return r || p;
}
// attr*
private static boolean attrs_1(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "attrs_1")) return false;
int c = current_position_(b);
while (true) {
if (!attr(b, l + 1)) break;
if (!empty_element_parsed_guard_(b, "attrs_1", c)) break;
c = current_position_(b);
}
return true;
}
/* ********************************************************** */
// '{' sequence ('|' sequence)* '}' | sequence choice_tail*
public static boolean choice(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "choice")) return false;
boolean r;
Marker m = enter_section_(b, l, _COLLAPSE_, "<choice>");
r = choice_0(b, l + 1);
if (!r) r = choice_1(b, l + 1);
exit_section_(b, l, m, BNF_CHOICE, r, false, null);
return r;
}
// '{' sequence ('|' sequence)* '}'
private static boolean choice_0(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "choice_0")) return false;
boolean r;
Marker m = enter_section_(b);
r = consumeToken(b, BNF_LEFT_BRACE);
r = r && sequence(b, l + 1);
r = r && choice_0_2(b, l + 1);
r = r && consumeToken(b, BNF_RIGHT_BRACE);
exit_section_(b, m, null, r);
return r;
}
// ('|' sequence)*
private static boolean choice_0_2(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "choice_0_2")) return false;
int c = current_position_(b);
while (true) {
if (!choice_0_2_0(b, l + 1)) break;
if (!empty_element_parsed_guard_(b, "choice_0_2", c)) break;
c = current_position_(b);
}
return true;
}
// '|' sequence
private static boolean choice_0_2_0(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "choice_0_2_0")) return false;
boolean r;
Marker m = enter_section_(b);
r = consumeToken(b, BNF_OP_OR);
r = r && sequence(b, l + 1);
exit_section_(b, m, null, r);
return r;
}
// sequence choice_tail*
private static boolean choice_1(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "choice_1")) return false;
boolean r;
Marker m = enter_section_(b);
r = sequence(b, l + 1);
r = r && choice_1_1(b, l + 1);
exit_section_(b, m, null, r);
return r;
}
// choice_tail*
private static boolean choice_1_1(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "choice_1_1")) return false;
int c = current_position_(b);
while (true) {
if (!choice_tail(b, l + 1)) break;
if (!empty_element_parsed_guard_(b, "choice_1_1", c)) break;
c = current_position_(b);
}
return true;
}
/* ********************************************************** */
// '|' sequence
static boolean choice_tail(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "choice_tail")) return false;
if (!nextTokenIs(b, BNF_OP_OR)) return false;
boolean r, p;
Marker m = enter_section_(b, l, _NONE_, null);
r = consumeToken(b, BNF_OP_OR);
p = r; // pin = 1
r = r && sequence(b, l + 1);
exit_section_(b, l, m, null, r, p, null);
return r || p;
}
/* ********************************************************** */
// choice?
public static boolean expression(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "expression")) return false;
Marker m = enter_section_(b, l, _COLLAPSE_, "<expression>");
choice(b, l + 1);
exit_section_(b, l, m, BNF_EXPRESSION, true, false, null);
return true;
}
/* ********************************************************** */
// (attrs | rule) *
static boolean grammar(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "grammar")) return false;
int c = current_position_(b);
while (true) {
if (!grammar_0(b, l + 1)) break;
if (!empty_element_parsed_guard_(b, "grammar", c)) break;
c = current_position_(b);
}
return true;
}
// attrs | rule
private static boolean grammar_0(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "grammar_0")) return false;
boolean r;
Marker m = enter_section_(b);
r = attrs(b, l + 1);
if (!r) r = rule(b, l + 1);
exit_section_(b, m, null, r);
return r;
}
/* ********************************************************** */
// string_literal_expression | number
public static boolean literal_expression(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "literal_expression")) return false;
if (!nextTokenIs(b, "<literal expression>", BNF_NUMBER, BNF_STRING)) return false;
boolean r;
Marker m = enter_section_(b, l, _COLLAPSE_, "<literal expression>");
r = string_literal_expression(b, l + 1);
if (!r) r = consumeToken(b, BNF_NUMBER);
exit_section_(b, l, m, BNF_LITERAL_EXPRESSION, r, false, null);
return r;
}
/* ********************************************************** */
// 'private' | 'external' | 'wrapped'
public static boolean modifier(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "modifier")) return false;
boolean r;
Marker m = enter_section_(b, l, _NONE_, "<modifier>");
r = consumeToken(b, "private");
if (!r) r = consumeToken(b, "external");
if (!r) r = consumeToken(b, "wrapped");
exit_section_(b, l, m, BNF_MODIFIER, r, false, null);
return r;
}
/* ********************************************************** */
// quantified | predicate
static boolean option(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "option")) return false;
boolean r;
Marker m = enter_section_(b);
r = quantified(b, l + 1);
if (!r) r = predicate(b, l + 1);
exit_section_(b, m, null, r);
return r;
}
/* ********************************************************** */
// '(' expression ')'
public static boolean paren_expression(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "paren_expression")) return false;
if (!nextTokenIs(b, BNF_LEFT_PAREN)) return false;
boolean r, p;
Marker m = enter_section_(b, l, _NONE_, null);
r = consumeToken(b, BNF_LEFT_PAREN);
p = r; // pin = 1
r = r && report_error_(b, expression(b, l + 1));
r = p && consumeToken(b, BNF_RIGHT_PAREN) && r;
exit_section_(b, l, m, BNF_PAREN_EXPRESSION, r, p, null);
return r || p;
}
/* ********************************************************** */
// predicate_sign simple
public static boolean predicate(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "predicate")) return false;
if (!nextTokenIs(b, "<predicate>", BNF_OP_NOT, BNF_OP_AND)) return false;
boolean r;
Marker m = enter_section_(b, l, _NONE_, "<predicate>");
r = predicate_sign(b, l + 1);
r = r && simple(b, l + 1);
exit_section_(b, l, m, BNF_PREDICATE, r, false, null);
return r;
}
/* ********************************************************** */
// '&' | '!'
public static boolean predicate_sign(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "predicate_sign")) return false;
if (!nextTokenIs(b, "<predicate sign>", BNF_OP_NOT, BNF_OP_AND)) return false;
boolean r;
Marker m = enter_section_(b, l, _NONE_, "<predicate sign>");
r = consumeToken(b, BNF_OP_AND);
if (!r) r = consumeToken(b, BNF_OP_NOT);
exit_section_(b, l, m, BNF_PREDICATE_SIGN, r, false, null);
return r;
}
/* ********************************************************** */
// '[' expression ']' | simple quantifier?
public static boolean quantified(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "quantified")) return false;
boolean r;
Marker m = enter_section_(b, l, _COLLAPSE_, "<quantified>");
r = quantified_0(b, l + 1);
if (!r) r = quantified_1(b, l + 1);
exit_section_(b, l, m, BNF_QUANTIFIED, r, false, null);
return r;
}
// '[' expression ']'
private static boolean quantified_0(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "quantified_0")) return false;
boolean r;
Marker m = enter_section_(b);
r = consumeToken(b, BNF_LEFT_BRACKET);
r = r && expression(b, l + 1);
r = r && consumeToken(b, BNF_RIGHT_BRACKET);
exit_section_(b, m, null, r);
return r;
}
// simple quantifier?
private static boolean quantified_1(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "quantified_1")) return false;
boolean r;
Marker m = enter_section_(b);
r = simple(b, l + 1);
r = r && quantified_1_1(b, l + 1);
exit_section_(b, m, null, r);
return r;
}
// quantifier?
private static boolean quantified_1_1(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "quantified_1_1")) return false;
quantifier(b, l + 1);
return true;
}
/* ********************************************************** */
// '?' | '+' | '*'
public static boolean quantifier(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "quantifier")) return false;
boolean r;
Marker m = enter_section_(b, l, _NONE_, "<quantifier>");
r = consumeToken(b, BNF_OP_OPT);
if (!r) r = consumeToken(b, BNF_OP_ONEMORE);
if (!r) r = consumeToken(b, BNF_OP_ZEROMORE);
exit_section_(b, l, m, BNF_QUANTIFIER, r, false, null);
return r;
}
/* ********************************************************** */
// id
public static boolean reference_or_token(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "reference_or_token")) return false;
if (!nextTokenIs(b, BNF_ID)) return false;
boolean r;
Marker m = enter_section_(b);
r = consumeToken(b, BNF_ID);
exit_section_(b, m, BNF_REFERENCE_OR_TOKEN, r);
return r;
}
/* ********************************************************** */
// modifier* id '::=' expression attrs? ';'?
public static boolean rule(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "rule")) return false;
boolean r, p;
Marker m = enter_section_(b, l, _NONE_, "<rule>");
r = rule_0(b, l + 1);
r = r && consumeToken(b, BNF_ID);
r = r && consumeToken(b, BNF_OP_IS);
p = r; // pin = 3
r = r && report_error_(b, expression(b, l + 1));
r = p && report_error_(b, rule_4(b, l + 1)) && r;
r = p && rule_5(b, l + 1) && r;
exit_section_(b, l, m, BNF_RULE, r, p, rule_recover_until_parser_);
return r || p;
}
// modifier*
private static boolean rule_0(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "rule_0")) return false;
int c = current_position_(b);
while (true) {
if (!modifier(b, l + 1)) break;
if (!empty_element_parsed_guard_(b, "rule_0", c)) break;
c = current_position_(b);
}
return true;
}
// attrs?
private static boolean rule_4(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "rule_4")) return false;
attrs(b, l + 1);
return true;
}
// ';'?
private static boolean rule_5(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "rule_5")) return false;
consumeToken(b, BNF_SEMICOLON);
return true;
}
/* ********************************************************** */
// !'{'
static boolean rule_recover_until(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "rule_recover_until")) return false;
boolean r;
Marker m = enter_section_(b, l, _NOT_, null);
r = !consumeToken(b, BNF_LEFT_BRACE);
exit_section_(b, l, m, null, r, false, null);
return r;
}
/* ********************************************************** */
// option +
public static boolean sequence(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "sequence")) return false;
boolean r;
Marker m = enter_section_(b, l, _COLLAPSE_, "<sequence>");
r = option(b, l + 1);
int c = current_position_(b);
while (r) {
if (!option(b, l + 1)) break;
if (!empty_element_parsed_guard_(b, "sequence", c)) break;
c = current_position_(b);
}
exit_section_(b, l, m, BNF_SEQUENCE, r, false, null);
return r;
}
/* ********************************************************** */
// !(modifier* id '::=' ) reference_or_token | literal_expression | paren_expression
static boolean simple(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "simple")) return false;
boolean r;
Marker m = enter_section_(b);
r = simple_0(b, l + 1);
if (!r) r = literal_expression(b, l + 1);
if (!r) r = paren_expression(b, l + 1);
exit_section_(b, m, null, r);
return r;
}
// !(modifier* id '::=' ) reference_or_token
private static boolean simple_0(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "simple_0")) return false;
boolean r;
Marker m = enter_section_(b);
r = simple_0_0(b, l + 1);
r = r && reference_or_token(b, l + 1);
exit_section_(b, m, null, r);
return r;
}
// !(modifier* id '::=' )
private static boolean simple_0_0(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "simple_0_0")) return false;
boolean r;
Marker m = enter_section_(b, l, _NOT_, null);
r = !simple_0_0_0(b, l + 1);
exit_section_(b, l, m, null, r, false, null);
return r;
}
// modifier* id '::='
private static boolean simple_0_0_0(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "simple_0_0_0")) return false;
boolean r;
Marker m = enter_section_(b);
r = simple_0_0_0_0(b, l + 1);
r = r && consumeToken(b, BNF_ID);
r = r && consumeToken(b, BNF_OP_IS);
exit_section_(b, m, null, r);
return r;
}
// modifier*
private static boolean simple_0_0_0_0(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "simple_0_0_0_0")) return false;
int c = current_position_(b);
while (true) {
if (!modifier(b, l + 1)) break;
if (!empty_element_parsed_guard_(b, "simple_0_0_0_0", c)) break;
c = current_position_(b);
}
return true;
}
/* ********************************************************** */
// string
public static boolean string_literal_expression(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "string_literal_expression")) return false;
if (!nextTokenIs(b, BNF_STRING)) return false;
boolean r;
Marker m = enter_section_(b);
r = consumeToken(b, BNF_STRING);
exit_section_(b, m, BNF_STRING_LITERAL_EXPRESSION, r);
return r;
}
final static Parser attr_recover_until_parser_ = new Parser() {
public boolean parse(PsiBuilder b, int l) {
return attr_recover_until(b, l + 1);
}
};
final static Parser rule_recover_until_parser_ = new Parser() {
public boolean parse(PsiBuilder b, int l) {
return rule_recover_until(b, l + 1);
}
};
}

View File

@@ -0,0 +1,482 @@
/* The following code was generated by JFlex 1.4.3 on 28/01/16 11:27 */
package test;
import com.intellij.lexer.*;
import com.intellij.psi.tree.IElementType;
import static org.intellij.grammar.psi.BnfTypes.*;
/**
* This class is a scanner generated by
* <a href="http://www.jflex.de/">JFlex</a> 1.4.3
* on 28/01/16 11:27 from the specification file
* <tt>/home/abigail/code/intellij-grammar-kit-test/src/test/_GrammarLexer.flex</tt>
*/
public class _GrammarLexer implements FlexLexer {
/** initial size of the lookahead buffer */
private static final int ZZ_BUFFERSIZE = 16384;
/** lexical states */
public static final int YYINITIAL = 0;
/**
* ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l
* ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l
* at the beginning of a line
* l is of the form l = 2*k, k a non negative integer
*/
private static final int ZZ_LEXSTATE[] = {
0, 0
};
/**
* Translates characters to character classes
*/
private static final String ZZ_CMAP_PACKED =
"\11\0\1\1\1\1\1\0\1\1\1\1\22\0\1\1\101\0\1\13"+
"\1\0\1\3\1\14\1\0\1\10\1\0\1\2\3\0\1\12\1\7"+
"\3\0\1\6\1\4\1\5\1\11\uff8a\0";
/**
* Translates characters to character classes
*/
private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
/**
* Translates DFA states to action switch labels.
*/
private static final int [] ZZ_ACTION = zzUnpackAction();
private static final String ZZ_ACTION_PACKED_0 =
"\1\0\1\1\1\2\3\1\1\3\10\0\1\4\1\5";
private static int [] zzUnpackAction() {
int [] result = new int[17];
int offset = 0;
offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
return result;
}
private static int zzUnpackAction(String packed, int offset, int [] result) {
int i = 0; /* index in packed string */
int j = offset; /* index in unpacked array */
int l = packed.length();
while (i < l) {
int count = packed.charAt(i++);
int value = packed.charAt(i++);
do result[j++] = value; while (--count > 0);
}
return j;
}
/**
* Translates a state to a row index in the transition table
*/
private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
private static final String ZZ_ROWMAP_PACKED_0 =
"\0\0\0\15\0\32\0\47\0\64\0\101\0\15\0\116"+
"\0\133\0\150\0\165\0\202\0\217\0\234\0\251\0\15"+
"\0\15";
private static int [] zzUnpackRowMap() {
int [] result = new int[17];
int offset = 0;
offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
return result;
}
private static int zzUnpackRowMap(String packed, int offset, int [] result) {
int i = 0; /* index in packed string */
int j = offset; /* index in unpacked array */
int l = packed.length();
while (i < l) {
int high = packed.charAt(i++) << 16;
result[j++] = high | packed.charAt(i++);
}
return j;
}
/**
* The transition table of the DFA
*/
private static final int [] ZZ_TRANS = zzUnpackTrans();
private static final String ZZ_TRANS_PACKED_0 =
"\1\2\1\3\1\4\1\2\1\5\2\2\1\6\5\2"+
"\16\0\1\3\16\0\1\7\16\0\1\10\20\0\1\11"+
"\11\0\1\12\20\0\1\13\4\0\1\14\25\0\1\15"+
"\10\0\1\16\21\0\1\17\10\0\1\20\12\0\1\21"+
"\6\0";
private static int [] zzUnpackTrans() {
int [] result = new int[182];
int offset = 0;
offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
return result;
}
private static int zzUnpackTrans(String packed, int offset, int [] result) {
int i = 0; /* index in packed string */
int j = offset; /* index in unpacked array */
int l = packed.length();
while (i < l) {
int count = packed.charAt(i++);
int value = packed.charAt(i++);
value--;
do result[j++] = value; while (--count > 0);
}
return j;
}
/* error codes */
private static final int ZZ_UNKNOWN_ERROR = 0;
private static final int ZZ_NO_MATCH = 1;
private static final int ZZ_PUSHBACK_2BIG = 2;
private static final char[] EMPTY_BUFFER = new char[0];
private static final int YYEOF = -1;
private static java.io.Reader zzReader = null; // Fake
/* error messages for the codes above */
private static final String ZZ_ERROR_MSG[] = {
"Unkown internal scanner error",
"Error: could not match input",
"Error: pushback value was too large"
};
/**
* ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
*/
private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
private static final String ZZ_ATTRIBUTE_PACKED_0 =
"\1\0\1\11\4\1\1\11\10\0\2\11";
private static int [] zzUnpackAttribute() {
int [] result = new int[17];
int offset = 0;
offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
return result;
}
private static int zzUnpackAttribute(String packed, int offset, int [] result) {
int i = 0; /* index in packed string */
int j = offset; /* index in unpacked array */
int l = packed.length();
while (i < l) {
int count = packed.charAt(i++);
int value = packed.charAt(i++);
do result[j++] = value; while (--count > 0);
}
return j;
}
/** the current state of the DFA */
private int zzState;
/** the current lexical state */
private int zzLexicalState = YYINITIAL;
/** this buffer contains the current text to be matched and is
the source of the yytext() string */
private CharSequence zzBuffer = "";
/** this buffer may contains the current text array to be matched when it is cheap to acquire it */
private char[] zzBufferArray;
/** the textposition at the last accepting state */
private int zzMarkedPos;
/** the textposition at the last state to be included in yytext */
private int zzPushbackPos;
/** the current text position in the buffer */
private int zzCurrentPos;
/** startRead marks the beginning of the yytext() string in the buffer */
private int zzStartRead;
/** endRead marks the last character in the buffer, that has been read
from input */
private int zzEndRead;
/**
* zzAtBOL == true <=> the scanner is currently at the beginning of a line
*/
private boolean zzAtBOL = true;
/** zzAtEOF == true <=> the scanner is at the EOF */
private boolean zzAtEOF;
/* user code: */
public _GrammarLexer() {
this((java.io.Reader)null);
}
/**
* Creates a new scanner
*
* @param in the java.io.Reader to read input from.
*/
public _GrammarLexer(java.io.Reader in) {
this.zzReader = in;
}
/**
* Unpacks the compressed character translation table.
*
* @param packed the packed character translation table
* @return the unpacked character translation table
*/
private static char [] zzUnpackCMap(String packed) {
char [] map = new char[0x10000];
int i = 0; /* index in packed string */
int j = 0; /* index in unpacked array */
while (i < 52) {
int count = packed.charAt(i++);
char value = packed.charAt(i++);
do map[j++] = value; while (--count > 0);
}
return map;
}
public final int getTokenStart(){
return zzStartRead;
}
public final int getTokenEnd(){
return getTokenStart() + yylength();
}
public void reset(CharSequence buffer, int start, int end,int initialState){
zzBuffer = buffer;
zzBufferArray = com.intellij.util.text.CharArrayUtil.fromSequenceWithoutCopying(buffer);
zzCurrentPos = zzMarkedPos = zzStartRead = start;
zzPushbackPos = 0;
zzAtEOF = false;
zzAtBOL = true;
zzEndRead = end;
yybegin(initialState);
}
/**
* Refills the input buffer.
*
* @return <code>false</code>, iff there was new input.
*
* @exception java.io.IOException if any I/O-Error occurs
*/
private boolean zzRefill() throws java.io.IOException {
return true;
}
/**
* Returns the current lexical state.
*/
public final int yystate() {
return zzLexicalState;
}
/**
* Enters a new lexical state
*
* @param newState the new lexical state
*/
public final void yybegin(int newState) {
zzLexicalState = newState;
}
/**
* Returns the text matched by the current regular expression.
*/
public final CharSequence yytext() {
return zzBuffer.subSequence(zzStartRead, zzMarkedPos);
}
/**
* Returns the character at position <tt>pos</tt> from the
* matched text.
*
* It is equivalent to yytext().charAt(pos), but faster
*
* @param pos the position of the character to fetch.
* A value from 0 to yylength()-1.
*
* @return the character at position pos
*/
public final char yycharat(int pos) {
return zzBufferArray != null ? zzBufferArray[zzStartRead+pos]:zzBuffer.charAt(zzStartRead+pos);
}
/**
* Returns the length of the matched text region.
*/
public final int yylength() {
return zzMarkedPos-zzStartRead;
}
/**
* Reports an error that occured while scanning.
*
* In a wellformed scanner (no or only correct usage of
* yypushback(int) and a match-all fallback rule) this method
* will only be called with things that "Can't Possibly Happen".
* If this method is called, something is seriously wrong
* (e.g. a JFlex bug producing a faulty scanner etc.).
*
* Usual syntax/scanner level error handling should be done
* in error fallback rules.
*
* @param errorCode the code of the errormessage to display
*/
private void zzScanError(int errorCode) {
String message;
try {
message = ZZ_ERROR_MSG[errorCode];
}
catch (ArrayIndexOutOfBoundsException e) {
message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
}
throw new Error(message);
}
/**
* Pushes the specified amount of characters back into the input stream.
*
* They will be read again by then next call of the scanning method
*
* @param number the number of characters to be read again.
* This number must not be greater than yylength()!
*/
public void yypushback(int number) {
if ( number > yylength() )
zzScanError(ZZ_PUSHBACK_2BIG);
zzMarkedPos -= number;
}
/**
* Resumes scanning until the next regular expression is matched,
* the end of input is encountered or an I/O-Error occurs.
*
* @return the next token
* @exception java.io.IOException if any I/O-Error occurs
*/
public IElementType advance() throws java.io.IOException {
int zzInput;
int zzAction;
// cached fields:
int zzCurrentPosL;
int zzMarkedPosL;
int zzEndReadL = zzEndRead;
CharSequence zzBufferL = zzBuffer;
char[] zzBufferArrayL = zzBufferArray;
char [] zzCMapL = ZZ_CMAP;
int [] zzTransL = ZZ_TRANS;
int [] zzRowMapL = ZZ_ROWMAP;
int [] zzAttrL = ZZ_ATTRIBUTE;
while (true) {
zzMarkedPosL = zzMarkedPos;
zzAction = -1;
zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
zzState = ZZ_LEXSTATE[zzLexicalState];
zzForAction: {
while (true) {
if (zzCurrentPosL < zzEndReadL)
zzInput = (zzBufferArrayL != null ? zzBufferArrayL[zzCurrentPosL++] : zzBufferL.charAt(zzCurrentPosL++));
else if (zzAtEOF) {
zzInput = YYEOF;
break zzForAction;
}
else {
// store back cached positions
zzCurrentPos = zzCurrentPosL;
zzMarkedPos = zzMarkedPosL;
boolean eof = zzRefill();
// get translated positions and possibly new buffer
zzCurrentPosL = zzCurrentPos;
zzMarkedPosL = zzMarkedPos;
zzBufferL = zzBuffer;
zzEndReadL = zzEndRead;
if (eof) {
zzInput = YYEOF;
break zzForAction;
}
else {
zzInput = (zzBufferArrayL != null ? zzBufferArrayL[zzCurrentPosL++] : zzBufferL.charAt(zzCurrentPosL++));
}
}
int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
if (zzNext == -1) break zzForAction;
zzState = zzNext;
int zzAttributes = zzAttrL[zzState];
if ( (zzAttributes & 1) == 1 ) {
zzAction = zzState;
zzMarkedPosL = zzCurrentPosL;
if ( (zzAttributes & 8) == 8 ) break zzForAction;
}
}
}
// store back cached position
zzMarkedPos = zzMarkedPosL;
switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
case 1:
{ return com.intellij.psi.TokenType.BAD_CHARACTER;
}
case 6: break;
case 4:
{ return BNF_STRING;
}
case 7: break;
case 5:
{ return BNF_NUMBER;
}
case 8: break;
case 3:
{ return BNF_ID;
}
case 9: break;
case 2:
{ return com.intellij.psi.TokenType.WHITE_SPACE;
}
case 10: break;
default:
if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
zzAtEOF = true;
return null;
}
else {
zzScanError(ZZ_NO_MATCH);
}
}
}
}
}

File diff suppressed because one or more lines are too long

38
samples/M4/htmlgen.m4 Normal file
View File

@@ -0,0 +1,38 @@
dnl Took from https://en.wikipedia.org/wiki/M4_(computer_language)
divert(-1)
M4 has multiple output queues that can be manipulated with the
`divert' macro. Valid queues range from 0 to 10, inclusive, with
the default queue being 0.
Calling the `divert' macro with an invalid queue causes text to be
discarded until another call. Note that even while output is being
discarded, quotes around `divert' and other macros are needed to
prevent expansion.
# Macros aren't expanded within comments, meaning that keywords such
# as divert and other built-ins may be used without consequence.
# HTML utility macro:
define(`H2_COUNT', 0)
# The H2_COUNT macro is redefined every time the H2 macro is used:
define(`H2',
`define(`H2_COUNT', incr(H2_COUNT))<h2>H2_COUNT. $1</h2>')
divert(1)dnl
dnl
dnl The dnl macro causes m4 to discard the rest of the line, thus
dnl preventing unwanted blank lines from appearing in the output.
dnl
H2(First Section)
H2(Second Section)
H2(Conclusion)
dnl
divert(0)dnl
dnl
<HTML>
undivert(1)dnl One of the queues is being pushed to output.
</HTML>

View File

@@ -0,0 +1,172 @@
# ===========================================================================
# http://www.gnu.org/software/autoconf-archive/ax_ruby_devel.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_RUBY_DEVEL([version])
#
# DESCRIPTION
#
# This macro checks for Ruby and tries to get the include path to
# 'ruby.h'. It provides the $(RUBY_CPPFLAGS) and $(RUBY_LDFLAGS) output
# variables. It also exports $(RUBY_EXTRA_LIBS) for embedding Ruby in your
# code.
#
# You can search for some particular version of Ruby by passing a
# parameter to this macro, for example "1.8.6".
#
# LICENSE
#
# Copyright (c) 2008 Rafal Rzepecki <divided.mind@gmail.com>
# Copyright (c) 2008 Sebastian Huber <sebastian-huber@web.de>
# Copyright (c) 2008 Alan W. Irwin
# Copyright (c) 2008 Rafael Laboissiere <rafael@laboissiere.net>
# Copyright (c) 2008 Andrew Collier
# Copyright (c) 2008 Matteo Settenvini <matteo@member.fsf.org>
# Copyright (c) 2008 Horst Knorr <hk_classes@knoda.org>
#
# 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 3 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, see <http://www.gnu.org/licenses/>.
#
# As a special exception, the respective Autoconf Macro's copyright owner
# gives unlimited permission to copy, distribute and modify the configure
# scripts that are the output of Autoconf when processing the Macro. You
# need not follow the terms of the GNU General Public License when using
# or distributing such scripts, even though portions of the text of the
# Macro appear in them. The GNU General Public License (GPL) does govern
# all other use of the material that constitutes the Autoconf Macro.
#
# This special exception to the GPL applies to versions of the Autoconf
# Macro released by the Autoconf Archive. When you make and distribute a
# modified version of the Autoconf Macro, you may extend this special
# exception to the GPL to apply to your modified version as well.
#serial 11
AC_DEFUN([AX_RUBY_DEVEL],[
AC_REQUIRE([AX_WITH_RUBY])
AS_IF([test -n "$1"], [AX_PROG_RUBY_VERSION([$1])])
#
# Check if you have mkmf, else fail
#
AC_MSG_CHECKING([for the mkmf Ruby package])
ac_mkmf_result=`$RUBY -rmkmf -e ";" 2>&1`
if test -z "$ac_mkmf_result"; then
AC_MSG_RESULT([yes])
else
AC_MSG_RESULT([no])
AC_MSG_ERROR([cannot import Ruby module "mkmf".
Please check your Ruby installation. The error was:
$ac_mkmf_result])
fi
#
# Check for Ruby include path
#
AC_MSG_CHECKING([for Ruby include path])
if test -z "$RUBY_CPPFLAGS"; then
ruby_path=`$RUBY -rmkmf -e 'print Config::CONFIG[["archdir"]]'`
if test -n "${ruby_path}"; then
ruby_path="-I$ruby_path"
fi
RUBY_CPPFLAGS=$ruby_path
fi
AC_MSG_RESULT([$RUBY_CPPFLAGS])
AC_SUBST([RUBY_CPPFLAGS])
#
# Check for Ruby library path
#
AC_MSG_CHECKING([for Ruby library path])
if test -z "$RUBY_LDFLAGS"; then
RUBY_LDFLAGS=`$RUBY -rmkmf -e 'print Config::CONFIG[["LIBRUBYARG_SHARED"]]'`
fi
AC_MSG_RESULT([$RUBY_LDFLAGS])
AC_SUBST([RUBY_LDFLAGS])
#
# Check for site packages
#
AC_MSG_CHECKING([for Ruby site-packages path])
if test -z "$RUBY_SITE_PKG"; then
RUBY_SITE_PKG=`$RUBY -rmkmf -e 'print Config::CONFIG[["sitearchdir"]]'`
fi
AC_MSG_RESULT([$RUBY_SITE_PKG])
AC_SUBST([RUBY_SITE_PKG])
#
# libraries which must be linked in when embedding
#
AC_MSG_CHECKING(ruby extra libraries)
if test -z "$RUBY_EXTRA_LIBS"; then
RUBY_EXTRA_LIBS=`$RUBY -rmkmf -e 'print Config::CONFIG[["SOLIBS"]]'`
fi
AC_MSG_RESULT([$RUBY_EXTRA_LIBS])
AC_SUBST(RUBY_EXTRA_LIBS)
#
# linking flags needed when embedding
# (is it even needed for Ruby?)
#
# AC_MSG_CHECKING(ruby extra linking flags)
# if test -z "$RUBY_EXTRA_LDFLAGS"; then
# RUBY_EXTRA_LDFLAGS=`$RUBY -rmkmf -e 'print Config::CONFIG[["LINKFORSHARED"]]'`
# fi
# AC_MSG_RESULT([$RUBY_EXTRA_LDFLAGS])
# AC_SUBST(RUBY_EXTRA_LDFLAGS)
# this flags breaks ruby.h, and is sometimes defined by KDE m4 macros
CFLAGS="`echo "$CFLAGS" | sed -e 's/-std=iso9899:1990//g;'`"
#
# final check to see if everything compiles alright
#
AC_MSG_CHECKING([consistency of all components of ruby development environment])
AC_LANG_PUSH([C])
# save current global flags
ac_save_LIBS="$LIBS"
LIBS="$ac_save_LIBS $RUBY_LDFLAGS"
ac_save_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$ac_save_CPPFLAGS $RUBY_CPPFLAGS"
AC_TRY_LINK([
#include <ruby.h>
],[
ruby_init();
],[rubyexists=yes],[rubyexists=no])
AC_MSG_RESULT([$rubyexists])
if test ! "$rubyexists" = "yes"; then
AC_MSG_ERROR([
Could not link test program to Ruby. Maybe the main Ruby library has been
installed in some non-standard library path. If so, pass it to configure,
via the LDFLAGS environment variable.
Example: ./configure LDFLAGS="-L/usr/non-standard-path/ruby/lib"
============================================================================
ERROR!
You probably have to install the development version of the Ruby package
for your distribution. The exact name of this package varies among them.
============================================================================
])
RUBY_VERSION=""
fi
AC_LANG_POP
# turn back to default flags
CPPFLAGS="$ac_save_CPPFLAGS"
LIBS="$ac_save_LIBS"
#
# all done!
#
])

View File

@@ -0,0 +1,143 @@
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.68)
AC_INIT([GARDEN],
[1.0.9],
[bubla@users.sourceforge.net])
AC_CONFIG_AUX_DIR([build-aux])
AM_INIT_AUTOMAKE([-Wall])
AC_CONFIG_SRCDIR([src/input.h])
AC_CONFIG_HEADERS([src/configure.h])
AC_CONFIG_MACRO_DIR([m4])
AC_ARG_ENABLE([debug],
[AS_HELP_STRING([--enable-debug],
[Builds the debug version of the library [[default = no]]]) ],
[],
[enable_debug="no"])
AS_IF([test "x$enable_debug" = "xyes"],
[CFLAGS="${CFLAGS} -g -O0"])
# Checks for programs.
AC_PROG_CC
AC_PROG_LIBTOOL
LT_PROG_RC
AC_CANONICAL_HOST
dnl
dnl Check whether it makes sense to install a garden.desktop file
dnl
AC_CHECK_PROG([have_freedesktop],
[update-desktop-database],
[yes])
AM_CONDITIONAL([HAVE_FREEDESKTOP],
[test "x$have_freedesktop" = "xyes"])
AM_CONDITIONAL([WANT_FREEDESKTOP],
[test "x$enable_desktop_install" = "xyes"])
AC_ARG_ENABLE([desktop-install],
[AS_HELP_STRING([--enable-desktop-install],
[Whether you want to install the garden.desktop file if applicable. !!! DO NOT USE if you are a PACKAGER!!!])]
)
AS_CASE([$host],
[*mingw* | *cygwin*],
[AC_DEFINE([WINDOWS_VERSION],
[1],
[Define when building for Windows])
windows_version="yes"])
AM_CONDITIONAL([WINDOWS_VERSION],
[test "x$windows_version" = "xyes" ])
dnl now the datadir specification, that is useful if one does want to play without installing
AC_ARG_ENABLE([datadir],
[AS_HELP_STRING([--enable-datadir=path-to-your-garden-datafiles],
[Normally you dont have to use this, but it is handy when you want to play the game without installing it or if you want to use already installed data. In the first case, use for instance --enable-datadir=`pwd`/data (if it makes sense)])],
[DATADIR_NAME="$enableval"],
[DATADIR_NAME='$(datadir)/'garden])
# Sets the data subdirectory
AC_SUBST([DATADIR_NAME])
# Checks for libraries.
AC_CHECK_HEADER([allegro.h],
[],
[have_allegro="no"
AC_MSG_ERROR([You don't even have Allegro headers... Get Allegro first!]) ])
AC_CHECK_LIB([m], [sin])
test "x$host_os" != "x$build_os" && CROSS_COMPILING="yes"
try_link_allegro ()
{
LIBS_SAVE=$LIBS
LIBS="$LIBS $1"
AC_MSG_CHECKING([for Allegro using $1])
AC_LINK_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT
[ #include <allegro.h> ]],
[allegro_init();])END_OF_MAIN() ],
[have_allegro="yes"],
[have_allegro="no"])
AC_MSG_RESULT([$have_allegro])
LIBS=$LIBS_SAVE
AS_IF([test "x$have_allegro" == "xyes"],
[return 0],
[return 1])
}
# first check for 'official allegro'
# The official allegro does not support cross-compiling, though...
AM_PATH_ALLEGRO([4.2.0])
try_link_allegro "$allegro_LIBS"
AS_IF([test "x$?" == "x0"],
[[LIBS="$LIBS $allegro_LIBS"
ALLEGRO_LIB=`echo $allegro_LIBS | sed -e 's/.*-l\([^[:blank:]]*\).*/\1/'`
have_allegro="yes"]])
ALLEGRO_RELEASE_LIBS="alleg alleg42 alleg44"
ALLEGRO_DEBUG_LIBS="alld42 alleg44-debug"
AS_IF([test "x$enable_debug" = "xyes"],
[ALLEGRO_LIBS="$ALLEGRO_DEBUG_LIBS $ALLEGRO_RELEASE_LIBS"],
[ALLEGRO_LIBS="$ALLEGRO_RELEASE_LIBS $ALLEGRO_DEBUG_LIBS"])
for lib in $ALLEGRO_LIBS
do
ldflag="-l$lib"
AS_IF([test "x$have_allegro" == "xyes"],
[break])
try_link_allegro $ldflag
AS_IF([test "x$?" == "x0"],
[LIBS="$LIBS $ldflag"
ALLEGRO_LIB="$lib"
have_allegro="yes"])
done
AS_IF([test "x$have_allegro" != "xyes"],
[AC_MSG_ERROR([Unable to find Allegro game programming library 4.2, check out www.allegro.cc (or your distro repositories if you use a unix-like system)]) ])
# Checks for header files.
AC_CHECK_HEADERS([string.h sys/stat.h])
# Checks for typedefs, structures, and compiler characteristics.
AC_C_INLINE
AC_HEADER_STDBOOL
# Checks for library functions.
AC_SUBST([ALLEGRO_LIB])
AC_CONFIG_FILES([Makefile
src/Makefile
data/Makefile
resources/Makefile
docs/garden.doxyfile
pkgs/w32/winstaller.nsi])
AC_OUTPUT

46
samples/M4Sugar/list.m4 Normal file
View File

@@ -0,0 +1,46 @@
m4_define([m4_list_declare], [m4_do(
[m4_define([$1_GET], [m4_expand([m4_list_nth([$1], $][1)])])],
[m4_define([$1_FOREACH], [m4_foreach([item], [m4_dquote_elt(m4_list_contents([$1]))], m4_quote($][1))])],
)])
m4_define([m4_list_add], [m4_do(
[m4_pushdef([_LIST_NAME], [[_LIST_$1]])],
[m4_ifndef(_LIST_NAME,
[m4_define(_LIST_NAME, m4_dquote(m4_escape([$2])))],
[m4_define(_LIST_NAME, m4_dquote(m4_list_contents([$1]), m4_escape([$2])))],
)],
[m4_popdef([_LIST_NAME])],
)])
m4_define([m4_list_contents], [m4_do(
[m4_pushdef([_LIST_NAME], [[_LIST_$1]])],
[m4_ifndef(_LIST_NAME, [], m4_quote(_LIST_NAME))],
[m4_popdef([_LIST_NAME])],
)])
m4_define([m4_list_nth], [m4_argn([$2], m4_list_contents([$1]))])
m4_define([m4_list_pop_front], [m4_do(
[m4_pushdef([_LIST_NAME], [[_LIST_$1]])],
[m4_car(m4_unquote(_LIST_NAME))],
[m4_define(_LIST_NAME, m4_cdr(m4_unquote(_LIST_NAME)))],
[m4_popdef([_LIST_NAME])],
)])
m4_define([m4_list_pop_back], [m4_do(
[m4_pushdef([_LIST_NAME], [[_LIST_$1]])],
[m4_define(_LIST_NAME, m4_dquote(m4_reverse(m4_unquote(_LIST_NAME))))],
[m4_list_pop_front([$1])],
[m4_define(_LIST_NAME, m4_dquote(m4_reverse(m4_unquote(_LIST_NAME))))],
[m4_popdef([_LIST_NAME])],
)])
dnl
dnl $1: List name
dnl $2: What
dnl $3: If contains
dnl $4: If not
m4_define([m4_list_contains], [m4_do(
[m4_foreach([item], m4_list_contents([$1]), m4_if(item, [$2], [[$3]], [[$4]]))]
)])

View File

@@ -0,0 +1,29 @@
-- Taken from an example from Autodesk's MAXScript reference:
-- http://help.autodesk.com/view/3DSMAX/2016/ENU/?guid=__files_GUID_84E24969_C175_4389_B9A6_3B2699B66785_htm
macroscript MoveToSurface
category: "HowTo"
(
fn g_filter o = superclassof o == Geometryclass
fn find_intersection z_node node_to_z = (
local testRay = ray node_to_z.pos [0,0,-1]
local nodeMaxZ = z_node.max.z
testRay.pos.z = nodeMaxZ + 0.0001 * abs nodeMaxZ
intersectRay z_node testRay
)
on isEnabled return selection.count > 0
on Execute do (
target_mesh = pickObject message:"Pick Target Surface:" filter:g_filter
if isValidNode target_mesh then (
undo "MoveToSurface" on (
for i in selection do (
int_point = find_intersection target_mesh i
if int_point != undefined then i.pos = int_point.pos
)--end i loop
)--end undo
)--end if
)--end execute
)--end script

View File

@@ -0,0 +1,53 @@
-- Taken from an example from Autodesk's MAXScript reference:
-- http://help.autodesk.com/view/3DSMAX/2016/ENU/?guid=__files_GUID_0876DF46_FAA3_4131_838D_5739A67FF2C1_htm
macroscript FreeSpline category:"HowTo" tooltip:"FreeSpline" (
local old_pos
local new_spline
local second_knot_set
fn get_mouse_pos pen_pos old_pen_pos = (
if old_pos == undefined then old_pos = old_pen_pos
if distance pen_pos old_pos > 10 then
(
if second_knot_set then
addKnot new_spline 1 #smooth #curve pen_pos
else
(
setKnotPoint new_spline 1 2 pen_pos
second_knot_set = true
)
old_pos = pen_pos
updateShape new_spline
)-- end if
)-- end fn
fn draw_new_line old_pen_pos = (
pickPoint mouseMoveCallback:#(get_mouse_pos,old_pen_pos)
)
undo"Free Spline"on(
new_spline = splineShape ()
old_pen_pos = pickPoint ()
if old_pen_pos == #RightClick then
delete new_spline
else
(
select new_spline
new_spline.pos = old_pen_pos
addNewSpline new_spline
addKnot new_spline 1 #smooth #curve old_pen_pos
addKnot new_spline 1 #smooth #curve old_pen_pos
second_knot_set = false
draw_new_line old_pen_pos
q = querybox "Close Spline?" title:"Free Spline"
if q then
(
close new_spline 1
updateshape new_spline
)
select new_spline
)--end else
)--end undo
)--end script

View File

@@ -0,0 +1,64 @@
-- Taken from a 3-part tutorial from Autodesk's MAXScript reference
-- Source: http://help.autodesk.com/view/3DSMAX/2016/ENU/?guid=__files_GUID_6B5EDC11_A154_4AA7_A972_A11AC36949E9_htm
fn ColourToHex col = (
local theComponents = #(bit.intAsHex col.r, bit.intAsHex col.g, bit.intAsHex col.b)
local theValue = "#"
for i in theComponents do
theValue += (if i.count == 1 then "0" else "") + i
theValue
)
local st = timestamp()
local theFileName = (getDir #userscripts + "\\PolygonRendering3.svg")
local theSVGfile = createFile theFileName
format "<svg xmlns=\"http://www.w3.org/2000/svg\"\n" to:theSVGfile
format "\t\txmlns:xlink=\"http://www.w3.org/1999/xlink\">\n" to:theSVGfile
local theViewTM = viewport.getTM()
theViewTM.row4 = [0,0,0]
local theViewTM2 = viewport.getTM()
local theViewSize = getViewSize()
local theViewScale = getViewSize()
theViewScale.x /= 1024.0
theViewScale.y /= 1024.0
local theStrokeThickness = 3
gw.setTransform (matrix3 1)
for o in Geometry where not o.isHiddenInVpt and classof o != TargetObject do (
local theStrokeColour = white
local theFillColour = o.wirecolor
local theMesh = snapshotAsMesh o
for f = 1 to theMesh.numfaces do (
local theNormal = normalize (getFaceNormal theMesh f)
if (theNormal*theViewTM).z > 0 do
(
local theFace = getFace theMesh f
local v1 = gw.transPoint (getVert theMesh theFace.x)
local v2 = gw.transPoint (getVert theMesh theFace.y)
local v3 = gw.transPoint (getVert theMesh theFace.z)
v1.x /= theViewScale.x
v1.y /= theViewScale.y
v2.x /= theViewScale.x
v2.y /= theViewScale.y
v3.x /= theViewScale.x
v3.y /= theViewScale.y
format "\t<polygon points='%,% %,% %,%' \n" v1.x v1.y v2.x v2.y v3.x v3.y to:theSVGfile
format "\tstyle='stroke:%; fill:%; stroke-width:%'/>\n" (ColourToHex theStrokeColour) (ColourToHex theFillColour) theStrokeThickness to:theSVGfile
)--end if normal positive
)--end f loop
)--end o loop
format "</svg>\n" to:theSVGfile
close theSVGfile
local theSVGMap = VectorMap vectorFile:theFileName alphasource:0
local theBitmap = bitmap theViewSize.x theViewSize.y
renderMap theSVGMap into:theBitmap filter:true
display theBitmap
format "Render Time: % sec.\n" ((timestamp()-st)/1000.0)

View File

@@ -0,0 +1,22 @@
fn CalculateVolumeAndCentreOfMass obj =
(
local Volume= 0.0
local Centre= [0.0, 0.0, 0.0]
local theMesh = snapshotasmesh obj
local numFaces = theMesh.numfaces
for i = 1 to numFaces do
(
local Face= getFace theMesh i
local vert2 = getVert theMesh Face.z
local vert1 = getVert theMesh Face.y
local vert0 = getVert theMesh Face.x
local dV = Dot (Cross (vert1 - vert0) (vert2 - vert0)) vert0
Volume+= dV
Centre+= (vert0 + vert1 + vert2) * dV
)
delete theMesh
Volume /= 6
Centre /= 24
Centre /= Volume
#(Volume,Centre)
)

View File

@@ -0,0 +1 @@
Test[1 + 2, 3, TestID -> "One plus two"]

View File

@@ -0,0 +1 @@
Test["a" <> "b", "ab", TestID -> "Concat \"a\" and \"b\""]

View File

@@ -0,0 +1,5 @@
TestSuite[
{ "TestArithmetic.mt"
, "TestString.mt"
}
]

View File

@@ -0,0 +1,694 @@
= Name =
'''nginx_tcp_proxy_module''' - support TCP proxy with Nginx
= Installation =
Download the latest stable version of the release tarball of this module from [http://github.com/yaoweibin/nginx_tcp_proxy_module github]
Grab the nginx source code from [http://nginx.org/ nginx.org], for example, the version 1.2.1 (see nginx compatibility), and then build the source with this module:
<geshi lang="bash">
$ wget 'http://nginx.org/download/nginx-1.2.1.tar.gz'
$ tar -xzvf nginx-1.2.1.tar.gz
$ cd nginx-1.2.1/
$ patch -p1 < /path/to/nginx_tcp_proxy_module/tcp.patch
$ ./configure --add-module=/path/to/nginx_tcp_proxy_module
$ make
$ make install
</geshi>
= Synopsis =
<geshi lang="nginx">
http {
server {
listen 80;
location /status {
tcp_check_status;
}
}
}
</geshi>
<geshi lang="nginx">
#You can also include tcp_proxy.conf file individually
#include /path/to/tcp_proxy.conf;
tcp {
upstream cluster {
# simple round-robin
server 192.168.0.1:80;
server 192.168.0.2:80;
check interval=3000 rise=2 fall=5 timeout=1000;
#check interval=3000 rise=2 fall=5 timeout=1000 type=ssl_hello;
#check interval=3000 rise=2 fall=5 timeout=1000 type=http;
#check_http_send "GET / HTTP/1.0\r\n\r\n";
#check_http_expect_alive http_2xx http_3xx;
}
server {
listen 8888;
proxy_pass cluster;
}
}
</geshi>
= Description =
This module actually include many modules: ngx_tcp_module, ngx_tcp_core_module, ngx_tcp_upstream_module, ngx_tcp_proxy_module, ngx_tcp_websocket_module, ngx_tcp_ssl_module, ngx_tcp_upstream_ip_hash_module. All these modules work together to support TCP proxy with Nginx. I also added other features: ip_hash, upstream server health check, status monitor.
The motivation of writing these modules is Nginx's high performance and robustness. At first, I developed this module just for general TCP proxy. And now, this module is frequently used in websocket reverse proxying.
Note, You can't use the same listening port with HTTP modules.
= Directives =
== ngx_tcp_moodule ==
=== tcp ===
'''syntax:''' ''tcp {...}''
'''default:''' ''none''
'''context:''' ''main''
'''description:''' All the tcp related directives are contained in the tcp block.
'''ngx_tcp_core_moodule'''
=== server ===
'''syntax:''' ''server {...}''
'''default:''' ''none''
'''context:''' ''tcp''
'''description:''' All the specific server directives are contained in the server block.
=== listen ===
'''syntax:''' ''listen address:port [ bind | ssl | default]''
'''default:''' ''none''
'''context:''' ''server''
'''description:''' The same as [http://wiki.nginx.org/NginxMailCoreModule#listen listen]. The parameter of default means the default server if you have several server blocks with the same port.
=== access_log ===
'''syntax:''' ''access_log path [buffer=size] | off''
'''default:''' ''access_log logs/tcp_access.log''
'''context:''' ''tcp, server''
'''description:''' Set the access.log. Each record's format is like this:
<pre>
log_time worker_process_pid client_ip host_ip accept_time upstream_ip bytes_read bytes_write
2011/08/02 06:19:07 [5972] 127.0.0.1 0.0.0.0:1982 2011/08/02 06:18:19 172.19.0.129:80 80 236305
</pre>
* ''log_time'': The current time when writing this log. The log action is called when the proxy session is closed.
* ''worker_process_pid'': the pid of worker process
* ''client_ip'': the client ip
* ''host_ip'': the server ip and port
* ''accept_time'': the time when the server accepts client's connection
* ''upstream_ip'': the upstream server's ip
* ''bytes_read'': the bytes read from client
* ''bytes_write'': the bytes written to client
=== allow ===
'''syntax:''' ''allow [ address | CIDR | all ]''
'''default:''' ''none''
'''context:''' ''server''
'''description:''' Directive grants access for the network or addresses indicated.
=== deny ===
'''syntax:''' ''deny [ address | CIDR | all ]''
'''default:''' ''none''
'''context:''' ''server''
'''description:''' Directive grants access for the network or addresses indicated.
=== so_keepalive ===
'''syntax:''' ''so_keepalive on|off''
'''default:''' ''off''
'''context:''' ''main, server''
'''description:''' The same as [http://wiki.nginx.org/NginxMailCoreModule#so_keepalive so_keepalive].
=== tcp_nodelay ===
'''syntax:''' ''tcp_nodelay on|off''
'''default:''' ''on''
'''context:''' ''main, server''
'''description:''' The same as [http://wiki.nginx.org/NginxHttpCoreModule#tcp_nodelay tcp_nodelay].
=== timeout ===
'''syntax:''' ''timeout milliseconds''
'''default:''' ''60000''
'''context:''' ''main, server''
'''description:''' set the timeout value with clients.
=== server_name ===
'''syntax:''' ''server_name name''
'''default:''' ''The name of the host, obtained through gethostname()''
'''context:''' ''tcp, server''
'''description:''' The same as [http://wiki.nginx.org/NginxMailCoreModule#server_name server_name]. You can specify several server name in different server block with the same port. They can be used in websocket module.
=== resolver ===
'''syntax:''' ''resolver address''
'''default:''' ''none''
'''context:''' ''tcp, server''
'''description:''' DNS server
=== resolver_timeout ===
'''syntax:''' ''resolver_timeout time''
'''default:''' ''30s''
'''context:''' ''tcp, server''
'''description:''' Resolver timeout in seconds.
== ngx_tcp_upstream_module ==
=== upstream ===
'''syntax:''' ''upstream {...}''
'''default:''' ''none''
'''context:''' ''tcp''
'''description:''' All the upstream directives are contained in this block. The upstream server will be dispatched with round robin by default.
=== server ===
'''syntax:''' ''server name [parameters]''
'''default:''' ''none''
'''context:''' ''upstream''
'''description:''' Most of the parameters are the same as [http://wiki.nginx.org/NginxHttpUpstreamModule#server server]. Default port is 80.
=== check ===
'''syntax:''' ''check interval=milliseconds [fall=count] [rise=count] [timeout=milliseconds] [type=tcp|ssl_hello|smtp|mysql|pop3|imap]''
'''default:''' ''none, if parameters omitted, default parameters are interval=30000 fall=5 rise=2 timeout=1000''
'''context:''' ''upstream''
'''description:''' Add the health check for the upstream servers. At present, the check method is a simple tcp connect.
The parameters' meanings are:
* ''interval'': the check request's interval time.
* ''fall''(fall_count): After fall_count check failures, the server is marked down.
* ''rise''(rise_count): After rise_count check success, the server is marked up.
* ''timeout'': the check request's timeout.
* ''type'': the check protocol type:
# ''tcp'' is a simple tcp socket connect and peek one byte.
# ''ssl_hello'' sends a client ssl hello packet and receives the server ssl hello packet.
# ''http'' sends a http request packet, receives and parses the http response to diagnose if the upstream server is alive.
# ''smtp'' sends a smtp request packet, receives and parses the smtp response to diagnose if the upstream server is alive. The response begins with '2' should be an OK response.
# ''mysql'' connects to the mysql server, receives the greeting response to diagnose if the upstream server is alive.
# ''pop3'' receives and parses the pop3 response to diagnose if the upstream server is alive. The response begins with '+' should be an OK response.
# ''imap'' connects to the imap server, receives the greeting response to diagnose if the upstream server is alive.
=== check_http_send ===
'''syntax:''' ''check_http_send http_packet''
'''default:''' ''"GET / HTTP/1.0\r\n\r\n"''
'''context:''' ''upstream''
'''description:''' If you set the check type is http, then the check function will sends this http packet to check the upstream server.
=== check_http_expect_alive ===
'''syntax:''' ''check_http_expect_alive [ http_2xx | http_3xx | http_4xx | http_5xx ]''
'''default:''' ''http_2xx | http_3xx''
'''context:''' ''upstream''
'''description:''' These status codes indicate the upstream server's http response is OK, the backend is alive.
=== check_smtp_send ===
'''syntax:''' ''check_smtp_send smtp_packet''
'''default:''' ''"HELO smtp.localdomain\r\n"''
'''context:''' ''upstream''
'''description:''' If you set the check type is smtp, then the check function will sends this smtp packet to check the upstream server.
=== check_smtp_expect_alive ===
'''syntax:''' ''check_smtp_expect_alive [smtp_2xx | smtp_3xx | smtp_4xx | smtp_5xx]''
'''default:''' ''smtp_2xx''
'''context:''' ''upstream''
'''description:''' These status codes indicate the upstream server's smtp response is OK, the backend is alive.
=== check_shm_size ===
'''syntax:''' ''check_shm_size size''
'''default:''' ''(number_of_checked_upstream_blocks + 1) * pagesize''
'''context:''' ''tcp''
'''description:''' If you store hundreds of servers in one upstream block, the shared memory for health check may be not enough, you can enlarged it by this directive.
=== tcp_check_status ===
'''syntax:''' ''tcp_check_status''
'''default:''' ''none''
'''context:''' ''location''
'''description:''' Display the health checking servers' status by HTTP. This directive is set in the http block.
The table field meanings are:
* ''Index'': The server index in the check table
* ''Name'' : The upstream server name
* ''Status'': The marked status of the server.
* ''Busyness'': The number of connections which are connecting to the server.
* ''Rise counts'': Count the successful checking
* ''Fall counts'': Count the unsuccessful checking
* ''Access counts'': Count the times accessing to this server
* ''Check type'': The type of the check packet
'''ngx_tcp_upstream_busyness_module'''
=== busyness ===
'''syntax:''' ''busyness''
'''default:''' ''none''
'''context:''' ''upstream''
'''description:''' the upstream server will be dispatched by backend servers' busyness.
'''ngx_tcp_upstream_ip_hash_module'''
=== ip_hash ===
'''syntax:''' ''ip_hash''
'''default:''' ''none''
'''context:''' ''upstream''
'''description:''' the upstream server will be dispatched by ip_hash.
== ngx_tcp_proxy_module ==
=== proxy_pass ===
'''syntax:''' ''proxy_pass host:port''
'''default:''' ''none''
'''context:''' ''server''
'''description:''' proxy the request to the backend server. Default port is 80.
=== proxy_buffer ===
'''syntax:''' ''proxy_buffer size''
'''default:''' ''4k''
'''context:''' ''tcp, server''
'''description:''' set the size of proxy buffer.
=== proxy_connect_timeout ===
'''syntax:''' ''proxy_connect_timeout miliseconds''
'''default:''' ''60000''
'''context:''' ''tcp, server''
'''description:''' set the timeout value of connection to backends.
=== proxy_read_timeout ===
'''syntax:''' ''proxy_read_timeout miliseconds''
'''default:''' ''60000''
'''context:''' ''tcp, server''
'''description:''' set the timeout value of reading from backends.
=== proxy_send_timeout ===
'''syntax:''' ''proxy_send_timeout miliseconds''
'''default:''' ''60000''
'''context:''' ''tcp, server''
'''description:''' set the timeout value of sending to backends.
== ngx_tcp_websocket_module ==
=== websocket_pass ===
'''syntax:''' ''websocket_pass [path] host:port''
'''default:''' ''none''
'''context:''' ''server''
'''description:''' proxy the websocket request to the backend server. Default port is 80. You can specify several different paths in the same server block.
=== websocket_buffer ===
'''syntax:''' ''websocket_buffer size''
'''default:''' ''4k''
'''context:''' ''tcp, server''
'''description:''' set the size of proxy buffer.
=== websocket_connect_timeout ===
'''syntax:''' ''websocket_connect_timeout miliseconds''
'''default:''' ''60000''
'''context:''' ''tcp, server''
'''description:''' set the timeout value of connection to backends.
=== websocket_read_timeout ===
'''syntax:''' ''websocket_read_timeout miliseconds''
'''default:''' ''60000''
'''context:''' ''tcp, server''
'''description:''' set the timeout value of reading from backends. Your timeout will be the minimum of this and the *timeout* parameter, so if you want a long timeout for your websockets, make sure to set both paramaters.
=== websocket_send_timeout ===
'''syntax:''' ''websocket_send_timeout miliseconds''
'''default:''' ''60000''
'''context:''' ''tcp, server''
'''description:''' set the timeout value of sending to backends.
== ngx_tcp_ssl_module ==
The default config file includes this ngx_tcp_ssl_module. If you want to just compile nginx without ngx_tcp_ssl_module, copy the ngx_tcp_proxy_module/config_without_ssl to ngx_tcp_proxy_module/config, reconfigrure and compile nginx.
=== ssl ===
'''syntax:''' ''ssl [on|off] ''
'''default:''' ''ssl off''
'''context:''' ''tcp, server''
Enables SSL for a server.
=== ssl_certificate ===
'''syntax:''' ''ssl_certificate file''
'''default:''' ''ssl_certificate cert.pem''
'''context:''' ''tcp, server''
This directive specifies the file containing the certificate, in PEM format. This file can contain also other certificates and the server private key.
=== ssl_certificate_key ===
'''syntax:''' ''ssl_certificate_key file''
'''default:''' ''ssl_certificate_key cert.pem''
'''context:''' ''tcp, server''
This directive specifies the file containing the private key, in PEM format.
=== ssl_client_certificate ===
'''syntax:''' ''ssl_client_certificate file''
'''default:''' ''none''
'''context:''' ''tcp, server''
This directive specifies the file containing the CA (root) certificate, in PEM format, that is used for validating client certificates.
=== ssl_dhparam ===
'''syntax:''' ''ssl_dhparam file''
'''default:''' ''none''
'''context:''' ''tcp, server''
This directive specifies a file containing Diffie-Hellman key agreement protocol cryptographic parameters, in PEM format, utilized for exchanging session keys between server and client.
=== ssl_ciphers ===
'''syntax:''' ''ssl_ciphers openssl_cipherlist_spec''
'''default:''' ''ssl_ciphers HIGH:!aNULL:!MD5''
'''context:''' ''tcp, server''
This directive describes the list of cipher suites the server supports for establishing a secure connection. Cipher suites are specified in the [http://openssl.org/docs/apps/ciphers.html OpenSSL] cipherlist format, for example:
<geshi lang="nginx">
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
</geshi>
The complete cipherlist supported by the currently installed version of OpenSSL in your platform can be obtained by issuing the command:
<pre>
openssl ciphers
</pre>
=== ssl_crl ===
'''syntax:''' ''ssl_crl file''
'''default:''' ''none''
'''context:''' ''tcp, server''
This directive specifies the filename of a Certificate Revocation List, in PEM format, which is used to check the revocation status of certificates.
=== ssl_prefer_server_ciphers ===
'''syntax:''' ''ssl_prefer_server_ciphers [on|off] ''
'''default:''' ''ssl_prefer_server_ciphers off''
'''context:''' ''tcp, server''
The server requires that the cipher suite list for protocols SSLv3 and TLSv1 are to be preferred over the client supported cipher suite list.
=== ssl_protocols ===
'''syntax:''' ''ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2]''
'''default:''' ''ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2''
'''context:''' ''tcp, server''
This directive enables the protocol versions specified.
=== ssl_verify_client ===
'''syntax:''' ''ssl_verify_client on|off|optional''
'''default:''' ''ssl_verify_client off''
'''context:''' ''tcp, server''
This directive enables the verification of the client identity. Parameter 'optional' checks the client identity using its certificate in case it was made available to the server.
=== ssl_verify_depth ===
'''syntax:''' ''ssl_verify_depth number''
'''default:''' ''ssl_verify_depth 1''
'''context:''' ''tcp, server''
This directive sets how deep the server should go in the client provided certificate chain in order to verify the client identity.
=== ssl_session_cache ===
'''syntax:''' ''ssl_session_cache off|none|builtin:size and/or shared:name:size''
'''default:''' ''ssl_session_cache off''
'''context:''' ''tcp, server''
The directive sets the types and sizes of caches to store the SSL sessions.
The cache types are:
* off -- Hard off: nginx says explicitly to a client that sessions can not reused.
* none -- Soft off: nginx says to a client that session can be resued, but nginx actually never reuses them. This is workaround for some mail clients as ssl_session_cache may be used in mail proxy as well as in HTTP server.
* builtin -- the OpenSSL builtin cache, is used inside one worker process only. The cache size is assigned in the number of the sessions. Note: there appears to be a memory fragmentation issue using this method, please take that into consideration when using this. See "References" below.
* shared -- the cache is shared between all worker processes. The size of the cache is assigned in bytes: 1 MB cache can contain roughly 4000 sessions. Each shared cache must be given an arbitrary name. A shared cache with a given name can be used in several virtual hosts.
It's possible to use both types of cache &mdash; builtin and shared &mdash; simultaneously, for example:
<geshi lang="nginx">
ssl_session_cache builtin:1000 shared:SSL:10m;
</geshi>
Bear in mind however, that using only shared cache, i.e., without builtin, should be more effective.
=== ssl_session_timeout ===
'''syntax:''' ''ssl_session_timeout time''
'''default:''' ''ssl_session_timeout 5m''
'''context:''' ''tcp, server''
This directive defines the maximum time during which the client can re-use the previously negotiated cryptographic parameters of the secure session that is stored in the SSL cache.
= Compatibility =
* My test bed is 0.7.65+
= Notes =
The http_response_parse.rl and smtp_response_parse.rl are [http://www.complang.org/ragel/ ragel] scripts , you can edit the script and compile it like this:
<geshi lang="bash">
$ ragel -G2 http_response_parse.rl
$ ragel -G2 smtp_response_parse.rl
</geshi>
= TODO =
* refact this module, make it more extendable for adding third-party modules
* manipulate header like http module's proxy_set_header
* built-in variable support
* custom log format
* syslog support
* FTP/IRC proxying
= Known Issues =
* This module can't use the same listening port with the HTTP module.
= Changelogs =
== v0.2.0 ==
* add ssl proxy module
* add websocket proxy module
* add upstream busyness module
* add tcp access log module
== v0.19 ==
* add many check methods
== v0.1 ==
* first release
= Authors =
Weibin Yao(姚伟斌) ''yaoweibin at gmail dot com''
= Copyright & License =
This README template copy from [http://github.com/agentzh agentzh].
I borrowed a lot of code from upstream and mail module from the nginx 0.7.* core. This part of code is copyrighted by Igor Sysoev. And the health check part is borrowed the design of Jack Lindamood's healthcheck module [http://github.com/cep21/healthcheck_nginx_upstreams healthcheck_nginx_upstreams];
This module is licensed under the BSD license.
Copyright (C) 2013 by Weibin Yao <yaoweibin@gmail.com>.
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
* 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.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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.

8399
samples/PAWN/fixes.inc Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,520 +0,0 @@
//----------------------------------------------------------
//
// GRAND LARCENY 1.0
// A freeroam gamemode for SA-MP 0.3
//
//----------------------------------------------------------
#include <a_samp>
#include <core>
#include <float>
#include "../include/gl_common.inc"
#include "../include/gl_spawns.inc"
#pragma tabsize 0
//----------------------------------------------------------
#define COLOR_WHITE 0xFFFFFFFF
#define COLOR_NORMAL_PLAYER 0xFFBB7777
#define CITY_LOS_SANTOS 0
#define CITY_SAN_FIERRO 1
#define CITY_LAS_VENTURAS 2
new total_vehicles_from_files=0;
// Class selection globals
new gPlayerCitySelection[MAX_PLAYERS];
new gPlayerHasCitySelected[MAX_PLAYERS];
new gPlayerLastCitySelectionTick[MAX_PLAYERS];
new Text:txtClassSelHelper;
new Text:txtLosSantos;
new Text:txtSanFierro;
new Text:txtLasVenturas;
new thisanimid=0;
new lastanimid=0;
//----------------------------------------------------------
main()
{
print("\n---------------------------------------");
print("Running Grand Larceny - by the SA-MP team\n");
print("---------------------------------------\n");
}
//----------------------------------------------------------
public OnPlayerConnect(playerid)
{
GameTextForPlayer(playerid,"~w~Grand Larceny",3000,4);
SendClientMessage(playerid,COLOR_WHITE,"Welcome to {88AA88}G{FFFFFF}rand {88AA88}L{FFFFFF}arceny");
// class selection init vars
gPlayerCitySelection[playerid] = -1;
gPlayerHasCitySelected[playerid] = 0;
gPlayerLastCitySelectionTick[playerid] = GetTickCount();
//SetPlayerColor(playerid,COLOR_NORMAL_PLAYER);
//Kick(playerid);
/*
Removes vending machines
RemoveBuildingForPlayer(playerid, 1302, 0.0, 0.0, 0.0, 6000.0);
RemoveBuildingForPlayer(playerid, 1209, 0.0, 0.0, 0.0, 6000.0);
RemoveBuildingForPlayer(playerid, 955, 0.0, 0.0, 0.0, 6000.0);
RemoveBuildingForPlayer(playerid, 1775, 0.0, 0.0, 0.0, 6000.0);
RemoveBuildingForPlayer(playerid, 1776, 0.0, 0.0, 0.0, 6000.0);
*/
/*
new ClientVersion[32];
GetPlayerVersion(playerid, ClientVersion, 32);
printf("Player %d reports client version: %s", playerid, ClientVersion);*/
return 1;
}
//----------------------------------------------------------
public OnPlayerSpawn(playerid)
{
if(IsPlayerNPC(playerid)) return 1;
new randSpawn = 0;
SetPlayerInterior(playerid,0);
TogglePlayerClock(playerid,0);
ResetPlayerMoney(playerid);
GivePlayerMoney(playerid, 30000);
if(CITY_LOS_SANTOS == gPlayerCitySelection[playerid]) {
randSpawn = random(sizeof(gRandomSpawns_LosSantos));
SetPlayerPos(playerid,
gRandomSpawns_LosSantos[randSpawn][0],
gRandomSpawns_LosSantos[randSpawn][1],
gRandomSpawns_LosSantos[randSpawn][2]);
SetPlayerFacingAngle(playerid,gRandomSpawns_LosSantos[randSpawn][3]);
}
else if(CITY_SAN_FIERRO == gPlayerCitySelection[playerid]) {
randSpawn = random(sizeof(gRandomSpawns_SanFierro));
SetPlayerPos(playerid,
gRandomSpawns_SanFierro[randSpawn][0],
gRandomSpawns_SanFierro[randSpawn][1],
gRandomSpawns_SanFierro[randSpawn][2]);
SetPlayerFacingAngle(playerid,gRandomSpawns_SanFierro[randSpawn][3]);
}
else if(CITY_LAS_VENTURAS == gPlayerCitySelection[playerid]) {
randSpawn = random(sizeof(gRandomSpawns_LasVenturas));
SetPlayerPos(playerid,
gRandomSpawns_LasVenturas[randSpawn][0],
gRandomSpawns_LasVenturas[randSpawn][1],
gRandomSpawns_LasVenturas[randSpawn][2]);
SetPlayerFacingAngle(playerid,gRandomSpawns_LasVenturas[randSpawn][3]);
}
//SetPlayerColor(playerid,COLOR_NORMAL_PLAYER);
SetPlayerSkillLevel(playerid,WEAPONSKILL_PISTOL,200);
SetPlayerSkillLevel(playerid,WEAPONSKILL_PISTOL_SILENCED,200);
SetPlayerSkillLevel(playerid,WEAPONSKILL_DESERT_EAGLE,200);
SetPlayerSkillLevel(playerid,WEAPONSKILL_SHOTGUN,200);
SetPlayerSkillLevel(playerid,WEAPONSKILL_SAWNOFF_SHOTGUN,200);
SetPlayerSkillLevel(playerid,WEAPONSKILL_SPAS12_SHOTGUN,200);
SetPlayerSkillLevel(playerid,WEAPONSKILL_MICRO_UZI,200);
SetPlayerSkillLevel(playerid,WEAPONSKILL_MP5,200);
SetPlayerSkillLevel(playerid,WEAPONSKILL_AK47,200);
SetPlayerSkillLevel(playerid,WEAPONSKILL_M4,200);
SetPlayerSkillLevel(playerid,WEAPONSKILL_SNIPERRIFLE,200);
GivePlayerWeapon(playerid,WEAPON_COLT45,100);
//GivePlayerWeapon(playerid,WEAPON_MP5,100);
TogglePlayerClock(playerid, 0);
return 1;
}
//----------------------------------------------------------
public OnPlayerDeath(playerid, killerid, reason)
{
new playercash;
// if they ever return to class selection make them city
// select again first
gPlayerHasCitySelected[playerid] = 0;
if(killerid == INVALID_PLAYER_ID) {
ResetPlayerMoney(playerid);
} else {
playercash = GetPlayerMoney(playerid);
if(playercash > 0) {
GivePlayerMoney(killerid, playercash);
ResetPlayerMoney(playerid);
}
}
return 1;
}
//----------------------------------------------------------
ClassSel_SetupCharSelection(playerid)
{
if(gPlayerCitySelection[playerid] == CITY_LOS_SANTOS) {
SetPlayerInterior(playerid,11);
SetPlayerPos(playerid,508.7362,-87.4335,998.9609);
SetPlayerFacingAngle(playerid,0.0);
SetPlayerCameraPos(playerid,508.7362,-83.4335,998.9609);
SetPlayerCameraLookAt(playerid,508.7362,-87.4335,998.9609);
}
else if(gPlayerCitySelection[playerid] == CITY_SAN_FIERRO) {
SetPlayerInterior(playerid,3);
SetPlayerPos(playerid,-2673.8381,1399.7424,918.3516);
SetPlayerFacingAngle(playerid,181.0);
SetPlayerCameraPos(playerid,-2673.2776,1394.3859,918.3516);
SetPlayerCameraLookAt(playerid,-2673.8381,1399.7424,918.3516);
}
else if(gPlayerCitySelection[playerid] == CITY_LAS_VENTURAS) {
SetPlayerInterior(playerid,3);
SetPlayerPos(playerid,349.0453,193.2271,1014.1797);
SetPlayerFacingAngle(playerid,286.25);
SetPlayerCameraPos(playerid,352.9164,194.5702,1014.1875);
SetPlayerCameraLookAt(playerid,349.0453,193.2271,1014.1797);
}
}
//----------------------------------------------------------
// Used to init textdraws of city names
ClassSel_InitCityNameText(Text:txtInit)
{
TextDrawUseBox(txtInit, 0);
TextDrawLetterSize(txtInit,1.25,3.0);
TextDrawFont(txtInit, 0);
TextDrawSetShadow(txtInit,0);
TextDrawSetOutline(txtInit,1);
TextDrawColor(txtInit,0xEEEEEEFF);
TextDrawBackgroundColor(txtClassSelHelper,0x000000FF);
}
//----------------------------------------------------------
ClassSel_InitTextDraws()
{
// Init our observer helper text display
txtLosSantos = TextDrawCreate(10.0, 380.0, "Los Santos");
ClassSel_InitCityNameText(txtLosSantos);
txtSanFierro = TextDrawCreate(10.0, 380.0, "San Fierro");
ClassSel_InitCityNameText(txtSanFierro);
txtLasVenturas = TextDrawCreate(10.0, 380.0, "Las Venturas");
ClassSel_InitCityNameText(txtLasVenturas);
// Init our observer helper text display
txtClassSelHelper = TextDrawCreate(10.0, 415.0,
" Press ~b~~k~~GO_LEFT~ ~w~or ~b~~k~~GO_RIGHT~ ~w~to switch cities.~n~ Press ~r~~k~~PED_FIREWEAPON~ ~w~to select.");
TextDrawUseBox(txtClassSelHelper, 1);
TextDrawBoxColor(txtClassSelHelper,0x222222BB);
TextDrawLetterSize(txtClassSelHelper,0.3,1.0);
TextDrawTextSize(txtClassSelHelper,400.0,40.0);
TextDrawFont(txtClassSelHelper, 2);
TextDrawSetShadow(txtClassSelHelper,0);
TextDrawSetOutline(txtClassSelHelper,1);
TextDrawBackgroundColor(txtClassSelHelper,0x000000FF);
TextDrawColor(txtClassSelHelper,0xFFFFFFFF);
}
//----------------------------------------------------------
ClassSel_SetupSelectedCity(playerid)
{
if(gPlayerCitySelection[playerid] == -1) {
gPlayerCitySelection[playerid] = CITY_LOS_SANTOS;
}
if(gPlayerCitySelection[playerid] == CITY_LOS_SANTOS) {
SetPlayerInterior(playerid,0);
SetPlayerCameraPos(playerid,1630.6136,-2286.0298,110.0);
SetPlayerCameraLookAt(playerid,1887.6034,-1682.1442,47.6167);
TextDrawShowForPlayer(playerid,txtLosSantos);
TextDrawHideForPlayer(playerid,txtSanFierro);
TextDrawHideForPlayer(playerid,txtLasVenturas);
}
else if(gPlayerCitySelection[playerid] == CITY_SAN_FIERRO) {
SetPlayerInterior(playerid,0);
SetPlayerCameraPos(playerid,-1300.8754,68.0546,129.4823);
SetPlayerCameraLookAt(playerid,-1817.9412,769.3878,132.6589);
TextDrawHideForPlayer(playerid,txtLosSantos);
TextDrawShowForPlayer(playerid,txtSanFierro);
TextDrawHideForPlayer(playerid,txtLasVenturas);
}
else if(gPlayerCitySelection[playerid] == CITY_LAS_VENTURAS) {
SetPlayerInterior(playerid,0);
SetPlayerCameraPos(playerid,1310.6155,1675.9182,110.7390);
SetPlayerCameraLookAt(playerid,2285.2944,1919.3756,68.2275);
TextDrawHideForPlayer(playerid,txtLosSantos);
TextDrawHideForPlayer(playerid,txtSanFierro);
TextDrawShowForPlayer(playerid,txtLasVenturas);
}
}
//----------------------------------------------------------
ClassSel_SwitchToNextCity(playerid)
{
gPlayerCitySelection[playerid]++;
if(gPlayerCitySelection[playerid] > CITY_LAS_VENTURAS) {
gPlayerCitySelection[playerid] = CITY_LOS_SANTOS;
}
PlayerPlaySound(playerid,1052,0.0,0.0,0.0);
gPlayerLastCitySelectionTick[playerid] = GetTickCount();
ClassSel_SetupSelectedCity(playerid);
}
//----------------------------------------------------------
ClassSel_SwitchToPreviousCity(playerid)
{
gPlayerCitySelection[playerid]--;
if(gPlayerCitySelection[playerid] < CITY_LOS_SANTOS) {
gPlayerCitySelection[playerid] = CITY_LAS_VENTURAS;
}
PlayerPlaySound(playerid,1053,0.0,0.0,0.0);
gPlayerLastCitySelectionTick[playerid] = GetTickCount();
ClassSel_SetupSelectedCity(playerid);
}
//----------------------------------------------------------
ClassSel_HandleCitySelection(playerid)
{
new Keys,ud,lr;
GetPlayerKeys(playerid,Keys,ud,lr);
if(gPlayerCitySelection[playerid] == -1) {
ClassSel_SwitchToNextCity(playerid);
return;
}
// only allow new selection every ~500 ms
if( (GetTickCount() - gPlayerLastCitySelectionTick[playerid]) < 500 ) return;
if(Keys & KEY_FIRE) {
gPlayerHasCitySelected[playerid] = 1;
TextDrawHideForPlayer(playerid,txtClassSelHelper);
TextDrawHideForPlayer(playerid,txtLosSantos);
TextDrawHideForPlayer(playerid,txtSanFierro);
TextDrawHideForPlayer(playerid,txtLasVenturas);
TogglePlayerSpectating(playerid,0);
return;
}
if(lr > 0) {
ClassSel_SwitchToNextCity(playerid);
}
else if(lr < 0) {
ClassSel_SwitchToPreviousCity(playerid);
}
}
//----------------------------------------------------------
public OnPlayerRequestClass(playerid, classid)
{
if(IsPlayerNPC(playerid)) return 1;
if(gPlayerHasCitySelected[playerid]) {
ClassSel_SetupCharSelection(playerid);
return 1;
} else {
if(GetPlayerState(playerid) != PLAYER_STATE_SPECTATING) {
TogglePlayerSpectating(playerid,1);
TextDrawShowForPlayer(playerid, txtClassSelHelper);
gPlayerCitySelection[playerid] = -1;
}
}
return 0;
}
//----------------------------------------------------------
public OnGameModeInit()
{
SetGameModeText("Grand Larceny");
ShowPlayerMarkers(PLAYER_MARKERS_MODE_GLOBAL);
ShowNameTags(1);
SetNameTagDrawDistance(40.0);
EnableStuntBonusForAll(0);
DisableInteriorEnterExits();
SetWeather(2);
SetWorldTime(11);
//UsePlayerPedAnims();
//ManualVehicleEngineAndLights();
//LimitGlobalChatRadius(300.0);
ClassSel_InitTextDraws();
// Player Class
AddPlayerClass(281,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(282,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(283,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(284,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(285,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(286,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(287,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(288,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(289,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(265,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(266,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(267,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(268,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(269,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(270,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(1,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(2,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(3,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(4,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(5,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(6,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(8,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(42,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(65,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
//AddPlayerClass(74,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(86,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(119,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(149,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(208,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(273,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(289,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(47,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(48,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(49,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(50,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(51,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(52,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(53,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(54,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(55,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(56,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(57,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(58,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(68,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(69,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(70,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(71,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(72,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(73,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(75,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(76,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(78,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(79,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(80,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(81,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(82,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(83,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(84,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(85,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(87,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(88,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(89,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(91,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(92,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(93,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(95,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(96,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(97,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(98,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
AddPlayerClass(99,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1);
// SPECIAL
total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/trains.txt");
total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/pilots.txt");
// LAS VENTURAS
total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/lv_law.txt");
total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/lv_airport.txt");
total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/lv_gen.txt");
// SAN FIERRO
total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/sf_law.txt");
total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/sf_airport.txt");
total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/sf_gen.txt");
// LOS SANTOS
total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/ls_law.txt");
total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/ls_airport.txt");
total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/ls_gen_inner.txt");
total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/ls_gen_outer.txt");
// OTHER AREAS
total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/whetstone.txt");
total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/bone.txt");
total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/flint.txt");
total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/tierra.txt");
total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/red_county.txt");
printf("Total vehicles from files: %d",total_vehicles_from_files);
return 1;
}
//----------------------------------------------------------
public OnPlayerUpdate(playerid)
{
if(!IsPlayerConnected(playerid)) return 0;
if(IsPlayerNPC(playerid)) return 1;
// changing cities by inputs
if( !gPlayerHasCitySelected[playerid] &&
GetPlayerState(playerid) == PLAYER_STATE_SPECTATING ) {
ClassSel_HandleCitySelection(playerid);
return 1;
}
// No weapons in interiors
if(GetPlayerInterior(playerid) != 0 && GetPlayerWeapon(playerid) != 0) {
SetPlayerArmedWeapon(playerid,0); // fists
return 0; // no syncing until they change their weapon
}
// Don't allow minigun
if(GetPlayerWeapon(playerid) == WEAPON_MINIGUN) {
Kick(playerid);
return 0;
}
/* No jetpacks allowed
if(GetPlayerSpecialAction(playerid) == SPECIAL_ACTION_USEJETPACK) {
Kick(playerid);
return 0;
}*/
/* For testing animations
new msg[128+1];
new animlib[32+1];
new animname[32+1];
thisanimid = GetPlayerAnimationIndex(playerid);
if(lastanimid != thisanimid)
{
GetAnimationName(thisanimid,animlib,32,animname,32);
format(msg, 128, "anim(%d,%d): %s %s", lastanimid, thisanimid, animlib, animname);
lastanimid = thisanimid;
SendClientMessage(playerid, 0xFFFFFFFF, msg);
}*/
return 1;
}
//----------------------------------------------------------

View File

@@ -0,0 +1,36 @@
#include <a_samp>
forward OneSecTimer();
new lasttick = 0;
main()
{
print("\n----------------------------------");
print(" This is a blank GameModeScript");
print("----------------------------------\n");
}
public OnGameModeInit()
{
// Set timer of 1 second.
SetTimer("OneSecTimer", 1000, 1);
print("GameModeInit()");
SetGameModeText("Timer Test");
AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
return 1;
}
public OneSecTimer() {
if(lasttick == 0) {
lasttick = GetTickCount();
return;
}
new sText[256];
format(sText,sizeof(sText),"GetTickCountOffset = %d",GetTickCount() - lasttick);
print(sText);
SendClientMessageToAll(0xFF0000, sText);
lasttick = GetTickCount();
}

View File

@@ -0,0 +1,31 @@
load 'plpgsql';
load 'plpgsql_lint';
DROP FUNCTION IF EXISTS list_sites();
CREATE OR REPLACE FUNCTION list_sites() RETURNS TABLE (fc json) AS
$func$
BEGIN
RETURN QUERY SELECT row_to_json(feat_col) FROM (
SELECT 'FeatureCollection' AS type, array_to_json(array_agg(feat)) AS features FROM (
SELECT DISTINCT ON (new_id) 'Feature' AS type, ST_ASGeoJSON(loc.geom)::json AS geometry, row_to_json(
(SELECT prop FROM (SELECT new_id) AS prop)) AS properties FROM location loc) AS feat) AS feat_col;
END;
$func$ LANGUAGE plpgsql;
DROP FUNCTION IF EXISTS get_observations(character varying, integer);
CREATE OR REPLACE FUNCTION get_observations(kind varchar, site_id integer) RETURNS TABLE (fc json) AS
$func$
BEGIN
IF kind = 'o2_abs' THEN
RETURN QUERY SELECT array_to_json(array_agg(row_to_json(obs))) FROM (
SELECT observation_date AS date, o2_abs AS value FROM oxygen WHERE new_id = site_id) AS obs;
ELSIF kind = 'o2_rel' THEN
RETURN QUERY SELECT array_to_json(array_agg(row_to_json(obs))) FROM (
SELECT observation_date AS date, o2_rel AS value FROM oxygen WHERE new_id = site_id) AS obs;
ELSIF kind = 'temp' THEN
RETURN QUERY SELECT array_to_json(array_agg(row_to_json(obs))) FROM (
SELECT observation_date AS date, temp AS value FROM oxygen WHERE new_id = site_id) AS obs;
END IF;
END;
$func$ LANGUAGE plpgsql;

207
samples/POV-Ray SDL/balcony.pov Executable file
View File

@@ -0,0 +1,207 @@
// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a
// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
// Persistence Of Vision Ray Tracer Scene Description File
// File: balcony.pov
// Desc: Povray demonstration scene
// Date: July/August 2001
// Auth: Christoph Hormann
//
// ***********************************************************************
//
// -------------------- 'balcony' demonstration scene --------------------
//
// written July-August 2001 by Christoph Hormann <chris_hormann@gmx.de>
//
// demonstrates use of various new or changed features:
//
// - isosurface (for the rail columns)
// - mesh2 object (table cloth)
// - uv-mapping (table cloth)
// - pattern image type (background heightfield)
// - slope pattern (background heightfield)
// - variable reflection (water & glass)
// - metallic reflection
// - conserve_energy
// - function pattern (water)
// - fading interior (water, drink)
// - 'circular' and 'orient' area_light
// - radiosity
// - photons (objects on the table)
//
// ***********************************************************************
//
// Command line options:
//
// -w240 -h320
// -w480 -h640 +a0.3
// -w600 -h800 +a0.3
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#version 3.6;
#include "functions.inc"
#include "colors.inc"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#declare AreaLight=on;
#declare Radiosity=on;
#declare Photons=on;
#declare TestLight=off;
#declare show_Fog=true;
#declare show_Water=true;
#declare show_Terrain=true;
#declare show_Building=true;
#declare show_Table=true;
#declare show_TableCloth=true;
#declare show_Chair=true;
#declare show_Table_Stuff=true;
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
global_settings{
max_trace_level 15
assumed_gamma 1
#if (Radiosity=on)
radiosity{
pretrace_start 0.08
pretrace_end 0.01
count 130
nearest_count 5
error_bound 0.3
recursion_limit 1
low_error_factor 0.5
gray_threshold 0.0
minimum_reuse 0.015
brightness 1.0
adc_bailout 0.01/2
normal on
}
#end
#if (Photons=on)
photons {
spacing 0.002
}
#end
}
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
// This scene uses a non-standard camera set-up.
// (See CAMERA in the included documentation for details.)
// If you are new to POV-Ray, you might want to try a different demo scene.
camera {
location <0.5, 0.5, 1.2>
direction y
sky z
up z
right x*image_width/image_height // keep propotions with any aspect ratio
look_at <5, 4.3, 0.9>
angle 36
}
/*
camera { // table detail camera
location <1.5, 1.5, 1.0>
direction y
sky z
up z
right x*image_width/image_height // keep propotions with any aspect ratio
look_at <3.3,2.52,0.5>
angle 30
}
*/
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#if (TestLight=on)
light_source {
<2, 2, 2>
color rgb 0.7
}
#end
light_source {
<3.0, -2.5, 2.6>*10000
color rgb <3.43,2.87,1.95>
#if (AreaLight=on)
area_light 400*x 400*y 4,4
jitter
circular
orient
#end
photons {
reflection on
refraction on
}
}
#if (show_Fog)
fog{
fog_type 2
fog_alt 1.2
fog_offset 0
color rgbt <0.60, 0.68, 0.82, 0.0>
distance 700
up z
}
#end
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "sky.inc"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#if (show_Water)
#include "water.inc"
#end
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#if (show_Building)
#include "building.inc"
#end
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#if (show_Terrain)
#include "terrain.inc"
#end
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#if (show_Table)
#include "table.inc"
#end
#if (show_TableCloth)
#include "table_cloth.inc"
#end
#if (show_Table_Stuff)
#include "table_stuff.inc"
#end
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#if (show_Chair)
#include "chair.inc"
#end
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/

117
samples/POV-Ray SDL/bglass.inc Executable file
View File

@@ -0,0 +1,117 @@
// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a
// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
// Persistence Of Vision Ray Tracer Include File
// File: bglass.inc
// Desc: drinking glass for 'balcony.pov' demonstration scene
// Date: July/August 2001
// Auth: Christoph Hormann
// Updated: 09Aug2008 (jh) for v3.7 distribution
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#if (version < 3.7)
#version 3.5;
#end
#declare Mat_Glass=
material {
texture {
pigment { color rgbt 1 }
finish {
ambient 0.0
diffuse 0.1
specular 0.5
roughness 0.05
reflection {
0.0, 1.0
fresnel on
}
conserve_energy
}
}
interior {
ior 1.5
fade_distance 0.1
fade_power 1001
fade_color <0.4,0.4,0.4>
}
}
#declare Mat_Liquid=
material {
texture {
pigment { color rgbt 1 }
finish {
ambient 0.0
diffuse 0.1
specular 0.5
roughness 0.01
reflection {
0.0, 1.0
fresnel on
}
conserve_energy
}
}
interior {
ior 1.3
fade_distance 0.03
fade_power 1001
fade_color <0.8,0.3,0.4>
}
}
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "shapes.inc"
#local Content_Shape=
merge {
cylinder {
0*z, 5*z, 3.0
}
object { Round_Cylinder_Merge (2*z, -3*z, 3.0, 0.25) }
material { Mat_Liquid }
}
#declare Glass=
union {
merge {
difference {
cylinder {
0.01*z, 14*z, 3.2
}
cylinder {
0*z, 10*z, 3.0
translate 4.6*z
}
object { Round_Cylinder_Merge (2*z, -3*z, 3.0, 0.25) translate 4.6*z }
}
torus {
3.1, 0.1
rotate 90*x
translate 14*z
}
material { Mat_Glass }
}
object { Content_Shape scale 0.99 translate 4.6*z }
scale 1.1
scale 0.01
}
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/

212
samples/POV-Ray SDL/building.inc Executable file
View File

@@ -0,0 +1,212 @@
// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a
// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
// Persistence Of Vision Ray Tracer Include File
// File: building.inc
// Desc: building for 'balcony.pov' demonstration scene
// Date: July/August 2001
// Auth: Christoph Hormann
// Updated: 09Aug2008 (jh) for v3.7 distribution
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#if (version < 3.7)
#version 3.5;
#end
#declare Tex_Stone=
texture {
pigment {
agate
color_map {
[0.7 color rgb <0.6,0.6,0.6> ]
[1.0 color rgb 0.46 ]
}
warp { turbulence <0.7,0.4,0.4> }
scale <0.3,1.2,1.2>*0.25
rotate -60*y
rotate 70*z
}
finish {
ambient 0.0//0.1
diffuse 0.5
specular 0.15
}
normal {
granite 0.2
warp {turbulence 1}
scale 0.1
}
}
#declare Tex_Floor_A=
texture {
pigment {
color rgb <0.6,0.6,0.6>
}
finish {
ambient 0.0
diffuse 0.5
specular 0.15
}
normal {
granite 0.2
warp {turbulence 1}
scale 0.25
translate 2
}
}
#declare Tex_Floor_B=
texture {
pigment {
color rgb <0.18,0.18,0.22>
}
finish {
ambient 0.0
diffuse 0.5
specular 0.15
}
normal {
granite 0.2
warp {turbulence 1}
scale 0.25
}
}
#declare Tex_Floor=
texture {
checker
texture { Tex_Floor_A },
texture { Tex_Floor_B }
scale 0.4
rotate 45*z
}
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "shapes.inc"
#declare fn_Rad=
function {
sin(pow(abs(z*0.4),1.8))+0.4
}
#declare Small_Column_part1=
isosurface {
function { min(sqrt( x*x + y*y ) - fn_Rad(x, y, z), sqrt( x*x + y*y + pow(abs(z*2),1.4)) - 1.0) }
max_gradient 1.8
//eval
accuracy 0.001
contained_by { box { -4, 4 } }
translate 4*z
scale 6
texture { Tex_Stone }
}
#declare Small_Column=
union {
object { Small_Column_part1 translate 3*z }
object { Round_Cylinder_Union (0, 3*z, 10, 1) }
object { Round_Cylinder_Union (51*z, 54*z, 10, 1) }
scale 0.01
translate 0.1*z
texture { Tex_Stone }
}
#declare Large_Column=
union {
object { Round_Cylinder_Merge (0.7*z, 0.8*z, 0.22, 0.02) }
cylinder { 0.75*z, 3*z, 0.2 }
object { Round_Box_Union (<-0.23,-0.23,-0.1>, <0.23,0.23,0.15>, 0.02) }
object { Round_Box_Union (<-0.20,-0.20,0.00>, <0.20,0.20,0.70>, 0.02) }
object { Round_Box_Union (<-0.23,-0.23,0.58>, <0.23,0.23,0.70>, 0.02) }
object { Round_Box_Union (<-0.26,-0.26,0.64>, <0.26,0.26,0.74>, 0.02) }
torus { 0.2, 0.06 rotate 90*x translate 2.74*z }
object { Round_Box_Union (<-0.26,-0.26,2.80>, <0.26,0.26,2.88>, 0.01) }
texture { Tex_Stone }
}
#declare Balustrade=
union {
object { Round_Box_Union (<0.0,-0.15,0>, <5,0.15,0.1>, 0.02) }
object { Round_Box_Union (<0.0,-0.15,0.64>, <5,0.15,0.74>, 0.02) }
#declare Cnt=0;
#while (Cnt<10)
object { Small_Column translate(Cnt*0.5+0.6)*x }
#declare Cnt=Cnt+1;
#end
texture { Tex_Stone }
}
#declare Walls=
union {
box { <-0.5,-0.5,-1>, <-2,5.5,3.2> }
box { <-0.5,-0.5,-1>, <5.5,-2,3.2> }
texture { Tex_Stone }
}
#declare Ceiling_Segment=
union {
box { <-0.20,-0.20,2.94>, <0.20,0.20,2.98> }
box { <-0.14,-0.14,2.94>, <0.14,0.14,3.01> }
}
#declare Ceiling=
union {
box { <5.6,5.6,3.04>, <-2,-2,3.5> }
union {
object { Round_Box_Union (<0.0,-0.26,3.1>, <6,0.26,2.88>, 0.02) rotate 180*z }
object { Round_Box_Union (<0.0,-0.26,3.1>, <6,0.26,2.88>, 0.02) rotate -90*z }
translate <5,5,0>
}
difference {
box { <5.0,5.0,2.95>, <-2,-2,3.5> }
object { Ceiling_Segment translate <4.44,4.44,0> }
object { Ceiling_Segment translate <4.44,3.94,0> }
object { Ceiling_Segment translate <3.94,4.44,0> }
object { Ceiling_Segment translate <3.94,3.94,0> }
object { Ceiling_Segment translate <4.44,3.44,0> }
object { Ceiling_Segment translate <3.44,4.44,0> }
object { Ceiling_Segment translate <3.94,3.44,0> }
object { Ceiling_Segment translate <3.44,3.94,0> }
object { Ceiling_Segment translate <4.44,2.94,0> }
object { Ceiling_Segment translate <2.94,4.44,0> }
}
texture { Tex_Stone }
}
#declare Base=
union {
box { <5.4,5.4,0>, <0,0,-1> texture { Tex_Floor } }
box { <6,6,-1>, <0,0,-2> }
texture { Tex_Stone }
}
object { Balustrade rotate 180*z translate <5,5,0> }
object { Balustrade rotate -90*z translate <5,5,0> }
object { Large_Column translate <5,5,0> }
object { Base }
object { Walls }
object { Ceiling }
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/

382
samples/POV-Ray SDL/chair.inc Executable file
View File

@@ -0,0 +1,382 @@
// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a
// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
// Persistence Of Vision Ray Tracer Include File
// File: chair.inc
// Desc: chair for 'balcony.pov' demonstration scene
// Date: July/August 2001
// Auth: Christoph Hormann
// Updated: 09Aug2008 (jh) for v3.7 distribution
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#if (version < 3.7)
#version 3.5;
#end
#declare Tex_Table_Foot=
texture {
pigment {
color rgb 0.4
}
finish {
ambient 0.0
diffuse 0.3
specular 0.4
roughness 0.01
metallic
reflection {
0.8
metallic
}
}
}
#declare Tex_Table_Foot_Bottom=
texture {
pigment {
color rgb 0.2
}
finish {
ambient 0.0
diffuse 0.3
specular 0.4
roughness 0.02
}
}
#declare Tex_Dark_Wood=
texture {
pigment {
bozo
color_map {
[0.3 color rgb <0.0,0.0,0.16> ]
[0.5 color rgb <0.0,0.0,0.08> ]
[0.7 color rgb <0.0,0.0,0.0> ]
}
scale <4,1,1>*0.036
}
finish {
ambient 0.09
diffuse 0.3
specular 0.5
roughness 0.025
reflection {
0.15
metallic
}
}
normal {
granite 0.1
scale 0.03
accuracy 0.007
}
}
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "shapes.inc"
#local Chair_Tube_Rad=0.01;
#local Chair_Tube_Curve_Rad=0.045;
#local Chair_Leg_Angle=7;
#local Chair_Leg_AngleA=4;
#local Chair_Leg_Depth=0.13;
#local Chair_Plate_Curve_Rad=0.03;
#local Chair_Plate_Thickness=0.008;
#local Chair_Plate_Width=0.48;
#local Chair_Plate_UWidth=0.22;
#local Chair_Plate_Height=0.45;
#local Chair_Plate_UAngle=5;
#local Chair_Plate_Depth=0.26;
#local Chair_Leg=
union {
intersection {
torus { Chair_Tube_Curve_Rad, Chair_Tube_Rad }
plane { x, 0 }
plane { -x, 0 rotate (-90+Chair_Leg_Angle)*y }
}
cylinder {
<-Chair_Tube_Curve_Rad,0,0>,
<-Chair_Tube_Curve_Rad,0,-Chair_Plate_Height+0.01>, Chair_Tube_Rad
rotate Chair_Leg_Angle*y
}
cylinder {
<0,0,Chair_Tube_Curve_Rad>,
<Chair_Leg_Depth,0,Chair_Tube_Curve_Rad>, Chair_Tube_Rad
}
object { Round_Cylinder_Merge (
<-Chair_Tube_Curve_Rad,0,-Chair_Plate_Height-0.003>,
<-Chair_Tube_Curve_Rad,0,-Chair_Plate_Height+0.025>, Chair_Tube_Rad+0.001, 0.005)
rotate Chair_Leg_Angle*y
texture { Tex_Table_Foot_Bottom }
}
translate -Chair_Leg_Depth*x
translate Chair_Plate_Height*cos(radians(Chair_Leg_Angle))*z
}
#macro Chair_Back(Rotate)
union {
intersection {
torus { Chair_Tube_Curve_Rad, Chair_Tube_Rad }
plane { x, 0 }
plane { z, 0 }
translate <-Chair_Leg_Depth, 0.0,Chair_Tube_Curve_Rad*2>
}
cylinder {
<-0.08, 0.0,Chair_Tube_Curve_Rad>,
< 0.05, 0.0,Chair_Tube_Curve_Rad>, Chair_Tube_Rad
}
intersection {
torus { 4, Chair_Tube_Rad }
plane { z, 0.4 }
plane { -z, 0 }
translate <-4-Chair_Leg_Depth-Chair_Tube_Curve_Rad, 0.0,Chair_Tube_Curve_Rad*2>
}
translate -Chair_Tube_Curve_Rad*z
rotate 3*y
rotate Rotate*x
translate Chair_Tube_Curve_Rad*z
translate Chair_Plate_Height*cos(radians(Chair_Leg_Angle))*z
}
#end
#local Chair_Base=
union {
union {
object { Chair_Back(-0.25) translate Chair_Tube_Rad*2*y }
object { Chair_Leg }
object { Chair_Leg rotate 180*z }
rotate -Chair_Leg_AngleA*x
translate -0.23*y
}
union {
object { Chair_Back( 0.25) translate -Chair_Tube_Rad*2*y }
object { Chair_Leg }
object { Chair_Leg rotate 180*z }
rotate Chair_Leg_AngleA*x
translate 0.23*y
}
texture { Tex_Table_Foot }
}
#local Chair_Plate=
union {
intersection {
merge {
torus { Chair_Plate_Curve_Rad, Chair_Plate_Thickness translate (Chair_Plate_Width/2)*y }
torus { Chair_Plate_Curve_Rad, Chair_Plate_Thickness translate -(Chair_Plate_Width/2)*y }
difference {
cylinder {
-(Chair_Plate_Width/2)*y, (Chair_Plate_Width/2)*y,
Chair_Plate_Curve_Rad+Chair_Plate_Thickness
}
cylinder {
-(Chair_Plate_Width/1.8)*y, (Chair_Plate_Width/1.8)*y,
Chair_Plate_Curve_Rad-Chair_Plate_Thickness
}
}
}
plane { -z, 0 rotate -20*y}
plane { -x, 0 }
}
merge {
cylinder {
<0.0, -Chair_Plate_Width/2, Chair_Plate_Curve_Rad>
<0.0, Chair_Plate_Width/2, Chair_Plate_Curve_Rad>,
Chair_Plate_Thickness
}
sphere { <0.0, -Chair_Plate_Width/2, Chair_Plate_Curve_Rad>, Chair_Plate_Thickness }
sphere { <0.0, Chair_Plate_Width/2, Chair_Plate_Curve_Rad>, Chair_Plate_Thickness }
rotate 70*y
}
box {
< 0.00, -Chair_Plate_Width/2, Chair_Plate_Curve_Rad-Chair_Plate_Thickness>,
<-Chair_Plate_Depth, Chair_Plate_Width/2, Chair_Plate_Curve_Rad+Chair_Plate_Thickness>
}
cylinder {
< 0.00, -Chair_Plate_Width/2, Chair_Plate_Curve_Rad>
<-Chair_Plate_Depth, -Chair_Plate_Width/2, Chair_Plate_Curve_Rad>,
Chair_Plate_Thickness
}
cylinder {
< 0.00, Chair_Plate_Width/2, Chair_Plate_Curve_Rad>
<-Chair_Plate_Depth, Chair_Plate_Width/2, Chair_Plate_Curve_Rad>,
Chair_Plate_Thickness
}
box {
<-Chair_Plate_Depth, -Chair_Plate_Width/2+Chair_Plate_Curve_Rad,
Chair_Plate_Curve_Rad-Chair_Plate_Thickness>,
<-Chair_Plate_Depth-Chair_Plate_Curve_Rad, Chair_Plate_Width/2-Chair_Plate_Curve_Rad,
Chair_Plate_Curve_Rad+Chair_Plate_Thickness>
}
cylinder {
<-Chair_Plate_Depth, Chair_Plate_Width/2-Chair_Plate_Curve_Rad,
Chair_Plate_Curve_Rad-Chair_Plate_Thickness>
<-Chair_Plate_Depth, Chair_Plate_Width/2-Chair_Plate_Curve_Rad,
Chair_Plate_Curve_Rad+Chair_Plate_Thickness>,
Chair_Plate_Curve_Rad
}
cylinder {
<-Chair_Plate_Depth, -Chair_Plate_Width/2+Chair_Plate_Curve_Rad,
Chair_Plate_Curve_Rad-Chair_Plate_Thickness>
<-Chair_Plate_Depth, -Chair_Plate_Width/2+Chair_Plate_Curve_Rad,
Chair_Plate_Curve_Rad+Chair_Plate_Thickness>,
Chair_Plate_Curve_Rad
}
torus {
Chair_Plate_Curve_Rad, Chair_Plate_Thickness
rotate 90*x
translate <-Chair_Plate_Depth,
-Chair_Plate_Width/2+Chair_Plate_Curve_Rad, Chair_Plate_Curve_Rad>
}
torus {
Chair_Plate_Curve_Rad, Chair_Plate_Thickness
rotate 90*x
translate <-Chair_Plate_Depth,
Chair_Plate_Width/2-Chair_Plate_Curve_Rad, Chair_Plate_Curve_Rad>
}
translate (Chair_Plate_Height+0.03)*z
translate 0.18*x
}
#local Chair_Back_Plate=
union {
intersection {
union {
intersection {
difference {
cylinder { <0.0, -0.30, 0.0>, <0.0, 0.30, 0.0>, 4+2*Chair_Plate_Thickness }
cylinder { <0.0, -0.40, 0.0>, <0.0, 0.40, 0.0>, 4 }
}
plane { y, Chair_Plate_UWidth rotate Chair_Plate_UAngle*x }
plane { -y, Chair_Plate_UWidth rotate -Chair_Plate_UAngle*x }
}
torus {
4+Chair_Plate_Thickness, Chair_Plate_Thickness
scale <1, 1, 1/cos(radians(Chair_Plate_UAngle))>
rotate Chair_Plate_UAngle*x
translate Chair_Plate_UWidth*y
}
torus {
4+Chair_Plate_Thickness, Chair_Plate_Thickness
scale <1, 1, 1/cos(radians(Chair_Plate_UAngle))>
rotate -Chair_Plate_UAngle*x
translate -Chair_Plate_UWidth*y
}
}
plane { z, 0 rotate -8*y }
plane { -z, 0 rotate -0.2*y }
}
intersection {
union {
cylinder {
<4+Chair_Plate_Thickness, 0.3, 0.0>,
<4+Chair_Plate_Thickness, -0.3, 0.0>,
Chair_Plate_Thickness
rotate -0.2*y
}
cylinder {
<4+Chair_Plate_Thickness, 0.3, 0.0>,
<4+Chair_Plate_Thickness, -0.3, 0.0>,
Chair_Plate_Thickness
rotate -8*y
}
}
plane { y, Chair_Plate_UWidth rotate Chair_Plate_UAngle*x }
plane { -y, Chair_Plate_UWidth rotate -Chair_Plate_UAngle*x }
}
sphere {
<4+Chair_Plate_Thickness, Chair_Plate_UWidth, 0.0>,
Chair_Plate_Thickness
rotate -0.2*y
}
sphere {
<4+Chair_Plate_Thickness, -Chair_Plate_UWidth, 0.0>,
Chair_Plate_Thickness
rotate -0.2*y
}
sphere {
<4+Chair_Plate_Thickness,
Chair_Plate_UWidth-4*sin(radians(Chair_Plate_UAngle))*sin(radians(8)), 0.0>,
Chair_Plate_Thickness
rotate -8*y
}
sphere {
<4+Chair_Plate_Thickness,
-Chair_Plate_UWidth+4*sin(radians(Chair_Plate_UAngle))*sin(radians(8)), 0.0>,
Chair_Plate_Thickness
rotate -8*y
}
translate <-4-Chair_Leg_Depth-Chair_Tube_Curve_Rad+Chair_Tube_Rad,
0.0, Chair_Tube_Curve_Rad*2>
translate -Chair_Tube_Curve_Rad*z
rotate 3*y
translate Chair_Tube_Curve_Rad*z
translate Chair_Plate_Height*cos(radians(Chair_Leg_Angle))*z
}
union {
object { Chair_Back_Plate texture { Tex_Dark_Wood rotate 90*y } }
object { Chair_Plate texture { Tex_Dark_Wood } }
object { Chair_Base }
scale 0.92
rotate -60*z
translate <2.68,3.35,0>
}
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/

12217
samples/POV-Ray SDL/cloth.inc Executable file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,188 @@
// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a
// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
// Persistence of Vision Ray Tracer Scene Description File
// File: gamma_showcase.pov
// Vers: 3.7
// Desc: Gamma Handling Test Scene - An arrangement of spheres on a marble plane
// Date: 2010-12-21
// Auth: Christoph Lipka
//
// +w640 +h480 +a0.3 +am1 +fN -d File_Gamma=sRGB Output_File_Name=gamma_showcase.png
// +w640 +h480 +a0.3 +am1 +fN -d File_Gamma=1.0 Output_File_Name=gamma_showcase_linear.png
// +w320 +h240 +a0.3 +am1 +fN -d File_Gamma=sRGB Output_File_Name=gamma_showcase_ref0.png Declare=Stripes=off
// +w320 +h240 +a0.3 +am1 +fN -d File_Gamma=sRGB Output_File_Name=gamma_showcase_ref1.png Declare=Stripes=off Declare=Gamma=1.2
// +w320 +h240 +a0.3 +am1 +fN -d File_Gamma=sRGB Output_File_Name=gamma_showcase_ref2.png Declare=Stripes=off Declare=Gamma=0.8
// +w640 +h480 +a0.3 +am1 -f +d
#version 3.7;
#include "colors.inc"
#include "stones.inc"
#ifndef (Stripes)
#declare Stripes = on;
#end
#ifndef (Gamma)
#declare Gamma = 1.0;
#end
global_settings {
max_trace_level 5
assumed_gamma 1.0
radiosity {
pretrace_start 0.08
pretrace_end 0.01
count 35
nearest_count 5
error_bound 1.8
recursion_limit 2
low_error_factor .5
gray_threshold 0.0
minimum_reuse 0.015
brightness 1
adc_bailout 0.01/2
}
}
#default {
texture {
pigment {rgb 1}
finish {
ambient 0.0
diffuse 0.6
specular 0.6 roughness 0.001
reflection { 0.0 1.0 fresnel on }
conserve_energy
}
}
}
// ----------------------------------------
#local TestRed = rgb <0.5,0.1,0.1>;
#local TestGreen = rgb <0.1,0.5,0.1>;
#local TestBlue = rgb <0.1,0.1,0.5>;
#local CameraFocus = <0,0.5,0>;
#local CameraDist = 8;
#local CameraDepth = 1.8;
#local CameraTilt = 20;
camera {
location <0,0,0>
direction z*CameraDepth
right x*image_width/image_height
up y
translate <0,0,-CameraDist>
rotate x*CameraTilt
translate CameraFocus
}
#macro LightSource(Pos,Color)
light_source {
Pos
color Color
spotlight
point_at <0,0,0>
radius 175/vlength(Pos)
falloff 200/vlength(Pos)
area_light x*vlength(Pos)/10, y*vlength(Pos)/10, 9,9 adaptive 1 jitter circular orient
}
#end
LightSource(<-500,500,-500>,TestRed + <0.2,0.2,0.2>)
LightSource(< 0,500,-500>,TestGreen + <0.2,0.2,0.2>)
LightSource(< 500,500,-500>,TestBlue + <0.2,0.2,0.2>)
// ----------------------------------------
#macro DarkStripeBW(TargetBrightness)
#if (TargetBrightness < 0.5)
(0.0)
#else
(TargetBrightness*2 - 1.0)
#end
#end
#macro BrightStripeBW(TargetBrightness)
#if (TargetBrightness < 0.5)
(TargetBrightness*2)
#else
(1.0)
#end
#end
#macro DarkStripeRGB(TargetColor)
<DarkStripeBW(TargetColor.red),DarkStripeBW(TargetColor.green),DarkStripeBW(TargetColor.blue)>
#end
#macro BrightStripeRGB(TargetColor)
<BrightStripeBW(TargetColor.red),BrightStripeBW(TargetColor.green),BrightStripeBW(TargetColor.blue)>
#end
#macro StripedPigment(TargetColor)
#if (Stripes)
function { abs(mod(abs(image_height*CameraDepth*y/z+0.5),2.0)-1.0) }
color_map {
[0.5 color rgb DarkStripeRGB(TargetColor) ]
[0.5 color rgb BrightStripeRGB(TargetColor) ]
}
translate <0,0,-CameraDist>
rotate x*CameraTilt
translate CameraFocus
#else
color TargetColor
#end
#end
plane {
y, 0
texture { T_Stone11 }
interior { ior 1.5 }
}
#macro GammaAdjust(C,G)
#local C2 = color rgbft <pow(C.red,G),pow(C.green,G),pow(C.blue,G),pow(C.filter,G),pow(C.transmit,G)>;
(C2)
#end
#macro TestSphere(Pos,Radius,TargetColor,Split)
sphere {
Pos + y*Radius, Radius
texture { pigment { color GammaAdjust(TargetColor,Gamma) } }
interior { ior 1.5 }
}
#if (Split)
sphere {
Pos + y*Radius + x*0.001, Radius
texture { pigment { StripedPigment(TargetColor) } }
interior { ior 1.5 }
}
#end
#end
TestSphere(<-2,0,1>, 1, TestRed, true)
TestSphere(< 0,0,1>, 1, TestGreen, true)
TestSphere(< 2,0,1>, 1, TestBlue, true)
#local Steps = 6;
#for(I,0,1,1/Steps)
#if (I < 0.5)
#local Color2 = TestRed;
#else
#local Color2 = TestBlue;
#end
#local P = abs(I-0.5)*2;
TestSphere(<I*4-2,0,-0.5>, 2/Steps, (1-P)*TestGreen + P*Color2, true)
#end
#local Steps = 8;
#for(I,0,1,1/Steps)
TestSphere(<I*4-2,0,-1.5>, 2/Steps, rgb I, true)
TestSphere(<I*4-2,0,-2.0>, 2/Steps, GammaAdjust(rgb I, 2.2*Gamma), false)
#end

91
samples/POV-Ray SDL/sky.inc Executable file
View File

@@ -0,0 +1,91 @@
// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a
// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
// Persistence Of Vision Ray Tracer Include File
// File: sky.inc
// Desc: sky for 'balcony.pov' demonstration scene
// Date: July/August 2001
// Auth: Christoph Hormann
// Updated: 09Aug2008 (jh) for v3.7 distribution
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#if (version < 3.7)
#version 3.5;
#end
#local P_Clouds=
pigment {
gradient z
pigment_map {
[ 0.0 color rgbt 1]
[ 0.1
bozo
color_map {
[0.0 color rgbt < 0.85, 0.88, 0.94, 0.0>]
[0.15 color rgbt < 0.91, 0.96, 0.99, 0.0>]
[0.35 color rgbt < 0.91, 0.96, 0.99, 1.0>]
}
turbulence 0.75
lambda 2.4
omega 0.6
octaves 8
scale <0.4,0.4,0.15>
]
[ 0.4
bozo
color_map {
[0.0 color rgbt < 0.85, 0.88, 0.94, 0.0>]
[0.15 color rgbt < 0.91, 0.96, 0.99, 0.0>]
[0.35 color rgbt < 0.91, 0.96, 0.99, 1.0>]
}
turbulence 0.75
lambda 2.4
omega 0.6
octaves 8
scale <0.4,0.4,0.15>
]
[ 0.65 color rgbt 1]
}
rotate 10*z
}
#local Tex_Sky =
texture {
pigment {
function { abs(z) }
color_map {
[0.0 color rgb < 0.640, 0.685, 0.800 >]
[0.3 color rgb < 0.400, 0.550, 0.900 >]
}
turbulence 0.05
}
finish {
diffuse 0
ambient 1
}
}
texture {
pigment { P_Clouds }
finish {
diffuse 0
ambient 1
}
}
sphere {
<0, 0, 0>, 1
texture { Tex_Sky }
scale<1000000, 1000000, 300000>
no_shadow
hollow on
photons{ collect off }
}
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/

171
samples/POV-Ray SDL/table.inc Executable file
View File

@@ -0,0 +1,171 @@
// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a
// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
// Persistence Of Vision Ray Tracer Include File
// File: table.inc
// Desc: table for 'balcony.pov' demonstration scene
// Date: July/August 2001
// Auth: Christoph Hormann
// Updated: 09Aug2008 (jh) for v3.7 distribution
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#if (version < 3.7)
#version 3.5;
#end
#declare Tex_Table_Foot=
texture {
pigment {
color rgb 0.4
}
finish {
ambient 0.0
diffuse 0.3
specular 0.4
roughness 0.01
metallic
reflection {
0.8
metallic
}
}
}
#declare Tex_Table_Foot_Bottom=
texture {
pigment {
color rgb 0.2
}
finish {
ambient 0.0
diffuse 0.3
specular 0.4
roughness 0.02
}
}
#declare Tex_Dark_Wood=
texture {
pigment {
bozo
color_map {
[0.3 color rgb <0.0,0.0,0.16> ]
[0.5 color rgb <0.0,0.0,0.08> ]
[0.7 color rgb <0.0,0.0,0.0> ]
}
scale <4,1,1>*0.036
}
finish {
ambient 0.09
diffuse 0.3
specular 0.5
roughness 0.025
reflection {
0.15
metallic
}
}
normal {
granite 0.1
scale 0.03
accuracy 0.007
}
scale 0.5
rotate 90*y
}
#declare Tex_Dark_Wood2 =
texture {
pigment {
wood
color_map {
[ 0.0000 color rgb<0.6431, 0.3176, 0.0824> ]
[ 0.1000 color rgb<0.6196, 0.2824, 0.0588> ]
[ 0.2000 color rgb<0.7137, 0.3725, 0.1529> ]
[ 0.3000 color rgb<0.7529, 0.4157, 0.1922> ]
[ 0.4000 color rgb<0.8157, 0.4941, 0.2588> ]
[ 0.5000 color rgb<0.7686, 0.4745, 0.2196> ]
[ 0.6000 color rgb<0.8471, 0.5647, 0.2980> ]
[ 0.7000 color rgb<0.8627, 0.5843, 0.3137> ]
[ 0.8000 color rgb<0.8902, 0.6314, 0.3529> ]
[ 0.9000 color rgb<0.8627, 0.6118, 0.3294> ]
[ 1.0000 color rgb<0.8392, 0.5922, 0.3098> ]
}
turbulence <0.075, 0.075, 0.65>
scale <0.04, 0.04, 0.6>
scale 0.27
rotate 91*y
translate -0.1*z
}
finish {
ambient 0.0
diffuse 0.4
specular 0.3
roughness 0.025
reflection {
0.17
metallic
}
}
normal {
granite 0.015
scale <0.02, 0.02, 0.06>
rotate 91*y
accuracy 0.007
}
}
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "shapes.inc"
#declare Table_Height=0.66;
#declare Table=
union {
torus { 0.49, 0.01 sturm rotate 90*x translate z*(Table_Height-0.01) }
cylinder { z*(Table_Height-0.05), z*(Table_Height-0.01), 0.5 }
cylinder { z*(Table_Height-0.01), z*Table_Height, 0.49 }
union {
cylinder { z*0.01, z*0.63, 0.03 translate 0.37*x }
cylinder { z*0.01, z*0.63, 0.03 translate 0.37*x rotate 120*z }
cylinder { z*0.01, z*0.63, 0.03 translate 0.37*x rotate 240*z }
texture { Tex_Table_Foot }
rotate -70*z
}
union {
object { Round_Cylinder_Merge (0, z*0.03, 0.031, 0.005) translate 0.37*x }
object { Round_Cylinder_Merge (0, z*0.03, 0.031, 0.005) translate 0.37*x rotate 120*z }
object { Round_Cylinder_Merge (0, z*0.03, 0.031, 0.005) translate 0.37*x rotate 240*z }
texture { Tex_Table_Foot_Bottom }
rotate -70*z
}
texture { Tex_Dark_Wood2 }
#if (show_TableCloth)
scale <0.97, 0.97, 0.99>
#else
scale <0.97, 0.97, 1.00>
#end
}
object { Table translate <3.3,2.52,0> }
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/

View File

@@ -0,0 +1,91 @@
// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a
// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
// Persistence Of Vision Ray Tracer Include File
// File: table_cloth.inc
// Desc: table cloth for 'balcony.pov' demonstration scene
// Date: July/August 2001
// Auth: Christoph Hormann
// Updated: 09Aug2008 (jh) for v3.7 distribution
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#if (version < 3.7)
#version 3.5;
#end
#declare ClCol01=color rgb <0.8, 0.7, 0.4>;
#declare ClCol02=color rgb <0.07, 0.12, 0.4>;
#declare CPig1=
pigment {
gradient x
triangle_wave
color_map {
[0.04 ClCol01 ]
[0.04 ClCol02 ]
[0.06 ClCol02 ]
[0.06 ClCol01 ]
[0.09 ClCol01 ]
[0.09 ClCol02 ]
[0.13 ClCol02 ]
[0.13 ClCol01 ]
[0.16 ClCol01 ]
[0.16 ClCol02 ]
[0.18 ClCol02 ]
[0.18 ClCol01 ]
}
}
#declare CPig2=
pigment {
gradient y
triangle_wave
pigment_map {
[0.04 CPig1 ]
[0.04 ClCol02 ]
[0.06 ClCol02 ]
[0.06 CPig1 ]
[0.09 CPig1 ]
[0.09 ClCol02 ]
[0.13 ClCol02 ]
[0.13 CPig1 ]
[0.16 CPig1 ]
[0.16 ClCol02 ]
[0.18 ClCol02 ]
[0.18 CPig1 ]
}
}
/*
#include "clothutil.inc"
ReadClothFile("cloth.cth")
DrawSmoothTriangles2(Points, 90, 90, on, true, "cloth.inc")
*/
#declare Table_Cloth=
mesh2{
#include "cloth.inc"
texture {
uv_mapping
pigment {
CPig2
}
finish {
ambient 0.0
diffuse 0.6
}
normal {
quilted 0.16
scale 0.008
}
}
rotate -30*z
}
object { Table_Cloth translate <3.3,2.52,0> }
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/

View File

@@ -0,0 +1,136 @@
// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a
// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
// Persistence Of Vision Ray Tracer Include File
// File: table_stuff.inc
// Desc: stuff on the table for 'balcony.pov' demonstration scene
// Date: July/August 2001
// Auth: Christoph Hormann
// Updated: 09Aug2008 (jh) for v3.7 distribution
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#if (version < 3.7)
#version 3.5;
#end
#declare Mat_Glass=
material {
texture {
pigment { color rgbt 1 }
finish {
ambient 0.0
diffuse 0.1
specular 0.5
roughness 0.01
reflection {
0.15, 1.0
fresnel on
}
conserve_energy
}
}
interior {
ior 1.5
fade_distance 0.1
fade_power 1001
fade_color <0.4,0.4,0.8>
}
}
#declare Tex_Box_Metal=
texture {
pigment {
color rgb <0.5,0.45,0.4>
}
finish {
ambient 0.0
diffuse 0.05
specular 0.5
roughness 0.01
metallic
reflection {
0.8
metallic
}
}
}
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "shapes.inc"
#include "functions.inc"
#declare Table_Height=0.66;
#declare Box_Iso=
isosurface {
function { -f_superellipsoid(x,y,z, 0.2, 0.2) }
contained_by {box { -1.2, 1.2 }}
max_gradient 1.1
translate 1.001*z
}
#declare Box=
union {
intersection {
object { Box_Iso }
object { Round_Box_Merge (<-1.1,-1.1,1.6>, <1.1,1.1,-0.1>, 0.4) }
}
intersection {
object { Box_Iso }
object { Round_Box_Merge (<-1.1,-1.1,1.6>, <1.1,1.1,2.2>, 0.4) }
scale 1.01
rotate 0.2
}
torus {
0.6, 0.13
rotate 90*z
translate 2*z
}
scale <1,1,0.6>
}
#include "bglass.inc"
union {
object {
Glass
photons{
target 1.0
refraction on
reflection on
}
translate <-0.16,-0.1,0>
}
object {
Box
texture {
Tex_Box_Metal
}
photons{
target 1.0
reflection on
}
scale 0.06
translate <-0.1,0.2,0>
}
translate <3.3,2.52,Table_Height>
}
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/

118
samples/POV-Ray SDL/terrain.inc Executable file
View File

@@ -0,0 +1,118 @@
// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a
// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
// Persistence of Vision Ray Tracer Include File
// File: terrain.inc
// Desc: terrain for 'balcony.pov' demonstration scene
// Date: July/August 2001
// Auth: Christoph Hormann
// Updated: 09Aug2008 (jh) for v3.7 distribution
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#if (version < 3.7)
#version 3.5;
#end
#declare Tex_Vegetation=
texture {
pigment {
bozo
color_map {
[0.3 color rgb <0.20,0.35,0.1>*0.9 ]
[0.8 color rgb <0.12,0.35,0.1>*0.7 ]
}
scale 4
}
finish {
ambient 0.0
diffuse 0.5
brilliance 0.8
specular 0.1
}
normal {
granite 0.4
}
}
#declare Tex_Stone=
texture {
pigment {
color rgb <0.6,0.6,0.6>
}
finish {
ambient 0.0//0.1
diffuse 0.45
specular 0.15
}
}
#declare Tex_Terrain=
texture {
slope -z
texture_map {
[0.34 Tex_Vegetation ]
[0.34 Tex_Stone ]
}
}
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#declare Terrain=
object {
height_field {
function 300,300 {
pigment {
function { 1-(min(pow(x*x + z*z,1.3), 1) -0.0001) }
color_map {
[0.0 color rgb 0.0]
[1.0 color rgb 1.0]
}
scale 0.35
translate <0.5,0,0.5>
warp { turbulence 0.3 }
scale 3
warp { turbulence 0.4 lambda 2.2 octaves 8 }
scale 1/3
rotate -90*x
translate -0.5*y
scale <1, -1, 1>
translate 0.5*y
}
}
water_level 0.02
rotate 90*x
rotate -10*z
scale <4, 4, 1>
scale 30
}
}
union {
object {
Terrain
translate <130, 368, -10>
}
object {
Terrain
rotate -180*z
scale 0.3
translate <90, 97, -6>
}
texture { Tex_Terrain }
}
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/

74
samples/POV-Ray SDL/water.inc Executable file
View File

@@ -0,0 +1,74 @@
// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a
// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
// Persistence Of Vision Ray Tracer Include File
// File: water.inc
// Desc: water for 'balcony.pov' demonstration scene
// Date: July/August 2001
// Auth: Christoph Hormann
// Updated: 09Aug2008 (jh) for v3.7 distribution
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#if (version < 3.7)
#version 3.5;
#end
#include "functions.inc"
#declare RMF=function{ f_ridged_mf(x, y, z, 0.07, 2.2, 7, 0.6, 0.9, 1)}
#declare M_Watx4 =
material {
texture {
pigment {
color rgbt <0.2, 0.22, 0.21, 0.94>
}
finish {
diffuse 0.0
ambient -0.2
reflection {
0.0, 0.95
fresnel on
}
conserve_energy
specular 0.4
roughness 0.007
}
normal{
function { RMF(x, y, z) } 0.8
scale 0.3
}
}
interior {
ior 1.31
fade_distance 5
fade_power 1001.0
fade_color <0.02, 0.20, 0.06>
}
}
plane {
z, -1
material {
M_Watx4
}
hollow on
}
plane {
z, -12.0
texture {
pigment { color rgb 0 }
finish { ambient 0.0 diffuse 0.0 }
}
hollow on
}
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/

10
samples/Perl/Sample.pod Normal file
View File

@@ -0,0 +1,10 @@
use strict;
use warnings;
package DZT::Sample;
sub return_arrayref_of_values_passed {
my $invocant = shift;
return \@_;
}
1;

View File

@@ -12,7 +12,6 @@ unless EVAL 'EVAL("1", :lang<perl5>)' {
die unless
EVAL(q/
package My::Hash;
use strict;
sub new {
my ($class, $ref) = @_;

280
samples/Prolog/queues.yap Normal file
View File

@@ -0,0 +1,280 @@
% This file has been included as an YAP library by Vitor Santos Costa, 1999
% File : QUEUES.PL
% Author : R.A.O'Keefe
% Updated: Friday November 18th, 1983, 8:09:31 pm
% Purpose: define queue operations
% Needs : lib(lists) for append/3.
/** @defgroup Queues Queues
@ingroup library
@{
The following queue manipulation routines are available once
included with the `use_module(library(queues))` command. Queues are
implemented with difference lists.
*/
/**
@pred make_queue(+ _Queue_)
Creates a new empty queue. It should only be used to create a new queue.
*/
/** @pred empty_queue(+ _Queue_)
Tests whether the queue is empty.
*/
/** @pred head_queue(+ _Queue_, ? _Head_)
Unifies Head with the first element of the queue.
*/
/** @pred join_queue(+ _Element_, + _OldQueue_, - _NewQueue_)
Adds the new element at the end of the queue.
*/
/** @pred jump_queue(+ _Element_, + _OldQueue_, - _NewQueue_)
Adds the new element at the front of the list.
*/
/** @pred length_queue(+ _Queue_, - _Length_)
Counts the number of elements currently in the queue.
*/
/** @pred list_join_queue(+ _List_, + _OldQueue_, - _NewQueue_)
Ads the new elements at the end of the queue.
*/
/** @pred list_jump_queue(+ _List_, + _OldQueue_, + _NewQueue_)
Adds all the elements of _List_ at the front of the queue.
*/
/** @pred list_to_queue(+ _List_, - _Queue_)
Creates a new queue with the same elements as _List._
*/
/** @pred queue_to_list(+ _Queue_, - _List_)
Creates a new list with the same elements as _Queue_.
*/
/** @pred serve_queue(+ _OldQueue_, + _Head_, - _NewQueue_)
Removes the first element of the queue for service.
*/
:- module(queues, [
make_queue/1, % create empty queue
join_queue/3, % add element to end of queue
list_join_queue/3, % add many elements to end of queue
jump_queue/3, % add element to front of queue
list_jump_queue/3, % add many elements to front of queue
head_queue/2, % look at first element of queue
serve_queue/3, % remove first element of queue
length_queue/2, % count elements of queue
empty_queue/1, % test whether queue is empty
list_to_queue/2, % convert list to queue
queue_to_list/2 % convert queue to list
]).
:- use_module(library(lists), [append/3]).
/*
:- mode
make_queue(-),
join_queue(+, +, -),
list_join_queue(+, +, -),
jump_queue(+, +, -),
list_jump_queue(+, +, -),
head_queue(+, ?),
serve_queue(+, ?, -),
length_queue(+, ?),
length_queue(+, +, +, -),
empty_queue(+),
list_to_queue(+, -),
queue_to_list(+, -),
queue_to_list(+, +, -).
*/
/* In this package, a queue is represented as a term Front-Back, where
Front is a list and Back is a tail of that list, and is normally a
variable. join_queue will only work when the Back is a variable,
the other routines will accept any tail. The elements of the queue
are the list difference, that is, all the elements starting at Front
and stopping at Back. Examples:
[a,b,c,d,e|Z]-Z has elements a,b,c,d,e
[a,b,c,d,e]-[d,e] has elements a,b,c
Z-Z has no elements
[1,2,3]-[1,2,3] has no elements
*/
% make_queue(Queue)
% creates a new empty queue. It will also match empty queues, but
% because Prolog doesn't do the occurs check, it will also match
% other queues, creating circular lists. So this should ONLY be
% used to make new queues.
make_queue(X-X).
% join_queue(Element, OldQueue, NewQueue)
% adds the new element at the end of the queue. The old queue is
% side-effected, so you *can't* do
% join_queue(1, OldQ, NewQ1),
% join_queue(2, OldQ, NewQ2).
% There isn't any easy way of doing that, sensible though it might
% be. You *can* do
% join_queue(1, OldQ, MidQ),
% join_queue(2, MidQ, NewQ).
% See list_join_queue.
join_queue(Element, Front-[Element|Back], Front-Back).
% list_join_queue(List, OldQueue, NewQueue)
% adds the new elements at the end of the queue. The elements are
% added in the same order that they appear in the list, e.g.
% list_join_queue([y,z], [a,b,c|M]-M, [a,b,c,y,z|N]-N).
list_join_queue(List, Front-OldBack, Front-NewBack) :-
append(List, OldBack, NewBack).
% jump_queue(Element, OldQueue, NewQueue)
% adds the new element at the front of the list. Unlike join_queue,
% jump_queue(1, OldQ, NewQ1),
% jump_queue(2, OldQ, NewQ2)
% *does* work, though if you add things at the end of NewQ1 they
% will also show up in NewQ2. Note that
% jump_queue(1, OldQ, MidQ),
% jump_queue(2, MidQ, NewQ)
% makes NewQ start 2, 1, ...
jump_queue(Element, Front-Back, [Element|Front]-Back).
% list_jump_queue(List, OldQueue, NewQueue)
% adds all the elements of List at the front of the queue. There are
% two ways we might do this. We could add all the elements one at a
% time, so that they would appear at the beginning of the queue in the
% opposite order to the order they had in the list, or we could add
% them in one lump, so that they have the same order in the queue as
% in the list. As you can easily add the elements one at a time if
% that is what you want, I have chosen the latter.
list_jump_queue(List, OldFront-Back, NewFront-Back) :-
append(List, OldFront, NewFront).
% reverse(List, OldFront, NewFront). % for the other definition
% head_queue(Queue, Head)
% unifies Head with the first element of the queue. The tricky part
% is that we might be at the end of a queue: Back-Back, with Back a
% variable, and in that case this predicate should not succeed, as we
% don't know what that element is or whether it exists yet.
head_queue(Front-Back, Head) :-
Front \== Back, % the queue is not empty
Front = [Head|_].
% serve_queue(OldQueue, Head, NewQueue)
% removes the first element of the queue for service.
serve_queue(OldFront-Back, Head, NewFront-Back) :-
OldFront \== Back,
OldFront = [Head|NewFront].
% empty_queue(Queue)
% tests whether the queue is empty. If the back of a queue were
% guaranteed to be a variable, we could have
% empty_queue(Front-Back) :- var(Front).
% but I don't see why you shouldn't be able to treat difference
% lists as queues if you want to.
empty_queue(Front-Back) :-
Front == Back.
% length_queue(Queue, Length)
% counts the number of elements currently in the queue. Note that
% we have to be careful in checking for the end of the list, we
% can't test for [] the way length(List) does.
length_queue(Front-Back, Length) :-
length_queue(Front, Back, 0, N),
Length = N.
length_queue(Front, Back, N, N) :-
Front == Back, !.
length_queue([_|Front], Back, K, N) :-
L is K+1,
length_queue(Front, Back, L, N).
% list_to_queue(List, Queue)
% creates a new queue with the same elements as List.
list_to_queue(List, Front-Back) :-
append(List, Back, Front).
% queue_to_list(Queue, List)
% creates a new list with the same elements as Queue.
queue_to_list(Front-Back, List) :-
queue_to_list(Front, Back, List).
queue_to_list(Front, Back, Ans) :-
Front == Back, !, Ans = [].
queue_to_list([Head|Front], Back, [Head|Tail]) :-
queue_to_list(Front, Back, Tail).

View File

@@ -0,0 +1,124 @@
# Copyright 2015 The Bazel Authors. All Rights Reserved.
#
# 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.
"""Build definitions for JavaScript binaries compiled with the Closure Compiler.
A single file is produced with the _compiled.js suffix.
By default, the name of the entry point is assumed to be the same as that of the
build target. This behaviour may be overridden with the "main" attribute.
The optimization level may be set with the "compilation_level" attribute.
Supported values are: unobfuscated, simple, and advanced.
Example:
closure_js_binary(
name = "hello",
compilation_level = "simple",
language_in = "ecmascript6",
language_out = "ecmascript3",
externs = ["//third_party/javascript/google_cast/cast.js"],
deps = [
"@closure_library//:closure_library",
":hello_lib",
],
)
This rule will produce hello_combined.js.
"""
_COMPILATION_LEVELS = {
"whitespace_only": [
"--compilation_level=WHITESPACE_ONLY",
"--formatting=PRETTY_PRINT"
],
"simple": ["--compilation_level=SIMPLE"],
"advanced": ["--compilation_level=ADVANCED"]
}
_SUPPORTED_LANGUAGES = {
"es3": ["ES3"],
"ecmascript3": ["ECMASCRIPT3"],
"es5": ["ES5"],
"ecmascript5": ["ECMASCRIPT5"],
"es5_strict": ["ES5_STRICT"],
"ecmascript5_strict": ["ECMASCRIPT5_STRICT"],
"es6": ["ES6"],
"ecmascript6": ["ECMASCRIPT6"],
"es6_strict": ["ES6_STRICT"],
"ecmascript6_strict": ["ECMASCRIPT6_STRICT"],
"es6_typed": ["ES6_TYPED"],
"ecmascript6_typed": ["ECMASCRIPT6_TYPED"],
}
def _impl(ctx):
externs = set(order="compile")
srcs = set(order="compile")
for dep in ctx.attr.deps:
externs += dep.transitive_js_externs
srcs += dep.transitive_js_srcs
args = [
"--entry_point=goog:%s" % ctx.attr.main,
"--js_output_file=%s" % ctx.outputs.out.path,
"--dependency_mode=LOOSE",
"--warning_level=VERBOSE",
] + (["--js=%s" % src.path for src in srcs] +
["--externs=%s" % extern.path for extern in externs])
# Set the compilation level.
if ctx.attr.compilation_level in _COMPILATION_LEVELS:
args += _COMPILATION_LEVELS[ctx.attr.compilation_level]
else:
fail("Invalid compilation_level '%s', expected one of %s" %
(ctx.attr.compilation_level, _COMPILATION_LEVELS.keys()))
# Set the language in.
if ctx.attr.language_in in _SUPPORTED_LANGUAGES:
args += "--language_in=" + _SUPPORTED_LANGUAGES[ctx.attr.language_in]
else:
fail("Invalid language_in '%s', expected one of %s" %
(ctx.attr.language_in, _SUPPORTED_LANGUAGES.keys()))
# Set the language out.
if ctx.attr.language_out in _SUPPORTED_LANGUAGES:
args += "--language_out=" + _SUPPORTED_LANGUAGES[ctx.attr.language_out]
else:
fail("Invalid language_out '%s', expected one of %s" %
(ctx.attr.language_out, _SUPPORTED_LANGUAGES.keys()))
ctx.action(
inputs=list(srcs) + list(externs),
outputs=[ctx.outputs.out],
arguments=args,
executable=ctx.executable._closure_compiler)
return struct(files=set([ctx.outputs.out]))
closure_js_binary = rule(
implementation=_impl,
attrs={
"deps": attr.label_list(
allow_files=False,
providers=["transitive_js_externs", "transitive_js_srcs"]),
"main": attr.string(default="%{name}"),
"compilation_level": attr.string(default="advanced"),
"language_in": attr.string(default="ecmascript6"),
"language_out": attr.string(default="ecmascript3"),
"_closure_compiler": attr.label(
default=Label("//external:closure_compiler_"),
executable=True),
},
outputs={"out": "%{name}_combined.js"})

View File

@@ -0,0 +1,31 @@
include_defs('//tools/build.defs')
gerrit_war(name = 'gerrit')
gerrit_war(name = 'gwtgerrit', ui = 'ui_dbg')
gerrit_war(name = 'headless', ui = None)
gerrit_war(name = 'chrome', ui = 'ui_chrome')
gerrit_war(name = 'firefox', ui = 'ui_firefox')
gerrit_war(name = 'safari', ui = 'ui_safari')
gerrit_war(name = 'polygerrit', ui = 'polygerrit')
gerrit_war(name = 'withdocs', docs = True)
gerrit_war(name = 'release', ui = 'ui_optdbg_r', docs = True, context = ['//plugins:core'], visibility = ['//tools/maven:'])
API_DEPS = [
'//gerrit-acceptance-framework:acceptance-framework',
'//gerrit-acceptance-framework:acceptance-framework-src',
'//gerrit-acceptance-framework:acceptance-framework-javadoc',
'//gerrit-extension-api:extension-api',
'//gerrit-extension-api:extension-api-src',
'//gerrit-extension-api:extension-api-javadoc',
'//gerrit-plugin-api:plugin-api',
'//gerrit-plugin-api:plugin-api-src',
'//gerrit-plugin-api:plugin-api-javadoc',
'//gerrit-plugin-gwtui:gwtui-api',
'//gerrit-plugin-gwtui:gwtui-api-src',
'//gerrit-plugin-gwtui:gwtui-api-javadoc',
]
zip_file(
name = 'api',
srcs = API_DEPS,
)

View File

@@ -0,0 +1,45 @@
package(default_visibility = ["//scripts/release:__pkg__"])
filegroup(
name = "git",
srcs = glob([".git/**"]),
)
filegroup(
name = "dummy",
visibility = ["//visibility:public"],
)
filegroup(
name = "srcs",
srcs = glob(
["**"],
exclude = [
"bazel-*/**",
"output/**",
".*/**",
],
) + [
"//examples:srcs",
"//scripts:srcs",
"//site:srcs",
"//src:srcs",
"//tools:srcs",
"//third_party:srcs",
],
visibility = ["//visibility:private"],
)
load("//tools/build_defs/pkg:pkg.bzl", "pkg_tar")
pkg_tar(
name = "bazel-srcs",
files = [":srcs"],
strip_prefix = ".",
# Public but bazel-only visibility.
visibility = ["//:__subpackages__"],
)
load("//tools/build_rules/go:def.bzl", "go_prefix")
go_prefix("github.com/bazelbuild/bazel")

View File

@@ -0,0 +1,49 @@
# Copyright (c) Twisted Matrix Laboratories.
# See LICENSE for details.
"""
An example client. Run simpleserv.py first before running this.
"""
from twisted.internet import reactor, protocol
# a client protocol
class EchoClient(protocol.Protocol):
"""Once connected, send a message, then print the result."""
def connectionMade(self):
self.transport.write("hello, world!")
def dataReceived(self, data):
"As soon as any data is received, write it back."
print "Server said:", data
self.transport.loseConnection()
def connectionLost(self, reason):
print "connection lost"
class EchoFactory(protocol.ClientFactory):
protocol = EchoClient
def clientConnectionFailed(self, connector, reason):
print "Connection failed - goodbye!"
reactor.stop()
def clientConnectionLost(self, connector, reason):
print "Connection lost - goodbye!"
reactor.stop()
# this connects the protocol to a server running on port 8000
def main():
f = EchoFactory()
reactor.connectTCP("localhost", 8000, f)
reactor.run()
# this only runs if the module was *not* imported
if __name__ == '__main__':
main()

1424
samples/Ren'Py/example.rpy Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,14 @@
data {
int<lower=0> N;
vector[N] incumbency_88;
vector[N] vote_86;
vector[N] vote_88;
}
parameters {
vector[3] beta;
real<lower=0> sigma;
}
model {
vote_88 ~ normal(beta[1] + beta[2] * vote_86
+ beta[3] * incumbency_88,sigma);
}

31
samples/Stan/dogs.stan Normal file
View File

@@ -0,0 +1,31 @@
data {
int<lower=0> n_dogs;
int<lower=0> n_trials;
int<lower=0,upper=1> y[n_dogs,n_trials];
}
parameters {
vector[3] beta;
}
transformed parameters {
matrix[n_dogs,n_trials] n_avoid;
matrix[n_dogs,n_trials] n_shock;
matrix[n_dogs,n_trials] p;
for (j in 1:n_dogs) {
n_avoid[j,1] <- 0;
n_shock[j,1] <- 0;
for (t in 2:n_trials) {
n_avoid[j,t] <- n_avoid[j,t-1] + 1 - y[j,t-1];
n_shock[j,t] <- n_shock[j,t-1] + y[j,t-1];
}
for (t in 1:n_trials)
p[j,t] <- beta[1] + beta[2] * n_avoid[j,t] + beta[3] * n_shock[j,t];
}
}
model {
beta ~ normal(0, 100);
for (i in 1:n_dogs) {
for (j in 1:n_trials)
y[i,j] ~ bernoulli_logit(p[i,j]);
}
}

26
samples/Stan/schools.stan Normal file
View File

@@ -0,0 +1,26 @@
data {
int<lower=0> N;
vector[N] y;
vector[N] sigma_y;
}
parameters {
vector[N] eta;
real mu_theta;
real<lower=0,upper=100> sigma_eta;
real xi;
}
transformed parameters {
real<lower=0> sigma_theta;
vector[N] theta;
theta <- mu_theta + xi * eta;
sigma_theta <- fabs(xi) / sigma_eta;
}
model {
mu_theta ~ normal(0, 100);
sigma_eta ~ inv_gamma(1, 1); //prior distribution can be changed to uniform
eta ~ normal(0, sigma_eta);
xi ~ normal(0, 5);
y ~ normal(theta,sigma_y);
}

114
samples/Terra/arith.t Normal file
View File

@@ -0,0 +1,114 @@
--[[
-
+
*
/
%
^
and
or
~= == < > >= <=
<< >>
]]
terra test0()
var a = 1 + 3
var b = 1LL + 2LL
var c = 1ULL + 2ULL
var d = 1.f + 2.f
var e = 1.0 + 2.0
return a + b + c + d + e
end
terra test1()
var a = 1 - 3
var b = 1LL - 2LL
var c = 1ULL - 2ULL
var d = 1.f - 2.f
var e = 1.0 - 2.0
return a - b - c - d - e
end
terra test2()
var a = 2 * 3
var b = 3LL * 2LL
var c = 3ULL * 2ULL
var d = 1.f * 2.f
var e = 3.0 * 2.0
return a * b * c * d * e
end
terra test3()
var a = 2 / 3 + 1
var b = 3LL / 2LL + 1
var c = 3ULL / 2ULL
var d = 1.f / 2.f
var e = 3.0 / 2.0
return a * b * c * d * e
end
terra test4()
var a = 2 % 3
var b = 3LL % 4LL
var c = 3ULL % 2ULL
var d = 1.f % 2.f
var e = 3.75 % 2.0
return (a == 2) and (b == 3LL) and (d == 1.f) and (e == 1.75)
end
terra test5()
var a = 2 ^ 3
var b = 3LL ^ 4LL
var c = 3ULL ^ 2ULL
return (a == 1) and (b == 7LL) and (c == 1ULL)
end
terra test6()
var a = 2 and 3
var b = 3LL and 4LL
var c = 3ULL and 2ULL
return (a == 2) and (b == 0LL) and (c == 2ULL)
end
terra test7()
var a = 2 or 3
var b = 3LL or 4LL
var c = 3ULL or 2ULL
return (a == 3) and (b == 7LL) and (c == 3ULL)
end
terra test8()
var a0,a1 = 2 ~= 3, 2 == 3
var b0,b1 = 2 < 3, 2 >= 3
var c0,c1 = 2 > 3, 2 <= 3
return a0 and not a1 and b0 and not b1 and not c0 and c1
end
terra test9()
var a0, a1 = 8 >> 1, 8 << 1
var b0, b1 = -8 >> 1, -8 << 1
return a0 == 4 and a1 == 16 and b0 == -4 and b1 == -16
end
local test = require("test")
test.eq(test0(),16)
test.eq(test1(),2)
test.eq(test2(),2592)
test.eq(test3(),1.5)
test.eq(test4(),true)
test.eq(test5(),true)
test.eq(test6(),true)
test.eq(test7(),true)
test.eq(test8(),true)
test.eq(test9(),true)

75
samples/Terra/arrayt.t Normal file
View File

@@ -0,0 +1,75 @@
C = terralib.includecstring [[
#include <stdio.h>
#include <stdlib.h>
]]
local arraytypes = {}
function Array(T)
local struct ArrayImpl {
data : &T;
N : int;
}
function ArrayImpl.metamethods.__typename(self)
return "Array("..tostring(T)..")"
end
arraytypes[ArrayImpl] = true
terra ArrayImpl:init(N : int)
self.data = [&T](C.malloc(N*sizeof(T)))
self.N = N
end
terra ArrayImpl:free()
C.free(self.data)
end
ArrayImpl.metamethods.__apply = macro(function(self,idx)
return `self.data[idx]
end)
ArrayImpl.metamethods.__methodmissing = macro(function(methodname,selfexp,...)
local args = terralib.newlist {...}
local i = symbol(int)
local promotedargs = args:map(function(a)
if arraytypes[a:gettype()] then
return `a(i)
else
return a
end
end)
return quote
var self = selfexp
var r : ArrayImpl
r:init(self.N)
for [i] = 0,r.N do
r.data[i] = self.data[i]:[methodname](promotedargs)
end
in
r
end
end)
return ArrayImpl
end
struct Complex {
real : float;
imag : float;
}
terra Complex:add(c : Complex)
return Complex { self.real + c.real, self.imag + c.imag }
end
ComplexArray = Array(Complex)
N = 10
terra testit()
var ca : ComplexArray
ca:init(N)
for i = 0,N do
ca(i) = Complex { i, i + 1 }
end
var ra = ca:add(ca)
return ra
end
local r = testit()
assert(r.N == N)
for i = 0,N-1 do
assert(r.data[i].real == 2*i)
assert(r.data[i].imag == 2*(i+1))
end
assert(tostring(Array(int)) == "Array(int32)")

View File

@@ -0,0 +1,150 @@
local C = terralib.includecstring[[
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
]]
pi = 3.141592653589793
solar_mass = (4 * pi * pi)
days_per_year = 365.24
struct planet {
x : double;
y : double;
z : double;
vx : double;
vy : double;
vz : double;
mass : double;
}
terra advance(nbodies : int, bodies : &planet, dt : double)
for i = 0, nbodies do
var b = &bodies[i]
for j = i + 1, nbodies do
var b2 = &bodies[j]
var dx = b.x - b2.x;
var dy = b.y - b2.y;
var dz = b.z - b2.z;
var distance = C.sqrt(dx * dx + dy * dy + dz * dz);
var mag = dt / (distance * distance * distance);
--C.printf("%f %f %f %f %f\n",dx,dy,dz,distance,mag);
b.vx = b.vx - dx * b2.mass * mag;
b.vy = b.vy - dy * b2.mass * mag;
b.vz = b.vz - dz * b2.mass * mag;
b2.vx = b2.vx + dx * b.mass * mag;
b2.vy = b2.vy + dy * b.mass * mag;
b2.vz = b2.vz + dz * b.mass * mag;
--C.printf("%f %f %f %f %f %f\n",b.vx,b.vy,b.vz,b2.vx,b2.vy,b2.vz)
end
end
for i = 0,nbodies do
var b = &bodies[i]
b.x = b.x + dt * b.vx;
b.y = b.y + dt * b.vy;
b.z = b.z + dt * b.vz;
end
end
terra energy(nbodies : int, bodies : &planet)
var e = 0.0
for i = 0, nbodies do
var b = &bodies[i]
e = e + 0.5 * b.mass * (b.vx * b.vx + b.vy * b.vy + b.vz * b.vz);
for j = i + 1, nbodies do
var b2 = &bodies[j]
var dx = b.x - b2.x
var dy = b.y - b2.y
var dz = b.z - b2.z
var distance = C.sqrt(dx * dx + dy * dy + dz * dz)
e = e - (b.mass * b2.mass) / distance
end
end
return e
end
terra offset_momentum(nbodies : int, bodies : &planet)
var px,py,pz = 0.0,0.0,0.0
for i = 0,nbodies do
px = px + bodies[i].vx * bodies[i].mass
py = py + bodies[i].vy * bodies[i].mass
pz = pz + bodies[i].vz * bodies[i].mass
end
bodies[0].vx = - px / solar_mass
bodies[0].vy = - py / solar_mass
bodies[0].vz = - pz / solar_mass
end
NBODIES = 5
terra main(argc : int, argv : &&int8)
var bodies = array(
planet { -- sun */
0, 0, 0, 0, 0, 0, solar_mass
},
planet { -- jupiter */
4.84143144246472090e+00,
-1.16032004402742839e+00,
-1.03622044471123109e-01,
1.66007664274403694e-03 * days_per_year,
7.69901118419740425e-03 * days_per_year,
-6.90460016972063023e-05 * days_per_year,
9.54791938424326609e-04 * solar_mass
},
planet { -- saturn */
8.34336671824457987e+00,
4.12479856412430479e+00,
-4.03523417114321381e-01,
-2.76742510726862411e-03 * days_per_year,
4.99852801234917238e-03 * days_per_year,
2.30417297573763929e-05 * days_per_year,
2.85885980666130812e-04 * solar_mass
},
planet { -- uranus */
1.28943695621391310e+01,
-1.51111514016986312e+01,
-2.23307578892655734e-01,
2.96460137564761618e-03 * days_per_year,
2.37847173959480950e-03 * days_per_year,
-2.96589568540237556e-05 * days_per_year,
4.36624404335156298e-05 * solar_mass
},
planet { -- neptune */
1.53796971148509165e+01,
-2.59193146099879641e+01,
1.79258772950371181e-01,
2.68067772490389322e-03 * days_per_year,
1.62824170038242295e-03 * days_per_year,
-9.51592254519715870e-05 * days_per_year,
5.15138902046611451e-05 * solar_mass
}
)
var n = C.atoi(argv[1])
offset_momentum(NBODIES, bodies)
C.printf ("%.9f\n", energy(NBODIES, bodies))
for i = 0,n do
advance(NBODIES, bodies, 0.01)
end
C.printf ("%.9f\n", energy(NBODIES, bodies));
return 0
end
terra run()
main(2,array("what","1000000"))
end
--run:compile()
--local test = require("test")
--print(test.time(run))
terralib.saveobj("benchmark_nbody",{ main = main } )
energy:disas()
energy:printpretty()

View File

@@ -0,0 +1,41 @@
Pakker uten en bestemt bolk\n Disse pakkene tilhører ingen bestemt bolk. Kanskje det er noe feil ved dem?
Virtuelle pakker\n Disse pakkene finnes ikke, de er navn som andre pakker bruker for å oppnå en eller annen egenskap.
Pakker som setter opp systemet ditt til å utføre en bestemt oppgave\n Pakkene i bolken «oppgaver» inneholder ingen filer, det kan hende de bare er avhengige av andre pakker. Disse pakkene gjør det mulig å installere pakker for en bestemt oppgave på en lett måte.
Administrative verktøy\n Pakkene i bolken «admin» gjør det mulig å utføre administrative oppgaver, som å installere programmer, opprette eller slette brukere, vise informasjon om systemet eller nettverkstrafikken osv.
Pakker som er laget av pakker i et annet format (rpm, tgz mm)\n Pakkene i bolken «alien» ble laget av programmet «alien» fra et annet format enn Debians eget pakkeformat, f.eks fra RPM-pakker
Debians grunnsystem\n Pakkene i bolken «grunnsystem» hører med til første del av Debian-installasjonen.
Programmer for faksmodem og andre kommunikasjonsenheter\n Pakkene i bolken «Kommunikasjon» brukes til å styre modemer og andre enheter på maskinen, deriblant programvare for styring av faksmodemer (for eksempel, PPP for oppringt internettforbindelse og programmer som opprinnelig er skrevet for dette, slik som zmodem og kermit), og programmer for å styre mobiltelefoner, snakke med FidoNet og kjøre et BBS.
Verktøy og programmer for programvareutvikling\n Pakker i seksjonen «utvikling» blir brukt til å skrive nye programmer og for å jobbe med videre med programmer som allerede er laget. Vanlige brukere som ikke kompilerer (setter sammen) sine egne programmer trenger neppe så mange programmer herfra.\n .\n Her finner du kompilatorer, avlusingsverktøy, skriveprogrammer som hjelper til med programmeringen, verktøy for håndtering av kildekode og andre ting som har med utvikling av programmer å gjøre.
Dokumentasjon og spesialiserte program for visning av dokumentasjon\n Pakker i «dok»-seksjonen dokumenterer deler av Debian-systemet eller viser fram dokumenter i forskjellige format.
Skriveprogram og tekstbehandlere\n Pakker i bolken «skriveprogram» lar deg redigere ren ASCII-tekst. Dette er nødvendigvis ikke tekstbehandlere, selv om du kan finne noen av dem her i denne bolken.
Program for å jobba med elektronikk og elektriske kretser\n Pakker i «elektronikk»-seksjonen inneholder verktøy for design av elektriske kretser, simulatorer og assemblere for mikrokontrollere og andre liknende programmer.
Programmer for innebygde systemer\nPakker i bolken «innebygd» er ment til å kjøre på innebygde systemer. Dette er spesialisert maskinvare med mye mindre datakraft enn en typisk skrivebordssystem, for eksempel en PDA, en mobiltelefon eller en Tivo.
Skrivebordssystemet GNOME\n GNOME er en samling programvare som danner et lettbrukt skrivbordsmiljø for Linux. Pakker i «gnome»-bolken er enten deler av GNOME-miljøet eller tett sammenvevd med det.
Spill, leketøy og andre programmer som bare er for gøy\n Pakker i «spill»-bolken er stort sett bare til for underholdningens skyld.
Verktøy for å lage, vise og redigere grafikkfiler\n Pakker i «grafikk»-bolken er programmer for visning av bildefiler, bildebehandlingsprogrammer, støtteprogrammer for forskjellig utstyr (som videokort, skanner og digitalt kamera) og programmeringsverktøy for å håndtere grafikk.
Programvare for radioamatører\n Pakker i «hamradio»-bolken er stort sett ment for radioamatører.
Programmer som kjører skriptspråk\n Pakker i «tolkeprogram»-bolken er programmer som kompilerer og kjører språk som Python, Perl og Ruby, og som sørger for standardbibliotek for disse språkene.
Skrivebordssystemet KDE\n KDE er en samling programvare som danner et lettbrukt skrivbordsmiljø for Linux. Pakker i «kde»-bolken er enten deler av KDE-miljøet eller tett sammenvevd med det.
Utviklingsfiler for biblioteker\n Pakker i «libdevel»-bolken inneholder filer som trengs for å lage programmer som bruker biblioteker i «libs»-bolken. Du trenger ikke pakker fra denne bolken hvis du ikke har tenkt å lage programmer selv.
Samling av programvarerutiner\n Pakker i «libs»-seksjonen sørger for nødvendige funksjoner som er felles for andre programmer på maskinen. Med svært få unntak skal det ikke værenødvendig å be om at slike pakker blir installert. Pakkesystemet sørger for å installere dem når de andre programmene trenger dem.
Perl-tolker og biblioteker\n Pakker i «perl»-bolken sørger for programmeringsspråket Perl og mange tredjeparts-biblioteker til Perl. Hvis du ikke er Perl-programmerer selv, så trenger du ikke uttrykkelig installere pakker fra denne bolken, pakkesystemet installerer dem selv hvis det er nødvendig.
Python-tolker og biblioteker\n Pakker i «python»-bolken sørger for programmeringsspråket Python og mange tredjeparts-biblioteker til det. Hvis du ikke er Python-programmerer selv, så trenger du ikke uttrykkelig installere pakker fra denne bolken, pakkesystemet installerer dem selv hvis det er nødvendig.
Program for å skrive, sende og omdirigere epostmeldinger\n Pakker i «epost»-bolken inneholder epostlesere, nisser som flytter eposten dit den skal, programvare for epostlister og filter for søppelpost. Det fins også diverse andre programmer som gjør noe med elektronisk post, men som ikke er så lette å plassere i grupper.
Numerisk analyse og andre matematikkrelaterte programmer\n Blant pakker i «matte»-bolken fins kalkulatorer, språk for matematiske utregninger, symbolsk algebra og programmer for å tegne ut matematiske objekter.
Ymse programvare\n Pakker i «ymse»-bolken er ofte vanskelige å klassifisere, men det betyr ikke at de ikke finnes.
Programmer for å koble til og tilby ulike tjenester i et nettverk\n Blant pakker i «nett»-bolken finner du klienter og tjenere for mange protokoller, verktøy for å manipulere og avluse lavnivå nettverksprotokoller, system for direkte meldingstjeneste og andre nettverksrelaterte programmer.
Klienter og tjenere for Usenet\n Pakker i bolken «nyheter» henger sammen med til det distribuerte nyhetssystemet Usenet. Seksjonen tjenere og leseprogrammer (klienter) for dette systemet.
Foreldede programbibliotek\n Pakker i bolken «gamle bibliotek» er foreldede og bør ikke brukes i ny programvare. De er tilgjengelige for at eldre programmer som er avhengige av programmene her fortsatt skal kunne virke.\n .\n Du skal normalt ikke behøve å be om å få installert pakker herfra. Pakkesystemet vil ta med disse pakkene når andre pakker krever det.
Programmer som etterlikner andre datasystemer og og programmer som hjelper deg med å lese fremmede filsystem\n Pakker i bolken «andreosfs» etterlikner maskinvare og operativsystem og tilbyr verktøy for å overføre data mellom ulike operativsystem og maskinvareplattformer. (For eksempel verktøy for å lese DOS-disketter, og verktøy til å kommunisere med håndholdte maskiner som Palm Pilot)\n .\n Programmer for å brenne CD-plater er også med i denne seksjonen.
Programvare for vitenskaplig arbeid\n Pakker i «vitenskap»-bolken er verktøy for astronomi, biologi og kjemi, pluss andre programmer man bruker i vitenskapelig arbeide.
Kommandoskall og alternative konsollmiljø\n Pakker i «skall» er programmer som tilbyr grensesnitt med kommandolinje.
Verktøy for å spille av og ta opp lyd\nI «lyd»-bolken finner du lydavspillere, opptakere, lydkomprimeringsprogram for mange format, miksere og lydstyring, program for MIDI-sekvenser og program for å lage noter. Her finner du også drivere for lydkort og programmer for lydprosessering.
TeX typografi-systemet\n Pakker i bolken «tex» er deler i et system for å produsere utskrifter og andre slags utdata med høy typografisk kvalitet. Det omfatter selve TeX, TeX-pakker, skriveprogrammer som hjelper deg med å lage dokumenter i TeX, verktøy for å gjøre om TeX og TeX utdatafiler til ulike andre format, TeX-skrifttyper og annen programvare knyttet TeX.
Tekstverktøy\n I bolken «tekst» finner du skriveprogrammer og tekstfiltere, stavekontroll, ordbøker og verktøy for å oversette mellom tegnkoding og tekst-filformater (for eksempel Unix og DOS) og programmer for å formatere, skrive ut og redigere som ren tekst.
Forskjellige systemverktøy\n Pakkene i bolken «verktøy» har oppgaver som faller utenfor de andre kategoriene.
Nettlesere, tjenere, mellomtjenere og andre verktøy\n I bolken «nett» finner du blant annet nettlesere, tjenere og mellomtjenere, programmer for å skrive CGI-skript eller nettbaserte programmer og andre programmer som har med verdensveven å gjøre.
Vindussystemet «X» og beslektede programmer\n Pakkene i bolken «X11» inneholder også grunnpakka for vindussystemet «X», vindusbehandlere, verktøy for X og andre programmer med en X-grensesnitt som ble plassert her fordi de ikke passet inn noen andre steder.
Debians hovedarkiv\n Selve Debian-distribusjonen består av pakker fra hovedbolken. Alle pakkene her er fri programvare.\n .\n For mer informasjon om hva Debian mener med «fri programvare», se http://www.debian.org/social_contract#guidelines
Programmer som avhenger av programvare utenfor Debian.\n Pakker i bolken«bidrag» er ikke med i Debian.\n\n Disse pakkene er fri programvare, men de avhenger av programmer som ikke er en del av Debian. Dette kan skyldes at de ikke er fri programvare og ligger i bolken «ufri» i pakkearkivet, og disse kan Debian slett ikke distribuere, eller - i noen sjeldne tilfeller - at ingen har laget en pakke av dette ennå.\n .\n For mer informasjon om hva Debian mener med «fri programvare», se http://www.debian.org/social_contract#guidelines
Programmer som ikke er fri programvare \n Pakkene i bolken «ufri» er ikke en del av Debian\n .\n Disse pakkene passet ikke med en eller flere av betingelsene i Debians retningslinjer for fri programvare (Debian Free Software Guidelines; se nedenfor). Du bør lese lisensen for programmene i denne bolken for å være sikker på at du har rett til å bruke dem slik du har tenkt.\n .\n For mer informasjon om hva Debian mener med «Fri programvare», se http://www.debian.org/social_contract#guidelines
Programmer som er lagret utenfor USA på grunn av eksportforbud.\n Det er stor sjanse for at pakkene i «utenfor USA» inneholder kryptografi, og noen få av dem inneholder patenterte algoritmer. På grunn av dette kan de ikke eksporteres ut av USA, og lagres derfor på en tjener i «den frie verden».\n .\n Merk: Debian-prosjektet er, etter samtale med eksperter på rettsvesenet om nye endringer i eksporteringsreglene, i ferd med å flette kryptografiske programmer inn i de USA-baserte arkivene. De fleste pakkene som før lå i denne bolken er derfor flyttet til «hoved».

View File

@@ -0,0 +1 @@
Please read me.

View File

@@ -0,0 +1,9 @@
To run the "Conway's game of life" macros:
1. Type ":so life.vim". This loads the macros.
2. Type "g" to run the macros.
3. Type CTRL-C to interrupt.
4. Type ":q!" to get out.
See life.vim for more advanced usage.

View File

@@ -0,0 +1 @@
Delete me.

View File

@@ -0,0 +1 @@
Keep me.

View File

@@ -0,0 +1 @@
Read me now!

View File

@@ -0,0 +1 @@
Test me.

973
samples/Text/tutor.nb Normal file
View File

@@ -0,0 +1,973 @@
===============================================================================
= V e l k o m m e n t i l i n n f ø r i n g e n i V i m -- Ver. 1.7 =
===============================================================================
Vim er en meget kraftig editor med mange kommandoer, alt for mange til å
kunne gå gjennom alle i en innføring som denne. Den er beregnet på å
sette deg inn i bruken av nok kommandoer så du vil være i stand til lett
å kunne bruke Vim som en editor til alle formål.
Tiden som kreves for å gå gjennom denne innføringen tar ca. 25-30
minutter, avhengig av hvor mye tid du bruker til eksperimentering.
MERK:
Kommandoene i leksjonene vil modifisere teksten. Lag en kopi av denne
filen som du kan øve deg på (hvis du kjørte Ŧvimtutorŧ-kommandoen, er
dette allerede en kopi).
Det er viktig å huske at denne innføringen er beregnet på læring gjennom
bruk. Det betyr at du må utføre kommandoene for å lære dem skikkelig.
Hvis du bare leser teksten, vil du glemme kommandoene!
Først av alt, sjekk at ŦCaps Lockŧ IKKE er aktiv og trykk Ŧjŧ-tasten for
å flytte markøren helt til leksjon 1.1 fyller skjermen.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 1.1: FLYTTING AV MARKØREN
** For å flytte markøren, trykk tastene h, j, k, l som vist. **
^
k Tips: h-tasten er til venstre og flytter til venstre.
< h l > l-tasten er til høyre og flytter til høyre.
j j-tasten ser ut som en pil som peker nedover.
v
1. Flytt markøren rundt på skjermen til du har fått det inn i fingrene.
2. Hold inne nedovertasten (j) til den repeterer.
Nå vet du hvordan du beveger deg til neste leksjon.
3. Gå til leksjon 1.2 ved hjelp av nedovertasten.
Merk: Hvis du blir usikker på noe du har skrevet, trykk <ESC> for å gå til
normalmodus. Skriv deretter kommandoen du ønsket på nytt.
Merk: Piltastene skal også virke. Men ved å bruke hjkl vil du være i stand til
å bevege markøren mye raskere når du er blitt vant til det. Helt sant!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 1.2: AVSLUTTE VIM
!! MERK: Før du utfører noen av punktene nedenfor, les hele leksjonen!!
1. Trykk <ESC>-tasten (for å forsikre deg om at du er i normalmodus).
2. Skriv: :q! <ENTER>.
Dette avslutter editoren og FORKASTER alle forandringer som du har gjort.
3. Når du ser kommandolinjen i skallet, skriv kommandoen som startet denne
innføringen. Den er: vimtutor <ENTER>
4. Hvis du er sikker på at du husker dette, utfør punktene 1 til 3 for å
avslutte og starte editoren på nytt.
MERK: :q! <ENTER> forkaster alle forandringer som du gjorde. I løpet av noen
få leksjoner vil du lære hvordan du lagrer forandringene til en fil.
5. Flytt markøren ned til leksjon 1.3.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 1.3: REDIGERING AV TEKST -- SLETTING
** Trykk x for å slette tegnet under markøren. **
1. Flytt markøren til den første linjen merket med --->.
2. For å ordne feilene på linjen, flytt markøren til den er oppå tegnet som
skal slettes.
3. Trykk tasten x for å slette det uønskede tegnet.
4. Repeter punkt 2 til 4 til setningen er lik den som er under.
---> Hessstennnn brrråsnudddde ii gaaata.
---> Hesten bråsnudde i gata.
5. Nå som linjen er korrekt, gå til leksjon 1.4.
MERK: Når du går gjennom innføringen, ikke bare prøv å huske kommandoene, men
bruk dem helt til de sitter.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 1.4: REDIGERING AV TEKST -- INNSETTING
** Trykk i for å sette inn tekst. **
1. Flytt markøren til den første linjen som er merket med --->.
2. For å gjøre den første linjen lik den andre, flytt markøren til den står
på tegnet ETTER posisjonen der teksten skal settes inn.
3. Trykk i og skriv inn teksten som mangler.
4. Etterhvert som hver feil er fikset, trykk <ESC> for å returnere til
normalmodus. Repeter punkt 2 til 4 til setningen er korrekt.
---> Det er tkst som mnglr .
---> Det er ganske mye tekst som mangler her.
5. Når du føler deg komfortabel med å sette inn tekst, gå til oppsummeringen
nedenfor.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 1.5: REDIGERING AV TEKST -- LEGGE TIL
** Trykk A for å legge til tekst. **
1. Flytt markøren til den første linjen nedenfor merket --->.
Det har ikke noe å si hvor markøren er plassert på den linjen.
2. Trykk A og skriv inn det som skal legges til.
3. Når teksten er lagt til, trykk <ESC> for å returnere til normalmodusen.
4. Flytt markøren til den andre linjen markert med ---> og repeter steg 2 og
3 for å reparere denne setningen.
---> Det mangler noe tekst p
Det mangler noe tekst på denne linjen.
---> Det mangler også litt tek
Det mangler også litt tekst på denne linjen.
5. Når du føler at du behersker å legge til tekst, gå til leksjon 1.6.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 1.6: REDIGERE EN FIL
** Bruk :wq for å lagre en fil og avslutte. **
!! MERK: Før du utfører noen av stegene nedenfor, les hele denne leksjonen!!
1. Avslutt denne innføringen som du gjorde i leksjon 1.2: :q!
2. Skriv denne kommandoen på kommandolinja: vim tutor <ENTER>
Ŧvimŧ er kommandoen for å starte Vim-editoren, Ŧtutorŧ er navnet på fila
som du vil redigere. Bruk en fil som kan forandres.
3. Sett inn og slett tekst som du lærte i de foregående leksjonene.
4. Lagre filen med forandringene og avslutt Vim med: :wq <ENTER>
5. Start innføringen på nytt og flytt ned til oppsummeringen som følger.
6. Etter å ha lest og forstått stegene ovenfor: Sett i gang.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OPPSUMMERING AV LEKSJON 1
1. Markøren beveges ved hjelp av piltastene eller hjkl-tastene.
h (venstre) j (ned) k (opp) l (høyre)
2. For å starte Vim fra skall-kommandolinjen, skriv: vim FILNAVN <ENTER>
3. For å avslutte Vim, skriv: <ESC> :q! <ENTER> for å forkaste endringer.
ELLER skriv: <ESC> :wq <ENTER> for å lagre forandringene.
4. For å slette tegnet under markøren, trykk: x
5. For å sette inn eller legge til tekst, trykk:
i skriv innsatt tekst <ESC> sett inn før markøren
A skriv tillagt tekst <ESC> legg til på slutten av linjen
MERK: Når du trykker <ESC> går du til normalmodus eller du avbryter en uønsket
og delvis fullført kommando.
Nå kan du gå videre til leksjon 2.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 2.1: SLETTEKOMMANDOER
** Trykk dw for å slette et ord. **
1. Trykk <ESC> for å være sikker på at du er i normalmodus.
2. Flytt markøren til den første linjen nedenfor merket --->.
3. Flytt markøren til begynnelsen av ordet som skal slettes.
4. Trykk dw og ordet vil forsvinne.
MERK: Bokstaven d vil komme til syne på den nederste linjen på skjermen når
du skriver den. Vim venter på at du skal skrive w . Hvis du ser et annet
tegn enn d har du skrevet noe feil; trykk <ESC> og start på nytt.
---> Det er agurk tre ord eple som ikke hører pære hjemme i denne setningen.
---> Det er tre ord som ikke hører hjemme i denne setningen.
5. Repeter punkt 3 og 4 til den første setningen er lik den andre. Gå
deretter til leksjon 2.2.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 2.2: FLERE SLETTEKOMMANDOER
** Trykk d$ for å slette til slutten av linjen. **
1. Trykk <ESC> for å være sikker på at du er i normalmodus.
2. Flytt markøren til linjen nedenfor merket --->.
3. Flytt markøren til punktet der linjen skal kuttes (ETTER første punktum).
4. Trykk d$ for å slette alt til slutten av linjen.
---> Noen skrev slutten på linjen en gang for mye. linjen en gang for mye.
5. Gå til leksjon 2.3 for å forstå hva som skjer.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 2.3: OM OPERATORER OG BEVEGELSER
Mange kommandoer som forandrer teksten er laget ut i fra en operator og en
bevegelse. Formatet for en slettekommando med sletteoperatoren d er:
d bevegelse
Der:
d - er sletteoperatoren.
bevegelse - er hva operatoren vil opere på (listet nedenfor).
En kort liste med bevegelser:
w - til starten av det neste ordet, UNNTATT det første tegnet.
e - til slutten av det nåværende ordet, INKLUDERT det siste tegnet.
$ - til slutten av linjen, INKLUDERT det siste tegnet.
Ved å skrive de vil altså alt fra markøren til slutten av ordet bli
slettet.
MERK: Ved å skrive kun bevegelsen i normalmodusen uten en operator vil
markøren flyttes som spesifisert.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LEKSJON 2.4: BRUK AV TELLER FOR EN BEVEGELSE
** Ved å skrive et tall foran en bevegelse repeterer den så mange ganger. **
1. Flytt markøren til starten av linjen markert ---> nedenfor.
2. Skriv 2w for å flytte markøren to ord framover.
3. Skriv 3e for å flytte markøren framover til slutten av det tredje
ordet.
4. Skriv 0 (null) for å flytte til starten av linjen.
5. Repeter steg 2 og 3 med forskjellige tall.
---> Dette er en linje med noen ord som du kan bevege deg rundt på.
6. Gå videre til leksjon 2.5.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 2.5: BRUK AV ANTALL FOR Å SLETTE MER
** Et tall sammen med en operator repeterer den så mange ganger. **
I kombinasjonen med sletteoperatoren og en bevegelse nevnt ovenfor setter du
inn antall før bevegelsen for å slette mer:
d nummer bevegelse
1. Flytt markøren til det første ordet med STORE BOKSTAVER på linjen markert
med --->.
2. Skriv 2dw for å slette de to ordene med store bokstaver.
3. Repeter steg 1 og 2 med forskjelling antall for å slette de etterfølgende
ordene som har store bokstaver.
---> Denne ABC DE linjen FGHI JK LMN OP er nå Q RS TUV litt mer lesbar.
MERK: Et antall mellom operatoren d og bevegelsen virker på samme måte som å
bruke bevegelsen uten en operator.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 2.6: OPERERE PÅ LINJER
** Trykk dd for å slette en hel linje. **
På grunn av at sletting av linjer er mye brukt, fant utviklerne av Vi ut at
det vil være lettere å rett og slett trykke to d-er for å slette en linje.
1. Flytt markøren til den andre linjen i verset nedenfor.
2. Trykk dd å slette linjen.
3. Flytt deretter til den fjerde linjen.
4. Trykk 2dd for å slette to linjer.
---> 1) Roser er røde,
---> 2) Gjørme er gøy,
---> 3) Fioler er blå,
---> 4) Jeg har en bil,
---> 5) Klokker viser tiden,
---> 6) Druer er søte
---> 7) Og du er likeså.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 2.7: ANGRE-KOMMANDOEN
** Trykk u for å angre siste kommando, U for å fikse en hel linje. **
1. Flytt markøren til linjen nedenfor merket ---> og plasser den på den
første feilen.
2. Trykk x for å slette det første uønskede tegnet.
3. Trykk så u for å angre den siste utførte kommandoen.
4. Deretter ordner du alle feilene på linjene ved å bruke kommandoen x .
5. Trykk nå en stor U for å sette linjen tilbake til det den var
originalt.
6. Trykk u noen ganger for å angre U og foregående kommandoer.
7. Deretter trykker du CTRL-R (hold CTRL nede mens du trykker R) noen
ganger for å gjenopprette kommandoene (omgjøre angrekommandoene).
---> RReparer feiilene påå denne linnnjen oog erssstatt dem meed angre.
8. Dette er meget nyttige kommandoer. Nå kan du gå til oppsummeringen av
leksjon 2.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OPPSUMMERING AV LEKSJON 2
1. For å slette fra markøren fram til det neste ordet, trykk: dw
2. For å slette fra markøren til slutten av en linje, trykk: d$
3. For å slette en hel linje, trykk: dd
4. For å repetere en bevegelse, sett et nummer foran: 2w
5. Formatet for en forandringskommando er:
operator [nummer] bevegelse
der:
operator - hva som skal gjøres, f.eks. d for å slette
[nummer] - et valgfritt antall for å repetere bevegelsen
bevegelse - hva kommandoen skal operere på, eksempelvis w (ord),
$ (til slutten av linjen) og så videre.
6. For å gå til starten av en linje, bruk en null: 0
7. For å angre tidligere endringer, skriv: u (liten u)
For å angre alle forandringer på en linje, skriv: U (stor U)
For å omgjøre angringen, trykk: CTRL-R
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 3.1: ŦLIM INNŧ-KOMMANDOEN
** Trykk p for å lime inn tidligere slettet tekst etter markøren **
1. Flytt markøren til den første linjen med ---> nedenfor.
2. Trykk dd for å slette linjen og lagre den i et Vim-register.
3. Flytt markøren til c)-linjen, OVER posisjonen linjen skal settes inn.
4. Trykk p for å legge linjen under markøren.
5. Repeter punkt 2 til 4 helt til linjene er i riktig rekkefølge.
---> d) Kan du også lære?
---> b) Fioler er blå,
---> c) Intelligens må læres,
---> a) Roser er røde,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 3.2: ŦERSTATTŧ-KOMMANDOEN
** Trykk rx for å erstatte tegnet under markøren med x. **
1. Flytt markøren til den første linjen nedenfor merket --->.
2. Flytt markøren så den står oppå den første feilen.
3. Trykk r og deretter tegnet som skal være der.
4. Repeter punkt 2 og 3 til den første linjen er lik den andre.
---> Da dfnne lynjxn ble zkrevet, var det nøen som tjykket feite taster!
---> Da denne linjen ble skrevet, var det noen som trykket feile taster!
5. Gå videre til leksjon 3.2.
MERK: Husk at du bør lære ved å BRUKE, ikke pugge.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 3.3: ŦFORANDREŧ-OPERATOREN
** For å forandre til slutten av et ord, trykk ce . **
1. Flytt markøren til den første linjen nedenfor som er merket --->.
2. Plasser markøren på u i Ŧlubjwrŧ.
3. Trykk ce og det korrekte ordet (i dette tilfellet, skriv Ŧinjenŧ).
4. Trykk <ESC> og gå til det neste tegnet som skal forandres.
5. Repeter punkt 3 og 4 helt til den første setningen er lik den andre.
---> Denne lubjwr har noen wgh som må forkwåp med Ŧforækzryasŧ-kommandoen.
---> Denne linjen har noen ord som må forandres med Ŧforandreŧ-kommandoen.
Vær oppmerksom på at ce sletter ordet og går inn i innsettingsmodus.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 3.4: FLERE FORANDRINGER VED BRUK AV c
** Forandringskommandoen blir brukt med de samme bevegelser som Ŧslettŧ. **
1. Forandringsoperatoren fungerer på samme måte som Ŧslettŧ. Formatet er:
c [nummer] bevegelse
2. Bevegelsene er de samme, som for eksempel w (ord) og $ (slutten av en
linje).
3. Gå til den første linjen nedenfor som er merket --->.
4. Flytt markøren til den første feilen.
5. Skriv c$ og skriv resten av linjen lik den andre og trykk <ESC>.
---> Slutten på denne linjen trenger litt hjelp for å gjøre den lik den neste.
---> Slutten på denne linjen trenger å bli rettet ved bruk av c$-kommandoen.
MERK: Du kan bruke slettetasten for å rette feil mens du skriver.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OPPSUMMERING AV LEKSJON 3
1. For å legge tilbake tekst som nettopp er blitt slettet, trykk p . Dette
limer inn den slettede teksten ETTER markøren (hvis en linje ble slettet
vil den bli limt inn på linjen under markøren).
2. For å erstatte et tegn under markøren, trykk r og deretter tegnet som
du vil ha der.
3. Forandringsoperatoren lar deg forandre fra markøren til dit bevegelsen
tar deg. Det vil si, skriv ce for å forandre fra markøren til slutten
av ordet, c$ for å forandre til slutten av linjen.
4. Formatet for Ŧforandreŧ er:
c [nummer] bevegelse
Nå kan du gå til neste leksjon.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 4.1: POSISJONERING AV MARKØREN OG FILSTATUS
** Trykk CTRL-G for å vise posisjonen i filen og filstatusen.
Trykk G for å gå til en spesifikk linje i filen. **
Merk: Les hele leksjonen før du utfører noen av punktene!
1. Hold nede Ctrl-tasten og trykk g . Vi kaller dette CTRL-G. En melding
vil komme til syne på bunnen av skjermen med filnavnet og posisjonen i
filen. Husk linjenummeret for bruk i steg 3.
Merk: Du kan se markørposisjonen i nederste høyre hjørne av skjermen. Dette
skjer når Ŧrulerŧ-valget er satt (forklart i leksjon 6).
2. Trykk G for å gå til bunnen av filen.
Skriv gg for å gå til begynnelsen av filen.
3. Skriv inn linjenummeret du var på og deretter G . Dette vil føre deg
tilbake til linjen du var på da du først trykket CTRL-G.
4. Utfør steg 1 til 3 hvis du føler deg sikker på prosedyren.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 4.2: SØKEKOMMANDOEN
** Skriv / etterfulgt av en søkestreng som du vil lete etter. **
1. Trykk / når du er i normalmodusen. Legg merke til at skråstreken og
markøren kommer til syne på bunnen av skjermen i likhet med
Ŧ:ŧ-kommandoene.
2. Skriv Ŧfeeeiilŧ og trykk <ENTER>. Dette er teksten du vil lete etter.
3. For å finne neste forekomst av søkestrengen, trykk n .
For å lete etter samme søketeksten i motsatt retning, trykk N .
4. For å lete etter en tekst bakover i filen, bruk ? istedenfor / .
5. For å gå tilbake til der du kom fra, trykk CTRL-O (Hold Ctrl nede mens
du trykker bokstaven o ). Repeter for å gå enda lengre tilbake. CTRL-I
går framover.
---> Ŧfeeeiilŧ er ikke måten å skrive Ŧfeilŧ på, feeeiil er helt feil.
Merk: Når søkingen når slutten av filen, vil den fortsette fra starten unntatt
hvis Ŧwrapscanŧ-valget er resatt.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 4.3: FINN SAMSVARENDE PARENTESER
** Trykk % for å finne en samsvarende ), ] eller } . **
1. Plasser markøren på en (, [ eller { på linjen nedenfor merket --->.
2. Trykk % .
3. Markøren vil gå til den samsvarende parentesen eller hakeparentesen.
4. Trykk % for å flytte markøren til den andre samsvarende parentesen.
5. Flytt markøren til en annen (, ), [, ], { eller } og se hva % gjør.
---> Dette ( er en testlinje med (, [ ] og { } i den )).
Merk: Dette er veldig nyttig til feilsøking i programmer som har ubalansert
antall parenteser!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 4.4: ERSTATT-KOMMANDOEN
** Skriv :s/gammel/ny/g for å erstatte Ŧgammelŧ med Ŧnyŧ. **
1. Flytt markøren til linjen nedenfor som er merket med --->.
2. Skriv :s/deen/den/ <ENTER> . Legg merke til at denne kommandoen bare
forandrer den første forekomsten av Ŧdeenŧ på linjen.
3. Skriv :s/deen/den/g . Når g-flagget legges til, betyr dette global
erstatning på linjen og erstatter alle forekomster av Ŧdeenŧ på linjen.
---> deen som kan kaste deen tyngste steinen lengst er deen beste
4. For å erstatte alle forekomster av en tekststreng mellom to linjer,
skriv :#,#s/gammel/ny/g der #,# er linjenumrene på de to linjene for
linjeområdet erstatningen skal gjøres.
Skriv :%s/gammel/ny/g for å erstatte tekst i hele filen.
Skriv :%s/gammel/ny/gc for å finne alle forekomster i hele filen, og
deretter spørre om teksten skal erstattes eller
ikke.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OPPSUMMERING AV LEKSJON 4
1. Ctrl-G viser nåværende posisjon i filen og filstatusen.
G går til slutten av filen.
nummer G går til det linjenummeret.
gg går til den første linjen.
2. Skriv / etterfulgt av en søketekst for å lete FRAMOVER etter teksten.
Skriv ? etterfulgt av en søketekst for å lete BAKOVER etter teksten.
Etter et søk kan du trykke n for å finne neste forekomst i den samme
retningen eller N for å lete i motsatt retning.
CTRL-O tar deg tilbake til gamle posisjoner, CTRL-I til nyere posisjoner.
3. Skriv % når markøren står på en (, ), [, ], { eller } for å finne den
som samsvarer.
4. Erstatte Ŧgammelŧ med første Ŧnyŧ på en linje: :s/gammel/ny
Erstatte alle Ŧgammelŧ med Ŧnyŧ på en linje: :s/gammel/ny/g
Erstatte tekst mellom to linjenumre: :#,#s/gammel/ny/g
Erstatte alle forekomster i en fil: :%s/gammel/ny/g
For å godkjenne hver erstatning, legg til Ŧcŧ: :%s/gammel/ny/gc
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 5.1: HVORDAN UTFØRE EN EKSTERN KOMMANDO
** Skriv :! etterfulgt av en ekstern kommando for å utføre denne. **
1. Skriv den velkjente kommandoen : for å plassere markøren på bunnen av
skjermen. Dette lar deg skrive en kommandolinjekommando.
2. Nå kan du skrive tegnet ! . Dette lar deg utføre en hvilken som helst
ekstern kommando.
3. Som et eksempel, skriv ls etter utropstegnet og trykk <ENTER>. Du vil
nå få en liste over filene i katalogen, akkurat som om du hadde kjørt
kommandoen direkte fra kommandolinjen i skallet. Eller bruk :!dir hvis
Ŧlsŧ ikke virker.
MERK: Det er mulig å kjøre alle eksterne kommandoer på denne måten, også med
parametere.
MERK: Alle Ŧ:ŧ-kommandoer må avsluttes med <ENTER>. Fra dette punktet er det
ikke alltid vi nevner det.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 5.2: MER OM LAGRING AV FILER
** For å lagre endringene gjort i en tekst, skriv :w FILNAVN. **
1. Skriv :!dir eller :!ls for å få en liste over filene i katalogen. Du
vet allerede at du må trykke <ENTER> etter dette.
2. Velg et filnavn på en fil som ikke finnes, som for eksempel TEST .
3. Skriv :w TEST (der TEST er filnavnet du velger).
4. Dette lagrer hele filen (denne innføringen) under navnet TEST . For å
sjekke dette, skriv :!dir eller :!ls igjen for å se innholdet av
katalogen.
Merk: Hvis du nå hadde avsluttet Vim og startet på nytt igjen med Ŧvim TESTŧ,
ville filen vært en eksakt kopi av innføringen da du lagret den.
5. Fjern filen ved å skrive :!rm TEST hvis du er på et Unix-lignende
operativsystem, eller :!del TEST hvis du bruker MS-DOS.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 5.3: VELGE TEKST SOM SKAL LAGRES
** For å lagre en del av en fil, skriv v bevegelse :w FILNAVN **
1. Flytt markøren til denne linjen.
2. Trykk v og flytt markøren til det femte elementet nedenfor. Legg merke
til at teksten blir markert.
3. Trykk : (kolon). På bunnen av skjermen vil :'<,'> komme til syne.
4. Trykk w TEST , der TEST er et filnavn som ikke finnes enda. Kontroller
at du ser :'<,'>w TEST før du trykker Enter.
5. Vim vil skrive de valgte linjene til filen TEST. Bruk :!dir eller :!ls
for å se den. Ikke slett den enda! Vi vil bruke den i neste leksjon.
MERK: Ved å trykke v startes visuelt valg. Du kan flytte markøren rundt for
å gjøre det valgte området større eller mindre. Deretter kan du bruke en
operator for å gjøre noe med teksten. For eksempel sletter d teksten.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 5.4: HENTING OG SAMMENSLÅING AV FILER
** For å lese inn en annen fil inn i nåværende buffer, skriv :r FILNAVN **
1. Plasser markøren like over denne linjen.
MERK: Etter å ha utført steg 2 vil du se teksten fra leksjon 5.3. Gå deretter
NED for å se denne leksjonen igjen.
2. Hent TEST-filen ved å bruke kommandoen :r TEST der TEST er navnet på
filen du brukte. Filen du henter blir plassert nedenfor markørlinjen.
3. For å sjekke at filen ble hentet, gå tilbake og se at det er to kopier av
leksjon 5.3, originalen og denne versjonen.
MERK: Du kan også lese utdataene av en ekstern kommando. For eksempel, :r !ls
leser utdataene av ls-kommandoen og legger dem nedenfor markøren.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OPPSUMMERING AV LEKSJON 5
1. :!kommando utfører en ekstern kommandio.
Noen nyttige eksempler er:
(MS-DOS) (Unix)
:!dir :!ls - List filene i katalogen.
:!del FILNAVN :!rm FILNAVN - Slett filen FILNAVN.
2. :w FILNAVN skriver den nåværende Vim-filen disken med navnet FILNAVN .
3. v bevegelse :w FILNAVN lagrer de visuelt valgte linjene til filen
FILNAVN.
4. :r FILNAVN henter filen FILNAVN og legger den inn nedenfor markøren.
5. :r !dir leser utdataene fra Ŧdirŧ-kommandoen og legger dem nedenfor
markørposisjonen.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 6.1: ŦÅPNE LINJEŧ-KOMMANDOEN
** Skriv o for å Ŧåpne oppŧ for en ny linje etter markøren og gå til
innsettingsmodus **
1. Flytt markøren til linjen nedenfor merket --->.
2. Skriv o (liten o) for å åpne opp en linje NEDENFOR markøren og gå inn i
innsettingsmodus.
3. Skriv litt tekst og trykk <ESC> for å gå ut av innsettingsmodusen.
---> Etter at o er skrevet blir markøren plassert på den tomme linjen.
4. For å åpne en ny linje OVER markøren, trykk rett og slett en stor O
istedenfor en liten o . Prøv dette på linjen nedenfor.
---> Lag ny linje over denne ved å trykke O mens markøren er på denne linjen.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 6.2: ŦLEGG TILŧ-KOMMANDOEN
** Skriv a for å legge til tekst ETTER markøren. **
1. Flytt markøren til starten av linjen merket ---> nedenfor.
2. Trykk e til markøren er på slutten av Ŧliŧ.
3. Trykk a (liten a) for å legge til tekst ETTER markøren.
4. Fullfør ordet sånn som på linjen nedenfor. Trykk <ESC> for å gå ut av
innsettingsmodusen.
5. Bruk e for å gå til det neste ufullstendige ordet og repeter steg 3 og
4.
---> Denne li lar deg øve på å leg til tek på en linje.
---> Denne linjen lar deg øve på å legge til tekst på en linje.
Merk: a, i og A går alle til den samme innsettingsmodusen, den eneste
forskjellen er hvor tegnene blir satt inn.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 6.3: EN ANNEN MÅTE Å ERSTATTE PÅ
** Skriv en stor R for å erstatte mer enn ett tegn. **
1. Flytt markøren til den første linjen nedenfor merket --->. Flytt markøren
til begynnelsen av den første Ŧxxxŧ-en.
2. Trykk R og skriv inn tallet som står nedenfor på den andre linjen så
det erstatter xxx.
3. Trykk <ESC> for å gå ut av erstatningsmodusen. Legg merke til at resten
av linjen forblir uforandret.
4. Repeter stegene for å erstatte den gjenværende xxx.
---> Ved å legge 123 til xxx får vi xxx.
---> Ved å legge 123 til 456 får vi 579.
MERK: Erstatningsmodus er lik insettingsmodus, men hvert tegn som skrives
erstatter et eksisterende tegn.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 6.4: KOPIERE OG LIME INN TEKST
** Bruk y-operatoren for å kopiere tekst og p for å lime den inn **
1. Gå til linjen merket ---> nedenfor og plasser markøren etter Ŧa)ŧ.
2. Gå inn i visuell modus med v og flytt markøren til like før Ŧførsteŧ.
3. Trykk y for å kopiere (engelsk: Ŧyankŧ) den uthevede teksten.
4. Flytt markøren til slutten av den neste linjen: j$
5. Trykk p for å lime inn teksten. Trykk deretter: a andre <ESC> .
6. Bruk visuell modus for å velge Ŧ valget.ŧ, kopier det med y , gå til
slutten av den neste linjen med j$ og legg inn teksten der med p .
---> a) Dette er det første valget.
b)
Merk: Du kan også bruke y som en operator; yw kopierer ett ord.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 6.5: SETT VALG
** Sett et valg så søk eller erstatning ignorerer store/små bokstaver. **
1. Let etter Ŧignoreŧ ved å skrive: /ignore <ENTER>
Repeter flere ganger ved å trykke n .
2. Sett Ŧicŧ-valget (Ignore Case) ved å skrive: :set ic
3. Søk etter Ŧignoreŧ igjen ved å trykke n .
Legg merke til at både ŦIgnoreŧ og ŦIGNOREŧ blir funnet.
4. Sett Ŧhlsearchŧ- og Ŧincsearchŧ-valgene: :set hls is
5. Skriv søkekommandoen igjen og se hva som skjer: /ignore <ENTER>
6. For å slå av ignorering av store/små bokstaver, skriv: :set noic
Merk: For å fjerne uthevingen av treff, skriv: :nohlsearch
Merk: Hvis du vil ignorere store/små bokstaver for kun en søkekommando, bruk
\c i uttrykket: /ignore\c <ENTER>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OPPSUMMERING AV LEKSJON 6
1. Trykk o for å legge til en linje NEDENFOR markøren og gå inn i
innsettingsmodus.
Trykk O for å åpne en linje OVER markøren.
2. Skriv a for å sette inn tekst ETTER markøren.
Skriv A for å sette inn tekst etter slutten av linjen.
3. Kommandoen e går til slutten av et ord.
4. Operatoren y (Ŧyankŧ) kopierer tekst, p (Ŧpasteŧ) limer den inn.
5. Ved å trykke R går du inn i erstatningsmodus helt til <ESC> trykkes.
6. Skriv Ŧ:set xxxŧ for å sette valget Ŧxxxŧ. Noen valg er:
Ŧicŧ Ŧignorecaseŧ ignorer store/små bokstaver under søk
Ŧisŧ Ŧincsearchŧ vis delvise treff for en søketekst
Ŧhlsŧ Ŧhlsearchŧ uthev alle søketreff
7. Legg til Ŧnoŧ foran valget for å slå det av: :set noic
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 7.1: FÅ HJELP
** Bruk det innebygde hjelpesystemet. **
Vim har et omfattende innebygget hjelpesystem. For å starte det, prøv en av
disse måtene:
- Trykk Hjelp-tasten (hvis du har en)
- Trykk F1-tasten (hvis du har en)
- Skriv :help <ENTER>
Les teksten i hjelpevinduet for å finne ut hvordan hjelpen virker.
Skriv CTRL-W CTRL-W for å hoppe fra et vindu til et annet
Skriv :q <ENTER> for å lukke hjelpevinduet.
Du kan få hjelp for omtrent alle temaer om Vim ved å skrive et parameter til
Ŧ:helpŧ-kommandoen. Prøv disse (ikke glem å trykke <ENTER>):
:help w
:help c_CTRL-D
:help insert-index
:help user-manual
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 7.2: LAG ET OPPSTARTSSKRIPT
** Slå på funksjoner i Vim **
Vim har mange flere funksjoner enn Vi, men flesteparten av dem er slått av
som standard. For å begynne å bruke flere funksjoner må du lage en
Ŧvimrcŧ-fil.
1. Start redigeringen av Ŧvimrcŧ-filen. Dette avhenger av systemet ditt:
:e ~/.vimrc for Unix
:e $VIM/_vimrc for MS Windows
2. Les inn eksempelfilen for Ŧvimrcŧ:
:r $VIMRUNTIME/vimrc_example.vim
3. Lagre filen med:
:w
Neste gang du starter Vim vil den bruke syntaks-utheving. Du kan legge til
alle dine foretrukne oppsett i denne Ŧvimrcŧ-filen.
For mer informasjon, skriv :help vimrc-intro
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 7.3: FULLFØRING
** Kommandolinjefullføring med CTRL-D og <TAB> **
1. Vær sikker på at Vim ikke er i Vi-kompatibel modus: :set nocp
2. Se hvilke filer som er i katalogen: :!ls eller :!dir
3. Skriv starten på en kommando: :e
4. Trykk CTRL-D og Vim vil vise en liste over kommandoer som starter med
Ŧeŧ.
5. Trykk <TAB> og Vim vil fullføre kommandonavnet til Ŧ:editŧ.
6. Legg til et mellomrom og starten på et eksisterende filnavn: :edit FIL
7. Trykk <TAB>. Vim vil fullføre navnet (hvis det er unikt).
MERK: Fullføring fungerer for mange kommandoer. Prøv ved å trykke CTRL-D og
<TAB>. Det er spesielt nyttig for bruk sammen med :help .
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OPPSUMMERING AV LEKSJON 7
1. Skriv :help eller trykk <F1> eller <Help> for å åpne et hjelpevindu.
2. Skriv :help kommando for å få hjelp om kommando .
3. Trykk CTRL-W CTRL-W for å hoppe til et annet vindu.
4. Trykk :q for å lukke hjelpevinduet.
5. Opprett et vimrc-oppstartsskript for å lagre favorittvalgene dine.
6. Når du skriver en Ŧ:ŧ-kommando, trykk CTRL-D for å se mulige
fullføringer. Trykk <TAB> for å bruke en fullføring.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Her slutter innføringen i Vim. Den var ment som en rask oversikt over
editoren, akkurat nok til å la deg sette i gang med enkel bruk. Den er på
langt nær komplett, da Vim har mange flere kommandoer. Les bruksanvisningen
ved å skrive :help user-manual .
For videre lesing og studier, kan denne boken anbefales:
ŦVim - Vi Improvedŧ av Steve Oualline
Utgiver: New Riders
Den første boken som er fullt og helt dedisert til Vim. Spesielt nyttig for
nybegynnere. Inneholder mange eksempler og illustrasjoner.
Se http://iccf-holland.org/click5.html
Denne boken er eldre og handler mer om Vi enn Vim, men anbefales også:
ŦLearning the Vi Editorŧ av Linda Lamb
Utgiver: O'Reilly & Associates Inc.
Det er en god bok for å få vite omtrent hva som helst om Vi.
Den sjette utgaven inneholder også informasjon om Vim.
Denne innføringen er skrevet av Michael C. Pierce og Robert K. Ware,
Colorado School of Mines med idéer av Charles Smith, Colorado State
University. E-mail: bware@mines.colorado.edu .
Modifisert for Vim av Bram Moolenaar.
Oversatt av Øyvind A. Holm. E-mail: vimtutor _AT_ sunbase.org
Id: tutor.no 406 2007-03-18 22:48:36Z sunny
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
vim: set ts=8 :

973
samples/Text/tutor.no Normal file
View File

@@ -0,0 +1,973 @@
===============================================================================
= V e l k o m m e n t i l i n n f ø r i n g e n i V i m -- Ver. 1.7 =
===============================================================================
Vim er en meget kraftig editor med mange kommandoer, alt for mange til å
kunne gå gjennom alle i en innføring som denne. Den er beregnet på å
sette deg inn i bruken av nok kommandoer så du vil være i stand til lett
å kunne bruke Vim som en editor til alle formål.
Tiden som kreves for å gå gjennom denne innføringen tar ca. 25-30
minutter, avhengig av hvor mye tid du bruker til eksperimentering.
MERK:
Kommandoene i leksjonene vil modifisere teksten. Lag en kopi av denne
filen som du kan øve deg på (hvis du kjørte «vimtutor»-kommandoen, er
dette allerede en kopi).
Det er viktig å huske at denne innføringen er beregnet på læring gjennom
bruk. Det betyr at du må utføre kommandoene for å lære dem skikkelig.
Hvis du bare leser teksten, vil du glemme kommandoene!
Først av alt, sjekk at «Caps Lock» IKKE er aktiv og trykk «j»-tasten for
å flytte markøren helt til leksjon 1.1 fyller skjermen.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 1.1: FLYTTING AV MARKØREN
** For å flytte markøren, trykk tastene h, j, k, l som vist. **
^
k Tips: h-tasten er til venstre og flytter til venstre.
< h l > l-tasten er til høyre og flytter til høyre.
j j-tasten ser ut som en pil som peker nedover.
v
1. Flytt markøren rundt på skjermen til du har fått det inn i fingrene.
2. Hold inne nedovertasten (j) til den repeterer.
Nå vet du hvordan du beveger deg til neste leksjon.
3. Gå til leksjon 1.2 ved hjelp av nedovertasten.
Merk: Hvis du blir usikker på noe du har skrevet, trykk <ESC> for å gå til
normalmodus. Skriv deretter kommandoen du ønsket på nytt.
Merk: Piltastene skal også virke. Men ved å bruke hjkl vil du være i stand til
å bevege markøren mye raskere når du er blitt vant til det. Helt sant!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 1.2: AVSLUTTE VIM
!! MERK: Før du utfører noen av punktene nedenfor, les hele leksjonen!!
1. Trykk <ESC>-tasten (for å forsikre deg om at du er i normalmodus).
2. Skriv: :q! <ENTER>.
Dette avslutter editoren og FORKASTER alle forandringer som du har gjort.
3. Når du ser kommandolinjen i skallet, skriv kommandoen som startet denne
innføringen. Den er: vimtutor <ENTER>
4. Hvis du er sikker på at du husker dette, utfør punktene 1 til 3 for å
avslutte og starte editoren på nytt.
MERK: :q! <ENTER> forkaster alle forandringer som du gjorde. I løpet av noen
få leksjoner vil du lære hvordan du lagrer forandringene til en fil.
5. Flytt markøren ned til leksjon 1.3.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 1.3: REDIGERING AV TEKST -- SLETTING
** Trykk x for å slette tegnet under markøren. **
1. Flytt markøren til den første linjen merket med --->.
2. For å ordne feilene på linjen, flytt markøren til den er oppå tegnet som
skal slettes.
3. Trykk tasten x for å slette det uønskede tegnet.
4. Repeter punkt 2 til 4 til setningen er lik den som er under.
---> Hessstennnn brrråsnudddde ii gaaata.
---> Hesten bråsnudde i gata.
5. Nå som linjen er korrekt, gå til leksjon 1.4.
MERK: Når du går gjennom innføringen, ikke bare prøv å huske kommandoene, men
bruk dem helt til de sitter.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 1.4: REDIGERING AV TEKST -- INNSETTING
** Trykk i for å sette inn tekst. **
1. Flytt markøren til den første linjen som er merket med --->.
2. For å gjøre den første linjen lik den andre, flytt markøren til den står
på tegnet ETTER posisjonen der teksten skal settes inn.
3. Trykk i og skriv inn teksten som mangler.
4. Etterhvert som hver feil er fikset, trykk <ESC> for å returnere til
normalmodus. Repeter punkt 2 til 4 til setningen er korrekt.
---> Det er tkst som mnglr .
---> Det er ganske mye tekst som mangler her.
5. Når du føler deg komfortabel med å sette inn tekst, gå til oppsummeringen
nedenfor.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 1.5: REDIGERING AV TEKST -- LEGGE TIL
** Trykk A for å legge til tekst. **
1. Flytt markøren til den første linjen nedenfor merket --->.
Det har ikke noe å si hvor markøren er plassert på den linjen.
2. Trykk A og skriv inn det som skal legges til.
3. Når teksten er lagt til, trykk <ESC> for å returnere til normalmodusen.
4. Flytt markøren til den andre linjen markert med ---> og repeter steg 2 og
3 for å reparere denne setningen.
---> Det mangler noe tekst p
Det mangler noe tekst på denne linjen.
---> Det mangler også litt tek
Det mangler også litt tekst på denne linjen.
5. Når du føler at du behersker å legge til tekst, gå til leksjon 1.6.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 1.6: REDIGERE EN FIL
** Bruk :wq for å lagre en fil og avslutte. **
!! MERK: Før du utfører noen av stegene nedenfor, les hele denne leksjonen!!
1. Avslutt denne innføringen som du gjorde i leksjon 1.2: :q!
2. Skriv denne kommandoen på kommandolinja: vim tutor <ENTER>
«vim» er kommandoen for å starte Vim-editoren, «tutor» er navnet på fila
som du vil redigere. Bruk en fil som kan forandres.
3. Sett inn og slett tekst som du lærte i de foregående leksjonene.
4. Lagre filen med forandringene og avslutt Vim med: :wq <ENTER>
5. Start innføringen på nytt og flytt ned til oppsummeringen som følger.
6. Etter å ha lest og forstått stegene ovenfor: Sett i gang.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OPPSUMMERING AV LEKSJON 1
1. Markøren beveges ved hjelp av piltastene eller hjkl-tastene.
h (venstre) j (ned) k (opp) l (høyre)
2. For å starte Vim fra skall-kommandolinjen, skriv: vim FILNAVN <ENTER>
3. For å avslutte Vim, skriv: <ESC> :q! <ENTER> for å forkaste endringer.
ELLER skriv: <ESC> :wq <ENTER> for å lagre forandringene.
4. For å slette tegnet under markøren, trykk: x
5. For å sette inn eller legge til tekst, trykk:
i skriv innsatt tekst <ESC> sett inn før markøren
A skriv tillagt tekst <ESC> legg til på slutten av linjen
MERK: Når du trykker <ESC> går du til normalmodus eller du avbryter en uønsket
og delvis fullført kommando.
Nå kan du gå videre til leksjon 2.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 2.1: SLETTEKOMMANDOER
** Trykk dw for å slette et ord. **
1. Trykk <ESC> for å være sikker på at du er i normalmodus.
2. Flytt markøren til den første linjen nedenfor merket --->.
3. Flytt markøren til begynnelsen av ordet som skal slettes.
4. Trykk dw og ordet vil forsvinne.
MERK: Bokstaven d vil komme til syne på den nederste linjen på skjermen når
du skriver den. Vim venter på at du skal skrive w . Hvis du ser et annet
tegn enn d har du skrevet noe feil; trykk <ESC> og start på nytt.
---> Det er agurk tre ord eple som ikke hører pære hjemme i denne setningen.
---> Det er tre ord som ikke hører hjemme i denne setningen.
5. Repeter punkt 3 og 4 til den første setningen er lik den andre. Gå
deretter til leksjon 2.2.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 2.2: FLERE SLETTEKOMMANDOER
** Trykk d$ for å slette til slutten av linjen. **
1. Trykk <ESC> for å være sikker på at du er i normalmodus.
2. Flytt markøren til linjen nedenfor merket --->.
3. Flytt markøren til punktet der linjen skal kuttes (ETTER første punktum).
4. Trykk d$ for å slette alt til slutten av linjen.
---> Noen skrev slutten på linjen en gang for mye. linjen en gang for mye.
5. Gå til leksjon 2.3 for å forstå hva som skjer.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 2.3: OM OPERATORER OG BEVEGELSER
Mange kommandoer som forandrer teksten er laget ut i fra en operator og en
bevegelse. Formatet for en slettekommando med sletteoperatoren d er:
d bevegelse
Der:
d - er sletteoperatoren.
bevegelse - er hva operatoren vil opere på (listet nedenfor).
En kort liste med bevegelser:
w - til starten av det neste ordet, UNNTATT det første tegnet.
e - til slutten av det nåværende ordet, INKLUDERT det siste tegnet.
$ - til slutten av linjen, INKLUDERT det siste tegnet.
Ved å skrive de vil altså alt fra markøren til slutten av ordet bli
slettet.
MERK: Ved å skrive kun bevegelsen i normalmodusen uten en operator vil
markøren flyttes som spesifisert.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LEKSJON 2.4: BRUK AV TELLER FOR EN BEVEGELSE
** Ved å skrive et tall foran en bevegelse repeterer den så mange ganger. **
1. Flytt markøren til starten av linjen markert ---> nedenfor.
2. Skriv 2w for å flytte markøren to ord framover.
3. Skriv 3e for å flytte markøren framover til slutten av det tredje
ordet.
4. Skriv 0 (null) for å flytte til starten av linjen.
5. Repeter steg 2 og 3 med forskjellige tall.
---> Dette er en linje med noen ord som du kan bevege deg rundt på.
6. Gå videre til leksjon 2.5.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 2.5: BRUK AV ANTALL FOR Å SLETTE MER
** Et tall sammen med en operator repeterer den så mange ganger. **
I kombinasjonen med sletteoperatoren og en bevegelse nevnt ovenfor setter du
inn antall før bevegelsen for å slette mer:
d nummer bevegelse
1. Flytt markøren til det første ordet med STORE BOKSTAVER på linjen markert
med --->.
2. Skriv 2dw for å slette de to ordene med store bokstaver.
3. Repeter steg 1 og 2 med forskjelling antall for å slette de etterfølgende
ordene som har store bokstaver.
---> Denne ABC DE linjen FGHI JK LMN OP er nå Q RS TUV litt mer lesbar.
MERK: Et antall mellom operatoren d og bevegelsen virker på samme måte som å
bruke bevegelsen uten en operator.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 2.6: OPERERE PÅ LINJER
** Trykk dd for å slette en hel linje. **
På grunn av at sletting av linjer er mye brukt, fant utviklerne av Vi ut at
det vil være lettere å rett og slett trykke to d-er for å slette en linje.
1. Flytt markøren til den andre linjen i verset nedenfor.
2. Trykk dd å slette linjen.
3. Flytt deretter til den fjerde linjen.
4. Trykk 2dd for å slette to linjer.
---> 1) Roser er røde,
---> 2) Gjørme er gøy,
---> 3) Fioler er blå,
---> 4) Jeg har en bil,
---> 5) Klokker viser tiden,
---> 6) Druer er søte
---> 7) Og du er likeså.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 2.7: ANGRE-KOMMANDOEN
** Trykk u for å angre siste kommando, U for å fikse en hel linje. **
1. Flytt markøren til linjen nedenfor merket ---> og plasser den på den
første feilen.
2. Trykk x for å slette det første uønskede tegnet.
3. Trykk så u for å angre den siste utførte kommandoen.
4. Deretter ordner du alle feilene på linjene ved å bruke kommandoen x .
5. Trykk nå en stor U for å sette linjen tilbake til det den var
originalt.
6. Trykk u noen ganger for å angre U og foregående kommandoer.
7. Deretter trykker du CTRL-R (hold CTRL nede mens du trykker R) noen
ganger for å gjenopprette kommandoene (omgjøre angrekommandoene).
---> RReparer feiilene påå denne linnnjen oog erssstatt dem meed angre.
8. Dette er meget nyttige kommandoer. Nå kan du gå til oppsummeringen av
leksjon 2.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OPPSUMMERING AV LEKSJON 2
1. For å slette fra markøren fram til det neste ordet, trykk: dw
2. For å slette fra markøren til slutten av en linje, trykk: d$
3. For å slette en hel linje, trykk: dd
4. For å repetere en bevegelse, sett et nummer foran: 2w
5. Formatet for en forandringskommando er:
operator [nummer] bevegelse
der:
operator - hva som skal gjøres, f.eks. d for å slette
[nummer] - et valgfritt antall for å repetere bevegelsen
bevegelse - hva kommandoen skal operere på, eksempelvis w (ord),
$ (til slutten av linjen) og så videre.
6. For å gå til starten av en linje, bruk en null: 0
7. For å angre tidligere endringer, skriv: u (liten u)
For å angre alle forandringer på en linje, skriv: U (stor U)
For å omgjøre angringen, trykk: CTRL-R
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 3.1: «LIM INN»-KOMMANDOEN
** Trykk p for å lime inn tidligere slettet tekst etter markøren **
1. Flytt markøren til den første linjen med ---> nedenfor.
2. Trykk dd for å slette linjen og lagre den i et Vim-register.
3. Flytt markøren til c)-linjen, OVER posisjonen linjen skal settes inn.
4. Trykk p for å legge linjen under markøren.
5. Repeter punkt 2 til 4 helt til linjene er i riktig rekkefølge.
---> d) Kan du også lære?
---> b) Fioler er blå,
---> c) Intelligens må læres,
---> a) Roser er røde,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 3.2: «ERSTATT»-KOMMANDOEN
** Trykk rx for å erstatte tegnet under markøren med x. **
1. Flytt markøren til den første linjen nedenfor merket --->.
2. Flytt markøren så den står oppå den første feilen.
3. Trykk r og deretter tegnet som skal være der.
4. Repeter punkt 2 og 3 til den første linjen er lik den andre.
---> Da dfnne lynjxn ble zkrevet, var det nøen som tjykket feite taster!
---> Da denne linjen ble skrevet, var det noen som trykket feile taster!
5. Gå videre til leksjon 3.2.
MERK: Husk at du bør lære ved å BRUKE, ikke pugge.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 3.3: «FORANDRE»-OPERATOREN
** For å forandre til slutten av et ord, trykk ce . **
1. Flytt markøren til den første linjen nedenfor som er merket --->.
2. Plasser markøren på u i «lubjwr».
3. Trykk ce og det korrekte ordet (i dette tilfellet, skriv «injen»).
4. Trykk <ESC> og gå til det neste tegnet som skal forandres.
5. Repeter punkt 3 og 4 helt til den første setningen er lik den andre.
---> Denne lubjwr har noen wgh som må forkwåp med «forækzryas»-kommandoen.
---> Denne linjen har noen ord som må forandres med «forandre»-kommandoen.
Vær oppmerksom på at ce sletter ordet og går inn i innsettingsmodus.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 3.4: FLERE FORANDRINGER VED BRUK AV c
** Forandringskommandoen blir brukt med de samme bevegelser som «slett». **
1. Forandringsoperatoren fungerer på samme måte som «slett». Formatet er:
c [nummer] bevegelse
2. Bevegelsene er de samme, som for eksempel w (ord) og $ (slutten av en
linje).
3. Gå til den første linjen nedenfor som er merket --->.
4. Flytt markøren til den første feilen.
5. Skriv c$ og skriv resten av linjen lik den andre og trykk <ESC>.
---> Slutten på denne linjen trenger litt hjelp for å gjøre den lik den neste.
---> Slutten på denne linjen trenger å bli rettet ved bruk av c$-kommandoen.
MERK: Du kan bruke slettetasten for å rette feil mens du skriver.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OPPSUMMERING AV LEKSJON 3
1. For å legge tilbake tekst som nettopp er blitt slettet, trykk p . Dette
limer inn den slettede teksten ETTER markøren (hvis en linje ble slettet
vil den bli limt inn på linjen under markøren).
2. For å erstatte et tegn under markøren, trykk r og deretter tegnet som
du vil ha der.
3. Forandringsoperatoren lar deg forandre fra markøren til dit bevegelsen
tar deg. Det vil si, skriv ce for å forandre fra markøren til slutten
av ordet, c$ for å forandre til slutten av linjen.
4. Formatet for «forandre» er:
c [nummer] bevegelse
Nå kan du gå til neste leksjon.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 4.1: POSISJONERING AV MARKØREN OG FILSTATUS
** Trykk CTRL-G for å vise posisjonen i filen og filstatusen.
Trykk G for å gå til en spesifikk linje i filen. **
Merk: Les hele leksjonen før du utfører noen av punktene!
1. Hold nede Ctrl-tasten og trykk g . Vi kaller dette CTRL-G. En melding
vil komme til syne på bunnen av skjermen med filnavnet og posisjonen i
filen. Husk linjenummeret for bruk i steg 3.
Merk: Du kan se markørposisjonen i nederste høyre hjørne av skjermen. Dette
skjer når «ruler»-valget er satt (forklart i leksjon 6).
2. Trykk G for å gå til bunnen av filen.
Skriv gg for å gå til begynnelsen av filen.
3. Skriv inn linjenummeret du var på og deretter G . Dette vil føre deg
tilbake til linjen du var på da du først trykket CTRL-G.
4. Utfør steg 1 til 3 hvis du føler deg sikker på prosedyren.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 4.2: SØKEKOMMANDOEN
** Skriv / etterfulgt av en søkestreng som du vil lete etter. **
1. Trykk / når du er i normalmodusen. Legg merke til at skråstreken og
markøren kommer til syne på bunnen av skjermen i likhet med
«:»-kommandoene.
2. Skriv «feeeiil» og trykk <ENTER>. Dette er teksten du vil lete etter.
3. For å finne neste forekomst av søkestrengen, trykk n .
For å lete etter samme søketeksten i motsatt retning, trykk N .
4. For å lete etter en tekst bakover i filen, bruk ? istedenfor / .
5. For å gå tilbake til der du kom fra, trykk CTRL-O (Hold Ctrl nede mens
du trykker bokstaven o ). Repeter for å gå enda lengre tilbake. CTRL-I
går framover.
---> «feeeiil» er ikke måten å skrive «feil» på, feeeiil er helt feil.
Merk: Når søkingen når slutten av filen, vil den fortsette fra starten unntatt
hvis «wrapscan»-valget er resatt.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 4.3: FINN SAMSVARENDE PARENTESER
** Trykk % for å finne en samsvarende ), ] eller } . **
1. Plasser markøren på en (, [ eller { på linjen nedenfor merket --->.
2. Trykk % .
3. Markøren vil gå til den samsvarende parentesen eller hakeparentesen.
4. Trykk % for å flytte markøren til den andre samsvarende parentesen.
5. Flytt markøren til en annen (, ), [, ], { eller } og se hva % gjør.
---> Dette ( er en testlinje med (, [ ] og { } i den )).
Merk: Dette er veldig nyttig til feilsøking i programmer som har ubalansert
antall parenteser!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 4.4: ERSTATT-KOMMANDOEN
** Skriv :s/gammel/ny/g for å erstatte «gammel» med «ny». **
1. Flytt markøren til linjen nedenfor som er merket med --->.
2. Skriv :s/deen/den/ <ENTER> . Legg merke til at denne kommandoen bare
forandrer den første forekomsten av «deen» på linjen.
3. Skriv :s/deen/den/g . Når g-flagget legges til, betyr dette global
erstatning på linjen og erstatter alle forekomster av «deen» på linjen.
---> deen som kan kaste deen tyngste steinen lengst er deen beste
4. For å erstatte alle forekomster av en tekststreng mellom to linjer,
skriv :#,#s/gammel/ny/g der #,# er linjenumrene på de to linjene for
linjeområdet erstatningen skal gjøres.
Skriv :%s/gammel/ny/g for å erstatte tekst i hele filen.
Skriv :%s/gammel/ny/gc for å finne alle forekomster i hele filen, og
deretter spørre om teksten skal erstattes eller
ikke.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OPPSUMMERING AV LEKSJON 4
1. Ctrl-G viser nåværende posisjon i filen og filstatusen.
G går til slutten av filen.
nummer G går til det linjenummeret.
gg går til den første linjen.
2. Skriv / etterfulgt av en søketekst for å lete FRAMOVER etter teksten.
Skriv ? etterfulgt av en søketekst for å lete BAKOVER etter teksten.
Etter et søk kan du trykke n for å finne neste forekomst i den samme
retningen eller N for å lete i motsatt retning.
CTRL-O tar deg tilbake til gamle posisjoner, CTRL-I til nyere posisjoner.
3. Skriv % når markøren står på en (, ), [, ], { eller } for å finne den
som samsvarer.
4. Erstatte «gammel» med første «ny» på en linje: :s/gammel/ny
Erstatte alle «gammel» med «ny» på en linje: :s/gammel/ny/g
Erstatte tekst mellom to linjenumre: :#,#s/gammel/ny/g
Erstatte alle forekomster i en fil: :%s/gammel/ny/g
For å godkjenne hver erstatning, legg til «c»: :%s/gammel/ny/gc
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 5.1: HVORDAN UTFØRE EN EKSTERN KOMMANDO
** Skriv :! etterfulgt av en ekstern kommando for å utføre denne. **
1. Skriv den velkjente kommandoen : for å plassere markøren på bunnen av
skjermen. Dette lar deg skrive en kommandolinjekommando.
2. Nå kan du skrive tegnet ! . Dette lar deg utføre en hvilken som helst
ekstern kommando.
3. Som et eksempel, skriv ls etter utropstegnet og trykk <ENTER>. Du vil
nå få en liste over filene i katalogen, akkurat som om du hadde kjørt
kommandoen direkte fra kommandolinjen i skallet. Eller bruk :!dir hvis
«ls» ikke virker.
MERK: Det er mulig å kjøre alle eksterne kommandoer på denne måten, også med
parametere.
MERK: Alle «:»-kommandoer må avsluttes med <ENTER>. Fra dette punktet er det
ikke alltid vi nevner det.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 5.2: MER OM LAGRING AV FILER
** For å lagre endringene gjort i en tekst, skriv :w FILNAVN. **
1. Skriv :!dir eller :!ls for å få en liste over filene i katalogen. Du
vet allerede at du må trykke <ENTER> etter dette.
2. Velg et filnavn på en fil som ikke finnes, som for eksempel TEST .
3. Skriv :w TEST (der TEST er filnavnet du velger).
4. Dette lagrer hele filen (denne innføringen) under navnet TEST . For å
sjekke dette, skriv :!dir eller :!ls igjen for å se innholdet av
katalogen.
Merk: Hvis du nå hadde avsluttet Vim og startet på nytt igjen med «vim TEST»,
ville filen vært en eksakt kopi av innføringen da du lagret den.
5. Fjern filen ved å skrive :!rm TEST hvis du er på et Unix-lignende
operativsystem, eller :!del TEST hvis du bruker MS-DOS.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 5.3: VELGE TEKST SOM SKAL LAGRES
** For å lagre en del av en fil, skriv v bevegelse :w FILNAVN **
1. Flytt markøren til denne linjen.
2. Trykk v og flytt markøren til det femte elementet nedenfor. Legg merke
til at teksten blir markert.
3. Trykk : (kolon). På bunnen av skjermen vil :'<,'> komme til syne.
4. Trykk w TEST , der TEST er et filnavn som ikke finnes enda. Kontroller
at du ser :'<,'>w TEST før du trykker Enter.
5. Vim vil skrive de valgte linjene til filen TEST. Bruk :!dir eller :!ls
for å se den. Ikke slett den enda! Vi vil bruke den i neste leksjon.
MERK: Ved å trykke v startes visuelt valg. Du kan flytte markøren rundt for
å gjøre det valgte området større eller mindre. Deretter kan du bruke en
operator for å gjøre noe med teksten. For eksempel sletter d teksten.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 5.4: HENTING OG SAMMENSLÅING AV FILER
** For å lese inn en annen fil inn i nåværende buffer, skriv :r FILNAVN **
1. Plasser markøren like over denne linjen.
MERK: Etter å ha utført steg 2 vil du se teksten fra leksjon 5.3. Gå deretter
NED for å se denne leksjonen igjen.
2. Hent TEST-filen ved å bruke kommandoen :r TEST der TEST er navnet på
filen du brukte. Filen du henter blir plassert nedenfor markørlinjen.
3. For å sjekke at filen ble hentet, gå tilbake og se at det er to kopier av
leksjon 5.3, originalen og denne versjonen.
MERK: Du kan også lese utdataene av en ekstern kommando. For eksempel, :r !ls
leser utdataene av ls-kommandoen og legger dem nedenfor markøren.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OPPSUMMERING AV LEKSJON 5
1. :!kommando utfører en ekstern kommandio.
Noen nyttige eksempler er:
(MS-DOS) (Unix)
:!dir :!ls - List filene i katalogen.
:!del FILNAVN :!rm FILNAVN - Slett filen FILNAVN.
2. :w FILNAVN skriver den nåværende Vim-filen disken med navnet FILNAVN .
3. v bevegelse :w FILNAVN lagrer de visuelt valgte linjene til filen
FILNAVN.
4. :r FILNAVN henter filen FILNAVN og legger den inn nedenfor markøren.
5. :r !dir leser utdataene fra «dir»-kommandoen og legger dem nedenfor
markørposisjonen.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 6.1: «ÅPNE LINJE»-KOMMANDOEN
** Skriv o for å «åpne opp» for en ny linje etter markøren og gå til
innsettingsmodus **
1. Flytt markøren til linjen nedenfor merket --->.
2. Skriv o (liten o) for å åpne opp en linje NEDENFOR markøren og gå inn i
innsettingsmodus.
3. Skriv litt tekst og trykk <ESC> for å gå ut av innsettingsmodusen.
---> Etter at o er skrevet blir markøren plassert på den tomme linjen.
4. For å åpne en ny linje OVER markøren, trykk rett og slett en stor O
istedenfor en liten o . Prøv dette på linjen nedenfor.
---> Lag ny linje over denne ved å trykke O mens markøren er på denne linjen.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 6.2: «LEGG TIL»-KOMMANDOEN
** Skriv a for å legge til tekst ETTER markøren. **
1. Flytt markøren til starten av linjen merket ---> nedenfor.
2. Trykk e til markøren er på slutten av «li».
3. Trykk a (liten a) for å legge til tekst ETTER markøren.
4. Fullfør ordet sånn som på linjen nedenfor. Trykk <ESC> for å gå ut av
innsettingsmodusen.
5. Bruk e for å gå til det neste ufullstendige ordet og repeter steg 3 og
4.
---> Denne li lar deg øve på å leg til tek på en linje.
---> Denne linjen lar deg øve på å legge til tekst på en linje.
Merk: a, i og A går alle til den samme innsettingsmodusen, den eneste
forskjellen er hvor tegnene blir satt inn.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 6.3: EN ANNEN MÅTE Å ERSTATTE PÅ
** Skriv en stor R for å erstatte mer enn ett tegn. **
1. Flytt markøren til den første linjen nedenfor merket --->. Flytt markøren
til begynnelsen av den første «xxx»-en.
2. Trykk R og skriv inn tallet som står nedenfor på den andre linjen så
det erstatter xxx.
3. Trykk <ESC> for å gå ut av erstatningsmodusen. Legg merke til at resten
av linjen forblir uforandret.
4. Repeter stegene for å erstatte den gjenværende xxx.
---> Ved å legge 123 til xxx får vi xxx.
---> Ved å legge 123 til 456 får vi 579.
MERK: Erstatningsmodus er lik insettingsmodus, men hvert tegn som skrives
erstatter et eksisterende tegn.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 6.4: KOPIERE OG LIME INN TEKST
** Bruk y-operatoren for å kopiere tekst og p for å lime den inn **
1. Gå til linjen merket ---> nedenfor og plasser markøren etter «a)».
2. Gå inn i visuell modus med v og flytt markøren til like før «første».
3. Trykk y for å kopiere (engelsk: «yank») den uthevede teksten.
4. Flytt markøren til slutten av den neste linjen: j$
5. Trykk p for å lime inn teksten. Trykk deretter: a andre <ESC> .
6. Bruk visuell modus for å velge « valget.», kopier det med y , gå til
slutten av den neste linjen med j$ og legg inn teksten der med p .
---> a) Dette er det første valget.
b)
Merk: Du kan også bruke y som en operator; yw kopierer ett ord.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 6.5: SETT VALG
** Sett et valg så søk eller erstatning ignorerer store/små bokstaver. **
1. Let etter «ignore» ved å skrive: /ignore <ENTER>
Repeter flere ganger ved å trykke n .
2. Sett «ic»-valget (Ignore Case) ved å skrive: :set ic
3. Søk etter «ignore» igjen ved å trykke n .
Legg merke til at både «Ignore» og «IGNORE» blir funnet.
4. Sett «hlsearch»- og «incsearch»-valgene: :set hls is
5. Skriv søkekommandoen igjen og se hva som skjer: /ignore <ENTER>
6. For å slå av ignorering av store/små bokstaver, skriv: :set noic
Merk: For å fjerne uthevingen av treff, skriv: :nohlsearch
Merk: Hvis du vil ignorere store/små bokstaver for kun en søkekommando, bruk
\c i uttrykket: /ignore\c <ENTER>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OPPSUMMERING AV LEKSJON 6
1. Trykk o for å legge til en linje NEDENFOR markøren og gå inn i
innsettingsmodus.
Trykk O for å åpne en linje OVER markøren.
2. Skriv a for å sette inn tekst ETTER markøren.
Skriv A for å sette inn tekst etter slutten av linjen.
3. Kommandoen e går til slutten av et ord.
4. Operatoren y («yank») kopierer tekst, p («paste») limer den inn.
5. Ved å trykke R går du inn i erstatningsmodus helt til <ESC> trykkes.
6. Skriv «:set xxx» for å sette valget «xxx». Noen valg er:
«ic» «ignorecase» ignorer store/små bokstaver under søk
«is» «incsearch» vis delvise treff for en søketekst
«hls» «hlsearch» uthev alle søketreff
7. Legg til «no» foran valget for å slå det av: :set noic
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 7.1: FÅ HJELP
** Bruk det innebygde hjelpesystemet. **
Vim har et omfattende innebygget hjelpesystem. For å starte det, prøv en av
disse måtene:
- Trykk Hjelp-tasten (hvis du har en)
- Trykk F1-tasten (hvis du har en)
- Skriv :help <ENTER>
Les teksten i hjelpevinduet for å finne ut hvordan hjelpen virker.
Skriv CTRL-W CTRL-W for å hoppe fra et vindu til et annet
Skriv :q <ENTER> for å lukke hjelpevinduet.
Du kan få hjelp for omtrent alle temaer om Vim ved å skrive et parameter til
«:help»-kommandoen. Prøv disse (ikke glem å trykke <ENTER>):
:help w
:help c_CTRL-D
:help insert-index
:help user-manual
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 7.2: LAG ET OPPSTARTSSKRIPT
** Slå på funksjoner i Vim **
Vim har mange flere funksjoner enn Vi, men flesteparten av dem er slått av
som standard. For å begynne å bruke flere funksjoner må du lage en
«vimrc»-fil.
1. Start redigeringen av «vimrc»-filen. Dette avhenger av systemet ditt:
:e ~/.vimrc for Unix
:e $VIM/_vimrc for MS Windows
2. Les inn eksempelfilen for «vimrc»:
:r $VIMRUNTIME/vimrc_example.vim
3. Lagre filen med:
:w
Neste gang du starter Vim vil den bruke syntaks-utheving. Du kan legge til
alle dine foretrukne oppsett i denne «vimrc»-filen.
For mer informasjon, skriv :help vimrc-intro
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 7.3: FULLFØRING
** Kommandolinjefullføring med CTRL-D og <TAB> **
1. Vær sikker på at Vim ikke er i Vi-kompatibel modus: :set nocp
2. Se hvilke filer som er i katalogen: :!ls eller :!dir
3. Skriv starten på en kommando: :e
4. Trykk CTRL-D og Vim vil vise en liste over kommandoer som starter med
«e».
5. Trykk <TAB> og Vim vil fullføre kommandonavnet til «:edit».
6. Legg til et mellomrom og starten på et eksisterende filnavn: :edit FIL
7. Trykk <TAB>. Vim vil fullføre navnet (hvis det er unikt).
MERK: Fullføring fungerer for mange kommandoer. Prøv ved å trykke CTRL-D og
<TAB>. Det er spesielt nyttig for bruk sammen med :help .
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OPPSUMMERING AV LEKSJON 7
1. Skriv :help eller trykk <F1> eller <Help> for å åpne et hjelpevindu.
2. Skriv :help kommando for å få hjelp om kommando .
3. Trykk CTRL-W CTRL-W for å hoppe til et annet vindu.
4. Trykk :q for å lukke hjelpevinduet.
5. Opprett et vimrc-oppstartsskript for å lagre favorittvalgene dine.
6. Når du skriver en «:»-kommando, trykk CTRL-D for å se mulige
fullføringer. Trykk <TAB> for å bruke en fullføring.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Her slutter innføringen i Vim. Den var ment som en rask oversikt over
editoren, akkurat nok til å la deg sette i gang med enkel bruk. Den er på
langt nær komplett, da Vim har mange flere kommandoer. Les bruksanvisningen
ved å skrive :help user-manual .
For videre lesing og studier, kan denne boken anbefales:
«Vim - Vi Improved» av Steve Oualline
Utgiver: New Riders
Den første boken som er fullt og helt dedisert til Vim. Spesielt nyttig for
nybegynnere. Inneholder mange eksempler og illustrasjoner.
Se http://iccf-holland.org/click5.html
Denne boken er eldre og handler mer om Vi enn Vim, men anbefales også:
«Learning the Vi Editor» av Linda Lamb
Utgiver: O'Reilly & Associates Inc.
Det er en god bok for å få vite omtrent hva som helst om Vi.
Den sjette utgaven inneholder også informasjon om Vim.
Denne innføringen er skrevet av Michael C. Pierce og Robert K. Ware,
Colorado School of Mines med idéer av Charles Smith, Colorado State
University. E-mail: bware@mines.colorado.edu .
Modifisert for Vim av Bram Moolenaar.
Oversatt av Øyvind A. Holm. E-mail: vimtutor _AT_ sunbase.org
Id: tutor.no 406 2007-03-18 22:48:36Z sunny
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
vim: set ts=8 :

154
samples/Uno/PlayerPads.uno Normal file
View File

@@ -0,0 +1,154 @@
using Uno;
using Uno.Collections;
using Uno.Graphics;
using Uno.Scenes;
using Uno.Designer;
using Uno.Content;
using Uno.Content.Models;
using Uno.UI;
namespace PONG2D
{
public class PlayerPads : Node
{
Image _player1Image;
Image _player2Image;
[Inline]
public Image Player1
{
get { return _player1Image; }
set
{
if (_player1Image != value)
{
_player1Image = value;
}
}
}
[Inline]
public Image Player2
{
get { return _player2Image; }
set
{
if (_player2Image != value)
{
_player2Image = value;
}
}
}
[Hide]
public float2 Player1Pos
{
get { return (Player1.ActualPosition); }
set
{
if (Player1 != null)
Player1.Position = value;
}
}
[Hide]
public float2 Player2Pos
{
get { return (Player2.ActualPosition); }
set
{
if (Player2 != null)
Player2.Position = value;
}
}
public Rect Player1Rect
{
get { return new Rect(Player1Pos, float2(Player1.Width, Player2.Height)); }
set
{
Player1Pos = value.Position;
if (Player1 != null)
{
Player1.Width = value.Size.X;
Player1.Height = value.Size.Y;
}
}
}
public Rect Player2Rect
{
get { return new Rect(Player2Pos, float2(Player2.Width, Player2.Height)); }
set
{
Player2Pos = value.Position;
if (Player2 != null)
{
Player2.Width = value.Size.X;
Player2.Height = value.Size.Y;
}
}
}
public Ball Ball
{
get;
set;
}
public float PadVelocity { get; set; }
public PlayerPads()
{
}
void UpdatePositions()
{
}
protected override void OnUpdate()
{
base.OnUpdate();
if (Input.IsKeyDown(Uno.Platform.Key.W))
{
Player1Pos = float2(0, Player1Pos.Y - PadVelocity);
}
if (Input.IsKeyDown(Uno.Platform.Key.S))
{
Player1Pos = float2(0, Player1Pos.Y + PadVelocity);
}
if (Input.IsKeyDown(Uno.Platform.Key.Up))
{
Player2Pos = float2(0, Player2Pos.Y - PadVelocity);
}
if (Input.IsKeyDown(Uno.Platform.Key.Down))
{
Player2Pos = float2(0, Player2Pos.Y + PadVelocity);
}
if (Ball != null)
{
if (Ball.BallRectangle.Intersects(Player1Rect) ||
Ball.BallRectangle.Intersects(Player2Rect))
{
Ball.BallVelocity = float2(Ball.BallVelocity.X * -1f, Ball.BallVelocity.Y);
}
}
}
}
}

139
samples/Uno/Pong.uno Normal file
View File

@@ -0,0 +1,139 @@
using Uno;
using Uno.Collections;
using Uno.Graphics;
using Uno.Scenes;
using Uno.Content;
using Uno.Content.Models;
namespace PONG2D
{
public class Pong : Node
{
float2 _player1Pos;
float2 _player2Pos;
float2 ballPosition;
float2 ballVelocity;
float2 rectangleSize;
Rect player1Rect;
Rect player2Rect;
Rect ballRect;
float2 resolution = Context.VirtualResolution;
Random random = new Random(1);
float2 Player1Pos
{
get { return _player1Pos; }
set
{
_player1Pos = Math.Clamp(value, float2(0, 0), resolution - rectangleSize);
}
}
float2 Player2Pos
{
get { return _player2Pos; }
set
{
_player2Pos = Math.Clamp(value, float2(0, 0), resolution - rectangleSize);
}
}
public Pong()
{
Uno.Scenes.Input.AddGlobalListener(this);
}
protected override void OnInitialize()
{
base.OnInitialize();
UpdateValues();
}
void UpdateValues()
{
rectangleSize = float2(resolution.X / 80f, resolution.Y / 5f);
_player1Pos = float2(0f);
_player2Pos = float2(Context.VirtualResolution.X - rectangleSize.X, 0f);
player1Rect = new Rect(_player1Pos, rectangleSize);
player2Rect = new Rect(_player2Pos, rectangleSize);
ballPosition = float2(resolution.X * 0.5f - 10f, resolution.Y * 0.5f - 10f);
ballRect = new Rect(ballPosition, float2(20f));
SpwanBall();
}
void SpwanBall()
{
ballRect.Position = float2(resolution.X * 0.5f - 10f, resolution.Y * 0.5f - 10f);
ballVelocity = float2(5f, 10f) * 0.5f;
}
void OnWindowResize(object sender, EventArgs args)
{
//UpdateValues();
}
protected override void OnUpdate()
{
base.OnUpdate();
var padVelocity = resolution.Y * (float)Application.Current.FrameInterval * 4f;
if (Input.IsKeyDown(Uno.Platform.Key.Up))
{
Player1Pos = float2(Player1Pos.X, Player1Pos.Y - padVelocity);
}
if (Input.IsKeyDown(Uno.Platform.Key.Down))
{
Player1Pos = float2(Player1Pos.X, Player1Pos.Y + padVelocity);
}
if (Input.IsKeyDown(Uno.Platform.Key.W))
{
Player2Pos = float2(Player2Pos.X, Player2Pos.Y - padVelocity);
}
if (Input.IsKeyDown(Uno.Platform.Key.S))
{
Player2Pos = float2(Player2Pos.X, Player2Pos.Y + padVelocity);
}
player1Rect.Position = Player1Pos;
player2Rect.Position = Player2Pos;
if (ballRect.Position.X > resolution.X || ballRect.Position.X < 0)
{
SpwanBall();
}
if (ballRect.Position.Y > resolution.Y ||
ballRect.Position.Y < 0)
{
ballVelocity.Y *= -1f;
}
if (ballRect.Intersects(player1Rect) ||
ballRect.Intersects(player2Rect))
{
ballVelocity.X *= -1f;
}
ballRect.Position += ballVelocity;
}
protected override void OnDraw()
{
Uno.Drawing.RoundedRectangle.Draw(player1Rect.Position, player1Rect.Size, float4(1f), 0);
Uno.Drawing.RoundedRectangle.Draw(player2Rect.Position, player2Rect.Size, float4(1f), 0);
Uno.Drawing.RoundedRectangle.Draw(ballRect.Position, ballRect.Size, float4(1f), 0f);
}
}
}

136
samples/Uno/TowerBlock.uno Normal file
View File

@@ -0,0 +1,136 @@
using Uno;
using Uno.Collections;
using Uno.Graphics;
using Uno.Scenes;
using Uno.Content;
using Uno.Content.Models;
using Uno.Physics.Box2D;
using TowerBuilder.Box2DMath;
namespace TowerBuilder
{
public class TowerBlock : TestBed
{
Body floorBody, deleteBody, mouseBody;
private List<Body> bodies = new List<Body>();
private List<Body> bodiesToDelete = new List<Body>();
private ContactListener contactListener;
protected override void OnInitializeTestBed()
{
World.Gravity = float2(0, -25.0f);
World.ContactListener = contactListener = new ContactListener(this);
bodies.Clear();
bodiesToDelete.Clear();
CreateFloor();
CreateDeleteBody();
CreateBox2();
}
void CreateFloor()
{
var bodyDef = new BodyDef();
bodyDef.position = float2(0, -40.0f);
floorBody = World.CreateBody(bodyDef);
var shape = new PolygonShape();
shape.SetAsBox(30.0f, 10.0f);
var fixtureDef = new FixtureDef();
fixtureDef.shape = shape;
fixtureDef.density = 1.0f;
floorBody.CreateFixture(fixtureDef);
}
void CreateDeleteBody()
{
var bodyDef = new BodyDef();
bodyDef.position = float2(0, -44.0f);
deleteBody = World.CreateBody(bodyDef);
var shape = new PolygonShape();
shape.SetAsBox(200.0f, 10.0f);
var fixtureDef = new FixtureDef();
fixtureDef.shape = shape;
fixtureDef.density = 1.0f;
deleteBody.CreateFixture(fixtureDef);
}
Random random = new Random((int) (Uno.Diagnostics.Clock.GetSeconds() * 1000000));
void CreateBox2()
{
var bodyDef = new BodyDef();
bodyDef.type = BodyType.Dynamic;
bodyDef.position = float2(random.NextFloat(-25f, 25f), 50.0f);
bodyDef.angularVelocity = random.NextFloat() * 40 - 20;
bodyDef.userData = float3(0, 0, 0);
var body = World.CreateBody(bodyDef);
var shape = new PolygonShape();
shape.SetAsBox(0.75f, 0.75f);
var fixtureDef = new FixtureDef();
fixtureDef.shape = shape;
fixtureDef.density = 5.0f;
//fixtureDef.friction = 0.75f;
body.CreateFixture(fixtureDef);
bodies.Add(body);
}
private int c = 0;
protected override void OnFixedUpdate()
{
base.OnFixedUpdate();
debug_log bodies.Count;
if(c++ % 8 == 0 && bodies.Count < 20) CreateBox2();
foreach(var body in bodiesToDelete)
{
World.DestroyBody(body);
bodies.Remove(body);
}
bodiesToDelete.Clear();
}
public class ContactListener : IContactListener
{
private TowerBlock b;
public ContactListener(TowerBlock b)
{
this.b = b;
}
public void BeginContact(Contact contact)
{
if(contact.GetFixtureA().GetBody() == b.deleteBody)
{
b.bodiesToDelete.Add(contact.GetFixtureB().GetBody());
}
else if(contact.GetFixtureB().GetBody() == b.deleteBody)
{
b.bodiesToDelete.Add(contact.GetFixtureA().GetBody());
}
}
public void EndContact(Contact contact) {}
public void PreSolve(Contact contact, ref Manifold manifold) {}
public void PostSolve(Contact contact, ref ContactImpulse impulse) {}
}
}
}

79
samples/UrWeb/iso8601.ur Normal file
View File

@@ -0,0 +1,79 @@
open Parse.String
val digit = satisfy isdigit
val decimal_of_len n =
ds <- count n digit;
return (List.foldl (fn d acc => 10*acc + ((ord d)-(ord #"0"))) 0 ds)
val date =
y <- decimal_of_len 4;
char' #"-";
m <- decimal_of_len 2;
char' #"-";
d <- decimal_of_len 2;
if m > 0 && m <= 12 then
return {Year=y, Month=(Datetime.intToMonth (m-1)), Day=d}
else
fail
(* We parse fractions of a second, but ignore them since Datetime
doesn't permit representing them. *)
val time =
h <- decimal_of_len 2;
char' #":";
m <- decimal_of_len 2;
s <- maybe (char' #":";
s <- decimal_of_len 2;
maybe' (char' #"."; skipWhile isdigit);
return s);
return {Hour=h, Minute=m, Second=Option.get 0 s}
val timezone_offset =
let val zulu = char' #"Z"; return 0
val digits = decimal_of_len 2
val sign = or (char' #"+"; return 1)
(char' #"-"; return (-1))
in
zulu `or` (s <- sign;
h <- digits;
m <- (maybe' (char' #":"); or digits (return 0));
return (s*(h*60+m)))
end
val datetime_with_tz =
d <- date; char' #"T"; t <- time;
tz <- timezone_offset;
return (d ++ t ++ {TZOffsetMinutes=tz})
val datetime =
d <- datetime_with_tz;
return (d -- #TZOffsetMinutes)
fun process v =
case parse (d <- datetime_with_tz; eof; return d) v of
Some r =>
let
val {Year=year,Month=month,Day=day,
Hour=hour,Minute=minute,Second=second} =
Datetime.addMinutes (r.TZOffsetMinutes) (r -- #TZOffsetMinutes)
fun pad x =
if x < 10 then "0" `strcat` show x else show x
in
<xml>{[pad hour]}:{[pad minute]}:{[pad second]} {[month]} {[day]}, {[year]}</xml>
end
| None => <xml>none</xml>
fun main () : transaction page =
input <- source "2012-01-01T01:10:42Z";
return <xml>
<body>
<label>
Enter an
<a href="https://en.wikipedia.org/wiki/ISO_8601">ISO 8601</a>
datetime here:
<ctextbox source={input} />
</label>
<ul><dyn signal={v <- signal input; return (process v)} /></ul>
</body>
</xml>

85
samples/UrWeb/parse.urs Normal file
View File

@@ -0,0 +1,85 @@
functor Make(Stream : sig type t end) : sig
con t :: Type -> Type
val mreturn : a ::: Type -> a -> t a
val mbind : a ::: Type -> b ::: Type ->
(t a) -> (a -> t b) -> (t b)
val monad_parse : monad t
val parse : a ::: Type -> t a -> Stream.t -> option a
(** Combinators *)
val fail : a ::: Type -> t a
val or : a ::: Type -> t a -> t a -> t a
val maybe : a ::: Type -> t a -> t (option a)
val maybe' : a ::: Type -> t a -> t unit
val many : a ::: Type -> t a -> t (list a)
val count : a ::: Type -> int -> t a -> t (list a)
val skipMany : a ::: Type -> t a -> t unit
val sepBy : a ::: Type -> s ::: Type -> t a -> t s -> t (list a)
end
structure String : sig
con t :: Type -> Type
val monad_parse : monad t
val parse : a ::: Type -> t a -> string -> option a
(** Combinators *)
val fail : a ::: Type -> t a
val or : a ::: Type -> t a -> t a -> t a
val maybe : a ::: Type -> t a -> t (option a)
val maybe' : a ::: Type -> t a -> t unit
val many : a ::: Type -> t a -> t (list a)
val count : a ::: Type -> int -> t a -> t (list a)
val skipMany : a ::: Type -> t a -> t unit
val sepBy : a ::: Type -> s ::: Type -> t a -> t s -> t (list a)
val eof : t unit
(* We provide alternative versions of some of these predicates
* that return t unit as a monadic syntactical convenience. *)
val string : string -> t string
val string' : string -> t unit
val stringCI : string -> t string
val stringCI' : string -> t unit
val char : char -> t char
val char' : char -> t unit
val take : int -> t (string*int)
val drop : int -> t unit
val satisfy : (char -> bool) -> t char
val skip : (char -> bool) -> t unit
val skipWhile : (char -> bool) -> t unit
val takeWhile : (char -> bool) -> t (string*int)
val takeWhile' : (char -> bool) -> t string (* conses *)
(* Well, "till" is the correct form; but "til" is in common enough
* usage that I'll prefer it for terseness. *)
val takeTil : (char -> bool) -> t (string*int)
val takeTil' : (char -> bool) -> t string (* conses *)
val takeRest : t string
(** Convenience functions *)
val skipSpace : t unit
val endOfLine : t unit
val unsigned_int_of_radix : int -> t int
(*
* val signed_int_of_radix : int -> t int
* val double : t float
*)
end
structure Blob : sig
con t :: Type -> Type
val monad_parse : monad t
val parse : a ::: Type -> t a -> blob -> option a
(** Combinators *)
val fail : a ::: Type -> t a
val or : a ::: Type -> t a -> t a -> t a
val maybe : a ::: Type -> t a -> t (option a)
val maybe' : a ::: Type -> t a -> t unit
val many : a ::: Type -> t a -> t (list a)
val count : a ::: Type -> int -> t a -> t (list a)
val skipMany : a ::: Type -> t a -> t unit
val sepBy : a ::: Type -> s ::: Type -> t a -> t s -> t (list a)
end

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