diff --git a/.gitmodules b/.gitmodules index 405a88e5..79209740 100644 --- a/.gitmodules +++ b/.gitmodules @@ -82,9 +82,6 @@ [submodule "vendor/grammars/language-python"] path = vendor/grammars/language-python url = https://github.com/atom/language-python -[submodule "vendor/grammars/language-sass"] - path = vendor/grammars/language-sass - url = https://github.com/atom/language-sass [submodule "vendor/grammars/language-shellscript"] path = vendor/grammars/language-shellscript url = https://github.com/atom/language-shellscript @@ -115,9 +112,6 @@ [submodule "vendor/grammars/nesC.tmbundle"] path = vendor/grammars/nesC.tmbundle url = https://github.com/cdwilson/nesC.tmbundle -[submodule "vendor/grammars/racket-tmbundle"] - path = vendor/grammars/racket-tmbundle - url = https://github.com/christophevg/racket-tmbundle [submodule "vendor/grammars/haxe-sublime-bundle"] path = vendor/grammars/haxe-sublime-bundle url = https://github.com/clemos/haxe-sublime-bundle @@ -244,9 +238,6 @@ [submodule "vendor/grammars/abap.tmbundle"] path = vendor/grammars/abap.tmbundle url = https://github.com/pvl/abap.tmbundle -[submodule "vendor/grammars/Scalate.tmbundle"] - path = vendor/grammars/Scalate.tmbundle - url = https://github.com/scalate/Scalate.tmbundle [submodule "vendor/grammars/mercury-tmlanguage"] path = vendor/grammars/mercury-tmlanguage url = https://github.com/sebgod/mercury-tmlanguage @@ -486,7 +477,7 @@ url = https://github.com/vkostyukov/kotlin-sublime-package [submodule "vendor/grammars/c.tmbundle"] path = vendor/grammars/c.tmbundle - url = https://github.com/vmg/c.tmbundle + url = https://github.com/textmate/c.tmbundle [submodule "vendor/grammars/zephir-sublime"] path = vendor/grammars/zephir-sublime url = https://github.com/vmg/zephir-sublime @@ -509,7 +500,6 @@ [submodule "vendor/grammars/sublime-mask"] path = vendor/grammars/sublime-mask url = https://github.com/tenbits/sublime-mask - branch = release [submodule "vendor/grammars/sublime_cobol"] path = vendor/grammars/sublime_cobol url = https://bitbucket.org/bitlang/sublime_cobol @@ -520,3 +510,42 @@ [submodule "vendor/grammars/IDL-Syntax"] path = vendor/grammars/IDL-Syntax url = https://github.com/andik/IDL-Syntax +[submodule "vendor/grammars/sas.tmbundle"] + path = vendor/grammars/sas.tmbundle + url = https://github.com/rpardee/sas.tmbundle +[submodule "vendor/grammars/atom-salt"] + path = vendor/grammars/atom-salt + url = https://github.com/saltstack/atom-salt +[submodule "vendor/grammars/Scalate.tmbundle"] + path = vendor/grammars/Scalate.tmbundle + url = https://github.com/scalate/Scalate.tmbundle +[submodule "vendor/grammars/Elm.tmLanguage"] + path = vendor/grammars/Elm.tmLanguage + url = https://github.com/deadfoxygrandpa/Elm.tmLanguage +[submodule "vendor/grammars/sublime-bsv"] + path = vendor/grammars/sublime-bsv + url = https://github.com/thotypous/sublime-bsv +[submodule "vendor/grammars/AutoHotkey"] + path = vendor/grammars/AutoHotkey + url = https://github.com/robertcollier4/AutoHotkey +[submodule "vendor/grammars/Sublime-HTTP"] + path = vendor/grammars/Sublime-HTTP + url = https://github.com/httpspec/sublime-highlighting +[submodule "vendor/grammars/sass-textmate-bundle"] + path = vendor/grammars/sass-textmate-bundle + url = https://github.com/nathos/sass-textmate-bundle +[submodule "vendor/grammars/carto-atom"] + path = vendor/grammars/carto-atom + url = https://github.com/yohanboniface/carto-atom +[submodule "vendor/grammars/Sublime-Nit"] + path = vendor/grammars/Sublime-Nit + url = https://github.com/R4PaSs/Sublime-Nit +[submodule "vendor/grammars/language-hy"] + path = vendor/grammars/language-hy + url = https://github.com/rwtolbert/language-hy +[submodule "vendor/grammars/Racket"] + path = vendor/grammars/Racket + url = https://github.com/soegaard/racket-highlight-for-github +[submodule "vendor/grammars/turtle.tmbundle"] + path = vendor/grammars/turtle.tmbundle + url = https://github.com/peta/turtle.tmbundle diff --git a/.travis.yml b/.travis.yml index e49ae8a6..4d0c2351 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,12 +1,5 @@ -before_install: - - git fetch origin master:master - - git fetch origin v2.0.0:v2.0.0 - - git fetch origin test/attributes:test/attributes - - git fetch origin test/master:test/master - - sudo apt-get install libicu-dev -y - - git submodule init - - git submodule sync --quiet - - script/fast-submodule-update +sudo: false +before_install: script/travis/before_install rvm: - 1.9.3 - 2.0.0 @@ -16,3 +9,4 @@ notifications: disabled: true git: submodules: false +cache: bundler diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4afdd473..e7256579 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -13,10 +13,18 @@ To add support for a new language: 0. Add an entry for your language to [`languages.yml`][languages]. 0. Add a grammar for your language. Please only add grammars that have a license that permits redistribution. 0. Add your grammar as a submodule: `git submodule add https://github.com/JaneSmith/MyGrammar vendor/grammars/MyGrammar`. - 0. Add your grammar to [`grammars.yml`][grammars] by running `script/download-grammars --add vendor/grammars/MyGrammar`. + 0. Add your grammar to [`grammars.yml`][grammars] by running `script/convert-grammars --add vendor/grammars/MyGrammar`. 0. Add samples for your language to the [samples directory][samples] in the correct subdirectory. 0. Open a pull request, linking to a [GitHub search result](https://github.com/search?utf8=%E2%9C%93&q=extension%3Aboot+NOT+nothack&type=Code&ref=searchresults) showing in-the-wild usage. +In addition, if your new language defines an extension that's already listed in [`languages.yml`][languages] (such as `.foo`) then sometimes a few more steps will need to be taken: + +0. Make sure that example `.foo` files are present in the [samples directory][samples] for each language that uses `.foo`. +0. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.foo` files. (ping @arfon or @bkeepers to help with this) to ensure we're not misclassifying files. +0. If the Bayesian classifier does a bad job with the sample `.foo` files then a [heuristic](https://github.com/github/linguist/blob/master/lib/linguist/heuristics.rb) may need to be written to help. + +Remember, the goal here is to try and avoid false positives! + ## Fixing syntax highlighting Syntax highlighting in GitHub is performed using TextMate-compatible grammars. These are the same grammars that TextMate, Sublime Text and Atom use. Every language in `languages.yml` is mapped to its corresponding TM `scope`. This scope will be used when picking up a grammar for highlighting. @@ -49,6 +57,7 @@ If you are the current maintainer of this gem: 0. Create a branch for the release: `git checkout -b cut-release-vxx.xx.xx` 0. Make sure your local dependencies are up to date: `script/bootstrap` +0. If grammar submodules have not been updated recently, update them: `git submodule update --remote && git commit -a` 0. Ensure that samples are updated: `bundle exec rake samples` 0. Ensure that tests are green: `bundle exec rake test` 0. Bump gem version in `lib/linguist/version.rb`, [like this](https://github.com/github/linguist/commit/8d2ea90a5ba3b2fe6e1508b7155aa4632eea2985). diff --git a/Gemfile b/Gemfile index 95769569..c5f2cc3b 100644 --- a/Gemfile +++ b/Gemfile @@ -1,5 +1,4 @@ source 'https://rubygems.org' gemspec :name => "github-linguist" gemspec :name => "github-linguist-grammars" -gem 'test-unit', require: false if RUBY_VERSION >= '2.2' gem 'byebug' if RUBY_VERSION >= '2.0' diff --git a/Rakefile b/Rakefile index 068af0bb..b38486c0 100644 --- a/Rakefile +++ b/Rakefile @@ -48,7 +48,7 @@ end task :build_grammars_gem do rm_rf "grammars" - sh "script/download-grammars" + sh "script/convert-grammars" sh "gem", "build", "github-linguist-grammars.gemspec" end diff --git a/github-linguist.gemspec b/github-linguist.gemspec index 578e823c..983db982 100644 --- a/github-linguist.gemspec +++ b/github-linguist.gemspec @@ -18,6 +18,7 @@ Gem::Specification.new do |s| s.add_dependency 'mime-types', '>= 1.19' s.add_dependency 'rugged', '~> 0.22.0b4' + s.add_development_dependency 'minitest', '>= 5.0' s.add_development_dependency 'mocha' s.add_development_dependency 'pry' s.add_development_dependency 'rake' diff --git a/grammars.yml b/grammars.yml index d6c679ff..c85b2de6 100644 --- a/grammars.yml +++ b/grammars.yml @@ -24,6 +24,8 @@ vendor/grammars/Agda.tmbundle: - source.agda vendor/grammars/Alloy.tmbundle: - source.alloy +vendor/grammars/AutoHotkey: +- source.ahk vendor/grammars/ColdFusion: - source.cfscript - source.cfscript.cfc @@ -31,6 +33,8 @@ vendor/grammars/ColdFusion: - text.html.cfm vendor/grammars/Docker.tmbundle: - source.dockerfile +vendor/grammars/Elm.tmLanguage: +- source.elm vendor/grammars/Handlebars: - text.html.handlebars vendor/grammars/IDL-Syntax: @@ -45,13 +49,15 @@ vendor/grammars/LiveScript.tmbundle: vendor/grammars/NSIS: - source.nsis vendor/grammars/NimLime: -- source.nimrod -- source.nimrod_filter -- source.nimrodcfg +- source.nim +- source.nim_filter +- source.nimcfg vendor/grammars/PHP-Twig.tmbundle: - text.html.twig vendor/grammars/RDoc.tmbundle: - text.rdoc +vendor/grammars/Racket: +- source.racket vendor/grammars/SCSS.tmbundle: - source.scss vendor/grammars/Scalate.tmbundle: @@ -64,6 +70,8 @@ vendor/grammars/Stata.tmbundle: - source.stata vendor/grammars/Sublime-Coq: - source.coq +vendor/grammars/Sublime-HTTP: +- source.httpspec vendor/grammars/Sublime-Inform: - source.Inform7 vendor/grammars/Sublime-Lasso: @@ -72,6 +80,8 @@ vendor/grammars/Sublime-Logos: - source.logos vendor/grammars/Sublime-Loom: - source.loomscript +vendor/grammars/Sublime-Nit: +- source.nit vendor/grammars/Sublime-QML: - source.qml vendor/grammars/Sublime-REBOL: @@ -115,6 +125,9 @@ vendor/grammars/asp.tmbundle: vendor/grammars/assembly.tmbundle: - objdump.x86asm - source.x86asm +vendor/grammars/atom-salt: +- source.python.salt +- source.yaml.salt vendor/grammars/autoitv3-tmbundle: - source.autoit.3 vendor/grammars/awk-sublime: @@ -131,6 +144,8 @@ vendor/grammars/c.tmbundle: - source.c.platform vendor/grammars/capnproto.tmbundle: - source.capnp +vendor/grammars/carto-atom: +- source.css.mss vendor/grammars/ceylon-sublimetext: - module.ceylon - source.ceylon @@ -248,16 +263,16 @@ vendor/grammars/language-csharp: - source.nant-build vendor/grammars/language-gfm: - source.gfm +vendor/grammars/language-hy: +- source.hy vendor/grammars/language-javascript: - source.js - source.js.regexp vendor/grammars/language-python: - source.python - source.regexp.python +- text.python.console - text.python.traceback -vendor/grammars/language-sass: -- source.css.scss -- source.sass vendor/grammars/language-shellscript: - source.shell - text.shell-session @@ -349,8 +364,6 @@ vendor/grammars/python-django.tmbundle: vendor/grammars/r.tmbundle: - source.r - text.tex.latex.rd -vendor/grammars/racket-tmbundle: -- source.racket vendor/grammars/restructuredtext.tmbundle: - text.restructuredtext vendor/grammars/ruby-haml.tmbundle: @@ -366,6 +379,11 @@ vendor/grammars/ruby-slim.tmbundle: vendor/grammars/ruby.tmbundle: - source.ruby - text.html.erb +vendor/grammars/sas.tmbundle: +- source.SASLog +- source.sas +vendor/grammars/sass-textmate-bundle: +- source.sass vendor/grammars/scala.tmbundle: - source.sbt - source.scala @@ -386,6 +404,8 @@ vendor/grammars/sublime-befunge: - source.befunge vendor/grammars/sublime-better-typescript: - source.ts +vendor/grammars/sublime-bsv: +- source.bsv vendor/grammars/sublime-cirru: - source.cirru vendor/grammars/sublime-glsl: @@ -432,6 +452,9 @@ vendor/grammars/thrift.tmbundle: - source.thrift vendor/grammars/toml.tmbundle: - source.toml +vendor/grammars/turtle.tmbundle: +- source.sparql +- source.turtle vendor/grammars/verilog.tmbundle: - source.verilog vendor/grammars/x86-assembly-textmate-bundle: diff --git a/lib/linguist/blob_helper.rb b/lib/linguist/blob_helper.rb index c368b4d0..07e1ee52 100644 --- a/lib/linguist/blob_helper.rb +++ b/lib/linguist/blob_helper.rb @@ -99,7 +99,7 @@ module Linguist elsif name.nil? "attachment" else - "attachment; filename=#{EscapeUtils.escape_url(File.basename(name))}" + "attachment; filename=#{EscapeUtils.escape_url(name)}" end end @@ -233,7 +233,7 @@ module Linguist # # Return true or false def vendored? - name =~ VendoredRegexp ? true : false + path =~ VendoredRegexp ? true : false end # Public: Get each line of data @@ -301,7 +301,7 @@ module Linguist # # Return true or false def generated? - @_generated ||= Generated.generated?(name, lambda { data }) + @_generated ||= Generated.generated?(path, lambda { data }) end # Public: Detects the Language of the blob. diff --git a/lib/linguist/file_blob.rb b/lib/linguist/file_blob.rb index 04441935..2ca74c2d 100644 --- a/lib/linguist/file_blob.rb +++ b/lib/linguist/file_blob.rb @@ -3,7 +3,7 @@ require 'linguist/blob_helper' module Linguist # A FileBlob is a wrapper around a File object to make it quack # like a Grit::Blob. It provides the basic interface: `name`, - # `data`, and `size`. + # `data`, `path` and `size`. class FileBlob include BlobHelper @@ -14,43 +14,50 @@ module Linguist # # Returns a FileBlob. def initialize(path, base_path = nil) - @path = path - @name = base_path ? path.sub("#{base_path}/", '') : path + @fullpath = path + @path = base_path ? path.sub("#{base_path}/", '') : path end # Public: Filename # # Examples # - # FileBlob.new("/path/to/linguist/lib/linguist.rb").name + # FileBlob.new("/path/to/linguist/lib/linguist.rb").path # # => "/path/to/linguist/lib/linguist.rb" # # FileBlob.new("/path/to/linguist/lib/linguist.rb", - # "/path/to/linguist").name + # "/path/to/linguist").path # # => "lib/linguist.rb" # # Returns a String - attr_reader :name + attr_reader :path # Public: Read file permissions # # Returns a String like '100644' def mode - File.stat(@path).mode.to_s(8) + File.stat(@fullpath).mode.to_s(8) + end + + # Public: File name + # + # Returns a String + def name + File.basename(@fullpath) end # Public: Read file contents. # # Returns a String. def data - File.read(@path) + File.read(@fullpath) end # Public: Get byte size # # Returns an Integer. def size - File.size(@path) + File.size(@fullpath) end # Public: Get file extension. @@ -67,7 +74,7 @@ module Linguist # # Returns an Array def extensions - basename, *segments = File.basename(name).split(".") + basename, *segments = name.split(".") segments.map.with_index do |segment, index| "." + segments[index..-1].join(".") diff --git a/lib/linguist/generated.rb b/lib/linguist/generated.rb index 291fa8bd..50dbc58d 100644 --- a/lib/linguist/generated.rb +++ b/lib/linguist/generated.rb @@ -51,20 +51,20 @@ module Linguist # # Return true or false def generated? - minified_files? || - compiled_coffeescript? || xcode_file? || - generated_parser? || - generated_net_docfile? || generated_net_designer_file? || - generated_postscript? || - generated_protocol_buffer? || - generated_jni_header? || composer_lock? || node_modules? || godeps? || - vcr_cassette? || - generated_by_zephir? + generated_by_zephir? || + minified_files? || + compiled_coffeescript? || + generated_parser? || + generated_net_docfile? || + generated_postscript? || + generated_protocol_buffer? || + generated_jni_header? || + vcr_cassette? end # Internal: Is the blob an Xcode file? diff --git a/lib/linguist/heuristics.rb b/lib/linguist/heuristics.rb index c96a93f0..5e603f23 100644 --- a/lib/linguist/heuristics.rb +++ b/lib/linguist/heuristics.rb @@ -70,10 +70,10 @@ module Linguist end disambiguate "Objective-C", "C++", "C" do |data| - if (/@(interface|class|protocol|property|end|synchronised|selector|implementation)\b/.match(data)) + if (/^[ \t]*@(interface|class|protocol|property|end|synchronised|selector|implementation)\b/.match(data)) Language["Objective-C"] elsif (/^\s*#\s*include <(cstdint|string|vector|map|list|array|bitset|queue|stack|forward_list|unordered_map|unordered_set|(i|o|io)stream)>/.match(data) || - /^\s*template\s*_n`, + * scale it to match dimensions and translate the node to pos + * @param sceneMgr the scene manager to use + */ + virtual void setup(Ogre::SceneManager* sceneMgr); + + /** + * @brief the update method + * @details this method should be called on each world update. + * Even though the method is necessary declared, the main impl of + * a static entity should be empty since it is not updated by physics + * However, a Dynamic entity should implement this function in order to: + * 1) Get from the physics engine the actor position in the physic world + * 2) Update the OgreEntity position and rotation from the previous actor + * @return whether it was successful or not, if falsey engine should stop + */ + virtual bool update(void); + + protected: + std::string mMesh = "cube.mesh"; + std::string mId; + std::string mMaterial; + Ogre::Vector3 mDimensions; + Ogre::Vector3 mPosition; + Ogre::Entity* mEntity; + Ogre::SceneNode* mNode; + + }; +} + + +#endif \ No newline at end of file diff --git a/samples/Zephir/filenames/exception.zep.c b/samples/C/exception.zep.c similarity index 100% rename from samples/Zephir/filenames/exception.zep.c rename to samples/C/exception.zep.c diff --git a/samples/Zephir/filenames/exception.zep.h b/samples/C/exception.zep.h similarity index 100% rename from samples/Zephir/filenames/exception.zep.h rename to samples/C/exception.zep.h diff --git a/samples/CMake/sample1.cmake b/samples/CMake/sample1.cmake new file mode 100644 index 00000000..c4b23485 --- /dev/null +++ b/samples/CMake/sample1.cmake @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 2.6) + +enable_testing() + +set(CMAKE_BUILD_TYPE debug) + +include_directories("/usr/local/include") + +find_library(ssl_LIBRARY NAMES ssl PATHS "/usr/local/lib") + +add_custom_command(OUTPUT "ver.c" "ver.h" COMMAND ./ver.sh) + +add_executable(foo foo.c bar.c baz.c ver.c) + +target_link_libraries(foo ${ssl_LIBRARY}) diff --git a/samples/CMake/sample2.cmake b/samples/CMake/sample2.cmake new file mode 100644 index 00000000..7411b5d6 --- /dev/null +++ b/samples/CMake/sample2.cmake @@ -0,0 +1,25 @@ +cmake_minimum_required(VERSION 2.8 FATAL_ERROR) + +project(PCLVisualizer) +target_link_libraries (PCLVisualizer ${PCL_LIBRARIES}) + +#it seems it's needed only on OS X 10.9 +find_package(GLEW REQUIRED) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I/usr/include -v") + +find_package(PCL 1.7 REQUIRED) + +include_directories(${PCL_INCLUDE_DIRS}) +link_directories(${PCL_LIBRARY_DIRS}) +add_definitions(${PCL_DEFINITIONS}) + +set(PCL_BUILD_TYPE Release) + +file(GLOB PCL_openni_viewer_SRC + "src/*.h" + "src/*.cpp" +) +add_executable(PCLVisualizer ${PCL_openni_viewer_SRC}) + +#add this line to solve probem in mac os x 10.9 +target_link_libraries(PCLVisualizer ${PCL_COMMON_LIBRARIES} ${PCL_IO_LIBRARIES} ${PCL_VISUALIZATION_LIBRARIES} ${PCL_FEATURES_LIBRARIES}) \ No newline at end of file diff --git a/samples/CMake/sample3.cmake b/samples/CMake/sample3.cmake new file mode 100644 index 00000000..7bd9ea77 --- /dev/null +++ b/samples/CMake/sample3.cmake @@ -0,0 +1,33 @@ +# Specifications for building user and development documentation. +# +# ==================================================================== +# Copyright (c) 2009 Ian Blumel. All rights reserved. +# +# This software is licensed as described in the file LICENSE, which +# you should have received as part of this distribution. +# ==================================================================== + +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) + +FIND_FILE( SPHINX sphinx-build.exe) + +# If we are windows call to the make.bat file, otherwise rely on the Makefile +# to handle the processing. +IF(WIN32) + SET(SPHINX_MAKE make.bat) +ELSE(WIN32) + SET(SPHINX_MAKE make) +ENDIF(WIN32) + +ADD_CUSTOM_TARGET( + doc_usr + COMMAND ${SPHINX_MAKE} html + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/usr +) + +ADD_CUSTOM_TARGET( + doc_dev + COMMAND ${SPHINX_MAKE} html + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/dev +) + diff --git a/samples/CMake/sample4.cmake b/samples/CMake/sample4.cmake new file mode 100644 index 00000000..e3c123a0 --- /dev/null +++ b/samples/CMake/sample4.cmake @@ -0,0 +1,33 @@ +cmake_minimum_required (VERSION 2.6) + +set (CMAKE_RUNTIME_OUTPUT_DIRECTORY "bin") + +list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/vala) +find_package(Vala REQUIRED) +include(ValaPrecompile) +include(ValaVersion) +ensure_vala_version("0.11.0" MINIMUM) + +project (template C) + +find_package(PkgConfig) + +pkg_check_modules(GOBJECT REQUIRED gobject-2.0) +add_definitions(${GOBJECT_CFLAGS} ${GOBJECT_CFLAGS_OTHER}) +link_libraries(${GOBJECT_LIBRARIES}) +link_directories(${GOBJECT_LIBRARY_DIRS}) + + +vala_precompile(VALA_C + src/template.vala +PACKAGES +OPTIONS + --thread +CUSTOM_VAPIS +GENERATE_VAPI +GENERATE_HEADER +DIRECTORY + gen +) + +add_executable("template" ${VALA_C}) diff --git a/samples/CMake/sample5.cmake b/samples/CMake/sample5.cmake new file mode 100644 index 00000000..f87136e7 --- /dev/null +++ b/samples/CMake/sample5.cmake @@ -0,0 +1,89 @@ +# - Check if the STDCALL function exists. +# This works for non-cdecl functions (kernel32 functions, for example) +# CHECK_STDCALL_FUNCTION_EXISTS(FUNCTION FUNCTION_DUMMY_ARGS VARIABLE) +# - macro which checks if the stdcall function exists +# FUNCTION_DECLARATION - the definition of the function ( e.g.: Sleep(500) ) +# VARIABLE - variable to store the result +# +# The following variables may be set before calling this macro to +# modify the way the check is run: +# +# CMAKE_REQUIRED_FLAGS = string of compile command line flags +# CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar) +# CMAKE_REQUIRED_INCLUDES = list of include directories +# CMAKE_REQUIRED_LIBRARIES = list of libraries to link +# CMAKE_EXTRA_INCLUDE_FILES = list of extra includes to check in + +MACRO(CHECK_STDCALL_FUNCTION_EXISTS FUNCTION_DECLARATION VARIABLE) + IF("${VARIABLE}" MATCHES "^${VARIABLE}$") + #get includes + SET(CHECK_STDCALL_FUNCTION_PREMAIN) + FOREACH(def ${CMAKE_EXTRA_INCLUDE_FILES}) + SET(CHECK_STDCALL_FUNCTION_PREMAIN "${CHECK_STDCALL_FUNCTION_PREMAIN}#include \"${def}\"\n") + ENDFOREACH(def) + + #add some default includes + IF ( HAVE_WINDOWS_H ) + SET(CHECK_STDCALL_FUNCTION_PREMAIN "${CHECK_STDCALL_FUNCTION_PREMAIN}#include \"windows.h\"\n") + ENDIF ( HAVE_WINDOWS_H ) + IF ( HAVE_UNISTD_H ) + SET(CHECK_STDCALL_FUNCTION_PREMAIN "${CHECK_STDCALL_FUNCTION_PREMAIN}#include \"unistd.h\"\n") + ENDIF ( HAVE_UNISTD_H ) + IF ( HAVE_DIRECT_H ) + SET(CHECK_STDCALL_FUNCTION_PREMAIN "${CHECK_STDCALL_FUNCTION_PREMAIN}#include \"direct.h\"\n") + ENDIF ( HAVE_DIRECT_H ) + IF ( HAVE_IO_H ) + SET(CHECK_STDCALL_FUNCTION_PREMAIN "${CHECK_STDCALL_FUNCTION_PREMAIN}#include \"io.h\"\n") + ENDIF ( HAVE_IO_H ) + IF ( HAVE_SYS_TIMEB_H ) + SET(CHECK_STDCALL_FUNCTION_PREMAIN "${CHECK_STDCALL_FUNCTION_PREMAIN}#include \"sys/timeb.h\"\n") + ENDIF ( HAVE_SYS_TIMEB_H ) + + STRING(REGEX REPLACE "(\\(.*\\))" "" CHECK_STDCALL_FUNCTION_EXISTS_FUNCTION ${FUNCTION_DECLARATION} ) + + SET(MACRO_CHECK_STDCALL_FUNCTION_DEFINITIONS "${CMAKE_REQUIRED_FLAGS}") + MESSAGE(STATUS "Looking for ${CHECK_STDCALL_FUNCTION_EXISTS_FUNCTION}") + + IF(CMAKE_REQUIRED_LIBRARIES) + SET(CHECK_STDCALL_FUNCTION_EXISTS_ADD_LIBRARIES + "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}") + ELSE(CMAKE_REQUIRED_LIBRARIES) + SET(CHECK_STDCALL_FUNCTION_EXISTS_ADD_LIBRARIES) + ENDIF(CMAKE_REQUIRED_LIBRARIES) + + IF(CMAKE_REQUIRED_INCLUDES) + SET(CHECK_STDCALL_FUNCTION_EXISTS_ADD_INCLUDES + "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}") + ELSE(CMAKE_REQUIRED_INCLUDES) + SET(CHECK_STDCALL_FUNCTION_EXISTS_ADD_INCLUDES) + ENDIF(CMAKE_REQUIRED_INCLUDES) + + SET(CHECK_STDCALL_FUNCTION_DECLARATION ${FUNCTION_DECLARATION}) + CONFIGURE_FILE("${clucene-shared_SOURCE_DIR}/cmake/CheckStdCallFunctionExists.cpp.in" + "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckStdCallFunctionExists.cpp" IMMEDIATE @ONLY) + FILE(READ "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckStdCallFunctionExists.cpp" + CHECK_STDCALL_FUNCTION_CONTENT) + + TRY_COMPILE(${VARIABLE} + ${CMAKE_BINARY_DIR} + "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckStdCallFunctionExists.cpp" + COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} + CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_STDCALL_FUNCTION_DEFINITIONS} + "${CHECK_STDCALL_FUNCTION_EXISTS_ADD_LIBRARIES}" + "${CHECK_STDCALL_FUNCTION_EXISTS_ADD_INCLUDES}" + OUTPUT_VARIABLE OUTPUT) + IF(${VARIABLE}) + SET(${VARIABLE} 1 CACHE INTERNAL "Have function ${FUNCTION_DECLARATION}") + MESSAGE(STATUS "Looking for ${FUNCTION_DECLARATION} - found") + FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log + "Determining if the stdcall function ${FUNCTION_DECLARATION} exists passed with the following output:\n" + "${OUTPUT}\nCheckStdCallFunctionExists.cpp:\n${CHECK_STDCALL_FUNCTION_CONTENT}\n\n") + ELSE(${VARIABLE}) + MESSAGE(STATUS "Looking for ${FUNCTION_DECLARATION} - not found") + SET(${VARIABLE} "" CACHE INTERNAL "Have function ${FUNCTION_DECLARATION}") + FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log + "Determining if the stdcall function ${FUNCTION_DECLARATION} exists failed with the following output:\n" + "${OUTPUT}\nCheckStdCallFunctionExists.cpp:\n${CHECK_STDCALL_FUNCTION_CONTENT}\n\n") + ENDIF(${VARIABLE}) + ENDIF("${VARIABLE}" MATCHES "^${VARIABLE}$") +ENDMACRO(CHECK_STDCALL_FUNCTION_EXISTS) diff --git a/samples/CMake/uninstall.cmake.in b/samples/CMake/uninstall.cmake.in new file mode 100644 index 00000000..a5b7436f --- /dev/null +++ b/samples/CMake/uninstall.cmake.in @@ -0,0 +1,22 @@ +IF (NOT EXISTS "@PROJECT_BINARY_DIR@/install_manifest.txt") + MESSAGE (FATAL_ERROR "Cannot find install manifest: \"@PROJECT_BINARY_DIR@/install_manifest.txt\"") +ENDIF (NOT EXISTS "@PROJECT_BINARY_DIR@/install_manifest.txt") + +FILE (READ "@PROJECT_BINARY_DIR@/install_manifest.txt" files) +STRING (REGEX REPLACE "\n" ";" files "${files}") +FOREACH (file ${files}) + MESSAGE (STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"") + IF (EXISTS "$ENV{DESTDIR}${file}") + EXEC_PROGRAM ( + "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" + OUTPUT_VARIABLE rm_out + RETURN_VALUE rm_retval + ) + IF (NOT "${rm_retval}" STREQUAL 0) + MESSAGE (FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"") + ENDIF (NOT "${rm_retval}" STREQUAL 0) + ELSE (EXISTS "$ENV{DESTDIR}${file}") + MESSAGE (STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.") + ENDIF (EXISTS "$ENV{DESTDIR}${file}") +ENDFOREACH (file) + diff --git a/samples/CartoCSS/amenity-points.mss b/samples/CartoCSS/amenity-points.mss new file mode 100644 index 00000000..a7b94ea0 --- /dev/null +++ b/samples/CartoCSS/amenity-points.mss @@ -0,0 +1,1879 @@ +@marina-text: #576ddf; // also swimming_pool +@wetland-text: darken(#017fff, 10%); /* Also for marsh */ +@mud-text: darken(#aea397, 20%); +@shop-icon: #ac39ac; +@transportation-icon: #0092da; +@transportation-text: #0066ff; +@airtransport: #8461C4; + +@landcover-font-size: 10; +@landcover-font-size-big: 12; +@landcover-font-size-bigger: 15; +@landcover-wrap-width-size: 25; +@landcover-wrap-width-size-big: 35; +@landcover-wrap-width-size-bigger: 45; +@landcover-face-name: @oblique-fonts; + +@standard-wrap-width: 30; + +.points { + [feature = 'tourism_alpine_hut'][zoom >= 13] { + point-file: url('symbols/alpinehut.p.16.png'); + point-placement: interior; + } + + [feature = 'amenity_shelter'][zoom >= 16] { + point-file: url('symbols/shelter2.p.16.png'); + point-placement: interior; + } + + [feature = 'amenity_atm'][zoom >= 17] { + point-file: url('symbols/atm2.p.16.png'); + point-placement: interior; + } + + [feature = 'amenity_bank'][zoom >= 17] { + point-file: url('symbols/bank2.p.16.png'); + point-placement: interior; + } + + [feature = 'amenity_bar'][zoom >= 17] { + point-file: url('symbols/bar.p.20.png'); + point-placement: interior; + } + + [feature = 'amenity_bicycle_rental'][zoom >= 17] { + point-file: url('symbols/rental_bicycle.p.20.png'); + point-placement: interior; + } + + [feature = 'highway_bus_stop'] { + [zoom >= 16] { + marker-file: url('symbols/square.svg'); + marker-fill: @transportation-icon; + marker-placement: interior; + marker-width: 6; + } + [zoom >= 17] { + marker-file: url('symbols/bus_stop.p.12.png'); + marker-width: 12; + } + } + + [feature = 'amenity_bus_station'][zoom >= 16] { + point-file: url('symbols/bus_station.n.16.png'); + point-placement: interior; + } + + [feature = 'highway_traffic_signals'][zoom >= 17] { + marker-file: url('symbols/traffic_light.svg'); + marker-fill: #0a0a0a; + marker-placement: interior; + } + + [feature = 'amenity_cafe'][zoom >= 17] { + point-file: url('symbols/cafe.p.16.png'); + point-placement: interior; + } + + [feature = 'tourism_camp_site'][zoom >= 16] { + point-file: url('symbols/camping.n.16.png'); + point-placement: interior; + } + + [feature = 'highway_ford'][zoom >= 16] { + point-file: url('symbols/transport_ford.p.16.png'); + point-placement: interior; + } + + [feature = 'tourism_caravan_site'][zoom >= 16] { + point-file: url('symbols/caravan_park.p.24.png'); + point-placement: interior; + } + + [feature = 'amenity_car_sharing'][zoom >= 16] { + point-file: url('symbols/car_share.p.16.png'); + point-placement: interior; + } + + [feature = 'tourism_chalet'][zoom >= 17] { + point-file: url('symbols/chalet.p.16.png'); + point-placement: interior; + } + + [feature = 'amenity_cinema'][zoom >= 16] { + point-file: url('symbols/cinema.p.24.png'); + point-placement: interior; + } + + [feature = 'amenity_fire_station'][zoom >= 16] { + point-file: url('symbols/firestation.p.16.png'); + point-placement: interior; + } + + [feature = 'amenity_fuel'][zoom >= 17] { + point-file: url('symbols/fuel.p.16.png'); + point-placement: interior; + } + + [feature = 'tourism_guest_house'][zoom >= 17] { + point-file: url('symbols/guest_house.p.16.png'); + point-placement: interior; + } + + [feature = 'amenity_hospital'][zoom >= 15] { + point-file: url('symbols/hospital.p.16.png'); + point-placement: interior; + } + + [feature = 'tourism_hostel'][zoom >= 17] { + point-file: url('symbols/hostel.p.20.png'); + point-placement: interior; + } + + [feature = 'tourism_hotel'][zoom >= 17] { + point-file: url('symbols/hotel2.p.20.png'); + point-placement: interior; + } + + [feature = 'tourism_motel'][zoom >= 17] { + point-file: url('symbols/motel.p.20.png'); + point-placement: interior; + } + + [feature = 'tourism_information'][zoom >= 17] { + point-file: url('symbols/information.p.16.png'); + point-placement: interior; + } + + [feature = 'amenity_embassy'][zoom >= 17] { + point-file: url('symbols/embassy.png'); + point-placement: interior; + } + + [feature = 'amenity_library'][zoom >= 16] { + point-file: url('symbols/library.p.20.png'); + point-placement: interior; + } + + [feature = 'amenity_courthouse'][zoom > 16] { + point-file: url('symbols/amenity_court.p.20.png'); + point-placement: interior; + } + + [feature = 'waterway_lock'], + [feature = 'lock_yes'] { + [zoom >= 15] { + marker-fill: #969494; + marker-width: 9; + marker-line-width: 0; + marker-placement: interior; + } + } + + [feature = 'man_made_mast'][zoom >= 17] { + point-file: url('symbols/communications.p.20.png'); + point-placement: interior; + } + + [feature = 'tourism_museum'][zoom >= 16] { + point-file: url('symbols/museum.p.16.png'); + point-placement: interior; + } + + [feature = 'amenity_parking'][zoom >= 16] { + marker-file: url('symbols/parking.svg'); + marker-placement: interior; + marker-clip: false; + marker-fill: @transportation-icon; + [access != ''][access != 'public'][access != 'yes'] { + marker-opacity: 0.33; + } + } + + [feature = 'amenity_pharmacy'][zoom >= 17] { + point-file: url('symbols/pharmacy.p.16.png'); + point-placement: interior; + } + + [feature = 'amenity_place_of_worship'][zoom >= 16] { + point-file: url('symbols/place_of_worship3.p.16.png'); + point-placement: interior; + [religion = 'christian'] { + point-file: url('symbols/christian3.p.14.png'); + [denomination = 'jehovahs_witness']{ + point-file: url('symbols/place_of_worship3.p.16.png'); + } + } + [religion = 'muslim'] { + point-file: url('symbols/islamic3.p.16.png'); + } + [religion = 'sikh'] { + point-file: url('symbols/sikh3.p.16.png'); + } + [religion = 'jewish'] { + point-file: url('symbols/jewish3.p.16.png'); + } + [religion = 'hindu'] { + point-file: url('symbols/hindu.png'); + } + [religion = 'buddhist'] { + point-file: url('symbols/buddhist.png'); + } + [religion = 'shinto'] { + point-file: url('symbols/shinto.png'); + } + [religion = 'taoist'] { + point-file: url('symbols/taoist.png'); + } + } + + [feature = 'amenity_police'][zoom >= 16] { + point-file: url('symbols/police.p.16.png'); + point-placement: interior; + } + + [feature = 'amenity_post_box'][zoom >= 17] { + point-file: url('symbols/post_box.p.16.png'); + point-placement: interior; + } + + [feature = 'amenity_post_office'][zoom >= 17] { + point-file: url('symbols/post_office.p.16.png'); + point-placement: interior; + } + + [feature = 'amenity_pub'][zoom >= 17] { + point-file: url('symbols/pub.p.16.png'); + point-placement: interior; + } + + [feature = 'amenity_biergarten'][zoom >= 17] { + point-file: url('symbols/biergarten.p.16.png'); + point-placement: interior; + } + + [feature = 'amenity_recycling'][zoom >= 16] { + point-file: url('symbols/recycling.p.16.png'); + point-placement: interior; + } + + [feature = 'amenity_restaurant'][zoom >= 17] { + point-file: url('symbols/restaurant.p.16.png'); + point-placement: interior; + } + + [feature = 'amenity_fast_food'][zoom >= 17] { + point-file: url('symbols/fast_food.png'); + point-placement: interior; + } + + [feature = 'amenity_telephone'][zoom >= 17] { + point-file: url('symbols/telephone.p.16.png'); + point-placement: interior; + } + + [feature = 'amenity_emergency_phone'][zoom >= 17] { + point-file: url('symbols/sosphone.png'); + point-placement: interior; + } + + [feature = 'amenity_theatre'][zoom >= 16] { + point-file: url('symbols/theatre.p.20.png'); + point-placement: interior; + } + + [feature = 'amenity_toilets'][zoom >= 17] { + point-file: url('symbols/toilets.p.20.png'); + point-placement: interior; + } + + [feature = 'amenity_drinking_water'][zoom >= 17] { + point-file: url('symbols/food_drinkingtap.p.20.png'); + point-placement: interior; + } + + [feature = 'amenity_prison'][zoom >= 17] { + point-file: url('symbols/amenity_prison.p.20.png'); + point-placement: interior; + } + + [feature = 'tourism_viewpoint'][zoom >= 16] { + point-file: url('symbols/view_point.p.16.png'); + point-placement: interior; + } + + [feature = 'man_made_water_tower'][zoom >= 17] { + point-file: url('symbols/tower_water.p.20.png'); + point-placement: interior; + } + + [feature = 'historic_memorial'][zoom >= 17] { + point-file: url('symbols/tourist_memorial.p.20.png'); + point-placement: interior; + } + + [feature = 'historic_archaeological_site'][zoom >= 16] { + point-file: url('symbols/tourist_archaeological2.glow.24.png'); + point-placement: interior; + } + + [feature = 'shop_other'][zoom >= 17] { + marker-fill: @shop-icon; + marker-width: 6; + marker-line-width: 0; + marker-placement: interior; + marker-clip: false; + } + + [feature = 'shop_supermarket'][zoom >= 16] { + marker-file: url('symbols/shop_supermarket.svg'); + marker-placement: interior; + marker-clip: false; + marker-fill: @shop-icon; + } + + [feature = 'shop_bakery'][zoom >= 17] { + marker-file: url('symbols/shop_bakery.p.16.png'); + marker-placement: interior; + marker-clip: false; + } + + [feature = 'shop_butcher'][zoom >= 17] { + marker-file: url('symbols/shop_butcher.png'); + marker-placement: interior; + marker-clip: false; + } + + [feature = 'shop_clothes'], + [feature = 'shop_fashion'] { + [zoom >= 17] { + marker-file: url('symbols/shop_clothes.svg'); + marker-placement: interior; + marker-clip: false; + marker-fill: @shop-icon; + } + } + + [feature = 'shop_convenience'][zoom >= 17] { + marker-file: url('symbols/shop_convenience.svg'); + marker-placement: interior; + marker-clip: false; + marker-fill: @shop-icon; + } + + [feature = 'shop_department_store'][zoom >= 16] { + point-file: url('symbols/department_store.p.16.png'); + point-placement: interior; + } + + [feature = 'shop_doityourself'][zoom >= 17] { + marker-file: url('symbols/shop_diy.p.16.png'); + marker-placement: interior; + marker-clip: false; + } + + [feature = 'shop_florist'][zoom >= 17] { + marker-file: url('symbols/florist.p.16.png'); + marker-placement: interior; + marker-clip: false; + } + + [feature = 'shop_hairdresser'][zoom >= 17] { + marker-file: url('symbols/shop_hairdresser.p.16.png'); + marker-placement: interior; + marker-clip: false; + } + + [feature = 'shop_car'][zoom >= 17] { + marker-file: url('symbols/shop_car.svg'); + marker-placement: interior; + marker-clip: false; + marker-fill: @shop-icon; + } + + [feature = 'shop_car_repair'][zoom >= 17] { + marker-file: url('symbols/shopping_car_repair.p.16.png'); + marker-placement: interior; + marker-clip: false; + } + + [feature = 'shop_bicycle'][zoom >= 17] { + marker-file: url('symbols/shopping_bicycle.p.16.png'); + marker-placement: interior; + marker-clip: false; + } + + [feature = 'leisure_playground'][zoom >= 17] { + point-file: url('symbols/playground.p.20.png'); + point-placement: interior; + } + + [feature = 'tourism_picnic_site'][zoom >= 16] { + point-file: url('symbols/picnic.p.16.png'); + point-placement: interior; + } + + [feature = 'leisure_picnic_table'][zoom >= 17] { + point-file: url('symbols/picnic.p.16.png'); + point-placement: interior; + } + + [feature = 'leisure_slipway'][zoom >= 17] { + point-file: url('symbols/transport_slipway.p.20.png'); + point-placement: interior; + } + + [feature = 'aeroway_helipad'][zoom >= 16]::aeroway { + marker-file: url('symbols/helipad.svg'); + marker-clip: false; + marker-fill: @airtransport; + } + + [feature = 'aeroway_aerodrome'][zoom >= 10][zoom < 14]::aeroway { + marker-file: url('symbols/aerodrome.svg'); + marker-clip: false; + marker-fill: @airtransport; + } + + [feature = 'man_made_lighthouse'][zoom >= 15]::man_made { + point-file: url('symbols/lighthouse.p.20.png'); + point-placement: interior; + } + + [feature = 'natural_peak'][zoom >= 11]::natural { + marker-file: url('symbols/peak.svg'); + marker-fill: #d08f55; + marker-placement: interior; + } + + [feature = 'natural_volcano'][zoom >= 11]::natural { + marker-file: url('symbols/peak.svg'); + marker-fill: #d40000; + marker-placement: interior; + } + + [feature = 'natural_saddle'][zoom >= 15]::natural { + marker-file: url('symbols/saddle.svg'); + marker-fill: #d08f55; + marker-placement: interior; + } + + [feature = 'natural_cave_entrance'][zoom >= 15]::natural { + point-file: url('symbols/poi_cave.p.16.png'); + point-placement: interior; + } + + [feature = 'natural_spring'][zoom >= 14]::natural { + marker-file: url('symbols/spring.svg'); + marker-placement: interior; + } + + [feature = 'natural_tree'][zoom >= 16]::natural { + marker-placement: interior; + marker-ignore-placement: true; + marker-line-width: 0; + marker-width: 3; + marker-fill: #239c45; + [zoom >= 17] { + marker-line-width: 1; + marker-line-color: #8ef2ab; + marker-width: 4; + } + } + + [feature = 'power_generator']['generator:source' = 'wind']::power, + [feature = 'power_generator'][power_source = 'wind']::power { + [zoom >= 15] { + point-file: url('symbols/power_wind.png'); + point-placement: interior; + } + } + + [feature = 'man_made_windmill'][zoom >= 16]::man_made { + point-file: url('symbols/windmill.png'); + point-placement: interior; + } + + [feature = 'man_made_mast'][zoom >= 17]::man_made { + point-file: url('symbols/communications.p.20.png'); + point-placement: interior; + } +} + +.amenity-low-priority { + [railway = 'level_crossing'][zoom >= 14]::railway { + point-file: url('symbols/level_crossing.svg'); + point-placement: interior; + [zoom >= 16] { + point-file: url('symbols/level_crossing2.svg'); + } + } + + [highway = 'mini_roundabout'][zoom >= 16]::highway { + marker-file: url('symbols/mini_roundabout.svg'); + marker-placement: interior; + } + + [barrier = 'gate']::barrier { + [zoom >= 16] { + marker-file: url('symbols/gate.svg'); + marker-placement: interior; + } + } + + [barrier = 'lift_gate'][zoom >= 16]::barrier { + marker-file: url('symbols/liftgate.svg'); + marker-fill: #3f3f3f; + marker-placement: interior + } + + [barrier = 'bollard'], + [barrier = 'block'] { + [zoom >= 16] { + marker-width: 3; + marker-line-width: 0; + marker-fill: #7d7c7c; + marker-placement: interior; + + [zoom >= 18] { + marker-width: 4; + } + } + } +} + +.text-low-zoom[zoom < 10], +.text[zoom >= 10] { + [feature = 'place_island'][zoom >= 7][way_pixels > 3000], + [feature = 'place_island'][zoom >= 16], + [feature = 'place_islet'][zoom >= 14][way_pixels > 3000], + [feature = 'place_islet'][zoom >= 17] { + text-name: "[name]"; + text-fill: #000; + text-size: 10; + [way_pixels > 12000] { text-size: 12; } + [way_pixels > 48000] { text-size: 15; } + text-face-name: @oblique-fonts; + text-halo-radius: 1; + text-wrap-width: @standard-wrap-width; + text-placement: interior; + } + + [feature = 'amenity_pub'], + [feature = 'amenity_restaurant'], + [feature = 'amenity_cafe'], + [feature = 'amenity_fast_food'], + [feature = 'amenity_biergarten'], + [feature = 'amenity_bar'] { + [zoom >= 17] { + text-name: "[name]"; + text-fill: #734a08; + text-size: 10; + text-dy: 11; + text-face-name: @bold-fonts; + text-halo-radius: 1; + text-wrap-width: @standard-wrap-width; + text-placement: interior; + [feature = 'amenity_bar']{ + text-dy: 13; + } + } + } + + [feature = 'amenity_library'], + [feature = 'amenity_theatre'], + [feature = 'amenity_courthouse'], + [feature = 'amenity_cinema'] { + [zoom >= 17] { + text-name: "[name]"; + text-size: 10; + text-fill: #734a08; + text-dy: 13; + text-face-name: @bold-fonts; + text-halo-radius: 1; + text-wrap-width: @standard-wrap-width; + text-placement: interior; + [feature = 'amenity_cinema'] { + text-dy: 15; + } + } + } + + [feature = 'amenity_parking'][zoom >= 17] { + text-name: "[name]"; + text-size: 9; + text-fill: @transportation-text; + text-dy: 9; + text-face-name: @book-fonts; + text-halo-radius: 1; + text-wrap-width: @standard-wrap-width; + text-placement: interior; + [access != ''][access != 'public'][access != 'yes'] { + text-fill: #66ccaf; + } + } + + [feature = 'amenity_police'][zoom >= 17] { + text-name: "[name]"; + text-size: 10; + text-fill: #734a08; + text-dy: 11; + text-face-name: @book-fonts; + text-halo-radius: 1; + text-wrap-width: @standard-wrap-width; + text-placement: interior; + } + + [feature = 'amenity_fire_station'][zoom >= 17] { + text-name: "[name]"; + text-size: 10; + text-fill: #734a08; + text-dy: 11; + text-face-name: @book-fonts; + text-halo-radius: 1; + text-wrap-width: @standard-wrap-width; + text-placement: interior; + } + + [feature = 'amenity_place_of_worship'][zoom >= 17] { + text-name: "[name]"; + text-size: 10; + text-fill: #000033; + text-dy: 12; + text-face-name: @book-fonts; + text-halo-radius: 1; + text-wrap-width: @standard-wrap-width; + text-placement: interior; + } + + [feature = 'natural_wood'][is_building = 'no'] { + [zoom >= 8][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@wood, 40%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'natural_peak'], + [feature = 'natural_volcano'] { + [zoom >= 13] { + text-name: "[name]"; + text-size: 10; + text-fill: brown; + text-dy: 7; + text-face-name: @book-fonts; + text-halo-radius: 1; + text-wrap-width: @standard-wrap-width; + text-placement: interior; + ele/text-name: "[ele]"; + ele/text-size: 9; + ele/text-fill: brown; + ele/text-dy: 6; + ele/text-face-name: @oblique-fonts; + ele/text-halo-radius: 1; + ele/text-placement: interior; + [name != ''] { + ele/text-dy: 19; + } + } + } + + [feature = 'natural_saddle'] { + [zoom >= 15] { + text-name: "[name]"; + text-size: 10; + text-fill: brown; + text-dy: 7; + text-face-name: @book-fonts; + text-halo-radius: 1; + text-wrap-width: @standard-wrap-width; + text-placement: interior; + ele/text-name: "[ele]"; + ele/text-size: 9; + ele/text-fill: brown; + ele/text-dy: 6; + ele/text-face-name: @oblique-fonts; + ele/text-halo-radius: 1; + ele/text-placement: interior; + [name != ''] { + ele/text-dy: 19; + } + } + } + + [feature = 'natural_cave_entrance'][zoom >= 15] { + text-name: "[name]"; + text-size: 10; + text-fill: brown; + text-dy: 11; + text-face-name: @book-fonts; + text-halo-radius: 1; + text-wrap-width: @standard-wrap-width; + text-placement: interior; + } + + [feature = 'historic_memorial'][zoom >= 17] { + text-name: "[name]"; + text-size: 9; + text-fill: brown; + text-dy: 13; + text-face-name: @book-fonts; + text-halo-radius: 1; + text-wrap-width: @standard-wrap-width; + text-placement: interior; + } + + [feature = 'historic_archaeological_site'][zoom >= 17] { + text-name: "[name]"; + text-size: 9; + text-fill: brown; + text-dy: 15; + text-face-name: @book-fonts; + text-halo-radius: 1; + text-wrap-width: @standard-wrap-width; + text-placement: interior; + } + + [feature = 'natural_water'], + [feature = 'natural_lake'], + [feature = 'landuse_reservoir'], + [feature = 'landuse_basin'] { + [way_area >= 40000000][zoom >= 10], + [way_area >= 10000000][zoom >= 11], + [way_area >= 2400000][zoom >= 12], + [way_area >= 600000][zoom >= 13], + [way_area >= 150000][zoom >= 14], + [way_area >= 80000][zoom >= 15], + [way_area >= 20000][zoom >= 16], + [zoom >= 17] { + text-name: "[name]"; + text-size: 12; + text-fill: @water-text; + text-face-name: @oblique-fonts; + text-halo-radius: 1; + text-wrap-width: @standard-wrap-width; + text-placement: interior; + } + } + + [feature = 'natural_mud'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: @mud-text; + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'natural_wetland'][is_building = 'no'], + [feature = 'natural_marsh'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: @wetland-text; + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'leisure_swimming_pool'][is_building = 'no'] { + [zoom >= 14][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: @marina-text; + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'leisure_sports_centre'][is_building = 'no'], + [feature = 'leisure_stadium'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@stadium, 30%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'leisure_track'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@track, 40%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'leisure_pitch'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@pitch, 40%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'leisure_playground'] { + [way_area >= 150000][zoom >= 14], + [way_area >= 80000][zoom >= 15], + [way_area >= 20000][zoom >= 16], + [zoom >= 17] { + text-name: "[name]"; + text-size: 11; + text-dy: 13; + text-fill: darken(@park, 60%); + text-face-name: @book-fonts; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @standard-wrap-width; + text-placement: interior; + } + } + + [feature = 'leisure_park'][is_building = 'no'], + [feature = 'leisure_recreation_ground'][is_building = 'no'], + [feature = 'landuse_recreation_ground'][is_building = 'no'], + [feature = 'landuse_conservation'][is_building = 'no'], + [feature = 'landuse_village_green'][is_building = 'no'], + [feature = 'leisure_common'][is_building = 'no'], + [feature = 'leisure_garden'][is_building = 'no'], + [feature = 'leisure_golf_course'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@park, 60%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'boundary_national_park'][is_building = 'no'], + [feature = 'leisure_nature_reserve'][is_building = 'no'] { + [zoom >= 8][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@park, 70%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'landuse_quarry'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@quarry, 60%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'landuse_vineyard'][is_building = 'no'], + [feature = 'landuse_orchard'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@vineyard, 50%); + text-face-name: @landcover-face-name; + text-halo-radius: 1.5; /* extra halo needed to overpower the vineyard polygon pattern */ + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'landuse_cemetery'][is_building = 'no'], + [feature = 'amenity_grave_yard'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@cemetery, 50%); + text-face-name: @landcover-face-name; + text-halo-radius: 1.5; /* extra halo needed to overpower the cemetery polygon pattern */ + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'landuse_residential'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@residential, 50%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'landuse_garages'][is_building = 'no'] { + [zoom >= 13][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@garages, 50%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'landuse_field'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@field, 50%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'landuse_meadow'][is_building = 'no'], + [feature = 'landuse_grass'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@grass, 50%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'landuse_allotments'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@allotments, 50%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'landuse_forest'][is_building = 'no'] { + [zoom >= 8][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@forest, 30%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'landuse_farmyard'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@farmyard, 50%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + [feature = 'landuse_farm'][is_building = 'no'], + [feature = 'landuse_farmland'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@farmland, 50%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'shop_mall'], + [feature = 'landuse_retail'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@retail, 50%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'landuse_industrial'][is_building = 'no'], + [feature = 'landuse_railway'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@industrial, 60%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'landuse_commercial'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@commercial, 60%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'landuse_brownfield'][is_building = 'no'], + [feature = 'landuse_landfill'][is_building = 'no'], + [feature = 'landuse_construction'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@construction, 50%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'natural_bay'][zoom >= 14] { + text-name: "[name]"; + text-size: 10; + text-fill: #6699cc; + text-face-name: @book-fonts; + text-halo-radius: 1; + text-wrap-width: @standard-wrap-width; + text-placement: interior; + } + + [feature = 'natural_spring'][zoom >= 16] { + text-name: "[name]"; + text-size: 10; + text-fill: #6699cc; + text-face-name: @book-fonts; + text-halo-radius: 1; + text-wrap-width: @standard-wrap-width; + text-placement: interior; + text-dy: 6; + } + + [feature = 'tourism_alpine_hut'][zoom >= 15] { + text-name: "[name]"; + text-size: 9; + text-fill: #6699cc; + text-dy: 11; + text-face-name: @book-fonts; + text-halo-radius: 1; + text-wrap-width: @standard-wrap-width; + text-placement: interior; + [zoom >= 16] { + ele/text-name: "[ele]"; + ele/text-size: 8; + ele/text-fill: #6699cc; + ele/text-dy: 23; + ele/text-face-name: @oblique-fonts; + ele/text-halo-radius: 1; + ele/text-placement: interior; + } + } + + [feature = 'amenity_shelter'][zoom >= 17] { + text-name: "[name]"; + text-size: 9; + text-fill: #6699cc; + text-dy: 11; + text-face-name: @book-fonts; + text-halo-radius: 1; + text-wrap-width: @standard-wrap-width; + text-placement: interior; + ele/text-name: "[ele]"; + ele/text-size: 8; + ele/text-fill: #6699cc; + ele/text-dy: 23; + ele/text-face-name: @oblique-fonts; + ele/text-halo-radius: 1; + ele/text-placement: interior; + } + + [feature = 'amenity_bank'][zoom >= 17] { + text-name: "[name]"; + text-size: 9; + text-fill: black; + text-dy: 12; + text-halo-radius: 1; + text-wrap-width: @standard-wrap-width; + text-placement: interior; + text-face-name: @book-fonts; + } + + [feature = 'tourism_hotel'], + [feature = 'tourism_motel'], + [feature = 'tourism_hostel'], + [feature = 'tourism_chalet'] { + [zoom >= 17] { + text-name: "[name]"; + text-size: 10; + text-fill: #0066ff; + text-dy: 13; + text-face-name: @book-fonts; + text-halo-radius: 1; + text-wrap-width: @standard-wrap-width; + text-placement: interior; + [feature = 'tourism_chalet'] { + text-dy: 11; + } + } + } + + [feature = 'amenity_embassy'][zoom >= 17] { + text-name: "[name]"; + text-size: 9; + text-fill: #0066ff; + text-dy: 9; + text-face-name: @book-fonts; + text-halo-radius: 1; + text-wrap-width: @standard-wrap-width; + text-placement: interior; + } + + [feature = 'tourism_guest_house'][zoom >= 17] { + text-name: "[name]"; + text-size: 8; + text-fill: #0066ff; + text-dy: 10; + text-face-name: @book-fonts; + text-halo-radius: 1; + text-wrap-width: @standard-wrap-width; + text-placement: interior; + } + + [feature = 'highway_bus_stop'], + [feature = 'amenity_fuel'], + [feature = 'amenity_bus_station'] { + [zoom >= 17] { + text-name: "[name]"; + text-size: 9; + text-fill: @transportation-text; + text-dy: 11; + text-face-name: @book-fonts; + text-halo-radius: 1; + text-wrap-width: @standard-wrap-width; + text-placement: interior; + [feature = 'highway_bus_stop'] { + text-dy: 9; + } + } + } + + [feature = 'tourism_camp_site'][zoom >= 17] { + text-name: "[name]"; + text-size: 10; + text-fill: #0066ff; + text-dy: 15; + text-face-name: @book-fonts; + text-halo-radius: 1; + text-wrap-width: @standard-wrap-width; + text-placement: interior; + } + + [feature = 'tourism_caravan_site'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@campsite, 50%); + text-dy: 15; + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'waterway_lock'][zoom >= 15] { + text-name: "[name]"; + text-size: 9; + text-dy: 10; + text-fill: #0066ff; + text-face-name: @book-fonts; + text-halo-radius: 1; + text-wrap-width: @standard-wrap-width; + text-placement: interior; + } + + [feature = 'leisure_marina'][zoom >= 15] { + text-name: "[name]"; + text-size: 8; + text-fill: @marina-text; + text-face-name: @book-fonts; + text-halo-radius: 1; + text-wrap-width: @standard-wrap-width; + text-placement: interior; + [zoom >= 17] { + text-size: 10; + } + } + + [feature = 'tourism_theme_park'][is_building = 'no'] { + [zoom >= 13][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: @theme_park; + text-face-name: @bold-fonts; /*rendered bold to improve visibility since theme parks tend to have crowded backgrounds*/ + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'tourism_museum'][zoom >= 17] { + text-name: "[name]"; + text-size: 10; + text-dy: 11; + text-fill: #734a08; + text-face-name: @book-fonts; + text-halo-radius: 1; + text-wrap-width: @standard-wrap-width; + text-placement: interior; + } + + [feature = 'amenity_prison'][zoom >= 17] { + text-name: "[name]"; + text-size: 10; + text-fill: #734a08; + text-dy: 16; + text-face-name: @book-fonts; + text-halo-radius: 1; + text-wrap-width: @standard-wrap-width; + text-placement: interior; + } + + [feature = 'tourism_attraction'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: #660033; + text-face-name: @book-fonts; + text-halo-radius: 2; + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'amenity_university'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@school, 70%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'amenity_school'][is_building = 'no'], + [feature = 'amenity_college'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@school, 70%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'amenity_kindergarten'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@school, 65%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'man_made_lighthouse'][zoom >= 15] { + text-name: "[name]"; + text-size: 9; + text-fill: #000033; + text-dy: 16; + text-face-name: @book-fonts; + text-halo-radius: 2; + text-wrap-width: @standard-wrap-width; + text-placement: interior; + } + + [feature = 'man_made_windmill'][zoom >= 17] { + text-name: "[name]"; + text-size: 9; + text-fill: #734a08; + text-dy: 12; + text-face-name: @book-fonts; + text-halo-radius: 1; + text-wrap-width: @standard-wrap-width; + text-placement: interior; + } + + [feature = 'amenity_hospital'][zoom >= 16] { + text-name: "[name]"; + text-fill: #da0092; + text-size: 8; + text-dy: 10; + text-face-name: @book-fonts; + text-halo-radius: 2; + text-wrap-width: @standard-wrap-width; + text-placement: interior; + } + + [feature = 'amenity_pharmacy'][zoom >= 17] { + text-name: "[name]"; + text-size: 8; + text-dy: 10; + text-fill: #da0092; + text-face-name: @book-fonts; + text-halo-radius: 1; + text-wrap-width: @standard-wrap-width; + text-placement: interior; + } + + [feature = 'shop_bakery'], + [feature = 'shop_clothes'], + [feature = 'shop_fashion'], + [feature = 'shop_convenience'], + [feature = 'shop_doityourself'], + [feature = 'shop_hairdresser'], + [feature = 'shop_butcher'], + [feature = 'shop_car'], + [feature = 'shop_car_repair'], + [feature = 'shop_bicycle'], + [feature = 'shop_florist'], + [feature = 'shop_other']{ + [zoom >= 17] { + text-name: "[name]"; + text-size: 10; + text-dy: 12; + text-fill: #939; + text-face-name: @book-fonts; + text-halo-radius: 1.5; + text-halo-fill: rgba(255, 255, 255, 0.8); + text-wrap-width: @standard-wrap-width; + text-placement: interior; + } + } + + [feature = 'shop_supermarket'], + [feature = 'shop_department_store'] { + [zoom >= 16] { + text-name: "[name]"; + text-size: 10; + text-dy: 12; + text-fill: #939; + text-face-name: @book-fonts; + text-halo-radius: 1.5; + text-halo-fill: rgba(255, 255, 255, 0.8); + text-wrap-width: @standard-wrap-width; + text-placement: interior; + } + } + + [feature = 'military_danger_area'][is_building = 'no'] { + [zoom >= 9][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@danger_area, 40%); + text-face-name: @bold-fonts; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'landuse_military'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@military, 40%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'aeroway_gate'][zoom >= 17] { + text-name: "[ref]"; + text-size: 10; + text-fill: #aa66cc; + text-face-name: @book-fonts; + text-halo-radius: 1; + text-wrap-width: @standard-wrap-width; + text-placement: interior; + } + + [feature = 'military_barracks'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@barracks, 40%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'tourism_zoo'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@zoo, 40%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'power_station'][is_building = 'no'][zoom >= 10], + [feature = 'power_generator'][is_building = 'no'][zoom >= 10], + [feature = 'power_sub_station'][is_building = 'no'][zoom >= 13], + [feature = 'power_substation'][is_building = 'no'][zoom >= 13]{ + [way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@power, 40%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'natural_desert'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@desert, 40%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'natural_sand'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@sand, 50%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'natural_heath'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@heath, 40%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + + [feature = 'natural_grassland'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@grassland, 60%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'natural_scrub'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@scrub, 60%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'aeroway_apron'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@apron, 60%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'natural_beach'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@beach, 60%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + text-placement: interior; + } + } + + [feature = 'highway_services'][is_building = 'no'], + [feature = 'highway_rest_area'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@rest_area, 40%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + } + } + + [feature = 'natural_glacier'][is_building = 'no'] { + [zoom >= 10][way_pixels > 3000], + [zoom >= 17] { + text-name: "[name]"; + text-size: @landcover-font-size; + [way_pixels > 12000] { text-size: @landcover-font-size-big; } + [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } + text-fill: darken(@glacier, 40%); + text-face-name: @landcover-face-name; + text-halo-radius: 1; + text-halo-fill: rgba(255,255,255,0.6); + text-wrap-width: @landcover-wrap-width-size; + [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } + [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } + } + } + + [feature = 'aeroway_helipad'][zoom >= 16]::aeroway { + text-name: "[name]"; + text-size: 8; + text-fill: @airtransport; + text-dy: -10; + text-face-name: @bold-fonts; + text-halo-radius: 1; + text-placement: interior; + text-wrap-width: 30; + } + + [feature = 'aeroway_aerodrome'][zoom >= 10][zoom < 14]::aeroway { + text-name: "[name]"; + text-size: 8; + text-fill: darken(@airtransport, 15%); + text-dy: -10; + text-face-name: @oblique-fonts; + text-halo-radius: 1; + text-placement: interior; + text-wrap-width: 30; + } +} diff --git a/samples/Nit/file.nit b/samples/Nit/file.nit new file mode 100644 index 00000000..889526fc --- /dev/null +++ b/samples/Nit/file.nit @@ -0,0 +1,798 @@ +# This file is part of NIT ( http://www.nitlanguage.org ). +# +# Copyright 2004-2008 Jean Privat +# Copyright 2008 Floréal Morandat +# Copyright 2008 Jean-Sébastien Gélinas +# +# This file is free software, which comes along with NIT. This software is +# distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +# without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. You can modify it is you want, provided this header +# is kept unaltered, and a notification of the changes is added. +# You are allowed to redistribute it and sell it, alone or is a part of +# another product. + +# File manipulations (create, read, write, etc.) +module file + +intrude import stream +intrude import ropes +import string_search +import time + +in "C Header" `{ + #include + #include + #include + #include + #include + #include + #include + #include +`} + +# File Abstract Stream +abstract class FStream + super IOS + # The path of the file. + var path: nullable String = null + + # The FILE *. + private var file: nullable NativeFile = null + + fun file_stat: FileStat do return _file.file_stat + + # File descriptor of this file + fun fd: Int do return _file.fileno +end + +# File input stream +class IFStream + super FStream + super BufferedIStream + super PollableIStream + # Misc + + # Open the same file again. + # The original path is reused, therefore the reopened file can be a different file. + fun reopen + do + if not eof and not _file.address_is_null then close + _file = new NativeFile.io_open_read(path.to_cstring) + if _file.address_is_null then + last_error = new IOError("Error: Opening file at '{path.as(not null)}' failed with '{sys.errno.strerror}'") + end_reached = true + return + end + end_reached = false + _buffer_pos = 0 + _buffer.clear + end + + redef fun close + do + if _file.address_is_null then return + var i = _file.io_close + _buffer.clear + end_reached = true + end + + redef fun fill_buffer + do + var nb = _file.io_read(_buffer.items, _buffer.capacity) + if nb <= 0 then + end_reached = true + nb = 0 + end + _buffer.length = nb + _buffer_pos = 0 + end + # End of file? + redef var end_reached: Bool = false + + # Open the file at `path` for reading. + init open(path: String) + do + self.path = path + prepare_buffer(10) + _file = new NativeFile.io_open_read(path.to_cstring) + if _file.address_is_null then + last_error = new IOError("Error: Opening file at '{path}' failed with '{sys.errno.strerror}'") + end_reached = true + end + end + + init from_fd(fd: Int) do + self.path = "" + prepare_buffer(10) + _file = fd_to_stream(fd, read_only) + if _file.address_is_null then + last_error = new IOError("Error: Converting fd {fd} to stream failed with '{sys.errno.strerror}'") + end_reached = true + end + end +end + +# File output stream +class OFStream + super FStream + super OStream + + redef fun write(s) + do + if last_error != null then return + if not _is_writable then + last_error = new IOError("Cannot write to non-writable stream") + return + end + if s isa FlatText then + write_native(s.to_cstring, s.length) + else + for i in s.substrings do write_native(i.to_cstring, i.length) + end + end + + redef fun close + do + if _file.address_is_null then + last_error = new IOError("Cannot close non-existing write stream") + _is_writable = false + return + end + var i = _file.io_close + _is_writable = false + end + redef var is_writable = false + + # Write `len` bytes from `native`. + private fun write_native(native: NativeString, len: Int) + do + if last_error != null then return + if not _is_writable then + last_error = new IOError("Cannot write to non-writable stream") + return + end + if _file.address_is_null then + last_error = new IOError("Writing on a null stream") + _is_writable = false + return + end + var err = _file.io_write(native, len) + if err != len then + # Big problem + last_error = new IOError("Problem in writing : {err} {len} \n") + end + end + + # Open the file at `path` for writing. + init open(path: String) + do + _file = new NativeFile.io_open_write(path.to_cstring) + if _file.address_is_null then + last_error = new IOError("Error: Opening file at '{path}' failed with '{sys.errno.strerror}'") + self.path = path + is_writable = false + end + self.path = path + _is_writable = true + end + + # Creates a new File stream from a file descriptor + init from_fd(fd: Int) do + self.path = "" + _file = fd_to_stream(fd, wipe_write) + _is_writable = true + if _file.address_is_null then + last_error = new IOError("Error: Opening stream from file descriptor {fd} failed with '{sys.errno.strerror}'") + _is_writable = false + end + end +end + +redef interface Object + + private fun read_only: NativeString do return "r".to_cstring + + private fun wipe_write: NativeString do return "w".to_cstring + + private fun fd_to_stream(fd: Int, mode: NativeString): NativeFile `{ + return fdopen(fd, mode); + `} + + # returns first available stream to read or write to + # return null on interruption (possibly a signal) + protected fun poll( streams : Sequence[FStream] ) : nullable FStream + do + var in_fds = new Array[Int] + var out_fds = new Array[Int] + var fd_to_stream = new HashMap[Int,FStream] + for s in streams do + var fd = s.fd + if s isa IFStream then in_fds.add( fd ) + if s isa OFStream then out_fds.add( fd ) + + fd_to_stream[fd] = s + end + + var polled_fd = intern_poll( in_fds, out_fds ) + + if polled_fd == null then + return null + else + return fd_to_stream[polled_fd] + end + end + + private fun intern_poll(in_fds: Array[Int], out_fds: Array[Int]) : nullable Int is extern import Array[Int].length, Array[Int].[], Int.as(nullable Int) `{ + int in_len, out_len, total_len; + struct pollfd *c_fds; + sigset_t sigmask; + int i; + int first_polled_fd = -1; + int result; + + in_len = Array_of_Int_length( in_fds ); + out_len = Array_of_Int_length( out_fds ); + total_len = in_len + out_len; + c_fds = malloc( sizeof(struct pollfd) * total_len ); + + /* input streams */ + for ( i=0; i 0 ) { + /* analyse results */ + for ( i=0; i 0 and self.chars[l] == '/' do l -= 1 # remove all trailing `/` + if l == 0 then return "/" + var pos = chars.last_index_of_from('/', l) + var n = self + if pos >= 0 then + n = substring(pos+1, l-pos) + end + return n.strip_extension(ext) + end + + # Extract the dirname of a path + # + # assert "/path/to/a_file.ext".dirname == "/path/to" + # assert "path/to/a_file.ext".dirname == "path/to" + # assert "path/to".dirname == "path" + # assert "path/to/".dirname == "path" + # assert "path".dirname == "." + # assert "/path".dirname == "/" + # assert "/".dirname == "/" + # assert "".dirname == "." + fun dirname: String + do + var l = length - 1 # Index of the last char + while l > 0 and self.chars[l] == '/' do l -= 1 # remove all trailing `/` + var pos = chars.last_index_of_from('/', l) + if pos > 0 then + return substring(0, pos) + else if pos == 0 then + return "/" + else + return "." + end + end + + # Return the canonicalized absolute pathname (see POSIX function `realpath`) + fun realpath: String do + var cs = to_cstring.file_realpath + var res = cs.to_s_with_copy + # cs.free_malloc # FIXME memory leak + return res + end + + # Simplify a file path by remove useless ".", removing "//", and resolving ".." + # ".." are not resolved if they start the path + # starting "/" is not removed + # trainling "/" is removed + # + # Note that the method only wonrk on the string: + # * no I/O access is performed + # * the validity of the path is not checked + # + # assert "some/./complex/../../path/from/../to/a////file//".simplify_path == "path/to/a/file" + # assert "../dir/file".simplify_path == "../dir/file" + # assert "dir/../../".simplify_path == ".." + # assert "dir/..".simplify_path == "." + # assert "//absolute//path/".simplify_path == "/absolute/path" + # assert "//absolute//../".simplify_path == "/" + fun simplify_path: String + do + var a = self.split_with("/") + var a2 = new Array[String] + for x in a do + if x == "." then continue + if x == "" and not a2.is_empty then continue + if x == ".." and not a2.is_empty and a2.last != ".." then + a2.pop + continue + end + a2.push(x) + end + if a2.is_empty then return "." + if a2.length == 1 and a2.first == "" then return "/" + return a2.join("/") + end + + # Correctly join two path using the directory separator. + # + # Using a standard "{self}/{path}" does not work in the following cases: + # + # * `self` is empty. + # * `path` ends with `'/'`. + # * `path` starts with `'/'`. + # + # This method ensures that the join is valid. + # + # assert "hello".join_path("world") == "hello/world" + # assert "hel/lo".join_path("wor/ld") == "hel/lo/wor/ld" + # assert "".join_path("world") == "world" + # assert "hello".join_path("/world") == "/world" + # assert "hello/".join_path("world") == "hello/world" + # assert "hello/".join_path("/world") == "/world" + # + # Note: You may want to use `simplify_path` on the result. + # + # Note: This method works only with POSIX paths. + fun join_path(path: String): String + do + if path.is_empty then return self + if self.is_empty then return path + if path.chars[0] == '/' then return path + if self.last == '/' then return "{self}{path}" + return "{self}/{path}" + end + + # Convert the path (`self`) to a program name. + # + # Ensure the path (`self`) will be treated as-is by POSIX shells when it is + # used as a program name. In order to do that, prepend `./` if needed. + # + # assert "foo".to_program_name == "./foo" + # assert "/foo".to_program_name == "/foo" + # assert "".to_program_name == "./" # At least, your shell will detect the error. + fun to_program_name: String do + if self.has_prefix("/") then + return self + else + return "./{self}" + end + end + + # Alias for `join_path` + # + # assert "hello" / "world" == "hello/world" + # assert "hel/lo" / "wor/ld" == "hel/lo/wor/ld" + # assert "" / "world" == "world" + # assert "/hello" / "/world" == "/world" + # + # This operator is quite useful for chaining changes of path. + # The next one being relative to the previous one. + # + # var a = "foo" + # var b = "/bar" + # var c = "baz/foobar" + # assert a/b/c == "/bar/baz/foobar" + fun /(path: String): String do return join_path(path) + + # Returns the relative path needed to go from `self` to `dest`. + # + # assert "/foo/bar".relpath("/foo/baz") == "../baz" + # assert "/foo/bar".relpath("/baz/bar") == "../../baz/bar" + # + # If `self` or `dest` is relative, they are considered relatively to `getcwd`. + # + # In some cases, the result is still independent of the current directory: + # + # assert "foo/bar".relpath("..") == "../../.." + # + # In other cases, parts of the current directory may be exhibited: + # + # var p = "../foo/bar".relpath("baz") + # var c = getcwd.basename("") + # assert p == "../../{c}/baz" + # + # For path resolution independent of the current directory (eg. for paths in URL), + # or to use an other starting directory than the current directory, + # just force absolute paths: + # + # var start = "/a/b/c/d" + # var p2 = (start/"../foo/bar").relpath(start/"baz") + # assert p2 == "../../d/baz" + # + # + # Neither `self` or `dest` has to be real paths or to exist in directories since + # the resolution is only done with string manipulations and without any access to + # the underlying file system. + # + # If `self` and `dest` are the same directory, the empty string is returned: + # + # assert "foo".relpath("foo") == "" + # assert "foo/../bar".relpath("bar") == "" + # + # The empty string and "." designate both the current directory: + # + # assert "".relpath("foo/bar") == "foo/bar" + # assert ".".relpath("foo/bar") == "foo/bar" + # assert "foo/bar".relpath("") == "../.." + # assert "/" + "/".relpath(".") == getcwd + fun relpath(dest: String): String + do + var cwd = getcwd + var from = (cwd/self).simplify_path.split("/") + if from.last.is_empty then from.pop # case for the root directory + var to = (cwd/dest).simplify_path.split("/") + if to.last.is_empty then to.pop # case for the root directory + + # Remove common prefixes + while not from.is_empty and not to.is_empty and from.first == to.first do + from.shift + to.shift + end + + # Result is going up in `from` with ".." then going down following `to` + var from_len = from.length + if from_len == 0 then return to.join("/") + var up = "../"*(from_len-1) + ".." + if to.is_empty then return up + var res = up + "/" + to.join("/") + return res + end + + # Create a directory (and all intermediate directories if needed) + fun mkdir + do + var dirs = self.split_with("/") + var path = new FlatBuffer + if dirs.is_empty then return + if dirs[0].is_empty then + # it was a starting / + path.add('/') + end + for d in dirs do + if d.is_empty then continue + path.append(d) + path.add('/') + path.to_s.to_cstring.file_mkdir + end + end + + # Delete a directory and all of its content, return `true` on success + # + # Does not go through symbolic links and may get stuck in a cycle if there + # is a cycle in the filesystem. + fun rmdir: Bool + do + var ok = true + for file in self.files do + var file_path = self.join_path(file) + var stat = file_path.file_lstat + if stat.is_dir then + ok = file_path.rmdir and ok + else + ok = file_path.file_delete and ok + end + stat.free + end + + # Delete the directory itself + if ok then to_cstring.rmdir + + return ok + end + + # Change the current working directory + # + # "/etc".chdir + # assert getcwd == "/etc" + # "..".chdir + # assert getcwd == "/" + # + # TODO: errno + fun chdir do to_cstring.file_chdir + + # Return right-most extension (without the dot) + # + # Only the last extension is returned. + # There is no special case for combined extensions. + # + # assert "file.txt".file_extension == "txt" + # assert "file.tar.gz".file_extension == "gz" + # + # For file without extension, `null` is returned. + # Hoever, for trailing dot, `""` is returned. + # + # assert "file".file_extension == null + # assert "file.".file_extension == "" + # + # The starting dot of hidden files is never considered. + # + # assert ".file.txt".file_extension == "txt" + # assert ".file".file_extension == null + fun file_extension: nullable String + do + var last_slash = chars.last_index_of('.') + if last_slash > 0 then + return substring( last_slash+1, length ) + else + return null + end + end + + # returns files contained within the directory represented by self + fun files : Set[ String ] is extern import HashSet[String], HashSet[String].add, NativeString.to_s, String.to_cstring, HashSet[String].as(Set[String]) `{ + char *dir_path; + DIR *dir; + + dir_path = String_to_cstring( recv ); + if ((dir = opendir(dir_path)) == NULL) + { + perror( dir_path ); + exit( 1 ); + } + else + { + HashSet_of_String results; + String file_name; + struct dirent *de; + + results = new_HashSet_of_String(); + + while ( ( de = readdir( dir ) ) != NULL ) + if ( strcmp( de->d_name, ".." ) != 0 && + strcmp( de->d_name, "." ) != 0 ) + { + file_name = NativeString_to_s( strdup( de->d_name ) ); + HashSet_of_String_add( results, file_name ); + } + + closedir( dir ); + return HashSet_of_String_as_Set_of_String( results ); + } + `} +end + +redef class NativeString + private fun file_exists: Bool is extern "string_NativeString_NativeString_file_exists_0" + private fun file_stat: FileStat is extern "string_NativeString_NativeString_file_stat_0" + private fun file_lstat: FileStat `{ + struct stat* stat_element; + int res; + stat_element = malloc(sizeof(struct stat)); + res = lstat(recv, stat_element); + if (res == -1) return NULL; + return stat_element; + `} + private fun file_mkdir: Bool is extern "string_NativeString_NativeString_file_mkdir_0" + private fun rmdir: Bool `{ return rmdir(recv); `} + private fun file_delete: Bool is extern "string_NativeString_NativeString_file_delete_0" + private fun file_chdir is extern "string_NativeString_NativeString_file_chdir_0" + private fun file_realpath: NativeString is extern "file_NativeString_realpath" +end + +# This class is system dependent ... must reify the vfs +extern class FileStat `{ struct stat * `} + # Returns the permission bits of file + fun mode: Int is extern "file_FileStat_FileStat_mode_0" + # Returns the last access time + fun atime: Int is extern "file_FileStat_FileStat_atime_0" + # Returns the last status change time + fun ctime: Int is extern "file_FileStat_FileStat_ctime_0" + # Returns the last modification time + fun mtime: Int is extern "file_FileStat_FileStat_mtime_0" + # Returns the size + fun size: Int is extern "file_FileStat_FileStat_size_0" + + # Returns true if it is a regular file (not a device file, pipe, sockect, ...) + fun is_reg: Bool `{ return S_ISREG(recv->st_mode); `} + # Returns true if it is a directory + fun is_dir: Bool `{ return S_ISDIR(recv->st_mode); `} + # Returns true if it is a character device + fun is_chr: Bool `{ return S_ISCHR(recv->st_mode); `} + # Returns true if it is a block device + fun is_blk: Bool `{ return S_ISBLK(recv->st_mode); `} + # Returns true if the type is fifo + fun is_fifo: Bool `{ return S_ISFIFO(recv->st_mode); `} + # Returns true if the type is a link + fun is_lnk: Bool `{ return S_ISLNK(recv->st_mode); `} + # Returns true if the type is a socket + fun is_sock: Bool `{ return S_ISSOCK(recv->st_mode); `} +end + +# Instance of this class are standard FILE * pointers +private extern class NativeFile `{ FILE* `} + fun io_read(buf: NativeString, len: Int): Int is extern "file_NativeFile_NativeFile_io_read_2" + fun io_write(buf: NativeString, len: Int): Int is extern "file_NativeFile_NativeFile_io_write_2" + fun io_close: Int is extern "file_NativeFile_NativeFile_io_close_0" + fun file_stat: FileStat is extern "file_NativeFile_NativeFile_file_stat_0" + fun fileno: Int `{ return fileno(recv); `} + + new io_open_read(path: NativeString) is extern "file_NativeFileCapable_NativeFileCapable_io_open_read_1" + new io_open_write(path: NativeString) is extern "file_NativeFileCapable_NativeFileCapable_io_open_write_1" + new native_stdin is extern "file_NativeFileCapable_NativeFileCapable_native_stdin_0" + new native_stdout is extern "file_NativeFileCapable_NativeFileCapable_native_stdout_0" + new native_stderr is extern "file_NativeFileCapable_NativeFileCapable_native_stderr_0" +end + +redef class Sys + + # Standard input + var stdin: PollableIStream = new Stdin is protected writable + + # Standard output + var stdout: OStream = new Stdout is protected writable + + # Standard output for errors + var stderr: OStream = new Stderr is protected writable + +end + +# Print `objects` on the standard output (`stdout`). +protected fun printn(objects: Object...) +do + sys.stdout.write(objects.to_s) +end + +# Print an `object` on the standard output (`stdout`) and add a newline. +protected fun print(object: Object) +do + sys.stdout.write(object.to_s) + sys.stdout.write("\n") +end + +# Read a character from the standard input (`stdin`). +protected fun getc: Char +do + return sys.stdin.read_char.ascii +end + +# Read a line from the standard input (`stdin`). +protected fun gets: String +do + return sys.stdin.read_line +end + +# Return the working (current) directory +protected fun getcwd: String do return file_getcwd.to_s +private fun file_getcwd: NativeString is extern "string_NativeString_NativeString_file_getcwd_0" diff --git a/samples/Nit/meetup.nit b/samples/Nit/meetup.nit new file mode 100644 index 00000000..e5d1f561 --- /dev/null +++ b/samples/Nit/meetup.nit @@ -0,0 +1,376 @@ +# This file is part of NIT ( http://www.nitlanguage.org ). +# +# 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 + +# Shows a meetup and allows to modify its participants +module meetup + +import opportunity_model +import boilerplate +import welcome +import template + +# Shows a meetup and allows to modify its participants +class OpportunityMeetupPage + super OpportunityPage + + # Meetup the page is supposed to show + var meetup: nullable Meetup = null + # Answer mode for the meetup + var mode = 0 + + init from_id(id: String) do + var db = new OpportunityDB.open("opportunity") + meetup = db.find_meetup_by_id(id) + db.close + if meetup != null then mode = meetup.answer_mode + init + end + + init do + header.page_js = "mode = {mode};\n" + header.page_js += """ + function update_scores(){ + var anss = $('.answer'); + var count = {}; + var scores = {}; + var answers = []; + var maxscore = 0; + for(i=0; i < anss.length; i++){ + var incscore = 0; + var inccount = 0; + var idparts = anss[i].id.split("_"); + var ansid = idparts[1]; + var html = anss[i].innerHTML; + if(html === "
"){ + inccount = 1; + incscore = 2; + }else if(html === "
"){ + incscore = 1; + } + var intansid = parseInt(ansid) + if(answers.indexOf(intansid) == -1){ + answers.push(intansid); + } + if(ansid in count){ + count[ansid] += inccount; + }else{ + count[ansid] = inccount; + } + if(ansid in scores){ + scores[ansid] += incscore; + }else{ + scores[ansid] = incscore; + } + if(scores[ansid] > maxscore){ + maxscore = scores[ansid]; + } + } + for(i=0; i < answers.length; i++){ + var ansid = answers[i].toString(); + var el = $('#total'+ansid)[0]; + var ins = "
"+count[ansid]; + if(scores[ansid] >= maxscore){ + ins += "
"; + } + ins += "
"; + el.innerHTML = ins; + } + } + function change_answer(ele, id){ + // modify only the currently selected entry + if (in_modification_id != id) return; + + var e = document.getElementById(ele.id); + var i = e.innerHTML; + var ans = true;""" + if mode == 0 then + header.page_js += """ + if(i === "
"){ + ans = 0; + e.innerHTML = "
" + e.style.color = "red"; + }else{ + ans = 1; + e.innerHTML = "
"; + e.style.color = "green"; + }""" + + else + header.page_js += """ + if(i === "
"){ + ans = 1; + e.innerHTML = "
" + e.style.color = "#B8860B"; + }else if(i === "
"){ + ans = 0; + e.innerHTML = "
" + e.style.color = "red"; + }else{ + ans = 2; + e.innerHTML = "
"; + e.style.color = "green"; + }""" + end + header.page_js += """ + var a = ele.id.split('_') + var pid = a[1] + var aid = a[2] + update_scores(); + $.ajax({ + type: "POST", + url: "./rest/answer", + data: { + answer_id: aid, + pers_id: pid, + answer: ans + } + }); + } + function change_temp_answer(ele){ + var e = document.getElementById(ele.id); + var i = e.innerHTML;""" + if mode == 0 then + header.page_js += """ + if(i === "
"){ + e.innerHTML = "
" + e.style.color = "red"; + }else{ + e.innerHTML = "
"; + e.style.color = "green"; + } + """ + else + header.page_js += """ + if(i === "
"){ + e.innerHTML = "
"; + e.style.color = "#B8860B"; + }else if(i === "
"){ + e.innerHTML = "
" + e.style.color = "red"; + }else{ + e.innerHTML = "
"; + e.style.color = "green"; + } + """ + end + header.page_js += """ + update_scores(); + } + function add_part(ele){ + var e = document.getElementById(ele.id); + var pname = document.getElementById("new_name").value; + var arr = e.id.split("_"); + var mid = arr[1]; + var ans = $('#' + ele.id).parent().parent().parent().children(".answer"); + ansmap = {}; + for(i=0;i✔"){ + ansmap[curr.attr('id')] = 1 + }else{ + ansmap[curr.attr('id')] = 0 + }""" + else + header.page_js += """ + if(curr[0].innerHTML === "
"){ + ansmap[curr.attr('id')] = 2 + }else if(curr[0].innerHTML === "
"){ + ansmap[curr.attr('id')] = 1 + }else{ + ansmap[curr.attr('id')] = 0 + }""" + end + header.page_js += """ + } + $.ajax({ + type: "POST", + url: "./rest/meetup/new_pers", + data: { + meetup_id: mid, + persname: pname, + answers: $.param(ansmap) + } + }) + .done(function(data){ + location.reload(); + }) + .fail(function(data){ + //TODO: Notify of failure + }); + } + function remove_people(ele){ + var arr = ele.id.split("_") + var pid = arr[1] + $('#' + ele.id).parent().parent().parent().remove(); + update_scores(); + $.ajax({ + type: "POST", + url: "./rest/people", + data: { + method: "DELETE", + p_id: pid + } + }); + } + // ID of line currently open for modification + var in_modification_id = null; + function modify_people(ele, id){ + if (in_modification_id != null) { + // reset to normal values + $('#modify_'+in_modification_id).text("Modify or delete"); + $('#modify_'+in_modification_id).attr("class", "btn btn-xs btn-warning"); + $('#line_'+in_modification_id).css("background-color", ""); + $('#delete_'+in_modification_id).css("display", "none"); + } + if (in_modification_id != id) { + // activate modifiable mode + $('#modify_'+id).text("Done"); + $('#modify_'+id).attr("class", "btn btn-xs btn-success"); + $('#line_'+id).css("background-color", "LightYellow"); + $('#delete_'+id).show(); + + in_modification_id = id; + } else { + in_modification_id = null; + } + } + """ + end + + redef fun rendering do + if meetup == null then + add((new OpportunityHomePage).write_to_string) + return + end + add header + var db = new OpportunityDB.open("opportunity") + add meetup.to_html(db) + db.close + add footer + end +end + +redef class Meetup + # Build the HTML for `self` + fun to_html(db: OpportunityDB): Streamable do + var t = new Template + t.add """ +
+ + +""" + t.add "" + for i in answers(db) do + t.add "" + end + t.add "" + t.add "" + for i in participants(db) do + i.load_answers(db, self) + t.add "" + t.add "" + for j, k in i.answers do + var color + if answer_mode == 0 then + if k == 1 then + color = "green" + else + color = "red" + end + else + if k == 2 then + color = "green" + else if k == 1 then + color = "#B8860B" + else + color = "red" + end + end + t.add """" + end + t.add """""" + t.add "" + end + t.add """ + + + """ + for i in answers(db) do + t.add "" + end + t.add """ + """ + t.add "" + # Compute score for each answer + var scores = new HashMap[Int, Int] + var maxsc = 0 + for i in answers(db) do + scores[i.id] = i.score(db) + if scores[i.id] > maxsc then maxsc = scores[i.id] + end + t.add """ + + + """ + for i in answers(db) do + t.add """" + end + t.add "" + t.add """ + +""" + t.add "
Participant name" + t.add i.to_s + t.add "
" + t.add i.to_s + t.add """" + t.add "
" + if answer_mode == 0 then + if k == 1 then + t.add "✔" + else + t.add "✘" + end + else + if k == 2 then + t.add "✔" + else if k == 1 then + t.add "❓" + else + t.add "✘" + end + end + t.add "
 """ + t.add """
