Compare commits

...

101 Commits

Author SHA1 Message Date
Arfon Smith
346aa99fcf Merge pull request #3296 from github/cut-release-v4.8.16
Staging PR for Linguist v4.8.16 release
2016-10-26 13:43:22 -04:00
Arfon Smith
d147778677 Bumping to v4.8.16 2016-10-25 20:30:46 -04:00
Arfon Smith
e520209e49 Grammar update 2016-10-25 20:25:07 -04:00
Arfon Smith
338cc16239 Merge pull request #3264 from Alhadis/rexx-interpreters
Add REXX interpreters
2016-10-25 20:15:05 -04:00
Arfon Smith
67ea35094b Merge pull request #3295 from github/3233-local
UPDATE: Add support for MQL4 and MQL5 languages
2016-10-25 20:10:56 -04:00
Arfon Smith
6f0393fcbd Merge branch 'master' into 3233-local 2016-10-25 20:00:48 -04:00
Arfon Smith
2923d50d7e Merge pull request #3294 from larsbrinkhoff/boot
Makefile.boot misclassified as Clojure.
2016-10-25 18:45:39 -04:00
Lars Brinkhoff
4e26f609ef Makefile.boot misclassified as Clojure. 2016-10-25 22:21:31 +02:00
Arfon Smith
e86d6e8dd2 Merge pull request #3193 from Alhadis/grammar-scripts
Add script to add or replace grammars
2016-10-25 07:36:01 -04:00
Arfon Smith
5fa02ad1fb Merge pull request #3182 from adius/patch-1
Exclude "dist" directory from language statistics
2016-10-22 18:39:51 -04:00
Arfon Smith
5a06240f69 Merge pull request #3289 from pchaigno/change-grammar-actionscript
Update grammar for ActionScript
2016-10-22 18:39:22 -04:00
Arfon Smith
d6e0f74c80 Merge pull request #3279 from Alhadis/mirror-modes
Add CodeMirror modes for GPG keys and IRC logs
2016-10-22 18:38:38 -04:00
Paul Chaignon
a5c08bb203 Update grammar for ActionScript 2016-10-22 21:35:28 +02:00
Arfon Smith
c6dc29abb1 Merge pull request #3242 from JoshCheek/julia-interpreters
Set interpreters for Julia
2016-10-22 12:24:44 -05:00
Arfon Smith
ffd984bb7e Merge pull request #3277 from Alhadis/pic
Add support for the Pic language
2016-10-17 12:03:43 -05:00
Alhadis
dc5473559b Merge branch 'master' into grammar-scripts 2016-10-17 17:38:19 +11:00
Lars Brinkhoff
8e9c224952 Remove color attribute from all languages with a group attribute. 2016-10-13 06:54:21 +02:00
Lars Brinkhoff
d43f111723 Remove redundant group attribute for ColdFusion. 2016-10-13 06:54:21 +02:00
Lars Brinkhoff
de9ff713a4 Test that grouped languages have no color. 2016-10-13 06:54:21 +02:00
Alhadis
98783560ec Add CodeMirror modes for GPG keys and IRC logs 2016-10-12 14:20:58 +11:00
Alhadis
8f31fbbd55 Bump language ID 2016-10-12 11:19:22 +11:00
Alhadis
e4cdbd2b2b Merge branch 'master' into pic 2016-10-12 11:18:28 +11:00
Arfon Smith
ba52e48ceb Merge pull request #3175 from Alhadis/cson
Classify CSON as data
2016-10-11 17:16:08 -07:00
Alhadis
a44ebe493b Bump language ID 2016-10-12 11:10:44 +11:00
Alhadis
eb0e75e11e Add support for the Pic language 2016-10-12 02:46:17 +11:00
Arfon Smith
22c2cf4967 Merge pull request #3268 from Alhadis/sublime
Add new entry for Sublime Text config files
2016-10-10 16:36:53 -07:00
Alhadis
39e3688fb8 Bump language ID for Sublime Text config files 2016-10-11 09:59:17 +11:00
Alhadis
6b83e5fb7b Merge branch 'master' into sublime 2016-10-11 09:57:05 +11:00
Arfon Smith
dd2e5ffe07 Merge pull request #3258 from scottmangiapane/master
Added support for TI Code
2016-10-10 08:55:23 -07:00
Andrew Case
f6b6c4e165 Merge branch 'master' into add-mql4-mql5-current 2016-10-10 17:41:29 +03:00
Andrew Case
608ed60b5c Merge branch 'master' of https://github.com/github/linguist 2016-10-10 17:31:02 +03:00
Arfon Smith
2ce2945058 Merge pull request #3272 from pchaigno/doc-set-language-id
Improve documentation on the language_id
2016-10-10 06:47:01 -07:00
Paul Chaignon
c8d376754e Improve documentation on the language_id 2016-10-09 17:55:50 +02:00
Arfon Smith
ecaef91fa1 Merge pull request #3266 from Alhadis/make
Add ".make" as a Makefile file extension
2016-10-09 07:58:17 -07:00
Alhadis
d265b78e7e Copy Sublime configs from submodules 2016-10-07 11:38:11 +11:00
Alhadis
5a5bf7d5e5 Add new entry for Sublime Text config files 2016-10-07 10:56:15 +11:00
Alhadis
e46781b903 Merge upstream changes into topic branch 2016-10-07 10:25:03 +11:00
Arfon Smith
9543a8c8e9 Merge pull request #3259 from Alhadis/colour-removal
Guard against unused colour definitions
2016-10-06 09:52:29 -07:00
Alhadis
6ac1ac9232 Resolve conflicts from upstream changes 2016-10-06 17:00:28 +11:00
Alhadis
1bbb919fef Reclassify Sublime configuration files as JSON
See:
- https://github.com/github/linguist/issues/2662#issuecomment-251865073
- https://github.com/github/linguist/pull/3267
2016-10-06 16:42:01 +11:00
Scott Mangiapane
71dfed0e45 Restored .8xp.txt extension 2016-10-05 12:31:32 -04:00
Scott Mangiapane
a2db058ce4 TI Code -> TI Program 2016-10-05 12:24:50 -04:00
Alhadis
12695fee2f Add ".make" as a Makefile file extension 2016-10-05 21:36:22 +11:00
Alhadis
4a775dca37 Add REXX interpreters 2016-10-05 17:45:38 +11:00
Alhadis
d7c689fd6b Merge branch 'master' into grammar-scripts 2016-10-05 16:34:24 +11:00
Alhadis
20b8188384 Add test to guard against unused colours 2016-10-05 16:17:00 +11:00
Scott Mangiapane
26310d9515 TI PRGM -> TI Code 2016-10-04 23:02:11 -04:00
Alhadis
e38cc75da5 Update ASN.1 grammar
This stops the ASN.1 submodule from being flagged as modified due to its
.DS_Store file being wiped locally by an automated process.

