Compare commits

..

107 Commits

Author SHA1 Message Date
Ted Nyman
fbcad41813 2.10.9 2013-12-29 12:15:44 -08:00
Ted Nyman
cdf6fb4a22 Initialize breakdown hash 2013-12-29 02:55:17 -08:00
Ted Nyman
9dc7329601 Merge pull request #873 from github/debug
fix refactoring from #836
2013-12-29 02:51:37 -08:00
Patrick Reynolds
bd4204b89e fix refactoring from #836 2013-12-29 01:32:56 -06:00
Ted Nyman
bbf0e65c74 No need for the extra check 2013-12-28 20:09:54 -08:00
Ted Nyman
b7e2f7cff9 Clearer naming 2013-12-28 20:00:11 -08:00
Ted Nyman
f9e50f4826 Minor README 2013-12-28 19:58:36 -08:00
Ted Nyman
184095cc02 Clarify README for new options 2013-12-28 19:57:39 -08:00
Ted Nyman
6a78ac61a7 Add --breakdown option for linguist binary 2013-12-28 19:56:41 -08:00
Ted Nyman
b498d51889 Add another breakdown_by_file assertion 2013-12-28 19:45:40 -08:00
Ted Nyman
7fb16b7abe More README 2013-12-28 19:42:03 -08:00
Ted Nyman
7bfdd4086e Update README for new output 2013-12-28 19:41:06 -08:00
Ted Nyman
dd27ddda17 Fixup output 2013-12-28 19:40:02 -08:00
Ted Nyman
b5181488a0 Merge pull request #872 from github/file-breakdown
Add support for stats breakdown by file per repo
2013-12-28 19:32:54 -08:00
Ted Nyman
001068ec75 Add test for language breakdown 2013-12-28 19:29:55 -08:00
Ted Nyman
e660442e2e Add support for stats breakdown by file per repo 2013-12-28 19:22:13 -08:00
Ted Nyman
f7b7a89709 Start towards pl heuristics 2013-12-28 18:06:04 -08:00
Ted Nyman
f46a895ae3 Merge pull request #870 from joshterrell805/patch-1
Add .njs as a Javascript extension
2013-12-28 13:06:20 -08:00
Josh Terrell
da396d4c28 Add .njs as a Javascript extension
.njs is an extension used to denote node javascript files.

Fixes https://github.com/github/linguist/issues/865
2013-12-27 14:20:37 -08:00
Ted Nyman
93556449c9 Merge pull request #868 from ktdreyer/gemspec
update gemspec metadata
2013-12-27 13:54:19 -08:00
Ken Dreyer
813c150918 add description metadata to gemspec 2013-12-27 14:14:04 -07:00
Ken Dreyer
3ced5ec784 add MIT license metadata to gemspec 2013-12-27 13:21:44 -07:00
Ted Nyman
cdde9096da More test_markup 2013-12-26 19:36:27 -08:00
Ted Nyman
2cb2194686 Add test_prose 2013-12-26 19:35:19 -08:00
Ted Nyman
6ae12cd0be Merge pull request #864 from natebrennand/master
add AngularJS to the vendored list
2013-12-24 13:43:13 -08:00
Nate Brennand
a3e1420476 add AngularJS to the vendored list 2013-12-24 02:05:10 -08:00
Ted Nyman
66a2d5fa2e Merge pull request #862 from wadetandy/master
Add vendor patterns for bower_components files
2013-12-23 20:55:19 -08:00
Wade Tandy
582daf273a Add vendor patterns for bower_components files
Adds Bower Component files to the vendored files list.  This
uses the `bower_components` directory, which is the standard set by the
Bower package manager.
2013-12-23 21:36:55 -05:00
Ted Nyman
310a804507 Add lua interpreter 2013-12-23 18:11:02 -08:00
Ted Nyman
5e4b860fb7 2.10.8 2013-12-23 17:38:54 -08:00
Ted Nyman
86f78792c4 Regenerate samples 2013-12-23 17:37:57 -08:00
Ted Nyman
064c62b587 Remove extra gosu sample 2013-12-23 17:37:05 -08:00
Ted Nyman
7f34de90c6 More ignored files 2013-12-23 17:31:52 -08:00
Ted Nyman
7fb389fda3 Just use primary extension here 2013-12-23 17:24:32 -08:00
Ted Nyman
85e4c58aeb Merge pull request #861 from github/add_crystal
Add crystal
2013-12-23 13:02:55 -08:00
Arfon Smith
de47a28ca0 Merge pull request #860 from github/extending_standard_ml
Extending standard ml
2013-12-23 13:02:18 -08:00
Arfon Smith
0f42d35f29 Merge branch 'pr/678' into add_crystal
Conflicts:
	lib/linguist/languages.yml
2013-12-23 14:58:35 -06:00
Arfon Smith
d51df2aef3 Adding .fun extension to Standard ML definition and adding some sample files 2013-12-23 14:50:39 -06:00
Arfon Smith
0c02bd18db Merge branch 'pr/520' into standard_ml 2013-12-23 14:39:37 -06:00
Arfon Smith
75276c8380 Regenerating samples.json 2013-12-23 14:37:25 -06:00
Ted Nyman
442aa4ed33 Merge pull request #859 from github/postscript_support
Postscript support
2013-12-23 12:33:51 -08:00
Arfon Smith
1ab8c8da53 Merge branch 'pr/804' into postscript_support
Conflicts:
	lib/linguist/generated.rb
2013-12-23 14:25:33 -06:00
Ted Nyman
f03201209f Merge pull request #858 from github/perl_6
Perl 6
2013-12-23 11:58:12 -08:00
Arfon Smith
d79d535182 Merge branch 'master' into perl_6
Conflicts:
	lib/linguist/samples.json
2013-12-23 13:52:37 -06:00
Arfon Smith
01dc7e2294 Removing non-Perl 6 specific extensions 2013-12-23 13:50:22 -06:00
Arfon Smith
b2d1917fa0 Merge branch 'pr/750' into perl_6
Conflicts:
	lib/linguist/samples.json
2013-12-23 13:49:20 -06:00
Ted Nyman
ca9ca29cc9 Merge pull request #857 from github/idl_support
Idl support
2013-12-23 11:47:33 -08:00
Arfon Smith
1ea21fbb8d Removing .pro extension for prolog 2013-12-23 13:37:21 -06:00
Arfon Smith
46274496d6 Merge branch 'master' into idl_support
Conflicts:
	lib/linguist/samples.json
2013-12-23 13:10:34 -06:00
Arfon Smith
16f1f87a8e Updating samples to include IDL 2013-12-23 13:09:00 -06:00
Ted Nyman
7847e17735 Merge pull request #856 from ChimeraCoder/master
Ignore non-minified bootstrap files
2013-12-23 11:06:03 -08:00
Ted Nyman
8cacd10210 Regenerate samples 2013-12-23 11:05:10 -08:00
Aditya Mukerjee
9a6446bae3 Fix typo 2013-12-23 14:04:39 -05:00
Ted Nyman
f6034b85fb Remove prolog samples for now and rely on .prolog extension 2013-12-23 11:04:26 -08:00
Arfon Smith
55c24a30df Merge branch 'pr/425' into idl_support 2013-12-23 13:01:11 -06:00
Aditya Mukerjee
88afdac5d2 Ignore non-minified bootstrap files
* bootstrap.min.js is already excluded, but bootstrap.js is not.
2013-12-23 13:30:03 -05:00
Ted Nyman
c5e9023762 Merge pull request #850 from github/cpp_heuristic
A C++ shibboleth?
2013-12-23 10:20:36 -08:00
Ted Nyman
b7d23efc1b Include SCSS as detectable markup 2013-12-23 10:05:36 -08:00
Arfon Smith
300d47b36b Regenerating samples.json and bringing C++ heuristic test up to date 2013-12-22 19:27:14 -06:00
Arfon Smith
e4d381d81c Merge branch 'master' into cpp_heuristic
Conflicts:
	lib/linguist/samples.json
2013-12-22 19:25:01 -06:00
Ted Nyman
3ece15b398 Update samples, version bump to 2.10.7 2013-12-22 15:46:54 -08:00
Ted Nyman
c8761d39d7 Narrow test and set ACTIVE flag for heuristics 2013-12-22 15:25:56 -08:00
Ted Nyman
51195290b8 Remove .pas sample 2013-12-22 15:18:54 -08:00
Ted Nyman
11be3f3f08 Merge pull request #851 from github/append--applescript-extension
Include .scpt as a valid Applescript extension
2013-12-21 19:03:14 -08:00
Garen Torikian
91dd8d4950 Include .scpt as a valid Applescript extension 2013-12-21 19:59:00 -06:00
Ted Nyman
9c26488f29 Merge pull request #849 from github/even_moar_cpp
Adding a few more problematic C++ .h files to samples.
2013-12-21 12:26:59 -08:00
Arfon Smith
b2a5c30a44 A C++ shibboleth? 2013-12-20 22:28:25 -06:00
Arfon Smith
e3d520dba8 Adding a few more problematic C++ .h files to samples. 2013-12-20 22:01:23 -06:00
Ted Nyman
715680bc36 Minor README 2013-12-20 15:34:40 -08:00
Ted Nyman
b5df71950d Minor formatting 2013-12-20 14:55:47 -08:00
Ted Nyman
ed6bcfddef Merge pull request #848 from rlidwka/json5
adding JSON5 support
2013-12-19 10:01:20 -08:00
Alex Kocharin
a633dd8c79 adding JSON5 support 2013-12-19 14:13:23 +04:00
Ted Nyman
0974586d5c Merge pull request #847 from zhemao/master
Get scons files recognized as python
2013-12-17 14:10:08 -08:00
Howard Mao
774f658f67 get scons files recognized as python 2013-12-17 16:47:31 -05:00
Ted Nyman
37ef402a1f Formatting 2013-12-16 21:01:39 -08:00
Ted Nyman
99ad32511e Minor README updates 2013-12-16 20:59:28 -08:00
Ted Nyman
a282b56f46 Fix debug method 2013-12-16 20:55:00 -08:00
Ted Nyman
9845eba9df Merge pull request #844 from github/cpp-extra-samples
Cpp extra samples
2013-12-16 18:23:33 -08:00
Arfon Smith
a49303c93f Expanding TestHeuristcs to include all Objective C header files 2013-12-16 15:27:48 -08:00
Rob Hunter
4adbbc3fcc Add a few samples of misclassified C++ headers
Several people mentioned in #467 that they were seeing their C++ projects
erroneously showing up as containing Objective C.

I've added a file from each of the problematic repositories:

  - https://github.com/mp13on11/dwarf_mine
  - https://github.com/miguelishawt/anax
  - https://github.com/mholt/cppcsv
  - https://github.com/coder543/libcanister

They all seem to be triggering on different aspects, since adding one sample
wasn't sufficient to correctly classify the others.

