Merge github.com:github/linguist

Conflicts:
	lib/linguist/vendor.yml
This commit is contained in:
Chris Kuehl
2013-11-04 20:32:52 -08:00
53 changed files with 13498 additions and 470 deletions

View File

@@ -1,4 +1,4 @@
Copyright (c) 2011 GitHub, Inc. Copyright (c) 2011-2013 GitHub, Inc.
Permission is hereby granted, free of charge, to any person Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation obtaining a copy of this software and associated documentation

View File

@@ -84,7 +84,7 @@ To run the tests:
The majority of patches won't need to touch any Ruby code at all. The [master language list](https://github.com/github/linguist/blob/master/lib/linguist/languages.yml) is just a configuration file. The majority of patches won't need to touch any Ruby code at all. The [master language list](https://github.com/github/linguist/blob/master/lib/linguist/languages.yml) is just a configuration file.
We try to only add languages once they have a some usage on GitHub, so please note in-the-wild usage examples in your pull request. We try to only add languages once they have some usage on GitHub, so please note in-the-wild usage examples in your pull request.
Almost all bug fixes or new language additions should come with some additional code samples. Just drop them under [`samples/`](https://github.com/github/linguist/tree/master/samples) in the correct subdirectory and our test suite will automatically test them. In most cases you shouldn't need to add any new assertions. Almost all bug fixes or new language additions should come with some additional code samples. Just drop them under [`samples/`](https://github.com/github/linguist/tree/master/samples) in the correct subdirectory and our test suite will automatically test them. In most cases you shouldn't need to add any new assertions.

View File

@@ -1,5 +1,9 @@
#!/usr/bin/env ruby #!/usr/bin/env ruby
# linguist — detect language type for a file, or, given a directory, determine language breakdown
#
# usage: linguist <path>
require 'linguist/file_blob' require 'linguist/file_blob'
require 'linguist/repository' require 'linguist/repository'

View File

@@ -1,6 +1,6 @@
Gem::Specification.new do |s| Gem::Specification.new do |s|
s.name = 'github-linguist' s.name = 'github-linguist'
s.version = '2.6.9' s.version = '2.9.7'
s.summary = "GitHub Language detection" s.summary = "GitHub Language detection"
s.authors = "GitHub" s.authors = "GitHub"
@@ -12,7 +12,7 @@ Gem::Specification.new do |s|
s.add_dependency 'charlock_holmes', '~> 0.6.6' s.add_dependency 'charlock_holmes', '~> 0.6.6'
s.add_dependency 'escape_utils', '~> 0.3.1' s.add_dependency 'escape_utils', '~> 0.3.1'
s.add_dependency 'mime-types', '~> 1.19' s.add_dependency 'mime-types', '~> 1.19'
s.add_dependency 'pygments.rb', '~> 0.4.2' s.add_dependency 'pygments.rb', '~> 0.5.2'
s.add_development_dependency 'mocha' s.add_development_dependency 'mocha'
s.add_development_dependency 'json' s.add_development_dependency 'json'
s.add_development_dependency 'rake' s.add_development_dependency 'rake'

View File

@@ -70,7 +70,7 @@ module Linguist
# #
# Return true or false # Return true or false
def likely_binary? def likely_binary?
binary_mime_type? and not Language.find_by_filename(name) binary_mime_type? && !Language.find_by_filename(name)
end end
# Public: Get the Content-Type header value # Public: Get the Content-Type header value
@@ -189,11 +189,10 @@ module Linguist
# Public: Is the blob safe to colorize? # Public: Is the blob safe to colorize?
# #
# We use Pygments.rb for syntax highlighting blobs, which # We use Pygments for syntax highlighting blobs. Pygments
# has some quirks and also is essentially 'un-killable' via # can be too slow for very large blobs or for certain
# normal timeout. To workaround this we try to # corner-case blobs.
# carefully handling Pygments.rb anything it can't handle. #
#
# Return true or false # Return true or false
def safe_to_colorize? def safe_to_colorize?
!large? && text? && !high_ratio_of_long_lines? !large? && text? && !high_ratio_of_long_lines?
@@ -278,36 +277,6 @@ module Linguist
@_generated ||= Generated.generated?(name, lambda { data }) @_generated ||= Generated.generated?(name, lambda { data })
end end
# Public: Should the blob be indexed for searching?
#
# Excluded:
# - Files over 0.1MB
# - Non-text files
# - Languages marked as not searchable
# - Generated source files
#
# Please add additional test coverage to
# `test/test_blob.rb#test_indexable` if you make any changes.
#
# Return true or false
def indexable?
if size > 100 * 1024
false
elsif binary?
false
elsif extname == '.txt'
true
elsif language.nil?
false
elsif !language.searchable?
false
elsif generated?
false
else
true
end
end
# Public: Detects the Language of the blob. # Public: Detects the Language of the blob.
# #
# May load Blob#data # May load Blob#data
@@ -343,19 +312,5 @@ module Linguist
options[:options][:encoding] ||= encoding options[:options][:encoding] ||= encoding
lexer.highlight(data, options) lexer.highlight(data, options)
end end
# Public: Highlight syntax of blob without the outer highlight div
# wrapper.
#
# options - A Hash of options (defaults to {})
#
# Returns html String
def colorize_without_wrapper(options = {})
if text = colorize(options)
text[%r{<div class="highlight"><pre>(.*?)</pre>\s*</div>}m, 1]
else
''
end
end
end end
end end

View File

@@ -130,38 +130,42 @@ module Linguist
Math.log(@languages[language].to_f / @languages_total.to_f) Math.log(@languages[language].to_f / @languages_total.to_f)
end end
private private
def verbosity def verbosity
@verbosity ||= (ENV['LINGUIST_DEBUG']||0).to_i @verbosity ||= (ENV['LINGUIST_DEBUG'] || 0).to_i
end end
# Internal: show a table of probabilities for each <token,language> pair. # Internal: show a table of probabilities for each <token,language> pair.
# #
# The number in each table entry is the number of "points" that each # The number in each table entry is the number of "points" that each
# token contributes toward the belief that the file under test is a # token contributes toward the belief that the file under test is a
# particular language. Points are additive. # particular language. Points are additive.
# #
# Points are the number of times a token appears in the file, times # Points are the number of times a token appears in the file, times
# how much more likely (log of probability ratio) that token is to # how much more likely (log of probability ratio) that token is to
# appear in one language vs. the least-likely language. Dashes # appear in one language vs. the least-likely language. Dashes
# indicate the least-likely language (and zero points) for each token. # indicate the least-likely language (and zero points) for each token.
def dump_all_tokens(tokens, languages) def dump_all_tokens(tokens, languages)
maxlen = tokens.map{|tok| tok.size}.max maxlen = tokens.map { |tok| tok.size }.max
printf "%#{maxlen}s", ""
puts " #" + languages.map{|lang| sprintf("%10s", lang)}.join printf "%#{maxlen}s", ""
tokmap = Hash.new(0) puts " #" + languages.map { |lang| sprintf("%10s", lang) }.join
tokens.each{|tok| tokmap[tok] += 1}
tokmap.sort.each{|tok, count| tokmap = Hash.new(0)
arr = languages.map{|lang| [lang, token_probability(tok, lang)] } tokens.each { |tok| tokmap[tok] += 1 }
min = arr.map{|a,b| b}.min
minlog = Math.log(min) tokmap.sort.each { |tok, count|
if !arr.inject(true) {|result, n| result && n[1] == arr[0][1]} # if not all the same arr = languages.map { |lang| [lang, token_probability(tok, lang)] }
printf "%#{maxlen}s%5d", tok, count min = arr.map { |a,b| b }.min
puts arr.map{|ent| minlog = Math.log(min)
ent[1] == min ? " -" : sprintf("%10.3f", count*(Math.log(ent[1])-minlog)) if !arr.inject(true) { |result, n| result && n[1] == arr[0][1] }
}.join printf "%#{maxlen}s%5d", tok, count
end
} puts arr.map { |ent|
end ent[1] == min ? " -" : sprintf("%10.3f", count * (Math.log(ent[1]) - minlog))
}.join
end
}
end
end end
end end

View File

@@ -52,12 +52,14 @@ module Linguist
# Return true or false # Return true or false
def generated? def generated?
name == 'Gemfile.lock' || name == 'Gemfile.lock' ||
minified_javascript? || minified_files? ||
compiled_coffeescript? || compiled_coffeescript? ||
xcode_project_file? || xcode_project_file? ||
generated_net_docfile? ||
generated_parser? || generated_parser? ||
generated_protocol_buffer? generated_net_docfile? ||
generated_net_designer_file? ||
generated_protocol_buffer? ||
generated_jni_header?
end end
# Internal: Is the blob an XCode project file? # Internal: Is the blob an XCode project file?
@@ -70,16 +72,16 @@ module Linguist
['.xib', '.nib', '.storyboard', '.pbxproj', '.xcworkspacedata', '.xcuserstate'].include?(extname) ['.xib', '.nib', '.storyboard', '.pbxproj', '.xcworkspacedata', '.xcuserstate'].include?(extname)
end end
# Internal: Is the blob minified JS? # Internal: Is the blob minified files?
# #
# Consider JS minified if the average line length is # Consider a file minified if it contains more than 5% spaces.
# greater then 100c. # Currently, only JS and CSS files are detected by this method.
# #
# Returns true or false. # Returns true or false.
def minified_javascript? def minified_files?
return unless extname == '.js' return unless ['.js', '.css'].include? extname
if lines.any? if data && data.length > 200
(lines.inject(0) { |n, l| n += l.length } / lines.length) > 100 (data.each_char.count{ |c| c <= ' ' } / data.length.to_f) < 0.05
else else
false false
end end
@@ -143,6 +145,16 @@ module Linguist
lines[-2].include?("</doc>") lines[-2].include?("</doc>")
end end
# Internal: Is this a codegen file for a .NET project?
#
# Visual Studio often uses code generation to generate partial classes, and
# these files can be quite unwieldy. Let's hide them.
#
# Returns true or false
def generated_net_designer_file?
name.downcase =~ /\.designer\.cs$/
end
# Internal: Is the blob of JS a parser generated by PEG.js? # Internal: Is the blob of JS a parser generated by PEG.js?
# #
# PEG.js-generated parsers are not meant to be consumed by humans. # PEG.js-generated parsers are not meant to be consumed by humans.
@@ -170,5 +182,16 @@ module Linguist
return lines[0].include?("Generated by the protocol buffer compiler. DO NOT EDIT!") return lines[0].include?("Generated by the protocol buffer compiler. DO NOT EDIT!")
end end
# Internal: Is the blob a C/C++ header generated by the Java JNI tool javah?
#
# Returns true of false.
def generated_jni_header?
return false unless extname == '.h'
return false unless lines.count > 2
return lines[0].include?("/* DO NOT EDIT THIS FILE - it is machine generated */")
return lines[1].include?("#include <jni.h>")
end
end end
end end

View File

@@ -15,12 +15,21 @@ module Linguist
@index = {} @index = {}
@name_index = {} @name_index = {}
@alias_index = {} @alias_index = {}
@extension_index = Hash.new { |h,k| h[k] = [] }
@filename_index = Hash.new { |h,k| h[k] = [] } @extension_index = Hash.new { |h,k| h[k] = [] }
@filename_index = Hash.new { |h,k| h[k] = [] }
@primary_extension_index = {}
# Valid Languages types # Valid Languages types
TYPES = [:data, :markup, :programming] TYPES = [:data, :markup, :programming]
# Names of non-programming languages that we will still detect
#
# Returns an array
def self.detectable_markup
["CSS", "Less", "Sass"]
end
# Internal: Create a new Language object # Internal: Create a new Language object
# #
# attributes - A hash of attributes # attributes - A hash of attributes
@@ -56,6 +65,12 @@ module Linguist
@extension_index[extension] << language @extension_index[extension] << language
end end
if @primary_extension_index.key?(language.primary_extension)
raise ArgumentError, "Duplicate primary extension: #{language.primary_extension}"
end
@primary_extension_index[language.primary_extension] = language
language.filenames.each do |filename| language.filenames.each do |filename|
@filename_index[filename] << language @filename_index[filename] << language
end end
@@ -141,7 +156,10 @@ module Linguist
# Returns all matching Languages or [] if none were found. # Returns all matching Languages or [] if none were found.
def self.find_by_filename(filename) def self.find_by_filename(filename)
basename, extname = File.basename(filename), File.extname(filename) basename, extname = File.basename(filename), File.extname(filename)
@filename_index[basename] + @extension_index[extname] langs = [@primary_extension_index[extname]] +
@filename_index[basename] +
@extension_index[extname]
langs.compact.uniq
end end
# Public: Look up Language by its name or lexer. # Public: Look up Language by its name or lexer.
@@ -445,8 +463,6 @@ module Linguist
extnames.each do |extname| extnames.each do |extname|
if !options['extensions'].include?(extname) if !options['extensions'].include?(extname)
options['extensions'] << extname options['extensions'] << extname
else
warn "#{name} #{extname.inspect} is already defined in samples/. Remove from languages.yml."
end end
end end
end end
@@ -455,8 +471,6 @@ module Linguist
fns.each do |filename| fns.each do |filename|
if !options['filenames'].include?(filename) if !options['filenames'].include?(filename)
options['filenames'] << filename options['filenames'] << filename
else
warn "#{name} #{filename.inspect} is already defined in samples/. Remove from languages.yml."
end end
end end
end end

View File

@@ -28,7 +28,13 @@ ABAP:
type: programming type: programming
lexer: ABAP lexer: ABAP
primary_extension: .abap primary_extension: .abap
ANTLR:
type: programming
color: "#9DC3FF"
lexer: ANTLR
primary_extension: .g4
ASP: ASP:
type: programming type: programming
color: "#6a40fd" color: "#6a40fd"
@@ -61,7 +67,7 @@ Ada:
primary_extension: .adb primary_extension: .adb
extensions: extensions:
- .ads - .ads
ApacheConf: ApacheConf:
type: markup type: markup
aliases: aliases:
@@ -137,6 +143,11 @@ Befunge:
BlitzMax: BlitzMax:
primary_extension: .bmx primary_extension: .bmx
Bluespec:
type: programming
lexer: verilog
primary_extension: .bsv
Boo: Boo:
type: programming type: programming
color: "#d4bec1" color: "#d4bec1"
@@ -212,8 +223,18 @@ CMake:
filenames: filenames:
- CMakeLists.txt - CMakeLists.txt
COBOL:
type: programming
primary_extension: .cob
extensions:
- .cbl
- .ccp
- .cobol
- .cpy
CSS: CSS:
ace_mode: css ace_mode: css
color: "#1f085e"
primary_extension: .css primary_extension: .css
Ceylon: Ceylon:
@@ -232,6 +253,7 @@ Clojure:
primary_extension: .clj primary_extension: .clj
extensions: extensions:
- .cljs - .cljs
- .cljx
filenames: filenames:
- riemann.config - riemann.config
@@ -270,8 +292,10 @@ Common Lisp:
primary_extension: .lisp primary_extension: .lisp
extensions: extensions:
- .asd - .asd
- .cl
- .lsp - .lsp
- .ny - .ny
- .podsl
Coq: Coq:
type: programming type: programming
@@ -308,6 +332,14 @@ D-ObjDump:
type: data type: data
lexer: d-objdump lexer: d-objdump
primary_extension: .d-objdump primary_extension: .d-objdump
DM:
type: programming
color: "#075ff1"
lexer: Text only
primary_extension: .dm
aliases:
- byond
DOT: DOT:
type: programming type: programming
@@ -328,14 +360,6 @@ Dart:
type: programming type: programming
primary_extension: .dart primary_extension: .dart
Delphi:
type: programming
color: "#b0ce4e"
primary_extension: .pas
extensions:
- .dfm
- .lpr
DCPU-16 ASM: DCPU-16 ASM:
type: programming type: programming
lexer: dasm16 lexer: dasm16
@@ -344,7 +368,7 @@ DCPU-16 ASM:
- .dasm - .dasm
aliases: aliases:
- dasm16 - dasm16
Diff: Diff:
primary_extension: .diff primary_extension: .diff
@@ -383,7 +407,6 @@ Elixir:
Elm: Elm:
type: programming type: programming
lexer: Haskell lexer: Haskell
group: Haskell
primary_extension: .elm primary_extension: .elm
Emacs Lisp: Emacs Lisp:
@@ -399,7 +422,7 @@ Emacs Lisp:
Erlang: Erlang:
type: programming type: programming
color: "#949e0e" color: "#0faf8d"
primary_extension: .erl primary_extension: .erl
extensions: extensions:
- .hrl - .hrl
@@ -408,7 +431,9 @@ F#:
type: programming type: programming
lexer: FSharp lexer: FSharp
color: "#b845fc" color: "#b845fc"
search_term: ocaml search_term: fsharp
aliases:
- fsharp
primary_extension: .fs primary_extension: .fs
extensions: extensions:
- .fsi - .fsi
@@ -473,6 +498,18 @@ GAS:
extensions: extensions:
- .S - .S
GLSL:
group: C
type: programming
primary_extension: .glsl
extensions:
- .fp
- .frag
- .geom
- .glslv
- .shader
- .vert
Genshi: Genshi:
primary_extension: .kid primary_extension: .kid
@@ -495,9 +532,15 @@ Gettext Catalog:
extensions: extensions:
- .pot - .pot
Glyph:
type: programming
color: "#e4cc98"
lexer: Tcl
primary_extension: .glf
Go: Go:
type: programming type: programming
color: "#8d04eb" color: "#a89b4d"
primary_extension: .go primary_extension: .go
Gosu: Gosu:
@@ -581,6 +624,10 @@ Handlebars:
type: markup type: markup
lexer: Text only lexer: Text only
primary_extension: .handlebars primary_extension: .handlebars
extensions:
- .hbs
- .html.handlebars
- .html.hbs
Haskell: Haskell:
type: programming type: programming
@@ -601,12 +648,15 @@ Haxe:
INI: INI:
type: data type: data
extensions: extensions:
- .cfg
- .ini - .ini
- .prefs - .prefs
- .properties - .properties
primary_extension: .ini primary_extension: .ini
Inno Setup:
primary_extension: .iss
lexer: Text only
IRC log: IRC log:
lexer: IRC logs lexer: IRC logs
search_term: irc search_term: irc
@@ -626,12 +676,30 @@ Ioke:
color: "#078193" color: "#078193"
primary_extension: .ik primary_extension: .ik
J:
type: programming
lexer: Text only
primary_extension: .ijs
JSON: JSON:
type: data type: data
group: JavaScript group: JavaScript
ace_mode: json ace_mode: json
searchable: false searchable: false
primary_extension: .json primary_extension: .json
extensions:
- .sublime-keymap
- .sublime_metrics
- .sublime-mousemap
- .sublime-project
- .sublime_session
- .sublime-settings
- .sublime-workspace
Jade:
group: HTML
type: markup
primary_extension: .jade
Java: Java:
type: programming type: programming
@@ -672,6 +740,7 @@ JavaScript:
Julia: Julia:
type: programming type: programming
primary_extension: .jl primary_extension: .jl
color: "#a270ba"
Kotlin: Kotlin:
type: programming type: programming
@@ -680,6 +749,13 @@ Kotlin:
- .ktm - .ktm
- .kts - .kts
LFE:
type: programming
primary_extension: .lfe
color: "#004200"
lexer: Common Lisp
group: Erlang
LLVM: LLVM:
primary_extension: .ll primary_extension: .ll
@@ -745,6 +821,8 @@ Logos:
Logtalk: Logtalk:
type: programming type: programming
primary_extension: .lgt primary_extension: .lgt
extensions:
- .logtalk
Lua: Lua:
type: programming type: programming
@@ -753,13 +831,16 @@ Lua:
primary_extension: .lua primary_extension: .lua
extensions: extensions:
- .nse - .nse
- .rbxs
M: M:
type: programming type: programming
lexer: Common Lisp lexer: Common Lisp
aliases: aliases:
- mumps - mumps
primary_extension: .m primary_extension: .mumps
extensions:
- .m
Makefile: Makefile:
aliases: aliases:
@@ -974,6 +1055,15 @@ Parrot Assembly:
- pasm - pasm
primary_extension: .pasm primary_extension: .pasm
Pascal:
type: programming
lexer: Delphi
color: "#b0ce4e"
primary_extension: .pas
extensions:
- .dfm
- .lpr
Perl: Perl:
type: programming type: programming
ace_mode: perl ace_mode: perl
@@ -981,6 +1071,7 @@ Perl:
primary_extension: .pl primary_extension: .pl
extensions: extensions:
- .PL - .PL
- .nqp
- .perl - .perl
- .ph - .ph
- .plx - .plx
@@ -1008,6 +1099,9 @@ PowerShell:
aliases: aliases:
- posh - posh
primary_extension: .ps1 primary_extension: .ps1
extensions:
- .psd1
- .psm1
Processing: Processing:
type: programming type: programming
@@ -1022,6 +1116,13 @@ Prolog:
extensions: extensions:
- .pro - .pro
Protocol Buffer:
type: markup
aliases:
- protobuf
- Protocol Buffers
primary_extension: .proto
Puppet: Puppet:
type: programming type: programming
color: "#cc5555" color: "#cc5555"
@@ -1044,6 +1145,7 @@ Python:
primary_extension: .py primary_extension: .py
extensions: extensions:
- .gyp - .gyp
- .pyt
- .pyw - .pyw
- .wsgi - .wsgi
- .xpy - .xpy
@@ -1062,6 +1164,19 @@ R:
color: "#198ce7" color: "#198ce7"
lexer: S lexer: S
primary_extension: .r primary_extension: .r
filenames:
- .Rprofile
REALbasic:
type: programming
lexer: VB.net
primary_extension: .rbbas
extensions:
- .rbfrm
- .rbmnu
- .rbres
- .rbtbar
- .rbuistate
RHTML: RHTML:
type: markup type: markup
@@ -1124,6 +1239,7 @@ Ruby:
- .gemspec - .gemspec
- .god - .god
- .irbrc - .irbrc
- .mspec
- .podspec - .podspec
- .rbuild - .rbuild
- .rbw - .rbw
@@ -1132,6 +1248,7 @@ Ruby:
- .thor - .thor
- .watchr - .watchr
filenames: filenames:
- Berksfile
- Gemfile - Gemfile
- Guardfile - Guardfile
- Podfile - Podfile
@@ -1172,6 +1289,11 @@ Scala:
color: "#7dd3b0" color: "#7dd3b0"
primary_extension: .scala primary_extension: .scala
Scaml:
group: HTML
type: markup
primary_extension: .scaml
Scheme: Scheme:
type: programming type: programming
color: "#1e4aec" color: "#1e4aec"
@@ -1201,7 +1323,15 @@ Shell:
- zsh - zsh
primary_extension: .sh primary_extension: .sh
extensions: extensions:
- .bats
- .tmux - .tmux
filenames:
- Dockerfile
Slash:
type: programming
color: "#007eff"
primary_extension: .sl
Smalltalk: Smalltalk:
type: programming type: programming
@@ -1211,6 +1341,11 @@ Smalltalk:
Smarty: Smarty:
primary_extension: .tpl primary_extension: .tpl
Squirrel:
type: programming
lexer: C++
primary_extension: .nut
Standard ML: Standard ML:
type: programming type: programming
color: "#dc566d" color: "#dc566d"
@@ -1237,6 +1372,8 @@ Tcl:
type: programming type: programming
color: "#e4cc98" color: "#e4cc98"
primary_extension: .tcl primary_extension: .tcl
extensions:
- .adp
Tcsh: Tcsh:
type: programming type: programming
@@ -1253,6 +1390,7 @@ TeX:
primary_extension: .tex primary_extension: .tex
extensions: extensions:
- .aux - .aux
- .bib
- .dtx - .dtx
- .ins - .ins
- .ltx - .ltx
@@ -1287,7 +1425,6 @@ Twig:
TypeScript: TypeScript:
type: programming type: programming
color: "#31859c" color: "#31859c"
lexer: Text only
aliases: aliases:
- ts - ts
primary_extension: .ts primary_extension: .ts
@@ -1298,8 +1435,8 @@ Unified Parallel C:
lexer: C lexer: C
ace_mode: c_cpp ace_mode: c_cpp
color: "#755223" color: "#755223"
primary_extension: .upc primary_extension: .upc
VHDL: VHDL:
type: programming type: programming
lexer: vhdl lexer: vhdl
@@ -1345,6 +1482,17 @@ Visual Basic:
- .vba - .vba
- .vbs - .vbs
Volt:
type: programming
lexer: D
color: "#0098db"
primary_extension: .volt
XC:
type: programming
lexer: C
primary_extension: .xc
XML: XML:
type: markup type: markup
ace_mode: xml ace_mode: xml
@@ -1356,14 +1504,18 @@ XML:
extensions: extensions:
- .axml - .axml
- .ccxml - .ccxml
- .clixml
- .dita - .dita
- .ditamap - .ditamap
- .ditaval - .ditaval
- .glade - .glade
- .grxml - .grxml
- .jelly
- .kml - .kml
- .mxml - .mxml
- .plist - .plist
- .ps1xml
- .psc1
- .pt - .pt
- .rdf - .rdf
- .rss - .rss
@@ -1373,6 +1525,7 @@ XML:
- .tmLanguage - .tmLanguage
- .tmPreferences - .tmPreferences
- .tmSnippet - .tmSnippet
- .tmTheme
- .tml - .tml
- .ui - .ui
- .vxml - .vxml
@@ -1380,9 +1533,11 @@ XML:
- .wxi - .wxi
- .wxl - .wxl
- .wxs - .wxs
- .x3d
- .xaml - .xaml
- .xlf - .xlf
- .xliff - .xliff
- .xmi
- .xsd - .xsd
- .xul - .xul
- .zcml - .zcml
@@ -1403,6 +1558,8 @@ XQuery:
primary_extension: .xquery primary_extension: .xquery
extensions: extensions:
- .xq - .xq
- .xql
- .xqm
- .xqy - .xqy
XS: XS:
@@ -1422,7 +1579,7 @@ Xtend:
primary_extension: .xtend primary_extension: .xtend
YAML: YAML:
type: markup type: data
aliases: aliases:
- yml - yml
primary_extension: .yml primary_extension: .yml

View File

@@ -73,8 +73,8 @@ module Linguist
# Skip vendored or generated blobs # Skip vendored or generated blobs
next if blob.vendored? || blob.generated? || blob.language.nil? next if blob.vendored? || blob.generated? || blob.language.nil?
# Only include programming languages # Only include programming languages and acceptable markup languages
if blob.language.type == :programming if blob.language.type == :programming || Language.detectable_markup.include?(blob.language.name)
@sizes[blob.language.group] += blob.size @sizes[blob.language.group] += blob.size
end end
end end

File diff suppressed because it is too large Load Diff

View File

@@ -24,8 +24,15 @@
# Node dependencies # Node dependencies
- node_modules/ - node_modules/
# Erlang bundles
- ^rebar$
# Bootstrap minified css and js
- (^|/)bootstrap([^.]*)(\.min)\.(js|css)$
# Vendored dependencies # Vendored dependencies
- vendor/ - thirdparty/
- vendors?/
# Debian packaging # Debian packaging
- ^debian/ - ^debian/
@@ -34,7 +41,11 @@
# jQuery # jQuery
- (^|/)jquery([^.]*)(\.min)?\.js$ - (^|/)jquery([^.]*)(\.min)?\.js$
- (^|/)jquery\-\d\.\d(\.\d)?(\.min)?\.js$ - (^|/)jquery\-\d\.\d+(\.\d+)?(\.min)?\.js$
# jQuery UI
- (^|/)jquery\-ui(\-\d\.\d+(\.\d+)?)?(\.\w+)?(\.min)?\.(js|css)$
- (^|/)jquery\.(ui|effects)\.([^.]*)(\.min)?\.(js|css)$
# Prototype # Prototype
- (^|/)prototype(.*)\.js$ - (^|/)prototype(.*)\.js$
@@ -55,10 +66,6 @@
- (^|/)yahoo-([^.]*)\.js$ - (^|/)yahoo-([^.]*)\.js$
- (^|/)yui([^.]*)\.js$ - (^|/)yui([^.]*)\.js$
# LESS css
- (^|/)less([^.]*)(\.min)?\.js$
- (^|/)less\-\d+\.\d+\.\d+(\.min)?\.js$
# WYS editors # WYS editors
- (^|/)ckeditor\.js$ - (^|/)ckeditor\.js$
- (^|/)tiny_mce([^.]*)\.js$ - (^|/)tiny_mce([^.]*)\.js$
@@ -95,7 +102,8 @@
- -vsdoc\.js$ - -vsdoc\.js$
# jQuery validation plugin (MS bundles this with asp.net mvc) # jQuery validation plugin (MS bundles this with asp.net mvc)
- (^|/)jquery([^.]*)\.validate(\.min)?\.js$ - (^|/)jquery([^.]*)\.validate(\.unobtrusive)?(\.min)?\.js$
- (^|/)jquery([^.]*)\.unobtrusive\-ajax(\.min)?\.js$
# Microsoft Ajax # Microsoft Ajax
- (^|/)[Mm]icrosoft([Mm]vc)?([Aa]jax|[Vv]alidation)(\.debug)?\.js$ - (^|/)[Mm]icrosoft([Mm]vc)?([Aa]jax|[Vv]alidation)(\.debug)?\.js$
@@ -104,14 +112,41 @@
- ^[Pp]ackages/ - ^[Pp]ackages/
# ExtJS # ExtJS
- (^|/)extjs/ - (^|/)extjs/.*?\.js$
- (^|/)extjs/.*?\.xml$
- (^|/)extjs/.*?\.txt$
- (^|/)extjs/.*?\.html$
- (^|/)extjs/.*?\.properties$
- (^|/)extjs/.sencha/
- (^|/)extjs/docs/
- (^|/)extjs/builds/
- (^|/)extjs/cmd/
- (^|/)extjs/examples/
- (^|/)extjs/locale/
- (^|/)extjs/packages/
- (^|/)extjs/plugins/
- (^|/)extjs/resources/
- (^|/)extjs/src/
- (^|/)extjs/welcome/
# Samples folders # Samples folders
- ^[Ss]amples/ - ^[Ss]amples/
# LICENSE, README, git config files
- ^COPYING$
- ^LICENSE$
- gitattributes$
- gitignore$
- gitmodules$
- ^README$
- ^readme$
# Test fixtures # Test fixtures
- ^[Tt]est/fixtures/ - ^[Tt]est/fixtures/
# PhoneGap/Cordova # PhoneGap/Cordova
- (^|/)cordova([^.]*)(\.min)?\.js$ - (^|/)cordova([^.]*)(\.min)?\.js$
- (^|/)cordova\-\d\.\d(\.\d)?(\.min)?\.js$ - (^|/)cordova\-\d\.\d(\.\d)?(\.min)?\.js$
# .DS_Store's
- .[Dd][Ss]_[Ss]tore$

167
samples/Bluespec/TL.bsv Normal file
View File

@@ -0,0 +1,167 @@
package TL;
interface TL;
method Action ped_button_push();
(* always_enabled *)
method Action set_car_state_N(Bool x);
(* always_enabled *)
method Action set_car_state_S(Bool x);
(* always_enabled *)
method Action set_car_state_E(Bool x);
(* always_enabled *)
method Action set_car_state_W(Bool x);
method Bool lampRedNS();
method Bool lampAmberNS();
method Bool lampGreenNS();
method Bool lampRedE();
method Bool lampAmberE();
method Bool lampGreenE();
method Bool lampRedW();
method Bool lampAmberW();
method Bool lampGreenW();
method Bool lampRedPed();
method Bool lampAmberPed();
method Bool lampGreenPed();
endinterface: TL
typedef enum {
AllRed,
GreenNS, AmberNS,
GreenE, AmberE,
GreenW, AmberW,
GreenPed, AmberPed} TLstates deriving (Eq, Bits);
typedef UInt#(5) Time32;
typedef UInt#(20) CtrSize;
(* synthesize *)
module sysTL(TL);
Time32 allRedDelay = 2;
Time32 amberDelay = 4;
Time32 nsGreenDelay = 20;
Time32 ewGreenDelay = 10;
Time32 pedGreenDelay = 10;
Time32 pedAmberDelay = 6;
CtrSize clocks_per_sec = 100;
Reg#(TLstates) state <- mkReg(AllRed);
Reg#(TLstates) next_green <- mkReg(GreenNS);
Reg#(Time32) secs <- mkReg(0);
Reg#(Bool) ped_button_pushed <- mkReg(False);
Reg#(Bool) car_present_N <- mkReg(True);
Reg#(Bool) car_present_S <- mkReg(True);
Reg#(Bool) car_present_E <- mkReg(True);
Reg#(Bool) car_present_W <- mkReg(True);
Bool car_present_NS = car_present_N || car_present_S;
Reg#(CtrSize) cycle_ctr <- mkReg(0);
rule dec_cycle_ctr (cycle_ctr != 0);
cycle_ctr <= cycle_ctr - 1;
endrule
Rules low_priority_rule = (rules
rule inc_sec (cycle_ctr == 0);
secs <= secs + 1;
cycle_ctr <= clocks_per_sec;
endrule endrules);
function Action next_state(TLstates ns);
action
state <= ns;
secs <= 0;
endaction
endfunction: next_state
function TLstates green_seq(TLstates x);
case (x)
GreenNS: return (GreenE);
GreenE: return (GreenW);
GreenW: return (GreenNS);
endcase
endfunction
function Bool car_present(TLstates x);
case (x)
GreenNS: return (car_present_NS);
GreenE: return (car_present_E);
GreenW: return (car_present_W);
endcase
endfunction
function Rules make_from_green_rule(TLstates green_state, Time32 delay, Bool car_is_present, TLstates ns);
return (rules
rule from_green (state == green_state && (secs >= delay || !car_is_present));
next_state(ns);
endrule endrules);
endfunction: make_from_green_rule
function Rules make_from_amber_rule(TLstates amber_state, TLstates ng);
return (rules
rule from_amber (state == amber_state && secs >= amberDelay);
next_state(AllRed);
next_green <= ng;
endrule endrules);
endfunction: make_from_amber_rule
Rules hprs[7];
hprs[1] = make_from_green_rule(GreenNS, nsGreenDelay, car_present_NS, AmberNS);
hprs[2] = make_from_amber_rule(AmberNS, GreenE);
hprs[3] = make_from_green_rule(GreenE, ewGreenDelay, car_present_E, AmberE);
hprs[4] = make_from_amber_rule(AmberE, GreenW);
hprs[5] = make_from_green_rule(GreenW, ewGreenDelay, car_present_W, AmberW);
hprs[6] = make_from_amber_rule(AmberW, GreenNS);
hprs[0] = (rules
rule fromAllRed (state == AllRed && secs >= allRedDelay);
if (ped_button_pushed) action
ped_button_pushed <= False;
next_state(GreenPed);
endaction else if (car_present(next_green))
next_state(next_green);
else if (car_present(green_seq(next_green)))
next_state(green_seq(next_green));
else if (car_present(green_seq(green_seq(next_green))))
next_state(green_seq(green_seq(next_green)));
else
noAction;
endrule: fromAllRed endrules);
Rules high_priority_rules = hprs[0];
for (Integer i = 1; i<7; i=i+1)
high_priority_rules = rJoin(hprs[i], high_priority_rules);
addRules(preempts(high_priority_rules, low_priority_rule));
method Action ped_button_push();
ped_button_pushed <= True;
endmethod: ped_button_push
method Action set_car_state_N(b) ; car_present_N <= b; endmethod
method Action set_car_state_S(b) ; car_present_S <= b; endmethod
method Action set_car_state_E(b) ; car_present_E <= b; endmethod
method Action set_car_state_W(b) ; car_present_W <= b; endmethod
method lampRedNS() = (!(state == GreenNS || state == AmberNS));
method lampAmberNS() = (state == AmberNS);
method lampGreenNS() = (state == GreenNS);
method lampRedE() = (!(state == GreenE || state == AmberE));
method lampAmberE() = (state == AmberE);
method lampGreenE() = (state == GreenE);
method lampRedW() = (!(state == GreenW || state == AmberW));
method lampAmberW() = (state == AmberW);
method lampGreenW() = (state == GreenW);
method lampRedPed() = (!(state == GreenPed || state == AmberPed));
method lampAmberPed() = (state == AmberPed);
method lampGreenPed() = (state == GreenPed);
endmodule: sysTL
endpackage: TL

109
samples/Bluespec/TbTL.bsv Normal file
View File

@@ -0,0 +1,109 @@
package TbTL;
import TL::*;
interface Lamp;
method Bool changed;
method Action show_offs;
method Action show_ons;
method Action reset;
endinterface
module mkLamp#(String name, Bool lamp)(Lamp);
Reg#(Bool) prev <- mkReg(False);
method changed = (prev != lamp);
method Action show_offs;
if (prev && !lamp)
$write (name + " off, ");
endmethod
method Action show_ons;
if (!prev && lamp)
$write (name + " on, ");
endmethod
method Action reset;
prev <= lamp;
endmethod
endmodule
(* synthesize *)
module mkTest();
let dut <- sysTL;
Reg#(Bit#(16)) ctr <- mkReg(0);
Reg#(Bool) carN <- mkReg(False);
Reg#(Bool) carS <- mkReg(False);
Reg#(Bool) carE <- mkReg(False);
Reg#(Bool) carW <- mkReg(False);
Lamp lamps[12];
lamps[0] <- mkLamp("0: NS red ", dut.lampRedNS);
lamps[1] <- mkLamp("1: NS amber", dut.lampAmberNS);
lamps[2] <- mkLamp("2: NS green", dut.lampGreenNS);
lamps[3] <- mkLamp("3: E red ", dut.lampRedE);
lamps[4] <- mkLamp("4: E amber", dut.lampAmberE);
lamps[5] <- mkLamp("5: E green", dut.lampGreenE);
lamps[6] <- mkLamp("6: W red ", dut.lampRedW);
lamps[7] <- mkLamp("7: W amber", dut.lampAmberW);
lamps[8] <- mkLamp("8: W green", dut.lampGreenW);
lamps[9] <- mkLamp("9: Ped red ", dut.lampRedPed);
lamps[10] <- mkLamp("10: Ped amber", dut.lampAmberPed);
lamps[11] <- mkLamp("11: Ped green", dut.lampGreenPed);
rule start (ctr == 0);
$dumpvars;
endrule
rule detect_cars;
dut.set_car_state_N(carN);
dut.set_car_state_S(carS);
dut.set_car_state_E(carE);
dut.set_car_state_W(carW);
endrule
rule go;
ctr <= ctr + 1;
if (ctr == 5000) carN <= True;
if (ctr == 6500) carN <= False;
if (ctr == 12_000) dut.ped_button_push;
endrule
rule stop (ctr > 32768);
$display("TESTS FINISHED");
$finish(0);
endrule
function do_offs(l) = l.show_offs;
function do_ons(l) = l.show_ons;
function do_reset(l) = l.reset;
function do_it(f);
action
for (Integer i=0; i<12; i=i+1)
f(lamps[i]);
endaction
endfunction
function any_changes();
Bool b = False;
for (Integer i=0; i<12; i=i+1)
b = b || lamps[i].changed;
return b;
endfunction
rule show (any_changes());
do_it(do_offs);
do_it(do_ons);
do_it(do_reset);
$display("(at time %d)", $time);
endrule
endmodule
endpackage

61
samples/C/jni_layer.h Normal file
View File

@@ -0,0 +1,61 @@
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class jni_JniLayer */
#ifndef _Included_jni_JniLayer
#define _Included_jni_JniLayer
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: jni_JniLayer
* Method: jni_layer_initialize
* Signature: ([II)J
*/
JNIEXPORT jlong JNICALL Java_jni_JniLayer_jni_1layer_1initialize
(JNIEnv *, jobject, jintArray, jint, jint);
/*
* Class: jni_JniLayer
* Method: jni_layer_mainloop
* Signature: (J)V
*/
JNIEXPORT void JNICALL Java_jni_JniLayer_jni_1layer_1mainloop
(JNIEnv *, jobject, jlong);
/*
* Class: jni_JniLayer
* Method: jni_layer_set_button
* Signature: (JII)V
*/
JNIEXPORT void JNICALL Java_jni_JniLayer_jni_1layer_1set_1button
(JNIEnv *, jobject, jlong, jint, jint);
/*
* Class: jni_JniLayer
* Method: jni_layer_set_analog
* Signature: (JIIF)V
*/
JNIEXPORT void JNICALL Java_jni_JniLayer_jni_1layer_1set_1analog
(JNIEnv *, jobject, jlong, jint, jint, jfloat);
/*
* Class: jni_JniLayer
* Method: jni_layer_report_analog_chg
* Signature: (JI)V
*/
JNIEXPORT void JNICALL Java_jni_JniLayer_jni_1layer_1report_1analog_1chg
(JNIEnv *, jobject, jlong, jint);
/*
* Class: jni_JniLayer
* Method: jni_layer_kill
* Signature: (J)V
*/
JNIEXPORT void JNICALL Java_jni_JniLayer_jni_1layer_1kill
(JNIEnv *, jobject, jlong);
#ifdef __cplusplus
}
#endif
#endif

5
samples/C/syscalldefs.h Normal file
View File

@@ -0,0 +1,5 @@
static const syscalldef syscalldefs[] = {
[SYSCALL_OR_NUM(0, SYS_restart_syscall)] = MAKE_UINT16(0, 1),
[SYSCALL_OR_NUM(1, SYS_exit)] = MAKE_UINT16(1, 17),
[SYSCALL_OR_NUM(2, SYS_fork)] = MAKE_UINT16(0, 22),
};

View File

@@ -0,0 +1,5 @@
program-id. hello.
procedure division.
display "Hello, World!".
stop run.

View File

@@ -0,0 +1,6 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. hello.
PROCEDURE DIVISION.
DISPLAY "Hello World, yet again.".
STOP RUN.

View File

@@ -0,0 +1,6 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. hello.
PROCEDURE DIVISION.
DISPLAY "Hello World!".
STOP RUN.

7
samples/COBOL/simple.cpy Normal file
View File

@@ -0,0 +1,7 @@
01 COBOL-TEST-RECORD.
05 COBOL-TEST-USAGES.
10 COBOL-4-COMP PIC S9(4) COMP.
10 COBOL-8-COMP PIC S9(8) COMP.
10 COBOL-9-COMP PIC S9(9) COMP.
10 COBOL-4-COMP2 PIC S9(4) COMP-2.
10 COBOL-7-COMP2 PIC 9(7) COMP-2.

6307
samples/CSS/bootstrap.css vendored Normal file

File diff suppressed because it is too large Load Diff

873
samples/CSS/bootstrap.min.css vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,21 @@
;;;; -*- lisp -*-
(in-package :foo)
;;; Header comment.
(defvar *foo*)
(eval-when (:execute :compile-toplevel :load-toplevel)
(defun add (x &optional y &key z)
(declare (ignore z))
;; Inline comment.
(+ x (or y 1))))
#|
Multi-line comment.
|#
(defmacro foo (x &body b)
(if x
`(1+ ,x) ;After-line comment.
42))

87
samples/DM/example.dm Normal file
View File

@@ -0,0 +1,87 @@
// This is a single line comment.
/*
This is a multi-line comment
*/
// Pre-processor keywords
#define PI 3.1415
#if PI == 4
#define G 5
#elif PI == 3
#define I 6
#else
#define K 7
#endif
var/GlobalCounter = 0
var/const/CONST_VARIABLE = 2
var/list/MyList = list("anything", 1, new /datum/entity)
var/list/EmptyList[99] // creates a list of 99 null entries
var/list/NullList = null
/*
Entity Class
*/
/datum/entity
var/name = "Entity"
var/number = 0
/datum/entity/proc/myFunction()
world.log << "Entity has called myFunction"
/datum/entity/New()
number = GlobalCounter++
/*
Unit Class, Extends from Entity
*/
/datum/entity/unit
name = "Unit"
/datum/entity/unit/New()
..() // calls the parent's proc; equal to super() and base() in other languages
number = rand(1, 99)
/datum/entity/unit/myFunction()
world.log << "Unit has overriden and called myFunction"
// Global Function
/proc/ReverseList(var/list/input)
var/list/output = list()
for(var/i = input.len; i >= 1; i--) // IMPORTANT: List Arrays count from 1.
output += input[i] // "+= x" is ".Add(x)"
return output
// Bitflags
/proc/DoStuff()
var/bitflag = 0
bitflag |= 8
return bitflag
/proc/DoOtherStuff()
var/bitflag = 65535 // 16 bits is the maximum amount
bitflag &= ~8
return bitflag
// Logic
/proc/DoNothing()
var/pi = PI
if(pi == 4)
world.log << "PI is 4"
else if(pi == CONST_VARIABLE)
world.log << "PI is [CONST_VARIABLE]!"
else
world.log << "PI is approximety [pi]"
#undef PI // Undefine PI

View File

@@ -0,0 +1,122 @@
#!/usr/bin/env escript
%%!
%-*-Mode:erlang;coding:utf-8;tab-width:4;c-basic-offset:4;indent-tabs-mode:()-*-
% ex: set ft=erlang fenc=utf-8 sts=4 ts=4 sw=4 et:
%%%
%%%------------------------------------------------------------------------
%%% BSD LICENSE
%%%
%%% Copyright (c) 2013, Michael Truog <mjtruog at gmail dot com>
%%% All rights reserved.
%%%
%%% Redistribution and use in source and binary forms, with or without
%%% modification, are permitted provided that the following conditions are met:
%%%
%%% * Redistributions of source code must retain the above copyright
%%% notice, this list of conditions and the following disclaimer.
%%% * Redistributions in binary form must reproduce the above copyright
%%% notice, this list of conditions and the following disclaimer in
%%% the documentation and/or other materials provided with the
%%% distribution.
%%% * All advertising materials mentioning features or use of this
%%% software must display the following acknowledgment:
%%% This product includes software developed by Michael Truog
%%% * The name of the author may not be used to endorse or promote
%%% products derived from this software without specific prior
%%% written permission
%%%
%%% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
%%% CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
%%% INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
%%% OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
%%% DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
%%% CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
%%% SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
%%% BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
%%% SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
%%% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
%%% WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
%%% NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
%%% OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
%%% DAMAGE.
%%%------------------------------------------------------------------------
-author('mjtruog [at] gmail (dot) com').
-mode(compile).
main(_) ->
{ok,
[{sys, _} = RelToolConfig,
{target_dir, TargetDir},
{overlay, OverlayConfig}]} = file:consult("reltool.config"),
{ok, Spec} = reltool:get_target_spec([RelToolConfig]),
case file:make_dir(TargetDir) of
ok ->
ok;
{error, eexist} ->
io:format("release already exists? (~p)~n", [TargetDir]),
exit_code(1)
end,
ok = reltool:eval_target_spec(Spec, code:root_dir(), TargetDir),
ok = process_overlay(RelToolConfig, TargetDir, OverlayConfig),
exit_code(0).
shell(Command, Arguments) ->
CommandSuffix = " && echo 0 || echo 1",
case lists:reverse(os:cmd(lists:flatten(
io_lib:format(Command ++ CommandSuffix, Arguments)))) of
[_, $0 | _] ->
ok;
[_, $1 | _] ->
io:format("\"~s\" failed!~n", [io_lib:format(Command, Arguments)]),
error
end.
boot_rel_vsn({sys, Config} = _RelToolConfig) ->
{rel, _Name, Ver, _} = proplists:lookup(rel, Config),
Ver.
%% minimal parsing for handling mustache syntax
mustache(Body, Context) ->
mustache(Body, "", Context).
mustache([], Result, _Context) ->
lists:reverse(Result);
mustache([${, ${ | KeyStr], Result, Context) ->
mustache_key(KeyStr, "", Result, Context);
mustache([C | Rest], Result, Context) ->
mustache(Rest, [C | Result], Context).
mustache_key([$}, $} | Rest], KeyStr, Result, Context) ->
Key = erlang:list_to_existing_atom(lists:reverse(KeyStr)),
{ok, Value} = dict:find(Key, Context),
mustache(Rest, lists:reverse(Value) ++ Result, Context);
mustache_key([C | Rest], KeyStr, Result, Context) ->
mustache_key(Rest, [C | KeyStr], Result, Context).
%% support minimal overlay based on rebar overlays
process_overlay(RelToolConfig, TargetDir, OverlayConfig) ->
BootRelVsn = boot_rel_vsn(RelToolConfig),
OverlayVars =
dict:from_list([{erts_vsn, "erts-" ++ erlang:system_info(version)},
{rel_vsn, BootRelVsn},
{target_dir, TargetDir},
{hostname, net_adm:localhost()}]),
{ok, BaseDir} = file:get_cwd(),
execute_overlay(OverlayConfig, OverlayVars, BaseDir, TargetDir).
execute_overlay([], _Vars, _BaseDir, _TargetDir) ->
ok;
execute_overlay([{mkdir, Out} | Rest], Vars, BaseDir, TargetDir) ->
OutDir = mustache(filename:join(TargetDir, Out), Vars),
ok = shell("mkdir -p ~s", [OutDir]),
execute_overlay(Rest, Vars, BaseDir, TargetDir);
execute_overlay([{copy, In, Out} | Rest], Vars, BaseDir, TargetDir) ->
InFile = mustache(filename:join(BaseDir, In), Vars),
OutFile = mustache(filename:join(TargetDir, Out), Vars),
true = filelib:is_file(InFile),
ok = shell("cp -R ~s ~s", [InFile, OutFile]),
execute_overlay(Rest, Vars, BaseDir, TargetDir).
exit_code(ExitCode) ->
erlang:halt(ExitCode, [{flush, true}]).

161
samples/GLSL/SyLens.glsl Normal file
View File

@@ -0,0 +1,161 @@
#version 120
/*
Original Lens Distortion Algorithm from SSontech (Syntheyes)
http://www.ssontech.com/content/lensalg.htm
r2 is radius squared.
r2 = image_aspect*image_aspect*u*u + v*v
f = 1 + r2*(k + kcube*sqrt(r2))
u' = f*u
v' = f*v
*/
// Controls
uniform float kCoeff, kCube, uShift, vShift;
uniform float chroma_red, chroma_green, chroma_blue;
uniform bool apply_disto;
// Uniform inputs
uniform sampler2D input1;
uniform float adsk_input1_w, adsk_input1_h, adsk_input1_aspect, adsk_input1_frameratio;
uniform float adsk_result_w, adsk_result_h;
float distortion_f(float r) {
float f = 1 + (r*r)*(kCoeff + kCube * r);
return f;
}
float inverse_f(float r)
{
// Build a lookup table on the radius, as a fixed-size table.
// We will use a vec3 since we will store the multipled number in the Z coordinate.
// So to recap: x will be the radius, y will be the f(x) distortion, and Z will be x * y;
vec3[48] lut;
// Since out LUT is shader-global check if it's been computed alrite
// Flame has no overflow bbox so we can safely max out at the image edge, plus some cushion
float max_r = sqrt((adsk_input1_frameratio * adsk_input1_frameratio) + 1) + 0.1;
float incr = max_r / 48;
float lut_r = 0;
float f;
for(int i=0; i < 48; i++) {
f = distortion_f(lut_r);
lut[i] = vec3(lut_r, f, lut_r * f);
lut_r += incr;
}
float t;
// Now find the nehgbouring elements
// only iterate to 46 since we will need
// 47 as i+1
for(int i=0; i < 47; i++) {
if(lut[i].z < r && lut[i+1].z > r) {
// BAM! our value is between these two segments
// get the T interpolant and mix
t = (r - lut[i].z) / (lut[i+1].z - lut[i]).z;
return mix(lut[i].y, lut[i+1].y, t );
}
}
}
float aberrate(float f, float chroma)
{
return f + (f * chroma);
}
vec3 chromaticize_and_invert(float f)
{
vec3 rgb_f = vec3(aberrate(f, chroma_red), aberrate(f, chroma_green), aberrate(f, chroma_blue));
// We need to DIVIDE by F when we redistort, and x / y == x * (1 / y)
if(apply_disto) {
rgb_f = 1 / rgb_f;
}
return rgb_f;
}
void main(void)
{
vec2 px, uv;
float f = 1;
float r = 1;
px = gl_FragCoord.xy;
// Make sure we are still centered
px.x -= (adsk_result_w - adsk_input1_w) / 2;
px.y -= (adsk_result_h - adsk_input1_h) / 2;
// Push the destination coordinates into the [0..1] range
uv.x = px.x / adsk_input1_w;
uv.y = px.y / adsk_input1_h;
// And to Syntheyes UV which are [1..-1] on both X and Y
uv.x = (uv.x *2 ) - 1;
uv.y = (uv.y *2 ) - 1;
// Add UV shifts
uv.x += uShift;
uv.y += vShift;
// Make the X value the aspect value, so that the X coordinates go to [-aspect..aspect]
uv.x = uv.x * adsk_input1_frameratio;
// Compute the radius
r = sqrt(uv.x*uv.x + uv.y*uv.y);
// If we are redistorting, account for the oversize plate in the input, assume that
// the input aspect is the same
if(apply_disto) {
r = r / (float(adsk_input1_w) / float(adsk_result_w));
}
// Apply or remove disto, per channel honoring chromatic aberration
if(apply_disto) {
f = inverse_f(r);
} else {
f = distortion_f(r);
}
vec2[3] rgb_uvs = vec2[](uv, uv, uv);
// Compute distortions per component
vec3 rgb_f = chromaticize_and_invert(f);
// Apply the disto coefficients, per component
rgb_uvs[0] = rgb_uvs[0] * rgb_f.rr;
rgb_uvs[1] = rgb_uvs[1] * rgb_f.gg;
rgb_uvs[2] = rgb_uvs[2] * rgb_f.bb;
// Convert all the UVs back to the texture space, per color component
for(int i=0; i < 3; i++) {
uv = rgb_uvs[i];
// Back from [-aspect..aspect] to [-1..1]
uv.x = uv.x / adsk_input1_frameratio;
// Remove UV shifts
uv.x -= uShift;
uv.y -= vShift;
// Back to OGL UV
uv.x = (uv.x + 1) / 2;
uv.y = (uv.y + 1) / 2;
rgb_uvs[i] = uv;
}
// Sample the input plate, per component
vec4 sampled;
sampled.r = texture2D(input1, rgb_uvs[0]).r;
sampled.g = texture2D(input1, rgb_uvs[1]).g;
sampled.b = texture2D(input1, rgb_uvs[2]).b;
// and assign to the output
gl_FragColor.rgba = vec4(sampled.rgb, 1.0 );
}

View File

@@ -0,0 +1,630 @@
//// High quality (Some browsers may freeze or crash)
//#define HIGHQUALITY
//// Medium quality (Should be fine on all systems, works on Intel HD2000 on Win7 but quite slow)
//#define MEDIUMQUALITY
//// Defaults
//#define REFLECTIONS
#define SHADOWS
//#define GRASS
//#define SMALL_WAVES
#define RAGGED_LEAVES
//#define DETAILED_NOISE
//#define LIGHT_AA // 2 sample SSAA
//#define HEAVY_AA // 2x2 RG SSAA
//#define TONEMAP
//// Configurations
#ifdef MEDIUMQUALITY
#define SHADOWS
#define SMALL_WAVES
#define RAGGED_LEAVES
#define TONEMAP
#endif
#ifdef HIGHQUALITY
#define REFLECTIONS
#define SHADOWS
//#define GRASS
#define SMALL_WAVES
#define RAGGED_LEAVES
#define DETAILED_NOISE
#define LIGHT_AA
#define TONEMAP
#endif
// Constants
const float eps = 1e-5;
const float PI = 3.14159265359;
const vec3 sunDir = vec3(0.79057,-0.47434, 0.0);
const vec3 skyCol = vec3(0.3, 0.5, 0.8);
const vec3 sandCol = vec3(0.9, 0.8, 0.5);
const vec3 treeCol = vec3(0.8, 0.65, 0.3);
const vec3 grassCol = vec3(0.4, 0.5, 0.18);
const vec3 leavesCol = vec3(0.3, 0.6, 0.2);
const vec3 leavesPos = vec3(-5.1,13.4, 0.0);
#ifdef TONEMAP
const vec3 sunCol = vec3(1.8, 1.7, 1.6);
#else
const vec3 sunCol = vec3(0.9, 0.85, 0.8);
#endif
const float exposure = 1.1; // Only used when tonemapping
// Description : Array and textureless GLSL 2D/3D/4D simplex
// noise functions.
// Author : Ian McEwan, Ashima Arts.
// License : Copyright (C) 2011 Ashima Arts. All rights reserved.
// Distributed under the MIT License. See LICENSE file.
// https://github.com/ashima/webgl-noise
vec3 mod289(vec3 x) {
return x - floor(x * (1.0 / 289.0)) * 289.0;
}
vec4 mod289(vec4 x) {
return x - floor(x * (1.0 / 289.0)) * 289.0;
}
vec4 permute(vec4 x) {
return mod289(((x*34.0)+1.0)*x);
}
vec4 taylorInvSqrt(vec4 r) {
return 1.79284291400159 - 0.85373472095314 * r;
}
float snoise(vec3 v) {
const vec2 C = vec2(1.0/6.0, 1.0/3.0) ;
const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);
// First corner
vec3 i = floor(v + dot(v, C.yyy) );
vec3 x0 = v - i + dot(i, C.xxx) ;
// Other corners
vec3 g = step(x0.yzx, x0.xyz);
vec3 l = 1.0 - g;
vec3 i1 = min( g.xyz, l.zxy );
vec3 i2 = max( g.xyz, l.zxy );
// x0 = x0 - 0.0 + 0.0 * C.xxx;
// x1 = x0 - i1 + 1.0 * C.xxx;
// x2 = x0 - i2 + 2.0 * C.xxx;
// x3 = x0 - 1.0 + 3.0 * C.xxx;
vec3 x1 = x0 - i1 + C.xxx;
vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y
vec3 x3 = x0 - D.yyy; // -1.0+3.0*C.x = -0.5 = -D.y
// Permutations
i = mod289(i);
vec4 p = permute( permute( permute(
i.z + vec4(0.0, i1.z, i2.z, 1.0 ))
+ i.y + vec4(0.0, i1.y, i2.y, 1.0 ))
+ i.x + vec4(0.0, i1.x, i2.x, 1.0 ));
// Gradients: 7x7 points over a square, mapped onto an octahedron.
// The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)
float n_ = 0.142857142857; // 1.0/7.0
vec3 ns = n_ * D.wyz - D.xzx;
vec4 j = p - 49.0 * floor(p * ns.z * ns.z); // mod(p,7*7)
vec4 x_ = floor(j * ns.z);
vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N)
vec4 x = x_ *ns.x + ns.yyyy;
vec4 y = y_ *ns.x + ns.yyyy;
vec4 h = 1.0 - abs(x) - abs(y);
vec4 b0 = vec4( x.xy, y.xy );
vec4 b1 = vec4( x.zw, y.zw );
//vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0;
//vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0;
vec4 s0 = floor(b0)*2.0 + 1.0;
vec4 s1 = floor(b1)*2.0 + 1.0;
vec4 sh = -step(h, vec4(0.0));
vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ;
vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ;
vec3 p0 = vec3(a0.xy,h.x);
vec3 p1 = vec3(a0.zw,h.y);
vec3 p2 = vec3(a1.xy,h.z);
vec3 p3 = vec3(a1.zw,h.w);
//Normalise gradients
vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));
p0 *= norm.x;
p1 *= norm.y;
p2 *= norm.z;
p3 *= norm.w;
// Mix final noise value
vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);
m = m * m;
return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1),
dot(p2,x2), dot(p3,x3) ) );
}
// Main
float fbm(vec3 p)
{
float final = snoise(p);
p *= 1.94; final += snoise(p) * 0.5;
#ifdef DETAILED_NOISE
p *= 3.75; final += snoise(p) * 0.25;
return final / 1.75;
#else
return final / 1.5;
#endif
}
float waterHeight(vec3 p)
{
float d = length(p.xz);
float h = sin(d * 1.5 + iGlobalTime * 3.0) * 12.0 / d; // Island waves
#ifdef SMALL_WAVES
h += fbm(p*0.5); // Other waves
#endif
return h;
}
vec3 bump(vec3 pos, vec3 rayDir)
{
float s = 2.0;
// Fade out waves to reduce aliasing
float dist = dot(pos, rayDir);
s *= dist < 2.0 ? 1.0 : 1.4142 / sqrt(dist);
// Calculate normal from heightmap
vec2 e = vec2(1e-2, 0.0);
vec3 p = vec3(pos.x, iGlobalTime*0.5, pos.z)*0.7;
float m = waterHeight(p)*s;
return normalize(vec3(
waterHeight(p+e.xyy)*s-m,
1.0,
waterHeight(p+e.yxy)*s-m
));
}
// Ray intersections
vec4 intersectSphere(vec3 rpos, vec3 rdir, vec3 pos, float rad)
{
vec3 op = pos - rpos;
float b = dot(op, rdir);
float det = b*b - dot(op, op) + rad*rad;
if (det > 0.0)
{
det = sqrt(det);
float t = b - det;
if (t > eps)
return vec4(-normalize(rpos+rdir*t-pos), t);
}
return vec4(0.0);
}
vec4 intersectCylinder(vec3 rpos, vec3 rdir, vec3 pos, float rad)
{
vec3 op = pos - rpos;
vec2 rdir2 = normalize(rdir.yz);
float b = dot(op.yz, rdir2);
float det = b*b - dot(op.yz, op.yz) + rad*rad;
if (det > 0.0)
{
det = sqrt(det);
float t = b - det;
if (t > eps)
return vec4(-normalize(rpos.yz+rdir2*t-pos.yz), 0.0, t);
t = b + det;
if (t > eps)
return vec4(-normalize(rpos.yz+rdir2*t-pos.yz), 0.0, t);
}
return vec4(0.0);
}
vec4 intersectPlane(vec3 rayPos, vec3 rayDir, vec3 n, float d)
{
float t = -(dot(rayPos, n) + d) / dot(rayDir, n);
return vec4(n * sign(dot(rayDir, n)), t);
}
// Helper functions
vec3 rotate(vec3 p, float theta)
{
float c = cos(theta), s = sin(theta);
return vec3(p.x * c + p.z * s, p.y,
p.z * c - p.x * s);
}
float impulse(float k, float x) // by iq
{
float h = k*x;
return h * exp(1.0 - h);
}
// Raymarched parts of scene
float grass(vec3 pos)
{
float h = length(pos - vec3(0.0, -7.0, 0.0)) - 8.0;
if (h > 2.0) return h; // Optimization (Avoid noise if too far away)
return h + snoise(pos * 3.0) * 0.1 + pos.y * 0.9;
}
float tree(vec3 pos)
{
pos.y -= 0.5;
float s = sin(pos.y*0.03);
float c = cos(pos.y*0.03);
mat2 m = mat2(c, -s, s, c);
vec3 p = vec3(m*pos.xy, pos.z);
float width = 1.0 - pos.y * 0.02 - clamp(sin(pos.y * 8.0) * 0.1, 0.05, 0.1);
return max(length(p.xz) - width, pos.y - 12.5);
}
vec2 scene(vec3 pos)
{
float vtree = tree(pos);
#ifdef GRASS
float vgrass = grass(pos);
float v = min(vtree, vgrass);
#else
float v = vtree;
#endif
return vec2(v, v == vtree ? 2.0 : 1.0);
}
vec3 normal(vec3 pos)
{
vec2 eps = vec2(1e-3, 0.0);
float h = scene(pos).x;
return normalize(vec3(
scene(pos-eps.xyy).x-h,
scene(pos-eps.yxy).x-h,
scene(pos-eps.yyx).x-h
));
}
float plantsShadow(vec3 rayPos, vec3 rayDir)
{
// Soft shadow taken from iq
float k = 6.0;
float t = 0.0;
float s = 1.0;
for (int i = 0; i < 30; i++)
{
vec3 pos = rayPos+rayDir*t;
vec2 res = scene(pos);
if (res.x < 0.001) return 0.0;
s = min(s, k*res.x/t);
t += max(res.x, 0.01);
}
return s*s*(3.0 - 2.0*s);
}
// Ray-traced parts of scene
vec4 intersectWater(vec3 rayPos, vec3 rayDir)
{
float h = sin(20.5 + iGlobalTime * 2.0) * 0.03;
float t = -(rayPos.y + 2.5 + h) / rayDir.y;
return vec4(0.0, 1.0, 0.0, t);
}
vec4 intersectSand(vec3 rayPos, vec3 rayDir)
{
return intersectSphere(rayPos, rayDir, vec3(0.0,-24.1,0.0), 24.1);
}
vec4 intersectTreasure(vec3 rayPos, vec3 rayDir)
{
return vec4(0.0);
}
vec4 intersectLeaf(vec3 rayPos, vec3 rayDir, float openAmount)
{
vec3 dir = normalize(vec3(0.0, 1.0, openAmount));
float offset = 0.0;
vec4 res = intersectPlane(rayPos, rayDir, dir, 0.0);
vec3 pos = rayPos+rayDir*res.w;
#ifdef RAGGED_LEAVES
offset = snoise(pos*0.8) * 0.3;
#endif
if (pos.y > 0.0 || length(pos * vec3(0.9, 2.0, 1.0)) > 4.0 - offset) res.w = 0.0;
vec4 res2 = intersectPlane(rayPos, rayDir, vec3(dir.xy, -dir.z), 0.0);
pos = rayPos+rayDir*res2.w;
#ifdef RAGGED_LEAVES
offset = snoise(pos*0.8) * 0.3;
#endif
if (pos.y > 0.0 || length(pos * vec3(0.9, 2.0, 1.0)) > 4.0 - offset) res2.w = 0.0;
if (res2.w > 0.0 && res2.w < res.w || res.w <= 0.0)
res = res2;
return res;
}
vec4 leaves(vec3 rayPos, vec3 rayDir)
{
float t = 1e20;
vec3 n = vec3(0.0);
rayPos -= leavesPos;
float sway = impulse(15.0, fract(iGlobalTime / PI * 0.125));
float upDownSway = sway * -sin(iGlobalTime) * 0.06;
float openAmount = sway * max(-cos(iGlobalTime) * 0.4, 0.0);
float angleOffset = -0.1;
for (float k = 0.0; k < 6.2; k += 0.75)
{
// Left-right
float alpha = k + (k - PI) * sway * 0.015;
vec3 p = rotate(rayPos, alpha);
vec3 d = rotate(rayDir, alpha);
// Up-down
angleOffset *= -1.0;
float theta = -0.4 +
angleOffset +
cos(k) * 0.35 +
upDownSway +
sin(iGlobalTime+k*10.0) * 0.03 * (sway + 0.2);
p = rotate(p.xzy, theta).xzy;
d = rotate(d.xzy, theta).xzy;
// Shift
p -= vec3(5.4, 0.0, 0.0);
// Intersect individual leaf
vec4 res = intersectLeaf(p, d, 1.0+openAmount);
if (res.w > 0.0 && res.w < t)
{
t = res.w;
n = res.xyz;
}
}
return vec4(n, t);
}
// Lighting
float shadow(vec3 rayPos, vec3 rayDir)
{
float s = 1.0;
// Intersect sand
//vec4 resSand = intersectSand(rayPos, rayDir);
//if (resSand.w > 0.0) return 0.0;
// Intersect plants
s = min(s, plantsShadow(rayPos, rayDir));
if (s < 0.0001) return 0.0;
// Intersect leaves
vec4 resLeaves = leaves(rayPos, rayDir);
if (resLeaves.w > 0.0 && resLeaves.w < 1e7) return 0.0;
return s;
}
vec3 light(vec3 p, vec3 n)
{
float s = 1.0;
#ifdef SHADOWS
s = shadow(p-sunDir*0.01, -sunDir);
#endif
vec3 col = sunCol * min(max(dot(n, sunDir), 0.0), s);
col += skyCol * (-n.y * 0.5 + 0.5) * 0.3;
return col;
}
vec3 lightLeaves(vec3 p, vec3 n)
{
float s = 1.0;
#ifdef SHADOWS
s = shadow(p-sunDir*0.01, -sunDir);
#endif
float ao = min(length(p - leavesPos) * 0.1, 1.0);
float ns = dot(n, sunDir);
float d = sqrt(max(ns, 0.0));
vec3 col = sunCol * min(d, s);
col += sunCol * max(-ns, 0.0) * vec3(0.3, 0.3, 0.1) * ao;
col += skyCol * (-n.y * 0.5 + 0.5) * 0.3 * ao;
return col;
}
vec3 sky(vec3 n)
{
return skyCol * (1.0 - n.y * 0.8);
}
// Ray-marching
vec4 plants(vec3 rayPos, vec3 rayDir)
{
float t = 0.0;
for (int i = 0; i < 40; i++)
{
vec3 pos = rayPos+rayDir*t;
vec2 res = scene(pos);
float h = res.x;
if (h < 0.001)
{
vec3 col = res.y == 2.0 ? treeCol : grassCol;
float uvFact = res.y == 2.0 ? 1.0 : 10.0;
vec3 n = normal(pos);
vec2 uv = vec2(n.x, pos.y * 0.5) * 0.2 * uvFact;
vec3 tex = texture2D(iChannel0, uv).rgb * 0.6 + 0.4;
float ao = min(length(pos - leavesPos) * 0.1, 1.0);
return vec4(col * light(pos, n) * ao * tex, t);
}
t += h;
}
return vec4(sky(rayDir), 1e8);
}
// Final combination
vec3 traceReflection(vec3 rayPos, vec3 rayDir)
{
vec3 col = vec3(0.0);
float t = 1e20;
// Intersect plants
vec4 resPlants = plants(rayPos, rayDir);
if (resPlants.w > 0.0 && resPlants.w < t)
{
t = resPlants.w;
col = resPlants.xyz;
}
// Intersect leaves
vec4 resLeaves = leaves(rayPos, rayDir);
if (resLeaves.w > 0.0 && resLeaves.w < t)
{
vec3 pos = rayPos + rayDir * resLeaves.w;
vec2 uv = (pos.xz - leavesPos.xz) * 0.3;
float tex = texture2D(iChannel0, uv).r * 0.6 + 0.5;
t = resLeaves.w;
col = leavesCol * lightLeaves(pos, resLeaves.xyz) * tex;
}
if (t > 1e7) return sky(rayDir);
return col;
}
vec3 trace(vec3 rayPos, vec3 rayDir)
{
vec3 col = vec3(0.0);
float t = 1e20;
// Intersect sand
vec4 resSand = intersectSand(rayPos, rayDir);
if (resSand.w > 0.0)
{
vec3 pos = rayPos + rayDir * resSand.w;
t = resSand.w;
col = sandCol * light(pos, resSand.xyz);
}
// Intersect treasure chest
vec4 resTreasure = intersectTreasure(rayPos, rayDir);
if (resTreasure.w > 0.0 && resTreasure.w < t)
{
vec3 pos = rayPos + rayDir * resTreasure.w;
t = resTreasure.w;
col = leavesCol * light(pos, resTreasure.xyz);
}
// Intersect leaves
vec4 resLeaves = leaves(rayPos, rayDir);
if (resLeaves.w > 0.0 && resLeaves.w < t)
{
vec3 pos = rayPos + rayDir * resLeaves.w;
vec2 uv = (pos.xz - leavesPos.xz) * 0.3;
float tex = texture2D(iChannel0, uv).r * 0.6 + 0.5;
t = resLeaves.w;
col = leavesCol * lightLeaves(pos, resLeaves.xyz) * tex;
}
// Intersect plants
vec4 resPlants = plants(rayPos, rayDir);
if (resPlants.w > 0.0 && resPlants.w < t)
{
t = resPlants.w;
col = resPlants.xyz;
}
// Intersect water
vec4 resWater = intersectWater(rayPos, rayDir);
if (resWater.w > 0.0 && resWater.w < t)
{
vec3 pos = rayPos + rayDir * resWater.w;
float dist = t - resWater.w;
vec3 n = bump(pos, rayDir);
float ct = -min(dot(n,rayDir), 0.0);
float fresnel = 0.9 - 0.9 * pow(1.0 - ct, 5.0);
vec3 trans = col * exp(-dist * vec3(1.0, 0.7, 0.4) * 3.0);
vec3 reflDir = normalize(reflect(rayDir, n));
vec3 refl = sky(reflDir);
#ifdef REFLECTIONS
if (dot(pos, rayDir) < -2.0)
refl = traceReflection(pos, reflDir).rgb;
#endif
t = resWater.t;
col = mix(refl, trans, fresnel);
}
if (t > 1e7) return sky(rayDir);
return col;
}
// Ray-generation
vec3 camera(vec2 px)
{
vec2 rd = (px / iResolution.yy - vec2(iResolution.x/iResolution.y*0.5-0.5, 0.0)) * 2.0 - 1.0;
float t = sin(iGlobalTime * 0.1) * 0.2;
vec3 rayDir = normalize(vec3(rd.x, rd.y, 1.0));
vec3 rayPos = vec3(0.0, 3.0, -18.0);
return trace(rayPos, rayDir);
}
void main(void)
{
#ifdef HEAVY_AA
vec3 col = camera(gl_FragCoord.xy+vec2(0.0,0.5))*0.25;
col += camera(gl_FragCoord.xy+vec2(0.25,0.0))*0.25;
col += camera(gl_FragCoord.xy+vec2(0.5,0.75))*0.25;
col += camera(gl_FragCoord.xy+vec2(0.75,0.25))*0.25;
#else
vec3 col = camera(gl_FragCoord.xy);
#ifdef LIGHT_AA
col = col * 0.5 + camera(gl_FragCoord.xy+vec2(0.5,0.5))*0.5;
#endif
#endif
#ifdef TONEMAP
// Optimized Haarm-Peter Duikers curve
vec3 x = max(vec3(0.0),col*exposure-0.004);
col = (x*(6.2*x+.5))/(x*(6.2*x+1.7)+0.06);
#else
col = pow(col, vec3(0.4545));
#endif
gl_FragColor = vec4(col, 1.0);
}

68
samples/GLSL/shader.fp Normal file
View File

@@ -0,0 +1,68 @@
/*
* Copyright (C) 2010 Josh A. Beam
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
const int NUM_LIGHTS = 3;
const vec3 AMBIENT = vec3(0.1, 0.1, 0.1);
const float MAX_DIST = 2.5;
const float MAX_DIST_SQUARED = MAX_DIST * MAX_DIST;
uniform vec3 lightColor[NUM_LIGHTS];
varying vec3 fragmentNormal;
varying vec3 cameraVector;
varying vec3 lightVector[NUM_LIGHTS];
void
main()
{
// initialize diffuse/specular lighting
vec3 diffuse = vec3(0.0, 0.0, 0.0);
vec3 specular = vec3(0.0, 0.0, 0.0);
// normalize the fragment normal and camera direction
vec3 normal = normalize(fragmentNormal);
vec3 cameraDir = normalize(cameraVector);
// loop through each light
for(int i = 0; i < NUM_LIGHTS; ++i) {
// calculate distance between 0.0 and 1.0
float dist = min(dot(lightVector[i], lightVector[i]), MAX_DIST_SQUARED) / MAX_DIST_SQUARED;
float distFactor = 1.0 - dist;
// diffuse
vec3 lightDir = normalize(lightVector[i]);
float diffuseDot = dot(normal, lightDir);
diffuse += lightColor[i] * clamp(diffuseDot, 0.0, 1.0) * distFactor;
// specular
vec3 halfAngle = normalize(cameraDir + lightDir);
vec3 specularColor = min(lightColor[i] + 0.5, 1.0);
float specularDot = dot(normal, halfAngle);
specular += specularColor * pow(clamp(specularDot, 0.0, 1.0), 16.0) * distFactor;
}
vec4 sample = vec4(1.0, 1.0, 1.0, 1.0);
gl_FragColor = vec4(clamp(sample.rgb * (diffuse + AMBIENT) + specular, 0.0, 1.0), sample.a);
}

3
samples/Jade/hello.jade Normal file
View File

@@ -0,0 +1,3 @@
p.
Hello,
World!

111
samples/LFE/church.lfe Normal file
View File

@@ -0,0 +1,111 @@
;; Copyright (c) 2013 Duncan McGreggor <oubiwann@cogitat.io>
;;
;; 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.
;; File : church.lfe
;; Author : Duncan McGreggor
;; Purpose : Demonstrating church numerals from the lambda calculus
;; The code below was used to create the section of the user guide here:
;; http://lfe.github.io/user-guide/recursion/5.html
;;
;; Here is some example usage:
;;
;; > (slurp '"church.lfe")
;; #(ok church)
;; > (zero)
;; #Fun<lfe_eval.10.53503600>
;; > (church->int1 (zero))
;; 0
;; > (church->int1 (three))
;; 3
;; > (church->int1 (five))
;; 5
;; > (church->int2 #'five/0)
;; 5
;; > (church->int2 (lambda () (get-church 25)))
;; 25
(defmodule church
(export all))
(defun zero ()
(lambda (s)
(lambda (x) x)))
(defun one ()
(lambda (s)
(lambda (x)
(funcall s x))))
(defun two ()
(lambda (s)
(lambda (x)
(funcall s
(funcall s x)))))
(defun three ()
(lambda (s)
(lambda (x)
(funcall s
(funcall s
(funcall s x))))))
(defun four ()
(lambda (s)
(lambda (x)
(funcall s
(funcall s
(funcall s
(funcall s x)))))))
(defun five ()
(get-church 5))
(defun int-successor (n)
(+ n 1))
(defun church->int1 (church-numeral)
"
Converts a called church numeral to an integer, e.g.:
> (church->int1 (five))
"
(funcall
(funcall church-numeral #'int-successor/1) 0))
(defun church->int2 (church-numeral)
"
Converts a non-called church numeral to an integer, e.g.:
> (church->int2 #'five/0)
"
(funcall
(funcall
(funcall church-numeral) #'int-successor/1) 0))
(defun church-successor (church-numeral)
(lambda (s)
(lambda (x)
(funcall s
(funcall
(funcall church-numeral s) x)))))
(defun get-church (church-numeral count limit)
(cond ((== count limit) church-numeral)
((/= count limit)
(get-church
(church-successor church-numeral)
(+ 1 count)
limit))))
(defun get-church (integer)
(get-church (zero) 0 integer))

104
samples/LFE/gps1.lfe Normal file
View File

@@ -0,0 +1,104 @@
;;; -*- Mode: LFE; -*-
;;; Code from Paradigms of Artificial Intelligence Programming
;;; Copyright (c) 1991 Peter Norvig
;;;; File gps1.lisp: First version of GPS (General Problem Solver)
;;;; Converted to LFE by Robert Virding
;; Define macros for global variable access. This is a hack and very naughty!
(defsyntax defvar
([name val] (let ((v val)) (put 'name v) v)))
(defsyntax setvar
([name val] (let ((v val)) (put 'name v) v)))
(defsyntax getvar
([name] (get 'name)))
;; Module definition.
(defmodule gps1
(export (gps 2) (gps 3) (school-ops 0))
(import (from lists (member 2) (all 2) (any 2))
;; Rename lists functions to be more CL like.
(rename lists ((all 2) every) ((any 2) some) ((filter 2) find-all))))
;; An operation.
(defrecord op
action preconds add-list del-list)
;; General Problem Solver: achieve all goals using *ops*.
(defun gps (state goals ops)
;; Set global variables
(defvar *state* state) ;The current state: a list of conditions.
(defvar *ops* ops) ;A list of available operators.
(if (every (fun achieve 1) goals) 'solved))
(defun gps (state goals)
;; Set global variables, but use existing *ops*
(defvar *state* state) ;The current state: a list of conditions.
(if (every (fun achieve 1) goals) 'solved))
;; A goal is achieved if it already holds or if there is an
;; appropriate op for it that is applicable."
(defun achieve (goal)
(orelse (member goal (getvar *state*))
(some (fun apply-op 1)
(find-all (lambda (op) (appropriate-p goal op))
(getvar *ops*)))))
;; An op is appropriate to a goal if it is in its add list.
(defun appropriate-p (goal op)
(member goal (op-add-list op)))
;; Print a message and update *state* if op is applicable.
(defun apply-op (op)
(if (every (fun achieve 1) (op-preconds op))
(progn
(: io fwrite '"executing ~p\n" (list (op-action op)))
(setvar *state* (set-difference (getvar *state*) (op-del-list op)))
(setvar *state* (union (getvar *state*) (op-add-list op)))
'true)))
;; Define the set functions to work on list, a listsets module really.
(defun set-difference
([(cons e es) s2]
(if (member e s2)
(set-difference es s2)
(cons e (set-difference es s2))))
([() s2] ()))
(defun union
([(cons e es) s2]
(if (member e s2) (union es s2) (cons e (union es s2))))
([() s2] ()))
;;; ==============================
(defun school-ops ()
(list
(make-op action 'drive-son-to-school
preconds '(son-at-home car-works)
add-list '(son-at-school)
del-list '(son-at-home))
(make-op action 'shop-installs-battery
preconds '(car-needs-battery shop-knows-problem shop-has-money)
add-list '(car-works)
del-list ())
(make-op action 'tell-shop-problem
preconds '(in-communication-with-shop)
add-list '(shop-knows-problem)
del-list ())
(make-op action 'telephone-shop
preconds '(know-phone-number)
add-list '(in-communication-with-shop)
del-list ())
(make-op action 'look-up-number
preconds '(have-phone-book)
add-list '(know-phone-number)
del-list ())
(make-op action 'give-shop-money
preconds '(have-money)
add-list '(shop-has-money)
del-list '(have-money))))

View File

@@ -0,0 +1,83 @@
;; Copyright (c) 2008-2013 Robert Virding
;;
;; 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.
;; File : mnesia_demo.lfe
;; Author : Robert Virding
;; Purpose : A simple Mnesia demo file for LFE.
;; This file contains a simple demo of using LFE to access Mnesia
;; tables. It shows how to use the emp-XXXX macro (ETS match pattern)
;; together with mnesia:match_object, match specifications with
;; mnesia:select and Query List Comprehensions.
(defmodule mnesia_demo
(export (new 0) (by_place 1) (by_place_ms 1) (by_place_qlc 1)))
(defrecord person name place job)
(defun new ()
;; Start mnesia and create a table, we will get an in memory only schema.
(: mnesia start)
(: mnesia create_table 'person '(#(attributes (name place job))))
;; Initialise the table.
(let ((people '(
;; First some people in London.
#(fred london waiter)
#(bert london waiter)
#(john london painter)
#(paul london driver)
;; Now some in Paris.
#(jean paris waiter)
#(gerard paris driver)
#(claude paris painter)
#(yves paris waiter)
;; And some in Rome.
#(roberto rome waiter)
#(guiseppe rome driver)
#(paulo rome painter)
;; And some in Berlin.
#(fritz berlin painter)
#(kurt berlin driver)
#(hans berlin waiter)
#(franz berlin waiter)
)))
(: lists foreach (match-lambda
([(tuple n p j)]
(: mnesia transaction
(lambda ()
(let ((new (make-person name n place p job j)))
(: mnesia write new))))))
people)))
;; Match records by place using match_object and the emp-XXXX macro.
(defun by_place (place)
(: mnesia transaction
(lambda () (: mnesia match_object (emp-person place place)))))
;; Use match specifications to match records
(defun by_place_ms (place)
(let ((f (lambda () (: mnesia select 'person
(match-spec ([(match-person name n place p job j)]
(when (=:= p place))
(tuple n j)))))))
(: mnesia transaction f)))
;; Use Query List Comprehensions to match records
(defun by_place_qlc (place)
(let ((f (lambda ()
(let ((q (qlc (lc ((<- person (: mnesia table 'person))
(=:= (person-place person) place))
person))))
(: qlc e q)))))
(: mnesia transaction f)))

169
samples/LFE/object.lfe Normal file
View File

@@ -0,0 +1,169 @@
;; Copyright (c) 2013 Duncan McGreggor <oubiwann@cogitat.io>
;;
;; 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.
;; File : object.lfe
;; Author : Duncan McGreggor
;; Purpose : Demonstrating simple OOP with closures
;; The simple object system demonstrated below shows how to do the following:
;; * create objects
;; * call methods on those objects
;; * have methods which can call other methods
;; * update the state of an instance variable
;;
;; Note, however, that his example does not demonstrate inheritance.
;;
;; To use the code below in LFE, do the following:
;;
;; $ cd examples
;; $ ../bin/lfe -pa ../ebin
;;
;; Load the file and create a fish-class instance:
;;
;; > (slurp '"object.lfe")
;; #(ok object)
;; > (set mommy-fish (fish-class '"Carp"))
;; #Fun<lfe_eval.10.91765564>
;;
;; Execute some of the basic methods:
;;
;; > (get-species mommy-fish)
;; "Carp"
;; > (move mommy-fish 17)
;; The Carp swam 17 feet!
;; ok
;; > (get-id mommy-fish)
;; "47eebe91a648f042fc3fb278df663de5"
;;
;; Now let's look at "modifying" state data (e.g., children counts):
;;
;; > (get-children mommy-fish)
;; ()
;; > (get-children-count mommy-fish)
;; 0
;; > (set (mommy-fish baby-fish-1) (reproduce mommy-fish))
;; (#Fun<lfe_eval.10.91765564> #Fun<lfe_eval.10.91765564>)
;; > (get-id mommy-fish)
;; "47eebe91a648f042fc3fb278df663de5"
;; > (get-id baby-fish-1)
;; "fdcf35983bb496650e558a82e34c9935"
;; > (get-children-count mommy-fish)
;; 1
;; > (set (mommy-fish baby-fish-2) (reproduce mommy-fish))
;; (#Fun<lfe_eval.10.91765564> #Fun<lfe_eval.10.91765564>)
;; > (get-id mommy-fish)
;; "47eebe91a648f042fc3fb278df663de5"
;; > (get-id baby-fish-2)
;; "3e64e5c20fb742dd88dac1032749c2fd"
;; > (get-children-count mommy-fish)
;; 2
;; > (get-info mommy-fish)
;; id: "47eebe91a648f042fc3fb278df663de5"
;; species: "Carp"
;; children: ["fdcf35983bb496650e558a82e34c9935",
;; "3e64e5c20fb742dd88dac1032749c2fd"]
;; ok
(defmodule object
(export all))
(defun fish-class (species)
"
This is the constructor that will be used most often, only requiring that
one pass a 'species' string.
When the children are not defined, simply use an empty list.
"
(fish-class species ()))
(defun fish-class (species children)
"
This contructor is mostly useful as a way of abstracting out the id
generation from the larger constructor. Nothing else uses fish-class/2
besides fish-class/1, so it's not strictly necessary.
When the id isn't know, generate one."
(let* (((binary (id (size 128))) (: crypto rand_bytes 16))
(formatted-id (car
(: io_lib format
'"~32.16.0b" (list id)))))
(fish-class species children formatted-id)))
(defun fish-class (species children id)
"
This is the constructor used internally, once the children and fish id are
known.
"
(let ((move-verb '"swam"))
(lambda (method-name)
(case method-name
('id
(lambda (self) id))
('species
(lambda (self) species))
('children
(lambda (self) children))
('info
(lambda (self)
(: io format
'"id: ~p~nspecies: ~p~nchildren: ~p~n"
(list (get-id self)
(get-species self)
(get-children self)))))
('move
(lambda (self distance)
(: io format
'"The ~s ~s ~p feet!~n"
(list species move-verb distance))))
('reproduce
(lambda (self)
(let* ((child (fish-class species))
(child-id (get-id child))
(children-ids (: lists append
(list children (list child-id))))
(parent-id (get-id self))
(parent (fish-class species children-ids parent-id)))
(list parent child))))
('children-count
(lambda (self)
(: erlang length children)))))))
(defun get-method (object method-name)
"
This is a generic function, used to call into the given object (class
instance).
"
(funcall object method-name))
; define object methods
(defun get-id (object)
(funcall (get-method object 'id) object))
(defun get-species (object)
(funcall (get-method object 'species) object))
(defun get-info (object)
(funcall (get-method object 'info) object))
(defun move (object distance)
(funcall (get-method object 'move) object distance))
(defun reproduce (object)
(funcall (get-method object 'reproduce) object))
(defun get-children (object)
(funcall (get-method object 'children) object))
(defun get-children-count (object)
(funcall (get-method object 'children-count) object))

View File

@@ -0,0 +1,16 @@
all: hello
hello: main.o factorial.o hello.o
g++ main.o factorial.o hello.o -o hello
main.o: main.cpp
g++ -c main.cpp
factorial.o: factorial.cpp
g++ -c factorial.cpp
hello.o: hello.cpp
g++ -c hello.cpp
clean:
rm -rf *o hello

View File

@@ -0,0 +1,3 @@
#!/usr/bin/make -f
%:
ls -l

23
samples/OpenCL/sample.cl Normal file
View File

@@ -0,0 +1,23 @@
/* Old-style comment. */
// New-style comment.
typedef float foo_t;
#ifndef ZERO
#define ZERO (0.0)
#endif
#define FOO(x) ((x) + \
ZERO)
__kernel
void foo(__global const foo_t * x, __local foo_t y, const uint n)
{
barrier(CLK_LOCAL_MEM_FENCE);
if (n > 42) {
*x += y;
}
}

22
samples/PHP/php2.script! Normal file
View File

@@ -0,0 +1,22 @@
#!/usr/bin/env php
<?php
/**
* Yii console bootstrap file.
*
* @link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
defined('YII_DEBUG') or define('YII_DEBUG', true);
// fcgi doesn't have STDIN defined by default
defined('STDIN') or define('STDIN', fopen('php://stdin', 'r'));
require(__DIR__ . '/vendor/yiisoft/yii2/yii/Yii.php');
require(__DIR__ . '/vendor/autoload.php');
$config = require(__DIR__ . '/config/console.php');
$application = new yii\console\Application($config);
$application->run();

102
samples/Perl/index.fcgi Executable file
View File

@@ -0,0 +1,102 @@
#!/usr/bin/perl
use strict;
use warnings;
use CGI::Fast;
use XML::Hash::XS;
use File::Spec;
use FindBin qw($Bin);
#use lib File::Spec->catdir($Bin, qw(.. lib));
my $_stop = 0;
my $request;
$SIG{'PIPE'} = 'IGNORE';
$SIG{'INT'} = $SIG{'TERM'} = sub {
$_stop = 1;
exit(0) unless defined($request);
};
unless ($ENV{'SERVER_SOFTWARE'}) { # for nginx external fcgi
$CGI::Fast::Ext_Request = FCGI::Request(
\*STDIN, \*STDOUT, \*STDERR,
\%ENV, int($ARGV[0] || 0), 1
);
}
my $conv = XML::Hash::XS->new(
use_attr => 1,
indent => 2,
output => \*STDOUT,
xml_decl => 1
);
my $tmpl_path = File::Spec->catdir($Bin, qw|.. tmpl|);
my $data = {
name => {
nick => 'cono'
},
tree => {
example => [
{ name => 'Encyclopaedia', parent => 0, id => 1 },
{ name => 'Science', parent => 1, id => 2 },
{ name => 'Culture', parent => 1, id => 3 },
{ name => 'Art', parent => 3, id => 4 },
{ name => 'Craft', parent => 3, id => 5 }
],
},
third_party => {
results => [
{ artist_name => 'Madonna', venue => 'Kitchen', event => 'cooking', date => '2013-04-21' },
{ artist_name => 'cono', venue => 'Provectus-IT', event => 'presentation', date => '2013-04-20' },
]
}
};
while (1) {
eval {
$request = CGI::Fast->new();
unless ($request) {
$_stop = 1;
return;
}
my ($tmpl, $output) = ('nick');
if ($ENV{'REQUEST_URI'} =~ m|/([a-zA-Z0-9_]+)|) {
$tmpl = $1;
$output = $data->{$tmpl} if exists $data->{$tmpl};
}
die "Bad request" unless $output;
if (-e File::Spec->catfile($tmpl_path, "$tmpl.xslt")) {
print "X-Xslt-Stylesheet: /$tmpl.xslt\r\n";
}
print qq(Content-type:application/xml;charset=utf-8\r\n\r\n);
$conv->hash2xml($output);
};
if ($@) {
print qq(Content-type:text/html;charset=utf-8\r\n\r\nError: $@);
}
$request = undef;
last if $_stop;
if (-M $0 < 0) {
unless ($ENV{'SERVER_SOFTWARE'}) { # for nginx external fcgi
system("$0 ". int($ARGV[0] || 0).' &');
}
last;
}
}
exit(0);

View File

@@ -0,0 +1,27 @@
package tutorial;
option java_package = "com.example.tutorial";
option java_outer_classname = "AddressBookProtos";
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
message AddressBook {
repeated Person person = 1;
}

View File

@@ -0,0 +1,47 @@
#!/usr/bin/env python
import os
import sys
def main():
# usage string
usage = 'usage: gitall command'
# command check
if len(sys.argv) < 2:
sys.exit(usage)
command = 'git ' + ' '.join(sys.argv[1:])
printDelimiter()
print 'Running command:', command
# get a list of git directories in the specified parent
gitDirectories = getSubdirectories('.', isGitDirectory)
for gitDirectory in gitDirectories:
os.chdir(gitDirectory)
printDelimiter()
print 'Current respository location:', os.getcwd()
os.system(command)
printDelimiter()
def getSubdirectories(directory, filter = None):
directory = os.path.abspath(directory)
subdirectories = os.walk(directory).next()[1]
if filter is None:
return [directory + '/' + i for i in subdirectories]
else:
return [directory + '/' + i for i in subdirectories if filter(directory + '/' + i)]
def isGitDirectory(directory):
return os.path.isdir(directory + '/.git/')
def printDelimiter():
print '\033[91m'
print ('#' * 80)
print '\033[0m'
if __name__ == '__main__':
main()

View File

@@ -0,0 +1,324 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Copyright © 2013 Martin Ueding <dev@martin-ueding.de>
import argparse
import matplotlib.pyplot as pl
import numpy as np
import scipy.optimize as op
from prettytable import PrettyTable
__docformat__ = "restructuredtext en"
# Sensitivität der Thermosäule
S = 30e-6
def phif(U):
return U / S
def main():
options = _parse_args()
V = 1000
data = np.genfromtxt("a-leer.csv", delimiter="\t")
t = data[:,0]
U = data[:,1] / V / 1000
U_err = 0.7e-3 / V
offset = np.mean(U[-3:])
x = np.linspace(min(t), max(t))
y = np.ones(x.size) * offset
pl.plot(x, y * 10**6, label="Offset")
print "Offset: {:.3g} V".format(offset)
pl.errorbar(t, U * 10**6, yerr=U_err * 10**6, linestyle="none", marker="+",
label="Messdaten")
pl.grid(True)
pl.legend(loc="best")
pl.title(u"Bestimmung des Offsets")
pl.xlabel(ur"Zeit $t / \mathrm{s}$")
pl.ylabel(ur"Thermospannung $U / \mathrm{\mu V}$")
pl.savefig("Plot_a-leer.pdf")
pl.clf()
V = 100
data = np.genfromtxt("a-Lampe.csv", delimiter="\t")
t = data[:,0]
U = data[:,1] / V / 1000 - offset
U_err = 0.7e-3 / V
x = np.linspace(min(t), max(t))
y = np.ones(x.size) * max(U) * 0.9
pl.plot(x, y * 10**6, label=ur"$90\%$")
pl.errorbar(t, U * 10**6, yerr=U_err * 10**6, linestyle="none", marker="+",
label="Messdaten")
pl.grid(True)
pl.legend(loc="best")
pl.title(u"Bestimmung der Ansprechzeit")
pl.xlabel(ur"Zeit $t / \mathrm{s}$")
pl.ylabel(ur"Thermospannung $U / \mathrm{\mu V}$")
pl.savefig("Plot_a-Lampe.pdf")
pl.clf()
# Lesliewürfel
print """
Lesliewürfel
============
"""
glanz = np.genfromtxt("b-glanz.csv", delimiter="\t")
matt = np.genfromtxt("b-matt.csv", delimiter="\t")
schwarz = np.genfromtxt("b-schwarz.csv", delimiter="\t")
weiss = np.genfromtxt("b-weiss.csv", delimiter="\t")
T0 = 19.0 + 273.15
T0_err = 1.0
glanz[:,0] += 273.15
matt[:,0] += 273.15
schwarz[:,0] += 273.15
weiss[:,0] += 273.15
glanz[:,1] /= 1000 * V
matt[:,1] /= 1000 * V
schwarz[:,1] /= 1000 * V
weiss[:,1] /= 1000 * V
glanz[:,1] -= offset
matt[:,1] -= offset
schwarz[:,1] -= offset
weiss[:,1] -= offset
glanz_phi = phif(glanz[:,1])
matt_phi = phif(matt[:,1])
schwarz_phi = phif(schwarz[:,1])
weiss_phi = phif(weiss[:,1])
T_err = 0.3
sigma = 5.670373e-8
def boltzmann(T, epsilon, offset):
return epsilon * sigma * T**4 + offset
glanz_popt, glanz_pconv = op.curve_fit(boltzmann, glanz[:,0], glanz_phi)
matt_popt, matt_pconv = op.curve_fit(boltzmann, matt[:,0], matt_phi)
schwarz_popt, schwarz_pconv = op.curve_fit(boltzmann, schwarz[:,0], schwarz_phi)
weiss_popt, weiss_pconv = op.curve_fit(boltzmann, weiss[:,0], weiss_phi)
glanz_x = np.linspace(min(glanz[:,0]), max(glanz[:,0]))
glanz_y = boltzmann(glanz_x, *glanz_popt)
pl.plot(glanz_x, glanz_y, label="Fit glanz", color="gold")
matt_x = np.linspace(min(matt[:,0]), max(matt[:,0]))
matt_y = boltzmann(matt_x, *matt_popt)
pl.plot(matt_x, matt_y, label="Fit matt", color="yellow")
schwarz_x = np.linspace(min(schwarz[:,0]), max(schwarz[:,0]))
schwarz_y = boltzmann(schwarz_x, *schwarz_popt)
pl.plot(schwarz_x, schwarz_y, label="Fit schwarz", color="black")
weiss_x = np.linspace(min(weiss[:,0]), max(weiss[:,0]))
weiss_y = boltzmann(weiss_x, *weiss_popt)
pl.plot(weiss_x, weiss_y, label="Fit weiss", color="gray")
print "glanz ε = {:.3g} ± {:.3g}".format(glanz_popt[0], np.sqrt(glanz_pconv.diagonal()[0]))
print "glanz offset = {:.3g} ± {:.3g}".format(glanz_popt[1], np.sqrt(glanz_pconv.diagonal()[1]))
print "matt ε = {:.3g} ± {:.3g}".format(matt_popt[0], np.sqrt(matt_pconv.diagonal()[0]))
print "matt offset = {:.3g} ± {:.3g}".format(matt_popt[1], np.sqrt(matt_pconv.diagonal()[1]))
print "schwarz ε = {:.3g} ± {:.3g}".format(schwarz_popt[0], np.sqrt(schwarz_pconv.diagonal()[0]))
print "schwarz offset = {:.3g} ± {:.3g}".format(schwarz_popt[1], np.sqrt(schwarz_pconv.diagonal()[1]))
print "weiss ε = {:.3g} ± {:.3g}".format(weiss_popt[0], np.sqrt(weiss_pconv.diagonal()[0]))
print "weiss offset = {:.3g} ± {:.3g}".format(weiss_popt[1], np.sqrt(weiss_pconv.diagonal()[1]))
pl.errorbar(glanz[:,0], glanz_phi, xerr=T_err, yerr=U_err/S,
label="glanz", color="gold", linestyle="none")
pl.errorbar(matt[:,0], matt_phi, xerr=T_err, yerr=U_err/S,
label="matt", color="yellow", linestyle="none")
pl.errorbar(schwarz[:,0], schwarz_phi, xerr=T_err, yerr=U_err/S,
label="schwarz", color="black", linestyle="none")
pl.errorbar(weiss[:,0], weiss_phi, xerr=T_err, yerr=U_err/S,
label="weiss", color="gray", linestyle="none")
header = ["T / K", "Phi/F in W/m^2", "Fehler T", "Fehler Phi/F"]
print """
Tabellen für den Lesliewürfel-Plot
----------------------------------
"""
print "Glanz"
glanz_table = PrettyTable(header)
for row in zip(glanz[:,0], glanz_phi, np.ones(glanz[:,0].size)*T_err, np.ones(glanz_phi.size)*U_err/S):
glanz_table.add_row(row)
print glanz_table
print
print "Matt"
matt_table = PrettyTable(header)
for row in zip(matt[:,0], matt_phi, np.ones(matt[:,0].size)*T_err, np.ones(matt_phi.size)*U_err/S):
matt_table.add_row(row)
print matt_table
print
print "Schwarz"
schwarz_table = PrettyTable(header)
for row in zip(schwarz[:,0], schwarz_phi, np.ones(schwarz[:,0].size)*T_err, np.ones(schwarz_phi.size)*U_err/S):
schwarz_table.add_row(row)
print schwarz_table
print
print "Weiß"
weiss_table = PrettyTable(header)
for row in zip(weiss[:,0], weiss_phi, np.ones(weiss[:,0].size)*T_err, np.ones(weiss_phi.size)*U_err/S):
weiss_table.add_row(row)
print weiss_table
print
epsilon = 0.1
x = np.linspace(min([min(x) for x in [glanz[:,0], matt[:,0], schwarz[:,0],
weiss[:,0]]]),
max([max(x) for x in [glanz[:,0], matt[:,0], schwarz[:,0],
weiss[:,0]]]),
100)
offset = - epsilon * sigma * T0**4
print "ideal offset = {:.3g}".format(offset)
y = boltzmann(x, epsilon, offset)
pl.plot(x, y, label=ur"$\epsilon = 0.1$")
pl.grid(True)
pl.title(u"Lesliewürfel")
pl.xlabel(ur"Temperatur $T / \mathrm{K}$")
pl.ylabel(ur"Strahlungsfluss $\frac{\Phi}{F} / \mathrm{\frac{W}{m^2}}$")
pl.legend(loc="best", prop={"size": 12})
pl.savefig("Plot_b.pdf")
pl.clf()
# Aufgabe c
print """
Aufgabe c
=========
"""
data = np.genfromtxt("c-erste.csv", delimiter="\t")
d = data[:,0] / 100
U = data[:,1] / V
phi = phif(U)
def c(x, a, b):
return a*x + b
dx = d**(-2)
dy = phi
dx_err = np.abs(-2 * d**(-3)) * 0.001
dy_err = 0.001 / S
popt, pconv = op.curve_fit(c, dx, dy)
x = np.linspace(min(dx), max(dx))
y = c(x, *popt)
pl.plot(x, y, label="Fit")
print "Fitparameter"
print "a", popt[0], "±", np.sqrt(pconv.diagonal()[0])
print "b", popt[1], "±", np.sqrt(pconv.diagonal()[1])
pl.errorbar(dx, dy, xerr=dx_err, yerr=dy_err, linestyle="none",
marker="+", label="Messdaten")
pl.grid(True)
pl.title(u"Halogenlampe bei verschiedenen Abständen")
pl.xlabel(ur"Abstand $d^{-2} / \mathrm{m^{-2}}$")
pl.ylabel(ur"Strahlungsfluss $\frac{\Phi}{F} / \mathrm{\frac{W}{m^2}}$")
pl.legend(loc="best")
pl.savefig("Plot_c-erste.pdf")
pl.clf()
print
print "Tabelle für Aufgabe c"
fields = ["d^-2 in m^-2", "Phi/F in W/m^2", "Fehler d^-2", "Fehler Phi/F"]
table = PrettyTable(fields)
table.align = "l"
for row in zip(dx, dy, dx_err, np.ones(dy.size)*dy_err):
table.add_row(row)
print table
print
data = np.genfromtxt("c-zweite.csv", delimiter="\t")
U1 = data[:,0]
I1 = data[:,1]
U2 = data[:,2] / V
U_err = 0.001
I_err = 0.01
p = U1 * I1
R = U1 / I1
R_err = np.sqrt(
(1/I1 * U_err)**2
+ (U1/I1**2 * I_err)**2
)
phi = phif(U2)
phi_err = U_err / S
alpha = 4.82e-3
beta = 6.76e-7
R0 = 0.35
R0_err = 0.05
T = (-alpha*R0 + np.sqrt(R0)*np.sqrt(4*beta*R + alpha**2*R0 - 4*beta*R0) +
2*beta*R0*T0)/(2*beta*R0)
popt, pconv = op.curve_fit(boltzmann, T, phi, sigma=phi_err)
x = np.linspace(min(T), max(T))
y = boltzmann(x, *popt)
pl.plot(x, y, label="Fit")
epsilon = popt[0]
epsilon_err = np.sqrt(pconv.diagonal()[0])
print "ε = {:.3g} ± {:.3g}".format(epsilon, epsilon_err)
f1 = (1/(np.sqrt(R0)*np.sqrt(4*beta*R + alpha**2*R0 - 4*beta*R0))) * R_err
f2 = T0_err
f3 = ((-alpha + ((alpha**2 - 4*beta)*np.sqrt(R0))/( 2*np.sqrt(4*beta*R + alpha**2*R0 - 4*beta*R0)) + np.sqrt( 4*beta*R + alpha**2*R0 - 4*beta*R0)/(2*np.sqrt(R0)) + 2*beta*T0)/( 2*beta*R0) - (-alpha*R0 + np.sqrt(R0)*np.sqrt(4*beta*R + alpha**2*R0 - 4*beta*R0) + 2*beta*R0*T0)/( 2*beta*R0**2)) * R0_err
T_err = np.sqrt(f1**2 + f2**2 + f3**2)
pl.errorbar(T, phi, xerr=T_err, yerr=phi_err, label="Messdaten",
linestyle="none", marker="+")
pl.grid(True)
pl.legend(loc="best")
pl.title(u"Halogenlampe bei verschiedenen Leistungen")
pl.xlabel(u"Temperatur $T / \mathrm{K}$")
pl.ylabel(ur"Strahlungsfluss $\frac{\Phi}{F} / \mathrm{\frac{W}{m^2}}$")
pl.savefig("Plot_c-zweite.pdf")
pl.clf()
def _parse_args():
"""
Parses the command line arguments.
:return: Namespace with arguments.
:rtype: Namespace
"""
parser = argparse.ArgumentParser(description="")
#parser.add_argument("args", metavar="N", type=str, nargs="*", help="Positional arguments.")
#parser.add_argument("", dest="", type="", default=, help=)
#parser.add_argument("--version", action="version", version="<the version>")
return parser.parse_args()
if __name__ == "__main__":
main()

31
samples/R/git-punchcard.script! Executable file
View File

@@ -0,0 +1,31 @@
#! /usr/bin/env Rscript
# vim: filetype=r:
ParseDates <- function(lines) {
dates <- matrix(unlist(strsplit(lines, " +")), ncol=6, byrow=TRUE)
days <- dates[,1]
times <- dates[,4]
hours <- matrix(unlist(strsplit(times, ":")), ncol=3, byrow=TRUE)[,1]
all.days <- c("Sun", "Sat", "Fri", "Thu", "Wed", "Tue", "Mon")
all.hours <- 0:23
data.frame( Day = factor(days , levels=all.days)
, Hour = factor(hours, levels=all.hours)
)
}
Main <- function() {
lines <- system("git log --format=%ad", intern=TRUE)
punchcard <- as.data.frame(table(ParseDates(lines)))
punchcard <-
( ggplot2::ggplot(punchcard, ggplot2::aes(y=Day, x=Hour))
+ ggplot2::geom_point(ggplot2::aes(size=Freq))
+ ggplot2::scale_size(range=c(0, 15))
)
ggplot2::ggsave( filename = "punchcard.png"
, plot = punchcard
, width = 10
, height = 5
)
}
Main()

12
samples/Sass/demo.scss Normal file
View File

@@ -0,0 +1,12 @@
$blue: #3bbfce;
$margin: 16px;
.content_navigation {
color: $blue;
}
.border {
padding: $margin / 2;
margin: $margin / 2;
border: 2px $blue solid;
}

View File

@@ -0,0 +1,3 @@
%p
Hello,
World!

View File

@@ -0,0 +1,30 @@
# This file describes the standard way to build Docker, using docker
docker-version 0.4.2
from ubuntu:12.04
maintainer Solomon Hykes <solomon@dotcloud.com>
# Build dependencies
run apt-get install -y -q curl
run apt-get install -y -q git
# Install Go
run curl -s https://go.googlecode.com/files/go1.1.1.linux-amd64.tar.gz | tar -v -C /usr/local -xz
env PATH /usr/local/go/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
env GOPATH /go
env CGO_ENABLED 0
run cd /tmp && echo 'package main' > t.go && go test -a -i -v
# Download dependencies
run PKG=github.com/kr/pty REV=27435c699; git clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && git checkout -f $REV
run PKG=github.com/gorilla/context/ REV=708054d61e5; git clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && git checkout -f $REV
run PKG=github.com/gorilla/mux/ REV=9b36453141c; git clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && git checkout -f $REV
# Run dependencies
run apt-get install -y iptables
# lxc requires updating ubuntu sources
run echo 'deb http://archive.ubuntu.com/ubuntu precise main universe' > /etc/apt/sources.list
run apt-get update
run apt-get install -y lxc
run apt-get install -y aufs-tools
# Upload docker source
add . /go/src/github.com/dotcloud/docker
# Build the binary
run cd /go/src/github.com/dotcloud/docker/docker && go install -ldflags "-X main.GITCOMMIT '??' -d -w"
env PATH /usr/local/go/bin:/go/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
cmd ["docker"]

127
samples/Slash/brainfuck.sl Normal file
View File

@@ -0,0 +1,127 @@
<%
class Env {
def init {
@memory = [];
@ptr = 0;
}
def ptr { @ptr }
def ptr=(ptr) { @ptr = ptr }
def current_value { @memory[@ptr] || 0 }
def current_value=(value) { @memory[@ptr] = value }
}
class AST {
class Next {
def eval(env) {
env.ptr++;
}
}
class Prev {
def eval(env) {
env.ptr--;
}
}
class Inc {
def eval(env) {
env.current_value++;
}
}
class Dec {
def eval(env) {
env.current_value--;
}
}
class Output {
def eval(env) {
print(env.current_value.char);
}
}
class Input {
def eval(env) {
...
}
}
class Sequence {
def init(nodes) {
@nodes = nodes;
}
def eval(env) {
for node in @nodes {
node.eval(env);
}
}
}
class Loop {
def init(seq) {
@seq = seq;
}
def eval(env) {
while env.current_value != 0 {
@seq.eval(env);
}
}
}
}
class Parser {
def init(str) {
@chars = str.split("");
}
def parse {
@stack = [[]];
for char in @chars {
_parse_char(char);
}
if @stack.length != 1 {
throw SyntaxError.new("unexpected end of input");
}
AST::Sequence.new(@stack.last);
}
def _parse_char(char) {
switch char {
">" { _add(AST::Next.new); }
"<" { _add(AST::Prev.new); }
"+" { _add(AST::Inc.new); }
"-" { _add(AST::Dec.new); }
"." { _add(AST::Output.new); }
"," { _add(AST::Input.new); }
"[" { _open_loop(); }
"]" { _close_loop(); }
}
}
def _add(node) {
@stack.last.push(node);
}
def _open_loop {
@stack.push([]);
}
def _close_loop {
if @stack.length == 1 {
throw SyntaxError.new("unexpected ']'");
}
nodes = @stack.pop;
_add(AST::Loop.new(AST::Sequence.new(nodes)));
}
}
src = File.read(ARGV.first);
ast = Parser.new(src).parse;
ast.eval(Env.new);

View File

@@ -0,0 +1,56 @@
//example from http://www.squirrel-lang.org/#documentation
local table = {
a = "10"
subtable = {
array = [1,2,3]
},
[10 + 123] = "expression index"
}
local array=[ 1, 2, 3, { a = 10, b = "string" } ];
foreach (i,val in array)
{
::print("the type of val is"+typeof val);
}
/////////////////////////////////////////////
class Entity
{
constructor(etype,entityname)
{
name = entityname;
type = etype;
}
x = 0;
y = 0;
z = 0;
name = null;
type = null;
}
function Entity::MoveTo(newx,newy,newz)
{
x = newx;
y = newy;
z = newz;
}
class Player extends Entity {
constructor(entityname)
{
base.constructor("Player",entityname)
}
function DoDomething()
{
::print("something");
}
}
local newplayer = Player("da playar");
newplayer.MoveTo(100,200,300);

View File

@@ -1 +1 @@
console.log "Hello, World!" console.log("Hello, World!");

93
samples/Volt/tesla.volt Normal file
View File

@@ -0,0 +1,93 @@
// Copyright © 2012-2013, Jakob Bornecrantz. All rights reserved.
// See copyright notice in src/volt/license.d (BOOST ver. 1.0).
module main;
import core.stdc.stdio;
import core.stdc.stdlib;
import watt.process;
import watt.path;
import results;
import list;
import cmd;
int main()
{
auto cmdGroup = new CmdGroup();
bool printOk = true;
bool printImprovments = true;
bool printFailing = true;
bool printRegressions = true;
string compiler = getEnv("VOLT");
if (compiler is null) {
printf("compiler envar not set\n".ptr);
return -1;
}
/// @todo Scan for files
auto tests = testList;
int total;
int passed;
int failed;
int improved;
int regressed;
auto rets = new Result[] (tests.length);
for (size_t i; i < tests.length; i++) {
rets[i] = new Result();
rets[i].runTest(cmdGroup, tests[i], compiler);
}
cmdGroup.waitAll();
for (size_t i; i < tests.length; i++) {
auto ret = rets[i];
total++;
if (ret.ok) {
passed++;
improved += cast(int)!ret.hasPassed;
if (!ret.hasPassed && printImprovments) {
printf("%s: %s, improved!\n".ptr, ret.test.ptr, ret.msg.ptr);
} else if (printOk) {
printf("%s: %s\n".ptr, ret.test.ptr, ret.msg.ptr);
}
} else {
failed++;
regressed += cast(int)ret.hasPassed;
if (ret.hasPassed && printRegressions) {
printf("%s: %s, regressed!\n".ptr, ret.test.ptr, ret.msg.ptr);
} else if (printFailing) {
printf("%s: %s\n".ptr, ret.test.ptr, ret.msg.ptr);
}
}
fflush(stdout);
}
auto xml = fopen("results.xml".ptr, "w+".ptr);
if (xml !is null) {
fprintf(xml, "<testsuites errors=\"%u\" failures=\"%u\" tests=\"%u\">\n".ptr,
regressed, failed - regressed, total);
for (size_t i; i < rets.length; i++) {
rets[i].xmlLog(xml);
}
fprintf(xml, "</testsuites>\n".ptr);
fflush(xml);
fclose(xml);
xml = null;
}
auto rate = cast(float)passed / cast(float)total * 100.f;
printf("Summary: %i tests, %i pass%s, %i failure%s, %.2f%% pass rate, %i regressions, %i improvements.\n".ptr,
total,
passed, (passed == 1 ? "".ptr : "es".ptr),
failed, (failed == 1 ? "".ptr : "s".ptr),
cast(double)rate, regressed, improved);
return regressed ? -1 : 0;
}

10
samples/XC/main.xc Normal file
View File

@@ -0,0 +1,10 @@
int main()
{
int x;
chan c;
par {
c <: 0;
c :> x;
}
return x;
}

View File

@@ -197,6 +197,13 @@ class TestBlob < Test::Unit::TestCase
assert blob("C++/protocol-buffer.pb.cc").generated? assert blob("C++/protocol-buffer.pb.cc").generated?
assert blob("Java/ProtocolBuffer.java").generated? assert blob("Java/ProtocolBuffer.java").generated?
assert blob("Python/protocol_buffer_pb2.py").generated? assert blob("Python/protocol_buffer_pb2.py").generated?
# Generated JNI
assert blob("C/jni_layer.h").generated?
# Minified CSS
assert !blob("CSS/bootstrap.css").generated?
assert blob("CSS/bootstrap.min.css").generated?
end end
def test_vendored def test_vendored
@@ -209,6 +216,9 @@ class TestBlob < Test::Unit::TestCase
# Rails vendor/ # Rails vendor/
assert blob("vendor/plugins/will_paginate/lib/will_paginate.rb").vendored? assert blob("vendor/plugins/will_paginate/lib/will_paginate.rb").vendored?
# 'thirdparty' directory
assert blob("thirdparty/lib/main.c").vendored?
# C deps # C deps
assert blob("deps/http_parser/http_parser.c").vendored? assert blob("deps/http_parser/http_parser.c").vendored?
assert blob("deps/v8/src/v8.h").vendored? assert blob("deps/v8/src/v8.h").vendored?
@@ -232,8 +242,27 @@ class TestBlob < Test::Unit::TestCase
assert blob("public/javascripts/jquery-1.5.2.js").vendored? assert blob("public/javascripts/jquery-1.5.2.js").vendored?
assert blob("public/javascripts/jquery-1.6.1.js").vendored? assert blob("public/javascripts/jquery-1.6.1.js").vendored?
assert blob("public/javascripts/jquery-1.6.1.min.js").vendored? assert blob("public/javascripts/jquery-1.6.1.min.js").vendored?
assert blob("public/javascripts/jquery-1.10.1.js").vendored?
assert blob("public/javascripts/jquery-1.10.1.min.js").vendored?
assert !blob("public/javascripts/jquery.github.menu.js").vendored? assert !blob("public/javascripts/jquery.github.menu.js").vendored?
# jQuery UI
assert blob("themes/ui-lightness/jquery-ui.css").vendored?
assert blob("themes/ui-lightness/jquery-ui-1.8.22.custom.css").vendored?
assert blob("themes/ui-lightness/jquery.ui.accordion.css").vendored?
assert blob("ui/i18n/jquery.ui.datepicker-ar.js").vendored?
assert blob("ui/i18n/jquery-ui-i18n.js").vendored?
assert blob("ui/jquery.effects.blind.js").vendored?
assert blob("ui/jquery-ui-1.8.22.custom.js").vendored?
assert blob("ui/jquery-ui-1.8.22.custom.min.js").vendored?
assert blob("ui/jquery-ui-1.8.22.js").vendored?
assert blob("ui/jquery-ui-1.8.js").vendored?
assert blob("ui/jquery-ui.min.js").vendored?
assert blob("ui/jquery.ui.accordion.js").vendored?
assert blob("ui/minified/jquery.effects.blind.min.js").vendored?
assert blob("ui/minified/jquery.ui.accordion.min.js").vendored?
# MooTools # 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.js").vendored?
assert blob("public/javascripts/mootools-core-1.3.2-full-compat-yc.js").vendored? assert blob("public/javascripts/mootools-core-1.3.2-full-compat-yc.js").vendored?
@@ -249,10 +278,6 @@ class TestBlob < Test::Unit::TestCase
assert blob("public/javascripts/yahoo-min.js").vendored? assert blob("public/javascripts/yahoo-min.js").vendored?
assert blob("public/javascripts/yuiloader-dom-event.js").vendored? assert blob("public/javascripts/yuiloader-dom-event.js").vendored?
# LESS
assert blob("public/javascripts/less-1.1.0.js").vendored?
assert blob("public/javascripts/less-1.1.0.min.js").vendored?
# WYS editors # WYS editors
assert blob("public/javascripts/ckeditor.js").vendored? assert blob("public/javascripts/ckeditor.js").vendored?
assert blob("public/javascripts/tiny_mce.js").vendored? assert blob("public/javascripts/tiny_mce.js").vendored?
@@ -278,6 +303,11 @@ class TestBlob < Test::Unit::TestCase
# jQuery validation plugin (MS bundles this with asp.net mvc) # jQuery validation plugin (MS bundles this with asp.net mvc)
assert blob("Scripts/jquery.validate.js").vendored? assert blob("Scripts/jquery.validate.js").vendored?
assert blob("Scripts/jquery.validate.min.js").vendored?
assert blob("Scripts/jquery.validate.unobtrusive.js").vendored?
assert blob("Scripts/jquery.validate.unobtrusive.min.js").vendored?
assert blob("Scripts/jquery.unobtrusive-ajax.js").vendored?
assert blob("Scripts/jquery.unobtrusive-ajax.min.js").vendored?
# NuGet Packages # NuGet Packages
assert blob("packages/Modernizr.2.0.6/Content/Scripts/modernizr-2.0.6-development-only.js").vendored? assert blob("packages/Modernizr.2.0.6/Content/Scripts/modernizr-2.0.6-development-only.js").vendored?
@@ -293,20 +323,6 @@ class TestBlob < Test::Unit::TestCase
assert blob("cordova-2.1.0.min.js").vendored? assert blob("cordova-2.1.0.min.js").vendored?
end end
def test_indexable
assert blob("Ruby/foo.rb").indexable?
assert !blob("Text/defu.nkt").indexable?
assert !blob("Text/dump.sql").indexable?
assert !blob("Binary/github.po").indexable?
assert !blob("Binary/linguist.gem").indexable?
# large binary blobs should fail on size check first, not call
# into charlock_holmes and alloc big buffers for testing encoding
b = blob("Binary/octocat.ai")
b.expects(:binary?).never
assert !b.indexable?
end
def test_language def test_language
Samples.each do |sample| Samples.each do |sample|
blob = blob(sample[:path]) blob = blob(sample[:path])
@@ -327,13 +343,6 @@ class TestBlob < Test::Unit::TestCase
HTML HTML
end end
def test_colorize_without_wrapper
assert_equal <<-HTML, blob("Ruby/foo.rb").colorize_without_wrapper
<span class="k">module</span> <span class="nn">Foo</span>
<span class="k">end</span>
HTML
end
def test_colorize_does_skip_minified_files def test_colorize_does_skip_minified_files
assert_nil blob("JavaScript/jquery-1.6.1.min.js").colorize assert_nil blob("JavaScript/jquery-1.6.1.min.js").colorize
end end

View File

@@ -160,7 +160,7 @@ class TestLanguage < Test::Unit::TestCase
assert_equal 'cpp', Language['C++'].search_term assert_equal 'cpp', Language['C++'].search_term
assert_equal 'cfm', Language['ColdFusion'].search_term assert_equal 'cfm', Language['ColdFusion'].search_term
assert_equal 'dpatch', Language['Darcs Patch'].search_term assert_equal 'dpatch', Language['Darcs Patch'].search_term
assert_equal 'ocaml', Language['F#'].search_term assert_equal 'fsharp', Language['F#'].search_term
assert_equal 'pot', Language['Gettext Catalog'].search_term assert_equal 'pot', Language['Gettext Catalog'].search_term
assert_equal 'irc', Language['IRC log'].search_term assert_equal 'irc', Language['IRC log'].search_term
assert_equal 'lhs', Language['Literate Haskell'].search_term assert_equal 'lhs', Language['Literate Haskell'].search_term
@@ -191,7 +191,10 @@ class TestLanguage < Test::Unit::TestCase
def test_markup def test_markup
assert_equal :markup, Language['HTML'].type assert_equal :markup, Language['HTML'].type
assert_equal :markup, Language['YAML'].type end
def test_data
assert_equal :data, Language['YAML'].type
end end
def test_other def test_other