References: ajLangley12/language-asn1#1
2016-10-05 13:08:36 +11:00
Scott Mangiapane
8d55fc1bd5 Reordered extensions for TI PRGM 2016-10-04 14:38:28 -04:00
Alhadis
7e63399196 Delete colour property for ASN.1 language
This is classified on GitHub as "data", so the colour it's assigned only
wastes valuable "real estate" when checking colour proximity.

References: github/linguist#3113
2016-10-04 17:23:45 +11:00
Scott Mangiapane
520e5a5cfe Alphabetized extensions for TI PRGM (again) 2016-10-03 22:13:43 -04:00
Scott Mangiapane
5d85692c24 Updated TI PRGM languages.yml entry
Alphabetized extensions and added a language_id.
2016-10-03 22:07:23 -04:00
Scott Mangiapane
676861fff3 Removed binary files from the TI PRGM sample 2016-10-03 21:59:46 -04:00
Scott Mangiapane
6589bd9dc7 Added tm_scope to TI PRGM 2016-10-03 21:47:52 -04:00
Scott Mangiapane
e32a4f13ef Updated languages.yml 2016-10-03 21:37:56 -04:00
Scott Mangiapane
4e4d851f71 Alphabetized "TI PRGM" 2016-10-03 21:15:36 -04:00
Scott Mangiapane
a3628f86da Added example files for TI-83+/84 programs 2016-10-03 21:12:30 -04:00
Scott Mangiapane
fe70965906 Added entry for TI-83+/84 programs and apps 2016-10-03 21:11:28 -04:00
Lars Brinkhoff
c863435c84 Add '</' to Markdown heuristic. (#3255) 2016-10-03 19:22:34 +02:00
Paul Chaignon
eeec48198a Update submodules 2016-10-02 11:16:25 +02:00
Paul Chaignon
82167063da Tests to ensure the whitelists are up-to-date 2016-10-02 11:16:25 +02:00
Paul Chaignon
3ae89b48ba Improve Mathematica's heuristic rule
Use closing of Mathematica comment instead of opening
Unit test to check that test file is not detected as Mathematica anymore
2016-10-01 08:46:31 +02:00
Paul Chaignon
cd9401c424 Enable testing absence of heuristic result 2016-10-01 08:46:31 +02:00
Paul Chaignon
e7e8a7d835 Tests for .m heuristic rules 2016-10-01 08:46:31 +02:00
Arfon Smith
7654032d2e Merge pull request #3254 from alexruperez/master
Added BuddyBuildSDK.framework to lib/linguist/vendor.yml
2016-09-30 19:29:23 -07:00
alexruperez
05b536fc61 Added BuddyBuildSDK.framework to lib/linguist/vendor.yml 2016-09-28 11:24:17 +02:00
Paul Chaignon
ebe85788ab Rely solely on Licensee to recognize licenses
Remove our own license classification code
Add hashes for any project which does not have a standard license body
Add projects for which a license was not found to the whitelist

Requires Licensee v8.6.0 to correctly recognize TextMate bundles' .mdown README
2016-09-27 10:44:25 +02:00
Paul Chaignon
524337d07b Use Licensee hashes to uniquely identify licenses
Since v6.1.0, Licensee exposes the hash of the license
We can use it to uniquely identify unrecognized licenses,
Thus, tests will fail if the content of an unrecognized license changes

Projects for which no license was found are kept in the whitelist
2016-09-27 10:44:25 +02:00
Paul Chaignon
f8ce42e169 Recognize licenses in READMEs using Licensee
Since v7.0.0 Licensee can detect license text in READMEs
Using this, we might be able to rely solely on Licensee in the future
2016-09-27 10:44:25 +02:00
Arfon Smith
71032cd252 Merge pull request #3249 from pchaigno/update-season-package
Update season package in npm to fix parsing error
2016-09-25 21:25:19 -07:00
Paul Chaignon
41593b3ea7 Update season package in npm to fix parsing error
Fixes the Travis build failures
2016-09-25 16:41:49 +02:00
Joshua Peek
e424e8e88c Linguist 4.8.15 2016-09-23 16:41:16 -07:00
Joshua Peek
07d4f218a3 Merge pull request #3243 from github/change_modes_to_mimetypes
Convert from mode names to mimetypes for better usage.
2016-09-23 16:38:13 -07:00
Joshua Peek
67ed060d37 Assert CodeMirror modes and mime types are valid against source 2016-09-23 16:33:12 -07:00
Joshua Peek
3abe081560 Validate codemirror modes 2016-09-23 16:30:38 -07:00
Josh Cheek
d3f3c0345c Add a sample showing the Julia interpreter is correctly analyzed 2016-09-23 15:29:02 -07:00
Joshua Peek
855f1a1f86 Validate CodeMirror modes 2016-09-23 14:47:49 -07:00
Joshua Peek
0406a5b326 Fix typescript indent 2016-09-23 14:39:15 -07:00
Joshua Peek
0108ef4386 Restore old mode 2016-09-23 14:35:02 -07:00
Joshua Peek
daefff86ff Fix JSX mode 2016-09-23 13:57:50 -07:00
Joshua Peek
fdb962518f Consistent CodeMirror casing 2016-09-23 13:54:55 -07:00
Joshua Peek
6564078061 Merge branch 'master' into change_modes_to_mimetypes 2016-09-23 13:54:20 -07:00
Joshua Peek
39ea9be5f8 Ignore ace mode warning while testing 2016-09-23 13:53:38 -07:00
Joshua Peek
152b5ade5e Fix shadowed path warning 2016-09-23 13:50:01 -07:00
Joshua Peek
c525e3fbef Ignore default external warnings 2016-09-23 13:49:30 -07:00
Todd Berman
88c74fa9c2 Convert from mode names to mimetypes for better usage. 2016-09-23 13:40:19 -07:00
Josh Cheek
6a54ee767f Set interpreters for Julia
Eg this file is not currently highlighted:
b766dcdbd2/julia/fullpath (L1)
2016-09-23 12:52:47 -07:00
Andrew Case
82af10e3fd add support for MQL4 and MQL5 2016-09-19 22:03:57 +03:00
Andrey Osorgin
63c8d2284c Merge pull request #4 from github/master
Update from upstream repo github/linguist
2016-09-19 10:38:33 +03:00
Alhadis
b61fe90d12 Terminate script if submodule registration failed 2016-09-12 02:17:10 +10:00
Alhadis
e6c849d92c Document --verbose option in usage message 2016-09-12 02:08:52 +10:00
Alhadis
be316c2943 Update contributor notes to mention new script 2016-09-07 05:36:00 +10:00
Alhadis
68c45be47d Flatten whitespace 2016-09-07 04:37:04 +10:00
Alhadis
4584963dd2 Add logic to update submodules and licenses 2016-09-07 04:26:45 +10:00
Alhadis
f382abc2f3 Add logic to consume and parse options 2016-09-07 03:14:49 +10:00
Adrian Sieber
00647be113 Exclude "dist" directory from language statistics 2016-08-31 14:56:07 +00:00
Alhadis
48b64c2d31 Add CSON samples 2016-08-29 01:57:32 +10:00
Alhadis
f95365946c Separate CSON from CoffeeScript 2016-08-29 01:56:05 +10:00
Andrey Osorgin
b056df06f4 Merge pull request #3 from github/master
Update from upstream repo github/linguist
2016-07-14 21:34:28 +03:00
osorgin
6bf223e641 Merge pull request #2 from github/master
Update from upstream repo github/linguist
2016-07-14 14:58:17 +03:00
osorgin
fa817b6a1d Merge pull request #1 from github/master
Update from upstream repo github/linguist
2016-07-12 16:14:26 +03:00
94 changed files with 5367 additions and 180 deletions

12
.gitmodules vendored
View File

@@ -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,12 @@
[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

View File

@@ -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,9 @@ Here's our current build status: [![Build Status](https://api.travis-ci.org/gith
Linguist is maintained with :heart: by:
- @arfon (GitHub Staff)
- @larsbrinkhoff
- @pchaigno
- **@arfon** (GitHub Staff)
- **@larsbrinkhoff**
- **@pchaigno**
As Linguist is a production dependency for GitHub we have a couple of workflow restrictions:
@@ -113,5 +110,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

View File

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

View File

@@ -47,6 +47,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
@@ -134,7 +136,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
@@ -375,6 +377,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:

View File

@@ -244,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"]
@@ -254,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"]

View File

@@ -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
@@ -301,12 +302,13 @@ module Linguist
@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 [].
@@ -398,7 +400,10 @@ module Linguist
# Returns a String name or nil
attr_reader :ace_mode
# Public: Get Codemirror mode
# Public: Get CodeMirror mode
#
# Maps to a directory in the `mode/` source code.
# https://github.com/codemirror/CodeMirror/tree/master/mode
#
# Examples
#
@@ -409,6 +414,17 @@ module Linguist
# 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
@@ -586,6 +602,7 @@ module Linguist
: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

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

View File

@@ -1,3 +1,3 @@
module Linguist
VERSION = "4.8.14"
VERSION = "4.8.16"
end

View File

@@ -1,7 +1,7 @@
{
"repository": "https://github.com/github/linguist",
"dependencies": {
"season": "~>5.0"
"season": "~>5.4"
},
"license": "MIT"
}

72
samples/CSON/base.cson Normal file
View 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
View 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
View 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"

View File

@@ -0,0 +1,11 @@
'menu': [
{
'label': 'Packages'
'submenu': [
'label': 'Wercker Status'
'submenu': [
{ 'label': 'Check now!', 'command': 'wercker-status:checknow' }
]
]
}
]

60
samples/Julia/julia Normal file
View 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)

View 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
};
//+------------------------------------------------------------------+

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