Total
{{{i.count(db)}}}""" + if scores.has_key(i.id) and scores[i.id] >= maxsc then + t.add """
""" + end + t.add "
" + t.add "
" + return t + end +end diff --git a/samples/Zephir/filenames/exception.zep.php b/samples/PHP/exception.zep.php similarity index 100% rename from samples/Zephir/filenames/exception.zep.php rename to samples/PHP/exception.zep.php diff --git a/samples/Pike/shebang.pike b/samples/Pike/shebang.pike new file mode 100644 index 00000000..31bf7e96 --- /dev/null +++ b/samples/Pike/shebang.pike @@ -0,0 +1,6 @@ +#!/usr/bin/env pike + +int main(int argc, array argv) { + return 0; +} + diff --git a/samples/SAS/detect_phi.sas b/samples/SAS/detect_phi.sas new file mode 100644 index 00000000..5784d74f --- /dev/null +++ b/samples/SAS/detect_phi.sas @@ -0,0 +1,275 @@ +%macro check_dataset(dset =, obs_lim = max, eldest_age = 89) ; + %local i ; + %local inset_name ; + %let inset_name = &dset ; + + %if %lowcase(&obs_lim) = max %then %do ; + %** Nothing ; + %end ; + %else %do ; + proc surveyselect + data = &inset_name + out = __sub_dset + method = srs + sampsize = &obs_lim SELECTALL + seed = 1234567 + noprint + ; + run; + %let dset = __sub_dset ; + %end ; + + %macro check_varname(regx, msg) ; + create table possible_bad_vars as + select name, label + from these_vars + where prxmatch(compress("/(®x)/i"), name) + ; + + %if &sqlobs > 0 %then %do ; + insert into phi_warnings(dset, variable, label, warning) + select "&inset_name" as dset, name, label, "&msg" + from possible_bad_vars + ; + %end ; + + %mend check_varname ; + + %macro check_vars_for_mrn(length_limit = 6, obs_lim = max) ; + %local char ; + %let char = 2 ; + proc sql noprint ; + select name + into :mrn_array separated by ' ' + from these_vars + where type = &char and length ge &length_limit + ; + quit ; + %if &sqlobs > 0 %then %do ; + %put Checking these vars for possible MRN contents: &mrn_array ; + data __gnu ; + retain + mrn_regex_handle + badcount + ; + set &inset_name (obs = &obs_lim keep = &mrn_array) ; + if _n_ = 1 then do ; + mrn_regex_handle = prxparse("/&mrn_regex/") ; + badcount = 0 ; + end ; + array p &mrn_array ; + do i = 1 to dim(p) ; + if prxmatch(mrn_regex_handle, p{i}) then do ; + badvar = vname(p{i}) ; + badvalue = p{i} ; + badcount = _n_ ; + output ; + end ; + keep badvar badvalue badcount ; + end ; + run ; + proc sql noprint ; + select compress(put(max(badcount), best.)) + into :badcount + from __gnu + ; + insert into phi_warnings(dset, variable, warning) + select distinct "&inset_name", badvar, "Could this var hold MRN values? Contents of %trim(&badcount) records match the pattern given for MRN values. MRNs should never move across sites." + from __gnu ; + drop table __gnu ; + quit ; + %end ; + %mend check_vars_for_mrn ; + + %macro check_vars_for_oldsters(eldest_age = 89, obs_lim = max) ; + %local dtfmts ; + %let dtfmts = 'B8601DA','B8601DN','B8601DT','B8601DZ','B8601LZ','B8601TM','B8601TZ','DATE','DATEAMPM','DATETIME','DAY','DDMMYY', + 'DDMMYYB','DDMMYYC','DDMMYYD','DDMMYYN','DDMMYYP','DDMMYYS','DOWNAME','DTDATE','DTMONYY','DTWKDATX','DTYEAR', + 'DTYYQC','E8601DA','E8601DN','E8601DT','E8601DZ','E8601LZ','E8601TM','E8601TZ','HHMM','HOUR','JULDAY','JULIAN', + 'MMDDYY','MMDDYYB','MMDDYYC','MMDDYYD','MMDDYYN','MMDDYYP','MMDDYYS','MMSS','MMYY','MMYY','MONNAME','MONTH','MONYY', + 'PDJULG','PDJULI','QTR','QTRR','WEEKDATE','WEEKDATX','WEEKDAY','WEEKU','WEEKV','WEEKW','WORDDATE','WORDDATX', + 'YEAR','YYMM','YYMMC','YYMMD','YYMMN','YYMMP','YYMMS','YYMMDD','YYMMDDB','YYMMDDC','YYMMDDD','YYMMDDN','YYMMDDP', + 'YYMMDDS','YYMON','YYQ','YYQC','YYQD','YYQN','YYQP','YYQS','YYQR','YYQRC','YYQRD','YYQRN','YYQRP','YYQRS' ; + + %local num ; + %let num = 1 ; + + proc sql noprint ; + select name + into :dat_array separated by ' ' + from these_vars + where type = &num and (format in (&dtfmts) or lowcase(name) like '%date%') + ; + /* added by cb to shorten the process of looking at all dates */ + %if &sqlobs > 0 %then %do ; + %put Checking these vars for possible DOB contents: &dat_array ; + select 'min(' || trim(name) || ') as ' || name into :var_list separated by ',' + from these_vars + where type = &num and (format in (&dtfmts) or lowcase(name) like '%date%') + ; + create table __gnu as + select &var_list from &inset_name + ; + /* end cb additions */ + quit ; + data __gnu ; + set __gnu (obs = &obs_lim keep = &dat_array) ; + array d &dat_array ; + do i = 1 to dim(d) ; + if n(d{i}) then maybe_age = %calcage(bdtvar = d{i}, refdate = "&sysdate9."d) ; + if maybe_age ge &eldest_age then do ; + badvar = vname(d{i}) ; + badvalue = d{i} ; + output ; + end ; + keep badvar badvalue maybe_age ; + end ; + run ; + proc sql outobs = 30 nowarn ; + insert into phi_warnings(dset, variable, warning) + select distinct "&inset_name", badvar, "If this is a date, at least one value is " || compress(put(maybe_age, best.)) || " years ago, which is older than &eldest_age.. " || + "If this date applies to a person, the record is probably PHI." + from __gnu ; + drop table __gnu ; + quit ; + %end ; + %else %do ; + %put No obvious date variables found in &inset_name.--skipping age checks. ; + %end ; + %mend check_vars_for_oldsters ; + + proc contents noprint data = &inset_name out = these_vars ; + run ; + + proc sql noprint ; + create table phi_warnings (dset char(50), variable char(256), label char(256), warning char(200)) ; + + %check_varname(regx = mrn|hrn , msg = %str(Name suggests this var may be an MRN, which should never move across sites.)) ; + %check_varname(regx = birth_date|BirthDate|DOB|BDate , msg = %str(Name suggests this var may be a date of birth.)) ; + %check_varname(regx = SSN|SocialSecurityNumber|social_security_number|socsec, msg = %str(Name suggests this var may be a social security number.)) ; + + %if %symexist(locally_forbidden_varnames) %then %do ; + %check_varname(regx = &locally_forbidden_varnames, msg = %str(May be on the locally defined list of variables not allowed to be sent to other sites.)) ; + %end ; + + quit ; + + %check_vars_for_mrn(obs_lim = &obs_lim) ; + %check_vars_for_oldsters(obs_lim = &obs_lim, eldest_age = &eldest_age) ; + + title3 "WARNINGS for dataset &inset_name:" ; + + proc sql noprint ; + select count(*) as num_warns into :num_warns from phi_warnings ; + + %if &num_warns = 0 %then %do ; + reset print outobs = 5 NOWARN ; + select "No obvious PHI-like data elements in &inset_name--BUT PLEASE INSPECT THE CONTENTS AND PRINTs TO FOLLOW" as x label = "No warnings for &inset_name" + from &inset_name + ; + %do i = 1 %to 5 ; + %put No obvious phi-like data elements in &inset_name. BUT PLEASE INSPECT THE CONTENTS AND PRINTs CAREFULLY TO MAKE SURE OF THIS! ; + %end ; + %end ; + %else %do ; + reset print ; + select variable, warning from phi_warnings + order by variable, warning + ; + quit ; + %end ; + title3 "Dataset &inset_name" ; + proc contents data = &inset_name varnum ; + run ; + /* + proc print data = &inset_name (obs = 20) ; + run ; + */ + ** TODO: make the print print out recs that trip the value warnings. ; + proc sql number ; + select * + from &inset_name (obs = 20) + ; + quit ; + + quit ; + + %RemoveDset(dset = __sub_dset) ; + %RemoveDset(dset = possible_bad_vars) ; + %RemoveDset(dset = phi_warnings) ; + %RemoveDset(dset = these_vars) ; + +%mend check_dataset ; + +%macro detect_phi(transfer_lib, obs_lim = max, eldest_age = 89) ; + + %put ; + %put ; + %put ============================================================== ; + %put ; + %put Macro detect_phi: ; + %put ; + %put Checking all datasets found in %sysfunc(pathname(&transfer_lib)) for the following signs of PHI: ; + %put - Variable names signifying sensitive items like 'MRN', 'birth_date', 'SSN' and so forth. ; + %if %symexist(locally_forbidden_varnames) %then %do ; + %put - Variable names on the list defined in the standard macro variable locally_forbidden_varnames (here those names are: &locally_forbidden_varnames). ; + %end ; + %put - Contents of CHARACTER variables that match the pattern given in the standard macro variable mrn_regex (here that var is &mrn_regex) ; + %put Please note that numeric variables ARE NOT CHECKED FOR MRN-LIKE CONTENT. ; + %put - The contents of date variables (as divined by their formats) for values that, if they were DOBs, would indicate a person older than &eldest_age years. ; + %put ; + %put THIS IS BETA SOFTWARE-PLEASE SCRUTINIZE THE RESULTS AND REPORT PROBLEMS TO pardee.r@ghc.org. ; + %put ; + %put THIS MACRO IS NOT A SUBSTITUTE FOR HUMAN INSPECTION AND THOUGHT--PLEASE CAREFULLY INSPECT ALL VARIABLES--WHETHER ; + %put OR NOT THEY TRIP A WARNING--TO MAKE SURE THE DATA COMPORTS WITH YOUR DATA SHARING AGREEMENT!!! ; + %put THIS MACRO IS NOT A SUBSTITUTE FOR HUMAN INSPECTION AND THOUGHT--PLEASE CAREFULLY INSPECT ALL VARIABLES--WHETHER ; + %put OR NOT THEY TRIP A WARNING--TO MAKE SURE THE DATA COMPORTS WITH YOUR DATA SHARING AGREEMENT!!! ; + %put ; + %put THIS MACRO IS NOT A SUBSTITUTE FOR HUMAN INSPECTION AND THOUGHT--PLEASE CAREFULLY INSPECT ALL VARIABLES--WHETHER ; + %put OR NOT THEY TRIP A WARNING--TO MAKE SURE THE DATA COMPORTS WITH YOUR DATA SHARING AGREEMENT!!! ; + %put THIS MACRO IS NOT A SUBSTITUTE FOR HUMAN INSPECTION AND THOUGHT--PLEASE CAREFULLY INSPECT ALL VARIABLES--WHETHER ; + %put OR NOT THEY TRIP A WARNING--TO MAKE SURE THE DATA COMPORTS WITH YOUR DATA SHARING AGREEMENT!!! ; + %put ; + %put THIS MACRO IS NOT A SUBSTITUTE FOR HUMAN INSPECTION AND THOUGHT--PLEASE CAREFULLY INSPECT ALL VARIABLES--WHETHER ; + %put OR NOT THEY TRIP A WARNING--TO MAKE SURE THE DATA COMPORTS WITH YOUR DATA SHARING AGREEMENT!!! ; + %put THIS MACRO IS NOT A SUBSTITUTE FOR HUMAN INSPECTION AND THOUGHT--PLEASE CAREFULLY INSPECT ALL VARIABLES--WHETHER ; + %put OR NOT THEY TRIP A WARNING--TO MAKE SURE THE DATA COMPORTS WITH YOUR DATA SHARING AGREEMENT!!! ; + %put ; + %put THIS MACRO IS NOT A SUBSTITUTE FOR HUMAN INSPECTION AND THOUGHT--PLEASE CAREFULLY INSPECT ALL VARIABLES--WHETHER ; + %put OR NOT THEY TRIP A WARNING--TO MAKE SURE THE DATA COMPORTS WITH YOUR DATA SHARING AGREEMENT!!! ; + %put THIS MACRO IS NOT A SUBSTITUTE FOR HUMAN INSPECTION AND THOUGHT--PLEASE CAREFULLY INSPECT ALL VARIABLES--WHETHER ; + %put OR NOT THEY TRIP A WARNING--TO MAKE SURE THE DATA COMPORTS WITH YOUR DATA SHARING AGREEMENT!!! ; + %put ; + %put ; + %put ============================================================== ; + %put ; + %put ; + + title1 "PHI-Detection Report for the datasets in %sysfunc(pathname(&transfer_lib))." ; + title2 "please inspect all output carefully to make sure it comports with your data sharing agreement!!!" ; + + proc sql noprint ; + ** describe table dictionary.tables ; + + select trim(libname) || '.' || memname as dset + into :d1-:d999 + from dictionary.tables + where libname = "%upcase(&transfer_lib)" AND + memtype = 'DATA' + ; + %local num_dsets ; + %let num_dsets = &sqlobs ; + quit ; + + %local i ; + + %if &num_dsets = 0 %then %do i = 1 %to 10 ; + %put ERROR: NO DATASETS FOUND IN &transfer_lib!!!! ; + %end ; + + %do i = 1 %to &num_dsets ; + %put about to check &&d&i ; + %check_dataset(dset = &&d&i, obs_lim = &obs_lim, eldest_age = &eldest_age) ; + %end ; + +%mend detect_phi ; diff --git a/samples/SPARQL/foaf.sparql b/samples/SPARQL/foaf.sparql new file mode 100644 index 00000000..699360c7 --- /dev/null +++ b/samples/SPARQL/foaf.sparql @@ -0,0 +1,7 @@ +PREFIX foaf: +SELECT ?name ?email +WHERE { + ?person a foaf:Person. + ?person foaf:name ?name. + ?person foaf:mbox ?email. +} diff --git a/samples/SPARQL/string-matching.sparql b/samples/SPARQL/string-matching.sparql new file mode 100644 index 00000000..424ca987 --- /dev/null +++ b/samples/SPARQL/string-matching.sparql @@ -0,0 +1,40 @@ +PREFIX owl: +PREFIX rdf: +PREFIX skos: + +SELECT DISTINCT ?s ?label +WHERE { + SERVICE + { + SELECT DISTINCT ?s ?label ?plabel ?alabel ?hlabel (GROUP_CONCAT(DISTINCT STR(?type)) as ?types) + WHERE { + GRAPH + { + ?s rdf:type + { + ?s rdf:type ?type . + ?s ?prop ?match . + FILTER ( + strstarts(lcase(str(?match)), "test") && !(?match != ?label && strstarts(lcase(str(?label)), "test")) + ) + OPTIONAL { + ?s skos:prefLabel ?label . + FILTER (langMatches(lang(?label), "en")) + } + OPTIONAL { # in case previous OPTIONAL block gives no labels + ?s ?prop ?match . + ?s skos:prefLabel ?label . + FILTER (langMatches(lang(?label), lang(?match))) } + } + FILTER NOT EXISTS { ?s owl:deprecated true } + } + BIND(IF(?prop = skos:prefLabel && ?match != ?label, ?match, "") as ?plabel) + BIND(IF(?prop = skos:altLabel, ?match, "") as ?alabel) + BIND(IF(?prop = skos:hiddenLabel, ?match, "") as ?hlabel) + VALUES (?prop) { (skos:prefLabel) (skos:altLabel) (skos:hiddenLabel) } + } + GROUP BY ?match ?s ?label ?plabel ?alabel ?hlabel ?prop + ORDER BY lcase(str(?match)) lang(?match) + LIMIT 10 + } +} diff --git a/samples/SQL/videodb.cql b/samples/SQL/videodb.cql new file mode 100644 index 00000000..ffa3170e --- /dev/null +++ b/samples/SQL/videodb.cql @@ -0,0 +1,85 @@ +CREATE KEYSPACE videodb WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 }; + +use videodb; + +// Basic entity table +// Object mapping ? +CREATE TABLE users ( + username varchar, + firstname varchar, + lastname varchar, + email varchar, + password varchar, + created_date timestamp, + total_credits int, + credit_change_date timeuuid, + PRIMARY KEY (username) +); + +// One-to-many entity table +CREATE TABLE videos ( + videoid uuid, + videoname varchar, + username varchar, + description varchar, + tags list, + upload_date timestamp, + PRIMARY KEY (videoid) +); + +// One-to-many from the user point of view +// Also know as a lookup table +CREATE TABLE username_video_index ( + username varchar, + videoid uuid, + upload_date timestamp, + videoname varchar, + PRIMARY KEY (username, videoid) +); + +// Counter table +CREATE TABLE video_rating ( + videoid uuid, + rating_counter counter, + rating_total counter, + PRIMARY KEY (videoid) +); + +// Creating index tables for tab keywords +CREATE TABLE tag_index ( + tag varchar, + videoid uuid, + timestamp timestamp, + PRIMARY KEY (tag, videoid) +); + +// Comments as a many-to-many +// Looking from the video side to many users +CREATE TABLE comments_by_video ( + videoid uuid, + username varchar, + comment_ts timestamp, + comment varchar, + PRIMARY KEY (videoid,comment_ts,username) +) WITH CLUSTERING ORDER BY (comment_ts DESC, username ASC); + +// looking from the user side to many videos +CREATE TABLE comments_by_user ( + username varchar, + videoid uuid, + comment_ts timestamp, + comment varchar, + PRIMARY KEY (username,comment_ts,videoid) +) WITH CLUSTERING ORDER BY (comment_ts DESC, videoid ASC); + + +// Time series wide row with reverse comparator +CREATE TABLE video_event ( + videoid uuid, + username varchar, + event varchar, + event_timestamp timeuuid, + video_timestamp bigint, + PRIMARY KEY ((videoid,username), event_timestamp,event) +) WITH CLUSTERING ORDER BY (event_timestamp DESC,event ASC); + diff --git a/samples/SQL/videodb.ddl b/samples/SQL/videodb.ddl new file mode 100644 index 00000000..ffa3170e --- /dev/null +++ b/samples/SQL/videodb.ddl @@ -0,0 +1,85 @@ +CREATE KEYSPACE videodb WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 }; + +use videodb; + +// Basic entity table +// Object mapping ? +CREATE TABLE users ( + username varchar, + firstname varchar, + lastname varchar, + email varchar, + password varchar, + created_date timestamp, + total_credits int, + credit_change_date timeuuid, + PRIMARY KEY (username) +); + +// One-to-many entity table +CREATE TABLE videos ( + videoid uuid, + videoname varchar, + username varchar, + description varchar, + tags list, + upload_date timestamp, + PRIMARY KEY (videoid) +); + +// One-to-many from the user point of view +// Also know as a lookup table +CREATE TABLE username_video_index ( + username varchar, + videoid uuid, + upload_date timestamp, + videoname varchar, + PRIMARY KEY (username, videoid) +); + +// Counter table +CREATE TABLE video_rating ( + videoid uuid, + rating_counter counter, + rating_total counter, + PRIMARY KEY (videoid) +); + +// Creating index tables for tab keywords +CREATE TABLE tag_index ( + tag varchar, + videoid uuid, + timestamp timestamp, + PRIMARY KEY (tag, videoid) +); + +// Comments as a many-to-many +// Looking from the video side to many users +CREATE TABLE comments_by_video ( + videoid uuid, + username varchar, + comment_ts timestamp, + comment varchar, + PRIMARY KEY (videoid,comment_ts,username) +) WITH CLUSTERING ORDER BY (comment_ts DESC, username ASC); + +// looking from the user side to many videos +CREATE TABLE comments_by_user ( + username varchar, + videoid uuid, + comment_ts timestamp, + comment varchar, + PRIMARY KEY (username,comment_ts,videoid) +) WITH CLUSTERING ORDER BY (comment_ts DESC, videoid ASC); + + +// Time series wide row with reverse comparator +CREATE TABLE video_event ( + videoid uuid, + username varchar, + event varchar, + event_timestamp timeuuid, + video_timestamp bigint, + PRIMARY KEY ((videoid,username), event_timestamp,event) +) WITH CLUSTERING ORDER BY (event_timestamp DESC,event ASC); + diff --git a/samples/Sage/polinomios.sagews b/samples/Sage/polinomios.sagews new file mode 100644 index 00000000..4edb2234 --- /dev/null +++ b/samples/Sage/polinomios.sagews @@ -0,0 +1,136 @@ +# -*- coding: utf-8 -*- +# +# Funciones en Python/Sage para el trabajo con polinomios con una +# incógnita (x). +# +# Copyright (C) 2014-2015, David Abián +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the Free +# Software Foundation, either version 3 of the License, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +# more details. +# +# You should have received a copy of the GNU General Public License along with +# this program. If not, see . + +def pols (grado=-1, K=GF(2), mostrar=False): + """Devuelve la lista de polinomios constantes y no constantes de + coeficientes mónicos y grado igual o menor que el especificado. + Si el grado indicado no es válido, devuelve una lista vacía. + """ + lpols = [] + if not grado.is_integer(): + grado = grado.round() + if grado >= 0: + var('x') + xs = vector([(x^i) for i in range(grado+1)]) + V = VectorSpace(K,grado+1) + lpols = [cs*xs for cs in V] + if mostrar: + for pol in lpols: + print pol + return lpols + +def polsNoCtes (grado=-1, K=GF(2), mostrar=False): + """Devuelve la lista de polinomios no constantes de coeficientes mónicos y + grado igual o menor que el especificado. + Si el grado indicado no es válido, devuelve una lista vacía. + """ + lpols = [] + if not grado.is_integer(): + grado = grado.round() + if grado >= 0: + var('x') + xs = vector([(x^i) for i in range(grado+1)]) + for cs in K^(grado+1): + if cs[:grado] != vector(grado*[0]): # no constantes + lpols += [cs*xs] + if mostrar: + for pol in lpols: + print pol + return lpols + +def polsMismoGrado (grado=-1, K=GF(2), mostrar=False): + """Devuelve la lista de polinomios de coeficientes mónicos del grado + especificado. + Si el grado indicado no es válido, devuelve una lista vacía. + """ + lpols = [] + if not grado.is_integer(): + grado = grado.round() + if grado >= 0: + var('x') + xs = vector([(x^(grado-i)) for i in [0..grado]]) + for cs in K^(grado+1): + if cs[0] != 0: # polinomios del mismo grado + lpols += [cs*xs] + if mostrar: + for pol in lpols: + print pol + return lpols + +def excluirReducibles (lpols=[], mostrar=False): + """Filtra una lista dada de polinomios de coeficientes mónicos y devuelve + aquellos irreducibles. + """ + var('x') + irreds = [] + for p in lpols: + fp = (p.factor_list()) + if len(fp) == 1 and fp[0][1] == 1: + irreds += [p] + if mostrar: + for pol in irreds: + print pol + return irreds + +def vecPol (vec=random_vector(GF(2),0)): + """Transforma los coeficientes dados en forma de vector en el polinomio + que representan. + + Por ejemplo, con vecPol(vector([1,0,3,1])) se obtiene x³ + 3*x + 1. + + Para la función opuesta, véase polVec(). + """ + var('x') + xs = vector([x^(len(vec)-1-i) for i in range(len(vec))]) + return vec*xs + +def polVec (p=None): + """Devuelve el vector de coeficientes del polinomio dado que acompañan a la + incógnita x, de mayor a menor grado. + + Por ejemplo, con polVec(x^3 + 3*x + 1) se obtiene el vector (1, 0, 3, 1). + + Para la función opuesta, véase vecPol(). + """ + cs = [] + if p != None: + var('x') + p(x) = p + for i in [0..p(x).degree(x)]: + cs.append(p(x).coefficient(x,i)) + cs = list(reversed(cs)) + return vector(cs) + +def completar2 (p=0): + """Aplica el método de completar cuadrados en parábolas al polinomio dado de + grado 2 y lo devuelve en su nueva forma. + + Si el polinomio dado no es válido, devuelve 0. + + Por ejemplo, con complCuad(3*x^2 + 12*x + 5) se obtiene 3*(x + 2)^2 - 7. + """ + var('x') + p(x) = p.expand() + if p(x).degree(x) != 2: + p(x) = 0 + else: + cs = polVec(p(x)) + p(x) = cs[0]*(x+(cs[1]/(2*cs[0])))^2+(4*cs[0]*cs[2]-cs[1]^2)/(4*cs[0]) + return p(x) diff --git a/samples/SaltStack/eval.sls b/samples/SaltStack/eval.sls new file mode 100644 index 00000000..f954c8cf --- /dev/null +++ b/samples/SaltStack/eval.sls @@ -0,0 +1,48 @@ +ceph: + pkg.installed: + - refresh: True + service: + - dead + - enable: False + - require: + - file: /etc/eval.conf + {% if grains['os'] == 'Ubuntu'%} + - file: /etc/apt/sources.list.d/ceph.list + {% endif %} + +ceph-mds: + pkg.installed: + - require: + - pkg: ceph + +include: + - ceph.extras + +{% if grains['os'] == 'Ubuntu'%} +/etc/apt/sources.list.d/ceph.list: + file.managed: + - source: salt://ceph/apt.list + - template: jinja + - require: + - cmd: repo-key + +repo-key: + cmd.run: + - name: 'wget -q -O - https://raw.github.com/release.asc | sudo apt-key add -' + - unless: 'apt-key list | grep -q -i ceph' +{% endif %} + +/etc/ceph/ceph.conf: + file.managed: + - source: salt://ceph/eval.conf + - template: jinja + - makedirs: true + +/var/lib/ceph: + file.directory: + - names: + {% for dir in 'mon.a','osd.0','osd.1','mds.a' %} + - /var/lib/ceph/{{ dir.split('.')[0] }}/ceph-{{ dir.split('.')[1] }} + {% endfor %} + - require: + - pkg: ceph diff --git a/samples/SaltStack/top.sls b/samples/SaltStack/top.sls new file mode 100644 index 00000000..12810e8e --- /dev/null +++ b/samples/SaltStack/top.sls @@ -0,0 +1,4 @@ +base: + '*': + - packages + - coffeestats diff --git a/samples/Scheme/lambdastar.sls b/samples/Scheme/lambdastar.sls new file mode 100644 index 00000000..7388b07f --- /dev/null +++ b/samples/Scheme/lambdastar.sls @@ -0,0 +1,46 @@ +(library (lambdastar) + (export (rename (lambda* lambda))) + (import (rnrs)) + +(define-syntax lambda* + (syntax-rules () + ((_ a* e* ...) + ( lambda*-h a* (let () e* ...))))) + +(define-syntax lambda*-h + (syntax-rules () + ((_ () e) + (lambda a* (if (null? a*) e (apply (e) a*)))) + ((_ (a a* ...) e) (posary-h (a a* ...) e)) + ((_ (a a* ... . rest) e) + (polyvariadic-h (a a* ... . rest) e)) + ((_ a* e) (lambda a* e)))) + +(define-syntax posary-h + (syntax-rules () + ((_ (a a* ...) e) + (letrec + ((rec + (case-lambda + (() rec) + ((a a* ...) e) + ((a a* ... . rest) + (apply (rec a a* ...) rest)) + (some (get-more rec some))))) + rec)))) + +(define-syntax polyvariadic-h + (syntax-rules () + ((_ (a a* ... . rest) e) + (letrec + ((rec + (case-lambda + (() rec) + ((a a* ... . rest) e) + (some (get-more rec some))))) + rec)))) + +(define get-more + (lambda (rec some) + (lambda more + (apply rec (append some more)))))) \ No newline at end of file diff --git a/samples/Text/messages.fr b/samples/Text/messages.fr index da0269bb..c8108873 100644 --- a/samples/Text/messages.fr +++ b/samples/Text/messages.fr @@ -1 +1,2 @@ the green potato=la pomme de terre verte +le nouveau type de musique=the new type of music diff --git a/samples/Turtle/gnd-record.ttl b/samples/Turtle/gnd-record.ttl new file mode 100644 index 00000000..ef1d2c35 --- /dev/null +++ b/samples/Turtle/gnd-record.ttl @@ -0,0 +1,183 @@ +@prefix foaf: . +@prefix owl: . +@prefix gndo: . +@prefix xsd: . + + + a ; + foaf:page ; + owl:sameAs , , ; + gndo:gndIdentifier "118514768" ; + gndo:oldAuthorityNumber "(DE-588)1022091077", "(DE-588a)118514768", "(DE-588a)141399074", "(DE-588a)139089691", "(DE-588a)141300248", "(DE-588a)136949541", "(DE-588a)134336232", "(DE-588a)12794544X", "(DE-588a)12736630X", "(DE-588a)12722811X", "(DE-588a)127228098", "(DE-588a)127228101" ; + gndo:variantNameForThePerson "Brêcht, Becton", "Brecht, Bert", "Brecht, Bertolʹ", "Brecht, Berthold", "Brecht, Bertholt", "Brecht, Bertold", "Brecht, B.", "Brecht, Eugen Berthold Friedrich", "Brecht, ...", "Brecht-Eisler, ...", "Becht, Bertolt", "Beituo'erte-Bulaixite", "Berchito, B.", "Brechtas, B.", "Brechts, Bertolts", "Brehd, Berd", "Breht, Bertolt", "Brehts, Bertolts", "Breḳhṭ, Bārṭolṭ", "Brekt, Berṭolṭ", "Brekṭ, Berṭōlṭ", "Breḳṭ, Berṭôlṭ", "Breśṭ, Berṭalṭa", "Breṣṭa, Barṭolṭa", "Brišt, Bartūlt", "Brišt, Birtūld", "Brišt, Birtult", "Buchito, Berutorutu", "Bulaixite, Beituo'erte", "Bulaixite, ...", "Burehito, Berutoruto", "Burehito, ...", "B. B.", "Larsen, Berthold", "Mprecht, Mpertolt", "Mprecht, ...", "Pulaihsit'ê, Peit'oĉrht'ê", "Pulaihsit'ê, ...", "Pŭrehit'ŭ, Peŏt'olt'ŭ", "Bŭrehit'ŭ, Beŏt'olt'ŭ", "برشت، برتولد", "브레히트, 베르톨트", "ברכט, ברטולט", "贝·布莱希特", "布莱希特, 贝", "ブレヒト, ベルトルト" ; + gndo:variantNameEntityForThePerson [ + gndo:forename "Becton" ; + gndo:surname "Brêcht" + ], [ + gndo:forename "Bert" ; + gndo:surname "Brecht" + ], [ + gndo:forename "Bertolʹ" ; + gndo:surname "Brecht" + ], [ + gndo:forename "Berthold" ; + gndo:surname "Brecht" + ], [ + gndo:forename "Bertholt" ; + gndo:surname "Brecht" + ], [ + gndo:forename "Bertold" ; + gndo:surname "Brecht" + ], [ + gndo:forename "B." ; + gndo:surname "Brecht" + ], [ + gndo:forename "Eugen Berthold Friedrich" ; + gndo:surname "Brecht" + ], [ + gndo:forename "..." ; + gndo:surname "Brecht" + ], [ + gndo:forename "..." ; + gndo:surname "Brecht-Eisler" + ], [ + gndo:forename "Bertolt" ; + gndo:surname "Becht" + ], [ gndo:personalName "Beituo'erte-Bulaixite" ], [ + gndo:forename "B." ; + gndo:surname "Berchito" + ], [ + gndo:forename "B." ; + gndo:surname "Brechtas" + ], [ + gndo:forename "Bertolts" ; + gndo:surname "Brechts" + ], [ + gndo:forename "Berd" ; + gndo:surname "Brehd" + ], [ + gndo:forename "Bertolt" ; + gndo:surname "Breht" + ], [ + gndo:forename "Bertolts" ; + gndo:surname "Brehts" + ], [ + gndo:forename "Bārṭolṭ" ; + gndo:surname "Breḳhṭ" + ], [ + gndo:forename "Berṭolṭ" ; + gndo:surname "Brekt" + ], [ + gndo:forename "Berṭōlṭ" ; + gndo:surname "Brekṭ" + ], [ + gndo:forename "Berṭôlṭ" ; + gndo:surname "Breḳṭ" + ], [ + gndo:forename "Berṭalṭa" ; + gndo:surname "Breśṭ" + ], [ + gndo:forename "Barṭolṭa" ; + gndo:surname "Breṣṭa" + ], [ + gndo:forename "Bartūlt" ; + gndo:surname "Brišt" + ], [ + gndo:forename "Birtūld" ; + gndo:surname "Brišt" + ], [ + gndo:forename "Birtult" ; + gndo:surname "Brišt" + ], [ + gndo:forename "Berutorutu" ; + gndo:surname "Buchito" + ], [ + gndo:forename "Beituo'erte" ; + gndo:surname "Bulaixite" + ], [ + gndo:forename "..." ; + gndo:surname "Bulaixite" + ], [ + gndo:forename "Berutoruto" ; + gndo:surname "Burehito" + ], [ + gndo:forename "..." ; + gndo:surname "Burehito" + ], [ gndo:personalName "B. B." ], [ + gndo:forename "Berthold" ; + gndo:surname "Larsen" + ], [ + gndo:forename "Mpertolt" ; + gndo:surname "Mprecht" + ], [ + gndo:forename "..." ; + gndo:surname "Mprecht" + ], [ + gndo:forename "Peit'oĉrht'ê" ; + gndo:surname "Pulaihsit'ê" + ], [ + gndo:forename "..." ; + gndo:surname "Pulaihsit'ê" + ], [ + gndo:forename "Peŏt'olt'ŭ" ; + gndo:surname "Pŭrehit'ŭ" + ], [ + gndo:forename "Beŏt'olt'ŭ" ; + gndo:surname "Bŭrehit'ŭ" + ], [ gndo:personalName "برشت، برتولد" ], [ + gndo:forename "베르톨트" ; + gndo:surname "브레히트" + ], [ + gndo:forename "ברטולט" ; + gndo:surname "ברכט" + ], [ gndo:personalName "贝·布莱希特" ], [ + gndo:forename "贝" ; + gndo:surname "布莱希特" + ], [ + gndo:forename "ベルトルト" ; + gndo:surname "ブレヒト" + ] ; + gndo:preferredNameForThePerson "Brecht, Bertolt" ; + gndo:preferredNameEntityForThePerson [ + gndo:forename "Bertolt" ; + gndo:surname "Brecht" + ] ; + gndo:familialRelationship , , , , , , , , , , , , , , ; + gndo:professionOrOccupation , , , , , , ; + gndo:playedInstrument ; + gndo:gndSubjectCategory , , ; + gndo:geographicAreaCode ; + gndo:languageCode ; + gndo:placeOfBirth ; + gndo:placeOfDeath ; + gndo:placeOfExile , ; + gndo:gender ; + gndo:dateOfBirth "1898-02-10"^^xsd:date ; + gndo:dateOfDeath "1956-08-14"^^xsd:date . + + gndo:preferredNameForThePerson "Brecht, Berthold Friedrich" . + gndo:preferredNameForThePerson "Banholzer, Paula" . + gndo:preferredNameForThePerson "Neher, Carola" . + gndo:preferredNameForThePerson "Banholzer, Frank" . + gndo:preferredNameForThePerson "Berlau, Ruth" . + gndo:preferredNameForThePerson "Steffin, Margarete" . + gndo:preferredNameForThePerson "Zoff, Marianne" . + gndo:preferredNameForThePerson "Weigel, Helene" . + gndo:preferredNameForThePerson "Reichel, Käthe" . + gndo:preferredNameForThePerson "Hiob, Hanne" . + gndo:preferredNameForThePerson "Brecht, Stefan" . + gndo:preferredNameForThePerson "Brecht-Schall, Barbara" . + gndo:preferredNameForThePerson "Schall, Ekkehard" . + gndo:preferredNameForThePerson "Brezing, Joseph Friedrich" . + gndo:preferredNameForThePerson "Brezing, Friederike" . + gndo:preferredNameForTheSubjectHeading "Theaterregisseur" . + gndo:preferredNameForTheSubjectHeading "Dramatiker" . + gndo:preferredNameForTheSubjectHeading "Schauspieler" . + gndo:preferredNameForTheSubjectHeading "Lyriker" . + gndo:preferredNameForTheSubjectHeading "Schriftsteller" . + gndo:preferredNameForTheSubjectHeading "Regisseur" . + gndo:preferredNameForTheSubjectHeading "Drehbuchautor" . + gndo:preferredNameForThePlaceOrGeographicName "Augsburg" . + gndo:preferredNameForThePlaceOrGeographicName "Berlin" . + gndo:preferredNameForThePlaceOrGeographicName "Dänemark" . + gndo:preferredNameForThePlaceOrGeographicName "Schweden" . \ No newline at end of file diff --git a/samples/Turtle/rdf-syntax-grammar.ttl b/samples/Turtle/rdf-syntax-grammar.ttl new file mode 100644 index 00000000..edcd4db2 --- /dev/null +++ b/samples/Turtle/rdf-syntax-grammar.ttl @@ -0,0 +1,10 @@ +@prefix rdf: . +@prefix dc: . +@prefix ex: . + + + dc:title "RDF/XML Syntax Specification (Revised)" ; + ex:editor [ + ex:fullname "Dave Beckett"; + ex:homePage + ] . \ No newline at end of file diff --git a/samples/Web Ontology Language/sample.owl b/samples/Web Ontology Language/sample.owl new file mode 100644 index 00000000..612186db --- /dev/null +++ b/samples/Web Ontology Language/sample.owl @@ -0,0 +1,6858 @@ + + + + + + + +]> + + + + + v.1.4. Added Food class (used in domain/range of hasIngredient), Added several hasCountryOfOrigin restrictions on pizzas, Made hasTopping invers functional + version 1.5 + v.1.5. Removed protege.owl import and references. Made ontology URI date-independent + An example ontology that contains all constructs required for the various versions of the Pizza Tutorial run by Manchester University (see http://www.co-ode.org/resources/tutorials/) + + + + + + + + + + + + + Americana + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AmericanaPicante + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CoberturaDeAnchovies + + + + + + + + + + + CoberturaDeArtichoke + + + + + + + + + + + + + + + + + CoberturaDeAspargos + + + + + + + + + + + + + + + + + Cajun + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CoberturaDeCajun + + + + + + + + + + + + + + + + + CoberturaDeCaper + + + + + + + + + + + + + + + + + Capricciosa + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Caprina + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CoberturaDeQueijo + + + + + + + + + + + Any pizza that has at least 1 cheese topping. + PizzaComQueijo + + + + + + + + + + + + + + + + + + + CoberturaDeQueijoComVegetais + This class will be inconsistent. This is because we have given it 2 disjoint parents, which means it could never have any members (as nothing can simultaneously be a CheeseTopping and a VegetableTopping). NB Called ProbeInconsistentTopping in the ProtegeOWL Tutorial. + + + + + + + + + + + + + + CoberturaDeFrango + + + + + + + + + + + + + + + + + Pais + A class that is equivalent to the set of individuals that are described in the enumeration - ie Countries can only be either America, England, France, Germany or Italy and nothing else. Note that these individuals have been asserted to be allDifferent from each other. + + + + + + + + + + + + + + + + + + + + + + + + BaseEspessa + + + + + + + + + + + + + + + + + Fiorentina + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CoberturaDePeixe + + + + + + + + + + + + + + + + + + + + + + + + + + + CoberturaQuatroQueijos + + + + + + + + + + + + + + + + + QuatroQueijos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CoberturaDeFrutas + + + + + + + + + + + FrutosDoMar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CoberturaDeAlho + + + + + + + + + + + + + + + + + Giardiniera + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CoberturaDeQueijoDeCabra + + + + + + + + + + + + + + + + + CoberturaDeGorgonzola + + + + + + + + + + + + + + + + + CoberturaDePimentaoVerde + + + + + + + + + + + CoberturaDePresunto + + + + + + + + + + + CoberturaDeErvas + + + + + + + + + + + Picante + + + + + + + + + + + CoberturaDePimentaoVerdePicante + + + + + + + + + + + + + + + + + CoberturaDeBifePicante + + + + + + + + + + + + + + + + + A class to demonstrate mistakes made with setting a property domain. The property hasTopping has a domain of Pizza. This means that the reasoner can infer that all individuals using the hasTopping property must be of type Pizza. Because of the restriction on this class, all members of IceCream must use the hasTopping property, and therefore must also be members of Pizza. However, Pizza and IceCream are disjoint, so this causes an inconsistency. If they were not disjoint, IceCream would be inferred to be a subclass of Pizza. + Sorvete + + + + + + + + + + + + + + + + + PizzaInteressante + Any pizza that has at least 3 toppings. Note that this is a cardinality constraint on the hasTopping property and NOT a qualified cardinality constraint (QCR). A QCR would specify from which class the members in this relationship must be. eg has at least 3 toppings from PizzaTopping. This is currently not supported in OWL. + + + + + + 3 + + + + + + + + + + + + + CoberturaDeJalapeno + + + + + + + + + + + + + + + + + LaReine + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CoberturaDeLeek + + + + + + + + + + + + + + + + + Margherita + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CoberturaDeCarne + + + + + + + + + + + Any pizza that has at least one meat topping + PizzaDeCarne + + + + + + + + + + + + + + + + + + + Media + + + + + + + + + + + NaoPicante + + + + + + + + + + + CoberturaDeFrutosDoMarMistos + + + + + + + + + + + CoberturaDeMozzarella + + + + + + + + + + + + + + + + + + + + + + + Cogumelo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CoberturaDeCogumelo + + + + + + + + + + + + + + + + + A pizza that can be found on a pizza menu + PizzaComUmNome + + + + + + + + + + + Napoletana + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Any Pizza that is not a VegetarianPizza + PizzaNaoVegetariana + + + + + + + + + + + + + + + + + + + + CoberturaDeCastanha + + + + + + + + + + + + + + + + + CoberturaDeAzeitona + + + + + + + + + + + + + + + + + CoberturaDeCebola + + + + + + + + + + + + + + + + + CoberturaDePrezuntoParma + + + + + + + + + + + + + + + + + Parmense + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CoberturaDeParmesao + + + + + + + + + + + + + + + + + CoberturaPeperonata + + + + + + + + + + + + + + + + + CoberturaDeCalabreza + + + + + + + + + + + + + + + + + CoberturaDePimentao + + + + + + + + + + + CoberturaPetitPois + + + + + + + + + + + + + + + + + CoberturaPineKernels + + + + + + + + + + + Pizza + + + + + + + + + + + + + + + + + BaseDaPizza + + + + + + + + + + + CoberturaDaPizza + + + + + + + + + + + PolloAdAstra + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CoberturaDeCamarao + + + + + + + + + + + CoberturaPrinceCarlo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + QuatroQueijos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This defined class has conditions that are part of the definition: ie any Pizza that has the country of origin, Italy is a RealItalianPizza. It also has conditions that merely describe the members - that all RealItalianPizzas must only have ThinAndCrispy bases. In essence, all pizzas from Italy must have ThinAndCrispy bases. + PizzaItalianaReal + + + + + + + + + + + + + + + + + + + + + + + + + CoberturaDeCebolaVermelha + + + + + + + + + + + CoberturaRocket + + + + + + + + + + + + + + + + + Rosa + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CoberturaRosemary + + + + + + + + + + + + + + + + + CoberturaEmMolho + + + + + + + + + + + Siciliana + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CoberturaDeTomateFatiado + + + + + + + + + + + + + + + + + SloppyGiuseppe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Soho + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A ValuePartition that describes only values from Hot, Medium or Mild. NB Subclasses can themselves be divided up into further partitions. + Tempero + + + + + + + + + + + + + + + + + + + + Any pizza that has a spicy topping is a SpicyPizza + PizzaTemperada + + + + + + + + + + + + + + + + + + + An alternative definition for the SpicyPizza which does away with needing a definition of SpicyTopping and uses a slightly more complicated restriction: Pizzas that have at least one topping that is both a PizzaTopping and has spiciness hot are members of this class. + PizzaTemperadaEquivalente + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Any pizza topping that has spiciness Hot + CoberturaTemperada + + + + + + + + + + + + + + + + + + + CoberturaDeEspinafre + + + + + + + + + + + + + + + + + CoberturaSultana + + + + + + + + + + + + + + + + + CoberturaDeTomateRessecadoAoSol + + + + + + + + + + + + + + + + + CoberturaDePimentaoDoce + + + + + + + + + + + + + + + + + BaseFinaEQuebradica + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MolhoTobascoPepper + + + + + + + + + + + + + + + + + CoberturaDeTomate + + + + + + + + + + + + + + + + + PizzaAberta + An unclosed Pizza cannot be inferred to be either a VegetarianPizza or a NonVegetarianPizza, because it might have other toppings. + + + + + + + + + + + + + + + + + ValorDaParticao + A ValuePartition is a pattern that describes a restricted set of classes from which a property can be associated. The parent class is used in restrictions, and the covering axiom means that only members of the subclasses may be used as values. The possible subclasses cannot be extended without updating the ValuePartition class. + + + + + + + + CoberturaDeVegetais + + + + + + + + + + + PizzaVegetariana + Any pizza that does not have fish topping and does not have meat topping is a VegetarianPizza. Members of this class do not need to have any toppings at all. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Any pizza that only has vegetarian toppings or no toppings is a VegetarianPizzaEquiv1. Should be inferred to be equivalent to VegetarianPizzaEquiv2. Not equivalent to VegetarianPizza because PizzaTopping is not covering + PizzaVegetarianaEquivalente1 + + + + + + + + + + + + + + + + + + + An alternative to VegetarianPizzaEquiv1 that does not require a definition of VegetarianTopping. Perhaps more difficult to maintain. Not equivalent to VegetarianPizza + PizzaVegetarianaEquivalente2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + An example of a covering axiom. VegetarianTopping is equivalent to the union of all toppings in the given axiom. VegetarianToppings can only be Cheese or Vegetable or....etc. + CoberturaVegetariana + + + + + + + + + + + + + + + + + + + + + + + + + Veneziana + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NB Transitive - the ingredients of ingredients are ingredients of the whole + + + + + + + + + + + + + + + + + + A property created to be used with the ValuePartition - Spiciness. + + + + + + + + + + + + Note that hasTopping is inverse functional because isToppingOf is functional + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The inverse property tree to hasIngredient - all subproperties and attributes of the properties should reflect those under hasIngredient. + + + + + + + + + + + + + + + + + + Any given instance of topping should only be added to a single pizza (no cheap half-measures on our pizzas) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/XML/FXMLSample.fxml b/samples/XML/FXMLSample.fxml new file mode 100644 index 00000000..30b56b04 --- /dev/null +++ b/samples/XML/FXMLSample.fxml @@ -0,0 +1,30 @@ + + + + + + + + + +
+ + + + + + + +
+ + + + + + + +
diff --git a/samples/XML/libsomething.dll.config b/samples/XML/libsomething.dll.config new file mode 100644 index 00000000..3d54afea --- /dev/null +++ b/samples/XML/libsomething.dll.config @@ -0,0 +1,6 @@ + + + + + + diff --git a/samples/XML/phpunit.xml.dist b/samples/XML/phpunit.xml.dist new file mode 100644 index 00000000..1d192902 --- /dev/null +++ b/samples/XML/phpunit.xml.dist @@ -0,0 +1,14 @@ + + + + + tests + + + + + src + + + diff --git a/script/download-grammars b/script/convert-grammars similarity index 76% rename from script/download-grammars rename to script/convert-grammars index 3792f451..7c45a7c8 100755 --- a/script/download-grammars +++ b/script/convert-grammars @@ -2,8 +2,10 @@ require 'json' require 'net/http' +require 'optparse' require 'plist' require 'set' +require 'thread' require 'tmpdir' require 'uri' require 'yaml' @@ -13,6 +15,13 @@ GRAMMARS_PATH = File.join(ROOT, "grammars") SOURCES_FILE = File.join(ROOT, "grammars.yml") CSONC = File.join(ROOT, "node_modules", ".bin", "csonc") +$options = { + :add => false, + :install => true, + :output => SOURCES_FILE, + :remote => true, +} + class SingleFile def initialize(path) @path = path @@ -35,7 +44,7 @@ class DirectoryPackage path.split('/')[-2] == 'Syntaxes' when '.tmlanguage' true - when '.cson' + when '.cson', '.json' path.split('/')[-2] == 'grammars' else false @@ -143,22 +152,24 @@ def load_grammar(path) cson = `"#{CSONC}" "#{path}"` raise "Failed to convert CSON grammar '#{path}': #{$?.to_s}" unless $?.success? JSON.parse(cson) + when '.json' + JSON.parse(File.read(path)) else raise "Invalid document type #{path}" end end -def install_grammar(tmp_dir, source, all_scopes) +def load_grammars(tmp_dir, source, all_scopes) is_url = source.start_with?("http:", "https:") - is_single_file = source.end_with?('.tmLanguage', '.plist') + return [] if is_url && !$options[:remote] p = if !is_url - if is_single_file - SingleFile.new(source) - else + if File.directory?(source) DirectoryPackage.new(source) + else + SingleFile.new(source) end - elsif is_single_file + elsif source.end_with?('.tmLanguage', '.plist') SingleGrammar.new(source) elsif source.start_with?('https://github.com') GitHubPackage.new(source) @@ -172,9 +183,7 @@ def install_grammar(tmp_dir, source, all_scopes) raise "Unsupported source: #{source}" unless p - installed = [] - - p.fetch(tmp_dir).each do |path| + p.fetch(tmp_dir).map do |path| grammar = load_grammar(path) scope = grammar['scopeName'] @@ -184,13 +193,21 @@ def install_grammar(tmp_dir, source, all_scopes) " Previous package: #{all_scopes[scope]}" next end - - File.write(File.join(GRAMMARS_PATH, "#{scope}.json"), JSON.pretty_generate(grammar)) all_scopes[scope] = p.url + grammar + end +end + +def install_grammars(grammars, path) + installed = [] + + grammars.each do |grammar| + scope = grammar['scopeName'] + File.write(File.join(GRAMMARS_PATH, "#{scope}.json"), JSON.pretty_generate(grammar)) installed << scope end - $stderr.puts("OK #{p.url} (#{installed.join(', ')})") + $stderr.puts("OK #{path} (#{installed.join(', ')})") end def run_thread(queue, all_scopes) @@ -206,7 +223,8 @@ def run_thread(queue, all_scopes) dir = "#{tmpdir}/#{index}" Dir.mkdir(dir) - install_grammar(dir, source, all_scopes) + grammars = load_grammars(dir, source, all_scopes) + install_grammars(grammars, source) if $options[:install] end end end @@ -217,7 +235,7 @@ def generate_yaml(all_scopes, base) out[value] << key end - yaml = yaml.sort.to_h + yaml = Hash[yaml.sort] yaml.each { |k, v| v.sort! } yaml end @@ -232,9 +250,10 @@ def main(sources) all_scopes = {} - if ARGV[0] == '--add' + if source = $options[:add] Dir.mktmpdir do |tmpdir| - install_grammar(tmpdir, ARGV[1], all_scopes) + grammars = load_grammars(tmpdir, source, all_scopes) + install_grammars(grammars, source) if $options[:install] end generate_yaml(all_scopes, sources) else @@ -252,12 +271,34 @@ def main(sources) end end +OptionParser.new do |opts| + opts.banner = "Usage: #{$0} [options]" + + opts.on("--add GRAMMAR", "Add a new grammar. GRAMMAR may be a file path or URL.") do |a| + $options[:add] = a + end + + opts.on("--[no-]install", "Install grammars into grammars/ directory.") do |i| + $options[:install] = i + end + + opts.on("--output FILE", "Write output to FILE. Use - for stdout.") do |o| + $options[:output] = o == "-" ? $stdout : o + end + + opts.on("--[no-]remote", "Download remote grammars.") do |r| + $options[:remote] = r + end +end.parse! + sources = File.open(SOURCES_FILE) do |file| YAML.load(file) end yaml = main(sources) -File.write(SOURCES_FILE, YAML.dump(yaml)) - -$stderr.puts("Done") +if $options[:output].is_a?(IO) + $options[:output].write(YAML.dump(yaml)) +else + File.write($options[:output], YAML.dump(yaml)) +end diff --git a/script/travis/before_install b/script/travis/before_install new file mode 100755 index 00000000..442f6718 --- /dev/null +++ b/script/travis/before_install @@ -0,0 +1,20 @@ +#!/bin/sh + +set -ex + +# Fetch all commits/refs needed to run our tests. +git fetch origin master:master v2.0.0:v2.0.0 test/attributes:test/attributes test/master:test/master + +script/vendor-deb libicu48 libicu-dev +if ruby -e 'exit RUBY_VERSION >= "2.0" && RUBY_VERSION < "2.1"'; then + # Workaround for https://bugs.ruby-lang.org/issues/8074. We can't use this + # solution on all versions of Ruby due to + # https://github.com/bundler/bundler/pull/3338. + bundle config build.charlock_holmes --with-icu-include=$(pwd)/vendor/debs/include --with-icu-lib=$(pwd)/vendor/debs/lib +else + bundle config build.charlock_holmes --with-icu-dir=$(pwd)/vendor/debs +fi + +git submodule init +git submodule sync --quiet +script/fast-submodule-update diff --git a/script/vendor-deb b/script/vendor-deb new file mode 100755 index 00000000..ebad3e76 --- /dev/null +++ b/script/vendor-deb @@ -0,0 +1,13 @@ +#!/bin/sh + +set -ex + +cd "$(dirname "$0")/.." + +mkdir -p vendor/apt vendor/debs + +(cd vendor/apt && apt-get --assume-yes download "$@") + +for deb in vendor/apt/*.deb; do + ar p $deb data.tar.gz | tar -vzxC vendor/debs --strip-components=2 +done diff --git a/test/helper.rb b/test/helper.rb index 780819dc..ebfeefc7 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -1,4 +1,4 @@ require "bundler/setup" -require "test/unit" +require "minitest/autorun" require "mocha/setup" require "linguist" diff --git a/test/test_blob.rb b/test/test_blob.rb index 6e588442..4c4f7978 100644 --- a/test/test_blob.rb +++ b/test/test_blob.rb @@ -1,6 +1,6 @@ require_relative "./helper" -class TestBlob < Test::Unit::TestCase +class TestBlob < Minitest::Test include Linguist def setup @@ -251,8 +251,7 @@ class TestBlob < Test::Unit::TestCase assert sample_blob("Zephir/filenames/exception.zep.php").generated? assert !sample_blob("Zephir/Router.zep").generated? - - assert Linguist::Generated.generated?("node_modules/grunt/lib/grunt.js", nil) + assert sample_blob("node_modules/grunt/lib/grunt.js").generated? # Godep saved dependencies assert sample_blob("Godeps/Godeps.json").generated? @@ -292,6 +291,8 @@ class TestBlob < Test::Unit::TestCase assert sample_blob("deps/http_parser/http_parser.c").vendored? assert sample_blob("deps/v8/src/v8.h").vendored? + assert sample_blob("tools/something/else.c").vendored? + # Chart.js assert sample_blob("some/vendored/path/Chart.js").vendored? assert !sample_blob("some/vendored/path/chart.js").vendored? @@ -302,6 +303,9 @@ class TestBlob < Test::Unit::TestCase # Debian packaging assert sample_blob("debian/cron.d").vendored? + # Erlang + assert sample_blob("rebar").vendored? + # Minified JavaScript and CSS assert sample_blob("foo.min.js").vendored? assert sample_blob("foo.min.css").vendored? @@ -310,6 +314,9 @@ class TestBlob < Test::Unit::TestCase assert !sample_blob("foomin.css").vendored? assert !sample_blob("foo.min.txt").vendored? + #.osx + assert sample_blob(".osx").vendored? + # Prototype assert !sample_blob("public/javascripts/application.js").vendored? assert sample_blob("public/javascripts/prototype.js").vendored? @@ -317,6 +324,9 @@ class TestBlob < Test::Unit::TestCase assert sample_blob("public/javascripts/controls.js").vendored? assert sample_blob("public/javascripts/dragdrop.js").vendored? + # Samples + assert sample_blob("Samples/Ruby/foo.rb").vendored? + # jQuery assert sample_blob("jquery.js").vendored? assert sample_blob("public/javascripts/jquery.js").vendored? diff --git a/test/test_classifier.rb b/test/test_classifier.rb index 8e1d8355..1d10d512 100644 --- a/test/test_classifier.rb +++ b/test/test_classifier.rb @@ -1,6 +1,6 @@ require_relative "./helper" -class TestClassifier < Test::Unit::TestCase +class TestClassifier < Minitest::Test include Linguist def samples_path diff --git a/test/test_file_blob.rb b/test/test_file_blob.rb index 9371dce7..30d483fe 100644 --- a/test/test_file_blob.rb +++ b/test/test_file_blob.rb @@ -1,7 +1,6 @@ -require 'linguist/file_blob' -require 'test/unit' +require_relative "./helper" -class TestFileBlob < Test::Unit::TestCase +class TestFileBlob < Minitest::Test def test_extensions assert_equal [".gitignore"], Linguist::FileBlob.new(".gitignore").extensions assert_equal [".xml"], Linguist::FileBlob.new("build.xml").extensions diff --git a/test/test_generated.rb b/test/test_generated.rb new file mode 100644 index 00000000..1c3f8d90 --- /dev/null +++ b/test/test_generated.rb @@ -0,0 +1,55 @@ +require_relative "./helper" + +class TestGenerated < Minitest::Test + include Linguist + + def samples_path + File.expand_path("../../samples", __FILE__) + end + + class DataLoadedError < StandardError; end + + def generated_without_loading_data(name) + blob = File.join(samples_path, name) + begin + assert Generated.generated?(blob, lambda { raise DataLoadedError.new }), "#{name} was not recognized as a generated file" + rescue DataLoadedError + assert false, "Data was loaded when calling generated? on #{name}" + end + end + + def generated_loading_data(name) + blob = File.join(samples_path, name) + assert_raises(DataLoadedError, "Data wasn't loaded when calling generated? on #{name}") do + Generated.generated?(blob, lambda { raise DataLoadedError.new }) + end + end + + def test_check_generated_without_loading_data + # Xcode project files + generated_without_loading_data("Binary/MainMenu.nib") + generated_without_loading_data("Dummy/foo.xcworkspacedata") + generated_without_loading_data("Dummy/foo.xcuserstate") + + # .NET designer file + generated_without_loading_data("Dummu/foo.designer.cs") + + # Composer generated composer.lock file + generated_without_loading_data("JSON/composer.lock") + + # Node modules + generated_without_loading_data("Dummy/node_modules/foo.js") + + # Godep saved dependencies + generated_without_loading_data("Godeps/Godeps.json") + generated_without_loading_data("Godeps/_workspace/src/github.com/kr/s3/sign.go") + + # Generated by Zephir + generated_without_loading_data("C/exception.zep.c") + generated_without_loading_data("C/exception.zep.h") + generated_without_loading_data("PHP/exception.zep.php") + + # Minified files + generated_loading_data("JavaScript/jquery-1.6.1.min.js") + end +end diff --git a/test/test_grammars.rb b/test/test_grammars.rb index b6b6f555..188bc187 100644 --- a/test/test_grammars.rb +++ b/test/test_grammars.rb @@ -1,8 +1,16 @@ require_relative "./helper" -class TestGrammars < Test::Unit::TestCase +class TestGrammars < Minitest::Test ROOT = File.expand_path("../..", __FILE__) + # These grammars have no license but have been grandfathered in. New grammars + # must have a license that allows redistribution. + UNLICENSED_GRAMMARS_WHITELIST = %w[ + vendor/grammars/Sublime-Lasso + vendor/grammars/Sublime-REBOL + vendor/grammars/x86-assembly-textmate-bundle + ].freeze + def setup @grammars = YAML.load(File.read(File.join(ROOT, "grammars.yml"))) end @@ -14,12 +22,11 @@ class TestGrammars < Test::Unit::TestCase end def test_submodules_are_in_sync - submodules = `git config --list --file "#{File.join(ROOT, ".gitmodules")}"`.lines.grep(/\.path=/).map { |line| line.chomp.split("=", 2).last } # Strip off paths inside the submodule so that just the submodule path remains. listed_submodules = @grammars.keys.grep(/vendor\/grammars/).map { |source| source[%r{vendor/grammars/[^/]+}] } - nonexistent_submodules = listed_submodules - submodules - unlisted_submodules = submodules - listed_submodules + nonexistent_submodules = listed_submodules - submodule_paths + unlisted_submodules = submodule_paths - listed_submodules message = "" unless nonexistent_submodules.empty? @@ -36,4 +43,94 @@ class TestGrammars < Test::Unit::TestCase assert nonexistent_submodules.empty? && unlisted_submodules.empty?, message end + + def test_local_scopes_are_in_sync + actual = YAML.load(`"#{File.join(ROOT, "script", "convert-grammars")}" --output - --no-install --no-remote`) + assert $?.success?, "script/convert-grammars failed" + + # We're not checking remote grammars. That can take a long time and make CI + # flaky if network conditions are poor. + @grammars.delete_if { |k, v| k.start_with?("http:", "https:") } + + @grammars.each do |k, v| + assert_equal v, actual[k], "The scopes listed for #{k} in grammars.yml don't match the scopes found in that repository" + end + end + + def test_submodules_have_licenses + categories = submodule_paths.group_by do |submodule| + files = Dir[File.join(ROOT, submodule, "*")] + license = files.find { |path| File.basename(path) =~ /\b(un)?licen[cs]e\b/i } || files.find { |path| File.basename(path) =~ /\bcopying\b/i } + if license.nil? + if readme = files.find { |path| File.basename(path) =~ /\Areadme\b/i } + license = readme if File.read(readme) =~ /\blicen[cs]e\b/i + end + end + if license.nil? + :unlicensed + elsif classify_license(license) + :licensed + else + :unrecognized + end + end + + unlicensed = categories[:unlicensed] || [] + unrecognized = categories[:unrecognized] || [] + disallowed_unlicensed = unlicensed - UNLICENSED_GRAMMARS_WHITELIST + disallowed_unrecognized = unrecognized - UNLICENSED_GRAMMARS_WHITELIST + extra_whitelist_entries = UNLICENSED_GRAMMARS_WHITELIST - (unlicensed | unrecognized) + + message = "" + if disallowed_unlicensed.any? + message << "The following grammar submodules don't seem to have a license. All grammars must have a license that permits redistribution.\n" + message << disallowed_unlicensed.sort.join("\n") + end + if disallowed_unrecognized.any? + message << "\n\n" unless message.empty? + message << "The following grammar submodules have an unrecognized license. Please update #{__FILE__} to recognize the license.\n" + message << disallowed_unrecognized.sort.join("\n") + end + if extra_whitelist_entries.any? + message << "\n\n" unless message.empty? + message << "The following grammar submodules are listed in UNLICENSED_GRAMMARS_WHITELIST but either have a license (yay!)\n" + message << "or have been removed from the repository. Please remove them from the whitelist.\n" + message << extra_whitelist_entries.sort.join("\n") + end + + assert disallowed_unlicensed.empty? && disallowed_unrecognized.empty? && extra_whitelist_entries.empty?, message + end + + private + + def submodule_paths + @submodule_paths ||= `git config --list --file "#{File.join(ROOT, ".gitmodules")}"`.lines.grep(/\.path=/).map { |line| line.chomp.split("=", 2).last } + end + + def classify_license(path) + content = File.read(path) + if content.include?("Apache License") && content.include?("2.0") + "Apache 2.0" + elsif content.include?("GNU") && content =~ /general/i && content =~ /public/i + if content =~ /version 2/i + "GPLv2" + elsif content =~ /version 3/i + "GPLv3" + end + elsif content.include?("GPL") && content.include?("http://www.gnu.org/licenses/gpl.html") + "GPLv3" + elsif content.include?("Creative Commons") + "CC" + elsif content.include?("tidy-license.txt") || content.include?("If not otherwise specified (see below)") + "textmate" + elsif content =~ /^\s*[*-]\s+Redistribution/ || content.include?("Redistributions of source code") + "BSD" + elsif content.include?("Permission is hereby granted") || content =~ /\bMIT\b/ + "MIT" + elsif content.include?("unlicense.org") + "unlicense" + elsif content.include?("http://www.wtfpl.net/txt/copying/") + "WTFPL" + end + end end diff --git a/test/test_heuristics.rb b/test/test_heuristics.rb index aaae4956..7520e828 100644 --- a/test/test_heuristics.rb +++ b/test/test_heuristics.rb @@ -1,6 +1,6 @@ require_relative "./helper" -class TestHeuristcs < Test::Unit::TestCase +class TestHeuristcs < Minitest::Test include Linguist def samples_path diff --git a/test/test_language.rb b/test/test_language.rb index fb6e102b..1a39744e 100644 --- a/test/test_language.rb +++ b/test/test_language.rb @@ -1,6 +1,6 @@ require_relative "./helper" -class TestLanguage < Test::Unit::TestCase +class TestLanguage < Minitest::Test include Linguist def test_find_by_alias @@ -198,7 +198,7 @@ class TestLanguage < Test::Unit::TestCase def test_find_all_by_extension Language.all.each do |language| language.extensions.each do |extension| - assert_include Language.find_by_extension(extension), language + assert_includes Language.find_by_extension(extension), language end end end @@ -283,7 +283,7 @@ class TestLanguage < Test::Unit::TestCase end def test_error_without_name - assert_raise ArgumentError do + assert_raises ArgumentError do Language.new :name => nil end end diff --git a/test/test_md5.rb b/test/test_md5.rb index 17006e2e..16b1c15b 100644 --- a/test/test_md5.rb +++ b/test/test_md5.rb @@ -1,6 +1,6 @@ require_relative "./helper" -class TestMD5 < Test::Unit::TestCase +class TestMD5 < Minitest::Test include Linguist def test_hexdigest_string @@ -12,28 +12,28 @@ class TestMD5 < Test::Unit::TestCase assert_equal "450c1ae043459546517b3dd2f98250f0", MD5.hexdigest(:foo) assert_equal "f06967526af9d7a512594b0a81b31ede", MD5.hexdigest(:bar) - assert_not_equal MD5.hexdigest("foo"), MD5.hexdigest(:foo) + refute_equal MD5.hexdigest("foo"), MD5.hexdigest(:foo) end def test_hexdigest_integer assert_equal "7605ec17fd7fd213fdcd23cac302cbb4", MD5.hexdigest(1) assert_equal "097c311a46d330e4e119ba2b1dc0f9a5", MD5.hexdigest(2) - assert_not_equal MD5.hexdigest("1"), MD5.hexdigest(1) + refute_equal MD5.hexdigest("1"), MD5.hexdigest(1) end def test_hexdigest_boolean assert_equal "a690a0615820e2e5c53901d8b8958509", MD5.hexdigest(true) assert_equal "fca6a9b459e702fa93513c6a8b8c5dfe", MD5.hexdigest(false) - assert_not_equal MD5.hexdigest("true"), MD5.hexdigest(true) - assert_not_equal MD5.hexdigest("false"), MD5.hexdigest(false) + refute_equal MD5.hexdigest("true"), MD5.hexdigest(true) + refute_equal MD5.hexdigest("false"), MD5.hexdigest(false) end def test_hexdigest_nil assert_equal "35589a1cc0b3ca90fc52d0e711c0c434", MD5.hexdigest(nil) - assert_not_equal MD5.hexdigest("nil"), MD5.hexdigest(nil) + refute_equal MD5.hexdigest("nil"), MD5.hexdigest(nil) end def test_hexdigest_array @@ -49,7 +49,7 @@ class TestMD5 < Test::Unit::TestCase assert_equal "868ee214faf277829a85667cf332749f", MD5.hexdigest({:a => 1}) assert_equal "fa9df957c2b26de6fcca9d062ea8701e", MD5.hexdigest({:b => 2}) - assert_not_equal MD5.hexdigest([:b, 2]), MD5.hexdigest({:b => 2}) + refute_equal MD5.hexdigest([:b, 2]), MD5.hexdigest({:b => 2}) assert_equal MD5.hexdigest({:b => 2, :a => 1}), MD5.hexdigest({:a => 1, :b => 2}) assert_equal MD5.hexdigest({:c => 3, :b => 2, :a => 1}), MD5.hexdigest({:a => 1, :b => 2, :c => 3}) diff --git a/test/test_pedantic.rb b/test/test_pedantic.rb index 9e35a8f2..0861b8d8 100644 --- a/test/test_pedantic.rb +++ b/test/test_pedantic.rb @@ -1,6 +1,6 @@ require_relative "./helper" -class TestPedantic < Test::Unit::TestCase +class TestPedantic < Minitest::Test filename = File.expand_path("../../lib/linguist/languages.yml", __FILE__) LANGUAGES = YAML.load(File.read(filename)) GRAMMARS = YAML.load(File.read(File.expand_path("../../grammars.yml", __FILE__))) diff --git a/test/test_repository.rb b/test/test_repository.rb index d07d86da..b661668d 100644 --- a/test/test_repository.rb +++ b/test/test_repository.rb @@ -1,6 +1,6 @@ require_relative "./helper" -class TestRepository < Test::Unit::TestCase +class TestRepository < Minitest::Test def rugged_repository @rugged ||= Rugged::Repository.new(File.expand_path("../../.git", __FILE__)) end diff --git a/test/test_samples.rb b/test/test_samples.rb index f47244ed..0b0722dc 100644 --- a/test/test_samples.rb +++ b/test/test_samples.rb @@ -1,7 +1,7 @@ require_relative "./helper" require "tempfile" -class TestSamples < Test::Unit::TestCase +class TestSamples < Minitest::Test include Linguist def test_up_to_date @@ -43,7 +43,7 @@ class TestSamples < Test::Unit::TestCase if extnames = Samples.cache['extnames'][name] extnames.each do |extname| next if extname == '.script!' - assert options['extensions'].include?(extname), "#{name} has a sample with extension (#{extname}) that isn't explicitly defined in languages.yml" + assert options['extensions'].index { |x| x.end_with? extname }, "#{name} has a sample with extension (#{extname}) that isn't explicitly defined in languages.yml" end end diff --git a/test/test_shebang.rb b/test/test_shebang.rb index 5ead299d..a2d25117 100644 --- a/test/test_shebang.rb +++ b/test/test_shebang.rb @@ -1,6 +1,6 @@ require_relative "./helper" -class TestShebang < Test::Unit::TestCase +class TestShebang < Minitest::Test include Linguist def assert_interpreter(interpreter, body) diff --git a/test/test_tokenizer.rb b/test/test_tokenizer.rb index 5dab023e..24a74105 100644 --- a/test/test_tokenizer.rb +++ b/test/test_tokenizer.rb @@ -1,6 +1,6 @@ require_relative "./helper" -class TestTokenizer < Test::Unit::TestCase +class TestTokenizer < Minitest::Test include Linguist def samples_path diff --git a/vendor/grammars/Agda.tmbundle b/vendor/grammars/Agda.tmbundle index 784f435f..68a218c4 160000 --- a/vendor/grammars/Agda.tmbundle +++ b/vendor/grammars/Agda.tmbundle @@ -1 +1 @@ -Subproject commit 784f435f09c126f6a070f751c678dd9dfd88c969 +Subproject commit 68a218c489c809655f74164f83b78d359a82989a diff --git a/vendor/grammars/AutoHotkey b/vendor/grammars/AutoHotkey new file mode 160000 index 00000000..a2207359 --- /dev/null +++ b/vendor/grammars/AutoHotkey @@ -0,0 +1 @@ +Subproject commit a2207359782c564a9a3bfe5142d7b5a250d9b18b diff --git a/vendor/grammars/Elm.tmLanguage b/vendor/grammars/Elm.tmLanguage new file mode 160000 index 00000000..1d2e0963 --- /dev/null +++ b/vendor/grammars/Elm.tmLanguage @@ -0,0 +1 @@ +Subproject commit 1d2e0963012d4959d5517c3dd0dcf486b1ded74b diff --git a/vendor/grammars/IDL-Syntax b/vendor/grammars/IDL-Syntax index 9473b7fa..3baeaeaf 160000 --- a/vendor/grammars/IDL-Syntax +++ b/vendor/grammars/IDL-Syntax @@ -1 +1 @@ -Subproject commit 9473b7faaf709740d08d84823f9e86b2ad585f62 +Subproject commit 3baeaeafac9e30e8a4b0789105641e0b59da32a9 diff --git a/vendor/grammars/NimLime b/vendor/grammars/NimLime index 7a2fb4e7..a7067c60 160000 --- a/vendor/grammars/NimLime +++ b/vendor/grammars/NimLime @@ -1 +1 @@ -Subproject commit 7a2fb4e73a293a009224c35fc421006869344439 +Subproject commit a7067c605b893585c056d32a20a1b953f100e138 diff --git a/vendor/grammars/Racket b/vendor/grammars/Racket new file mode 160000 index 00000000..02739c25 --- /dev/null +++ b/vendor/grammars/Racket @@ -0,0 +1 @@ +Subproject commit 02739c25aefb484a031e58ff7a628adf4c97225f diff --git a/vendor/grammars/SCSS.tmbundle b/vendor/grammars/SCSS.tmbundle index d6188e57..41475020 160000 --- a/vendor/grammars/SCSS.tmbundle +++ b/vendor/grammars/SCSS.tmbundle @@ -1 +1 @@ -Subproject commit d6188e579f0808d843e75728e6bd77a170a0d0ac +Subproject commit 41475020634fc07b5c03ff0dfaee64c2491fa32b diff --git a/vendor/grammars/Scalate.tmbundle b/vendor/grammars/Scalate.tmbundle index 4f85314f..0307535a 160000 --- a/vendor/grammars/Scalate.tmbundle +++ b/vendor/grammars/Scalate.tmbundle @@ -1 +1 @@ -Subproject commit 4f85314fca2ebe3641c678010489b80e81acb8ea +Subproject commit 0307535add076965c8cd438d0f4109bec7d68d2d diff --git a/vendor/grammars/Sublime-HTTP b/vendor/grammars/Sublime-HTTP new file mode 160000 index 00000000..00999986 --- /dev/null +++ b/vendor/grammars/Sublime-HTTP @@ -0,0 +1 @@ +Subproject commit 0099998617eb784fa27d8a47e289058d9a6307ab diff --git a/vendor/grammars/Sublime-Nit b/vendor/grammars/Sublime-Nit new file mode 160000 index 00000000..7d8b3503 --- /dev/null +++ b/vendor/grammars/Sublime-Nit @@ -0,0 +1 @@ +Subproject commit 7d8b3503923edb3dd0fa0f8e0684dd33e7897446 diff --git a/vendor/grammars/Sublime-VimL b/vendor/grammars/Sublime-VimL index 6ab7e19a..366fdc64 160000 --- a/vendor/grammars/Sublime-VimL +++ b/vendor/grammars/Sublime-VimL @@ -1 +1 @@ -Subproject commit 6ab7e19a579c1842999a23db697851599a570915 +Subproject commit 366fdc64e3655207a0b2672f630d7167e6aac2c3 diff --git a/vendor/grammars/atom-salt b/vendor/grammars/atom-salt new file mode 160000 index 00000000..6d6bdc1b --- /dev/null +++ b/vendor/grammars/atom-salt @@ -0,0 +1 @@ +Subproject commit 6d6bdc1be1a43201b5f78a4f89ea9bfc7416df11 diff --git a/vendor/grammars/c.tmbundle b/vendor/grammars/c.tmbundle index 28c93b5f..f8254252 160000 --- a/vendor/grammars/c.tmbundle +++ b/vendor/grammars/c.tmbundle @@ -1 +1 @@ -Subproject commit 28c93b5f7d02341dcacff9e2e2b190ce82036be6 +Subproject commit f8254252620b24c50d23ec804344915d498ecd7f diff --git a/vendor/grammars/carto-atom b/vendor/grammars/carto-atom new file mode 160000 index 00000000..8086625a --- /dev/null +++ b/vendor/grammars/carto-atom @@ -0,0 +1 @@ +Subproject commit 8086625aa5deac4ccd7374644b89e715deec2f7f diff --git a/vendor/grammars/factor b/vendor/grammars/factor index 2dc55909..2453a785 160000 --- a/vendor/grammars/factor +++ b/vendor/grammars/factor @@ -1 +1 @@ -Subproject commit 2dc5590966a6212d1911eaba63d698e1c8b04e73 +Subproject commit 2453a785f73429786583684cf729625c7cf7b04b diff --git a/vendor/grammars/fsharpbinding b/vendor/grammars/fsharpbinding index af755c8b..99d2e9a5 160000 --- a/vendor/grammars/fsharpbinding +++ b/vendor/grammars/fsharpbinding @@ -1 +1 @@ -Subproject commit af755c8b01ddb9bd5abebb74f318f6a9183c55e4 +Subproject commit 99d2e9a53924ae5ba850985f3df1dc8c11cb6731 diff --git a/vendor/grammars/haxe-sublime-bundle b/vendor/grammars/haxe-sublime-bundle index 58cad478..e2613bb1 160000 --- a/vendor/grammars/haxe-sublime-bundle +++ b/vendor/grammars/haxe-sublime-bundle @@ -1 +1 @@ -Subproject commit 58cad4780c3ce19a5219dfa38d25556f800ac726 +Subproject commit e2613bb12598d4ae2de5ba57af890ce910195fce diff --git a/vendor/grammars/language-clojure b/vendor/grammars/language-clojure index d649d9f5..bae6eee8 160000 --- a/vendor/grammars/language-clojure +++ b/vendor/grammars/language-clojure @@ -1 +1 @@ -Subproject commit d649d9f5b227722f5a35fd0e9430cb14325b8e83 +Subproject commit bae6eee8557c2158592ac485a7168ccd10fc6dfb diff --git a/vendor/grammars/language-coffee-script b/vendor/grammars/language-coffee-script index c6e8d337..d86c8963 160000 --- a/vendor/grammars/language-coffee-script +++ b/vendor/grammars/language-coffee-script @@ -1 +1 @@ -Subproject commit c6e8d33715fe883da8411b7149cfb3eb76d23698 +Subproject commit d86c8963dcee0ab811da05a175b2218045d0c124 diff --git a/vendor/grammars/language-gfm b/vendor/grammars/language-gfm index c6df027b..6af44a08 160000 --- a/vendor/grammars/language-gfm +++ b/vendor/grammars/language-gfm @@ -1 +1 @@ -Subproject commit c6df027b075654b5faadd8965b9bdc39276e3a45 +Subproject commit 6af44a08718668035f45270898389ae4fc8eeb8b diff --git a/vendor/grammars/language-hy b/vendor/grammars/language-hy new file mode 160000 index 00000000..f9750744 --- /dev/null +++ b/vendor/grammars/language-hy @@ -0,0 +1 @@ +Subproject commit f9750744ae4b8519314dff7d57abc527b91a0ef2 diff --git a/vendor/grammars/language-javascript b/vendor/grammars/language-javascript index 15dc5d1d..51575193 160000 --- a/vendor/grammars/language-javascript +++ b/vendor/grammars/language-javascript @@ -1 +1 @@ -Subproject commit 15dc5d1d8675ba7b2f6af77adf3e373e54a994d0 +Subproject commit 515751937df1d397b495e4a92fec5a0933994cdb diff --git a/vendor/grammars/language-python b/vendor/grammars/language-python index 476a3535..46072e32 160000 --- a/vendor/grammars/language-python +++ b/vendor/grammars/language-python @@ -1 +1 @@ -Subproject commit 476a353595caca2105c5984466390333036d0f11 +Subproject commit 46072e32e3060eb8e2fea98a106a86db89acc842 diff --git a/vendor/grammars/language-sass b/vendor/grammars/language-sass deleted file mode 160000 index 064a8b5a..00000000 --- a/vendor/grammars/language-sass +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 064a8b5a870afad877e06ce9774c1ef974471f6a diff --git a/vendor/grammars/language-shellscript b/vendor/grammars/language-shellscript index e2d62af1..98397197 160000 --- a/vendor/grammars/language-shellscript +++ b/vendor/grammars/language-shellscript @@ -1 +1 @@ -Subproject commit e2d62af11a07f6d65b1664456d85e747a31ac4b4 +Subproject commit 9839719721e3fb67c2df8461b2b296e6ff027e7f diff --git a/vendor/grammars/language-yaml b/vendor/grammars/language-yaml index eddd0793..ce8b4414 160000 --- a/vendor/grammars/language-yaml +++ b/vendor/grammars/language-yaml @@ -1 +1 @@ -Subproject commit eddd079347ee6854d37887168daff4a32688d8c2 +Subproject commit ce8b441467852f766a34d22ba6661099496e22e4 diff --git a/vendor/grammars/latex.tmbundle b/vendor/grammars/latex.tmbundle index 682c4b72..52b2251a 160000 --- a/vendor/grammars/latex.tmbundle +++ b/vendor/grammars/latex.tmbundle @@ -1 +1 @@ -Subproject commit 682c4b725c9504bf3c8c1d4efdd954a8d23800bc +Subproject commit 52b2251aab30577f4b3b3cc8997fb3c7d0e798ce diff --git a/vendor/grammars/mercury-tmlanguage b/vendor/grammars/mercury-tmlanguage index b5a4fd6e..eaef0b06 160000 --- a/vendor/grammars/mercury-tmlanguage +++ b/vendor/grammars/mercury-tmlanguage @@ -1 +1 @@ -Subproject commit b5a4fd6e400cef468dad18d92df65268a6d4a3e9 +Subproject commit eaef0b0643b2cea0d7d26056f2dd264c5a652be9 diff --git a/vendor/grammars/racket-tmbundle b/vendor/grammars/racket-tmbundle deleted file mode 160000 index a6b66624..00000000 --- a/vendor/grammars/racket-tmbundle +++ /dev/null @@ -1 +0,0 @@ -Subproject commit a6b66624d075745d89c3221bb088c8a1925175da diff --git a/vendor/grammars/sas.tmbundle b/vendor/grammars/sas.tmbundle new file mode 160000 index 00000000..0d864a6b --- /dev/null +++ b/vendor/grammars/sas.tmbundle @@ -0,0 +1 @@ +Subproject commit 0d864a6bc89ca418e9516249774fc9ab7c792a79 diff --git a/vendor/grammars/sass-textmate-bundle b/vendor/grammars/sass-textmate-bundle new file mode 160000 index 00000000..8444f979 --- /dev/null +++ b/vendor/grammars/sass-textmate-bundle @@ -0,0 +1 @@ +Subproject commit 8444f9796e7610f7f930e9ed7cae3093d5ce7805 diff --git a/vendor/grammars/sublime-bsv b/vendor/grammars/sublime-bsv new file mode 160000 index 00000000..ca223cdd --- /dev/null +++ b/vendor/grammars/sublime-bsv @@ -0,0 +1 @@ +Subproject commit ca223cdd653e454ed7536f50e68c70bc56d30103 diff --git a/vendor/grammars/sublime-mask b/vendor/grammars/sublime-mask index 2f59519f..6f12d284 160000 --- a/vendor/grammars/sublime-mask +++ b/vendor/grammars/sublime-mask @@ -1 +1 @@ -Subproject commit 2f59519ffdccfb15c63668951847f1c96b6e07c0 +Subproject commit 6f12d2841d008fb02eee912485cebcad7151d4f0 diff --git a/vendor/grammars/swift.tmbundle b/vendor/grammars/swift.tmbundle index 81a01641..3c7eac54 160000 --- a/vendor/grammars/swift.tmbundle +++ b/vendor/grammars/swift.tmbundle @@ -1 +1 @@ -Subproject commit 81a01641457d544a3a16bb5410e5cafef2148ceb +Subproject commit 3c7eac54457aa8f953fa5263cb34ec4dc9555217 diff --git a/vendor/grammars/turtle.tmbundle b/vendor/grammars/turtle.tmbundle new file mode 160000 index 00000000..0782b476 --- /dev/null +++ b/vendor/grammars/turtle.tmbundle @@ -0,0 +1 @@ +Subproject commit 0782b476573a317917fb9b3bbe7e6a68abefa7a5