The discussion in #467 makes me think that perhaps Linuist might need to take
the rest of the repository into account when classifying ambiguous files.
2013-12-16 14:38:56 -08:00
Ted Nyman
03cadf22fa 2.10.6 2013-12-15 20:31:34 -08:00
Ted Nyman
89c8d1e64c Docs 2013-12-15 20:30:55 -08:00
Ted Nyman
56ebfae598 Fix test 2013-12-15 20:27:56 -08:00
Ted Nyman
b1bb1a7345 Update RMarkdown type 2013-12-15 20:24:32 -08:00
Ted Nyman
4510bf1007 Merge pull request #839 from github/heuristics
Introduce heuristics
2013-12-15 20:20:50 -08:00
Ted Nyman
dd8b368f76 Merge branch 'master' into heuristics 2013-12-15 20:20:19 -08:00
Ted Nyman
17d0b1e02f More documentation 2013-12-15 20:17:30 -08:00
Ted Nyman
0626def699 Start with Objective-C 2013-12-15 20:15:19 -08:00
Ted Nyman
b3c6c85387 Start on basic heuristics tests 2013-12-15 20:06:59 -08:00
Ted Nyman
455266f27d Merge pull request #838 from github/rmd-sample
Adding rmd example
2013-12-15 20:01:51 -08:00
Arfon Smith
567408bc5e Adding rmd example 2013-12-15 19:52:15 -08:00
Ted Nyman
0c668ee179 Some README updates 2013-12-15 12:25:47 -08:00
Ted Nyman
3bc17e822d Start on basic heuristic approach 2013-12-14 23:33:21 -08:00
Ted Nyman
6bd97c7fc7 Bit of docs 2013-12-14 18:51:34 -08:00
Rob Hoelz
f1ffc9e581 Remove duplicate extensions for Perl 6 2013-12-04 11:22:17 +01:00
Rob Hoelz
ec6ef033a1 Update samples file 2013-12-04 08:18:17 +01:00
Rob Hoelz
a375a063d5 Add sample Perl 6 files 2013-12-04 08:10:58 +01:00
Rob Hoelz
d66147a277 Add Perl6 to languages.yml 2013-12-04 08:10:58 +01:00
Aaron Puchert
86329a0758 Forgot parantheses 2013-12-03 17:21:43 +01:00
Aaron Puchert
53f29344f8 Changed PostScript type to 'markup' 2013-11-24 18:04:44 +01:00
Aaron Puchert
0436973fb7 Add detection for generated PostScript files. 2013-11-24 18:04:20 +01:00
kethomassen
fb3e59c6f5 Fix Crystal Lexer
"ruby" => "Ruby"
2013-09-10 16:52:12 +10:00
kethomassen
c0c0252bab Add Crystal test 2013-09-09 17:52:11 +10:00
kethomassen
02953ac3ef Add Crystal
http://crystal-lang.org/
2013-09-09 17:47:16 +10:00
Aaron Puchert
fab34da3e7 Added PostScript to languages.yml and a sample file. 2013-05-31 20:10:54 +02:00
Matthew Fluet
a9a28ce58d The .fun extension is commonly used for Standard ML. 2013-05-30 20:54:36 -04:00
Michael Galloy
a8b2b0a86b Adding Interactive Data Language (IDL) support. 2013-03-07 18:48:27 -07:00
46 changed files with 6860 additions and 1425 deletions

View File

@@ -1,18 +1,20 @@
# Linguist
We use this library at GitHub to detect blob languages, highlight code, ignore binary files, suppress generated files in diffs and generate language breakdown graphs.
We use this library at GitHub to detect blob languages, highlight code, ignore binary files, suppress generated files in diffs, and generate language breakdown graphs.
## Features
### Language detection
Linguist defines the list of all languages known to GitHub in a [yaml file](https://github.com/github/linguist/blob/master/lib/linguist/languages.yml). In order for a file to be highlighted, a language and lexer must be defined there.
Linguist defines a list of all languages known to GitHub in a [yaml file](https://github.com/github/linguist/blob/master/lib/linguist/languages.yml). In order for a file to be highlighted, a language and lexer must be defined there.
Most languages are detected by their file extension. This is the fastest and most common situation.
For disambiguating between files with common extensions, we use a [Bayesian classifier](https://github.com/github/linguist/blob/master/lib/linguist/classifier.rb). For an example, this helps us tell the difference between `.h` files which could be either C, C++, or Obj-C.
In the actual GitHub app we deal with `Grit::Blob` objects. For testing, there is a simple `FileBlob` API.
For disambiguating between files with common extensions, we first apply
some common-sense heuristics to pick out obvious languages. After that, we use a
[statistical
classifier](https://github.com/github/linguist/blob/master/lib/linguist/classifier.rb).
This process can help us tell the difference between, for example, `.h` files which could be either C, C++, or Obj-C.
```ruby
@@ -27,12 +29,9 @@ See [lib/linguist/language.rb](https://github.com/github/linguist/blob/master/li
The actual syntax highlighting is handled by our Pygments wrapper, [pygments.rb](https://github.com/tmm1/pygments.rb). It also provides a [Lexer abstraction](https://github.com/tmm1/pygments.rb/blob/master/lib/pygments/lexer.rb) that determines which highlighter should be used on a file.
We typically run on a pre-release version of Pygments, [pygments.rb](https://github.com/tmm1/pygments.rb), to get early access to new lexers. The [languages.yml](https://github.com/github/linguist/blob/master/lib/linguist/languages.yml) file is a dump of the lexers we have available on our server.
### Stats
The Language Graph you see on every repository is built by aggregating the languages of each file in that repository.
The top language in the graph determines the project's primary language. Collectively, these stats make up the [Top Languages](https://github.com/languages) page.
The Language stats bar that you see on every repository is built by aggregating the languages of each file in that repository. The top language in the graph determines the project's primary language. Collectively, these stats make up the [Top Languages](https://github.com/languages) page.
The repository stats API, accessed through `#languages`, can be used on a directory:
@@ -42,11 +41,18 @@ project.language.name #=> "Ruby"
project.languages #=> { "Ruby" => 0.98, "Shell" => 0.02 }
```
These stats are also printed out by the `linguist` binary. Try running `linguist` on itself:
These stats are also printed out by the `linguist` binary. You can use the
`--breakdown` flag, and the binary will also output the breakdown of files by language.
$ bundle exec linguist lib/
You can try running `linguist` on the `lib/` directory in this repository itself:
$ bundle exec linguist lib/ --breakdown
100% Ruby
Ruby: ["linguist/blob_helper.rb", "linguist/classifier.rb", "linguist/file_blob.rb", "linguist/generated.rb",
"linguist/heuristics.rb", "linguist/language.rb", "linguist/md5.rb", "linguist/repository.rb",
"linguist/samples.rb", "linguist/tokenizer.rb", "linguist.rb"]
#### Ignore vendored files
Checking other code into your git repo is a common practice. But this often inflates your project's language stats and may even cause your project to be labeled as another language. We are able to identify some of these files and directories and exclude them.

View File

@@ -1,7 +1,7 @@
require 'json'
require 'rake/clean'
require 'rake/testtask'
require 'yaml'
require 'json'
task :default => :test

View File

@@ -1,14 +1,22 @@
#!/usr/bin/env ruby
# linguist — detect language type for a file, or, given a directory, determine language breakdown
#
# usage: linguist <path>
# usage: linguist <path> [<--breakdown>]
require 'linguist/file_blob'
require 'linguist/repository'
path = ARGV[0] || Dir.pwd
# special case if not given a directory but still given the --breakdown option
if path == "--breakdown"
path = Dir.pwd
breakdown = true
end
ARGV.shift
breakdown = true if ARGV[0] == "--breakdown"
if File.directory?(path)
repo = Linguist::Repository.from_directory(path)
repo.languages.sort_by { |_, size| size }.reverse.each do |language, size|
@@ -16,6 +24,13 @@ if File.directory?(path)
percentage = sprintf '%.2f' % percentage
puts "%-7s %s" % ["#{percentage}%", language]
end
if breakdown
puts
file_breakdown = repo.breakdown_by_file
file_breakdown.each do |lang, files|
puts "#{lang}: #{files}"
end
end
elsif File.file?(path)
blob = Linguist::FileBlob.new(path, Dir.pwd)
type = if blob.text?

View File

@@ -1,10 +1,12 @@
Gem::Specification.new do |s|
s.name = 'github-linguist'
s.version = '2.10.5'
s.version = '2.10.9'
s.summary = "GitHub Language detection"
s.description = 'We use this library at GitHub to detect blob languages, highlight code, ignore binary files, suppress generated files in diffs, and generate language breakdown graphs.'
s.authors = "GitHub"
s.homepage = "https://github.com/github/linguist"
s.license = "MIT"
s.files = Dir['lib/**/*']
s.executables << 'linguist'

View File

@@ -1,5 +1,6 @@
require 'linguist/blob_helper'
require 'linguist/generated'
require 'linguist/heuristics'
require 'linguist/language'
require 'linguist/repository'
require 'linguist/samples'

View File

@@ -83,8 +83,8 @@ module Linguist
debug_dump_all_tokens(tokens, languages) if verbosity >= 2
languages.each do |language|
debug_dump_probabilities(tokens, language) if verbosity >= 1
scores[language] = tokens_probability(tokens, language) + language_probability(language)
debug_dump_probabilities(tokens, language, scores[language]) if verbosity >= 1
end
scores.sort { |a, b| b[1] <=> a[1] }.map { |score| [score[0], score[1]] }
@@ -130,9 +130,9 @@ module Linguist
@verbosity ||= (ENV['LINGUIST_DEBUG'] || 0).to_i
end
def debug_dump_probabilities
def debug_dump_probabilities(tokens, language, score)
printf("%10s = %10.3f + %7.3f = %10.3f\n",
language, tokens_probability(tokens, language), language_probability(language), scores[language])
language, tokens_probability(tokens, language), language_probability(language), score)
end
# Internal: show a table of probabilities for each <token,language> pair.

View File

@@ -58,6 +58,7 @@ module Linguist
generated_parser? ||
generated_net_docfile? ||
generated_net_designer_file? ||
generated_postscript? ||
generated_protocol_buffer? ||
generated_jni_header? ||
composer_lock? ||
@@ -176,6 +177,29 @@ module Linguist
false
end
# Internal: Is the blob of PostScript generated?
#
# PostScript files are often generated by other programs. If they tell us so,
# we can detect them.
#
# Returns true or false.
def generated_postscript?
return false unless ['.ps', '.eps'].include? extname
# We analyze the "%%Creator:" comment, which contains the author/generator
# of the file. If there is one, it should be in one of the first few lines.
creator = lines[0..9].find {|line| line =~ /^%%Creator: /}
return false if creator.nil?
# Most generators write their version number, while human authors' or companies'
# names don't contain numbers. So look if the line contains digits. Also
# look for some special cases without version numbers.
return creator =~ /[0-9]/ ||
creator.include?("mpage") ||
creator.include?("draw") ||
creator.include?("ImageMagick")
end
# Internal: Is the blob a C++, Java or Python source file generated by the
# Protocol Buffer compiler?
#

View File

@@ -0,0 +1,46 @@
module Linguist
# A collection of simple heuristics that can be used to better analyze languages.
class Heuristics
ACTIVE = false
# Public: Given an array of String language names,
# apply heuristics against the given data and return an array
# of matching languages, or nil.
#
# data - Array of tokens or String data to analyze.
# languages - Array of language name Strings to restrict to.
#
# Returns an array of Languages or []
def self.find_by_heuristics(data, languages)
if active?
if languages.all? { |l| ["Objective-C", "C++"].include?(l) }
disambiguate_c(data, languages)
end
if languages.all? { |l| ["Perl", "Prolog"].include?(l) }
disambiguate_pl(data, languages)
end
end
end
# .h extensions are ambigious between C, C++, and Objective-C.
# We want to shortcut look for Objective-C _and_ now C++ too!
#
# Returns an array of Languages or []
def self.disambiguate_c(data, languages)
matches = []
matches << Language["Objective-C"] if data.include?("@interface")
matches << Language["C++"] if data.include?("#include <cstdint>")
matches
end
def self_disambiguate_pl(data, languages)
matches = []
matches << Language["Prolog"] if data.include?(":-")
matches
end
def self.active?
!!ACTIVE
end
end
end

View File

@@ -7,6 +7,7 @@ rescue LoadError
end
require 'linguist/classifier'
require 'linguist/heuristics'
require 'linguist/samples'
module Linguist
@@ -32,7 +33,7 @@ module Linguist
#
# Returns an array
def self.detectable_markup
["CSS", "Less", "Sass", "Stylus", "TeX"]
["CSS", "Less", "Sass", "SCSS", "Stylus", "TeX"]
end
# Detect languages by a specific type
@@ -113,19 +114,32 @@ module Linguist
name += ".script!"
end
# First try to find languages that match based on filename.
possible_languages = find_by_filename(name)
# If there is more than one possible language with that extension (or no
# extension at all, in the case of extensionless scripts), we need to continue
# our detection work
if possible_languages.length > 1
data = data.call() if data.respond_to?(:call)
possible_language_names = possible_languages.map(&:name)
# Don't bother with emptiness
if data.nil? || data == ""
nil
# Check if there's a shebang line and use that as authoritative
elsif (result = find_by_shebang(data)) && !result.empty?
result.first
elsif classified = Classifier.classify(Samples::DATA, data, possible_languages.map(&:name)).first
# No shebang. Still more work to do. Try to find it with our heuristics.
elsif (determined = Heuristics.find_by_heuristics(data, possible_language_names)) && !determined.empty?
determined.first
# Lastly, fall back to the probablistic classifier.
elsif classified = Classifier.classify(Samples::DATA, data, possible_language_names ).first
# Return the actual Language object based of the string language name (i.e., first element of `#classify`)
Language[classified[0]]
end
else
# Simplest and most common case, we can just return the one match based on extension
possible_languages.first
end
end

View File

@@ -90,6 +90,8 @@ AppleScript:
aliases:
- osascript
primary_extension: .applescript
extensions:
- .scpt
Arc:
type: programming
@@ -380,6 +382,12 @@ Creole:
wrap: true
primary_extension: .creole
Crystal:
type: programming
lexer: Ruby
primary_extension: .cr
ace_mode: ruby
Cucumber:
lexer: Gherkin
primary_extension: .feature
@@ -724,6 +732,12 @@ Haxe:
extensions:
- .hxsl
IDL:
type: programming
lexer: Text only
color: "#e3592c"
primary_extension: .pro
INI:
type: data
extensions:
@@ -785,6 +799,11 @@ JSON:
- .jshintrc
- composer.lock
JSON5:
type: data
lexer: JavaScript
primary_extension: .json5
Jade:
group: HTML
type: markup
@@ -820,6 +839,7 @@ JavaScript:
- .jsm
- .jss
- .jsx
- .njs
- .pac
- .sjs
- .ssjs
@@ -913,10 +933,6 @@ LiveScript:
Logos:
type: programming
primary_extension: .xm
extensions:
- .x
- .xi
- .xmi
Logtalk:
type: programming
@@ -932,6 +948,8 @@ Lua:
extensions:
- .nse
- .rbxs
interpreters:
- lua
M:
type: programming
@@ -1199,16 +1217,28 @@ Perl:
primary_extension: .pl
extensions:
- .PL
- .nqp
- .perl
- .ph
- .plx
- .pm6
- .pm
- .pod
- .psgi
interpreters:
- perl
Perl6:
type: programming
color: "#0298c3"
primary_extension: .p6
extensions:
- .6pl
- .6pm
- .nqp
- .p6l
- .p6m
- .pl6
- .pm6
Pike:
type: programming
color: "#066ab2"
@@ -1230,6 +1260,12 @@ PogoScript:
lexer: Text only
primary_extension: .pogo
PostScript:
type: markup
primary_extension: .ps
extensions:
- .eps
PowerShell:
type: programming
ace_mode: powershell
@@ -1250,8 +1286,6 @@ Prolog:
type: programming
color: "#74283c"
primary_extension: .prolog
extensions:
- .pro
Protocol Buffer:
type: markup
@@ -1289,6 +1323,8 @@ Python:
- .xpy
filenames:
- wscript
- SConstruct
- SConscript
interpreters:
- python
@@ -1340,7 +1376,7 @@ RHTML:
primary_extension: .rhtml
RMarkdown:
type: markup
type: prose
lexer: Text only
wrap: true
ace_mode: markdown
@@ -1537,6 +1573,8 @@ Standard ML:
aliases:
- sml
primary_extension: .sml
extensions:
- .fun
Stylus:
type: markup

View File

@@ -29,6 +29,7 @@ module Linguist
@computed_stats = false
@language = @size = nil
@sizes = Hash.new { 0 }
@file_breakdown = Hash.new { |h,k| h[k] = Array.new }
end
# Public: Returns a breakdown of language stats.
@@ -60,6 +61,12 @@ module Linguist
@size
end
# Public: Return the language breakdown of this repository by file
def breakdown_by_file
compute_stats
@file_breakdown
end
# Internal: Compute language breakdown for each blob in the Repository.
#
# Returns nothing
@@ -75,6 +82,10 @@ module Linguist
# Only include programming languages and acceptable markup languages
if blob.language.type == :programming || Language.detectable_markup.include?(blob.language.name)
# Build up the per-file breakdown stats
@file_breakdown[blob.language.group.name] << blob.name
@sizes[blob.language.group] += blob.size
end
end

File diff suppressed because it is too large Load Diff

View File

@@ -27,11 +27,14 @@
# Node dependencies
- node_modules/
# Bower Components
- bower_components/
# Erlang bundles
- ^rebar$
# Bootstrap minified css and js
- (^|/)bootstrap([^.]*)(\.min)\.(js|css)$
- (^|/)bootstrap([^.]*)(\.min)?\.(js|css)$
# Vendored dependencies
- thirdparty/
@@ -82,6 +85,9 @@
- (^|/)shCore\.js$
- (^|/)shLegacy\.js$
# AngularJS
- (^|/)angular([^.]*)(\.min)?\.js$
## Python ##
# django
@@ -140,6 +146,7 @@
# LICENSE, README, git config files
- ^COPYING$
- LICENSE$
- License$
- gitattributes$
- gitignore$
- gitmodules$

42
samples/C++/CsvStreamer.h Normal file
View File

@@ -0,0 +1,42 @@
#pragma once
#include <string>
#include <vector>
#include <fstream>
#include "util.h"
using namespace std;
#define DEFAULT_DELIMITER ','
class CsvStreamer
{
private:
ofstream file; // File output stream
vector<string> row_buffer; // Buffer which stores a row's data before being flushed/written
int fields; // Number of fields (columns)
long rows; // Number of rows (records) including header row
char delimiter; // Delimiter character; comma by default
string sanitize(string); // Returns a string ready for output into the file
public:
CsvStreamer(); // Empty CSV streamer... be sure to open the file before writing!
CsvStreamer(string, char); // Same as open(string, char)...
CsvStreamer(string); // Opens an output CSV file given a file path/name
~CsvStreamer(); // Ensures the output file is closed and saved
void open(string); // Opens an output CSV file given a file path/name (default delimiter)
void open(string, char); // Opens an output CSV file given a file path/name and a delimiting character (default comma)
void add_field(string); // If still on first line, adds a new field to the header row
void save_fields(); // Call this to save the header row; all new writes should be through append()
void append(string); // Appends the current row with this data for the next field; quoted only if needed (leading/trailing spaces are trimmed)
void append(string, bool); // Like append(string) but can specify whether to trim spaces at either end of the data (false to keep spaces)
void append(float); // Appends the current row with this number
void append(double); // Appends the current row with this number
void append(long); // Appends the current row with this number
void append(int); // Appends the current row with this number
void writeln(); // Flushes what was in the row buffer into the file (writes the row)
void close(); // Saves and closes the file
int field_count(); // Gets the number of fields (columns)
long row_count(); // Gets the number of records (rows) -- NOT including the header row
};

32
samples/C++/Field.h Normal file
View File

@@ -0,0 +1,32 @@
/*****************************************************************************
* Dwarf Mine - The 13-11 Benchmark
*
* Copyright (c) 2013 Bünger, Thomas; Kieschnick, Christian; Kusber,
* Michael; Lohse, Henning; Wuttke, Nikolai; Xylander, Oliver; Yao, Gary;
* Zimmermann, Florian
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*****************************************************************************/
#pragma once
enum Field { Free, Black, White, Illegal };
typedef Field Player;

32
samples/C++/Types.h Normal file
View File

@@ -0,0 +1,32 @@
/*****************************************************************************
* Dwarf Mine - The 13-11 Benchmark
*
* Copyright (c) 2013 Bünger, Thomas; Kieschnick, Christian; Kusber,
* Michael; Lohse, Henning; Wuttke, Nikolai; Xylander, Oliver; Yao, Gary;
* Zimmermann, Florian
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*****************************************************************************/
#pragma once
#include <cstdint>
typedef uint32_t smallPrime_t;

1129
samples/C++/bcm2835.h Normal file

File diff suppressed because it is too large Load Diff

138
samples/C++/libcanister.h Normal file
View File

@@ -0,0 +1,138 @@
#ifndef LIBCANIH
#define LIBCANIH
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <cstring>
#define int64 unsigned long long
//#define DEBUG
#ifdef DEBUG
#define dout cout
#else
#define dout if (0) cerr
#endif
using namespace std;
namespace libcanister
{
//the canmem object is a generic memory container used commonly
//throughout the canister framework to hold memory of uncertain
//length which may or may not contain null bytes.
class canmem
{
public:
char* data; //the raw memory block
int size; //the absolute length of the block
canmem(); //creates an unallocated canmem
canmem(int allocsize); //creates an allocated, blank canmem of size
canmem(char* strdata); //automates the creation of zero-limited canmems
~canmem(); //cleans up the canmem
void zeromem(); //overwrites this canmem
void fragmem(); //overwrites this canmem with fragment notation
void countlen(); //counts length of zero-limited strings and stores it in size
void trim(); //removes any nulls from the end of the string
static canmem null(); //returns a singleton null canmem
};
//contains information about the canister
class caninfo
{
public:
canmem path; //physical path
canmem internalname; //a name for the canister
int numfiles; //the number of files in the canister
};
//necessary for the use of this class as a type in canfile
class canister;
//this object holds the definition of a 'file' within the
//canister 'filesystem.'
class canfile
{
public:
libcanister::canister* parent; //the canister that holds this file
canmem path; //internal path ('filename')
canmem data; //the file's decompressed contents
int isfrag; //0 = probably not fragment, 1 = definitely a fragment (ignore)
int cfid; //'canfile id' -- a unique ID for this file
int64 dsize; //ondisk size (compressed form size)
int cachestate; //0 = not in memory, 1 = in memory, 2 = in memory and needs flush
//-1 = error, check the data for the message
void cache(); //pull the file from disk and cache it in memory
void cachedump(); //deletes the contents of this file from the memory cache after assuring the on disk copy is up to date
void cachedumpfinal(fstream& infile); //same as cachedump, but more efficient during closing procedures
void flush(); //updates the on disk copy, but retains the memory cache
};
//the primary class
//this defines and controls a single canister
class canister
{
//table of contents
//absolutely worthless to the control code in the canister
//but quite useful to programs using the API, as they may
//desire to enumerate the files in a canister for a user's
//use or for their own.
//contains a newline-delimited list of files in the container.
canfile TOC;
public:
caninfo info; //the general info about this canister
//the raw canfiles -- recommended that programs do not modify
//these files directly, but not enforced.
canfile* files;
bool readonly; //if true then no write routines will do anything
//maximum number of files to have in memory at any given
//time, change this to whatever suits your application.
int cachemax;
int cachecnt; //number of files in the cache (should not be modified)
//both initialize the canister from a physical location
canister (canmem fspath);
canister (char* fspath);
//destroys the canister (after flushing the modded buffers, of course)
~canister();
//open the fspath
//does it exist?
// | --- yes --- opening it (return 1)
// | --- yes --- file is corrupted, halting (return -1)
// | --- no --- making a new one (return 0)
int open();
//close the canister, flush all buffers, clean up
int close();
//deletes the file at path inside this canister
int delFile(canmem path);
//pulls the contents of the file from disk or memory and returns it as a file
canfile getFile(canmem path);
//creates a file if it does not exist, otherwise overwrites
//returns whether operation succeeded
bool writeFile(canmem path, canmem data);
bool writeFile(canfile file);
//get the 'table of contents', a file containing a newline delimited
//list of the file paths in the container which have contents
canfile getTOC();
//brings the cache back within the cachemax limit
//important: sCFID is the safe CFID
//(the CFID of the file we want to avoid uncaching)
//really just used internally, but it can't do any harm.
void cacheclean(int sCFID, bool dFlush = false);
};
}
#endif

92
samples/C++/metrics.h Normal file
View File

@@ -0,0 +1,92 @@
// Copyright 2011 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef NINJA_METRICS_H_
#define NINJA_METRICS_H_
#include <string>
#include <vector>
using namespace std;
#include "util.h" // For int64_t.
/// The Metrics module is used for the debug mode that dumps timing stats of
/// various actions. To use, see METRIC_RECORD below.
/// A single metrics we're tracking, like "depfile load time".
struct Metric {
string name;
/// Number of times we've hit the code path.
int count;
/// Total time (in micros) we've spent on the code path.
int64_t sum;
};
/// A scoped object for recording a metric across the body of a function.
/// Used by the METRIC_RECORD macro.
struct ScopedMetric {
explicit ScopedMetric(Metric* metric);
~ScopedMetric();
private:
Metric* metric_;
/// Timestamp when the measurement started.
/// Value is platform-dependent.
int64_t start_;
};
/// The singleton that stores metrics and prints the report.
struct Metrics {
Metric* NewMetric(const string& name);
/// Print a summary report to stdout.
void Report();
private:
vector<Metric*> metrics_;
};
/// Get the current time as relative to some epoch.
/// Epoch varies between platforms; only useful for measuring elapsed time.
int64_t GetTimeMillis();
/// A simple stopwatch which returns the time
/// in seconds since Restart() was called.
struct Stopwatch {
public:
Stopwatch() : started_(0) {}
/// Seconds since Restart() call.
double Elapsed() const {
return 1e-6 * static_cast<double>(Now() - started_);
}
void Restart() { started_ = Now(); }
private:
uint64_t started_;
uint64_t Now() const;
};
/// The primary interface to metrics. Use METRIC_RECORD("foobar") at the top
/// of a function to get timing stats recorded for each call of the function.
#define METRIC_RECORD(name) \
static Metric* metrics_h_metric = \
g_metrics ? g_metrics->NewMetric(name) : NULL; \
ScopedMetric metrics_h_scoped(metrics_h_metric);
extern Metrics* g_metrics;
#endif // NINJA_METRICS_H_

View File

@@ -0,0 +1,6 @@
#include <cstdint>
namespace Gui
{
}

26
samples/C++/rpc.h Normal file
View File

@@ -0,0 +1,26 @@
// Copyright (C) 2013 Simon Que
//
// This file is part of DuinoCube.
//
// DuinoCube is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// DuinoCube is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with DuinoCube. If not, see <http://www.gnu.org/licenses/>.
// DuinoCube remote procedure call functions.
#include <stdint.h>
// Initializes RPC system.
void rpc_init();
// Runs the RPC server loop forever.
void rpc_server_loop();

View File

@@ -1 +0,0 @@
print("hello")

29
samples/IDL/mg_acosh.pro Normal file
View File

@@ -0,0 +1,29 @@
; docformat = 'rst'
;+
; Inverse hyperbolic cosine. Uses the formula:
;
; $$\text{acosh}(z) = \ln(z + \sqrt{z + 1} \sqrt{z - 1})$$
;
; :Examples:
; The arc hyperbolic sine function looks like::
;
; IDL> x = 2.5 * findgen(1000) / 999. + 1.
; IDL> plot, x, mg_acosh(x), xstyle=1
;
; This should look like:
;
; .. image:: acosh.png
;
; :Returns:
; float, double, complex, or double complex depending on the input
;
; :Params:
; z : in, required, type=numeric
; input
;-
function mg_acosh, z
compile_opt strictarr
return, alog(z + sqrt(z + 1) * sqrt(z - 1))
end

View File

@@ -0,0 +1,9 @@
MODULE mg_analysis
DESCRIPTION Tools for analysis
VERSION 1.0
SOURCE mgalloy
BUILD_DATE January 18, 2011
FUNCTION MG_ARRAY_EQUAL 2 2 KEYWORDS
FUNCTION MG_TOTAL 1 1

35
samples/IDL/mg_gcd.pro Normal file
View File

@@ -0,0 +1,35 @@
; docformat = 'rst'
;+
; Find the greatest common denominator (GCD) for two positive integers.
;
; :Returns:
; integer
;
; :Params:
; a : in, required, type=integer
; first integer
; b : in, required, type=integer
; second integer
;-
function mg_gcd, a, b
compile_opt strictarr
on_error, 2
if (n_params() ne 2) then message, 'incorrect number of arguments'
if (~mg_isinteger(a) || ~mg_isinteger(b)) then begin
message, 'integer arguments required'
endif
_a = abs(a)
_b = abs(b)
minArg = _a < _b
maxArg = _a > _b
if (minArg eq 0) then return, maxArg
remainder = maxArg mod minArg
if (remainder eq 0) then return, minArg
return, mg_gcd(minArg, remainder)
end

42
samples/IDL/mg_trunc.pro Normal file
View File

@@ -0,0 +1,42 @@
; docformat = 'rst'
;+
; Truncate argument towards 0.0, i.e., takes the `FLOOR` of positive values
; and the `CEIL` of negative values.
;
; :Examples:
; Try the main-level program at the end of this file. It does::
;
; IDL> print, mg_trunc([1.2, -1.2, 0.0])
; 1 -1 0
; IDL> print, floor([1.2, -1.2, 0.0])
; 1 -2 0
; IDL> print, ceil([1.2, -1.2, 0.0])
; 2 -1 0
;
; :Returns:
; array of same type as argument
;
; :Params:
; x : in, required, type=float/double
; array containing values to truncate
;-
function mg_trunc, x
compile_opt strictarr
result = ceil(x)
posInd = where(x gt 0, nposInd)
if (nposInd gt 0L) then begin
result[posInd] = floor(x[posInd])
endif
return, result
end
; main-level example program
print, mg_trunc([1.2, -1.2, 0.0])
end

View File

@@ -0,0 +1,29 @@
/*
* The following is a contrived example, but it illustrates most of the features:
*/
{
foo: 'bar',
while: true,
this: 'is a \
multi-line string',
// this is an inline comment
here: 'is another', // inline comment
/* this is a block comment
that continues on another line */
hex: 0xDEADbeef,
half: .5,
delta: +10,
to: Infinity, // and beyond!
finally: 'a trailing comma',
oh: [
"we shouldn't forget",
'arrays can have',
'trailing commas too',
],
}

View File

@@ -0,0 +1,28 @@
// This file is written in JSON5 syntax, naturally, but npm needs a regular
// JSON file, so compile via `npm run build`. Be sure to keep both in sync!
{
name: 'json5',
version: '0.2.0',
description: 'JSON for the ES5 era.',
keywords: ['json', 'es5'],
author: 'Aseem Kishore <aseem.kishore@gmail.com>',
contributors: [
'Max Nanasy <max.nanasy@gmail.com>',
],
main: 'lib/json5.js',
bin: 'lib/cli.js',
dependencies: {},
devDependencies: {
mocha: '~1.0.3',
},
scripts: {
build: './lib/cli.js -c package.json5',
test: 'mocha --ui exports --reporter spec',
},
homepage: 'http://json5.org/',
repository: {
type: 'git',
url: 'https://github.com/aseemk/json5.git',
},
}

View File

@@ -1,125 +0,0 @@
namespace Loops;
interface
uses System.Linq;
type
ConsoleApp = class
public
class method Main;
method loopsTesting;
method fillData : sequence of Country;
var
Countries : sequence of Country;
end;
type
Country = public class
public
property Name : String;
property Capital : String;
constructor (setName : String; setCapital : String);
end;
implementation
class method ConsoleApp.Main;
begin
Console.WriteLine('Loops example');
Console.WriteLine();
with myConsoleApp := new ConsoleApp() do
myConsoleApp.loopsTesting;
end;
method ConsoleApp.loopsTesting;
begin
{---------------------------------}
{"for" loop, taking every 5th item}
for i : Int32 :=0 to 50 step 5 do
begin
Console.Write(i); Console.Write(' ');
end;
Console.WriteLine(); Console.WriteLine();
{---------------------------------}
{"for" loop, going from high to low value}
for i : Int32 := 10 downto 1 do
begin
Console.Write(i); Console.Write(' ');
end;
Console.WriteLine(); Console.WriteLine();
Countries := fillData;
{---------------------------------}
{loop with defined "index" variable, which will count from 0 through the number of elements looped}
Console.WriteLine('Countries: ');
for each c in Countries index num do
Console.WriteLine(Convert.ToString(num + 1) + ') ' + c.Name);
Console.WriteLine();
Console.WriteLine('Cities: ');
var ind : Integer :=0;
{---------------------------------}
{simple "loop" construct that loops endlessly, until broken out of}
loop
begin
Console.WriteLine(Countries.ElementAt(ind).Capital);
Inc(ind);
if ind = Countries.Count then break;
end;
Console.WriteLine();
{---------------------------------}
{the type of 'c' is inferred automatically}
for each c in Countries do
Console.WriteLine(c.Capital + ' is the capital of ' + c.Name);
Console.WriteLine();
ind := 0;
Console.WriteLine('Cities: ');
{"repeat ... until" loop}
repeat
Console.WriteLine(Countries.ElementAt(ind).Capital);
Inc(ind);
until ind = Countries.Count;
Console.WriteLine();
ind := 0;
Console.WriteLine('Countries: ');
{---------------------------------}
{"while ... do" loop}
while ind < Countries.Count do
begin
Console.WriteLine(Countries.ElementAt(ind).Name);
Inc(ind);
end;
Console.ReadLine();
end;
method ConsoleApp.fillData: sequence of Country;
begin
result := [new Country('UK', 'London'), new Country('USA', 'Washington'), new Country('Germany', 'Berlin'),
new Country('Ukraine', 'Kyiv'), new Country('Russia', 'Moscow'), new Country('France', 'Paris')];
end;
constructor Country (setName :String; setCapital: String);
begin
Name := setName;
Capital := setCapital;
end;
end.

23
samples/Perl6/RoleQ.pm6 Normal file
View File

@@ -0,0 +1,23 @@
role q {
token stopper { \' }
token escape:sym<\\> { <sym> <item=.backslash> }
token backslash:sym<qq> { <?before 'q'> <quote=.LANG('MAIN','quote')> }
token backslash:sym<\\> { <text=.sym> }
token backslash:sym<stopper> { <text=.stopper> }
token backslash:sym<miscq> { {} . }
method tweak_q($v) { self.panic("Too late for :q") }
method tweak_qq($v) { self.panic("Too late for :qq") }
}
role qq does b1 does c1 does s1 does a1 does h1 does f1 {
token stopper { \" }
token backslash:sym<unrec> { {} (\w) { self.throw_unrecog_backslash_seq: $/[0].Str } }
token backslash:sym<misc> { \W }
method tweak_q($v) { self.panic("Too late for :q") }
method tweak_qq($v) { self.panic("Too late for :qq") }
}

View File

@@ -0,0 +1,22 @@
token pod_formatting_code {
$<code>=<[A..Z]>
'<' { $*POD_IN_FORMATTINGCODE := 1 }
$<content>=[ <!before '>'> <pod_string_character> ]+
'>' { $*POD_IN_FORMATTINGCODE := 0 }
}
token pod_string {
<pod_string_character>+
}
token something:sym«<» {
<!>
}
token name {
<!>
}
token comment:sym<#> {
'#' {} \N*
}

252
samples/Perl6/test.p6 Normal file
View File

@@ -0,0 +1,252 @@
#!/usr/bin/env perl6
use v6;
my $string = 'I look like a # comment!';
if $string eq 'foo' {
say 'hello';
}
regex http-verb {
'GET'
| 'POST'
| 'PUT'
| 'DELETE'
| 'TRACE'
| 'OPTIONS'
| 'HEAD'
}
# a sample comment
say 'Hello from Perl 6!'
#`{
multi-line comment!
}
say 'here';
#`(
multi-line comment!
)
say 'here';
#`{{{
I'm a special comment!
}}}
say 'there';
#`{{
I'm { even } specialer!
}}
say 'there';
#`{{
does {{nesting}} work?
}}
#`«<
trying mixed delimiters
»
my $string = qq<Hooray, arbitrary delimiter!>;
my $string = qq«Hooray, arbitrary delimiter!»;
my $string = q <now with whitespace!>;
my $string = qq<<more strings>>;
my %hash := Hash.new;
=begin pod
Here's some POD! Wooo
=end pod
=for Testing
This is POD (see? role isn't highlighted)
say('this is not!');
=table
Of role things
say('not in your table');
#= A single line declarator "block" (with a keyword like role)
#| Another single line declarator "block" (with a keyword like role)
#={
A declarator block (with a keyword like role)
}
#|{
Another declarator block (with a keyword like role)
}
#= { A single line declarator "block" with a brace (with a keyword like role)
#=«
More declarator blocks! (with a keyword like role)
»
#|«
More declarator blocks! (with a keyword like role)
»
say 'Moar code!';
my $don't = 16;
sub don't($x) {
!$x
}
say don't 'foo';
my %hash = (
:foo(1),
);
say %hash<foo>;
say %hash<<foo>>;
say %hash«foo»;
say %*hash<foo>;
say %*hash<<foo>>;
say %*hash«foo»;
say $<todo>;
say $<todo>;
for (@A Z @B) -> $a, $b {
say $a + $b;
}
Q:PIR {
.loadlib "somelib"
}
my $longstring = q/
lots
of
text
/;
my $heredoc = q:to/END_SQL/;
SELECT * FROM Users
WHERE first_name = 'Rob'
END_SQL
my $hello;
# Fun with regexen
if 'food' ~~ /foo/ {
say 'match!'
}
my $re = /foo/;
my $re2 = m/ foo /;
my $re3 = m:i/ FOO /;
call-a-sub(/ foo /);
call-a-sub(/ foo \/ bar /);
my $re4 = rx/something | something-else/;
my $result = ms/regexy stuff/;
my $sub0 = s/regexy stuff/more stuff/;
my $sub = ss/regexy stuff/more stuff/;
my $trans = tr/regexy stuff/more stuff/;
my @values = <a b c d>;
call-sub(<a b c d>);
call-sub <a b c d>;
my $result = $a < $b;
for <a b c d> -> $letter {
say $letter;
}
sub test-sub {
say @_;
say $!;
say $/;
say $0;
say $1;
say @*ARGS;
say $*ARGFILES;
say &?BLOCK;
say ::?CLASS;
say $?CLASS;
say @=COMMENT;
say %?CONFIG;
say $*CWD;
say $=data;
say %?DEEPMAGIC;
say $?DISTRO;
say $*DISTRO;
say $*EGID;
say %*ENV;
say $*ERR;
say $*EUID;
say $*EXECUTABLE_NAME;
say $?FILE;
say $?GRAMMAR;
say $*GID;
say $*IN;
say @*INC;
say %?LANG;
say $*LANG;
say $?LINE;
say %*META-ARGS;
say $?MODULE;
say %*OPTS;
say %*OPT;
say $?KERNEL;
say $*KERNEL;
say $*OUT;
say $?PACKAGE;
say $?PERL;
say $*PERL;
say $*PID;
say %=pod;
say $*PROGRAM_NAME;
say %*PROTOCOLS;
say ::?ROLE;
say $?ROLE;
say &?ROUTINE;
say $?SCOPE;
say $*TZ;
say $*UID;
say $?USAGE;
say $?VM;
say $?XVM;
}
say <a b c>;
my $perl5_re = m:P5/ fo{2} /;
my $re5 = rx«something | something-else»;
my $M := %*COMPILING<%?OPTIONS><M>;
say $M;
sub regex-name { ... }
my $pair = role-name => 'foo';
$pair = rolesque => 'foo';
my sub something(Str:D $value) { ... }
my $s = q«<
some
string
stuff
»;
my $regex = m«< some chars »;
# after
say $/<foo><bar>;
roleq;

View File

@@ -0,0 +1,41 @@
%!PS-Adobe-3.0
%%Creator: Aaron Puchert
%%Title: The Sierpinski triangle
%%Pages: 1
%%PageOrder: Ascend
%%BeginProlog
% PAGE SETTINGS
/pageset {
28.3464566 28.3464566 scale % set cm = 1
0.5 0.5 translate
0 setlinewidth
} def
% sierpinski(n) draws a sierpinski triangle of order n
/sierpinski {
dup 0 gt {
[0.5 0 0 0.5 0 0] concat dup 1 sub sierpinski
[1 0 0 1 1 0] concat dup 1 sub sierpinski
[1 0 0 1 -1 1] concat dup 1 sub sierpinski
[2 0 0 2 0 -1] concat
} {
newpath
0 0 moveto
1 0 lineto
0 1 lineto
closepath
fill
} ifelse pop} def
%%EndProlog
%%BeginSetup
<< /PageSize [596 843] >> setpagedevice % A4
%%EndSetup
%%Page: Test 1
pageset
[20 0 10 300 sqrt 0 0] concat
9 sierpinski
showpage
%%EOF

View File

@@ -1,68 +0,0 @@
action_module(calculator) .
%[-,-,d1,-] --push(D)--> [-,-,D,-] if mode(init)
push(D) < -
mode(init),
deny([displayed(D1),mode(init)]),
affirm([displayed(D),mode(cont)]).
%[-,-,D1,-] --push(D)--> [-,-,10*D1+D,-] if mode(cont)
push(D) < -
mode(cont),
deny(displayed(D1)),
New = 10*D1 + D,
affirm(displayed(New)).
%[a,op,d,m] --push(clear)--> [0,nop,0,0]
push(clear) < -
deny([accumulator(A),op(O),displayed(D),memory(M),mode(X)]),
affirm([accumulator(0),op(nop),displayed(0),memory(0),mode(init)]).
%[a,op,d,m] --push(mem_rec)--> [a,op,m,m]
push(mem_rec) < -
memory(M),
deny([displayed(D),mode(X)]),
affirm([displayed(M),mode(init)]).
%[a,op,d,m] --push(plus)--> [op(a,d),plus,d,m]
push(plus) < -
displayed(D),
deny([accumulator(A),op(O),mode(X)]),
eval(O,A,D,V), ; use normal arithmetic, i.e., V=O(A,D)
affirm([accumulator(V),op(plus),mode(init)]).
%[a,op,d,m] --push(minus)--> [op(a,d,minus,d,m]
push(minus) lt -
displayed(D),
deny([accumulator(A),op(O),mode(X)]),
eval(O,A,D,V), ; use normal arithmetic, i.e., V=O(A,D)
affirm([accumulator(V),op(minus),mode(init)]).
%[a,op,d,m] --push(times)--> [op(a,d),times,d,m]
push(times) < -
displayed(D),
deny([accumulator(A),op(O),mode(X)]),
eval(O,A,D,V), ; use normal arithmetic, i.e., V=O(A,D)
affirm([accumulator(V),op(times),mode(init)]).
%[a,op,d,m] --push(equal)--> [a,nop,op(a,d),m]
push(equal) < -
accumulator(A),
deny([op(O),displayed(D),mode(X)]),
eval(O,A,D,V),
affirm([op(nop),displayed(V),mode(init)]).
%[a,op,d,m] --push(mem_plus)--> [a,nop,v,plus(m,v)] where v=op(a,d)
push(mem_plus) < -
accumulator(A),
deny([op(O),displayed(D),memory(M),mode(X)]),
eval(O,A,D,V),
eval(plus,M,V,V1),
affirm([op(nop),displayed(V),memory(V1),mode(init)]).
%[a,op,d,m] --push(plus_minus)--> [a,op,-d,m]
push(clear) < -
deny([displayed(D),mode(X)]),
eval(minus,0,D,V),
affirm([displayed(V),mode(init)]).

View File

@@ -1,94 +0,0 @@
%%----- normalize(+Wff,-NormalClauses) ------
normalize(Wff,NormalClauses) :-
conVert(Wff,[],S),
cnF(S,T),
flatten_and(T,U),
make_clauses(U,NormalClauses).
%%----- make a sequence out of a conjunction -----
flatten_and(X /\ Y, F) :-
!,
flatten_and(X,A),
flatten_and(Y, B),
sequence_append(A,B,F).
flatten_and(X,X).
%%----- make a sequence out of a disjunction -----
flatten_or(X \/ Y, F) :-
!,
flatten_or(X,A),
flatten_or(Y,B),
sequence_append(A,B,F).
flatten_or(X,X).
%%----- append two sequences -------------------------------
sequence_append((X,R),S,(X,T)) :- !, sequence_append(R,S,T).
sequence_append((X),S,(X,S)).
%%----- separate into positive and negative literals -----------
separate((A,B),P,N) :-
!,
(A = ~X -> N=[X|N1],
separate(B,P,N1)
;
P=[A|P1],
separate(B,P1,N) ).
separate(A,P,N) :-
(A = ~X -> N=[X],
P = []
;
P=[A],
N = [] ).
%%----- tautology ----------------------------
tautology(P,N) :- some_occurs(N,P).
some_occurs([F|R],B) :-
occurs(F,B) | some_occurs(R,B).
occurs(A,[F|_]) :-
A == F,
!.
occurs(A,[_|R]) :-
occurs(A,R).
make_clauses((A,B),C) :-
!,
flatten_or(A,F),
separate(F,P,N),
(tautology(P,N) ->
make_clauses(B,C)
;
make_clause(P,N,D),
C = [D|R],
make_clauses(B,R) ).
make_clauses(A,C) :-
flatten_or(A,F),
separate(F,P,N),
(tautology(P,N) ->
C = []
;
make_clause(P,N,D),
C = [D] ).
make_clause([],N, false :- B) :-
!,
make_sequence(N,B,',').
make_clause(P,[],H) :-
!,
make_sequence(P,H,'|').
make_clause(P,N, H :- T) :-
make_sequence(P,H,'|'),
make_sequence(N,T,',').
make_sequence([A],A,_) :- !.
make_sequence([F|R],(F|S),'|') :-
make_sequence(R,S,'|').
make_sequence([F|R],(F,S),',') :-
make_sequence(R,S,',').
write_list([F|R]) :-
write(F), write('.'), nl,
write_list(R).
write_list([]).

View File

@@ -1,287 +0,0 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%
%%% A* Algorithm
%%%
%%%
%%% Nodes have form S#D#F#A
%%% where S describes the state or configuration
%%% D is the depth of the node
%%% F is the evaluation function value
%%% A is the ancestor list for the node
:- op(400,yfx,'#'). /* Node builder notation */
solve(State,Soln) :- f_function(State,0,F),
search([State#0#F#[]],S), reverse(S,Soln).
f_function(State,D,F) :- h_function(State,H),
F is D + H.
search([State#_#_#Soln|_], Soln) :- goal(State).
search([B|R],S) :- expand(B,Children),
insert_all(Children,R,Open),
search(Open,S).
insert_all([F|R],Open1,Open3) :- insert(F,Open1,Open2),
insert_all(R,Open2,Open3).
insert_all([],Open,Open).
insert(B,Open,Open) :- repeat_node(B,Open), ! .
insert(B,[C|R],[B,C|R]) :- cheaper(B,C), ! .
insert(B,[B1|R],[B1|S]) :- insert(B,R,S), !.
insert(B,[],[B]).
repeat_node(P#_#_#_, [P#_#_#_|_]).
cheaper( _#_#F1#_ , _#_#F2#_ ) :- F1 < F2.
expand(State#D#_#S,All_My_Children) :-
bagof(Child#D1#F#[Move|S],
(D1 is D+1,
move(State,Child,Move),
f_function(Child,D1,F)),
All_My_Children).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%
%%% 8-puzzle solver
%%%
%%%
%%% State have form A/B/C/D/E/F/G/H/I
%%% where {A,...,I} = {0,...,8}
%%% 0 represents the empty tile
%%%
goal(1/2/3/8/0/4/7/6/5).
%%% The puzzle moves
left( A/0/C/D/E/F/H/I/J , 0/A/C/D/E/F/H/I/J ).
left( A/B/C/D/0/F/H/I/J , A/B/C/0/D/F/H/I/J ).
left( A/B/C/D/E/F/H/0/J , A/B/C/D/E/F/0/H/J ).
left( A/B/0/D/E/F/H/I/J , A/0/B/D/E/F/H/I/J ).
left( A/B/C/D/E/0/H/I/J , A/B/C/D/0/E/H/I/J ).
left( A/B/C/D/E/F/H/I/0 , A/B/C/D/E/F/H/0/I ).
up( A/B/C/0/E/F/H/I/J , 0/B/C/A/E/F/H/I/J ).
up( A/B/C/D/0/F/H/I/J , A/0/C/D/B/F/H/I/J ).
up( A/B/C/D/E/0/H/I/J , A/B/0/D/E/C/H/I/J ).
up( A/B/C/D/E/F/0/I/J , A/B/C/0/E/F/D/I/J ).
up( A/B/C/D/E/F/H/0/J , A/B/C/D/0/F/H/E/J ).
up( A/B/C/D/E/F/H/I/0 , A/B/C/D/E/0/H/I/F ).
right( A/0/C/D/E/F/H/I/J , A/C/0/D/E/F/H/I/J ).
right( A/B/C/D/0/F/H/I/J , A/B/C/D/F/0/H/I/J ).
right( A/B/C/D/E/F/H/0/J , A/B/C/D/E/F/H/J/0 ).
right( 0/B/C/D/E/F/H/I/J , B/0/C/D/E/F/H/I/J ).
right( A/B/C/0/E/F/H/I/J , A/B/C/E/0/F/H/I/J ).
right( A/B/C/D/E/F/0/I/J , A/B/C/D/E/F/I/0/J ).
down( A/B/C/0/E/F/H/I/J , A/B/C/H/E/F/0/I/J ).
down( A/B/C/D/0/F/H/I/J , A/B/C/D/I/F/H/0/J ).
down( A/B/C/D/E/0/H/I/J , A/B/C/D/E/J/H/I/0 ).
down( 0/B/C/D/E/F/H/I/J , D/B/C/0/E/F/H/I/J ).
down( A/0/C/D/E/F/H/I/J , A/E/C/D/0/F/H/I/J ).
down( A/B/0/D/E/F/H/I/J , A/B/F/D/E/0/H/I/J ).
%%% the heuristic function
h_function(Puzz,H) :- p_fcn(Puzz,P),
s_fcn(Puzz,S),
H is P + 3*S.
%%% the move
move(P,C,left) :- left(P,C).
move(P,C,up) :- up(P,C).
move(P,C,right) :- right(P,C).
move(P,C,down) :- down(P,C).
%%% the Manhattan distance function
p_fcn(A/B/C/D/E/F/G/H/I, P) :-
a(A,Pa), b(B,Pb), c(C,Pc),
d(D,Pd), e(E,Pe), f(F,Pf),
g(G,Pg), h(H,Ph), i(I,Pi),
P is Pa+Pb+Pc+Pd+Pe+Pf+Pg+Ph+Pg+Pi.
a(0,0). a(1,0). a(2,1). a(3,2). a(4,3). a(5,4). a(6,3). a(7,2). a(8,1).
b(0,0). b(1,1). b(2,0). b(3,1). b(4,2). b(5,3). b(6,2). b(7,3). b(8,2).
c(0,0). c(1,2). c(2,1). c(3,0). c(4,1). c(5,2). c(6,3). c(7,4). c(8,3).
d(0,0). d(1,1). d(2,2). d(3,3). d(4,2). d(5,3). d(6,2). d(7,2). d(8,0).
e(0,0). e(1,2). e(2,1). e(3,2). e(4,1). e(5,2). e(6,1). e(7,2). e(8,1).
f(0,0). f(1,3). f(2,2). f(3,1). f(4,0). f(5,1). f(6,2). f(7,3). f(8,2).
g(0,0). g(1,2). g(2,3). g(3,4). g(4,3). g(5,2). g(6,2). g(7,0). g(8,1).
h(0,0). h(1,3). h(2,3). h(3,3). h(4,2). h(5,1). h(6,0). h(7,1). h(8,2).
i(0,0). i(1,4). i(2,3). i(3,2). i(4,1). i(5,0). i(6,1). i(7,2). i(8,3).
%%% the out-of-cycle function
s_fcn(A/B/C/D/E/F/G/H/I, S) :-
s_aux(A,B,S1), s_aux(B,C,S2), s_aux(C,F,S3),
s_aux(F,I,S4), s_aux(I,H,S5), s_aux(H,G,S6),
s_aux(G,D,S7), s_aux(D,A,S8), s_aux(E,S9),
S is S1+S2+S3+S4+S5+S6+S7+S8+S9.
s_aux(0,0) :- !.
s_aux(_,1).
s_aux(X,Y,0) :- Y is X+1, !.
s_aux(8,1,0) :- !.
s_aux(_,_,2).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%
%%% 8-puzzle animation -- using VT100 character graphics
%%%
%%%
%%%
puzzle(P) :- solve(P,S),
animate(P,S),
message.
animate(P,S) :- initialize(P),
cursor(1,2), write(S),
cursor(1,22), write('Hit ENTER to step solver.'),
get0(_X),
play_back(S).
:- dynamic location/3.
initialize(A/B/C/D/E/F/H/I/J) :-
cls,
retractall(location(_,_,_)),
assert(location(A,20,5)),
assert(location(B,30,5)),
assert(location(C,40,5)),
assert(location(F,40,10)),
assert(location(J,40,15)),
assert(location(I,30,15)),
assert(location(H,20,15)),
assert(location(D,20,10)),
assert(location(E,30,10)), draw_all.
draw_all :- draw(1), draw(2), draw(3), draw(4),
draw(5), draw(6), draw(7), draw(8).
%%% play_back([left,right,up,...]).
play_back([M|R]) :- call(M), get0(_X), play_back(R).
play_back([]) :- cursor(1,24). %%% Put cursor out of the way
message :- nl,nl,
write(' ********************************************'), nl,
write(' * Enter 8-puzzle goals in the form ... *'), nl,
write(' * ?- puzzle(0/8/1/2/4/3/7/6/5). *'), nl,
write(' * Enter goal ''message'' to reread this. *'), nl,
write(' ********************************************'), nl, nl.
cursor(X,Y) :- put(27), put(91), %%% ESC [
write(Y),
put(59), %%% ;
write(X),
put(72). %%% M
%%% clear the screen, quickly
cls :- put(27), put("["), put("2"), put("J").
%%% video attributes -- bold and blink not working
plain :- put(27), put("["), put("0"), put("m").
reverse_video :- put(27), put("["), put("7"), put("m").
%%% Tile objects, character map(s)
%%% Each tile should be drawn using the character map,
%%% drawn at 'location', which is asserted and retracted
%%% by 'playback'.
character_map(N, [ [' ',' ',' ',' ',' ',' ',' '],
[' ',' ',' ', N ,' ',' ',' '],
[' ',' ',' ',' ',' ',' ',' '] ]).
%%% move empty tile (spot) to the left
left :- retract(location(0,X0,Y0)),
Xnew is X0 - 10,
location(Tile,Xnew,Y0),
assert(location(0,Xnew,Y0)),
right(Tile),right(Tile),right(Tile),
right(Tile),right(Tile),
right(Tile),right(Tile),right(Tile),
right(Tile),right(Tile).
up :- retract(location(0,X0,Y0)),
Ynew is Y0 - 5,
location(Tile,X0,Ynew),
assert(location(0,X0,Ynew)),
down(Tile),down(Tile),down(Tile),down(Tile),down(Tile).
right :- retract(location(0,X0,Y0)),
Xnew is X0 + 10,
location(Tile,Xnew,Y0),
assert(location(0,Xnew,Y0)),
left(Tile),left(Tile),left(Tile),left(Tile),left(Tile),
left(Tile),left(Tile),left(Tile),left(Tile),left(Tile).
down :- retract(location(0,X0,Y0)),
Ynew is Y0 + 5,
location(Tile,X0,Ynew),
assert(location(0,X0,Ynew)),
up(Tile),up(Tile),up(Tile),up(Tile),up(Tile).
draw(Obj) :- reverse_video, character_map(Obj,M),
location(Obj,X,Y),
draw(X,Y,M), plain.
%%% hide tile
hide(Obj) :- character_map(Obj,M),
location(Obj,X,Y),
hide(X,Y,M).
hide(_,_,[]).
hide(X,Y,[R|G]) :- hide_row(X,Y,R),
Y1 is Y + 1,
hide(X,Y1,G).
hide_row(_,_,[]).
hide_row(X,Y,[_|R]) :- cursor(X,Y),
write(' '),
X1 is X + 1,
hide_row(X1,Y,R).
%%% draw tile
draw(_,_,[]).
draw(X,Y,[R|G]) :- draw_row(X,Y,R),
Y1 is Y + 1,
draw(X,Y1,G).
draw_row(_,_,[]).
draw_row(X,Y,[P|R]) :- cursor(X,Y),
write(P),
X1 is X + 1,
draw_row(X1,Y,R).
%%% Move an Object up
up(Obj) :- hide(Obj),
retract(location(Obj,X,Y)),
Y1 is Y - 1,
assert(location(Obj,X,Y1)),
draw(Obj).
down(Obj) :- hide(Obj),
retract(location(Obj,X,Y)),
Y1 is Y + 1,
assert(location(Obj,X,Y1)),
draw(Obj).
left(Obj) :- hide(Obj),
retract(location(Obj,X,Y)),
X1 is X - 1,
assert(location(Obj,X1,Y)),
draw(Obj).
right(Obj) :- hide(Obj),
retract(location(Obj,X,Y)),
X1 is X + 1,
assert(location(Obj,X1,Y)),
draw(Obj).
:- message.

View File

@@ -1,13 +0,0 @@
partition([], _, [], []).
partition([X|Xs], Pivot, Smalls, Bigs) :-
( X @< Pivot ->
Smalls = [X|Rest],
partition(Xs, Pivot, Rest, Bigs)
; Bigs = [X|Rest],
partition(Xs, Pivot, Smalls, Rest)
).
quicksort([]) --> [].
quicksort([X|Xs]) -->
{ partition(Xs, X, Smaller, Bigger) },
quicksort(Smaller), [X], quicksort(Bigger).

View File

@@ -1,12 +0,0 @@
/* Prolog test file */
male(john).
male(peter).
female(vick).
female(christie).
parents(john, peter, christie).
parents(vick, peter, christie).
/* X is a brother of Y */
brother(X, Y) :- male(X), parents(X, F, M), parents(Y, F, M).

View File

@@ -1,21 +0,0 @@
turing(Tape0, Tape) :-
perform(q0, [], Ls, Tape0, Rs),
reverse(Ls, Ls1),
append(Ls1, Rs, Tape).
perform(qf, Ls, Ls, Rs, Rs) :- !.
perform(Q0, Ls0, Ls, Rs0, Rs) :-
symbol(Rs0, Sym, RsRest),
once(rule(Q0, Sym, Q1, NewSym, Action)),
action(Action, Ls0, Ls1, [NewSym|RsRest], Rs1),
perform(Q1, Ls1, Ls, Rs1, Rs).
symbol([], b, []).
symbol([Sym|Rs], Sym, Rs).
action(left, Ls0, Ls, Rs0, Rs) :- left(Ls0, Ls, Rs0, Rs).
action(stay, Ls, Ls, Rs, Rs).
action(right, Ls0, [Sym|Ls0], [Sym|Rs], Rs).
left([], [], Rs0, [b|Rs0]).
left([L|Ls], Ls, Rs, [L|Rs]).

View File

@@ -0,0 +1,10 @@
# An example RMarkdown
Some text.
## A graphic in R
```{r}
plot(1:10)
hist(rnorm(10000))
```

View File

@@ -0,0 +1,254 @@
(* From Twelf *)
(* Red/Black Trees *)
(* Author: Frank Pfenning *)
functor RedBlackTree
(type key'
val compare : key' * key' -> order)
:> TABLE where type key = key' =
struct
type key = key'
type 'a entry = key * 'a
datatype 'a dict =
Empty (* considered black *)
| Red of 'a entry * 'a dict * 'a dict
| Black of 'a entry * 'a dict * 'a dict
type 'a Table = 'a dict ref
(* Representation Invariants *)
(*
1. The tree is ordered: for every node Red((key1,datum1), left, right) or
Black ((key1,datum1), left, right), every key in left is less than
key1 and every key in right is greater than key1.
2. The children of a red node are black (color invariant).
3. Every path from the root to a leaf has the same number of
black nodes, called the black height of the tree.
*)
local
fun lookup dict key =
let
fun lk (Empty) = NONE
| lk (Red tree) = lk' tree
| lk (Black tree) = lk' tree
and lk' ((key1, datum1), left, right) =
(case compare(key,key1)
of EQUAL => SOME(datum1)
| LESS => lk left
| GREATER => lk right)
in
lk dict
end
(* val restore_right : 'a dict -> 'a dict *)
(*
restore_right (Black(e,l,r)) >=> dict
where (1) Black(e,l,r) is ordered,
(2) Black(e,l,r) has black height n,
(3) color invariant may be violated at the root of r:
one of its children might be red.
and dict is a re-balanced red/black tree (satisfying all invariants)
and same black height n.
*)
fun restore_right (Black(e, Red lt, Red (rt as (_,Red _,_)))) =
Red(e, Black lt, Black rt) (* re-color *)
| restore_right (Black(e, Red lt, Red (rt as (_,_,Red _)))) =
Red(e, Black lt, Black rt) (* re-color *)
| restore_right (Black(e, l, Red(re, Red(rle, rll, rlr), rr))) =
(* l is black, deep rotate *)
Black(rle, Red(e, l, rll), Red(re, rlr, rr))
| restore_right (Black(e, l, Red(re, rl, rr as Red _))) =
(* l is black, shallow rotate *)
Black(re, Red(e, l, rl), rr)
| restore_right dict = dict
(* restore_left is like restore_right, except *)
(* the color invariant may be violated only at the root of left child *)
fun restore_left (Black(e, Red (lt as (_,Red _,_)), Red rt)) =
Red(e, Black lt, Black rt) (* re-color *)
| restore_left (Black(e, Red (lt as (_,_,Red _)), Red rt)) =
Red(e, Black lt, Black rt) (* re-color *)
| restore_left (Black(e, Red(le, ll as Red _, lr), r)) =
(* r is black, shallow rotate *)
Black(le, ll, Red(e, lr, r))
| restore_left (Black(e, Red(le, ll, Red(lre, lrl, lrr)), r)) =
(* r is black, deep rotate *)
Black(lre, Red(le, ll, lrl), Red(e, lrr, r))
| restore_left dict = dict
fun insert (dict, entry as (key,datum)) =
let
(* val ins : 'a dict -> 'a dict inserts entry *)
(* ins (Red _) may violate color invariant at root *)
(* ins (Black _) or ins (Empty) will be red/black tree *)
(* ins preserves black height *)
fun ins (Empty) = Red(entry, Empty, Empty)
| ins (Red(entry1 as (key1, datum1), left, right)) =
(case compare(key,key1)
of EQUAL => Red(entry, left, right)
| LESS => Red(entry1, ins left, right)
| GREATER => Red(entry1, left, ins right))
| ins (Black(entry1 as (key1, datum1), left, right)) =
(case compare(key,key1)
of EQUAL => Black(entry, left, right)
| LESS => restore_left (Black(entry1, ins left, right))
| GREATER => restore_right (Black(entry1, left, ins right)))
in
case ins dict
of Red (t as (_, Red _, _)) => Black t (* re-color *)
| Red (t as (_, _, Red _)) => Black t (* re-color *)
| dict => dict
end
(* function below from .../smlnj-lib/Util/int-redblack-set.sml *)
(* Need to check and improve some time *)
(* Sun Mar 13 08:22:53 2005 -fp *)
(* Remove an item. Returns true if old item found, false otherwise *)
local
exception NotFound
datatype 'a zipper
= TOP
| LEFTB of ('a entry * 'a dict * 'a zipper)
| LEFTR of ('a entry * 'a dict * 'a zipper)
| RIGHTB of ('a dict * 'a entry * 'a zipper)
| RIGHTR of ('a dict * 'a entry * 'a zipper)
in
fun delete t key =
let
fun zip (TOP, t) = t
| zip (LEFTB(x, b, z), a) = zip(z, Black(x, a, b))
| zip (LEFTR(x, b, z), a) = zip(z, Red(x, a, b))
| zip (RIGHTB(a, x, z), b) = zip(z, Black(x, a, b))
| zip (RIGHTR(a, x, z), b) = zip(z, Red(x, a, b))
(* bbZip propagates a black deficit up the tree until either the top
* is reached, or the deficit can be covered. It returns a boolean
* that is true if there is still a deficit and the zipped tree.
*)
fun bbZip (TOP, t) = (true, t)
| bbZip (LEFTB(x, Red(y, c, d), z), a) = (* case 1L *)
bbZip (LEFTR(x, c, LEFTB(y, d, z)), a)
| bbZip (LEFTB(x, Black(w, Red(y, c, d), e), z), a) = (* case 3L *)
bbZip (LEFTB(x, Black(y, c, Red(w, d, e)), z), a)
| bbZip (LEFTR(x, Black(w, Red(y, c, d), e), z), a) = (* case 3L *)
bbZip (LEFTR(x, Black(y, c, Red(w, d, e)), z), a)
| bbZip (LEFTB(x, Black(y, c, Red(w, d, e)), z), a) = (* case 4L *)
(false, zip (z, Black(y, Black(x, a, c), Black(w, d, e))))
| bbZip (LEFTR(x, Black(y, c, Red(w, d, e)), z), a) = (* case 4L *)
(false, zip (z, Red(y, Black(x, a, c), Black(w, d, e))))
| bbZip (LEFTR(x, Black(y, c, d), z), a) = (* case 2L *)
(false, zip (z, Black(x, a, Red(y, c, d))))
| bbZip (LEFTB(x, Black(y, c, d), z), a) = (* case 2L *)
bbZip (z, Black(x, a, Red(y, c, d)))
| bbZip (RIGHTB(Red(y, c, d), x, z), b) = (* case 1R *)
bbZip (RIGHTR(d, x, RIGHTB(c, y, z)), b)
| bbZip (RIGHTR(Red(y, c, d), x, z), b) = (* case 1R *)
bbZip (RIGHTR(d, x, RIGHTB(c, y, z)), b)
| bbZip (RIGHTB(Black(y, Red(w, c, d), e), x, z), b) = (* case 3R *)
bbZip (RIGHTB(Black(w, c, Red(y, d, e)), x, z), b)
| bbZip (RIGHTR(Black(y, Red(w, c, d), e), x, z), b) = (* case 3R *)
bbZip (RIGHTR(Black(w, c, Red(y, d, e)), x, z), b)
| bbZip (RIGHTB(Black(y, c, Red(w, d, e)), x, z), b) = (* case 4R *)
(false, zip (z, Black(y, c, Black(x, Red(w, d, e), b))))
| bbZip (RIGHTR(Black(y, c, Red(w, d, e)), x, z), b) = (* case 4R *)
(false, zip (z, Red(y, c, Black(w, Red(w, d, e), b))))
| bbZip (RIGHTR(Black(y, c, d), x, z), b) = (* case 2R *)
(false, zip (z, Black(x, Red(y, c, d), b)))
| bbZip (RIGHTB(Black(y, c, d), x, z), b) = (* case 2R *)
bbZip (z, Black(x, Red(y, c, d), b))
| bbZip (z, t) = (false, zip(z, t))
fun delMin (Red(y, Empty, b), z) = (y, (false, zip(z, b)))
| delMin (Black(y, Empty, b), z) = (y, bbZip(z, b))
| delMin (Black(y, a, b), z) = delMin(a, LEFTB(y, b, z))
| delMin (Red(y, a, b), z) = delMin(a, LEFTR(y, b, z))
| delMin (Empty, _) = raise Match
fun joinRed (Empty, Empty, z) = zip(z, Empty)
| joinRed (a, b, z) = let
val (x, (needB, b')) = delMin(b, TOP)
in
if needB
then #2(bbZip(z, Red(x, a, b')))
else zip(z, Red(x, a, b'))
end
fun joinBlack (a, Empty, z) = #2(bbZip(z, a))
| joinBlack (Empty, b, z) = #2(bbZip(z, b))
| joinBlack (a, b, z) = let
val (x, (needB, b')) = delMin(b, TOP)
in
if needB
then #2(bbZip(z, Black(x, a, b')))
else zip(z, Black(x, a, b'))
end
fun del (Empty, z) = raise NotFound
| del (Black(entry1 as (key1, datum1), a, b), z) =
(case compare(key,key1)
of EQUAL => joinBlack (a, b, z)
| LESS => del (a, LEFTB(entry1, b, z))
| GREATER => del (b, RIGHTB(a, entry1, z)))
| del (Red(entry1 as (key1, datum1), a, b), z) =
(case compare(key,key1)
of EQUAL => joinRed (a, b, z)
| LESS => del (a, LEFTR(entry1, b, z))
| GREATER => del (b, RIGHTR(a, entry1, z)))
in
(del(t, TOP); true) handle NotFound => false
end
end (* local *)
(* use non-imperative version? *)
fun insertShadow (dict, entry as (key,datum)) =
let val oldEntry = ref NONE (* : 'a entry option ref *)
fun ins (Empty) = Red(entry, Empty, Empty)
| ins (Red(entry1 as (key1, datum1), left, right)) =
(case compare(key,key1)
of EQUAL => (oldEntry := SOME(entry1);
Red(entry, left, right))
| LESS => Red(entry1, ins left, right)
| GREATER => Red(entry1, left, ins right))
| ins (Black(entry1 as (key1, datum1), left, right)) =
(case compare(key,key1)
of EQUAL => (oldEntry := SOME(entry1);
Black(entry, left, right))
| LESS => restore_left (Black(entry1, ins left, right))
| GREATER => restore_right (Black(entry1, left, ins right)))
in
(oldEntry := NONE;
((case ins dict
of Red (t as (_, Red _, _)) => Black t (* re-color *)
| Red (t as (_, _, Red _)) => Black t (* re-color *)
| dict => dict),
!oldEntry))
end
fun app f dict =
let fun ap (Empty) = ()
| ap (Red tree) = ap' tree
| ap (Black tree) = ap' tree
and ap' (entry1, left, right) =
(ap left; f entry1; ap right)
in
ap dict
end
in
fun new (n) = ref (Empty) (* ignore size hint *)
val insert = (fn table => fn entry => (table := insert (!table, entry)))
val insertShadow =
(fn table => fn entry =>
let
val (dict, oldEntry) = insertShadow (!table, entry)
in
(table := dict; oldEntry)
end)
val lookup = (fn table => fn key => lookup (!table) key)
val delete = (fn table => fn key => (delete (!table) key; ()))
val clear = (fn table => (table := Empty))
val app = (fn f => fn table => app f (!table))
end
end; (* functor RedBlackTree *)

1470
samples/Standard ML/main.fun Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -185,6 +185,9 @@ class TestBlob < Test::Unit::TestCase
# PEG.js-generated parsers
assert blob("JavaScript/parser.js").generated?
# Generated PostScript
assert !blob("PostScript/sierpinski.ps").generated?
# These examples are too basic to tell
assert !blob("JavaScript/empty.js").generated?
assert !blob("JavaScript/hello.js").generated?
@@ -221,6 +224,11 @@ class TestBlob < Test::Unit::TestCase
# Node dependencies
assert blob("node_modules/coffee-script/lib/coffee-script.js").vendored?
# Bower Components
assert blob("bower_components/custom/custom.js").vendored?
assert blob("app/bower_components/custom/custom.js").vendored?
assert blob("vendor/assets/bower_components/custom/custom.js").vendored?
# Rails vendor/
assert blob("vendor/plugins/will_paginate/lib/will_paginate.rb").vendored?
@@ -270,7 +278,6 @@ class TestBlob < Test::Unit::TestCase
assert blob("ui/minified/jquery.effects.blind.min.js").vendored?
assert blob("ui/minified/jquery.ui.accordion.min.js").vendored?
# MooTools
assert blob("public/javascripts/mootools-core-1.3.2-full-compat.js").vendored?
assert blob("public/javascripts/mootools-core-1.3.2-full-compat-yc.js").vendored?
@@ -292,6 +299,10 @@ class TestBlob < Test::Unit::TestCase
assert blob("public/javascripts/tiny_mce_popup.js").vendored?
assert blob("public/javascripts/tiny_mce_src.js").vendored?
# AngularJS
assert blob("public/javascripts/angular.js").vendored?
assert blob("public/javascripts/angular.min.js").vendored?
# Fabric
assert blob("fabfile.py").vendored?
@@ -323,7 +334,7 @@ class TestBlob < Test::Unit::TestCase
# Test fixtures
assert blob("test/fixtures/random.rkt").vendored?
assert blob("Test/fixtures/random.rkt").vendored?
# Cordova/PhoneGap
assert blob("cordova.js").vendored?
assert blob("cordova.min.js").vendored?

41
test/test_heuristics.rb Normal file
View File

@@ -0,0 +1,41 @@
require 'linguist/heuristics'
require 'linguist/language'
require 'linguist/samples'
require 'test/unit'
class TestHeuristcs < Test::Unit::TestCase
include Linguist
def samples_path
File.expand_path("../../samples", __FILE__)
end
def fixture(name)
File.read(File.join(samples_path, name))
end
# Only calling out '.h' filenames as these are the ones causing issues
def all_h_fixtures(language_name)
Dir.glob("#{samples_path}/#{language_name}/*.h")
end
def test_obj_c_by_heuristics
languages = ["C++", "Objective-C"]
all_h_fixtures("Objective-C").each do |fixture|
results = Heuristics.disambiguate_c(fixture("Objective-C/#{File.basename(fixture)}"), languages)
assert_equal Language["Objective-C"], results.first
end
end
def test_cpp_by_heuristics
languages = ["C++", "Objective-C"]
results = Heuristics.disambiguate_c(fixture("C++/render_adapter.cpp"), languages)
assert_equal Language["C++"], results.first
end
def test_detect_still_works_if_nothing_matches
match = Language.detect("Hello.m", fixture("Objective-C/hello.m"))
assert_equal Language["Objective-C"], match
end
end

View File

@@ -40,6 +40,7 @@ class TestLanguage < Test::Unit::TestCase
assert_equal Lexer['REBOL'], Language['Rebol'].lexer
assert_equal Lexer['RHTML'], Language['HTML+ERB'].lexer
assert_equal Lexer['RHTML'], Language['RHTML'].lexer
assert_equal Lexer['Ruby'], Language['Crystal'].lexer
assert_equal Lexer['Ruby'], Language['Mirah'].lexer
assert_equal Lexer['Ruby'], Language['Ruby'].lexer
assert_equal Lexer['S'], Language['R'].lexer
@@ -191,12 +192,18 @@ class TestLanguage < Test::Unit::TestCase
def test_markup
assert_equal :markup, Language['HTML'].type
assert_equal :markup, Language['SCSS'].type
end
def test_data
assert_equal :data, Language['YAML'].type
end
def test_prose
assert_equal :prose, Language['Markdown'].type
assert_equal :prose, Language['Org'].type
end
def test_other
assert_nil Language['Brainfuck'].type
assert_nil Language['Makefile'].type
@@ -369,7 +376,7 @@ class TestLanguage < Test::Unit::TestCase
end
def test_by_type
assert_equal 9, Language.by_type(:prose).length
assert !Language.by_type(:prose).nil?
end
def test_colorize

View File

@@ -25,6 +25,12 @@ class TestRepository < Test::Unit::TestCase
assert linguist_repo.size > 30_000
end
def test_linguist_breakdown
assert linguist_repo.breakdown_by_file.has_key?("Ruby")
assert linguist_repo.breakdown_by_file["Ruby"].include?("bin/linguist")
assert linguist_repo.breakdown_by_file["Ruby"].include?("lib/linguist/language.rb")
end
def test_binary_override
assert_equal repo(File.expand_path("../../samples/Nimrod", __FILE__)).language, Language["Nimrod"]
end