diff --git a/.gitignore b/.gitignore index c0ab5df0..4b360dba 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ /Gemfile.lock .bundle/ +.idea benchmark/ lib/linguist/samples.json /grammars diff --git a/.gitmodules b/.gitmodules index c5562152..6086e01e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -22,9 +22,9 @@ [submodule "vendor/grammars/Sublime-REBOL"] path = vendor/grammars/Sublime-REBOL url = https://github.com/Oldes/Sublime-REBOL -[submodule "vendor/grammars/Sublime-VimL"] - path = vendor/grammars/Sublime-VimL - url = https://github.com/SalGnt/Sublime-VimL +[submodule "vendor/grammars/language-viml"] + path = vendor/grammars/language-viml + url = https://github.com/Alhadis/language-viml [submodule "vendor/grammars/ColdFusion"] path = vendor/grammars/ColdFusion url = https://github.com/SublimeText/ColdFusion @@ -791,6 +791,9 @@ [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 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index eb7532e0..cfba2222 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -27,13 +27,13 @@ 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 an entry for your language to [`languages.yml`][languages]. Omit the `language_id` field for now. 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 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: diff --git a/github-linguist.gemspec b/github-linguist.gemspec index 10a85f34..f9f6ccc6 100644 --- a/github-linguist.gemspec +++ b/github-linguist.gemspec @@ -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 diff --git a/grammars.yml b/grammars.yml index 9df93f90..54030189 100755 --- a/grammars.yml +++ b/grammars.yml @@ -105,8 +105,6 @@ vendor/grammars/Sublime-SQF-Language: vendor/grammars/Sublime-Text-2-OpenEdge-ABL: - source.abl - text.html.abl -vendor/grammars/Sublime-VimL: -- source.viml vendor/grammars/SublimeBrainfuck: - source.bf vendor/grammars/SublimeClarion: @@ -416,6 +414,8 @@ vendor/grammars/language-toc-wow: - source.toc vendor/grammars/language-turing: - source.turing +vendor/grammars/language-viml: +- source.viml vendor/grammars/language-wavefront: - source.wavefront.mtl - source.wavefront.obj diff --git a/lib/linguist/heuristics.rb b/lib/linguist/heuristics.rb index 1d5196f4..7216003f 100644 --- a/lib/linguist/heuristics.rb +++ b/lib/linguist/heuristics.rb @@ -202,6 +202,8 @@ module Linguist disambiguate ".inc" do |data| if /^<\?(?:php)?/.match(data) Language["PHP"] + elsif /^\s*#(declare|local|macro|while)\s/.match(data) + Language["POV-Ray SDL"] end end @@ -242,7 +244,7 @@ module Linguist Language["MUF"] elsif /^\s*;/.match(data) Language["M"] - elsif /^\s*\(\*/.match(data) + elsif /\*\)$/.match(data) Language["Mathematica"] elsif /^\s*%/.match(data) Language["Matlab"] @@ -252,7 +254,7 @@ module Linguist end disambiguate ".md" do |data| - if /^[-a-z0-9=#!\*\[|]/i.match(data) + if /(^[-a-z0-9=#!\*\[|])|<\//i.match(data) || data.empty? Language["Markdown"] elsif /^(;;|\(define_)/.match(data) Language["GCC machine description"] diff --git a/lib/linguist/language.rb b/lib/linguist/language.rb index 7ae48b17..875ef956 100644 --- a/lib/linguist/language.rb +++ b/lib/linguist/language.rb @@ -267,6 +267,7 @@ module Linguist # Returns an Array of Languages. def self.ace_modes warn "This method will be deprecated in a future 5.x release. Every language now has an `ace_mode` set." + warn caller @ace_modes ||= all.select(&:ace_mode).sort_by { |lang| lang.name.downcase } end @@ -300,12 +301,14 @@ module Linguist end @ace_mode = attributes[:ace_mode] + @codemirror_mode = attributes[:codemirror_mode] + @codemirror_mime_type = attributes[:codemirror_mime_type] @wrap = attributes[:wrap] || false # Set legacy search term @search_term = attributes[:search_term] || default_alias_name - # Set the language_id + # Set the language_id @language_id = attributes[:language_id] # Set extensions or default to []. @@ -397,6 +400,31 @@ module Linguist # Returns a String name or nil attr_reader :ace_mode + # Public: Get CodeMirror mode + # + # Maps to a directory in the `mode/` source code. + # https://github.com/codemirror/CodeMirror/tree/master/mode + # + # Examples + # + # # => "nil" + # # => "javascript" + # # => "clike" + # + # Returns a String name or nil + attr_reader :codemirror_mode + + # Public: Get CodeMirror MIME type mode + # + # Examples + # + # # => "nil" + # # => "text/x-javascript" + # # => "text/x-csrc" + # + # Returns a String name or nil + attr_reader :codemirror_mime_type + # Public: Should language lines be wrapped # # Returns true or false @@ -573,6 +601,8 @@ module Linguist :aliases => options['aliases'], :tm_scope => options['tm_scope'], :ace_mode => options['ace_mode'], + :codemirror_mode => options['codemirror_mode'], + :codemirror_mime_type => options['codemirror_mime_type'], :wrap => options['wrap'], :group_name => options['group'], :searchable => options.fetch('searchable', true), diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index b021dcb7..f8e257cd 100755 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -6,6 +6,8 @@ # ace_mode - A String name of the Ace Mode used for highlighting whenever # a file is edited. This must match one of the filenames in http://git.io/3XO_Cg. # Use "text" if a mode does not exist. +# codemirror_mode - A String name of the CodeMirror Mode used for highlighting whenever a file is edited. +# This must match a mode from https://git.io/vi9Fx # wrap - Boolean wrap to enable line wrapping (default: false) # extensions - An Array of associated extensions (the first one is # considered the primary extension, the others should be @@ -15,9 +17,9 @@ # search_term - Deprecated: Some languages may be indexed under a # different alias. Avoid defining new exceptions. # language_id - Integer used as a language-name-independent indexed field so that we can rename -# languages in Linguist without reindexing all the code on GitHub. Must not be +# languages in Linguist without reindexing all the code on GitHub. Must not be # changed for existing languages without the explicit permission of GitHub staff. -# color - CSS hex color to represent the language. +# color - CSS hex color to represent the language. Only used if type is "programming" or "prose" # tm_scope - The TextMate scope that represents this programming # language. This should match one of the scopes listed in # the grammars.yml file. Use "none" if there is no grammar @@ -57,6 +59,8 @@ AGS Script: - ".ash" tm_scope: source.c++ ace_mode: c_cpp + codemirror_mode: clike + codemirror_mime_type: text/x-c++src language_id: 2 AMPL: type: programming @@ -94,15 +98,18 @@ APL: - dyalog tm_scope: source.apl ace_mode: text + codemirror_mode: apl + codemirror_mime_type: text/apl language_id: 6 ASN.1: type: data - color: "#aeead0" extensions: - ".asn" - ".asn1" tm_scope: source.asn ace_mode: text + codemirror_mode: asn.1 + codemirror_mime_type: text/x-ttcn-asn language_id: 7 ASP: type: programming @@ -121,6 +128,8 @@ ASP: - ".aspx" - ".axd" ace_mode: text + codemirror_mode: htmlembedded + codemirror_mime_type: application/x-aspx language_id: 8 ATS: type: programming @@ -183,6 +192,8 @@ Alpine Abuild: - APKBUILD tm_scope: source.shell ace_mode: sh + codemirror_mode: shell + codemirror_mime_type: text/x-sh language_id: 14 Ant Build System: type: data @@ -191,6 +202,8 @@ Ant Build System: - ant.xml - build.xml ace_mode: xml + codemirror_mode: xml + codemirror_mime_type: application/xml language_id: 15 ApacheConf: type: markup @@ -209,6 +222,8 @@ Apex: - ".cls" tm_scope: source.java ace_mode: java + codemirror_mode: clike + codemirror_mime_type: text/x-java language_id: 17 Apollo Guidance Computer: type: programming @@ -246,6 +261,8 @@ Arduino: - ".ino" tm_scope: source.c++ ace_mode: c_cpp + codemirror_mode: clike + codemirror_mime_type: text/x-c++src language_id: 21 AsciiDoc: type: prose @@ -415,6 +432,8 @@ Brainfuck: - ".bf" tm_scope: source.bf ace_mode: text + codemirror_mode: brainfuck + codemirror_mime_type: text/x-brainfuck language_id: 38 Brightscript: type: programming @@ -441,10 +460,14 @@ C: interpreters: - tcc ace_mode: c_cpp + codemirror_mode: clike + codemirror_mime_type: text/x-csrc language_id: 41 C#: type: programming ace_mode: csharp + codemirror_mode: clike + codemirror_mime_type: text/x-csharp tm_scope: source.cs search_term: csharp color: "#178600" @@ -459,6 +482,8 @@ C#: C++: type: programming ace_mode: c_cpp + codemirror_mode: clike + codemirror_mime_type: text/x-c++src search_term: cpp color: "#f34b7d" aliases: @@ -496,6 +521,8 @@ C2hs Haskell: - ".chs" tm_scope: source.haskell ace_mode: haskell + codemirror_mode: haskell + codemirror_mime_type: text/x-haskell language_id: 45 CLIPS: type: programming @@ -512,6 +539,8 @@ CMake: filenames: - CMakeLists.txt ace_mode: text + codemirror_mode: cmake + codemirror_mime_type: text/x-cmake language_id: 47 COBOL: type: programming @@ -522,6 +551,8 @@ COBOL: - ".cobol" - ".cpy" ace_mode: cobol + codemirror_mode: cobol + codemirror_mime_type: text/x-cobol language_id: 48 COLLADA: type: data @@ -529,11 +560,15 @@ COLLADA: - ".dae" tm_scope: text.xml ace_mode: xml + codemirror_mode: xml + codemirror_mime_type: text/xml language_id: 49 CSS: type: markup tm_scope: source.css ace_mode: css + codemirror_mode: css + codemirror_mime_type: text/css color: "#563d7c" extensions: - ".css" @@ -589,6 +624,8 @@ ChucK: - ".ck" tm_scope: source.java ace_mode: java + codemirror_mode: clike + codemirror_mime_type: text/x-java language_id: 57 Cirru: type: programming @@ -625,6 +662,8 @@ Click: Clojure: type: programming ace_mode: clojure + codemirror_mode: clojure + codemirror_mime_type: text/x-clojure color: "#db5855" extensions: - ".clj" @@ -643,6 +682,8 @@ CoffeeScript: type: programming tm_scope: source.coffee ace_mode: coffee + codemirror_mode: coffeescript + codemirror_mime_type: text/x-coffeescript color: "#244776" aliases: - coffee @@ -708,6 +749,8 @@ Common Lisp: - clisp - ecl ace_mode: lisp + codemirror_mode: commonlisp + codemirror_mime_type: text/x-common-lisp language_id: 66 Component Pascal: type: programming @@ -720,6 +763,8 @@ Component Pascal: - delphi - objectpascal ace_mode: pascal + codemirror_mode: pascal + codemirror_mime_type: text/x-pascal language_id: 67 Cool: type: programming @@ -762,6 +807,8 @@ Crystal: extensions: - ".cr" ace_mode: ruby + codemirror_mode: crystal + codemirror_mime_type: text/x-crystal tm_scope: source.crystal interpreters: - crystal @@ -811,6 +858,8 @@ Cuda: - ".cuh" tm_scope: source.cuda-c++ ace_mode: c_cpp + codemirror_mode: clike + codemirror_mime_type: text/x-c++src color: "#3A4E3A" language_id: 77 Cycript: @@ -819,6 +868,8 @@ Cycript: - ".cy" tm_scope: source.js ace_mode: javascript + codemirror_mode: javascript + codemirror_mime_type: text/javascript language_id: 78 Cython: type: programming @@ -830,6 +881,8 @@ Cython: aliases: - pyrex ace_mode: text + codemirror_mode: python + codemirror_mime_type: text/x-cython language_id: 79 D: type: programming @@ -838,6 +891,8 @@ D: - ".d" - ".di" ace_mode: d + codemirror_mode: d + codemirror_mime_type: text/x-d language_id: 80 D-ObjDump: type: data @@ -883,6 +938,8 @@ DTrace: - dtrace tm_scope: source.c ace_mode: c_cpp + codemirror_mode: clike + codemirror_mime_type: text/x-csrc language_id: 85 Darcs Patch: type: data @@ -903,6 +960,8 @@ Dart: interpreters: - dart ace_mode: dart + codemirror_mode: dart + codemirror_mime_type: application/dart language_id: 87 Diff: type: data @@ -913,6 +972,8 @@ Diff: - udiff tm_scope: source.diff ace_mode: diff + codemirror_mode: diff + codemirror_mime_type: text/x-diff language_id: 88 Dockerfile: type: data @@ -922,6 +983,8 @@ Dockerfile: filenames: - Dockerfile ace_mode: dockerfile + codemirror_mode: dockerfile + codemirror_mime_type: text/x-dockerfile language_id: 89 Dogescript: type: programming @@ -940,6 +1003,8 @@ Dylan: - ".intr" - ".lid" ace_mode: text + codemirror_mode: dylan + codemirror_mime_type: text/x-dylan language_id: 91 E: type: programming @@ -959,6 +1024,8 @@ ECL: - ".eclxml" tm_scope: none ace_mode: text + codemirror_mode: ecl + codemirror_mime_type: text/x-ecl language_id: 93 ECLiPSe: type: programming @@ -984,6 +1051,8 @@ EQ: - ".eq" tm_scope: source.cs ace_mode: csharp + codemirror_mode: clike + codemirror_mime_type: text/x-csharp language_id: 96 Eagle: type: markup @@ -993,6 +1062,8 @@ Eagle: - ".brd" tm_scope: text.xml ace_mode: xml + codemirror_mode: xml + codemirror_mime_type: text/xml language_id: 97 Ecere Projects: type: data @@ -1001,6 +1072,8 @@ Ecere Projects: - ".epj" tm_scope: source.json ace_mode: json + codemirror_mode: javascript + codemirror_mime_type: application/json language_id: 98 Eiffel: type: programming @@ -1008,6 +1081,8 @@ Eiffel: extensions: - ".e" ace_mode: eiffel + codemirror_mode: eiffel + codemirror_mime_type: text/x-eiffel language_id: 99 Elixir: type: programming @@ -1028,6 +1103,8 @@ Elm: - ".elm" tm_scope: source.elm ace_mode: elm + codemirror_mode: elm + codemirror_mime_type: text/x-elm language_id: 101 Emacs Lisp: type: programming @@ -1037,14 +1114,22 @@ Emacs Lisp: - elisp - emacs filenames: + - ".abbrev_defs" - ".emacs" - ".emacs.desktop" + - ".gnus" - ".spacemacs" + - ".viper" + - "Project.ede" + - "_emacs" + - "abbrev_defs" extensions: - ".el" - ".emacs" - ".emacs.desktop" ace_mode: lisp + codemirror_mode: commonlisp + codemirror_mime_type: text/x-common-lisp language_id: 102 EmberScript: type: programming @@ -1054,6 +1139,8 @@ EmberScript: - ".emberscript" tm_scope: source.coffee ace_mode: coffee + codemirror_mode: coffeescript + codemirror_mime_type: text/x-coffeescript language_id: 103 Erlang: type: programming @@ -1071,6 +1158,8 @@ Erlang: - rebar.config.lock - rebar.lock ace_mode: erlang + codemirror_mode: erlang + codemirror_mime_type: text/x-erlang interpreters: - escript language_id: 104 @@ -1086,6 +1175,8 @@ F#: - ".fsx" tm_scope: source.fsharp ace_mode: text + codemirror_mode: mllike + codemirror_mime_type: text/x-fsharp language_id: 105 FLUX: type: programming @@ -1110,6 +1201,8 @@ FORTRAN: - ".fpp" tm_scope: source.fortran.modern ace_mode: text + codemirror_mode: fortran + codemirror_mime_type: text/x-fortran language_id: 107 Factor: type: programming @@ -1120,6 +1213,8 @@ Factor: - ".factor-boot-rc" - ".factor-rc" ace_mode: text + codemirror_mode: factor + codemirror_mime_type: text/x-factor language_id: 108 Fancy: type: programming @@ -1175,6 +1270,8 @@ Forth: - ".frt" - ".fs" ace_mode: forth + codemirror_mode: forth + codemirror_mime_type: text/x-forth language_id: 114 FreeMarker: type: programming @@ -1236,6 +1333,8 @@ GCC Machine Description: - ".md" tm_scope: source.lisp ace_mode: lisp + codemirror_mode: commonlisp + codemirror_mime_type: text/x-common-lisp language_id: 121 GDB: type: programming @@ -1280,6 +1379,8 @@ Game Maker Language: - ".gml" tm_scope: source.c++ ace_mode: c_cpp + codemirror_mode: clike + codemirror_mime_type: text/x-c++src language_id: 125 Genshi: type: programming @@ -1290,6 +1391,8 @@ Genshi: - xml+genshi - xml+kid ace_mode: xml + codemirror_mode: xml + codemirror_mime_type: text/xml language_id: 126 Gentoo Ebuild: type: programming @@ -1298,6 +1401,8 @@ Gentoo Ebuild: - ".ebuild" tm_scope: source.shell ace_mode: sh + codemirror_mode: shell + codemirror_mime_type: text/x-sh language_id: 127 Gentoo Eclass: type: programming @@ -1306,6 +1411,8 @@ Gentoo Eclass: - ".eclass" tm_scope: source.shell ace_mode: sh + codemirror_mode: shell + codemirror_mime_type: text/x-sh language_id: 128 Gettext Catalog: type: prose @@ -1326,6 +1433,8 @@ Glyph: - ".glf" tm_scope: source.tcl ace_mode: tcl + codemirror_mode: tcl + codemirror_mime_type: text/x-tcl language_id: 130 Gnuplot: type: programming @@ -1346,6 +1455,8 @@ Go: extensions: - ".go" ace_mode: golang + codemirror_mode: go + codemirror_mime_type: text/x-go language_id: 132 Golo: type: programming @@ -1391,6 +1502,8 @@ Grammatical Framework: color: "#79aa7a" tm_scope: source.haskell ace_mode: haskell + codemirror_mode: haskell + codemirror_mime_type: text/x-haskell language_id: 137 Graph Modeling Language: type: data @@ -1450,10 +1563,14 @@ Groff: - nroff - troff ace_mode: text + codemirror_mode: troff + codemirror_mime_type: text/troff language_id: 141 Groovy: type: programming ace_mode: groovy + codemirror_mode: groovy + codemirror_mime_type: text/x-groovy color: "#e69f56" extensions: - ".groovy" @@ -1475,6 +1592,8 @@ Groovy Server Pages: - ".gsp" tm_scope: text.html.jsp ace_mode: jsp + codemirror_mode: htmlembedded + codemirror_mime_type: application/x-jsp language_id: 143 HCL: type: programming @@ -1482,6 +1601,8 @@ HCL: - ".hcl" - ".tf" ace_mode: ruby + codemirror_mode: ruby + codemirror_mime_type: text/x-ruby tm_scope: source.ruby language_id: 144 HLSL: @@ -1498,6 +1619,8 @@ HTML: type: markup tm_scope: text.html.basic ace_mode: html + codemirror_mode: htmlmixed + codemirror_mime_type: text/html color: "#e44b23" aliases: - xhtml @@ -1523,6 +1646,8 @@ HTML+Django: - html+jinja - htmldjango ace_mode: django + codemirror_mode: django + codemirror_mime_type: text/x-django language_id: 147 HTML+ECR: type: markup @@ -1533,6 +1658,8 @@ HTML+ECR: extensions: - ".ecr" ace_mode: text + codemirror_mode: htmlmixed + codemirror_mime_type: text/html language_id: 148 HTML+EEX: type: markup @@ -1543,6 +1670,8 @@ HTML+EEX: extensions: - ".eex" ace_mode: text + codemirror_mode: htmlmixed + codemirror_mime_type: text/html language_id: 149 HTML+ERB: type: markup @@ -1554,6 +1683,8 @@ HTML+ERB: - ".erb" - ".erb.deface" ace_mode: text + codemirror_mode: htmlembedded + codemirror_mime_type: application/x-erb language_id: 150 HTML+PHP: type: markup @@ -1562,6 +1693,8 @@ HTML+PHP: extensions: - ".phtml" ace_mode: php + codemirror_mode: php + codemirror_mime_type: application/x-httpd-php language_id: 151 HTTP: type: data @@ -1569,10 +1702,14 @@ HTTP: - ".http" tm_scope: source.httpspec ace_mode: text + codemirror_mode: http + codemirror_mime_type: message/http language_id: 152 Hack: type: programming ace_mode: php + codemirror_mode: php + codemirror_mime_type: application/x-httpd-php extensions: - ".hh" - ".php" @@ -1586,6 +1723,8 @@ Haml: - ".haml" - ".haml.deface" ace_mode: haml + codemirror_mode: haml + codemirror_mime_type: text/x-haml color: "#ECE2A9" language_id: 154 Handlebars: @@ -1618,10 +1757,14 @@ Haskell: interpreters: - runhaskell ace_mode: haskell + codemirror_mode: haskell + codemirror_mime_type: text/x-haskell language_id: 157 Haxe: type: programming ace_mode: haxe + codemirror_mode: haxe + codemirror_mime_type: text/x-haxe color: "#df7900" extensions: - ".hx" @@ -1652,6 +1795,8 @@ IDL: - ".pro" - ".dlm" ace_mode: text + codemirror_mode: idl + codemirror_mime_type: text/x-idl language_id: 161 IGOR Pro: type: programming @@ -1675,6 +1820,8 @@ INI: aliases: - dosini ace_mode: ini + codemirror_mode: properties + codemirror_mime_type: text/x-properties language_id: 163 IRC log: type: data @@ -1774,6 +1921,8 @@ JSON: tm_scope: source.json group: JavaScript ace_mode: json + codemirror_mode: javascript + codemirror_mime_type: application/json searchable: false extensions: - ".json" @@ -1792,6 +1941,8 @@ JSON5: - ".json5" tm_scope: source.js ace_mode: javascript + codemirror_mode: javascript + codemirror_mime_type: application/json language_id: 175 JSONLD: type: data @@ -1805,6 +1956,8 @@ JSONiq: color: "#40d47e" type: programming ace_mode: jsoniq + codemirror_mode: javascript + codemirror_mime_type: application/json extensions: - ".jq" tm_scope: source.jq @@ -1816,6 +1969,8 @@ JSX: - ".jsx" tm_scope: source.js.jsx ace_mode: javascript + codemirror_mode: jsx + codemirror_mime_type: text/jsx language_id: 178 Jade: group: HTML @@ -1825,6 +1980,8 @@ Jade: - ".pug" tm_scope: text.jade ace_mode: jade + codemirror_mode: pug + codemirror_mime_type: text/x-pug language_id: 179 Jasmin: type: programming @@ -1836,6 +1993,8 @@ Jasmin: Java: type: programming ace_mode: java + codemirror_mode: clike + codemirror_mime_type: text/x-java color: "#b07219" extensions: - ".java" @@ -1850,11 +2009,15 @@ Java Server Pages: - ".jsp" tm_scope: text.html.jsp ace_mode: jsp + codemirror_mode: htmlembedded + codemirror_mime_type: application/x-jsp language_id: 182 JavaScript: type: programming tm_scope: source.js ace_mode: javascript + codemirror_mode: javascript + codemirror_mime_type: text/javascript color: "#f1e05a" aliases: - js @@ -1903,10 +2066,14 @@ Julia: - ".jl" color: "#a270ba" ace_mode: julia + codemirror_mode: julia + codemirror_mime_type: text/x-julia language_id: 184 Jupyter Notebook: type: markup ace_mode: json + codemirror_mode: javascript + codemirror_mime_type: application/json tm_scope: source.json color: "#DA5B0B" extensions: @@ -1936,6 +2103,8 @@ KiCad: Kit: type: markup ace_mode: html + codemirror_mode: htmlmixed + codemirror_mime_type: text/html extensions: - ".kit" tm_scope: text.html.basic @@ -1949,6 +2118,8 @@ Kotlin: - ".kts" tm_scope: source.Kotlin ace_mode: text + codemirror_mode: clike + codemirror_mime_type: text/x-kotlin language_id: 189 LFE: type: programming @@ -1958,6 +2129,8 @@ LFE: group: Erlang tm_scope: source.lisp ace_mode: lisp + codemirror_mode: commonlisp + codemirror_mime_type: text/x-common-lisp language_id: 190 LLVM: type: programming @@ -1990,6 +2163,8 @@ LabVIEW: - ".lvproj" tm_scope: text.xml ace_mode: xml + codemirror_mode: xml + codemirror_mime_type: text/xml language_id: 194 Lasso: type: programming @@ -2013,6 +2188,8 @@ Latte: - ".latte" tm_scope: text.html.smarty ace_mode: smarty + codemirror_mode: smarty + codemirror_mime_type: text/x-smarty language_id: 196 Lean: type: programming @@ -2028,6 +2205,8 @@ Less: - ".less" tm_scope: source.css.less ace_mode: less + codemirror_mode: css + codemirror_mime_type: text/css color: "#A1D9A1" language_id: 198 Lex: @@ -2111,6 +2290,8 @@ Literate Haskell: - ".lhs" tm_scope: text.tex.latex.haskell ace_mode: text + codemirror_mode: haskell-literate + codemirror_mime_type: text/x-literate-haskell language_id: 207 LiveScript: type: programming @@ -2124,6 +2305,8 @@ LiveScript: filenames: - Slakefile ace_mode: livescript + codemirror_mode: livescript + codemirror_mime_type: text/x-livescript language_id: 208 Logos: type: programming @@ -2144,6 +2327,8 @@ Logtalk: LookML: type: programming ace_mode: yaml + codemirror_mode: yaml + codemirror_mime_type: text/x-yaml color: "#652B81" extensions: - ".lookml" @@ -2159,6 +2344,8 @@ LoomScript: Lua: type: programming ace_mode: lua + codemirror_mode: lua + codemirror_mime_type: text/x-lua color: "#000080" extensions: - ".lua" @@ -2177,9 +2364,11 @@ M: extensions: - ".mumps" - ".m" - tm_scope: source.lisp - ace_mode: lisp + ace_mode: text + codemirror_mode: mumps + codemirror_mime_type: text/x-mumps language_id: 214 + tm_scope: none M4: type: programming extensions: @@ -2233,6 +2422,8 @@ MTML: - ".mtml" tm_scope: text.html.basic ace_mode: html + codemirror_mode: htmlmixed + codemirror_mime_type: text/html language_id: 218 MUF: type: programming @@ -2242,6 +2433,8 @@ MUF: - ".m" tm_scope: none ace_mode: forth + codemirror_mode: forth + codemirror_mime_type: text/x-forth language_id: 219 Makefile: type: programming @@ -2253,6 +2446,7 @@ Makefile: extensions: - ".mak" - ".d" + - ".make" - ".mk" - ".mkfile" filenames: @@ -2270,6 +2464,8 @@ Makefile: interpreters: - make ace_mode: makefile + codemirror_mode: cmake + codemirror_mime_type: text/x-cmake language_id: 220 Mako: type: programming @@ -2282,6 +2478,8 @@ Mako: Markdown: type: prose ace_mode: markdown + codemirror_mode: gfm + codemirror_mime_type: text/x-gfm wrap: true extensions: - ".md" @@ -2315,6 +2513,8 @@ Mathematica: aliases: - mma ace_mode: text + codemirror_mode: mathematica + codemirror_mime_type: text/x-mathematica language_id: 224 Matlab: type: programming @@ -2325,6 +2525,8 @@ Matlab: - ".matlab" - ".m" ace_mode: matlab + codemirror_mode: octave + codemirror_mime_type: text/x-octave language_id: 225 Maven POM: type: data @@ -2332,6 +2534,8 @@ Maven POM: filenames: - pom.xml ace_mode: xml + codemirror_mode: xml + codemirror_mime_type: text/xml language_id: 226 Max: type: programming @@ -2348,6 +2552,8 @@ Max: - ".pat" tm_scope: source.json ace_mode: json + codemirror_mode: javascript + codemirror_mime_type: application/json language_id: 227 MediaWiki: type: prose @@ -2376,6 +2582,8 @@ Metal: - ".metal" tm_scope: source.c++ ace_mode: c_cpp + codemirror_mode: clike + codemirror_mime_type: text/x-c++src language_id: 230 MiniD: type: programming @@ -2396,6 +2604,8 @@ Mirah: - ".mirah" tm_scope: source.ruby ace_mode: ruby + codemirror_mode: ruby + codemirror_mime_type: text/x-ruby language_id: 232 Modelica: type: programming @@ -2403,6 +2613,8 @@ Modelica: - ".mo" tm_scope: source.modelica ace_mode: text + codemirror_mode: modelica + codemirror_mime_type: text/x-modelica language_id: 233 Modula-2: type: programming @@ -2472,6 +2684,8 @@ NSIS: - ".nsi" - ".nsh" ace_mode: text + codemirror_mode: nsis + codemirror_mime_type: text/x-nsis language_id: 242 Nemerle: type: programming @@ -2505,6 +2719,8 @@ NetLogo: - ".nlogo" tm_scope: source.lisp ace_mode: lisp + codemirror_mode: commonlisp + codemirror_mime_type: text/x-common-lisp language_id: 246 NewLisp: type: programming @@ -2518,6 +2734,8 @@ NewLisp: - newlisp tm_scope: source.lisp ace_mode: lisp + codemirror_mode: commonlisp + codemirror_mime_type: text/x-common-lisp language_id: 247 Nginx: type: markup @@ -2530,6 +2748,8 @@ Nginx: aliases: - nginx configuration file ace_mode: text + codemirror_mode: nginx + codemirror_mime_type: text/x-nginx-conf color: "#9469E9" language_id: 248 Nimrod: @@ -2577,6 +2797,8 @@ Nu: - Nukefile tm_scope: source.nu ace_mode: scheme + codemirror_mode: scheme + codemirror_mime_type: text/x-scheme interpreters: - nush language_id: 253 @@ -2589,11 +2811,15 @@ NumPy: - ".numsc" tm_scope: none ace_mode: text + codemirror_mode: python + codemirror_mime_type: text/x-python color: "#9C8AF9" language_id: 254 OCaml: type: programming ace_mode: ocaml + codemirror_mode: mllike + codemirror_mime_type: text/x-ocaml color: "#3be133" extensions: - ".ml" @@ -2628,6 +2854,8 @@ Objective-C: - ".m" - ".h" ace_mode: objectivec + codemirror_mode: clike + codemirror_mime_type: text/x-objectivec language_id: 257 Objective-C++: type: programming @@ -2640,6 +2868,8 @@ Objective-C++: extensions: - ".mm" ace_mode: objectivec + codemirror_mode: clike + codemirror_mime_type: text/x-objectivec language_id: 258 Objective-J: type: programming @@ -2684,6 +2914,8 @@ OpenCL: - ".opencl" tm_scope: source.c ace_mode: c_cpp + codemirror_mode: clike + codemirror_mime_type: text/x-csrc language_id: 263 OpenEdge ABL: type: programming @@ -2706,6 +2938,8 @@ OpenRC runscript: - openrc-run tm_scope: source.shell ace_mode: sh + codemirror_mode: shell + codemirror_mime_type: text/x-sh language_id: 265 OpenSCAD: type: programming @@ -2746,6 +2980,8 @@ Oz: - ".oz" tm_scope: source.oz ace_mode: text + codemirror_mode: oz + codemirror_mime_type: text/x-oz language_id: 270 PAWN: type: programming @@ -2760,6 +2996,8 @@ PHP: type: programming tm_scope: text.html.php ace_mode: php + codemirror_mode: php + codemirror_mime_type: application/x-httpd-php color: "#4F5D95" extensions: - ".php" @@ -2782,6 +3020,8 @@ PHP: PLSQL: type: programming ace_mode: sql + codemirror_mode: sql + codemirror_mime_type: text/x-plsql tm_scope: none color: "#dad8d8" extensions: @@ -2796,6 +3036,8 @@ PLSQL: PLpgSQL: type: programming ace_mode: pgsql + codemirror_mode: sql + codemirror_mime_type: text/x-sql tm_scope: source.sql extensions: - ".sql" @@ -2872,11 +3114,15 @@ Pascal: interpreters: - instantfpc ace_mode: pascal + codemirror_mode: pascal + codemirror_mime_type: text/x-pascal language_id: 281 Perl: type: programming tm_scope: source.perl ace_mode: perl + codemirror_mode: perl + codemirror_mime_type: text/x-perl color: "#0298c3" extensions: - ".pl" @@ -2914,6 +3160,8 @@ Perl6: - perl6 tm_scope: source.perl6fe ace_mode: perl + codemirror_mode: perl + codemirror_mime_type: text/x-perl language_id: 283 Pickle: type: data @@ -2953,6 +3201,8 @@ Pike: Pod: type: prose ace_mode: perl + codemirror_mode: perl + codemirror_mime_type: text/x-perl wrap: true extensions: - ".pod" @@ -2998,6 +3248,8 @@ PowerBuilder: PowerShell: type: programming ace_mode: powershell + codemirror_mode: powershell + codemirror_mime_type: application/x-powershell aliases: - posh extensions: @@ -3043,6 +3295,8 @@ Protocol Buffer: - ".proto" tm_scope: source.protobuf ace_mode: protobuf + codemirror_mode: protobuf + codemirror_mime_type: text/x-protobuf language_id: 297 Public Key: type: data @@ -3060,6 +3314,8 @@ Puppet: filenames: - Modulefile ace_mode: text + codemirror_mode: puppet + codemirror_mime_type: text/x-puppet tm_scope: source.puppet language_id: 299 Pure Data: @@ -3086,10 +3342,14 @@ PureScript: - ".purs" tm_scope: source.purescript ace_mode: haskell + codemirror_mode: haskell + codemirror_mime_type: text/x-haskell language_id: 302 Python: type: programming ace_mode: python + codemirror_mode: python + codemirror_mime_type: text/x-python color: "#3572A5" extensions: - ".py" @@ -3164,10 +3424,14 @@ R: interpreters: - Rscript ace_mode: r + codemirror_mode: r + codemirror_mime_type: text/x-rsrc language_id: 307 RAML: type: markup ace_mode: yaml + codemirror_mode: yaml + codemirror_mime_type: text/x-yaml tm_scope: source.yaml color: "#77d9fb" extensions: @@ -3213,11 +3477,15 @@ RHTML: aliases: - html+ruby ace_mode: rhtml + codemirror_mode: htmlembedded + codemirror_mime_type: application/x-erb language_id: 312 RMarkdown: type: prose wrap: true ace_mode: markdown + codemirror_mode: gfm + codemirror_mime_type: text/x-gfm extensions: - ".rmd" tm_scope: source.gfm @@ -3230,6 +3498,8 @@ RPM Spec: aliases: - specfile ace_mode: text + codemirror_mode: rpm + codemirror_mime_type: text/x-rpm-spec language_id: 314 RUNOFF: type: markup @@ -3332,6 +3602,8 @@ RobotFramework: Rouge: type: programming ace_mode: clojure + codemirror_mode: clojure + codemirror_mime_type: text/x-clojure color: "#cc0088" extensions: - ".rg" @@ -3340,6 +3612,8 @@ Rouge: Ruby: type: programming ace_mode: ruby + codemirror_mode: ruby + codemirror_mime_type: text/x-ruby color: "#701516" aliases: - jruby @@ -3401,6 +3675,8 @@ Rust: - ".rs" - ".rs.in" ace_mode: rust + codemirror_mode: rust + codemirror_mime_type: text/x-rustsrc language_id: 327 SAS: type: programming @@ -3409,12 +3685,16 @@ SAS: - ".sas" tm_scope: source.sas ace_mode: text + codemirror_mode: sas + codemirror_mime_type: text/x-sas language_id: 328 SCSS: type: markup tm_scope: source.scss group: CSS ace_mode: scss + codemirror_mode: css + codemirror_mime_type: text/x-scss extensions: - ".scss" color: "#CF649A" @@ -3442,6 +3722,8 @@ SPARQL: type: data tm_scope: source.sparql ace_mode: text + codemirror_mode: sparql + codemirror_mime_type: application/sparql-query extensions: - ".sparql" - ".rq" @@ -3459,6 +3741,8 @@ SQL: type: data tm_scope: source.sql ace_mode: sql + codemirror_mode: sql + codemirror_mime_type: text/x-sql extensions: - ".sql" - ".cql" @@ -3472,6 +3756,8 @@ SQL: SQLPL: type: programming ace_mode: sql + codemirror_mode: sql + codemirror_mime_type: text/x-sql tm_scope: source.sql extensions: - ".sql" @@ -3482,6 +3768,8 @@ SRecode Template: color: "#348a34" tm_scope: source.lisp ace_mode: lisp + codemirror_mode: commonlisp + codemirror_mime_type: text/x-common-lisp extensions: - ".srt" language_id: 335 @@ -3499,6 +3787,8 @@ SVG: - ".svg" tm_scope: text.xml ace_mode: xml + codemirror_mode: xml + codemirror_mime_type: text/xml language_id: 337 Sage: type: programming @@ -3508,6 +3798,8 @@ Sage: - ".sagews" tm_scope: source.python ace_mode: python + codemirror_mode: python + codemirror_mime_type: text/x-python language_id: 338 SaltStack: type: programming @@ -3519,6 +3811,8 @@ SaltStack: - ".sls" tm_scope: source.yaml.salt ace_mode: yaml + codemirror_mode: yaml + codemirror_mime_type: text/x-yaml language_id: 339 Sass: type: markup @@ -3527,11 +3821,15 @@ Sass: extensions: - ".sass" ace_mode: sass + codemirror_mode: sass + codemirror_mime_type: text/x-sass color: "#CF649A" language_id: 340 Scala: type: programming ace_mode: scala + codemirror_mode: clike + codemirror_mime_type: text/x-scala color: "#c22d40" extensions: - ".scala" @@ -3565,6 +3863,8 @@ Scheme: - gosh - r6rs ace_mode: scheme + codemirror_mode: scheme + codemirror_mime_type: text/x-scheme language_id: 343 Scilab: type: programming @@ -3616,6 +3916,8 @@ Shell: - sh - zsh ace_mode: sh + codemirror_mode: shell + codemirror_mime_type: text/x-sh language_id: 346 ShellSession: type: programming @@ -3626,6 +3928,8 @@ ShellSession: - console tm_scope: text.shell-session ace_mode: sh + codemirror_mode: shell + codemirror_mime_type: text/x-sh language_id: 347 Shen: type: programming @@ -3651,6 +3955,8 @@ Slim: - ".slim" tm_scope: text.slim ace_mode: text + codemirror_mode: slim + codemirror_mime_type: text/x-slim language_id: 350 Smali: type: programming @@ -3668,12 +3974,16 @@ Smalltalk: aliases: - squeak ace_mode: text + codemirror_mode: smalltalk + codemirror_mime_type: text/x-stsrc language_id: 352 Smarty: type: programming extensions: - ".tpl" ace_mode: smarty + codemirror_mode: smarty + codemirror_mime_type: text/x-smarty tm_scope: text.html.smarty language_id: 353 SourcePawn: @@ -3695,6 +4005,8 @@ Squirrel: - ".nut" tm_scope: source.c++ ace_mode: c_cpp + codemirror_mode: clike + codemirror_mime_type: text/x-c++src language_id: 355 Stan: type: programming @@ -3716,6 +4028,8 @@ Standard ML: - ".sml" tm_scope: source.ml ace_mode: text + codemirror_mode: mllike + codemirror_mime_type: text/x-ocaml language_id: 357 Stata: type: programming @@ -3762,6 +4076,8 @@ Swift: extensions: - ".swift" ace_mode: text + codemirror_mode: swift + codemirror_mime_type: text/x-swift language_id: 362 SystemVerilog: type: programming @@ -3771,6 +4087,8 @@ SystemVerilog: - ".svh" - ".vh" ace_mode: verilog + codemirror_mode: verilog + codemirror_mime_type: text/x-systemverilog language_id: 363 TLA: type: programming @@ -3785,6 +4103,8 @@ TOML: - ".toml" tm_scope: source.toml ace_mode: toml + codemirror_mode: toml + codemirror_mime_type: text/x-toml language_id: 365 TXL: type: programming @@ -3804,6 +4124,8 @@ Tcl: - tclsh - wish ace_mode: tcl + codemirror_mode: tcl + codemirror_mime_type: text/x-tcl language_id: 367 Tcsh: type: programming @@ -3813,11 +4135,15 @@ Tcsh: - ".csh" tm_scope: source.shell ace_mode: sh + codemirror_mode: shell + codemirror_mime_type: text/x-sh language_id: 368 TeX: type: markup color: "#3D6117" ace_mode: tex + codemirror_mode: stex + codemirror_mime_type: text/x-stex wrap: true aliases: - latex @@ -3851,6 +4177,8 @@ Terra: - ".t" color: "#00004c" ace_mode: lua + codemirror_mode: lua + codemirror_mime_type: text/x-lua interpreters: - lua language_id: 371 @@ -3883,6 +4211,8 @@ Text: Textile: type: prose ace_mode: textile + codemirror_mode: textile + codemirror_mime_type: text/x-textile wrap: true extensions: - ".textile" @@ -3910,6 +4240,8 @@ Turtle: - ".ttl" tm_scope: source.turtle ace_mode: text + codemirror_mode: turtle + codemirror_mime_type: text/turtle language_id: 376 Twig: type: markup @@ -3918,6 +4250,8 @@ Twig: - ".twig" tm_scope: text.html.twig ace_mode: twig + codemirror_mode: twig + codemirror_mime_type: text/x-twig language_id: 377 TypeScript: type: programming @@ -3929,11 +4263,15 @@ TypeScript: - ".tsx" tm_scope: source.ts ace_mode: typescript + codemirror_mode: javascript + codemirror_mime_type: application/typescript language_id: 378 Unified Parallel C: type: programming group: C ace_mode: c_cpp + codemirror_mode: clike + codemirror_mime_type: text/x-csrc color: "#4e3617" extensions: - ".upc" @@ -3942,6 +4280,8 @@ Unified Parallel C: Unity3D Asset: type: data ace_mode: yaml + codemirror_mode: yaml + codemirror_mime_type: text/x-yaml extensions: - ".anim" - ".asset" @@ -3956,6 +4296,8 @@ Uno: extensions: - ".uno" ace_mode: csharp + codemirror_mode: clike + codemirror_mime_type: text/x-csharp tm_scope: source.cs language_id: 381 UnrealScript: @@ -3965,6 +4307,8 @@ UnrealScript: - ".uc" tm_scope: source.java ace_mode: java + codemirror_mode: clike + codemirror_mime_type: text/x-java language_id: 382 UrWeb: type: programming @@ -3998,6 +4342,8 @@ VHDL: - ".vht" - ".vhw" ace_mode: vhdl + codemirror_mode: vhdl + codemirror_mime_type: text/x-vhdl language_id: 385 Vala: type: programming @@ -4014,11 +4360,14 @@ Verilog: - ".v" - ".veo" ace_mode: verilog + codemirror_mode: verilog + codemirror_mime_type: text/x-verilog language_id: 387 VimL: type: programming color: "#199f4b" search_term: vim + tm_scope: source.viml aliases: - vim - nvim @@ -4050,6 +4399,8 @@ Visual Basic: - vb.net - vbnet ace_mode: text + codemirror_mode: vb + codemirror_mime_type: text/x-vb language_id: 389 Volt: type: programming @@ -4058,6 +4409,8 @@ Volt: - ".volt" tm_scope: source.d ace_mode: d + codemirror_mode: d + codemirror_mime_type: text/x-d language_id: 390 Vue: type: markup @@ -4095,6 +4448,8 @@ WebIDL: - ".webidl" tm_scope: source.webidl ace_mode: text + codemirror_mode: webidl + codemirror_mime_type: text/x-webidl language_id: 395 World of Warcraft Addon Data: type: data @@ -4120,10 +4475,14 @@ XC: - ".xc" tm_scope: source.xc ace_mode: c_cpp + codemirror_mode: clike + codemirror_mime_type: text/x-csrc language_id: 398 XML: type: data ace_mode: xml + codemirror_mode: xml + codemirror_mime_type: text/xml aliases: - rss - xsd @@ -4232,6 +4591,8 @@ XPages: - ".xsp.metadata" tm_scope: none ace_mode: xml + codemirror_mode: xml + codemirror_mime_type: text/xml language_id: 400 XProc: type: programming @@ -4240,6 +4601,8 @@ XProc: - ".xproc" tm_scope: text.xml ace_mode: xml + codemirror_mode: xml + codemirror_mime_type: text/xml language_id: 401 XQuery: type: programming @@ -4251,6 +4614,8 @@ XQuery: - ".xqm" - ".xqy" ace_mode: xquery + codemirror_mode: xquery + codemirror_mime_type: application/xquery tm_scope: source.xq language_id: 402 XS: @@ -4259,6 +4624,8 @@ XS: - ".xs" tm_scope: source.c ace_mode: c_cpp + codemirror_mode: clike + codemirror_mime_type: text/x-csrc language_id: 403 XSLT: type: programming @@ -4269,6 +4636,8 @@ XSLT: - ".xsl" tm_scope: text.xml.xsl ace_mode: xml + codemirror_mode: xml + codemirror_mime_type: text/xml color: "#EB8CEB" language_id: 404 Xojo: @@ -4305,6 +4674,8 @@ YAML: filenames: - ".clang-format" ace_mode: yaml + codemirror_mode: yaml + codemirror_mime_type: text/x-yaml language_id: 407 YANG: type: data @@ -4361,6 +4732,8 @@ eC: edn: type: data ace_mode: clojure + codemirror_mode: clojure + codemirror_mime_type: text/x-clojure extensions: - ".edn" tm_scope: source.clojure @@ -4408,10 +4781,14 @@ reStructuredText: - ".rest.txt" - ".rst.txt" ace_mode: text + codemirror_mode: rst + codemirror_mime_type: text/x-rst language_id: 419 wisp: type: programming ace_mode: clojure + codemirror_mode: clojure + codemirror_mime_type: text/x-clojure color: "#7582D1" extensions: - ".wisp" diff --git a/lib/linguist/strategy/modeline.rb b/lib/linguist/strategy/modeline.rb index 4e16a03c..5d63a6a0 100644 --- a/lib/linguist/strategy/modeline.rb +++ b/lib/linguist/strategy/modeline.rb @@ -1,19 +1,98 @@ module Linguist module Strategy class Modeline - EMACS_MODELINE = /-\*-\s*(?:(?!mode)[\w-]+\s*:\s*(?:[\w+-]+)\s*;?\s*)*(?:mode\s*:)?\s*([\w+-]+)\s*(?:;\s*(?!mode)[\w-]+\s*:\s*[\w+-]+\s*)*;?\s*-\*-/i + EMACS_MODELINE = / + -\*- + (?: + # Short form: `-*- ruby -*-` + \s* (?= [^:;\s]+ \s* -\*-) + | + # Longer form: `-*- foo:bar; mode: ruby; -*-` + (?: + .*? # Preceding variables: `-*- foo:bar bar:baz;` + [;\s] # Which are delimited by spaces or semicolons + | + (?<=-\*-) # Not preceded by anything: `-*-mode:ruby-*-` + ) + mode # Major mode indicator + \s*:\s* # Allow whitespace around colon: `mode : ruby` + ) + ([^:;\s]+) # Name of mode - # First form vim modeline - # [text]{white}{vi:|vim:|ex:}[white]{options} - # ex: 'vim: syntax=ruby' - VIM_MODELINE_1 = /(?:vim|vi|ex):\s*(?:ft|filetype|syntax)=(\w+)\s?/i + # Ensure the mode is terminated correctly + (?= + # Followed by semicolon or whitespace + [\s;] + | + # Touching the ending sequence: `ruby-*-` + (?]?\d+|m)? # Version-specific modeline + | + [\t\x20] # `ex:` requires whitespace, because "ex:" might be short for "example:" + ex + ) + + # If the option-list begins with `set ` or `se `, it indicates an alternative + # modeline syntax partly-compatible with older versions of Vi. Here, the colon + # serves as a terminator for an option sequence, delimited by whitespace. + (?= + # So we have to ensure the modeline ends with a colon + : (?=\s* set? \s [^\n:]+ :) | + + # Otherwise, it isn't valid syntax and should be ignored + : (?!\s* set? \s) + ) + + # Possible (unrelated) `option=value` pairs to skip past + (?: + # Option separator. Vim uses whitespace or colons to separate options (except if + # the alternate "vim: set " form is used, where only whitespace is used) + (?: + \s + | + \s* : \s* # Note that whitespace around colons is accepted too: + ) # vim: noai : ft=ruby:noexpandtab + + # Option's name. All recognised Vim options have an alphanumeric form. + \w* + + # Possible value. Not every option takes an argument. + (?: + # Whitespace between name and value is allowed: `vim: ft =ruby` + \s*= + + # Option's value. Might be blank; `vim: ft= ` says "use no filetype". + (?: + [^\\\s] # Beware of escaped characters: titlestring=\ ft=ruby + | # will be read by Vim as { titlestring: " ft=ruby" }. + \\. + )* + )? + )* + + # The actual filetype declaration + [\s:] (?:filetype|ft|syntax) \s*= + + # Language's name + (\w+) + + # Ensure it's followed by a legal separator + (?=\s|:|$) + /xi + + MODELINES = [EMACS_MODELINE, VIM_MODELINE] # Scope of the search for modelines # Number of lines to check at the beginning and at the end of the file diff --git a/lib/linguist/vendor.yml b/lib/linguist/vendor.yml index 6b8c7364..0e6daa27 100644 --- a/lib/linguist/vendor.yml +++ b/lib/linguist/vendor.yml @@ -165,7 +165,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 +229,9 @@ # Fabric - Fabric.framework/ +# BuddyBuild +- BuddyBuildSDK.framework/ + # git config files - gitattributes$ - gitignore$ diff --git a/lib/linguist/version.rb b/lib/linguist/version.rb index 1fbf952c..8218aafe 100644 --- a/lib/linguist/version.rb +++ b/lib/linguist/version.rb @@ -1,3 +1,3 @@ module Linguist - VERSION = "4.8.12" + VERSION = "4.8.15" end diff --git a/package.json b/package.json index 827997e5..c2e22111 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "repository": "https://github.com/github/linguist", "dependencies": { - "season": "~>5.0" + "season": "~>5.4" }, "license": "MIT" } diff --git a/samples/Emacs Lisp/filenames/.abbrev_defs b/samples/Emacs Lisp/filenames/.abbrev_defs new file mode 100644 index 00000000..dc29dfde --- /dev/null +++ b/samples/Emacs Lisp/filenames/.abbrev_defs @@ -0,0 +1,6 @@ +(define-abbrev-table 'c-mode-abbrev-table '( + )) +(define-abbrev-table 'fundamental-mode-abbrev-table '( + ("TM" "™" nil 0) + ("(R)" "®" nil 0) + ("C=" "€" nil 0))) diff --git a/samples/Emacs Lisp/filenames/.gnus b/samples/Emacs Lisp/filenames/.gnus new file mode 100644 index 00000000..bfd859dd --- /dev/null +++ b/samples/Emacs Lisp/filenames/.gnus @@ -0,0 +1,20 @@ +(setq user-full-name "Alhadis") +(setq user-mail-address "fake.account@gmail.com") + +(auto-image-file-mode) +(setq mm-inline-large-images t) +(add-to-list 'mm-attachment-override-types "image/*") + +(setq gnus-select-method + '(nnimap "gmail" + (nnimap-address "imap.gmail.com") + (nnimap-server-port 777) + (nnimap-stream ssl))) + +(setq message-send-mail-function 'smtpmail-send-it + smtpmail-starttls-credentials '(("smtp.gmail.com" 600 nil nil)) + smtpmail-auth-credentials '(("smtp.gmail.com" 700 "me@lisp.com" nil)) + smtpmail-default-smtp-server "smtp.gmail.com" + smtpmail-smtp-server "smtp.gmail.com" + smtpmail-smtp-service 800 + setq gnus-ignored-from-addresses "^from\\.Telstra[ \t\r\n]+Thanks") diff --git a/samples/Emacs Lisp/filenames/.viper b/samples/Emacs Lisp/filenames/.viper new file mode 100644 index 00000000..c3eeb658 --- /dev/null +++ b/samples/Emacs Lisp/filenames/.viper @@ -0,0 +1,10 @@ +(setq viper-inhibit-startup-message 't) +(setq viper-expert-level '5) + +; Key bindings +(define-key viper-vi-global-user-map "\C-d" 'end-of-line) + +; Return to top of window +(defun my-viper-return-to-top () + (interactive) + (beginning-of-buffer)) diff --git a/samples/Emacs Lisp/filenames/Project.ede b/samples/Emacs Lisp/filenames/Project.ede new file mode 100644 index 00000000..36a0c8bd --- /dev/null +++ b/samples/Emacs Lisp/filenames/Project.ede @@ -0,0 +1,34 @@ +;; Object EDE +(ede-proj-project "Linguist" + :name "Linguist" + :version "4.9" + :file "Project.ede" + :targets (list + (ede-proj-target-elisp-autoloads "autoloads" + :name "autoloads" + :path "test/samples/Emacs Lisp" + :autoload-file "dude.el" + ) + (ede-proj-target-elisp "init" + :name "init" + :path "" + :source '("ede-load.el" "wait-what.el") + :compiler 'ede-emacs-preload-compiler + :pre-load-packages '("sample-names") + ) + (ede-proj-target-elisp "what" + :name "the" + :path "" + :source '("h.el" "am-i-writing.el") + :versionsource '("hell.el") + :compiler 'ede-emacs-preload-compiler + :aux-packages '("what" "the" "hell-files" "am-i-writing") + ) + ) + :web-site-url "https://github.com/github/linguist" + :web-site-directory "../" + :web-site-file "CONTRIBUTING.md" + :ftp-upload-site "/ftp@git.hub.com:/madeup" + :configuration-variables 'nil + :metasubproject 't + ) diff --git a/samples/Emacs Lisp/filenames/_emacs b/samples/Emacs Lisp/filenames/_emacs new file mode 100644 index 00000000..4968f8eb --- /dev/null +++ b/samples/Emacs Lisp/filenames/_emacs @@ -0,0 +1,70 @@ +;; UTF-8 support +;; (set-language-environment "UTF-8") +(setenv "LANG" "en_AU.UTF-8") +(setenv "LC_ALL" "en_AU.UTF-8") +(setq default-tab-width 4) + + +;;; Function to load all ".el" files in ~/.emacs.d/config +(defun load-directory (directory) + "Recursively load all Emacs Lisp files in a directory." + (dolist (element (directory-files-and-attributes directory nil nil nil)) + (let* ((path (car element)) + (fullpath (concat directory "/" path)) + (isdir (car (cdr element))) + (ignore-dir (or (string= path ".") (string= path "..")))) + (cond + ((and (eq isdir t) (not ignore-dir)) + (load-directory fullpath)) + ((and (eq isdir nil) (string= (substring path -3) ".el")) + (load (file-name-sans-extension fullpath))))))) + +;; Tell Emacs we'd like to use Hunspell for spell-checking +(setq ispell-program-name (executable-find "hunspell")) + +;; Load Homebrew-installed packages +(let ((default-directory "/usr/local/share/emacs/site-lisp/")) + (normal-top-level-add-subdirs-to-load-path)) +(load "aggressive-indent") +(add-hook 'emacs-lisp-mode-hook #'aggressive-indent-mode) +(autoload 'rust-mode "rust-mode" nil t) +(add-to-list 'auto-mode-alist '("\\.rs\\'" . rust-mode)) + +;; Load Git-related syntax highlighting +(add-to-list 'load-path "~/.emacs.d/lisp/") +(load "git-modes") +(load "git-commit") + +;; Keybindings +(global-set-key (kbd "C-u") (lambda () + (interactive) + (kill-line 0))) + +;; Show cursor's current column number +(setq column-number-mode t) + +;; Disable autosave +(setq auto-save-default nil) + +;; Use a single directory for storing backup files +(setq backup-directory-alist `(("." . "~/.emacs.d/auto-save-list"))) +(setq backup-by-copying t) +(setq delete-old-versions t + kept-new-versions 6 + kept-old-versions 2 + version-control t) + +(custom-set-variables + ;; custom-set-variables was added by Custom. + ;; If you edit it by hand, you could mess it up, so be careful. + ;; Your init file should contain only one such instance. + ;; If there is more than one, they won't work right. + '(blink-cursor-mode nil) + '(column-number-mode t) + '(show-paren-mode t)) +(custom-set-faces + ;; custom-set-faces was added by Custom. + ;; If you edit it by hand, you could mess it up, so be careful. + ;; Your init file should contain only one such instance. + ;; If there is more than one, they won't work right. + ) diff --git a/samples/Emacs Lisp/filenames/abbrev_defs b/samples/Emacs Lisp/filenames/abbrev_defs new file mode 100644 index 00000000..87dfad8c --- /dev/null +++ b/samples/Emacs Lisp/filenames/abbrev_defs @@ -0,0 +1,8 @@ +(define-abbrev-table 'fundamental-mode-abbrev-table '( + ("cat" "Concatenate" nil 0) + ("WTF" "World Trade Federation " nil 0) + ("rtbtm" "Read that back to me" nil 0))) + +(define-abbrev-table 'shell-script-mode-abbrev-table '( + ("brake", "bundle rake exec" nil 0) + ("pls", "warning: setting Encoding.default_external"))) diff --git a/samples/Makefile/file-icons.make b/samples/Makefile/file-icons.make new file mode 100644 index 00000000..09d8a78c --- /dev/null +++ b/samples/Makefile/file-icons.make @@ -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/\s*<\/g>//gmi; \ + s/\s*<\/g>//gmi; \ + s/\s+(id|viewBox|xml:space)="[^"]*"/ /gmi; \ + s/]*>//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))) diff --git a/samples/Objective-C/cocoa_monitor.m b/samples/Objective-C/cocoa_monitor.m new file mode 100644 index 00000000..9a384b69 --- /dev/null +++ b/samples/Objective-C/cocoa_monitor.m @@ -0,0 +1,413 @@ +//======================================================================== +// GLFW 3.3 OS X - www.glfw.org +//------------------------------------------------------------------------ +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2016 Camilla Berglund +// +// 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 +#include + +#include +#include +#include +#include + + +// Get the name of the specified display +// +static char* getDisplayName(CGDirectDisplayID displayID) +{ + char* name; + CFDictionaryRef info, names; + CFStringRef value; + CFIndex size; + + // NOTE: This uses a deprecated function because Apple has + // (as of January 2015) not provided any alternative + info = IODisplayCreateInfoDictionary(CGDisplayIOServicePort(displayID), + kIODisplayOnlyPreferredName); + names = CFDictionaryGetValue(info, CFSTR(kDisplayProductName)); + + if (!names || !CFDictionaryGetValueIfPresent(names, CFSTR("en_US"), + (const void**) &value)) + { + // This may happen if a desktop Mac is running headless + _glfwInputError(GLFW_PLATFORM_ERROR, + "Cocoa: Failed to retrieve display name"); + + CFRelease(info); + return strdup("Unknown"); + } + + size = CFStringGetMaximumSizeForEncoding(CFStringGetLength(value), + kCFStringEncodingUTF8); + name = calloc(size + 1, 1); + CFStringGetCString(value, name, size, kCFStringEncodingUTF8); + + CFRelease(info); + + return name; +} + +// Check whether the display mode should be included in enumeration +// +static GLFWbool modeIsGood(CGDisplayModeRef mode) +{ + uint32_t flags = CGDisplayModeGetIOFlags(mode); + if (!(flags & kDisplayModeValidFlag) || !(flags & kDisplayModeSafeFlag)) + return GLFW_FALSE; + + if (flags & kDisplayModeInterlacedFlag) + return GLFW_FALSE; + + if (flags & kDisplayModeStretchedFlag) + return GLFW_FALSE; + + CFStringRef format = CGDisplayModeCopyPixelEncoding(mode); + if (CFStringCompare(format, CFSTR(IO16BitDirectPixels), 0) && + CFStringCompare(format, CFSTR(IO32BitDirectPixels), 0)) + { + CFRelease(format); + return GLFW_FALSE; + } + + CFRelease(format); + return GLFW_TRUE; +} + +// Convert Core Graphics display mode to GLFW video mode +// +static GLFWvidmode vidmodeFromCGDisplayMode(CGDisplayModeRef mode, + CVDisplayLinkRef link) +{ + GLFWvidmode result; + result.width = (int) CGDisplayModeGetWidth(mode); + result.height = (int) CGDisplayModeGetHeight(mode); + result.refreshRate = (int) CGDisplayModeGetRefreshRate(mode); + + if (result.refreshRate == 0) + { + const CVTime time = CVDisplayLinkGetNominalOutputVideoRefreshPeriod(link); + if (!(time.flags & kCVTimeIsIndefinite)) + result.refreshRate = (int) (time.timeScale / (double) time.timeValue); + } + + CFStringRef format = CGDisplayModeCopyPixelEncoding(mode); + + if (CFStringCompare(format, CFSTR(IO16BitDirectPixels), 0) == 0) + { + result.redBits = 5; + result.greenBits = 5; + result.blueBits = 5; + } + else + { + result.redBits = 8; + result.greenBits = 8; + result.blueBits = 8; + } + + CFRelease(format); + return result; +} + +// Starts reservation for display fading +// +static CGDisplayFadeReservationToken beginFadeReservation(void) +{ + CGDisplayFadeReservationToken token = kCGDisplayFadeReservationInvalidToken; + + if (CGAcquireDisplayFadeReservation(5, &token) == kCGErrorSuccess) + CGDisplayFade(token, 0.3, kCGDisplayBlendNormal, kCGDisplayBlendSolidColor, 0.0, 0.0, 0.0, TRUE); + + return token; +} + +// Ends reservation for display fading +// +static void endFadeReservation(CGDisplayFadeReservationToken token) +{ + if (token != kCGDisplayFadeReservationInvalidToken) + { + CGDisplayFade(token, 0.5, kCGDisplayBlendSolidColor, kCGDisplayBlendNormal, 0.0, 0.0, 0.0, FALSE); + CGReleaseDisplayFadeReservation(token); + } +} + + +////////////////////////////////////////////////////////////////////////// +////// GLFW internal API ////// +////////////////////////////////////////////////////////////////////////// + +// Change the current video mode +// +GLFWbool _glfwSetVideoModeNS(_GLFWmonitor* monitor, const GLFWvidmode* desired) +{ + CFArrayRef modes; + CFIndex count, i; + CVDisplayLinkRef link; + CGDisplayModeRef native = NULL; + GLFWvidmode current; + const GLFWvidmode* best; + + best = _glfwChooseVideoMode(monitor, desired); + _glfwPlatformGetVideoMode(monitor, ¤t); + if (_glfwCompareVideoModes(¤t, best) == 0) + return GLFW_TRUE; + + CVDisplayLinkCreateWithCGDisplay(monitor->ns.displayID, &link); + + modes = CGDisplayCopyAllDisplayModes(monitor->ns.displayID, NULL); + count = CFArrayGetCount(modes); + + for (i = 0; i < count; i++) + { + CGDisplayModeRef dm = (CGDisplayModeRef) CFArrayGetValueAtIndex(modes, i); + if (!modeIsGood(dm)) + continue; + + const GLFWvidmode mode = vidmodeFromCGDisplayMode(dm, link); + if (_glfwCompareVideoModes(best, &mode) == 0) + { + native = dm; + break; + } + } + + if (native) + { + if (monitor->ns.previousMode == NULL) + monitor->ns.previousMode = CGDisplayCopyDisplayMode(monitor->ns.displayID); + + CGDisplayFadeReservationToken token = beginFadeReservation(); + CGDisplaySetDisplayMode(monitor->ns.displayID, native, NULL); + endFadeReservation(token); + } + + CFRelease(modes); + CVDisplayLinkRelease(link); + + if (!native) + { + _glfwInputError(GLFW_PLATFORM_ERROR, + "Cocoa: Monitor mode list changed"); + return GLFW_FALSE; + } + + return GLFW_TRUE; +} + +// Restore the previously saved (original) video mode +// +void _glfwRestoreVideoModeNS(_GLFWmonitor* monitor) +{ + if (monitor->ns.previousMode) + { + CGDisplayFadeReservationToken token = beginFadeReservation(); + CGDisplaySetDisplayMode(monitor->ns.displayID, + monitor->ns.previousMode, NULL); + endFadeReservation(token); + + CGDisplayModeRelease(monitor->ns.previousMode); + monitor->ns.previousMode = NULL; + } +} + + +////////////////////////////////////////////////////////////////////////// +////// GLFW platform API ////// +////////////////////////////////////////////////////////////////////////// + +_GLFWmonitor** _glfwPlatformGetMonitors(int* count) +{ + uint32_t i, found = 0, displayCount; + _GLFWmonitor** monitors; + CGDirectDisplayID* displays; + + *count = 0; + + CGGetOnlineDisplayList(0, NULL, &displayCount); + displays = calloc(displayCount, sizeof(CGDirectDisplayID)); + monitors = calloc(displayCount, sizeof(_GLFWmonitor*)); + + CGGetOnlineDisplayList(displayCount, displays, &displayCount); + + for (i = 0; i < displayCount; i++) + { + _GLFWmonitor* monitor; + + if (CGDisplayIsAsleep(displays[i])) + continue; + + const CGSize size = CGDisplayScreenSize(displays[i]); + char* name = getDisplayName(displays[i]); + + monitor = _glfwAllocMonitor(name, size.width, size.height); + monitor->ns.displayID = displays[i]; + monitor->ns.unitNumber = CGDisplayUnitNumber(displays[i]); + + free(name); + + found++; + monitors[found - 1] = monitor; + } + + free(displays); + + *count = found; + return monitors; +} + +GLFWbool _glfwPlatformIsSameMonitor(_GLFWmonitor* first, _GLFWmonitor* second) +{ + // HACK: Compare unit numbers instead of display IDs to work around display + // replacement on machines with automatic graphics switching + return first->ns.unitNumber == second->ns.unitNumber; +} + +void _glfwPlatformGetMonitorPos(_GLFWmonitor* monitor, int* xpos, int* ypos) +{ + const CGRect bounds = CGDisplayBounds(monitor->ns.displayID); + + if (xpos) + *xpos = (int) bounds.origin.x; + if (ypos) + *ypos = (int) bounds.origin.y; +} + +GLFWvidmode* _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, int* count) +{ + CFArrayRef modes; + CFIndex found, i, j; + GLFWvidmode* result; + CVDisplayLinkRef link; + + *count = 0; + + CVDisplayLinkCreateWithCGDisplay(monitor->ns.displayID, &link); + + modes = CGDisplayCopyAllDisplayModes(monitor->ns.displayID, NULL); + found = CFArrayGetCount(modes); + result = calloc(found, sizeof(GLFWvidmode)); + + for (i = 0; i < found; i++) + { + CGDisplayModeRef dm = (CGDisplayModeRef) CFArrayGetValueAtIndex(modes, i); + if (!modeIsGood(dm)) + continue; + + const GLFWvidmode mode = vidmodeFromCGDisplayMode(dm, link); + + for (j = 0; j < *count; j++) + { + if (_glfwCompareVideoModes(result + j, &mode) == 0) + break; + } + + // Skip duplicate modes + if (i < *count) + continue; + + (*count)++; + result[*count - 1] = mode; + } + + CFRelease(modes); + CVDisplayLinkRelease(link); + return result; +} + +void _glfwPlatformGetVideoMode(_GLFWmonitor* monitor, GLFWvidmode *mode) +{ + CGDisplayModeRef displayMode; + CVDisplayLinkRef link; + + CVDisplayLinkCreateWithCGDisplay(monitor->ns.displayID, &link); + + displayMode = CGDisplayCopyDisplayMode(monitor->ns.displayID); + *mode = vidmodeFromCGDisplayMode(displayMode, link); + CGDisplayModeRelease(displayMode); + + CVDisplayLinkRelease(link); +} + +void _glfwPlatformGetGammaRamp(_GLFWmonitor* monitor, GLFWgammaramp* ramp) +{ + uint32_t i, size = CGDisplayGammaTableCapacity(monitor->ns.displayID); + CGGammaValue* values = calloc(size * 3, sizeof(CGGammaValue)); + + CGGetDisplayTransferByTable(monitor->ns.displayID, + size, + values, + values + size, + values + size * 2, + &size); + + _glfwAllocGammaArrays(ramp, size); + + for (i = 0; i < size; i++) + { + ramp->red[i] = (unsigned short) (values[i] * 65535); + ramp->green[i] = (unsigned short) (values[i + size] * 65535); + ramp->blue[i] = (unsigned short) (values[i + size * 2] * 65535); + } + + free(values); +} + +void _glfwPlatformSetGammaRamp(_GLFWmonitor* monitor, const GLFWgammaramp* ramp) +{ + int i; + CGGammaValue* values = calloc(ramp->size * 3, sizeof(CGGammaValue)); + + for (i = 0; i < ramp->size; i++) + { + values[i] = ramp->red[i] / 65535.f; + values[i + ramp->size] = ramp->green[i] / 65535.f; + values[i + ramp->size * 2] = ramp->blue[i] / 65535.f; + } + + CGSetDisplayTransferByTable(monitor->ns.displayID, + ramp->size, + values, + values + ramp->size, + values + ramp->size * 2); + + free(values); +} + + +////////////////////////////////////////////////////////////////////////// +////// GLFW native API ////// +////////////////////////////////////////////////////////////////////////// + +GLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* handle) +{ + _GLFWmonitor* monitor = (_GLFWmonitor*) handle; + _GLFW_REQUIRE_INIT_OR_RETURN(kCGNullDirectDisplay); + return monitor->ns.displayID; +} + diff --git a/test/fixtures/Data/Modelines/iamjs.pl b/test/fixtures/Data/Modelines/iamjs.pl new file mode 100644 index 00000000..b5d8f236 --- /dev/null +++ b/test/fixtures/Data/Modelines/iamjs.pl @@ -0,0 +1,3 @@ +# vim: noexpandtab: ft=javascript + +"It's JavaScript, baby"; diff --git a/test/fixtures/Data/Modelines/iamjs2.pl b/test/fixtures/Data/Modelines/iamjs2.pl new file mode 100644 index 00000000..623b827a --- /dev/null +++ b/test/fixtures/Data/Modelines/iamjs2.pl @@ -0,0 +1,4 @@ +# vim:noexpandtab titlestring=hi\|there\\\ ft=perl ts=4 +# vim:noexpandtab titlestring=hi|there\\ ft=javascript ts=4 + +"Still JavaScript, bruh"; diff --git a/test/fixtures/Data/Modelines/ruby10 b/test/fixtures/Data/Modelines/ruby10 new file mode 100644 index 00000000..67dd4864 --- /dev/null +++ b/test/fixtures/Data/Modelines/ruby10 @@ -0,0 +1,3 @@ + ex: noexpandtab: ft=ruby + +# Still Ruby diff --git a/test/fixtures/Data/Modelines/ruby11 b/test/fixtures/Data/Modelines/ruby11 new file mode 100644 index 00000000..3d167468 --- /dev/null +++ b/test/fixtures/Data/Modelines/ruby11 @@ -0,0 +1,3 @@ +# vim600: ft=ruby + +# Targets Vim 6.0 or later diff --git a/test/fixtures/Data/Modelines/ruby12 b/test/fixtures/Data/Modelines/ruby12 new file mode 100644 index 00000000..a7ef89a9 --- /dev/null +++ b/test/fixtures/Data/Modelines/ruby12 @@ -0,0 +1,3 @@ +vim<520: ft=ruby + +# Targets Vim 5.20 and earlier diff --git a/test/fixtures/Data/Modelines/seeplusplusEmacs10 b/test/fixtures/Data/Modelines/seeplusplusEmacs10 new file mode 100644 index 00000000..c4f28721 --- /dev/null +++ b/test/fixtures/Data/Modelines/seeplusplusEmacs10 @@ -0,0 +1,3 @@ +// -*- foo-bar mode: c++ -*- + +"Malformed modeline, but still understood by Emacs to be C++." diff --git a/test/fixtures/Data/Modelines/seeplusplusEmacs11 b/test/fixtures/Data/Modelines/seeplusplusEmacs11 new file mode 100644 index 00000000..3ba31f8a --- /dev/null +++ b/test/fixtures/Data/Modelines/seeplusplusEmacs11 @@ -0,0 +1 @@ +/* -*- mode: c++ -------*- */ diff --git a/test/fixtures/Data/Modelines/seeplusplusEmacs12 b/test/fixtures/Data/Modelines/seeplusplusEmacs12 new file mode 100644 index 00000000..e85ef896 --- /dev/null +++ b/test/fixtures/Data/Modelines/seeplusplusEmacs12 @@ -0,0 +1 @@ +-*--------- foo:bar mode: c++ -*- diff --git a/test/helper.rb b/test/helper.rb index deb7ef5b..5f7eeb87 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -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 diff --git a/test/test_blob.rb b/test/test_blob.rb index 3322cc41..65b88ba4 100644 --- a/test/test_blob.rb +++ b/test/test_blob.rb @@ -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) diff --git a/test/test_file_blob.rb b/test/test_file_blob.rb index 82f3059c..84cee723 100644 --- a/test/test_file_blob.rb +++ b/test/test_file_blob.rb @@ -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? diff --git a/test/test_grammars.rb b/test/test_grammars.rb index 0a7260b8..5548c9e5 100644 --- a/test/test_grammars.rb +++ b/test/test_grammars.rb @@ -5,9 +5,44 @@ class TestGrammars < Minitest::Test # List of projects that are allowed without licenses PROJECT_WHITELIST = [ - # Dual MIT and GPL license - "vendor/grammars/language-csharp", - "vendor/grammars/sublimeassembly" + "vendor/grammars/Sublime-Lasso", + "vendor/grammars/ant.tmbundle", + "vendor/grammars/sublime-spintools", + "vendor/grammars/blitzmax" + ].freeze + + HASH_WHITELIST = [ + "bc12b3b4917eab9aedb87ec1305c2a4376e34fd1", # TextMate bundles + "16c4748566b3dd996594af0410a1875b22d3a2b3", # language-yaml and atom-salt + "ebae2d87e06d3acef075d049fcfc8958c0364863", # go-tmbundle + "ff21db2554d69d78b2220db5615b16bbba0788d3", # factor + "b9a7428fd036eed8503995e06e989180c276b17d", # jflex.tmbundle + "da39a3ee5e6b4b0d3255bfef95601890afd80709", # SCSS.tmbundle + "5f772ff20ddf3dbac1ec9b6a98c5aa50ace555b2", # gradle.tmbundle + "b5432a1e1055de7eeede2dddf91e009480651fd6", # jasmin-sublime + "74143c4d2a5649eb179105afcb37f466558c22ce", # language-clojure + "760471435f5ab0b9dc99a628203cd8f9156d28ce", # language-coffee-script + "330e6d465e26bdd232aafcd3f5dba6a1d098a20e", # language-csharp + "70fb557a431891c2d634c33fa7367feab5066fd6", # language-javascript + "e0528c23cd967f999e058f1408ccb5b7237daaba", # language-python + "8653305b358375d0fced85dc24793b99919b11ef", # language-shellscript + "9f0c0b0926a18f5038e455e8df60221125fc3111", # elixir-tmbundle + "90af581219debd4e90ef041b46c294e8b4ae6d14", # mako-tmbundle + "b9b24778619dce325b651f0d77cbc72e7ae0b0a3", # Julia.tmbundle + "2d4f8807be850efd925751a8e1839cfc539985b0", # actionscript3-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 + "9d8b5626cfe00f3c8a076173913c3b0312b5b122", # ejs-tmbundle + "bdab9fdc21e6790b479ccb5945b78bc0f6ce2493" # language-blade ].freeze # List of allowed SPDX license names @@ -87,12 +122,30 @@ class TestGrammars < Minitest::Test end def test_submodules_have_approved_licenses - unapproved = submodule_licenses.reject { |k,v| LICENSE_WHITELIST.include?(v) || PROJECT_WHITELIST.include?(k) }.map { |k,v| "#{k}: #{v}"} + unapproved = submodule_licenses.reject { |k,v| LICENSE_WHITELIST.include?(v) || + PROJECT_WHITELIST.include?(k) || + HASH_WHITELIST.include?(v) } + .map { |k,v| "#{k}: #{v}"} message = "The following submodules have unapproved licenses:\n* #{unapproved.join("\n* ")}\n" message << "The license must be added to the LICENSE_WHITELIST in /test/test_grammars.rb once approved." assert_equal [], unapproved, message end + def test_whitelisted_submodules_dont_have_licenses + licensed = submodule_licenses.reject { |k,v| v.nil? }.select { |k,v| PROJECT_WHITELIST.include?(k) } + message = "The following whitelisted submodules have a license:\n* #{licensed.keys.join("\n* ")}\n" + message << "Please remove them from the project whitelist." + assert_equal Hash.new, licensed, message + end + + def test_whitelisted_hashes_dont_have_licenses + used_hashes = submodule_licenses.values.reject { |v| v.nil? || LICENSE_WHITELIST.include?(v) } + unused_hashes = HASH_WHITELIST - used_hashes + message = "The following whitelisted license hashes are unused:\n* #{unused_hashes.join("\n* ")}\n" + message << "Please remove them from the hash whitelist." + assert_equal Array.new, unused_hashes, message + end + def test_submodules_whitelist_has_no_extra_entries skip("Need to work out how to handle dual-licensed entities") extra_whitelist_entries = PROJECT_WHITELIST - submodule_licenses.select { |k,v| v.nil? }.keys @@ -123,7 +176,7 @@ class TestGrammars < Minitest::Test private def submodule_paths - @submodule_paths ||= `git config --list --file "#{File.join(ROOT, ".gitmodules")}"`.lines.grep(/\.path=/).map { |line| line.chomp.split("=", 2).last } + @submodule_paths ||= `git config --list --file "#{File.join(ROOT, ".gitmodules")}"`.lines.grep(/\.path=/).map { |line| line.chomp.split("=", 2).last }.reject { |path| path =~ /CodeMirror/ } end # Returns a hash of submodules in the form of submodule_path => license @@ -136,51 +189,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 diff --git a/test/test_heuristics.rb b/test/test_heuristics.rb index e37da44b..921cc021 100644 --- a/test/test_heuristics.rb +++ b/test/test_heuristics.rb @@ -29,7 +29,11 @@ class TestHeuristcs < Minitest::Test hash.each do |language, blobs| Array(blobs).each do |blob| result = Heuristics.call(file_blob(blob), candidates) - assert_equal [Language[language]], result, "Failed for #{blob}" + if language.nil? + assert_equal [], result, "Failed for #{blob}" + else + assert_equal [Language[language]], result, "Failed for #{blob}" + end end end end @@ -122,9 +126,12 @@ class TestHeuristcs < Minitest::Test }) end + # Candidate languages = ["Assembly", "C++", "HTML", "PAWN", "PHP", + # "POV-Ray SDL", "Pascal", "SQL", "SourcePawn"] def test_inc_by_heuristics assert_heuristics({ - "PHP" => all_fixtures("PHP", "*.inc") + "PHP" => all_fixtures("PHP", "*.inc"), + "POV-Ray SDL" => all_fixtures("POV-Ray SDL", "*.inc") }) end @@ -142,6 +149,26 @@ class TestHeuristcs < Minitest::Test }) end + def test_m_by_heuristics + assert_heuristics({ + "Objective-C" => all_fixtures("Objective-C", "*.m") - all_fixtures("Objective-C", "cocoa_monitor.m"), + "Mercury" => all_fixtures("Mercury", "*.m"), + "MUF" => all_fixtures("MUF", "*.m"), + "M" => all_fixtures("M", "MDB.m"), + "Mathematica" => all_fixtures("Mathematica", "*.m") - all_fixtures("Mathematica", "Problem12.m"), + "Matlab" => all_fixtures("Matlab", "create_ieee_paper_plots.m"), + "Limbo" => all_fixtures("Limbo", "*.m"), + nil => ["Objective-C/cocoa_monitor.m"] + }) + end + + def test_md_by_heuristics + assert_heuristics({ + "Markdown" => all_fixtures("Markdown", "*.md"), + "GCC machine description" => all_fixtures("GCC machine description", "*.md") + }) + end + # Candidate languages = ["C++", "Objective-C"] def test_obj_c_by_heuristics # Only calling out '.h' filenames as these are the ones causing issues diff --git a/test/test_language.rb b/test/test_language.rb index 5c5aa02d..08f60112 100644 --- a/test/test_language.rb +++ b/test/test_language.rb @@ -345,8 +345,24 @@ class TestLanguage < Minitest::Test end def test_ace_modes - assert Language.ace_modes.include?(Language['Ruby']) - assert Language.ace_modes.include?(Language['FORTRAN']) + silence_warnings do + assert Language.ace_modes.include?(Language['Ruby']) + assert Language.ace_modes.include?(Language['FORTRAN']) + end + end + + def test_codemirror_mode + assert_equal 'ruby', Language['Ruby'].codemirror_mode + assert_equal 'javascript', Language['JavaScript'].codemirror_mode + assert_equal 'clike', Language['C'].codemirror_mode + assert_equal 'clike', Language['C++'].codemirror_mode + end + + def test_codemirror_mime_type + assert_equal 'text/x-ruby', Language['Ruby'].codemirror_mime_type + assert_equal 'text/javascript', Language['JavaScript'].codemirror_mime_type + assert_equal 'text/x-csrc', Language['C'].codemirror_mime_type + assert_equal 'text/x-c++src', Language['C++'].codemirror_mime_type end def test_wrap @@ -436,6 +452,40 @@ class TestLanguage < Minitest::Test assert missing.empty?, message end + def test_codemirror_modes_present + Language.all.each do |language| + if language.codemirror_mode || language.codemirror_mime_type + assert language.codemirror_mode, "#{language.inspect} missing CodeMirror mode" + assert language.codemirror_mime_type, "#{language.inspect} missing CodeMirror MIME mode" + end + end + end + + def test_valid_codemirror_mode + Language.all.each do |language| + if mode = language.codemirror_mode + assert File.exist?(File.expand_path("../../vendor/CodeMirror/mode/#{mode}", __FILE__)), "#{mode} isn't a valid CodeMirror mode" + end + end + end + + def test_codemirror_mode_and_mime_defined_by_meta_mapping + meta = File.read(File.expand_path("../../vendor/CodeMirror/mode/meta.js", __FILE__)) + Language.all.each do |language| + next unless language.codemirror_mode && language.codemirror_mime_type + assert meta.match(/^.+#{Regexp.escape(language.codemirror_mime_type)}.+#{Regexp.escape(language.codemirror_mode)}.+$/), "#{language.inspect}: #{language.codemirror_mime_type} not defined under #{language.codemirror_mode}" + end + end + + def test_codemirror_mime_declared_in_mode_file + Language.all.each do |language| + next unless language.codemirror_mode && language.codemirror_mime_type + filename = File.expand_path("../../vendor/CodeMirror/mode/#{language.codemirror_mode}/#{language.codemirror_mode}.js", __FILE__) + assert File.exist?(filename), "#{filename} does not exist" + assert File.read(filename).match(language.codemirror_mime_type), "#{language.inspect}: #{language.codemirror_mime_type} not defined in #{filename}" + end + end + def test_all_popular_languages_exist popular = YAML.load(File.read(File.expand_path("../../lib/linguist/popular.yml", __FILE__))) @@ -444,4 +494,11 @@ 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 + assert !language.color, "Unused colour assigned to #{language.name}" + end + end end diff --git a/test/test_modelines.rb b/test/test_modelines.rb index 192da9d4..aac84ada 100644 --- a/test/test_modelines.rb +++ b/test/test_modelines.rb @@ -17,6 +17,9 @@ class TestModelines < Minitest::Test assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby7") assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby8") assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby9") + assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby10") + assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby11") + assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby12") assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplus") assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs1") assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs2") @@ -27,9 +30,14 @@ class TestModelines < Minitest::Test assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs7") assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs8") assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs9") + assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs10") + assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs11") + assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs12") assert_modeline Language["Text"], fixture_blob("Data/Modelines/fundamentalEmacs.c") assert_modeline Language["Prolog"], fixture_blob("Data/Modelines/not_perl.pl") assert_modeline Language["Smalltalk"], fixture_blob("Data/Modelines/example_smalltalk.md") + assert_modeline Language["JavaScript"], fixture_blob("Data/Modelines/iamjs.pl") + assert_modeline Language["JavaScript"], fixture_blob("Data/Modelines/iamjs2.pl") assert_modeline Language["PHP"], fixture_blob("Data/Modelines/iamphp.inc") assert_modeline nil, sample_blob("C/main.c") end @@ -48,9 +56,14 @@ class TestModelines < Minitest::Test assert_equal Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs7").language assert_equal Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs8").language assert_equal Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs9").language + assert_equal Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs10").language + assert_equal Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs11").language + assert_equal Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs12").language assert_equal Language["Text"], fixture_blob("Data/Modelines/fundamentalEmacs.c").language assert_equal Language["Prolog"], fixture_blob("Data/Modelines/not_perl.pl").language assert_equal Language["Smalltalk"], fixture_blob("Data/Modelines/example_smalltalk.md").language + assert_equal Language["JavaScript"], fixture_blob("Data/Modelines/iamjs.pl").language + assert_equal Language["JavaScript"], fixture_blob("Data/Modelines/iamjs2.pl").language assert_equal Language["PHP"], fixture_blob("Data/Modelines/iamphp.inc").language end end diff --git a/vendor/CodeMirror b/vendor/CodeMirror new file mode 160000 index 00000000..39ffcd87 --- /dev/null +++ b/vendor/CodeMirror @@ -0,0 +1 @@ +Subproject commit 39ffcd8701c35363ab754b82c3c171913ecf478e diff --git a/vendor/grammars/Docker.tmbundle b/vendor/grammars/Docker.tmbundle index 2d7d56af..c6230cb6 160000 --- a/vendor/grammars/Docker.tmbundle +++ b/vendor/grammars/Docker.tmbundle @@ -1 +1 @@ -Subproject commit 2d7d56af17fdf425fdebb34019b8cbd71110250a +Subproject commit c6230cb62c44eecea0123b54b86047517af25de1 diff --git a/vendor/grammars/Lean.tmbundle b/vendor/grammars/Lean.tmbundle index a1a3818e..fa8fcd28 160000 --- a/vendor/grammars/Lean.tmbundle +++ b/vendor/grammars/Lean.tmbundle @@ -1 +1 @@ -Subproject commit a1a3818ecfdd1365ec01ac3894106b5a70b455ac +Subproject commit fa8fcd2856945972a64dcba6f288cfb632a424c8 diff --git a/vendor/grammars/Sublime-SQF-Language b/vendor/grammars/Sublime-SQF-Language index 984606e1..0e72aacb 160000 --- a/vendor/grammars/Sublime-SQF-Language +++ b/vendor/grammars/Sublime-SQF-Language @@ -1 +1 @@ -Subproject commit 984606e146b4ef96753db7f3a16adeee2b152e24 +Subproject commit 0e72aacb4ae6174509a47f3d20913254f3620947 diff --git a/vendor/grammars/Sublime-VimL b/vendor/grammars/Sublime-VimL deleted file mode 160000 index b453aff6..00000000 --- a/vendor/grammars/Sublime-VimL +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b453aff6f783769b6b895986da605a2db0db7379 diff --git a/vendor/grammars/SublimeGDB b/vendor/grammars/SublimeGDB index d9a512da..c39ee600 160000 --- a/vendor/grammars/SublimeGDB +++ b/vendor/grammars/SublimeGDB @@ -1 +1 @@ -Subproject commit d9a512da6eb23b8193a8696a6fc1afd77f310d6e +Subproject commit c39ee600ba734ba8724b70e120ddb8b0ac600587 diff --git a/vendor/grammars/atom-language-clean b/vendor/grammars/atom-language-clean index a9b83780..7dafe70d 160000 --- a/vendor/grammars/atom-language-clean +++ b/vendor/grammars/atom-language-clean @@ -1 +1 @@ -Subproject commit a9b837801d887ea072bdb52b16b5e45fe88365a8 +Subproject commit 7dafe70dddd5bb87aa2d3a3c522bb1561b908bbb diff --git a/vendor/grammars/cython b/vendor/grammars/cython index e9f4d3a1..a816e2c0 160000 --- a/vendor/grammars/cython +++ b/vendor/grammars/cython @@ -1 +1 @@ -Subproject commit e9f4d3a1e44a14df8f245f98591f62df34fbabd8 +Subproject commit a816e2c05d8a6f4bcf937b635c942e63afda2040 diff --git a/vendor/grammars/d.tmbundle b/vendor/grammars/d.tmbundle index 080e5343..039c92d9 160000 --- a/vendor/grammars/d.tmbundle +++ b/vendor/grammars/d.tmbundle @@ -1 +1 @@ -Subproject commit 080e5343d8979d2b9c0502e80ac82d906bb7996f +Subproject commit 039c92d9f2f583f8c51bbeb39094c9e208614001 diff --git a/vendor/grammars/elixir-tmbundle b/vendor/grammars/elixir-tmbundle index 6d0417e8..fb4a0114 160000 --- a/vendor/grammars/elixir-tmbundle +++ b/vendor/grammars/elixir-tmbundle @@ -1 +1 @@ -Subproject commit 6d0417e8eb7e182810755214d0a8cd6421146c01 +Subproject commit fb4a0114268b5d816861d3b4048b166cf55160b1 diff --git a/vendor/grammars/language-asn1 b/vendor/grammars/language-asn1 index d45daeb8..208b6d9e 160000 --- a/vendor/grammars/language-asn1 +++ b/vendor/grammars/language-asn1 @@ -1 +1 @@ -Subproject commit d45daeb849f02a79d67585f629bdc83a06cc52e5 +Subproject commit 208b6d9ebe873180b109a286a481ca6639200d3e diff --git a/vendor/grammars/language-blade b/vendor/grammars/language-blade index fcbe2c20..a5cdd44e 160000 --- a/vendor/grammars/language-blade +++ b/vendor/grammars/language-blade @@ -1 +1 @@ -Subproject commit fcbe2c202295ba1b3f3d2156b64a82999f51374d +Subproject commit a5cdd44eb03cbbba43e634079dec851f06efcc25 diff --git a/vendor/grammars/language-coffee-script b/vendor/grammars/language-coffee-script index 8f001efe..b4137735 160000 --- a/vendor/grammars/language-coffee-script +++ b/vendor/grammars/language-coffee-script @@ -1 +1 @@ -Subproject commit 8f001efe73422d0f7a0c16121588c34e0bd5fe8c +Subproject commit b4137735740818665b0aa55bef843640aa820ca9 diff --git a/vendor/grammars/language-csharp b/vendor/grammars/language-csharp index c97c4bf7..2af2edde 160000 --- a/vendor/grammars/language-csharp +++ b/vendor/grammars/language-csharp @@ -1 +1 @@ -Subproject commit c97c4bf74d74502c0b78901b12aab09186dc0eba +Subproject commit 2af2edde5518bc01ff384452d6b77b46b73e2652 diff --git a/vendor/grammars/language-emacs-lisp b/vendor/grammars/language-emacs-lisp index 76ec86a3..77da7424 160000 --- a/vendor/grammars/language-emacs-lisp +++ b/vendor/grammars/language-emacs-lisp @@ -1 +1 @@ -Subproject commit 76ec86a3eb1bc819a4f19de7295a19602a935c09 +Subproject commit 77da74248435f559fe89724b6bb28d663201a2f0 diff --git a/vendor/grammars/language-graphql b/vendor/grammars/language-graphql index 4be0d1ae..40d3aef4 160000 --- a/vendor/grammars/language-graphql +++ b/vendor/grammars/language-graphql @@ -1 +1 @@ -Subproject commit 4be0d1ae7b847182d4a743f43f44416d7f7d6423 +Subproject commit 40d3aef44756438290037c25f3427d18552df7b8 diff --git a/vendor/grammars/language-haskell b/vendor/grammars/language-haskell index 296a7e94..a53aca38 160000 --- a/vendor/grammars/language-haskell +++ b/vendor/grammars/language-haskell @@ -1 +1 @@ -Subproject commit 296a7e94df6b3c89c5247510b7ba4eb71f14c55f +Subproject commit a53aca3856a1b7729a13e2311628bf323d3b7ff0 diff --git a/vendor/grammars/language-javascript b/vendor/grammars/language-javascript index b3d2bb64..537f3a5d 160000 --- a/vendor/grammars/language-javascript +++ b/vendor/grammars/language-javascript @@ -1 +1 @@ -Subproject commit b3d2bb649a2a2b2f1e8bf391bcd50c603ac1e127 +Subproject commit 537f3a5d9574ff385fe217006ba0df75eb8eeea3 diff --git a/vendor/grammars/language-less b/vendor/grammars/language-less index d4f5db5f..f34bb335 160000 --- a/vendor/grammars/language-less +++ b/vendor/grammars/language-less @@ -1 +1 @@ -Subproject commit d4f5db5fba671244c1f2085752d1ea9ce34f8bad +Subproject commit f34bb335c73c300b465c31f18fb540002395e050 diff --git a/vendor/grammars/language-renpy b/vendor/grammars/language-renpy index a3b9bbed..82a4b913 160000 --- a/vendor/grammars/language-renpy +++ b/vendor/grammars/language-renpy @@ -1 +1 @@ -Subproject commit a3b9bbed668137ab8db5dbafea4d5611957e68ee +Subproject commit 82a4b9130679d6602b9b3908fe938f9c50a04476 diff --git a/vendor/grammars/language-roff b/vendor/grammars/language-roff index f37fb6b7..743e1621 160000 --- a/vendor/grammars/language-roff +++ b/vendor/grammars/language-roff @@ -1 +1 @@ -Subproject commit f37fb6b7c45837de47cdb0bcb9e7a5a257b1ea24 +Subproject commit 743e1621c6a2ff2dd65b36c4a86ed85b97eed930 diff --git a/vendor/grammars/language-shellscript b/vendor/grammars/language-shellscript index 6d66ca58..8d75aeaf 160000 --- a/vendor/grammars/language-shellscript +++ b/vendor/grammars/language-shellscript @@ -1 +1 @@ -Subproject commit 6d66ca58c030a9509b9e01ce57456511c529eb6a +Subproject commit 8d75aeaf52881d7712487005d31749fe41e458a6 diff --git a/vendor/grammars/language-viml b/vendor/grammars/language-viml new file mode 160000 index 00000000..5030fb8b --- /dev/null +++ b/vendor/grammars/language-viml @@ -0,0 +1 @@ +Subproject commit 5030fb8b0234fc5b03de7f20c9284a2208a5f449 diff --git a/vendor/grammars/language-yaml b/vendor/grammars/language-yaml index 784cecc6..29d4b546 160000 --- a/vendor/grammars/language-yaml +++ b/vendor/grammars/language-yaml @@ -1 +1 @@ -Subproject commit 784cecc64ffdb891f6a7fbba62e476b0c833e66f +Subproject commit 29d4b546f265c71cdd35abcb5b382f07c1760239 diff --git a/vendor/grammars/make.tmbundle b/vendor/grammars/make.tmbundle index 1a1827da..01069d2b 160000 --- a/vendor/grammars/make.tmbundle +++ b/vendor/grammars/make.tmbundle @@ -1 +1 @@ -Subproject commit 1a1827da81e20fdce56e2658451340c070ca44b7 +Subproject commit 01069d2b38514f5d5d1519737f4be937566e195e diff --git a/vendor/grammars/mediawiki.tmbundle b/vendor/grammars/mediawiki.tmbundle index f8dead50..bdd6eeb5 160000 --- a/vendor/grammars/mediawiki.tmbundle +++ b/vendor/grammars/mediawiki.tmbundle @@ -1 +1 @@ -Subproject commit f8dead507a1aed539376b9fcfde877a855842e8e +Subproject commit bdd6eeb5ee28c6fcc70cb76c7951c7da8f54e642 diff --git a/vendor/grammars/objective-c.tmbundle b/vendor/grammars/objective-c.tmbundle index d80c2bbd..2fc124a6 160000 --- a/vendor/grammars/objective-c.tmbundle +++ b/vendor/grammars/objective-c.tmbundle @@ -1 +1 @@ -Subproject commit d80c2bbdef8433b3d2cf0af660ea460d97009735 +Subproject commit 2fc124a68a66018bedcf75ed8fd74d92acdb483f diff --git a/vendor/grammars/sublime-rust b/vendor/grammars/sublime-rust index d3c63dec..bb8d73c7 160000 --- a/vendor/grammars/sublime-rust +++ b/vendor/grammars/sublime-rust @@ -1 +1 @@ -Subproject commit d3c63dec579be852b1d8006dc58a9a6f2a9e6cdc +Subproject commit bb8d73c7a23fab9e6cce5c6340a51f0089b40a91 diff --git a/vendor/grammars/sublimeassembly b/vendor/grammars/sublimeassembly index edb58c82..2599ced0 160000 --- a/vendor/grammars/sublimeassembly +++ b/vendor/grammars/sublimeassembly @@ -1 +1 @@ -Subproject commit edb58c8246fc92ab4003bb039b5e0d09c706574f +Subproject commit 2599ced076f6147d6456a60de9ff83f2507c9e6e diff --git a/vendor/grammars/vue-syntax-highlight b/vendor/grammars/vue-syntax-highlight index 909afa53..f95b61a4 160000 --- a/vendor/grammars/vue-syntax-highlight +++ b/vendor/grammars/vue-syntax-highlight @@ -1 +1 @@ -Subproject commit 909afa5384d6dcd01f7d883fe2b8b6067f970a26 +Subproject commit f95b61a40dbae2d415a5a9fed90d46a59a3df0cb diff --git a/vendor/licenses/grammar/Sublime-VimL.txt b/vendor/licenses/grammar/language-viml.txt similarity index 85% rename from vendor/licenses/grammar/Sublime-VimL.txt rename to vendor/licenses/grammar/language-viml.txt index fe443d3e..0bb64e03 100644 --- a/vendor/licenses/grammar/Sublime-VimL.txt +++ b/vendor/licenses/grammar/language-viml.txt @@ -1,11 +1,12 @@ --- type: grammar -name: Sublime-VimL +name: language-viml license: mit --- The MIT License (MIT) -Copyright (c) 2014 Max Vasiliev, Salvatore Gentile +Copyright (c) 2014-2016 Evan Hahn +Copyright (c) 2016 John Gardner Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -14,13 +15,13 @@ 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 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. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE.