mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
Compare commits
168 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
53aa1209ab | ||
|
|
b2a486fed2 | ||
|
|
4f1e5c34b1 | ||
|
|
85c9833081 | ||
|
|
33899b9d6b | ||
|
|
417239004a | ||
|
|
6a1423d28f | ||
|
|
96a23ce388 | ||
|
|
e8d7eed3aa | ||
|
|
9d419c4ab9 | ||
|
|
4eefc1f58e | ||
|
|
0b94b9cda7 | ||
|
|
c736038d94 | ||
|
|
ec562138f8 | ||
|
|
50013e8dd7 | ||
|
|
416c5d1185 | ||
|
|
8869912d31 | ||
|
|
43fa563b77 | ||
|
|
41c6aee8c3 | ||
|
|
8cf575c37d | ||
|
|
4e20928e04 | ||
|
|
3e37bd2680 | ||
|
|
a29f5b2d46 | ||
|
|
4efc6f8c95 | ||
|
|
346aa99fcf | ||
|
|
d147778677 | ||
|
|
e520209e49 | ||
|
|
338cc16239 | ||
|
|
67ea35094b | ||
|
|
6f0393fcbd | ||
|
|
2923d50d7e | ||
|
|
4e26f609ef | ||
|
|
e86d6e8dd2 | ||
|
|
5fa02ad1fb | ||
|
|
5a06240f69 | ||
|
|
d6e0f74c80 | ||
|
|
a5c08bb203 | ||
|
|
c6dc29abb1 | ||
|
|
ffd984bb7e | ||
|
|
dc5473559b | ||
|
|
8e9c224952 | ||
|
|
d43f111723 | ||
|
|
de9ff713a4 | ||
|
|
98783560ec | ||
|
|
8f31fbbd55 | ||
|
|
e4cdbd2b2b | ||
|
|
ba52e48ceb | ||
|
|
a44ebe493b | ||
|
|
eb0e75e11e | ||
|
|
22c2cf4967 | ||
|
|
39e3688fb8 | ||
|
|
6b83e5fb7b | ||
|
|
dd2e5ffe07 | ||
|
|
f6b6c4e165 | ||
|
|
608ed60b5c | ||
|
|
2ce2945058 | ||
|
|
c8d376754e | ||
|
|
ecaef91fa1 | ||
|
|
d265b78e7e | ||
|
|
5a5bf7d5e5 | ||
|
|
e46781b903 | ||
|
|
9543a8c8e9 | ||
|
|
6ac1ac9232 | ||
|
|
1bbb919fef | ||
|
|
71dfed0e45 | ||
|
|
a2db058ce4 | ||
|
|
12695fee2f | ||
|
|
4a775dca37 | ||
|
|
d7c689fd6b | ||
|
|
20b8188384 | ||
|
|
26310d9515 | ||
|
|
e38cc75da5 | ||
|
|
8d55fc1bd5 | ||
|
|
7e63399196 | ||
|
|
520e5a5cfe | ||
|
|
5d85692c24 | ||
|
|
676861fff3 | ||
|
|
6589bd9dc7 | ||
|
|
e32a4f13ef | ||
|
|
4e4d851f71 | ||
|
|
a3628f86da | ||
|
|
fe70965906 | ||
|
|
c863435c84 | ||
|
|
eeec48198a | ||
|
|
82167063da | ||
|
|
3ae89b48ba | ||
|
|
cd9401c424 | ||
|
|
e7e8a7d835 | ||
|
|
7654032d2e | ||
|
|
05b536fc61 | ||
|
|
ebe85788ab | ||
|
|
524337d07b | ||
|
|
f8ce42e169 | ||
|
|
71032cd252 | ||
|
|
41593b3ea7 | ||
|
|
bed8add2f5 | ||
|
|
e424e8e88c | ||
|
|
07d4f218a3 | ||
|
|
67ed060d37 | ||
|
|
3abe081560 | ||
|
|
d3f3c0345c | ||
|
|
855f1a1f86 | ||
|
|
0406a5b326 | ||
|
|
0108ef4386 | ||
|
|
daefff86ff | ||
|
|
fdb962518f | ||
|
|
6564078061 | ||
|
|
39ea9be5f8 | ||
|
|
152b5ade5e | ||
|
|
c525e3fbef | ||
|
|
88c74fa9c2 | ||
|
|
6a54ee767f | ||
|
|
2ea1ff2736 | ||
|
|
a1901fceff | ||
|
|
b4035a3804 | ||
|
|
fc67fc525c | ||
|
|
f0659d3aa5 | ||
|
|
a7a123a8db | ||
|
|
0e5327a77a | ||
|
|
ecd4ae3bda | ||
|
|
7a8bd628e1 | ||
|
|
8e19aea39e | ||
|
|
6fcba83f3e | ||
|
|
d6d7d38eb8 | ||
|
|
c8094d3775 | ||
|
|
de478d2f2d | ||
|
|
991dcef18b | ||
|
|
f30e9270f1 | ||
|
|
1d7ba18b15 | ||
|
|
35a06d6cb8 | ||
|
|
4cf7feb275 | ||
|
|
30298a9ef8 | ||
|
|
cc5f1c57ca | ||
|
|
82af10e3fd | ||
|
|
63c8d2284c | ||
|
|
697380336c | ||
|
|
5fd8d71858 | ||
|
|
5bc88814e2 | ||
|
|
00efd6a463 | ||
|
|
81ca6e7766 | ||
|
|
cd288a8ee4 | ||
|
|
a8d84f3d55 | ||
|
|
600115afed | ||
|
|
abf7bee464 | ||
|
|
e73a4ecd0e | ||
|
|
70779c9986 | ||
|
|
b61fe90d12 | ||
|
|
e6c849d92c | ||
|
|
22d4865c52 | ||
|
|
3247d46e81 | ||
|
|
be316c2943 | ||
|
|
68c45be47d | ||
|
|
4584963dd2 | ||
|
|
f382abc2f3 | ||
|
|
9d57e1e1b5 | ||
|
|
2a4150b104 | ||
|
|
09612ae42e | ||
|
|
49e9ee48d0 | ||
|
|
a8719f3e82 | ||
|
|
00647be113 | ||
|
|
48b64c2d31 | ||
|
|
f95365946c | ||
|
|
b056df06f4 | ||
|
|
6bf223e641 | ||
|
|
fa817b6a1d | ||
|
|
789607d9bc | ||
|
|
d46530989c | ||
|
|
3c5bcb434c |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,5 +1,6 @@
|
||||
/Gemfile.lock
|
||||
.bundle/
|
||||
.idea
|
||||
benchmark/
|
||||
lib/linguist/samples.json
|
||||
/grammars
|
||||
|
||||
24
.gitmodules
vendored
24
.gitmodules
vendored
@@ -22,9 +22,9 @@
|
||||
[submodule "vendor/grammars/Sublime-REBOL"]
|
||||
path = vendor/grammars/Sublime-REBOL
|
||||
url = https://github.com/Oldes/Sublime-REBOL
|
||||
[submodule "vendor/grammars/Sublime-VimL"]
|
||||
path = vendor/grammars/Sublime-VimL
|
||||
url = https://github.com/SalGnt/Sublime-VimL
|
||||
[submodule "vendor/grammars/language-viml"]
|
||||
path = vendor/grammars/language-viml
|
||||
url = https://github.com/Alhadis/language-viml
|
||||
[submodule "vendor/grammars/ColdFusion"]
|
||||
path = vendor/grammars/ColdFusion
|
||||
url = https://github.com/SublimeText/ColdFusion
|
||||
@@ -202,9 +202,6 @@
|
||||
[submodule "vendor/grammars/sublime-robot-plugin"]
|
||||
path = vendor/grammars/sublime-robot-plugin
|
||||
url = https://github.com/shellderp/sublime-robot-plugin
|
||||
[submodule "vendor/grammars/actionscript3-tmbundle"]
|
||||
path = vendor/grammars/actionscript3-tmbundle
|
||||
url = https://github.com/honzabrecka/actionscript3-tmbundle
|
||||
[submodule "vendor/grammars/Sublime-QML"]
|
||||
path = vendor/grammars/Sublime-QML
|
||||
url = https://github.com/skozlovf/Sublime-QML
|
||||
@@ -791,3 +788,18 @@
|
||||
[submodule "vendor/grammars/language-babel"]
|
||||
path = vendor/grammars/language-babel
|
||||
url = https://github.com/github-linguist/language-babel
|
||||
[submodule "vendor/CodeMirror"]
|
||||
path = vendor/CodeMirror
|
||||
url = https://github.com/codemirror/CodeMirror
|
||||
[submodule "vendor/grammars/MQL5-sublime"]
|
||||
path = vendor/grammars/MQL5-sublime
|
||||
url = https://github.com/mqsoft/MQL5-sublime
|
||||
[submodule "vendor/grammars/actionscript3-tmbundle"]
|
||||
path = vendor/grammars/actionscript3-tmbundle
|
||||
url = https://github.com/simongregory/actionscript3-tmbundle
|
||||
[submodule "vendor/grammars/ABNF.tmbundle"]
|
||||
path = vendor/grammars/ABNF.tmbundle
|
||||
url = https://github.com/sanssecours/ABNF.tmbundle
|
||||
[submodule "vendor/grammars/EBNF.tmbundle"]
|
||||
path = vendor/grammars/EBNF.tmbundle
|
||||
url = https://github.com/sanssecours/EBNF.tmbundle
|
||||
|
||||
@@ -17,7 +17,7 @@ To add support for a new extension:
|
||||
In addition, if this extension is already listed in [`languages.yml`][languages] then sometimes a few more steps will need to be taken:
|
||||
|
||||
0. Make sure that example `.yourextension` files are present in the [samples directory][samples] for each language that uses `.yourextension`.
|
||||
0. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.yourextension` files. (ping @arfon or @bkeepers to help with this) to ensure we're not misclassifying files.
|
||||
0. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.yourextension` files. (ping **@arfon** or **@bkeepers** to help with this) to ensure we're not misclassifying files.
|
||||
0. If the Bayesian classifier does a bad job with the sample `.yourextension` files then a [heuristic](https://github.com/github/linguist/blob/master/lib/linguist/heuristics.rb) may need to be written to help.
|
||||
|
||||
|
||||
@@ -27,19 +27,16 @@ We try only to add languages once they have some usage on GitHub. In most cases
|
||||
|
||||
To add support for a new language:
|
||||
|
||||
0. Add an entry for your language to [`languages.yml`][languages].
|
||||
0. Add a grammar for your language. Please only add grammars that have [one of these licenses](https://github.com/github/linguist/blob/257425141d4e2a5232786bf0b13c901ada075f93/vendor/licenses/config.yml#L2-L11).
|
||||
0. Add your grammar as a submodule: `git submodule add https://github.com/JaneSmith/MyGrammar vendor/grammars/MyGrammar`.
|
||||
0. Add your grammar to [`grammars.yml`][grammars] by running `script/convert-grammars --add vendor/grammars/MyGrammar`.
|
||||
0. Download the license for the grammar: `script/licensed`. Be careful to only commit the file for the new grammar, as this script may update licenses for other grammars as well.
|
||||
0. Add an entry for your language to [`languages.yml`][languages]. Omit the `language_id` field for now.
|
||||
0. Add a grammar for your language: `script/add-grammar https://github.com/JaneSmith/MyGrammar`. Please only add grammars that have [one of these licenses][licenses].
|
||||
0. Add samples for your language to the [samples directory][samples] in the correct subdirectory.
|
||||
0. Add a `language_id` for your language. See `script/set-language-ids` for more information. **You should only ever need to run `script/set-language-ids --update`. Anything other than this risks breaking GitHub search :cry:**
|
||||
0. Add a `language_id` for your language using `script/set-language-ids`. **You should only ever need to run `script/set-language-ids --update`. Anything other than this risks breaking GitHub search :cry:**
|
||||
0. Open a pull request, linking to a [GitHub search result](https://github.com/search?utf8=%E2%9C%93&q=extension%3Aboot+NOT+nothack&type=Code&ref=searchresults) showing in-the-wild usage.
|
||||
|
||||
In addition, if your new language defines an extension that's already listed in [`languages.yml`][languages] (such as `.foo`) then sometimes a few more steps will need to be taken:
|
||||
|
||||
0. Make sure that example `.foo` files are present in the [samples directory][samples] for each language that uses `.foo`.
|
||||
0. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.foo` files. (ping @arfon or @bkeepers to help with this) to ensure we're not misclassifying files.
|
||||
0. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.foo` files. (ping **@arfon** or **@bkeepers** to help with this) to ensure we're not misclassifying files.
|
||||
0. If the Bayesian classifier does a bad job with the sample `.foo` files then a [heuristic](https://github.com/github/linguist/blob/master/lib/linguist/heuristics.rb) may need to be written to help.
|
||||
|
||||
Remember, the goal here is to try and avoid false positives!
|
||||
@@ -82,9 +79,10 @@ Here's our current build status: [
|
||||
- @larsbrinkhoff
|
||||
- @pchaigno
|
||||
- **@arfon** (GitHub Staff)
|
||||
- **@Alhadis**
|
||||
- **@larsbrinkhoff**
|
||||
- **@pchaigno**
|
||||
|
||||
As Linguist is a production dependency for GitHub we have a couple of workflow restrictions:
|
||||
|
||||
@@ -113,5 +111,6 @@ If you are the current maintainer of this gem:
|
||||
|
||||
[grammars]: /grammars.yml
|
||||
[languages]: /lib/linguist/languages.yml
|
||||
[licenses]: https://github.com/github/linguist/blob/257425141d4e2a5232786bf0b13c901ada075f93/vendor/licenses/config.yml#L2-L11
|
||||
[samples]: /samples
|
||||
[new-issue]: https://github.com/github/linguist/issues/new
|
||||
|
||||
@@ -20,6 +20,12 @@ The Language stats bar displays languages percentages for the files in the repos
|
||||
0. If the files are being misclassified, search for [open issues][issues] to see if anyone else has already reported the issue. Any information you can add, especially links to public repositories, is helpful.
|
||||
0. If there are no reported issues of this misclassification, [open an issue][new-issue] and include a link to the repository or a sample of the code that is being misclassified.
|
||||
|
||||
### There's a problem with the syntax highlighting of a file
|
||||
|
||||
Linguist detects the language of a file but the actual syntax-highlighting is powered by a set of language grammars which are included in this project as a set of submodules [and may be found here](https://github.com/github/linguist/blob/master/vendor/README.md).
|
||||
|
||||
If you experience an issue with the syntax-highlighting on GitHub, **please report the issue to the upstream grammar repository, not here.** Grammars are updated every time we build the Linguist gem and so upstream bug fixes are automatically incorporated as they are fixed.
|
||||
|
||||
## Overrides
|
||||
|
||||
Linguist supports a number of different custom overrides strategies for language definitions and vendored paths.
|
||||
|
||||
@@ -26,6 +26,6 @@ Gem::Specification.new do |s|
|
||||
s.add_development_dependency 'yajl-ruby'
|
||||
s.add_development_dependency 'color-proximity', '~> 0.2.1'
|
||||
s.add_development_dependency 'licensed'
|
||||
s.add_development_dependency 'licensee', '>= 8.3.0'
|
||||
s.add_development_dependency 'licensee', '>= 8.6.0'
|
||||
|
||||
end
|
||||
|
||||
13
grammars.yml
13
grammars.yml
@@ -4,6 +4,8 @@ http://svn.edgewall.org/repos/genshi/contrib/textmate/Genshi.tmbundle/Syntaxes/M
|
||||
https://bitbucket.org/Clams/sublimesystemverilog/get/default.tar.gz:
|
||||
- source.systemverilog
|
||||
- source.ucfconstraints
|
||||
vendor/grammars/ABNF.tmbundle:
|
||||
- source.abnf
|
||||
vendor/grammars/Agda.tmbundle:
|
||||
- source.agda
|
||||
vendor/grammars/Alloy.tmbundle:
|
||||
@@ -20,6 +22,8 @@ vendor/grammars/ColdFusion:
|
||||
- text.html.cfm
|
||||
vendor/grammars/Docker.tmbundle:
|
||||
- source.dockerfile
|
||||
vendor/grammars/EBNF.tmbundle:
|
||||
- source.ebnf
|
||||
vendor/grammars/Elm/Syntaxes:
|
||||
- source.elm
|
||||
- text.html.mediawiki.elm-build-output
|
||||
@@ -47,6 +51,8 @@ vendor/grammars/Lean.tmbundle:
|
||||
- source.lean
|
||||
vendor/grammars/LiveScript.tmbundle:
|
||||
- source.livescript
|
||||
vendor/grammars/MQL5-sublime:
|
||||
- source.mql5
|
||||
vendor/grammars/MagicPython:
|
||||
- source.python
|
||||
- source.regexp.python
|
||||
@@ -103,8 +109,6 @@ vendor/grammars/Sublime-SQF-Language:
|
||||
vendor/grammars/Sublime-Text-2-OpenEdge-ABL:
|
||||
- source.abl
|
||||
- text.html.abl
|
||||
vendor/grammars/Sublime-VimL:
|
||||
- source.viml
|
||||
vendor/grammars/SublimeBrainfuck:
|
||||
- source.bf
|
||||
vendor/grammars/SublimeClarion:
|
||||
@@ -136,7 +140,7 @@ vendor/grammars/X10:
|
||||
- source.x10
|
||||
vendor/grammars/abap.tmbundle:
|
||||
- source.abap
|
||||
vendor/grammars/actionscript3-tmbundle:
|
||||
vendor/grammars/actionscript3-tmbundle/:
|
||||
- source.actionscript.3
|
||||
- text.html.asdoc
|
||||
- text.xml.flex-config
|
||||
@@ -377,6 +381,7 @@ vendor/grammars/language-inform7:
|
||||
- source.inform7
|
||||
vendor/grammars/language-javascript:
|
||||
- source.js
|
||||
- source.js.embedded.html
|
||||
- source.js.regexp
|
||||
- source.js.regexp.replacement
|
||||
vendor/grammars/language-jsoniq:
|
||||
@@ -414,6 +419,8 @@ vendor/grammars/language-toc-wow:
|
||||
- source.toc
|
||||
vendor/grammars/language-turing:
|
||||
- source.turing
|
||||
vendor/grammars/language-viml:
|
||||
- source.viml
|
||||
vendor/grammars/language-wavefront:
|
||||
- source.wavefront.mtl
|
||||
- source.wavefront.obj
|
||||
|
||||
@@ -56,6 +56,7 @@ module Linguist
|
||||
generated_net_specflow_feature_file? ||
|
||||
composer_lock? ||
|
||||
node_modules? ||
|
||||
go_vendor? ||
|
||||
npm_shrinkwrap? ||
|
||||
godeps? ||
|
||||
generated_by_zephir? ||
|
||||
@@ -304,6 +305,14 @@ module Linguist
|
||||
!!name.match(/node_modules\//)
|
||||
end
|
||||
|
||||
# Internal: Is the blob part of the Go vendor/ tree,
|
||||
# not meant for humans in pull requests.
|
||||
#
|
||||
# Returns true or false.
|
||||
def go_vendor?
|
||||
!!name.match(/vendor\/((?!-)[-0-9A-Za-z]+(?<!-)\.)+(com|edu|gov|in|me|net|org|fm|io)/)
|
||||
end
|
||||
|
||||
# Internal: Is the blob a generated npm shrinkwrap file.
|
||||
#
|
||||
# Returns true or false.
|
||||
|
||||
@@ -144,7 +144,7 @@ module Linguist
|
||||
end
|
||||
end
|
||||
|
||||
fortran_rx = /^([c*][^abd-z]| (subroutine|program|end)\s|\s*!)/i
|
||||
fortran_rx = /^([c*][^abd-z]| (subroutine|program|end|data)\s|\s*!)/i
|
||||
|
||||
disambiguate ".f" do |data|
|
||||
if /^: /.match(data)
|
||||
@@ -202,6 +202,8 @@ module Linguist
|
||||
disambiguate ".inc" do |data|
|
||||
if /^<\?(?:php)?/.match(data)
|
||||
Language["PHP"]
|
||||
elsif /^\s*#(declare|local|macro|while)\s/.match(data)
|
||||
Language["POV-Ray SDL"]
|
||||
end
|
||||
end
|
||||
|
||||
@@ -242,7 +244,7 @@ module Linguist
|
||||
Language["MUF"]
|
||||
elsif /^\s*;/.match(data)
|
||||
Language["M"]
|
||||
elsif /^\s*\(\*/.match(data)
|
||||
elsif /\*\)$/.match(data)
|
||||
Language["Mathematica"]
|
||||
elsif /^\s*%/.match(data)
|
||||
Language["Matlab"]
|
||||
@@ -252,7 +254,7 @@ module Linguist
|
||||
end
|
||||
|
||||
disambiguate ".md" do |data|
|
||||
if /^[-a-z0-9=#!\*\[|]/i.match(data)
|
||||
if /(^[-a-z0-9=#!\*\[|])|<\//i.match(data) || data.empty?
|
||||
Language["Markdown"]
|
||||
elsif /^(;;|\(define_)/.match(data)
|
||||
Language["GCC machine description"]
|
||||
|
||||
@@ -267,6 +267,7 @@ module Linguist
|
||||
# Returns an Array of Languages.
|
||||
def self.ace_modes
|
||||
warn "This method will be deprecated in a future 5.x release. Every language now has an `ace_mode` set."
|
||||
warn caller
|
||||
@ace_modes ||= all.select(&:ace_mode).sort_by { |lang| lang.name.downcase }
|
||||
end
|
||||
|
||||
@@ -300,12 +301,14 @@ module Linguist
|
||||
end
|
||||
|
||||
@ace_mode = attributes[:ace_mode]
|
||||
@codemirror_mode = attributes[:codemirror_mode]
|
||||
@codemirror_mime_type = attributes[:codemirror_mime_type]
|
||||
@wrap = attributes[:wrap] || false
|
||||
|
||||
# Set legacy search term
|
||||
@search_term = attributes[:search_term] || default_alias_name
|
||||
|
||||
# Set the language_id
|
||||
# Set the language_id
|
||||
@language_id = attributes[:language_id]
|
||||
|
||||
# Set extensions or default to [].
|
||||
@@ -397,6 +400,31 @@ module Linguist
|
||||
# Returns a String name or nil
|
||||
attr_reader :ace_mode
|
||||
|
||||
# Public: Get CodeMirror mode
|
||||
#
|
||||
# Maps to a directory in the `mode/` source code.
|
||||
# https://github.com/codemirror/CodeMirror/tree/master/mode
|
||||
#
|
||||
# Examples
|
||||
#
|
||||
# # => "nil"
|
||||
# # => "javascript"
|
||||
# # => "clike"
|
||||
#
|
||||
# Returns a String name or nil
|
||||
attr_reader :codemirror_mode
|
||||
|
||||
# Public: Get CodeMirror MIME type mode
|
||||
#
|
||||
# Examples
|
||||
#
|
||||
# # => "nil"
|
||||
# # => "text/x-javascript"
|
||||
# # => "text/x-csrc"
|
||||
#
|
||||
# Returns a String name or nil
|
||||
attr_reader :codemirror_mime_type
|
||||
|
||||
# Public: Should language lines be wrapped
|
||||
#
|
||||
# Returns true or false
|
||||
@@ -573,6 +601,8 @@ module Linguist
|
||||
:aliases => options['aliases'],
|
||||
:tm_scope => options['tm_scope'],
|
||||
:ace_mode => options['ace_mode'],
|
||||
:codemirror_mode => options['codemirror_mode'],
|
||||
:codemirror_mime_type => options['codemirror_mime_type'],
|
||||
:wrap => options['wrap'],
|
||||
:group_name => options['group'],
|
||||
:searchable => options.fetch('searchable', true),
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,19 +1,98 @@
|
||||
module Linguist
|
||||
module Strategy
|
||||
class Modeline
|
||||
EMACS_MODELINE = /-\*-\s*(?:(?!mode)[\w-]+\s*:\s*(?:[\w+-]+)\s*;?\s*)*(?:mode\s*:)?\s*([\w+-]+)\s*(?:;\s*(?!mode)[\w-]+\s*:\s*[\w+-]+\s*)*;?\s*-\*-/i
|
||||
EMACS_MODELINE = /
|
||||
-\*-
|
||||
(?:
|
||||
# Short form: `-*- ruby -*-`
|
||||
\s* (?= [^:;\s]+ \s* -\*-)
|
||||
|
|
||||
# Longer form: `-*- foo:bar; mode: ruby; -*-`
|
||||
(?:
|
||||
.*? # Preceding variables: `-*- foo:bar bar:baz;`
|
||||
[;\s] # Which are delimited by spaces or semicolons
|
||||
|
|
||||
(?<=-\*-) # Not preceded by anything: `-*-mode:ruby-*-`
|
||||
)
|
||||
mode # Major mode indicator
|
||||
\s*:\s* # Allow whitespace around colon: `mode : ruby`
|
||||
)
|
||||
([^:;\s]+) # Name of mode
|
||||
|
||||
# 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
|
||||
# Ensure the mode is terminated correctly
|
||||
(?=
|
||||
# Followed by semicolon or whitespace
|
||||
[\s;]
|
||||
|
|
||||
# Touching the ending sequence: `ruby-*-`
|
||||
(?<![-*]) # Don't allow stuff like `ruby--*-` to match; it'll invalidate the mode
|
||||
-\*- # Emacs has no problems reading `ruby --*-`, however.
|
||||
)
|
||||
.*? # Anything between a cleanly-terminated mode and the ending -*-
|
||||
-\*-
|
||||
/xi
|
||||
|
||||
# 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
|
||||
VIM_MODELINE = /
|
||||
|
||||
MODELINES = [EMACS_MODELINE, VIM_MODELINE_1, VIM_MODELINE_2]
|
||||
# Start modeline. Could be `vim:`, `vi:` or `ex:`
|
||||
(?:
|
||||
(?:\s|^)
|
||||
vi
|
||||
(?:m[<=>]?\d+|m)? # Version-specific modeline
|
||||
|
|
||||
[\t\x20] # `ex:` requires whitespace, because "ex:" might be short for "example:"
|
||||
ex
|
||||
)
|
||||
|
||||
# If the option-list begins with `set ` or `se `, it indicates an alternative
|
||||
# modeline syntax partly-compatible with older versions of Vi. Here, the colon
|
||||
# serves as a terminator for an option sequence, delimited by whitespace.
|
||||
(?=
|
||||
# So we have to ensure the modeline ends with a colon
|
||||
: (?=\s* set? \s [^\n:]+ :) |
|
||||
|
||||
# Otherwise, it isn't valid syntax and should be ignored
|
||||
: (?!\s* set? \s)
|
||||
)
|
||||
|
||||
# Possible (unrelated) `option=value` pairs to skip past
|
||||
(?:
|
||||
# Option separator. Vim uses whitespace or colons to separate options (except if
|
||||
# the alternate "vim: set " form is used, where only whitespace is used)
|
||||
(?:
|
||||
\s
|
||||
|
|
||||
\s* : \s* # Note that whitespace around colons is accepted too:
|
||||
) # vim: noai : ft=ruby:noexpandtab
|
||||
|
||||
# Option's name. All recognised Vim options have an alphanumeric form.
|
||||
\w*
|
||||
|
||||
# Possible value. Not every option takes an argument.
|
||||
(?:
|
||||
# Whitespace between name and value is allowed: `vim: ft =ruby`
|
||||
\s*=
|
||||
|
||||
# Option's value. Might be blank; `vim: ft= ` says "use no filetype".
|
||||
(?:
|
||||
[^\\\s] # Beware of escaped characters: titlestring=\ ft=ruby
|
||||
| # will be read by Vim as { titlestring: " ft=ruby" }.
|
||||
\\.
|
||||
)*
|
||||
)?
|
||||
)*
|
||||
|
||||
# The actual filetype declaration
|
||||
[\s:] (?:filetype|ft|syntax) \s*=
|
||||
|
||||
# Language's name
|
||||
(\w+)
|
||||
|
||||
# Ensure it's followed by a legal separator
|
||||
(?=\s|:|$)
|
||||
/xi
|
||||
|
||||
MODELINES = [EMACS_MODELINE, VIM_MODELINE]
|
||||
|
||||
# Scope of the search for modelines
|
||||
# Number of lines to check at the beginning and at the end of the file
|
||||
|
||||
@@ -15,6 +15,9 @@
|
||||
# Dependencies
|
||||
- ^[Dd]ependencies/
|
||||
|
||||
# Distributions
|
||||
- (^|/)dist/
|
||||
|
||||
# C deps
|
||||
# https://github.com/joyent/node
|
||||
- ^deps/
|
||||
@@ -165,7 +168,7 @@
|
||||
# Chart.js
|
||||
- (^|/)Chart\.js$
|
||||
|
||||
# Codemirror
|
||||
# CodeMirror
|
||||
- (^|/)[Cc]ode[Mm]irror/(\d+\.\d+/)?(lib|mode|theme|addon|keymap|demo)
|
||||
|
||||
# SyntaxHighlighter - http://alexgorbatchev.com/
|
||||
@@ -229,6 +232,9 @@
|
||||
# Fabric
|
||||
- Fabric.framework/
|
||||
|
||||
# BuddyBuild
|
||||
- BuddyBuildSDK.framework/
|
||||
|
||||
# git config files
|
||||
- gitattributes$
|
||||
- gitignore$
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
module Linguist
|
||||
VERSION = "4.8.11"
|
||||
VERSION = "4.8.16"
|
||||
end
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"repository": "https://github.com/github/linguist",
|
||||
"dependencies": {
|
||||
"season": "~>5.0"
|
||||
"season": "~>5.4"
|
||||
},
|
||||
"license": "MIT"
|
||||
}
|
||||
|
||||
190
samples/ABNF/toml.abnf
Normal file
190
samples/ABNF/toml.abnf
Normal file
@@ -0,0 +1,190 @@
|
||||
; Source: https://github.com/toml-lang/toml
|
||||
; License: MIT
|
||||
|
||||
;; This is an attempt to define TOML in ABNF according to the grammar defined
|
||||
;; in RFC 4234 (http://www.ietf.org/rfc/rfc4234.txt).
|
||||
|
||||
;; TOML
|
||||
|
||||
toml = expression *( newline expression )
|
||||
expression = (
|
||||
ws /
|
||||
ws comment /
|
||||
ws keyval ws [ comment ] /
|
||||
ws table ws [ comment ]
|
||||
)
|
||||
|
||||
;; Newline
|
||||
|
||||
newline = (
|
||||
%x0A / ; LF
|
||||
%x0D.0A ; CRLF
|
||||
)
|
||||
|
||||
newlines = 1*newline
|
||||
|
||||
;; Whitespace
|
||||
|
||||
ws = *(
|
||||
%x20 / ; Space
|
||||
%x09 ; Horizontal tab
|
||||
)
|
||||
|
||||
;; Comment
|
||||
|
||||
comment-start-symbol = %x23 ; #
|
||||
non-eol = %x09 / %x20-10FFFF
|
||||
comment = comment-start-symbol *non-eol
|
||||
|
||||
;; Key-Value pairs
|
||||
|
||||
keyval-sep = ws %x3D ws ; =
|
||||
keyval = key keyval-sep val
|
||||
|
||||
key = unquoted-key / quoted-key
|
||||
unquoted-key = 1*( ALPHA / DIGIT / %x2D / %x5F ) ; A-Z / a-z / 0-9 / - / _
|
||||
quoted-key = quotation-mark 1*basic-char quotation-mark ; See Basic Strings
|
||||
|
||||
val = integer / float / string / boolean / date-time / array / inline-table
|
||||
|
||||
;; Table
|
||||
|
||||
table = std-table / array-table
|
||||
|
||||
;; Standard Table
|
||||
|
||||
std-table-open = %x5B ws ; [ Left square bracket
|
||||
std-table-close = ws %x5D ; ] Right square bracket
|
||||
table-key-sep = ws %x2E ws ; . Period
|
||||
|
||||
std-table = std-table-open key *( table-key-sep key) std-table-close
|
||||
|
||||
;; Array Table
|
||||
|
||||
array-table-open = %x5B.5B ws ; [[ Double left square bracket
|
||||
array-table-close = ws %x5D.5D ; ]] Double right square bracket
|
||||
|
||||
array-table = array-table-open key *( table-key-sep key) array-table-close
|
||||
|
||||
;; Integer
|
||||
|
||||
integer = [ minus / plus ] int
|
||||
minus = %x2D ; -
|
||||
plus = %x2B ; +
|
||||
digit1-9 = %x31-39 ; 1-9
|
||||
underscore = %x5F ; _
|
||||
int = DIGIT / digit1-9 1*( DIGIT / underscore DIGIT )
|
||||
|
||||
;; Float
|
||||
|
||||
float = integer ( frac / frac exp / exp )
|
||||
zero-prefixable-int = DIGIT *( DIGIT / underscore DIGIT )
|
||||
frac = decimal-point zero-prefixable-int
|
||||
decimal-point = %x2E ; .
|
||||
exp = e integer
|
||||
e = %x65 / %x45 ; e E
|
||||
|
||||
;; String
|
||||
|
||||
string = basic-string / ml-basic-string / literal-string / ml-literal-string
|
||||
|
||||
;; Basic String
|
||||
|
||||
basic-string = quotation-mark *basic-char quotation-mark
|
||||
|
||||
quotation-mark = %x22 ; "
|
||||
|
||||
basic-char = basic-unescaped / escaped
|
||||
escaped = escape ( %x22 / ; " quotation mark U+0022
|
||||
%x5C / ; \ reverse solidus U+005C
|
||||
%x2F / ; / solidus U+002F
|
||||
%x62 / ; b backspace U+0008
|
||||
%x66 / ; f form feed U+000C
|
||||
%x6E / ; n line feed U+000A
|
||||
%x72 / ; r carriage return U+000D
|
||||
%x74 / ; t tab U+0009
|
||||
%x75 4HEXDIG / ; uXXXX U+XXXX
|
||||
%x55 8HEXDIG ) ; UXXXXXXXX U+XXXXXXXX
|
||||
|
||||
basic-unescaped = %x20-21 / %x23-5B / %x5D-10FFFF
|
||||
|
||||
escape = %x5C ; \
|
||||
|
||||
;; Multiline Basic String
|
||||
|
||||
ml-basic-string-delim = quotation-mark quotation-mark quotation-mark
|
||||
ml-basic-string = ml-basic-string-delim ml-basic-body ml-basic-string-delim
|
||||
ml-basic-body = *( ml-basic-char / newline / ( escape newline ))
|
||||
|
||||
ml-basic-char = ml-basic-unescaped / escaped
|
||||
ml-basic-unescaped = %x20-5B / %x5D-10FFFF
|
||||
|
||||
;; Literal String
|
||||
|
||||
literal-string = apostraphe *literal-char apostraphe
|
||||
|
||||
apostraphe = %x27 ; ' Apostrophe
|
||||
|
||||
literal-char = %x09 / %x20-26 / %x28-10FFFF
|
||||
|
||||
;; Multiline Literal String
|
||||
|
||||
ml-literal-string-delim = apostraphe apostraphe apostraphe
|
||||
ml-literal-string = ml-literal-string-delim ml-literal-body ml-literal-string-delim
|
||||
|
||||
ml-literal-body = *( ml-literal-char / newline )
|
||||
ml-literal-char = %x09 / %x20-10FFFF
|
||||
|
||||
;; Boolean
|
||||
|
||||
boolean = true / false
|
||||
true = %x74.72.75.65 ; true
|
||||
false = %x66.61.6C.73.65 ; false
|
||||
|
||||
;; Datetime (as defined in RFC 3339)
|
||||
|
||||
date-fullyear = 4DIGIT
|
||||
date-month = 2DIGIT ; 01-12
|
||||
date-mday = 2DIGIT ; 01-28, 01-29, 01-30, 01-31 based on month/year
|
||||
time-hour = 2DIGIT ; 00-23
|
||||
time-minute = 2DIGIT ; 00-59
|
||||
time-second = 2DIGIT ; 00-58, 00-59, 00-60 based on leap second rules
|
||||
time-secfrac = "." 1*DIGIT
|
||||
time-numoffset = ( "+" / "-" ) time-hour ":" time-minute
|
||||
time-offset = "Z" / time-numoffset
|
||||
|
||||
partial-time = time-hour ":" time-minute ":" time-second [time-secfrac]
|
||||
full-date = date-fullyear "-" date-month "-" date-mday
|
||||
full-time = partial-time time-offset
|
||||
|
||||
date-time = full-date "T" full-time
|
||||
|
||||
;; Array
|
||||
|
||||
array-open = %x5B ws ; [
|
||||
array-close = ws %x5D ; ]
|
||||
|
||||
array = array-open array-values array-close
|
||||
|
||||
array-values = [ val [ array-sep ] [ ( comment newlines) / newlines ] /
|
||||
val array-sep [ ( comment newlines) / newlines ] array-values ]
|
||||
|
||||
array-sep = ws %x2C ws ; , Comma
|
||||
|
||||
;; Inline Table
|
||||
|
||||
inline-table-open = %x7B ws ; {
|
||||
inline-table-close = ws %x7D ; }
|
||||
inline-table-sep = ws %x2C ws ; , Comma
|
||||
|
||||
inline-table = inline-table-open inline-table-keyvals inline-table-close
|
||||
|
||||
inline-table-keyvals = [ inline-table-keyvals-non-empty ]
|
||||
inline-table-keyvals-non-empty = key keyval-sep val /
|
||||
key keyval-sep val inline-table-sep inline-table-keyvals-non-empty
|
||||
|
||||
;; Built-in ABNF terms, reproduced here for clarity
|
||||
|
||||
; ALPHA = %x41-5A / %x61-7A ; A-Z / a-z
|
||||
; DIGIT = %x30-39 ; 0-9
|
||||
; HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
|
||||
72
samples/CSON/base.cson
Normal file
72
samples/CSON/base.cson
Normal file
@@ -0,0 +1,72 @@
|
||||
'atom-text-editor':
|
||||
# Platform Bindings
|
||||
'home': 'editor:move-to-first-character-of-line'
|
||||
'end': 'editor:move-to-end-of-screen-line'
|
||||
'shift-home': 'editor:select-to-first-character-of-line'
|
||||
'shift-end': 'editor:select-to-end-of-line'
|
||||
|
||||
'atom-text-editor:not([mini])':
|
||||
# Atom Specific
|
||||
'ctrl-C': 'editor:copy-path'
|
||||
|
||||
# Sublime Parity
|
||||
'tab': 'editor:indent'
|
||||
'enter': 'editor:newline'
|
||||
'shift-tab': 'editor:outdent-selected-rows'
|
||||
'ctrl-K': 'editor:delete-line'
|
||||
|
||||
'.select-list atom-text-editor[mini]':
|
||||
'enter': 'core:confirm'
|
||||
|
||||
'.tool-panel.panel-left, .tool-panel.panel-right':
|
||||
'escape': 'tool-panel:unfocus'
|
||||
|
||||
'atom-text-editor !important, atom-text-editor[mini] !important':
|
||||
'escape': 'editor:consolidate-selections'
|
||||
|
||||
# allow standard input fields to work correctly
|
||||
'body .native-key-bindings':
|
||||
'tab': 'core:focus-next'
|
||||
'shift-tab': 'core:focus-previous'
|
||||
'enter': 'native!'
|
||||
'backspace': 'native!'
|
||||
'shift-backspace': 'native!'
|
||||
'delete': 'native!'
|
||||
'up': 'native!'
|
||||
'down': 'native!'
|
||||
'shift-up': 'native!'
|
||||
'shift-down': 'native!'
|
||||
'alt-up': 'native!'
|
||||
'alt-down': 'native!'
|
||||
'alt-shift-up': 'native!'
|
||||
'alt-shift-down': 'native!'
|
||||
'cmd-up': 'native!'
|
||||
'cmd-down': 'native!'
|
||||
'cmd-shift-up': 'native!'
|
||||
'cmd-shift-down': 'native!'
|
||||
'ctrl-up': 'native!'
|
||||
'ctrl-down': 'native!'
|
||||
'ctrl-shift-up': 'native!'
|
||||
'ctrl-shift-down': 'native!'
|
||||
'left': 'native!'
|
||||
'right': 'native!'
|
||||
'shift-left': 'native!'
|
||||
'shift-right': 'native!'
|
||||
'alt-left': 'native!'
|
||||
'alt-right': 'native!'
|
||||
'alt-shift-left': 'native!'
|
||||
'alt-shift-right': 'native!'
|
||||
'cmd-left': 'native!'
|
||||
'cmd-right': 'native!'
|
||||
'cmd-shift-left': 'native!'
|
||||
'cmd-shift-right': 'native!'
|
||||
'ctrl-left': 'native!'
|
||||
'ctrl-right': 'native!'
|
||||
'ctrl-shift-left': 'native!'
|
||||
'ctrl-shift-right': 'native!'
|
||||
'ctrl-b': 'native!'
|
||||
'ctrl-f': 'native!'
|
||||
'ctrl-F': 'native!'
|
||||
'ctrl-B': 'native!'
|
||||
'ctrl-h': 'native!'
|
||||
'ctrl-d': 'native!'
|
||||
59
samples/CSON/config.cson
Normal file
59
samples/CSON/config.cson
Normal file
@@ -0,0 +1,59 @@
|
||||
directoryIcons:
|
||||
|
||||
Atom:
|
||||
icon: "atom"
|
||||
match: /^\.atom$/
|
||||
colour: "dark-green"
|
||||
|
||||
Bower:
|
||||
icon: "bower"
|
||||
match: /^bower[-_]components$/
|
||||
colour: "bower"
|
||||
|
||||
Dropbox:
|
||||
icon: "dropbox"
|
||||
match: /^(?:Dropbox|\.dropbox\.cache)$/
|
||||
colour: "medium-blue"
|
||||
|
||||
Git:
|
||||
icon: "git"
|
||||
match: /^\.git$/
|
||||
|
||||
GitHub:
|
||||
icon: "github"
|
||||
match: /^\.github$/
|
||||
|
||||
Meteor:
|
||||
icon: "meteor"
|
||||
match: /^\.meteor$/
|
||||
|
||||
NodeJS:
|
||||
icon: "node"
|
||||
match: /^node_modules$/
|
||||
colour: "medium-green"
|
||||
|
||||
Package:
|
||||
icon: "package"
|
||||
match: /^\.bundle$/i
|
||||
|
||||
TextMate:
|
||||
icon: "textmate"
|
||||
match: ".tmBundle"
|
||||
|
||||
|
||||
fileIcons:
|
||||
|
||||
ABAP:
|
||||
icon: "abap"
|
||||
scope: "abp"
|
||||
match: ".abap"
|
||||
colour: "medium-orange"
|
||||
|
||||
ActionScript: # Or Flash-related
|
||||
icon: "as"
|
||||
match: [
|
||||
[".swf", "medium-blue"]
|
||||
[".as", "medium-red", scope: /\.(?:flex-config|actionscript(?:\.\d+)?)$/i, alias: /ActionScript\s?3|as3/i]
|
||||
[".jsfl", "auto-yellow"]
|
||||
[".swc", "dark-red"]
|
||||
]
|
||||
108
samples/CSON/ff-sfd.cson
Normal file
108
samples/CSON/ff-sfd.cson
Normal file
@@ -0,0 +1,108 @@
|
||||
name: "Spline Font Database"
|
||||
scopeName: "text.sfd"
|
||||
fileTypes: ["sfd"]
|
||||
firstLineMatch: "^SplineFontDB: [\\d.]+"
|
||||
patterns: [include: "#main"]
|
||||
|
||||
repository:
|
||||
main:
|
||||
patterns: [
|
||||
{include: "#punctuation"}
|
||||
{include: "#private"}
|
||||
{include: "#image"}
|
||||
{include: "#pickleData"}
|
||||
{include: "#sections"}
|
||||
{include: "#copyright"}
|
||||
{include: "#property"}
|
||||
{include: "#control"}
|
||||
{include: "#address"}
|
||||
{include: "#encoding"}
|
||||
{include: "source.fontforge#shared"}
|
||||
{include: "#colour"}
|
||||
]
|
||||
|
||||
punctuation:
|
||||
patterns: [
|
||||
{match: "<|>", name: "punctuation.definition.brackets.angle.sfd"}
|
||||
{match: "[{}]", name: "punctuation.definition.brackets.curly.sfd"}
|
||||
]
|
||||
|
||||
private:
|
||||
name: "meta.section.private.sfd"
|
||||
begin: "^BeginPrivate(?=:)"
|
||||
end: "^EndPrivate\\b"
|
||||
beginCaptures: 0: name: "keyword.control.begin.private.sfd"
|
||||
endCaptures: 0: name: "keyword.control.end.private.sfd"
|
||||
patterns: [
|
||||
{match: "^\\S+", name: "entity.name.private.property.sfd"}
|
||||
{include: "$self"}
|
||||
]
|
||||
|
||||
image:
|
||||
name: "meta.image.sfd"
|
||||
begin: "^(Image)(?=:)(.+)$"
|
||||
end: "^(EndImage)\\b"
|
||||
contentName: "string.unquoted.raw.data.sfd"
|
||||
beginCaptures:
|
||||
1: name: "keyword.control.begin.image.sfd"
|
||||
2: patterns: [include: "$self"]
|
||||
endCaptures:
|
||||
1: name: "keyword.control.end.image.sfd"
|
||||
|
||||
pickleData:
|
||||
name: "meta.pickle-data.sfd"
|
||||
begin: "^(PickledData)(:)\\s*(\")"
|
||||
end: '"'
|
||||
beginCaptures:
|
||||
1: name: "entity.name.property.sfd"
|
||||
2: name: "punctuation.separator.dictionary.key-value.sfd"
|
||||
3: name: "punctuation.definition.string.begin.sfd"
|
||||
endCaptures:
|
||||
0: name: "punctuation.definition.string.end.sfd"
|
||||
patterns: [match: "\\\\.", name: "constant.character.escape.sfd"]
|
||||
|
||||
sections:
|
||||
name: "meta.section.${2:/downcase}.sfd"
|
||||
begin: "^(Start|Begin)([A-Z]\\w+)(?=:)"
|
||||
end: "^(End\\2)\\b"
|
||||
beginCaptures: 0: name: "keyword.control.begin.${2:/downcase}.sfd"
|
||||
endCaptures: 0: name: "keyword.control.end.${2:/downcase}.sfd"
|
||||
patterns: [include: "$self"]
|
||||
|
||||
control:
|
||||
name: "keyword.control.${1:/downcase}.sfd"
|
||||
match: "\\b(Fore|Back|SplineSet|^End\\w+)\\b"
|
||||
|
||||
colour:
|
||||
name: "constant.other.hex.colour.sfd"
|
||||
match: "(#)[A-Fa-f0-9]{3,}|(?<=\\s)[A-Fa-f0-9]{6,8}"
|
||||
captures:
|
||||
1: name: "punctuation.definition.colour.sfd"
|
||||
|
||||
encoding:
|
||||
name: "constant.language.encoding.sfd"
|
||||
match: "(?i)\\b(ISO[-\\w]+)(?<=\\d)(?=\\s|$)"
|
||||
|
||||
# Don't highlight numbers in freeform strings (years/version strings)
|
||||
copyright:
|
||||
name: "meta.${1:/downcase}-string.sfd"
|
||||
begin: "^(Copyright|U?Comments?|\\w+Name)(:)"
|
||||
end: "$"
|
||||
beginCaptures:
|
||||
1: name: "entity.name.property.sfd"
|
||||
2: name: "punctuation.separator.dictionary.key-value.sfd"
|
||||
patterns: [include: "source.fontforge#stringEscapes"]
|
||||
|
||||
# No idea what this is, but it looks distracting without a fix
|
||||
# Assuming it's referring to a memory register or something.
|
||||
address:
|
||||
match: "\\d+[xX][A-Fa-f0-9]+"
|
||||
name: "constant.numeric.hexadecimal.sfd"
|
||||
|
||||
property:
|
||||
match: "^([^:]+)(:)"
|
||||
name: "meta.dictionary.key-value.sfd"
|
||||
captures:
|
||||
1: name: "entity.name.property.sfd"
|
||||
2: name: "punctuation.separator.dictionary.key-value.sfd"
|
||||
|
||||
11
samples/CSON/wercker-status.cson
Normal file
11
samples/CSON/wercker-status.cson
Normal file
@@ -0,0 +1,11 @@
|
||||
'menu': [
|
||||
{
|
||||
'label': 'Packages'
|
||||
'submenu': [
|
||||
'label': 'Wercker Status'
|
||||
'submenu': [
|
||||
{ 'label': 'Check now!', 'command': 'wercker-status:checknow' }
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
||||
@@ -1,707 +0,0 @@
|
||||
Inductive day : Type :=
|
||||
| monday : day
|
||||
| tuesday : day
|
||||
| wednesday : day
|
||||
| thursday : day
|
||||
| friday : day
|
||||
| saturday : day
|
||||
| sunday : day.
|
||||
|
||||
Definition next_weekday (d:day) : day :=
|
||||
match d with
|
||||
| monday => tuesday
|
||||
| tuesday => wednesday
|
||||
| wednesday => thursday
|
||||
| thursday => friday
|
||||
| friday => monday
|
||||
| saturday => monday
|
||||
| sunday => monday
|
||||
end.
|
||||
|
||||
Example test_next_weekday:
|
||||
(next_weekday (next_weekday saturday)) = tuesday.
|
||||
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
|
||||
Inductive bool : Type :=
|
||||
| true : bool
|
||||
| false : bool.
|
||||
|
||||
Definition negb (b:bool) : bool :=
|
||||
match b with
|
||||
| true => false
|
||||
| false => true
|
||||
end.
|
||||
|
||||
Definition andb (b1:bool) (b2:bool) : bool :=
|
||||
match b1 with
|
||||
| true => b2
|
||||
| false => false
|
||||
end.
|
||||
|
||||
Definition orb (b1:bool) (b2:bool) : bool :=
|
||||
match b1 with
|
||||
| true => true
|
||||
| false => b2
|
||||
end.
|
||||
|
||||
Example test_orb1: (orb true false) = true.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
|
||||
Example test_orb2: (orb false false) = false.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
|
||||
Example test_orb3: (orb false true) = true.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
|
||||
Example test_orb4: (orb true true) = true.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
|
||||
Definition nandb (b1: bool) (b2:bool) : bool :=
|
||||
match b1 with
|
||||
| true => match b2 with
|
||||
| false => true
|
||||
| true => false
|
||||
end
|
||||
| false => true
|
||||
end.
|
||||
|
||||
Example test_nandb1: (nandb true false) = true.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
Example test_nandb2: (nandb false false) = true.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
Example test_nandb3: (nandb false true) = true.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
Example test_nandb4: (nandb true true) = false.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
|
||||
Definition andb3 (b1: bool) (b2:bool) (b3:bool) : bool :=
|
||||
match b1 with
|
||||
| false => false
|
||||
| true => match b2 with
|
||||
| false => false
|
||||
| true => b3
|
||||
end
|
||||
end.
|
||||
|
||||
Example test_andb31: (andb3 true true true) = true.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
Example test_andb32: (andb3 false true true) = false.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
Example test_andb33: (andb3 true false true) = false.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
Example test_andb34: (andb3 true true false) = false.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
|
||||
Module Playground1.
|
||||
|
||||
Inductive nat : Type :=
|
||||
| O : nat
|
||||
| S : nat -> nat.
|
||||
|
||||
Definition pred (n : nat) : nat :=
|
||||
match n with
|
||||
| O => O
|
||||
| S n' => n'
|
||||
end.
|
||||
|
||||
Definition minustwo (n : nat) : nat :=
|
||||
match n with
|
||||
| O => O
|
||||
| S O => O
|
||||
| S (S n') => n'
|
||||
end.
|
||||
|
||||
Fixpoint evenb (n : nat) : bool :=
|
||||
match n with
|
||||
| O => true
|
||||
| S O => false
|
||||
| S (S n') => evenb n'
|
||||
end.
|
||||
|
||||
Definition oddb (n : nat) : bool := negb (evenb n).
|
||||
|
||||
Example test_oddb1: (oddb (S O)) = true.
|
||||
Proof. reflexivity. Qed.
|
||||
Example test_oddb2: (oddb (S (S (S (S O))))) = false.
|
||||
Proof. reflexivity. Qed.
|
||||
|
||||
Fixpoint plus (n : nat) (m : nat) : nat :=
|
||||
match n with
|
||||
| O => m
|
||||
| S n' => S (plus n' m)
|
||||
end.
|
||||
|
||||
Fixpoint mult (n m : nat) : nat :=
|
||||
match n with
|
||||
| O => O
|
||||
| S n' => plus m (mult n' m)
|
||||
end.
|
||||
|
||||
Fixpoint minus (n m : nat) : nat :=
|
||||
match n, m with
|
||||
| O, _ => n
|
||||
| S n', O => S n'
|
||||
| S n', S m' => minus n' m'
|
||||
end.
|
||||
|
||||
Fixpoint exp (base power : nat) : nat :=
|
||||
match power with
|
||||
| O => S O
|
||||
| S p => mult base (exp base p)
|
||||
end.
|
||||
|
||||
Fixpoint factorial (n : nat) : nat :=
|
||||
match n with
|
||||
| O => S O
|
||||
| S n' => mult n (factorial n')
|
||||
end.
|
||||
|
||||
Example test_factorial1: (factorial (S (S (S O)))) = (S (S (S (S (S (S O)))))).
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
|
||||
Notation "x + y" := (plus x y) (at level 50, left associativity) : nat_scope.
|
||||
Notation "x - y" := (minus x y) (at level 50, left associativity) : nat_scope.
|
||||
Notation "x * y" := (mult x y) (at level 40, left associativity) : nat_scope.
|
||||
|
||||
Fixpoint beq_nat (n m : nat) : bool :=
|
||||
match n with
|
||||
| O => match m with
|
||||
| O => true
|
||||
| S m' => false
|
||||
end
|
||||
| S n' => match m with
|
||||
| O => false
|
||||
| S m' => beq_nat n' m'
|
||||
end
|
||||
end.
|
||||
|
||||
Fixpoint ble_nat (n m : nat) : bool :=
|
||||
match n with
|
||||
| O => true
|
||||
| S n' =>
|
||||
match m with
|
||||
| O => false
|
||||
| S m' => ble_nat n' m'
|
||||
end
|
||||
end.
|
||||
|
||||
Example test_ble_nat1: (ble_nat (S (S O)) (S (S O))) = true.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
Example test_ble_nat2: (ble_nat (S (S O)) (S (S (S (S O))))) = true.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
Example test_ble_nat3: (ble_nat (S (S (S (S O)))) (S (S O))) = false.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
|
||||
Definition blt_nat (n m : nat) : bool :=
|
||||
(andb (negb (beq_nat n m)) (ble_nat n m)).
|
||||
|
||||
Example test_blt_nat1: (blt_nat (S (S O)) (S (S O))) = false.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
Example test_blt_nat3: (blt_nat (S (S (S (S O)))) (S (S O))) = false.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
Example test_blt_nat2 : (blt_nat (S (S O)) (S (S (S (S O))))) = true.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
|
||||
Theorem plus_O_n : forall n : nat, O + n = n.
|
||||
Proof.
|
||||
simpl. reflexivity. Qed.
|
||||
|
||||
Theorem plus_O_n' : forall n : nat, O + n = n.
|
||||
Proof.
|
||||
reflexivity. Qed.
|
||||
|
||||
Theorem plus_O_n'' : forall n : nat, O + n = n.
|
||||
Proof.
|
||||
intros n. reflexivity. Qed.
|
||||
|
||||
Theorem plus_1_1 : forall n : nat, (S O) + n = S n.
|
||||
Proof.
|
||||
intros n. reflexivity. Qed.
|
||||
|
||||
Theorem mult_0_1: forall n : nat, O * n = O.
|
||||
Proof.
|
||||
intros n. reflexivity. Qed.
|
||||
|
||||
Theorem plus_id_example : forall n m:nat,
|
||||
n = m -> n + n = m + m.
|
||||
Proof.
|
||||
intros n m.
|
||||
intros H.
|
||||
rewrite -> H.
|
||||
reflexivity. Qed.
|
||||
|
||||
Theorem plus_id_exercise : forall n m o: nat,
|
||||
n = m -> m = o -> n + m = m + o.
|
||||
Proof.
|
||||
intros n m o.
|
||||
intros H.
|
||||
intros H'.
|
||||
rewrite -> H.
|
||||
rewrite <- H'.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem mult_0_plus : forall n m : nat,
|
||||
(O + n) * m = n * m.
|
||||
Proof.
|
||||
intros n m.
|
||||
rewrite -> plus_O_n.
|
||||
reflexivity. Qed.
|
||||
|
||||
Theorem mult_1_plus : forall n m: nat,
|
||||
((S O) + n) * m = m + (n * m).
|
||||
Proof.
|
||||
intros n m.
|
||||
rewrite -> plus_1_1.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem mult_1 : forall n : nat,
|
||||
n * (S O) = n.
|
||||
Proof.
|
||||
intros n.
|
||||
induction n as [| n'].
|
||||
reflexivity.
|
||||
simpl.
|
||||
rewrite -> IHn'.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem plus_1_neq_0 : forall n : nat,
|
||||
beq_nat (n + (S O)) O = false.
|
||||
Proof.
|
||||
intros n.
|
||||
destruct n as [| n'].
|
||||
reflexivity.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem zero_nbeq_plus_1 : forall n : nat,
|
||||
beq_nat O (n + (S O)) = false.
|
||||
Proof.
|
||||
intros n.
|
||||
destruct n.
|
||||
reflexivity.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Require String. Open Scope string_scope.
|
||||
|
||||
Ltac move_to_top x :=
|
||||
match reverse goal with
|
||||
| H : _ |- _ => try move x after H
|
||||
end.
|
||||
|
||||
Tactic Notation "assert_eq" ident(x) constr(v) :=
|
||||
let H := fresh in
|
||||
assert (x = v) as H by reflexivity;
|
||||
clear H.
|
||||
|
||||
Tactic Notation "Case_aux" ident(x) constr(name) :=
|
||||
first [
|
||||
set (x := name); move_to_top x
|
||||
| assert_eq x name; move_to_top x
|
||||
| fail 1 "because we are working on a different case" ].
|
||||
|
||||
Ltac Case name := Case_aux Case name.
|
||||
Ltac SCase name := Case_aux SCase name.
|
||||
Ltac SSCase name := Case_aux SSCase name.
|
||||
Ltac SSSCase name := Case_aux SSSCase name.
|
||||
Ltac SSSSCase name := Case_aux SSSSCase name.
|
||||
Ltac SSSSSCase name := Case_aux SSSSSCase name.
|
||||
Ltac SSSSSSCase name := Case_aux SSSSSSCase name.
|
||||
Ltac SSSSSSSCase name := Case_aux SSSSSSSCase name.
|
||||
|
||||
Theorem andb_true_elim1 : forall b c : bool,
|
||||
andb b c = true -> b = true.
|
||||
Proof.
|
||||
intros b c H.
|
||||
destruct b.
|
||||
Case "b = true".
|
||||
reflexivity.
|
||||
Case "b = false".
|
||||
rewrite <- H. reflexivity. Qed.
|
||||
|
||||
Theorem plus_0_r : forall n : nat, n + O = n.
|
||||
Proof.
|
||||
intros n. induction n as [| n'].
|
||||
Case "n = 0". reflexivity.
|
||||
Case "n = S n'". simpl. rewrite -> IHn'. reflexivity. Qed.
|
||||
|
||||
Theorem minus_diag : forall n,
|
||||
minus n n = O.
|
||||
Proof.
|
||||
intros n. induction n as [| n'].
|
||||
Case "n = 0".
|
||||
simpl. reflexivity.
|
||||
Case "n = S n'".
|
||||
simpl. rewrite -> IHn'. reflexivity. Qed.
|
||||
|
||||
|
||||
Theorem mult_0_r : forall n:nat,
|
||||
n * O = O.
|
||||
Proof.
|
||||
intros n. induction n as [| n'].
|
||||
Case "n = 0".
|
||||
reflexivity.
|
||||
Case "n = S n'".
|
||||
simpl. rewrite -> IHn'. reflexivity. Qed.
|
||||
|
||||
Theorem plus_n_Sm : forall n m : nat,
|
||||
S (n + m) = n + (S m).
|
||||
Proof.
|
||||
intros n m. induction n as [| n'].
|
||||
Case "n = 0".
|
||||
reflexivity.
|
||||
Case "n = S n'".
|
||||
simpl. rewrite -> IHn'. reflexivity. Qed.
|
||||
|
||||
Theorem plus_assoc : forall n m p : nat,
|
||||
n + (m + p) = (n + m) + p.
|
||||
Proof.
|
||||
intros n m p.
|
||||
induction n as [| n'].
|
||||
reflexivity.
|
||||
simpl.
|
||||
rewrite -> IHn'.
|
||||
reflexivity. Qed.
|
||||
|
||||
Theorem plus_distr : forall n m: nat, S (n + m) = n + (S m).
|
||||
Proof.
|
||||
intros n m. induction n as [| n'].
|
||||
Case "n = 0".
|
||||
reflexivity.
|
||||
Case "n = S n'".
|
||||
simpl. rewrite -> IHn'. reflexivity. Qed.
|
||||
|
||||
Theorem mult_distr : forall n m: nat, n * ((S O) + m) = n * (S m).
|
||||
Proof.
|
||||
intros n m.
|
||||
induction n as [| n'].
|
||||
reflexivity.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem plus_comm : forall n m : nat,
|
||||
n + m = m + n.
|
||||
Proof.
|
||||
intros n m.
|
||||
induction n as [| n'].
|
||||
Case "n = 0".
|
||||
simpl.
|
||||
rewrite -> plus_0_r.
|
||||
reflexivity.
|
||||
Case "n = S n'".
|
||||
simpl.
|
||||
rewrite -> IHn'.
|
||||
rewrite -> plus_distr.
|
||||
reflexivity. Qed.
|
||||
|
||||
Fixpoint double (n:nat) :=
|
||||
match n with
|
||||
| O => O
|
||||
| S n' => S (S (double n'))
|
||||
end.
|
||||
|
||||
Lemma double_plus : forall n, double n = n + n.
|
||||
Proof.
|
||||
intros n. induction n as [| n'].
|
||||
Case "n = 0".
|
||||
reflexivity.
|
||||
Case "n = S n'".
|
||||
simpl. rewrite -> IHn'.
|
||||
rewrite -> plus_distr. reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem beq_nat_refl : forall n : nat,
|
||||
true = beq_nat n n.
|
||||
Proof.
|
||||
intros n. induction n as [| n'].
|
||||
Case "n = 0".
|
||||
reflexivity.
|
||||
Case "n = S n".
|
||||
simpl. rewrite <- IHn'.
|
||||
reflexivity. Qed.
|
||||
|
||||
Theorem plus_rearrange: forall n m p q : nat,
|
||||
(n + m) + (p + q) = (m + n) + (p + q).
|
||||
Proof.
|
||||
intros n m p q.
|
||||
assert(H: n + m = m + n).
|
||||
Case "Proof by assertion".
|
||||
rewrite -> plus_comm. reflexivity.
|
||||
rewrite -> H. reflexivity. Qed.
|
||||
|
||||
Theorem plus_swap : forall n m p: nat,
|
||||
n + (m + p) = m + (n + p).
|
||||
Proof.
|
||||
intros n m p.
|
||||
rewrite -> plus_assoc.
|
||||
assert(H: m + (n + p) = (m + n) + p).
|
||||
rewrite -> plus_assoc.
|
||||
reflexivity.
|
||||
rewrite -> H.
|
||||
assert(H2: m + n = n + m).
|
||||
rewrite -> plus_comm.
|
||||
reflexivity.
|
||||
rewrite -> H2.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem plus_swap' : forall n m p: nat,
|
||||
n + (m + p) = m + (n + p).
|
||||
Proof.
|
||||
intros n m p.
|
||||
rewrite -> plus_assoc.
|
||||
assert(H: m + (n + p) = (m + n) + p).
|
||||
rewrite -> plus_assoc.
|
||||
reflexivity.
|
||||
rewrite -> H.
|
||||
replace (m + n) with (n + m).
|
||||
rewrite -> plus_comm.
|
||||
reflexivity.
|
||||
rewrite -> plus_comm.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem mult_1_distr: forall m n: nat,
|
||||
n * ((S O) + m) = n * (S O) + n * m.
|
||||
Proof.
|
||||
intros n m.
|
||||
rewrite -> mult_1.
|
||||
rewrite -> plus_1_1.
|
||||
simpl.
|
||||
induction m as [|m'].
|
||||
simpl.
|
||||
reflexivity.
|
||||
simpl.
|
||||
rewrite -> plus_swap.
|
||||
rewrite <- IHm'.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem mult_comm: forall m n : nat,
|
||||
m * n = n * m.
|
||||
Proof.
|
||||
intros m n.
|
||||
induction n as [| n'].
|
||||
Case "n = 0".
|
||||
simpl.
|
||||
rewrite -> mult_0_r.
|
||||
reflexivity.
|
||||
Case "n = S n'".
|
||||
simpl.
|
||||
rewrite <- mult_distr.
|
||||
rewrite -> mult_1_distr.
|
||||
rewrite -> mult_1.
|
||||
rewrite -> IHn'.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem evenb_next : forall n : nat,
|
||||
evenb n = evenb (S (S n)).
|
||||
Proof.
|
||||
intros n.
|
||||
Admitted.
|
||||
|
||||
Theorem negb_negb : forall n : bool,
|
||||
n = negb (negb n).
|
||||
Proof.
|
||||
intros n.
|
||||
destruct n.
|
||||
reflexivity.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem evenb_n_oddb_Sn : forall n : nat,
|
||||
evenb n = negb (evenb (S n)).
|
||||
Proof.
|
||||
intros n.
|
||||
induction n as [|n'].
|
||||
reflexivity.
|
||||
assert(H: evenb n' = evenb (S (S n'))).
|
||||
reflexivity.
|
||||
rewrite <- H.
|
||||
rewrite -> IHn'.
|
||||
rewrite <- negb_negb.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
(*Fixpoint bad (n : nat) : bool :=
|
||||
match n with
|
||||
| O => true
|
||||
| S O => bad (S n)
|
||||
| S (S n') => bad n'
|
||||
end.*)
|
||||
|
||||
Theorem ble_nat_refl : forall n:nat,
|
||||
true = ble_nat n n.
|
||||
Proof.
|
||||
intros n.
|
||||
induction n as [|n'].
|
||||
Case "n = 0".
|
||||
reflexivity.
|
||||
Case "n = S n".
|
||||
simpl.
|
||||
rewrite <- IHn'.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem zero_nbeq_S : forall n: nat,
|
||||
beq_nat O (S n) = false.
|
||||
Proof.
|
||||
intros n.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem andb_false_r : forall b : bool,
|
||||
andb b false = false.
|
||||
Proof.
|
||||
intros b.
|
||||
destruct b.
|
||||
reflexivity.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem plus_ble_compat_1 : forall n m p : nat,
|
||||
ble_nat n m = true -> ble_nat (p + n) (p + m) = true.
|
||||
Proof.
|
||||
intros n m p.
|
||||
intros H.
|
||||
induction p.
|
||||
Case "p = 0".
|
||||
simpl.
|
||||
rewrite -> H.
|
||||
reflexivity.
|
||||
Case "p = S p'".
|
||||
simpl.
|
||||
rewrite -> IHp.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem S_nbeq_0 : forall n:nat,
|
||||
beq_nat (S n) O = false.
|
||||
Proof.
|
||||
intros n.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem mult_1_1 : forall n:nat, (S O) * n = n.
|
||||
Proof.
|
||||
intros n.
|
||||
simpl.
|
||||
rewrite -> plus_0_r.
|
||||
reflexivity. Qed.
|
||||
|
||||
Theorem all3_spec : forall b c : bool,
|
||||
orb (andb b c)
|
||||
(orb (negb b)
|
||||
(negb c))
|
||||
= true.
|
||||
Proof.
|
||||
intros b c.
|
||||
destruct b.
|
||||
destruct c.
|
||||
reflexivity.
|
||||
reflexivity.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Lemma mult_plus_1 : forall n m : nat,
|
||||
S(m + n) = m + (S n).
|
||||
Proof.
|
||||
intros n m.
|
||||
induction m.
|
||||
reflexivity.
|
||||
simpl.
|
||||
rewrite -> IHm.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem mult_mult : forall n m : nat,
|
||||
n * (S m) = n * m + n.
|
||||
Proof.
|
||||
intros n m.
|
||||
induction n.
|
||||
reflexivity.
|
||||
simpl.
|
||||
rewrite -> IHn.
|
||||
rewrite -> plus_assoc.
|
||||
rewrite -> mult_plus_1.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem mult_plus_distr_r : forall n m p:nat,
|
||||
(n + m) * p = (n * p) + (m * p).
|
||||
Proof.
|
||||
intros n m p.
|
||||
induction p.
|
||||
rewrite -> mult_0_r.
|
||||
rewrite -> mult_0_r.
|
||||
rewrite -> mult_0_r.
|
||||
reflexivity.
|
||||
rewrite -> mult_mult.
|
||||
rewrite -> mult_mult.
|
||||
rewrite -> mult_mult.
|
||||
rewrite -> IHp.
|
||||
assert(H1: ((n * p) + n) + (m * p + m) = (n * p) + (n + (m * p + m))).
|
||||
rewrite <- plus_assoc.
|
||||
reflexivity.
|
||||
rewrite -> H1.
|
||||
assert(H2: (n + (m * p + m)) = (m * p + (n + m))).
|
||||
rewrite -> plus_swap.
|
||||
reflexivity.
|
||||
rewrite -> H2.
|
||||
assert(H3: (n * p) + (m * p + (n + m)) = ((n * p ) + (m * p)) + (n + m)).
|
||||
rewrite -> plus_assoc.
|
||||
reflexivity.
|
||||
rewrite -> H3.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem mult_assoc : forall n m p : nat,
|
||||
n * (m * p) = (n * m) * p.
|
||||
Proof.
|
||||
intros n m p.
|
||||
induction n.
|
||||
simpl.
|
||||
reflexivity.
|
||||
simpl.
|
||||
rewrite -> mult_plus_distr_r.
|
||||
rewrite -> IHn.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Inductive bin : Type :=
|
||||
| BO : bin
|
||||
| D : bin -> bin
|
||||
| M : bin -> bin.
|
||||
|
||||
Fixpoint incbin (n : bin) : bin :=
|
||||
match n with
|
||||
| BO => M (BO)
|
||||
| D n' => M n'
|
||||
| M n' => D (incbin n')
|
||||
end.
|
||||
|
||||
Fixpoint bin2un (n : bin) : nat :=
|
||||
match n with
|
||||
| BO => O
|
||||
| D n' => double (bin2un n')
|
||||
| M n' => S (double (bin2un n'))
|
||||
end.
|
||||
|
||||
Theorem bin_comm : forall n : bin,
|
||||
bin2un(incbin n) = S (bin2un n).
|
||||
Proof.
|
||||
intros n.
|
||||
induction n.
|
||||
reflexivity.
|
||||
reflexivity.
|
||||
simpl.
|
||||
rewrite -> IHn.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
End Playground1.
|
||||
85
samples/Coq/Computation.v
Normal file
85
samples/Coq/Computation.v
Normal file
@@ -0,0 +1,85 @@
|
||||
(** The definition of computations, used to represent interactive programs. *)
|
||||
Require Import Coq.NArith.NArith.
|
||||
Require Import ListString.All.
|
||||
|
||||
Local Open Scope type.
|
||||
|
||||
(** System calls. *)
|
||||
Module Command.
|
||||
Inductive t :=
|
||||
| AskCard
|
||||
| AskPIN
|
||||
| CheckPIN (pin : N)
|
||||
| AskAmount
|
||||
| CheckAmount (amount : N)
|
||||
| GiveCard
|
||||
| GiveAmount (amount : N)
|
||||
| ShowError (message : LString.t).
|
||||
|
||||
(** The type of an answer for a command depends on the value of the command. *)
|
||||
Definition answer (command : t) : Type :=
|
||||
match command with
|
||||
| AskCard => bool (* If the given card seems valid. *)
|
||||
| AskPIN => option N (* A number or cancellation. *)
|
||||
| CheckPIN _ => bool (* If the PIN number is valid. *)
|
||||
| AskAmount => option N (* A number or cancellation. *)
|
||||
| CheckAmount _ => bool (* If the amount can be withdrawn. *)
|
||||
| GiveCard => bool (* If the card was given. *)
|
||||
| GiveAmount _ => bool (* If the money was given. *)
|
||||
| ShowError _ => unit (* Show an error message. *)
|
||||
end.
|
||||
End Command.
|
||||
|
||||
(** Computations with I/Os. *)
|
||||
Module C.
|
||||
(** A computation can either does nothing, or do a system call and wait
|
||||
for the answer to run another computation. *)
|
||||
Inductive t : Type :=
|
||||
| Ret : t
|
||||
| Call : forall (command : Command.t), (Command.answer command -> t) -> t.
|
||||
Arguments Ret.
|
||||
Arguments Call _ _.
|
||||
|
||||
(** Some optional notations. *)
|
||||
Module Notations.
|
||||
(** A nicer notation for `Ret`. *)
|
||||
Definition ret : t :=
|
||||
Ret.
|
||||
|
||||
(** We define an explicit apply function so that Coq does not try to expand
|
||||
the notations everywhere. *)
|
||||
Definition apply {A B} (f : A -> B) (x : A) := f x.
|
||||
|
||||
(** System call. *)
|
||||
Notation "'call!' answer ':=' command 'in' X" :=
|
||||
(Call command (fun answer => X))
|
||||
(at level 200, answer ident, command at level 100, X at level 200).
|
||||
|
||||
(** System call with typed answer. *)
|
||||
Notation "'call!' answer : A ':=' command 'in' X" :=
|
||||
(Call command (fun (answer : A) => X))
|
||||
(at level 200, answer ident, command at level 100, A at level 200, X at level 200).
|
||||
|
||||
(** System call ignoring the answer. *)
|
||||
Notation "'do_call!' command 'in' X" :=
|
||||
(Call command (fun _ => X))
|
||||
(at level 200, command at level 100, X at level 200).
|
||||
|
||||
(** This notation is useful to compose computations which wait for a
|
||||
continuation. We do not have an explicit bind operator to simplify the
|
||||
language and the proofs. *)
|
||||
Notation "'let!' x ':=' X 'in' Y" :=
|
||||
(apply X (fun x => Y))
|
||||
(at level 200, x ident, X at level 100, Y at level 200).
|
||||
|
||||
(** Let with a typed answer. *)
|
||||
Notation "'let!' x : A ':=' X 'in' Y" :=
|
||||
(apply X (fun (x : A) => Y))
|
||||
(at level 200, x ident, X at level 100, A at level 200, Y at level 200).
|
||||
|
||||
(** Let ignoring the answer. *)
|
||||
Notation "'do!' X 'in' Y" :=
|
||||
(apply X (fun _ => Y))
|
||||
(at level 200, X at level 100, Y at level 200).
|
||||
End Notations.
|
||||
End C.
|
||||
@@ -1,290 +0,0 @@
|
||||
(** A development of Treesort on Heap trees. It has an average
|
||||
complexity of O(n.log n) but of O(n²) in the worst case (e.g. if
|
||||
the list is already sorted) *)
|
||||
|
||||
(* G. Huet 1-9-95 uses Multiset *)
|
||||
|
||||
Require Import List Multiset PermutSetoid Relations Sorting.
|
||||
|
||||
Section defs.
|
||||
|
||||
(** * Trees and heap trees *)
|
||||
|
||||
(** ** Definition of trees over an ordered set *)
|
||||
|
||||
Variable A : Type.
|
||||
Variable leA : relation A.
|
||||
Variable eqA : relation A.
|
||||
|
||||
Let gtA (x y:A) := ~ leA x y.
|
||||
|
||||
Hypothesis leA_dec : forall x y:A, {leA x y} + {leA y x}.
|
||||
Hypothesis eqA_dec : forall x y:A, {eqA x y} + {~ eqA x y}.
|
||||
Hypothesis leA_refl : forall x y:A, eqA x y -> leA x y.
|
||||
Hypothesis leA_trans : forall x y z:A, leA x y -> leA y z -> leA x z.
|
||||
Hypothesis leA_antisym : forall x y:A, leA x y -> leA y x -> eqA x y.
|
||||
|
||||
Hint Resolve leA_refl.
|
||||
Hint Immediate eqA_dec leA_dec leA_antisym.
|
||||
|
||||
Let emptyBag := EmptyBag A.
|
||||
Let singletonBag := SingletonBag _ eqA_dec.
|
||||
|
||||
Inductive Tree :=
|
||||
| Tree_Leaf : Tree
|
||||
| Tree_Node : A -> Tree -> Tree -> Tree.
|
||||
|
||||
(** [a] is lower than a Tree [T] if [T] is a Leaf
|
||||
or [T] is a Node holding [b>a] *)
|
||||
|
||||
Definition leA_Tree (a:A) (t:Tree) :=
|
||||
match t with
|
||||
| Tree_Leaf => True
|
||||
| Tree_Node b T1 T2 => leA a b
|
||||
end.
|
||||
|
||||
Lemma leA_Tree_Leaf : forall a:A, leA_Tree a Tree_Leaf.
|
||||
Proof.
|
||||
simpl; auto with datatypes.
|
||||
Qed.
|
||||
|
||||
Lemma leA_Tree_Node :
|
||||
forall (a b:A) (G D:Tree), leA a b -> leA_Tree a (Tree_Node b G D).
|
||||
Proof.
|
||||
simpl; auto with datatypes.
|
||||
Qed.
|
||||
|
||||
|
||||
(** ** The heap property *)
|
||||
|
||||
Inductive is_heap : Tree -> Prop :=
|
||||
| nil_is_heap : is_heap Tree_Leaf
|
||||
| node_is_heap :
|
||||
forall (a:A) (T1 T2:Tree),
|
||||
leA_Tree a T1 ->
|
||||
leA_Tree a T2 ->
|
||||
is_heap T1 -> is_heap T2 -> is_heap (Tree_Node a T1 T2).
|
||||
|
||||
Lemma invert_heap :
|
||||
forall (a:A) (T1 T2:Tree),
|
||||
is_heap (Tree_Node a T1 T2) ->
|
||||
leA_Tree a T1 /\ leA_Tree a T2 /\ is_heap T1 /\ is_heap T2.
|
||||
Proof.
|
||||
intros; inversion H; auto with datatypes.
|
||||
Qed.
|
||||
|
||||
(* This lemma ought to be generated automatically by the Inversion tools *)
|
||||
Lemma is_heap_rect :
|
||||
forall P:Tree -> Type,
|
||||
P Tree_Leaf ->
|
||||
(forall (a:A) (T1 T2:Tree),
|
||||
leA_Tree a T1 ->
|
||||
leA_Tree a T2 ->
|
||||
is_heap T1 -> P T1 -> is_heap T2 -> P T2 -> P (Tree_Node a T1 T2)) ->
|
||||
forall T:Tree, is_heap T -> P T.
|
||||
Proof.
|
||||
simple induction T; auto with datatypes.
|
||||
intros a G PG D PD PN.
|
||||
elim (invert_heap a G D); auto with datatypes.
|
||||
intros H1 H2; elim H2; intros H3 H4; elim H4; intros.
|
||||
apply X0; auto with datatypes.
|
||||
Qed.
|
||||
|
||||
(* This lemma ought to be generated automatically by the Inversion tools *)
|
||||
Lemma is_heap_rec :
|
||||
forall P:Tree -> Set,
|
||||
P Tree_Leaf ->
|
||||
(forall (a:A) (T1 T2:Tree),
|
||||
leA_Tree a T1 ->
|
||||
leA_Tree a T2 ->
|
||||
is_heap T1 -> P T1 -> is_heap T2 -> P T2 -> P (Tree_Node a T1 T2)) ->
|
||||
forall T:Tree, is_heap T -> P T.
|
||||
Proof.
|
||||
simple induction T; auto with datatypes.
|
||||
intros a G PG D PD PN.
|
||||
elim (invert_heap a G D); auto with datatypes.
|
||||
intros H1 H2; elim H2; intros H3 H4; elim H4; intros.
|
||||
apply X; auto with datatypes.
|
||||
Qed.
|
||||
|
||||
Lemma low_trans :
|
||||
forall (T:Tree) (a b:A), leA a b -> leA_Tree b T -> leA_Tree a T.
|
||||
Proof.
|
||||
simple induction T; auto with datatypes.
|
||||
intros; simpl; apply leA_trans with b; auto with datatypes.
|
||||
Qed.
|
||||
|
||||
(** ** Merging two sorted lists *)
|
||||
|
||||
Inductive merge_lem (l1 l2:list A) : Type :=
|
||||
merge_exist :
|
||||
forall l:list A,
|
||||
Sorted leA l ->
|
||||
meq (list_contents _ eqA_dec l)
|
||||
(munion (list_contents _ eqA_dec l1) (list_contents _ eqA_dec l2)) ->
|
||||
(forall a, HdRel leA a l1 -> HdRel leA a l2 -> HdRel leA a l) ->
|
||||
merge_lem l1 l2.
|
||||
Require Import Morphisms.
|
||||
|
||||
Instance: Equivalence (@meq A).
|
||||
Proof. constructor; auto with datatypes. red. apply meq_trans. Defined.
|
||||
|
||||
Instance: Proper (@meq A ++> @meq _ ++> @meq _) (@munion A).
|
||||
Proof. intros x y H x' y' H'. now apply meq_congr. Qed.
|
||||
|
||||
Lemma merge :
|
||||
forall l1:list A, Sorted leA l1 ->
|
||||
forall l2:list A, Sorted leA l2 -> merge_lem l1 l2.
|
||||
Proof.
|
||||
fix 1; intros; destruct l1.
|
||||
apply merge_exist with l2; auto with datatypes.
|
||||
rename l1 into l.
|
||||
revert l2 H0. fix 1. intros.
|
||||
destruct l2 as [|a0 l0].
|
||||
apply merge_exist with (a :: l); simpl; auto with datatypes.
|
||||
elim (leA_dec a a0); intros.
|
||||
|
||||
(* 1 (leA a a0) *)
|
||||
apply Sorted_inv in H. destruct H.
|
||||
destruct (merge l H (a0 :: l0) H0).
|
||||
apply merge_exist with (a :: l1). clear merge merge0.
|
||||
auto using cons_sort, cons_leA with datatypes.
|
||||
simpl. rewrite m. now rewrite munion_ass.
|
||||
intros. apply cons_leA.
|
||||
apply (@HdRel_inv _ leA) with l; trivial with datatypes.
|
||||
|
||||
(* 2 (leA a0 a) *)
|
||||
apply Sorted_inv in H0. destruct H0.
|
||||
destruct (merge0 l0 H0). clear merge merge0.
|
||||
apply merge_exist with (a0 :: l1);
|
||||
auto using cons_sort, cons_leA with datatypes.
|
||||
simpl; rewrite m. simpl. setoid_rewrite munion_ass at 1. rewrite munion_comm.
|
||||
repeat rewrite munion_ass. setoid_rewrite munion_comm at 3. reflexivity.
|
||||
intros. apply cons_leA.
|
||||
apply (@HdRel_inv _ leA) with l0; trivial with datatypes.
|
||||
Qed.
|
||||
|
||||
(** ** From trees to multisets *)
|
||||
|
||||
(** contents of a tree as a multiset *)
|
||||
|
||||
(** Nota Bene : In what follows the definition of SingletonBag
|
||||
in not used. Actually, we could just take as postulate:
|
||||
[Parameter SingletonBag : A->multiset]. *)
|
||||
|
||||
Fixpoint contents (t:Tree) : multiset A :=
|
||||
match t with
|
||||
| Tree_Leaf => emptyBag
|
||||
| Tree_Node a t1 t2 =>
|
||||
munion (contents t1) (munion (contents t2) (singletonBag a))
|
||||
end.
|
||||
|
||||
|
||||
(** equivalence of two trees is equality of corresponding multisets *)
|
||||
Definition equiv_Tree (t1 t2:Tree) := meq (contents t1) (contents t2).
|
||||
|
||||
|
||||
|
||||
(** * From lists to sorted lists *)
|
||||
|
||||
(** ** Specification of heap insertion *)
|
||||
|
||||
Inductive insert_spec (a:A) (T:Tree) : Type :=
|
||||
insert_exist :
|
||||
forall T1:Tree,
|
||||
is_heap T1 ->
|
||||
meq (contents T1) (munion (contents T) (singletonBag a)) ->
|
||||
(forall b:A, leA b a -> leA_Tree b T -> leA_Tree b T1) ->
|
||||
insert_spec a T.
|
||||
|
||||
|
||||
Lemma insert : forall T:Tree, is_heap T -> forall a:A, insert_spec a T.
|
||||
Proof.
|
||||
simple induction 1; intros.
|
||||
apply insert_exist with (Tree_Node a Tree_Leaf Tree_Leaf);
|
||||
auto using node_is_heap, nil_is_heap, leA_Tree_Leaf with datatypes.
|
||||
simpl; unfold meq, munion; auto using node_is_heap with datatypes.
|
||||
elim (leA_dec a a0); intros.
|
||||
elim (X a0); intros.
|
||||
apply insert_exist with (Tree_Node a T2 T0);
|
||||
auto using node_is_heap, nil_is_heap, leA_Tree_Leaf with datatypes.
|
||||
simpl; apply treesort_twist1; trivial with datatypes.
|
||||
elim (X a); intros T3 HeapT3 ConT3 LeA.
|
||||
apply insert_exist with (Tree_Node a0 T2 T3);
|
||||
auto using node_is_heap, nil_is_heap, leA_Tree_Leaf with datatypes.
|
||||
apply node_is_heap; auto using node_is_heap, nil_is_heap, leA_Tree_Leaf with datatypes.
|
||||
apply low_trans with a; auto with datatypes.
|
||||
apply LeA; auto with datatypes.
|
||||
apply low_trans with a; auto with datatypes.
|
||||
simpl; apply treesort_twist2; trivial with datatypes.
|
||||
Qed.
|
||||
|
||||
|
||||
(** ** Building a heap from a list *)
|
||||
|
||||
Inductive build_heap (l:list A) : Type :=
|
||||
heap_exist :
|
||||
forall T:Tree,
|
||||
is_heap T ->
|
||||
meq (list_contents _ eqA_dec l) (contents T) -> build_heap l.
|
||||
|
||||
Lemma list_to_heap : forall l:list A, build_heap l.
|
||||
Proof.
|
||||
simple induction l.
|
||||
apply (heap_exist nil Tree_Leaf); auto with datatypes.
|
||||
simpl; unfold meq; exact nil_is_heap.
|
||||
simple induction 1.
|
||||
intros T i m; elim (insert T i a).
|
||||
intros; apply heap_exist with T1; simpl; auto with datatypes.
|
||||
apply meq_trans with (munion (contents T) (singletonBag a)).
|
||||
apply meq_trans with (munion (singletonBag a) (contents T)).
|
||||
apply meq_right; trivial with datatypes.
|
||||
apply munion_comm.
|
||||
apply meq_sym; trivial with datatypes.
|
||||
Qed.
|
||||
|
||||
|
||||
(** ** Building the sorted list *)
|
||||
|
||||
Inductive flat_spec (T:Tree) : Type :=
|
||||
flat_exist :
|
||||
forall l:list A,
|
||||
Sorted leA l ->
|
||||
(forall a:A, leA_Tree a T -> HdRel leA a l) ->
|
||||
meq (contents T) (list_contents _ eqA_dec l) -> flat_spec T.
|
||||
|
||||
Lemma heap_to_list : forall T:Tree, is_heap T -> flat_spec T.
|
||||
Proof.
|
||||
intros T h; elim h; intros.
|
||||
apply flat_exist with (nil (A:=A)); auto with datatypes.
|
||||
elim X; intros l1 s1 i1 m1; elim X0; intros l2 s2 i2 m2.
|
||||
elim (merge _ s1 _ s2); intros.
|
||||
apply flat_exist with (a :: l); simpl; auto with datatypes.
|
||||
apply meq_trans with
|
||||
(munion (list_contents _ eqA_dec l1)
|
||||
(munion (list_contents _ eqA_dec l2) (singletonBag a))).
|
||||
apply meq_congr; auto with datatypes.
|
||||
apply meq_trans with
|
||||
(munion (singletonBag a)
|
||||
(munion (list_contents _ eqA_dec l1) (list_contents _ eqA_dec l2))).
|
||||
apply munion_rotate.
|
||||
apply meq_right; apply meq_sym; trivial with datatypes.
|
||||
Qed.
|
||||
|
||||
|
||||
(** * Specification of treesort *)
|
||||
|
||||
Theorem treesort :
|
||||
forall l:list A,
|
||||
{m : list A | Sorted leA m & permutation _ eqA_dec l m}.
|
||||
Proof.
|
||||
intro l; unfold permutation.
|
||||
elim (list_to_heap l).
|
||||
intros.
|
||||
elim (heap_to_list T); auto with datatypes.
|
||||
intros.
|
||||
exists l0; auto with datatypes.
|
||||
apply meq_trans with (contents T); trivial with datatypes.
|
||||
Qed.
|
||||
|
||||
End defs.
|
||||
5944
samples/Coq/JsCorrectness.v
Normal file
5944
samples/Coq/JsCorrectness.v
Normal file
File diff suppressed because it is too large
Load Diff
249
samples/Coq/JsInterpreterExtraction.v
Normal file
249
samples/Coq/JsInterpreterExtraction.v
Normal file
@@ -0,0 +1,249 @@
|
||||
Set Implicit Arguments.
|
||||
Require Import JsSyntax JsInterpreterMonads JsInterpreter JsInit.
|
||||
Require Import LibFix LibList.
|
||||
|
||||
Require Export Shared.
|
||||
Require Export LibTactics LibLogic LibReflect LibList
|
||||
LibOperation LibStruct LibNat LibEpsilon LibFunc LibHeap.
|
||||
Require Flocq.Appli.Fappli_IEEE Flocq.Appli.Fappli_IEEE_bits.
|
||||
|
||||
|
||||
|
||||
(* Here stands some commands to extract relatively correctly the interpreter to Ocaml. *)
|
||||
Extraction Language Ocaml.
|
||||
|
||||
Require Import ExtrOcamlBasic.
|
||||
Require Import ExtrOcamlNatInt.
|
||||
Require Import ExtrOcamlString.
|
||||
|
||||
(* Optimal fixpoint. *)
|
||||
Extraction Inline FixFun3 FixFun3Mod FixFun4 FixFun4Mod FixFunMod curry3 uncurry3 curry4 uncurry4.
|
||||
(* As classical logic statements are now unused, they should not be extracted
|
||||
(otherwise, useless errors will be launched). *)
|
||||
Extraction Inline epsilon epsilon_def classicT arbitrary indefinite_description Inhab_witness Fix isTrue.
|
||||
|
||||
(**************************************************************)
|
||||
(** ** Numerical values *)
|
||||
|
||||
(* number *)
|
||||
|
||||
Extract Inductive positive => float
|
||||
[ "(fun p -> 1. +. (2. *. p))"
|
||||
"(fun p -> 2. *. p)"
|
||||
"1." ]
|
||||
"(fun f2p1 f2p f1 p ->
|
||||
if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.)))".
|
||||
|
||||
Extract Inductive Z => float [ "0." "" "(~-.)" ]
|
||||
"(fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z))".
|
||||
|
||||
Extract Inductive N => float [ "0." "" ]
|
||||
"(fun f0 fp n -> if n=0. then f0 () else fp n)".
|
||||
|
||||
Extract Constant Z.add => "(+.)".
|
||||
Extract Constant Z.succ => "(+.) 1.".
|
||||
Extract Constant Z.pred => "(fun x -> x -. 1.)".
|
||||
Extract Constant Z.sub => "(-.)".
|
||||
Extract Constant Z.mul => "( *. )".
|
||||
Extract Constant Z.opp => "(~-.)".
|
||||
Extract Constant Z.abs => "abs_float".
|
||||
Extract Constant Z.min => "min".
|
||||
Extract Constant Z.max => "max".
|
||||
Extract Constant Z.compare =>
|
||||
"fun x y -> if x=y then Eq else if x<y then Lt else Gt".
|
||||
|
||||
Extract Constant Pos.add => "(+.)".
|
||||
Extract Constant Pos.succ => "(+.) 1.".
|
||||
Extract Constant Pos.pred => "(fun x -> x -. 1.)".
|
||||
Extract Constant Pos.sub => "(-.)".
|
||||
Extract Constant Pos.mul => "( *. )".
|
||||
Extract Constant Pos.min => "min".
|
||||
Extract Constant Pos.max => "max".
|
||||
Extract Constant Pos.compare =>
|
||||
"fun x y -> if x=y then Eq else if x<y then Lt else Gt".
|
||||
Extract Constant Pos.compare_cont =>
|
||||
"fun x y c -> if x=y then c else if x<y then Lt else Gt".
|
||||
|
||||
Extract Constant N.add => "(+.)".
|
||||
Extract Constant N.succ => "(+.) 1.".
|
||||
Extract Constant N.pred => "(fun x -> x -. 1.)".
|
||||
Extract Constant N.sub => "(-.)".
|
||||
Extract Constant N.mul => "( *. )".
|
||||
Extract Constant N.min => "min".
|
||||
Extract Constant N.max => "max".
|
||||
Extract Constant N.div => "(fun x y -> if x = 0. then 0. else floor (x /. y))".
|
||||
Extract Constant N.modulo => "mod_float".
|
||||
Extract Constant N.compare =>
|
||||
"fun x y -> if x=y then Eq else if x<y then Lt else Gt".
|
||||
|
||||
Extract Inductive Fappli_IEEE.binary_float => float [
|
||||
"(fun s -> if s then (0.) else (-0.))"
|
||||
"(fun s -> if s then infinity else neg_infinity)"
|
||||
"nan"
|
||||
"(fun (s, m, e) -> failwith ""FIXME: No extraction from binary float allowed yet."")"
|
||||
].
|
||||
|
||||
Extract Constant JsNumber.of_int => "fun x -> x".
|
||||
|
||||
Extract Constant JsNumber.nan => "nan".
|
||||
Extract Constant JsNumber.zero => "0.".
|
||||
Extract Constant JsNumber.neg_zero => "(-0.)".
|
||||
Extract Constant JsNumber.one => "1.".
|
||||
Extract Constant JsNumber.infinity => "infinity".
|
||||
Extract Constant JsNumber.neg_infinity => "neg_infinity".
|
||||
Extract Constant JsNumber.max_value => "max_float".
|
||||
Extract Constant JsNumber.min_value => "(Int64.float_of_bits Int64.one)".
|
||||
Extract Constant JsNumber.pi => "(4. *. atan 1.)".
|
||||
Extract Constant JsNumber.e => "(exp 1.)".
|
||||
Extract Constant JsNumber.ln2 => "(log 2.)".
|
||||
Extract Constant JsNumber.floor => "floor".
|
||||
Extract Constant JsNumber.absolute => "abs_float".
|
||||
|
||||
Extract Constant JsNumber.from_string =>
|
||||
"(fun s ->
|
||||
try
|
||||
let s = (String.concat """" (List.map (String.make 1) s)) in
|
||||
if s = """" then 0. else float_of_string s
|
||||
with Failure ""float_of_string"" -> nan)
|
||||
(* Note that we're using `float_of_string' there, which does not have the same
|
||||
behavior than JavaScript. For instance it will read ""022"" as 22 instead of
|
||||
18, which should be the JavaScript result for it. *)".
|
||||
|
||||
Extract Constant JsNumber.to_string =>
|
||||
"(fun f ->
|
||||
prerr_string (""Warning: JsNumber.to_string called. This might be responsible for errors. Argument value: "" ^ string_of_float f ^ ""."");
|
||||
prerr_newline();
|
||||
let string_of_number n =
|
||||
let sfn = string_of_float n in
|
||||
(if (sfn = ""inf"") then ""Infinity"" else
|
||||
if (sfn = ""-inf"") then ""-Infinity"" else
|
||||
if (sfn = ""nan"") then ""NaN"" else
|
||||
let inum = int_of_float n in
|
||||
if (float_of_int inum = n) then (string_of_int inum) else (string_of_float n)) in
|
||||
let ret = ref [] in (* Ugly, but the API for OCaml string is not very functional... *)
|
||||
String.iter (fun c -> ret := c :: !ret) (string_of_number f);
|
||||
List.rev !ret)
|
||||
(* Note that this is ugly, we should use the spec of JsNumber.to_string here (9.8.1). *)".
|
||||
|
||||
Extract Constant JsNumber.add => "(+.)".
|
||||
Extract Constant JsNumber.sub => "(-.)".
|
||||
Extract Constant JsNumber.mult => "( *. )".
|
||||
Extract Constant JsNumber.div => "(/.)".
|
||||
Extract Constant JsNumber.fmod => "mod_float".
|
||||
Extract Constant JsNumber.neg => "(~-.)".
|
||||
Extract Constant JsNumber.sign => "(fun f -> float_of_int (compare f 0.))".
|
||||
Extract Constant JsNumber.number_comparable => "(fun n1 n2 -> 0 = compare n1 n2)".
|
||||
Extract Constant JsNumber.lt_bool => "(<)".
|
||||
|
||||
Extract Constant JsNumber.to_int32 =>
|
||||
"fun n ->
|
||||
match classify_float n with
|
||||
| FP_normal | FP_subnormal ->
|
||||
let i32 = 2. ** 32. in
|
||||
let i31 = 2. ** 31. in
|
||||
let posint = (if n < 0. then (-1.) else 1.) *. (floor (abs_float n)) in
|
||||
let int32bit =
|
||||
let smod = mod_float posint i32 in
|
||||
if smod < 0. then smod +. i32 else smod
|
||||
in
|
||||
(if int32bit >= i31 then int32bit -. i32 else int32bit)
|
||||
| _ -> 0.". (* LATER: do in Coq. Spec is 9.5, p. 47.*)
|
||||
|
||||
Extract Constant JsNumber.to_uint32 =>
|
||||
"fun n ->
|
||||
match classify_float n with
|
||||
| FP_normal | FP_subnormal ->
|
||||
let i32 = 2. ** 32. in
|
||||
let posint = (if n < 0. then (-1.) else 1.) *. (floor (abs_float n)) in
|
||||
let int32bit =
|
||||
let smod = mod_float posint i32 in
|
||||
if smod < 0. then smod +. i32 else smod
|
||||
in
|
||||
int32bit
|
||||
| _ -> 0.". (* LAER: do in Coq. Spec is 9.6, p47.*)
|
||||
|
||||
Extract Constant JsNumber.modulo_32 => "(fun x -> let r = mod_float x 32. in if x < 0. then r +. 32. else r)".
|
||||
Extract Constant JsNumber.int32_bitwise_not => "fun x -> Int32.to_float (Int32.lognot (Int32.of_float x))".
|
||||
Extract Constant JsNumber.int32_bitwise_and => "fun x y -> Int32.to_float (Int32.logand (Int32.of_float x) (Int32.of_float y))".
|
||||
Extract Constant JsNumber.int32_bitwise_or => "fun x y -> Int32.to_float (Int32.logor (Int32.of_float x) (Int32.of_float y))".
|
||||
Extract Constant JsNumber.int32_bitwise_xor => "fun x y -> Int32.to_float (Int32.logxor (Int32.of_float x) (Int32.of_float y))".
|
||||
Extract Constant JsNumber.int32_left_shift => "(fun x y -> Int32.to_float (Int32.shift_left (Int32.of_float x) (int_of_float y)))".
|
||||
Extract Constant JsNumber.int32_right_shift => "(fun x y -> Int32.to_float (Int32.shift_right (Int32.of_float x) (int_of_float y)))".
|
||||
Extract Constant JsNumber.uint32_right_shift =>
|
||||
"(fun x y ->
|
||||
let i31 = 2. ** 31. in
|
||||
let i32 = 2. ** 32. in
|
||||
let newx = if x >= i31 then x -. i32 else x in
|
||||
let r = Int32.to_float (Int32.shift_right_logical (Int32.of_float newx) (int_of_float y)) in
|
||||
if r < 0. then r +. i32 else r)".
|
||||
|
||||
Extract Constant int_of_char => "(fun c -> float_of_int (int_of_char c))".
|
||||
|
||||
Extract Constant ascii_comparable => "(=)".
|
||||
Extract Constant lt_int_decidable => "(<)".
|
||||
Extract Constant le_int_decidable => "(<=)".
|
||||
Extract Constant ge_nat_decidable => "(>=)".
|
||||
|
||||
(* TODO ARTHUR: This TLC lemma does not extract to something computable... whereas it should! *)
|
||||
Extract Constant prop_eq_decidable => "(=)".
|
||||
|
||||
Extract Constant env_loc_global_env_record => "0".
|
||||
|
||||
(* The following functions make pattern matches with floats and shall thus be removed. *)
|
||||
Extraction Inline Fappli_IEEE.Bplus Fappli_IEEE.binary_normalize Fappli_IEEE_bits.b64_plus.
|
||||
Extraction Inline Fappli_IEEE.Bmult Fappli_IEEE.Bmult_FF Fappli_IEEE_bits.b64_mult.
|
||||
Extraction Inline Fappli_IEEE.Bdiv Fappli_IEEE_bits.b64_div.
|
||||
|
||||
(* New options for the interpreter to work in Coq 8.4 *)
|
||||
Set Extraction AccessOpaque.
|
||||
|
||||
(* These parameters are implementation-dependant according to the spec.
|
||||
I've chosed some very simple values, but we could choose another thing for them. *)
|
||||
Extract Constant object_prealloc_global_proto => "(Coq_value_prim Coq_prim_null)".
|
||||
Extract Constant object_prealloc_global_class => "(
|
||||
let rec aux s = function
|
||||
| 0 -> []
|
||||
| n -> let n' = n - 1 in
|
||||
s.[n'] :: aux s n'
|
||||
in let aux2 s =
|
||||
List.rev (aux s (String.length s))
|
||||
in aux2 ""GlobalClass"")".
|
||||
|
||||
|
||||
(* Parsing *)
|
||||
Extract Constant parse_pickable => "(fun s strict ->
|
||||
let str = String.concat """" (List.map (String.make 1) s) in
|
||||
try
|
||||
let parserExp = Parser_main.exp_from_string ~force_strict:strict str in
|
||||
Some (JsSyntaxInfos.add_infos_prog strict
|
||||
(Translate_syntax.exp_to_prog parserExp))
|
||||
with
|
||||
(* | Translate_syntax.CoqSyntaxDoesNotSupport _ -> assert false (* Temporary *) *)
|
||||
| Parser.ParserFailure _
|
||||
| Parser.InvalidArgument ->
|
||||
prerr_string (""Warning: Parser error on eval. Input string: \"""" ^ str ^ ""\""\n"");
|
||||
None
|
||||
)".
|
||||
|
||||
|
||||
(* Debugging *)
|
||||
Extract Inlined Constant not_yet_implemented_because => "(fun s ->
|
||||
print_endline (__LOC__ ^ "": Not implemented because: "" ^ Prheap.string_of_char_list s) ;
|
||||
Coq_result_not_yet_implemented)".
|
||||
Extract Inlined Constant impossible_because => "(fun s ->
|
||||
print_endline (__LOC__ ^ "": Stuck because: "" ^ Prheap.string_of_char_list s) ;
|
||||
Coq_result_impossible)".
|
||||
Extract Inlined Constant impossible_with_heap_because => "(fun s message ->
|
||||
print_endline (__LOC__ ^ "": Stuck!\nState: "" ^ Prheap.prstate true s
|
||||
^ ""\nMessage:\t"" ^ Prheap.string_of_char_list message) ;
|
||||
Coq_result_impossible)".
|
||||
|
||||
|
||||
(* Final Extraction *)
|
||||
Extraction Blacklist string list bool.
|
||||
Separate Extraction runs run_javascript.
|
||||
|
||||
|
||||
|
||||
(* -- LATER: extract inequality_test_string in more efficient way*)
|
||||
|
||||
1051
samples/Coq/JsNumber.v
Normal file
1051
samples/Coq/JsNumber.v
Normal file
File diff suppressed because it is too large
Load Diff
1766
samples/Coq/JsPrettyInterm.v
Normal file
1766
samples/Coq/JsPrettyInterm.v
Normal file
File diff suppressed because it is too large
Load Diff
42
samples/Coq/Main.v
Normal file
42
samples/Coq/Main.v
Normal file
@@ -0,0 +1,42 @@
|
||||
Require Import FunctionNinjas.All.
|
||||
Require Import ListString.All.
|
||||
Require Import Computation.
|
||||
|
||||
Import C.Notations.
|
||||
|
||||
Definition error (message : LString.t) : C.t :=
|
||||
do_call! Command.ShowError message in
|
||||
ret.
|
||||
|
||||
Definition main : C.t :=
|
||||
call! card_is_valid := Command.AskCard in
|
||||
if card_is_valid then
|
||||
call! pin := Command.AskPIN in
|
||||
match pin with
|
||||
| None => error @@ LString.s "No PIN given."
|
||||
| Some pin =>
|
||||
call! pin_is_valid := Command.CheckPIN pin in
|
||||
if pin_is_valid then
|
||||
call! ask_amount := Command.AskAmount in
|
||||
match ask_amount with
|
||||
| None => error @@ LString.s "No amount given."
|
||||
| Some amount =>
|
||||
call! amount_is_valid := Command.CheckAmount amount in
|
||||
if amount_is_valid then
|
||||
call! card_is_given := Command.GiveCard in
|
||||
if card_is_given then
|
||||
call! amount_is_given := Command.GiveAmount amount in
|
||||
if amount_is_given then
|
||||
ret
|
||||
else
|
||||
error @@ LString.s "Cannot give you the amount. Please contact your bank."
|
||||
else
|
||||
error @@ LString.s "Cannot give you back the card. Please contact your bank."
|
||||
else
|
||||
error @@ LString.s "Invalid amount."
|
||||
end
|
||||
else
|
||||
error @@ LString.s "Invalid PIN."
|
||||
end
|
||||
else
|
||||
error @@ LString.s "Invalid card.".
|
||||
@@ -1,539 +0,0 @@
|
||||
Require Import Omega Relations Multiset SetoidList.
|
||||
|
||||
(** This file is deprecated, use [Permutation.v] instead.
|
||||
|
||||
Indeed, this file defines a notion of permutation based on
|
||||
multisets (there exists a permutation between two lists iff every
|
||||
elements have the same multiplicity in the two lists) which
|
||||
requires a more complex apparatus (the equipment of the domain
|
||||
with a decidable equality) than [Permutation] in [Permutation.v].
|
||||
|
||||
The relation between the two relations are in lemma
|
||||
[permutation_Permutation].
|
||||
|
||||
File [Permutation] concerns Leibniz equality : it shows in particular
|
||||
that [List.Permutation] and [permutation] are equivalent in this context.
|
||||
*)
|
||||
|
||||
Set Implicit Arguments.
|
||||
|
||||
Local Notation "[ ]" := nil.
|
||||
Local Notation "[ a ; .. ; b ]" := (a :: .. (b :: []) ..).
|
||||
|
||||
Section Permut.
|
||||
|
||||
(** * From lists to multisets *)
|
||||
|
||||
Variable A : Type.
|
||||
Variable eqA : relation A.
|
||||
Hypothesis eqA_equiv : Equivalence eqA.
|
||||
Hypothesis eqA_dec : forall x y:A, {eqA x y} + {~ eqA x y}.
|
||||
|
||||
Let emptyBag := EmptyBag A.
|
||||
Let singletonBag := SingletonBag _ eqA_dec.
|
||||
|
||||
(** contents of a list *)
|
||||
|
||||
Fixpoint list_contents (l:list A) : multiset A :=
|
||||
match l with
|
||||
| [] => emptyBag
|
||||
| a :: l => munion (singletonBag a) (list_contents l)
|
||||
end.
|
||||
|
||||
Lemma list_contents_app :
|
||||
forall l m:list A,
|
||||
meq (list_contents (l ++ m)) (munion (list_contents l) (list_contents m)).
|
||||
Proof.
|
||||
simple induction l; simpl; auto with datatypes.
|
||||
intros.
|
||||
apply meq_trans with
|
||||
(munion (singletonBag a) (munion (list_contents l0) (list_contents m)));
|
||||
auto with datatypes.
|
||||
Qed.
|
||||
|
||||
(** * [permutation]: definition and basic properties *)
|
||||
|
||||
Definition permutation (l m:list A) := meq (list_contents l) (list_contents m).
|
||||
|
||||
Lemma permut_refl : forall l:list A, permutation l l.
|
||||
Proof.
|
||||
unfold permutation; auto with datatypes.
|
||||
Qed.
|
||||
|
||||
Lemma permut_sym :
|
||||
forall l1 l2 : list A, permutation l1 l2 -> permutation l2 l1.
|
||||
Proof.
|
||||
unfold permutation, meq; intros; symmetry; trivial.
|
||||
Qed.
|
||||
|
||||
Lemma permut_trans :
|
||||
forall l m n:list A, permutation l m -> permutation m n -> permutation l n.
|
||||
Proof.
|
||||
unfold permutation; intros.
|
||||
apply meq_trans with (list_contents m); auto with datatypes.
|
||||
Qed.
|
||||
|
||||
Lemma permut_cons_eq :
|
||||
forall l m:list A,
|
||||
permutation l m -> forall a a', eqA a a' -> permutation (a :: l) (a' :: m).
|
||||
Proof.
|
||||
unfold permutation; simpl; intros.
|
||||
apply meq_trans with (munion (singletonBag a') (list_contents l)).
|
||||
apply meq_left, meq_singleton; auto.
|
||||
auto with datatypes.
|
||||
Qed.
|
||||
|
||||
Lemma permut_cons :
|
||||
forall l m:list A,
|
||||
permutation l m -> forall a:A, permutation (a :: l) (a :: m).
|
||||
Proof.
|
||||
unfold permutation; simpl; auto with datatypes.
|
||||
Qed.
|
||||
|
||||
Lemma permut_app :
|
||||
forall l l' m m':list A,
|
||||
permutation l l' -> permutation m m' -> permutation (l ++ m) (l' ++ m').
|
||||
Proof.
|
||||
unfold permutation; intros.
|
||||
apply meq_trans with (munion (list_contents l) (list_contents m));
|
||||
auto using permut_cons, list_contents_app with datatypes.
|
||||
apply meq_trans with (munion (list_contents l') (list_contents m'));
|
||||
auto using permut_cons, list_contents_app with datatypes.
|
||||
apply meq_trans with (munion (list_contents l') (list_contents m));
|
||||
auto using permut_cons, list_contents_app with datatypes.
|
||||
Qed.
|
||||
|
||||
Lemma permut_add_inside_eq :
|
||||
forall a a' l1 l2 l3 l4, eqA a a' ->
|
||||
permutation (l1 ++ l2) (l3 ++ l4) ->
|
||||
permutation (l1 ++ a :: l2) (l3 ++ a' :: l4).
|
||||
Proof.
|
||||
unfold permutation, meq in *; intros.
|
||||
specialize H0 with a0.
|
||||
repeat rewrite list_contents_app in *; simpl in *.
|
||||
destruct (eqA_dec a a0) as [Ha|Ha]; rewrite H in Ha;
|
||||
decide (eqA_dec a' a0) with Ha; simpl; auto with arith.
|
||||
do 2 rewrite <- plus_n_Sm; f_equal; auto.
|
||||
Qed.
|
||||
|
||||
Lemma permut_add_inside :
|
||||
forall a l1 l2 l3 l4,
|
||||
permutation (l1 ++ l2) (l3 ++ l4) ->
|
||||
permutation (l1 ++ a :: l2) (l3 ++ a :: l4).
|
||||
Proof.
|
||||
unfold permutation, meq in *; intros.
|
||||
generalize (H a0); clear H.
|
||||
do 4 rewrite list_contents_app.
|
||||
simpl.
|
||||
destruct (eqA_dec a a0); simpl; auto with arith.
|
||||
do 2 rewrite <- plus_n_Sm; f_equal; auto.
|
||||
Qed.
|
||||
|
||||
Lemma permut_add_cons_inside_eq :
|
||||
forall a a' l l1 l2, eqA a a' ->
|
||||
permutation l (l1 ++ l2) ->
|
||||
permutation (a :: l) (l1 ++ a' :: l2).
|
||||
Proof.
|
||||
intros;
|
||||
replace (a :: l) with ([] ++ a :: l); trivial;
|
||||
apply permut_add_inside_eq; trivial.
|
||||
Qed.
|
||||
|
||||
Lemma permut_add_cons_inside :
|
||||
forall a l l1 l2,
|
||||
permutation l (l1 ++ l2) ->
|
||||
permutation (a :: l) (l1 ++ a :: l2).
|
||||
Proof.
|
||||
intros;
|
||||
replace (a :: l) with ([] ++ a :: l); trivial;
|
||||
apply permut_add_inside; trivial.
|
||||
Qed.
|
||||
|
||||
Lemma permut_middle :
|
||||
forall (l m:list A) (a:A), permutation (a :: l ++ m) (l ++ a :: m).
|
||||
Proof.
|
||||
intros; apply permut_add_cons_inside; auto using permut_sym, permut_refl.
|
||||
Qed.
|
||||
|
||||
Lemma permut_sym_app :
|
||||
forall l1 l2, permutation (l1 ++ l2) (l2 ++ l1).
|
||||
Proof.
|
||||
intros l1 l2;
|
||||
unfold permutation, meq;
|
||||
intro a; do 2 rewrite list_contents_app; simpl;
|
||||
auto with arith.
|
||||
Qed.
|
||||
|
||||
Lemma permut_rev :
|
||||
forall l, permutation l (rev l).
|
||||
Proof.
|
||||
induction l.
|
||||
simpl; trivial using permut_refl.
|
||||
simpl.
|
||||
apply permut_add_cons_inside.
|
||||
rewrite <- app_nil_end. trivial.
|
||||
Qed.
|
||||
|
||||
(** * Some inversion results. *)
|
||||
Lemma permut_conv_inv :
|
||||
forall e l1 l2, permutation (e :: l1) (e :: l2) -> permutation l1 l2.
|
||||
Proof.
|
||||
intros e l1 l2; unfold permutation, meq; simpl; intros H a;
|
||||
generalize (H a); apply plus_reg_l.
|
||||
Qed.
|
||||
|
||||
Lemma permut_app_inv1 :
|
||||
forall l l1 l2, permutation (l1 ++ l) (l2 ++ l) -> permutation l1 l2.
|
||||
Proof.
|
||||
intros l l1 l2; unfold permutation, meq; simpl;
|
||||
intros H a; generalize (H a); clear H.
|
||||
do 2 rewrite list_contents_app.
|
||||
simpl.
|
||||
intros; apply plus_reg_l with (multiplicity (list_contents l) a).
|
||||
rewrite plus_comm; rewrite H; rewrite plus_comm.
|
||||
trivial.
|
||||
Qed.
|
||||
|
||||
(** we can use [multiplicity] to define [InA] and [NoDupA]. *)
|
||||
|
||||
Fact if_eqA_then : forall a a' (B:Type)(b b':B),
|
||||
eqA a a' -> (if eqA_dec a a' then b else b') = b.
|
||||
Proof.
|
||||
intros. destruct eqA_dec as [_|NEQ]; auto.
|
||||
contradict NEQ; auto.
|
||||
Qed.
|
||||
|
||||
Lemma permut_app_inv2 :
|
||||
forall l l1 l2, permutation (l ++ l1) (l ++ l2) -> permutation l1 l2.
|
||||
Proof.
|
||||
intros l l1 l2; unfold permutation, meq; simpl;
|
||||
intros H a; generalize (H a); clear H.
|
||||
do 2 rewrite list_contents_app.
|
||||
simpl.
|
||||
intros; apply plus_reg_l with (multiplicity (list_contents l) a).
|
||||
trivial.
|
||||
Qed.
|
||||
|
||||
Lemma permut_remove_hd_eq :
|
||||
forall l l1 l2 a b, eqA a b ->
|
||||
permutation (a :: l) (l1 ++ b :: l2) -> permutation l (l1 ++ l2).
|
||||
Proof.
|
||||
unfold permutation, meq; simpl; intros l l1 l2 a b Heq H a0.
|
||||
specialize H with a0.
|
||||
rewrite list_contents_app in *; simpl in *.
|
||||
apply plus_reg_l with (if eqA_dec a a0 then 1 else 0).
|
||||
rewrite H; clear H.
|
||||
symmetry; rewrite plus_comm, <- ! plus_assoc; f_equal.
|
||||
rewrite plus_comm.
|
||||
destruct (eqA_dec a a0) as [Ha|Ha]; rewrite Heq in Ha;
|
||||
decide (eqA_dec b a0) with Ha; reflexivity.
|
||||
Qed.
|
||||
|
||||
Lemma permut_remove_hd :
|
||||
forall l l1 l2 a,
|
||||
permutation (a :: l) (l1 ++ a :: l2) -> permutation l (l1 ++ l2).
|
||||
Proof.
|
||||
eauto using permut_remove_hd_eq, Equivalence_Reflexive.
|
||||
Qed.
|
||||
|
||||
Fact if_eqA_else : forall a a' (B:Type)(b b':B),
|
||||
~eqA a a' -> (if eqA_dec a a' then b else b') = b'.
|
||||
Proof.
|
||||
intros. decide (eqA_dec a a') with H; auto.
|
||||
Qed.
|
||||
|
||||
Fact if_eqA_refl : forall a (B:Type)(b b':B),
|
||||
(if eqA_dec a a then b else b') = b.
|
||||
Proof.
|
||||
intros; apply (decide_left (eqA_dec a a)); auto with *.
|
||||
Qed.
|
||||
|
||||
(** PL: Inutilisable dans un rewrite sans un change prealable. *)
|
||||
|
||||
Global Instance if_eqA (B:Type)(b b':B) :
|
||||
Proper (eqA==>eqA==>@eq _) (fun x y => if eqA_dec x y then b else b').
|
||||
Proof.
|
||||
intros x x' Hxx' y y' Hyy'.
|
||||
intros; destruct (eqA_dec x y) as [H|H];
|
||||
destruct (eqA_dec x' y') as [H'|H']; auto.
|
||||
contradict H'; transitivity x; auto with *; transitivity y; auto with *.
|
||||
contradict H; transitivity x'; auto with *; transitivity y'; auto with *.
|
||||
Qed.
|
||||
|
||||
Fact if_eqA_rewrite_l : forall a1 a1' a2 (B:Type)(b b':B),
|
||||
eqA a1 a1' -> (if eqA_dec a1 a2 then b else b') =
|
||||
(if eqA_dec a1' a2 then b else b').
|
||||
Proof.
|
||||
intros; destruct (eqA_dec a1 a2) as [A1|A1];
|
||||
destruct (eqA_dec a1' a2) as [A1'|A1']; auto.
|
||||
contradict A1'; transitivity a1; eauto with *.
|
||||
contradict A1; transitivity a1'; eauto with *.
|
||||
Qed.
|
||||
|
||||
Fact if_eqA_rewrite_r : forall a1 a2 a2' (B:Type)(b b':B),
|
||||
eqA a2 a2' -> (if eqA_dec a1 a2 then b else b') =
|
||||
(if eqA_dec a1 a2' then b else b').
|
||||
Proof.
|
||||
intros; destruct (eqA_dec a1 a2) as [A2|A2];
|
||||
destruct (eqA_dec a1 a2') as [A2'|A2']; auto.
|
||||
contradict A2'; transitivity a2; eauto with *.
|
||||
contradict A2; transitivity a2'; eauto with *.
|
||||
Qed.
|
||||
|
||||
|
||||
Global Instance multiplicity_eqA (l:list A) :
|
||||
Proper (eqA==>@eq _) (multiplicity (list_contents l)).
|
||||
Proof.
|
||||
intros x x' Hxx'.
|
||||
induction l as [|y l Hl]; simpl; auto.
|
||||
rewrite (@if_eqA_rewrite_r y x x'); auto.
|
||||
Qed.
|
||||
|
||||
Lemma multiplicity_InA :
|
||||
forall l a, InA eqA a l <-> 0 < multiplicity (list_contents l) a.
|
||||
Proof.
|
||||
induction l.
|
||||
simpl.
|
||||
split; inversion 1.
|
||||
simpl.
|
||||
intros a'; split; intros H. inversion_clear H.
|
||||
apply (decide_left (eqA_dec a a')); auto with *.
|
||||
destruct (eqA_dec a a'); auto with *. simpl; rewrite <- IHl; auto.
|
||||
destruct (eqA_dec a a'); auto with *. right. rewrite IHl; auto.
|
||||
Qed.
|
||||
|
||||
Lemma multiplicity_InA_O :
|
||||
forall l a, ~ InA eqA a l -> multiplicity (list_contents l) a = 0.
|
||||
Proof.
|
||||
intros l a; rewrite multiplicity_InA;
|
||||
destruct (multiplicity (list_contents l) a); auto with arith.
|
||||
destruct 1; auto with arith.
|
||||
Qed.
|
||||
|
||||
Lemma multiplicity_InA_S :
|
||||
forall l a, InA eqA a l -> multiplicity (list_contents l) a >= 1.
|
||||
Proof.
|
||||
intros l a; rewrite multiplicity_InA; auto with arith.
|
||||
Qed.
|
||||
|
||||
Lemma multiplicity_NoDupA : forall l,
|
||||
NoDupA eqA l <-> (forall a, multiplicity (list_contents l) a <= 1).
|
||||
Proof.
|
||||
induction l.
|
||||
simpl.
|
||||
split; auto with arith.
|
||||
split; simpl.
|
||||
inversion_clear 1.
|
||||
rewrite IHl in H1.
|
||||
intros; destruct (eqA_dec a a0) as [EQ|NEQ]; simpl; auto with *.
|
||||
rewrite <- EQ.
|
||||
rewrite multiplicity_InA_O; auto.
|
||||
intros; constructor.
|
||||
rewrite multiplicity_InA.
|
||||
specialize (H a).
|
||||
rewrite if_eqA_refl in H.
|
||||
clear IHl; omega.
|
||||
rewrite IHl; intros.
|
||||
specialize (H a0). omega.
|
||||
Qed.
|
||||
|
||||
(** Permutation is compatible with InA. *)
|
||||
Lemma permut_InA_InA :
|
||||
forall l1 l2 e, permutation l1 l2 -> InA eqA e l1 -> InA eqA e l2.
|
||||
Proof.
|
||||
intros l1 l2 e.
|
||||
do 2 rewrite multiplicity_InA.
|
||||
unfold permutation, meq.
|
||||
intros H;rewrite H; auto.
|
||||
Qed.
|
||||
|
||||
Lemma permut_cons_InA :
|
||||
forall l1 l2 e, permutation (e :: l1) l2 -> InA eqA e l2.
|
||||
Proof.
|
||||
intros; apply (permut_InA_InA (e:=e) H); auto with *.
|
||||
Qed.
|
||||
|
||||
(** Permutation of an empty list. *)
|
||||
Lemma permut_nil :
|
||||
forall l, permutation l [] -> l = [].
|
||||
Proof.
|
||||
intro l; destruct l as [ | e l ]; trivial.
|
||||
assert (InA eqA e (e::l)) by (auto with *).
|
||||
intro Abs; generalize (permut_InA_InA Abs H).
|
||||
inversion 1.
|
||||
Qed.
|
||||
|
||||
(** Permutation for short lists. *)
|
||||
|
||||
Lemma permut_length_1:
|
||||
forall a b, permutation [a] [b] -> eqA a b.
|
||||
Proof.
|
||||
intros a b; unfold permutation, meq.
|
||||
intro P; specialize (P b); simpl in *.
|
||||
rewrite if_eqA_refl in *.
|
||||
destruct (eqA_dec a b); simpl; auto; discriminate.
|
||||
Qed.
|
||||
|
||||
Lemma permut_length_2 :
|
||||
forall a1 b1 a2 b2, permutation [a1; b1] [a2; b2] ->
|
||||
(eqA a1 a2) /\ (eqA b1 b2) \/ (eqA a1 b2) /\ (eqA a2 b1).
|
||||
Proof.
|
||||
intros a1 b1 a2 b2 P.
|
||||
assert (H:=permut_cons_InA P).
|
||||
inversion_clear H.
|
||||
left; split; auto.
|
||||
apply permut_length_1.
|
||||
red; red; intros.
|
||||
specialize (P a). simpl in *.
|
||||
rewrite (@if_eqA_rewrite_l a1 a2 a) in P by auto. omega.
|
||||
right.
|
||||
inversion_clear H0; [|inversion H].
|
||||
split; auto.
|
||||
apply permut_length_1.
|
||||
red; red; intros.
|
||||
specialize (P a); simpl in *.
|
||||
rewrite (@if_eqA_rewrite_l a1 b2 a) in P by auto. omega.
|
||||
Qed.
|
||||
|
||||
(** Permutation is compatible with length. *)
|
||||
Lemma permut_length :
|
||||
forall l1 l2, permutation l1 l2 -> length l1 = length l2.
|
||||
Proof.
|
||||
induction l1; intros l2 H.
|
||||
rewrite (permut_nil (permut_sym H)); auto.
|
||||
assert (H0:=permut_cons_InA H).
|
||||
destruct (InA_split H0) as (h2,(b,(t2,(H1,H2)))).
|
||||
subst l2.
|
||||
rewrite app_length.
|
||||
simpl; rewrite <- plus_n_Sm; f_equal.
|
||||
rewrite <- app_length.
|
||||
apply IHl1.
|
||||
apply permut_remove_hd with b.
|
||||
apply permut_trans with (a::l1); auto.
|
||||
revert H1; unfold permutation, meq; simpl.
|
||||
intros; f_equal; auto.
|
||||
rewrite (@if_eqA_rewrite_l a b a0); auto.
|
||||
Qed.
|
||||
|
||||
Lemma NoDupA_equivlistA_permut :
|
||||
forall l l', NoDupA eqA l -> NoDupA eqA l' ->
|
||||
equivlistA eqA l l' -> permutation l l'.
|
||||
Proof.
|
||||
intros.
|
||||
red; unfold meq; intros.
|
||||
rewrite multiplicity_NoDupA in H, H0.
|
||||
generalize (H a) (H0 a) (H1 a); clear H H0 H1.
|
||||
do 2 rewrite multiplicity_InA.
|
||||
destruct 3; omega.
|
||||
Qed.
|
||||
|
||||
End Permut.
|
||||
|
||||
Section Permut_map.
|
||||
|
||||
Variables A B : Type.
|
||||
|
||||
Variable eqA : relation A.
|
||||
Hypothesis eqA_dec : forall x y:A, {eqA x y} + {~ eqA x y}.
|
||||
Hypothesis eqA_equiv : Equivalence eqA.
|
||||
|
||||
Variable eqB : B->B->Prop.
|
||||
Hypothesis eqB_dec : forall x y:B, { eqB x y }+{ ~eqB x y }.
|
||||
Hypothesis eqB_trans : Transitive eqB.
|
||||
|
||||
(** Permutation is compatible with map. *)
|
||||
|
||||
Lemma permut_map :
|
||||
forall f,
|
||||
(Proper (eqA==>eqB) f) ->
|
||||
forall l1 l2, permutation _ eqA_dec l1 l2 ->
|
||||
permutation _ eqB_dec (map f l1) (map f l2).
|
||||
Proof.
|
||||
intros f; induction l1.
|
||||
intros l2 P; rewrite (permut_nil eqA_equiv (permut_sym P)); apply permut_refl.
|
||||
intros l2 P.
|
||||
simpl.
|
||||
assert (H0:=permut_cons_InA eqA_equiv P).
|
||||
destruct (InA_split H0) as (h2,(b,(t2,(H1,H2)))).
|
||||
subst l2.
|
||||
rewrite map_app.
|
||||
simpl.
|
||||
apply permut_trans with (f b :: map f l1).
|
||||
revert H1; unfold permutation, meq; simpl.
|
||||
intros; f_equal; auto.
|
||||
destruct (eqB_dec (f b) a0) as [H2|H2];
|
||||
destruct (eqB_dec (f a) a0) as [H3|H3]; auto.
|
||||
destruct H3; transitivity (f b); auto with *.
|
||||
destruct H2; transitivity (f a); auto with *.
|
||||
apply permut_add_cons_inside.
|
||||
rewrite <- map_app.
|
||||
apply IHl1; auto.
|
||||
apply permut_remove_hd with b; trivial.
|
||||
apply permut_trans with (a::l1); auto.
|
||||
revert H1; unfold permutation, meq; simpl.
|
||||
intros; f_equal; auto.
|
||||
rewrite (@if_eqA_rewrite_l _ _ eqA_equiv eqA_dec a b a0); auto.
|
||||
Qed.
|
||||
|
||||
End Permut_map.
|
||||
|
||||
Require Import Permutation.
|
||||
|
||||
Section Permut_permut.
|
||||
|
||||
Variable A : Type.
|
||||
|
||||
Variable eqA : relation A.
|
||||
Hypothesis eqA_dec : forall x y:A, {eqA x y} + {~ eqA x y}.
|
||||
Hypothesis eqA_equiv : Equivalence eqA.
|
||||
|
||||
Lemma Permutation_impl_permutation : forall l l',
|
||||
Permutation l l' -> permutation _ eqA_dec l l'.
|
||||
Proof.
|
||||
induction 1.
|
||||
apply permut_refl.
|
||||
apply permut_cons; auto using Equivalence_Reflexive.
|
||||
change (x :: y :: l) with ([x] ++ y :: l);
|
||||
apply permut_add_cons_inside; simpl;
|
||||
apply permut_cons_eq; auto using Equivalence_Reflexive, permut_refl.
|
||||
apply permut_trans with l'; trivial.
|
||||
Qed.
|
||||
|
||||
Lemma permut_eqA : forall l l', Forall2 eqA l l' -> permutation _ eqA_dec l l'.
|
||||
Proof.
|
||||
induction 1.
|
||||
apply permut_refl.
|
||||
apply permut_cons_eq; trivial.
|
||||
Qed.
|
||||
|
||||
Lemma permutation_Permutation : forall l l',
|
||||
permutation _ eqA_dec l l' <->
|
||||
exists l'', Permutation l l'' /\ Forall2 eqA l'' l'.
|
||||
Proof.
|
||||
split; intro H.
|
||||
(* -> *)
|
||||
induction l in l', H |- *.
|
||||
exists []; apply permut_sym, permut_nil in H as ->; auto using Forall2.
|
||||
pose proof H as H'.
|
||||
apply permut_cons_InA, InA_split in H
|
||||
as (l1 & y & l2 & Heq & ->); trivial.
|
||||
apply permut_remove_hd_eq, IHl in H'
|
||||
as (l'' & IHP & IHA); clear IHl; trivial.
|
||||
apply Forall2_app_inv_r in IHA as (l1'' & l2'' & Hl1 & Hl2 & ->).
|
||||
exists (l1'' ++ a :: l2''); split.
|
||||
apply Permutation_cons_app; trivial.
|
||||
apply Forall2_app, Forall2_cons; trivial.
|
||||
(* <- *)
|
||||
destruct H as (l'' & H & Heq).
|
||||
apply permut_trans with l''.
|
||||
apply Permutation_impl_permutation; trivial.
|
||||
apply permut_eqA; trivial.
|
||||
Qed.
|
||||
|
||||
End Permut_permut.
|
||||
|
||||
(* begin hide *)
|
||||
(** For compatibilty *)
|
||||
Notation permut_right := permut_cons (only parsing).
|
||||
Notation permut_tran := permut_trans (only parsing).
|
||||
(* end hide *)
|
||||
@@ -1,632 +0,0 @@
|
||||
(* Adapted in May 2006 by Jean-Marc Notin from initial contents by
|
||||
Laurent Thery (Huffmann contribution, October 2003) *)
|
||||
|
||||
Require Import List Setoid Compare_dec Morphisms.
|
||||
Import ListNotations. (* For notations [] and [a;b;c] *)
|
||||
Set Implicit Arguments.
|
||||
|
||||
Section Permutation.
|
||||
|
||||
Variable A:Type.
|
||||
|
||||
Inductive Permutation : list A -> list A -> Prop :=
|
||||
| perm_nil: Permutation [] []
|
||||
| perm_skip x l l' : Permutation l l' -> Permutation (x::l) (x::l')
|
||||
| perm_swap x y l : Permutation (y::x::l) (x::y::l)
|
||||
| perm_trans l l' l'' :
|
||||
Permutation l l' -> Permutation l' l'' -> Permutation l l''.
|
||||
|
||||
Local Hint Constructors Permutation.
|
||||
|
||||
(** Some facts about [Permutation] *)
|
||||
|
||||
Theorem Permutation_nil : forall (l : list A), Permutation [] l -> l = [].
|
||||
Proof.
|
||||
intros l HF.
|
||||
remember (@nil A) as m in HF.
|
||||
induction HF; discriminate || auto.
|
||||
Qed.
|
||||
|
||||
Theorem Permutation_nil_cons : forall (l : list A) (x : A),
|
||||
~ Permutation nil (x::l).
|
||||
Proof.
|
||||
intros l x HF.
|
||||
apply Permutation_nil in HF; discriminate.
|
||||
Qed.
|
||||
|
||||
(** Permutation over lists is a equivalence relation *)
|
||||
|
||||
Theorem Permutation_refl : forall l : list A, Permutation l l.
|
||||
Proof.
|
||||
induction l; constructor. exact IHl.
|
||||
Qed.
|
||||
|
||||
Theorem Permutation_sym : forall l l' : list A,
|
||||
Permutation l l' -> Permutation l' l.
|
||||
Proof.
|
||||
intros l l' Hperm; induction Hperm; auto.
|
||||
apply perm_trans with (l':=l'); assumption.
|
||||
Qed.
|
||||
|
||||
Theorem Permutation_trans : forall l l' l'' : list A,
|
||||
Permutation l l' -> Permutation l' l'' -> Permutation l l''.
|
||||
Proof.
|
||||
exact perm_trans.
|
||||
Qed.
|
||||
|
||||
End Permutation.
|
||||
|
||||
Hint Resolve Permutation_refl perm_nil perm_skip.
|
||||
|
||||
(* These hints do not reduce the size of the problem to solve and they
|
||||
must be used with care to avoid combinatoric explosions *)
|
||||
|
||||
Local Hint Resolve perm_swap perm_trans.
|
||||
Local Hint Resolve Permutation_sym Permutation_trans.
|
||||
|
||||
(* This provides reflexivity, symmetry and transitivity and rewriting
|
||||
on morphims to come *)
|
||||
|
||||
Instance Permutation_Equivalence A : Equivalence (@Permutation A) | 10 := {
|
||||
Equivalence_Reflexive := @Permutation_refl A ;
|
||||
Equivalence_Symmetric := @Permutation_sym A ;
|
||||
Equivalence_Transitive := @Permutation_trans A }.
|
||||
|
||||
Instance Permutation_cons A :
|
||||
Proper (Logic.eq ==> @Permutation A ==> @Permutation A) (@cons A) | 10.
|
||||
Proof.
|
||||
repeat intro; subst; auto using perm_skip.
|
||||
Qed.
|
||||
|
||||
Section Permutation_properties.
|
||||
|
||||
Variable A:Type.
|
||||
|
||||
Implicit Types a b : A.
|
||||
Implicit Types l m : list A.
|
||||
|
||||
(** Compatibility with others operations on lists *)
|
||||
|
||||
Theorem Permutation_in : forall (l l' : list A) (x : A),
|
||||
Permutation l l' -> In x l -> In x l'.
|
||||
Proof.
|
||||
intros l l' x Hperm; induction Hperm; simpl; tauto.
|
||||
Qed.
|
||||
|
||||
Global Instance Permutation_in' :
|
||||
Proper (Logic.eq ==> @Permutation A ==> iff) (@In A) | 10.
|
||||
Proof.
|
||||
repeat red; intros; subst; eauto using Permutation_in.
|
||||
Qed.
|
||||
|
||||
Lemma Permutation_app_tail : forall (l l' tl : list A),
|
||||
Permutation l l' -> Permutation (l++tl) (l'++tl).
|
||||
Proof.
|
||||
intros l l' tl Hperm; induction Hperm as [|x l l'|x y l|l l' l'']; simpl; auto.
|
||||
eapply Permutation_trans with (l':=l'++tl); trivial.
|
||||
Qed.
|
||||
|
||||
Lemma Permutation_app_head : forall (l tl tl' : list A),
|
||||
Permutation tl tl' -> Permutation (l++tl) (l++tl').
|
||||
Proof.
|
||||
intros l tl tl' Hperm; induction l;
|
||||
[trivial | repeat rewrite <- app_comm_cons; constructor; assumption].
|
||||
Qed.
|
||||
|
||||
Theorem Permutation_app : forall (l m l' m' : list A),
|
||||
Permutation l l' -> Permutation m m' -> Permutation (l++m) (l'++m').
|
||||
Proof.
|
||||
intros l m l' m' Hpermll' Hpermmm';
|
||||
induction Hpermll' as [|x l l'|x y l|l l' l''];
|
||||
repeat rewrite <- app_comm_cons; auto.
|
||||
apply Permutation_trans with (l' := (x :: y :: l ++ m));
|
||||
[idtac | repeat rewrite app_comm_cons; apply Permutation_app_head]; trivial.
|
||||
apply Permutation_trans with (l' := (l' ++ m')); try assumption.
|
||||
apply Permutation_app_tail; assumption.
|
||||
Qed.
|
||||
|
||||
Global Instance Permutation_app' :
|
||||
Proper (@Permutation A ==> @Permutation A ==> @Permutation A) (@app A) | 10.
|
||||
Proof.
|
||||
repeat intro; now apply Permutation_app.
|
||||
Qed.
|
||||
|
||||
Lemma Permutation_add_inside : forall a (l l' tl tl' : list A),
|
||||
Permutation l l' -> Permutation tl tl' ->
|
||||
Permutation (l ++ a :: tl) (l' ++ a :: tl').
|
||||
Proof.
|
||||
intros; apply Permutation_app; auto.
|
||||
Qed.
|
||||
|
||||
Lemma Permutation_cons_append : forall (l : list A) x,
|
||||
Permutation (x :: l) (l ++ x :: nil).
|
||||
Proof. induction l; intros; auto. simpl. rewrite <- IHl; auto. Qed.
|
||||
Local Hint Resolve Permutation_cons_append.
|
||||
|
||||
Theorem Permutation_app_comm : forall (l l' : list A),
|
||||
Permutation (l ++ l') (l' ++ l).
|
||||
Proof.
|
||||
induction l as [|x l]; simpl; intro l'.
|
||||
rewrite app_nil_r; trivial. rewrite IHl.
|
||||
rewrite app_comm_cons, Permutation_cons_append.
|
||||
now rewrite <- app_assoc.
|
||||
Qed.
|
||||
Local Hint Resolve Permutation_app_comm.
|
||||
|
||||
Theorem Permutation_cons_app : forall (l l1 l2:list A) a,
|
||||
Permutation l (l1 ++ l2) -> Permutation (a :: l) (l1 ++ a :: l2).
|
||||
Proof.
|
||||
intros l l1 l2 a H. rewrite H.
|
||||
rewrite app_comm_cons, Permutation_cons_append.
|
||||
now rewrite <- app_assoc.
|
||||
Qed.
|
||||
Local Hint Resolve Permutation_cons_app.
|
||||
|
||||
Theorem Permutation_middle : forall (l1 l2:list A) a,
|
||||
Permutation (a :: l1 ++ l2) (l1 ++ a :: l2).
|
||||
Proof.
|
||||
auto.
|
||||
Qed.
|
||||
Local Hint Resolve Permutation_middle.
|
||||
|
||||
Theorem Permutation_rev : forall (l : list A), Permutation l (rev l).
|
||||
Proof.
|
||||
induction l as [| x l]; simpl; trivial. now rewrite IHl at 1.
|
||||
Qed.
|
||||
|
||||
Global Instance Permutation_rev' :
|
||||
Proper (@Permutation A ==> @Permutation A) (@rev A) | 10.
|
||||
Proof.
|
||||
repeat intro; now rewrite <- 2 Permutation_rev.
|
||||
Qed.
|
||||
|
||||
Theorem Permutation_length : forall (l l' : list A),
|
||||
Permutation l l' -> length l = length l'.
|
||||
Proof.
|
||||
intros l l' Hperm; induction Hperm; simpl; auto. now transitivity (length l').
|
||||
Qed.
|
||||
|
||||
Global Instance Permutation_length' :
|
||||
Proper (@Permutation A ==> Logic.eq) (@length A) | 10.
|
||||
Proof.
|
||||
exact Permutation_length.
|
||||
Qed.
|
||||
|
||||
Theorem Permutation_ind_bis :
|
||||
forall P : list A -> list A -> Prop,
|
||||
P [] [] ->
|
||||
(forall x l l', Permutation l l' -> P l l' -> P (x :: l) (x :: l')) ->
|
||||
(forall x y l l', Permutation l l' -> P l l' -> P (y :: x :: l) (x :: y :: l')) ->
|
||||
(forall l l' l'', Permutation l l' -> P l l' -> Permutation l' l'' -> P l' l'' -> P l l'') ->
|
||||
forall l l', Permutation l l' -> P l l'.
|
||||
Proof.
|
||||
intros P Hnil Hskip Hswap Htrans.
|
||||
induction 1; auto.
|
||||
apply Htrans with (x::y::l); auto.
|
||||
apply Hswap; auto.
|
||||
induction l; auto.
|
||||
apply Hskip; auto.
|
||||
apply Hskip; auto.
|
||||
induction l; auto.
|
||||
eauto.
|
||||
Qed.
|
||||
|
||||
Ltac break_list l x l' H :=
|
||||
destruct l as [|x l']; simpl in *;
|
||||
injection H; intros; subst; clear H.
|
||||
|
||||
Theorem Permutation_nil_app_cons : forall (l l' : list A) (x : A),
|
||||
~ Permutation nil (l++x::l').
|
||||
Proof.
|
||||
intros l l' x HF.
|
||||
apply Permutation_nil in HF. destruct l; discriminate.
|
||||
Qed.
|
||||
|
||||
Theorem Permutation_app_inv : forall (l1 l2 l3 l4:list A) a,
|
||||
Permutation (l1++a::l2) (l3++a::l4) -> Permutation (l1++l2) (l3 ++ l4).
|
||||
Proof.
|
||||
intros l1 l2 l3 l4 a; revert l1 l2 l3 l4.
|
||||
set (P l l' :=
|
||||
forall l1 l2 l3 l4, l=l1++a::l2 -> l'=l3++a::l4 ->
|
||||
Permutation (l1++l2) (l3++l4)).
|
||||
cut (forall l l', Permutation l l' -> P l l').
|
||||
intros H; intros; eapply H; eauto.
|
||||
apply (Permutation_ind_bis P); unfold P; clear P.
|
||||
- (* nil *)
|
||||
intros; now destruct l1.
|
||||
- (* skip *)
|
||||
intros x l l' H IH; intros.
|
||||
break_list l1 b l1' H0; break_list l3 c l3' H1.
|
||||
auto.
|
||||
now rewrite H.
|
||||
now rewrite <- H.
|
||||
now rewrite (IH _ _ _ _ eq_refl eq_refl).
|
||||
- (* swap *)
|
||||
intros x y l l' Hp IH; intros.
|
||||
break_list l1 b l1' H; break_list l3 c l3' H0.
|
||||
auto.
|
||||
break_list l3' b l3'' H.
|
||||
auto.
|
||||
constructor. now rewrite Permutation_middle.
|
||||
break_list l1' c l1'' H1.
|
||||
auto.
|
||||
constructor. now rewrite Permutation_middle.
|
||||
break_list l3' d l3'' H; break_list l1' e l1'' H1.
|
||||
auto.
|
||||
rewrite perm_swap. constructor. now rewrite Permutation_middle.
|
||||
rewrite perm_swap. constructor. now rewrite Permutation_middle.
|
||||
now rewrite perm_swap, (IH _ _ _ _ eq_refl eq_refl).
|
||||
- (*trans*)
|
||||
intros.
|
||||
destruct (In_split a l') as (l'1,(l'2,H6)).
|
||||
rewrite <- H.
|
||||
subst l.
|
||||
apply in_or_app; right; red; auto.
|
||||
apply perm_trans with (l'1++l'2).
|
||||
apply (H0 _ _ _ _ H3 H6).
|
||||
apply (H2 _ _ _ _ H6 H4).
|
||||
Qed.
|
||||
|
||||
Theorem Permutation_cons_inv l l' a :
|
||||
Permutation (a::l) (a::l') -> Permutation l l'.
|
||||
Proof.
|
||||
intro H; exact (Permutation_app_inv [] l [] l' a H).
|
||||
Qed.
|
||||
|
||||
Theorem Permutation_cons_app_inv l l1 l2 a :
|
||||
Permutation (a :: l) (l1 ++ a :: l2) -> Permutation l (l1 ++ l2).
|
||||
Proof.
|
||||
intro H; exact (Permutation_app_inv [] l l1 l2 a H).
|
||||
Qed.
|
||||
|
||||
Theorem Permutation_app_inv_l : forall l l1 l2,
|
||||
Permutation (l ++ l1) (l ++ l2) -> Permutation l1 l2.
|
||||
Proof.
|
||||
induction l; simpl; auto.
|
||||
intros.
|
||||
apply IHl.
|
||||
apply Permutation_cons_inv with a; auto.
|
||||
Qed.
|
||||
|
||||
Theorem Permutation_app_inv_r : forall l l1 l2,
|
||||
Permutation (l1 ++ l) (l2 ++ l) -> Permutation l1 l2.
|
||||
Proof.
|
||||
induction l.
|
||||
intros l1 l2; do 2 rewrite app_nil_r; auto.
|
||||
intros.
|
||||
apply IHl.
|
||||
apply Permutation_app_inv with a; auto.
|
||||
Qed.
|
||||
|
||||
Lemma Permutation_length_1_inv: forall a l, Permutation [a] l -> l = [a].
|
||||
Proof.
|
||||
intros a l H; remember [a] as m in H.
|
||||
induction H; try (injection Heqm as -> ->; clear Heqm);
|
||||
discriminate || auto.
|
||||
apply Permutation_nil in H as ->; trivial.
|
||||
Qed.
|
||||
|
||||
Lemma Permutation_length_1: forall a b, Permutation [a] [b] -> a = b.
|
||||
Proof.
|
||||
intros a b H.
|
||||
apply Permutation_length_1_inv in H; injection H as ->; trivial.
|
||||
Qed.
|
||||
|
||||
Lemma Permutation_length_2_inv :
|
||||
forall a1 a2 l, Permutation [a1;a2] l -> l = [a1;a2] \/ l = [a2;a1].
|
||||
Proof.
|
||||
intros a1 a2 l H; remember [a1;a2] as m in H.
|
||||
revert a1 a2 Heqm.
|
||||
induction H; intros; try (injection Heqm; intros; subst; clear Heqm);
|
||||
discriminate || (try tauto).
|
||||
apply Permutation_length_1_inv in H as ->; left; auto.
|
||||
apply IHPermutation1 in Heqm as [H1|H1]; apply IHPermutation2 in H1 as ();
|
||||
auto.
|
||||
Qed.
|
||||
|
||||
Lemma Permutation_length_2 :
|
||||
forall a1 a2 b1 b2, Permutation [a1;a2] [b1;b2] ->
|
||||
a1 = b1 /\ a2 = b2 \/ a1 = b2 /\ a2 = b1.
|
||||
Proof.
|
||||
intros a1 b1 a2 b2 H.
|
||||
apply Permutation_length_2_inv in H as [H|H]; injection H as -> ->; auto.
|
||||
Qed.
|
||||
|
||||
Let in_middle l l1 l2 (a:A) : l = l1 ++ a :: l2 ->
|
||||
forall x, In x l <-> a = x \/ In x (l1++l2).
|
||||
Proof.
|
||||
intros; subst; rewrite !in_app_iff; simpl. tauto.
|
||||
Qed.
|
||||
|
||||
Lemma NoDup_cardinal_incl (l l' : list A) : NoDup l -> NoDup l' ->
|
||||
length l = length l' -> incl l l' -> incl l' l.
|
||||
Proof.
|
||||
intros N. revert l'. induction N as [|a l Hal Hl IH].
|
||||
- destruct l'; now auto.
|
||||
- intros l' Hl' E H x Hx.
|
||||
assert (Ha : In a l') by (apply H; simpl; auto).
|
||||
destruct (in_split _ _ Ha) as (l1 & l2 & H12). clear Ha.
|
||||
rewrite in_middle in Hx; eauto.
|
||||
destruct Hx as [Hx|Hx]; [left|right]; auto.
|
||||
apply (IH (l1++l2)); auto.
|
||||
* apply NoDup_remove_1 with a; rewrite <- H12; auto.
|
||||
* apply eq_add_S.
|
||||
simpl in E; rewrite E, H12, !app_length; simpl; auto with arith.
|
||||
* intros y Hy. assert (Hy' : In y l') by (apply H; simpl; auto).
|
||||
rewrite in_middle in Hy'; eauto.
|
||||
destruct Hy'; auto. subst y; intuition.
|
||||
Qed.
|
||||
|
||||
Lemma NoDup_Permutation l l' : NoDup l -> NoDup l' ->
|
||||
(forall x:A, In x l <-> In x l') -> Permutation l l'.
|
||||
Proof.
|
||||
intros N. revert l'. induction N as [|a l Hal Hl IH].
|
||||
- destruct l'; simpl; auto.
|
||||
intros Hl' H. exfalso. rewrite (H a); auto.
|
||||
- intros l' Hl' H.
|
||||
assert (Ha : In a l') by (apply H; simpl; auto).
|
||||
destruct (In_split _ _ Ha) as (l1 & l2 & H12).
|
||||
rewrite H12.
|
||||
apply Permutation_cons_app.
|
||||
apply IH; auto.
|
||||
* apply NoDup_remove_1 with a; rewrite <- H12; auto.
|
||||
* intro x. split; intros Hx.
|
||||
+ assert (Hx' : In x l') by (apply H; simpl; auto).
|
||||
rewrite in_middle in Hx'; eauto.
|
||||
destruct Hx'; auto. subst; intuition.
|
||||
+ assert (Hx' : In x l') by (rewrite (in_middle l1 l2 a); eauto).
|
||||
rewrite <- H in Hx'. destruct Hx'; auto.
|
||||
subst. destruct (NoDup_remove_2 _ _ _ Hl' Hx).
|
||||
Qed.
|
||||
|
||||
Lemma NoDup_Permutation_bis l l' : NoDup l -> NoDup l' ->
|
||||
length l = length l' -> incl l l' -> Permutation l l'.
|
||||
Proof.
|
||||
intros. apply NoDup_Permutation; auto.
|
||||
split; auto. apply NoDup_cardinal_incl; auto.
|
||||
Qed.
|
||||
|
||||
Lemma Permutation_NoDup l l' : Permutation l l' -> NoDup l -> NoDup l'.
|
||||
Proof.
|
||||
induction 1; auto.
|
||||
* inversion_clear 1; constructor; eauto using Permutation_in.
|
||||
* inversion_clear 1 as [|? ? H1 H2]. inversion_clear H2; simpl in *.
|
||||
constructor. simpl; intuition. constructor; intuition.
|
||||
Qed.
|
||||
|
||||
Global Instance Permutation_NoDup' :
|
||||
Proper (@Permutation A ==> iff) (@NoDup A) | 10.
|
||||
Proof.
|
||||
repeat red; eauto using Permutation_NoDup.
|
||||
Qed.
|
||||
|
||||
End Permutation_properties.
|
||||
|
||||
Section Permutation_map.
|
||||
|
||||
Variable A B : Type.
|
||||
Variable f : A -> B.
|
||||
|
||||
Lemma Permutation_map l l' :
|
||||
Permutation l l' -> Permutation (map f l) (map f l').
|
||||
Proof.
|
||||
induction 1; simpl; eauto.
|
||||
Qed.
|
||||
|
||||
Global Instance Permutation_map' :
|
||||
Proper (@Permutation A ==> @Permutation B) (map f) | 10.
|
||||
Proof.
|
||||
exact Permutation_map.
|
||||
Qed.
|
||||
|
||||
End Permutation_map.
|
||||
|
||||
Section Injection.
|
||||
|
||||
Definition injective {A B} (f : A->B) :=
|
||||
forall x y, f x = f y -> x = y.
|
||||
|
||||
Lemma injective_map_NoDup {A B} (f:A->B) (l:list A) :
|
||||
injective f -> NoDup l -> NoDup (map f l).
|
||||
Proof.
|
||||
intros Hf. induction 1 as [|x l Hx Hl IH]; simpl; constructor; trivial.
|
||||
rewrite in_map_iff. intros (y & Hy & Hy'). apply Hf in Hy. now subst.
|
||||
Qed.
|
||||
|
||||
Lemma injective_bounded_surjective n f :
|
||||
injective f ->
|
||||
(forall x, x < n -> f x < n) ->
|
||||
(forall y, y < n -> exists x, x < n /\ f x = y).
|
||||
Proof.
|
||||
intros Hf H.
|
||||
set (l := seq 0 n).
|
||||
assert (P : incl (map f l) l).
|
||||
{ intros x. rewrite in_map_iff. intros (y & <- & Hy').
|
||||
unfold l in *. rewrite in_seq in *. simpl in *.
|
||||
destruct Hy' as (_,Hy'). auto with arith. }
|
||||
assert (P' : incl l (map f l)).
|
||||
{ unfold l.
|
||||
apply NoDup_cardinal_incl; auto using injective_map_NoDup, seq_NoDup.
|
||||
now rewrite map_length. }
|
||||
intros x Hx.
|
||||
assert (Hx' : In x l) by (unfold l; rewrite in_seq; auto with arith).
|
||||
apply P' in Hx'.
|
||||
rewrite in_map_iff in Hx'. destruct Hx' as (y & Hy & Hy').
|
||||
exists y; split; auto. unfold l in *; rewrite in_seq in Hy'.
|
||||
destruct Hy'; auto with arith.
|
||||
Qed.
|
||||
|
||||
Lemma nat_bijection_Permutation n f :
|
||||
injective f -> (forall x, x < n -> f x < n) ->
|
||||
let l := seq 0 n in Permutation (map f l) l.
|
||||
Proof.
|
||||
intros Hf BD.
|
||||
apply NoDup_Permutation_bis; auto using injective_map_NoDup, seq_NoDup.
|
||||
* now rewrite map_length.
|
||||
* intros x. rewrite in_map_iff. intros (y & <- & Hy').
|
||||
rewrite in_seq in *. simpl in *.
|
||||
destruct Hy' as (_,Hy'). auto with arith.
|
||||
Qed.
|
||||
|
||||
End Injection.
|
||||
|
||||
Section Permutation_alt.
|
||||
Variable A:Type.
|
||||
Implicit Type a : A.
|
||||
Implicit Type l : list A.
|
||||
|
||||
(** Alternative characterization of permutation
|
||||
via [nth_error] and [nth] *)
|
||||
|
||||
Let adapt f n :=
|
||||
let m := f (S n) in if le_lt_dec m (f 0) then m else pred m.
|
||||
|
||||
Let adapt_injective f : injective f -> injective (adapt f).
|
||||
Proof.
|
||||
unfold adapt. intros Hf x y EQ.
|
||||
destruct le_lt_dec as [LE|LT]; destruct le_lt_dec as [LE'|LT'].
|
||||
- now apply eq_add_S, Hf.
|
||||
- apply Lt.le_lt_or_eq in LE.
|
||||
destruct LE as [LT|EQ']; [|now apply Hf in EQ'].
|
||||
unfold lt in LT. rewrite EQ in LT.
|
||||
rewrite <- (Lt.S_pred _ _ LT') in LT.
|
||||
elim (Lt.lt_not_le _ _ LT' LT).
|
||||
- apply Lt.le_lt_or_eq in LE'.
|
||||
destruct LE' as [LT'|EQ']; [|now apply Hf in EQ'].
|
||||
unfold lt in LT'. rewrite <- EQ in LT'.
|
||||
rewrite <- (Lt.S_pred _ _ LT) in LT'.
|
||||
elim (Lt.lt_not_le _ _ LT LT').
|
||||
- apply eq_add_S, Hf.
|
||||
now rewrite (Lt.S_pred _ _ LT), (Lt.S_pred _ _ LT'), EQ.
|
||||
Qed.
|
||||
|
||||
Let adapt_ok a l1 l2 f : injective f -> length l1 = f 0 ->
|
||||
forall n, nth_error (l1++a::l2) (f (S n)) = nth_error (l1++l2) (adapt f n).
|
||||
Proof.
|
||||
unfold adapt. intros Hf E n.
|
||||
destruct le_lt_dec as [LE|LT].
|
||||
- apply Lt.le_lt_or_eq in LE.
|
||||
destruct LE as [LT|EQ]; [|now apply Hf in EQ].
|
||||
rewrite <- E in LT.
|
||||
rewrite 2 nth_error_app1; auto.
|
||||
- rewrite (Lt.S_pred _ _ LT) at 1.
|
||||
rewrite <- E, (Lt.S_pred _ _ LT) in LT.
|
||||
rewrite 2 nth_error_app2; auto with arith.
|
||||
rewrite <- Minus.minus_Sn_m; auto with arith.
|
||||
Qed.
|
||||
|
||||
Lemma Permutation_nth_error l l' :
|
||||
Permutation l l' <->
|
||||
(length l = length l' /\
|
||||
exists f:nat->nat,
|
||||
injective f /\ forall n, nth_error l' n = nth_error l (f n)).
|
||||
Proof.
|
||||
split.
|
||||
{ intros P.
|
||||
split; [now apply Permutation_length|].
|
||||
induction P.
|
||||
- exists (fun n => n).
|
||||
split; try red; auto.
|
||||
- destruct IHP as (f & Hf & Hf').
|
||||
exists (fun n => match n with O => O | S n => S (f n) end).
|
||||
split; try red.
|
||||
* intros [|y] [|z]; simpl; now auto.
|
||||
* intros [|n]; simpl; auto.
|
||||
- exists (fun n => match n with 0 => 1 | 1 => 0 | n => n end).
|
||||
split; try red.
|
||||
* intros [|[|z]] [|[|t]]; simpl; now auto.
|
||||
* intros [|[|n]]; simpl; auto.
|
||||
- destruct IHP1 as (f & Hf & Hf').
|
||||
destruct IHP2 as (g & Hg & Hg').
|
||||
exists (fun n => f (g n)).
|
||||
split; try red.
|
||||
* auto.
|
||||
* intros n. rewrite <- Hf'; auto. }
|
||||
{ revert l. induction l'.
|
||||
- intros [|l] (E & _); now auto.
|
||||
- intros l (E & f & Hf & Hf').
|
||||
simpl in E.
|
||||
assert (Ha : nth_error l (f 0) = Some a)
|
||||
by (symmetry; apply (Hf' 0)).
|
||||
destruct (nth_error_split l (f 0) Ha) as (l1 & l2 & L12 & L1).
|
||||
rewrite L12. rewrite <- Permutation_middle. constructor.
|
||||
apply IHl'; split; [|exists (adapt f); split].
|
||||
* revert E. rewrite L12, !app_length. simpl.
|
||||
rewrite <- plus_n_Sm. now injection 1.
|
||||
* now apply adapt_injective.
|
||||
* intro n. rewrite <- (adapt_ok a), <- L12; auto.
|
||||
apply (Hf' (S n)). }
|
||||
Qed.
|
||||
|
||||
Lemma Permutation_nth_error_bis l l' :
|
||||
Permutation l l' <->
|
||||
exists f:nat->nat,
|
||||
injective f /\
|
||||
(forall n, n < length l -> f n < length l) /\
|
||||
(forall n, nth_error l' n = nth_error l (f n)).
|
||||
Proof.
|
||||
rewrite Permutation_nth_error; split.
|
||||
- intros (E & f & Hf & Hf').
|
||||
exists f. do 2 (split; trivial).
|
||||
intros n Hn.
|
||||
destruct (Lt.le_or_lt (length l) (f n)) as [LE|LT]; trivial.
|
||||
rewrite <- nth_error_None, <- Hf', nth_error_None, <- E in LE.
|
||||
elim (Lt.lt_not_le _ _ Hn LE).
|
||||
- intros (f & Hf & Hf2 & Hf3); split; [|exists f; auto].
|
||||
assert (H : length l' <= length l') by auto with arith.
|
||||
rewrite <- nth_error_None, Hf3, nth_error_None in H.
|
||||
destruct (Lt.le_or_lt (length l) (length l')) as [LE|LT];
|
||||
[|apply Hf2 in LT; elim (Lt.lt_not_le _ _ LT H)].
|
||||
apply Lt.le_lt_or_eq in LE. destruct LE as [LT|EQ]; trivial.
|
||||
rewrite <- nth_error_Some, Hf3, nth_error_Some in LT.
|
||||
destruct (injective_bounded_surjective Hf Hf2 LT) as (y & Hy & Hy').
|
||||
apply Hf in Hy'. subst y. elim (Lt.lt_irrefl _ Hy).
|
||||
Qed.
|
||||
|
||||
Lemma Permutation_nth l l' d :
|
||||
Permutation l l' <->
|
||||
(let n := length l in
|
||||
length l' = n /\
|
||||
exists f:nat->nat,
|
||||
(forall x, x < n -> f x < n) /\
|
||||
(forall x y, x < n -> y < n -> f x = f y -> x = y) /\
|
||||
(forall x, x < n -> nth x l' d = nth (f x) l d)).
|
||||
Proof.
|
||||
split.
|
||||
- intros H.
|
||||
assert (E := Permutation_length H).
|
||||
split; auto.
|
||||
apply Permutation_nth_error_bis in H.
|
||||
destruct H as (f & Hf & Hf2 & Hf3).
|
||||
exists f. split; [|split]; auto.
|
||||
intros n Hn. rewrite <- 2 nth_default_eq. unfold nth_default.
|
||||
now rewrite Hf3.
|
||||
- intros (E & f & Hf1 & Hf2 & Hf3).
|
||||
rewrite Permutation_nth_error.
|
||||
split; auto.
|
||||
exists (fun n => if le_lt_dec (length l) n then n else f n).
|
||||
split.
|
||||
* intros x y.
|
||||
destruct le_lt_dec as [LE|LT];
|
||||
destruct le_lt_dec as [LE'|LT']; auto.
|
||||
+ apply Hf1 in LT'. intros ->.
|
||||
elim (Lt.lt_irrefl (f y)). eapply Lt.lt_le_trans; eauto.
|
||||
+ apply Hf1 in LT. intros <-.
|
||||
elim (Lt.lt_irrefl (f x)). eapply Lt.lt_le_trans; eauto.
|
||||
* intros n.
|
||||
destruct le_lt_dec as [LE|LT].
|
||||
+ assert (LE' : length l' <= n) by (now rewrite E).
|
||||
rewrite <- nth_error_None in LE, LE'. congruence.
|
||||
+ assert (LT' : n < length l') by (now rewrite E).
|
||||
specialize (Hf3 n LT). rewrite <- 2 nth_default_eq in Hf3.
|
||||
unfold nth_default in Hf3.
|
||||
apply Hf1 in LT.
|
||||
rewrite <- nth_error_Some in LT, LT'.
|
||||
do 2 destruct nth_error; congruence.
|
||||
Qed.
|
||||
|
||||
End Permutation_alt.
|
||||
|
||||
(* begin hide *)
|
||||
Notation Permutation_app_swap := Permutation_app_comm (only parsing).
|
||||
(* end hide *)
|
||||
@@ -1,2 +0,0 @@
|
||||
Require Export Sorted.
|
||||
Require Export Mergesort.
|
||||
62
samples/Coq/Spec.v
Normal file
62
samples/Coq/Spec.v
Normal file
@@ -0,0 +1,62 @@
|
||||
(** Specifications. *)
|
||||
Require Import Coq.Lists.List.
|
||||
Require Import Coq.Strings.Ascii.
|
||||
Require Import FunctionNinjas.All.
|
||||
Require Import ListString.All.
|
||||
Require Import Computation.
|
||||
|
||||
Import ListNotations.
|
||||
Local Open Scope char.
|
||||
|
||||
(** A run is an execution of the program with explicit answers for the
|
||||
system calls. *)
|
||||
Module Run.
|
||||
(** We define a run by induction on the structure of a computation. *)
|
||||
Inductive t : C.t -> Type :=
|
||||
| Ret : t C.Ret
|
||||
| Call : forall (command : Command.t) (answer : Command.answer command)
|
||||
{handler : Command.answer command -> C.t}, t (handler answer) ->
|
||||
t (C.Call command handler).
|
||||
|
||||
(** The trace of a run. *)
|
||||
Fixpoint trace {x : C.t} (run : t x)
|
||||
: list {command : Command.t & Command.answer command} :=
|
||||
match run with
|
||||
| Ret => []
|
||||
| Call command answer _ run => existT _ command answer :: trace run
|
||||
end.
|
||||
End Run.
|
||||
|
||||
Module Temporal.
|
||||
Module All.
|
||||
Inductive t (P : Command.t -> Prop) : C.t -> Prop :=
|
||||
| Ret : t P C.Ret
|
||||
| Call : forall (c : Command.t) (h : Command.answer c -> C.t),
|
||||
P c -> (forall a, t P (h a)) ->
|
||||
t P (C.Call c h).
|
||||
End All.
|
||||
|
||||
Module One.
|
||||
Inductive t (P : Command.t -> Prop) : C.t -> Prop :=
|
||||
| CallThis : forall (c : Command.t) (h : Command.answer c -> C.t),
|
||||
P c ->
|
||||
t P (C.Call c h)
|
||||
| CallOther : forall (c : Command.t) (h : Command.answer c -> C.t),
|
||||
(forall a, t P (h a)) ->
|
||||
t P (C.Call c h).
|
||||
End One.
|
||||
|
||||
Module Then.
|
||||
Inductive t (P1 P2 : Command.t -> Prop) : C.t -> Prop :=
|
||||
| Ret : t P1 P2 C.Ret
|
||||
| Call : forall (c : Command.t) (h : Command.answer c -> C.t),
|
||||
(forall a, t P1 P2 (h a)) ->
|
||||
t P1 P2 (C.Call c h)
|
||||
| CallThen : forall (c : Command.t) (h : Command.answer c -> C.t),
|
||||
P1 c -> (forall a, One.t P2 (h a)) ->
|
||||
t P1 P2 (C.Call c h).
|
||||
End Then.
|
||||
End Temporal.
|
||||
|
||||
Module CardBeforeMoney.
|
||||
End CardBeforeMoney.
|
||||
@@ -1,419 +0,0 @@
|
||||
(** Sketch of the proof of {p:nat|p<=n} = {p:nat|p<=m} -> n=m
|
||||
|
||||
- preliminary results on the irrelevance of boundedness proofs
|
||||
- introduce the notion of finite cardinal |A|
|
||||
- prove that |{p:nat|p<=n}| = n
|
||||
- prove that |A| = n /\ |A| = m -> n = m if equality is decidable on A
|
||||
- prove that equality is decidable on A
|
||||
- conclude
|
||||
*)
|
||||
|
||||
(** * Preliminary results on [nat] and [le] *)
|
||||
|
||||
(** Proving axiom K on [nat] *)
|
||||
|
||||
Require Import Eqdep_dec.
|
||||
Require Import Arith.
|
||||
|
||||
Theorem eq_rect_eq_nat :
|
||||
forall (p:nat) (Q:nat->Type) (x:Q p) (h:p=p), x = eq_rect p Q x p h.
|
||||
Proof.
|
||||
intros.
|
||||
apply K_dec_set with (p := h).
|
||||
apply eq_nat_dec.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
(** Proving unicity of proofs of [(n<=m)%nat] *)
|
||||
|
||||
Scheme le_ind' := Induction for le Sort Prop.
|
||||
|
||||
Theorem le_uniqueness_proof : forall (n m : nat) (p q : n <= m), p = q.
|
||||
Proof.
|
||||
induction p using le_ind'; intro q.
|
||||
replace (le_n n) with
|
||||
(eq_rect _ (fun n0 => n <= n0) (le_n n) _ (refl_equal n)).
|
||||
2:reflexivity.
|
||||
generalize (refl_equal n).
|
||||
pattern n at 2 4 6 10, q; case q; [intro | intros m l e].
|
||||
rewrite <- eq_rect_eq_nat; trivial.
|
||||
contradiction (le_Sn_n m); rewrite <- e; assumption.
|
||||
replace (le_S n m p) with
|
||||
(eq_rect _ (fun n0 => n <= n0) (le_S n m p) _ (refl_equal (S m))).
|
||||
2:reflexivity.
|
||||
generalize (refl_equal (S m)).
|
||||
pattern (S m) at 1 3 4 6, q; case q; [intro Heq | intros m0 l HeqS].
|
||||
contradiction (le_Sn_n m); rewrite Heq; assumption.
|
||||
injection HeqS; intro Heq; generalize l HeqS.
|
||||
rewrite <- Heq; intros; rewrite <- eq_rect_eq_nat.
|
||||
rewrite (IHp l0); reflexivity.
|
||||
Qed.
|
||||
|
||||
(** Proving irrelevance of boundedness proofs while building
|
||||
elements of interval *)
|
||||
|
||||
Lemma dep_pair_intro :
|
||||
forall (n x y:nat) (Hx : x<=n) (Hy : y<=n), x=y ->
|
||||
exist (fun x => x <= n) x Hx = exist (fun x => x <= n) y Hy.
|
||||
Proof.
|
||||
intros n x y Hx Hy Heq.
|
||||
generalize Hy.
|
||||
rewrite <- Heq.
|
||||
intros.
|
||||
rewrite (le_uniqueness_proof x n Hx Hy0).
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
(** * Proving that {p:nat|p<=n} = {p:nat|p<=m} -> n=m *)
|
||||
|
||||
(** Definition of having finite cardinality [n+1] for a set [A] *)
|
||||
|
||||
Definition card (A:Set) n :=
|
||||
exists f,
|
||||
(forall x:A, f x <= n) /\
|
||||
(forall x y:A, f x = f y -> x = y) /\
|
||||
(forall m, m <= n -> exists x:A, f x = m).
|
||||
|
||||
Require Import Arith.
|
||||
|
||||
(** Showing that the interval [0;n] has cardinality [n+1] *)
|
||||
|
||||
Theorem card_interval : forall n, card {x:nat|x<=n} n.
|
||||
Proof.
|
||||
intro n.
|
||||
exists (fun x:{x:nat|x<=n} => proj1_sig x).
|
||||
split.
|
||||
(* bounded *)
|
||||
intro x; apply (proj2_sig x).
|
||||
split.
|
||||
(* injectivity *)
|
||||
intros (p,Hp) (q,Hq).
|
||||
simpl.
|
||||
intro Hpq.
|
||||
apply dep_pair_intro; assumption.
|
||||
(* surjectivity *)
|
||||
intros m Hmn.
|
||||
exists (exist (fun x : nat => x <= n) m Hmn).
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
(** Showing that equality on the interval [0;n] is decidable *)
|
||||
|
||||
Lemma interval_dec :
|
||||
forall n (x y : {m:nat|m<=n}), {x=y}+{x<>y}.
|
||||
Proof.
|
||||
intros n (p,Hp).
|
||||
induction p; intros ([|q],Hq).
|
||||
left.
|
||||
apply dep_pair_intro.
|
||||
reflexivity.
|
||||
right.
|
||||
intro H; discriminate H.
|
||||
right.
|
||||
intro H; discriminate H.
|
||||
assert (Hp' : p <= n).
|
||||
apply le_Sn_le; assumption.
|
||||
assert (Hq' : q <= n).
|
||||
apply le_Sn_le; assumption.
|
||||
destruct (IHp Hp' (exist (fun m => m <= n) q Hq'))
|
||||
as [Heq|Hneq].
|
||||
left.
|
||||
injection Heq; intro Heq'.
|
||||
apply dep_pair_intro.
|
||||
apply eq_S.
|
||||
assumption.
|
||||
right.
|
||||
intro HeqS.
|
||||
injection HeqS; intro Heq.
|
||||
apply Hneq.
|
||||
apply dep_pair_intro.
|
||||
assumption.
|
||||
Qed.
|
||||
|
||||
(** Showing that the cardinality relation is functional on decidable sets *)
|
||||
|
||||
Lemma card_inj_aux :
|
||||
forall (A:Type) f g n,
|
||||
(forall x:A, f x <= 0) ->
|
||||
(forall x y:A, f x = f y -> x = y) ->
|
||||
(forall m, m <= S n -> exists x:A, g x = m)
|
||||
-> False.
|
||||
Proof.
|
||||
intros A f g n Hfbound Hfinj Hgsurj.
|
||||
destruct (Hgsurj (S n) (le_n _)) as (x,Hx).
|
||||
destruct (Hgsurj n (le_S _ _ (le_n _))) as (x',Hx').
|
||||
assert (Hfx : 0 = f x).
|
||||
apply le_n_O_eq.
|
||||
apply Hfbound.
|
||||
assert (Hfx' : 0 = f x').
|
||||
apply le_n_O_eq.
|
||||
apply Hfbound.
|
||||
assert (x=x').
|
||||
apply Hfinj.
|
||||
rewrite <- Hfx.
|
||||
rewrite <- Hfx'.
|
||||
reflexivity.
|
||||
rewrite H in Hx.
|
||||
rewrite Hx' in Hx.
|
||||
apply (n_Sn _ Hx).
|
||||
Qed.
|
||||
|
||||
(** For [dec_restrict], we use a lemma on the negation of equality
|
||||
that requires proof-irrelevance. It should be possible to avoid this
|
||||
lemma by generalizing over a first-order definition of [x<>y], say
|
||||
[neq] such that [{x=y}+{neq x y}] and [~(x=y /\ neq x y)]; for such
|
||||
[neq], unicity of proofs could be proven *)
|
||||
|
||||
Require Import Classical.
|
||||
Lemma neq_dep_intro :
|
||||
forall (A:Set) (z x y:A) (p:x<>z) (q:y<>z), x=y ->
|
||||
exist (fun x => x <> z) x p = exist (fun x => x <> z) y q.
|
||||
Proof.
|
||||
intros A z x y p q Heq.
|
||||
generalize q; clear q; rewrite <- Heq; intro q.
|
||||
rewrite (proof_irrelevance _ p q); reflexivity.
|
||||
Qed.
|
||||
|
||||
Lemma dec_restrict :
|
||||
forall (A:Set),
|
||||
(forall x y :A, {x=y}+{x<>y}) ->
|
||||
forall z (x y :{a:A|a<>z}), {x=y}+{x<>y}.
|
||||
Proof.
|
||||
intros A Hdec z (x,Hx) (y,Hy).
|
||||
destruct (Hdec x y) as [Heq|Hneq].
|
||||
left; apply neq_dep_intro; assumption.
|
||||
right; intro Heq; injection Heq; exact Hneq.
|
||||
Qed.
|
||||
|
||||
Lemma pred_inj : forall n m,
|
||||
0 <> n -> 0 <> m -> pred m = pred n -> m = n.
|
||||
Proof.
|
||||
destruct n.
|
||||
intros m H; destruct H; reflexivity.
|
||||
destruct m.
|
||||
intros _ H; destruct H; reflexivity.
|
||||
simpl; intros _ _ H.
|
||||
rewrite H.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Lemma le_neq_lt : forall n m, n <= m -> n<>m -> n < m.
|
||||
Proof.
|
||||
intros n m Hle Hneq.
|
||||
destruct (le_lt_eq_dec n m Hle).
|
||||
assumption.
|
||||
contradiction.
|
||||
Qed.
|
||||
|
||||
Lemma inj_restrict :
|
||||
forall (A:Set) (f:A->nat) x y z,
|
||||
(forall x y : A, f x = f y -> x = y)
|
||||
-> x <> z -> f y < f z -> f z <= f x
|
||||
-> pred (f x) = f y
|
||||
-> False.
|
||||
|
||||
(* Search error sans le type de f !! *)
|
||||
Proof.
|
||||
intros A f x y z Hfinj Hneqx Hfy Hfx Heq.
|
||||
assert (f z <> f x).
|
||||
apply sym_not_eq.
|
||||
intro Heqf.
|
||||
apply Hneqx.
|
||||
apply Hfinj.
|
||||
assumption.
|
||||
assert (f x = S (f y)).
|
||||
assert (0 < f x).
|
||||
apply le_lt_trans with (f z).
|
||||
apply le_O_n.
|
||||
apply le_neq_lt; assumption.
|
||||
apply pred_inj.
|
||||
apply O_S.
|
||||
apply lt_O_neq; assumption.
|
||||
exact Heq.
|
||||
assert (f z <= f y).
|
||||
destruct (le_lt_or_eq _ _ Hfx).
|
||||
apply lt_n_Sm_le.
|
||||
rewrite <- H0.
|
||||
assumption.
|
||||
contradiction Hneqx.
|
||||
symmetry.
|
||||
apply Hfinj.
|
||||
assumption.
|
||||
contradiction (lt_not_le (f y) (f z)).
|
||||
Qed.
|
||||
|
||||
Theorem card_inj : forall m n (A:Set),
|
||||
(forall x y :A, {x=y}+{x<>y}) ->
|
||||
card A m -> card A n -> m = n.
|
||||
Proof.
|
||||
induction m; destruct n;
|
||||
intros A Hdec
|
||||
(f,(Hfbound,(Hfinj,Hfsurj)))
|
||||
(g,(Hgbound,(Hginj,Hgsurj))).
|
||||
(* 0/0 *)
|
||||
reflexivity.
|
||||
(* 0/Sm *)
|
||||
destruct (card_inj_aux _ _ _ _ Hfbound Hfinj Hgsurj).
|
||||
(* Sn/0 *)
|
||||
destruct (card_inj_aux _ _ _ _ Hgbound Hginj Hfsurj).
|
||||
(* Sn/Sm *)
|
||||
destruct (Hgsurj (S n) (le_n _)) as (xSn,HSnx).
|
||||
rewrite IHm with (n:=n) (A := {x:A|x<>xSn}).
|
||||
reflexivity.
|
||||
(* decidability of eq on {x:A|x<>xSm} *)
|
||||
apply dec_restrict.
|
||||
assumption.
|
||||
(* cardinality of {x:A|x<>xSn} is m *)
|
||||
pose (f' := fun x' : {x:A|x<>xSn} =>
|
||||
let (x,Hneq) := x' in
|
||||
if le_lt_dec (f xSn) (f x)
|
||||
then pred (f x)
|
||||
else f x).
|
||||
exists f'.
|
||||
split.
|
||||
(* f' is bounded *)
|
||||
unfold f'.
|
||||
intros (x,_).
|
||||
destruct (le_lt_dec (f xSn) (f x)) as [Hle|Hge].
|
||||
change m with (pred (S m)).
|
||||
apply le_pred.
|
||||
apply Hfbound.
|
||||
apply le_S_n.
|
||||
apply le_trans with (f xSn).
|
||||
exact Hge.
|
||||
apply Hfbound.
|
||||
split.
|
||||
(* f' is injective *)
|
||||
unfold f'.
|
||||
intros (x,Hneqx) (y,Hneqy) Heqf'.
|
||||
destruct (le_lt_dec (f xSn) (f x)) as [Hlefx|Hgefx];
|
||||
destruct (le_lt_dec (f xSn) (f y)) as [Hlefy|Hgefy].
|
||||
(* f xSn <= f x et f xSn <= f y *)
|
||||
assert (Heq : x = y).
|
||||
apply Hfinj.
|
||||
assert (f xSn <> f y).
|
||||
apply sym_not_eq.
|
||||
intro Heqf.
|
||||
apply Hneqy.
|
||||
apply Hfinj.
|
||||
assumption.
|
||||
assert (0 < f y).
|
||||
apply le_lt_trans with (f xSn).
|
||||
apply le_O_n.
|
||||
apply le_neq_lt; assumption.
|
||||
assert (f xSn <> f x).
|
||||
apply sym_not_eq.
|
||||
intro Heqf.
|
||||
apply Hneqx.
|
||||
apply Hfinj.
|
||||
assumption.
|
||||
assert (0 < f x).
|
||||
apply le_lt_trans with (f xSn).
|
||||
apply le_O_n.
|
||||
apply le_neq_lt; assumption.
|
||||
apply pred_inj.
|
||||
apply lt_O_neq; assumption.
|
||||
apply lt_O_neq; assumption.
|
||||
assumption.
|
||||
apply neq_dep_intro; assumption.
|
||||
(* f y < f xSn <= f x *)
|
||||
destruct (inj_restrict A f x y xSn); assumption.
|
||||
(* f x < f xSn <= f y *)
|
||||
symmetry in Heqf'.
|
||||
destruct (inj_restrict A f y x xSn); assumption.
|
||||
(* f x < f xSn et f y < f xSn *)
|
||||
assert (Heq : x=y).
|
||||
apply Hfinj; assumption.
|
||||
apply neq_dep_intro; assumption.
|
||||
(* f' is surjective *)
|
||||
intros p Hlep.
|
||||
destruct (le_lt_dec (f xSn) p) as [Hle|Hlt].
|
||||
(* case f xSn <= p *)
|
||||
destruct (Hfsurj (S p) (le_n_S _ _ Hlep)) as (x,Hx).
|
||||
assert (Hneq : x <> xSn).
|
||||
intro Heqx.
|
||||
rewrite Heqx in Hx.
|
||||
rewrite Hx in Hle.
|
||||
apply le_Sn_n with p; assumption.
|
||||
exists (exist (fun a => a<>xSn) x Hneq).
|
||||
unfold f'.
|
||||
destruct (le_lt_dec (f xSn) (f x)) as [Hle'|Hlt'].
|
||||
rewrite Hx; reflexivity.
|
||||
rewrite Hx in Hlt'.
|
||||
contradiction (le_not_lt (f xSn) p).
|
||||
apply lt_trans with (S p).
|
||||
apply lt_n_Sn.
|
||||
assumption.
|
||||
(* case p < f xSn *)
|
||||
destruct (Hfsurj p (le_S _ _ Hlep)) as (x,Hx).
|
||||
assert (Hneq : x <> xSn).
|
||||
intro Heqx.
|
||||
rewrite Heqx in Hx.
|
||||
rewrite Hx in Hlt.
|
||||
apply (lt_irrefl p).
|
||||
assumption.
|
||||
exists (exist (fun a => a<>xSn) x Hneq).
|
||||
unfold f'.
|
||||
destruct (le_lt_dec (f xSn) (f x)) as [Hle'|Hlt'].
|
||||
rewrite Hx in Hle'.
|
||||
contradiction (lt_irrefl p).
|
||||
apply lt_le_trans with (f xSn); assumption.
|
||||
assumption.
|
||||
(* cardinality of {x:A|x<>xSn} is n *)
|
||||
pose (g' := fun x' : {x:A|x<>xSn} =>
|
||||
let (x,Hneq) := x' in
|
||||
if Hdec x xSn then 0 else g x).
|
||||
exists g'.
|
||||
split.
|
||||
(* g is bounded *)
|
||||
unfold g'.
|
||||
intros (x,_).
|
||||
destruct (Hdec x xSn) as [_|Hneq].
|
||||
apply le_O_n.
|
||||
assert (Hle_gx:=Hgbound x).
|
||||
destruct (le_lt_or_eq _ _ Hle_gx).
|
||||
apply lt_n_Sm_le.
|
||||
assumption.
|
||||
contradiction Hneq.
|
||||
apply Hginj.
|
||||
rewrite HSnx.
|
||||
assumption.
|
||||
split.
|
||||
(* g is injective *)
|
||||
unfold g'.
|
||||
intros (x,Hneqx) (y,Hneqy) Heqg'.
|
||||
destruct (Hdec x xSn) as [Heqx|_].
|
||||
contradiction Hneqx.
|
||||
destruct (Hdec y xSn) as [Heqy|_].
|
||||
contradiction Hneqy.
|
||||
assert (Heq : x=y).
|
||||
apply Hginj; assumption.
|
||||
apply neq_dep_intro; assumption.
|
||||
(* g is surjective *)
|
||||
intros p Hlep.
|
||||
destruct (Hgsurj p (le_S _ _ Hlep)) as (x,Hx).
|
||||
assert (Hneq : x<>xSn).
|
||||
intro Heq.
|
||||
rewrite Heq in Hx.
|
||||
rewrite Hx in HSnx.
|
||||
rewrite HSnx in Hlep.
|
||||
contradiction (le_Sn_n _ Hlep).
|
||||
exists (exist (fun a => a<>xSn) x Hneq).
|
||||
simpl.
|
||||
destruct (Hdec x xSn) as [Heqx|_].
|
||||
contradiction Hneq.
|
||||
assumption.
|
||||
Qed.
|
||||
|
||||
(** Conclusion *)
|
||||
|
||||
Theorem interval_discr :
|
||||
forall n m, {p:nat|p<=n} = {p:nat|p<=m} -> n=m.
|
||||
Proof.
|
||||
intros n m Heq.
|
||||
apply card_inj with (A := {p:nat|p<=n}).
|
||||
apply interval_dec.
|
||||
apply card_interval.
|
||||
rewrite Heq.
|
||||
apply card_interval.
|
||||
Qed.
|
||||
24
samples/EBNF/grammar.ebnf
Normal file
24
samples/EBNF/grammar.ebnf
Normal file
@@ -0,0 +1,24 @@
|
||||
(*
|
||||
Source: https://github.com/sunjay/lion
|
||||
License: MIT
|
||||
*)
|
||||
|
||||
Statement = ( NamedFunction | AnonymousFunction | Assignment | Expr ) , "\n" ;
|
||||
Expr = AnonymousFunction | Term | "(" , Expr , ")" ,
|
||||
{ AnonymousFunction | Term | "(" , Expr , ")" } ;
|
||||
|
||||
Assignment = Symbol , "=" , Expr ;
|
||||
|
||||
AnonymousFunction = "\" , FunctionRHS ;
|
||||
NamedFunction = Symbol , FunctionRHS ;
|
||||
|
||||
FunctionRHS = FunctionParams , "=" , FunctionBody ;
|
||||
FunctionParams = FunctionParam , { FunctionParam } ;
|
||||
FunctionParam = Term ;
|
||||
FunctionBody = Expr ;
|
||||
|
||||
Term = Symbol | Number | SingleWordString ;
|
||||
SingleWordString = '"' , Symbol , '"' ;
|
||||
(* Symbol is a collection of valid symbol characters, not defined here *)
|
||||
(* Number is a valid numeric literal *)
|
||||
|
||||
40
samples/EBNF/material.ebnf
Normal file
40
samples/EBNF/material.ebnf
Normal file
@@ -0,0 +1,40 @@
|
||||
(*
|
||||
Source: https://github.com/io7m/jsom0
|
||||
License: ISC
|
||||
*)
|
||||
|
||||
name =
|
||||
"name" , string , ";" ;
|
||||
|
||||
diffuse =
|
||||
"diffuse" , real , real , real , ";" ;
|
||||
|
||||
ambient =
|
||||
"ambient" , real , real , real , ";" ;
|
||||
|
||||
specular =
|
||||
"specular" , real , real , real , real , ";" ;
|
||||
|
||||
shininess =
|
||||
"shininess" , real , ";" ;
|
||||
|
||||
alpha =
|
||||
"alpha" , real , ";" ;
|
||||
|
||||
mapping =
|
||||
"map_chrome" | "map_uv" ;
|
||||
|
||||
texture =
|
||||
"texture" , string , real , mapping , ";" ;
|
||||
|
||||
material =
|
||||
"material" , ";" ,
|
||||
name ,
|
||||
diffuse ,
|
||||
ambient ,
|
||||
specular ,
|
||||
shininess ,
|
||||
alpha ,
|
||||
[ texture ] ,
|
||||
"end" , ";" ;
|
||||
|
||||
61
samples/EBNF/object.ebnf
Normal file
61
samples/EBNF/object.ebnf
Normal file
@@ -0,0 +1,61 @@
|
||||
(*
|
||||
Source: https://github.com/io7m/jsom0
|
||||
License: ISC
|
||||
*)
|
||||
|
||||
vertex_p3n3_name =
|
||||
"vertex_p3n3" ;
|
||||
|
||||
vertex_p3n3t2_name =
|
||||
"vertex_p3n3t2" ;
|
||||
|
||||
vertex_type =
|
||||
vertex_p3n3_name | vertex_p3n3t2_name ;
|
||||
|
||||
vertex_position =
|
||||
"position" , real , real , real , ";" ;
|
||||
|
||||
vertex_normal =
|
||||
"normal" , real , real , real , ";" ;
|
||||
|
||||
vertex_uv =
|
||||
"uv" , real , real , ";" ;
|
||||
|
||||
vertex_p3n3 =
|
||||
vertex_p3n3_name , vertex_position , vertex_normal , "end" , ";" ;
|
||||
|
||||
vertex_p3n3t2 =
|
||||
vertex_p3n3t2_name , vertex_position , vertex_normal , vertex_uv , "end" , ";" ;
|
||||
|
||||
vertex =
|
||||
vertex_p3n3 | vertex_p3n3t2 ;
|
||||
|
||||
vertex_array =
|
||||
"array" , positive , vertex_type , { vertex } , "end" , ";" ;
|
||||
|
||||
vertices =
|
||||
"vertices" , ";" , vertex_array , "end" , ";" ;
|
||||
|
||||
triangle =
|
||||
"triangle" , natural , natural , natural , ";" ;
|
||||
|
||||
triangle_array =
|
||||
"array" , positive, "triangle" , { triangle } , "end" , ";" ;
|
||||
|
||||
triangles =
|
||||
"triangles" , ";" , triangle_array , "end" , ";" ;
|
||||
|
||||
name =
|
||||
"name" , string , ";" ;
|
||||
|
||||
material_name =
|
||||
"material_name" , string , ";" ;
|
||||
|
||||
object =
|
||||
"object" , ";" ,
|
||||
name ,
|
||||
material_name ,
|
||||
vertices ,
|
||||
triangles ,
|
||||
"end" , ";" ;
|
||||
|
||||
20
samples/EBNF/types.ebnf
Normal file
20
samples/EBNF/types.ebnf
Normal file
@@ -0,0 +1,20 @@
|
||||
(*
|
||||
Source: https://github.com/io7m/jsom0
|
||||
License: ISC
|
||||
*)
|
||||
|
||||
digit_without_zero =
|
||||
"1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
|
||||
|
||||
digit =
|
||||
"0" | digit_without_zero ;
|
||||
|
||||
positive =
|
||||
digit_without_zero , { digit } ;
|
||||
|
||||
natural =
|
||||
"0" | positive ;
|
||||
|
||||
real =
|
||||
[ "-" ] , digit , [ "." , { digit } ] ;
|
||||
|
||||
6
samples/Emacs Lisp/filenames/.abbrev_defs
Normal file
6
samples/Emacs Lisp/filenames/.abbrev_defs
Normal file
@@ -0,0 +1,6 @@
|
||||
(define-abbrev-table 'c-mode-abbrev-table '(
|
||||
))
|
||||
(define-abbrev-table 'fundamental-mode-abbrev-table '(
|
||||
("TM" "™" nil 0)
|
||||
("(R)" "®" nil 0)
|
||||
("C=" "€" nil 0)))
|
||||
20
samples/Emacs Lisp/filenames/.gnus
Normal file
20
samples/Emacs Lisp/filenames/.gnus
Normal file
@@ -0,0 +1,20 @@
|
||||
(setq user-full-name "Alhadis")
|
||||
(setq user-mail-address "fake.account@gmail.com")
|
||||
|
||||
(auto-image-file-mode)
|
||||
(setq mm-inline-large-images t)
|
||||
(add-to-list 'mm-attachment-override-types "image/*")
|
||||
|
||||
(setq gnus-select-method
|
||||
'(nnimap "gmail"
|
||||
(nnimap-address "imap.gmail.com")
|
||||
(nnimap-server-port 777)
|
||||
(nnimap-stream ssl)))
|
||||
|
||||
(setq message-send-mail-function 'smtpmail-send-it
|
||||
smtpmail-starttls-credentials '(("smtp.gmail.com" 600 nil nil))
|
||||
smtpmail-auth-credentials '(("smtp.gmail.com" 700 "me@lisp.com" nil))
|
||||
smtpmail-default-smtp-server "smtp.gmail.com"
|
||||
smtpmail-smtp-server "smtp.gmail.com"
|
||||
smtpmail-smtp-service 800
|
||||
setq gnus-ignored-from-addresses "^from\\.Telstra[ \t\r\n]+Thanks")
|
||||
10
samples/Emacs Lisp/filenames/.viper
Normal file
10
samples/Emacs Lisp/filenames/.viper
Normal file
@@ -0,0 +1,10 @@
|
||||
(setq viper-inhibit-startup-message 't)
|
||||
(setq viper-expert-level '5)
|
||||
|
||||
; Key bindings
|
||||
(define-key viper-vi-global-user-map "\C-d" 'end-of-line)
|
||||
|
||||
; Return to top of window
|
||||
(defun my-viper-return-to-top ()
|
||||
(interactive)
|
||||
(beginning-of-buffer))
|
||||
34
samples/Emacs Lisp/filenames/Project.ede
Normal file
34
samples/Emacs Lisp/filenames/Project.ede
Normal file
@@ -0,0 +1,34 @@
|
||||
;; Object EDE
|
||||
(ede-proj-project "Linguist"
|
||||
:name "Linguist"
|
||||
:version "4.9"
|
||||
:file "Project.ede"
|
||||
:targets (list
|
||||
(ede-proj-target-elisp-autoloads "autoloads"
|
||||
:name "autoloads"
|
||||
:path "test/samples/Emacs Lisp"
|
||||
:autoload-file "dude.el"
|
||||
)
|
||||
(ede-proj-target-elisp "init"
|
||||
:name "init"
|
||||
:path ""
|
||||
:source '("ede-load.el" "wait-what.el")
|
||||
:compiler 'ede-emacs-preload-compiler
|
||||
:pre-load-packages '("sample-names")
|
||||
)
|
||||
(ede-proj-target-elisp "what"
|
||||
:name "the"
|
||||
:path ""
|
||||
:source '("h.el" "am-i-writing.el")
|
||||
:versionsource '("hell.el")
|
||||
:compiler 'ede-emacs-preload-compiler
|
||||
:aux-packages '("what" "the" "hell-files" "am-i-writing")
|
||||
)
|
||||
)
|
||||
:web-site-url "https://github.com/github/linguist"
|
||||
:web-site-directory "../"
|
||||
:web-site-file "CONTRIBUTING.md"
|
||||
:ftp-upload-site "/ftp@git.hub.com:/madeup"
|
||||
:configuration-variables 'nil
|
||||
:metasubproject 't
|
||||
)
|
||||
70
samples/Emacs Lisp/filenames/_emacs
Normal file
70
samples/Emacs Lisp/filenames/_emacs
Normal file
@@ -0,0 +1,70 @@
|
||||
;; UTF-8 support
|
||||
;; (set-language-environment "UTF-8")
|
||||
(setenv "LANG" "en_AU.UTF-8")
|
||||
(setenv "LC_ALL" "en_AU.UTF-8")
|
||||
(setq default-tab-width 4)
|
||||
|
||||
|
||||
;;; Function to load all ".el" files in ~/.emacs.d/config
|
||||
(defun load-directory (directory)
|
||||
"Recursively load all Emacs Lisp files in a directory."
|
||||
(dolist (element (directory-files-and-attributes directory nil nil nil))
|
||||
(let* ((path (car element))
|
||||
(fullpath (concat directory "/" path))
|
||||
(isdir (car (cdr element)))
|
||||
(ignore-dir (or (string= path ".") (string= path ".."))))
|
||||
(cond
|
||||
((and (eq isdir t) (not ignore-dir))
|
||||
(load-directory fullpath))
|
||||
((and (eq isdir nil) (string= (substring path -3) ".el"))
|
||||
(load (file-name-sans-extension fullpath)))))))
|
||||
|
||||
;; Tell Emacs we'd like to use Hunspell for spell-checking
|
||||
(setq ispell-program-name (executable-find "hunspell"))
|
||||
|
||||
;; Load Homebrew-installed packages
|
||||
(let ((default-directory "/usr/local/share/emacs/site-lisp/"))
|
||||
(normal-top-level-add-subdirs-to-load-path))
|
||||
(load "aggressive-indent")
|
||||
(add-hook 'emacs-lisp-mode-hook #'aggressive-indent-mode)
|
||||
(autoload 'rust-mode "rust-mode" nil t)
|
||||
(add-to-list 'auto-mode-alist '("\\.rs\\'" . rust-mode))
|
||||
|
||||
;; Load Git-related syntax highlighting
|
||||
(add-to-list 'load-path "~/.emacs.d/lisp/")
|
||||
(load "git-modes")
|
||||
(load "git-commit")
|
||||
|
||||
;; Keybindings
|
||||
(global-set-key (kbd "C-u") (lambda ()
|
||||
(interactive)
|
||||
(kill-line 0)))
|
||||
|
||||
;; Show cursor's current column number
|
||||
(setq column-number-mode t)
|
||||
|
||||
;; Disable autosave
|
||||
(setq auto-save-default nil)
|
||||
|
||||
;; Use a single directory for storing backup files
|
||||
(setq backup-directory-alist `(("." . "~/.emacs.d/auto-save-list")))
|
||||
(setq backup-by-copying t)
|
||||
(setq delete-old-versions t
|
||||
kept-new-versions 6
|
||||
kept-old-versions 2
|
||||
version-control t)
|
||||
|
||||
(custom-set-variables
|
||||
;; custom-set-variables was added by Custom.
|
||||
;; If you edit it by hand, you could mess it up, so be careful.
|
||||
;; Your init file should contain only one such instance.
|
||||
;; If there is more than one, they won't work right.
|
||||
'(blink-cursor-mode nil)
|
||||
'(column-number-mode t)
|
||||
'(show-paren-mode t))
|
||||
(custom-set-faces
|
||||
;; custom-set-faces was added by Custom.
|
||||
;; If you edit it by hand, you could mess it up, so be careful.
|
||||
;; Your init file should contain only one such instance.
|
||||
;; If there is more than one, they won't work right.
|
||||
)
|
||||
8
samples/Emacs Lisp/filenames/abbrev_defs
Normal file
8
samples/Emacs Lisp/filenames/abbrev_defs
Normal file
@@ -0,0 +1,8 @@
|
||||
(define-abbrev-table 'fundamental-mode-abbrev-table '(
|
||||
("cat" "Concatenate" nil 0)
|
||||
("WTF" "World Trade Federation " nil 0)
|
||||
("rtbtm" "Read that back to me" nil 0)))
|
||||
|
||||
(define-abbrev-table 'shell-script-mode-abbrev-table '(
|
||||
("brake", "bundle rake exec" nil 0)
|
||||
("pls", "warning: setting Encoding.default_external")))
|
||||
6
samples/FORTRAN/bug-185631.f
Normal file
6
samples/FORTRAN/bug-185631.f
Normal file
@@ -0,0 +1,6 @@
|
||||
! Codes/HYCOM/hycom/ATLb2.00/src_2.0.01_22_one/
|
||||
real onemu, twomu
|
||||
data onemu/0.0098/
|
||||
data twomu/1./
|
||||
data threemu/0.e9/
|
||||
end
|
||||
60
samples/Julia/julia
Normal file
60
samples/Julia/julia
Normal file
@@ -0,0 +1,60 @@
|
||||
#!/usr/bin/env julia
|
||||
|
||||
# From https://github.com/JoshCheek/language-sampler-for-fullpath/blob/b766dcdbd249ec63516f491390a75315e78cba95/julia/fullpath
|
||||
help_screen = """
|
||||
usage: fullpath *[relative-paths] [-c]
|
||||
|
||||
Prints the fullpath of the paths
|
||||
If no paths are given as args, it will read them from stdin
|
||||
|
||||
If there is only one path, the trailing newline is omitted
|
||||
|
||||
The -c flag will copy the results into your pasteboard
|
||||
"""
|
||||
|
||||
help = false
|
||||
copy = false
|
||||
dir = pwd()
|
||||
paths = []
|
||||
|
||||
for arg = ARGS
|
||||
if arg == "-h" || arg == "--help"
|
||||
help = true
|
||||
elseif arg == "-c" || arg == "--copy"
|
||||
copy = true
|
||||
elseif arg != ""
|
||||
push!(paths, arg)
|
||||
end
|
||||
end
|
||||
|
||||
if help
|
||||
print(help_screen)
|
||||
exit()
|
||||
end
|
||||
|
||||
function notempty(string)
|
||||
return !isempty(string)
|
||||
end
|
||||
|
||||
if length(paths) == 0
|
||||
paths = filter(notempty, map(chomp, readlines()))
|
||||
end
|
||||
|
||||
function print_paths(stream, paths)
|
||||
if length(paths) == 1
|
||||
path = paths[1]
|
||||
print(stream, "$dir/$path")
|
||||
else
|
||||
for path = paths
|
||||
println(stream, "$dir/$path")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if copy
|
||||
read, write, process = readandwrite(`pbcopy`)
|
||||
print_paths(write, paths)
|
||||
close(write)
|
||||
end
|
||||
|
||||
print_paths(STDOUT, paths)
|
||||
47
samples/MQL4/header-sample.mqh
Normal file
47
samples/MQL4/header-sample.mqh
Normal file
@@ -0,0 +1,47 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| header-sample.mqh |
|
||||
//| Copyright 2016, Andrey Osorgin |
|
||||
//+------------------------------------------------------------------+
|
||||
//| The MIT License (MIT) |
|
||||
//| |
|
||||
//| Permission is hereby granted, free of charge, to any person |
|
||||
//| obtaining a copy of this software and associated documentation |
|
||||
//| files (the "Software"), to deal in the Software without |
|
||||
//| restriction, including without limitation the rights to use, |
|
||||
//| copy, modify, merge, publish, distribute, sublicense, and/or sell|
|
||||
//| copies of the Software, and to permit persons to whom the |
|
||||
//| Software is furnished to do so, subject to the following |
|
||||
//| conditions: |
|
||||
//| |
|
||||
//| The above copyright notice and this permission notice shall be |
|
||||
//| included in all copies or substantial portions of the Software. |
|
||||
//| |
|
||||
//| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
|
||||
//| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES |
|
||||
//| OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
|
||||
//| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT |
|
||||
//| HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
|
||||
//| WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
|
||||
//| FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
|
||||
//| OTHER DEALINGS IN THE SOFTWARE. |
|
||||
//| |
|
||||
//| A copy of the MIT License (MIT) is available at |
|
||||
//| https://opensource.org/licenses/MIT |
|
||||
//+------------------------------------------------------------------+
|
||||
#property strict
|
||||
//+------------------------------------------------------------------+
|
||||
//| |
|
||||
//+------------------------------------------------------------------+
|
||||
class CSomeObject
|
||||
{
|
||||
protected:
|
||||
int m_someproperty;
|
||||
private:
|
||||
bool SomeFunction() {return true;}
|
||||
public:
|
||||
CSomeObject(void): m_someproperty(0) {}
|
||||
~CSomeObject(void) {}
|
||||
void SetName(int n){m_someproperty=n;}// sets somepropery
|
||||
int GetName(){return(m_someproperty);} // returns someproperty
|
||||
};
|
||||
//+------------------------------------------------------------------+
|
||||
61
samples/MQL4/indicator-sample.mq4
Normal file
61
samples/MQL4/indicator-sample.mq4
Normal file
@@ -0,0 +1,61 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| indicator-sample.mq4 |
|
||||
//| Copyright 2016, Andrey Osorgin |
|
||||
//+------------------------------------------------------------------+
|
||||
//| The MIT License (MIT) |
|
||||
//| |
|
||||
//| Permission is hereby granted, free of charge, to any person |
|
||||
//| obtaining a copy of this software and associated documentation |
|
||||
//| files (the "Software"), to deal in the Software without |
|
||||
//| restriction, including without limitation the rights to use, |
|
||||
//| copy, modify, merge, publish, distribute, sublicense, and/or sell|
|
||||
//| copies of the Software, and to permit persons to whom the |
|
||||
//| Software is furnished to do so, subject to the following |
|
||||
//| conditions: |
|
||||
//| |
|
||||
//| The above copyright notice and this permission notice shall be |
|
||||
//| included in all copies or substantial portions of the Software. |
|
||||
//| |
|
||||
//| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
|
||||
//| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES |
|
||||
//| OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
|
||||
//| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT |
|
||||
//| HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
|
||||
//| WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
|
||||
//| FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
|
||||
//| OTHER DEALINGS IN THE SOFTWARE. |
|
||||
//| |
|
||||
//| A copy of the MIT License (MIT) is available at |
|
||||
//| https://opensource.org/licenses/MIT |
|
||||
//+------------------------------------------------------------------+
|
||||
#property version "1.00"
|
||||
#property strict
|
||||
|
||||
#property indicator_chart_window
|
||||
#property indicator_plots 0
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator initialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
void OnInit(void)
|
||||
{
|
||||
//---
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Bears Power |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnCalculate(const int rates_total,
|
||||
const int prev_calculated,
|
||||
const datetime &time[],
|
||||
const double &open[],
|
||||
const double &high[],
|
||||
const double &low[],
|
||||
const double &close[],
|
||||
const long &tick_volume[],
|
||||
const long &volume[],
|
||||
const int &spread[])
|
||||
{
|
||||
Print("The number of bars on the current chart: ",iBars(Symbol(),Period()));
|
||||
//---
|
||||
return(rates_total);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
51
samples/MQL4/script-sample.mq4
Normal file
51
samples/MQL4/script-sample.mq4
Normal file
@@ -0,0 +1,51 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| script-sample.mq4 |
|
||||
//| Copyright 2016, Andrey Osorgin |
|
||||
//+------------------------------------------------------------------+
|
||||
//| The MIT License (MIT) |
|
||||
//| |
|
||||
//| Permission is hereby granted, free of charge, to any person |
|
||||
//| obtaining a copy of this software and associated documentation |
|
||||
//| files (the "Software"), to deal in the Software without |
|
||||
//| restriction, including without limitation the rights to use, |
|
||||
//| copy, modify, merge, publish, distribute, sublicense, and/or sell|
|
||||
//| copies of the Software, and to permit persons to whom the |
|
||||
//| Software is furnished to do so, subject to the following |
|
||||
//| conditions: |
|
||||
//| |
|
||||
//| The above copyright notice and this permission notice shall be |
|
||||
//| included in all copies or substantial portions of the Software. |
|
||||
//| |
|
||||
//| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
|
||||
//| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES |
|
||||
//| OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
|
||||
//| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT |
|
||||
//| HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
|
||||
//| WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
|
||||
//| FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
|
||||
//| OTHER DEALINGS IN THE SOFTWARE. |
|
||||
//| |
|
||||
//| A copy of the MIT License (MIT) is available at |
|
||||
//| https://opensource.org/licenses/MIT |
|
||||
//+------------------------------------------------------------------+
|
||||
#property version "1.00"
|
||||
#property strict
|
||||
#property script_show_inputs
|
||||
|
||||
input int StopLoss=100; //Stop Loss
|
||||
input int TakeProfit=100; //Take Profit
|
||||
//+------------------------------------------------------------------+
|
||||
//| Script program start function |
|
||||
//+------------------------------------------------------------------+
|
||||
void OnStart()
|
||||
{
|
||||
double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
|
||||
Print("Minimum Stop Level=",minstoplevel," points");
|
||||
//---
|
||||
double sl=NormalizeDouble(Bid-StopLoss*Point,Digits);
|
||||
double tp=NormalizeDouble(Ask+TakeProfit*Point,Digits);
|
||||
//---
|
||||
int result=OrderSend(Symbol(),OP_BUY,0.01,Ask,1,sl,tp,"Test",0,0,clrNONE);
|
||||
Print("Success? ",result);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
1390
samples/MQL5/Regex.mqh
Normal file
1390
samples/MQL5/Regex.mqh
Normal file
File diff suppressed because it is too large
Load Diff
64
samples/MQL5/indicator-sample.mq5
Normal file
64
samples/MQL5/indicator-sample.mq5
Normal file
@@ -0,0 +1,64 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| indicator-sample.mq5 |
|
||||
//| Copyright 2016, Andrey Osorgin |
|
||||
//+------------------------------------------------------------------+
|
||||
//| The MIT License (MIT) |
|
||||
//| |
|
||||
//| Permission is hereby granted, free of charge, to any person |
|
||||
//| obtaining a copy of this software and associated documentation |
|
||||
//| files (the "Software"), to deal in the Software without |
|
||||
//| restriction, including without limitation the rights to use, |
|
||||
//| copy, modify, merge, publish, distribute, sublicense, and/or sell|
|
||||
//| copies of the Software, and to permit persons to whom the |
|
||||
//| Software is furnished to do so, subject to the following |
|
||||
//| conditions: |
|
||||
//| |
|
||||
//| The above copyright notice and this permission notice shall be |
|
||||
//| included in all copies or substantial portions of the Software. |
|
||||
//| |
|
||||
//| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
|
||||
//| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES |
|
||||
//| OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
|
||||
//| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT |
|
||||
//| HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
|
||||
//| WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
|
||||
//| FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
|
||||
//| OTHER DEALINGS IN THE SOFTWARE. |
|
||||
//| |
|
||||
//| A copy of the MIT License (MIT) is available at |
|
||||
//| https://opensource.org/licenses/MIT |
|
||||
//+------------------------------------------------------------------+
|
||||
#property version "1.00"
|
||||
|
||||
#property indicator_chart_window
|
||||
#property indicator_plots 0
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator initialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnInit()
|
||||
{
|
||||
//---
|
||||
return(INIT_SUCCEEDED);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator iteration function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnCalculate(const int rates_total,
|
||||
const int prev_calculated,
|
||||
const datetime &time[],
|
||||
const double &open[],
|
||||
const double &high[],
|
||||
const double &low[],
|
||||
const double &close[],
|
||||
const long &tick_volume[],
|
||||
const long &volume[],
|
||||
const int &spread[])
|
||||
{
|
||||
//---
|
||||
int bars=Bars(Symbol(),0);
|
||||
Print("Bars = ",bars,", rates_total = ",rates_total,", prev_calculated = ",prev_calculated);
|
||||
Print("time[0] = ",time[0]," time[rates_total-1] = ",time[rates_total-1]);
|
||||
//--- return value of prev_calculated for next call
|
||||
return(rates_total);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
56
samples/MQL5/script-sample.mq5
Normal file
56
samples/MQL5/script-sample.mq5
Normal file
@@ -0,0 +1,56 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| script-sample.mq5 |
|
||||
//| Copyright 2016, Andrey Osorgin |
|
||||
//+------------------------------------------------------------------+
|
||||
//| The MIT License (MIT) |
|
||||
//| |
|
||||
//| Permission is hereby granted, free of charge, to any person |
|
||||
//| obtaining a copy of this software and associated documentation |
|
||||
//| files (the "Software"), to deal in the Software without |
|
||||
//| restriction, including without limitation the rights to use, |
|
||||
//| copy, modify, merge, publish, distribute, sublicense, and/or sell|
|
||||
//| copies of the Software, and to permit persons to whom the |
|
||||
//| Software is furnished to do so, subject to the following |
|
||||
//| conditions: |
|
||||
//| |
|
||||
//| The above copyright notice and this permission notice shall be |
|
||||
//| included in all copies or substantial portions of the Software. |
|
||||
//| |
|
||||
//| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
|
||||
//| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES |
|
||||
//| OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
|
||||
//| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT |
|
||||
//| HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
|
||||
//| WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
|
||||
//| FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
|
||||
//| OTHER DEALINGS IN THE SOFTWARE. |
|
||||
//| |
|
||||
//| A copy of the MIT License (MIT) is available at |
|
||||
//| https://opensource.org/licenses/MIT |
|
||||
//+------------------------------------------------------------------+
|
||||
#property version "1.00"
|
||||
#property script_show_inputs
|
||||
|
||||
#include <Trade\Trade.mqh>
|
||||
|
||||
input int StopLoss=100; // Stop Loss
|
||||
input int TakeProfit=100; // Take Profit
|
||||
//+------------------------------------------------------------------+
|
||||
//| Script program start function |
|
||||
//+------------------------------------------------------------------+
|
||||
void OnStart()
|
||||
{
|
||||
CTrade trade;
|
||||
//---
|
||||
long stoplevel=SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL);
|
||||
Print("Minimum stop level is: ",stoplevel);
|
||||
double ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
|
||||
double bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
|
||||
double sl = NormalizeDouble(bid - StopLoss*Point(),Digits());
|
||||
double tp = NormalizeDouble(ask + TakeProfit*Point(),Digits());
|
||||
//---
|
||||
bool result=trade.Buy(0.01,Symbol(),ask,sl,tp,"test");
|
||||
//---
|
||||
Print("Success? ",result);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
134
samples/Makefile/file-icons.make
Normal file
134
samples/Makefile/file-icons.make
Normal file
@@ -0,0 +1,134 @@
|
||||
charmap := charmap.md
|
||||
font-name := file-icons
|
||||
font-folder := dist
|
||||
font-config := icomoon.json
|
||||
icon-size := 34
|
||||
icon-folder := svg
|
||||
repo-name := Alhadis/FileIcons
|
||||
svg := $(wildcard $(icon-folder)/*.svg)
|
||||
last-commit = $(shell git log -1 --oneline --no-abbrev | cut -d' ' -f1)
|
||||
|
||||
|
||||
all: unpack $(font-folder)/$(font-name).woff2 charmap
|
||||
|
||||
|
||||
# Aliases
|
||||
unpack: $(font-folder)/$(font-name).ttf
|
||||
charmap: $(charmap)
|
||||
|
||||
|
||||
# Extract a downloaded IcoMoon folder
|
||||
$(font-folder)/%.ttf: %.zip
|
||||
@rm -rf $(font-folder) tmp $(font-config)
|
||||
@unzip -qd tmp $^
|
||||
@mv tmp/fonts $(font-folder)
|
||||
@mv tmp/selection.json $(font-config)
|
||||
@rm -rf tmp $^
|
||||
@perl -pi -e 's|^( {2})+|"\t" x (length($$&)/2)|ge' $(font-config)
|
||||
@echo "" >> $(font-config) # Ensure trailing newline
|
||||
@echo "Files extracted."
|
||||
|
||||
|
||||
# Generate a WOFF2 file from a TTF
|
||||
%.woff2: %.ttf
|
||||
@[ ! -f $@ ] && { \
|
||||
hash woff2_compress 2>/dev/null || { \
|
||||
echo >&2 "WOFF2 conversion tools not found. Consult the readme file."; \
|
||||
exit 2; \
|
||||
}; \
|
||||
woff2_compress $^ >/dev/null; \
|
||||
echo "WOFF2 file generated."; \
|
||||
};
|
||||
|
||||
|
||||
|
||||
# Clean up SVG source
|
||||
lint: $(svg)
|
||||
@perl -0777 -pi -e '\
|
||||
s/\r\n/\n/g; \
|
||||
s/<g id="icomoon-ignore">\s*<\/g>//gmi; \
|
||||
s/<g\s*>\s*<\/g>//gmi; \
|
||||
s/\s+(id|viewBox|xml:space)="[^"]*"/ /gmi; \
|
||||
s/<!DOCTYPE[^>]*>//gi; \
|
||||
s/<\?xml.*?\?>//gi; \
|
||||
s/<!--.*?-->//gm; \
|
||||
s/ style="enable-background:.*?;"//gmi; \
|
||||
s/"\s+>/">/g; \
|
||||
s/\x20{2,}/ /g; \
|
||||
s/[\t\n]+//gm;' $^
|
||||
|
||||
|
||||
|
||||
# Generate/update character map
|
||||
$(charmap):
|
||||
@./create-map.pl -r=$(repo-name) -i=$(icon-folder) --size=$(icon-size) $(font-folder)/$(font-name).svg $@
|
||||
|
||||
|
||||
|
||||
|
||||
# POSIX systems only: reattach hard links to File-Icons package
|
||||
relink:
|
||||
@$(call need-var,ATOM_FILE_ICONS,ERROR_NO_PKG)
|
||||
@ln -f $(font-folder)/$(font-name).woff2 $(wildcard $(ATOM_FILE_ICONS)/fonts/file-icons-*.woff2)
|
||||
|
||||
|
||||
|
||||
# Force an icon's preview to be refreshed on GitHub
|
||||
cachebust:
|
||||
@$(call need-var,icon,ERROR_NO_ICON)
|
||||
@base="https://cdn.rawgit.com/Alhadis/FileIcons/"; \
|
||||
perl -pi -e 's{$$base\K\w+(?=/svg/$(icon:%.svg=%)\.svg")}{$(last-commit)}ig;' $(charmap)
|
||||
|
||||
|
||||
# Dummy task to improve feedback if `cachebust` is mistyped
|
||||
icon:
|
||||
$(call need-var,,ERROR_UNDEF_ICON)
|
||||
|
||||
|
||||
|
||||
# Reset unstaged changes/additions in object directories
|
||||
clean:
|
||||
@git clean -fd $(font-folder)
|
||||
@git checkout -- $(font-folder) 2>/dev/null || true
|
||||
|
||||
|
||||
# Delete extracted and generated files
|
||||
distclean:
|
||||
@rm -rf $(font-folder)
|
||||
|
||||
|
||||
.PHONY: clean distclean $(charmap) cachebust icon
|
||||
.ONESHELL:
|
||||
|
||||
|
||||
# Error message shown to users attempting to run `make relink` without a link
|
||||
ERROR_NO_PKG := Environment variable ATOM_FILE_ICONS not found. \
|
||||
| \
|
||||
| Try this instead:\
|
||||
| \
|
||||
| \ make relink ATOM_FILE_ICONS=/path/to/your/file-icons/installation |
|
||||
|
||||
|
||||
# Error message shown when running `make cachebust` without an icon
|
||||
ERROR_NO_ICON := No icon specified. Task aborted.| \
|
||||
| Usage: \
|
||||
| \ make icon=file[.svg] cachebust \
|
||||
| \
|
||||
| Examples: \
|
||||
| \ make icon=Manpage cachebust \
|
||||
| \ make icon=APL.svg cachebust |
|
||||
|
||||
|
||||
# Shown if user tries running `make icon NAME cachebust` by mistake
|
||||
ERROR_UNDEF_ICON := No task named \"icon\". \
|
||||
| \
|
||||
| Did you mean this? \
|
||||
| \ make icon=NAME cachebust |
|
||||
|
||||
|
||||
|
||||
# If the given value is empty, die with an error message
|
||||
need = @$(if $(1),,echo $(subst | ,$$'\n',$(2)); exit 2)
|
||||
|
||||
# Like `need`, but uses variable names instead of string values
|
||||
need-var = @$(call need,$($(1)),$($(2)))
|
||||
413
samples/Objective-C/cocoa_monitor.m
Normal file
413
samples/Objective-C/cocoa_monitor.m
Normal file
@@ -0,0 +1,413 @@
|
||||
//========================================================================
|
||||
// GLFW 3.3 OS X - www.glfw.org
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||
// Copyright (c) 2006-2016 Camilla Berglund <elmindreda@glfw.org>
|
||||
//
|
||||
// This software is provided 'as-is', without any express or implied
|
||||
// warranty. In no event will the authors be held liable for any damages
|
||||
// arising from the use of this software.
|
||||
//
|
||||
// Permission is granted to anyone to use this software for any purpose,
|
||||
// including commercial applications, and to alter it and redistribute it
|
||||
// freely, subject to the following restrictions:
|
||||
//
|
||||
// 1. The origin of this software must not be misrepresented; you must not
|
||||
// claim that you wrote the original software. If you use this software
|
||||
// in a product, an acknowledgment in the product documentation would
|
||||
// be appreciated but is not required.
|
||||
//
|
||||
// 2. Altered source versions must be plainly marked as such, and must not
|
||||
// be misrepresented as being the original software.
|
||||
//
|
||||
// 3. This notice may not be removed or altered from any source
|
||||
// distribution.
|
||||
//
|
||||
//========================================================================
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include <IOKit/graphics/IOGraphicsLib.h>
|
||||
#include <CoreVideo/CVBase.h>
|
||||
#include <CoreVideo/CVDisplayLink.h>
|
||||
#include <ApplicationServices/ApplicationServices.h>
|
||||
|
||||
|
||||
// Get the name of the specified display
|
||||
//
|
||||
static char* getDisplayName(CGDirectDisplayID displayID)
|
||||
{
|
||||
char* name;
|
||||
CFDictionaryRef info, names;
|
||||
CFStringRef value;
|
||||
CFIndex size;
|
||||
|
||||
// NOTE: This uses a deprecated function because Apple has
|
||||
// (as of January 2015) not provided any alternative
|
||||
info = IODisplayCreateInfoDictionary(CGDisplayIOServicePort(displayID),
|
||||
kIODisplayOnlyPreferredName);
|
||||
names = CFDictionaryGetValue(info, CFSTR(kDisplayProductName));
|
||||
|
||||
if (!names || !CFDictionaryGetValueIfPresent(names, CFSTR("en_US"),
|
||||
(const void**) &value))
|
||||
{
|
||||
// This may happen if a desktop Mac is running headless
|
||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||
"Cocoa: Failed to retrieve display name");
|
||||
|
||||
CFRelease(info);
|
||||
return strdup("Unknown");
|
||||
}
|
||||
|
||||
size = CFStringGetMaximumSizeForEncoding(CFStringGetLength(value),
|
||||
kCFStringEncodingUTF8);
|
||||
name = calloc(size + 1, 1);
|
||||
CFStringGetCString(value, name, size, kCFStringEncodingUTF8);
|
||||
|
||||
CFRelease(info);
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
// Check whether the display mode should be included in enumeration
|
||||
//
|
||||
static GLFWbool modeIsGood(CGDisplayModeRef mode)
|
||||
{
|
||||
uint32_t flags = CGDisplayModeGetIOFlags(mode);
|
||||
if (!(flags & kDisplayModeValidFlag) || !(flags & kDisplayModeSafeFlag))
|
||||
return GLFW_FALSE;
|
||||
|
||||
if (flags & kDisplayModeInterlacedFlag)
|
||||
return GLFW_FALSE;
|
||||
|
||||
if (flags & kDisplayModeStretchedFlag)
|
||||
return GLFW_FALSE;
|
||||
|
||||
CFStringRef format = CGDisplayModeCopyPixelEncoding(mode);
|
||||
if (CFStringCompare(format, CFSTR(IO16BitDirectPixels), 0) &&
|
||||
CFStringCompare(format, CFSTR(IO32BitDirectPixels), 0))
|
||||
{
|
||||
CFRelease(format);
|
||||
return GLFW_FALSE;
|
||||
}
|
||||
|
||||
CFRelease(format);
|
||||
return GLFW_TRUE;
|
||||
}
|
||||
|
||||
// Convert Core Graphics display mode to GLFW video mode
|
||||
//
|
||||
static GLFWvidmode vidmodeFromCGDisplayMode(CGDisplayModeRef mode,
|
||||
CVDisplayLinkRef link)
|
||||
{
|
||||
GLFWvidmode result;
|
||||
result.width = (int) CGDisplayModeGetWidth(mode);
|
||||
result.height = (int) CGDisplayModeGetHeight(mode);
|
||||
result.refreshRate = (int) CGDisplayModeGetRefreshRate(mode);
|
||||
|
||||
if (result.refreshRate == 0)
|
||||
{
|
||||
const CVTime time = CVDisplayLinkGetNominalOutputVideoRefreshPeriod(link);
|
||||
if (!(time.flags & kCVTimeIsIndefinite))
|
||||
result.refreshRate = (int) (time.timeScale / (double) time.timeValue);
|
||||
}
|
||||
|
||||
CFStringRef format = CGDisplayModeCopyPixelEncoding(mode);
|
||||
|
||||
if (CFStringCompare(format, CFSTR(IO16BitDirectPixels), 0) == 0)
|
||||
{
|
||||
result.redBits = 5;
|
||||
result.greenBits = 5;
|
||||
result.blueBits = 5;
|
||||
}
|
||||
else
|
||||
{
|
||||
result.redBits = 8;
|
||||
result.greenBits = 8;
|
||||
result.blueBits = 8;
|
||||
}
|
||||
|
||||
CFRelease(format);
|
||||
return result;
|
||||
}
|
||||
|
||||
// Starts reservation for display fading
|
||||
//
|
||||
static CGDisplayFadeReservationToken beginFadeReservation(void)
|
||||
{
|
||||
CGDisplayFadeReservationToken token = kCGDisplayFadeReservationInvalidToken;
|
||||
|
||||
if (CGAcquireDisplayFadeReservation(5, &token) == kCGErrorSuccess)
|
||||
CGDisplayFade(token, 0.3, kCGDisplayBlendNormal, kCGDisplayBlendSolidColor, 0.0, 0.0, 0.0, TRUE);
|
||||
|
||||
return token;
|
||||
}
|
||||
|
||||
// Ends reservation for display fading
|
||||
//
|
||||
static void endFadeReservation(CGDisplayFadeReservationToken token)
|
||||
{
|
||||
if (token != kCGDisplayFadeReservationInvalidToken)
|
||||
{
|
||||
CGDisplayFade(token, 0.5, kCGDisplayBlendSolidColor, kCGDisplayBlendNormal, 0.0, 0.0, 0.0, FALSE);
|
||||
CGReleaseDisplayFadeReservation(token);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
////// GLFW internal API //////
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Change the current video mode
|
||||
//
|
||||
GLFWbool _glfwSetVideoModeNS(_GLFWmonitor* monitor, const GLFWvidmode* desired)
|
||||
{
|
||||
CFArrayRef modes;
|
||||
CFIndex count, i;
|
||||
CVDisplayLinkRef link;
|
||||
CGDisplayModeRef native = NULL;
|
||||
GLFWvidmode current;
|
||||
const GLFWvidmode* best;
|
||||
|
||||
best = _glfwChooseVideoMode(monitor, desired);
|
||||
_glfwPlatformGetVideoMode(monitor, ¤t);
|
||||
if (_glfwCompareVideoModes(¤t, best) == 0)
|
||||
return GLFW_TRUE;
|
||||
|
||||
CVDisplayLinkCreateWithCGDisplay(monitor->ns.displayID, &link);
|
||||
|
||||
modes = CGDisplayCopyAllDisplayModes(monitor->ns.displayID, NULL);
|
||||
count = CFArrayGetCount(modes);
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
CGDisplayModeRef dm = (CGDisplayModeRef) CFArrayGetValueAtIndex(modes, i);
|
||||
if (!modeIsGood(dm))
|
||||
continue;
|
||||
|
||||
const GLFWvidmode mode = vidmodeFromCGDisplayMode(dm, link);
|
||||
if (_glfwCompareVideoModes(best, &mode) == 0)
|
||||
{
|
||||
native = dm;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (native)
|
||||
{
|
||||
if (monitor->ns.previousMode == NULL)
|
||||
monitor->ns.previousMode = CGDisplayCopyDisplayMode(monitor->ns.displayID);
|
||||
|
||||
CGDisplayFadeReservationToken token = beginFadeReservation();
|
||||
CGDisplaySetDisplayMode(monitor->ns.displayID, native, NULL);
|
||||
endFadeReservation(token);
|
||||
}
|
||||
|
||||
CFRelease(modes);
|
||||
CVDisplayLinkRelease(link);
|
||||
|
||||
if (!native)
|
||||
{
|
||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||
"Cocoa: Monitor mode list changed");
|
||||
return GLFW_FALSE;
|
||||
}
|
||||
|
||||
return GLFW_TRUE;
|
||||
}
|
||||
|
||||
// Restore the previously saved (original) video mode
|
||||
//
|
||||
void _glfwRestoreVideoModeNS(_GLFWmonitor* monitor)
|
||||
{
|
||||
if (monitor->ns.previousMode)
|
||||
{
|
||||
CGDisplayFadeReservationToken token = beginFadeReservation();
|
||||
CGDisplaySetDisplayMode(monitor->ns.displayID,
|
||||
monitor->ns.previousMode, NULL);
|
||||
endFadeReservation(token);
|
||||
|
||||
CGDisplayModeRelease(monitor->ns.previousMode);
|
||||
monitor->ns.previousMode = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
////// GLFW platform API //////
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
_GLFWmonitor** _glfwPlatformGetMonitors(int* count)
|
||||
{
|
||||
uint32_t i, found = 0, displayCount;
|
||||
_GLFWmonitor** monitors;
|
||||
CGDirectDisplayID* displays;
|
||||
|
||||
*count = 0;
|
||||
|
||||
CGGetOnlineDisplayList(0, NULL, &displayCount);
|
||||
displays = calloc(displayCount, sizeof(CGDirectDisplayID));
|
||||
monitors = calloc(displayCount, sizeof(_GLFWmonitor*));
|
||||
|
||||
CGGetOnlineDisplayList(displayCount, displays, &displayCount);
|
||||
|
||||
for (i = 0; i < displayCount; i++)
|
||||
{
|
||||
_GLFWmonitor* monitor;
|
||||
|
||||
if (CGDisplayIsAsleep(displays[i]))
|
||||
continue;
|
||||
|
||||
const CGSize size = CGDisplayScreenSize(displays[i]);
|
||||
char* name = getDisplayName(displays[i]);
|
||||
|
||||
monitor = _glfwAllocMonitor(name, size.width, size.height);
|
||||
monitor->ns.displayID = displays[i];
|
||||
monitor->ns.unitNumber = CGDisplayUnitNumber(displays[i]);
|
||||
|
||||
free(name);
|
||||
|
||||
found++;
|
||||
monitors[found - 1] = monitor;
|
||||
}
|
||||
|
||||
free(displays);
|
||||
|
||||
*count = found;
|
||||
return monitors;
|
||||
}
|
||||
|
||||
GLFWbool _glfwPlatformIsSameMonitor(_GLFWmonitor* first, _GLFWmonitor* second)
|
||||
{
|
||||
// HACK: Compare unit numbers instead of display IDs to work around display
|
||||
// replacement on machines with automatic graphics switching
|
||||
return first->ns.unitNumber == second->ns.unitNumber;
|
||||
}
|
||||
|
||||
void _glfwPlatformGetMonitorPos(_GLFWmonitor* monitor, int* xpos, int* ypos)
|
||||
{
|
||||
const CGRect bounds = CGDisplayBounds(monitor->ns.displayID);
|
||||
|
||||
if (xpos)
|
||||
*xpos = (int) bounds.origin.x;
|
||||
if (ypos)
|
||||
*ypos = (int) bounds.origin.y;
|
||||
}
|
||||
|
||||
GLFWvidmode* _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, int* count)
|
||||
{
|
||||
CFArrayRef modes;
|
||||
CFIndex found, i, j;
|
||||
GLFWvidmode* result;
|
||||
CVDisplayLinkRef link;
|
||||
|
||||
*count = 0;
|
||||
|
||||
CVDisplayLinkCreateWithCGDisplay(monitor->ns.displayID, &link);
|
||||
|
||||
modes = CGDisplayCopyAllDisplayModes(monitor->ns.displayID, NULL);
|
||||
found = CFArrayGetCount(modes);
|
||||
result = calloc(found, sizeof(GLFWvidmode));
|
||||
|
||||
for (i = 0; i < found; i++)
|
||||
{
|
||||
CGDisplayModeRef dm = (CGDisplayModeRef) CFArrayGetValueAtIndex(modes, i);
|
||||
if (!modeIsGood(dm))
|
||||
continue;
|
||||
|
||||
const GLFWvidmode mode = vidmodeFromCGDisplayMode(dm, link);
|
||||
|
||||
for (j = 0; j < *count; j++)
|
||||
{
|
||||
if (_glfwCompareVideoModes(result + j, &mode) == 0)
|
||||
break;
|
||||
}
|
||||
|
||||
// Skip duplicate modes
|
||||
if (i < *count)
|
||||
continue;
|
||||
|
||||
(*count)++;
|
||||
result[*count - 1] = mode;
|
||||
}
|
||||
|
||||
CFRelease(modes);
|
||||
CVDisplayLinkRelease(link);
|
||||
return result;
|
||||
}
|
||||
|
||||
void _glfwPlatformGetVideoMode(_GLFWmonitor* monitor, GLFWvidmode *mode)
|
||||
{
|
||||
CGDisplayModeRef displayMode;
|
||||
CVDisplayLinkRef link;
|
||||
|
||||
CVDisplayLinkCreateWithCGDisplay(monitor->ns.displayID, &link);
|
||||
|
||||
displayMode = CGDisplayCopyDisplayMode(monitor->ns.displayID);
|
||||
*mode = vidmodeFromCGDisplayMode(displayMode, link);
|
||||
CGDisplayModeRelease(displayMode);
|
||||
|
||||
CVDisplayLinkRelease(link);
|
||||
}
|
||||
|
||||
void _glfwPlatformGetGammaRamp(_GLFWmonitor* monitor, GLFWgammaramp* ramp)
|
||||
{
|
||||
uint32_t i, size = CGDisplayGammaTableCapacity(monitor->ns.displayID);
|
||||
CGGammaValue* values = calloc(size * 3, sizeof(CGGammaValue));
|
||||
|
||||
CGGetDisplayTransferByTable(monitor->ns.displayID,
|
||||
size,
|
||||
values,
|
||||
values + size,
|
||||
values + size * 2,
|
||||
&size);
|
||||
|
||||
_glfwAllocGammaArrays(ramp, size);
|
||||
|
||||
for (i = 0; i < size; i++)
|
||||
{
|
||||
ramp->red[i] = (unsigned short) (values[i] * 65535);
|
||||
ramp->green[i] = (unsigned short) (values[i + size] * 65535);
|
||||
ramp->blue[i] = (unsigned short) (values[i + size * 2] * 65535);
|
||||
}
|
||||
|
||||
free(values);
|
||||
}
|
||||
|
||||
void _glfwPlatformSetGammaRamp(_GLFWmonitor* monitor, const GLFWgammaramp* ramp)
|
||||
{
|
||||
int i;
|
||||
CGGammaValue* values = calloc(ramp->size * 3, sizeof(CGGammaValue));
|
||||
|
||||
for (i = 0; i < ramp->size; i++)
|
||||
{
|
||||
values[i] = ramp->red[i] / 65535.f;
|
||||
values[i + ramp->size] = ramp->green[i] / 65535.f;
|
||||
values[i + ramp->size * 2] = ramp->blue[i] / 65535.f;
|
||||
}
|
||||
|
||||
CGSetDisplayTransferByTable(monitor->ns.displayID,
|
||||
ramp->size,
|
||||
values,
|
||||
values + ramp->size,
|
||||
values + ramp->size * 2);
|
||||
|
||||
free(values);
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
////// GLFW native API //////
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
GLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* handle)
|
||||
{
|
||||
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
||||
_GLFW_REQUIRE_INIT_OR_RETURN(kCGNullDirectDisplay);
|
||||
return monitor->ns.displayID;
|
||||
}
|
||||
|
||||
13
samples/Pic/dextroamphetamine.chem
Normal file
13
samples/Pic/dextroamphetamine.chem
Normal file
@@ -0,0 +1,13 @@
|
||||
# Dextroamphetamine molecule
|
||||
.cstart
|
||||
.ps 26
|
||||
size 28
|
||||
R1:
|
||||
ring double 1,2 3,4 5,6
|
||||
bond 60 from R1.V2
|
||||
bond 120
|
||||
A1:
|
||||
front bond down ; CH3
|
||||
bond 60 from A1 ; NH2
|
||||
.ps
|
||||
.cend
|
||||
25
samples/Pic/graph.pic
Normal file
25
samples/Pic/graph.pic
Normal file
@@ -0,0 +1,25 @@
|
||||
.PS
|
||||
ellipse "Pic" "example"
|
||||
arrow
|
||||
box "This is" "a box"
|
||||
arrow right
|
||||
box "Another" "box" dashed
|
||||
move down then right;
|
||||
Thing: ellipse "This is a" "circle-thing"
|
||||
arrow <-> from last box.r to Thing.l
|
||||
move down then left;
|
||||
B: box "Still a box"
|
||||
arrow from Thing.l to B.r
|
||||
sprintf("Width = %g, Height = %g ", B.wid, B.ht) rjust at B.w
|
||||
move down
|
||||
.ps 15
|
||||
define sadness {
|
||||
boxwid = 3;
|
||||
boxht = 1;
|
||||
textht = .5;
|
||||
box "\"I run from my depression by" " " "burying myself in code\""
|
||||
arrow down from last box.s
|
||||
"Me"
|
||||
}
|
||||
sadness();
|
||||
.PE
|
||||
15
samples/Pic/ritalin.chem
Normal file
15
samples/Pic/ritalin.chem
Normal file
@@ -0,0 +1,15 @@
|
||||
.\" RITALIN: Methylphenidate Hydrochloride
|
||||
.cstart
|
||||
.ps 15
|
||||
size 15
|
||||
R1: ring double 1,2 3,4 5,6 pointing up
|
||||
bond 60 length .35 from R1.V2 ; BP
|
||||
bond 120 length .35 from BP
|
||||
R2: ring pointing up put N at 1
|
||||
H above R2
|
||||
bond up length .35 from BP ; BP
|
||||
bond -60 length .35 from BP ; O
|
||||
bond up
|
||||
double bond 60 length .35 from BP ; O
|
||||
.ps 10
|
||||
.cend
|
||||
8
samples/Smalltalk/baselineDependency.st
Normal file
8
samples/Smalltalk/baselineDependency.st
Normal file
@@ -0,0 +1,8 @@
|
||||
dependencies
|
||||
neoJSON: spec
|
||||
spec
|
||||
configuration: 'NeoJSON'
|
||||
with: [ spec
|
||||
className: 'ConfigurationOfNeoJSON';
|
||||
version: #stable;
|
||||
repository: 'http://smalltalkhub.com/mc/SvenVanCaekenberghe/Neo/main' ]
|
||||
8
samples/Smalltalk/categories.st
Normal file
8
samples/Smalltalk/categories.st
Normal file
@@ -0,0 +1,8 @@
|
||||
SystemOrganization addCategory: #ChartJs!
|
||||
SystemOrganization addCategory: 'ChartJs-Component'!
|
||||
SystemOrganization addCategory: 'ChartJs-Demo'!
|
||||
SystemOrganization addCategory: 'ChartJs-Exception'!
|
||||
SystemOrganization addCategory: 'ChartJs-Library'!
|
||||
SystemOrganization addCategory: 'ChartJs-Model'!
|
||||
SystemOrganization addCategory: 'ChartJs-Style'!
|
||||
SystemOrganization addCategory: 'ChartJs-Types'!
|
||||
9
samples/Smalltalk/renderSeasideExampleOn..st
Normal file
9
samples/Smalltalk/renderSeasideExampleOn..st
Normal file
@@ -0,0 +1,9 @@
|
||||
rendering
|
||||
renderTitleId: divId on: html
|
||||
^ html div
|
||||
id: #title , divId;
|
||||
class: #aClass;
|
||||
with: [
|
||||
html heading
|
||||
level3;
|
||||
with: self data title ]
|
||||
11
samples/Smalltalk/scriptWithPragma.st
Normal file
11
samples/Smalltalk/scriptWithPragma.st
Normal file
@@ -0,0 +1,11 @@
|
||||
helpers
|
||||
installGitFileTree
|
||||
"GitFileTree is the tool we will use to commit on GitHub."
|
||||
|
||||
<script>
|
||||
Metacello new
|
||||
baseline: 'FileTree';
|
||||
repository:
|
||||
'github://dalehenrich/filetree:pharo' , SystemVersion current dottedMajorMinor
|
||||
, '_dev/repository';
|
||||
load: 'Git'
|
||||
3
samples/Smalltalk/smallMethod.st
Normal file
3
samples/Smalltalk/smallMethod.st
Normal file
@@ -0,0 +1,3 @@
|
||||
ChartJs
|
||||
dataFunction
|
||||
^ 'bars'
|
||||
14
samples/Sublime Text Config/AMPL.sublime-build
Normal file
14
samples/Sublime Text Config/AMPL.sublime-build
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"cmd": ["ampl", "${file_path}/${file_base_name}.run"],
|
||||
"file_regex": "^(?:[(]file )*[ ]*(...*?), line ([0-9]*)",
|
||||
"selector": "source.ampl",
|
||||
|
||||
"osx":
|
||||
{
|
||||
"env":
|
||||
{
|
||||
// "ILOG_LICENSE_FILE": "path/to/access.ilm"
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
8
samples/Sublime Text Config/CLIPS.sublime-settings
Normal file
8
samples/Sublime Text Config/CLIPS.sublime-settings
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"extensions":
|
||||
[
|
||||
"clp"
|
||||
],
|
||||
"tab_size": 8,
|
||||
"translate_tabs_to_spaces": false
|
||||
}
|
||||
13
samples/Sublime Text Config/Context.sublime-menu
Normal file
13
samples/Sublime Text Config/Context.sublime-menu
Normal file
@@ -0,0 +1,13 @@
|
||||
[
|
||||
{
|
||||
"id" : "nasm",
|
||||
"caption": "NASM Assembly",
|
||||
"children":
|
||||
[
|
||||
{
|
||||
"caption" : "Documentation",
|
||||
"command" : "assembly_doc"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
30
samples/Sublime Text Config/Dart.sublime-commands
Normal file
30
samples/Sublime Text Config/Dart.sublime-commands
Normal file
@@ -0,0 +1,30 @@
|
||||
[
|
||||
{ "caption": "Dart: Polymer: Generate Element", "command": "dart_generate_polymer_element" },
|
||||
{ "caption": "Dart: Polymer: Add Entry Point", "command": "dart_add_polymer_entry_point" },
|
||||
|
||||
{ "caption": "Dart: Check Configuration", "command": "dart_check_config" },
|
||||
{ "caption": "Dart: Browse API Reference", "command": "dart_open_browser", "args": {"url": "https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/home" } },
|
||||
{ "caption": "Dart: Set Default User Browser", "command": "dart_show_user_browsers" },
|
||||
|
||||
{ "caption": "Preferences: Dart Settings - Default", "command": "dart_open_settings", "args": {"kind": "default"} },
|
||||
{ "caption": "Preferences: Dart Settings - User", "command": "dart_open_settings", "args": {"kind": "user"} },
|
||||
{ "caption": "Preferences: Dart Settings - File Type (User)", "command": "dart_open_settings", "args": {"kind": "user", "scope": "file_type"} },
|
||||
|
||||
{ "caption": "Dart: Run", "command": "dart_smart_run" },
|
||||
{ "caption": "Dart: Run (This File)", "command": "dart_smart_run", "args": {"force_update": true} },
|
||||
{ "caption": "Dart: Stop", "command": "dart_smart_run", "args": {"kill_only": true} },
|
||||
|
||||
{ "caption": "Dart: Run In Observatory (This File)", "command": "dart_run_in_observatory" },
|
||||
|
||||
{ "caption": "Dart: Show Output Panel", "command": "show_panel", "args": {"panel": "output.dart.out"} },
|
||||
{ "caption": "Dart: Show Errors Panel", "command": "show_panel", "args": {"panel": "output.dart.errors"} },
|
||||
|
||||
{ "caption": "Dart: Format", "command": "dart_format" },
|
||||
|
||||
{ "caption": "Dart: Generate Documentation", "command": "dart_generate_docs" },
|
||||
{ "caption": "Dart: Serve Documentation", "command": "dart_serve_docs" },
|
||||
|
||||
{ "caption": "Dart: Stagehand", "command": "dart_stagehand_wizard" },
|
||||
|
||||
{ "caption": "Dart: Pub Get", "command": "dart_pub_get" }
|
||||
]
|
||||
40
samples/Sublime Text Config/Dart.sublime-project
Normal file
40
samples/Sublime Text Config/Dart.sublime-project
Normal file
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"folders":
|
||||
[
|
||||
{
|
||||
"follow_symlinks": true,
|
||||
"path": "."
|
||||
}
|
||||
],
|
||||
|
||||
"SublimeLinter":
|
||||
{
|
||||
"@python": 3.4
|
||||
},
|
||||
|
||||
"build_systems":
|
||||
[
|
||||
{
|
||||
"name": "Run",
|
||||
"shell_cmd": "\"$project_path/scripts/build.sh\"",
|
||||
"windows":
|
||||
{
|
||||
"shell_cmd": "powershell -noninteractive -file \"$project_path\\build.ps1\""
|
||||
},
|
||||
"working_dir": "${project_path}",
|
||||
|
||||
"variants": [
|
||||
{
|
||||
"name": "Dart: Test (All)",
|
||||
"target": "run_dart_tests",
|
||||
},
|
||||
|
||||
{
|
||||
"name": "Dart: Test (This File Only)",
|
||||
"target": "run_dart_tests",
|
||||
"active_file_only": true
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
[
|
||||
{
|
||||
"button": "button1", "count": 1, "modifiers": ["alt"],
|
||||
"press_command": "drag_select",
|
||||
"command": "robot_go_to_keyword"
|
||||
}
|
||||
]
|
||||
6
samples/Sublime Text Config/Default.sublime-keymap
Normal file
6
samples/Sublime Text Config/Default.sublime-keymap
Normal file
@@ -0,0 +1,6 @@
|
||||
[
|
||||
// Disable auto-pair for single quote
|
||||
{ "keys": ["'"], "command": "insert_snippet", "args": {"contents": "'"}, "context":
|
||||
[{ "key": "selector", "operator": "equal", "operand": "source.rust" }]
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,6 @@
|
||||
[
|
||||
{"command": "move_to", "args": {"to": "hardeol"}},
|
||||
{"command": "insert", "args": {"characters": "\n"}},
|
||||
{"command": "insert", "args": {"characters": "*"}},
|
||||
{"command": "insert", "args": {"characters": " "}}
|
||||
]
|
||||
5
samples/Sublime Text Config/RunBuild.sublime-macro
Normal file
5
samples/Sublime Text Config/RunBuild.sublime-macro
Normal file
@@ -0,0 +1,5 @@
|
||||
[
|
||||
{
|
||||
"command": "haxe_run_build"
|
||||
}
|
||||
]
|
||||
19
samples/Sublime Text Config/SourcePawn.sublime-build
Normal file
19
samples/Sublime Text Config/SourcePawn.sublime-build
Normal file
@@ -0,0 +1,19 @@
|
||||
{
|
||||
// For default sourcemod scripting directory :
|
||||
"cmd": ["<spcomp_path>", "-o$file_path/../plugins/$file_name", "$file"],
|
||||
|
||||
// For custom sourcemod scripting directory :
|
||||
"cmd": ["<spcomp_path>", "-i<include_path>", "-o$file_path/$file_base_name.smx", "$file"],
|
||||
|
||||
// Windows example:
|
||||
"cmd": ["X:/somefolder/spcomp", "-iX:/somefolder", "-o$file_path/$file_base_name.smx", "$file"],
|
||||
"cmd": ["X:/game/csgo/addons/sourcemod/scripting/spcomp", "-o$file_path/../plugins/$file_name", "$file"],
|
||||
|
||||
// Linux or OSX example:
|
||||
"cmd": ["/home/User/sm/spcomp", "-i/home/User/sm/include", "-o$file_path/$file_base_name.smx", "$file"],
|
||||
"cmd": ["/home/User/game/csgo/addons/sourcemod/scripting/spcomp", "-o$file_path/../plugins/$file_name", "$file"],
|
||||
|
||||
|
||||
"file_regex": "(.*)\\((\\d+)\\) :",
|
||||
"selector": "source.sp"
|
||||
}
|
||||
861
samples/Sublime Text Config/Tubnil.sublime-theme
Normal file
861
samples/Sublime Text Config/Tubnil.sublime-theme
Normal file
@@ -0,0 +1,861 @@
|
||||
[
|
||||
// Tubnil theme for Sublime Text 2
|
||||
// https://github.com/nilium/st2-nil-theme
|
||||
//
|
||||
// TABS
|
||||
// ==========================================================
|
||||
// - Tabset
|
||||
// ------------------------------------------------------
|
||||
{
|
||||
"class": "tabset_control",
|
||||
"layer0.texture": "SourcePawn/assets/tabset-bg.png",
|
||||
"layer0.inner_margin": [2, 6],
|
||||
"layer0.opacity": 1.0,
|
||||
"content_margin": [-13, 0, -13,-6], // left, top, right, bottom
|
||||
"tab_overlap": 25,
|
||||
"tab_width": 150,
|
||||
"tab_min_width": 50,
|
||||
"tab_height": 35,
|
||||
"mouse_wheel_switch": false
|
||||
},
|
||||
{
|
||||
"class": "tabset_control",
|
||||
"settings": ["mouse_wheel_switches_tabs"],
|
||||
"mouse_wheel_switch": true
|
||||
},
|
||||
|
||||
// - Tab element
|
||||
// ------------------------------------------------------
|
||||
{
|
||||
"class": "tab_control",
|
||||
"content_margin": [25, 0, 25, 0],
|
||||
"max_margin_trim": 0,
|
||||
"hit_test_level": 0.5,
|
||||
|
||||
// - Inactive tab settings
|
||||
"layer0.texture": "SourcePawn/assets/tab-inactive.png",
|
||||
"layer0.inner_margin": [23, 8],
|
||||
"layer0.opacity": 1.0,
|
||||
|
||||
// - Active tab setting
|
||||
"layer1.texture": "SourcePawn/assets/tab-active.png",
|
||||
"layer1.inner_margin": [23, 8],
|
||||
"layer1.opacity": 0.0,
|
||||
|
||||
// - Hover tab setting
|
||||
"layer2.texture": "SourcePawn/assets/tab-hover.png",
|
||||
"layer2.inner_margin": [23, 8],
|
||||
"layer2.opacity": 0.0
|
||||
},
|
||||
{
|
||||
// - Tab close state
|
||||
"class": "tab_control",
|
||||
"settings": ["show_tab_close_buttons"],
|
||||
"content_margin": [20, 0, 20, 7]
|
||||
},
|
||||
{
|
||||
// - Hover tab state
|
||||
"class": "tab_control",
|
||||
"attributes": ["hover"],
|
||||
"layer2.opacity": 1.0
|
||||
},
|
||||
{
|
||||
// - Active tab state
|
||||
"class": "tab_control",
|
||||
"attributes": ["selected"],
|
||||
"layer0.opacity": 0.0,
|
||||
"layer1.opacity": 1.0,
|
||||
"layer2.opacity": 0.0
|
||||
},
|
||||
{
|
||||
// - Modified tab state
|
||||
"class": "tab_control",
|
||||
//"settings": ["highlight_modified_tabs"],
|
||||
"attributes": ["dirty"],
|
||||
"layer0.texture": "SourcePawn/assets/tab-inactive-modified.png",
|
||||
"layer1.texture": "SourcePawn/assets/tab-active-modified.png",
|
||||
"layer2.texture": "SourcePawn/assets/tab-hover-dirty.png"
|
||||
},
|
||||
|
||||
// - Tab labels
|
||||
// ------------------------------------------------------
|
||||
|
||||
// - Inactive tab label
|
||||
{
|
||||
"class": "tab_label",
|
||||
"fg": [180, 180, 180],
|
||||
"shadow_color": [0, 0, 0, 200],
|
||||
"shadow_offset": [0, 1]
|
||||
},
|
||||
|
||||
// - Active tab label
|
||||
{
|
||||
"class": "tab_label",
|
||||
"parents": [{"class": "tab_control", "attributes": ["selected"]}],
|
||||
"shadow_color": [0, 0, 0, 165],
|
||||
"shadow_offset": [0, 1],
|
||||
"fg": [240, 240, 240, 255]
|
||||
},
|
||||
|
||||
// - Hover tab label
|
||||
{
|
||||
"class": "tab_label",
|
||||
"parents": [{"class": "tab_control", "attributes": ["hover"]}],
|
||||
"shadow_color": [0, 0, 0, 165],
|
||||
"shadow_offset": [0, 1],
|
||||
"fg": [2, 196, 251, 255]
|
||||
},
|
||||
|
||||
// - Dirty Hover tab label
|
||||
{
|
||||
"class": "tab_label",
|
||||
"parents": [{"class": "tab_control", "attributes": ["hover", "dirty"]}],
|
||||
"shadow_color": [0, 0, 0, 165],
|
||||
"shadow_offset": [0, 1],
|
||||
"fg": [253, 113, 1, 255]
|
||||
},
|
||||
|
||||
// - Dirty inactive tab label
|
||||
{
|
||||
"class": "tab_label",
|
||||
"parents": [{"class": "tab_control", "attributes": ["dirty"]}],
|
||||
"settings": ["highlight_modified_tabs"]
|
||||
},
|
||||
|
||||
// - Dirty active tab label
|
||||
{
|
||||
"class": "tab_label",
|
||||
"parents": [{"class": "tab_control", "attributes": ["selected", "dirty"]}],
|
||||
"settings": ["highlight_modified_tabs"]
|
||||
},
|
||||
|
||||
// - Tab buttons
|
||||
// ------------------------------------------------------
|
||||
|
||||
// - Tab button
|
||||
{
|
||||
"class": "tab_close_button",
|
||||
"content_margin": [0, 0],
|
||||
|
||||
// - Tab close default settings
|
||||
"layer1.texture": "SourcePawn/assets/tab-button-close.png",
|
||||
"layer1.opacity": 0.0, // hide by default
|
||||
"layer1.inner_margin": 0.0,
|
||||
|
||||
// - Tab close hover settings
|
||||
"layer0.texture": "SourcePawn/assets/tab-button-close-hover.png",
|
||||
"layer0.opacity": 0.0
|
||||
},
|
||||
{
|
||||
// - Tab button size
|
||||
"class": "tab_close_button",
|
||||
"settings": ["show_tab_close_buttons"],
|
||||
"content_margin": [8, 8]
|
||||
},
|
||||
{
|
||||
"class": "tab_close_button",
|
||||
"parents": [{"class": "tab_control", "attributes": ["dirty"]}],
|
||||
"layer1.texture": "SourcePawn/assets/tab-button-close-dirty.png"
|
||||
},
|
||||
{
|
||||
// - Tab close hover action
|
||||
"class": "tab_close_button",
|
||||
"parents": [{"class": "tab_control", "attributes": ["hover"]}],
|
||||
"layer1.opacity": 0.0,
|
||||
"layer0.opacity": 1.0
|
||||
},
|
||||
{
|
||||
// - Tab close press action
|
||||
"class": "tab_close_button",
|
||||
"attributes": ["hover"],
|
||||
"layer1.opacity": 0.4,
|
||||
"layer0.opacity": 1.0
|
||||
},
|
||||
{
|
||||
// - Tab close press action
|
||||
"class": "tab_close_button",
|
||||
"attributes": ["pressed"],
|
||||
"layer1.opacity": 1.0,
|
||||
"layer0.opacity": 0.0
|
||||
},
|
||||
|
||||
// FOLD BUTTONS
|
||||
// ==========================================================
|
||||
|
||||
{
|
||||
"class": "fold_button_control",
|
||||
"layer0.texture": "SourcePawn/assets/arrow-right.png",
|
||||
"layer0.opacity": 1.0,
|
||||
"layer0.inner_margin": 0,
|
||||
"layer1.texture": "SourcePawn/assets/arrow-right-hover.png",
|
||||
"layer1.opacity": 0.0,
|
||||
"layer1.inner_margin": 0,
|
||||
"content_margin": [9, 7, 8, 6]
|
||||
},
|
||||
{
|
||||
"class": "fold_button_control",
|
||||
"attributes": ["hover"],
|
||||
"layer0.opacity": 0.0,
|
||||
"layer1.opacity": 0.75
|
||||
},
|
||||
{
|
||||
"class": "fold_button_control",
|
||||
"attributes": ["pressed"],
|
||||
"layer0.opacity": 0.0,
|
||||
"layer1.opacity": 1.0
|
||||
},
|
||||
{
|
||||
"class": "fold_button_control",
|
||||
"attributes": ["expanded"],
|
||||
"layer0.texture": "SourcePawn/assets/arrow-down.png",
|
||||
"layer1.texture": "SourcePawn/assets/arrow-down-hover.png"
|
||||
},
|
||||
|
||||
// SCROLLBARS (overlay scrollbars from Default theme)
|
||||
// ==========================================================
|
||||
{
|
||||
"class": "scroll_bar_control",
|
||||
"layer0.texture": "SourcePawn/assets/scrollbar/well-vertical.png",
|
||||
"layer0.opacity": 1.0,
|
||||
"layer0.inner_margin": [1, 1],
|
||||
"blur": false
|
||||
},
|
||||
{
|
||||
"class": "scroll_bar_control",
|
||||
"attributes": ["horizontal"],
|
||||
"layer0.texture": "SourcePawn/assets/scrollbar/well-horizontal.png",
|
||||
"layer0.opacity": 1.0,
|
||||
"layer0.inner_margin": [1, 1],
|
||||
"blur": false
|
||||
},
|
||||
{
|
||||
"class": "scroll_corner_control",
|
||||
"layer0.texture": "SourcePawn/assets/scrollbar/well-corner.png",
|
||||
"layer0.opacity": 1.0,
|
||||
"layer0.inner_margin": [1, 1]
|
||||
},
|
||||
{
|
||||
"class": "puck_control",
|
||||
"layer0.texture": "SourcePawn/assets/scrollbar/bar-vertical.png",
|
||||
"layer0.opacity": 1.0,
|
||||
"layer0.inner_margin": [3, 3],
|
||||
"content_margin": [6, 6],
|
||||
"blur": false
|
||||
},
|
||||
{
|
||||
"class": "puck_control",
|
||||
"attributes": ["horizontal"],
|
||||
"layer0.texture": "SourcePawn/assets/scrollbar/bar-horizontal.png"
|
||||
},
|
||||
{
|
||||
"class": "scroll_area_control",
|
||||
"settings": ["overlay_scroll_bars"],
|
||||
"overlay": true
|
||||
},
|
||||
{
|
||||
"class": "scroll_area_control",
|
||||
"settings": ["!overlay_scroll_bars"],
|
||||
"overlay": false
|
||||
},
|
||||
{
|
||||
"class": "scroll_bar_control",
|
||||
"settings": ["overlay_scroll_bars"],
|
||||
"layer0.texture": "SourcePawn/assets/overlay/overlay_bar_vertical.png",
|
||||
"layer0.inner_margin": [0, 5],
|
||||
"blur": true
|
||||
},
|
||||
{
|
||||
"class": "scroll_bar_control",
|
||||
"settings": ["overlay_scroll_bars"],
|
||||
"attributes": ["horizontal"],
|
||||
"layer0.texture": "SourcePawn/assets/overlay/overlay_bar_horizontal.png",
|
||||
"layer0.inner_margin": [5, 0],
|
||||
"blur": true
|
||||
},
|
||||
{
|
||||
"class": "puck_control",
|
||||
"settings": ["overlay_scroll_bars"],
|
||||
"layer0.texture": "SourcePawn/assets/overlay/overlay_thumb_vertical.png",
|
||||
"layer0.inner_margin": [0, 5],
|
||||
"content_margin": [5, 20],
|
||||
"blur": true
|
||||
},
|
||||
{
|
||||
"class": "puck_control",
|
||||
"settings": ["overlay_scroll_bars"],
|
||||
"attributes": ["horizontal"],
|
||||
"layer0.texture": "SourcePawn/assets/overlay/overlay_thumb_horizontal.png",
|
||||
"layer0.inner_margin": [5, 0],
|
||||
"content_margin": [20, 5],
|
||||
"blur": true
|
||||
},
|
||||
{
|
||||
"class": "puck_control",
|
||||
"settings": ["overlay_scroll_bars"],
|
||||
"attributes": ["dark"],
|
||||
"layer0.texture": "SourcePawn/assets/overlay/overlay_dark_thumb_vertical.png"
|
||||
},
|
||||
{
|
||||
"class": "puck_control",
|
||||
"settings": ["overlay_scroll_bars"],
|
||||
"attributes": ["horizontal", "dark"],
|
||||
"layer0.texture": "SourcePawn/assets/overlay/overlay_dark_thumb_horizontal.png"
|
||||
},
|
||||
|
||||
// EMPTY WINDOW BACKGROUND
|
||||
// ==========================================================
|
||||
{
|
||||
"class": "sheet_container_control",
|
||||
"layer0.tint": [16, 16, 16],
|
||||
"layer0.opacity": 1.0
|
||||
},
|
||||
|
||||
// GRID LAYOUT
|
||||
// ==========================================================
|
||||
{
|
||||
"class": "grid_layout_control",
|
||||
"border_size": 1,
|
||||
"border_color": [32, 32, 32]
|
||||
},
|
||||
|
||||
// MINI MAP
|
||||
// ==========================================================
|
||||
{
|
||||
"class": "minimap_control",
|
||||
"viewport_color": [185, 185, 185, 50]
|
||||
},
|
||||
|
||||
// LABELS
|
||||
// ==========================================================
|
||||
// - General labels
|
||||
{
|
||||
"class": "label_control",
|
||||
"color": [230, 230, 230]
|
||||
},
|
||||
// - Text field labels
|
||||
{
|
||||
"class": "label_control",
|
||||
"parents": [{"class": "panel_control"}],
|
||||
"shadow_color": [0, 0, 0],
|
||||
"shadow_offset": [0, 1]
|
||||
},
|
||||
// - Button labels
|
||||
{
|
||||
"class": "label_control",
|
||||
"parents": [{"class": "button_control"}],
|
||||
"color": [230, 230, 230],
|
||||
"shadow_color": [0, 0, 0],
|
||||
"shadow_offset": [0, 1]
|
||||
},
|
||||
|
||||
// TOOLTIP
|
||||
// ==========================================================
|
||||
// - Tooltip container
|
||||
{
|
||||
"class": "tool_tip_control",
|
||||
"layer0.texture": "SourcePawn/assets/tooltip.png",
|
||||
"layer0.inner_margin": [4, 4],
|
||||
"layer0.opacity": 1,
|
||||
"content_margin": [6, 4]
|
||||
},
|
||||
// - Tooltip content
|
||||
{
|
||||
"class": "tool_tip_label_control",
|
||||
"color": [160, 160, 160],
|
||||
"shadow_offset": [0, 1],
|
||||
"shadow_color": [0, 0, 0, 255]
|
||||
},
|
||||
|
||||
// STATUS BAR
|
||||
// ==========================================================
|
||||
// - Status bar container
|
||||
{
|
||||
"class": "status_bar",
|
||||
"layer0.texture": "SourcePawn/assets/status-bar-bg.png",
|
||||
"layer0.opacity": 1,
|
||||
"layer0.inner_margin": [2, 2],
|
||||
"content_margin": [6, 5, 6, 5]
|
||||
},
|
||||
{
|
||||
"class": "status_button",
|
||||
"min_size": [100, 0]
|
||||
},
|
||||
|
||||
// - Status bar label
|
||||
{
|
||||
"class": "label_control",
|
||||
"parents": [{"class": "status_bar"}],
|
||||
"font.size": 10,
|
||||
"color": [160, 160, 160],
|
||||
"shadow_color": [0, 0, 0],
|
||||
"shadow_offset": [0, 1]
|
||||
},
|
||||
|
||||
// SIDEBAR
|
||||
// ==========================================================
|
||||
// - Sidebar container (border)
|
||||
{
|
||||
"class": "sidebar_container",
|
||||
"layer0.tint": [150, 150, 150],
|
||||
"layer0.opacity": 0.5,
|
||||
"layer0.draw_center": false,
|
||||
"layer0.inner_margin": [0, 0, 1, 0],
|
||||
"content_margin": [0, 0, 1, 0]
|
||||
},
|
||||
// - Sidebar tree (bg)
|
||||
{
|
||||
"class": "sidebar_tree",
|
||||
"row_padding": [8, 3],
|
||||
"indent": 15,
|
||||
"indent_offset": 13,
|
||||
"indent_top_level": false,
|
||||
"layer0.tint": [19, 20, 21], // darker gray
|
||||
"layer0.opacity": 1.0,
|
||||
"dark_content": true
|
||||
},
|
||||
// - Sidebar rows
|
||||
{
|
||||
"class": "tree_row",
|
||||
"layer0.texture": "SourcePawn/assets/row-active.png",
|
||||
"layer0.opacity": 0.0,
|
||||
"layer0.inner_margin": [8, 3],
|
||||
"layer1.opacity": 0.0,
|
||||
"layer1.inner_margin": [8, 3]
|
||||
},
|
||||
// - Sidebar row selected
|
||||
{
|
||||
"class": "tree_row",
|
||||
"attributes": ["selected"],
|
||||
"layer0.opacity": 1.0
|
||||
},
|
||||
// - Sidebar row dirty
|
||||
{
|
||||
"class": "tree_row",
|
||||
"attributes": ["dirty"],
|
||||
"layer0.texture": "SourcePawn/assets/row-inactive-modified.png",
|
||||
"layer0.opacity": 1.0
|
||||
},
|
||||
// - Sidebar row selected dirty
|
||||
{
|
||||
"class": "tree_row",
|
||||
"attributes": ["selected", "dirty"],
|
||||
"layer0.texture": "SourcePawn/assets/row-active-modified.png",
|
||||
"layer0.opacity": 1.0
|
||||
},
|
||||
// - Sidebar heading
|
||||
{
|
||||
"class": "sidebar_heading",
|
||||
"color": [2, 196, 251],
|
||||
"font.bold": true,
|
||||
"shadow_color": [0, 0, 0],
|
||||
"shadow_offset": [0, 1]
|
||||
},
|
||||
{
|
||||
"class": "sidebar_heading",
|
||||
"parents": [{"class": "tree_row", "attributes": ["selected"]}],
|
||||
"color": [180, 180, 180]
|
||||
},
|
||||
// - Sidebar entry label
|
||||
{
|
||||
"class": "sidebar_label",
|
||||
"color": [200, 200, 200],
|
||||
"shadow_color": [0, 0, 0],
|
||||
"shadow_offset": [0, 1]
|
||||
},
|
||||
{
|
||||
"class": "sidebar_label",
|
||||
"parents": [{"class": "tree_row", "attributes": ["expandable"]}],
|
||||
"settings": ["bold_folder_labels"],
|
||||
"font.bold": true
|
||||
},
|
||||
{ // Sidebar selected entry label
|
||||
"class": "sidebar_label",
|
||||
"parents": [{"class": "tree_row", "attributes": ["selected"]}],
|
||||
"color": [240, 240, 240],
|
||||
"shadow_color": [0, 0, 0],
|
||||
"shadow_offset": [0, 1]
|
||||
},
|
||||
{ // Sidebar Hover entry label
|
||||
"class": "sidebar_label",
|
||||
"parents": [{"class": "tree_row", "attributes": ["hover"]}],
|
||||
"color": [2, 196, 251],
|
||||
"shadow_color": [0, 0, 0],
|
||||
"shadow_offset": [0, 1]
|
||||
},
|
||||
{ // Sidebar Hover entry label
|
||||
"class": "sidebar_label",
|
||||
"parents": [{"class": "tree_row", "attributes": ["dirty"]}],
|
||||
"color": [253, 113, 1],
|
||||
"shadow_color": [0, 0, 0],
|
||||
"shadow_offset": [0, 1]
|
||||
},
|
||||
|
||||
// - Sidebar open files close/dirty
|
||||
{
|
||||
"class": "close_button",
|
||||
"layer0.texture": "SourcePawn/assets/tab-button-close-hover.png",
|
||||
"layer0.opacity": 0.5,
|
||||
"layer0.inner_margin": 4,
|
||||
"layer1.opacity": 0.0,
|
||||
"layer1.texture": "SourcePawn/assets/tab-button-close.png",
|
||||
"layer1.inner_margin": 4,
|
||||
"content_margin": [8, 8]
|
||||
},
|
||||
{
|
||||
"class": "close_button",
|
||||
"attributes": ["dirty"],
|
||||
"layer0.texture": "SourcePawn/assets/tab-button-dirty.png",
|
||||
"layer0.opacity": 0.5
|
||||
},
|
||||
{
|
||||
"class": "close_button",
|
||||
"attributes": ["hover"],
|
||||
"layer0.texture": "SourcePawn/assets/tab-button-close-hover.png",
|
||||
"layer1.opacity": 0.5,
|
||||
"layer1.texture": "SourcePawn/assets/tab-button-close.png"
|
||||
},
|
||||
{
|
||||
"class": "close_button",
|
||||
"attributes": ["hover", "dirty"],
|
||||
"layer1.opacity": 0.5,
|
||||
"layer1.texture": "SourcePawn/assets/tab-button-close-dirty.png"
|
||||
},
|
||||
{
|
||||
"class": "close_button",
|
||||
"attributes": ["pressed"],
|
||||
"layer1.opacity": 1.0,
|
||||
"layer1.texture": "SourcePawn/assets/tab-button-close.png"
|
||||
},
|
||||
{
|
||||
"class": "close_button",
|
||||
"attributes": ["pressed", "dirty"],
|
||||
"layer1.opacity": 1.0,
|
||||
"layer1.texture": "SourcePawn/assets/tab-button-close-dirty.png"
|
||||
},
|
||||
|
||||
// - Sidebar FOLDERS closed
|
||||
{
|
||||
"class": "disclosure_button_control",
|
||||
"content_margin": [9, 7, 8, 6],
|
||||
"layer0.texture": "SourcePawn/assets/folder/group-closed.png",
|
||||
"layer0.opacity": 1.0,
|
||||
"layer0.inner_margin": 0
|
||||
},
|
||||
{
|
||||
"class": "disclosure_button_control",
|
||||
"parents": [{"class": "tree_row", "attributes": ["hover"]}],
|
||||
"layer0.texture": "SourcePawn/assets/folder/group-closed-hover.png"
|
||||
},
|
||||
{
|
||||
"class": "disclosure_button_control",
|
||||
"parents": [{"class": "tree_row", "attributes": ["selected"]}],
|
||||
"layer0.texture": "SourcePawn/assets/folder/group-closed-selected.png"
|
||||
},
|
||||
// - Sidebar Folders open
|
||||
{
|
||||
"class": "disclosure_button_control",
|
||||
"attributes": ["expanded"],
|
||||
"layer0.texture": "SourcePawn/assets/folder/group-open.png"
|
||||
},
|
||||
{
|
||||
"class": "disclosure_button_control",
|
||||
"attributes": ["expanded"],
|
||||
"parents": [{"class": "tree_row", "attributes": ["hover"]}],
|
||||
"layer0.texture": "SourcePawn/assets/folder/group-open-hover.png"
|
||||
},
|
||||
{
|
||||
"class": "disclosure_button_control",
|
||||
"attributes": ["expanded"],
|
||||
"parents": [{"class": "tree_row", "attributes": ["selected"]}],
|
||||
"layer0.texture": "SourcePawn/assets/folder/group-open-selected.png"
|
||||
},
|
||||
|
||||
// STANDARD TEXT BUTTONS
|
||||
// =========================================================
|
||||
// - Standard buttons (used for Find / Replace panel)
|
||||
{
|
||||
"class": "button_control",
|
||||
"content_margin": [6, 5, 6, 6],
|
||||
"min_size": [75, 0],
|
||||
|
||||
// Default button state
|
||||
"layer0.texture": "SourcePawn/assets/btn-large.png",
|
||||
"layer0.opacity": 1.0,
|
||||
"layer0.inner_margin": [6, 6],
|
||||
|
||||
// Pressed button setup
|
||||
"layer1.texture": "SourcePawn/assets/btn-large-active.png",
|
||||
"layer1.opacity": 0.0,
|
||||
"layer1.inner_margin": [6, 6]
|
||||
},
|
||||
{
|
||||
// Pressed button state
|
||||
"class": "button_control",
|
||||
"attributes": ["pressed"],
|
||||
"layer1.opacity": 1.0,
|
||||
"content_margin": [6, 6, 6, 6]
|
||||
},
|
||||
|
||||
// TEXT INPUT FIELD
|
||||
// =========================================================
|
||||
|
||||
// - Text input field item
|
||||
{
|
||||
"class": "text_line_control",
|
||||
"layer0.texture": "SourcePawn/assets/text-field.png",
|
||||
"layer0.opacity": 1.0,
|
||||
"layer0.inner_margin": [10, 10, 10, 10],
|
||||
"content_margin": [5, 5, 5, 5]
|
||||
},
|
||||
|
||||
// PANEL BACKGROUNDS
|
||||
// =========================================================
|
||||
// - Bottom panel background
|
||||
{
|
||||
"class": "panel_control",
|
||||
"layer0.texture": "SourcePawn/assets/panel-bg.png",
|
||||
"layer0.inner_margin": [4, 4, 4, 4],
|
||||
"layer0.opacity": 1.0
|
||||
},
|
||||
|
||||
// - Quick panel background
|
||||
{
|
||||
"class": "overlay_control",
|
||||
"layer0.texture": "SourcePawn/assets/overlay-bg.png",
|
||||
"layer0.inner_margin": [10, 5, 10, 20], // left, top, right, bottom
|
||||
"layer0.opacity": 1.0,
|
||||
"layer1.opacity": 0, // HIDDEN
|
||||
"content_margin": [11, 8, 11, 17]
|
||||
},
|
||||
|
||||
// QUICK PANEL
|
||||
// =========================================================
|
||||
{
|
||||
"class": "quick_panel",
|
||||
"row_padding": [4, 3],
|
||||
"layer0.tint": [45, 45, 45],
|
||||
"layer0.opacity": 1,
|
||||
"dark_content": true
|
||||
},
|
||||
{
|
||||
"class": "quick_panel_row",
|
||||
"layer0.texture": "SourcePawn/assets/qp-row.png",
|
||||
"layer0.opacity": 1.0,
|
||||
"layer0.inner_margin": [4, 4, 4, 4],
|
||||
"layer1.draw_center": true
|
||||
},
|
||||
{
|
||||
"class": "quick_panel_row",
|
||||
"attributes": ["selected"],
|
||||
"layer0.texture": "SourcePawn/assets/qp-row-selected.png"
|
||||
},
|
||||
{
|
||||
"class": "quick_panel_label",
|
||||
"fg": [190, 190, 190, 255],
|
||||
"match_fg": [166, 229, 255, 255],
|
||||
"bg": [71, 71, 71, 255],
|
||||
"selected_fg": [220, 220, 220, 255],
|
||||
"selected_match_fg": [2, 196, 251, 255],
|
||||
"selected_bg": [134, 134, 134, 255]
|
||||
},
|
||||
{
|
||||
"class": "quick_panel_path_label",
|
||||
"fg": [100, 100, 100, 255],
|
||||
"match_fg": [166, 229, 255, 255],
|
||||
"bg": [41, 41, 41, 255],
|
||||
"selected_fg": [120, 120, 120, 255],
|
||||
"selected_match_fg": [2, 196, 251, 255],
|
||||
"selected_bg": [24, 24, 24, 255]
|
||||
},
|
||||
{
|
||||
"class": "quick_panel_score_label",
|
||||
"fg": [90, 90, 90, 255],
|
||||
"bg": [41, 41, 41, 255],
|
||||
"selected_fg": [114, 114, 114, 255],
|
||||
"selected_bg": [24, 24, 24, 255]
|
||||
},
|
||||
|
||||
// MINI QUICK PANEL
|
||||
// =========================================================
|
||||
{
|
||||
"class": "mini_quick_panel_row",
|
||||
"layer0.texture": "SourcePawn/assets/qp-row.png",
|
||||
"layer0.inner_margin": [4, 4, 4, 4],
|
||||
"layer0.opacity": 1.0
|
||||
},
|
||||
{
|
||||
"class": "mini_quick_panel_row",
|
||||
"attributes": ["selected"],
|
||||
"layer0.texture": "SourcePawn/assets/qp-row-selected.png"
|
||||
},
|
||||
|
||||
// CODE COMPLETION DROPDOWN
|
||||
// =========================================================
|
||||
{
|
||||
"class": "popup_control",
|
||||
"content_margin": [0, 0]
|
||||
},
|
||||
{
|
||||
"class": "auto_complete",
|
||||
"row_padding": [2, 2],
|
||||
"layer0.tint": [30, 30, 30],
|
||||
"layer0.opacity": 1.0,
|
||||
"dark_content": true
|
||||
},
|
||||
{
|
||||
"class": "auto_complete_label",
|
||||
"fg": [140, 140, 140],
|
||||
"match_fg": [255, 255, 255],
|
||||
"bg": [26, 26, 26],
|
||||
"selected_fg": [255, 255, 255],
|
||||
"selected_match_fg": [255, 255, 255],
|
||||
"selected_bg": [86, 86, 86]
|
||||
},
|
||||
{
|
||||
"class": "table_row",
|
||||
"layer0.tint": [45, 45, 45],
|
||||
"layer0.opacity": 0.0,
|
||||
"layer0.inner_margin": [1, 1]
|
||||
},
|
||||
{
|
||||
"class": "table_row",
|
||||
"attributes": ["selected"],
|
||||
"layer0.opacity": 1.0
|
||||
},
|
||||
|
||||
// BOTTOM PANEL BUTTONS
|
||||
// ==========================================================
|
||||
{
|
||||
"class": "icon_button_control",
|
||||
"content_margin": [4, 4]
|
||||
},
|
||||
{
|
||||
"class": "icon_button_control",
|
||||
"attributes": ["pressed"]
|
||||
},
|
||||
// - Regex search button
|
||||
{
|
||||
"class": "icon_regex",
|
||||
"layer0.texture": "SourcePawn/assets/icons/regex-off.png",
|
||||
"layer0.opacity": 1.0,
|
||||
"content_margin": [9, 10]
|
||||
},
|
||||
{
|
||||
"class": "icon_regex",
|
||||
"parents": [{"class": "icon_button_control", "attributes": ["selected"]}],
|
||||
"layer0.texture": "SourcePawn/assets/icons/regex-on.png"
|
||||
},
|
||||
// - Case sensitive search button
|
||||
{
|
||||
"class": "icon_case",
|
||||
"layer0.texture": "SourcePawn/assets/icons/case-off.png",
|
||||
"layer0.opacity": 1.0,
|
||||
"content_margin": [9, 10]
|
||||
},
|
||||
{
|
||||
"class": "icon_case",
|
||||
"parents": [{"class": "icon_button_control", "attributes": ["selected"]}],
|
||||
"layer0.texture": "SourcePawn/assets/icons/case-on.png"
|
||||
},
|
||||
// - Match whole word search button
|
||||
{
|
||||
"class": "icon_whole_word",
|
||||
"layer0.texture": "SourcePawn/assets/icons/whole-word-off.png",
|
||||
"layer0.opacity": 1.0,
|
||||
"content_margin": [9, 10]
|
||||
},
|
||||
{
|
||||
"class": "icon_whole_word",
|
||||
"parents": [{"class": "icon_button_control", "attributes": ["selected"]}],
|
||||
"layer0.texture": "SourcePawn/assets/icons/whole-word-on.png"
|
||||
},
|
||||
// - Reverse search direction button
|
||||
{
|
||||
"class": "icon_reverse",
|
||||
"layer0.texture": "SourcePawn/assets/icons/reverse-off.png",
|
||||
"layer0.opacity": 1.0,
|
||||
"content_margin": [9, 10]
|
||||
},
|
||||
{
|
||||
"class": "icon_reverse",
|
||||
"parents": [{"class": "icon_button_control", "attributes": ["selected"]}],
|
||||
"layer0.texture": "SourcePawn/assets/icons/reverse-on.png"
|
||||
},
|
||||
// - Search wrap button
|
||||
{
|
||||
"class": "icon_wrap",
|
||||
"layer0.texture": "SourcePawn/assets/icons/wrap-off.png",
|
||||
"layer0.opacity": 1.0,
|
||||
"content_margin": [9, 10]
|
||||
},
|
||||
{
|
||||
"class": "icon_wrap",
|
||||
"parents": [{"class": "icon_button_control", "attributes": ["selected"]}],
|
||||
"layer0.texture": "SourcePawn/assets/icons/wrap-on.png"
|
||||
},
|
||||
// - Search in selection button
|
||||
{
|
||||
"class": "icon_in_selection",
|
||||
"layer0.texture": "SourcePawn/assets/icons/selection-off.png",
|
||||
"layer0.opacity": 1.0,
|
||||
"content_margin": [9, 10]
|
||||
},
|
||||
{
|
||||
"class": "icon_in_selection",
|
||||
"parents": [{"class": "icon_button_control", "attributes": ["selected"]}],
|
||||
"layer0.texture": "SourcePawn/assets/icons/selection-on.png"
|
||||
},
|
||||
// - Preserve case button
|
||||
{
|
||||
"class": "icon_preserve_case",
|
||||
"layer0.texture": "SourcePawn/assets/icons/preserve-case-off.png",
|
||||
"layer0.opacity": 1.0,
|
||||
"content_margin": [9, 10]
|
||||
},
|
||||
{
|
||||
"class": "icon_preserve_case",
|
||||
"parents": [{"class": "icon_button_control", "attributes": ["selected"]}],
|
||||
"layer0.texture": "SourcePawn/assets/icons/preserve-case-on.png"
|
||||
},
|
||||
// - Highlight results button
|
||||
{
|
||||
"class": "icon_highlight",
|
||||
"layer0.texture": "SourcePawn/assets/icons/highlight-off.png",
|
||||
"layer0.opacity": 1.0,
|
||||
"content_margin": [9, 10]
|
||||
},
|
||||
{
|
||||
"class": "icon_highlight",
|
||||
"parents": [{"class": "icon_button_control", "attributes": ["selected"]}],
|
||||
"layer0.texture": "SourcePawn/assets/icons/highlight-on.png"
|
||||
},
|
||||
|
||||
// BOTTOM PANEL ICONS (EXTENDED: FIND IN FILES)
|
||||
// =========================================================
|
||||
|
||||
// - Show search context button
|
||||
{
|
||||
"class": "icon_context",
|
||||
"layer0.texture": "SourcePawn/assets/icons/context-off.png",
|
||||
"layer0.opacity": 1.0,
|
||||
"content_margin": [9, 10]
|
||||
},
|
||||
{
|
||||
"class": "icon_context",
|
||||
"parents": [{"class": "icon_button_control", "attributes": ["selected"]}],
|
||||
"layer0.texture": "SourcePawn/assets/icons/context-on.png"
|
||||
},
|
||||
// - Use search buffer
|
||||
{
|
||||
"class": "icon_use_buffer",
|
||||
"layer0.texture": "SourcePawn/assets/icons/buffer-off.png",
|
||||
"layer0.opacity": 1.0,
|
||||
"content_margin": [9, 10]
|
||||
},
|
||||
{
|
||||
"class": "icon_use_buffer",
|
||||
"parents": [{"class": "icon_button_control", "attributes": ["selected"]}],
|
||||
"layer0.texture": "SourcePawn/assets/icons/buffer-on.png"
|
||||
}
|
||||
|
||||
]
|
||||
136
samples/Sublime Text Config/jade.sublime-completions
Normal file
136
samples/Sublime Text Config/jade.sublime-completions
Normal file
@@ -0,0 +1,136 @@
|
||||
{
|
||||
"scope": "entity.name.tag.jade",
|
||||
"completions":
|
||||
[
|
||||
"a",// Defines a hyperlink
|
||||
"abbr",// Defines an abbreviation
|
||||
"acronym",// Not supported in HTML5. Use <abbr> instead.
|
||||
//Defines an acronym
|
||||
"address",// Defines contact information for the author/owner of a document
|
||||
"applet",// Not supported in HTML5. Use <object> instead.
|
||||
//Defines an embedded applet
|
||||
"area",// Defines an area inside an image-map
|
||||
"article",// Defines an article
|
||||
"aside",// Defines content aside from the page content
|
||||
"audio",// Defines sound content
|
||||
"b",// Defines bold text
|
||||
"base",// Specifies the base URL/target for all relative URLs in a document
|
||||
"basefont",// Not supported in HTML5. Use CSS instead.
|
||||
//Specifies a default color, size, and font for all text in a document
|
||||
"bdi",// Isolates a part of text that might be formatted in a different direction from other text outside it
|
||||
"bdo",// Overrides the current text direction
|
||||
"big",// Not supported in HTML5. Use CSS instead.
|
||||
//Defines big text
|
||||
"blockquote",// Defines a section that is quoted from another source
|
||||
"body",// Defines the document's body
|
||||
"br",// Defines a single line break
|
||||
"button",// Defines a clickable button
|
||||
"canvas",// Used to draw graphics, on the fly, via scripting (usually JavaScript)
|
||||
"caption",// Defines a table caption
|
||||
"center",// Not supported in HTML5. Use CSS instead.
|
||||
//Defines centered text
|
||||
"cite",// Defines the title of a work
|
||||
"code",// Defines a piece of computer code
|
||||
"col",// Specifies column properties for each column within a <colgroup> element
|
||||
"colgroup",// Specifies a group of one or more columns in a table for formatting
|
||||
"command",// Defines a command button that a user can invoke
|
||||
"datalist",// Specifies a list of pre-defined options for input controls
|
||||
"dd",// Defines a description/value of a term in a description list
|
||||
"del",// Defines text that has been deleted from a document
|
||||
"details",// Defines additional details that the user can view or hide
|
||||
"dfn",// Defines a definition term
|
||||
"dialog",// Defines a dialog box or window
|
||||
"dir",// Not supported in HTML5. Use <ul> instead.
|
||||
//Defines a directory list
|
||||
"div",// Defines a section in a document
|
||||
"dl",// Defines a description list
|
||||
"dt",// Defines a term/name in a description list
|
||||
"em",// Defines emphasized text
|
||||
"embed",// Defines a container for an external (non-HTML) application
|
||||
"fieldset",// Groups related elements in a form
|
||||
"figcaption",// Defines a caption for a <figure> element
|
||||
"figure",// Specifies self-contained content
|
||||
"font",// Not supported in HTML5. Use CSS instead.
|
||||
//Defines font, color, and size for text
|
||||
"footer",// Defines a footer for a document or section
|
||||
"form",// Defines an HTML form for user input
|
||||
"frame",// Not supported in HTML5.
|
||||
//Defines a window (a frame) in a frameset
|
||||
"frameset",// Not supported in HTML5.
|
||||
//Defines a set of frames
|
||||
"h1",// to <h6> Defines HTML headings
|
||||
"head",// Defines information about the document
|
||||
"header",// Defines a header for a document or section
|
||||
"hgroup",// Groups heading elements
|
||||
"hr",// Defines a thematic change in the content
|
||||
"html",// Defines the root of an HTML document
|
||||
"i",// Defines a part of text in an alternate voice or mood
|
||||
"iframe",// Defines an inline frame
|
||||
"img",// Defines an image
|
||||
"input",// Defines an input control
|
||||
"ins",// Defines a text that has been inserted into a document
|
||||
"kbd",// Defines keyboard input
|
||||
"keygen",// Defines a key-pair generator field (for forms)
|
||||
"label",// Defines a label for an <input> element
|
||||
"legend",// Defines a caption for a <fieldset> element
|
||||
"li",// Defines a list item
|
||||
"link",// Defines the relationship between a document and an external resource (most used to link to style sheets)
|
||||
"main",// Specifies the main content of a document
|
||||
"map",// Defines a client-side image-map
|
||||
"mark",// Defines marked/highlighted text
|
||||
"menu",// Defines a list/menu of commands
|
||||
"meta",// Defines metadata about an HTML document
|
||||
"meter",// Defines a scalar measurement within a known range (a gauge)
|
||||
"nav",// Defines navigation links
|
||||
"noframes",// Not supported in HTML5.
|
||||
//Defines an alternate content for users that do not support frames
|
||||
"noscript",// Defines an alternate content for users that do not support client-side scripts
|
||||
"object",// Defines an embedded object
|
||||
"ol",// Defines an ordered list
|
||||
"optgroup",// Defines a group of related options in a drop-down list
|
||||
"option",// Defines an option in a drop-down list
|
||||
"output",// Defines the result of a calculation
|
||||
"p",// Defines a paragraph
|
||||
"param",// Defines a parameter for an object
|
||||
"pre",// Defines preformatted text
|
||||
"progress",// Represents the progress of a task
|
||||
"q",// Defines a short quotation
|
||||
"rp",// Defines what to show in browsers that do not support ruby annotations
|
||||
"rt",// Defines an explanation/pronunciation of characters (for East Asian typography)
|
||||
"ruby",// Defines a ruby annotation (for East Asian typography)
|
||||
"s",// Defines text that is no longer correct
|
||||
"samp",// Defines sample output from a computer program
|
||||
"script",// Defines a client-side script
|
||||
"section",// Defines a section in a document
|
||||
"select",// Defines a drop-down list
|
||||
"small",// Defines smaller text
|
||||
"source",// Defines multiple media resources for media elements (<video> and <audio>)
|
||||
"span",// Defines a section in a document
|
||||
"strike",// Not supported in HTML5. Use <del> instead.
|
||||
//Defines strikethrough text
|
||||
"strong",// Defines important text
|
||||
"style",// Defines style information for a document
|
||||
"sub",// Defines subscripted text
|
||||
"summary",// Defines a visible heading for a <details> element
|
||||
"sup",// Defines superscripted text
|
||||
"table",// Defines a table
|
||||
"tbody",// Groups the body content in a table
|
||||
"td",// Defines a cell in a table
|
||||
"textarea",// Defines a multiline input control (text area)
|
||||
"tfoot",// Groups the footer content in a table
|
||||
"th",// Defines a header cell in a table
|
||||
"thead",// Groups the header content in a table
|
||||
"time",// Defines a date/time
|
||||
"title",// Defines a title for the document
|
||||
"tr",// Defines a row in a table
|
||||
"track",// Defines text tracks for media elements (<video> and <audio>)
|
||||
"tt",// Not supported in HTML5. Use CSS instead.
|
||||
//Defines teletype text
|
||||
"u",// Defines text that should be stylistically different from normal text
|
||||
"ul",// Defines an unordered list
|
||||
"var",// Defines a variable
|
||||
"video",// Defines a video or movie
|
||||
"wbr"
|
||||
]
|
||||
}
|
||||
|
||||
63
samples/TI Program/srcalpha.8xp.txt
Normal file
63
samples/TI Program/srcalpha.8xp.txt
Normal file
@@ -0,0 +1,63 @@
|
||||
.AlphaCS
|
||||
#ExprOff
|
||||
If getKey(41)
|
||||
sub(ADM)
|
||||
End
|
||||
Lbl START
|
||||
"appv alpha "->Str1
|
||||
"appvAlphaCS"->Str2
|
||||
.ALPHA CS
|
||||
[7EFFFFE7FFFFE7E7]->Pic11
|
||||
[E0E0E0E0E0FFFF7F]->Pic12
|
||||
[FEFFE7FFFEE0E0E0]->Pic13
|
||||
[E7E7E7FFFFE7E7E7]->Pic14
|
||||
[7EFFFFE7FFFFE7E7]->Pic15
|
||||
[7FFFFFE0E0FFFF7F]->Pic16
|
||||
[7FFFFF781EFFFFFE]->Pic17
|
||||
.arch
|
||||
[0038447C44440000]->Pic21
|
||||
.hide
|
||||
[0054004400540000]->Pic22
|
||||
.lock
|
||||
[0038447C7C7C0000]->Pic23
|
||||
.(c) Scott Mangiapane
|
||||
Data(72,8)->GDB0
|
||||
[42600A360008000100994DDF2A6C61B1B28091294A22AAAAAAAB005A6DCA226A69B9A9800000000000202000000000000000C0200000000000000000000000000000000000000000]
|
||||
.icon unknown
|
||||
Data(16,16)->GDB11
|
||||
[EFFEA803EB8308032BFB28032BFB0803EBFBA803EBFB08032B8328032FFF07FF]
|
||||
.icon SRC
|
||||
Data(16,16)->GDB12
|
||||
[01801A583E7C3FFC3FFC3E7C1A580A500240FFFFC471BDAFCC6FF5AF8DB1FFFF]
|
||||
.icon ASM
|
||||
Data(16,16)->GDB13
|
||||
[FFFFFFFFFFFFFFFFFFFFCE6BB5D586D5B75DB4DDFFFFFFFFFFFFFFFFFFFFFFFF]
|
||||
.icon shell
|
||||
Data(16,16)->GDB14
|
||||
[FFFFFFFFFFFFFFFFFFFFFFFF97B5B155D5359595FFFFFFFFFFFFFFFFFFFFFFFF]
|
||||
Goto SET
|
||||
prgmSRCFUNC
|
||||
prgmSRCGUI
|
||||
prgmSRCSORT
|
||||
Lbl SET
|
||||
.start, set up
|
||||
ClrDraw
|
||||
StoreGDB
|
||||
DiagnosticOff
|
||||
Fix 5
|
||||
Full
|
||||
!If GetCalc(Str1,[Y1])
|
||||
sub(NEW)
|
||||
StoreGDB
|
||||
End
|
||||
GetCalc(Str1,[Y1])
|
||||
If {[Y1]+0}
|
||||
!If sub(CODE)
|
||||
Goto END
|
||||
End
|
||||
End
|
||||
Asm(FDCB249E)
|
||||
If {[Y1]+6}
|
||||
Asm(FDCB24DE)
|
||||
End
|
||||
Goto DLIST
|
||||
194
samples/TI Program/srcfunc.8xp.txt
Normal file
194
samples/TI Program/srcfunc.8xp.txt
Normal file
@@ -0,0 +1,194 @@
|
||||
.FUNC AlphaCS
|
||||
Lbl ADM
|
||||
DiagnosticOff
|
||||
Fix 5
|
||||
Full
|
||||
StoreGDB
|
||||
sub(D2,13,17,70,29,"Admin Access")
|
||||
sub(D1,15,27)
|
||||
Text(15,37,"Admin Code: - - - -")
|
||||
DispGraph
|
||||
Repeat getKey->A
|
||||
End
|
||||
Text(55,37,"*")
|
||||
DispGraph
|
||||
Repeat getKey->B
|
||||
End
|
||||
Text(62,37,"*")
|
||||
DispGraph
|
||||
Repeat getKey->C
|
||||
End
|
||||
Text(69,37,"*")
|
||||
DispGraph
|
||||
Repeat getKey->D
|
||||
End
|
||||
Text(76,37,"*")
|
||||
DispGraph
|
||||
Normal
|
||||
Pause 100
|
||||
Full
|
||||
If (A!=20) or (B!=35) or (C!=18) or (D!=27)
|
||||
Goto END
|
||||
End
|
||||
sub(D2,13,17,70,29,"Author Info")
|
||||
sub(D1,15,27)
|
||||
Bitmap(15,38,GDB0)
|
||||
DispGraph
|
||||
Repeat (getKey) and (getKey(9))
|
||||
End
|
||||
DelVar "appv alpha "
|
||||
Return
|
||||
Lbl D1
|
||||
.draws title
|
||||
Pt-On([r1]+1,[r2]+1,Pic11)
|
||||
Pt-On([r1]+10,[r2]+1,Pic12)
|
||||
Pt-On([r1]+19,[r2]+1,Pic13)
|
||||
Pt-On([r1]+28,[r2]+1,Pic14)
|
||||
Pt-On([r1]+37,[r2]+1,Pic15)
|
||||
Pt-On([r1]+48,[r2]+1,Pic16)
|
||||
Pt-On([r1]+57,[r2]+1,Pic17)
|
||||
RectI([r1],[r2],66,10)
|
||||
Pxl-Off([r1],[r2])
|
||||
RectI([r1]+14,[r2],4,5)
|
||||
RectI([r1]+23,[r2]+7,4,3)
|
||||
RectI([r1]+46,[r2]+1,1,8)
|
||||
RectI([r1]+45,[r2],3,1)
|
||||
RectI([r1]+46,[r2]+9,2,1)
|
||||
Pxl-Off([r1]+65,[r2]+9)
|
||||
Return
|
||||
Lbl D2
|
||||
.windows
|
||||
Rect([r1]+1,[r2],[r3]-2,[r4])
|
||||
Rect([r1],[r2]+1,[r3],[r4]-2)
|
||||
RectI([r1]+1,[r2]+1,[r3]-2,[r4]-2)
|
||||
Text([r1]+2,[r2]+2,[r5])
|
||||
RectI([r1]+1,[r2]+1,[r3]-2,8)
|
||||
Pt-Off([r1]+[r3]-9,[r2]+1,[C1BEAAB6AABEC1FF])
|
||||
Pxl-On([r1]+1,[r2]+[r4]-2)
|
||||
Pxl-On([r1]+[r3]-2,[r2]+[r4]-2)
|
||||
Return
|
||||
Lbl D3
|
||||
.archiving box
|
||||
sub(D2,15,22,66,20,"Archiving...")
|
||||
Text(17,31,"Please wait...")
|
||||
Return
|
||||
Lbl CODE
|
||||
sub(D2,15,22,66,20,"Access Denied")
|
||||
Text(29,32," - - - - ")
|
||||
DispGraph
|
||||
1->[r2]
|
||||
Repeat getKey->[r1]
|
||||
End
|
||||
Text(29,32,"*")
|
||||
DispGraph
|
||||
If [r1]!=({[Y1]+1})
|
||||
0->[r2]
|
||||
End
|
||||
Repeat getKey->[r1]
|
||||
End
|
||||
Text(39,32,"*")
|
||||
DispGraph
|
||||
If [r1]!=({[Y1]+2})
|
||||
0->[r2]
|
||||
End
|
||||
Repeat getKey->[r1]
|
||||
End
|
||||
Text(49,32,"*")
|
||||
DispGraph
|
||||
If [r1]!=({[Y1]+3})
|
||||
0->[r2]
|
||||
End
|
||||
Repeat getKey->[r1]
|
||||
End
|
||||
Text(59,32,"*")
|
||||
DispGraph
|
||||
If [r1]!=({[Y1]+4})
|
||||
0->[r2]
|
||||
End
|
||||
Normal
|
||||
Pause 200
|
||||
Full
|
||||
Return[r2]
|
||||
Lbl NEW
|
||||
ClrDraw
|
||||
sub(D1,0,0)
|
||||
RectI(0,11,96,1)
|
||||
Text(1,12,"Installation")
|
||||
Text(1,20,"Enter your new keycode:")
|
||||
Text(1,26," - - - - ")
|
||||
DispGraph
|
||||
GetCalc(Str1,16)->[r1]
|
||||
Fill([r1],16,1)
|
||||
0->{[r1]}
|
||||
Repeat getKey->[r2]
|
||||
End
|
||||
[r2]->{[r1]+1}
|
||||
Text(1,26,"*")
|
||||
DispGraph
|
||||
Repeat getKey->[r2]
|
||||
End
|
||||
[r2]->{[r1]+2}
|
||||
Text(7,26,"*")
|
||||
DispGraph
|
||||
Repeat getKey->[r2]
|
||||
End
|
||||
[r2]->{[r1]+3}
|
||||
Text(13,26,"*")
|
||||
DispGraph
|
||||
Repeat getKey->[r2]
|
||||
End
|
||||
[r2]->{[r1]+4}
|
||||
Text(19,26,"*")
|
||||
DispGraph
|
||||
Fill(L1,50,0)
|
||||
Text(1,34,"Confirm keycode:")
|
||||
Text(1,40," - - - - ")
|
||||
DispGraph
|
||||
Repeat getKey->[r2]
|
||||
End
|
||||
[r2]->{L1+1}
|
||||
Text(1,40,"*")
|
||||
DispGraph
|
||||
Repeat getKey->[r2]
|
||||
End
|
||||
[r2]->{L1+2}
|
||||
Text(7,40,"*")
|
||||
DispGraph
|
||||
Repeat getKey->[r2]
|
||||
End
|
||||
[r2]->{L1+3}
|
||||
Text(13,40,"*")
|
||||
DispGraph
|
||||
Repeat getKey->[r2]
|
||||
End
|
||||
[r2]->{L1+4}
|
||||
Text(19,40,"*")
|
||||
DispGraph
|
||||
If ({[r1]+1}={L1+1}) and ({[r1]+2}={L1+2}) and ({[r1]+3}={L1+3}) and ({[r1]+4}={L1+4})
|
||||
sub(D3)
|
||||
DispGraph
|
||||
GetCalc(Str2,10)
|
||||
Archive Str1
|
||||
GetCalc(Str1,[Y1])
|
||||
ClrDraw
|
||||
Return
|
||||
Else
|
||||
Text(1,48,"ERROR keycodes do not")
|
||||
Text(1,54,"match.")
|
||||
DispGraph
|
||||
UnArchive Str1
|
||||
DelVar Str1
|
||||
Repeat getKey
|
||||
End
|
||||
Goto END
|
||||
End
|
||||
Return
|
||||
Lbl END
|
||||
Asm(FDCB249E)
|
||||
If {[Y1]+6}
|
||||
Asm(FDCB24DE)
|
||||
End
|
||||
ClrDraw
|
||||
ClrDraw^^r
|
||||
ClrHome
|
||||
Return^^r
|
||||
563
samples/TI Program/srcgui.8xp.txt
Normal file
563
samples/TI Program/srcgui.8xp.txt
Normal file
@@ -0,0 +1,563 @@
|
||||
.GUI AlphaCS
|
||||
#Axiom(RUNPRGM)
|
||||
#Axiom(ZSTAXE)
|
||||
Lbl DLIST
|
||||
ClrDraw
|
||||
ClrDraw^^r
|
||||
sub(D1,0,0)
|
||||
RectI(0,11,96,1)
|
||||
!If sub(POLAR,1)
|
||||
RectI(0,63,96,1)
|
||||
Text(1,13,"No programs found.")
|
||||
DispGraph
|
||||
Goto KLIST2
|
||||
Else
|
||||
Fill(L5,50,0)
|
||||
Copy(L1,L5,20)
|
||||
13->B->G
|
||||
0->I
|
||||
1->H
|
||||
Text(1,13,L2)
|
||||
If D
|
||||
Pt-On(77,13,Pic21)
|
||||
End
|
||||
If E
|
||||
Pt-On(83,13,Pic22)
|
||||
End
|
||||
If F
|
||||
Pt-On(89,13,Pic23)
|
||||
End
|
||||
For(S,1,6)
|
||||
If sub(ADJ,1)
|
||||
S*7+13->G
|
||||
Text(1,S*7+13,L2)
|
||||
If D
|
||||
Pt-On(77,S*7+13,Pic21)
|
||||
End
|
||||
If E
|
||||
Pt-On(83,S*7+13,Pic22)
|
||||
End
|
||||
If F
|
||||
Pt-On(89,S*7+13,Pic23)
|
||||
End
|
||||
End
|
||||
End
|
||||
End
|
||||
Fill(L4,50,0)
|
||||
Copy(L1,L4,20)
|
||||
Lbl KLIST1
|
||||
Rect(90,0,6,10)
|
||||
RectI(90,0,6,10)
|
||||
0->S->T
|
||||
sub(POLAR,1)
|
||||
If Equ>String(L1,L5)
|
||||
S++
|
||||
End
|
||||
sub(POLAR,0)
|
||||
If Equ>String(L1,L4)
|
||||
T++
|
||||
End
|
||||
If (S) and (T)
|
||||
Pt-On(90,6,[F870200000000000])
|
||||
Pt-On(90,2,[2070F80000000000])
|
||||
Else
|
||||
If S
|
||||
Pt-On(90,4,[2070F80000000000])
|
||||
End
|
||||
If T
|
||||
Pt-On(90,4,[F870200000000000])
|
||||
End
|
||||
End
|
||||
RectI(0,63,96,1)
|
||||
RectI(0,B,96,7)
|
||||
DispGraph
|
||||
RectI(0,B,96,7)
|
||||
RectI(0,63,96,1)
|
||||
If getKey(15)
|
||||
Goto DLIST
|
||||
End
|
||||
Repeat getKey
|
||||
If getKey(41)
|
||||
Repeat getKey(41)=0
|
||||
End
|
||||
Asm(3E01D303FB76)
|
||||
Repeat getKey(41)=0
|
||||
End
|
||||
End
|
||||
End
|
||||
If getKey(48)
|
||||
Goto DSET1
|
||||
End
|
||||
If (getKey(9)) or (getKey(54))
|
||||
Fill(L1,50,0)
|
||||
Copy(L5,L1,20)
|
||||
If (B-13/7)=0
|
||||
Fill(L1,50,0)
|
||||
Copy(L5+1,L1,20)
|
||||
sub(DATA)
|
||||
Else
|
||||
For(B-13/7)
|
||||
sub(ADJ,1)
|
||||
End
|
||||
End
|
||||
Goto DPRGM1
|
||||
End
|
||||
If getKey(4)
|
||||
If (B!=13)
|
||||
For(S,0,7)
|
||||
RectI(0,63,96,1)
|
||||
RectI(0,B-S,96,7)
|
||||
DispGraph
|
||||
RectI(0,B-S,96,7)
|
||||
RectI(0,63,96,1)
|
||||
End
|
||||
B-7->B
|
||||
Else
|
||||
sub(POLAR,1)
|
||||
If Equ>String(L1,L5)
|
||||
Fill(L1,50,0)
|
||||
Copy(L4,L1,20)
|
||||
sub(ADJ,0)
|
||||
Fill(L4,50,0)
|
||||
Copy(L1,L4,20)
|
||||
Fill(L1,50,0)
|
||||
Copy(L5,L1,20)
|
||||
sub(ADJ,0)
|
||||
Fill(L5,50,0)
|
||||
Copy(L1,L5,20)
|
||||
Fill(L1,50,0)
|
||||
Copy(L4,L1,20)
|
||||
Rect(0,0,96,13)
|
||||
RectI(0,0,96,13)
|
||||
For(7)
|
||||
Vertical+
|
||||
End
|
||||
Rect(0,62,96,2)
|
||||
RectI(0,62,96,2)
|
||||
Text(1,13,L2)
|
||||
If D
|
||||
Pt-On(77,13,Pic21)
|
||||
End
|
||||
If E
|
||||
Pt-On(83,13,Pic22)
|
||||
End
|
||||
If F
|
||||
Pt-On(89,13,Pic23)
|
||||
End
|
||||
Rect(0,0,96,13)
|
||||
RectI(0,0,96,13)
|
||||
sub(D1,0,0)
|
||||
RectI(0,11,96,1)
|
||||
End
|
||||
End
|
||||
End
|
||||
If getKey(1)
|
||||
If (B!=G)
|
||||
For(S,0,7)
|
||||
RectI(0,63,96,1)
|
||||
RectI(0,B+S,96,7)
|
||||
DispGraph
|
||||
RectI(0,B+S,96,7)
|
||||
RectI(0,63,96,1)
|
||||
End
|
||||
B+7->B
|
||||
Else
|
||||
sub(POLAR,0)
|
||||
If Equ>String(L1,L4)
|
||||
Fill(L1,50,0)
|
||||
Copy(L5,L1,20)
|
||||
sub(ADJ,1)
|
||||
Fill(L5,50,0)
|
||||
Copy(L1,L5,20)
|
||||
Fill(L1,50,0)
|
||||
Copy(L4,L1,20)
|
||||
sub(ADJ,1)
|
||||
Fill(L4,50,0)
|
||||
Copy(L1,L4,20)
|
||||
For(7)
|
||||
Vertical-
|
||||
End
|
||||
Text(1,55,L2)
|
||||
If D
|
||||
Pt-On(77,55,Pic21)
|
||||
End
|
||||
If E
|
||||
Pt-On(83,55,Pic22)
|
||||
End
|
||||
If F
|
||||
Pt-On(89,55,Pic23)
|
||||
End
|
||||
Rect(0,0,96,13)
|
||||
RectI(0,0,96,13)
|
||||
sub(D1,0,0)
|
||||
RectI(0,11,96,1)
|
||||
End
|
||||
End
|
||||
End
|
||||
If getKey(15)
|
||||
Goto END
|
||||
End
|
||||
Goto KLIST1
|
||||
Lbl KLIST2
|
||||
If getKey(15)
|
||||
Goto DLIST
|
||||
End
|
||||
Repeat getKey
|
||||
If getKey(41)
|
||||
Repeat getKey(41)=0
|
||||
End
|
||||
Asm(3E01D303FB76)
|
||||
Repeat getKey(41)=0
|
||||
End
|
||||
End
|
||||
End
|
||||
If getKey(48)
|
||||
Goto DSET1
|
||||
End
|
||||
If getKey(15)
|
||||
Goto END
|
||||
End
|
||||
Goto KLIST2
|
||||
Lbl DPRGM1
|
||||
GetCalc("appv alpha ",[Y1])
|
||||
13->B
|
||||
D->X
|
||||
E->Y
|
||||
F->Z
|
||||
Lbl DPRGM2
|
||||
GetCalc(L1,[Y3])
|
||||
0->H
|
||||
If ({[Y3]+0}=187) and ({[Y3]+1}=109)
|
||||
1->H
|
||||
If {[Y3]+2}=201
|
||||
2->H
|
||||
End
|
||||
If {[Y3]+3}=201
|
||||
3->H
|
||||
End
|
||||
End
|
||||
If {[Y3]+0}=58
|
||||
4->H
|
||||
End
|
||||
ClrDraw
|
||||
ClrDraw^^r
|
||||
sub(D1,0,0)
|
||||
RectI(0,11,96,1)
|
||||
Text(1,49,L2)
|
||||
RectI(0,48,96,16)
|
||||
69->S
|
||||
If Z
|
||||
Pt-Change(S,56,Pic23)
|
||||
S-6->S
|
||||
End
|
||||
If Y
|
||||
Pt-Change(S,56,Pic22)
|
||||
S-6->S
|
||||
End
|
||||
If X
|
||||
Pt-Change(S,56,Pic21)
|
||||
End
|
||||
RectI(1,56,94,7)
|
||||
Text(2,56,"size: ",{[Y3]-2}^^r>Dec)
|
||||
Text(1,13,"Run (with zStart)")
|
||||
If X
|
||||
Text(1,20,"Unarchive PRGM")
|
||||
Else
|
||||
Text(1,20,"Archive PRGM")
|
||||
End
|
||||
If Y
|
||||
Text(1,27,"Unhide PRGM")
|
||||
Else
|
||||
Text(1,27,"Hide PRGM")
|
||||
End
|
||||
If Z
|
||||
Text(1,34,"Unlock PRGM")
|
||||
Else
|
||||
Text(1,34,"Lock PRGM")
|
||||
End
|
||||
Rect(76,44,20,20)
|
||||
RectI(77,45,18,18)
|
||||
If H=0
|
||||
Bitmap(78,46,GDB11)
|
||||
End
|
||||
If H=1
|
||||
Bitmap(78,46,GDB13)
|
||||
End
|
||||
If H=2
|
||||
Bitmap(78,46,GDB14)
|
||||
End
|
||||
If H=3
|
||||
Bitmap(78,46,GDB14)
|
||||
End
|
||||
If H=4
|
||||
Bitmap(78,46,GDB12)
|
||||
End
|
||||
Lbl KPRGM
|
||||
RectI(0,B,96,7)
|
||||
DispGraph
|
||||
RectI(0,B,96,7)
|
||||
Repeat getKey
|
||||
End
|
||||
If (getKey(9)) or (getKey(54))
|
||||
If B=13
|
||||
sub(SETPRGM)
|
||||
Goto RUN
|
||||
Else
|
||||
Fill(L2,20,0)
|
||||
Copy(L1+1,L2,20)
|
||||
Fill(L1,20,0)
|
||||
Copy(L2,L1,20)
|
||||
sub(DATA)
|
||||
If B=20
|
||||
If X
|
||||
0->X
|
||||
Else
|
||||
1->X
|
||||
End
|
||||
Goto DPRGM2
|
||||
End
|
||||
If B=27
|
||||
If Y
|
||||
0->Y
|
||||
Else
|
||||
1->Y
|
||||
End
|
||||
Goto DPRGM2
|
||||
End
|
||||
If B=34
|
||||
If Z
|
||||
0->Z
|
||||
Else
|
||||
1->Z
|
||||
End
|
||||
Goto DPRGM2
|
||||
End
|
||||
End
|
||||
End
|
||||
If (getKey(4)) and (B!=13)
|
||||
For(S,0,7)
|
||||
RectI(0,B-S,96,7)
|
||||
DispGraph
|
||||
RectI(0,B-S,96,7)
|
||||
Normal
|
||||
Pause 3
|
||||
Full
|
||||
End
|
||||
B-7->B
|
||||
End
|
||||
If ((getKey(1)) and (B!=34)
|
||||
For(S,0,7)
|
||||
RectI(0,B+S,96,7)
|
||||
DispGraph
|
||||
RectI(0,B+S,96,7)
|
||||
Normal
|
||||
Pause 3
|
||||
Full
|
||||
End
|
||||
B+7->B
|
||||
End
|
||||
If getKey(15)
|
||||
sub(SETPRGM)
|
||||
Goto DLIST
|
||||
End
|
||||
Goto KPRGM
|
||||
Lbl SETPRGM
|
||||
If (X!=D) or (Y!=E) or (Z!=F)
|
||||
If X
|
||||
sub(D3)
|
||||
DispGraph
|
||||
End
|
||||
UnArchive L1
|
||||
X->D
|
||||
If (E!=Y)
|
||||
If Y
|
||||
{C-7}-64->{C-7}
|
||||
{L1+1}-64->{L1+1}
|
||||
Else
|
||||
{C-7}+64->{C-7}
|
||||
{L1+1}+64->{L1+1}
|
||||
End
|
||||
Y->E
|
||||
End
|
||||
If (F!=Z)
|
||||
If Z
|
||||
6->{C}
|
||||
|E06->{L1}
|
||||
Else
|
||||
5->{C}
|
||||
|E05->{L1}
|
||||
End
|
||||
Z->F
|
||||
End
|
||||
If X
|
||||
Archive L1
|
||||
End
|
||||
End
|
||||
GetCalc(L1,[Y3])
|
||||
Return
|
||||
Lbl RUN
|
||||
GetCalc("appv hold ",20)->S
|
||||
Fill(S,20,0)
|
||||
Copy(L1+1,S,10)
|
||||
A->{S+15}
|
||||
DiagnosticOn
|
||||
Fix 4
|
||||
Normal
|
||||
If D
|
||||
GetCalc("appvzRun",{[Y3]-2}^^r)->S
|
||||
Copy([Y3],S,{[Y3]-2}^^r)
|
||||
End
|
||||
2-SampZInt(|LRUNERR)
|
||||
If D
|
||||
Fpdf("appvzRun")
|
||||
Else
|
||||
Fpdf(L1)
|
||||
End
|
||||
2-SampTInt
|
||||
DelVar "appvzRun"
|
||||
GetCalc("appv hold ")->S
|
||||
Fill(L1,20,0)
|
||||
Copy(S,L1,10)
|
||||
{S+15}->A
|
||||
sub(DATA)
|
||||
DelVar "appv hold "
|
||||
DiagnosticOff
|
||||
Fix 5
|
||||
Full
|
||||
Repeat getKey=0
|
||||
End
|
||||
Goto DPRGM1
|
||||
Lbl RUNERR
|
||||
2-SampFTest ->S
|
||||
DelVar "appvzRun"
|
||||
DiagnosticOff
|
||||
Fix 5
|
||||
Full
|
||||
sub(D2,10,22,76,20,"Error")
|
||||
If S=8
|
||||
Text(12,31,"Syntax")
|
||||
Else
|
||||
Text(12,31,"Error "[23]"",S>Dec)
|
||||
End
|
||||
DispGraph
|
||||
Repeat (getKey) and (getKey(9))
|
||||
End
|
||||
GetCalc("appv hold ")->S
|
||||
Fill(L1,20,0)
|
||||
Copy(S,L1,10)
|
||||
{S+15}->A
|
||||
sub(DATA)
|
||||
DelVar "appv hold "
|
||||
DiagnosticOff
|
||||
Fix 5
|
||||
Full
|
||||
Repeat getKey=0
|
||||
End
|
||||
Goto DPRGM1
|
||||
Lbl DSET1
|
||||
21->B
|
||||
{[Y1]+5}->X
|
||||
{[Y1]}->Y
|
||||
{[Y1]+6}->Z
|
||||
Lbl DSET2
|
||||
ClrDraw
|
||||
sub(D1,0,0)
|
||||
RectI(0,11,96,1)
|
||||
Text(1,12,"by ClrDraw, Nov 2013, v 1")
|
||||
RectI(0,19,96,1)
|
||||
RectI(0,63,96,1)
|
||||
If X
|
||||
Text(1,21,"Show Hidden On")
|
||||
Else
|
||||
Text(1,21,"Show Hidden Off")
|
||||
End
|
||||
If Y
|
||||
Text(1,28,"Password On")
|
||||
Else
|
||||
Text(1,28,"Password Off")
|
||||
End
|
||||
If Z
|
||||
Text(1,35,"Lowercase On")
|
||||
Else
|
||||
Text(1,35,"Lowercase Off")
|
||||
End
|
||||
Text(1,42,"Uninstall AlphaCS")
|
||||
Lbl KSET
|
||||
RectI(0,B,96,7)
|
||||
DispGraph
|
||||
RectI(0,B,96,7)
|
||||
Repeat getKey
|
||||
End
|
||||
If (getKey(54)) or (getKey(9))
|
||||
If B=21
|
||||
If X
|
||||
0->X
|
||||
Else
|
||||
1->X
|
||||
End
|
||||
Goto DSET2
|
||||
End
|
||||
If B=28
|
||||
If Y
|
||||
0->Y
|
||||
Else
|
||||
1->Y
|
||||
End
|
||||
Goto DSET2
|
||||
End
|
||||
If B=35
|
||||
If Z
|
||||
0->Z
|
||||
Else
|
||||
1->Z
|
||||
End
|
||||
Goto DSET2
|
||||
End
|
||||
If B=42
|
||||
If sub(CODE)
|
||||
DelVar Str1
|
||||
Goto END
|
||||
Else
|
||||
Goto DSET2
|
||||
End
|
||||
End
|
||||
End
|
||||
If (getKey(4)) and (B!=21)
|
||||
For(7)
|
||||
RectI(0,B,96,7)
|
||||
DispGraph
|
||||
RectI(0,B,96,7)
|
||||
B--
|
||||
Normal
|
||||
Pause 3
|
||||
Full
|
||||
End
|
||||
End
|
||||
If (getKey(1)) and (B!=42)
|
||||
For(7)
|
||||
RectI(0,B,96,7)
|
||||
DispGraph
|
||||
RectI(0,B,96,7)
|
||||
B++
|
||||
Normal
|
||||
Pause 3
|
||||
Full
|
||||
End
|
||||
End
|
||||
If getKey(15)
|
||||
If ({[Y1]+5}!=X) or ({[Y1]}!=Y) or ({[Y1]+6}!=Z)
|
||||
UnArchive Str1
|
||||
GetCalc(Str1)->S
|
||||
X->{S+5}
|
||||
Y->{S}
|
||||
Z->{S+6}
|
||||
sub(D3)
|
||||
DispGraph
|
||||
Archive Str1
|
||||
GetCalc(Str1,[Y1])
|
||||
End
|
||||
Repeat getKey=0
|
||||
End
|
||||
Goto DLIST
|
||||
End
|
||||
Goto KSET
|
||||
138
samples/TI Program/srcsort.8xp.txt
Normal file
138
samples/TI Program/srcsort.8xp.txt
Normal file
@@ -0,0 +1,138 @@
|
||||
.SORT AlphaCS
|
||||
Lbl POLAR
|
||||
Fill(L1,50,0)
|
||||
{|E9830}^^r->[r2]
|
||||
Repeat (({[r2]}=5) or ({[r2]}=6)) and (({[r2]-7}>48) or (({[Y1]+5}) and ({[r2]-7}<28)))
|
||||
[r2]-{[r2]-6}-7->[r2]
|
||||
If [r2]<={|E982E}^^r
|
||||
Return0
|
||||
End
|
||||
End
|
||||
For([r3],1,{[r2]-6})
|
||||
{[r2]-6-[r3]}->{L1+[r3]-1}
|
||||
End
|
||||
[r2]-{[r2]-6}-7->[r2]
|
||||
Repeat 0
|
||||
If (({[r2]}=5) or ({[r2]}=6)) and (({[r2]-7}>48) or (({[Y1]+5}) and ({[r2]-7}<28)))
|
||||
Fill(L2,50,0)
|
||||
For([r3],1,{[r2]-6}
|
||||
{[r2]-6-[r3]}->{L2+[r3]-1
|
||||
End
|
||||
0->[r3]
|
||||
Repeat ({L1+[r3]}!={L2+[r3]}) or ([r3]=20)
|
||||
[r3]++
|
||||
End
|
||||
If (({L1+[r3]}>{L2+[r3]}) and ([r1]=1)) or (({L1+[r3]}<{L2+[r3]}) and ([r1]=0))
|
||||
Fill(L1,50,0)
|
||||
Copy(L2,L1,20)
|
||||
End
|
||||
Else
|
||||
If [r2]<{|E982E}^^r
|
||||
sub(DATA)
|
||||
Return1
|
||||
End
|
||||
End
|
||||
[r2]-{[r2]-6}-7->[r2]
|
||||
End
|
||||
Lbl ADJ
|
||||
Fill(L2,50,0)
|
||||
Copy(L1+1,L2,20)
|
||||
Fill(L1,50,0)
|
||||
Copy(L2,L1)
|
||||
Fill(L3,50,0)
|
||||
Copy(L1,L3,20)
|
||||
Fill(L1,50,0)
|
||||
{|E9830}^^r->[r2]
|
||||
sub(CHECK)
|
||||
Repeat (({[r2]}=5) or ({[r2]}=6)) and ([r4]) and (({[r2]-7}>48) or ({[r2]-7}<28))
|
||||
[r2]-{[r2]-6}-7->[r2]
|
||||
If [r2]<{|E982E}^^r
|
||||
Fill(L1,50,0)
|
||||
Copy(L3,L1,20)
|
||||
Fill(L3,50,0)
|
||||
sub(DATA)
|
||||
Return0
|
||||
End
|
||||
sub(CHECK)
|
||||
End
|
||||
For([r3],1,{[r2]-6})
|
||||
{[r2]-6-[r3]}->{L1+[r3]-1}
|
||||
End
|
||||
[r2]-{[r2]-6}-7->[r2]
|
||||
Repeat 0
|
||||
sub(CHECK)
|
||||
If (({[r2]}=5) or ({[r2]}=6)) and ([r4]) and (({[r2]-7}>48) or ({[r2]-7}<28))
|
||||
Fill(L2,50,0)
|
||||
For([r3],1,{[r2]-6}
|
||||
{[r2]-6-[r3]}->{L2+[r3]-1
|
||||
End
|
||||
0->[r3]
|
||||
Repeat ({L1+[r3]}!={L2+[r3]}) or ([r3]=20)
|
||||
[r3]++
|
||||
End
|
||||
If (({L1+[r3]}>{L2+[r3]}) and ([r1]=1)) or (({L1+[r3]}<{L2+[r3]}) and ([r1]=0))
|
||||
Fill(L1,50,0)
|
||||
Copy(L2,L1,20)
|
||||
End
|
||||
Else
|
||||
If [r2]<{|E982E}^^r
|
||||
sub(DATA)
|
||||
Return1
|
||||
End
|
||||
End
|
||||
[r2]-{[r2]-6}-7->[r2]
|
||||
End
|
||||
Lbl CHECK
|
||||
0->[r4]
|
||||
Repeat ({[r2]-7-[r4]}!={L3+[r4]}) or (([r4]>={[r2]-6}) and ({L3+[r4]}=0))
|
||||
[r4]++
|
||||
End
|
||||
If ((({[r2]-7-[r4]}<{L3+[r4]}) and ([r1]=1)) or (({[r2]-7-[r4]}>{L3+[r4]}) and ([r1]=0))) or (([r4]>={[r2]-6}) and ({L3+[r4]}=0))
|
||||
0->[r4]
|
||||
Else
|
||||
1->[r4]
|
||||
End
|
||||
Return
|
||||
Lbl DATA
|
||||
{|E9830}^^r->C
|
||||
Repeat 0
|
||||
Repeat ({C}=5) or ({C}=6) and (({[r1]-7}>48) or ({[r1]-7}<28))
|
||||
C-{C-6}-7->C
|
||||
End
|
||||
Fill(L2,50,0)
|
||||
For([r1],1,{C-6})
|
||||
{C-6-[r1]}->{L2+[r1]-1}
|
||||
End
|
||||
!If Equ>String(L1,L2)
|
||||
If {C-5}=0
|
||||
0->D
|
||||
Else
|
||||
1->D
|
||||
End
|
||||
If {C-7}<28
|
||||
1->E
|
||||
Else
|
||||
0->E
|
||||
End
|
||||
If {C}=6
|
||||
1->F
|
||||
Else
|
||||
0->F
|
||||
End
|
||||
Fill(L2,50,0)
|
||||
Copy(L1,L2,20)
|
||||
Fill(L1,50,0)
|
||||
Copy(L2,L1+1,20)
|
||||
If E
|
||||
{L2}+64->{L2}
|
||||
End
|
||||
If F
|
||||
|E06->{L1}
|
||||
Else
|
||||
|E05->{L1}
|
||||
End
|
||||
Return
|
||||
End
|
||||
C-{C-6}-7->C
|
||||
End
|
||||
Return
|
||||
96
script/add-grammar
Executable file
96
script/add-grammar
Executable file
@@ -0,0 +1,96 @@
|
||||
#!/usr/bin/env ruby
|
||||
|
||||
require "optparse"
|
||||
|
||||
ROOT = File.expand_path("../../", __FILE__)
|
||||
|
||||
|
||||
# Break a repository URL into its separate components
|
||||
def parse_url(input)
|
||||
hosts = "github\.com|bitbucket\.org|gitlab\.com"
|
||||
|
||||
# HTTPS/HTTP link pointing to recognised hosts
|
||||
if input =~ /^(?:https?:\/\/)?(?:[^.@]+@)?(?:www\.)?(#{hosts})\/([^\/]+)\/([^\/]+)/i
|
||||
{ host: $1.downcase(), user: $2, repo: $3.sub(/\.git$/, "") }
|
||||
# SSH
|
||||
elsif input =~ /^git@(#{hosts}):([^\/]+)\/([^\/]+)\.git$/i
|
||||
{ host: $1.downcase(), user: $2, repo: $3 }
|
||||
# provider:user/repo
|
||||
elsif input =~ /^(github|bitbucket|gitlab):\/?([^\/]+)\/([^\/]+)\/?$/i
|
||||
{ host: $1.downcase(), user: $2, repo: $3 }
|
||||
# user/repo - Common GitHub shorthand
|
||||
elsif input =~ /^\/?([^\/]+)\/([^\/]+)\/?$/
|
||||
{ host: "github.com", user: $1, repo: $2 }
|
||||
else
|
||||
raise "Unsupported URL: #{input}"
|
||||
end
|
||||
end
|
||||
|
||||
# Isolate the vendor-name component of a submodule path
|
||||
def parse_submodule(name)
|
||||
name =~ /^(?:.*(?:vendor\/)?grammars\/)?([^\/]+)/i
|
||||
path = "vendor/grammars/#{$1}"
|
||||
unless File.exist?("#{ROOT}/" + path)
|
||||
warn "Submodule '#{path}' does not exist. Aborting."
|
||||
exit 1
|
||||
end
|
||||
path
|
||||
end
|
||||
|
||||
# Print debugging feedback to STDOUT if running with --verbose
|
||||
def log(msg)
|
||||
puts msg if $verbose
|
||||
end
|
||||
|
||||
|
||||
usage = """Usage:
|
||||
#{$0} [-v|--verbose] [--replace grammar] url
|
||||
Examples:
|
||||
#{$0} https://github.com/Alhadis/language-roff
|
||||
#{$0} --replace sublime-apl https://github.com/Alhadis/language-apl
|
||||
"""
|
||||
|
||||
$replace = nil
|
||||
$verbose = false
|
||||
|
||||
OptionParser.new do |opts|
|
||||
opts.banner = usage
|
||||
opts.on("-v", "--verbose", "Print verbose feedback to STDOUT") do
|
||||
$verbose = true
|
||||
end
|
||||
opts.on("-rSUBMODULE", "--replace=SUBMODDULE", "Replace an existing grammar submodule.") do |name|
|
||||
$replace = name
|
||||
end
|
||||
end.parse!
|
||||
|
||||
|
||||
$url = ARGV[0]
|
||||
|
||||
# No URL? Print a usage message and bail.
|
||||
unless $url
|
||||
warn usage
|
||||
exit 1;
|
||||
end
|
||||
|
||||
# Ensure the given URL is an HTTPS link
|
||||
parts = parse_url $url
|
||||
https = "https://#{parts[:host]}/#{parts[:user]}/#{parts[:repo]}"
|
||||
repo_new = "vendor/grammars/#{parts[:repo]}"
|
||||
repo_old = parse_submodule($replace) if $replace
|
||||
|
||||
if repo_old
|
||||
log "Deregistering: #{repo_old}"
|
||||
`git submodule deinit #{repo_old}`
|
||||
`git rm -rf #{repo_old}`
|
||||
end
|
||||
|
||||
log "Registering new submodule: #{repo_new}"
|
||||
`git submodule add -f #{https} #{repo_new}`
|
||||
exit 1 if $?.exitstatus > 0
|
||||
`script/convert-grammars --add #{repo_new}`
|
||||
|
||||
log "Confirming license"
|
||||
`script/licensed --module "#{repo_new}"`
|
||||
|
||||
log "Updating grammar documentation in vendor/REAEDME.md"
|
||||
`script list-grammars`
|
||||
@@ -4,6 +4,7 @@
|
||||
|
||||
require "bundler/setup"
|
||||
require "licensed/cli"
|
||||
require "optparse"
|
||||
|
||||
module Licensed
|
||||
module Source
|
||||
@@ -32,7 +33,14 @@ module Licensed
|
||||
end
|
||||
end
|
||||
|
||||
source = Licensed::Source::Filesystem.new("vendor/grammars/*/", type: "grammar")
|
||||
module_path = nil
|
||||
OptionParser.new do |opts|
|
||||
opts.on("-mPATH", "--module=PATH", "Cache license file for specific grammar") do |p|
|
||||
module_path = p
|
||||
end
|
||||
end.parse!
|
||||
|
||||
source = Licensed::Source::Filesystem.new(module_path || "vendor/grammars/*/", type: "grammar")
|
||||
config = Licensed::Configuration.new
|
||||
config.sources << source
|
||||
|
||||
@@ -43,4 +51,5 @@ else
|
||||
end
|
||||
|
||||
command.run
|
||||
`git checkout -- vendor/licenses/grammar/` if module_path
|
||||
exit command.success?
|
||||
|
||||
101
script/list-grammars
Executable file
101
script/list-grammars
Executable file
@@ -0,0 +1,101 @@
|
||||
#!/usr/bin/env ruby
|
||||
|
||||
require "linguist"
|
||||
require "json"
|
||||
require "yaml"
|
||||
|
||||
class GrammarList
|
||||
|
||||
ROOT = File.expand_path "../../", __FILE__
|
||||
|
||||
def initialize
|
||||
@submodules = load_submodules()
|
||||
@sources = load_sources()
|
||||
@language_names = load_languages()
|
||||
end
|
||||
|
||||
# Load .gitmodules
|
||||
def load_submodules
|
||||
submodules = {}
|
||||
submodule_file = File.read("#{ROOT}/.gitmodules")
|
||||
pattern = /^\[submodule\s*"([^"]+)"\]$\n((?:^(?!\[).+(?:\n|$))+)/is
|
||||
submodule_file.scan(pattern) do |id, attr|
|
||||
submod = {}
|
||||
submod[:path] = $1 if attr =~ /^\s*path\s*=\s*(.+)$/
|
||||
submod[:url] = $1 if attr =~ /^\s*url\s*=\s*(.+)$/
|
||||
submod[:url].gsub!(/\.git$/, "")
|
||||
submod[:short] = shorten(submod[:url])
|
||||
submodules["#{id}"] = submod
|
||||
end
|
||||
submodules
|
||||
end
|
||||
|
||||
# Grab the name of each language, sorted case-insensitively
|
||||
def load_languages
|
||||
Linguist::Language.all.map(&:name).sort do |a, b|
|
||||
a.downcase() <=> b.downcase()
|
||||
end
|
||||
end
|
||||
|
||||
# Load grammars.yml
|
||||
def load_sources
|
||||
sources = {}
|
||||
grammars = YAML.load_file("#{ROOT}/grammars.yml")
|
||||
grammars.each do |path, scopes|
|
||||
scopes.each { |scope| sources[scope] = path }
|
||||
end
|
||||
sources
|
||||
end
|
||||
|
||||
# Shorten a repository URL
|
||||
def shorten(url)
|
||||
if url =~ /^https?:\/\/(?:www\.)?github\.com\/([^\/]+\/[^\/]+)/i
|
||||
$1
|
||||
elsif url =~ /^https?:\/\/(?:www\.)?(bitbucket|gitlab)\.(?:com|org)\/([^\/]+\/[^\/]+)/i
|
||||
"#{$1.downcase()}:#{$2}"
|
||||
else
|
||||
url.replace(/^https?:\/\/(?:www\.)?/i, "")
|
||||
end
|
||||
end
|
||||
|
||||
# Markdown: Generate grammar list
|
||||
def to_markdown
|
||||
markdown = ""
|
||||
@language_names.each do |item|
|
||||
lang = Linguist::Language["#{item}"]
|
||||
scope = lang.tm_scope
|
||||
next if scope == "none"
|
||||
path = @sources[scope] || scope
|
||||
case path
|
||||
when "https://bitbucket.org/Clams/sublimesystemverilog/get/default.tar.gz"
|
||||
short_url = "bitbucket:Clams/sublimesystemverilog"
|
||||
long_url = "https://bitbucket.org/Clams/sublimesystemverilog"
|
||||
when "http://svn.edgewall.org/repos/genshi/contrib/textmate/Genshi.tmbundle/Syntaxes/Markup%20Template%20%28XML%29.tmLanguage"
|
||||
short_url = "genshi.edgewall.org/query"
|
||||
long_url = "https://genshi.edgewall.org/query"
|
||||
when "vendor/grammars/oz-tmbundle/Syntaxes/Oz.tmLanguage"
|
||||
short_url = "eregon/oz-tmbundle"
|
||||
long_url = "https://github.com/eregon/oz-tmbundle"
|
||||
else
|
||||
submodule = @submodules[@sources[scope].chomp("/")]
|
||||
next unless submodule
|
||||
short_url = submodule[:short]
|
||||
long_url = submodule[:url]
|
||||
end
|
||||
markdown += "- **#{item}:** [#{short_url}](#{long_url})\n"
|
||||
end
|
||||
|
||||
markdown
|
||||
end
|
||||
|
||||
# Update the file displaying the reader-friendly list of grammar repos
|
||||
def update_readme
|
||||
readme = "#{ROOT}/vendor/README.md"
|
||||
preamble = File.read(readme).match(/\A.+?<!--.+?-->\n/ms)
|
||||
list = self.to_markdown
|
||||
File.write(readme, preamble.to_s + list)
|
||||
end
|
||||
end
|
||||
|
||||
list = GrammarList.new
|
||||
list.update_readme()
|
||||
3
test/fixtures/Data/Modelines/iamjs.pl
vendored
Normal file
3
test/fixtures/Data/Modelines/iamjs.pl
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
# vim: noexpandtab: ft=javascript
|
||||
|
||||
"It's JavaScript, baby";
|
||||
4
test/fixtures/Data/Modelines/iamjs2.pl
vendored
Normal file
4
test/fixtures/Data/Modelines/iamjs2.pl
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
# vim:noexpandtab titlestring=hi\|there\\\ ft=perl ts=4
|
||||
# vim:noexpandtab titlestring=hi|there\\ ft=javascript ts=4
|
||||
|
||||
"Still JavaScript, bruh";
|
||||
3
test/fixtures/Data/Modelines/ruby10
vendored
Normal file
3
test/fixtures/Data/Modelines/ruby10
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
ex: noexpandtab: ft=ruby
|
||||
|
||||
# Still Ruby
|
||||
3
test/fixtures/Data/Modelines/ruby11
vendored
Normal file
3
test/fixtures/Data/Modelines/ruby11
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
# vim600: ft=ruby
|
||||
|
||||
# Targets Vim 6.0 or later
|
||||
3
test/fixtures/Data/Modelines/ruby12
vendored
Normal file
3
test/fixtures/Data/Modelines/ruby12
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
vim<520: ft=ruby
|
||||
|
||||
# Targets Vim 5.20 and earlier
|
||||
3
test/fixtures/Data/Modelines/seeplusplusEmacs10
vendored
Normal file
3
test/fixtures/Data/Modelines/seeplusplusEmacs10
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
// -*- foo-bar mode: c++ -*-
|
||||
|
||||
"Malformed modeline, but still understood by Emacs to be C++."
|
||||
1
test/fixtures/Data/Modelines/seeplusplusEmacs11
vendored
Normal file
1
test/fixtures/Data/Modelines/seeplusplusEmacs11
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/* -*- mode: c++ -------*- */
|
||||
1
test/fixtures/Data/Modelines/seeplusplusEmacs12
vendored
Normal file
1
test/fixtures/Data/Modelines/seeplusplusEmacs12
vendored
Normal file
@@ -0,0 +1 @@
|
||||
-*--------- foo:bar mode: c++ -*-
|
||||
1
test/fixtures/go/food_vendor/candy.go
vendored
Normal file
1
test/fixtures/go/food_vendor/candy.go
vendored
Normal file
@@ -0,0 +1 @@
|
||||
// empty file for testing that paths with vendor in them don't get ingored
|
||||
@@ -35,3 +35,11 @@ def sample_blob_memory(name)
|
||||
content = File.read(filepath)
|
||||
Linguist::Blob.new(name, content)
|
||||
end
|
||||
|
||||
def silence_warnings
|
||||
original_verbosity = $VERBOSE
|
||||
$VERBOSE = nil
|
||||
yield
|
||||
ensure
|
||||
$VERBOSE = original_verbosity
|
||||
end
|
||||
|
||||
@@ -4,14 +4,18 @@ class TestBlob < Minitest::Test
|
||||
include Linguist
|
||||
|
||||
def setup
|
||||
# git blobs are normally loaded as ASCII-8BIT since they may contain data
|
||||
# with arbitrary encoding not known ahead of time
|
||||
@original_external = Encoding.default_external
|
||||
Encoding.default_external = Encoding.find("ASCII-8BIT")
|
||||
silence_warnings do
|
||||
# git blobs are normally loaded as ASCII-8BIT since they may contain data
|
||||
# with arbitrary encoding not known ahead of time
|
||||
@original_external = Encoding.default_external
|
||||
Encoding.default_external = Encoding.find("ASCII-8BIT")
|
||||
end
|
||||
end
|
||||
|
||||
def teardown
|
||||
Encoding.default_external = @original_external
|
||||
silence_warnings do
|
||||
Encoding.default_external = @original_external
|
||||
end
|
||||
end
|
||||
|
||||
def script_blob(name)
|
||||
@@ -212,6 +216,11 @@ class TestBlob < Minitest::Test
|
||||
# Generated by Zephir
|
||||
assert !sample_blob_memory("Zephir/Router.zep").generated?
|
||||
|
||||
# Go vendored dependencies
|
||||
refute sample_blob("vendor/vendor.json").generated?
|
||||
assert sample_blob("vendor/github.com/kr/s3/sign.go").generated?
|
||||
refute fixture_blob("go/food_vendor/candy.go").generated?
|
||||
|
||||
# Cython-generated C/C++
|
||||
assert sample_blob_memory("C/sgd_fast.c").generated?
|
||||
assert sample_blob_memory("C++/wrapper_inner.cpp").generated?
|
||||
|
||||
@@ -3,15 +3,27 @@ require_relative "./helper"
|
||||
class TestFileBlob < Minitest::Test
|
||||
include Linguist
|
||||
|
||||
def silence_warnings
|
||||
original_verbosity = $VERBOSE
|
||||
$VERBOSE = nil
|
||||
yield
|
||||
ensure
|
||||
$VERBOSE = original_verbosity
|
||||
end
|
||||
|
||||
def setup
|
||||
# git blobs are normally loaded as ASCII-8BIT since they may contain data
|
||||
# with arbitrary encoding not known ahead of time
|
||||
@original_external = Encoding.default_external
|
||||
Encoding.default_external = Encoding.find("ASCII-8BIT")
|
||||
silence_warnings do
|
||||
# git blobs are normally loaded as ASCII-8BIT since they may contain data
|
||||
# with arbitrary encoding not known ahead of time
|
||||
@original_external = Encoding.default_external
|
||||
Encoding.default_external = Encoding.find("ASCII-8BIT")
|
||||
end
|
||||
end
|
||||
|
||||
def teardown
|
||||
Encoding.default_external = @original_external
|
||||
silence_warnings do
|
||||
Encoding.default_external = @original_external
|
||||
end
|
||||
end
|
||||
|
||||
def script_blob(name)
|
||||
@@ -305,7 +317,7 @@ class TestFileBlob < Minitest::Test
|
||||
assert sample_blob("some/vendored/path/Chart.js").vendored?
|
||||
assert !sample_blob("some/vendored/path/chart.js").vendored?
|
||||
|
||||
# Codemirror deps
|
||||
# CodeMirror deps
|
||||
assert sample_blob("codemirror/mode/blah.js").vendored?
|
||||
assert sample_blob("codemirror/5.0/mode/blah.js").vendored?
|
||||
|
||||
|
||||
@@ -42,6 +42,11 @@ class TestGenerated < Minitest::Test
|
||||
generated_sample_without_loading_data("Dummy/foo.xcworkspacedata")
|
||||
generated_sample_without_loading_data("Dummy/foo.xcuserstate")
|
||||
|
||||
# Go-specific vendored paths
|
||||
generated_sample_without_loading_data("go/vendor/github.com/foo.go")
|
||||
generated_sample_without_loading_data("go/vendor/golang.org/src/foo.c")
|
||||
generated_sample_without_loading_data("go/vendor/gopkg.in/some/nested/path/foo.go")
|
||||
|
||||
# .NET designer file
|
||||
generated_sample_without_loading_data("Dummu/foo.designer.cs")
|
||||
|
||||
|
||||
@@ -5,9 +5,42 @@ class TestGrammars < Minitest::Test
|
||||
|
||||
# List of projects that are allowed without licenses
|
||||
PROJECT_WHITELIST = [
|
||||
# Dual MIT and GPL license
|
||||
"vendor/grammars/language-csharp",
|
||||
"vendor/grammars/sublimeassembly"
|
||||
"vendor/grammars/Sublime-Lasso",
|
||||
"vendor/grammars/ant.tmbundle",
|
||||
"vendor/grammars/sublime-spintools",
|
||||
"vendor/grammars/blitzmax"
|
||||
].freeze
|
||||
|
||||
HASH_WHITELIST = [
|
||||
"bc12b3b4917eab9aedb87ec1305c2a4376e34fd1", # TextMate bundles
|
||||
"16c4748566b3dd996594af0410a1875b22d3a2b3", # language-yaml and atom-salt
|
||||
"ebae2d87e06d3acef075d049fcfc8958c0364863", # go-tmbundle
|
||||
"ff21db2554d69d78b2220db5615b16bbba0788d3", # factor
|
||||
"b9a7428fd036eed8503995e06e989180c276b17d", # jflex.tmbundle
|
||||
"da39a3ee5e6b4b0d3255bfef95601890afd80709", # SCSS.tmbundle
|
||||
"5f772ff20ddf3dbac1ec9b6a98c5aa50ace555b2", # gradle.tmbundle
|
||||
"b5432a1e1055de7eeede2dddf91e009480651fd6", # jasmin-sublime
|
||||
"74143c4d2a5649eb179105afcb37f466558c22ce", # language-clojure
|
||||
"760471435f5ab0b9dc99a628203cd8f9156d28ce", # language-coffee-script
|
||||
"330e6d465e26bdd232aafcd3f5dba6a1d098a20e", # language-csharp
|
||||
"70fb557a431891c2d634c33fa7367feab5066fd6", # language-javascript
|
||||
"e0528c23cd967f999e058f1408ccb5b7237daaba", # language-python
|
||||
"8653305b358375d0fced85dc24793b99919b11ef", # language-shellscript
|
||||
"9f0c0b0926a18f5038e455e8df60221125fc3111", # elixir-tmbundle
|
||||
"90af581219debd4e90ef041b46c294e8b4ae6d14", # mako-tmbundle
|
||||
"b9b24778619dce325b651f0d77cbc72e7ae0b0a3", # Julia.tmbundle
|
||||
"e06722add999e7428048abcc067cd85f1f7ca71c", # r.tmbundle
|
||||
"50b14a0e3f03d7ca754dac42ffb33302b5882b78", # smalltalk-tmbundle
|
||||
"eafbc4a2f283752858e6908907f3c0c90188785b", # gap-tmbundle
|
||||
"1faa3a44cac6070f22384332434af37dfaaf2f70", # Stylus
|
||||
"c87e7e574fca543941650e5b0a144b44c02c55d8", # language-crystal
|
||||
"c78ec142ac3126cf639cfd67bd646ed8226d8b74", # atom-language-purescript
|
||||
"341d7f66806fc41d081133d6e51ade856352e056", # FreeMarker.tmbundle
|
||||
"15a394f6bc43400946570b299aee8ae264a1e3ff", # language-renpy
|
||||
"c9118c370411f2f049c746c0fd096554e877aea2", # perl6fe
|
||||
"8ccf886749c32fb7e65d4d1316a7ed0479c93dc9", # language-less
|
||||
"2f03492b52d7dd83b4e7472f01b87c6121e5b1a4", # monkey
|
||||
"bdab9fdc21e6790b479ccb5945b78bc0f6ce2493" # language-blade
|
||||
].freeze
|
||||
|
||||
# List of allowed SPDX license names
|
||||
@@ -87,12 +120,30 @@ class TestGrammars < Minitest::Test
|
||||
end
|
||||
|
||||
def test_submodules_have_approved_licenses
|
||||
unapproved = submodule_licenses.reject { |k,v| LICENSE_WHITELIST.include?(v) || PROJECT_WHITELIST.include?(k) }.map { |k,v| "#{k}: #{v}"}
|
||||
unapproved = submodule_licenses.reject { |k,v| LICENSE_WHITELIST.include?(v) ||
|
||||
PROJECT_WHITELIST.include?(k) ||
|
||||
HASH_WHITELIST.include?(v) }
|
||||
.map { |k,v| "#{k}: #{v}"}
|
||||
message = "The following submodules have unapproved licenses:\n* #{unapproved.join("\n* ")}\n"
|
||||
message << "The license must be added to the LICENSE_WHITELIST in /test/test_grammars.rb once approved."
|
||||
assert_equal [], unapproved, message
|
||||
end
|
||||
|
||||
def test_whitelisted_submodules_dont_have_licenses
|
||||
licensed = submodule_licenses.reject { |k,v| v.nil? }.select { |k,v| PROJECT_WHITELIST.include?(k) }
|
||||
message = "The following whitelisted submodules have a license:\n* #{licensed.keys.join("\n* ")}\n"
|
||||
message << "Please remove them from the project whitelist."
|
||||
assert_equal Hash.new, licensed, message
|
||||
end
|
||||
|
||||
def test_whitelisted_hashes_dont_have_licenses
|
||||
used_hashes = submodule_licenses.values.reject { |v| v.nil? || LICENSE_WHITELIST.include?(v) }
|
||||
unused_hashes = HASH_WHITELIST - used_hashes
|
||||
message = "The following whitelisted license hashes are unused:\n* #{unused_hashes.join("\n* ")}\n"
|
||||
message << "Please remove them from the hash whitelist."
|
||||
assert_equal Array.new, unused_hashes, message
|
||||
end
|
||||
|
||||
def test_submodules_whitelist_has_no_extra_entries
|
||||
skip("Need to work out how to handle dual-licensed entities")
|
||||
extra_whitelist_entries = PROJECT_WHITELIST - submodule_licenses.select { |k,v| v.nil? }.keys
|
||||
@@ -123,7 +174,7 @@ class TestGrammars < Minitest::Test
|
||||
private
|
||||
|
||||
def submodule_paths
|
||||
@submodule_paths ||= `git config --list --file "#{File.join(ROOT, ".gitmodules")}"`.lines.grep(/\.path=/).map { |line| line.chomp.split("=", 2).last }
|
||||
@submodule_paths ||= `git config --list --file "#{File.join(ROOT, ".gitmodules")}"`.lines.grep(/\.path=/).map { |line| line.chomp.split("=", 2).last }.reject { |path| path =~ /CodeMirror/ }
|
||||
end
|
||||
|
||||
# Returns a hash of submodules in the form of submodule_path => license
|
||||
@@ -136,51 +187,18 @@ class TestGrammars < Minitest::Test
|
||||
end
|
||||
|
||||
# Given the path to a submodule, return its SPDX-compliant license key
|
||||
# If the license is unrecognized, return its hash
|
||||
def submodule_license(submodule)
|
||||
# Prefer Licensee to detect a submodule's license
|
||||
project = Licensee::FSProject.new(submodule)
|
||||
project = Licensee::FSProject.new(submodule, detect_readme: true)
|
||||
return project.license.key if project.license
|
||||
|
||||
# We know a license file exists, but Licensee wasn't able to detect the license,
|
||||
# Let's try our own more permissive regex method
|
||||
# We know a license exists, but no method was able to recognize it.
|
||||
# We return the license hash in this case, to uniquely identify it.
|
||||
if project.license_file
|
||||
path = File.expand_path project.license_file.path, submodule
|
||||
license = classify_license(path)
|
||||
return license if license
|
||||
end
|
||||
|
||||
# Neither Licensee nor our own regex was able to detect the license, let's check the readme
|
||||
files = Dir[File.join(ROOT, submodule, "*")]
|
||||
if readme = files.find { |path| File.basename(path) =~ /\Areadme\b/i }
|
||||
classify_license(readme)
|
||||
end
|
||||
end
|
||||
|
||||
def classify_license(path)
|
||||
content = File.read(path)
|
||||
return unless content =~ /\blicen[cs]e\b/i
|
||||
if content.include?("Apache License") && content.include?("2.0")
|
||||
"apache-2.0"
|
||||
elsif content.include?("GNU") && content =~ /general/i && content =~ /public/i
|
||||
if content =~ /version 2/i
|
||||
"gpl-2.0"
|
||||
elsif content =~ /version 3/i
|
||||
"gpl-3.0"
|
||||
end
|
||||
elsif content.include?("GPL") && content.include?("http://www.gnu.org/licenses/gpl.html")
|
||||
"gpl-3.0"
|
||||
elsif content.include?("Creative Commons Attribution-Share Alike 3.0")
|
||||
"cc-by-sa-3.0"
|
||||
elsif content.include?("tidy-license.txt") || content.include?("If not otherwise specified (see below)") || content.include?("Permission to copy, use, modify, sell and distribute this")
|
||||
"textmate"
|
||||
elsif content.include?("Permission is hereby granted") || content =~ /\bMIT\b/
|
||||
"mit"
|
||||
elsif content.include?("This package is provided as-is and is placed in the Public Domain")
|
||||
"public"
|
||||
elsif content.include?("http://www.wtfpl.net/txt/copying/")
|
||||
"wtfpl"
|
||||
elsif content.include?("zlib") && content.include?("license") && content.include?("2. Altered source versions must be plainly marked as such")
|
||||
"zlib"
|
||||
return project.license_file.hash
|
||||
elsif project.readme
|
||||
return project.readme.hash
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -29,7 +29,11 @@ class TestHeuristcs < Minitest::Test
|
||||
hash.each do |language, blobs|
|
||||
Array(blobs).each do |blob|
|
||||
result = Heuristics.call(file_blob(blob), candidates)
|
||||
assert_equal [Language[language]], result, "Failed for #{blob}"
|
||||
if language.nil?
|
||||
assert_equal [], result, "Failed for #{blob}"
|
||||
else
|
||||
assert_equal [Language[language]], result, "Failed for #{blob}"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -122,9 +126,12 @@ class TestHeuristcs < Minitest::Test
|
||||
})
|
||||
end
|
||||
|
||||
# Candidate languages = ["Assembly", "C++", "HTML", "PAWN", "PHP",
|
||||
# "POV-Ray SDL", "Pascal", "SQL", "SourcePawn"]
|
||||
def test_inc_by_heuristics
|
||||
assert_heuristics({
|
||||
"PHP" => all_fixtures("PHP", "*.inc")
|
||||
"PHP" => all_fixtures("PHP", "*.inc"),
|
||||
"POV-Ray SDL" => all_fixtures("POV-Ray SDL", "*.inc")
|
||||
})
|
||||
end
|
||||
|
||||
@@ -142,6 +149,26 @@ class TestHeuristcs < Minitest::Test
|
||||
})
|
||||
end
|
||||
|
||||
def test_m_by_heuristics
|
||||
assert_heuristics({
|
||||
"Objective-C" => all_fixtures("Objective-C", "*.m") - all_fixtures("Objective-C", "cocoa_monitor.m"),
|
||||
"Mercury" => all_fixtures("Mercury", "*.m"),
|
||||
"MUF" => all_fixtures("MUF", "*.m"),
|
||||
"M" => all_fixtures("M", "MDB.m"),
|
||||
"Mathematica" => all_fixtures("Mathematica", "*.m") - all_fixtures("Mathematica", "Problem12.m"),
|
||||
"Matlab" => all_fixtures("Matlab", "create_ieee_paper_plots.m"),
|
||||
"Limbo" => all_fixtures("Limbo", "*.m"),
|
||||
nil => ["Objective-C/cocoa_monitor.m"]
|
||||
})
|
||||
end
|
||||
|
||||
def test_md_by_heuristics
|
||||
assert_heuristics({
|
||||
"Markdown" => all_fixtures("Markdown", "*.md"),
|
||||
"GCC machine description" => all_fixtures("GCC machine description", "*.md")
|
||||
})
|
||||
end
|
||||
|
||||
# Candidate languages = ["C++", "Objective-C"]
|
||||
def test_obj_c_by_heuristics
|
||||
# Only calling out '.h' filenames as these are the ones causing issues
|
||||
|
||||
@@ -345,8 +345,24 @@ class TestLanguage < Minitest::Test
|
||||
end
|
||||
|
||||
def test_ace_modes
|
||||
assert Language.ace_modes.include?(Language['Ruby'])
|
||||
assert Language.ace_modes.include?(Language['FORTRAN'])
|
||||
silence_warnings do
|
||||
assert Language.ace_modes.include?(Language['Ruby'])
|
||||
assert Language.ace_modes.include?(Language['FORTRAN'])
|
||||
end
|
||||
end
|
||||
|
||||
def test_codemirror_mode
|
||||
assert_equal 'ruby', Language['Ruby'].codemirror_mode
|
||||
assert_equal 'javascript', Language['JavaScript'].codemirror_mode
|
||||
assert_equal 'clike', Language['C'].codemirror_mode
|
||||
assert_equal 'clike', Language['C++'].codemirror_mode
|
||||
end
|
||||
|
||||
def test_codemirror_mime_type
|
||||
assert_equal 'text/x-ruby', Language['Ruby'].codemirror_mime_type
|
||||
assert_equal 'text/javascript', Language['JavaScript'].codemirror_mime_type
|
||||
assert_equal 'text/x-csrc', Language['C'].codemirror_mime_type
|
||||
assert_equal 'text/x-c++src', Language['C++'].codemirror_mime_type
|
||||
end
|
||||
|
||||
def test_wrap
|
||||
@@ -436,6 +452,40 @@ class TestLanguage < Minitest::Test
|
||||
assert missing.empty?, message
|
||||
end
|
||||
|
||||
def test_codemirror_modes_present
|
||||
Language.all.each do |language|
|
||||
if language.codemirror_mode || language.codemirror_mime_type
|
||||
assert language.codemirror_mode, "#{language.inspect} missing CodeMirror mode"
|
||||
assert language.codemirror_mime_type, "#{language.inspect} missing CodeMirror MIME mode"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def test_valid_codemirror_mode
|
||||
Language.all.each do |language|
|
||||
if mode = language.codemirror_mode
|
||||
assert File.exist?(File.expand_path("../../vendor/CodeMirror/mode/#{mode}", __FILE__)), "#{mode} isn't a valid CodeMirror mode"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def test_codemirror_mode_and_mime_defined_by_meta_mapping
|
||||
meta = File.read(File.expand_path("../../vendor/CodeMirror/mode/meta.js", __FILE__))
|
||||
Language.all.each do |language|
|
||||
next unless language.codemirror_mode && language.codemirror_mime_type
|
||||
assert meta.match(/^.+#{Regexp.escape(language.codemirror_mime_type)}.+#{Regexp.escape(language.codemirror_mode)}.+$/), "#{language.inspect}: #{language.codemirror_mime_type} not defined under #{language.codemirror_mode}"
|
||||
end
|
||||
end
|
||||
|
||||
def test_codemirror_mime_declared_in_mode_file
|
||||
Language.all.each do |language|
|
||||
next unless language.codemirror_mode && language.codemirror_mime_type
|
||||
filename = File.expand_path("../../vendor/CodeMirror/mode/#{language.codemirror_mode}/#{language.codemirror_mode}.js", __FILE__)
|
||||
assert File.exist?(filename), "#{filename} does not exist"
|
||||
assert File.read(filename).match(language.codemirror_mime_type), "#{language.inspect}: #{language.codemirror_mime_type} not defined in #{filename}"
|
||||
end
|
||||
end
|
||||
|
||||
def test_all_popular_languages_exist
|
||||
popular = YAML.load(File.read(File.expand_path("../../lib/linguist/popular.yml", __FILE__)))
|
||||
|
||||
@@ -444,4 +494,12 @@ class TestLanguage < Minitest::Test
|
||||
message << missing.sort.join("\n")
|
||||
assert missing.empty?, message
|
||||
end
|
||||
|
||||
def test_no_unused_colours
|
||||
Language.all.each do |language|
|
||||
next unless language.type == :data || language.type == :prose ||
|
||||
language.group.to_s != language.name
|
||||
assert !language.color, "Unused colour assigned to #{language.name}"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -17,6 +17,9 @@ class TestModelines < Minitest::Test
|
||||
assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby7")
|
||||
assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby8")
|
||||
assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby9")
|
||||
assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby10")
|
||||
assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby11")
|
||||
assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby12")
|
||||
assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplus")
|
||||
assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs1")
|
||||
assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs2")
|
||||
@@ -27,9 +30,14 @@ class TestModelines < Minitest::Test
|
||||
assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs7")
|
||||
assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs8")
|
||||
assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs9")
|
||||
assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs10")
|
||||
assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs11")
|
||||
assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs12")
|
||||
assert_modeline Language["Text"], fixture_blob("Data/Modelines/fundamentalEmacs.c")
|
||||
assert_modeline Language["Prolog"], fixture_blob("Data/Modelines/not_perl.pl")
|
||||
assert_modeline Language["Smalltalk"], fixture_blob("Data/Modelines/example_smalltalk.md")
|
||||
assert_modeline Language["JavaScript"], fixture_blob("Data/Modelines/iamjs.pl")
|
||||
assert_modeline Language["JavaScript"], fixture_blob("Data/Modelines/iamjs2.pl")
|
||||
assert_modeline Language["PHP"], fixture_blob("Data/Modelines/iamphp.inc")
|
||||
assert_modeline nil, sample_blob("C/main.c")
|
||||
end
|
||||
@@ -48,9 +56,14 @@ class TestModelines < Minitest::Test
|
||||
assert_equal Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs7").language
|
||||
assert_equal Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs8").language
|
||||
assert_equal Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs9").language
|
||||
assert_equal Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs10").language
|
||||
assert_equal Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs11").language
|
||||
assert_equal Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs12").language
|
||||
assert_equal Language["Text"], fixture_blob("Data/Modelines/fundamentalEmacs.c").language
|
||||
assert_equal Language["Prolog"], fixture_blob("Data/Modelines/not_perl.pl").language
|
||||
assert_equal Language["Smalltalk"], fixture_blob("Data/Modelines/example_smalltalk.md").language
|
||||
assert_equal Language["JavaScript"], fixture_blob("Data/Modelines/iamjs.pl").language
|
||||
assert_equal Language["JavaScript"], fixture_blob("Data/Modelines/iamjs2.pl").language
|
||||
assert_equal Language["PHP"], fixture_blob("Data/Modelines/iamphp.inc").language
|
||||
end
|
||||
end
|
||||
|
||||
1
vendor/CodeMirror
vendored
Submodule
1
vendor/CodeMirror
vendored
Submodule
Submodule vendor/CodeMirror added at db12d64243
368
vendor/README.md
vendored
Normal file
368
vendor/README.md
vendored
Normal file
@@ -0,0 +1,368 @@
|
||||
Grammar index
|
||||
=============
|
||||
|
||||
This is a list of grammars that Linguist selects to provide syntax highlighting on GitHub. If you've encountered an error with highlighting, please find the grammar in the list below and report it to the appropriate repository.
|
||||
|
||||
<!-- Everything below this line is auto-generated by script/list-grammars. Manual edits will be lost -->
|
||||
- **1C Enterprise:** [xDrivenDevelopment/atom-language-1c-bsl](https://github.com/xDrivenDevelopment/atom-language-1c-bsl)
|
||||
- **ABAP:** [pvl/abap.tmbundle](https://github.com/pvl/abap.tmbundle)
|
||||
- **ActionScript:** [simongregory/actionscript3-tmbundle](https://github.com/simongregory/actionscript3-tmbundle)
|
||||
- **Ada:** [textmate/ada.tmbundle](https://github.com/textmate/ada.tmbundle)
|
||||
- **Agda:** [mokus0/Agda.tmbundle](https://github.com/mokus0/Agda.tmbundle)
|
||||
- **AGS Script:** [textmate/c.tmbundle](https://github.com/textmate/c.tmbundle)
|
||||
- **Alloy:** [macekond/Alloy.tmbundle](https://github.com/macekond/Alloy.tmbundle)
|
||||
- **Alpine Abuild:** [atom/language-shellscript](https://github.com/atom/language-shellscript)
|
||||
- **AMPL:** [ampl/sublime-ampl](https://github.com/ampl/sublime-ampl)
|
||||
- **Ant Build System:** [textmate/ant.tmbundle](https://github.com/textmate/ant.tmbundle)
|
||||
- **ANTLR:** [textmate/antlr.tmbundle](https://github.com/textmate/antlr.tmbundle)
|
||||
- **ApacheConf:** [textmate/apache.tmbundle](https://github.com/textmate/apache.tmbundle)
|
||||
- **Apex:** [textmate/java.tmbundle](https://github.com/textmate/java.tmbundle)
|
||||
- **API Blueprint:** [apiaryio/api-blueprint-sublime-plugin](https://github.com/apiaryio/api-blueprint-sublime-plugin)
|
||||
- **APL:** [Alhadis/language-apl](https://github.com/Alhadis/language-apl)
|
||||
- **Apollo Guidance Computer:** [Alhadis/language-agc](https://github.com/Alhadis/language-agc)
|
||||
- **AppleScript:** [textmate/applescript.tmbundle](https://github.com/textmate/applescript.tmbundle)
|
||||
- **Arduino:** [textmate/c.tmbundle](https://github.com/textmate/c.tmbundle)
|
||||
- **AsciiDoc:** [zuckschwerdt/asciidoc.tmbundle](https://github.com/zuckschwerdt/asciidoc.tmbundle)
|
||||
- **ASN.1:** [ajLangley12/language-asn1](https://github.com/ajLangley12/language-asn1)
|
||||
- **ASP:** [textmate/asp.tmbundle](https://github.com/textmate/asp.tmbundle)
|
||||
- **AspectJ:** [pchaigno/sublime-aspectj](https://github.com/pchaigno/sublime-aspectj)
|
||||
- **Assembly:** [Nessphoro/sublimeassembly](https://github.com/Nessphoro/sublimeassembly)
|
||||
- **ATS:** [steinwaywhw/ats-mode-sublimetext](https://github.com/steinwaywhw/ats-mode-sublimetext)
|
||||
- **AutoHotkey:** [ahkscript/SublimeAutoHotkey](https://github.com/ahkscript/SublimeAutoHotkey)
|
||||
- **AutoIt:** [AutoIt/SublimeAutoItScript](https://github.com/AutoIt/SublimeAutoItScript)
|
||||
- **Awk:** [github-linguist/awk-sublime](https://github.com/github-linguist/awk-sublime)
|
||||
- **Batchfile:** [mmims/language-batchfile](https://github.com/mmims/language-batchfile)
|
||||
- **Befunge:** [johanasplund/sublime-befunge](https://github.com/johanasplund/sublime-befunge)
|
||||
- **Bison:** [textmate/bison.tmbundle](https://github.com/textmate/bison.tmbundle)
|
||||
- **Blade:** [jawee/language-blade](https://github.com/jawee/language-blade)
|
||||
- **BlitzBasic:** [textmate/blitzmax.tmbundle](https://github.com/textmate/blitzmax.tmbundle)
|
||||
- **BlitzMax:** [textmate/blitzmax.tmbundle](https://github.com/textmate/blitzmax.tmbundle)
|
||||
- **Bluespec:** [thotypous/sublime-bsv](https://github.com/thotypous/sublime-bsv)
|
||||
- **Boo:** [Shammah/boo-sublime](https://github.com/Shammah/boo-sublime)
|
||||
- **Brainfuck:** [Drako/SublimeBrainfuck](https://github.com/Drako/SublimeBrainfuck)
|
||||
- **Brightscript:** [cmink/BrightScript.tmbundle](https://github.com/cmink/BrightScript.tmbundle)
|
||||
- **Bro:** [bro/bro-sublime](https://github.com/bro/bro-sublime)
|
||||
- **C:** [textmate/c.tmbundle](https://github.com/textmate/c.tmbundle)
|
||||
- **C#:** [atom/language-csharp](https://github.com/atom/language-csharp)
|
||||
- **C++:** [textmate/c.tmbundle](https://github.com/textmate/c.tmbundle)
|
||||
- **C-ObjDump:** [nanoant/assembly.tmbundle](https://github.com/nanoant/assembly.tmbundle)
|
||||
- **C2hs Haskell:** [atom-haskell/language-haskell](https://github.com/atom-haskell/language-haskell)
|
||||
- **Cap'n Proto:** [textmate/capnproto.tmbundle](https://github.com/textmate/capnproto.tmbundle)
|
||||
- **CartoCSS:** [yohanboniface/carto-atom](https://github.com/yohanboniface/carto-atom)
|
||||
- **Ceylon:** [jeancharles-roger/ceylon-sublimetext](https://github.com/jeancharles-roger/ceylon-sublimetext)
|
||||
- **Chapel:** [chapel-lang/chapel-tmbundle](https://github.com/chapel-lang/chapel-tmbundle)
|
||||
- **ChucK:** [textmate/java.tmbundle](https://github.com/textmate/java.tmbundle)
|
||||
- **Cirru:** [Cirru/sublime-cirru](https://github.com/Cirru/sublime-cirru)
|
||||
- **Clarion:** [fushnisoft/SublimeClarion](https://github.com/fushnisoft/SublimeClarion)
|
||||
- **Clean:** [timjs/atom-language-clean](https://github.com/timjs/atom-language-clean)
|
||||
- **Click:** [stenverbois/language-click](https://github.com/stenverbois/language-click)
|
||||
- **CLIPS:** [psicomante/CLIPS-sublime](https://github.com/psicomante/CLIPS-sublime)
|
||||
- **Clojure:** [atom/language-clojure](https://github.com/atom/language-clojure)
|
||||
- **CMake:** [textmate/cmake.tmbundle](https://github.com/textmate/cmake.tmbundle)
|
||||
- **COBOL:** [bitbucket:bitlang/sublime_cobol](https://bitbucket.org/bitlang/sublime_cobol)
|
||||
- **CoffeeScript:** [atom/language-coffee-script](https://github.com/atom/language-coffee-script)
|
||||
- **ColdFusion:** [SublimeText/ColdFusion](https://github.com/SublimeText/ColdFusion)
|
||||
- **ColdFusion CFC:** [SublimeText/ColdFusion](https://github.com/SublimeText/ColdFusion)
|
||||
- **COLLADA:** [textmate/xml.tmbundle](https://github.com/textmate/xml.tmbundle)
|
||||
- **Common Lisp:** [textmate/lisp.tmbundle](https://github.com/textmate/lisp.tmbundle)
|
||||
- **Component Pascal:** [textmate/pascal.tmbundle](https://github.com/textmate/pascal.tmbundle)
|
||||
- **Cool:** [anunayk/cool-tmbundle](https://github.com/anunayk/cool-tmbundle)
|
||||
- **Coq:** [mkolosick/Sublime-Coq](https://github.com/mkolosick/Sublime-Coq)
|
||||
- **Cpp-ObjDump:** [nanoant/assembly.tmbundle](https://github.com/nanoant/assembly.tmbundle)
|
||||
- **Creole:** [Siddley/Creole](https://github.com/Siddley/Creole)
|
||||
- **Crystal:** [atom-crystal/language-crystal](https://github.com/atom-crystal/language-crystal)
|
||||
- **CSON:** [atom/language-coffee-script](https://github.com/atom/language-coffee-script)
|
||||
- **Csound:** [nwhetsell/language-csound](https://github.com/nwhetsell/language-csound)
|
||||
- **Csound Document:** [nwhetsell/language-csound](https://github.com/nwhetsell/language-csound)
|
||||
- **Csound Score:** [nwhetsell/language-csound](https://github.com/nwhetsell/language-csound)
|
||||
- **CSS:** [textmate/css.tmbundle](https://github.com/textmate/css.tmbundle)
|
||||
- **Cucumber:** [cucumber/cucumber-tmbundle](https://github.com/cucumber/cucumber-tmbundle)
|
||||
- **Cuda:** [harrism/sublimetext-cuda-cpp](https://github.com/harrism/sublimetext-cuda-cpp)
|
||||
- **Cycript:** [atom/language-javascript](https://github.com/atom/language-javascript)
|
||||
- **Cython:** [textmate/cython.tmbundle](https://github.com/textmate/cython.tmbundle)
|
||||
- **D:** [textmate/d.tmbundle](https://github.com/textmate/d.tmbundle)
|
||||
- **D-ObjDump:** [nanoant/assembly.tmbundle](https://github.com/nanoant/assembly.tmbundle)
|
||||
- **Dart:** [guillermooo/dart-sublime-bundle](https://github.com/guillermooo/dart-sublime-bundle)
|
||||
- **desktop:** [Mailaender/desktop.tmbundle](https://github.com/Mailaender/desktop.tmbundle)
|
||||
- **Diff:** [textmate/diff.tmbundle](https://github.com/textmate/diff.tmbundle)
|
||||
- **DM:** [PJB3005/atomic-dreams](https://github.com/PJB3005/atomic-dreams)
|
||||
- **DNS Zone:** [sixty4k/st2-zonefile](https://github.com/sixty4k/st2-zonefile)
|
||||
- **Dockerfile:** [asbjornenge/Docker.tmbundle](https://github.com/asbjornenge/Docker.tmbundle)
|
||||
- **DTrace:** [textmate/c.tmbundle](https://github.com/textmate/c.tmbundle)
|
||||
- **Dylan:** [textmate/dylan.tmbundle](https://github.com/textmate/dylan.tmbundle)
|
||||
- **Eagle:** [textmate/xml.tmbundle](https://github.com/textmate/xml.tmbundle)
|
||||
- **eC:** [ecere/ec.tmbundle](https://github.com/ecere/ec.tmbundle)
|
||||
- **Ecere Projects:** [textmate/json.tmbundle](https://github.com/textmate/json.tmbundle)
|
||||
- **ECLiPSe:** [alnkpa/sublimeprolog](https://github.com/alnkpa/sublimeprolog)
|
||||
- **edn:** [atom/language-clojure](https://github.com/atom/language-clojure)
|
||||
- **Eiffel:** [textmate/eiffel.tmbundle](https://github.com/textmate/eiffel.tmbundle)
|
||||
- **EJS:** [gregory-m/ejs-tmbundle](https://github.com/gregory-m/ejs-tmbundle)
|
||||
- **Elixir:** [elixir-lang/elixir-tmbundle](https://github.com/elixir-lang/elixir-tmbundle)
|
||||
- **Emacs Lisp:** [Alhadis/language-emacs-lisp](https://github.com/Alhadis/language-emacs-lisp)
|
||||
- **EmberScript:** [atom/language-coffee-script](https://github.com/atom/language-coffee-script)
|
||||
- **EQ:** [atom/language-csharp](https://github.com/atom/language-csharp)
|
||||
- **Erlang:** [textmate/erlang.tmbundle](https://github.com/textmate/erlang.tmbundle)
|
||||
- **F#:** [fsprojects/atom-fsharp](https://github.com/fsprojects/atom-fsharp)
|
||||
- **Factor:** [slavapestov/factor](https://github.com/slavapestov/factor)
|
||||
- **Fancy:** [fancy-lang/fancy-tmbundle](https://github.com/fancy-lang/fancy-tmbundle)
|
||||
- **fish:** [l15n/fish-tmbundle](https://github.com/l15n/fish-tmbundle)
|
||||
- **Forth:** [textmate/forth.tmbundle](https://github.com/textmate/forth.tmbundle)
|
||||
- **FORTRAN:** [textmate/fortran.tmbundle](https://github.com/textmate/fortran.tmbundle)
|
||||
- **FreeMarker:** [freemarker/FreeMarker.tmbundle](https://github.com/freemarker/FreeMarker.tmbundle)
|
||||
- **Frege:** [atom-haskell/language-haskell](https://github.com/atom-haskell/language-haskell)
|
||||
- **G-code:** [robotmaster/sublime-text-syntax-highlighting](https://github.com/robotmaster/sublime-text-syntax-highlighting)
|
||||
- **Game Maker Language:** [textmate/c.tmbundle](https://github.com/textmate/c.tmbundle)
|
||||
- **GAP:** [dhowden/gap-tmbundle](https://github.com/dhowden/gap-tmbundle)
|
||||
- **GAS:** [Nessphoro/sublimeassembly](https://github.com/Nessphoro/sublimeassembly)
|
||||
- **GCC Machine Description:** [textmate/lisp.tmbundle](https://github.com/textmate/lisp.tmbundle)
|
||||
- **GDB:** [quarnster/SublimeGDB](https://github.com/quarnster/SublimeGDB)
|
||||
- **GDScript:** [beefsack/GDScript-sublime](https://github.com/beefsack/GDScript-sublime)
|
||||
- **Genshi:** [genshi.edgewall.org/query](https://genshi.edgewall.org/query)
|
||||
- **Gentoo Ebuild:** [atom/language-shellscript](https://github.com/atom/language-shellscript)
|
||||
- **Gentoo Eclass:** [atom/language-shellscript](https://github.com/atom/language-shellscript)
|
||||
- **Gettext Catalog:** [textmate/gettext.tmbundle](https://github.com/textmate/gettext.tmbundle)
|
||||
- **GLSL:** [euler0/sublime-glsl](https://github.com/euler0/sublime-glsl)
|
||||
- **Glyph:** [textmate/tcl.tmbundle](https://github.com/textmate/tcl.tmbundle)
|
||||
- **Gnuplot:** [mattfoster/gnuplot-tmbundle](https://github.com/mattfoster/gnuplot-tmbundle)
|
||||
- **Go:** [AlanQuatermain/go-tmbundle](https://github.com/AlanQuatermain/go-tmbundle)
|
||||
- **Golo:** [TypeUnsafe/sublime-golo](https://github.com/TypeUnsafe/sublime-golo)
|
||||
- **Gosu:** [jpcamara/Textmate-Gosu-Bundle](https://github.com/jpcamara/Textmate-Gosu-Bundle)
|
||||
- **Grace:** [zmthy/grace-tmbundle](https://github.com/zmthy/grace-tmbundle)
|
||||
- **Gradle:** [alkemist/gradle.tmbundle](https://github.com/alkemist/gradle.tmbundle)
|
||||
- **Grammatical Framework:** [atom-haskell/language-haskell](https://github.com/atom-haskell/language-haskell)
|
||||
- **GraphQL:** [rmosolgo/language-graphql](https://github.com/rmosolgo/language-graphql)
|
||||
- **Graphviz (DOT):** [textmate/graphviz.tmbundle](https://github.com/textmate/graphviz.tmbundle)
|
||||
- **Groff:** [Alhadis/language-roff](https://github.com/Alhadis/language-roff)
|
||||
- **Groovy:** [textmate/groovy.tmbundle](https://github.com/textmate/groovy.tmbundle)
|
||||
- **Groovy Server Pages:** [textmate/java.tmbundle](https://github.com/textmate/java.tmbundle)
|
||||
- **Hack:** [textmate/php.tmbundle](https://github.com/textmate/php.tmbundle)
|
||||
- **Haml:** [textmate/ruby-haml.tmbundle](https://github.com/textmate/ruby-haml.tmbundle)
|
||||
- **Handlebars:** [daaain/Handlebars](https://github.com/daaain/Handlebars)
|
||||
- **Harbour:** [hernad/atom-language-harbour](https://github.com/hernad/atom-language-harbour)
|
||||
- **Haskell:** [atom-haskell/language-haskell](https://github.com/atom-haskell/language-haskell)
|
||||
- **Haxe:** [clemos/haxe-sublime-bundle](https://github.com/clemos/haxe-sublime-bundle)
|
||||
- **HCL:** [aroben/ruby.tmbundle](https://github.com/aroben/ruby.tmbundle)
|
||||
- **HTML:** [textmate/html.tmbundle](https://github.com/textmate/html.tmbundle)
|
||||
- **HTML+Django:** [textmate/python-django.tmbundle](https://github.com/textmate/python-django.tmbundle)
|
||||
- **HTML+ECR:** [atom-crystal/language-crystal](https://github.com/atom-crystal/language-crystal)
|
||||
- **HTML+EEX:** [elixir-lang/elixir-tmbundle](https://github.com/elixir-lang/elixir-tmbundle)
|
||||
- **HTML+ERB:** [aroben/ruby.tmbundle](https://github.com/aroben/ruby.tmbundle)
|
||||
- **HTML+PHP:** [textmate/php.tmbundle](https://github.com/textmate/php.tmbundle)
|
||||
- **HTTP:** [httpspec/sublime-highlighting](https://github.com/httpspec/sublime-highlighting)
|
||||
- **Hy:** [rwtolbert/language-hy](https://github.com/rwtolbert/language-hy)
|
||||
- **IDL:** [mgalloy/idl.tmbundle](https://github.com/mgalloy/idl.tmbundle)
|
||||
- **Idris:** [idris-hackers/idris-sublime](https://github.com/idris-hackers/idris-sublime)
|
||||
- **Inform 7:** [erkyrath/language-inform7](https://github.com/erkyrath/language-inform7)
|
||||
- **INI:** [textmate/ini.tmbundle](https://github.com/textmate/ini.tmbundle)
|
||||
- **Io:** [textmate/io.tmbundle](https://github.com/textmate/io.tmbundle)
|
||||
- **Ioke:** [vic/ioke-outdated](https://github.com/vic/ioke-outdated)
|
||||
- **Isabelle:** [lsf37/Isabelle.tmbundle](https://github.com/lsf37/Isabelle.tmbundle)
|
||||
- **Isabelle ROOT:** [lsf37/Isabelle.tmbundle](https://github.com/lsf37/Isabelle.tmbundle)
|
||||
- **J:** [bcj/JSyntax](https://github.com/bcj/JSyntax)
|
||||
- **Jade:** [davidrios/jade-tmbundle](https://github.com/davidrios/jade-tmbundle)
|
||||
- **Jasmin:** [atmarksharp/jasmin-sublime](https://github.com/atmarksharp/jasmin-sublime)
|
||||
- **Java:** [textmate/java.tmbundle](https://github.com/textmate/java.tmbundle)
|
||||
- **Java Server Pages:** [textmate/java.tmbundle](https://github.com/textmate/java.tmbundle)
|
||||
- **JavaScript:** [atom/language-javascript](https://github.com/atom/language-javascript)
|
||||
- **JFlex:** [jflex-de/jflex.tmbundle](https://github.com/jflex-de/jflex.tmbundle)
|
||||
- **JSON:** [textmate/json.tmbundle](https://github.com/textmate/json.tmbundle)
|
||||
- **JSON5:** [atom/language-javascript](https://github.com/atom/language-javascript)
|
||||
- **JSONiq:** [wcandillon/language-jsoniq](https://github.com/wcandillon/language-jsoniq)
|
||||
- **JSONLD:** [atom/language-javascript](https://github.com/atom/language-javascript)
|
||||
- **JSX:** [github-linguist/language-babel](https://github.com/github-linguist/language-babel)
|
||||
- **Julia:** [nanoant/Julia.tmbundle](https://github.com/nanoant/Julia.tmbundle)
|
||||
- **Jupyter Notebook:** [textmate/json.tmbundle](https://github.com/textmate/json.tmbundle)
|
||||
- **Kit:** [textmate/html.tmbundle](https://github.com/textmate/html.tmbundle)
|
||||
- **Kotlin:** [vkostyukov/kotlin-sublime-package](https://github.com/vkostyukov/kotlin-sublime-package)
|
||||
- **LabVIEW:** [textmate/xml.tmbundle](https://github.com/textmate/xml.tmbundle)
|
||||
- **Lasso:** [bfad/Sublime-Lasso](https://github.com/bfad/Sublime-Lasso)
|
||||
- **Latte:** [textmate/php-smarty.tmbundle](https://github.com/textmate/php-smarty.tmbundle)
|
||||
- **Lean:** [leanprover/Lean.tmbundle](https://github.com/leanprover/Lean.tmbundle)
|
||||
- **Less:** [atom/language-less](https://github.com/atom/language-less)
|
||||
- **LFE:** [textmate/lisp.tmbundle](https://github.com/textmate/lisp.tmbundle)
|
||||
- **LilyPond:** [textmate/lilypond.tmbundle](https://github.com/textmate/lilypond.tmbundle)
|
||||
- **Liquid:** [bastilian/validcode-textmate-bundles](https://github.com/bastilian/validcode-textmate-bundles)
|
||||
- **Literate CoffeeScript:** [atom/language-coffee-script](https://github.com/atom/language-coffee-script)
|
||||
- **Literate Haskell:** [atom-haskell/language-haskell](https://github.com/atom-haskell/language-haskell)
|
||||
- **LiveScript:** [paulmillr/LiveScript.tmbundle](https://github.com/paulmillr/LiveScript.tmbundle)
|
||||
- **LLVM:** [whitequark/llvm.tmbundle](https://github.com/whitequark/llvm.tmbundle)
|
||||
- **Logos:** [Cykey/Sublime-Logos](https://github.com/Cykey/Sublime-Logos)
|
||||
- **Logtalk:** [textmate/logtalk.tmbundle](https://github.com/textmate/logtalk.tmbundle)
|
||||
- **LookML:** [atom/language-yaml](https://github.com/atom/language-yaml)
|
||||
- **LoomScript:** [ambethia/Sublime-Loom](https://github.com/ambethia/Sublime-Loom)
|
||||
- **LSL:** [textmate/secondlife-lsl.tmbundle](https://github.com/textmate/secondlife-lsl.tmbundle)
|
||||
- **Lua:** [textmate/lua.tmbundle](https://github.com/textmate/lua.tmbundle)
|
||||
- **Makefile:** [textmate/make.tmbundle](https://github.com/textmate/make.tmbundle)
|
||||
- **Mako:** [marconi/mako-tmbundle](https://github.com/marconi/mako-tmbundle)
|
||||
- **Markdown:** [atom/language-gfm](https://github.com/atom/language-gfm)
|
||||
- **Mask:** [tenbits/sublime-mask](https://github.com/tenbits/sublime-mask)
|
||||
- **Mathematica:** [shadanan/mathematica-tmbundle](https://github.com/shadanan/mathematica-tmbundle)
|
||||
- **Matlab:** [textmate/matlab.tmbundle](https://github.com/textmate/matlab.tmbundle)
|
||||
- **Maven POM:** [textmate/maven.tmbundle](https://github.com/textmate/maven.tmbundle)
|
||||
- **Max:** [textmate/json.tmbundle](https://github.com/textmate/json.tmbundle)
|
||||
- **MAXScript:** [Alhadis/language-maxscript](https://github.com/Alhadis/language-maxscript)
|
||||
- **MediaWiki:** [textmate/mediawiki.tmbundle](https://github.com/textmate/mediawiki.tmbundle)
|
||||
- **Mercury:** [sebgod/mercury-tmlanguage](https://github.com/sebgod/mercury-tmlanguage)
|
||||
- **Metal:** [textmate/c.tmbundle](https://github.com/textmate/c.tmbundle)
|
||||
- **Mirah:** [aroben/ruby.tmbundle](https://github.com/aroben/ruby.tmbundle)
|
||||
- **Modelica:** [BorisChumichev/modelicaSublimeTextPackage](https://github.com/BorisChumichev/modelicaSublimeTextPackage)
|
||||
- **Modula-2:** [harogaston/Sublime-Modula-2](https://github.com/harogaston/Sublime-Modula-2)
|
||||
- **Monkey:** [gingerbeardman/monkey.tmbundle](https://github.com/gingerbeardman/monkey.tmbundle)
|
||||
- **MoonScript:** [leafo/moonscript-tmbundle](https://github.com/leafo/moonscript-tmbundle)
|
||||
- **MQL4:** [mqsoft/MQL5-sublime](https://github.com/mqsoft/MQL5-sublime)
|
||||
- **MQL5:** [mqsoft/MQL5-sublime](https://github.com/mqsoft/MQL5-sublime)
|
||||
- **MTML:** [textmate/html.tmbundle](https://github.com/textmate/html.tmbundle)
|
||||
- **mupad:** [ccreutzig/sublime-MuPAD](https://github.com/ccreutzig/sublime-MuPAD)
|
||||
- **NCL:** [rpavlick/language-ncl](https://github.com/rpavlick/language-ncl)
|
||||
- **Nemerle:** [textmate/nemerle.tmbundle](https://github.com/textmate/nemerle.tmbundle)
|
||||
- **nesC:** [cdwilson/nesC.tmbundle](https://github.com/cdwilson/nesC.tmbundle)
|
||||
- **NetLinx:** [amclain/sublime-netlinx](https://github.com/amclain/sublime-netlinx)
|
||||
- **NetLinx+ERB:** [amclain/sublime-netlinx](https://github.com/amclain/sublime-netlinx)
|
||||
- **NetLogo:** [textmate/lisp.tmbundle](https://github.com/textmate/lisp.tmbundle)
|
||||
- **NewLisp:** [textmate/lisp.tmbundle](https://github.com/textmate/lisp.tmbundle)
|
||||
- **Nginx:** [brandonwamboldt/sublime-nginx](https://github.com/brandonwamboldt/sublime-nginx)
|
||||
- **Nimrod:** [Varriount/NimLime](https://github.com/Varriount/NimLime)
|
||||
- **Ninja:** [textmate/ninja.tmbundle](https://github.com/textmate/ninja.tmbundle)
|
||||
- **Nit:** [R4PaSs/Sublime-Nit](https://github.com/R4PaSs/Sublime-Nit)
|
||||
- **Nix:** [wmertens/sublime-nix](https://github.com/wmertens/sublime-nix)
|
||||
- **NSIS:** [github-linguist/NSIS](https://github.com/github-linguist/NSIS)
|
||||
- **Nu:** [jsallis/nu.tmbundle](https://github.com/jsallis/nu.tmbundle)
|
||||
- **ObjDump:** [nanoant/assembly.tmbundle](https://github.com/nanoant/assembly.tmbundle)
|
||||
- **Objective-C:** [textmate/objective-c.tmbundle](https://github.com/textmate/objective-c.tmbundle)
|
||||
- **Objective-C++:** [textmate/objective-c.tmbundle](https://github.com/textmate/objective-c.tmbundle)
|
||||
- **Objective-J:** [textmate/javascript-objective-j.tmbundle](https://github.com/textmate/javascript-objective-j.tmbundle)
|
||||
- **OCaml:** [textmate/ocaml.tmbundle](https://github.com/textmate/ocaml.tmbundle)
|
||||
- **ooc:** [nilium/ooc.tmbundle](https://github.com/nilium/ooc.tmbundle)
|
||||
- **Opa:** [mads379/opa.tmbundle](https://github.com/mads379/opa.tmbundle)
|
||||
- **Opal:** [artifactz/sublime-opal](https://github.com/artifactz/sublime-opal)
|
||||
- **OpenCL:** [textmate/c.tmbundle](https://github.com/textmate/c.tmbundle)
|
||||
- **OpenEdge ABL:** [jfairbank/Sublime-Text-2-OpenEdge-ABL](https://github.com/jfairbank/Sublime-Text-2-OpenEdge-ABL)
|
||||
- **OpenRC runscript:** [atom/language-shellscript](https://github.com/atom/language-shellscript)
|
||||
- **Ox:** [andreashetland/sublime-text-ox](https://github.com/andreashetland/sublime-text-ox)
|
||||
- **Oz:** [eregon/oz-tmbundle](https://github.com/eregon/oz-tmbundle)
|
||||
- **Papyrus:** [Kapiainen/SublimePapyrus](https://github.com/Kapiainen/SublimePapyrus)
|
||||
- **Parrot Internal Representation:** [textmate/parrot.tmbundle](https://github.com/textmate/parrot.tmbundle)
|
||||
- **Pascal:** [textmate/pascal.tmbundle](https://github.com/textmate/pascal.tmbundle)
|
||||
- **PAWN:** [Southclaw/pawn-sublime-language](https://github.com/Southclaw/pawn-sublime-language)
|
||||
- **Perl:** [textmate/perl.tmbundle](https://github.com/textmate/perl.tmbundle)
|
||||
- **Perl6:** [MadcapJake/language-perl6fe](https://github.com/MadcapJake/language-perl6fe)
|
||||
- **PHP:** [textmate/php.tmbundle](https://github.com/textmate/php.tmbundle)
|
||||
- **Pic:** [Alhadis/language-roff](https://github.com/Alhadis/language-roff)
|
||||
- **PicoLisp:** [textmate/lisp.tmbundle](https://github.com/textmate/lisp.tmbundle)
|
||||
- **PigLatin:** [goblindegook/sublime-text-pig-latin](https://github.com/goblindegook/sublime-text-pig-latin)
|
||||
- **Pike:** [hww3/pike-textmate](https://github.com/hww3/pike-textmate)
|
||||
- **PLpgSQL:** [textmate/sql.tmbundle](https://github.com/textmate/sql.tmbundle)
|
||||
- **PogoScript:** [featurist/PogoScript.tmbundle](https://github.com/featurist/PogoScript.tmbundle)
|
||||
- **Pony:** [CausalityLtd/sublime-pony](https://github.com/CausalityLtd/sublime-pony)
|
||||
- **PostScript:** [textmate/postscript.tmbundle](https://github.com/textmate/postscript.tmbundle)
|
||||
- **POV-Ray SDL:** [c-lipka/language-povray](https://github.com/c-lipka/language-povray)
|
||||
- **PowerShell:** [SublimeText/PowerShell](https://github.com/SublimeText/PowerShell)
|
||||
- **Processing:** [textmate/processing.tmbundle](https://github.com/textmate/processing.tmbundle)
|
||||
- **Prolog:** [alnkpa/sublimeprolog](https://github.com/alnkpa/sublimeprolog)
|
||||
- **Propeller Spin:** [bitbased/sublime-spintools](https://github.com/bitbased/sublime-spintools)
|
||||
- **Protocol Buffer:** [michaeledgar/protobuf-tmbundle](https://github.com/michaeledgar/protobuf-tmbundle)
|
||||
- **Puppet:** [russCloak/SublimePuppet](https://github.com/russCloak/SublimePuppet)
|
||||
- **PureScript:** [purescript-contrib/atom-language-purescript](https://github.com/purescript-contrib/atom-language-purescript)
|
||||
- **Python:** [MagicStack/MagicPython](https://github.com/MagicStack/MagicPython)
|
||||
- **Python traceback:** [atom/language-python](https://github.com/atom/language-python)
|
||||
- **QMake:** [textmate/cpp-qt.tmbundle](https://github.com/textmate/cpp-qt.tmbundle)
|
||||
- **QML:** [skozlovf/Sublime-QML](https://github.com/skozlovf/Sublime-QML)
|
||||
- **R:** [textmate/r.tmbundle](https://github.com/textmate/r.tmbundle)
|
||||
- **Racket:** [soegaard/racket-highlight-for-github](https://github.com/soegaard/racket-highlight-for-github)
|
||||
- **RAML:** [atom/language-yaml](https://github.com/atom/language-yaml)
|
||||
- **RDoc:** [joshaven/RDoc.tmbundle](https://github.com/joshaven/RDoc.tmbundle)
|
||||
- **REALbasic:** [angryant0007/VBDotNetSyntax](https://github.com/angryant0007/VBDotNetSyntax)
|
||||
- **Rebol:** [Oldes/Sublime-REBOL](https://github.com/Oldes/Sublime-REBOL)
|
||||
- **Red:** [Oldes/Sublime-Red](https://github.com/Oldes/Sublime-Red)
|
||||
- **Ren'Py:** [williamd1k0/language-renpy](https://github.com/williamd1k0/language-renpy)
|
||||
- **reStructuredText:** [Lukasa/language-restructuredtext](https://github.com/Lukasa/language-restructuredtext)
|
||||
- **REXX:** [mblocker/rexx-sublime](https://github.com/mblocker/rexx-sublime)
|
||||
- **RHTML:** [aroben/ruby.tmbundle](https://github.com/aroben/ruby.tmbundle)
|
||||
- **RMarkdown:** [atom/language-gfm](https://github.com/atom/language-gfm)
|
||||
- **RobotFramework:** [shellderp/sublime-robot-plugin](https://github.com/shellderp/sublime-robot-plugin)
|
||||
- **Rouge:** [atom/language-clojure](https://github.com/atom/language-clojure)
|
||||
- **RPM Spec:** [waveclaw/language-rpm-spec](https://github.com/waveclaw/language-rpm-spec)
|
||||
- **Ruby:** [aroben/ruby.tmbundle](https://github.com/aroben/ruby.tmbundle)
|
||||
- **RUNOFF:** [Alhadis/language-roff](https://github.com/Alhadis/language-roff)
|
||||
- **Rust:** [jhasse/sublime-rust](https://github.com/jhasse/sublime-rust)
|
||||
- **Sage:** [MagicStack/MagicPython](https://github.com/MagicStack/MagicPython)
|
||||
- **SaltStack:** [saltstack/atom-salt](https://github.com/saltstack/atom-salt)
|
||||
- **SAS:** [rpardee/sas.tmbundle](https://github.com/rpardee/sas.tmbundle)
|
||||
- **Sass:** [nathos/sass-textmate-bundle](https://github.com/nathos/sass-textmate-bundle)
|
||||
- **Scala:** [mads379/scala.tmbundle](https://github.com/mads379/scala.tmbundle)
|
||||
- **Scaml:** [scalate/Scalate.tmbundle](https://github.com/scalate/Scalate.tmbundle)
|
||||
- **Scheme:** [textmate/scheme.tmbundle](https://github.com/textmate/scheme.tmbundle)
|
||||
- **Scilab:** [textmate/scilab.tmbundle](https://github.com/textmate/scilab.tmbundle)
|
||||
- **SCSS:** [MarioRicalde/SCSS.tmbundle](https://github.com/MarioRicalde/SCSS.tmbundle)
|
||||
- **Shell:** [atom/language-shellscript](https://github.com/atom/language-shellscript)
|
||||
- **ShellSession:** [atom/language-shellscript](https://github.com/atom/language-shellscript)
|
||||
- **Slash:** [slash-lang/Slash.tmbundle](https://github.com/slash-lang/Slash.tmbundle)
|
||||
- **Slim:** [slim-template/ruby-slim.tmbundle](https://github.com/slim-template/ruby-slim.tmbundle)
|
||||
- **Smali:** [ShaneWilton/sublime-smali](https://github.com/ShaneWilton/sublime-smali)
|
||||
- **Smalltalk:** [tomas-stefano/smalltalk-tmbundle](https://github.com/tomas-stefano/smalltalk-tmbundle)
|
||||
- **Smarty:** [textmate/php-smarty.tmbundle](https://github.com/textmate/php-smarty.tmbundle)
|
||||
- **SMT:** [SRI-CSL/SMT.tmbundle](https://github.com/SRI-CSL/SMT.tmbundle)
|
||||
- **SourcePawn:** [github-linguist/sublime-sourcepawn](https://github.com/github-linguist/sublime-sourcepawn)
|
||||
- **SPARQL:** [peta/turtle.tmbundle](https://github.com/peta/turtle.tmbundle)
|
||||
- **SQF:** [JonBons/Sublime-SQF-Language](https://github.com/JonBons/Sublime-SQF-Language)
|
||||
- **SQL:** [textmate/sql.tmbundle](https://github.com/textmate/sql.tmbundle)
|
||||
- **SQLPL:** [textmate/sql.tmbundle](https://github.com/textmate/sql.tmbundle)
|
||||
- **Squirrel:** [textmate/c.tmbundle](https://github.com/textmate/c.tmbundle)
|
||||
- **SRecode Template:** [textmate/lisp.tmbundle](https://github.com/textmate/lisp.tmbundle)
|
||||
- **Stan:** [jrnold/atom-language-stan](https://github.com/jrnold/atom-language-stan)
|
||||
- **Standard ML:** [textmate/standard-ml.tmbundle](https://github.com/textmate/standard-ml.tmbundle)
|
||||
- **Stata:** [pschumm/Stata.tmbundle](https://github.com/pschumm/Stata.tmbundle)
|
||||
- **STON:** [tomas-stefano/smalltalk-tmbundle](https://github.com/tomas-stefano/smalltalk-tmbundle)
|
||||
- **Stylus:** [billymoon/Stylus](https://github.com/billymoon/Stylus)
|
||||
- **Sublime Text Config:** [atom/language-javascript](https://github.com/atom/language-javascript)
|
||||
- **SubRip Text:** [314eter/atom-language-srt](https://github.com/314eter/atom-language-srt)
|
||||
- **SuperCollider:** [supercollider/language-supercollider](https://github.com/supercollider/language-supercollider)
|
||||
- **SVG:** [textmate/xml.tmbundle](https://github.com/textmate/xml.tmbundle)
|
||||
- **Swift:** [textmate/swift.tmbundle](https://github.com/textmate/swift.tmbundle)
|
||||
- **SystemVerilog:** [bitbucket:Clams/sublimesystemverilog](https://bitbucket.org/Clams/sublimesystemverilog)
|
||||
- **Tcl:** [textmate/tcl.tmbundle](https://github.com/textmate/tcl.tmbundle)
|
||||
- **Tcsh:** [atom/language-shellscript](https://github.com/atom/language-shellscript)
|
||||
- **Tea:** [pferruggiaro/sublime-tea](https://github.com/pferruggiaro/sublime-tea)
|
||||
- **Terra:** [pyk/sublime-terra](https://github.com/pyk/sublime-terra)
|
||||
- **TeX:** [textmate/latex.tmbundle](https://github.com/textmate/latex.tmbundle)
|
||||
- **Thrift:** [textmate/thrift.tmbundle](https://github.com/textmate/thrift.tmbundle)
|
||||
- **TLA:** [agentultra/TLAGrammar](https://github.com/agentultra/TLAGrammar)
|
||||
- **TOML:** [textmate/toml.tmbundle](https://github.com/textmate/toml.tmbundle)
|
||||
- **Turing:** [Alhadis/language-turing](https://github.com/Alhadis/language-turing)
|
||||
- **Turtle:** [peta/turtle.tmbundle](https://github.com/peta/turtle.tmbundle)
|
||||
- **Twig:** [Anomareh/PHP-Twig.tmbundle](https://github.com/Anomareh/PHP-Twig.tmbundle)
|
||||
- **TXL:** [MikeHoffert/Sublime-Text-TXL-syntax](https://github.com/MikeHoffert/Sublime-Text-TXL-syntax)
|
||||
- **TypeScript:** [Microsoft/TypeScript-Sublime-Plugin](https://github.com/Microsoft/TypeScript-Sublime-Plugin)
|
||||
- **Unified Parallel C:** [textmate/c.tmbundle](https://github.com/textmate/c.tmbundle)
|
||||
- **Unity3D Asset:** [atom/language-yaml](https://github.com/atom/language-yaml)
|
||||
- **Uno:** [atom/language-csharp](https://github.com/atom/language-csharp)
|
||||
- **UnrealScript:** [textmate/java.tmbundle](https://github.com/textmate/java.tmbundle)
|
||||
- **UrWeb:** [gwalborn/UrWeb-Language-Definition](https://github.com/gwalborn/UrWeb-Language-Definition)
|
||||
- **Vala:** [technosophos/Vala-TMBundle](https://github.com/technosophos/Vala-TMBundle)
|
||||
- **VCL:** [brandonwamboldt/sublime-varnish](https://github.com/brandonwamboldt/sublime-varnish)
|
||||
- **Verilog:** [textmate/verilog.tmbundle](https://github.com/textmate/verilog.tmbundle)
|
||||
- **VHDL:** [textmate/vhdl.tmbundle](https://github.com/textmate/vhdl.tmbundle)
|
||||
- **VimL:** [Alhadis/language-viml](https://github.com/Alhadis/language-viml)
|
||||
- **Visual Basic:** [angryant0007/VBDotNetSyntax](https://github.com/angryant0007/VBDotNetSyntax)
|
||||
- **Volt:** [textmate/d.tmbundle](https://github.com/textmate/d.tmbundle)
|
||||
- **Vue:** [vuejs/vue-syntax-highlight](https://github.com/vuejs/vue-syntax-highlight)
|
||||
- **Wavefront Material:** [Alhadis/language-wavefront](https://github.com/Alhadis/language-wavefront)
|
||||
- **Wavefront Object:** [Alhadis/language-wavefront](https://github.com/Alhadis/language-wavefront)
|
||||
- **Web Ontology Language:** [textmate/xml.tmbundle](https://github.com/textmate/xml.tmbundle)
|
||||
- **WebIDL:** [andik/IDL-Syntax](https://github.com/andik/IDL-Syntax)
|
||||
- **wisp:** [atom/language-clojure](https://github.com/atom/language-clojure)
|
||||
- **World of Warcraft Addon Data:** [nebularg/language-toc-wow](https://github.com/nebularg/language-toc-wow)
|
||||
- **X10:** [x10-lang/x10-highlighting](https://github.com/x10-lang/x10-highlighting)
|
||||
- **xBase:** [hernad/atom-language-harbour](https://github.com/hernad/atom-language-harbour)
|
||||
- **XC:** [graymalkin/xc.tmbundle](https://github.com/graymalkin/xc.tmbundle)
|
||||
- **XML:** [textmate/xml.tmbundle](https://github.com/textmate/xml.tmbundle)
|
||||
- **Xojo:** [angryant0007/VBDotNetSyntax](https://github.com/angryant0007/VBDotNetSyntax)
|
||||
- **XProc:** [textmate/xml.tmbundle](https://github.com/textmate/xml.tmbundle)
|
||||
- **XQuery:** [wcandillon/language-jsoniq](https://github.com/wcandillon/language-jsoniq)
|
||||
- **XS:** [textmate/c.tmbundle](https://github.com/textmate/c.tmbundle)
|
||||
- **XSLT:** [textmate/xml.tmbundle](https://github.com/textmate/xml.tmbundle)
|
||||
- **Xtend:** [staltz/SublimeXtend](https://github.com/staltz/SublimeXtend)
|
||||
- **Yacc:** [textmate/bison.tmbundle](https://github.com/textmate/bison.tmbundle)
|
||||
- **YAML:** [atom/language-yaml](https://github.com/atom/language-yaml)
|
||||
- **YANG:** [DzonyKalafut/language-yang](https://github.com/DzonyKalafut/language-yang)
|
||||
- **Zephir:** [vmg/zephir-sublime](https://github.com/vmg/zephir-sublime)
|
||||
1
vendor/grammars/ABNF.tmbundle
vendored
Submodule
1
vendor/grammars/ABNF.tmbundle
vendored
Submodule
Submodule vendor/grammars/ABNF.tmbundle added at 86a961c91b
2
vendor/grammars/Docker.tmbundle
vendored
2
vendor/grammars/Docker.tmbundle
vendored
Submodule vendor/grammars/Docker.tmbundle updated: 2d7d56af17...378d7eb156
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user