View 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

File diff suppressed because it is too large Load Diff

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

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

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

View 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, &current);
if (_glfwCompareVideoModes(&current, 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;
}

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

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

View File

@@ -0,0 +1,8 @@
{
"extensions":
[
"clp"
],
"tab_size": 8,
"translate_tabs_to_spaces": false
}

View File

@@ -0,0 +1,13 @@
[
{
"id" : "nasm",
"caption": "NASM Assembly",
"children":
[
{
"caption" : "Documentation",
"command" : "assembly_doc"
}
]
}
]

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

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

View File

@@ -0,0 +1,7 @@
[
{
"button": "button1", "count": 1, "modifiers": ["alt"],
"press_command": "drag_select",
"command": "robot_go_to_keyword"
}
]

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

View File

@@ -0,0 +1,6 @@
[
{"command": "move_to", "args": {"to": "hardeol"}},
{"command": "insert", "args": {"characters": "\n"}},
{"command": "insert", "args": {"characters": "*"}},
{"command": "insert", "args": {"characters": " "}}
]

View File

@@ -0,0 +1,5 @@
[
{
"command": "haxe_run_build"
}
]

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

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

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

View 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

View 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

View 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

View 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

93
script/add-grammar Executable file
View File

@@ -0,0 +1,93 @@
#!/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}"`

View File

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

View File

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

View File

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

View File

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

View File

@@ -5,12 +5,42 @@ class TestGrammars < Minitest::Test
# List of projects that are allowed without licenses
PROJECT_WHITELIST = [
"vendor/grammars/factor",
"vendor/grammars/go-tmbundle",
"vendor/grammars/jflex.tmbundle",
"vendor/grammars/language-csharp",
"vendor/grammars/language-viml",
"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
@@ -90,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
@@ -126,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
@@ -139,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

View File

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

View File

@@ -345,14 +345,26 @@ 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
assert_equal false, Language['C'].wrap
assert_equal true, Language['Markdown'].wrap
@@ -440,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__)))
@@ -448,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

1
vendor/CodeMirror vendored Submodule

Submodule vendor/CodeMirror added at db12d64243

1
vendor/grammars/MQL5-sublime vendored Submodule

View File

@@ -0,0 +1,26 @@
---
type: grammar
name: MQL5-sublime
license: mit
---
MIT License
Copyright (c) 2016 mqsoft
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.