From 046fb189802dd9ac8160911c90cf07ba01d746b1 Mon Sep 17 00:00:00 2001 From: Adam Roben Date: Thu, 13 Nov 2014 10:57:59 -0500 Subject: [PATCH] Add github-linguist-grammars gem The purpose of this gem is to package up the language grammars that are used for syntax highlighting on github.com. The grammars are TextMate, Sublime Text, or Atom language grammars, converted to JSON and given the filename SCOPE.json, where SCOPE is the language scope that the grammar defines. The github-linguist-grammars gem packages up all the grammars, and also exports a Linguist::Grammars.path method to locate the directory containing the grammars. To build the gem, simply run `rake build_grammars_gem`. The grammars.yml file lists all the repositories we download grammars from, as well as which scopes are defined by each repository. The script/download-grammars script takes that list and downloads and processes the grammars into the format expected by the gem. --- .gitignore | 2 + Gemfile | 3 +- Rakefile | 6 + github-linguist-grammars.gemspec | 14 + github-linguist.gemspec | 2 +- grammars.yml | 610 +++++++++++++++++++++++++++++++ lib/linguist/grammars.rb | 13 + package.json | 6 + script/download-grammars | 221 +++++++++++ vendor/cache/plist-3.1.0.gem | Bin 0 -> 37888 bytes 10 files changed, 875 insertions(+), 2 deletions(-) create mode 100644 github-linguist-grammars.gemspec create mode 100644 grammars.yml create mode 100644 lib/linguist/grammars.rb create mode 100644 package.json create mode 100755 script/download-grammars create mode 100644 vendor/cache/plist-3.1.0.gem diff --git a/.gitignore b/.gitignore index 71239be2..08e2205d 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ Gemfile.lock .bundle/ benchmark/ lib/linguist/samples.json +/grammars +/node_modules diff --git a/Gemfile b/Gemfile index b92cab78..481a4c6e 100644 --- a/Gemfile +++ b/Gemfile @@ -1,3 +1,4 @@ source 'https://rubygems.org' -gemspec +gemspec :name => "github-linguist" +gemspec :name => "github-linguist-grammars" gem 'test-unit', require: false if RUBY_VERSION >= '2.2' diff --git a/Rakefile b/Rakefile index 09fa0d8a..470dcec9 100644 --- a/Rakefile +++ b/Rakefile @@ -31,6 +31,12 @@ task :build_gem => :samples do File.delete("lib/linguist/languages.json") end +task :build_grammars_gem do + rm_rf "grammars" + sh "script/download-grammars" + sh "gem", "build", "github-linguist-grammars.gemspec" +end + namespace :benchmark do benchmark_path = "benchmark/results" diff --git a/github-linguist-grammars.gemspec b/github-linguist-grammars.gemspec new file mode 100644 index 00000000..429b3ff1 --- /dev/null +++ b/github-linguist-grammars.gemspec @@ -0,0 +1,14 @@ +require File.expand_path('../lib/linguist/version', __FILE__) + +Gem::Specification.new do |s| + s.name = 'github-linguist-grammars' + s.version = Linguist::VERSION + s.summary = "Language grammars for use with github-linguist" + + s.authors = "GitHub" + s.homepage = "https://github.com/github/linguist" + + s.files = ['lib/linguist/grammars.rb'] + Dir['grammars/*'] + + s.add_development_dependency 'plist', '~>3.1' +end diff --git a/github-linguist.gemspec b/github-linguist.gemspec index 4e918f30..db41c587 100644 --- a/github-linguist.gemspec +++ b/github-linguist.gemspec @@ -10,7 +10,7 @@ Gem::Specification.new do |s| s.homepage = "https://github.com/github/linguist" s.license = "MIT" - s.files = Dir['lib/**/*'] + s.files = Dir['lib/**/*'] - ['lib/linguist/grammars.rb'] s.executables << 'linguist' s.add_dependency 'charlock_holmes', '~> 0.7.3' diff --git a/grammars.yml b/grammars.yml new file mode 100644 index 00000000..9faffd16 --- /dev/null +++ b/grammars.yml @@ -0,0 +1,610 @@ +--- +http://hww3.riverweb.com/dist/Pike_TextMate.tar.gz: +- source.pike +http://svn.edgewall.org/repos/genshi/contrib/textmate/Genshi.tmbundle/Syntaxes/Markup%20Template%20%28XML%29.tmLanguage: +- text.xml.genshi +http://svn.textmate.org/trunk/Review/Bundles/BlitzMax.tmbundle: +- source.blitzmax +http://svn.textmate.org/trunk/Review/Bundles/Cron.tmbundle: +- text.crontab +http://svn.textmate.org/trunk/Review/Bundles/Cython.tmbundle: +- source.cython +http://svn.textmate.org/trunk/Review/Bundles/F%20Sharp.tmbundle: +- source.fsharp +http://svn.textmate.org/trunk/Review/Bundles/Forth.tmbundle: +- source.forth +http://svn.textmate.org/trunk/Review/Bundles/Google%20Code.tmbundle: +- text.html.googlecodewiki +http://svn.textmate.org/trunk/Review/Bundles/JUNOScript.tmbundle: +- source.slax +http://svn.textmate.org/trunk/Review/Bundles/Java%20Velocity.tmbundle: +- text.html.velocity +- text.velocity +http://svn.textmate.org/trunk/Review/Bundles/K.tmbundle: +- source.k +http://svn.textmate.org/trunk/Review/Bundles/Limbo.tmbundle: +- source.limbo +http://svn.textmate.org/trunk/Review/Bundles/Maude.tmbundle: +- source.maude +http://svn.textmate.org/trunk/Review/Bundles/Mx.tmbundle: +- source.mx +http://svn.textmate.org/trunk/Review/Bundles/PDB.tmbundle: +- source.pdb +http://svn.textmate.org/trunk/Review/Bundles/PHP%20Cake.tmbundle: +- text.html.php.cake +http://svn.textmate.org/trunk/Review/Bundles/Parrot.tmbundle: +- source.parrot.pir +http://svn.textmate.org/trunk/Review/Bundles/RelaxNG.tmbundle: +- source.rnc +http://svn.textmate.org/trunk/Review/Bundles/Ruby%20Sass.tmbundle: +- source.sass +http://svn.textmate.org/trunk/Review/Bundles/Ruby%20Shoulda.tmbundle: +- source.ruby.rails.shoulda +http://svn.textmate.org/trunk/Review/Bundles/SecondLife%20LSL.tmbundle: +- source.lsl +http://svn.textmate.org/trunk/Review/Bundles/TYPO3.tmbundle: +- source.typoscript +- text.xml.t3datastructure +http://svn.textmate.org/trunk/Review/Bundles/Taskmate.tmbundle: +- text.taskmate +http://svn.textmate.org/trunk/Review/Bundles/Tasks.tmbundle: +- text.tasks +http://svn.textmate.org/trunk/Review/Bundles/Treetop.tmbundle: +- source.treetop +http://svn.textmate.org/trunk/Review/Bundles/VHDL.tmbundle: +- source.vhdl +http://svn.textmate.org/trunk/Review/Bundles/Wikidot.tmbundle: +- text.html.wikidot +http://svn.textmate.org/trunk/Review/Bundles/XQuery.tmbundle: +- source.xquery +http://svn.textmate.org/trunk/Review/Bundles/iPhone.tmbundle: +- source.objc.iPhone +https://bitbucket.org/Clams/sublimesystemverilog/get/default.tar.gz: +- source.systemverilog +- source.ucfconstraints +https://bitbucket.org/bitlang/sublime_cobol/raw/b0e9c44ac5f7a2fb553421aa986b35854cbfda4a/COBOL.tmLanguage: +- source.cobol +https://fan.googlecode.com/hg-history/Build%201.0.55/adm/tools/textmate/Fan.tmbundle/Syntaxes/Fan.tmLanguage: +- source.fan +https://github.com/AlanQuatermain/go-tmbundle: +- source.go +https://github.com/Anomareh/PHP-Twig.tmbundle: +- text.html.twig +https://github.com/Cirru/sublime-cirru/raw/master/Cirru.tmLanguage: +- source.cirru +https://github.com/Cykey/Sublime-Logos: +- source.logos +https://github.com/Drako/SublimeBrainfuck/raw/master/Brainfuck.tmLanguage: +- source.bf +https://github.com/JohnNilsson/awk-sublime/raw/master/AWK.tmLanguage: +- source.awk +https://github.com/Oldes/Sublime-REBOL: +- source.rebol +https://github.com/PogiNate/Sublime-Inform/raw/master/Inform7/inform7.tmLanguage: +- source.Inform7 +https://github.com/Red-Nova-Technologies/autoitv3-tmbundle: +- source.autoit.3 +https://github.com/SalGnt/Sublime-VimL: +- source.viml +https://github.com/Shammah/boo-sublime/raw/master/Boo.tmLanguage: +- source.boo +https://github.com/SublimeText/ColdFusion: +- source.cfscript +- source.cfscript.cfc +- text.cfml.basic +- text.html.cfm +https://github.com/SublimeText/Kotlin/raw/master/Kotlin.tmLanguage: +- source.Kotlin +https://github.com/SublimeText/NSIS: +- source.nsis +https://github.com/Varriount/NimLime: +- source.nimrod +- source.nimrod_filter +- source.nimrodcfg +https://github.com/angryant0007/VBDotNetSyntax: +- source.vbnet +https://github.com/aroben/ada.tmbundle/raw/c45eed4d5f98fe3bcbbffbb9e436601ab5bbde4b/Syntaxes/Ada.plist: +- source.ada +https://github.com/aroben/ruby.tmbundle@4636a3023153c3034eb6ffc613899ba9cf33b41f: +- source.ruby +- text.html.erb +https://github.com/asbjornenge/Docker.tmbundle: +- source.dockerfile +https://github.com/atom/language-coffee-script: +- source.coffee +- source.litcoffee +https://github.com/atom/language-csharp: +- source.cs +- source.csx +- source.nant-build +https://github.com/atom/language-javascript: +- source.js +- source.js.regexp +https://github.com/atom/language-python: +- source.python +- source.regexp.python +- text.python.traceback +https://github.com/atom/language-shellscript: +- source.shell +- text.shell-session +https://github.com/austinwagner/sublime-sourcepawn: +- source.sp +https://github.com/bfad/Sublime-Lasso: +- file.lasso +https://github.com/bholt/chapel-tmbundle: +- source.chapel +https://github.com/brandonwamboldt/sublime-nginx: +- source.nginx +https://github.com/carsonoid/sublime_man_page_support/raw/master/man-groff.tmLanguage: +- text.groff +https://github.com/ccreutzig/sublime-MuPAD: +- source.mupad +https://github.com/cdwilson/nesC.tmbundle: +- source.nesc +https://github.com/clemos/haxe-sublime-bundle: +- source.erazor +- source.haxe.2 +- source.hss.1 +- source.hxml +- source.nmml +https://github.com/cucumber/cucumber-tmbundle: +- source.ruby.rspec.cucumber.steps +- text.gherkin.feature +https://github.com/daaain/Handlebars/raw/master/Handlebars.tmLanguage: +- text.html.handlebars +https://github.com/davidpeckham/powershell.tmbundle: +- source.powershell +https://github.com/davidrios/jade-tmbundle: +- source.jade +- source.pyjade +https://github.com/elixir-lang/elixir-tmbundle: +- source.elixir +- text.elixir +- text.html.elixir +https://github.com/ericzou/ebundles/raw/master/Bundles/MSDOS%20batch%20file.tmbundle/Syntaxes/MSDOS%20batch%20file.tmLanguage: +- source.dosbatch +https://github.com/euler0/sublime-glsl/raw/master/GLSL.tmLanguage: +- source.glsl +https://github.com/fancy-lang/fancy-tmbundle: +- source.fancy +https://github.com/gingerbeardman/monkey.tmbundle: +- source.monkey +https://github.com/guillermooo/dart-sublime-bundle/raw/master/Dart.tmLanguage: +- source.dart +https://github.com/harrism/sublimetext-cuda-cpp/raw/master/cuda-c%2B%2B.tmLanguage: +- source.cuda-c++ +https://github.com/infininight/turtle.tmbundle: +- source.sparql +- source.turtle +https://github.com/jeancharles-roger/ceylon-sublimetext/raw/master/Ceylon.tmLanguage: +- source.ceylon +https://github.com/jfairbank/Sublime-Text-2-OpenEdge-ABL: +- source.abl +https://github.com/jhasse/sublime-rust: +- source.rust +https://github.com/johanasplund/sublime-befunge/raw/master/Befunge-93.tmLanguage: +- source.befunge +https://github.com/joshaven/RDoc.tmbundle: +- text.rdoc +https://github.com/jpcamara/Textmate-Gosu-Bundle/raw/master/Gosu.tmbundle/Syntaxes/Gosu.tmLanguage: +- source.gosu.2 +https://github.com/kraih/mojo.tmbundle: +- source.perl.mojolicious +- text.html.mojolicious +https://github.com/kswedberg/jquery-tmbundle: +- source.js.jquery +https://github.com/kuroir/SCSS.tmbundle: +- source.scss +https://github.com/laughedelic/sublime-idris/raw/master/Idris.tmLanguage: +- source.idris +https://github.com/lavrton/sublime-better-typescript: +- source.ts +https://github.com/leafo/moonscript-tmbundle: +- source.moonscript +https://github.com/lunixbochs/x86-assembly-textmate-bundle: +- source.asm.x86 +https://github.com/macekond/Alloy.tmbundle: +- source.alloy +https://github.com/mads379/opa.tmbundle: +- source.opa +https://github.com/mads379/scala.tmbundle: +- source.sbt +- source.scala +https://github.com/marconi/mako-tmbundle: +- text.html.mako +https://github.com/mattfoster/gnuplot-tmbundle: +- source.gnuplot +https://github.com/mgalloy/idl.tmbundle: +- source.idl +- source.idl-dlm +- text.idl-idldoc +https://github.com/michaeledgar/protobuf-tmbundle: +- source.protobuf +https://github.com/mkolosick/Sublime-Coq/raw/master/Coq.tmLanguage: +- source.coq +https://github.com/mokus0/Agda.tmbundle: +- source.agda +https://github.com/mxcl/Roole.tmBundle: +- source.roole +https://github.com/nanoant/Julia.tmbundle: +- source.julia +https://github.com/nanoant/assembly.tmbundle/raw/master/Syntaxes/objdump%20C%2B%2B.tmLanguage: +- objdump.x86asm +https://github.com/nasser/arduino.tmbundle: +- source.c++.arduino +https://github.com/nilium/ooc.tmbundle: +- source.ooc +https://github.com/paulmillr/LiveScript.tmbundle: +- source.livescript +https://github.com/pferruggiaro/sublime-tea: +- source.tea +https://github.com/puppet-textmate-bundle/puppet-textmate-bundle: +- source.puppet +https://github.com/pvl/abap.tmbundle: +- source.abap +https://github.com/rspec/rspec-tmbundle: +- source.ruby.rspec +https://github.com/scalate/Scalate.tmbundle: +- source.scaml +- text.html.ssp +https://github.com/shadanan/mathematica-tmbundle: +- source.mathematica +https://github.com/shellderp/sublime-robot-plugin: +- text.robot +https://github.com/simongregory/actionscript3-tmbundle: +- source.actionscript.3 +- text.html.asdoc +- text.xml.flex-config +https://github.com/simongregory/flex-tmbundle: +- text.xml.mxml +https://github.com/skozlovf/Sublime-QML: +- source.qml +https://github.com/skurfer/LDIF.tmbundle: +- text.ldif +https://github.com/slash-lang/Slash.tmbundle: +- text.html.slash +https://github.com/slavapestov/factor/raw/master/misc/Factor.tmbundle/Syntaxes/Factor.tmLanguage: +- source.factor +https://github.com/slim-template/ruby-slim.tmbundle: +- text.slim +https://github.com/smiledawgg/Bro.tmbundle: +- source.bro +- source.bro.sig +https://github.com/staltz/SublimeXtend: +- source.xtend +https://github.com/statatmbundle/Stata.tmbundle: +- source.mata +- source.stata +https://github.com/swannodette/textmate-clojure: +- source.clojure +https://github.com/technosophos/Vala-TMBundle: +- source.vala +https://github.com/textmate/Mustache.tmbundle: +- text.html.mustache +https://github.com/textmate/actionscript.tmbundle: +- source.actionscript.2 +https://github.com/textmate/active4d.tmbundle: +- source.active4d +- source.active4d.library +- text.active4d-ini +- text.html.strict.active4d +https://github.com/textmate/ant.tmbundle: +- text.xml.ant +https://github.com/textmate/antlr.tmbundle: +- source.antlr +https://github.com/textmate/apache.tmbundle: +- source.apache-config +- source.apache-config.mod_perl +https://github.com/textmate/applescript.tmbundle: +- source.applescript +https://github.com/textmate/asp.tmbundle: +- source.asp +- text.html.asp +https://github.com/textmate/asp.vb.net.tmbundle: +- source.asp.vb.net +- text.html.asp.net +https://github.com/textmate/bison.tmbundle: +- source.bison +https://github.com/textmate/blogging.tmbundle: +- text.blog +- text.blog.html +- text.blog.markdown +- text.blog.textile +https://github.com/textmate/bulletin-board.tmbundle: +- text.bbcode +https://github.com/textmate/bundle-development.tmbundle: +- source.plist.textmate.grammar +- source.plist.textmate.settings +- text.tm-scope +- text.tm-snippet +https://github.com/textmate/c.tmbundle: +- source.c +- source.c++ +https://github.com/textmate/capnproto.tmbundle: +- source.capnp +https://github.com/textmate/cmake.tmbundle: +- source.cache.cmake +- source.cmake +https://github.com/textmate/context-free.tmbundle: +- source.context-free +https://github.com/textmate/cpp-qt.tmbundle: +- source.c++.qt +- source.qmake +https://github.com/textmate/css.tmbundle: +- source.css +https://github.com/textmate/d.tmbundle: +- source.d +https://github.com/textmate/diff.tmbundle: +- source.diff +https://github.com/textmate/dokuwiki.tmbundle: +- text.html.dokuwiki +https://github.com/textmate/doxygen.tmbundle: +- text.html.doxygen +https://github.com/textmate/dylan.tmbundle: +- source.dylan +- source.lid +- source.makegen +https://github.com/textmate/eiffel.tmbundle: +- source.eiffel +https://github.com/textmate/erlang.tmbundle: +- source.erlang +- text.html.erlang.yaws +https://github.com/textmate/f-script.tmbundle: +- source.fscript +https://github.com/textmate/fortran.tmbundle: +- source.fortran +- source.fortran.modern +https://github.com/textmate/fxscript.tmbundle: +- source.fxscript +https://github.com/textmate/gettext.tmbundle: +- source.po +https://github.com/textmate/git.tmbundle: +- source.git-config +- text.git-commit +- text.git-rebase +https://github.com/textmate/graphviz.tmbundle: +- source.dot +https://github.com/textmate/greasemonkey.tmbundle: +- source.js.greasemonkey +https://github.com/textmate/gri.tmbundle: +- source.gri +https://github.com/textmate/groovy-grails.tmbundle: +- text.html.grails +https://github.com/textmate/groovy.tmbundle: +- source.groovy +https://github.com/textmate/gtd2.tmbundle: +- text.html.markdown.wiki.gtd +https://github.com/textmate/gtdalt.tmbundle: +- text.gtdalt +https://github.com/textmate/haskell.tmbundle: +- source.haskell +- text.tex.latex.haskell +https://github.com/textmate/html.tmbundle: +- text.html.basic +https://github.com/textmate/hyperlink-helper.tmbundle: +- text.hyperlink +https://github.com/textmate/icalendar.tmbundle: +- source.icalendar +https://github.com/textmate/inform.tmbundle: +- source.inform +https://github.com/textmate/ini.tmbundle: +- source.ini +https://github.com/textmate/installer.tmbundle: +- text.xml.apple-dist +https://github.com/textmate/io.tmbundle: +- source.io +https://github.com/textmate/java.tmbundle: +- source.java +- source.java-properties +- text.html.jsp +- text.junit-test-report +https://github.com/textmate/javadoc.tmbundle: +- text.html.javadoc +https://github.com/textmate/javascript-flash.tmbundle: +- source.js.jsfl +https://github.com/textmate/javascript-mootools.tmbundle: +- source.js.mootools +https://github.com/textmate/javascript-objective-j.tmbundle: +- source.js.objj +https://github.com/textmate/javascript-prototype-and-script.aculo.us.tmbundle: +- source.js.prototype +- source.js.prototype.bracketed +https://github.com/textmate/javascript-yui.tmbundle: +- source.js.yui +https://github.com/textmate/json.tmbundle: +- source.json +https://github.com/textmate/latex.tmbundle: +- text.bibtex +- text.log.latex +- text.tex +- text.tex.latex +- text.tex.latex.beamer +- text.tex.latex.memoir +https://github.com/textmate/less.tmbundle: +- source.css.less +https://github.com/textmate/lex-flex.tmbundle: +- source.lex +https://github.com/textmate/lighttpd.tmbundle: +- source.lighttpd-config +https://github.com/textmate/lilypond.tmbundle: +- source.lilypond +https://github.com/textmate/lisp.tmbundle: +- source.lisp +https://github.com/textmate/logo.tmbundle: +- source.logo +https://github.com/textmate/logtalk.tmbundle: +- source.logtalk +https://github.com/textmate/lua.tmbundle: +- source.lua +https://github.com/textmate/macports.tmbundle: +- source.tcl.macports +https://github.com/textmate/mail.tmbundle: +- text.mail +- text.mail.markdown +https://github.com/textmate/make.tmbundle: +- source.makefile +https://github.com/textmate/man-pages.tmbundle: +- text.man +https://github.com/textmate/markdown.tmbundle: +- text.html.markdown +https://github.com/textmate/matlab.tmbundle: +- source.matlab +- source.octave +https://github.com/textmate/maven.tmbundle: +- text.xml.pom +https://github.com/textmate/mediawiki.tmbundle: +- text.html.mediawiki +https://github.com/textmate/mel.tmbundle: +- source.mel +https://github.com/textmate/mercurial.tmbundle: +- text.hg-commit +https://github.com/textmate/mips.tmbundle: +- source.mips +https://github.com/textmate/modula.tmbundle: +- source.modula-3 +https://github.com/textmate/moinmoin.tmbundle: +- text.moinmoin +https://github.com/textmate/movable-type.tmbundle: +- text.html.mt +- text.html.mt.pure +https://github.com/textmate/nemerle.tmbundle: +- source.nemerle +https://github.com/textmate/ninja.tmbundle: +- source.ninja +https://github.com/textmate/objective-c.tmbundle: +- source.objc +- source.objc++ +- source.strings +https://github.com/textmate/ocaml.tmbundle: +- source.camlp4.ocaml +- source.ocaml +- source.ocamllex +- source.ocamlyacc +https://github.com/textmate/opengl.tmbundle: +- source.open-gl +https://github.com/textmate/pascal.tmbundle: +- source.pascal +https://github.com/textmate/perforce.tmbundle: +- source.perforce +https://github.com/textmate/perl-html-template.tmbundle: +- text.html.html-template +https://github.com/textmate/perl-mason.tmbundle: +- text.html.mason +https://github.com/textmate/perl-template-toolkit.tmbundle: +- text.html.tt +https://github.com/textmate/perl.tmbundle: +- source.perl +https://github.com/textmate/php-smarty.tmbundle: +- source.smarty +https://github.com/textmate/php.tmbundle: +- text.html.php +https://github.com/textmate/pmwiki.tmbundle: +- text.pmwiki +https://github.com/textmate/postscript.tmbundle: +- source.postscript +https://github.com/textmate/processing.tmbundle: +- source.processing +https://github.com/textmate/prolog.tmbundle: +- source.prolog +https://github.com/textmate/property-list.tmbundle: +- source.plist +- text.xml.plist +https://github.com/textmate/python-django.tmbundle: +- source.python.django +- text.html.django +https://github.com/textmate/quake.tmbundle: +- source.quake-config +https://github.com/textmate/r-console-r.app.tmbundle: +- source.rapp-console +https://github.com/textmate/r-console-rdaemon.tmbundle: +- source.rd.console +- source.rd.console.plain +- text.tex.latex.rdaemon +https://github.com/textmate/r.tmbundle: +- source.r +- text.tex.latex.rd +https://github.com/textmate/ragel.tmbundle: +- source.c.ragel +https://github.com/textmate/remind.tmbundle: +- source.remind +https://github.com/textmate/restructuredtext.tmbundle: +- text.restructuredtext +https://github.com/textmate/rez.tmbundle: +- source.rez +https://github.com/textmate/ruby-haml.tmbundle: +- text.haml +https://github.com/textmate/ruby-on-rails-tmbundle: +- source.js.erb.rails +- source.ruby.rails +- source.ruby.rails.rjs +- source.sql.ruby +- text.html.erb.rails +https://github.com/textmate/s5.tmbundle: +- source.s5 +https://github.com/textmate/scheme.tmbundle: +- source.scheme +https://github.com/textmate/scilab.tmbundle: +- source.scilab +https://github.com/textmate/setext.tmbundle: +- text.setext +https://github.com/textmate/slate.tmbundle: +- source.slate +https://github.com/textmate/sql.tmbundle: +- source.sql +https://github.com/textmate/ssh-config.tmbundle: +- source.ssh-config +https://github.com/textmate/standard-ml.tmbundle: +- source.cm +- source.ml +https://github.com/textmate/subversion.tmbundle: +- text.svn-commit +https://github.com/textmate/sweave.tmbundle: +- text.tex.latex.sweave +https://github.com/textmate/swift.tmbundle: +- source.swift +https://github.com/textmate/swig.tmbundle: +- source.swig +https://github.com/textmate/tabular.tmbundle: +- text.tabular.csv +- text.tabular.tsv +https://github.com/textmate/tcl.tmbundle: +- source.tcl +- text.html.tcl +https://github.com/textmate/text.tmbundle: +- text.plain +https://github.com/textmate/textile.tmbundle: +- text.html.textile +https://github.com/textmate/textmate.tmbundle: +- source.regexp.oniguruma +- source.tm-properties +https://github.com/textmate/thrift.tmbundle: +- source.thrift +https://github.com/textmate/todo.tmbundle: +- text.todo +https://github.com/textmate/toml.tmbundle: +- source.toml +https://github.com/textmate/twiki.tmbundle: +- text.html.twiki +https://github.com/textmate/txt2tags.tmbundle: +- text.txt2tags +https://github.com/textmate/unicode.tmbundle: +- unicode.check.combiningMarks +- unicode.check.noASCII +- unicode.check.noLatin +https://github.com/textmate/vectorscript.tmbundle: +- source.pascal.vectorscript +https://github.com/textmate/verilog.tmbundle: +- source.verilog +https://github.com/textmate/xml.tmbundle: +- text.xml +- text.xml.xsl +https://github.com/textmate/yaml.tmbundle: +- source.yaml +https://github.com/tomas-stefano/smalltalk-tmbundle: +- source.smalltalk +https://github.com/vic/ioke-outdated/raw/master/share/TextMate/Ioke.tmbundle/Syntaxes/Ioke.tmLanguage: +- source.ioke +https://github.com/vmg/zephir-sublime: +- source.php.zephir +https://github.com/whitequark/llvm.tmbundle: +- source.llvm diff --git a/lib/linguist/grammars.rb b/lib/linguist/grammars.rb new file mode 100644 index 00000000..f6468280 --- /dev/null +++ b/lib/linguist/grammars.rb @@ -0,0 +1,13 @@ +# Note: This file is included in the github-linguist-grammars gem, not the +# github-linguist gem. + +module Linguist + module Grammars + # Get the path to the directory containing the language grammar JSON files. + # + # Returns a String. + def self.path + File.expand_path("../../../grammars", __FILE__) + end + end +end diff --git a/package.json b/package.json new file mode 100644 index 00000000..acd7cd9e --- /dev/null +++ b/package.json @@ -0,0 +1,6 @@ +{ + "repository": "https://github.com/github/linguist", + "dependencies": { + "season": "~>3.0" + } +} diff --git a/script/download-grammars b/script/download-grammars new file mode 100755 index 00000000..e0dfe10c --- /dev/null +++ b/script/download-grammars @@ -0,0 +1,221 @@ +#!/usr/bin/env ruby + +require 'json' +require 'net/http' +require 'plist' +require 'set' +require 'tmpdir' +require 'uri' +require 'yaml' + +GRAMMARS_PATH = File.expand_path("../../grammars", __FILE__) +SOURCES_FILE = File.expand_path("../../grammars.yml", __FILE__) +CSONC = File.expand_path("../../node_modules/.bin/csonc", __FILE__) + +class TarballPackage + def self.fetch(tmp_dir, url) + `curl --silent --location --max-time 10 --output "#{tmp_dir}/archive" "#{url}"` + raise "Failed to fetch GH package: #{url} #{$?.to_s}" unless $?.success? + + output = File.join(tmp_dir, 'extracted') + Dir.mkdir(output) + `tar -C "#{output}" -xf "#{tmp_dir}/archive"` + raise "Failed to uncompress tarball: #{tmp_dir}/archive (from #{url}) #{$?.to_s}" unless $?.success? + + Dir["#{output}/**/*"].select do |path| + case File.extname(path.downcase) + when '.plist' + path.split('/')[-2] == 'Syntaxes' + when '.tmlanguage' + true + when '.cson' + path.split('/')[-2] == 'grammars' + else + false + end + end + end + + attr_reader :url + + def initialize(url) + @url = url + end + + def fetch(tmp_dir) + self.class.fetch(tmp_dir, url) + end +end + +class SingleGrammar + attr_reader :url + + def initialize(url) + @url = url + end + + def fetch(tmp_dir) + filename = File.join(tmp_dir, File.basename(url)) + `curl --silent --location --max-time 10 --output "#{filename}" "#{url}"` + raise "Failed to fetch grammar: #{url}: #{$?.to_s}" unless $?.success? + [filename] + end +end + +class SVNPackage + attr_reader :url + + def initialize(url) + @url = url + end + + def fetch(tmp_dir) + `svn export -q "#{url}/Syntaxes" "#{tmp_dir}/Syntaxes"` + raise "Failed to export SVN repository: #{url}: #{$?.to_s}" unless $?.success? + Dir["#{tmp_dir}/Syntaxes/*.{plist,tmLanguage,tmlanguage}"] + end +end + +class GitHubPackage + def self.parse_url(url) + url, ref = url.split("@", 2) + path = URI.parse(url).path.split('/') + [path[1], path[2].chomp('.git'), ref || "master"] + end + + attr_reader :user + attr_reader :repo + attr_reader :ref + + def initialize(url) + @user, @repo, @ref = self.class.parse_url(url) + end + + def url + suffix = "@#{ref}" unless ref == "master" + "https://github.com/#{user}/#{repo}#{suffix}" + end + + def fetch(tmp_dir) + url = "https://github.com/#{user}/#{repo}/archive/#{ref}.tar.gz" + TarballPackage.fetch(tmp_dir, url) + end +end + +def load_grammar(path) + case File.extname(path.downcase) + when '.plist', '.tmlanguage' + Plist::parse_xml(path) + when '.cson' + cson = `"#{CSONC}" "#{path}"` + raise "Failed to convert CSON grammar '#{path}': #{$?.to_s}" unless $?.success? + JSON.parse(cson) + else + raise "Invalid document type #{path}" + end +end + +def install_grammar(tmp_dir, source, all_scopes) + p = if source.end_with?('.tmLanguage', '.plist') + SingleGrammar.new(source) + elsif source.start_with?('https://github.com') + GitHubPackage.new(source) + elsif source.start_with?('http://svn.textmate.org') + SVNPackage.new(source) + elsif source.end_with?('.tar.gz') + TarballPackage.new(source) + else + nil + end + + raise "Unsupported source: #{source}" unless p + + installed = [] + + p.fetch(tmp_dir).each do |path| + grammar = load_grammar(path) + scope = grammar['scopeName'] + + if all_scopes.key?(scope) + $stderr.puts "WARN: Duplicated scope #{scope}\n" + + " Current package: #{p.url}\n" + + " Previous package: #{all_scopes[scope]}" + next + end + + File.write(File.join(GRAMMARS_PATH, "#{scope}.json"), JSON.pretty_generate(grammar)) + all_scopes[scope] = p.url + installed << scope + end + + $stderr.puts("OK #{p.url} (#{installed.join(', ')})") +end + +def run_thread(queue, all_scopes) + Dir.mktmpdir do |tmpdir| + loop do + source, index = begin + queue.pop(true) + rescue ThreadError + # The queue is empty. + break + end + + dir = "#{tmpdir}/#{index}" + Dir.mkdir(dir) + + install_grammar(dir, source, all_scopes) + end + end +end + +def generate_yaml(all_scopes, base) + yaml = all_scopes.each_with_object(base) do |(key,value),out| + out[value] ||= [] + out[value] << key + end + + yaml = yaml.sort.to_h + yaml.each { |k, v| v.sort! } + yaml +end + +def main(sources) + begin + Dir.mkdir(GRAMMARS_PATH) + rescue Errno::EEXIST + end + + `npm install` + + all_scopes = {} + + if ARGV[0] == '--add' + Dir.mktmpdir do |tmpdir| + install_grammar(tmpdir, ARGV[1], all_scopes) + end + generate_yaml(all_scopes, sources) + else + queue = Queue.new + + sources.each do |url, scopes| + queue.push([url, queue.length]) + end + + threads = 8.times.map do + Thread.new { run_thread(queue, all_scopes) } + end + threads.each(&:join) + generate_yaml(all_scopes, {}) + end +end + +sources = File.open(SOURCES_FILE) do |file| + YAML.load(file) +end + +yaml = main(sources) + +File.write(SOURCES_FILE, YAML.dump(yaml)) + +$stderr.puts("Done") diff --git a/vendor/cache/plist-3.1.0.gem b/vendor/cache/plist-3.1.0.gem new file mode 100644 index 0000000000000000000000000000000000000000..2f7934a725904d7eb9b0aab11a157dff91c25e78 GIT binary patch literal 37888 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